feat(tools): fabric-send-message + fabric-channel-list + fabric-message-history #4
Reference in New Issue
Block a user
Delete Branch "feat/fabric-send-and-discover-tools"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Plugin had no way for an agent to send text into a specific channel proactively — outbound only went through the channel-reply path.
discussion-completecallsclient.postMessageinternally but only for close-time summary.Adds 3 new tools + declares 2 existing-but-silent ones in
contracts.tools:fabric-send-message {guildNodeId, channelId, content}→{ok, messageId, seq}. Author = calling agentfabric-channel-list {guildNodeId, nameFilter?, xType?, includeClosed?}→{ok, count, channels[]}. Backend filters to public + member channels; client-side nameFilter is case-insensitive substringfabric-message-history {guildNodeId, channelId, seqFrom?, seqTo?, limit?}→{ok, page, messages[]}. Tail-by-default: omit seqFrom/seqTo and it fetches channel head from listChannels then asks for[head-limit+1, head]. Limit default 20, max 200Also adds
fabric-canvasandfabric-channeltocontracts.tools— they were already registered but openclaw silently dropped them per the manifest contract (verified by sim logplugin tool is undeclared (fabric): fabric-canvas).2 supporting
FabricClienthelpers (listChannels,listMessages).🤖 Generated with Claude Code
Plugin previously had no way for an agent to send text into a specific channel proactively — outbound went only through the channel-reply path (responds to the channel that woke the agent). discussion-complete internally called client.postMessage but only for the close-time summary, no general-purpose surface. Three new tools (+ declare existing fabric-canvas / fabric-channel that were registered but missing from contracts.tools so agents couldn't see them per the openclaw plugin contract): * fabric-send-message {guildNodeId, channelId, content} → {ok, messageId, seq} Author = calling agent. Use for ARD broadcasts, follow-ups in a different channel, etc. * fabric-channel-list {guildNodeId, nameFilter?, xType?, includeClosed?} → {ok, count, channels[]} Backend filters to public + member channels; nameFilter is client- side case-insensitive substring; xType / includeClosed apply post- fetch. Returns id/name/xType/lastSeq so callers can pipe into the other tools. * fabric-message-history {guildNodeId, channelId, seqFrom?, seqTo?, limit?} → {ok, page, messages[]} Tail-by-default: omit seqFrom/seqTo and the tool fetches the channel head from listChannels then asks for [head-limit+1, head]. Limit default 20, max 200. Backend rejects non-participants. Plus 3 supporting client methods (listChannels, listMessages — both GET via existing req helper). contracts.tools updated to declare these 5 (3 new + 2 previously- silent ones). Verified earlier in sim restart logs: openclaw warned 'plugin tool is undeclared (fabric): fabric-canvas / fabric-channel' so agents couldn't use them despite registerTool firing. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>