feat(tools): fabric-guild-list returns serviceEndpoint for announce targets
FabricSession.guilds type + fabric-guild-list response now carry the new serviceEndpoint field (added to GuildNode in Fabric.Backend.Center). The tool description teaches agents the distinction: 'endpoint' is the client-facing URL (which they themselves use to call the guild from plugin context), 'serviceEndpoint' is what to plumb into dialectic_propose_topic's announce_guild_base_url so the dialectic backend can dial it from inside the deployment. Fixes bug #2 from the first e2e debate run: agent-supplied 'http://server.t3:7002' wasn't backend-reachable; agent now supplies 'http://fabric-backend-guild:7002' via serviceEndpoint and broadcasts actually land.
This commit is contained in:
@@ -10,6 +10,13 @@ export type FabricSession = {
|
|||||||
nodeId: string;
|
nodeId: string;
|
||||||
name: string;
|
name: string;
|
||||||
endpoint: string;
|
endpoint: string;
|
||||||
|
// Service-to-service endpoint (e.g. http://backend-guild:7002) — what
|
||||||
|
// an in-deployment backend uses to reach this guild. Distinct from
|
||||||
|
// `endpoint` which is the client/browser-facing URL. Plumb this into
|
||||||
|
// `announce_guild_base_url` on dialectic_propose_topic so the
|
||||||
|
// dialectic-backend can actually dial it. Null when the admin hasn't
|
||||||
|
// configured it.
|
||||||
|
serviceEndpoint?: string | null;
|
||||||
status: string;
|
status: string;
|
||||||
// free-form description of this guild's role; admin-set on Center.
|
// free-form description of this guild's role; admin-set on Center.
|
||||||
// null when the admin hasn't filled it in yet.
|
// null when the admin hasn't filled it in yet.
|
||||||
|
|||||||
20
src/tools.ts
20
src/tools.ts
@@ -367,10 +367,15 @@ export function registerFabricTools(
|
|||||||
name: 'fabric-guild-list',
|
name: 'fabric-guild-list',
|
||||||
description:
|
description:
|
||||||
'List guilds the calling agent is a member of. Returns ' +
|
'List guilds the calling agent is a member of. Returns ' +
|
||||||
'{nodeId, name, purpose, status} per row. `purpose` is a free-form ' +
|
'{nodeId, name, purpose, status, serviceEndpoint} per row. ' +
|
||||||
"description of what each guild is for. Use this BEFORE " +
|
"`purpose` is a free-form description of what each guild is for — " +
|
||||||
'fabric-channel-list when a workflow asks you to pick the ' +
|
'pick the guild whose purpose matches your intent. ' +
|
||||||
'right guild by intent (no guild ids hardcoded into workflows).',
|
'`serviceEndpoint` is the internal URL another backend service ' +
|
||||||
|
'uses to reach this guild (NOT the client-facing url): pass it as ' +
|
||||||
|
'`announce_guild_base_url` to dialectic_propose_topic when you ' +
|
||||||
|
'want the dialectic-backend to broadcast topic lifecycle to a ' +
|
||||||
|
"channel in this guild. Use this tool BEFORE fabric-channel-list " +
|
||||||
|
'when a workflow asks you to pick the right guild by intent.',
|
||||||
parameters: {
|
parameters: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
additionalProperties: false,
|
additionalProperties: false,
|
||||||
@@ -411,6 +416,13 @@ export function registerFabricTools(
|
|||||||
name: g.name,
|
name: g.name,
|
||||||
status: g.status,
|
status: g.status,
|
||||||
purpose: g.purpose ?? null,
|
purpose: g.purpose ?? null,
|
||||||
|
// serviceEndpoint is what an in-deployment service uses to
|
||||||
|
// reach this guild — pass this into announce_guild_base_url
|
||||||
|
// on dialectic_propose_topic, NOT the client-facing endpoint.
|
||||||
|
// Null when the admin hasn't configured it (broadcasts will
|
||||||
|
// fail until set; ask hangman to run
|
||||||
|
// `cli node set-service-endpoint --node-id <id> --endpoint <url>`).
|
||||||
|
serviceEndpoint: g.serviceEndpoint ?? null,
|
||||||
})),
|
})),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user