@assistant-ui/react 0.10.44 → 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.
- package/dist/model-context/frame/AssistantFrameHost.d.ts +37 -0
- package/dist/model-context/frame/AssistantFrameHost.d.ts.map +1 -0
- package/dist/model-context/frame/AssistantFrameHost.js +151 -0
- package/dist/model-context/frame/AssistantFrameHost.js.map +1 -0
- package/dist/model-context/frame/AssistantFrameProvider.d.ts +41 -0
- package/dist/model-context/frame/AssistantFrameProvider.d.ts.map +1 -0
- package/dist/model-context/frame/AssistantFrameProvider.js +142 -0
- package/dist/model-context/frame/AssistantFrameProvider.js.map +1 -0
- package/dist/model-context/frame/AssistantFrameTypes.d.ts +29 -0
- package/dist/model-context/frame/AssistantFrameTypes.d.ts.map +1 -0
- package/dist/model-context/frame/AssistantFrameTypes.js +6 -0
- package/dist/model-context/frame/AssistantFrameTypes.js.map +1 -0
- package/dist/model-context/frame/index.d.ts +5 -0
- package/dist/model-context/frame/index.d.ts.map +1 -0
- package/dist/model-context/frame/index.js +6 -0
- package/dist/model-context/frame/index.js.map +1 -0
- package/dist/model-context/frame/useAssistantFrameHost.d.ts +28 -0
- package/dist/model-context/frame/useAssistantFrameHost.d.ts.map +1 -0
- package/dist/model-context/frame/useAssistantFrameHost.js +25 -0
- package/dist/model-context/frame/useAssistantFrameHost.js.map +1 -0
- package/dist/model-context/index.d.ts +2 -0
- package/dist/model-context/index.d.ts.map +1 -1
- package/dist/model-context/index.js +2 -0
- package/dist/model-context/index.js.map +1 -1
- package/dist/model-context/registry/ModelContextRegistry.d.ts +19 -0
- package/dist/model-context/registry/ModelContextRegistry.d.ts.map +1 -0
- package/dist/model-context/registry/ModelContextRegistry.js +117 -0
- package/dist/model-context/registry/ModelContextRegistry.js.map +1 -0
- package/dist/model-context/registry/ModelContextRegistryHandles.d.ts +14 -0
- package/dist/model-context/registry/ModelContextRegistryHandles.d.ts.map +1 -0
- package/dist/model-context/registry/ModelContextRegistryHandles.js +1 -0
- package/dist/model-context/registry/ModelContextRegistryHandles.js.map +1 -0
- package/dist/model-context/registry/index.d.ts +3 -0
- package/dist/model-context/registry/index.d.ts.map +1 -0
- package/dist/model-context/registry/index.js +4 -0
- package/dist/model-context/registry/index.js.map +1 -0
- package/dist/model-context/useAssistantInstructions.d.ts +1 -2
- package/dist/model-context/useAssistantInstructions.d.ts.map +1 -1
- package/dist/model-context/useAssistantInstructions.js.map +1 -1
- package/package.json +3 -3
- package/src/model-context/frame/AssistantFrame.test.ts +353 -0
- package/src/model-context/frame/AssistantFrameHost.ts +218 -0
- package/src/model-context/frame/AssistantFrameProvider.ts +225 -0
- package/src/model-context/frame/AssistantFrameTypes.ts +40 -0
- package/src/model-context/frame/SPEC_AssistantFrame.md +104 -0
- package/src/model-context/frame/index.ts +4 -0
- package/src/model-context/frame/useAssistantFrameHost.ts +48 -0
- package/src/model-context/index.ts +3 -0
- package/src/model-context/registry/ModelContextRegistry.ts +165 -0
- package/src/model-context/registry/ModelContextRegistryHandles.ts +19 -0
- package/src/model-context/registry/SPEC_ModelContextRegistry.md +40 -0
- package/src/model-context/registry/index.ts +2 -0
- package/src/model-context/useAssistantInstructions.tsx +1 -1
@@ -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":";AAMA;AAAA,EAEE;AAAA,OAGK;AAKP,IAAM,kBAAkB,CAAC,oBACtB;AAAA,EACC,YAAY,eAAe;AAAA,EAC3B,GAAI,eAAe,eAAe;AAAA,IAChC,aAAa,eAAe;AAAA,EAC9B;AAAA,EACA,GAAI,eAAe,aAAa,UAAa;AAAA,IAC3C,UAAU,eAAe;AAAA,EAC3B;AAAA,EACA,GAAI,eAAe,QAAQ,EAAE,MAAM,eAAe,KAAK;AACzD;AAKF,IAAM,0BAA0B,CAC9B,gBACkB;AAAA,EAClB,GAAI,WAAW,WAAW,UAAa,EAAE,QAAQ,WAAW,OAAO;AAAA,EACnE,GAAI,WAAW,SAAS;AAAA,IACtB,OAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,WAAW,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;AAAA,QACrD;AAAA,QACA,gBAAgB,IAAI;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAkBO,IAAM,qBAAN,MAAyD;AAAA,EACtD,WAAyB,CAAC;AAAA,EAC1B,eAAe,oBAAI,IAAgB;AAAA,EACnC,mBAAmB,oBAAI,IAM7B;AAAA,EACM,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EAER,YAAY,cAAsB,eAAuB,KAAK;AAC5D,SAAK,gBAAgB;AACrB,SAAK,gBAAgB;AAErB,SAAK,gBAAgB,KAAK,cAAc,KAAK,IAAI;AACjD,WAAO,iBAAiB,WAAW,KAAK,aAAa;AAGrD,SAAK,eAAe;AAAA,EACtB;AAAA,EAEQ,cAAc,OAAqB;AAEzC,QAAI,KAAK,kBAAkB,OAAO,MAAM,WAAW,KAAK;AACtD;AACF,QAAI,MAAM,WAAW,KAAK,cAAe;AACzC,QAAI,MAAM,MAAM,YAAY,sBAAuB;AAEnD,UAAM,UAAU,MAAM,KAAK;AAE3B,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK,wBAAwB;AAC3B,aAAK,cAAc,QAAQ,OAAO;AAClC;AAAA,MACF;AAAA,MAEA,KAAK,eAAe;AAClB,cAAM,UAAU,KAAK,iBAAiB,IAAI,QAAQ,EAAE;AACpD,YAAI,SAAS;AACX,cAAI,QAAQ,OAAO;AACjB,oBAAQ,OAAO,IAAI,MAAM,QAAQ,KAAK,CAAC;AAAA,UACzC,OAAO;AACL,oBAAQ,QAAQ,QAAQ,MAAM;AAAA,UAChC;AACA,eAAK,iBAAiB,OAAO,QAAQ,EAAE;AAAA,QACzC;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,mBAA2C;AAC/D,UAAM,UAAU,wBAAwB,iBAAiB;AACzD,SAAK,WAAW;AAAA,MACd,GAAG;AAAA,MACH,OACE,QAAQ,SACR,OAAO;AAAA,QACL,OAAO,QAAQ,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;AAAA,UAClD;AAAA,UACA;AAAA,YACE,GAAG;AAAA,YACH,SAAS,CAAC,SAAc,KAAK,SAAS,MAAM,IAAI;AAAA,UAClD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACJ;AACA,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,SAAS,UAAkB,MAAyB;AAC1D,WAAO,KAAK;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,IAAI,QAAQ,KAAK,iBAAiB;AAAA,QAClC;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MACA,cAAc,QAAQ;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,YACN,SACA,UAAU,KACV,iBAAiB,qBACH;AACd,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAK,iBAAiB,IAAI,QAAQ,IAAI,EAAE,SAAS,OAAO,CAAC;AAEzD,WAAK,cAAc;AAAA,QACjB,EAAE,SAAS,uBAAuB,QAAQ;AAAA,QAC1C,KAAK;AAAA,MACP;AAEA,YAAM,YAAY,WAAW,MAAM;AACjC,cAAM,UAAU,KAAK,iBAAiB,IAAI,QAAQ,EAAE;AACpD,YAAI,SAAS;AACX,kBAAQ,OAAO,IAAI,MAAM,cAAc,CAAC;AACxC,eAAK,iBAAiB,OAAO,QAAQ,EAAE;AAAA,QACzC;AAAA,MACF,GAAG,OAAO;AAGV,YAAM,kBAAkB,KAAK,iBAAiB,IAAI,QAAQ,EAAE,EAAG;AAC/D,YAAM,iBAAiB,KAAK,iBAAiB,IAAI,QAAQ,EAAE,EAAG;AAE9D,WAAK,iBAAiB,IAAI,QAAQ,IAAI;AAAA,QACpC,SAAS,CAAC,UAAe;AACvB,uBAAa,SAAS;AACtB,0BAAgB,KAAK;AAAA,QACvB;AAAA,QACA,QAAQ,CAAC,UAAe;AACtB,uBAAa,SAAS;AACtB,yBAAe,KAAK;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAiB;AAEvB,SAAK,cAAc;AAAA,MACjB;AAAA,QACE,SAAS;AAAA,QACT,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEQ,oBAAoB;AAC1B,SAAK,aAAa,QAAQ,CAAC,aAAa,SAAS,CAAC;AAAA,EACpD;AAAA,EAEA,kBAAgC;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAU,UAAmC;AAC3C,SAAK,aAAa,IAAI,QAAQ;AAC9B,WAAO,MAAM,KAAK,aAAa,OAAO,QAAQ;AAAA,EAChD;AAAA,EAEA,UAAU;AACR,WAAO,oBAAoB,WAAW,KAAK,aAAa;AACxD,SAAK,aAAa,MAAM;AACxB,SAAK,iBAAiB,MAAM;AAAA,EAC9B;AACF;","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 @@
|
|
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 @@
|
|
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 @@
|
|
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"}
|