@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.
- package/cli/mcp-server-stigmer.js +5 -3
- package/domains/channels/tools.d.ts.map +1 -1
- package/domains/channels/tools.js +3 -1
- package/domains/channels/tools.js.map +1 -1
- package/domains/conversation/calls.d.ts +9 -0
- package/domains/conversation/calls.d.ts.map +1 -0
- package/domains/conversation/calls.js +30 -0
- package/domains/conversation/calls.js.map +1 -0
- package/domains/conversation/errors.d.ts +19 -0
- package/domains/conversation/errors.d.ts.map +1 -0
- package/domains/conversation/errors.js +73 -0
- package/domains/conversation/errors.js.map +1 -0
- package/domains/conversation/tools.d.ts +13 -0
- package/domains/conversation/tools.d.ts.map +1 -0
- package/domains/conversation/tools.js +69 -0
- package/domains/conversation/tools.js.map +1 -0
- package/gen/workflow.d.ts +154 -61
- package/gen/workflow.d.ts.map +1 -1
- package/gen/workflow.js +98 -46
- package/gen/workflow.js.map +1 -1
- package/index.d.ts +1 -1
- package/index.d.ts.map +1 -1
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/package.json +3 -3
- package/server.d.ts +40 -7
- package/server.d.ts.map +1 -1
- package/server.js +58 -5
- package/server.js.map +1 -1
- package/src/domains/channels/tools.ts +5 -1
- package/src/domains/conversation/calls.ts +41 -0
- package/src/domains/conversation/conversation.integration.test.ts +233 -0
- package/src/domains/conversation/errors.ts +88 -0
- package/src/domains/conversation/tools.ts +87 -0
- package/src/gen/workflow.ts +99 -40
- package/src/http.integration.test.ts +56 -2
- package/src/index.ts +11 -1
- 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
|
|
160
|
-
* {@link RECORDS_ROUTE}, the channels-only
|
|
161
|
-
* {@link CHANNELS_ROUTE}, the
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
+
}
|