@darqlabs/curator-sdk-react 0.6.1 → 0.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 (56) hide show
  1. package/README.md +18 -0
  2. package/dist/cjs/CuratorAdapter.d.ts +37 -2
  3. package/dist/cjs/CuratorAdapter.d.ts.map +1 -1
  4. package/dist/cjs/CuratorAdapter.js +119 -20
  5. package/dist/cjs/CuratorAdapter.js.map +1 -1
  6. package/dist/cjs/CuratorChat.d.ts +8 -0
  7. package/dist/cjs/CuratorChat.d.ts.map +1 -1
  8. package/dist/cjs/CuratorChat.js +28 -8
  9. package/dist/cjs/CuratorChat.js.map +1 -1
  10. package/dist/cjs/historyMessages.d.ts +20 -1
  11. package/dist/cjs/historyMessages.d.ts.map +1 -1
  12. package/dist/cjs/historyMessages.js +25 -3
  13. package/dist/cjs/historyMessages.js.map +1 -1
  14. package/dist/cjs/index.d.ts +1 -0
  15. package/dist/cjs/index.d.ts.map +1 -1
  16. package/dist/cjs/index.js.map +1 -1
  17. package/dist/cjs/mcpApps/McpAppContext.d.ts +39 -0
  18. package/dist/cjs/mcpApps/McpAppContext.d.ts.map +1 -0
  19. package/dist/cjs/mcpApps/McpAppContext.js +19 -0
  20. package/dist/cjs/mcpApps/McpAppContext.js.map +1 -0
  21. package/dist/cjs/mcpApps/McpAppToolPart.d.ts +27 -0
  22. package/dist/cjs/mcpApps/McpAppToolPart.d.ts.map +1 -0
  23. package/dist/cjs/mcpApps/McpAppToolPart.js +275 -0
  24. package/dist/cjs/mcpApps/McpAppToolPart.js.map +1 -0
  25. package/dist/cjs/mcpApps/hostBridge.d.ts +127 -0
  26. package/dist/cjs/mcpApps/hostBridge.d.ts.map +1 -0
  27. package/dist/cjs/mcpApps/hostBridge.js +306 -0
  28. package/dist/cjs/mcpApps/hostBridge.js.map +1 -0
  29. package/dist/esm/CuratorAdapter.d.ts +37 -2
  30. package/dist/esm/CuratorAdapter.d.ts.map +1 -1
  31. package/dist/esm/CuratorAdapter.js +119 -20
  32. package/dist/esm/CuratorAdapter.js.map +1 -1
  33. package/dist/esm/CuratorChat.d.ts +8 -0
  34. package/dist/esm/CuratorChat.d.ts.map +1 -1
  35. package/dist/esm/CuratorChat.js +28 -8
  36. package/dist/esm/CuratorChat.js.map +1 -1
  37. package/dist/esm/historyMessages.d.ts +20 -1
  38. package/dist/esm/historyMessages.d.ts.map +1 -1
  39. package/dist/esm/historyMessages.js +25 -3
  40. package/dist/esm/historyMessages.js.map +1 -1
  41. package/dist/esm/index.d.ts +1 -0
  42. package/dist/esm/index.d.ts.map +1 -1
  43. package/dist/esm/index.js.map +1 -1
  44. package/dist/esm/mcpApps/McpAppContext.d.ts +39 -0
  45. package/dist/esm/mcpApps/McpAppContext.d.ts.map +1 -0
  46. package/dist/esm/mcpApps/McpAppContext.js +15 -0
  47. package/dist/esm/mcpApps/McpAppContext.js.map +1 -0
  48. package/dist/esm/mcpApps/McpAppToolPart.d.ts +27 -0
  49. package/dist/esm/mcpApps/McpAppToolPart.d.ts.map +1 -0
  50. package/dist/esm/mcpApps/McpAppToolPart.js +271 -0
  51. package/dist/esm/mcpApps/McpAppToolPart.js.map +1 -0
  52. package/dist/esm/mcpApps/hostBridge.d.ts +127 -0
  53. package/dist/esm/mcpApps/hostBridge.d.ts.map +1 -0
  54. package/dist/esm/mcpApps/hostBridge.js +300 -0
  55. package/dist/esm/mcpApps/hostBridge.js.map +1 -0
  56. package/package.json +5 -4
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Host side of the MCP Apps (SEP-1865) bridge: JSON-RPC 2.0 over a message
3
+ * transport, from the widget to one rendered view.
4
+ *
5
+ * Pure. Knows nothing about React, iframes or the network: the caller hands
6
+ * it a `post` function to reach the view and feeds it every message the view
7
+ * sends. Everything the view may ask for is a `handlers` callback, so the
8
+ * whole protocol can be exercised in a unit test with a fake view.
9
+ *
10
+ * What the view may do, and what this bridge does with it:
11
+ *
12
+ * ui/initialize → handshake; answers with host info,
13
+ * capabilities and context
14
+ * ui/notifications/initialized → view is ready; deliver the tool input,
15
+ * then the tool result once known
16
+ * tools/call → handlers.callTool (the Curator data plane)
17
+ * ui/message → handlers.sendMessage (app-reported text)
18
+ * ui/update-model-context → handlers.updateModelContext (surfaced only)
19
+ * ui/open-link → handlers.openLink (http(s) only)
20
+ * ui/request-display-mode → always `inline` in v1
21
+ * ui/notifications/size-changed → handlers.onSizeChange
22
+ * notifications/message → handlers.onLog
23
+ * ping → {}
24
+ * anything else → JSON-RPC "method not found"
25
+ *
26
+ * Method names are the ones ext-apps 2.0 emits (`ui/…`). The deprecated
27
+ * `notifications/…` spellings assistant-ui also accepts are NOT supported:
28
+ * fewer names to reason about, and our reference view uses the current SDK.
29
+ */
30
+ export const MCP_APPS_PROTOCOL_VERSION = "2026-01-26";
31
+ const ERR = { invalidRequest: -32600, methodNotFound: -32601, invalidParams: -32602, internal: -32603 };
32
+ const DEFAULT_MAX_MESSAGE_CHARS = 2048;
33
+ // Control characters except tab / newline / carriage return.
34
+ // eslint-disable-next-line no-control-regex
35
+ const CONTROL_CHARS = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g;
36
+ function isRecord(v) {
37
+ return typeof v === "object" && v !== null && !Array.isArray(v);
38
+ }
39
+ /**
40
+ * The text of a spec-shaped `ui/message`: `{ role, content: [{type:"text", text}] }`.
41
+ * Also accepts a bare `{ text }` for lenient views. Control characters are
42
+ * stripped and the length capped; the result is plain text, never markup.
43
+ */
44
+ export function extractMessageText(params, maxChars = DEFAULT_MAX_MESSAGE_CHARS) {
45
+ if (!isRecord(params))
46
+ return null;
47
+ let text = null;
48
+ if (Array.isArray(params.content)) {
49
+ text = params.content
50
+ .filter((c) => isRecord(c) && c.type === "text" && typeof c.text === "string")
51
+ .map((c) => c.text)
52
+ .join("\n");
53
+ }
54
+ else if (typeof params.text === "string") {
55
+ text = params.text;
56
+ }
57
+ if (text === null)
58
+ return null;
59
+ const clean = text.replace(CONTROL_CHARS, "").slice(0, maxChars).trim();
60
+ return clean.length > 0 ? clean : null;
61
+ }
62
+ /** Only web links leave the sandbox. */
63
+ export function isOpenableUrl(url) {
64
+ if (typeof url !== "string")
65
+ return false;
66
+ try {
67
+ const u = new URL(url);
68
+ return u.protocol === "https:" || u.protocol === "http:";
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ }
74
+ export class McpAppHostBridge {
75
+ post;
76
+ handlers;
77
+ hostInfo;
78
+ hostContext;
79
+ maxMessageChars;
80
+ initialized = false;
81
+ closed = false;
82
+ nextId = 1;
83
+ pending = new Map();
84
+ /** Tool input, delivered on `initialized` (or immediately when already ready). */
85
+ toolInput;
86
+ toolInputSent = false;
87
+ /** Tool result, delivered after input once known. */
88
+ toolResult;
89
+ toolResultSent = false;
90
+ constructor(opts) {
91
+ this.post = opts.post;
92
+ this.handlers = opts.handlers;
93
+ this.hostInfo = opts.hostInfo ?? { name: "Curator", version: "1" };
94
+ this.hostContext = {
95
+ platform: "web",
96
+ displayMode: "inline",
97
+ availableDisplayModes: ["inline"],
98
+ ...opts.hostContext,
99
+ };
100
+ this.maxMessageChars = opts.maxMessageChars ?? DEFAULT_MAX_MESSAGE_CHARS;
101
+ }
102
+ get isInitialized() {
103
+ return this.initialized;
104
+ }
105
+ // ── host → view ─────────────────────────────────────────────────────────
106
+ setToolInput(args) {
107
+ this.toolInput = args;
108
+ this.flush();
109
+ }
110
+ setToolResult(result) {
111
+ this.toolResult = result;
112
+ this.flush();
113
+ }
114
+ notifyToolCancelled(reason) {
115
+ this.notify("ui/notifications/tool-cancelled", { reason });
116
+ }
117
+ updateHostContext(patch) {
118
+ this.hostContext = { ...this.hostContext, ...patch };
119
+ if (this.initialized)
120
+ this.notify("ui/notifications/host-context-changed", patch);
121
+ }
122
+ /** Ask the view to tear down; resolves when it answers or after `timeoutMs`. */
123
+ async teardown(timeoutMs = 500) {
124
+ if (this.closed)
125
+ return;
126
+ if (this.initialized) {
127
+ await Promise.race([
128
+ this.request("ui/resource-teardown", {}).catch(() => undefined),
129
+ new Promise((r) => setTimeout(r, timeoutMs)),
130
+ ]);
131
+ }
132
+ this.close();
133
+ }
134
+ close() {
135
+ this.closed = true;
136
+ for (const p of this.pending.values())
137
+ p.reject(new Error("bridge closed"));
138
+ this.pending.clear();
139
+ }
140
+ // ── view → host ─────────────────────────────────────────────────────────
141
+ /** Feed one message received from the view. Non-JSON-RPC traffic is ignored. */
142
+ onMessage(data) {
143
+ if (this.closed || !isRecord(data) || data.jsonrpc !== "2.0")
144
+ return;
145
+ if ("method" in data && typeof data.method === "string") {
146
+ if ("id" in data && (typeof data.id === "string" || typeof data.id === "number")) {
147
+ void this.handleRequest(data);
148
+ }
149
+ else {
150
+ this.handleNotification(data);
151
+ }
152
+ return;
153
+ }
154
+ if ("id" in data && (typeof data.id === "string" || typeof data.id === "number")) {
155
+ const pending = this.pending.get(data.id);
156
+ if (!pending)
157
+ return;
158
+ this.pending.delete(data.id);
159
+ const res = data;
160
+ if (res.error)
161
+ pending.reject(new Error(res.error.message));
162
+ else
163
+ pending.resolve(res.result);
164
+ }
165
+ }
166
+ async handleRequest(req) {
167
+ const params = isRecord(req.params) ? req.params : {};
168
+ try {
169
+ switch (req.method) {
170
+ case "ui/initialize": {
171
+ const requested = typeof params.protocolVersion === "string" ? params.protocolVersion : MCP_APPS_PROTOCOL_VERSION;
172
+ this.respond(req.id, {
173
+ protocolVersion: requested,
174
+ hostInfo: this.hostInfo,
175
+ hostCapabilities: {
176
+ openLinks: {},
177
+ serverTools: {},
178
+ message: { text: {} },
179
+ updateModelContext: { text: {}, structuredContent: {} },
180
+ logging: {},
181
+ },
182
+ hostContext: this.hostContext,
183
+ });
184
+ return;
185
+ }
186
+ case "ping":
187
+ this.respond(req.id, {});
188
+ return;
189
+ case "tools/call": {
190
+ if (typeof params.name !== "string" || !params.name) {
191
+ this.error(req.id, ERR.invalidParams, "`name` is required");
192
+ return;
193
+ }
194
+ const args = isRecord(params.arguments) ? params.arguments : {};
195
+ const meta = isRecord(params._meta) ? params._meta : undefined;
196
+ const result = await this.handlers.callTool({
197
+ name: params.name,
198
+ arguments: args,
199
+ ...(meta ? { _meta: meta } : {}),
200
+ });
201
+ this.respond(req.id, result);
202
+ return;
203
+ }
204
+ case "ui/message": {
205
+ const text = extractMessageText(params, this.maxMessageChars);
206
+ if (!text) {
207
+ this.error(req.id, ERR.invalidParams, "ui/message needs text content");
208
+ return;
209
+ }
210
+ const accepted = await this.handlers.sendMessage(text);
211
+ this.respond(req.id, accepted ? {} : { isError: true });
212
+ return;
213
+ }
214
+ case "ui/update-model-context": {
215
+ this.handlers.updateModelContext?.({
216
+ content: params.content,
217
+ structuredContent: params.structuredContent,
218
+ });
219
+ this.respond(req.id, {});
220
+ return;
221
+ }
222
+ case "ui/open-link": {
223
+ const ok = isOpenableUrl(params.url) && (this.handlers.openLink?.(params.url) ?? false);
224
+ this.respond(req.id, ok ? {} : { isError: true });
225
+ return;
226
+ }
227
+ case "ui/request-display-mode":
228
+ // Inline only in v1; the host has final authority per spec.
229
+ this.respond(req.id, { mode: "inline" });
230
+ return;
231
+ default:
232
+ this.error(req.id, ERR.methodNotFound, `${req.method} is not supported by this host`);
233
+ }
234
+ }
235
+ catch (err) {
236
+ const message = err instanceof Error ? err.message : String(err);
237
+ this.handlers.onError?.(err instanceof Error ? err : new Error(message));
238
+ // A refused/failed tool call is still a well-formed JSON-RPC error; the
239
+ // view decides how to show it.
240
+ this.error(req.id, ERR.internal, message);
241
+ }
242
+ }
243
+ handleNotification(n) {
244
+ const params = isRecord(n.params) ? n.params : {};
245
+ switch (n.method) {
246
+ case "ui/notifications/initialized":
247
+ this.initialized = true;
248
+ this.handlers.onInitialized?.();
249
+ this.flush();
250
+ return;
251
+ case "ui/notifications/size-changed":
252
+ this.handlers.onSizeChange?.({
253
+ ...(typeof params.width === "number" ? { width: params.width } : {}),
254
+ ...(typeof params.height === "number" ? { height: params.height } : {}),
255
+ });
256
+ return;
257
+ case "notifications/message":
258
+ this.handlers.onLog?.(params);
259
+ return;
260
+ default:
261
+ return;
262
+ }
263
+ }
264
+ // ── plumbing ────────────────────────────────────────────────────────────
265
+ flush() {
266
+ if (!this.initialized || this.closed)
267
+ return;
268
+ if (this.toolInput !== undefined && !this.toolInputSent) {
269
+ this.notify("ui/notifications/tool-input", { arguments: this.toolInput });
270
+ this.toolInputSent = true;
271
+ }
272
+ if (this.toolResult !== undefined && !this.toolResultSent) {
273
+ this.notify("ui/notifications/tool-result", this.toolResult);
274
+ this.toolResultSent = true;
275
+ }
276
+ }
277
+ notify(method, params) {
278
+ if (this.closed)
279
+ return;
280
+ this.post({ jsonrpc: "2.0", method, params });
281
+ }
282
+ request(method, params) {
283
+ const id = this.nextId++;
284
+ return new Promise((resolve, reject) => {
285
+ this.pending.set(id, { resolve, reject });
286
+ this.post({ jsonrpc: "2.0", id, method, params });
287
+ });
288
+ }
289
+ respond(id, result) {
290
+ if (this.closed)
291
+ return;
292
+ this.post({ jsonrpc: "2.0", id, result });
293
+ }
294
+ error(id, code, message) {
295
+ if (this.closed)
296
+ return;
297
+ this.post({ jsonrpc: "2.0", id, error: { code, message } });
298
+ }
299
+ }
300
+ //# 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darqlabs/curator-sdk-react",
3
- "version": "0.6.1",
3
+ "version": "0.8.0",
4
4
  "description": "Official React components for Curator — drop-in chat widget and headless hook backed by @darqlabs/curator-sdk.",
5
5
  "license": "MIT",
6
6
  "main": "./dist/cjs/index.js",
@@ -28,12 +28,13 @@
28
28
  },
29
29
  "dependencies": {
30
30
  "@assistant-ui/react": "^0.15.16",
31
- "react-markdown": "^10.0.0"
31
+ "react-markdown": "^10.0.0",
32
+ "safe-content-frame": "0.0.27"
32
33
  },
33
34
  "peerDependencies": {
34
35
  "react": "^18.0.0 || ^19.0.0",
35
36
  "react-dom": "^18.0.0 || ^19.0.0",
36
- "@darqlabs/curator-sdk": "^0.6.1"
37
+ "@darqlabs/curator-sdk": "^0.8.0"
37
38
  },
38
39
  "devDependencies": {
39
40
  "@testing-library/react": "^16.1.0",
@@ -46,7 +47,7 @@
46
47
  "react-dom": "^18.3.0",
47
48
  "ts-jest": "^29.4.9",
48
49
  "typescript": "^5.9.3",
49
- "@darqlabs/curator-sdk": "^0.6.1"
50
+ "@darqlabs/curator-sdk": "^0.8.0"
50
51
  },
51
52
  "keywords": [
52
53
  "curator",