skybridge 0.0.0-dev.c6add22 → 0.0.0-dev.c8b3edf
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/bin/run.js +9 -0
- package/dist/cli/header.d.ts +4 -0
- package/dist/cli/header.js +6 -0
- package/dist/cli/header.js.map +1 -0
- package/dist/cli/run-command.d.ts +2 -0
- package/dist/cli/run-command.js +43 -0
- package/dist/cli/run-command.js.map +1 -0
- package/dist/cli/use-execute-steps.d.ts +10 -0
- package/dist/cli/use-execute-steps.js +31 -0
- package/dist/cli/use-execute-steps.js.map +1 -0
- package/dist/commands/build.d.ts +9 -0
- package/dist/commands/build.js +44 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/dev.d.ts +7 -0
- package/dist/commands/dev.js +20 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/start.d.ts +7 -0
- package/dist/commands/start.js +33 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/{src/server → server}/index.d.ts +0 -1
- package/dist/{src/server → server}/index.js +0 -1
- package/dist/server/index.js.map +1 -0
- package/dist/server/inferUtilityTypes.js.map +1 -0
- package/dist/{src/server → server}/server.d.ts +26 -1
- package/dist/server/server.js +138 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/templateHelper.js.map +1 -0
- package/dist/server/templates/development.hbs +66 -0
- package/dist/{src/server → server}/widgetsDevServer.d.ts +2 -2
- package/dist/{src/server → server}/widgetsDevServer.js +11 -2
- package/dist/server/widgetsDevServer.js.map +1 -0
- package/dist/test/utils.js.map +1 -0
- package/dist/{src/test → test}/widget.test.js +121 -12
- package/dist/test/widget.test.js.map +1 -0
- package/dist/{src/web/bridges/adaptors/apps-sdk-adaptor.d.ts → web/bridges/apps-sdk/adaptor.d.ts} +3 -2
- package/dist/{src/web/bridges/adaptors/apps-sdk-adaptor.js → web/bridges/apps-sdk/adaptor.js} +9 -3
- package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -0
- package/dist/web/bridges/apps-sdk/bridge.d.ts +10 -0
- package/dist/{src/web/bridges/apps-sdk-bridge.js → web/bridges/apps-sdk/bridge.js} +2 -2
- package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
- package/dist/web/bridges/apps-sdk/index.d.ts +5 -0
- package/dist/web/bridges/apps-sdk/index.js +5 -0
- package/dist/web/bridges/apps-sdk/index.js.map +1 -0
- package/dist/{src/web → web/bridges/apps-sdk}/types.d.ts +15 -43
- package/dist/{src/web → web/bridges/apps-sdk}/types.js +0 -1
- package/dist/web/bridges/apps-sdk/types.js.map +1 -0
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +2 -0
- package/dist/{src/web/bridges/hooks/use-apps-sdk-bridge.js → web/bridges/apps-sdk/use-apps-sdk-context.js} +3 -3
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
- package/dist/web/bridges/get-adaptor.d.ts +2 -0
- package/dist/web/bridges/get-adaptor.js +8 -0
- package/dist/web/bridges/get-adaptor.js.map +1 -0
- package/dist/web/bridges/index.d.ts +5 -0
- package/dist/web/bridges/index.js +6 -0
- package/dist/web/bridges/index.js.map +1 -0
- package/dist/{src/web/bridges/adaptors/mcp-app-adaptor.d.ts → web/bridges/mcp-app/adaptor.d.ts} +6 -3
- package/dist/{src/web/bridges/adaptors/mcp-app-adaptor.js → web/bridges/mcp-app/adaptor.js} +43 -13
- package/dist/web/bridges/mcp-app/adaptor.js.map +1 -0
- package/dist/web/bridges/mcp-app/bridge.d.ts +43 -0
- package/dist/{src/web/bridges/mcp-app-bridge.js → web/bridges/mcp-app/bridge.js} +109 -16
- package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
- package/dist/web/bridges/mcp-app/index.d.ts +4 -0
- package/dist/web/bridges/mcp-app/index.js +4 -0
- package/dist/web/bridges/mcp-app/index.js.map +1 -0
- package/dist/web/bridges/mcp-app/types.d.ts +8 -0
- package/dist/web/bridges/mcp-app/types.js.map +1 -0
- package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +5 -0
- package/dist/{src/web/bridges/hooks/use-mcp-app-bridge.js → web/bridges/mcp-app/use-mcp-app-context.js} +3 -3
- package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
- package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +66 -0
- package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
- package/dist/{src/web → web}/bridges/types.d.ts +41 -24
- package/dist/web/bridges/types.js +2 -0
- package/dist/{src/web → web}/bridges/types.js.map +1 -1
- package/dist/web/bridges/use-host-context.d.ts +2 -0
- package/dist/web/bridges/use-host-context.js +8 -0
- package/dist/web/bridges/use-host-context.js.map +1 -0
- package/dist/{src/web → web}/create-store.js +6 -7
- package/dist/web/create-store.js.map +1 -0
- package/dist/web/create-store.test.js +126 -0
- package/dist/web/create-store.test.js.map +1 -0
- package/dist/{src/web → web}/data-llm.js +5 -3
- package/dist/web/data-llm.js.map +1 -0
- package/dist/web/data-llm.test.js +139 -0
- package/dist/web/data-llm.test.js.map +1 -0
- package/dist/{src/web → web}/generate-helpers.d.ts +3 -2
- package/dist/{src/web → web}/generate-helpers.js +1 -1
- package/dist/web/generate-helpers.js.map +1 -0
- package/dist/web/generate-helpers.test-d.js.map +1 -0
- package/dist/web/generate-helpers.test.js.map +1 -0
- package/dist/{src/web → web}/helpers/state.js +13 -8
- package/dist/web/helpers/state.js.map +1 -0
- package/dist/web/helpers/state.test.js.map +1 -0
- package/dist/{src/web → web}/hooks/index.d.ts +0 -1
- package/dist/{src/web → web}/hooks/index.js +0 -1
- package/dist/web/hooks/index.js.map +1 -0
- package/dist/{src/web → web}/hooks/test/utils.d.ts +8 -2
- package/dist/web/hooks/test/utils.js +60 -0
- package/dist/web/hooks/test/utils.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-call-tool.d.ts +2 -1
- package/dist/{src/web → web}/hooks/use-call-tool.js +2 -2
- package/dist/web/hooks/use-call-tool.js.map +1 -0
- package/dist/web/hooks/use-call-tool.test-d.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-call-tool.test.js +0 -1
- package/dist/web/hooks/use-call-tool.test.js.map +1 -0
- package/dist/web/hooks/use-display-mode.js +9 -0
- package/dist/web/hooks/use-display-mode.js.map +1 -0
- package/dist/web/hooks/use-display-mode.test.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-files.d.ts +1 -1
- package/dist/web/hooks/use-files.js +7 -0
- package/dist/web/hooks/use-files.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-files.test.js +4 -4
- package/dist/web/hooks/use-files.test.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-layout.d.ts +2 -2
- package/dist/{src/web → web}/hooks/use-layout.js +4 -4
- package/dist/web/hooks/use-layout.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-layout.test.js +6 -5
- package/dist/web/hooks/use-layout.test.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-open-external.js +2 -2
- package/dist/web/hooks/use-open-external.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-open-external.test.js +1 -1
- package/dist/web/hooks/use-open-external.test.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-request-modal.d.ts +1 -1
- package/dist/{src/web → web}/hooks/use-request-modal.js +2 -2
- package/dist/web/hooks/use-request-modal.js.map +1 -0
- package/dist/web/hooks/use-request-modal.test.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-send-follow-up-message.js +2 -2
- package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-tool-info.js +4 -4
- package/dist/web/hooks/use-tool-info.js.map +1 -0
- package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-tool-info.test.js +4 -4
- package/dist/web/hooks/use-tool-info.test.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-user.d.ts +1 -1
- package/dist/{src/web → web}/hooks/use-user.js +3 -3
- package/dist/web/hooks/use-user.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-user.test.js +4 -3
- package/dist/web/hooks/use-user.test.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-widget-state.js +10 -10
- package/dist/web/hooks/use-widget-state.js.map +1 -0
- package/dist/web/hooks/use-widget-state.test.js.map +1 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/mount-widget.js.map +1 -0
- package/dist/web/plugin/data-llm.test.js.map +1 -0
- package/dist/web/plugin/plugin.js.map +1 -0
- package/dist/web/plugin/transform-data-llm.js.map +1 -0
- package/dist/web/plugin/transform-data-llm.test.js.map +1 -0
- package/dist/web/proxy.js.map +1 -0
- package/dist/web/types.d.ts +16 -0
- package/dist/web/types.js +2 -0
- package/dist/web/types.js.map +1 -0
- package/package.json +31 -16
- package/dist/src/server/devtoolsStaticServer.d.ts +0 -19
- package/dist/src/server/devtoolsStaticServer.js +0 -48
- package/dist/src/server/devtoolsStaticServer.js.map +0 -1
- package/dist/src/server/index.js.map +0 -1
- package/dist/src/server/inferUtilityTypes.js.map +0 -1
- package/dist/src/server/server.js +0 -82
- package/dist/src/server/server.js.map +0 -1
- package/dist/src/server/templateHelper.js.map +0 -1
- package/dist/src/server/templates/development.hbs +0 -13
- package/dist/src/server/widgetsDevServer.js.map +0 -1
- package/dist/src/test/utils.js.map +0 -1
- package/dist/src/test/widget.test.js.map +0 -1
- package/dist/src/web/bridges/adaptors/apps-sdk-adaptor.js.map +0 -1
- package/dist/src/web/bridges/adaptors/mcp-app-adaptor.js.map +0 -1
- package/dist/src/web/bridges/apps-sdk-bridge.d.ts +0 -10
- package/dist/src/web/bridges/apps-sdk-bridge.js.map +0 -1
- package/dist/src/web/bridges/hooks/use-adaptor.d.ts +0 -2
- package/dist/src/web/bridges/hooks/use-adaptor.js +0 -8
- package/dist/src/web/bridges/hooks/use-adaptor.js.map +0 -1
- package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.d.ts +0 -2
- package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.js.map +0 -1
- package/dist/src/web/bridges/hooks/use-bridge.d.ts +0 -2
- package/dist/src/web/bridges/hooks/use-bridge.js +0 -8
- package/dist/src/web/bridges/hooks/use-bridge.js.map +0 -1
- package/dist/src/web/bridges/hooks/use-mcp-app-bridge.d.ts +0 -5
- package/dist/src/web/bridges/hooks/use-mcp-app-bridge.js.map +0 -1
- package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js +0 -41
- package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js.map +0 -1
- package/dist/src/web/bridges/index.d.ts +0 -4
- package/dist/src/web/bridges/index.js +0 -5
- package/dist/src/web/bridges/index.js.map +0 -1
- package/dist/src/web/bridges/mcp-app-bridge.d.ts +0 -38
- package/dist/src/web/bridges/mcp-app-bridge.js.map +0 -1
- package/dist/src/web/create-store.js.map +0 -1
- package/dist/src/web/create-store.test.js +0 -70
- package/dist/src/web/create-store.test.js.map +0 -1
- package/dist/src/web/data-llm.js.map +0 -1
- package/dist/src/web/data-llm.test.js +0 -76
- package/dist/src/web/data-llm.test.js.map +0 -1
- package/dist/src/web/generate-helpers.js.map +0 -1
- package/dist/src/web/generate-helpers.test-d.js.map +0 -1
- package/dist/src/web/generate-helpers.test.js.map +0 -1
- package/dist/src/web/helpers/state.js.map +0 -1
- package/dist/src/web/helpers/state.test.js.map +0 -1
- package/dist/src/web/hooks/index.js.map +0 -1
- package/dist/src/web/hooks/test/utils.js +0 -40
- package/dist/src/web/hooks/test/utils.js.map +0 -1
- package/dist/src/web/hooks/use-call-tool.js.map +0 -1
- package/dist/src/web/hooks/use-call-tool.test-d.js.map +0 -1
- package/dist/src/web/hooks/use-call-tool.test.js.map +0 -1
- package/dist/src/web/hooks/use-display-mode.js +0 -10
- package/dist/src/web/hooks/use-display-mode.js.map +0 -1
- package/dist/src/web/hooks/use-display-mode.test.js.map +0 -1
- package/dist/src/web/hooks/use-files.js +0 -7
- package/dist/src/web/hooks/use-files.js.map +0 -1
- package/dist/src/web/hooks/use-files.test.js.map +0 -1
- package/dist/src/web/hooks/use-layout.js.map +0 -1
- package/dist/src/web/hooks/use-layout.test.js.map +0 -1
- package/dist/src/web/hooks/use-open-external.js.map +0 -1
- package/dist/src/web/hooks/use-open-external.test.js.map +0 -1
- package/dist/src/web/hooks/use-openai-global.d.ts +0 -3
- package/dist/src/web/hooks/use-openai-global.js +0 -6
- package/dist/src/web/hooks/use-openai-global.js.map +0 -1
- package/dist/src/web/hooks/use-request-modal.js.map +0 -1
- package/dist/src/web/hooks/use-request-modal.test.js.map +0 -1
- package/dist/src/web/hooks/use-send-follow-up-message.js.map +0 -1
- package/dist/src/web/hooks/use-tool-info.js.map +0 -1
- package/dist/src/web/hooks/use-tool-info.test-d.js.map +0 -1
- package/dist/src/web/hooks/use-tool-info.test.js.map +0 -1
- package/dist/src/web/hooks/use-user.js.map +0 -1
- package/dist/src/web/hooks/use-user.test.js.map +0 -1
- package/dist/src/web/hooks/use-widget-state.js.map +0 -1
- package/dist/src/web/hooks/use-widget-state.test.js.map +0 -1
- package/dist/src/web/index.js.map +0 -1
- package/dist/src/web/mount-widget.js.map +0 -1
- package/dist/src/web/plugin/data-llm.test.js.map +0 -1
- package/dist/src/web/plugin/plugin.js.map +0 -1
- package/dist/src/web/plugin/transform-data-llm.js.map +0 -1
- package/dist/src/web/plugin/transform-data-llm.test.js.map +0 -1
- package/dist/src/web/proxy.js.map +0 -1
- package/dist/src/web/types.js.map +0 -1
- package/dist/vitest.config.d.ts +0 -2
- package/dist/vitest.config.js +0 -8
- package/dist/vitest.config.js.map +0 -1
- /package/dist/{src/server → server}/inferUtilityTypes.d.ts +0 -0
- /package/dist/{src/server → server}/inferUtilityTypes.js +0 -0
- /package/dist/{src/server → server}/templateHelper.d.ts +0 -0
- /package/dist/{src/server → server}/templateHelper.js +0 -0
- /package/dist/{src/server → server}/templates/production.hbs +0 -0
- /package/dist/{src/test → test}/utils.d.ts +0 -0
- /package/dist/{src/test → test}/utils.js +0 -0
- /package/dist/{src/test → test}/widget.test.d.ts +0 -0
- /package/dist/{src/web/bridges → web/bridges/mcp-app}/types.js +0 -0
- /package/dist/{src/web/bridges/hooks/use-mcp-app-bridge.test.d.ts → web/bridges/mcp-app/use-mcp-app-context.test.d.ts} +0 -0
- /package/dist/{src/web → web}/create-store.d.ts +0 -0
- /package/dist/{src/web → web}/create-store.test.d.ts +0 -0
- /package/dist/{src/web → web}/data-llm.d.ts +0 -0
- /package/dist/{src/web → web}/data-llm.test.d.ts +0 -0
- /package/dist/{src/web → web}/generate-helpers.test-d.d.ts +0 -0
- /package/dist/{src/web → web}/generate-helpers.test-d.js +0 -0
- /package/dist/{src/web → web}/generate-helpers.test.d.ts +0 -0
- /package/dist/{src/web → web}/generate-helpers.test.js +0 -0
- /package/dist/{src/web → web}/helpers/state.d.ts +0 -0
- /package/dist/{src/web → web}/helpers/state.test.d.ts +0 -0
- /package/dist/{src/web → web}/helpers/state.test.js +0 -0
- /package/dist/{src/web → web}/hooks/use-call-tool.test-d.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-call-tool.test-d.js +0 -0
- /package/dist/{src/web → web}/hooks/use-call-tool.test.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-display-mode.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-display-mode.test.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-display-mode.test.js +0 -0
- /package/dist/{src/web → web}/hooks/use-files.test.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-layout.test.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-open-external.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-open-external.test.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-request-modal.test.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-request-modal.test.js +0 -0
- /package/dist/{src/web → web}/hooks/use-send-follow-up-message.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-tool-info.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-tool-info.test-d.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-tool-info.test-d.js +0 -0
- /package/dist/{src/web → web}/hooks/use-tool-info.test.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-user.test.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-widget-state.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-widget-state.test.d.ts +0 -0
- /package/dist/{src/web → web}/hooks/use-widget-state.test.js +0 -0
- /package/dist/{src/web → web}/index.d.ts +0 -0
- /package/dist/{src/web → web}/index.js +0 -0
- /package/dist/{src/web → web}/mount-widget.d.ts +0 -0
- /package/dist/{src/web → web}/mount-widget.js +0 -0
- /package/dist/{src/web → web}/plugin/data-llm.test.d.ts +0 -0
- /package/dist/{src/web → web}/plugin/data-llm.test.js +0 -0
- /package/dist/{src/web → web}/plugin/plugin.d.ts +0 -0
- /package/dist/{src/web → web}/plugin/plugin.js +0 -0
- /package/dist/{src/web → web}/plugin/transform-data-llm.d.ts +0 -0
- /package/dist/{src/web → web}/plugin/transform-data-llm.js +0 -0
- /package/dist/{src/web → web}/plugin/transform-data-llm.test.d.ts +0 -0
- /package/dist/{src/web → web}/plugin/transform-data-llm.test.js +0 -0
- /package/dist/{src/web → web}/proxy.d.ts +0 -0
- /package/dist/{src/web → web}/proxy.js +0 -0
|
@@ -5,15 +5,12 @@ const mockManifest = {
|
|
|
5
5
|
"src/widgets/folder-widget/index.tsx": { file: "folder-widget.js" },
|
|
6
6
|
"style.css": { file: "style.css" },
|
|
7
7
|
};
|
|
8
|
-
vi.
|
|
9
|
-
|
|
8
|
+
const actual = vi.hoisted(() => require("node:fs"));
|
|
9
|
+
vi.mock("node:fs", () => {
|
|
10
10
|
const readFileSyncImpl = (path, ...args) => {
|
|
11
11
|
if (typeof path === "string" && path.includes("manifest.json")) {
|
|
12
12
|
return JSON.stringify(mockManifest);
|
|
13
13
|
}
|
|
14
|
-
// Type assertion needed because readFileSync has overloads with different parameter types
|
|
15
|
-
// Using @ts-expect-error because the overloads are complex and we're forwarding args
|
|
16
|
-
// @ts-expect-error - readFileSync overloads require complex type handling
|
|
17
14
|
return actual.readFileSync(path, ...args);
|
|
18
15
|
};
|
|
19
16
|
const readFileSync = vi.fn(readFileSyncImpl);
|
|
@@ -56,11 +53,19 @@ describe("McpServer.registerWidget", () => {
|
|
|
56
53
|
uri: "ui://widgets/apps-sdk/my-widget.html",
|
|
57
54
|
mimeType: "text/html+skybridge",
|
|
58
55
|
text: expect.stringContaining('<div id="root"></div>'),
|
|
56
|
+
_meta: {
|
|
57
|
+
"openai/widgetCSP": {
|
|
58
|
+
resource_domains: [serverUrl],
|
|
59
|
+
connect_domains: ["ws://localhost:24678"],
|
|
60
|
+
},
|
|
61
|
+
"openai/widgetDomain": serverUrl,
|
|
62
|
+
"openai/widgetDescription": "Test tool",
|
|
63
|
+
},
|
|
59
64
|
},
|
|
60
65
|
],
|
|
61
66
|
});
|
|
62
67
|
// Check development-specific content
|
|
63
|
-
expect(result.contents[0]?.text).toContain(`${serverUrl}/@react-refresh`);
|
|
68
|
+
expect(result.contents[0]?.text).toContain(`${serverUrl}/assets/@react-refresh`);
|
|
64
69
|
expect(result.contents[0]?.text).toContain(`${serverUrl}/@vite/client`);
|
|
65
70
|
expect(result.contents[0]?.text).toContain(`${serverUrl}/src/widgets/my-widget`);
|
|
66
71
|
expect(result.contents[0]?.text).not.toContain(`${serverUrl}/src/widgets/my-widget.tsx`);
|
|
@@ -75,8 +80,9 @@ describe("McpServer.registerWidget", () => {
|
|
|
75
80
|
const appsSdkResourceCallback = mockRegisterResource.mock
|
|
76
81
|
.calls[0]?.[3];
|
|
77
82
|
expect(appsSdkResourceCallback).toBeDefined();
|
|
78
|
-
const
|
|
79
|
-
const
|
|
83
|
+
const host = "myapp.com";
|
|
84
|
+
const serverUrl = `https://${host}`;
|
|
85
|
+
const mockExtra = createMockExtra(host);
|
|
80
86
|
const result = await appsSdkResourceCallback(new URL("ui://widgets/apps-sdk/my-widget.html"), mockExtra);
|
|
81
87
|
expect(result).toEqual({
|
|
82
88
|
contents: [
|
|
@@ -84,11 +90,19 @@ describe("McpServer.registerWidget", () => {
|
|
|
84
90
|
uri: "ui://widgets/apps-sdk/my-widget.html",
|
|
85
91
|
mimeType: "text/html+skybridge",
|
|
86
92
|
text: expect.stringContaining('<div id="root"></div>'),
|
|
93
|
+
_meta: {
|
|
94
|
+
"openai/widgetCSP": {
|
|
95
|
+
resource_domains: [serverUrl],
|
|
96
|
+
connect_domains: [],
|
|
97
|
+
},
|
|
98
|
+
"openai/widgetDomain": serverUrl,
|
|
99
|
+
"openai/widgetDescription": "Test tool",
|
|
100
|
+
},
|
|
87
101
|
},
|
|
88
102
|
],
|
|
89
103
|
});
|
|
90
104
|
// Check production-specific content
|
|
91
|
-
expect(result.contents[0]?.text).not.toContain(`${serverUrl}
|
|
105
|
+
expect(result.contents[0]?.text).not.toContain(`${serverUrl}/assets/@react-refresh`);
|
|
92
106
|
expect(result.contents[0]?.text).not.toContain(`${serverUrl}@vite/client`);
|
|
93
107
|
expect(result.contents[0]?.text).toContain(`${serverUrl}/assets/my-widget.js`);
|
|
94
108
|
expect(result.contents[0]?.text).toContain(`${serverUrl}/assets/style.css`);
|
|
@@ -102,15 +116,19 @@ describe("McpServer.registerWidget", () => {
|
|
|
102
116
|
const appsSdkResourceCallback = mockRegisterResource.mock
|
|
103
117
|
.calls[0]?.[3];
|
|
104
118
|
expect(appsSdkResourceCallback).toBeDefined();
|
|
105
|
-
const
|
|
106
|
-
const
|
|
119
|
+
const host = "myapp.com";
|
|
120
|
+
const serverUrl = `https://${host}`;
|
|
121
|
+
const mockExtra = createMockExtra(host);
|
|
107
122
|
const result = await appsSdkResourceCallback(new URL("ui://widgets/apps-sdk/folder-widget.html"), mockExtra);
|
|
108
123
|
// Should resolve to folder-widget.js from the manifest entry "src/widgets/folder-widget/index.tsx"
|
|
109
124
|
expect(result.contents[0]?.text).toContain(`${serverUrl}/assets/folder-widget.js`);
|
|
110
125
|
});
|
|
111
126
|
it("should register resources with correct hostType for both apps-sdk and ext-apps formats", async () => {
|
|
112
127
|
const mockToolCallback = vi.fn();
|
|
113
|
-
const mockRegisterResourceConfig = {
|
|
128
|
+
const mockRegisterResourceConfig = {
|
|
129
|
+
description: "Test widget",
|
|
130
|
+
_meta: { "openai/widgetPrefersBorder": true },
|
|
131
|
+
};
|
|
114
132
|
const mockToolConfig = { description: "Test tool" };
|
|
115
133
|
server.registerWidget("my-widget", mockRegisterResourceConfig, mockToolConfig, mockToolCallback);
|
|
116
134
|
expect(mockRegisterResource).toHaveBeenCalledTimes(2);
|
|
@@ -123,6 +141,15 @@ describe("McpServer.registerWidget", () => {
|
|
|
123
141
|
uri: "ui://widgets/apps-sdk/my-widget.html",
|
|
124
142
|
mimeType: "text/html+skybridge",
|
|
125
143
|
text: expect.stringContaining('<div id="root"></div>'),
|
|
144
|
+
_meta: {
|
|
145
|
+
"openai/widgetCSP": {
|
|
146
|
+
resource_domains: ["http://localhost:3000"],
|
|
147
|
+
connect_domains: ["ws://localhost:24678"],
|
|
148
|
+
},
|
|
149
|
+
"openai/widgetDomain": "http://localhost:3000",
|
|
150
|
+
"openai/widgetDescription": "Test tool",
|
|
151
|
+
"openai/widgetPrefersBorder": true,
|
|
152
|
+
},
|
|
126
153
|
},
|
|
127
154
|
],
|
|
128
155
|
});
|
|
@@ -137,10 +164,92 @@ describe("McpServer.registerWidget", () => {
|
|
|
137
164
|
uri: "ui://widgets/ext-apps/my-widget.html",
|
|
138
165
|
mimeType: "text/html;profile=mcp-app",
|
|
139
166
|
text: expect.stringContaining('<div id="root"></div>'),
|
|
167
|
+
_meta: {
|
|
168
|
+
ui: {
|
|
169
|
+
csp: {
|
|
170
|
+
resourceDomains: ["http://localhost:3000"],
|
|
171
|
+
connectDomains: ["ws://localhost:24678"],
|
|
172
|
+
},
|
|
173
|
+
domain: "http://localhost:3000",
|
|
174
|
+
},
|
|
175
|
+
},
|
|
140
176
|
},
|
|
141
177
|
],
|
|
142
178
|
});
|
|
143
179
|
expect(extAppsResult.contents[0]?.text).toContain('window.skybridge = { hostType: "mcp-app" }');
|
|
144
180
|
});
|
|
181
|
+
it("should register tool with ui.resourceUri metadata (not deprecated ui/resourceUri)", async () => {
|
|
182
|
+
const mockToolCallback = vi.fn();
|
|
183
|
+
const mockRegisterResourceConfig = { description: "Test widget" };
|
|
184
|
+
const mockToolConfig = { description: "Test tool" };
|
|
185
|
+
server.registerWidget("my-widget", mockRegisterResourceConfig, mockToolConfig, mockToolCallback);
|
|
186
|
+
expect(mockRegisterTool).toHaveBeenCalledTimes(1);
|
|
187
|
+
const toolCallArgs = mockRegisterTool.mock.calls[0];
|
|
188
|
+
const toolConfig = toolCallArgs?.[1];
|
|
189
|
+
expect(toolConfig._meta).toHaveProperty("ui");
|
|
190
|
+
expect(toolConfig._meta?.ui).toEqual({
|
|
191
|
+
resourceUri: "ui://widgets/ext-apps/my-widget.html",
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
it("should apply meta overrides in correct priority: defaults < ui.* < direct openai/* keys", async () => {
|
|
195
|
+
const mockToolCallback = vi.fn();
|
|
196
|
+
const mockRegisterResourceConfig = {
|
|
197
|
+
description: "Test widget",
|
|
198
|
+
_meta: {
|
|
199
|
+
// ui.csp overrides (middle priority)
|
|
200
|
+
ui: {
|
|
201
|
+
csp: {
|
|
202
|
+
resourceDomains: ["https://from-ui-csp.com"],
|
|
203
|
+
connectDomains: ["https://from-ui-csp.com"],
|
|
204
|
+
},
|
|
205
|
+
domain: "https://from-ui-domain.com",
|
|
206
|
+
prefersBorder: false,
|
|
207
|
+
},
|
|
208
|
+
// Direct openai/* keys (highest priority) - should override ui.*
|
|
209
|
+
"openai/widgetDomain": "https://direct-override.com",
|
|
210
|
+
"openai/widgetPrefersBorder": true,
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
const mockToolConfig = { description: "Test tool" };
|
|
214
|
+
server.registerWidget("override-test", mockRegisterResourceConfig, mockToolConfig, mockToolCallback);
|
|
215
|
+
const appsSdkCallback = mockRegisterResource.mock
|
|
216
|
+
.calls[0]?.[3];
|
|
217
|
+
const result = await appsSdkCallback(new URL("ui://widgets/apps-sdk/override-test.html"), createMockExtra("__not_used__"));
|
|
218
|
+
const meta = result.contents[0]?._meta;
|
|
219
|
+
// CSP arrays are merged with union - all unique domains from defaults and user config are preserved
|
|
220
|
+
expect(meta["openai/widgetCSP"]).toEqual({
|
|
221
|
+
resource_domains: ["http://localhost:3000", "https://from-ui-csp.com"],
|
|
222
|
+
connect_domains: ["ws://localhost:24678", "https://from-ui-csp.com"],
|
|
223
|
+
frame_domains: undefined,
|
|
224
|
+
redirect_domains: undefined,
|
|
225
|
+
});
|
|
226
|
+
// Domain should be overridden by direct openai/* key (highest priority)
|
|
227
|
+
expect(meta["openai/widgetDomain"]).toBe("https://direct-override.com");
|
|
228
|
+
// PrefersBorder should be overridden by direct openai/* key (highest priority)
|
|
229
|
+
expect(meta["openai/widgetPrefersBorder"]).toBe(true);
|
|
230
|
+
// Description should be from defaults (toolConfig.description)
|
|
231
|
+
expect(meta["openai/widgetDescription"]).toBe("Test tool");
|
|
232
|
+
});
|
|
233
|
+
it("should register tool with ui.resourceUri metadata only", async () => {
|
|
234
|
+
const mockToolCallback = vi.fn();
|
|
235
|
+
server.registerWidget("my-widget", { description: "Test widget", hosts: ["mcp-app"] }, { description: "Test tool" }, mockToolCallback);
|
|
236
|
+
expect(mockRegisterTool).toHaveBeenCalledTimes(1);
|
|
237
|
+
const toolCallArgs = mockRegisterTool.mock.calls[0];
|
|
238
|
+
const toolConfig = toolCallArgs?.[1];
|
|
239
|
+
expect(toolConfig._meta).toHaveProperty("ui");
|
|
240
|
+
expect(toolConfig._meta?.ui).toEqual({
|
|
241
|
+
resourceUri: "ui://widgets/ext-apps/my-widget.html",
|
|
242
|
+
});
|
|
243
|
+
expect(toolConfig._meta?.["openai/outputTemplate"]).to.be.undefined;
|
|
244
|
+
});
|
|
245
|
+
it("should register tool with uopenai/outputTemplate metadata only", async () => {
|
|
246
|
+
const mockToolCallback = vi.fn();
|
|
247
|
+
server.registerWidget("my-widget", { description: "Test widget", hosts: ["apps-sdk"] }, { description: "Test tool" }, mockToolCallback);
|
|
248
|
+
expect(mockRegisterTool).toHaveBeenCalledTimes(1);
|
|
249
|
+
const toolCallArgs = mockRegisterTool.mock.calls[0];
|
|
250
|
+
const toolConfig = toolCallArgs?.[1];
|
|
251
|
+
expect(toolConfig._meta).not.toHaveProperty("ui");
|
|
252
|
+
expect(toolConfig._meta?.["openai/outputTemplate"]).to.eq("ui://widgets/apps-sdk/my-widget.html");
|
|
253
|
+
});
|
|
145
254
|
});
|
|
146
255
|
//# sourceMappingURL=widget.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget.test.js","sourceRoot":"","sources":["../../src/test/widget.test.ts"],"names":[],"mappings":"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"}
|
package/dist/{src/web/bridges/adaptors/apps-sdk-adaptor.d.ts → web/bridges/apps-sdk/adaptor.d.ts}
RENAMED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import type { Adaptor,
|
|
1
|
+
import type { Adaptor, CallToolResponse, DisplayMode, HostContext, HostContextStore, SetWidgetStateAction } from "../types.js";
|
|
2
2
|
export declare class AppsSdkAdaptor implements Adaptor {
|
|
3
3
|
private static instance;
|
|
4
4
|
static getInstance(): AppsSdkAdaptor;
|
|
5
5
|
static resetInstance(): void;
|
|
6
|
-
|
|
6
|
+
getHostContextStore<K extends keyof HostContext>(key: K): HostContextStore<K>;
|
|
7
7
|
callTool: <ToolArgs extends Record<string, unknown> | null = null, ToolResponse extends CallToolResponse = CallToolResponse>(name: string, args: ToolArgs) => Promise<ToolResponse>;
|
|
8
8
|
requestDisplayMode: (mode: DisplayMode) => Promise<{
|
|
9
9
|
mode: DisplayMode;
|
|
10
10
|
}>;
|
|
11
11
|
sendFollowUpMessage: (prompt: string) => Promise<void>;
|
|
12
12
|
openExternal(href: string): void;
|
|
13
|
+
setWidgetState: (stateOrUpdater: SetWidgetStateAction) => Promise<void>;
|
|
13
14
|
}
|
package/dist/{src/web/bridges/adaptors/apps-sdk-adaptor.js → web/bridges/apps-sdk/adaptor.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AppsSdkBridge } from "
|
|
1
|
+
import { AppsSdkBridge } from "./bridge.js";
|
|
2
2
|
export class AppsSdkAdaptor {
|
|
3
3
|
static instance = null;
|
|
4
4
|
static getInstance() {
|
|
@@ -10,7 +10,7 @@ export class AppsSdkAdaptor {
|
|
|
10
10
|
static resetInstance() {
|
|
11
11
|
AppsSdkAdaptor.instance = null;
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
getHostContextStore(key) {
|
|
14
14
|
const bridge = AppsSdkBridge.getInstance();
|
|
15
15
|
return {
|
|
16
16
|
subscribe: bridge.subscribe(key),
|
|
@@ -29,5 +29,11 @@ export class AppsSdkAdaptor {
|
|
|
29
29
|
openExternal(href) {
|
|
30
30
|
window.openai.openExternal({ href });
|
|
31
31
|
}
|
|
32
|
+
setWidgetState = (stateOrUpdater) => {
|
|
33
|
+
const newState = typeof stateOrUpdater === "function"
|
|
34
|
+
? stateOrUpdater(window.openai.widgetState)
|
|
35
|
+
: stateOrUpdater;
|
|
36
|
+
return window.openai.setWidgetState(newState);
|
|
37
|
+
};
|
|
32
38
|
}
|
|
33
|
-
//# sourceMappingURL=
|
|
39
|
+
//# sourceMappingURL=adaptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adaptor.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk/adaptor.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,cAAc;IACjB,MAAM,CAAC,QAAQ,GAA0B,IAAI,CAAC;IAE/C,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC7B,cAAc,CAAC,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,cAAc,CAAC,QAAQ,CAAC;IACjC,CAAC;IAEM,MAAM,CAAC,aAAa;QACzB,cAAc,CAAC,QAAQ,GAAG,IAAI,CAAC;IACjC,CAAC;IAEM,mBAAmB,CACxB,GAAM;QAEN,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;YAChC,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC;SAC3C,CAAC;IACJ,CAAC;IAEM,QAAQ,GAAG,KAAK,EAIrB,IAAY,EACZ,IAAc,EACS,EAAE;QACzB,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAyB,IAAI,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC;IAEK,kBAAkB,GAAG,CAC1B,IAAiB,EACe,EAAE;QAClC,OAAO,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC;IAEK,mBAAmB,GAAG,CAAC,MAAc,EAAiB,EAAE;QAC7D,OAAO,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC;IAEK,YAAY,CAAC,IAAY;QAC9B,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAEM,cAAc,GAAG,CACtB,cAAoC,EACrB,EAAE;QACjB,MAAM,QAAQ,GACZ,OAAO,cAAc,KAAK,UAAU;YAClC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;YAC3C,CAAC,CAAC,cAAc,CAAC;QAErB,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Bridge, Subscribe } from "../types.js";
|
|
2
|
+
import { type AppsSdkContext } from "./types.js";
|
|
3
|
+
export declare class AppsSdkBridge implements Bridge<AppsSdkContext> {
|
|
4
|
+
private static instance;
|
|
5
|
+
static getInstance(): AppsSdkBridge;
|
|
6
|
+
static resetInstance(): void;
|
|
7
|
+
subscribe(key: keyof AppsSdkContext): Subscribe;
|
|
8
|
+
subscribe(keys: readonly (keyof AppsSdkContext)[]): Subscribe;
|
|
9
|
+
getSnapshot: <K extends keyof AppsSdkContext>(key: K) => (import("./types.js").AppsSdkMethods<import("../../types.js").UnknownObject> & AppsSdkContext<Record<never, unknown>, import("../../types.js").UnknownObject, import("../../types.js").UnknownObject, import("../../types.js").UnknownObject>)[K];
|
|
10
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SET_GLOBALS_EVENT_TYPE, } from "
|
|
1
|
+
import { SET_GLOBALS_EVENT_TYPE, } from "./types.js";
|
|
2
2
|
export class AppsSdkBridge {
|
|
3
3
|
static instance = null;
|
|
4
4
|
static getInstance() {
|
|
@@ -43,4 +43,4 @@ export class AppsSdkBridge {
|
|
|
43
43
|
return window.openai[key];
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
|
-
//# sourceMappingURL=
|
|
46
|
+
//# sourceMappingURL=bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk/bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,sBAAsB,GAEvB,MAAM,YAAY,CAAC;AAEpB,MAAM,OAAO,aAAa;IAChB,MAAM,CAAC,QAAQ,GAAyB,IAAI,CAAC;IAE9C,MAAM,CAAC,WAAW;QACvB,IACE,MAAM,CAAC,SAAS,CAAC,QAAQ,KAAK,UAAU;YACxC,MAAM,CAAC,MAAM,KAAK,SAAS,EAC3B,CAAC;YACD,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QACD,IAAI,aAAa,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACpC,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAEM,MAAM,CAAC,aAAa;QACzB,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC3B,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;IAIM,SAAS,CACd,SAAmE;QAEnE,MAAM,IAAI,GAAsC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;YACtE,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChB,OAAO,CAAC,QAAoB,EAAE,EAAE;YAC9B,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAE,EAAE;gBACjD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CACjC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CACjD,CAAC;gBACF,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACvB,OAAO;gBACT,CAAC;gBACD,QAAQ,EAAE,CAAC;YACb,CAAC,CAAC;YAEF,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,eAAe,EAAE;gBAC/D,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,OAAO,GAAG,EAAE;gBACV,MAAM,CAAC,mBAAmB,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;YACtE,CAAC,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAEM,WAAW,GAAG,CAAiC,GAAM,EAAE,EAAE;QAC9D,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,+EAA+E,GAAG,8CAA8C,CACjI,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { AppsSdkAdaptor } from "./adaptor.js";
|
|
2
|
+
export { AppsSdkBridge } from "./bridge.js";
|
|
3
|
+
export type { AppsSdkContext, AppsSdkMethods, RequestModalOptions, ToolResponseEvent, } from "./types.js";
|
|
4
|
+
export { SET_GLOBALS_EVENT_TYPE, SetGlobalsEvent, TOOL_RESPONSE_EVENT_TYPE, } from "./types.js";
|
|
5
|
+
export { useAppsSdkContext } from "./use-apps-sdk-context.js";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { AppsSdkAdaptor } from "./adaptor.js";
|
|
2
|
+
export { AppsSdkBridge } from "./bridge.js";
|
|
3
|
+
export { SET_GLOBALS_EVENT_TYPE, SetGlobalsEvent, TOOL_RESPONSE_EVENT_TYPE, } from "./types.js";
|
|
4
|
+
export { useAppsSdkContext } from "./use-apps-sdk-context.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAO5C,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,wBAAwB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -1,20 +1,6 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
declare module "react" {
|
|
5
|
-
interface HTMLAttributes<T> {
|
|
6
|
-
"data-llm"?: string;
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
export type UnknownObject = Record<string, unknown>;
|
|
10
|
-
export type Prettify<T> = {
|
|
11
|
-
[K in keyof T]: T[K];
|
|
12
|
-
} & {};
|
|
13
|
-
export type Objectify<T> = T & UnknownObject;
|
|
14
|
-
type RequiredKeys<T> = {
|
|
15
|
-
[K in keyof T]-?: Record<string, never> extends Pick<T, K> ? never : K;
|
|
16
|
-
}[keyof T];
|
|
17
|
-
export type HasRequiredKeys<T> = RequiredKeys<T> extends never ? false : true;
|
|
1
|
+
import type { UnknownObject } from "../../types.js";
|
|
2
|
+
import type { CallToolArgs, CallToolResponse } from "../types.js";
|
|
3
|
+
type DisplayMode = "pip" | "inline" | "fullscreen" | "modal";
|
|
18
4
|
type WidgetState = UnknownObject;
|
|
19
5
|
type FileMetadata = {
|
|
20
6
|
fileId: string;
|
|
@@ -30,21 +16,17 @@ export declare class ToolResponseEvent extends CustomEvent<{
|
|
|
30
16
|
}
|
|
31
17
|
declare global {
|
|
32
18
|
interface Window {
|
|
33
|
-
|
|
34
|
-
openai: OpenAiMethods<WidgetState> & OpenAiProperties;
|
|
19
|
+
openai: AppsSdkMethods<WidgetState> & AppsSdkContext;
|
|
35
20
|
}
|
|
36
21
|
interface WindowEventMap {
|
|
37
22
|
[SET_GLOBALS_EVENT_TYPE]: SetGlobalsEvent;
|
|
38
23
|
}
|
|
39
24
|
}
|
|
40
|
-
export type
|
|
41
|
-
hostType: WidgetHostType;
|
|
42
|
-
};
|
|
43
|
-
export type OpenAiProperties<ToolInput extends UnknownObject = Record<never, unknown>, ToolOutput extends UnknownObject = UnknownObject, ToolResponseMetadata extends UnknownObject = UnknownObject, WidgetState extends UnknownObject = UnknownObject> = {
|
|
25
|
+
export type AppsSdkContext<ToolInput extends UnknownObject = Record<never, unknown>, ToolOutput extends UnknownObject = UnknownObject, ToolResponseMetadata extends UnknownObject = UnknownObject, WidgetState extends UnknownObject = UnknownObject> = {
|
|
44
26
|
theme: Theme;
|
|
45
27
|
userAgent: UserAgent;
|
|
46
28
|
locale: string;
|
|
47
|
-
maxHeight: number;
|
|
29
|
+
maxHeight: number | undefined;
|
|
48
30
|
displayMode: DisplayMode;
|
|
49
31
|
safeArea: SafeArea;
|
|
50
32
|
view: View;
|
|
@@ -55,14 +37,6 @@ export type OpenAiProperties<ToolInput extends UnknownObject = Record<never, unk
|
|
|
55
37
|
toolResponseMetadata: ToolResponseMetadata | null;
|
|
56
38
|
widgetState: WidgetState | null;
|
|
57
39
|
};
|
|
58
|
-
export type CallToolArgs = Record<string, unknown> | null;
|
|
59
|
-
export type CallToolResponse = {
|
|
60
|
-
content: CallToolResult["content"];
|
|
61
|
-
structuredContent: Record<string, unknown>;
|
|
62
|
-
isError: boolean;
|
|
63
|
-
result: string;
|
|
64
|
-
meta: Record<string, unknown>;
|
|
65
|
-
};
|
|
66
40
|
export type RequestModalOptions = {
|
|
67
41
|
title?: string;
|
|
68
42
|
params?: Record<string, unknown>;
|
|
@@ -73,7 +47,7 @@ export type RequestModalOptions = {
|
|
|
73
47
|
height?: number;
|
|
74
48
|
};
|
|
75
49
|
};
|
|
76
|
-
export type
|
|
50
|
+
export type AppsSdkMethods<WidgetState extends UnknownObject = UnknownObject> = {
|
|
77
51
|
/** Calls a tool on your MCP. Returns the full response. */
|
|
78
52
|
callTool: <ToolArgs extends CallToolArgs = null, ToolResponse extends CallToolResponse = CallToolResponse>(name: string, args: ToolArgs) => Promise<ToolResponse>;
|
|
79
53
|
/** Triggers a followup turn in the ChatGPT conversation */
|
|
@@ -110,34 +84,32 @@ export type OpenAiMethods<WidgetState extends UnknownObject = UnknownObject> = {
|
|
|
110
84
|
* Downloads a file from the host that was previously uploaded.
|
|
111
85
|
* Only files uploaded by the same connector instance can be downloaded.
|
|
112
86
|
*/
|
|
113
|
-
|
|
87
|
+
getFileDownloadUrl: (file: FileMetadata) => Promise<{
|
|
114
88
|
downloadUrl: string;
|
|
115
89
|
}>;
|
|
116
90
|
};
|
|
117
91
|
export declare const SET_GLOBALS_EVENT_TYPE = "openai:set_globals";
|
|
118
92
|
export declare class SetGlobalsEvent extends CustomEvent<{
|
|
119
|
-
globals: Partial<
|
|
93
|
+
globals: Partial<AppsSdkContext>;
|
|
120
94
|
}> {
|
|
121
95
|
readonly type = "openai:set_globals";
|
|
122
96
|
}
|
|
123
|
-
|
|
124
|
-
export type DisplayMode = "pip" | "inline" | "fullscreen" | "modal";
|
|
125
|
-
export type View = {
|
|
97
|
+
type View = {
|
|
126
98
|
mode: DisplayMode;
|
|
127
99
|
params?: Record<string, unknown>;
|
|
128
100
|
};
|
|
129
|
-
|
|
130
|
-
|
|
101
|
+
type Theme = "light" | "dark";
|
|
102
|
+
type SafeAreaInsets = {
|
|
131
103
|
top: number;
|
|
132
104
|
bottom: number;
|
|
133
105
|
left: number;
|
|
134
106
|
right: number;
|
|
135
107
|
};
|
|
136
|
-
|
|
108
|
+
type SafeArea = {
|
|
137
109
|
insets: SafeAreaInsets;
|
|
138
110
|
};
|
|
139
|
-
|
|
140
|
-
|
|
111
|
+
type DeviceType = "mobile" | "tablet" | "desktop" | "unknown";
|
|
112
|
+
type UserAgent = {
|
|
141
113
|
device: {
|
|
142
114
|
type: DeviceType;
|
|
143
115
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk/types.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AAC/D,MAAM,OAAO,iBAAkB,SAAQ,WAErC;IACkB,IAAI,GAAG,wBAAwB,CAAC;CACnD;AA2FD,sDAAsD;AACtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAC3D,MAAM,OAAO,eAAgB,SAAQ,WAEnC;IACkB,IAAI,GAAG,sBAAsB,CAAC;CACjD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useSyncExternalStore } from "react";
|
|
2
|
-
import { AppsSdkBridge } from "
|
|
3
|
-
export function
|
|
2
|
+
import { AppsSdkBridge } from "./bridge.js";
|
|
3
|
+
export function useAppsSdkContext(key) {
|
|
4
4
|
const bridge = AppsSdkBridge.getInstance();
|
|
5
5
|
return useSyncExternalStore(bridge.subscribe(key), () => bridge.getSnapshot(key));
|
|
6
6
|
}
|
|
7
|
-
//# sourceMappingURL=use-apps-sdk-
|
|
7
|
+
//# sourceMappingURL=use-apps-sdk-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-apps-sdk-context.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk/use-apps-sdk-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,UAAU,iBAAiB,CAC/B,GAAM;IAEN,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CACtD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CACxB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AppsSdkAdaptor } from "./apps-sdk/adaptor.js";
|
|
2
|
+
import { McpAppAdaptor } from "./mcp-app/adaptor.js";
|
|
3
|
+
export const getAdaptor = () => {
|
|
4
|
+
return window.skybridge.hostType === "apps-sdk"
|
|
5
|
+
? AppsSdkAdaptor.getInstance()
|
|
6
|
+
: McpAppAdaptor.getInstance();
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=get-adaptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-adaptor.js","sourceRoot":"","sources":["../../../src/web/bridges/get-adaptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,MAAM,CAAC,MAAM,UAAU,GAAG,GAAY,EAAE;IACtC,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,KAAK,UAAU;QAC7C,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE;QAC9B,CAAC,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/bridges/index.tsx"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/{src/web/bridges/adaptors/mcp-app-adaptor.d.ts → web/bridges/mcp-app/adaptor.d.ts}
RENAMED
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import type { McpUiRequestDisplayModeResult } from "@modelcontextprotocol/ext-apps";
|
|
2
|
-
import type { Adaptor,
|
|
2
|
+
import type { Adaptor, CallToolResponse, DisplayMode, HostContext, HostContextStore, SetWidgetStateAction } from "../types.js";
|
|
3
3
|
export declare class McpAppAdaptor implements Adaptor {
|
|
4
4
|
private static instance;
|
|
5
5
|
private stores;
|
|
6
|
+
private _widgetState;
|
|
7
|
+
private widgetStateListeners;
|
|
6
8
|
private constructor();
|
|
7
9
|
static getInstance(): McpAppAdaptor;
|
|
8
10
|
static resetInstance(): void;
|
|
9
|
-
|
|
11
|
+
getHostContextStore<K extends keyof HostContext>(key: K): HostContextStore<K>;
|
|
10
12
|
callTool: <ToolArgs extends Record<string, unknown> | null = null, ToolResponse extends CallToolResponse = CallToolResponse>(name: string, args: ToolArgs) => Promise<ToolResponse>;
|
|
11
13
|
requestDisplayMode: (mode: DisplayMode) => Promise<McpUiRequestDisplayModeResult>;
|
|
12
14
|
sendFollowUpMessage: (prompt: string) => Promise<void>;
|
|
13
15
|
openExternal(href: string): void;
|
|
14
16
|
private initializeStores;
|
|
15
|
-
|
|
17
|
+
setWidgetState: (stateOrUpdater: SetWidgetStateAction) => Promise<void>;
|
|
18
|
+
private createHostContextStore;
|
|
16
19
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { dequal } from "dequal/lite";
|
|
2
|
-
import { McpAppBridge
|
|
2
|
+
import { McpAppBridge } from "./bridge.js";
|
|
3
3
|
export class McpAppAdaptor {
|
|
4
4
|
static instance = null;
|
|
5
5
|
stores;
|
|
6
|
+
_widgetState = null;
|
|
7
|
+
widgetStateListeners = new Set();
|
|
6
8
|
constructor() {
|
|
7
9
|
this.stores = this.initializeStores();
|
|
8
10
|
}
|
|
@@ -15,7 +17,7 @@ export class McpAppAdaptor {
|
|
|
15
17
|
static resetInstance() {
|
|
16
18
|
McpAppAdaptor.instance = null;
|
|
17
19
|
}
|
|
18
|
-
|
|
20
|
+
getHostContextStore(key) {
|
|
19
21
|
return this.stores[key];
|
|
20
22
|
}
|
|
21
23
|
callTool = async (name, args) => {
|
|
@@ -73,14 +75,19 @@ export class McpAppAdaptor {
|
|
|
73
75
|
}
|
|
74
76
|
initializeStores() {
|
|
75
77
|
return {
|
|
76
|
-
theme: this.
|
|
77
|
-
locale: this.
|
|
78
|
-
safeArea: this.
|
|
78
|
+
theme: this.createHostContextStore(["theme"], ({ theme }) => theme ?? "light"),
|
|
79
|
+
locale: this.createHostContextStore(["locale"], ({ locale }) => locale ?? "en-US"),
|
|
80
|
+
safeArea: this.createHostContextStore(["safeAreaInsets"], ({ safeAreaInsets }) => ({
|
|
79
81
|
insets: safeAreaInsets ?? { top: 0, right: 0, bottom: 0, left: 0 },
|
|
80
82
|
})),
|
|
81
|
-
displayMode: this.
|
|
82
|
-
maxHeight: this.
|
|
83
|
-
|
|
83
|
+
displayMode: this.createHostContextStore(["displayMode"], ({ displayMode }) => displayMode ?? "inline"),
|
|
84
|
+
maxHeight: this.createHostContextStore(["containerDimensions"], ({ containerDimensions }) => {
|
|
85
|
+
if (containerDimensions && "maxHeight" in containerDimensions) {
|
|
86
|
+
return containerDimensions.maxHeight;
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
}),
|
|
90
|
+
userAgent: this.createHostContextStore(["platform", "deviceCapabilities"], ({ platform, deviceCapabilities }) => ({
|
|
84
91
|
device: {
|
|
85
92
|
type: platform === "web" ? "desktop" : (platform ?? "unknown"),
|
|
86
93
|
},
|
|
@@ -90,12 +97,35 @@ export class McpAppAdaptor {
|
|
|
90
97
|
...deviceCapabilities,
|
|
91
98
|
},
|
|
92
99
|
})),
|
|
93
|
-
toolInput: this.
|
|
94
|
-
toolOutput: this.
|
|
95
|
-
toolResponseMetadata: this.
|
|
100
|
+
toolInput: this.createHostContextStore(["toolInput"], ({ toolInput }) => toolInput ?? null),
|
|
101
|
+
toolOutput: this.createHostContextStore(["toolResult"], ({ toolResult }) => toolResult?.structuredContent ?? null),
|
|
102
|
+
toolResponseMetadata: this.createHostContextStore(["toolResult"], ({ toolResult }) => toolResult?._meta ?? null),
|
|
103
|
+
widgetState: {
|
|
104
|
+
subscribe: (onChange) => {
|
|
105
|
+
this.widgetStateListeners.add(onChange);
|
|
106
|
+
return () => {
|
|
107
|
+
this.widgetStateListeners.delete(onChange);
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
getSnapshot: () => this._widgetState,
|
|
111
|
+
},
|
|
96
112
|
};
|
|
97
113
|
}
|
|
98
|
-
|
|
114
|
+
setWidgetState = async (stateOrUpdater) => {
|
|
115
|
+
const newState = typeof stateOrUpdater === "function"
|
|
116
|
+
? stateOrUpdater(this._widgetState)
|
|
117
|
+
: stateOrUpdater;
|
|
118
|
+
const bridge = McpAppBridge.getInstance();
|
|
119
|
+
await bridge.request({
|
|
120
|
+
method: "ui/update-model-context",
|
|
121
|
+
params: { structuredContent: newState },
|
|
122
|
+
});
|
|
123
|
+
this._widgetState = newState;
|
|
124
|
+
this.widgetStateListeners.forEach((listener) => {
|
|
125
|
+
listener();
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
createHostContextStore(keys, computeSnapshot) {
|
|
99
129
|
const bridge = McpAppBridge.getInstance();
|
|
100
130
|
let cachedValue;
|
|
101
131
|
return {
|
|
@@ -112,4 +142,4 @@ export class McpAppAdaptor {
|
|
|
112
142
|
};
|
|
113
143
|
}
|
|
114
144
|
}
|
|
115
|
-
//# sourceMappingURL=
|
|
145
|
+
//# sourceMappingURL=adaptor.js.map
|