mirror of
https://github.com/tiennm99/goclaw.git
synced 2026-10-11 03:13:24 +00:00
* fix: warm Zalo group-approval cache so forwards from non-group origins route correctly send.go picks ThreadTypeGroup vs ThreadTypeUser for a target chat ID by checking BaseChannel's approvedGroups cache (or an explicit "group_id" metadata key). That cache is only ever populated from INBOUND group traffic under the "pairing" group policy — under "allowlist" (this integration's actual default) it stays empty for the whole process lifetime unless something else populates it, and it's wiped on every restart regardless (in-memory sync.Map, no persistence). message.go's cross-target forward only attaches "group_id" metadata when isGroupContext(ctx) is true, which reflects the ORIGIN session's peer kind, not the destination target's. Forwarding from a DM (or any non-group session) into a group therefore sends with no group_id metadata and an empty approval cache, so Send() defaults to ThreadTypeUser — the message goes out addressed as if to a user account, not the group, and is never seen there. No error is returned anywhere in this path, so nothing in the existing (or previously fixed) error-reporting surfaces it. ListGroups now marks every returned group ID as approved via MarkGroupApproved, and Channel.Start kicks off a best-effort ListGroups call right after connecting so the cache is warm from process start, not just after an explicit zalo_list_groups tool call. * fix: expose a media tag for quote-forwarded images, not just vision access extractQuoteMedia downloads the image attached to a quoted message so the model can see it via vision, but the composed content only ever carried the literal "[Quoted image]" placeholder text (from TQuote.Text()) — no <media:image> tag was ever inserted for it. The later agent-side enrichment (enrichImageIDs/enrichImagePaths) only fills id/path attributes into a bare tag it finds already present in content; with no tag to find, the downloaded file had no path reference the model could hand back to message(MEDIA:<path>) to forward it elsewhere, even though the file was sitting on disk the whole time. Symptom: asked to forward a quoted image to another chat, the agent reported "the image is only a quote, no direct file to attach" despite genuinely having already downloaded it. buildQuoteMediaTag renders the same bare <media:image> tag a direct (non-quoted) attachment gets, appended after the quote wrapper text in all three call sites (handleDM, handleGroupMessage, extractContentAndMediaWithQuote) — ordered after any of the current message's own attachment tags to match the media slice's append order, so positional id/path enrichment lines up correctly.