skybridge 0.0.0-dev.ff4b4a2 → 0.0.0-dev.fff2bae

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/README.md +24 -15
  2. package/dist/cli/detect-port.d.ts +18 -0
  3. package/dist/cli/detect-port.js +61 -0
  4. package/dist/cli/detect-port.js.map +1 -0
  5. package/dist/cli/header.js +1 -1
  6. package/dist/cli/header.js.map +1 -1
  7. package/dist/cli/run-command.js.map +1 -1
  8. package/dist/cli/telemetry.js.map +1 -1
  9. package/dist/cli/tunnel-control-server.d.ts +9 -0
  10. package/dist/cli/tunnel-control-server.js +31 -0
  11. package/dist/cli/tunnel-control-server.js.map +1 -0
  12. package/dist/cli/tunnel-control-server.test.js +39 -0
  13. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  14. package/dist/cli/tunnel-handler.d.ts +3 -0
  15. package/dist/cli/tunnel-handler.js +48 -0
  16. package/dist/cli/tunnel-handler.js.map +1 -0
  17. package/dist/cli/tunnel-handler.test.js +105 -0
  18. package/dist/cli/tunnel-handler.test.js.map +1 -0
  19. package/dist/cli/tunnel.d.ts +57 -0
  20. package/dist/cli/tunnel.js +154 -0
  21. package/dist/cli/tunnel.js.map +1 -0
  22. package/dist/cli/tunnel.test.d.ts +1 -0
  23. package/dist/cli/tunnel.test.js +190 -0
  24. package/dist/cli/tunnel.test.js.map +1 -0
  25. package/dist/cli/types.d.ts +5 -0
  26. package/dist/cli/types.js +2 -0
  27. package/dist/cli/types.js.map +1 -0
  28. package/dist/cli/use-execute-steps.js.map +1 -1
  29. package/dist/cli/use-messages.d.ts +3 -0
  30. package/dist/cli/use-messages.js +11 -0
  31. package/dist/cli/use-messages.js.map +1 -0
  32. package/dist/cli/use-nodemon.d.ts +2 -6
  33. package/dist/cli/use-nodemon.js +30 -18
  34. package/dist/cli/use-nodemon.js.map +1 -1
  35. package/dist/cli/use-open-browser.d.ts +1 -0
  36. package/dist/cli/use-open-browser.js +44 -0
  37. package/dist/cli/use-open-browser.js.map +1 -0
  38. package/dist/cli/use-tunnel.d.ts +14 -0
  39. package/dist/cli/use-tunnel.js +131 -0
  40. package/dist/cli/use-tunnel.js.map +1 -0
  41. package/dist/cli/use-typescript-check.d.ts +1 -0
  42. package/dist/cli/use-typescript-check.js +41 -6
  43. package/dist/cli/use-typescript-check.js.map +1 -1
  44. package/dist/commands/build.js +63 -7
  45. package/dist/commands/build.js.map +1 -1
  46. package/dist/commands/dev.d.ts +4 -1
  47. package/dist/commands/dev.js +57 -8
  48. package/dist/commands/dev.js.map +1 -1
  49. package/dist/commands/start.d.ts +3 -1
  50. package/dist/commands/start.js +31 -15
  51. package/dist/commands/start.js.map +1 -1
  52. package/dist/commands/telemetry/disable.js.map +1 -1
  53. package/dist/commands/telemetry/enable.js.map +1 -1
  54. package/dist/commands/telemetry/status.js.map +1 -1
  55. package/dist/server/asset-base-url-transform-plugin.d.ts +5 -6
  56. package/dist/server/asset-base-url-transform-plugin.js +9 -10
  57. package/dist/server/asset-base-url-transform-plugin.js.map +1 -1
  58. package/dist/server/asset-base-url-transform-plugin.test.js +41 -13
  59. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -1
  60. package/dist/server/content-helpers.d.ts +27 -0
  61. package/dist/server/content-helpers.js +46 -0
  62. package/dist/server/content-helpers.js.map +1 -0
  63. package/dist/server/content-helpers.test.d.ts +1 -0
  64. package/dist/server/content-helpers.test.js +70 -0
  65. package/dist/server/content-helpers.test.js.map +1 -0
  66. package/dist/server/express.d.ts +11 -0
  67. package/dist/server/express.js +101 -0
  68. package/dist/server/express.js.map +1 -0
  69. package/dist/server/express.test.d.ts +1 -0
  70. package/dist/server/express.test.js +430 -0
  71. package/dist/server/express.test.js.map +1 -0
  72. package/dist/server/index.d.ts +5 -3
  73. package/dist/server/index.js +3 -2
  74. package/dist/server/index.js.map +1 -1
  75. package/dist/server/inferUtilityTypes.d.ts +6 -6
  76. package/dist/server/inferUtilityTypes.js.map +1 -1
  77. package/dist/server/metric.d.ts +14 -0
  78. package/dist/server/metric.js +62 -0
  79. package/dist/server/metric.js.map +1 -0
  80. package/dist/server/middleware.d.ts +124 -0
  81. package/dist/server/middleware.js +93 -0
  82. package/dist/server/middleware.js.map +1 -0
  83. package/dist/server/middleware.test-d.d.ts +1 -0
  84. package/dist/server/middleware.test-d.js +75 -0
  85. package/dist/server/middleware.test-d.js.map +1 -0
  86. package/dist/server/middleware.test.d.ts +1 -0
  87. package/dist/server/middleware.test.js +493 -0
  88. package/dist/server/middleware.test.js.map +1 -0
  89. package/dist/server/server.d.ts +160 -63
  90. package/dist/server/server.js +391 -76
  91. package/dist/server/server.js.map +1 -1
  92. package/dist/server/templateHelper.d.ts +5 -8
  93. package/dist/server/templateHelper.js +3 -22
  94. package/dist/server/templateHelper.js.map +1 -1
  95. package/dist/server/templates.generated.d.ts +4 -0
  96. package/dist/server/templates.generated.js +47 -0
  97. package/dist/server/templates.generated.js.map +1 -0
  98. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  99. package/dist/server/tunnel-proxy-router.js +110 -0
  100. package/dist/server/tunnel-proxy-router.js.map +1 -0
  101. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  102. package/dist/server/tunnel-proxy-router.test.js +229 -0
  103. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  104. package/dist/server/viewsDevServer.d.ts +14 -0
  105. package/dist/server/viewsDevServer.js +45 -0
  106. package/dist/server/viewsDevServer.js.map +1 -0
  107. package/dist/test/utils.d.ts +13 -21
  108. package/dist/test/utils.js +42 -37
  109. package/dist/test/utils.js.map +1 -1
  110. package/dist/test/view.test.d.ts +1 -0
  111. package/dist/test/view.test.js +523 -0
  112. package/dist/test/view.test.js.map +1 -0
  113. package/dist/version.d.ts +1 -0
  114. package/dist/version.js +3 -0
  115. package/dist/version.js.map +1 -0
  116. package/dist/web/bridges/apps-sdk/adaptor.d.ts +9 -7
  117. package/dist/web/bridges/apps-sdk/adaptor.js +51 -19
  118. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -1
  119. package/dist/web/bridges/apps-sdk/bridge.d.ts +1 -1
  120. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  121. package/dist/web/bridges/apps-sdk/index.d.ts +1 -1
  122. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  123. package/dist/web/bridges/apps-sdk/types.d.ts +30 -14
  124. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  125. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  126. package/dist/web/bridges/get-adaptor.js.map +1 -1
  127. package/dist/web/bridges/index.js.map +1 -1
  128. package/dist/web/bridges/mcp-app/adaptor.d.ts +21 -9
  129. package/dist/web/bridges/mcp-app/adaptor.js +142 -64
  130. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -1
  131. package/dist/web/bridges/mcp-app/bridge.d.ts +13 -30
  132. package/dist/web/bridges/mcp-app/bridge.js +43 -196
  133. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  134. package/dist/web/bridges/mcp-app/index.js.map +1 -1
  135. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  136. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +5 -3
  137. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +2 -2
  138. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  139. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +1 -41
  140. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  141. package/dist/web/bridges/types.d.ts +26 -13
  142. package/dist/web/bridges/types.js.map +1 -1
  143. package/dist/web/bridges/use-host-context.js.map +1 -1
  144. package/dist/web/components/modal-provider.js +3 -5
  145. package/dist/web/components/modal-provider.js.map +1 -1
  146. package/dist/web/create-store.js +17 -3
  147. package/dist/web/create-store.js.map +1 -1
  148. package/dist/web/create-store.test.js +23 -20
  149. package/dist/web/create-store.test.js.map +1 -1
  150. package/dist/web/data-llm.d.ts +1 -1
  151. package/dist/web/data-llm.js +3 -3
  152. package/dist/web/data-llm.js.map +1 -1
  153. package/dist/web/data-llm.test.js +33 -30
  154. package/dist/web/data-llm.test.js.map +1 -1
  155. package/dist/web/generate-helpers.d.ts +20 -18
  156. package/dist/web/generate-helpers.js +20 -18
  157. package/dist/web/generate-helpers.js.map +1 -1
  158. package/dist/web/generate-helpers.test-d.js +26 -26
  159. package/dist/web/generate-helpers.test-d.js.map +1 -1
  160. package/dist/web/generate-helpers.test.js.map +1 -1
  161. package/dist/web/helpers/state.d.ts +2 -2
  162. package/dist/web/helpers/state.js +11 -11
  163. package/dist/web/helpers/state.js.map +1 -1
  164. package/dist/web/helpers/state.test.js +9 -9
  165. package/dist/web/helpers/state.test.js.map +1 -1
  166. package/dist/web/hooks/index.d.ts +2 -2
  167. package/dist/web/hooks/index.js +1 -1
  168. package/dist/web/hooks/index.js.map +1 -1
  169. package/dist/web/hooks/test/utils.js +4 -0
  170. package/dist/web/hooks/test/utils.js.map +1 -1
  171. package/dist/web/hooks/use-call-tool.js.map +1 -1
  172. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -1
  173. package/dist/web/hooks/use-call-tool.test.js +0 -4
  174. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  175. package/dist/web/hooks/use-display-mode.d.ts +3 -3
  176. package/dist/web/hooks/use-display-mode.js.map +1 -1
  177. package/dist/web/hooks/use-display-mode.test-d.d.ts +1 -0
  178. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  179. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  180. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  181. package/dist/web/hooks/use-files.d.ts +2 -1
  182. package/dist/web/hooks/use-files.js +1 -0
  183. package/dist/web/hooks/use-files.js.map +1 -1
  184. package/dist/web/hooks/use-files.test.js +27 -3
  185. package/dist/web/hooks/use-files.test.js.map +1 -1
  186. package/dist/web/hooks/use-layout.js.map +1 -1
  187. package/dist/web/hooks/use-layout.test.js +3 -3
  188. package/dist/web/hooks/use-layout.test.js.map +1 -1
  189. package/dist/web/hooks/use-open-external.d.ts +3 -1
  190. package/dist/web/hooks/use-open-external.js +1 -1
  191. package/dist/web/hooks/use-open-external.js.map +1 -1
  192. package/dist/web/hooks/use-open-external.test.js +26 -11
  193. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  194. package/dist/web/hooks/use-request-modal.d.ts +1 -1
  195. package/dist/web/hooks/use-request-modal.js +4 -4
  196. package/dist/web/hooks/use-request-modal.js.map +1 -1
  197. package/dist/web/hooks/use-request-modal.test.js +5 -1
  198. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  199. package/dist/web/hooks/use-send-follow-up-message.d.ts +2 -1
  200. package/dist/web/hooks/use-send-follow-up-message.js +2 -2
  201. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
  202. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -1
  203. package/dist/web/hooks/use-set-open-in-app-url.test.js +5 -11
  204. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  205. package/dist/web/hooks/use-tool-info.js.map +1 -1
  206. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  207. package/dist/web/hooks/use-tool-info.test.js +1 -1
  208. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  209. package/dist/web/hooks/use-user.js +18 -2
  210. package/dist/web/hooks/use-user.js.map +1 -1
  211. package/dist/web/hooks/use-user.test.js +29 -1
  212. package/dist/web/hooks/use-user.test.js.map +1 -1
  213. package/dist/web/hooks/use-view-state.d.ts +4 -0
  214. package/dist/web/hooks/use-view-state.js +32 -0
  215. package/dist/web/hooks/use-view-state.js.map +1 -0
  216. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  217. package/dist/web/hooks/use-view-state.test.js +177 -0
  218. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  219. package/dist/web/index.d.ts +1 -2
  220. package/dist/web/index.js +1 -2
  221. package/dist/web/index.js.map +1 -1
  222. package/dist/web/mount-view.d.ts +1 -0
  223. package/dist/web/{mount-widget.js → mount-view.js} +2 -2
  224. package/dist/web/mount-view.js.map +1 -0
  225. package/dist/web/plugin/data-llm.test.js.map +1 -1
  226. package/dist/web/plugin/plugin.d.ts +4 -1
  227. package/dist/web/plugin/plugin.js +128 -18
  228. package/dist/web/plugin/plugin.js.map +1 -1
  229. package/dist/web/plugin/scan-views.d.ts +16 -0
  230. package/dist/web/plugin/scan-views.js +88 -0
  231. package/dist/web/plugin/scan-views.js.map +1 -0
  232. package/dist/web/plugin/scan-views.test.d.ts +1 -0
  233. package/dist/web/plugin/scan-views.test.js +99 -0
  234. package/dist/web/plugin/scan-views.test.js.map +1 -0
  235. package/dist/web/plugin/transform-data-llm.js +1 -1
  236. package/dist/web/plugin/transform-data-llm.js.map +1 -1
  237. package/dist/web/plugin/transform-data-llm.test.js.map +1 -1
  238. package/dist/web/plugin/validate-view.d.ts +1 -0
  239. package/dist/web/plugin/validate-view.js +9 -0
  240. package/dist/web/plugin/validate-view.js.map +1 -0
  241. package/dist/web/plugin/validate-view.test.d.ts +1 -0
  242. package/dist/web/plugin/validate-view.test.js +24 -0
  243. package/dist/web/plugin/validate-view.test.js.map +1 -0
  244. package/dist/web/proxy.js.map +1 -1
  245. package/dist/web/types.js.map +1 -1
  246. package/package.json +44 -30
  247. package/tsconfig.base.json +33 -0
  248. package/dist/server/templates/development.hbs +0 -67
  249. package/dist/server/templates/production.hbs +0 -6
  250. package/dist/server/widgetsDevServer.d.ts +0 -12
  251. package/dist/server/widgetsDevServer.js +0 -57
  252. package/dist/server/widgetsDevServer.js.map +0 -1
  253. package/dist/test/widget.test.js +0 -255
  254. package/dist/test/widget.test.js.map +0 -1
  255. package/dist/web/hooks/use-widget-state.d.ts +0 -4
  256. package/dist/web/hooks/use-widget-state.js +0 -32
  257. package/dist/web/hooks/use-widget-state.js.map +0 -1
  258. package/dist/web/hooks/use-widget-state.test.js +0 -61
  259. package/dist/web/hooks/use-widget-state.test.js.map +0 -1
  260. package/dist/web/mount-widget.d.ts +0 -1
  261. package/dist/web/mount-widget.js.map +0 -1
  262. /package/dist/{test/widget.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  263. /package/dist/{web/hooks/use-widget-state.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.test.js","sourceRoot":"","sources":["../../src/test/view.test.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from \"node:crypto\";\nimport type { RequestHandlerExtra } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n ServerNotification,\n ServerRequest,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n afterEach,\n beforeEach,\n describe,\n expect,\n it,\n type MockInstance,\n vi,\n} from \"vitest\";\nimport type { McpServer, ViewName } from \"../server/server.js\";\nimport {\n createMockExtra,\n createMockMcpServer,\n resetTestEnv,\n setTestEnv,\n} from \"./utils.js\";\n\nconst mockManifest = {\n \"skybridge:view:my-view\": {\n file: \"assets/my-view-abc123.js\",\n name: \"my-view\",\n isEntry: true,\n },\n \"skybridge:view:folder-view\": {\n file: \"assets/folder-view-def456.js\",\n name: \"folder-view\",\n isEntry: true,\n },\n \"style.css\": { file: \"style.css\" },\n};\n\n// Mirrors `McpServer.computeViewVersionParam`. Tests recompute the expected\n// hash from the mocked manifest so they don't hardcode digest output.\nfunction expectedVersionParam(viewFile: string, styleFile: string): string {\n const hash = crypto\n .createHash(\"sha256\")\n .update(viewFile)\n .update(\"\\0\")\n .update(styleFile)\n .digest(\"hex\")\n .slice(0, 8);\n return `?v=${hash}`;\n}\n\nconst actual = vi.hoisted(() => require(\"node:fs\"));\n\nvi.mock(\"node:fs\", () => {\n const readFileSyncImpl = (\n path: Parameters<typeof actual.readFileSync>[0],\n ...args: unknown[]\n ): ReturnType<typeof actual.readFileSync> => {\n if (typeof path === \"string\" && path.includes(\"manifest.json\")) {\n return JSON.stringify(mockManifest) as ReturnType<\n typeof actual.readFileSync\n >;\n }\n return actual.readFileSync(path, ...args);\n };\n const readFileSync = vi.fn(readFileSyncImpl) as typeof actual.readFileSync;\n\n return {\n readFileSync,\n default: {\n readFileSync,\n },\n };\n});\n\ndescribe(\"McpServer.registerTool (unified API)\", () => {\n let server: McpServer;\n let mockRegisterResource: MockInstance<McpServer[\"registerResource\"]>;\n let mockRegisterTool: MockInstance;\n\n beforeEach(() => {\n ({ server, mockRegisterResource, mockRegisterTool } =\n createMockMcpServer());\n });\n\n afterEach(() => {\n vi.clearAllMocks();\n resetTestEnv();\n });\n\n it(\"should generate correct HTML for development mode\", async () => {\n setTestEnv({ NODE_ENV: \"development\" });\n\n server.registerTool(\n {\n name: \"my-view\",\n description: \"Test tool\",\n view: {\n component: \"my-view\" as ViewName,\n description: \"Test view\",\n },\n },\n vi.fn(),\n );\n\n const appsSdkResourceCallback = mockRegisterResource.mock\n .calls[0]?.[3] as unknown as (\n uri: URL,\n extra: RequestHandlerExtra<ServerRequest, ServerNotification>,\n ) => Promise<{\n contents: Array<{ uri: URL | string; mimeType: string; text?: string }>;\n }>;\n expect(appsSdkResourceCallback).toBeDefined();\n\n const host = \"localhost:3000\";\n const serverUrl = `http://${host}`;\n const hmrUrl = `ws://${host}`;\n const mockExtra = createMockExtra(host) as unknown as RequestHandlerExtra<\n ServerRequest,\n ServerNotification\n >;\n const result = await appsSdkResourceCallback(\n new URL(\"ui://views/apps-sdk/my-view.html\"),\n mockExtra,\n );\n\n expect(mockRegisterTool).toHaveBeenCalled();\n expect(result).toEqual({\n contents: [\n {\n uri: \"ui://views/apps-sdk/my-view.html\",\n mimeType: \"text/html+skybridge\",\n text: expect.stringContaining('<div id=\"root\"></div>'),\n _meta: {\n \"openai/widgetCSP\": {\n resource_domains: [serverUrl],\n connect_domains: [serverUrl, hmrUrl],\n },\n \"openai/widgetDomain\": serverUrl,\n \"openai/widgetDescription\": \"Test view\",\n },\n },\n ],\n });\n\n expect(result.contents[0]?.text).toContain(\n `${serverUrl}/assets/@react-refresh`,\n );\n expect(result.contents[0]?.text).toContain(`${serverUrl}/@vite/client`);\n expect(result.contents[0]?.text).toContain(\n `${serverUrl}/_skybridge/view/my-view`,\n );\n });\n\n it(\"should generate correct HTML for production mode\", async () => {\n setTestEnv({ NODE_ENV: \"production\" });\n\n server.registerTool(\n {\n name: \"my-view\",\n description: \"Test tool\",\n view: {\n component: \"my-view\" as ViewName,\n description: \"Test view\",\n },\n },\n vi.fn(),\n );\n\n const appsSdkResourceCallback = mockRegisterResource.mock\n .calls[0]?.[3] as unknown as (\n uri: URL,\n extra: RequestHandlerExtra<ServerRequest, ServerNotification>,\n ) => Promise<{\n contents: Array<{ uri: URL | string; mimeType: string; text?: string }>;\n }>;\n expect(appsSdkResourceCallback).toBeDefined();\n\n const host = \"myapp.com\";\n const serverUrl = `https://${host}`;\n const mockExtra = createMockExtra(host) as unknown as RequestHandlerExtra<\n ServerRequest,\n ServerNotification\n >;\n const versionedUri = `ui://views/apps-sdk/my-view.html${expectedVersionParam(\"assets/my-view-abc123.js\", \"style.css\")}`;\n const result = await appsSdkResourceCallback(\n new URL(versionedUri),\n mockExtra,\n );\n\n expect(result).toEqual({\n contents: [\n {\n uri: versionedUri,\n mimeType: \"text/html+skybridge\",\n text: expect.stringContaining('<div id=\"root\"></div>'),\n _meta: {\n \"openai/widgetCSP\": {\n resource_domains: [serverUrl],\n connect_domains: [serverUrl],\n },\n \"openai/widgetDomain\": serverUrl,\n \"openai/widgetDescription\": \"Test view\",\n },\n },\n ],\n });\n\n expect(result.contents[0]?.text).not.toContain(\n `${serverUrl}/assets/@react-refresh`,\n );\n expect(result.contents[0]?.text).not.toContain(`${serverUrl}@vite/client`);\n expect(result.contents[0]?.text).toContain(\n `${serverUrl}/assets/assets/my-view-abc123.js`,\n );\n expect(result.contents[0]?.text).toContain(`${serverUrl}/assets/style.css`);\n });\n\n it(\"should prefer x-alpic-forwarded-url when hashing Claude view domains\", async () => {\n setTestEnv({ NODE_ENV: \"production\" });\n\n server.registerTool(\n {\n name: \"my-view\",\n description: \"Test tool\",\n view: { component: \"my-view\" as ViewName, description: \"Test view\" },\n },\n vi.fn(),\n );\n\n const extAppsResourceCallback = mockRegisterResource.mock\n .calls[1]?.[3] as unknown as (\n uri: URL,\n extra: RequestHandlerExtra<ServerRequest, ServerNotification>,\n ) => Promise<{\n contents: Array<{\n uri: URL | string;\n mimeType: string;\n text?: string;\n _meta?: Record<string, unknown>;\n }>;\n }>;\n expect(extAppsResourceCallback).toBeDefined();\n\n const forwardedUrl =\n \"https://everything-3a2c1264.staging.alpic.live/mcp?foo=bar\";\n const expectedDomain = `${crypto\n .createHash(\"sha256\")\n .update(forwardedUrl)\n .digest(\"hex\")\n .slice(0, 32)}.claudemcpcontent.com`;\n\n const result = await extAppsResourceCallback(\n new URL(\n `ui://views/ext-apps/my-view.html${expectedVersionParam(\"assets/my-view-abc123.js\", \"style.css\")}`,\n ),\n createMockExtra(\"localhost:3000\", {\n headers: {\n \"user-agent\": \"Claude-User\",\n \"x-alpic-forwarded-url\": forwardedUrl,\n },\n url: \"http://localhost:3000/mcp\",\n }) as unknown as RequestHandlerExtra<ServerRequest, ServerNotification>,\n );\n\n expect(result.contents[0]?._meta).toEqual({\n ui: {\n csp: {\n resourceDomains: [\"http://localhost:3000\"],\n connectDomains: [\"http://localhost:3000\"],\n baseUriDomains: [\"http://localhost:3000\"],\n },\n description: \"Test view\",\n domain: expectedDomain,\n },\n });\n });\n\n it(\"should register resources with correct hostType for both apps-sdk and ext-apps\", async () => {\n server.registerTool(\n {\n name: \"my-view\",\n description: \"Test tool\",\n view: {\n component: \"my-view\" as ViewName,\n description: \"Test view\",\n prefersBorder: true,\n },\n },\n vi.fn(),\n );\n\n expect(mockRegisterResource).toHaveBeenCalledTimes(2);\n\n const appsSdkCallback = mockRegisterResource.mock\n .calls[0]?.[3] as unknown as (\n uri: URL,\n extra: RequestHandlerExtra<ServerRequest, ServerNotification>,\n ) => Promise<{\n contents: Array<{ uri: URL | string; mimeType: string; text?: string }>;\n }>;\n const host = \"localhost:3000\";\n const serverUrl = `http://${host}`;\n const hmrUrl = `ws://${host}`;\n\n const appsSdkResult = await appsSdkCallback(\n new URL(\"ui://views/apps-sdk/my-view.html\"),\n createMockExtra(host) as unknown as RequestHandlerExtra<\n ServerRequest,\n ServerNotification\n >,\n );\n\n expect(appsSdkResult).toEqual({\n contents: [\n {\n uri: \"ui://views/apps-sdk/my-view.html\",\n mimeType: \"text/html+skybridge\",\n text: expect.stringContaining('<div id=\"root\"></div>'),\n _meta: {\n \"openai/widgetCSP\": {\n resource_domains: [serverUrl],\n connect_domains: [serverUrl, hmrUrl],\n },\n \"openai/widgetDomain\": serverUrl,\n \"openai/widgetDescription\": \"Test view\",\n \"openai/widgetPrefersBorder\": true,\n },\n },\n ],\n });\n expect(appsSdkResult.contents[0]?.text).toContain(\n 'window.skybridge = { hostType: \"apps-sdk\", serverUrl: \"http://localhost:3000\" };',\n );\n\n const extAppsResourceCallback = mockRegisterResource.mock\n .calls[1]?.[3] as unknown as (\n uri: URL,\n extra: RequestHandlerExtra<ServerRequest, ServerNotification>,\n ) => Promise<{\n contents: Array<{\n uri: URL | string;\n mimeType: string;\n text?: string;\n _meta?: Record<string, unknown>;\n }>;\n }>;\n expect(extAppsResourceCallback).toBeDefined();\n\n const extAppsResult = await extAppsResourceCallback(\n new URL(\"ui://views/ext-apps/my-view.html\"),\n createMockExtra(host) as unknown as RequestHandlerExtra<\n ServerRequest,\n ServerNotification\n >,\n );\n\n expect(extAppsResult).toEqual({\n contents: [\n {\n uri: \"ui://views/ext-apps/my-view.html\",\n mimeType: \"text/html;profile=mcp-app\",\n text: expect.stringContaining('<div id=\"root\"></div>'),\n _meta: {\n ui: {\n csp: {\n resourceDomains: [serverUrl],\n connectDomains: [serverUrl, hmrUrl],\n baseUriDomains: [serverUrl],\n },\n domain: serverUrl,\n description: \"Test view\",\n prefersBorder: true,\n },\n },\n },\n ],\n });\n expect(extAppsResult.contents[0]?.text).toContain(\n 'window.skybridge = { hostType: \"mcp-app\", serverUrl: \"http://localhost:3000\" };',\n );\n });\n\n it(\"should register tool with ui.resourceUri metadata\", async () => {\n server.registerTool(\n {\n name: \"my-view\",\n description: \"Test tool\",\n view: { component: \"my-view\" as ViewName, description: \"Test view\" },\n },\n vi.fn(),\n );\n\n expect(mockRegisterTool).toHaveBeenCalledTimes(1);\n\n const toolCallArgs = mockRegisterTool.mock.calls[0];\n const toolConfig = toolCallArgs?.[1] as { _meta?: Record<string, unknown> };\n\n expect(toolConfig._meta).toHaveProperty(\"ui\");\n expect(toolConfig._meta?.ui).toEqual({\n resourceUri: \"ui://views/ext-apps/my-view.html\",\n });\n });\n\n it(\"should register tool with openai/outputTemplate when apps-sdk only\", async () => {\n server.registerTool(\n {\n name: \"my-view\",\n description: \"Test tool\",\n view: {\n component: \"my-view\" as ViewName,\n description: \"Test view\",\n hosts: [\"apps-sdk\"],\n },\n },\n vi.fn(),\n );\n\n expect(mockRegisterTool).toHaveBeenCalledTimes(1);\n\n const toolCallArgs = mockRegisterTool.mock.calls[0];\n const toolConfig = toolCallArgs?.[1] as { _meta?: Record<string, unknown> };\n\n expect(toolConfig._meta).not.toHaveProperty(\"ui\");\n expect(toolConfig._meta?.[\"openai/outputTemplate\"]).toBe(\n \"ui://views/apps-sdk/my-view.html\",\n );\n });\n\n it(\"should not version view URIs in development\", () => {\n server.registerTool(\n {\n name: \"my-view\",\n description: \"Test tool\",\n view: { component: \"my-view\" as ViewName, description: \"Test view\" },\n },\n vi.fn(),\n );\n\n const toolConfig = mockRegisterTool.mock.calls[0]?.[1] as {\n _meta?: Record<string, unknown> & { ui?: { resourceUri?: string } };\n };\n\n expect(toolConfig._meta?.[\"openai/outputTemplate\"]).toBe(\n \"ui://views/apps-sdk/my-view.html\",\n );\n expect(toolConfig._meta?.ui?.resourceUri).toBe(\n \"ui://views/ext-apps/my-view.html\",\n );\n // The URI registered with the resource handler must match the URI in\n // outputTemplate exactly so the SDK can resolve `resources/read` requests.\n expect(mockRegisterResource.mock.calls[0]?.[1]).toBe(\n \"ui://views/apps-sdk/my-view.html\",\n );\n expect(mockRegisterResource.mock.calls[1]?.[1]).toBe(\n \"ui://views/ext-apps/my-view.html\",\n );\n });\n\n it(\"should append a stable content hash to view URIs in production\", () => {\n setTestEnv({ NODE_ENV: \"production\" });\n\n server.registerTool(\n {\n name: \"my-view\",\n description: \"Test tool\",\n view: { component: \"my-view\" as ViewName, description: \"Test view\" },\n },\n vi.fn(),\n );\n\n const expected = expectedVersionParam(\n \"assets/my-view-abc123.js\",\n \"style.css\",\n );\n const toolConfig = mockRegisterTool.mock.calls[0]?.[1] as {\n _meta?: Record<string, unknown> & { ui?: { resourceUri?: string } };\n };\n\n expect(toolConfig._meta?.[\"openai/outputTemplate\"]).toBe(\n `ui://views/apps-sdk/my-view.html${expected}`,\n );\n expect(toolConfig._meta?.ui?.resourceUri).toBe(\n `ui://views/ext-apps/my-view.html${expected}`,\n );\n expect(mockRegisterResource.mock.calls[0]?.[1]).toBe(\n `ui://views/apps-sdk/my-view.html${expected}`,\n );\n expect(mockRegisterResource.mock.calls[1]?.[1]).toBe(\n `ui://views/ext-apps/my-view.html${expected}`,\n );\n });\n\n it(\"should produce different version params for views with different bundles\", () => {\n setTestEnv({ NODE_ENV: \"production\" });\n\n server.registerTool(\n {\n name: \"my-view\",\n description: \"First tool\",\n view: { component: \"my-view\" as ViewName },\n },\n vi.fn(),\n );\n server.registerTool(\n {\n name: \"folder-view\",\n description: \"Second tool\",\n view: { component: \"folder-view\" as ViewName },\n },\n vi.fn(),\n );\n\n const myviewTemplate = (\n mockRegisterTool.mock.calls[0]?.[1] as { _meta?: Record<string, unknown> }\n )._meta?.[\"openai/outputTemplate\"];\n const folderviewTemplate = (\n mockRegisterTool.mock.calls[1]?.[1] as { _meta?: Record<string, unknown> }\n )._meta?.[\"openai/outputTemplate\"];\n\n expect(myviewTemplate).not.toEqual(folderviewTemplate);\n expect(myviewTemplate).toMatch(/\\?v=[0-9a-f]{8}$/);\n expect(folderviewTemplate).toMatch(/\\?v=[0-9a-f]{8}$/);\n });\n\n it(\"should fall back to bare URI in production when manifest is missing\", () => {\n setTestEnv({ NODE_ENV: \"production\" });\n\n server.registerTool(\n {\n name: \"unknown-view\",\n description: \"Test tool\",\n view: { component: \"unknown-view\" as ViewName },\n },\n vi.fn(),\n );\n\n const toolConfig = mockRegisterTool.mock.calls[0]?.[1] as {\n _meta?: Record<string, unknown>;\n };\n expect(toolConfig._meta?.[\"openai/outputTemplate\"]).toBe(\n \"ui://views/apps-sdk/unknown-view.html\",\n );\n });\n\n it(\"should register tool with ui.resourceUri only when mcp-app only\", async () => {\n server.registerTool(\n {\n name: \"my-view\",\n description: \"Test tool\",\n view: {\n component: \"my-view\" as ViewName,\n description: \"Test view\",\n hosts: [\"mcp-app\"],\n },\n },\n vi.fn(),\n );\n\n expect(mockRegisterTool).toHaveBeenCalledTimes(1);\n\n const toolCallArgs = mockRegisterTool.mock.calls[0];\n const toolConfig = toolCallArgs?.[1] as { _meta?: Record<string, unknown> };\n\n expect(toolConfig._meta).toHaveProperty(\"ui\");\n expect(toolConfig._meta?.ui).toEqual({\n resourceUri: \"ui://views/ext-apps/my-view.html\",\n });\n expect(toolConfig._meta?.[\"openai/outputTemplate\"]).toBeUndefined();\n });\n\n it(\"should inject viewUUID into _meta of tool callback results\", async () => {\n const mockToolCallback = vi.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"result\" }],\n structuredContent: { data: \"test\" },\n });\n\n server.registerTool(\n {\n name: \"my-view\",\n description: \"Test tool\",\n view: { component: \"my-view\" as ViewName, description: \"Test view\" },\n },\n mockToolCallback,\n );\n\n const wrappedCallback = mockRegisterTool.mock.calls[0]?.[2] as (\n ...args: unknown[]\n ) => Promise<{ _meta?: Record<string, unknown> }>;\n expect(wrappedCallback).toBeDefined();\n\n const result = await wrappedCallback({}, {});\n\n expect(result._meta).toBeDefined();\n expect(result._meta?.viewUUID).toBeDefined();\n expect(typeof result._meta?.viewUUID).toBe(\"string\");\n expect(result._meta?.viewUUID).toMatch(\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,\n );\n });\n\n it(\"should preserve existing _meta when injecting viewUUID\", async () => {\n const mockToolCallback = vi.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"result\" }],\n structuredContent: { data: \"test\" },\n _meta: { requestId: \"req-123\", cached: true },\n });\n\n server.registerTool(\n {\n name: \"my-view\",\n description: \"Test tool\",\n view: { component: \"my-view\" as ViewName, description: \"Test view\" },\n },\n mockToolCallback,\n );\n\n const wrappedCallback = mockRegisterTool.mock.calls[0]?.[2] as (\n ...args: unknown[]\n ) => Promise<{ _meta?: Record<string, unknown> }>;\n const result = await wrappedCallback({}, {});\n\n expect(result._meta?.requestId).toBe(\"req-123\");\n expect(result._meta?.cached).toBe(true);\n expect(result._meta?.viewUUID).toBeDefined();\n });\n\n it(\"should generate unique viewUUIDs across calls\", async () => {\n const mockToolCallback = vi.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"result\" }],\n structuredContent: {},\n });\n\n server.registerTool(\n {\n name: \"my-view\",\n description: \"Test tool\",\n view: { component: \"my-view\" as ViewName, description: \"Test view\" },\n },\n mockToolCallback,\n );\n\n const wrappedCallback = mockRegisterTool.mock.calls[0]?.[2] as (\n ...args: unknown[]\n ) => Promise<{ _meta?: Record<string, unknown> }>;\n const result1 = await wrappedCallback({}, {});\n const result2 = await wrappedCallback({}, {});\n\n expect(result1._meta?.viewUUID).not.toBe(result2._meta?.viewUUID);\n });\n\n it(\"should enforce one-tool-per-view constraint\", () => {\n server.registerTool(\n {\n name: \"shake\",\n description: \"First tool\",\n view: { component: \"magic-8-ball\" as ViewName },\n },\n vi.fn(),\n );\n\n expect(() => {\n server.registerTool(\n {\n name: \"shake-v2\",\n description: \"Second tool\",\n view: { component: \"magic-8-ball\" as ViewName },\n },\n vi.fn(),\n );\n }).toThrow(\n 'skybridge: view \"magic-8-ball\" is already used by tool \"shake\"',\n );\n });\n\n it(\"should normalize string content to ContentBlock array\", async () => {\n const mockToolCallback = vi.fn().mockResolvedValue({\n content: \"Hello world\",\n structuredContent: {},\n });\n\n server.registerTool(\n {\n name: \"string-content\",\n description: \"Test tool\",\n view: { component: \"string-content\" as ViewName },\n },\n mockToolCallback,\n );\n\n const wrappedCallback = mockRegisterTool.mock.calls[0]?.[2] as (\n ...args: unknown[]\n ) => Promise<{ content: unknown[] }>;\n const result = await wrappedCallback({}, {});\n\n expect(result.content).toEqual([{ type: \"text\", text: \"Hello world\" }]);\n });\n\n it(\"should normalize single ContentBlock to array\", async () => {\n const mockToolCallback = vi.fn().mockResolvedValue({\n content: { type: \"text\", text: \"Single block\" },\n structuredContent: {},\n });\n\n server.registerTool(\n {\n name: \"single-block\",\n description: \"Test tool\",\n view: { component: \"single-block\" as ViewName },\n },\n mockToolCallback,\n );\n\n const wrappedCallback = mockRegisterTool.mock.calls[0]?.[2] as (\n ...args: unknown[]\n ) => Promise<{ content: unknown[] }>;\n const result = await wrappedCallback({}, {});\n\n expect(result.content).toEqual([{ type: \"text\", text: \"Single block\" }]);\n });\n\n it(\"should pass through ContentBlock array unchanged\", async () => {\n const blocks = [\n { type: \"text\", text: \"A\" },\n { type: \"text\", text: \"B\" },\n ];\n const mockToolCallback = vi.fn().mockResolvedValue({\n content: blocks,\n structuredContent: {},\n });\n\n server.registerTool(\n {\n name: \"array-content\",\n description: \"Test tool\",\n view: { component: \"array-content\" as ViewName },\n },\n mockToolCallback,\n );\n\n const wrappedCallback = mockRegisterTool.mock.calls[0]?.[2] as (\n ...args: unknown[]\n ) => Promise<{ content: unknown[] }>;\n const result = await wrappedCallback({}, {});\n\n expect(result.content).toEqual(blocks);\n });\n\n it(\"should register tool without view (no resource registration)\", () => {\n server.registerTool(\n {\n name: \"plain-tool\",\n description: \"No view\",\n },\n vi.fn(),\n );\n\n expect(mockRegisterResource).not.toHaveBeenCalled();\n expect(mockRegisterTool).toHaveBeenCalledTimes(1);\n });\n\n it(\"should apply view.csp fields to resource _meta\", async () => {\n server.registerTool(\n {\n name: \"csp-tool\",\n description: \"Test tool\",\n view: {\n component: \"csp-tool\" as ViewName,\n description: \"Test view\",\n csp: {\n connectDomains: [\"https://api.example.com\"],\n resourceDomains: [\"https://cdn.example.com\"],\n },\n },\n },\n vi.fn(),\n );\n\n const appsSdkCallback = mockRegisterResource.mock\n .calls[0]?.[3] as unknown as (\n uri: URL,\n extra: RequestHandlerExtra<ServerRequest, ServerNotification>,\n ) => Promise<{\n contents: Array<{\n uri: URL | string;\n mimeType: string;\n _meta?: Record<string, unknown>;\n }>;\n }>;\n\n const host = \"localhost:3000\";\n const serverUrl = `http://${host}`;\n const hmrUrl = `ws://${host}`;\n const result = await appsSdkCallback(\n new URL(\"ui://views/apps-sdk/csp-tool.html\"),\n createMockExtra(host) as unknown as RequestHandlerExtra<\n ServerRequest,\n ServerNotification\n >,\n );\n\n const meta = result.contents[0]?._meta as Record<string, unknown>;\n expect(meta[\"openai/widgetCSP\"]).toEqual({\n resource_domains: [serverUrl, \"https://cdn.example.com\"],\n connect_domains: [serverUrl, hmrUrl, \"https://api.example.com\"],\n });\n });\n\n it(\"should let view._meta override framework-computed keys\", async () => {\n server.registerTool(\n {\n name: \"override-tool\",\n description: \"Test tool\",\n view: {\n component: \"override-tool\" as ViewName,\n description: \"Test view\",\n csp: { connectDomains: [\"https://api.x.com\"] },\n _meta: {\n \"openai/widgetCSP\": {\n connect_domains: [\"https://api.y.com\"],\n },\n },\n },\n },\n vi.fn(),\n );\n\n const appsSdkCallback = mockRegisterResource.mock\n .calls[0]?.[3] as unknown as (\n uri: URL,\n extra: RequestHandlerExtra<ServerRequest, ServerNotification>,\n ) => Promise<{\n contents: Array<{\n uri: URL | string;\n mimeType: string;\n _meta?: Record<string, unknown>;\n }>;\n }>;\n\n const result = await appsSdkCallback(\n new URL(\"ui://views/apps-sdk/override-tool.html\"),\n createMockExtra(\"localhost:3000\") as unknown as RequestHandlerExtra<\n ServerRequest,\n ServerNotification\n >,\n );\n\n const meta = result.contents[0]?._meta as Record<string, unknown>;\n expect(meta[\"openai/widgetCSP\"]).toEqual({\n connect_domains: [\"https://api.y.com\"],\n });\n });\n\n it(\"should pass user _meta keys through to tool config\", () => {\n server.registerTool(\n {\n name: \"meta-tool\",\n description: \"Test tool\",\n _meta: {\n \"openai/widgetAccessible\": true,\n \"openai/toolInvocation/invoking\": \"Loading...\",\n \"acme.com/category\": \"utility\",\n },\n },\n vi.fn(),\n );\n\n const toolCallArgs = mockRegisterTool.mock.calls[0];\n const toolConfig = toolCallArgs?.[1] as { _meta?: Record<string, unknown> };\n\n expect(toolConfig._meta?.[\"openai/widgetAccessible\"]).toBe(true);\n expect(toolConfig._meta?.[\"openai/toolInvocation/invoking\"]).toBe(\n \"Loading...\",\n );\n expect(toolConfig._meta?.[\"acme.com/category\"]).toBe(\"utility\");\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ export declare const VERSION: string;
@@ -0,0 +1,3 @@
1
+ import pkg from "../package.json" with { type: "json" };
2
+ export const VERSION = pkg.version;
3
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAExD,MAAM,CAAC,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC","sourcesContent":["import pkg from \"../package.json\" with { type: \"json\" };\n\nexport const VERSION: string = pkg.version;\n"]}
@@ -1,22 +1,24 @@
1
- import type { Adaptor, CallToolResponse, DisplayMode, HostContext, HostContextStore, RequestModalOptions, SetWidgetStateAction } from "../types.js";
1
+ import type { Adaptor, CallToolResponse, FileMetadata, HostContext, HostContextStore, OpenExternalOptions, RequestDisplayMode, RequestModalOptions, SendFollowUpMessageOptions, SetViewStateAction, UploadFileOptions } 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
- requestDisplayMode: (mode: DisplayMode) => Promise<{
9
- mode: DisplayMode;
8
+ requestDisplayMode: (mode: RequestDisplayMode) => Promise<{
9
+ mode: RequestDisplayMode;
10
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>;
11
+ sendFollowUpMessage: (prompt: string, options?: SendFollowUpMessageOptions) => Promise<void>;
12
+ openExternal(href: string, options?: OpenExternalOptions): void;
13
+ setViewState: (stateOrUpdater: SetViewStateAction) => Promise<void>;
14
+ uploadFile: (file: File, options?: UploadFileOptions) => Promise<FileMetadata>;
15
15
  getFileDownloadUrl: (file: {
16
16
  fileId: string;
17
17
  }) => Promise<{
18
18
  downloadUrl: string;
19
19
  }>;
20
+ selectFiles: () => Promise<FileMetadata[]>;
21
+ private trackFileIds;
20
22
  openModal(options: RequestModalOptions): Promise<void>;
21
23
  setOpenInAppUrl(href: string): Promise<void>;
22
24
  }
@@ -12,6 +12,18 @@ export class AppsSdkAdaptor {
12
12
  }
13
13
  getHostContextStore(key) {
14
14
  const bridge = AppsSdkBridge.getInstance();
15
+ if (key === "viewState") {
16
+ return {
17
+ subscribe: bridge.subscribe("widgetState"),
18
+ getSnapshot: () => bridge.getSnapshot("widgetState")?.modelContent ?? null,
19
+ };
20
+ }
21
+ if (key === "display") {
22
+ return {
23
+ subscribe: bridge.subscribe("view"),
24
+ getSnapshot: () => bridge.getSnapshot("view"),
25
+ };
26
+ }
15
27
  return {
16
28
  subscribe: bridge.subscribe(key),
17
29
  getSnapshot: () => bridge.getSnapshot(key),
@@ -23,24 +35,53 @@ export class AppsSdkAdaptor {
23
35
  requestDisplayMode = (mode) => {
24
36
  return window.openai.requestDisplayMode({ mode });
25
37
  };
26
- sendFollowUpMessage = (prompt) => {
27
- return window.openai.sendFollowUpMessage({ prompt });
38
+ sendFollowUpMessage = (prompt, options) => {
39
+ return window.openai.sendFollowUpMessage({
40
+ prompt,
41
+ scrollToBottom: options?.scrollToBottom,
42
+ });
28
43
  };
29
- openExternal(href) {
30
- window.openai.openExternal({ href });
44
+ openExternal(href, options = {}) {
45
+ window.openai.openExternal({ href, ...options });
31
46
  }
32
- setWidgetState = (stateOrUpdater) => {
33
- const newState = typeof stateOrUpdater === "function"
34
- ? stateOrUpdater(window.openai.widgetState)
47
+ setViewState = (stateOrUpdater) => {
48
+ const modelContent = typeof stateOrUpdater === "function"
49
+ ? stateOrUpdater(window.openai.widgetState?.modelContent ?? null)
35
50
  : stateOrUpdater;
36
- return window.openai.setWidgetState(newState);
51
+ return window.openai.setWidgetState({
52
+ privateContent: {},
53
+ ...window.openai.widgetState,
54
+ modelContent,
55
+ });
37
56
  };
38
- uploadFile = (file) => {
39
- return window.openai.uploadFile(file);
57
+ uploadFile = async (file, options) => {
58
+ const metadata = await window.openai.uploadFile(file, options);
59
+ await this.trackFileIds(metadata.fileId);
60
+ return metadata;
40
61
  };
41
62
  getFileDownloadUrl = (file) => {
42
63
  return window.openai.getFileDownloadUrl(file);
43
64
  };
65
+ selectFiles = async () => {
66
+ if (!window.openai.selectFiles) {
67
+ throw new Error("selectFiles is not supported by the current host version.");
68
+ }
69
+ const files = await window.openai.selectFiles();
70
+ if (files.length > 0) {
71
+ await this.trackFileIds(...files.map((f) => f.fileId));
72
+ }
73
+ return files;
74
+ };
75
+ async trackFileIds(...fileIds) {
76
+ const state = window.openai.widgetState
77
+ ? { ...window.openai.widgetState }
78
+ : { modelContent: {}, privateContent: {} };
79
+ if (!state.imageIds) {
80
+ state.imageIds = [];
81
+ }
82
+ state.imageIds.push(...fileIds);
83
+ await window.openai.setWidgetState(state);
84
+ }
44
85
  openModal(options) {
45
86
  return window.openai.requestModal(options);
46
87
  }
@@ -49,15 +90,6 @@ export class AppsSdkAdaptor {
49
90
  if (!href) {
50
91
  throw new Error("The href parameter is required.");
51
92
  }
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
93
  return window.openai.setOpenInAppUrl({ href });
62
94
  }
63
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"adaptor.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk/adaptor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adaptor.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk/adaptor.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Adaptor,\n CallToolResponse,\n FileMetadata,\n HostContext,\n HostContextStore,\n OpenExternalOptions,\n RequestDisplayMode,\n RequestModalOptions,\n SendFollowUpMessageOptions,\n SetViewStateAction,\n UploadFileOptions,\n} from \"../types.js\";\nimport { AppsSdkBridge } from \"./bridge.js\";\nimport type { AppsSdkWidgetState } from \"./types.js\";\n\nexport class AppsSdkAdaptor implements Adaptor {\n private static instance: AppsSdkAdaptor | null = null;\n\n public static getInstance(): AppsSdkAdaptor {\n if (!AppsSdkAdaptor.instance) {\n AppsSdkAdaptor.instance = new AppsSdkAdaptor();\n }\n return AppsSdkAdaptor.instance;\n }\n\n public static resetInstance(): void {\n AppsSdkAdaptor.instance = null;\n }\n\n public getHostContextStore<K extends keyof HostContext>(\n key: K,\n ): HostContextStore<K> {\n const bridge = AppsSdkBridge.getInstance();\n\n if (key === \"viewState\") {\n return {\n subscribe: bridge.subscribe(\"widgetState\"),\n getSnapshot: () =>\n bridge.getSnapshot(\"widgetState\")?.modelContent ?? null,\n } as HostContextStore<K>;\n }\n\n if (key === \"display\") {\n return {\n subscribe: bridge.subscribe(\"view\"),\n getSnapshot: () => bridge.getSnapshot(\"view\"),\n } as HostContextStore<K>;\n }\n\n return {\n subscribe: bridge.subscribe(key),\n getSnapshot: () => bridge.getSnapshot(key),\n } as HostContextStore<K>;\n }\n\n public callTool = async <\n ToolArgs extends Record<string, unknown> | null = null,\n ToolResponse extends CallToolResponse = CallToolResponse,\n >(\n name: string,\n args: ToolArgs,\n ): Promise<ToolResponse> => {\n return window.openai.callTool<ToolArgs, ToolResponse>(name, args);\n };\n\n public requestDisplayMode = (\n mode: RequestDisplayMode,\n ): Promise<{ mode: RequestDisplayMode }> => {\n return window.openai.requestDisplayMode({ mode });\n };\n\n public sendFollowUpMessage = (\n prompt: string,\n options?: SendFollowUpMessageOptions,\n ): Promise<void> => {\n return window.openai.sendFollowUpMessage({\n prompt,\n scrollToBottom: options?.scrollToBottom,\n });\n };\n\n public openExternal(href: string, options: OpenExternalOptions = {}): void {\n window.openai.openExternal({ href, ...options });\n }\n\n public setViewState = (stateOrUpdater: SetViewStateAction): Promise<void> => {\n const modelContent =\n typeof stateOrUpdater === \"function\"\n ? stateOrUpdater(window.openai.widgetState?.modelContent ?? null)\n : stateOrUpdater;\n\n return window.openai.setWidgetState({\n privateContent: {},\n ...window.openai.widgetState,\n modelContent,\n });\n };\n\n public uploadFile = async (file: File, options?: UploadFileOptions) => {\n const metadata = await window.openai.uploadFile(file, options);\n await this.trackFileIds(metadata.fileId);\n return metadata;\n };\n\n public getFileDownloadUrl = (file: { fileId: string }) => {\n return window.openai.getFileDownloadUrl(file);\n };\n\n public selectFiles = async (): Promise<FileMetadata[]> => {\n if (!window.openai.selectFiles) {\n throw new Error(\n \"selectFiles is not supported by the current host version.\",\n );\n }\n const files = await window.openai.selectFiles();\n if (files.length > 0) {\n await this.trackFileIds(...files.map((f) => f.fileId));\n }\n return files;\n };\n\n private async trackFileIds(...fileIds: string[]): Promise<void> {\n const state: AppsSdkWidgetState = window.openai.widgetState\n ? { ...window.openai.widgetState }\n : { modelContent: {}, privateContent: {} };\n if (!state.imageIds) {\n state.imageIds = [];\n }\n state.imageIds.push(...fileIds);\n await window.openai.setWidgetState(state);\n }\n\n public openModal(options: RequestModalOptions) {\n return window.openai.requestModal(options);\n }\n\n public setOpenInAppUrl(href: string): Promise<void> {\n href = href.trim();\n\n if (!href) {\n throw new Error(\"The href parameter is required.\");\n }\n\n return window.openai.setOpenInAppUrl({ href });\n }\n}\n"]}
@@ -6,5 +6,5 @@ export declare class AppsSdkBridge implements Bridge<AppsSdkContext> {
6
6
  static resetInstance(): void;
7
7
  subscribe(key: keyof AppsSdkContext): Subscribe;
8
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];
9
+ getSnapshot: <K extends keyof AppsSdkContext>(key: K) => (import("./types.js").AppsSdkMethods<import("./types.js").AppsSdkWidgetState> & AppsSdkContext<Record<never, unknown>, import("../../types.js").UnknownObject, import("../../types.js").UnknownObject, import("./types.js").AppsSdkWidgetState>)[K];
10
10
  }
@@ -1 +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"}
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","sourcesContent":["import type { Bridge, Subscribe } from \"../types.js\";\nimport {\n type AppsSdkContext,\n SET_GLOBALS_EVENT_TYPE,\n type SetGlobalsEvent,\n} from \"./types.js\";\n\nexport class AppsSdkBridge implements Bridge<AppsSdkContext> {\n private static instance: AppsSdkBridge | null = null;\n\n public static getInstance(): AppsSdkBridge {\n if (\n window.skybridge.hostType !== \"apps-sdk\" ||\n window.openai === undefined\n ) {\n throw new Error(\n \"Apps SDK Bridge can only be used in the apps-sdk runtime\",\n );\n }\n if (AppsSdkBridge.instance === null) {\n AppsSdkBridge.instance = new AppsSdkBridge();\n }\n return AppsSdkBridge.instance;\n }\n\n public static resetInstance(): void {\n if (AppsSdkBridge.instance) {\n AppsSdkBridge.instance = null;\n }\n }\n\n public subscribe(key: keyof AppsSdkContext): Subscribe;\n public subscribe(keys: readonly (keyof AppsSdkContext)[]): Subscribe;\n public subscribe(\n keyOrKeys: keyof AppsSdkContext | readonly (keyof AppsSdkContext)[],\n ): Subscribe {\n const keys: readonly (keyof AppsSdkContext)[] = Array.isArray(keyOrKeys)\n ? keyOrKeys\n : [keyOrKeys];\n return (onChange: () => void) => {\n const handleSetGlobal = (event: SetGlobalsEvent) => {\n const hasRelevantChange = keys.some(\n (key) => event.detail.globals[key] !== undefined,\n );\n if (!hasRelevantChange) {\n return;\n }\n onChange();\n };\n\n window.addEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal, {\n passive: true,\n });\n\n return () => {\n window.removeEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal);\n };\n };\n }\n\n public getSnapshot = <K extends keyof AppsSdkContext>(key: K) => {\n if (window.openai === undefined) {\n throw new Error(\n `window.openai is not available. Make sure you're calling the hook requiring ${key} within the OpenAI iFrame skybridge runtime.`,\n );\n }\n\n return window.openai[key];\n };\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  export { AppsSdkAdaptor } from "./adaptor.js";
2
2
  export { AppsSdkBridge } from "./bridge.js";
3
- export type { AppsSdkContext, AppsSdkMethods, ToolResponseEvent, } from "./types.js";
3
+ export type { AppsSdkContext, AppsSdkMethods, AppsSdkWidgetState, ToolResponseEvent, } from "./types.js";
4
4
  export { SET_GLOBALS_EVENT_TYPE, SetGlobalsEvent, TOOL_RESPONSE_EVENT_TYPE, } from "./types.js";
5
5
  export { useAppsSdkContext } from "./use-apps-sdk-context.js";
@@ -1 +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
+ {"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","sourcesContent":["export { AppsSdkAdaptor } from \"./adaptor.js\";\nexport { AppsSdkBridge } from \"./bridge.js\";\nexport type {\n AppsSdkContext,\n AppsSdkMethods,\n AppsSdkWidgetState,\n ToolResponseEvent,\n} from \"./types.js\";\nexport {\n SET_GLOBALS_EVENT_TYPE,\n SetGlobalsEvent,\n TOOL_RESPONSE_EVENT_TYPE,\n} from \"./types.js\";\nexport { useAppsSdkContext } from \"./use-apps-sdk-context.js\";\n"]}
@@ -1,7 +1,12 @@
1
1
  import type { UnknownObject } from "../../types.js";
2
- import type { CallToolArgs, CallToolResponse, FileMetadata, RequestModalOptions } from "../types.js";
2
+ import type { CallToolArgs, CallToolResponse, FileMetadata, RequestModalOptions, UploadFileOptions } from "../types.js";
3
3
  type DisplayMode = "pip" | "inline" | "fullscreen" | "modal";
4
- type WidgetState = UnknownObject;
4
+ type RequestDisplayMode = Exclude<DisplayMode, "modal">;
5
+ export type AppsSdkWidgetState = {
6
+ modelContent: Record<string, unknown>;
7
+ privateContent: Record<string, unknown>;
8
+ imageIds?: string[];
9
+ };
5
10
  export declare const TOOL_RESPONSE_EVENT_TYPE = "openai:tool_response";
6
11
  export declare class ToolResponseEvent extends CustomEvent<{
7
12
  tool: {
@@ -13,13 +18,13 @@ export declare class ToolResponseEvent extends CustomEvent<{
13
18
  }
14
19
  declare global {
15
20
  interface Window {
16
- openai: AppsSdkMethods<WidgetState> & AppsSdkContext;
21
+ openai: AppsSdkMethods & AppsSdkContext;
17
22
  }
18
23
  interface WindowEventMap {
19
24
  [SET_GLOBALS_EVENT_TYPE]: SetGlobalsEvent;
20
25
  }
21
26
  }
22
- export type AppsSdkContext<ToolInput extends UnknownObject = Record<never, unknown>, ToolOutput extends UnknownObject = UnknownObject, ToolResponseMetadata extends UnknownObject = UnknownObject, WidgetState extends UnknownObject = UnknownObject> = {
27
+ export type AppsSdkContext<ToolInput extends UnknownObject = Record<never, unknown>, ToolOutput extends UnknownObject = UnknownObject, ToolResponseMetadata extends UnknownObject = UnknownObject, WS extends AppsSdkWidgetState = AppsSdkWidgetState> = {
23
28
  theme: Theme;
24
29
  userAgent: UserAgent;
25
30
  locale: string;
@@ -32,44 +37,55 @@ export type AppsSdkContext<ToolInput extends UnknownObject = Record<never, unkno
32
37
  text: string;
33
38
  } | null;
34
39
  toolResponseMetadata: ToolResponseMetadata | null;
35
- widgetState: WidgetState | null;
40
+ widgetState: WS | null;
36
41
  };
37
- export type AppsSdkMethods<WidgetState extends UnknownObject = UnknownObject> = {
42
+ export type AppsSdkMethods<WS extends AppsSdkWidgetState = AppsSdkWidgetState> = {
38
43
  /** Calls a tool on your MCP. Returns the full response. */
39
44
  callTool: <ToolArgs extends CallToolArgs = null, ToolResponse extends CallToolResponse = CallToolResponse>(name: string, args: ToolArgs) => Promise<ToolResponse>;
40
- /** Triggers a followup turn in the ChatGPT conversation */
45
+ /**
46
+ * Triggers a followup turn in the ChatGPT conversation
47
+ * scrollToBottom is optional, defaults to true, and can be
48
+ * set to false to prevent auto-scroll.
49
+ */
41
50
  sendFollowUpMessage: (args: {
42
51
  prompt: string;
52
+ scrollToBottom?: boolean;
43
53
  }) => Promise<void>;
44
54
  /** Opens an external link, redirects web page or mobile app */
45
55
  openExternal(args: {
46
56
  href: string;
57
+ redirectUrl?: false;
47
58
  }): void;
48
59
  /** For transitioning an app from inline to fullscreen or pip */
49
60
  requestDisplayMode: (args: {
50
- mode: DisplayMode;
61
+ mode: RequestDisplayMode;
51
62
  }) => Promise<{
52
63
  /**
53
64
  * The granted display mode. The host may reject the request.
54
65
  * For mobile, PiP is always coerced to fullscreen.
55
66
  */
56
- mode: DisplayMode;
67
+ mode: RequestDisplayMode;
57
68
  }>;
58
69
  /**
59
70
  * Sets the widget state.
60
71
  * This state is persisted across widget renders.
61
72
  */
62
- setWidgetState: (state: WidgetState) => Promise<void>;
73
+ setWidgetState: (state: WS) => Promise<void>;
63
74
  /**
64
75
  * Opens a modal portaled outside of the widget iFrame.
65
76
  * This ensures the modal is correctly displayed and not limited to the widget's area.
66
77
  */
67
78
  requestModal: (args: RequestModalOptions) => Promise<void>;
68
- /** Uploads a new file to the host */
69
- uploadFile: (file: File) => Promise<FileMetadata>;
79
+ /** Uploads a new file to the host. Pass `{ library: true }` to also save to the user's ChatGPT file library. */
80
+ uploadFile: (file: File, options?: UploadFileOptions) => Promise<FileMetadata>;
81
+ /**
82
+ * Opens ChatGPT's file library picker and returns app-authorized files.
83
+ * Feature-detect before using: this method may not be available on all host versions.
84
+ */
85
+ selectFiles?: () => Promise<FileMetadata[]>;
70
86
  /**
71
- * Downloads a file from the host that was previously uploaded.
72
- * Only files uploaded by the same connector instance can be downloaded.
87
+ * Downloads a file from the host. Works for files uploaded by the widget,
88
+ * files selected via selectFiles(), or files provided via tool/file params.
73
89
  */
74
90
  getFileDownloadUrl: (file: FileMetadata) => Promise<{
75
91
  downloadUrl: string;
@@ -1 +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
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk/types.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AAC/D,MAAM,OAAO,iBAAkB,SAAQ,WAErC;IACkB,IAAI,GAAG,wBAAwB,CAAC;CACnD;AA2GD,sDAAsD;AACtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAC3D,MAAM,OAAO,eAAgB,SAAQ,WAEnC;IACkB,IAAI,GAAG,sBAAsB,CAAC;CACjD","sourcesContent":["import type { UnknownObject } from \"../../types.js\";\nimport type {\n CallToolArgs,\n CallToolResponse,\n FileMetadata,\n RequestModalOptions,\n UploadFileOptions,\n} from \"../types.js\";\n\ntype DisplayMode = \"pip\" | \"inline\" | \"fullscreen\" | \"modal\";\ntype RequestDisplayMode = Exclude<DisplayMode, \"modal\">;\n\nexport type AppsSdkWidgetState = {\n modelContent: Record<string, unknown>;\n privateContent: Record<string, unknown>;\n imageIds?: string[];\n};\n\nexport const TOOL_RESPONSE_EVENT_TYPE = \"openai:tool_response\";\nexport class ToolResponseEvent extends CustomEvent<{\n tool: { name: string; args: UnknownObject };\n}> {\n override readonly type = TOOL_RESPONSE_EVENT_TYPE;\n}\n\ndeclare global {\n interface Window {\n openai: AppsSdkMethods & AppsSdkContext;\n }\n\n interface WindowEventMap {\n [SET_GLOBALS_EVENT_TYPE]: SetGlobalsEvent;\n }\n}\n\nexport type AppsSdkContext<\n ToolInput extends UnknownObject = Record<never, unknown>,\n ToolOutput extends UnknownObject = UnknownObject,\n ToolResponseMetadata extends UnknownObject = UnknownObject,\n WS extends AppsSdkWidgetState = AppsSdkWidgetState,\n> = {\n theme: Theme;\n userAgent: UserAgent;\n locale: string;\n\n // layout\n maxHeight: number | undefined;\n displayMode: DisplayMode;\n safeArea: SafeArea;\n view: View;\n\n // state\n toolInput: ToolInput;\n toolOutput: ToolOutput | { text: string } | null;\n toolResponseMetadata: ToolResponseMetadata | null;\n widgetState: WS | null;\n};\n\nexport type AppsSdkMethods<WS extends AppsSdkWidgetState = AppsSdkWidgetState> =\n {\n /** Calls a tool on your MCP. Returns the full response. */\n callTool: <\n ToolArgs extends CallToolArgs = null,\n ToolResponse extends CallToolResponse = CallToolResponse,\n >(\n name: string,\n args: ToolArgs,\n ) => Promise<ToolResponse>;\n\n /**\n * Triggers a followup turn in the ChatGPT conversation\n * scrollToBottom is optional, defaults to true, and can be\n * set to false to prevent auto-scroll.\n */\n sendFollowUpMessage: (args: {\n prompt: string;\n scrollToBottom?: boolean;\n }) => Promise<void>;\n\n /** Opens an external link, redirects web page or mobile app */\n openExternal(args: { href: string; redirectUrl?: false }): void;\n\n /** For transitioning an app from inline to fullscreen or pip */\n requestDisplayMode: (args: { mode: RequestDisplayMode }) => Promise<{\n /**\n * The granted display mode. The host may reject the request.\n * For mobile, PiP is always coerced to fullscreen.\n */\n mode: RequestDisplayMode;\n }>;\n\n /**\n * Sets the widget state.\n * This state is persisted across widget renders.\n */\n setWidgetState: (state: WS) => Promise<void>;\n\n /**\n * Opens a modal portaled outside of the widget iFrame.\n * This ensures the modal is correctly displayed and not limited to the widget's area.\n */\n requestModal: (args: RequestModalOptions) => Promise<void>;\n\n /** Uploads a new file to the host. Pass `{ library: true }` to also save to the user's ChatGPT file library. */\n uploadFile: (\n file: File,\n options?: UploadFileOptions,\n ) => Promise<FileMetadata>;\n\n /**\n * Opens ChatGPT's file library picker and returns app-authorized files.\n * Feature-detect before using: this method may not be available on all host versions.\n */\n selectFiles?: () => Promise<FileMetadata[]>;\n\n /**\n * Downloads a file from the host. Works for files uploaded by the widget,\n * files selected via selectFiles(), or files provided via tool/file params.\n */\n getFileDownloadUrl: (\n file: FileMetadata,\n ) => Promise<{ downloadUrl: string }>;\n\n /**\n * Sets the open in app URL.\n * This URL will be opened in the app when the user clicks on the top right button in fullscreen mode.\n */\n setOpenInAppUrl: (args: { href: string }) => Promise<void>;\n };\n\n// Dispatched when any global changes in the host page\nexport const SET_GLOBALS_EVENT_TYPE = \"openai:set_globals\";\nexport class SetGlobalsEvent extends CustomEvent<{\n globals: Partial<AppsSdkContext>;\n}> {\n override readonly type = SET_GLOBALS_EVENT_TYPE;\n}\n\ntype View = {\n mode: DisplayMode;\n params?: Record<string, unknown>;\n};\n\ntype Theme = \"light\" | \"dark\";\n\ntype SafeAreaInsets = {\n top: number;\n bottom: number;\n left: number;\n right: number;\n};\n\ntype SafeArea = {\n insets: SafeAreaInsets;\n};\n\ntype DeviceType = \"mobile\" | \"tablet\" | \"desktop\" | \"unknown\";\n\ntype UserAgent = {\n device: { type: DeviceType };\n capabilities: {\n hover: boolean;\n touch: boolean;\n };\n};\n"]}
@@ -1 +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"}
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","sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport { AppsSdkBridge } from \"./bridge.js\";\nimport type { AppsSdkContext } from \"./types.js\";\n\nexport function useAppsSdkContext<K extends keyof AppsSdkContext>(\n key: K,\n): AppsSdkContext[K] {\n const bridge = AppsSdkBridge.getInstance();\n return useSyncExternalStore(bridge.subscribe(key), () =>\n bridge.getSnapshot(key),\n );\n}\n"]}
@@ -1 +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"}
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","sourcesContent":["import { AppsSdkAdaptor } from \"./apps-sdk/adaptor.js\";\nimport { McpAppAdaptor } from \"./mcp-app/adaptor.js\";\nimport type { Adaptor } from \"./types.js\";\n\nexport const getAdaptor = (): Adaptor => {\n return window.skybridge.hostType === \"apps-sdk\"\n ? AppsSdkAdaptor.getInstance()\n : McpAppAdaptor.getInstance();\n};\n"]}
@@ -1 +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"}
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","sourcesContent":["export * from \"./apps-sdk/index.js\";\nexport { getAdaptor } from \"./get-adaptor.js\";\nexport * from \"./mcp-app/index.js\";\nexport * from \"./types.js\";\nexport { useHostContext } from \"./use-host-context.js\";\n"]}
@@ -1,22 +1,25 @@
1
- import type { McpUiRequestDisplayModeResult } from "@modelcontextprotocol/ext-apps";
2
- import type { Adaptor, CallToolResponse, DisplayMode, HostContext, HostContextStore, RequestModalOptions, SetWidgetStateAction } from "../types.js";
1
+ import type { Adaptor, CallToolResponse, HostContext, HostContextStore, OpenExternalOptions, RequestDisplayMode, RequestModalOptions, SendFollowUpMessageOptions, SetViewStateAction } from "../types.js";
3
2
  export declare class McpAppAdaptor implements Adaptor {
4
3
  private static instance;
5
4
  private stores;
6
- private _widgetState;
7
- private widgetStateListeners;
8
5
  private _viewState;
9
- private viewListeners;
6
+ private viewStateListeners;
7
+ private _viewUUID;
8
+ private _displayState;
9
+ private displayListeners;
10
10
  private constructor();
11
11
  static getInstance(): McpAppAdaptor;
12
12
  static resetInstance(): void;
13
13
  getHostContextStore<K extends keyof HostContext>(key: K): HostContextStore<K>;
14
14
  callTool: <ToolArgs extends Record<string, unknown> | null = null, ToolResponse extends CallToolResponse = CallToolResponse>(name: string, args: ToolArgs) => Promise<ToolResponse>;
15
- requestDisplayMode: (mode: DisplayMode) => Promise<McpUiRequestDisplayModeResult>;
16
- sendFollowUpMessage: (prompt: string) => Promise<void>;
17
- openExternal(href: string): void;
15
+ requestDisplayMode: (mode: RequestDisplayMode) => Promise<{
16
+ [x: string]: unknown;
17
+ mode: "inline" | "fullscreen" | "pip";
18
+ }>;
19
+ sendFollowUpMessage: (prompt: string, _options?: SendFollowUpMessageOptions) => Promise<void>;
20
+ openExternal(href: string, options?: OpenExternalOptions): void;
18
21
  private initializeStores;
19
- setWidgetState: (stateOrUpdater: SetWidgetStateAction) => Promise<void>;
22
+ setViewState: (stateOrUpdater: SetViewStateAction) => Promise<void>;
20
23
  /**
21
24
  * @throws File upload is not supported in MCP App.
22
25
  */
@@ -29,8 +32,17 @@ export declare class McpAppAdaptor implements Adaptor {
29
32
  getFileDownloadUrl(): Promise<{
30
33
  downloadUrl: string;
31
34
  }>;
35
+ /**
36
+ * @throws File selection is not supported in MCP App.
37
+ */
38
+ selectFiles(): Promise<{
39
+ fileId: string;
40
+ }[]>;
32
41
  openModal(options: RequestModalOptions): void;
33
42
  closeModal(): void;
34
43
  setOpenInAppUrl(_href: string): Promise<void>;
44
+ private subscribeToViewUUID;
45
+ private restoreFromLocalStorage;
46
+ private persistToLocalStorage;
35
47
  private createHostContextStore;
36
48
  }