@assistant-ui/react 0.10.43 → 0.10.45

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 (65) hide show
  1. package/dist/model-context/frame/AssistantFrameHost.d.ts +37 -0
  2. package/dist/model-context/frame/AssistantFrameHost.d.ts.map +1 -0
  3. package/dist/model-context/frame/AssistantFrameHost.js +151 -0
  4. package/dist/model-context/frame/AssistantFrameHost.js.map +1 -0
  5. package/dist/model-context/frame/AssistantFrameProvider.d.ts +41 -0
  6. package/dist/model-context/frame/AssistantFrameProvider.d.ts.map +1 -0
  7. package/dist/model-context/frame/AssistantFrameProvider.js +142 -0
  8. package/dist/model-context/frame/AssistantFrameProvider.js.map +1 -0
  9. package/dist/model-context/frame/AssistantFrameTypes.d.ts +29 -0
  10. package/dist/model-context/frame/AssistantFrameTypes.d.ts.map +1 -0
  11. package/dist/model-context/frame/AssistantFrameTypes.js +6 -0
  12. package/dist/model-context/frame/AssistantFrameTypes.js.map +1 -0
  13. package/dist/model-context/frame/index.d.ts +5 -0
  14. package/dist/model-context/frame/index.d.ts.map +1 -0
  15. package/dist/model-context/frame/index.js +6 -0
  16. package/dist/model-context/frame/index.js.map +1 -0
  17. package/dist/model-context/frame/useAssistantFrameHost.d.ts +28 -0
  18. package/dist/model-context/frame/useAssistantFrameHost.d.ts.map +1 -0
  19. package/dist/model-context/frame/useAssistantFrameHost.js +25 -0
  20. package/dist/model-context/frame/useAssistantFrameHost.js.map +1 -0
  21. package/dist/model-context/index.d.ts +2 -0
  22. package/dist/model-context/index.d.ts.map +1 -1
  23. package/dist/model-context/index.js +2 -0
  24. package/dist/model-context/index.js.map +1 -1
  25. package/dist/model-context/registry/ModelContextRegistry.d.ts +19 -0
  26. package/dist/model-context/registry/ModelContextRegistry.d.ts.map +1 -0
  27. package/dist/model-context/registry/ModelContextRegistry.js +117 -0
  28. package/dist/model-context/registry/ModelContextRegistry.js.map +1 -0
  29. package/dist/model-context/registry/ModelContextRegistryHandles.d.ts +14 -0
  30. package/dist/model-context/registry/ModelContextRegistryHandles.d.ts.map +1 -0
  31. package/dist/model-context/registry/ModelContextRegistryHandles.js +1 -0
  32. package/dist/model-context/registry/ModelContextRegistryHandles.js.map +1 -0
  33. package/dist/model-context/registry/index.d.ts +3 -0
  34. package/dist/model-context/registry/index.d.ts.map +1 -0
  35. package/dist/model-context/registry/index.js +4 -0
  36. package/dist/model-context/registry/index.js.map +1 -0
  37. package/dist/model-context/useAssistantInstructions.d.ts +1 -2
  38. package/dist/model-context/useAssistantInstructions.d.ts.map +1 -1
  39. package/dist/model-context/useAssistantInstructions.js.map +1 -1
  40. package/dist/runtimes/composer/BaseComposerRuntimeCore.d.ts.map +1 -1
  41. package/dist/runtimes/composer/BaseComposerRuntimeCore.js +5 -4
  42. package/dist/runtimes/composer/BaseComposerRuntimeCore.js.map +1 -1
  43. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.d.ts +4 -1
  44. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.d.ts.map +1 -1
  45. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.js +25 -10
  46. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.js.map +1 -1
  47. package/dist/types/MessagePartTypes.d.ts +2 -0
  48. package/dist/types/MessagePartTypes.d.ts.map +1 -1
  49. package/package.json +3 -3
  50. package/src/model-context/frame/AssistantFrame.test.ts +353 -0
  51. package/src/model-context/frame/AssistantFrameHost.ts +218 -0
  52. package/src/model-context/frame/AssistantFrameProvider.ts +225 -0
  53. package/src/model-context/frame/AssistantFrameTypes.ts +40 -0
  54. package/src/model-context/frame/SPEC_AssistantFrame.md +104 -0
  55. package/src/model-context/frame/index.ts +4 -0
  56. package/src/model-context/frame/useAssistantFrameHost.ts +48 -0
  57. package/src/model-context/index.ts +3 -0
  58. package/src/model-context/registry/ModelContextRegistry.ts +165 -0
  59. package/src/model-context/registry/ModelContextRegistryHandles.ts +19 -0
  60. package/src/model-context/registry/SPEC_ModelContextRegistry.md +40 -0
  61. package/src/model-context/registry/index.ts +2 -0
  62. package/src/model-context/useAssistantInstructions.tsx +1 -1
  63. package/src/runtimes/composer/BaseComposerRuntimeCore.tsx +5 -4
  64. package/src/runtimes/external-store/ExternalStoreThreadRuntimeCore.tsx +29 -11
  65. package/src/types/MessagePartTypes.ts +2 -0
@@ -0,0 +1,37 @@
1
+ import { ModelContextProvider, ModelContext } from "../../model-context/ModelContextTypes";
2
+ import { Unsubscribe } from "../../types/Unsubscribe";
3
+ /**
4
+ * AssistantFrameHost - Runs in the parent window and acts as a ModelContextProvider
5
+ * that receives context from an iframe's AssistantFrameProvider.
6
+ *
7
+ * Usage example:
8
+ * ```typescript
9
+ * // In parent window
10
+ * const frameHost = new AssistantFrameHost(iframeWindow);
11
+ *
12
+ * // Register with assistant runtime
13
+ * const runtime = useAssistantRuntime();
14
+ * runtime.registerModelContextProvider(frameHost);
15
+ *
16
+ * // The assistant now has access to tools from the iframe
17
+ * ```
18
+ */
19
+ export declare class AssistantFrameHost implements ModelContextProvider {
20
+ private _context;
21
+ private _subscribers;
22
+ private _pendingRequests;
23
+ private _requestCounter;
24
+ private _iframeWindow;
25
+ private _targetOrigin;
26
+ constructor(iframeWindow: Window, targetOrigin?: string);
27
+ private handleMessage;
28
+ private updateContext;
29
+ private callTool;
30
+ private sendRequest;
31
+ private requestContext;
32
+ private notifySubscribers;
33
+ getModelContext(): ModelContext;
34
+ subscribe(callback: () => void): Unsubscribe;
35
+ dispose(): void;
36
+ }
37
+ //# sourceMappingURL=AssistantFrameHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantFrameHost.d.ts","sourceRoot":"","sources":["../../../src/model-context/frame/AssistantFrameHost.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,YAAY,EACb,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAyCtD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,kBAAmB,YAAW,oBAAoB;IAC7D,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,gBAAgB,CAMpB;IACJ,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAS;gBAElB,YAAY,EAAE,MAAM,EAAE,YAAY,GAAE,MAAY;IAW5D,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,WAAW;IAsCnB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,iBAAiB;IAIzB,eAAe,IAAI,YAAY;IAI/B,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW;IAK5C,OAAO;CAKR"}
@@ -0,0 +1,151 @@
1
+ // src/model-context/frame/AssistantFrameHost.ts
2
+ import {
3
+ FRAME_MESSAGE_CHANNEL
4
+ } from "./AssistantFrameTypes.js";
5
+ var deserializeTool = (serializedTool) => ({
6
+ parameters: serializedTool.parameters,
7
+ ...serializedTool.description && {
8
+ description: serializedTool.description
9
+ },
10
+ ...serializedTool.disabled !== void 0 && {
11
+ disabled: serializedTool.disabled
12
+ },
13
+ ...serializedTool.type && { type: serializedTool.type }
14
+ });
15
+ var deserializeModelContext = (serialized) => ({
16
+ ...serialized.system !== void 0 && { system: serialized.system },
17
+ ...serialized.tools && {
18
+ tools: Object.fromEntries(
19
+ Object.entries(serialized.tools).map(([name, tool]) => [
20
+ name,
21
+ deserializeTool(tool)
22
+ ])
23
+ )
24
+ }
25
+ });
26
+ var AssistantFrameHost = class {
27
+ _context = {};
28
+ _subscribers = /* @__PURE__ */ new Set();
29
+ _pendingRequests = /* @__PURE__ */ new Map();
30
+ _requestCounter = 0;
31
+ _iframeWindow;
32
+ _targetOrigin;
33
+ constructor(iframeWindow, targetOrigin = "*") {
34
+ this._iframeWindow = iframeWindow;
35
+ this._targetOrigin = targetOrigin;
36
+ this.handleMessage = this.handleMessage.bind(this);
37
+ window.addEventListener("message", this.handleMessage);
38
+ this.requestContext();
39
+ }
40
+ handleMessage(event) {
41
+ if (this._targetOrigin !== "*" && event.origin !== this._targetOrigin)
42
+ return;
43
+ if (event.source !== this._iframeWindow) return;
44
+ if (event.data?.channel !== FRAME_MESSAGE_CHANNEL) return;
45
+ const message = event.data.message;
46
+ switch (message.type) {
47
+ case "model-context-update": {
48
+ this.updateContext(message.context);
49
+ break;
50
+ }
51
+ case "tool-result": {
52
+ const pending = this._pendingRequests.get(message.id);
53
+ if (pending) {
54
+ if (message.error) {
55
+ pending.reject(new Error(message.error));
56
+ } else {
57
+ pending.resolve(message.result);
58
+ }
59
+ this._pendingRequests.delete(message.id);
60
+ }
61
+ break;
62
+ }
63
+ }
64
+ }
65
+ updateContext(serializedContext) {
66
+ const context = deserializeModelContext(serializedContext);
67
+ this._context = {
68
+ ...context,
69
+ tools: context.tools && Object.fromEntries(
70
+ Object.entries(context.tools).map(([name, tool]) => [
71
+ name,
72
+ {
73
+ ...tool,
74
+ execute: (args) => this.callTool(name, args)
75
+ }
76
+ ])
77
+ )
78
+ };
79
+ this.notifySubscribers();
80
+ }
81
+ callTool(toolName, args) {
82
+ return this.sendRequest(
83
+ {
84
+ type: "tool-call",
85
+ id: `tool-${this._requestCounter++}`,
86
+ toolName,
87
+ args
88
+ },
89
+ 3e4,
90
+ `Tool call "${toolName}" timed out`
91
+ );
92
+ }
93
+ sendRequest(message, timeout = 3e4, timeoutMessage = "Request timed out") {
94
+ return new Promise((resolve, reject) => {
95
+ this._pendingRequests.set(message.id, { resolve, reject });
96
+ this._iframeWindow.postMessage(
97
+ { channel: FRAME_MESSAGE_CHANNEL, message },
98
+ this._targetOrigin
99
+ );
100
+ const timeoutId = setTimeout(() => {
101
+ const pending = this._pendingRequests.get(message.id);
102
+ if (pending) {
103
+ pending.reject(new Error(timeoutMessage));
104
+ this._pendingRequests.delete(message.id);
105
+ }
106
+ }, timeout);
107
+ const originalResolve = this._pendingRequests.get(message.id).resolve;
108
+ const originalReject = this._pendingRequests.get(message.id).reject;
109
+ this._pendingRequests.set(message.id, {
110
+ resolve: (value) => {
111
+ clearTimeout(timeoutId);
112
+ originalResolve(value);
113
+ },
114
+ reject: (error) => {
115
+ clearTimeout(timeoutId);
116
+ originalReject(error);
117
+ }
118
+ });
119
+ });
120
+ }
121
+ requestContext() {
122
+ this._iframeWindow.postMessage(
123
+ {
124
+ channel: FRAME_MESSAGE_CHANNEL,
125
+ message: {
126
+ type: "model-context-request"
127
+ }
128
+ },
129
+ this._targetOrigin
130
+ );
131
+ }
132
+ notifySubscribers() {
133
+ this._subscribers.forEach((callback) => callback());
134
+ }
135
+ getModelContext() {
136
+ return this._context;
137
+ }
138
+ subscribe(callback) {
139
+ this._subscribers.add(callback);
140
+ return () => this._subscribers.delete(callback);
141
+ }
142
+ dispose() {
143
+ window.removeEventListener("message", this.handleMessage);
144
+ this._subscribers.clear();
145
+ this._pendingRequests.clear();
146
+ }
147
+ };
148
+ export {
149
+ AssistantFrameHost
150
+ };
151
+ //# sourceMappingURL=AssistantFrameHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/model-context/frame/AssistantFrameHost.ts"],"sourcesContent":["import {\n ModelContextProvider,\n ModelContext,\n} from \"../../model-context/ModelContextTypes\";\nimport { Unsubscribe } from \"../../types/Unsubscribe\";\nimport { Tool } from \"assistant-stream\";\nimport {\n FrameMessage,\n FRAME_MESSAGE_CHANNEL,\n SerializedModelContext,\n SerializedTool,\n} from \"./AssistantFrameTypes\";\n\n/**\n * Deserializes tools from JSON Schema format back to Tool objects\n */\nconst deserializeTool = (serializedTool: SerializedTool): Tool<any, any> =>\n ({\n parameters: serializedTool.parameters,\n ...(serializedTool.description && {\n description: serializedTool.description,\n }),\n ...(serializedTool.disabled !== undefined && {\n disabled: serializedTool.disabled,\n }),\n ...(serializedTool.type && { type: serializedTool.type }),\n }) as Tool<any, any>;\n\n/**\n * Deserializes a ModelContext from transmission format\n */\nconst deserializeModelContext = (\n serialized: SerializedModelContext,\n): ModelContext => ({\n ...(serialized.system !== undefined && { system: serialized.system }),\n ...(serialized.tools && {\n tools: Object.fromEntries(\n Object.entries(serialized.tools).map(([name, tool]) => [\n name,\n deserializeTool(tool),\n ]),\n ),\n }),\n});\n\n/**\n * AssistantFrameHost - Runs in the parent window and acts as a ModelContextProvider\n * that receives context from an iframe's AssistantFrameProvider.\n *\n * Usage example:\n * ```typescript\n * // In parent window\n * const frameHost = new AssistantFrameHost(iframeWindow);\n *\n * // Register with assistant runtime\n * const runtime = useAssistantRuntime();\n * runtime.registerModelContextProvider(frameHost);\n *\n * // The assistant now has access to tools from the iframe\n * ```\n */\nexport class AssistantFrameHost implements ModelContextProvider {\n private _context: ModelContext = {};\n private _subscribers = new Set<() => void>();\n private _pendingRequests = new Map<\n string,\n {\n resolve: (value: any) => void;\n reject: (error: any) => void;\n }\n >();\n private _requestCounter = 0;\n private _iframeWindow: Window;\n private _targetOrigin: string;\n\n constructor(iframeWindow: Window, targetOrigin: string = \"*\") {\n this._iframeWindow = iframeWindow;\n this._targetOrigin = targetOrigin;\n\n this.handleMessage = this.handleMessage.bind(this);\n window.addEventListener(\"message\", this.handleMessage);\n\n // Request initial context\n this.requestContext();\n }\n\n private handleMessage(event: MessageEvent) {\n // Security: Validate origin and source\n if (this._targetOrigin !== \"*\" && event.origin !== this._targetOrigin)\n return;\n if (event.source !== this._iframeWindow) return;\n if (event.data?.channel !== FRAME_MESSAGE_CHANNEL) return;\n\n const message = event.data.message as FrameMessage;\n\n switch (message.type) {\n case \"model-context-update\": {\n this.updateContext(message.context);\n break;\n }\n\n case \"tool-result\": {\n const pending = this._pendingRequests.get(message.id);\n if (pending) {\n if (message.error) {\n pending.reject(new Error(message.error));\n } else {\n pending.resolve(message.result);\n }\n this._pendingRequests.delete(message.id);\n }\n break;\n }\n }\n }\n\n private updateContext(serializedContext: SerializedModelContext) {\n const context = deserializeModelContext(serializedContext);\n this._context = {\n ...context,\n tools:\n context.tools &&\n Object.fromEntries(\n Object.entries(context.tools).map(([name, tool]) => [\n name,\n {\n ...tool,\n execute: (args: any) => this.callTool(name, args),\n } as Tool<any, any>,\n ]),\n ),\n };\n this.notifySubscribers();\n }\n\n private callTool(toolName: string, args: any): Promise<any> {\n return this.sendRequest(\n {\n type: \"tool-call\",\n id: `tool-${this._requestCounter++}`,\n toolName,\n args,\n },\n 30000,\n `Tool call \"${toolName}\" timed out`,\n );\n }\n\n private sendRequest<T extends FrameMessage & { id: string }>(\n message: T,\n timeout = 30000,\n timeoutMessage = \"Request timed out\",\n ): Promise<any> {\n return new Promise((resolve, reject) => {\n this._pendingRequests.set(message.id, { resolve, reject });\n\n this._iframeWindow.postMessage(\n { channel: FRAME_MESSAGE_CHANNEL, message },\n this._targetOrigin,\n );\n\n const timeoutId = setTimeout(() => {\n const pending = this._pendingRequests.get(message.id);\n if (pending) {\n pending.reject(new Error(timeoutMessage));\n this._pendingRequests.delete(message.id);\n }\n }, timeout);\n\n // Store original resolve/reject with timeout cleanup\n const originalResolve = this._pendingRequests.get(message.id)!.resolve;\n const originalReject = this._pendingRequests.get(message.id)!.reject;\n\n this._pendingRequests.set(message.id, {\n resolve: (value: any) => {\n clearTimeout(timeoutId);\n originalResolve(value);\n },\n reject: (error: any) => {\n clearTimeout(timeoutId);\n originalReject(error);\n },\n });\n });\n }\n\n private requestContext() {\n // Request current context from iframe\n this._iframeWindow.postMessage(\n {\n channel: FRAME_MESSAGE_CHANNEL,\n message: {\n type: \"model-context-request\",\n } as FrameMessage,\n },\n this._targetOrigin,\n );\n }\n\n private notifySubscribers() {\n this._subscribers.forEach((callback) => callback());\n }\n\n getModelContext(): ModelContext {\n return this._context;\n }\n\n subscribe(callback: () => void): Unsubscribe {\n this._subscribers.add(callback);\n return () => this._subscribers.delete(callback);\n }\n\n dispose() {\n window.removeEventListener(\"message\", this.handleMessage);\n this._subscribers.clear();\n this._pendingRequests.clear();\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,41 @@
1
+ import { ModelContextProvider } from "../../model-context/ModelContextTypes";
2
+ import { Unsubscribe } from "../../types/Unsubscribe";
3
+ /**
4
+ * AssistantFrameProvider - Runs inside an iframe and provides ModelContextProviders
5
+ * to the parent window's AssistantFrameHost.
6
+ *
7
+ * Usage example:
8
+ * ```typescript
9
+ * // Inside the iframe
10
+ * // Add model context providers
11
+ * const registry = new ModelContextRegistry();
12
+ * AssistantFrameProvider.addModelContextProvider(registry);
13
+ *
14
+ * // Add tools to registry
15
+ * registry.addTool({
16
+ * toolName: "search",
17
+ * description: "Search the web",
18
+ * parameters: z.object({ query: z.string() }),
19
+ * execute: async (args) => {
20
+ * // Tool implementation runs in iframe
21
+ * return { results: ["..."] };
22
+ * }
23
+ * });
24
+ * ```
25
+ */
26
+ export declare class AssistantFrameProvider {
27
+ private static _instance;
28
+ private _providers;
29
+ private _providerUnsubscribes;
30
+ private _targetOrigin;
31
+ private constructor();
32
+ private static getInstance;
33
+ private handleMessage;
34
+ private handleToolCall;
35
+ private sendMessage;
36
+ private getModelContext;
37
+ private broadcastUpdate;
38
+ static addModelContextProvider(provider: ModelContextProvider, targetOrigin?: string): Unsubscribe;
39
+ static dispose(): void;
40
+ }
41
+ //# sourceMappingURL=AssistantFrameProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantFrameProvider.d.ts","sourceRoot":"","sources":["../../../src/model-context/frame/AssistantFrameProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EAErB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAwCtD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAuC;IAE/D,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,qBAAqB,CAGzB;IACJ,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO;IASP,OAAO,CAAC,MAAM,CAAC,WAAW;IAS1B,OAAO,CAAC,aAAa;YAuBP,cAAc;IA+B5B,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,eAAe;IAevB,MAAM,CAAC,uBAAuB,CAC5B,QAAQ,EAAE,oBAAoB,EAC9B,YAAY,CAAC,EAAE,MAAM,GACpB,WAAW;IAmBd,MAAM,CAAC,OAAO;CAaf"}
@@ -0,0 +1,142 @@
1
+ // src/model-context/frame/AssistantFrameProvider.ts
2
+ import { z } from "zod";
3
+ import {
4
+ FRAME_MESSAGE_CHANNEL
5
+ } from "./AssistantFrameTypes.js";
6
+ var serializeTool = (tool) => ({
7
+ ...tool.description && { description: tool.description },
8
+ parameters: tool.parameters instanceof z.ZodType ? z.toJSONSchema?.(tool.parameters) ?? tool.parameters : tool.parameters,
9
+ ...tool.disabled !== void 0 && { disabled: tool.disabled },
10
+ ...tool.type && { type: tool.type }
11
+ });
12
+ var serializeModelContext = (context) => ({
13
+ ...context.system !== void 0 && { system: context.system },
14
+ ...context.tools && {
15
+ tools: Object.fromEntries(
16
+ Object.entries(context.tools).map(([name, tool]) => [
17
+ name,
18
+ serializeTool(tool)
19
+ ])
20
+ )
21
+ }
22
+ });
23
+ var AssistantFrameProvider = class _AssistantFrameProvider {
24
+ static _instance = null;
25
+ _providers = /* @__PURE__ */ new Set();
26
+ _providerUnsubscribes = /* @__PURE__ */ new Map();
27
+ _targetOrigin;
28
+ constructor(targetOrigin = "*") {
29
+ this._targetOrigin = targetOrigin;
30
+ this.handleMessage = this.handleMessage.bind(this);
31
+ window.addEventListener("message", this.handleMessage);
32
+ setTimeout(() => this.broadcastUpdate(), 0);
33
+ }
34
+ static getInstance(targetOrigin) {
35
+ if (!_AssistantFrameProvider._instance) {
36
+ _AssistantFrameProvider._instance = new _AssistantFrameProvider(
37
+ targetOrigin
38
+ );
39
+ }
40
+ return _AssistantFrameProvider._instance;
41
+ }
42
+ handleMessage(event) {
43
+ if (this._targetOrigin !== "*" && event.origin !== this._targetOrigin)
44
+ return;
45
+ if (event.data?.channel !== FRAME_MESSAGE_CHANNEL) return;
46
+ const message = event.data.message;
47
+ switch (message.type) {
48
+ case "model-context-request":
49
+ this.sendMessage(event, {
50
+ type: "model-context-update",
51
+ context: serializeModelContext(this.getModelContext())
52
+ });
53
+ break;
54
+ case "tool-call":
55
+ this.handleToolCall(message, event);
56
+ break;
57
+ }
58
+ }
59
+ async handleToolCall(message, event) {
60
+ const tool = this.getModelContext().tools?.[message.toolName];
61
+ let result;
62
+ let error;
63
+ if (!tool) {
64
+ error = `Tool "${message.toolName}" not found`;
65
+ } else {
66
+ try {
67
+ result = tool.execute ? await tool.execute(message.args, {
68
+ toolCallId: message.id,
69
+ abortSignal: new AbortController().signal
70
+ }) : void 0;
71
+ } catch (e) {
72
+ error = e instanceof Error ? e.message : String(e);
73
+ }
74
+ }
75
+ this.sendMessage(event, {
76
+ type: "tool-result",
77
+ id: message.id,
78
+ ...error ? { error } : { result }
79
+ });
80
+ }
81
+ sendMessage(event, message) {
82
+ event.source?.postMessage(
83
+ { channel: FRAME_MESSAGE_CHANNEL, message },
84
+ { targetOrigin: event.origin }
85
+ );
86
+ }
87
+ getModelContext() {
88
+ const contexts = Array.from(this._providers).map(
89
+ (p) => p.getModelContext()
90
+ );
91
+ return contexts.reduce(
92
+ (merged, context) => ({
93
+ system: context.system ? merged.system ? `${merged.system}
94
+
95
+ ${context.system}` : context.system : merged.system,
96
+ tools: { ...merged.tools || {}, ...context.tools || {} }
97
+ }),
98
+ {}
99
+ );
100
+ }
101
+ broadcastUpdate() {
102
+ if (window.parent && window.parent !== window) {
103
+ const updateMessage = {
104
+ type: "model-context-update",
105
+ context: serializeModelContext(this.getModelContext())
106
+ };
107
+ window.parent.postMessage(
108
+ { channel: FRAME_MESSAGE_CHANNEL, message: updateMessage },
109
+ this._targetOrigin
110
+ );
111
+ }
112
+ }
113
+ static addModelContextProvider(provider, targetOrigin) {
114
+ const instance = _AssistantFrameProvider.getInstance(targetOrigin);
115
+ instance._providers.add(provider);
116
+ const unsubscribe = provider.subscribe?.(() => instance.broadcastUpdate());
117
+ if (unsubscribe) {
118
+ instance._providerUnsubscribes.set(provider, unsubscribe);
119
+ }
120
+ instance.broadcastUpdate();
121
+ return () => {
122
+ instance._providers.delete(provider);
123
+ instance._providerUnsubscribes.get(provider)?.();
124
+ instance._providerUnsubscribes.delete(provider);
125
+ instance.broadcastUpdate();
126
+ };
127
+ }
128
+ static dispose() {
129
+ if (_AssistantFrameProvider._instance) {
130
+ const instance = _AssistantFrameProvider._instance;
131
+ window.removeEventListener("message", instance.handleMessage);
132
+ instance._providerUnsubscribes.forEach((unsubscribe) => unsubscribe?.());
133
+ instance._providerUnsubscribes.clear();
134
+ instance._providers.clear();
135
+ _AssistantFrameProvider._instance = null;
136
+ }
137
+ }
138
+ };
139
+ export {
140
+ AssistantFrameProvider
141
+ };
142
+ //# sourceMappingURL=AssistantFrameProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/model-context/frame/AssistantFrameProvider.ts"],"sourcesContent":["import {\n ModelContextProvider,\n ModelContext,\n} from \"../../model-context/ModelContextTypes\";\nimport { Unsubscribe } from \"../../types/Unsubscribe\";\nimport { Tool } from \"assistant-stream\";\nimport { z } from \"zod\";\nimport {\n FrameMessage,\n FRAME_MESSAGE_CHANNEL,\n SerializedModelContext,\n SerializedTool,\n} from \"./AssistantFrameTypes\";\n\n/**\n * Converts tools to JSON Schema format for serialization\n */\nconst serializeTool = (tool: Tool<any, any>): SerializedTool => ({\n ...(tool.description && { description: tool.description }),\n parameters:\n tool.parameters instanceof z.ZodType\n ? ((z as any).toJSONSchema?.(tool.parameters) ?? tool.parameters)\n : tool.parameters,\n ...(tool.disabled !== undefined && { disabled: tool.disabled }),\n ...(tool.type && { type: tool.type }),\n});\n\n/**\n * Serializes a ModelContext for transmission across iframe boundary\n */\nconst serializeModelContext = (\n context: ModelContext,\n): SerializedModelContext => ({\n ...(context.system !== undefined && { system: context.system }),\n ...(context.tools && {\n tools: Object.fromEntries(\n Object.entries(context.tools).map(([name, tool]) => [\n name,\n serializeTool(tool),\n ]),\n ),\n }),\n});\n\n/**\n * AssistantFrameProvider - Runs inside an iframe and provides ModelContextProviders\n * to the parent window's AssistantFrameHost.\n *\n * Usage example:\n * ```typescript\n * // Inside the iframe\n * // Add model context providers\n * const registry = new ModelContextRegistry();\n * AssistantFrameProvider.addModelContextProvider(registry);\n *\n * // Add tools to registry\n * registry.addTool({\n * toolName: \"search\",\n * description: \"Search the web\",\n * parameters: z.object({ query: z.string() }),\n * execute: async (args) => {\n * // Tool implementation runs in iframe\n * return { results: [\"...\"] };\n * }\n * });\n * ```\n */\nexport class AssistantFrameProvider {\n private static _instance: AssistantFrameProvider | null = null;\n\n private _providers = new Set<ModelContextProvider>();\n private _providerUnsubscribes = new Map<\n ModelContextProvider,\n Unsubscribe | undefined\n >();\n private _targetOrigin: string;\n\n private constructor(targetOrigin: string = \"*\") {\n this._targetOrigin = targetOrigin;\n this.handleMessage = this.handleMessage.bind(this);\n window.addEventListener(\"message\", this.handleMessage);\n\n // Send initial update on initialization\n setTimeout(() => this.broadcastUpdate(), 0);\n }\n\n private static getInstance(targetOrigin?: string): AssistantFrameProvider {\n if (!AssistantFrameProvider._instance) {\n AssistantFrameProvider._instance = new AssistantFrameProvider(\n targetOrigin,\n );\n }\n return AssistantFrameProvider._instance;\n }\n\n private handleMessage(event: MessageEvent) {\n // Security: Validate origin if specified\n if (this._targetOrigin !== \"*\" && event.origin !== this._targetOrigin)\n return;\n if (event.data?.channel !== FRAME_MESSAGE_CHANNEL) return;\n\n const message = event.data.message as FrameMessage;\n\n switch (message.type) {\n case \"model-context-request\":\n // Respond with current context\n this.sendMessage(event, {\n type: \"model-context-update\",\n context: serializeModelContext(this.getModelContext()),\n });\n break;\n\n case \"tool-call\":\n this.handleToolCall(message, event);\n break;\n }\n }\n\n private async handleToolCall(\n message: Extract<FrameMessage, { type: \"tool-call\" }>,\n event: MessageEvent,\n ) {\n const tool = this.getModelContext().tools?.[message.toolName];\n\n let result: any;\n let error: string | undefined;\n\n if (!tool) {\n error = `Tool \"${message.toolName}\" not found`;\n } else {\n try {\n result = tool.execute\n ? await tool.execute(message.args, {\n toolCallId: message.id,\n abortSignal: new AbortController().signal,\n })\n : undefined;\n } catch (e) {\n error = e instanceof Error ? e.message : String(e);\n }\n }\n\n this.sendMessage(event, {\n type: \"tool-result\",\n id: message.id,\n ...(error ? { error } : { result }),\n });\n }\n\n private sendMessage(event: MessageEvent, message: FrameMessage) {\n event.source?.postMessage(\n { channel: FRAME_MESSAGE_CHANNEL, message },\n { targetOrigin: event.origin },\n );\n }\n\n private getModelContext(): ModelContext {\n const contexts = Array.from(this._providers).map((p) =>\n p.getModelContext(),\n );\n\n return contexts.reduce(\n (merged, context) => ({\n system: context.system\n ? merged.system\n ? `${merged.system}\\n\\n${context.system}`\n : context.system\n : merged.system,\n tools: { ...(merged.tools || {}), ...(context.tools || {}) },\n }),\n {} as ModelContext,\n );\n }\n\n private broadcastUpdate() {\n // Always broadcast to parent window\n if (window.parent && window.parent !== window) {\n const updateMessage: FrameMessage = {\n type: \"model-context-update\",\n context: serializeModelContext(this.getModelContext()),\n };\n\n window.parent.postMessage(\n { channel: FRAME_MESSAGE_CHANNEL, message: updateMessage },\n this._targetOrigin,\n );\n }\n }\n\n static addModelContextProvider(\n provider: ModelContextProvider,\n targetOrigin?: string,\n ): Unsubscribe {\n const instance = AssistantFrameProvider.getInstance(targetOrigin);\n instance._providers.add(provider);\n\n const unsubscribe = provider.subscribe?.(() => instance.broadcastUpdate());\n if (unsubscribe) {\n instance._providerUnsubscribes.set(provider, unsubscribe);\n }\n\n instance.broadcastUpdate();\n\n return () => {\n instance._providers.delete(provider);\n instance._providerUnsubscribes.get(provider)?.();\n instance._providerUnsubscribes.delete(provider);\n instance.broadcastUpdate();\n };\n }\n\n static dispose() {\n if (AssistantFrameProvider._instance) {\n const instance = AssistantFrameProvider._instance;\n window.removeEventListener(\"message\", instance.handleMessage);\n\n // Unsubscribe from all providers\n instance._providerUnsubscribes.forEach((unsubscribe) => unsubscribe?.());\n instance._providerUnsubscribes.clear();\n instance._providers.clear();\n\n AssistantFrameProvider._instance = null;\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,29 @@
1
+ export type SerializedTool = {
2
+ description?: string;
3
+ parameters: any;
4
+ disabled?: boolean;
5
+ type?: string;
6
+ };
7
+ export type SerializedModelContext = {
8
+ system?: string;
9
+ tools?: Record<string, SerializedTool>;
10
+ };
11
+ export type FrameMessageType = "model-context-request" | "model-context-update" | "tool-call" | "tool-result";
12
+ export type FrameMessage = {
13
+ type: "model-context-request";
14
+ } | {
15
+ type: "model-context-update";
16
+ context: SerializedModelContext;
17
+ } | {
18
+ type: "tool-call";
19
+ id: string;
20
+ toolName: string;
21
+ args: unknown;
22
+ } | {
23
+ type: "tool-result";
24
+ id: string;
25
+ result?: unknown;
26
+ error?: string;
27
+ };
28
+ export declare const FRAME_MESSAGE_CHANNEL = "assistant-ui-frame";
29
+ //# sourceMappingURL=AssistantFrameTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantFrameTypes.d.ts","sourceRoot":"","sources":["../../../src/model-context/frame/AssistantFrameTypes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,GAAG,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB,uBAAuB,GACvB,sBAAsB,GACtB,WAAW,GACX,aAAa,CAAC;AAElB,MAAM,MAAM,YAAY,GACpB;IACE,IAAI,EAAE,uBAAuB,CAAC;CAC/B,GACD;IACE,IAAI,EAAE,sBAAsB,CAAC;IAC7B,OAAO,EAAE,sBAAsB,CAAC;CACjC,GACD;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACf,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN,eAAO,MAAM,qBAAqB,uBAAuB,CAAC"}
@@ -0,0 +1,6 @@
1
+ // src/model-context/frame/AssistantFrameTypes.ts
2
+ var FRAME_MESSAGE_CHANNEL = "assistant-ui-frame";
3
+ export {
4
+ FRAME_MESSAGE_CHANNEL
5
+ };
6
+ //# sourceMappingURL=AssistantFrameTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/model-context/frame/AssistantFrameTypes.ts"],"sourcesContent":["export type SerializedTool = {\n description?: string;\n parameters: any; // JSON Schema\n disabled?: boolean;\n type?: string;\n};\n\nexport type SerializedModelContext = {\n system?: string;\n tools?: Record<string, SerializedTool>;\n};\n\nexport type FrameMessageType =\n | \"model-context-request\"\n | \"model-context-update\"\n | \"tool-call\"\n | \"tool-result\";\n\nexport type FrameMessage =\n | {\n type: \"model-context-request\";\n }\n | {\n type: \"model-context-update\";\n context: SerializedModelContext;\n }\n | {\n type: \"tool-call\";\n id: string;\n toolName: string;\n args: unknown;\n }\n | {\n type: \"tool-result\";\n id: string;\n result?: unknown;\n error?: string;\n };\n\nexport const FRAME_MESSAGE_CHANNEL = \"assistant-ui-frame\";\n"],"mappings":";AAuCO,IAAM,wBAAwB;","names":[]}
@@ -0,0 +1,5 @@
1
+ export * from "./AssistantFrameHost";
2
+ export * from "./AssistantFrameProvider";
3
+ export * from "./AssistantFrameTypes";
4
+ export * from "./useAssistantFrameHost";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/model-context/frame/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,6 @@
1
+ // src/model-context/frame/index.ts
2
+ export * from "./AssistantFrameHost.js";
3
+ export * from "./AssistantFrameProvider.js";
4
+ export * from "./AssistantFrameTypes.js";
5
+ export * from "./useAssistantFrameHost.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/model-context/frame/index.ts"],"sourcesContent":["export * from \"./AssistantFrameHost\";\nexport * from \"./AssistantFrameProvider\";\nexport * from \"./AssistantFrameTypes\";\nexport * from \"./useAssistantFrameHost\";\n"],"mappings":";AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1,28 @@
1
+ import { RefObject } from "react";
2
+ import { AssistantFrameHost } from "./AssistantFrameHost";
3
+ import { Unsubscribe } from "../../types";
4
+ type UseAssistantFrameHostOptions = {
5
+ iframeRef: Readonly<RefObject<HTMLIFrameElement | null | undefined>>;
6
+ targetOrigin?: string;
7
+ register: (frameHost: AssistantFrameHost) => Unsubscribe;
8
+ };
9
+ /**
10
+ * React hook that manages the lifecycle of an AssistantFrameHost and its binding to the current AssistantRuntime.
11
+ *
12
+ * Usage example:
13
+ * ```typescript
14
+ * function MyComponent() {
15
+ * const iframeRef = useRef<HTMLIFrameElement>(null);
16
+ *
17
+ * useAssistantFrameHost({
18
+ * iframeRef,
19
+ * targetOrigin: "https://trusted-domain.com", // optional
20
+ * });
21
+ *
22
+ * return <iframe ref={iframeRef} src="..." />;
23
+ * }
24
+ * ```
25
+ */
26
+ export declare const useAssistantFrameHost: ({ iframeRef, targetOrigin, register, }: UseAssistantFrameHostOptions) => void;
27
+ export {};
28
+ //# sourceMappingURL=useAssistantFrameHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAssistantFrameHost.d.ts","sourceRoot":"","sources":["../../../src/model-context/frame/useAssistantFrameHost.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,KAAK,4BAA4B,GAAG;IAClC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,CAAC,SAAS,EAAE,kBAAkB,KAAK,WAAW,CAAC;CAC1D,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,qBAAqB,GAAI,wCAInC,4BAA4B,KAAG,IAcjC,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use client";
2
+
3
+ // src/model-context/frame/useAssistantFrameHost.ts
4
+ import { useEffect } from "react";
5
+ import { AssistantFrameHost } from "./AssistantFrameHost.js";
6
+ var useAssistantFrameHost = ({
7
+ iframeRef,
8
+ targetOrigin = "*",
9
+ register
10
+ }) => {
11
+ useEffect(() => {
12
+ const iframeWindow = iframeRef.current?.contentWindow;
13
+ if (!iframeWindow) return;
14
+ const frameHost = new AssistantFrameHost(iframeWindow, targetOrigin);
15
+ const unsubscribe = register(frameHost);
16
+ return () => {
17
+ frameHost.dispose();
18
+ unsubscribe();
19
+ };
20
+ }, [iframeRef, targetOrigin, register]);
21
+ };
22
+ export {
23
+ useAssistantFrameHost
24
+ };
25
+ //# sourceMappingURL=useAssistantFrameHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/model-context/frame/useAssistantFrameHost.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, RefObject } from \"react\";\nimport { AssistantFrameHost } from \"./AssistantFrameHost\";\nimport { Unsubscribe } from \"../../types\";\n\ntype UseAssistantFrameHostOptions = {\n iframeRef: Readonly<RefObject<HTMLIFrameElement | null | undefined>>;\n targetOrigin?: string;\n register: (frameHost: AssistantFrameHost) => Unsubscribe;\n};\n\n/**\n * React hook that manages the lifecycle of an AssistantFrameHost and its binding to the current AssistantRuntime.\n *\n * Usage example:\n * ```typescript\n * function MyComponent() {\n * const iframeRef = useRef<HTMLIFrameElement>(null);\n *\n * useAssistantFrameHost({\n * iframeRef,\n * targetOrigin: \"https://trusted-domain.com\", // optional\n * });\n *\n * return <iframe ref={iframeRef} src=\"...\" />;\n * }\n * ```\n */\nexport const useAssistantFrameHost = ({\n iframeRef,\n targetOrigin = \"*\",\n register,\n}: UseAssistantFrameHostOptions): void => {\n useEffect(() => {\n const iframeWindow = iframeRef.current?.contentWindow;\n if (!iframeWindow) return;\n\n const frameHost = new AssistantFrameHost(iframeWindow, targetOrigin);\n\n const unsubscribe = register(frameHost);\n\n return () => {\n frameHost.dispose();\n unsubscribe();\n };\n }, [iframeRef, targetOrigin, register]);\n};\n"],"mappings":";;;AAEA,SAAS,iBAA4B;AACrC,SAAS,0BAA0B;AA0B5B,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA,eAAe;AAAA,EACf;AACF,MAA0C;AACxC,YAAU,MAAM;AACd,UAAM,eAAe,UAAU,SAAS;AACxC,QAAI,CAAC,aAAc;AAEnB,UAAM,YAAY,IAAI,mBAAmB,cAAc,YAAY;AAEnE,UAAM,cAAc,SAAS,SAAS;AAEtC,WAAO,MAAM;AACX,gBAAU,QAAQ;AAClB,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,WAAW,cAAc,QAAQ,CAAC;AACxC;","names":[]}
@@ -20,4 +20,6 @@ export { tool } from "./tool";
20
20
  */
21
21
  export { makeAssistantVisible as makeAssistantReadable } from "./makeAssistantVisible";
22
22
  export { makeAssistantVisible } from "./makeAssistantVisible";
23
+ export * from "./registry";
24
+ export * from "./frame";
23
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model-context/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EACL,KAAK,eAAe,EACpB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EACL,kBAAkB,EAClB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,YAAY;AACV;;GAEG;AACH,YAAY,IAAI,eAAe;AAC/B;;GAEG;AACH,oBAAoB,IAAI,uBAAuB,EAC/C,YAAY,EACZ,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B;;GAEG;AACH,OAAO,EAAE,oBAAoB,IAAI,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model-context/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EACL,KAAK,eAAe,EACpB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EACL,kBAAkB,EAClB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,YAAY;AACV;;GAEG;AACH,YAAY,IAAI,eAAe;AAC/B;;GAEG;AACH,oBAAoB,IAAI,uBAAuB,EAC/C,YAAY,EACZ,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B;;GAEG;AACH,OAAO,EAAE,oBAAoB,IAAI,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
@@ -12,6 +12,8 @@ import { useInlineRender } from "./useInlineRender.js";
12
12
  import { tool } from "./tool.js";
13
13
  import { makeAssistantVisible } from "./makeAssistantVisible.js";
14
14
  import { makeAssistantVisible as makeAssistantVisible2 } from "./makeAssistantVisible.js";
15
+ export * from "./registry/index.js";
16
+ export * from "./frame/index.js";
15
17
  export {
16
18
  makeAssistantVisible as makeAssistantReadable,
17
19
  makeAssistantTool,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/model-context/index.ts"],"sourcesContent":["export { makeAssistantTool, type AssistantTool } from \"./makeAssistantTool\";\nexport {\n type AssistantToolUI,\n makeAssistantToolUI,\n} from \"./makeAssistantToolUI\";\nexport { useAssistantInstructions } from \"./useAssistantInstructions\";\nexport { useAssistantTool, type AssistantToolProps } from \"./useAssistantTool\";\nexport {\n useAssistantToolUI,\n type AssistantToolUIProps,\n} from \"./useAssistantToolUI\";\nexport { useInlineRender } from \"./useInlineRender\";\n\nexport type {\n /**\n * @deprecated This type was renamed to `ModelContext`.\n */\n ModelContext as AssistantConfig,\n /**\n * @deprecated This type was renamed to `ModelContextProvider`.\n */\n ModelContextProvider as AssistantConfigProvider,\n ModelContext,\n ModelContextProvider,\n} from \"./ModelContextTypes\";\n\nexport type { Tool } from \"assistant-stream\";\n\nexport { tool } from \"./tool\";\n\n/**\n * @deprecated This function was renamed to `makeAssistantVisible`.\n */\nexport { makeAssistantVisible as makeAssistantReadable } from \"./makeAssistantVisible\";\nexport { makeAssistantVisible } from \"./makeAssistantVisible\";\n"],"mappings":";AAAA,SAAS,yBAA6C;AACtD;AAAA,EAEE;AAAA,OACK;AACP,SAAS,gCAAgC;AACzC,SAAS,wBAAiD;AAC1D;AAAA,EACE;AAAA,OAEK;AACP,SAAS,uBAAuB;AAiBhC,SAAS,YAAY;AAKrB,SAAiC,4BAA6B;AAC9D,SAAS,wBAAAA,6BAA4B;","names":["makeAssistantVisible"]}
1
+ {"version":3,"sources":["../../src/model-context/index.ts"],"sourcesContent":["export { makeAssistantTool, type AssistantTool } from \"./makeAssistantTool\";\nexport {\n type AssistantToolUI,\n makeAssistantToolUI,\n} from \"./makeAssistantToolUI\";\nexport { useAssistantInstructions } from \"./useAssistantInstructions\";\nexport { useAssistantTool, type AssistantToolProps } from \"./useAssistantTool\";\nexport {\n useAssistantToolUI,\n type AssistantToolUIProps,\n} from \"./useAssistantToolUI\";\nexport { useInlineRender } from \"./useInlineRender\";\n\nexport type {\n /**\n * @deprecated This type was renamed to `ModelContext`.\n */\n ModelContext as AssistantConfig,\n /**\n * @deprecated This type was renamed to `ModelContextProvider`.\n */\n ModelContextProvider as AssistantConfigProvider,\n ModelContext,\n ModelContextProvider,\n} from \"./ModelContextTypes\";\n\nexport type { Tool } from \"assistant-stream\";\n\nexport { tool } from \"./tool\";\n\n/**\n * @deprecated This function was renamed to `makeAssistantVisible`.\n */\nexport { makeAssistantVisible as makeAssistantReadable } from \"./makeAssistantVisible\";\nexport { makeAssistantVisible } from \"./makeAssistantVisible\";\n\nexport * from \"./registry\";\nexport * from \"./frame\";\n"],"mappings":";AAAA,SAAS,yBAA6C;AACtD;AAAA,EAEE;AAAA,OACK;AACP,SAAS,gCAAgC;AACzC,SAAS,wBAAiD;AAC1D;AAAA,EACE;AAAA,OAEK;AACP,SAAS,uBAAuB;AAiBhC,SAAS,YAAY;AAKrB,SAAiC,4BAA6B;AAC9D,SAAS,wBAAAA,6BAA4B;AAErC,cAAc;AACd,cAAc;","names":["makeAssistantVisible"]}
@@ -0,0 +1,19 @@
1
+ import { ModelContext, ModelContextProvider } from "../../model-context/ModelContextTypes";
2
+ import { Unsubscribe } from "../../types/Unsubscribe";
3
+ import { ModelContextRegistryToolHandle, ModelContextRegistryInstructionHandle, ModelContextRegistryProviderHandle } from "./ModelContextRegistryHandles";
4
+ import type { AssistantToolProps } from "../../model-context/useAssistantTool";
5
+ import type { AssistantInstructionsConfig } from "../../model-context/useAssistantInstructions";
6
+ export declare class ModelContextRegistry implements ModelContextProvider {
7
+ private _tools;
8
+ private _instructions;
9
+ private _providers;
10
+ private _subscribers;
11
+ private _providerUnsubscribes;
12
+ getModelContext(): ModelContext;
13
+ subscribe(callback: () => void): Unsubscribe;
14
+ private notifySubscribers;
15
+ addTool<TArgs extends Record<string, unknown>, TResult>(tool: AssistantToolProps<TArgs, TResult>): ModelContextRegistryToolHandle<TArgs, TResult>;
16
+ addInstruction(config: string | AssistantInstructionsConfig): ModelContextRegistryInstructionHandle;
17
+ addProvider(provider: ModelContextProvider): ModelContextRegistryProviderHandle;
18
+ }
19
+ //# sourceMappingURL=ModelContextRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelContextRegistry.d.ts","sourceRoot":"","sources":["../../../src/model-context/registry/ModelContextRegistry.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,oBAAoB,EAErB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EACL,8BAA8B,EAC9B,qCAAqC,EACrC,kCAAkC,EACnC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAEhG,qBAAa,oBAAqB,YAAW,oBAAoB;IAC/D,OAAO,CAAC,MAAM,CAAmD;IACjE,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,qBAAqB,CAA8C;IAE3E,eAAe,IAAI,YAAY;IAiD/B,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW;IAK5C,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EACpD,IAAI,EAAE,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,GACvC,8BAA8B,CAAC,KAAK,EAAE,OAAO,CAAC;IAoBjD,cAAc,CACZ,MAAM,EAAE,MAAM,GAAG,2BAA2B,GAC3C,qCAAqC;IAiCxC,WAAW,CACT,QAAQ,EAAE,oBAAoB,GAC7B,kCAAkC;CAuBtC"}