package tools import ( "encoding/json" plugin "git.hangman-lab.top/hzhang/Plexum-sdk-go/plugin" ) // allContracts is the static manifest list of all agent-facing tools. // install.sh reads this via a Go-build introspection step? No — we'd // need a separate emit-manifest binary. For now, install.sh has the // same JSON inline (keep in sync; trivially small). Future refinement // could auto-emit. var allContracts = []plugin.ToolContract{ { Name: "send", Description: "Outbound channel reply — host calls this after an inbound dispatch (agent-side calls usually prefer `fabric-send-message`).", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "channel_name": {"type": "string"}, "session_id": {"type": "string"}, "message": {"type": "string"} }, "required": ["channel_name", "message"] }`), }, { Name: "fabric-send-message", Description: "Post a normal message to a Fabric channel as the bound agent. guild_node_id defaults to the agent's first guild when omitted.", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "agent_id": {"type": "string"}, "guild_node_id": {"type": "string"}, "channel_id": {"type": "string"}, "content": {"type": "string"} }, "required": ["agent_id", "channel_id", "content"] }`), }, { Name: "fabric-send-sys-msg", Description: "Post a system-kind message to a channel (not subject to turn engine / wakeup).", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "agent_id": {"type": "string"}, "guild_node_id": {"type": "string"}, "channel_id": {"type": "string"}, "content": {"type": "string"} }, "required": ["agent_id", "guild_node_id", "channel_id", "content"] }`), }, { Name: "fabric-channel-list", Description: "List channels visible to the agent in a guild (public + member channels).", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "agent_id": {"type": "string"}, "guild_node_id": {"type": "string"} }, "required": ["agent_id", "guild_node_id"] }`), }, { Name: "fabric-guild-list", Description: "List the guilds the agent belongs to (nodes + endpoints).", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "agent_id": {"type": "string"} }, "required": ["agent_id"] }`), }, { Name: "fabric-message-history", Description: "Paginate channel messages by seq. seq_from/seq_to/limit are optional (server caps limit at 200).", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "agent_id": {"type": "string"}, "guild_node_id": {"type": "string"}, "channel_id": {"type": "string"}, "seq_from": {"type": "integer"}, "seq_to": {"type": "integer"}, "limit": {"type": "integer"} }, "required": ["agent_id", "guild_node_id", "channel_id"] }`), }, { Name: "fabric-channel-set-purpose", Description: "Update the channel's free-form purpose text.", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "agent_id": {"type": "string"}, "guild_node_id": {"type": "string"}, "channel_id": {"type": "string"}, "purpose": {"type": "string"} }, "required": ["agent_id", "guild_node_id", "channel_id", "purpose"] }`), }, { Name: "fabric-channel", Description: "Fetch metadata + member list for a specific channel.", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "agent_id": {"type": "string"}, "guild_node_id": {"type": "string"}, "channel_id": {"type": "string"} }, "required": ["agent_id", "guild_node_id", "channel_id"] }`), }, { Name: "fabric-canvas", Description: "Read or write the channel's pinned canvas doc. op: get|share|update|remove. share/update need title+format+source.", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "agent_id": {"type": "string"}, "guild_node_id": {"type": "string"}, "channel_id": {"type": "string"}, "op": {"type": "string", "enum": ["get","share","update","remove"]}, "title": {"type": "string"}, "format": {"type": "string", "enum": ["md","html","text"]}, "source": {"type": "string"} }, "required": ["agent_id", "guild_node_id", "channel_id", "op"] }`), }, // ---- channel creation (4 x-types share the same shape) ---- createChannelContract("create-chat-channel", "Create a chat channel (xType=general)."), createChannelContract("create-work-channel", "Create a work channel (xType=work)."), createChannelContract("create-report-channel", "Create a report channel (xType=report)."), createChannelContract("create-discussion-channel", "Create a discussion channel (xType=discuss)."), { Name: "discussion-complete", Description: "Post a summary then close the channel — concludes a discussion.", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "agent_id": {"type": "string"}, "guild_node_id": {"type": "string"}, "channel_id": {"type": "string"}, "summary": {"type": "string"} }, "required": ["agent_id", "guild_node_id", "channel_id", "summary"] }`), }, { Name: "create-sub-discussion", Description: "Spawn a new sub-discussion channel with the calling agent as host + invited guests; remembered in plugin KV so close-sub-discussion can post the callback to the parent channel.", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "agent_id": {"type": "string"}, "guild_node_id": {"type": "string"}, "name": {"type": "string"}, "guest_user_ids": {"type": "array", "items": {"type": "string"}}, "host_guide": {"type": "string"}, "guest_guide": {"type": "string"}, "parent_channel_id":{"type": "string"}, "greeting": {"type": "string"}, "x_type": {"type": "string", "enum": ["discuss","work","report","general"]} }, "required": ["agent_id", "guild_node_id", "name", "parent_channel_id"] }`), }, { Name: "close-sub-discussion", Description: "Close a sub-discussion the calling agent originally created; posts a callback message to the parent channel.", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "agent_id": {"type": "string"}, "sub_channel_id":{"type": "string"}, "summary": {"type": "string"} }, "required": ["agent_id", "sub_channel_id"] }`), }, } // createChannelContract returns the shared schema for the four // create-*-channel tool variants. func createChannelContract(name, description string) plugin.ToolContract { return plugin.ToolContract{ Name: name, Description: description, InputSchema: json.RawMessage(`{ "type": "object", "properties": { "agent_id": {"type": "string"}, "guild_node_id": {"type": "string"}, "name": {"type": "string"}, "is_public": {"type": "boolean"}, "member_user_ids": {"type": "array", "items": {"type": "string"}}, "listeners": {"type": "array", "items": {"type": "string"}}, "on_duty": {"type": "string"}, "purpose": {"type": "string"} }, "required": ["agent_id", "guild_node_id", "name"] }`), } }