@darqlabs/curator-sdk-react 0.6.1 → 0.7.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/README.md +18 -0
- package/dist/cjs/CuratorAdapter.d.ts +27 -1
- package/dist/cjs/CuratorAdapter.d.ts.map +1 -1
- package/dist/cjs/CuratorAdapter.js +113 -19
- package/dist/cjs/CuratorAdapter.js.map +1 -1
- package/dist/cjs/CuratorChat.d.ts +8 -0
- package/dist/cjs/CuratorChat.d.ts.map +1 -1
- package/dist/cjs/CuratorChat.js +27 -7
- package/dist/cjs/CuratorChat.js.map +1 -1
- package/dist/cjs/historyMessages.d.ts +20 -1
- package/dist/cjs/historyMessages.d.ts.map +1 -1
- package/dist/cjs/historyMessages.js +25 -3
- package/dist/cjs/historyMessages.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/mcpApps/McpAppContext.d.ts +39 -0
- package/dist/cjs/mcpApps/McpAppContext.d.ts.map +1 -0
- package/dist/cjs/mcpApps/McpAppContext.js +19 -0
- package/dist/cjs/mcpApps/McpAppContext.js.map +1 -0
- package/dist/cjs/mcpApps/McpAppToolPart.d.ts +22 -0
- package/dist/cjs/mcpApps/McpAppToolPart.d.ts.map +1 -0
- package/dist/cjs/mcpApps/McpAppToolPart.js +270 -0
- package/dist/cjs/mcpApps/McpAppToolPart.js.map +1 -0
- package/dist/cjs/mcpApps/hostBridge.d.ts +127 -0
- package/dist/cjs/mcpApps/hostBridge.d.ts.map +1 -0
- package/dist/cjs/mcpApps/hostBridge.js +306 -0
- package/dist/cjs/mcpApps/hostBridge.js.map +1 -0
- package/dist/esm/CuratorAdapter.d.ts +27 -1
- package/dist/esm/CuratorAdapter.d.ts.map +1 -1
- package/dist/esm/CuratorAdapter.js +113 -19
- package/dist/esm/CuratorAdapter.js.map +1 -1
- package/dist/esm/CuratorChat.d.ts +8 -0
- package/dist/esm/CuratorChat.d.ts.map +1 -1
- package/dist/esm/CuratorChat.js +27 -7
- package/dist/esm/CuratorChat.js.map +1 -1
- package/dist/esm/historyMessages.d.ts +20 -1
- package/dist/esm/historyMessages.d.ts.map +1 -1
- package/dist/esm/historyMessages.js +25 -3
- package/dist/esm/historyMessages.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mcpApps/McpAppContext.d.ts +39 -0
- package/dist/esm/mcpApps/McpAppContext.d.ts.map +1 -0
- package/dist/esm/mcpApps/McpAppContext.js +15 -0
- package/dist/esm/mcpApps/McpAppContext.js.map +1 -0
- package/dist/esm/mcpApps/McpAppToolPart.d.ts +22 -0
- package/dist/esm/mcpApps/McpAppToolPart.d.ts.map +1 -0
- package/dist/esm/mcpApps/McpAppToolPart.js +266 -0
- package/dist/esm/mcpApps/McpAppToolPart.js.map +1 -0
- package/dist/esm/mcpApps/hostBridge.d.ts +127 -0
- package/dist/esm/mcpApps/hostBridge.d.ts.map +1 -0
- package/dist/esm/mcpApps/hostBridge.js +300 -0
- package/dist/esm/mcpApps/hostBridge.js.map +1 -0
- package/package.json +5 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostBridge.d.ts","sourceRoot":"","sources":["../../../src/mcpApps/hostBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Host side of the MCP Apps (SEP-1865) bridge: JSON-RPC 2.0 over a message
|
|
4
|
+
* transport, from the widget to one rendered view.
|
|
5
|
+
*
|
|
6
|
+
* Pure. Knows nothing about React, iframes or the network: the caller hands
|
|
7
|
+
* it a `post` function to reach the view and feeds it every message the view
|
|
8
|
+
* sends. Everything the view may ask for is a `handlers` callback, so the
|
|
9
|
+
* whole protocol can be exercised in a unit test with a fake view.
|
|
10
|
+
*
|
|
11
|
+
* What the view may do, and what this bridge does with it:
|
|
12
|
+
*
|
|
13
|
+
* ui/initialize → handshake; answers with host info,
|
|
14
|
+
* capabilities and context
|
|
15
|
+
* ui/notifications/initialized → view is ready; deliver the tool input,
|
|
16
|
+
* then the tool result once known
|
|
17
|
+
* tools/call → handlers.callTool (the Curator data plane)
|
|
18
|
+
* ui/message → handlers.sendMessage (app-reported text)
|
|
19
|
+
* ui/update-model-context → handlers.updateModelContext (surfaced only)
|
|
20
|
+
* ui/open-link → handlers.openLink (http(s) only)
|
|
21
|
+
* ui/request-display-mode → always `inline` in v1
|
|
22
|
+
* ui/notifications/size-changed → handlers.onSizeChange
|
|
23
|
+
* notifications/message → handlers.onLog
|
|
24
|
+
* ping → {}
|
|
25
|
+
* anything else → JSON-RPC "method not found"
|
|
26
|
+
*
|
|
27
|
+
* Method names are the ones ext-apps 2.0 emits (`ui/…`). The deprecated
|
|
28
|
+
* `notifications/…` spellings assistant-ui also accepts are NOT supported:
|
|
29
|
+
* fewer names to reason about, and our reference view uses the current SDK.
|
|
30
|
+
*/
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.McpAppHostBridge = exports.MCP_APPS_PROTOCOL_VERSION = void 0;
|
|
33
|
+
exports.extractMessageText = extractMessageText;
|
|
34
|
+
exports.isOpenableUrl = isOpenableUrl;
|
|
35
|
+
exports.MCP_APPS_PROTOCOL_VERSION = "2026-01-26";
|
|
36
|
+
const ERR = { invalidRequest: -32600, methodNotFound: -32601, invalidParams: -32602, internal: -32603 };
|
|
37
|
+
const DEFAULT_MAX_MESSAGE_CHARS = 2048;
|
|
38
|
+
// Control characters except tab / newline / carriage return.
|
|
39
|
+
// eslint-disable-next-line no-control-regex
|
|
40
|
+
const CONTROL_CHARS = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g;
|
|
41
|
+
function isRecord(v) {
|
|
42
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The text of a spec-shaped `ui/message`: `{ role, content: [{type:"text", text}] }`.
|
|
46
|
+
* Also accepts a bare `{ text }` for lenient views. Control characters are
|
|
47
|
+
* stripped and the length capped; the result is plain text, never markup.
|
|
48
|
+
*/
|
|
49
|
+
function extractMessageText(params, maxChars = DEFAULT_MAX_MESSAGE_CHARS) {
|
|
50
|
+
if (!isRecord(params))
|
|
51
|
+
return null;
|
|
52
|
+
let text = null;
|
|
53
|
+
if (Array.isArray(params.content)) {
|
|
54
|
+
text = params.content
|
|
55
|
+
.filter((c) => isRecord(c) && c.type === "text" && typeof c.text === "string")
|
|
56
|
+
.map((c) => c.text)
|
|
57
|
+
.join("\n");
|
|
58
|
+
}
|
|
59
|
+
else if (typeof params.text === "string") {
|
|
60
|
+
text = params.text;
|
|
61
|
+
}
|
|
62
|
+
if (text === null)
|
|
63
|
+
return null;
|
|
64
|
+
const clean = text.replace(CONTROL_CHARS, "").slice(0, maxChars).trim();
|
|
65
|
+
return clean.length > 0 ? clean : null;
|
|
66
|
+
}
|
|
67
|
+
/** Only web links leave the sandbox. */
|
|
68
|
+
function isOpenableUrl(url) {
|
|
69
|
+
if (typeof url !== "string")
|
|
70
|
+
return false;
|
|
71
|
+
try {
|
|
72
|
+
const u = new URL(url);
|
|
73
|
+
return u.protocol === "https:" || u.protocol === "http:";
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
class McpAppHostBridge {
|
|
80
|
+
post;
|
|
81
|
+
handlers;
|
|
82
|
+
hostInfo;
|
|
83
|
+
hostContext;
|
|
84
|
+
maxMessageChars;
|
|
85
|
+
initialized = false;
|
|
86
|
+
closed = false;
|
|
87
|
+
nextId = 1;
|
|
88
|
+
pending = new Map();
|
|
89
|
+
/** Tool input, delivered on `initialized` (or immediately when already ready). */
|
|
90
|
+
toolInput;
|
|
91
|
+
toolInputSent = false;
|
|
92
|
+
/** Tool result, delivered after input once known. */
|
|
93
|
+
toolResult;
|
|
94
|
+
toolResultSent = false;
|
|
95
|
+
constructor(opts) {
|
|
96
|
+
this.post = opts.post;
|
|
97
|
+
this.handlers = opts.handlers;
|
|
98
|
+
this.hostInfo = opts.hostInfo ?? { name: "Curator", version: "1" };
|
|
99
|
+
this.hostContext = {
|
|
100
|
+
platform: "web",
|
|
101
|
+
displayMode: "inline",
|
|
102
|
+
availableDisplayModes: ["inline"],
|
|
103
|
+
...opts.hostContext,
|
|
104
|
+
};
|
|
105
|
+
this.maxMessageChars = opts.maxMessageChars ?? DEFAULT_MAX_MESSAGE_CHARS;
|
|
106
|
+
}
|
|
107
|
+
get isInitialized() {
|
|
108
|
+
return this.initialized;
|
|
109
|
+
}
|
|
110
|
+
// ── host → view ─────────────────────────────────────────────────────────
|
|
111
|
+
setToolInput(args) {
|
|
112
|
+
this.toolInput = args;
|
|
113
|
+
this.flush();
|
|
114
|
+
}
|
|
115
|
+
setToolResult(result) {
|
|
116
|
+
this.toolResult = result;
|
|
117
|
+
this.flush();
|
|
118
|
+
}
|
|
119
|
+
notifyToolCancelled(reason) {
|
|
120
|
+
this.notify("ui/notifications/tool-cancelled", { reason });
|
|
121
|
+
}
|
|
122
|
+
updateHostContext(patch) {
|
|
123
|
+
this.hostContext = { ...this.hostContext, ...patch };
|
|
124
|
+
if (this.initialized)
|
|
125
|
+
this.notify("ui/notifications/host-context-changed", patch);
|
|
126
|
+
}
|
|
127
|
+
/** Ask the view to tear down; resolves when it answers or after `timeoutMs`. */
|
|
128
|
+
async teardown(timeoutMs = 500) {
|
|
129
|
+
if (this.closed)
|
|
130
|
+
return;
|
|
131
|
+
if (this.initialized) {
|
|
132
|
+
await Promise.race([
|
|
133
|
+
this.request("ui/resource-teardown", {}).catch(() => undefined),
|
|
134
|
+
new Promise((r) => setTimeout(r, timeoutMs)),
|
|
135
|
+
]);
|
|
136
|
+
}
|
|
137
|
+
this.close();
|
|
138
|
+
}
|
|
139
|
+
close() {
|
|
140
|
+
this.closed = true;
|
|
141
|
+
for (const p of this.pending.values())
|
|
142
|
+
p.reject(new Error("bridge closed"));
|
|
143
|
+
this.pending.clear();
|
|
144
|
+
}
|
|
145
|
+
// ── view → host ─────────────────────────────────────────────────────────
|
|
146
|
+
/** Feed one message received from the view. Non-JSON-RPC traffic is ignored. */
|
|
147
|
+
onMessage(data) {
|
|
148
|
+
if (this.closed || !isRecord(data) || data.jsonrpc !== "2.0")
|
|
149
|
+
return;
|
|
150
|
+
if ("method" in data && typeof data.method === "string") {
|
|
151
|
+
if ("id" in data && (typeof data.id === "string" || typeof data.id === "number")) {
|
|
152
|
+
void this.handleRequest(data);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
this.handleNotification(data);
|
|
156
|
+
}
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if ("id" in data && (typeof data.id === "string" || typeof data.id === "number")) {
|
|
160
|
+
const pending = this.pending.get(data.id);
|
|
161
|
+
if (!pending)
|
|
162
|
+
return;
|
|
163
|
+
this.pending.delete(data.id);
|
|
164
|
+
const res = data;
|
|
165
|
+
if (res.error)
|
|
166
|
+
pending.reject(new Error(res.error.message));
|
|
167
|
+
else
|
|
168
|
+
pending.resolve(res.result);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async handleRequest(req) {
|
|
172
|
+
const params = isRecord(req.params) ? req.params : {};
|
|
173
|
+
try {
|
|
174
|
+
switch (req.method) {
|
|
175
|
+
case "ui/initialize": {
|
|
176
|
+
const requested = typeof params.protocolVersion === "string" ? params.protocolVersion : exports.MCP_APPS_PROTOCOL_VERSION;
|
|
177
|
+
this.respond(req.id, {
|
|
178
|
+
protocolVersion: requested,
|
|
179
|
+
hostInfo: this.hostInfo,
|
|
180
|
+
hostCapabilities: {
|
|
181
|
+
openLinks: {},
|
|
182
|
+
serverTools: {},
|
|
183
|
+
message: { text: {} },
|
|
184
|
+
updateModelContext: { text: {}, structuredContent: {} },
|
|
185
|
+
logging: {},
|
|
186
|
+
},
|
|
187
|
+
hostContext: this.hostContext,
|
|
188
|
+
});
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
case "ping":
|
|
192
|
+
this.respond(req.id, {});
|
|
193
|
+
return;
|
|
194
|
+
case "tools/call": {
|
|
195
|
+
if (typeof params.name !== "string" || !params.name) {
|
|
196
|
+
this.error(req.id, ERR.invalidParams, "`name` is required");
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const args = isRecord(params.arguments) ? params.arguments : {};
|
|
200
|
+
const meta = isRecord(params._meta) ? params._meta : undefined;
|
|
201
|
+
const result = await this.handlers.callTool({
|
|
202
|
+
name: params.name,
|
|
203
|
+
arguments: args,
|
|
204
|
+
...(meta ? { _meta: meta } : {}),
|
|
205
|
+
});
|
|
206
|
+
this.respond(req.id, result);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
case "ui/message": {
|
|
210
|
+
const text = extractMessageText(params, this.maxMessageChars);
|
|
211
|
+
if (!text) {
|
|
212
|
+
this.error(req.id, ERR.invalidParams, "ui/message needs text content");
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const accepted = await this.handlers.sendMessage(text);
|
|
216
|
+
this.respond(req.id, accepted ? {} : { isError: true });
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
case "ui/update-model-context": {
|
|
220
|
+
this.handlers.updateModelContext?.({
|
|
221
|
+
content: params.content,
|
|
222
|
+
structuredContent: params.structuredContent,
|
|
223
|
+
});
|
|
224
|
+
this.respond(req.id, {});
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
case "ui/open-link": {
|
|
228
|
+
const ok = isOpenableUrl(params.url) && (this.handlers.openLink?.(params.url) ?? false);
|
|
229
|
+
this.respond(req.id, ok ? {} : { isError: true });
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
case "ui/request-display-mode":
|
|
233
|
+
// Inline only in v1; the host has final authority per spec.
|
|
234
|
+
this.respond(req.id, { mode: "inline" });
|
|
235
|
+
return;
|
|
236
|
+
default:
|
|
237
|
+
this.error(req.id, ERR.methodNotFound, `${req.method} is not supported by this host`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
242
|
+
this.handlers.onError?.(err instanceof Error ? err : new Error(message));
|
|
243
|
+
// A refused/failed tool call is still a well-formed JSON-RPC error; the
|
|
244
|
+
// view decides how to show it.
|
|
245
|
+
this.error(req.id, ERR.internal, message);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
handleNotification(n) {
|
|
249
|
+
const params = isRecord(n.params) ? n.params : {};
|
|
250
|
+
switch (n.method) {
|
|
251
|
+
case "ui/notifications/initialized":
|
|
252
|
+
this.initialized = true;
|
|
253
|
+
this.handlers.onInitialized?.();
|
|
254
|
+
this.flush();
|
|
255
|
+
return;
|
|
256
|
+
case "ui/notifications/size-changed":
|
|
257
|
+
this.handlers.onSizeChange?.({
|
|
258
|
+
...(typeof params.width === "number" ? { width: params.width } : {}),
|
|
259
|
+
...(typeof params.height === "number" ? { height: params.height } : {}),
|
|
260
|
+
});
|
|
261
|
+
return;
|
|
262
|
+
case "notifications/message":
|
|
263
|
+
this.handlers.onLog?.(params);
|
|
264
|
+
return;
|
|
265
|
+
default:
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// ── plumbing ────────────────────────────────────────────────────────────
|
|
270
|
+
flush() {
|
|
271
|
+
if (!this.initialized || this.closed)
|
|
272
|
+
return;
|
|
273
|
+
if (this.toolInput !== undefined && !this.toolInputSent) {
|
|
274
|
+
this.notify("ui/notifications/tool-input", { arguments: this.toolInput });
|
|
275
|
+
this.toolInputSent = true;
|
|
276
|
+
}
|
|
277
|
+
if (this.toolResult !== undefined && !this.toolResultSent) {
|
|
278
|
+
this.notify("ui/notifications/tool-result", this.toolResult);
|
|
279
|
+
this.toolResultSent = true;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
notify(method, params) {
|
|
283
|
+
if (this.closed)
|
|
284
|
+
return;
|
|
285
|
+
this.post({ jsonrpc: "2.0", method, params });
|
|
286
|
+
}
|
|
287
|
+
request(method, params) {
|
|
288
|
+
const id = this.nextId++;
|
|
289
|
+
return new Promise((resolve, reject) => {
|
|
290
|
+
this.pending.set(id, { resolve, reject });
|
|
291
|
+
this.post({ jsonrpc: "2.0", id, method, params });
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
respond(id, result) {
|
|
295
|
+
if (this.closed)
|
|
296
|
+
return;
|
|
297
|
+
this.post({ jsonrpc: "2.0", id, result });
|
|
298
|
+
}
|
|
299
|
+
error(id, code, message) {
|
|
300
|
+
if (this.closed)
|
|
301
|
+
return;
|
|
302
|
+
this.post({ jsonrpc: "2.0", id, error: { code, message } });
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
exports.McpAppHostBridge = McpAppHostBridge;
|
|
306
|
+
//# sourceMappingURL=hostBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostBridge.js","sourceRoot":"","sources":["../../../src/mcpApps/hostBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,33 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import type { CuratorAttachmentAdapter } from "./CuratorAttachmentAdapter.js";
|
|
21
21
|
import type { ChatModelAdapter } from "@assistant-ui/react";
|
|
22
|
-
import type { AssistantMessage, Chat, CuratorError, StreamState, StreamPlanProgress } from "@darqlabs/curator-sdk";
|
|
22
|
+
import type { AssistantMessage, Chat, CuratorError, McpCallToolResult, StreamState, StreamPlanProgress } from "@darqlabs/curator-sdk";
|
|
23
|
+
/**
|
|
24
|
+
* A tool-call part as assistant-ui renders it. `mcp.app.serverId` carries the
|
|
25
|
+
* Curator APP SESSION, not a server id: it is the opaque routing key the view
|
|
26
|
+
* renderer threads through every data-plane call, and a session is exactly
|
|
27
|
+
* "which server, which tool call, for whom".
|
|
28
|
+
*/
|
|
29
|
+
/** JSON as assistant-ui types a tool call's arguments. Stream arguments ARE JSON (they were parsed from it). */
|
|
30
|
+
export type JsonValue = string | number | boolean | null | readonly JsonValue[] | JsonObject;
|
|
31
|
+
export type JsonObject = {
|
|
32
|
+
readonly [k: string]: JsonValue;
|
|
33
|
+
};
|
|
34
|
+
export interface McpAppToolCallPart {
|
|
35
|
+
type: "tool-call";
|
|
36
|
+
toolCallId: string;
|
|
37
|
+
toolName: string;
|
|
38
|
+
args: JsonObject;
|
|
39
|
+
argsText: string;
|
|
40
|
+
result?: McpCallToolResult;
|
|
41
|
+
isError?: boolean;
|
|
42
|
+
mcp: {
|
|
43
|
+
app: {
|
|
44
|
+
resourceUri: string;
|
|
45
|
+
serverId: string;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
}
|
|
23
49
|
export interface CuratorAdapterCallbacks {
|
|
24
50
|
/** Fired once per successfully-returned assistant message. */
|
|
25
51
|
onMessage?: (message: AssistantMessage) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CuratorAdapter.d.ts","sourceRoot":"","sources":["../../src/CuratorAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,qBAAqB,CAAA;AAC/E,OAAO,KAAK,EACV,gBAAgB,EAChB,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,kBAAkB,EACnB,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"CuratorAdapter.d.ts","sourceRoot":"","sources":["../../src/CuratorAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,qBAAqB,CAAA;AAC/E,OAAO,KAAK,EACV,gBAAgB,EAChB,IAAI,EACJ,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EACnB,MAAM,uBAAuB,CAAA;AAG9B;;;;;GAKG;AACH,gHAAgH;AAChH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,SAAS,EAAE,GAAG,UAAU,CAAA;AAC5F,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAA;AAE5D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,WAAW,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,UAAU,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,EAAE;QAAE,GAAG,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CACxD;AAKD,MAAM,WAAW,uBAAuB;IACtC,8DAA8D;IAC9D,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAC/C;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;IACtC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAA;IACvD,gEAAgE;IAChE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,KAAK,IAAI,CAAA;CAChD;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,IAAI,EACV,SAAS,GAAE,uBAA4B;AACvC;;;;GAIG;AACH,WAAW,CAAC,EAAE,IAAI,CAAC,wBAAwB,EAAE,gBAAgB,CAAC,GAC7D,gBAAgB,CAyPlB"}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* mounted CuratorChat / launcher panel) so multi-turn context stays
|
|
18
18
|
* intact across runs.
|
|
19
19
|
*/
|
|
20
|
+
import { APP_SESSION_METADATA_KEY } from "./mcpApps/McpAppContext.js";
|
|
20
21
|
export function createCuratorAdapter(chat, callbacks = {},
|
|
21
22
|
/**
|
|
22
23
|
* Supplies the storage references for this turn's attachments. Absent when
|
|
@@ -30,6 +31,11 @@ attachments) {
|
|
|
30
31
|
const files = attachments
|
|
31
32
|
? attachments.takeReferences(latestUserAttachmentIds(messages))
|
|
32
33
|
: [];
|
|
34
|
+
// MCP Apps: a turn a rendered VIEW sent (`ui/message`). The session it was
|
|
35
|
+
// rendered under rides on the message metadata and goes to the server as
|
|
36
|
+
// `app_session`, which validates it and stores the row with a `source`
|
|
37
|
+
// marker — the record says a view sent it, never that a person typed it.
|
|
38
|
+
const appSession = latestUserAppSession(messages);
|
|
33
39
|
// A file with no caption is a complete message — the SDK accepts content
|
|
34
40
|
// OR files, and a bill of lading dropped in with nothing typed is the
|
|
35
41
|
// single most common way this widget is used. Returning early on empty
|
|
@@ -46,16 +52,41 @@ attachments) {
|
|
|
46
52
|
// then `done` (whose message is the terminal reply ALONE) replaced the
|
|
47
53
|
// whole thing — so the user watched a paragraph appear and then get
|
|
48
54
|
// overwritten by different text. Segments keep every token the user saw.
|
|
49
|
-
|
|
55
|
+
// Ordered list of settled parts — text segments and MCP App tool-call
|
|
56
|
+
// parts interleaved in arrival order — plus the in-flight text.
|
|
57
|
+
const settled = [];
|
|
58
|
+
/** Live tool-call parts by id, so completed/failed can update in place. */
|
|
59
|
+
const appParts = new Map();
|
|
50
60
|
let acc = "";
|
|
51
|
-
/**
|
|
61
|
+
/** Settled parts plus the in-flight text, as assistant-ui parts. */
|
|
52
62
|
const partsWith = (trailing) => {
|
|
53
|
-
const
|
|
63
|
+
const out = [...settled];
|
|
64
|
+
if (trailing.length > 0)
|
|
65
|
+
out.push({ type: "text", text: trailing });
|
|
54
66
|
// assistant-ui expects at least one part; an empty run yields empty text.
|
|
55
|
-
return
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
67
|
+
return out.length > 0 ? out : [{ type: "text", text: "" }];
|
|
68
|
+
};
|
|
69
|
+
/** Settle the in-flight text as its own segment, if there is any. */
|
|
70
|
+
const settleText = () => {
|
|
71
|
+
if (acc.trim().length > 0)
|
|
72
|
+
settled.push({ type: "text", text: acc });
|
|
73
|
+
acc = "";
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* A view whose call never got a terminal event would spin forever. Give
|
|
77
|
+
* every unresolved app part a valid error result so the frame receives a
|
|
78
|
+
* terminal tool-result.
|
|
79
|
+
*/
|
|
80
|
+
const interruptUnresolvedApps = (text) => {
|
|
81
|
+
for (const [id, p] of appParts) {
|
|
82
|
+
if (p.result !== undefined)
|
|
83
|
+
continue;
|
|
84
|
+
const updated = { ...p, isError: true, result: { isError: true, content: [{ type: "text", text }] } };
|
|
85
|
+
appParts.set(id, updated);
|
|
86
|
+
const idx = settled.indexOf(p);
|
|
87
|
+
if (idx >= 0)
|
|
88
|
+
settled[idx] = updated;
|
|
89
|
+
}
|
|
59
90
|
};
|
|
60
91
|
try {
|
|
61
92
|
// The options object is now always passed, including when there are no
|
|
@@ -70,9 +101,11 @@ attachments) {
|
|
|
70
101
|
// the local stream and left the agent running to completion — burning
|
|
71
102
|
// tokens for a reply nobody would ever see. Checking an abort is not
|
|
72
103
|
// the same as acting on it.
|
|
73
|
-
const stream =
|
|
74
|
-
?
|
|
75
|
-
|
|
104
|
+
const stream = chat.stream(userText, {
|
|
105
|
+
...(files.length ? { files } : {}),
|
|
106
|
+
...(appSession ? { appSession } : {}),
|
|
107
|
+
signal: abortSignal,
|
|
108
|
+
});
|
|
76
109
|
for await (const event of stream) {
|
|
77
110
|
if (abortSignal.aborted)
|
|
78
111
|
return;
|
|
@@ -89,14 +122,58 @@ attachments) {
|
|
|
89
122
|
// Turn boundary: anything streamed before this belongs to the turn
|
|
90
123
|
// that decided to call a tool. Settle it so the next turn's tokens
|
|
91
124
|
// start a new part instead of extending someone else's sentence.
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
125
|
+
// (Whitespace-only narration is dropped by settleText.)
|
|
126
|
+
const hadText = acc.trim().length > 0;
|
|
127
|
+
settleText();
|
|
128
|
+
// MCP Apps: a call that renders a view becomes a tool-call part.
|
|
129
|
+
// Only when the server minted a session for it — a plain tool call
|
|
130
|
+
// stays what it always was, a boundary and nothing rendered.
|
|
131
|
+
if (event.app) {
|
|
132
|
+
const partForApp = {
|
|
133
|
+
type: "tool-call",
|
|
134
|
+
toolCallId: event.toolCallId,
|
|
135
|
+
toolName: event.toolName,
|
|
136
|
+
args: (event.arguments ?? {}),
|
|
137
|
+
argsText: JSON.stringify(event.arguments ?? {}),
|
|
138
|
+
mcp: { app: { resourceUri: event.app.resourceUri, serverId: event.app.session } },
|
|
139
|
+
};
|
|
140
|
+
appParts.set(event.toolCallId, partForApp);
|
|
141
|
+
settled.push(partForApp);
|
|
95
142
|
yield { content: partsWith(acc) };
|
|
96
143
|
}
|
|
97
|
-
else {
|
|
98
|
-
|
|
99
|
-
|
|
144
|
+
else if (hadText) {
|
|
145
|
+
yield { content: partsWith(acc) };
|
|
146
|
+
}
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (event.type === "tool_call.completed" || event.type === "tool_call.failed") {
|
|
150
|
+
// Only MCP App parts exist to update; every other tool call was a
|
|
151
|
+
// boundary. Idempotent: a duplicate terminal event for the same id
|
|
152
|
+
// is a no-op once the result is set.
|
|
153
|
+
const existing = appParts.get(event.toolCallId);
|
|
154
|
+
if (existing && existing.result === undefined) {
|
|
155
|
+
const idx = settled.indexOf(existing);
|
|
156
|
+
const updated = event.type === "tool_call.completed"
|
|
157
|
+
? { ...existing, result: event.result ?? { content: [] }, isError: event.result?.isError === true }
|
|
158
|
+
: {
|
|
159
|
+
...existing,
|
|
160
|
+
isError: true,
|
|
161
|
+
result: event.result ?? {
|
|
162
|
+
isError: true,
|
|
163
|
+
content: [
|
|
164
|
+
{
|
|
165
|
+
type: "text",
|
|
166
|
+
text: event.reason === "policy_denied"
|
|
167
|
+
? "This action was not allowed."
|
|
168
|
+
: "The tool could not complete.",
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
appParts.set(event.toolCallId, updated);
|
|
174
|
+
if (idx >= 0)
|
|
175
|
+
settled[idx] = updated;
|
|
176
|
+
yield { content: partsWith(acc) };
|
|
100
177
|
}
|
|
101
178
|
continue;
|
|
102
179
|
}
|
|
@@ -114,6 +191,7 @@ attachments) {
|
|
|
114
191
|
// `done` carries the TERMINAL reply only, so it replaces the
|
|
115
192
|
// in-flight segment — never the settled ones.
|
|
116
193
|
const finalText = event.message?.content ?? acc;
|
|
194
|
+
interruptUnresolvedApps("The turn ended before this view received a result.");
|
|
117
195
|
yield {
|
|
118
196
|
content: partsWith(finalText),
|
|
119
197
|
status: { type: "complete", reason: "stop" },
|
|
@@ -123,8 +201,9 @@ attachments) {
|
|
|
123
201
|
return;
|
|
124
202
|
}
|
|
125
203
|
if (event.type === "error") {
|
|
204
|
+
interruptUnresolvedApps("The agent failed before this view received a result.");
|
|
126
205
|
yield {
|
|
127
|
-
content: [{ type: "text", text: event.message }],
|
|
206
|
+
content: [...settled.filter((p) => p.type === "tool-call"), { type: "text", text: event.message }],
|
|
128
207
|
status: { type: "incomplete", reason: "error" },
|
|
129
208
|
};
|
|
130
209
|
callbacks.onError?.(new Error(event.message));
|
|
@@ -167,10 +246,11 @@ attachments) {
|
|
|
167
246
|
//
|
|
168
247
|
// Anything already streamed is kept — partial text the user watched
|
|
169
248
|
// arrive is real — and the status marks the turn incomplete.
|
|
170
|
-
const
|
|
249
|
+
const hadAnything = settled.some((p) => p.type === "text") || acc.length > 0;
|
|
171
250
|
const truncatedNotice = "The connection to the agent ended unexpectedly. Please try again.";
|
|
251
|
+
interruptUnresolvedApps("The stream was interrupted before this view received a result.");
|
|
172
252
|
yield {
|
|
173
|
-
content: partsWith(
|
|
253
|
+
content: partsWith(hadAnything ? acc : truncatedNotice),
|
|
174
254
|
status: { type: "incomplete", reason: "error" },
|
|
175
255
|
};
|
|
176
256
|
callbacks.onError?.(new Error("Stream ended without a terminal event"));
|
|
@@ -203,6 +283,20 @@ function latestUserAttachmentIds(messages) {
|
|
|
203
283
|
}
|
|
204
284
|
return [];
|
|
205
285
|
}
|
|
286
|
+
/**
|
|
287
|
+
* The app session on the latest user turn, when a rendered view sent it.
|
|
288
|
+
* Stamped by `McpAppToolPart` on `metadata.custom`; absent for typed turns.
|
|
289
|
+
*/
|
|
290
|
+
function latestUserAppSession(messages) {
|
|
291
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
292
|
+
const m = messages[i];
|
|
293
|
+
if (m.role !== "user")
|
|
294
|
+
continue;
|
|
295
|
+
const v = m.metadata?.custom?.[APP_SESSION_METADATA_KEY];
|
|
296
|
+
return typeof v === "string" && v ? v : undefined;
|
|
297
|
+
}
|
|
298
|
+
return undefined;
|
|
299
|
+
}
|
|
206
300
|
/**
|
|
207
301
|
* Pull the latest user-turn text out of assistant-ui's structured
|
|
208
302
|
* message array. Text parts are concatenated with newlines; other
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CuratorAdapter.js","sourceRoot":"","sources":["../../src/CuratorAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"CuratorAdapter.js","sourceRoot":"","sources":["../../src/CuratorAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { type CSSProperties, type ReactNode } from "react";
|
|
13
13
|
import type { AssistantMessage, Curator, CuratorError, Environment, StreamState, StreamPlanProgress } from "@darqlabs/curator-sdk";
|
|
14
|
+
import { type McpAppsOptions } from "./mcpApps/McpAppContext.js";
|
|
14
15
|
/**
|
|
15
16
|
* A starter prompt offered in the empty thread.
|
|
16
17
|
*
|
|
@@ -103,6 +104,13 @@ export interface CuratorChatProps {
|
|
|
103
104
|
onPlanProgress?: (progress: StreamPlanProgress) => void;
|
|
104
105
|
/** Fired on any terminal stream error or thrown exception. */
|
|
105
106
|
onError?: (error: CuratorError | Error) => void;
|
|
107
|
+
/**
|
|
108
|
+
* MCP Apps (SEP-1865). When an attached MCP tool declares a `ui://` view AND
|
|
109
|
+
* the deployment's admin exposed its call data, the agent's call renders as
|
|
110
|
+
* an interactive view inline in the transcript, sandboxed on a separate
|
|
111
|
+
* origin. Default: enabled. See `McpAppsOptions`.
|
|
112
|
+
*/
|
|
113
|
+
mcpApps?: McpAppsOptions;
|
|
106
114
|
/**
|
|
107
115
|
* Show a retry (↻) button under the latest assistant message. Default:
|
|
108
116
|
* off. Retry re-sends the preceding user message through the SDK — note
|