@stigmer/mcp-server 3.6.0 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/cli/mcp-server-stigmer.js +5 -3
  2. package/domains/channels/tools.d.ts.map +1 -1
  3. package/domains/channels/tools.js +3 -1
  4. package/domains/channels/tools.js.map +1 -1
  5. package/domains/conversation/calls.d.ts +9 -0
  6. package/domains/conversation/calls.d.ts.map +1 -0
  7. package/domains/conversation/calls.js +30 -0
  8. package/domains/conversation/calls.js.map +1 -0
  9. package/domains/conversation/errors.d.ts +19 -0
  10. package/domains/conversation/errors.d.ts.map +1 -0
  11. package/domains/conversation/errors.js +73 -0
  12. package/domains/conversation/errors.js.map +1 -0
  13. package/domains/conversation/tools.d.ts +13 -0
  14. package/domains/conversation/tools.d.ts.map +1 -0
  15. package/domains/conversation/tools.js +69 -0
  16. package/domains/conversation/tools.js.map +1 -0
  17. package/gen/workflow.d.ts +154 -61
  18. package/gen/workflow.d.ts.map +1 -1
  19. package/gen/workflow.js +98 -46
  20. package/gen/workflow.js.map +1 -1
  21. package/index.d.ts +1 -1
  22. package/index.d.ts.map +1 -1
  23. package/index.js +1 -1
  24. package/index.js.map +1 -1
  25. package/package.json +3 -3
  26. package/server.d.ts +40 -7
  27. package/server.d.ts.map +1 -1
  28. package/server.js +58 -5
  29. package/server.js.map +1 -1
  30. package/src/domains/channels/tools.ts +5 -1
  31. package/src/domains/conversation/calls.ts +41 -0
  32. package/src/domains/conversation/conversation.integration.test.ts +233 -0
  33. package/src/domains/conversation/errors.ts +88 -0
  34. package/src/domains/conversation/tools.ts +87 -0
  35. package/src/gen/workflow.ts +99 -40
  36. package/src/http.integration.test.ts +56 -2
  37. package/src/index.ts +11 -1
  38. package/src/server.ts +66 -9
package/server.js CHANGED
@@ -18,6 +18,7 @@ import { registerAgentExecutionTools } from "./domains/agentexecutions/tools.js"
18
18
  import { registerAgentResources } from "./domains/agents/resources.js";
19
19
  import { registerAgentTools } from "./domains/agents/tools.js";
20
20
  import { registerChannelTools } from "./domains/channels/tools.js";
21
+ import { registerConversationTools } from "./domains/conversation/tools.js";
21
22
  import { registerDatastoreResources } from "./domains/datastores/resources.js";
22
23
  import { registerDatastoreTools } from "./domains/datastores/tools.js";
23
24
  import { registerEnvironmentResources } from "./domains/environments/resources.js";
@@ -86,6 +87,30 @@ export function createChannelsServer(target) {
86
87
  log.info("tools registered (channels roster)", { count: tools.length, tools });
87
88
  return server;
88
89
  }
90
+ /**
91
+ * Build a conversation-only MCP server: escalate_to_human with the
92
+ * agent-facing argument surface, and nothing else (channel-conversations
93
+ * DD-008 D-c / A14 — the channels-roster pattern). This is the roster
94
+ * the runner-synthesized conversation attachment connects to; the
95
+ * structural guarantee mirrors the channels roster's.
96
+ *
97
+ * HTTP-only by design — served on the /conversation route, with NO
98
+ * stdio roster value: escalate is cloud-only (OSS refuses
99
+ * FAILED_PRECONDITION) AND session-token-only (the reach derives
100
+ * identity from a session-scoped sandbox credential, which only the
101
+ * bridge's per-request Bearer can carry — a stdio child's startup API
102
+ * key never could), so a stdio shape would be a tool that can only
103
+ * fail. Honest absence instead.
104
+ */
105
+ export function createConversationServer(target) {
106
+ const server = new McpServer({
107
+ name: "mcp-server-stigmer-conversation",
108
+ version: SERVER_VERSION,
109
+ });
110
+ const tools = registerConversationTools(server, target);
111
+ log.info("tools registered (conversation roster)", { count: tools.length, tools });
112
+ return server;
113
+ }
89
114
  /**
90
115
  * Wire up every domain's tools. Each domain returns the names it registered so
91
116
  * the startup log's count and roster cannot drift from what is actually wired,
@@ -151,22 +176,41 @@ export async function serveStdio(server, signal) {
151
176
  server.server.onerror = (err) => log.error("mcp protocol error", { error: err.message });
152
177
  });
153
178
  }
179
+ /** HTTP route serving the full roster: the bare origin every published config uses. */
180
+ export const FULL_ROUTE = "/";
154
181
  /** HTTP route serving the records-only roster (T05 R1). */
155
182
  export const RECORDS_ROUTE = "/records";
156
183
  /** HTTP route serving the channels-only roster (DD-006 D8). */
157
184
  export const CHANNELS_ROUTE = "/channels";
185
+ /** HTTP route serving the conversation-only roster (channel-conversations A14). */
186
+ export const CONVERSATION_ROUTE = "/conversation";
158
187
  /**
159
- * The standard HTTP route dispatch: the records-only roster on
160
- * {@link RECORDS_ROUTE}, the channels-only roster on
161
- * {@link CHANNELS_ROUTE}, the full roster everywhere else.
188
+ * The standard HTTP route dispatch: the full roster on {@link FULL_ROUTE},
189
+ * the records-only roster on {@link RECORDS_ROUTE}, the channels-only
190
+ * roster on {@link CHANNELS_ROUTE}, the conversation-only roster on
191
+ * {@link CONVERSATION_ROUTE} — and NOTHING anywhere else.
192
+ *
193
+ * The closed route table is load-bearing, not tidiness. This dispatch
194
+ * once fell through to the full roster for any unrecognized path, and a
195
+ * production bridge predating /channels answered the runner's channel
196
+ * attachment with the full roster: the agent got a server named
197
+ * stigmer-channels with every management tool except the one send tool
198
+ * it existed for (the 2026-08-05 stale-pin incident). An unknown route
199
+ * is a deployment mismatch by definition — refuse it loudly so the
200
+ * mismatch is visible at connect time, instead of serving tools the
201
+ * caller was never meant to see.
162
202
  */
163
203
  export function routedServerFactory(target) {
164
204
  return (path) => {
205
+ if (path === FULL_ROUTE)
206
+ return createServer(target);
165
207
  if (path === RECORDS_ROUTE)
166
208
  return createRecordsServer(target);
167
209
  if (path === CHANNELS_ROUTE)
168
210
  return createChannelsServer(target);
169
- return createServer(target);
211
+ if (path === CONVERSATION_ROUTE)
212
+ return createConversationServer(target);
213
+ return undefined;
170
214
  };
171
215
  }
172
216
  /**
@@ -302,6 +346,15 @@ async function routeRequest(req, res, sessions, makeServer, cfg) {
302
346
  res.end("Bad Request: an initialize request is required to open a session");
303
347
  return;
304
348
  }
349
+ // Route recognition happens exactly where the roster choice happens.
350
+ // An unknown route gets a 404, never a default roster — see
351
+ // routedServerFactory for the incident this prevents.
352
+ const server = makeServer(path);
353
+ if (server === undefined) {
354
+ res.writeHead(404, { "Content-Type": "text/plain" });
355
+ res.end(`unknown MCP route: ${path}`);
356
+ return;
357
+ }
305
358
  const transport = new StreamableHTTPServerTransport({
306
359
  sessionIdGenerator: () => randomUUID(),
307
360
  onsessioninitialized: (id) => {
@@ -315,7 +368,7 @@ async function routeRequest(req, res, sessions, makeServer, cfg) {
315
368
  if (transport.sessionId !== undefined)
316
369
  sessions.delete(transport.sessionId);
317
370
  };
318
- await makeServer(path).connect(transport);
371
+ await server.connect(transport);
319
372
  await transport.handleRequest(req, res, body);
320
373
  }
321
374
  /**
package/server.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -64,7 +64,11 @@ export function registerChannelTools(server: McpServer, target: BackendTarget):
64
64
  inputSchema: {
65
65
  recipient: z
66
66
  .string()
67
- .describe("Recipient's key on the channel's provider (WhatsApp: the wa_id / phone number)."),
67
+ .describe(
68
+ "Recipient's key on the channel's provider, passed to the provider verbatim. " +
69
+ 'WhatsApp: the wa_id — digits only INCLUDING the country code, no "+" or ' +
70
+ 'separators (e.g. "919912850490"). Never reformat a wa_id another tool returned.',
71
+ ),
68
72
  text: z
69
73
  .string()
70
74
  .optional()
@@ -0,0 +1,41 @@
1
+ // Conversation RPC invocations for the escalate_to_human tool — a 1:1
2
+ // projection of ChannelConversationCommandController.escalate
3
+ // (channel-conversations DD-008: the tool layer adds no semantics; the
4
+ // reach, the idempotent writer, and the attention projection all live
5
+ // in the cloud handler, and the OSS edition refuses with the documented
6
+ // FAILED_PRECONDITION).
7
+ //
8
+ // The channels-domain calls.ts shape, with one deliberate divergence:
9
+ // the RPC's ChannelConversation response is DISCARDED instead of
10
+ // marshaled back as proto JSON. A15 rules the tool's answer is fixed
11
+ // behavioral copy (tools.ts owns it) — the row's control state,
12
+ // timestamps, and conversation key give the model nothing actionable,
13
+ // and reflecting them would only invite the model to narrate internal
14
+ // state to the customer.
15
+
16
+ import { create } from "@bufbuild/protobuf";
17
+ import {
18
+ ChannelConversationCommandController,
19
+ } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/conversation_command_pb";
20
+ import {
21
+ EscalateConversationInputSchema,
22
+ } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/conversation_io_pb";
23
+ import { withClient } from "../client.js";
24
+
25
+ /**
26
+ * Flag the calling session's conversation for human attention. The input
27
+ * carries only the reason: the conversation identity derives server-side
28
+ * from the session-scoped credential's channel labels (the DD-003
29
+ * identity doctrine), so there is nothing else a caller could
30
+ * legitimately send.
31
+ */
32
+ export async function escalateConversation(
33
+ serverAddress: string,
34
+ token: string,
35
+ reason: string,
36
+ ): Promise<void> {
37
+ const request = create(EscalateConversationInputSchema, { reason });
38
+ await withClient(ChannelConversationCommandController, serverAddress, token,
39
+ (client, opts) => client.escalate(request, opts),
40
+ );
41
+ }
@@ -0,0 +1,233 @@
1
+ // In-process integration test for the conversation roster (the
2
+ // channels.integration.test.ts pattern: real Connect backend with a
3
+ // stubbed conversation service, real MCP client over an in-memory
4
+ // transport).
5
+ //
6
+ // Verifies the DD-008 D-b / A14 / A15 contract surface:
7
+ // - the conversation-only roster is exactly escalate_to_human with a
8
+ // single `reason` argument (agent audience — identity is
9
+ // server-derived, so nothing else exists to send);
10
+ // - the success answer is the A15 fixed copy, never the RPC's
11
+ // ChannelConversation row, and claims nothing the platform cannot
12
+ // keep (no console claim until the T04+ surface renders attention);
13
+ // - the conversation-own error mapper passes domain messages verbatim
14
+ // as {error, code} JSON — including NOT_FOUND, this domain's
15
+ // deliberate addition — while transport errors delegate to the
16
+ // shared classifier;
17
+ // - the zod bounds mirror the protovalidate constraints, refusing an
18
+ // empty or over-budget reason before any RPC.
19
+
20
+ import { create } from "@bufbuild/protobuf";
21
+ import { Code, ConnectError, type ConnectRouter } from "@connectrpc/connect";
22
+ import { connectNodeAdapter } from "@connectrpc/connect-node";
23
+ import {
24
+ createServer as createHttp2Server,
25
+ type Http2Server,
26
+ type ServerHttp2Session,
27
+ } from "node:http2";
28
+ import type { AddressInfo } from "node:net";
29
+
30
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
31
+ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
32
+ import { ChannelConversationCommandController } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/conversation_command_pb";
33
+ import {
34
+ ChannelConversationSchema,
35
+ type EscalateConversationInput,
36
+ } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/conversation_io_pb";
37
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
38
+
39
+ import { configureLogger } from "../../logger";
40
+ import { CONVERSATION_ROUTE, createConversationServer } from "../../server";
41
+
42
+ configureLogger({ level: "error", format: "text" });
43
+
44
+ let backend: Http2Server;
45
+ let client: Client;
46
+ const openSessions = new Set<ServerHttp2Session>();
47
+
48
+ /** The next stubbed outcome; tests set this. */
49
+ let escalateResponse: () => ReturnType<typeof create<typeof ChannelConversationSchema>>;
50
+
51
+ /** Requests the stub captured (object property for closure narrowing). */
52
+ const captured: { escalate?: EscalateConversationInput } = {};
53
+
54
+ interface ToolResult {
55
+ content: Array<{ type: string; text?: string }>;
56
+ isError?: boolean;
57
+ }
58
+
59
+ async function escalate(args: Record<string, unknown>): Promise<ToolResult> {
60
+ return (await client.callTool({
61
+ name: "escalate_to_human",
62
+ arguments: args,
63
+ })) as ToolResult;
64
+ }
65
+
66
+ beforeAll(async () => {
67
+ const routes = (router: ConnectRouter) => {
68
+ router.service(ChannelConversationCommandController, {
69
+ escalate: (req) => {
70
+ captured.escalate = req;
71
+ return escalateResponse();
72
+ },
73
+ });
74
+ };
75
+ backend = createHttp2Server(connectNodeAdapter({ routes }));
76
+ backend.on("session", (session) => {
77
+ openSessions.add(session);
78
+ session.on("close", () => openSessions.delete(session));
79
+ });
80
+ await new Promise<void>((resolve) => backend.listen(0, "127.0.0.1", resolve));
81
+ const port = (backend.address() as AddressInfo).port;
82
+
83
+ const mcp = createConversationServer({ serverAddress: `127.0.0.1:${port}`, apiKey: "" });
84
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
85
+ client = new Client({ name: "conversation-integration", version: "test" });
86
+ await Promise.all([mcp.connect(serverTransport), client.connect(clientTransport)]);
87
+ });
88
+
89
+ afterAll(async () => {
90
+ await client?.close();
91
+ for (const session of openSessions) session.destroy();
92
+ await new Promise<void>((resolve) => backend.close(() => resolve()));
93
+ });
94
+
95
+ describe("conversation roster (DD-008 D-c / A14)", () => {
96
+ it("exposes exactly escalate_to_human with a single reason argument", async () => {
97
+ const { tools } = await client.listTools();
98
+ expect(tools.map((t) => t.name)).toEqual(["escalate_to_human"]);
99
+
100
+ // The conversation identity is server-derived from the session
101
+ // credential's channel labels (the DD-003 identity doctrine), so
102
+ // reason is the ONLY argument — a channel or conversation id here
103
+ // would be a caller-supplied identity the reach must never trust.
104
+ const properties = (tools[0].inputSchema as { properties?: Record<string, unknown> })
105
+ .properties;
106
+ expect(Object.keys(properties ?? {})).toEqual(["reason"]);
107
+ });
108
+
109
+ it("pins the cross-repo route string (the TOOL_CALL_LIMIT precedent)", () => {
110
+ // The runner's conversation-attachment.ts builds the URL
111
+ // independently (shared/conversation-attachment.ts and its route
112
+ // pin); a drift here strands every synthesized attachment on a 404.
113
+ expect(CONVERSATION_ROUTE).toBe("/conversation");
114
+ });
115
+ });
116
+
117
+ describe("the success answer is the A15 copy, not the row", () => {
118
+ it("sends the reason verbatim and answers with fixed copy", async () => {
119
+ escalateResponse = () =>
120
+ create(ChannelConversationSchema, {
121
+ agentChannelId: "agch_1",
122
+ conversationKey: "919000000001",
123
+ needsAttention: true,
124
+ attentionReason: "customer wants a refund decision",
125
+ });
126
+ captured.escalate = undefined;
127
+
128
+ const result = await escalate({ reason: "customer wants a refund decision" });
129
+
130
+ expect(result.isError).toBeFalsy();
131
+ const req = captured.escalate as EscalateConversationInput | undefined;
132
+ expect(req?.reason).toBe("customer wants a refund decision");
133
+
134
+ const text = result.content[0]?.text ?? "";
135
+ expect(text).toContain("recorded on this conversation");
136
+ // A15: the answer instructs against the promise at the moment of
137
+ // temptation — the model's next message to the customer.
138
+ expect(text).toContain("do not");
139
+ // The row must never leak back: its control state and conversation
140
+ // key are internal, and reflecting them invites the model to
141
+ // narrate platform state to the customer.
142
+ expect(text).not.toContain("919000000001");
143
+ expect(text).not.toContain("needs_attention");
144
+ // No console surface renders attention yet (T04+); the copy must
145
+ // not claim one. Delete this pin when the Conversations surface
146
+ // ships and the copy gains the claim.
147
+ expect(text.toLowerCase()).not.toContain("console");
148
+ });
149
+ });
150
+
151
+ describe("zod bounds mirror the protovalidate constraints", () => {
152
+ it("refuses an empty and an over-budget reason before any RPC", async () => {
153
+ captured.escalate = undefined;
154
+
155
+ const empty = await escalate({ reason: "" });
156
+ expect(empty.isError).toBe(true);
157
+
158
+ const overBudget = await escalate({ reason: "x".repeat(1025) });
159
+ expect(overBudget.isError).toBe(true);
160
+
161
+ expect(captured.escalate).toBeUndefined();
162
+ });
163
+ });
164
+
165
+ describe("conversation error mapper", () => {
166
+ it("passes a reach denial through verbatim — never the shared rewrite", async () => {
167
+ escalateResponse = () => {
168
+ throw new ConnectError(
169
+ "escalate is agent-audience only: it requires a session-scoped runner credential",
170
+ Code.PermissionDenied,
171
+ );
172
+ };
173
+
174
+ const result = await escalate({ reason: "needs a human" });
175
+
176
+ expect(result.isError).toBe(true);
177
+ expect(JSON.parse(result.content[0]?.text ?? "{}")).toEqual({
178
+ error: "escalate is agent-audience only: it requires a session-scoped runner credential",
179
+ code: "PERMISSION_DENIED",
180
+ });
181
+ });
182
+
183
+ it("passes the OSS refusal through verbatim as FAILED_PRECONDITION", async () => {
184
+ escalateResponse = () => {
185
+ throw new ConnectError(
186
+ "conversation participation requires Stigmer Cloud",
187
+ Code.FailedPrecondition,
188
+ );
189
+ };
190
+
191
+ const result = await escalate({ reason: "needs a human" });
192
+
193
+ expect(result.isError).toBe(true);
194
+ expect(JSON.parse(result.content[0]?.text ?? "{}")).toEqual({
195
+ error: "conversation participation requires Stigmer Cloud",
196
+ code: "FAILED_PRECONDITION",
197
+ });
198
+ });
199
+
200
+ it("passes NOT_FOUND through verbatim — this domain's deliberate addition", async () => {
201
+ // The shared classifier rewrites NotFound into "Verify the org and
202
+ // slug are correct" — advice naming arguments escalate does not
203
+ // take. The domain set includes NotFound so the handler's honest
204
+ // answer reaches the model.
205
+ escalateResponse = () => {
206
+ throw new ConnectError(
207
+ "no conversation with this key exists on channel agch_1",
208
+ Code.NotFound,
209
+ );
210
+ };
211
+
212
+ const result = await escalate({ reason: "needs a human" });
213
+
214
+ expect(result.isError).toBe(true);
215
+ expect(JSON.parse(result.content[0]?.text ?? "{}")).toEqual({
216
+ error: "no conversation with this key exists on channel agch_1",
217
+ code: "NOT_FOUND",
218
+ });
219
+ });
220
+
221
+ it("delegates transport codes to the shared classifier", async () => {
222
+ escalateResponse = () => {
223
+ throw new ConnectError("upstream down", Code.Unavailable);
224
+ };
225
+
226
+ const result = await escalate({ reason: "needs a human" });
227
+
228
+ expect(result.isError).toBe(true);
229
+ expect(result.content[0]?.text).toBe(
230
+ "Stigmer server is unavailable. Ensure it is running and reachable.",
231
+ );
232
+ });
233
+ });
@@ -0,0 +1,88 @@
1
+ // The conversation-domain error mapper — the channels-domain sibling
2
+ // (DD-004 S-7's recorded posture: siblings share the idiom, never an
3
+ // abstraction over it; each domain documents its own contract).
4
+ //
5
+ // Conversation domain errors carry agent-relayable messages that are
6
+ // contract bytes (the ChannelConversationReach refusal matrix):
7
+ // "escalate is agent-audience only: it requires a session-scoped runner
8
+ // credential", "conversation identity could not be verified for this
9
+ // session", "this session is not serving a channel conversation, so
10
+ // there is nothing to escalate", the OSS "conversation participation
11
+ // requires Stigmer Cloud". The shared ../rpcerr.ts would rewrite them
12
+ // into transport advice; here the domain codes pass the server's
13
+ // message through VERBATIM as isError JSON `{error, code}` so the model
14
+ // can stop and adapt.
15
+ //
16
+ // Two deliberate differences from the channels set, each this domain's
17
+ // own contract:
18
+ // - NOT_FOUND is a domain code HERE: the handler's "no conversation
19
+ // with this key exists on channel …" is contract copy, and the
20
+ // shared classifier's rewrite ("Verify the org and slug are
21
+ // correct") names arguments escalate does not take.
22
+ // - No google.rpc.ErrorInfo extraction: the conversation commands
23
+ // attach none — the message alone carries the contract.
24
+
25
+ import { Code, ConnectError } from "@connectrpc/connect";
26
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
27
+ import { rpcError } from "../rpcerr.js";
28
+ import { errorResult, textResult } from "../toolresult.js";
29
+
30
+ /**
31
+ * The gRPC codes whose messages are the conversation domain contract:
32
+ * reach denials (PERMISSION_DENIED, one fail-closed text per failure
33
+ * class), contract misuse with corrective copy (INVALID_ARGUMENT — an
34
+ * empty or over-budget reason), actionable preconditions
35
+ * (FAILED_PRECONDITION — the OSS refusal, a session serving no channel
36
+ * conversation), and the absent-conversation answer (NOT_FOUND).
37
+ */
38
+ const DOMAIN_CODES: ReadonlySet<Code> = new Set([
39
+ Code.PermissionDenied,
40
+ Code.InvalidArgument,
41
+ Code.FailedPrecondition,
42
+ Code.NotFound,
43
+ ]);
44
+
45
+ /** The structured error payload conversation tools return for domain errors. */
46
+ export interface ConversationToolError {
47
+ /** The server's relayable message, byte-for-byte. */
48
+ error: string;
49
+ /** gRPC status name in SCREAMING_SNAKE (e.g. PERMISSION_DENIED). */
50
+ code: string;
51
+ }
52
+
53
+ /**
54
+ * Run a conversation-tool body: a string payload becomes a text result;
55
+ * a domain error becomes an isError JSON result carrying the verbatim
56
+ * message; a transport error delegates to the shared classifier. The
57
+ * only try/catch in this domain.
58
+ */
59
+ export async function conversationResult(
60
+ toolContext: string,
61
+ produce: () => Promise<string>,
62
+ ): Promise<CallToolResult> {
63
+ try {
64
+ return textResult(await produce());
65
+ } catch (err) {
66
+ const ce = ConnectError.from(err);
67
+ if (DOMAIN_CODES.has(ce.code)) {
68
+ return {
69
+ content: [{ type: "text", text: JSON.stringify(domainError(ce)) }],
70
+ isError: true,
71
+ };
72
+ }
73
+ return errorResult(rpcError(ce, toolContext));
74
+ }
75
+ }
76
+
77
+ /** Project a domain ConnectError into the structured tool payload. */
78
+ export function domainError(ce: ConnectError): ConversationToolError {
79
+ return {
80
+ error: ce.rawMessage,
81
+ code: grpcStatusName(ce.code),
82
+ };
83
+ }
84
+
85
+ /** Connect's PascalCase code name → the gRPC SCREAMING_SNAKE status name. */
86
+ function grpcStatusName(code: Code): string {
87
+ return Code[code].replace(/([a-z0-9])([A-Z])/g, "$1_$2").toUpperCase();
88
+ }
@@ -0,0 +1,87 @@
1
+ // The escalate_to_human tool — the ONE tool of the conversation roster
2
+ // (channel-conversations DD-008 D-b). A14 named the roster
3
+ // stigmer-conversation, axis-named like stigmer-channels: the
4
+ // conditioning axis is "this session IS a live channel conversation",
5
+ // and the notes/loop-in tools DD-008 anticipates join this roster
6
+ // instead of earning new routes.
7
+ //
8
+ // Agent audience only, by construction: escalate derives the
9
+ // conversation identity server-side from the session-scoped credential
10
+ // (the DD-003 identity doctrine), so a direct principal is always
11
+ // refused PERMISSION_DENIED — which is why no variant exists on the
12
+ // full roster and why the input surface is a single `reason`.
13
+ //
14
+ // The tool's answer is FIXED COPY, never the RPC's ChannelConversation
15
+ // row — a deliberate divergence from the channels roster's
16
+ // verbatim-proto-JSON convention. A15 rules the result states only what
17
+ // the platform can keep at 3am (attention is a stored flag; no one is
18
+ // paged; no console surface renders it yet) and instructs the agent
19
+ // never to promise a human or a response time.
20
+
21
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
22
+ import { z } from "zod";
23
+
24
+ import { resolveToken, type BackendTarget } from "../client.js";
25
+ import { escalateConversation } from "./calls.js";
26
+ import { conversationResult } from "./errors.js";
27
+
28
+ const ESCALATE_DESCRIPTION = [
29
+ "Flag this conversation for a human teammate to look at. Use this when you " +
30
+ "cannot resolve the customer's request yourself: you lack the information, " +
31
+ "the request needs a decision you are not authorized to make, or the " +
32
+ "customer has asked for a person.",
33
+ "You keep serving the conversation after calling this. Nothing is handed " +
34
+ "off automatically and no one is paged. Do not tell the customer a human " +
35
+ "will reply, and never promise a response time.",
36
+ "Write the reason for a teammate who has not read the conversation. " +
37
+ "Calling this again with a new reason is safe; the latest reason is what " +
38
+ "they see.",
39
+ ].join("\n\n");
40
+
41
+ /**
42
+ * The success answer (A15): states only recorded fact and repeats the
43
+ * no-promise instruction at the moment of temptation — the model's next
44
+ * message to the customer. Deliberately does NOT claim the flag "shows
45
+ * in the team's console": no console surface renders needs_attention
46
+ * yet (the Conversations surface is T04+); add the claim when it ships.
47
+ */
48
+ export const ESCALATION_RECORDED_COPY =
49
+ "Flagged for human attention. Your reason was recorded on this " +
50
+ "conversation. Keep helping the customer as best you can, and do not " +
51
+ "tell the customer a human will reply or when.";
52
+
53
+ /** Register the conversation participation tool; returns the tool names. */
54
+ export function registerConversationTools(server: McpServer, target: BackendTarget): string[] {
55
+ server.registerTool(
56
+ "escalate_to_human",
57
+ {
58
+ description: ESCALATE_DESCRIPTION,
59
+ inputSchema: {
60
+ // Bounds mirror the protovalidate constraints on
61
+ // EscalateConversationInput.reason (conversation_io.proto:
62
+ // min_len 1, max_len 1024) so the model gets corrective feedback
63
+ // without an RPC; the server's validation is the backstop.
64
+ reason: z
65
+ .string()
66
+ .min(1)
67
+ .max(1024)
68
+ .describe(
69
+ "Why you are escalating, written for a teammate who has not read " +
70
+ "the conversation. Staff see it as the conversation's attention " +
71
+ "reason. 1-1024 characters.",
72
+ ),
73
+ },
74
+ },
75
+ (args, extra) =>
76
+ conversationResult("escalation", async () => {
77
+ await escalateConversation(
78
+ target.serverAddress,
79
+ resolveToken(extra, target.apiKey),
80
+ args.reason,
81
+ );
82
+ return ESCALATION_RECORDED_COPY;
83
+ }),
84
+ );
85
+
86
+ return ["escalate_to_human"];
87
+ }