skybridge 0.0.0-dev.d19e9d8 → 0.0.0-dev.d2586b1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -15
- package/bin/run.js +5 -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/telemetry.d.ts +7 -0
- package/dist/cli/telemetry.js +123 -0
- package/dist/cli/telemetry.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 +9 -0
- package/dist/commands/dev.js +40 -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/commands/telemetry/disable.d.ts +5 -0
- package/dist/commands/telemetry/disable.js +14 -0
- package/dist/commands/telemetry/disable.js.map +1 -0
- package/dist/commands/telemetry/enable.d.ts +5 -0
- package/dist/commands/telemetry/enable.js +14 -0
- package/dist/commands/telemetry/enable.js.map +1 -0
- package/dist/commands/telemetry/status.d.ts +5 -0
- package/dist/commands/telemetry/status.js +14 -0
- package/dist/commands/telemetry/status.js.map +1 -0
- package/dist/server/asset-base-url-transform-plugin.d.ts +11 -0
- package/dist/server/asset-base-url-transform-plugin.js +34 -0
- package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
- package/dist/server/asset-base-url-transform-plugin.test.js +56 -0
- package/dist/server/asset-base-url-transform-plugin.test.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 +139 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/templateHelper.js.map +1 -0
- package/dist/server/templates/development.hbs +65 -0
- package/dist/{src/server → server}/templates/production.hbs +1 -2
- package/dist/{src/server → server}/widgetsDevServer.d.ts +2 -2
- package/dist/{src/server → server}/widgetsDevServer.js +15 -3
- package/dist/server/widgetsDevServer.js.map +1 -0
- package/dist/test/utils.js.map +1 -0
- package/dist/{src/test → test}/widget.test.js +123 -14
- package/dist/test/widget.test.js.map +1 -0
- package/dist/web/bridges/apps-sdk/adaptor.d.ts +22 -0
- package/dist/web/bridges/apps-sdk/adaptor.js +64 -0
- 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} +21 -16
- 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 +27 -50
- 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/web/bridges/mcp-app/adaptor.d.ts +36 -0
- package/dist/web/bridges/mcp-app/adaptor.js +185 -0
- package/dist/web/bridges/mcp-app/adaptor.js.map +1 -0
- package/dist/web/bridges/mcp-app/bridge.d.ts +43 -0
- package/dist/web/bridges/mcp-app/bridge.js +255 -0
- 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 +2 -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/web/bridges/types.d.ts +98 -0
- package/dist/web/bridges/types.js +2 -0
- package/dist/web/bridges/types.js.map +1 -0
- 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/web/components/modal-provider.d.ts +4 -0
- package/dist/web/components/modal-provider.js +47 -0
- package/dist/web/components/modal-provider.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 +9 -5
- 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/{src/web → web}/generate-helpers.test-d.js +4 -1
- 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 +1 -1
- package/dist/{src/web → web}/hooks/index.js +1 -1
- package/dist/web/hooks/index.js.map +1 -0
- package/dist/web/hooks/test/utils.d.ts +16 -0
- 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 +12 -4
- 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 +26 -1
- package/dist/web/hooks/use-call-tool.test.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-display-mode.d.ts +1 -1
- 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/web/hooks/use-files.d.ts +6 -0
- package/dist/web/hooks/use-files.js +9 -0
- package/dist/web/hooks/use-files.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-files.test.js +5 -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/web/hooks/use-layout.test.js +96 -0
- package/dist/web/hooks/use-layout.test.js.map +1 -0
- package/dist/web/hooks/use-open-external.js +8 -0
- package/dist/web/hooks/use-open-external.js.map +1 -0
- package/dist/web/hooks/use-open-external.test.js +50 -0
- package/dist/web/hooks/use-open-external.test.js.map +1 -0
- package/dist/web/hooks/use-request-modal.d.ts +9 -0
- package/dist/web/hooks/use-request-modal.js +16 -0
- package/dist/web/hooks/use-request-modal.js.map +1 -0
- package/dist/web/hooks/use-request-modal.test.js +57 -0
- package/dist/web/hooks/use-request-modal.test.js.map +1 -0
- package/dist/web/hooks/use-send-follow-up-message.js +8 -0
- package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
- package/dist/web/hooks/use-set-open-in-app-url.d.ts +1 -0
- package/dist/web/hooks/use-set-open-in-app-url.js +8 -0
- package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
- package/dist/web/hooks/use-set-open-in-app-url.test.js +49 -0
- package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-tool-info.d.ts +12 -1
- package/dist/web/hooks/use-tool-info.js +26 -0
- package/dist/web/hooks/use-tool-info.js.map +1 -0
- package/dist/{src/web → web}/hooks/use-tool-info.test-d.js +40 -4
- package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
- package/dist/web/hooks/use-tool-info.test.js +130 -0
- 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/web/hooks/use-user.test.js +94 -0
- 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/{src/web → web}/mount-widget.js +9 -1
- package/dist/web/mount-widget.js.map +1 -0
- package/dist/web/plugin/data-llm.test.d.ts +1 -0
- package/dist/web/plugin/data-llm.test.js.map +1 -0
- package/dist/{src/web → web}/plugin/plugin.js +7 -0
- package/dist/web/plugin/plugin.js.map +1 -0
- package/dist/{src/web → web}/plugin/transform-data-llm.js +6 -3
- package/dist/web/plugin/transform-data-llm.js.map +1 -0
- package/dist/web/plugin/transform-data-llm.test.d.ts +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 +60 -38
- package/dist/src/server/devtoolsStaticServer.d.ts +0 -15
- package/dist/src/server/devtoolsStaticServer.js +0 -38
- 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/apps-sdk-bridge.d.ts +0 -8
- package/dist/src/web/bridges/apps-sdk-bridge.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 -3
- package/dist/src/web/bridges/hooks/use-bridge.js +0 -27
- 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 -4
- 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 -58
- package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js.map +0 -1
- package/dist/src/web/bridges/index.d.ts +0 -3
- package/dist/src/web/bridges/index.js +0 -4
- package/dist/src/web/bridges/index.js.map +0 -1
- package/dist/src/web/bridges/mcp-app-bridge.d.ts +0 -26
- package/dist/src/web/bridges/mcp-app-bridge.js +0 -130
- 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/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 -7
- 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.d.ts +0 -10
- 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 +0 -46
- package/dist/src/web/hooks/use-layout.test.js.map +0 -1
- package/dist/src/web/hooks/use-open-external.js +0 -6
- package/dist/src/web/hooks/use-open-external.js.map +0 -1
- package/dist/src/web/hooks/use-open-external.test.js +0 -24
- 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.d.ts +0 -6
- package/dist/src/web/hooks/use-request-modal.js +0 -9
- package/dist/src/web/hooks/use-request-modal.js.map +0 -1
- package/dist/src/web/hooks/use-request-modal.test.js +0 -24
- package/dist/src/web/hooks/use-request-modal.test.js.map +0 -1
- package/dist/src/web/hooks/use-send-follow-up-message.js +0 -11
- package/dist/src/web/hooks/use-send-follow-up-message.js.map +0 -1
- package/dist/src/web/hooks/use-tool-info.js +0 -20
- 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 +0 -60
- 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 +0 -44
- 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/test/widget.test.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
- /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/test → test}/utils.d.ts +0 -0
- /package/dist/{src/test → test}/utils.js +0 -0
- /package/dist/{src/web/bridges/hooks/use-mcp-app-bridge.test.d.ts → test/widget.test.d.ts} +0 -0
- /package/dist/{src/web/create-store.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/data-llm.test.d.ts → web/create-store.test.d.ts} +0 -0
- /package/dist/{src/web → web}/data-llm.d.ts +0 -0
- /package/dist/{src/web/plugin → 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.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.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-send-follow-up-message.d.ts +0 -0
- /package/dist/{src/web/hooks/use-tool-info.test-d.d.ts → web/hooks/use-set-open-in-app-url.test.d.ts} +0 -0
- /package/dist/{src/web/hooks/use-tool-info.test.d.ts → web/hooks/use-tool-info.test-d.d.ts} +0 -0
- /package/dist/{src/web/hooks/use-user.test.d.ts → web/hooks/use-tool-info.test.d.ts} +0 -0
- /package/dist/{src/web/hooks/use-widget-state.test.d.ts → 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/plugin/transform-data-llm.test.d.ts → 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}/plugin/data-llm.test.js +0 -0
- /package/dist/{src/web → web}/plugin/plugin.d.ts +0 -0
- /package/dist/{src/web → web}/plugin/transform-data-llm.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,10 +141,19 @@ 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
|
});
|
|
129
|
-
expect(appsSdkResult.contents[0]?.text).toContain('window.skybridge = { hostType: "apps-sdk" }');
|
|
156
|
+
expect(appsSdkResult.contents[0]?.text).toContain('window.skybridge = { hostType: "apps-sdk", serverUrl: "http://localhost:3000" };');
|
|
130
157
|
const extAppsResourceCallback = mockRegisterResource.mock
|
|
131
158
|
.calls[1]?.[3];
|
|
132
159
|
expect(extAppsResourceCallback).toBeDefined();
|
|
@@ -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
|
-
expect(extAppsResult.contents[0]?.text).toContain('window.skybridge = { hostType: "mcp-app" }');
|
|
179
|
+
expect(extAppsResult.contents[0]?.text).toContain('window.skybridge = { hostType: "mcp-app", serverUrl: "http://localhost:3000" };');
|
|
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");
|
|
144
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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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Adaptor, CallToolResponse, DisplayMode, HostContext, HostContextStore, RequestModalOptions, SetWidgetStateAction } from "../types.js";
|
|
2
|
+
export declare class AppsSdkAdaptor implements Adaptor {
|
|
3
|
+
private static instance;
|
|
4
|
+
static getInstance(): AppsSdkAdaptor;
|
|
5
|
+
static resetInstance(): void;
|
|
6
|
+
getHostContextStore<K extends keyof HostContext>(key: K): HostContextStore<K>;
|
|
7
|
+
callTool: <ToolArgs extends Record<string, unknown> | null = null, ToolResponse extends CallToolResponse = CallToolResponse>(name: string, args: ToolArgs) => Promise<ToolResponse>;
|
|
8
|
+
requestDisplayMode: (mode: DisplayMode) => Promise<{
|
|
9
|
+
mode: DisplayMode;
|
|
10
|
+
}>;
|
|
11
|
+
sendFollowUpMessage: (prompt: string) => Promise<void>;
|
|
12
|
+
openExternal(href: string): void;
|
|
13
|
+
setWidgetState: (stateOrUpdater: SetWidgetStateAction) => Promise<void>;
|
|
14
|
+
uploadFile: (file: File) => Promise<import("../types.js").FileMetadata>;
|
|
15
|
+
getFileDownloadUrl: (file: {
|
|
16
|
+
fileId: string;
|
|
17
|
+
}) => Promise<{
|
|
18
|
+
downloadUrl: string;
|
|
19
|
+
}>;
|
|
20
|
+
openModal(options: RequestModalOptions): Promise<void>;
|
|
21
|
+
setOpenInAppUrl(href: string): Promise<void>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { AppsSdkBridge } from "./bridge.js";
|
|
2
|
+
export class AppsSdkAdaptor {
|
|
3
|
+
static instance = null;
|
|
4
|
+
static getInstance() {
|
|
5
|
+
if (!AppsSdkAdaptor.instance) {
|
|
6
|
+
AppsSdkAdaptor.instance = new AppsSdkAdaptor();
|
|
7
|
+
}
|
|
8
|
+
return AppsSdkAdaptor.instance;
|
|
9
|
+
}
|
|
10
|
+
static resetInstance() {
|
|
11
|
+
AppsSdkAdaptor.instance = null;
|
|
12
|
+
}
|
|
13
|
+
getHostContextStore(key) {
|
|
14
|
+
const bridge = AppsSdkBridge.getInstance();
|
|
15
|
+
return {
|
|
16
|
+
subscribe: bridge.subscribe(key),
|
|
17
|
+
getSnapshot: () => bridge.getSnapshot(key),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
callTool = async (name, args) => {
|
|
21
|
+
return window.openai.callTool(name, args);
|
|
22
|
+
};
|
|
23
|
+
requestDisplayMode = (mode) => {
|
|
24
|
+
return window.openai.requestDisplayMode({ mode });
|
|
25
|
+
};
|
|
26
|
+
sendFollowUpMessage = (prompt) => {
|
|
27
|
+
return window.openai.sendFollowUpMessage({ prompt });
|
|
28
|
+
};
|
|
29
|
+
openExternal(href) {
|
|
30
|
+
window.openai.openExternal({ href });
|
|
31
|
+
}
|
|
32
|
+
setWidgetState = (stateOrUpdater) => {
|
|
33
|
+
const newState = typeof stateOrUpdater === "function"
|
|
34
|
+
? stateOrUpdater(window.openai.widgetState)
|
|
35
|
+
: stateOrUpdater;
|
|
36
|
+
return window.openai.setWidgetState(newState);
|
|
37
|
+
};
|
|
38
|
+
uploadFile = (file) => {
|
|
39
|
+
return window.openai.uploadFile(file);
|
|
40
|
+
};
|
|
41
|
+
getFileDownloadUrl = (file) => {
|
|
42
|
+
return window.openai.getFileDownloadUrl(file);
|
|
43
|
+
};
|
|
44
|
+
openModal(options) {
|
|
45
|
+
return window.openai.requestModal(options);
|
|
46
|
+
}
|
|
47
|
+
setOpenInAppUrl(href) {
|
|
48
|
+
href = href.trim();
|
|
49
|
+
if (!href) {
|
|
50
|
+
throw new Error("The href parameter is required.");
|
|
51
|
+
}
|
|
52
|
+
const serverUrl = window.skybridge.serverUrl;
|
|
53
|
+
if (!serverUrl) {
|
|
54
|
+
throw new Error("The widgetDomain property has not been set on the widget resource meta object.");
|
|
55
|
+
}
|
|
56
|
+
const domainUrl = new URL(serverUrl);
|
|
57
|
+
const hrefUrl = new URL(href, serverUrl);
|
|
58
|
+
if (domainUrl.origin !== hrefUrl.origin) {
|
|
59
|
+
throw new Error("Provided href is not compatible with widget domain: origin differs");
|
|
60
|
+
}
|
|
61
|
+
return window.openai.setOpenInAppUrl({ href });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=adaptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adaptor.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk/adaptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -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() {
|
|
@@ -16,21 +16,26 @@ export class AppsSdkBridge {
|
|
|
16
16
|
AppsSdkBridge.instance = null;
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
subscribe
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
subscribe(keyOrKeys) {
|
|
20
|
+
const keys = Array.isArray(keyOrKeys)
|
|
21
|
+
? keyOrKeys
|
|
22
|
+
: [keyOrKeys];
|
|
23
|
+
return (onChange) => {
|
|
24
|
+
const handleSetGlobal = (event) => {
|
|
25
|
+
const hasRelevantChange = keys.some((key) => event.detail.globals[key] !== undefined);
|
|
26
|
+
if (!hasRelevantChange) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
onChange();
|
|
30
|
+
};
|
|
31
|
+
window.addEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal, {
|
|
32
|
+
passive: true,
|
|
33
|
+
});
|
|
34
|
+
return () => {
|
|
35
|
+
window.removeEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal);
|
|
36
|
+
};
|
|
26
37
|
};
|
|
27
|
-
|
|
28
|
-
passive: true,
|
|
29
|
-
});
|
|
30
|
-
return () => {
|
|
31
|
-
window.removeEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal);
|
|
32
|
-
};
|
|
33
|
-
};
|
|
38
|
+
}
|
|
34
39
|
getSnapshot = (key) => {
|
|
35
40
|
if (window.openai === undefined) {
|
|
36
41
|
throw new Error(`window.openai is not available. Make sure you're calling the hook requiring ${key} within the OpenAI iFrame skybridge runtime.`);
|
|
@@ -38,4 +43,4 @@ export class AppsSdkBridge {
|
|
|
38
43
|
return window.openai[key];
|
|
39
44
|
};
|
|
40
45
|
}
|
|
41
|
-
//# 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, 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;AAM5C,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,wBAAwB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -1,23 +1,7 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
interface HTMLAttributes<T> {
|
|
5
|
-
"data-llm"?: string;
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
export type UnknownObject = Record<string, unknown>;
|
|
9
|
-
export type Prettify<T> = {
|
|
10
|
-
[K in keyof T]: T[K];
|
|
11
|
-
} & {};
|
|
12
|
-
export type Objectify<T> = T & UnknownObject;
|
|
13
|
-
type RequiredKeys<T> = {
|
|
14
|
-
[K in keyof T]-?: Record<string, never> extends Pick<T, K> ? never : K;
|
|
15
|
-
}[keyof T];
|
|
16
|
-
export type HasRequiredKeys<T> = RequiredKeys<T> extends never ? false : true;
|
|
1
|
+
import type { UnknownObject } from "../../types.js";
|
|
2
|
+
import type { CallToolArgs, CallToolResponse, FileMetadata, RequestModalOptions } from "../types.js";
|
|
3
|
+
type DisplayMode = "pip" | "inline" | "fullscreen" | "modal";
|
|
17
4
|
type WidgetState = UnknownObject;
|
|
18
|
-
type FileMetadata = {
|
|
19
|
-
fileId: string;
|
|
20
|
-
};
|
|
21
5
|
export declare const TOOL_RESPONSE_EVENT_TYPE = "openai:tool_response";
|
|
22
6
|
export declare class ToolResponseEvent extends CustomEvent<{
|
|
23
7
|
tool: {
|
|
@@ -29,23 +13,20 @@ export declare class ToolResponseEvent extends CustomEvent<{
|
|
|
29
13
|
}
|
|
30
14
|
declare global {
|
|
31
15
|
interface Window {
|
|
32
|
-
|
|
33
|
-
openai: OpenAiMethods<WidgetState> & OpenAiProperties;
|
|
16
|
+
openai: AppsSdkMethods<WidgetState> & AppsSdkContext;
|
|
34
17
|
}
|
|
35
18
|
interface WindowEventMap {
|
|
36
19
|
[SET_GLOBALS_EVENT_TYPE]: SetGlobalsEvent;
|
|
37
20
|
}
|
|
38
21
|
}
|
|
39
|
-
export type
|
|
40
|
-
hostType: WidgetHostType;
|
|
41
|
-
};
|
|
42
|
-
export type OpenAiProperties<ToolInput extends UnknownObject = Record<never, unknown>, ToolOutput extends UnknownObject = UnknownObject, ToolResponseMetadata extends UnknownObject = UnknownObject, WidgetState extends UnknownObject = UnknownObject> = {
|
|
22
|
+
export type AppsSdkContext<ToolInput extends UnknownObject = Record<never, unknown>, ToolOutput extends UnknownObject = UnknownObject, ToolResponseMetadata extends UnknownObject = UnknownObject, WidgetState extends UnknownObject = UnknownObject> = {
|
|
43
23
|
theme: Theme;
|
|
44
24
|
userAgent: UserAgent;
|
|
45
25
|
locale: string;
|
|
46
|
-
maxHeight: number;
|
|
26
|
+
maxHeight: number | undefined;
|
|
47
27
|
displayMode: DisplayMode;
|
|
48
28
|
safeArea: SafeArea;
|
|
29
|
+
view: View;
|
|
49
30
|
toolInput: ToolInput;
|
|
50
31
|
toolOutput: ToolOutput | {
|
|
51
32
|
text: string;
|
|
@@ -53,18 +34,7 @@ export type OpenAiProperties<ToolInput extends UnknownObject = Record<never, unk
|
|
|
53
34
|
toolResponseMetadata: ToolResponseMetadata | null;
|
|
54
35
|
widgetState: WidgetState | null;
|
|
55
36
|
};
|
|
56
|
-
export type
|
|
57
|
-
export type CallToolResponse = {
|
|
58
|
-
content: {
|
|
59
|
-
type: "text";
|
|
60
|
-
text: string;
|
|
61
|
-
}[];
|
|
62
|
-
structuredContent: Record<string, unknown>;
|
|
63
|
-
isError: boolean;
|
|
64
|
-
result: string;
|
|
65
|
-
meta: Record<string, unknown>;
|
|
66
|
-
};
|
|
67
|
-
export type OpenAiMethods<WidgetState extends UnknownObject = UnknownObject> = {
|
|
37
|
+
export type AppsSdkMethods<WidgetState extends UnknownObject = UnknownObject> = {
|
|
68
38
|
/** Calls a tool on your MCP. Returns the full response. */
|
|
69
39
|
callTool: <ToolArgs extends CallToolArgs = null, ToolResponse extends CallToolResponse = CallToolResponse>(name: string, args: ToolArgs) => Promise<ToolResponse>;
|
|
70
40
|
/** Triggers a followup turn in the ChatGPT conversation */
|
|
@@ -94,39 +64,46 @@ export type OpenAiMethods<WidgetState extends UnknownObject = UnknownObject> = {
|
|
|
94
64
|
* Opens a modal portaled outside of the widget iFrame.
|
|
95
65
|
* This ensures the modal is correctly displayed and not limited to the widget's area.
|
|
96
66
|
*/
|
|
97
|
-
requestModal: (args:
|
|
98
|
-
title: string;
|
|
99
|
-
}) => Promise<void>;
|
|
67
|
+
requestModal: (args: RequestModalOptions) => Promise<void>;
|
|
100
68
|
/** Uploads a new file to the host */
|
|
101
69
|
uploadFile: (file: File) => Promise<FileMetadata>;
|
|
102
70
|
/**
|
|
103
71
|
* Downloads a file from the host that was previously uploaded.
|
|
104
72
|
* Only files uploaded by the same connector instance can be downloaded.
|
|
105
73
|
*/
|
|
106
|
-
|
|
74
|
+
getFileDownloadUrl: (file: FileMetadata) => Promise<{
|
|
107
75
|
downloadUrl: string;
|
|
108
76
|
}>;
|
|
77
|
+
/**
|
|
78
|
+
* Sets the open in app URL.
|
|
79
|
+
* This URL will be opened in the app when the user clicks on the top right button in fullscreen mode.
|
|
80
|
+
*/
|
|
81
|
+
setOpenInAppUrl: (args: {
|
|
82
|
+
href: string;
|
|
83
|
+
}) => Promise<void>;
|
|
109
84
|
};
|
|
110
85
|
export declare const SET_GLOBALS_EVENT_TYPE = "openai:set_globals";
|
|
111
86
|
export declare class SetGlobalsEvent extends CustomEvent<{
|
|
112
|
-
globals: Partial<
|
|
87
|
+
globals: Partial<AppsSdkContext>;
|
|
113
88
|
}> {
|
|
114
89
|
readonly type = "openai:set_globals";
|
|
115
90
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
91
|
+
type View = {
|
|
92
|
+
mode: DisplayMode;
|
|
93
|
+
params?: Record<string, unknown>;
|
|
94
|
+
};
|
|
95
|
+
type Theme = "light" | "dark";
|
|
96
|
+
type SafeAreaInsets = {
|
|
120
97
|
top: number;
|
|
121
98
|
bottom: number;
|
|
122
99
|
left: number;
|
|
123
100
|
right: number;
|
|
124
101
|
};
|
|
125
|
-
|
|
102
|
+
type SafeArea = {
|
|
126
103
|
insets: SafeAreaInsets;
|
|
127
104
|
};
|
|
128
|
-
|
|
129
|
-
|
|
105
|
+
type DeviceType = "mobile" | "tablet" | "desktop" | "unknown";
|
|
106
|
+
type UserAgent = {
|
|
130
107
|
device: {
|
|
131
108
|
type: DeviceType;
|
|
132
109
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk/types.ts"],"names":[],"mappings":"AAYA,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"}
|