feat(plugin): fabric-guild-list + fabric-channel-set-purpose tools + purpose on existing tools
Adds two agent-facing tools that close the discoverability loop:
- fabric-guild-list — enumerates guilds the agent belongs to with
name + purpose + status (no api calls beyond the existing agentLogin
response). Optional nameFilter/purposeFilter for narrowing.
- fabric-channel-set-purpose — PATCH /api/channels/:id { purpose }
so agents can backfill or update an existing channel's purpose.
Extends existing tools:
- fabric-channel-list now returns purpose on each row.
- create-{chat,work,report,discussion}-channel accept optional purpose.
FabricClient + FabricSession type changes carry the new field through.
Manifest contracts.tools updated (jiti loader needs both manifest entry
and onStartup activation to register).
Lets workflows that previously needed hardcoded channel ids instead say
'find a guild whose purpose mentions debate, then a channel of x_type
announce whose purpose covers public debate broadcasts.'
This commit is contained in:
32
dist/fabric/src/fabric-client.js
vendored
32
dist/fabric/src/fabric-client.js
vendored
@@ -63,6 +63,11 @@ export class FabricClient {
|
||||
createChannel(guildEndpoint, guildToken, body) {
|
||||
return this.post(`${guildEndpoint}/api/channels`, body, guildToken);
|
||||
}
|
||||
// PATCH /api/channels/:id — backend currently only patches `purpose`.
|
||||
// Caller must be a member of the channel (or any user if public).
|
||||
setChannelPurpose(guildEndpoint, guildToken, channelId, purpose) {
|
||||
return this.req('PATCH', `${guildEndpoint}/api/channels/${channelId}`, guildToken, { purpose });
|
||||
}
|
||||
closeChannel(guildEndpoint, guildToken, channelId) {
|
||||
return this.post(`${guildEndpoint}/api/channels/${channelId}/close`, {}, guildToken);
|
||||
}
|
||||
@@ -105,4 +110,31 @@ export class FabricClient {
|
||||
removeCanvas(endpoint, token, channelId) {
|
||||
return this.req('DELETE', this.canvasUrl(endpoint, channelId), token);
|
||||
}
|
||||
// ---- channel discovery + message read (used by the agent-facing
|
||||
// fabric-channel-list / fabric-message-history tools) ----
|
||||
/**
|
||||
* List channels in a guild visible to the calling user. Backend
|
||||
* filters to public + channels the user is a member of.
|
||||
*/
|
||||
listChannels(guildEndpoint, guildToken, guildNodeId) {
|
||||
return this.req('GET', `${guildEndpoint}/api/channels?guildId=${encodeURIComponent(guildNodeId)}`, guildToken);
|
||||
}
|
||||
/**
|
||||
* Page through a channel's message history by `seq`.
|
||||
*
|
||||
* Backend defaults: 50 / call, max 200. The `seq` field starts at 1
|
||||
* per channel; pass `seqFrom=channel.lastSeq - N + 1` to get the
|
||||
* tail. Page metadata in the response describes what to ask next.
|
||||
*/
|
||||
listMessages(guildEndpoint, guildToken, channelId, opts = {}) {
|
||||
const qs = new URLSearchParams();
|
||||
if (opts.seqFrom !== undefined)
|
||||
qs.set('seq_from', String(opts.seqFrom));
|
||||
if (opts.seqTo !== undefined)
|
||||
qs.set('seq_to', String(opts.seqTo));
|
||||
if (opts.limit !== undefined)
|
||||
qs.set('limit', String(opts.limit));
|
||||
const url = `${guildEndpoint}/api/channels/${channelId}/messages` + (qs.toString() ? `?${qs}` : '');
|
||||
return this.req('GET', url, guildToken);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user