skybridge 0.0.0-dev.efb7a49 → 0.0.0-dev.efd00e6

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 (449) hide show
  1. package/README.md +124 -128
  2. package/dist/cli/build-helpers.d.ts +11 -0
  3. package/dist/cli/build-helpers.js +107 -0
  4. package/dist/cli/build-helpers.js.map +1 -0
  5. package/dist/cli/build-helpers.test.js +130 -0
  6. package/dist/cli/build-helpers.test.js.map +1 -0
  7. package/dist/cli/build-steps.d.ts +2 -0
  8. package/dist/cli/build-steps.js +73 -0
  9. package/dist/cli/build-steps.js.map +1 -0
  10. package/dist/cli/build-steps.test.js +52 -0
  11. package/dist/cli/build-steps.test.js.map +1 -0
  12. package/dist/cli/detect-port.d.ts +2 -2
  13. package/dist/cli/detect-port.js +9 -20
  14. package/dist/cli/detect-port.js.map +1 -1
  15. package/dist/cli/header.d.ts +1 -1
  16. package/dist/cli/header.js +1 -1
  17. package/dist/cli/header.js.map +1 -1
  18. package/dist/cli/resolve-skybridge-config.d.ts +5 -0
  19. package/dist/cli/resolve-skybridge-config.js +18 -0
  20. package/dist/cli/resolve-skybridge-config.js.map +1 -0
  21. package/dist/cli/run-command.js.map +1 -1
  22. package/dist/cli/run-plain.d.ts +18 -0
  23. package/dist/cli/run-plain.js +89 -0
  24. package/dist/cli/run-plain.js.map +1 -0
  25. package/dist/cli/telemetry.js.map +1 -1
  26. package/dist/cli/tunnel-control-server.d.ts +9 -0
  27. package/dist/cli/tunnel-control-server.js +31 -0
  28. package/dist/cli/tunnel-control-server.js.map +1 -0
  29. package/dist/cli/tunnel-control-server.test.js +39 -0
  30. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  31. package/dist/cli/tunnel-handler.d.ts +3 -0
  32. package/dist/cli/tunnel-handler.js +48 -0
  33. package/dist/cli/tunnel-handler.js.map +1 -0
  34. package/dist/cli/tunnel-handler.test.d.ts +1 -0
  35. package/dist/cli/tunnel-handler.test.js +105 -0
  36. package/dist/cli/tunnel-handler.test.js.map +1 -0
  37. package/dist/cli/tunnel.d.ts +57 -0
  38. package/dist/cli/tunnel.js +154 -0
  39. package/dist/cli/tunnel.js.map +1 -0
  40. package/dist/cli/tunnel.test.d.ts +1 -0
  41. package/dist/cli/tunnel.test.js +190 -0
  42. package/dist/cli/tunnel.test.js.map +1 -0
  43. package/dist/cli/types.js.map +1 -1
  44. package/dist/cli/use-execute-steps.js.map +1 -1
  45. package/dist/cli/use-messages.d.ts +3 -0
  46. package/dist/cli/use-messages.js +11 -0
  47. package/dist/cli/use-messages.js.map +1 -0
  48. package/dist/cli/use-nodemon.d.ts +16 -2
  49. package/dist/cli/use-nodemon.js +74 -70
  50. package/dist/cli/use-nodemon.js.map +1 -1
  51. package/dist/cli/use-open-browser.d.ts +1 -0
  52. package/dist/cli/use-open-browser.js +44 -0
  53. package/dist/cli/use-open-browser.js.map +1 -0
  54. package/dist/cli/use-tunnel.d.ts +13 -7
  55. package/dist/cli/use-tunnel.js +103 -73
  56. package/dist/cli/use-tunnel.js.map +1 -1
  57. package/dist/cli/use-typescript-check.d.ts +9 -2
  58. package/dist/cli/use-typescript-check.js +89 -51
  59. package/dist/cli/use-typescript-check.js.map +1 -1
  60. package/dist/commands/build.d.ts +0 -3
  61. package/dist/commands/build.js +3 -18
  62. package/dist/commands/build.js.map +1 -1
  63. package/dist/commands/create.d.ts +9 -0
  64. package/dist/commands/create.js +30 -0
  65. package/dist/commands/create.js.map +1 -0
  66. package/dist/commands/dev.d.ts +3 -0
  67. package/dist/commands/dev.js +90 -6
  68. package/dist/commands/dev.js.map +1 -1
  69. package/dist/commands/start.js +13 -10
  70. package/dist/commands/start.js.map +1 -1
  71. package/dist/commands/telemetry/disable.js.map +1 -1
  72. package/dist/commands/telemetry/enable.js.map +1 -1
  73. package/dist/commands/telemetry/status.js.map +1 -1
  74. package/dist/server/asset-base-url-transform-plugin.d.ts +6 -6
  75. package/dist/server/asset-base-url-transform-plugin.js +25 -11
  76. package/dist/server/asset-base-url-transform-plugin.js.map +1 -1
  77. package/dist/server/asset-base-url-transform-plugin.test.js +92 -14
  78. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -1
  79. package/dist/server/auth/discovery.d.ts +32 -0
  80. package/dist/server/auth/discovery.js +56 -0
  81. package/dist/server/auth/discovery.js.map +1 -0
  82. package/dist/server/auth/discovery.test.d.ts +1 -0
  83. package/dist/server/auth/discovery.test.js +93 -0
  84. package/dist/server/auth/discovery.test.js.map +1 -0
  85. package/dist/server/auth/index.d.ts +18 -0
  86. package/dist/server/auth/index.js +2 -0
  87. package/dist/server/auth/index.js.map +1 -0
  88. package/dist/server/auth/providers/auth0.d.ts +18 -0
  89. package/dist/server/auth/providers/auth0.js +31 -0
  90. package/dist/server/auth/providers/auth0.js.map +1 -0
  91. package/dist/server/auth/providers/auth0.test.d.ts +1 -0
  92. package/dist/server/auth/providers/auth0.test.js +48 -0
  93. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  94. package/dist/server/auth/providers/clerk.d.ts +14 -0
  95. package/dist/server/auth/providers/clerk.js +16 -0
  96. package/dist/server/auth/providers/clerk.js.map +1 -0
  97. package/dist/server/auth/providers/clerk.test.d.ts +1 -0
  98. package/dist/server/auth/providers/clerk.test.js +28 -0
  99. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  100. package/dist/server/auth/providers/custom.d.ts +32 -0
  101. package/dist/server/auth/providers/custom.js +49 -0
  102. package/dist/server/auth/providers/custom.js.map +1 -0
  103. package/dist/server/auth/providers/custom.test.d.ts +1 -0
  104. package/dist/server/auth/providers/custom.test.js +156 -0
  105. package/dist/server/auth/providers/custom.test.js.map +1 -0
  106. package/dist/server/auth/providers/descope.d.ts +15 -0
  107. package/dist/server/auth/providers/descope.js +44 -0
  108. package/dist/server/auth/providers/descope.js.map +1 -0
  109. package/dist/server/auth/providers/descope.test.d.ts +1 -0
  110. package/dist/server/auth/providers/descope.test.js +60 -0
  111. package/dist/server/auth/providers/descope.test.js.map +1 -0
  112. package/dist/server/auth/providers/shared.d.ts +2 -0
  113. package/dist/server/auth/providers/shared.js +6 -0
  114. package/dist/server/auth/providers/shared.js.map +1 -0
  115. package/dist/server/auth/providers/shared.test.d.ts +1 -0
  116. package/dist/server/auth/providers/shared.test.js +10 -0
  117. package/dist/server/auth/providers/shared.test.js.map +1 -0
  118. package/dist/server/auth/providers/stytch.d.ts +12 -0
  119. package/dist/server/auth/providers/stytch.js +13 -0
  120. package/dist/server/auth/providers/stytch.js.map +1 -0
  121. package/dist/server/auth/providers/workos.d.ts +11 -0
  122. package/dist/server/auth/providers/workos.js +12 -0
  123. package/dist/server/auth/providers/workos.js.map +1 -0
  124. package/dist/server/auth/security-schemes.d.ts +23 -0
  125. package/dist/server/auth/security-schemes.js +64 -0
  126. package/dist/server/auth/security-schemes.js.map +1 -0
  127. package/dist/server/auth/security-schemes.test.d.ts +1 -0
  128. package/dist/server/auth/security-schemes.test.js +99 -0
  129. package/dist/server/auth/security-schemes.test.js.map +1 -0
  130. package/dist/server/auth/setup.d.ts +6 -0
  131. package/dist/server/auth/setup.js +92 -0
  132. package/dist/server/auth/setup.js.map +1 -0
  133. package/dist/server/auth/setup.test.d.ts +1 -0
  134. package/dist/server/auth/setup.test.js +474 -0
  135. package/dist/server/auth/setup.test.js.map +1 -0
  136. package/dist/server/auth/verify.d.ts +12 -0
  137. package/dist/server/auth/verify.js +38 -0
  138. package/dist/server/auth/verify.js.map +1 -0
  139. package/dist/server/auth/verify.test.d.ts +1 -0
  140. package/dist/server/auth/verify.test.js +100 -0
  141. package/dist/server/auth/verify.test.js.map +1 -0
  142. package/dist/server/auth.d.ts +20 -0
  143. package/dist/server/auth.js +28 -0
  144. package/dist/server/auth.js.map +1 -0
  145. package/dist/server/build-manifest.test.d.ts +1 -0
  146. package/dist/server/build-manifest.test.js +27 -0
  147. package/dist/server/build-manifest.test.js.map +1 -0
  148. package/dist/server/content-helpers.d.ts +67 -0
  149. package/dist/server/content-helpers.js +79 -0
  150. package/dist/server/content-helpers.js.map +1 -0
  151. package/dist/server/content-helpers.test.d.ts +1 -0
  152. package/dist/server/content-helpers.test.js +70 -0
  153. package/dist/server/content-helpers.test.js.map +1 -0
  154. package/dist/server/express.d.ts +2 -6
  155. package/dist/server/express.js +34 -10
  156. package/dist/server/express.js.map +1 -1
  157. package/dist/server/express.test.js +310 -71
  158. package/dist/server/express.test.js.map +1 -1
  159. package/dist/server/file-ref.d.ts +28 -0
  160. package/dist/server/file-ref.js +27 -0
  161. package/dist/server/file-ref.js.map +1 -0
  162. package/dist/server/host.d.ts +2 -0
  163. package/dist/server/host.js +11 -0
  164. package/dist/server/host.js.map +1 -0
  165. package/dist/server/host.test.d.ts +1 -0
  166. package/dist/server/host.test.js +13 -0
  167. package/dist/server/host.test.js.map +1 -0
  168. package/dist/server/index.d.ts +14 -3
  169. package/dist/server/index.js +12 -2
  170. package/dist/server/index.js.map +1 -1
  171. package/dist/server/inferUtilityTypes.d.ts +6 -6
  172. package/dist/server/inferUtilityTypes.js.map +1 -1
  173. package/dist/server/metric.d.ts +14 -0
  174. package/dist/server/metric.js +62 -0
  175. package/dist/server/metric.js.map +1 -0
  176. package/dist/server/middleware.d.ts +16 -3
  177. package/dist/server/middleware.js.map +1 -1
  178. package/dist/server/middleware.test-d.js.map +1 -1
  179. package/dist/server/middleware.test.js +12 -9
  180. package/dist/server/middleware.test.js.map +1 -1
  181. package/dist/server/requestOrigin.d.ts +7 -0
  182. package/dist/server/requestOrigin.js +25 -0
  183. package/dist/server/requestOrigin.js.map +1 -0
  184. package/dist/server/server.d.ts +376 -71
  185. package/dist/server/server.js +605 -162
  186. package/dist/server/server.js.map +1 -1
  187. package/dist/server/skills-integration.test.d.ts +1 -0
  188. package/dist/server/skills-integration.test.js +63 -0
  189. package/dist/server/skills-integration.test.js.map +1 -0
  190. package/dist/server/skills.d.ts +23 -0
  191. package/dist/server/skills.js +178 -0
  192. package/dist/server/skills.js.map +1 -0
  193. package/dist/server/skills.test.d.ts +1 -0
  194. package/dist/server/skills.test.js +210 -0
  195. package/dist/server/skills.test.js.map +1 -0
  196. package/dist/server/templateHelper.d.ts +5 -7
  197. package/dist/server/templateHelper.js +3 -22
  198. package/dist/server/templateHelper.js.map +1 -1
  199. package/dist/server/templates.generated.d.ts +4 -0
  200. package/dist/server/templates.generated.js +47 -0
  201. package/dist/server/templates.generated.js.map +1 -0
  202. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  203. package/dist/server/tunnel-proxy-router.js +110 -0
  204. package/dist/server/tunnel-proxy-router.js.map +1 -0
  205. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  206. package/dist/server/tunnel-proxy-router.test.js +229 -0
  207. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  208. package/dist/server/view-name.test-d.d.ts +1 -0
  209. package/dist/server/view-name.test-d.js +8 -0
  210. package/dist/server/view-name.test-d.js.map +1 -0
  211. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  212. package/dist/server/view-resource-resolution.test.js +171 -0
  213. package/dist/server/view-resource-resolution.test.js.map +1 -0
  214. package/dist/server/viewsDevServer.d.ts +14 -0
  215. package/dist/server/viewsDevServer.js +48 -0
  216. package/dist/server/viewsDevServer.js.map +1 -0
  217. package/dist/test/utils.d.ts +13 -21
  218. package/dist/test/utils.js +42 -37
  219. package/dist/test/utils.js.map +1 -1
  220. package/dist/test/view.test.d.ts +1 -0
  221. package/dist/test/view.test.js +536 -0
  222. package/dist/test/view.test.js.map +1 -0
  223. package/dist/version.d.ts +1 -0
  224. package/dist/version.js +3 -0
  225. package/dist/version.js.map +1 -0
  226. package/dist/web/bridges/adaptor.d.ts +51 -0
  227. package/dist/web/bridges/adaptor.js +341 -0
  228. package/dist/web/bridges/adaptor.js.map +1 -0
  229. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  230. package/dist/web/bridges/adaptor.test.js +224 -0
  231. package/dist/web/bridges/adaptor.test.js.map +1 -0
  232. package/dist/web/bridges/apps-sdk/bridge.d.ts +6 -1
  233. package/dist/web/bridges/apps-sdk/bridge.js +15 -3
  234. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  235. package/dist/web/bridges/apps-sdk/index.d.ts +0 -1
  236. package/dist/web/bridges/apps-sdk/index.js +0 -1
  237. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  238. package/dist/web/bridges/apps-sdk/types.d.ts +18 -6
  239. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  240. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +11 -0
  241. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +11 -0
  242. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  243. package/dist/web/bridges/get-adaptor.d.ts +7 -0
  244. package/dist/web/bridges/get-adaptor.js +9 -7
  245. package/dist/web/bridges/get-adaptor.js.map +1 -1
  246. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  247. package/dist/web/bridges/get-adaptor.test.js +32 -0
  248. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  249. package/dist/web/bridges/index.js.map +1 -1
  250. package/dist/web/bridges/mcp-app/bridge.d.ts +15 -2
  251. package/dist/web/bridges/mcp-app/bridge.js +73 -7
  252. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  253. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  254. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  255. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  256. package/dist/web/bridges/mcp-app/index.d.ts +0 -1
  257. package/dist/web/bridges/mcp-app/index.js +0 -1
  258. package/dist/web/bridges/mcp-app/index.js.map +1 -1
  259. package/dist/web/bridges/mcp-app/types.d.ts +2 -0
  260. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  261. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +12 -0
  262. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +12 -0
  263. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  264. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  265. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  266. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  267. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  268. package/dist/web/bridges/types.d.ts +122 -11
  269. package/dist/web/bridges/types.js +14 -1
  270. package/dist/web/bridges/types.js.map +1 -1
  271. package/dist/web/bridges/types.test.d.ts +1 -0
  272. package/dist/web/bridges/types.test.js +19 -0
  273. package/dist/web/bridges/types.test.js.map +1 -0
  274. package/dist/web/bridges/use-host-context.d.ts +5 -0
  275. package/dist/web/bridges/use-host-context.js +5 -0
  276. package/dist/web/bridges/use-host-context.js.map +1 -1
  277. package/dist/web/components/modal-provider.d.ts +1 -1
  278. package/dist/web/components/modal-provider.js +4 -3
  279. package/dist/web/components/modal-provider.js.map +1 -1
  280. package/dist/web/create-store.d.ts +26 -0
  281. package/dist/web/create-store.js +43 -3
  282. package/dist/web/create-store.js.map +1 -1
  283. package/dist/web/create-store.test.js +22 -21
  284. package/dist/web/create-store.test.js.map +1 -1
  285. package/dist/web/data-llm.d.ts +35 -2
  286. package/dist/web/data-llm.js +31 -3
  287. package/dist/web/data-llm.js.map +1 -1
  288. package/dist/web/data-llm.test.js +39 -27
  289. package/dist/web/data-llm.test.js.map +1 -1
  290. package/dist/web/generate-helpers.d.ts +22 -18
  291. package/dist/web/generate-helpers.js +22 -18
  292. package/dist/web/generate-helpers.js.map +1 -1
  293. package/dist/web/generate-helpers.test-d.js +30 -28
  294. package/dist/web/generate-helpers.test-d.js.map +1 -1
  295. package/dist/web/generate-helpers.test.js.map +1 -1
  296. package/dist/web/helpers/state.d.ts +2 -2
  297. package/dist/web/helpers/state.js +11 -11
  298. package/dist/web/helpers/state.js.map +1 -1
  299. package/dist/web/helpers/state.test.js +9 -9
  300. package/dist/web/helpers/state.test.js.map +1 -1
  301. package/dist/web/hooks/index.d.ts +6 -1
  302. package/dist/web/hooks/index.js +6 -1
  303. package/dist/web/hooks/index.js.map +1 -1
  304. package/dist/web/hooks/test/utils.d.ts +7 -2
  305. package/dist/web/hooks/test/utils.js +14 -3
  306. package/dist/web/hooks/test/utils.js.map +1 -1
  307. package/dist/web/hooks/use-call-tool.d.ts +45 -0
  308. package/dist/web/hooks/use-call-tool.js +28 -0
  309. package/dist/web/hooks/use-call-tool.js.map +1 -1
  310. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -1
  311. package/dist/web/hooks/use-call-tool.test.js +62 -27
  312. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  313. package/dist/web/hooks/use-display-mode.d.ts +20 -0
  314. package/dist/web/hooks/use-display-mode.js +20 -0
  315. package/dist/web/hooks/use-display-mode.js.map +1 -1
  316. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -1
  317. package/dist/web/hooks/use-display-mode.test.js +56 -20
  318. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  319. package/dist/web/hooks/use-download.d.ts +5 -0
  320. package/dist/web/hooks/use-download.js +8 -0
  321. package/dist/web/hooks/use-download.js.map +1 -0
  322. package/dist/web/hooks/use-download.test.d.ts +1 -0
  323. package/dist/web/hooks/use-download.test.js +103 -0
  324. package/dist/web/hooks/use-download.test.js.map +1 -0
  325. package/dist/web/hooks/use-files.d.ts +34 -1
  326. package/dist/web/hooks/use-files.js +33 -0
  327. package/dist/web/hooks/use-files.js.map +1 -1
  328. package/dist/web/hooks/use-files.test.js +30 -2
  329. package/dist/web/hooks/use-files.test.js.map +1 -1
  330. package/dist/web/hooks/use-host-info.d.ts +22 -0
  331. package/dist/web/hooks/use-host-info.js +30 -0
  332. package/dist/web/hooks/use-host-info.js.map +1 -0
  333. package/dist/web/hooks/use-host-info.test.d.ts +1 -0
  334. package/dist/web/hooks/use-host-info.test.js +59 -0
  335. package/dist/web/hooks/use-host-info.test.js.map +1 -0
  336. package/dist/web/hooks/use-layout.d.ts +2 -0
  337. package/dist/web/hooks/use-layout.js +2 -0
  338. package/dist/web/hooks/use-layout.js.map +1 -1
  339. package/dist/web/hooks/use-layout.test.js +59 -26
  340. package/dist/web/hooks/use-layout.test.js.map +1 -1
  341. package/dist/web/hooks/use-open-external.d.ts +17 -0
  342. package/dist/web/hooks/use-open-external.js +16 -0
  343. package/dist/web/hooks/use-open-external.js.map +1 -1
  344. package/dist/web/hooks/use-open-external.test.js +13 -3
  345. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  346. package/dist/web/hooks/use-register-view-tool.d.ts +38 -0
  347. package/dist/web/hooks/use-register-view-tool.js +50 -0
  348. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  349. package/dist/web/hooks/use-request-close.d.ts +16 -0
  350. package/dist/web/hooks/use-request-close.js +21 -0
  351. package/dist/web/hooks/use-request-close.js.map +1 -0
  352. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  353. package/dist/web/hooks/use-request-close.test.js +47 -0
  354. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  355. package/dist/web/hooks/use-request-modal.d.ts +16 -1
  356. package/dist/web/hooks/use-request-modal.js +19 -4
  357. package/dist/web/hooks/use-request-modal.js.map +1 -1
  358. package/dist/web/hooks/use-request-modal.test.js +11 -1
  359. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  360. package/dist/web/hooks/use-request-size.d.ts +20 -0
  361. package/dist/web/hooks/use-request-size.js +24 -0
  362. package/dist/web/hooks/use-request-size.js.map +1 -0
  363. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  364. package/dist/web/hooks/use-request-size.test.js +47 -0
  365. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  366. package/dist/web/hooks/use-send-follow-up-message.d.ts +19 -1
  367. package/dist/web/hooks/use-send-follow-up-message.js +19 -2
  368. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
  369. package/dist/web/hooks/use-set-open-in-app-url.d.ts +17 -0
  370. package/dist/web/hooks/use-set-open-in-app-url.js +17 -0
  371. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -1
  372. package/dist/web/hooks/use-set-open-in-app-url.test.js +28 -8
  373. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  374. package/dist/web/hooks/use-tool-info.d.ts +53 -2
  375. package/dist/web/hooks/use-tool-info.js +30 -7
  376. package/dist/web/hooks/use-tool-info.js.map +1 -1
  377. package/dist/web/hooks/use-tool-info.test-d.js +11 -29
  378. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  379. package/dist/web/hooks/use-tool-info.test.js +42 -32
  380. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  381. package/dist/web/hooks/use-user.d.ts +2 -0
  382. package/dist/web/hooks/use-user.js +2 -0
  383. package/dist/web/hooks/use-user.js.map +1 -1
  384. package/dist/web/hooks/use-user.test.js +81 -35
  385. package/dist/web/hooks/use-user.test.js.map +1 -1
  386. package/dist/web/hooks/use-view-state.d.ts +25 -0
  387. package/dist/web/hooks/use-view-state.js +42 -0
  388. package/dist/web/hooks/use-view-state.js.map +1 -0
  389. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  390. package/dist/web/hooks/use-view-state.test.js +212 -0
  391. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  392. package/dist/web/index.d.ts +1 -2
  393. package/dist/web/index.js +1 -2
  394. package/dist/web/index.js.map +1 -1
  395. package/dist/web/mount-view.d.ts +20 -0
  396. package/dist/web/{mount-widget.js → mount-view.js} +21 -2
  397. package/dist/web/mount-view.js.map +1 -0
  398. package/dist/web/plugin/data-llm.test.js.map +1 -1
  399. package/dist/web/plugin/plugin.d.ts +38 -1
  400. package/dist/web/plugin/plugin.js +160 -25
  401. package/dist/web/plugin/plugin.js.map +1 -1
  402. package/dist/web/plugin/scan-views.d.ts +16 -0
  403. package/dist/web/plugin/scan-views.js +88 -0
  404. package/dist/web/plugin/scan-views.js.map +1 -0
  405. package/dist/web/plugin/scan-views.test.d.ts +1 -0
  406. package/dist/web/plugin/scan-views.test.js +99 -0
  407. package/dist/web/plugin/scan-views.test.js.map +1 -0
  408. package/dist/web/plugin/transform-data-llm.js +1 -1
  409. package/dist/web/plugin/transform-data-llm.js.map +1 -1
  410. package/dist/web/plugin/transform-data-llm.test.js.map +1 -1
  411. package/dist/web/plugin/validate-view.d.ts +1 -0
  412. package/dist/web/plugin/validate-view.js +9 -0
  413. package/dist/web/plugin/validate-view.js.map +1 -0
  414. package/dist/web/plugin/validate-view.test.d.ts +1 -0
  415. package/dist/web/plugin/validate-view.test.js +24 -0
  416. package/dist/web/plugin/validate-view.test.js.map +1 -0
  417. package/dist/web/proxy.js.map +1 -1
  418. package/dist/web/types.d.ts +4 -0
  419. package/dist/web/types.js.map +1 -1
  420. package/package.json +41 -23
  421. package/tsconfig.base.json +2 -0
  422. package/dist/server/templates/development.hbs +0 -12
  423. package/dist/server/templates/production.hbs +0 -6
  424. package/dist/server/widgetsDevServer.d.ts +0 -13
  425. package/dist/server/widgetsDevServer.js +0 -57
  426. package/dist/server/widgetsDevServer.js.map +0 -1
  427. package/dist/test/widget.test.js +0 -263
  428. package/dist/test/widget.test.js.map +0 -1
  429. package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -22
  430. package/dist/web/bridges/apps-sdk/adaptor.js +0 -75
  431. package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
  432. package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -38
  433. package/dist/web/bridges/mcp-app/adaptor.js +0 -184
  434. package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
  435. package/dist/web/hooks/use-widget-state.d.ts +0 -4
  436. package/dist/web/hooks/use-widget-state.js +0 -32
  437. package/dist/web/hooks/use-widget-state.js.map +0 -1
  438. package/dist/web/hooks/use-widget-state.test.js +0 -64
  439. package/dist/web/hooks/use-widget-state.test.js.map +0 -1
  440. package/dist/web/mount-widget.d.ts +0 -1
  441. package/dist/web/mount-widget.js.map +0 -1
  442. package/dist/web/plugin/validate-widget.d.ts +0 -5
  443. package/dist/web/plugin/validate-widget.js +0 -27
  444. package/dist/web/plugin/validate-widget.js.map +0 -1
  445. package/dist/web/plugin/validate-widget.test.js +0 -42
  446. package/dist/web/plugin/validate-widget.test.js.map +0 -1
  447. /package/dist/{test/widget.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
  448. /package/dist/{web/hooks/use-widget-state.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  449. /package/dist/{web/plugin/validate-widget.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
@@ -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"]}
@@ -0,0 +1,51 @@
1
+ import type { Adaptor, AnyViewToolHandler, CallToolResponse, DownloadParams, DownloadResult, FileMetadata, HostContext, HostContextStore, OpenExternalOptions, RequestDisplayMode, RequestModalOptions, RequestSizeOptions, SendFollowUpMessageOptions, SetViewStateAction, UploadFileOptions, ViewToolConfig } from "./types.js";
2
+ /**
3
+ * @internal
4
+ * Single composite implementation of {@link Adaptor}. Composes the MCP App
5
+ * bridge (always present) with an optional `window.openai` overlay. Per-method
6
+ * routing rules are encoded inline.
7
+ */
8
+ export declare class HostAdaptor implements Adaptor {
9
+ private static instance;
10
+ static getInstance(): HostAdaptor;
11
+ static resetInstance(): void;
12
+ private readonly mcp;
13
+ private readonly openai;
14
+ private readonly stores;
15
+ private _viewState;
16
+ private readonly viewStateListeners;
17
+ private _viewUUID;
18
+ private _polyfillDisplay;
19
+ private readonly polyfillDisplayListeners;
20
+ private readonly polyfillDisplayStore;
21
+ private readonly polyfillViewStateStore;
22
+ private unsubscribeViewUUID;
23
+ constructor();
24
+ /** @internal Release any subscriptions held on the underlying bridges. */
25
+ cleanup(): void;
26
+ getHostContextStore: <K extends keyof HostContext>(key: K) => HostContextStore<K>;
27
+ callTool: <ToolArgs extends Record<string, unknown> | null = null, ToolResponse extends CallToolResponse = CallToolResponse>(name: string, args: ToolArgs) => Promise<ToolResponse>;
28
+ registerViewTool: (config: ViewToolConfig, handler: AnyViewToolHandler) => (() => void);
29
+ requestDisplayMode: (mode: RequestDisplayMode) => Promise<{
30
+ [x: string]: unknown;
31
+ mode: "inline" | "fullscreen" | "pip";
32
+ }>;
33
+ requestClose: () => Promise<void>;
34
+ requestSize: (size: RequestSizeOptions) => Promise<void>;
35
+ sendFollowUpMessage: (prompt: string, options?: SendFollowUpMessageOptions) => Promise<void>;
36
+ openExternal: (href: string, options?: OpenExternalOptions) => void;
37
+ download: (params: DownloadParams) => Promise<DownloadResult>;
38
+ setViewState: (stateOrUpdater: SetViewStateAction) => Promise<void>;
39
+ uploadFile: (file: File, options?: UploadFileOptions) => Promise<FileMetadata>;
40
+ getFileDownloadUrl: (file: FileMetadata) => Promise<{
41
+ downloadUrl: string;
42
+ }>;
43
+ selectFiles: () => Promise<FileMetadata[]>;
44
+ openModal: (options: RequestModalOptions) => void;
45
+ setOpenInAppUrl: (href: string) => Promise<void>;
46
+ closeModal: () => void;
47
+ private trackFileIds;
48
+ private subscribeToViewUUID;
49
+ private restoreFromLocalStorage;
50
+ protected persistToLocalStorage(state: Record<string, unknown> | null): void;
51
+ }
@@ -0,0 +1,341 @@
1
+ import { AppsSdkBridge } from "./apps-sdk/bridge.js";
2
+ import { McpAppBridge } from "./mcp-app/bridge.js";
3
+ import { NotSupportedError } from "./types.js";
4
+ const STORAGE_PREFIX = "sb:";
5
+ const MAX_STORAGE_ENTRIES = 200;
6
+ const VIEW_STATE_TOKEN_WARNING_THRESHOLD = 4000;
7
+ function getApproximateTokenCount(value) {
8
+ try {
9
+ return Math.max(1, Math.ceil(JSON.stringify(value).length / 4));
10
+ }
11
+ catch {
12
+ return 0;
13
+ }
14
+ }
15
+ function warnOnLargeViewState(value, source) {
16
+ const tokenCount = getApproximateTokenCount(value);
17
+ if (tokenCount > VIEW_STATE_TOKEN_WARNING_THRESHOLD) {
18
+ console.warn(`[skybridge] ${source} is persisting ${tokenCount} tokens in view state; this exceeds the ${VIEW_STATE_TOKEN_WARNING_THRESHOLD}-token warning threshold and may overload model context.`);
19
+ }
20
+ }
21
+ function isImage(mimeType) {
22
+ return mimeType?.startsWith("image/") ?? false;
23
+ }
24
+ function findStorageKey(viewUUID) {
25
+ const suffix = `:${viewUUID}`;
26
+ for (let i = 0; i < localStorage.length; i++) {
27
+ const key = localStorage.key(i);
28
+ if (key?.startsWith(STORAGE_PREFIX) && key.endsWith(suffix)) {
29
+ return key;
30
+ }
31
+ }
32
+ return undefined;
33
+ }
34
+ /**
35
+ * @internal
36
+ * Single composite implementation of {@link Adaptor}. Composes the MCP App
37
+ * bridge (always present) with an optional `window.openai` overlay. Per-method
38
+ * routing rules are encoded inline.
39
+ */
40
+ export class HostAdaptor {
41
+ static instance = null;
42
+ static getInstance() {
43
+ if (!HostAdaptor.instance) {
44
+ HostAdaptor.instance = new HostAdaptor();
45
+ }
46
+ return HostAdaptor.instance;
47
+ }
48
+ static resetInstance() {
49
+ HostAdaptor.instance?.cleanup();
50
+ HostAdaptor.instance = null;
51
+ }
52
+ mcp;
53
+ openai = null;
54
+ stores;
55
+ _viewState = null;
56
+ viewStateListeners = new Set();
57
+ _viewUUID = null;
58
+ _polyfillDisplay = { mode: "inline" };
59
+ polyfillDisplayListeners = new Set();
60
+ polyfillDisplayStore;
61
+ polyfillViewStateStore;
62
+ unsubscribeViewUUID = null;
63
+ constructor() {
64
+ this.mcp = McpAppBridge.getInstance();
65
+ let overlayStores = null;
66
+ if (typeof window !== "undefined" && window.openai !== undefined) {
67
+ this.openai = window.openai;
68
+ overlayStores = AppsSdkBridge.getInstance().createOverlayStores();
69
+ }
70
+ // Built once so that getHostContextStore returns stable references — required
71
+ // by useSyncExternalStore to avoid resubscribing on every render.
72
+ this.polyfillDisplayStore = {
73
+ subscribe: (onChange) => {
74
+ this.polyfillDisplayListeners.add(onChange);
75
+ return () => {
76
+ this.polyfillDisplayListeners.delete(onChange);
77
+ };
78
+ },
79
+ getSnapshot: () => this._polyfillDisplay,
80
+ };
81
+ this.polyfillViewStateStore = {
82
+ subscribe: (onChange) => {
83
+ this.viewStateListeners.add(onChange);
84
+ return () => {
85
+ this.viewStateListeners.delete(onChange);
86
+ };
87
+ },
88
+ getSnapshot: () => this._viewState,
89
+ };
90
+ this.stores = {
91
+ ...this.mcp.createContextStores(),
92
+ display: overlayStores?.display ?? this.polyfillDisplayStore,
93
+ viewState: overlayStores?.viewState ?? this.polyfillViewStateStore,
94
+ };
95
+ this.subscribeToViewUUID();
96
+ }
97
+ /** @internal Release any subscriptions held on the underlying bridges. */
98
+ cleanup() {
99
+ this.unsubscribeViewUUID?.();
100
+ this.unsubscribeViewUUID = null;
101
+ }
102
+ // ---- Adaptor interface ----
103
+ getHostContextStore = (key) => this.stores[key];
104
+ callTool = async (name, args) => {
105
+ const app = await this.mcp.getApp();
106
+ const response = await app.callServerTool({
107
+ name,
108
+ arguments: args ?? undefined,
109
+ });
110
+ return {
111
+ content: response.content,
112
+ structuredContent: response.structuredContent ?? {},
113
+ isError: response.isError ?? false,
114
+ meta: response._meta ?? {},
115
+ };
116
+ };
117
+ registerViewTool = (config, handler) => {
118
+ return this.mcp.registerViewTool(config, handler);
119
+ };
120
+ requestDisplayMode = async (mode) => {
121
+ const app = await this.mcp.getApp();
122
+ return app.requestDisplayMode({ mode });
123
+ };
124
+ requestClose = async () => {
125
+ if (this.openai) {
126
+ await this.openai.requestClose();
127
+ }
128
+ const app = await this.mcp.getApp();
129
+ await app.requestTeardown();
130
+ };
131
+ requestSize = async (size) => {
132
+ const app = await this.mcp.getApp();
133
+ await app.sendSizeChanged(size);
134
+ };
135
+ sendFollowUpMessage = async (prompt, options) => {
136
+ if (this.openai) {
137
+ await this.openai.sendFollowUpMessage({
138
+ prompt,
139
+ scrollToBottom: options?.scrollToBottom,
140
+ });
141
+ return;
142
+ }
143
+ const app = await this.mcp.getApp();
144
+ await app.sendMessage({
145
+ role: "user",
146
+ content: [{ type: "text", text: prompt }],
147
+ });
148
+ };
149
+ openExternal = (href, options) => {
150
+ if (this.openai) {
151
+ this.openai.openExternal({ href, ...options });
152
+ return;
153
+ }
154
+ this.mcp
155
+ .getApp()
156
+ .then((app) => app.openLink({ url: href }))
157
+ .catch((err) => {
158
+ console.error("Failed to open external link:", err);
159
+ });
160
+ };
161
+ download = async (params) => {
162
+ const app = await this.mcp.getApp();
163
+ if (!app.getHostCapabilities()?.downloadFile) {
164
+ console.error("[skybridge] download: host does not support ui/download-file");
165
+ return { isError: true };
166
+ }
167
+ return app.downloadFile(params);
168
+ };
169
+ setViewState = async (stateOrUpdater) => {
170
+ if (this.openai) {
171
+ const modelContent = typeof stateOrUpdater === "function"
172
+ ? stateOrUpdater(this.openai.widgetState?.modelContent ?? null)
173
+ : stateOrUpdater;
174
+ warnOnLargeViewState(modelContent, "setWidgetState");
175
+ await this.openai.setWidgetState({
176
+ privateContent: {},
177
+ ...this.openai.widgetState,
178
+ modelContent,
179
+ });
180
+ return;
181
+ }
182
+ const newState = typeof stateOrUpdater === "function"
183
+ ? stateOrUpdater(this._viewState)
184
+ : stateOrUpdater;
185
+ warnOnLargeViewState(newState, "setViewState");
186
+ // update local state immediately so successive calls see fresh state
187
+ this._viewState = newState;
188
+ this.viewStateListeners.forEach((l) => {
189
+ l();
190
+ });
191
+ this.persistToLocalStorage(newState);
192
+ try {
193
+ const app = await this.mcp.getApp();
194
+ await app.updateModelContext({
195
+ structuredContent: newState,
196
+ content: [{ type: "text", text: JSON.stringify(newState) }],
197
+ });
198
+ }
199
+ catch (error) {
200
+ console.error("Failed to update view state in MCP App.", error);
201
+ }
202
+ };
203
+ uploadFile = async (file, options) => {
204
+ if (!this.openai) {
205
+ throw new NotSupportedError("uploadFile");
206
+ }
207
+ const metadata = await this.openai.uploadFile(file, options);
208
+ if (isImage(metadata.mimeType ?? file.type)) {
209
+ await this.trackFileIds(metadata.fileId);
210
+ }
211
+ return metadata;
212
+ };
213
+ getFileDownloadUrl = (file) => {
214
+ if (!this.openai) {
215
+ return Promise.reject(new NotSupportedError("getFileDownloadUrl"));
216
+ }
217
+ return this.openai.getFileDownloadUrl(file);
218
+ };
219
+ selectFiles = async () => {
220
+ if (!this.openai) {
221
+ throw new NotSupportedError("selectFiles");
222
+ }
223
+ if (!this.openai.selectFiles) {
224
+ throw new Error("selectFiles is not supported by the current host version.");
225
+ }
226
+ const files = await this.openai.selectFiles();
227
+ const imageIds = [];
228
+ for (const file of files) {
229
+ if (isImage(file.mimeType)) {
230
+ imageIds.push(file.fileId);
231
+ }
232
+ }
233
+ if (imageIds.length > 0) {
234
+ await this.trackFileIds(...imageIds);
235
+ }
236
+ return files;
237
+ };
238
+ openModal = (options) => {
239
+ if (this.openai) {
240
+ this.openai.requestModal(options);
241
+ return;
242
+ }
243
+ this._polyfillDisplay = { mode: "modal", params: options.params };
244
+ this.polyfillDisplayListeners.forEach((l) => {
245
+ l();
246
+ });
247
+ };
248
+ setOpenInAppUrl = (href) => {
249
+ if (!this.openai) {
250
+ return Promise.reject(new NotSupportedError("setOpenInAppUrl"));
251
+ }
252
+ const trimmed = href.trim();
253
+ if (!trimmed) {
254
+ return Promise.reject(new Error("The href parameter is required."));
255
+ }
256
+ return this.openai.setOpenInAppUrl({ href: trimmed });
257
+ };
258
+ closeModal = () => {
259
+ if (this.openai) {
260
+ return; // host owns modal lifecycle
261
+ }
262
+ this._polyfillDisplay = { mode: "inline" };
263
+ this.polyfillDisplayListeners.forEach((l) => {
264
+ l();
265
+ });
266
+ };
267
+ async trackFileIds(...fileIds) {
268
+ if (!this.openai) {
269
+ return;
270
+ }
271
+ const current = this.openai.widgetState;
272
+ const state = current
273
+ ? { ...current }
274
+ : { modelContent: {}, privateContent: {} };
275
+ if (!state.imageIds) {
276
+ state.imageIds = [];
277
+ }
278
+ state.imageIds.push(...fileIds);
279
+ await this.openai.setWidgetState(state);
280
+ }
281
+ // ---- viewState persistence helpers ----
282
+ subscribeToViewUUID() {
283
+ this.unsubscribeViewUUID = this.mcp.subscribe("toolResult")(() => {
284
+ const toolResult = this.mcp.getSnapshot("toolResult");
285
+ const viewUUID = toolResult?._meta?.viewUUID;
286
+ if (viewUUID && viewUUID !== this._viewUUID) {
287
+ this._viewUUID = viewUUID;
288
+ this.restoreFromLocalStorage(viewUUID);
289
+ }
290
+ });
291
+ }
292
+ restoreFromLocalStorage(viewUUID) {
293
+ try {
294
+ const existingKey = findStorageKey(viewUUID);
295
+ if (existingKey) {
296
+ const stored = localStorage.getItem(existingKey);
297
+ if (stored !== null) {
298
+ this._viewState = JSON.parse(stored);
299
+ this.viewStateListeners.forEach((l) => {
300
+ l();
301
+ });
302
+ }
303
+ }
304
+ }
305
+ catch (err) {
306
+ console.error(err);
307
+ }
308
+ }
309
+ persistToLocalStorage(state) {
310
+ if (!this._viewUUID || state === null) {
311
+ return;
312
+ }
313
+ try {
314
+ const oldKey = findStorageKey(this._viewUUID);
315
+ if (oldKey) {
316
+ localStorage.removeItem(oldKey);
317
+ }
318
+ const newKey = `${STORAGE_PREFIX}${Date.now()}:${this._viewUUID}`;
319
+ localStorage.setItem(newKey, JSON.stringify(state));
320
+ const keys = [];
321
+ for (let i = 0; i < localStorage.length; i++) {
322
+ const key = localStorage.key(i);
323
+ if (key?.startsWith(STORAGE_PREFIX)) {
324
+ keys.push(key);
325
+ }
326
+ }
327
+ if (keys.length <= MAX_STORAGE_ENTRIES) {
328
+ return;
329
+ }
330
+ keys.sort();
331
+ const toRemove = keys.slice(0, keys.length - MAX_STORAGE_ENTRIES);
332
+ for (const key of toRemove) {
333
+ localStorage.removeItem(key);
334
+ }
335
+ }
336
+ catch (err) {
337
+ console.error(err);
338
+ }
339
+ }
340
+ }
341
+ //# sourceMappingURL=adaptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptor.js","sourceRoot":"","sources":["../../../src/web/bridges/adaptor.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppsSdkBridge } from \"./apps-sdk/bridge.js\";\nimport type { AppsSdkWidgetState } from \"./apps-sdk/types.js\";\nimport { McpAppBridge } from \"./mcp-app/bridge.js\";\nimport type {\n Adaptor,\n AnyViewToolHandler,\n CallToolResponse,\n DownloadParams,\n DownloadResult,\n FileMetadata,\n HostContext,\n HostContextStore,\n OpenExternalOptions,\n RequestDisplayMode,\n RequestModalOptions,\n RequestSizeOptions,\n SendFollowUpMessageOptions,\n SetViewStateAction,\n UploadFileOptions,\n ViewToolConfig,\n} from \"./types.js\";\nimport { NotSupportedError } from \"./types.js\";\n\nconst STORAGE_PREFIX = \"sb:\";\nconst MAX_STORAGE_ENTRIES = 200;\nconst VIEW_STATE_TOKEN_WARNING_THRESHOLD = 4000;\n\nfunction getApproximateTokenCount(value: unknown): number {\n try {\n return Math.max(1, Math.ceil(JSON.stringify(value).length / 4));\n } catch {\n return 0;\n }\n}\n\nfunction warnOnLargeViewState(value: unknown, source: string): void {\n const tokenCount = getApproximateTokenCount(value);\n if (tokenCount > VIEW_STATE_TOKEN_WARNING_THRESHOLD) {\n console.warn(\n `[skybridge] ${source} is persisting ${tokenCount} tokens in view state; this exceeds the ${VIEW_STATE_TOKEN_WARNING_THRESHOLD}-token warning threshold and may overload model context.`,\n );\n }\n}\n\nfunction isImage(mimeType: string | undefined): boolean {\n return mimeType?.startsWith(\"image/\") ?? false;\n}\n\nfunction findStorageKey(viewUUID: string): string | undefined {\n const suffix = `:${viewUUID}`;\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(STORAGE_PREFIX) && key.endsWith(suffix)) {\n return key;\n }\n }\n return undefined;\n}\n\n/**\n * @internal\n * Single composite implementation of {@link Adaptor}. Composes the MCP App\n * bridge (always present) with an optional `window.openai` overlay. Per-method\n * routing rules are encoded inline.\n */\nexport class HostAdaptor implements Adaptor {\n private static instance: HostAdaptor | null = null;\n\n static getInstance(): HostAdaptor {\n if (!HostAdaptor.instance) {\n HostAdaptor.instance = new HostAdaptor();\n }\n return HostAdaptor.instance;\n }\n\n static resetInstance(): void {\n HostAdaptor.instance?.cleanup();\n HostAdaptor.instance = null;\n }\n\n private readonly mcp: McpAppBridge;\n private readonly openai: typeof window.openai | null = null;\n\n private readonly stores: { [K in keyof HostContext]: HostContextStore<K> };\n\n private _viewState: HostContext[\"viewState\"] = null;\n private readonly viewStateListeners = new Set<() => void>();\n private _viewUUID: string | null = null;\n\n private _polyfillDisplay: HostContext[\"display\"] = { mode: \"inline\" };\n private readonly polyfillDisplayListeners = new Set<() => void>();\n\n private readonly polyfillDisplayStore: HostContextStore<\"display\">;\n private readonly polyfillViewStateStore: HostContextStore<\"viewState\">;\n\n private unsubscribeViewUUID: (() => void) | null = null;\n\n constructor() {\n this.mcp = McpAppBridge.getInstance();\n\n let overlayStores: ReturnType<AppsSdkBridge[\"createOverlayStores\"]> | null =\n null;\n if (typeof window !== \"undefined\" && window.openai !== undefined) {\n this.openai = window.openai;\n overlayStores = AppsSdkBridge.getInstance().createOverlayStores();\n }\n\n // Built once so that getHostContextStore returns stable references — required\n // by useSyncExternalStore to avoid resubscribing on every render.\n this.polyfillDisplayStore = {\n subscribe: (onChange: () => void) => {\n this.polyfillDisplayListeners.add(onChange);\n return () => {\n this.polyfillDisplayListeners.delete(onChange);\n };\n },\n getSnapshot: () => this._polyfillDisplay,\n };\n this.polyfillViewStateStore = {\n subscribe: (onChange: () => void) => {\n this.viewStateListeners.add(onChange);\n return () => {\n this.viewStateListeners.delete(onChange);\n };\n },\n getSnapshot: () => this._viewState,\n };\n\n this.stores = {\n ...this.mcp.createContextStores(),\n display: overlayStores?.display ?? this.polyfillDisplayStore,\n viewState: overlayStores?.viewState ?? this.polyfillViewStateStore,\n };\n\n this.subscribeToViewUUID();\n }\n\n /** @internal Release any subscriptions held on the underlying bridges. */\n public cleanup(): void {\n this.unsubscribeViewUUID?.();\n this.unsubscribeViewUUID = null;\n }\n\n // ---- Adaptor interface ----\n\n public getHostContextStore = <K extends keyof HostContext>(\n key: K,\n ): HostContextStore<K> => this.stores[key];\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 const app = await this.mcp.getApp();\n const response = await app.callServerTool({\n name,\n arguments: args ?? undefined,\n });\n return {\n content: response.content,\n structuredContent: response.structuredContent ?? {},\n isError: response.isError ?? false,\n meta: response._meta ?? {},\n } as ToolResponse;\n };\n\n public registerViewTool = (\n config: ViewToolConfig,\n handler: AnyViewToolHandler,\n ): (() => void) => {\n return this.mcp.registerViewTool(config, handler);\n };\n\n public requestDisplayMode = async (mode: RequestDisplayMode) => {\n const app = await this.mcp.getApp();\n return app.requestDisplayMode({ mode });\n };\n\n public requestClose = async (): Promise<void> => {\n if (this.openai) {\n await this.openai.requestClose();\n }\n const app = await this.mcp.getApp();\n await app.requestTeardown();\n };\n\n public requestSize = async (size: RequestSizeOptions): Promise<void> => {\n const app = await this.mcp.getApp();\n await app.sendSizeChanged(size);\n };\n\n public sendFollowUpMessage = async (\n prompt: string,\n options?: SendFollowUpMessageOptions,\n ): Promise<void> => {\n if (this.openai) {\n await this.openai.sendFollowUpMessage({\n prompt,\n scrollToBottom: options?.scrollToBottom,\n });\n return;\n }\n const app = await this.mcp.getApp();\n await app.sendMessage({\n role: \"user\",\n content: [{ type: \"text\", text: prompt }],\n });\n };\n\n public openExternal = (href: string, options?: OpenExternalOptions): void => {\n if (this.openai) {\n this.openai.openExternal({ href, ...options });\n return;\n }\n this.mcp\n .getApp()\n .then((app) => app.openLink({ url: href }))\n .catch((err) => {\n console.error(\"Failed to open external link:\", err);\n });\n };\n\n public download = async (params: DownloadParams): Promise<DownloadResult> => {\n const app = await this.mcp.getApp();\n if (!app.getHostCapabilities()?.downloadFile) {\n console.error(\n \"[skybridge] download: host does not support ui/download-file\",\n );\n return { isError: true };\n }\n return app.downloadFile(params);\n };\n\n public setViewState = async (\n stateOrUpdater: SetViewStateAction,\n ): Promise<void> => {\n if (this.openai) {\n const modelContent =\n typeof stateOrUpdater === \"function\"\n ? stateOrUpdater(this.openai.widgetState?.modelContent ?? null)\n : stateOrUpdater;\n warnOnLargeViewState(modelContent, \"setWidgetState\");\n await this.openai.setWidgetState({\n privateContent: {},\n ...this.openai.widgetState,\n modelContent,\n });\n return;\n }\n\n const newState =\n typeof stateOrUpdater === \"function\"\n ? stateOrUpdater(this._viewState)\n : stateOrUpdater;\n warnOnLargeViewState(newState, \"setViewState\");\n\n // update local state immediately so successive calls see fresh state\n this._viewState = newState;\n this.viewStateListeners.forEach((l) => {\n l();\n });\n\n this.persistToLocalStorage(newState);\n\n try {\n const app = await this.mcp.getApp();\n await app.updateModelContext({\n structuredContent: newState,\n content: [{ type: \"text\", text: JSON.stringify(newState) }],\n });\n } catch (error) {\n console.error(\"Failed to update view state in MCP App.\", error);\n }\n };\n\n public uploadFile = async (\n file: File,\n options?: UploadFileOptions,\n ): Promise<FileMetadata> => {\n if (!this.openai) {\n throw new NotSupportedError(\"uploadFile\");\n }\n const metadata = await this.openai.uploadFile(file, options);\n if (isImage(metadata.mimeType ?? file.type)) {\n await this.trackFileIds(metadata.fileId);\n }\n return metadata;\n };\n\n public getFileDownloadUrl = (\n file: FileMetadata,\n ): Promise<{ downloadUrl: string }> => {\n if (!this.openai) {\n return Promise.reject(new NotSupportedError(\"getFileDownloadUrl\"));\n }\n return this.openai.getFileDownloadUrl(file);\n };\n\n public selectFiles = async (): Promise<FileMetadata[]> => {\n if (!this.openai) {\n throw new NotSupportedError(\"selectFiles\");\n }\n if (!this.openai.selectFiles) {\n throw new Error(\n \"selectFiles is not supported by the current host version.\",\n );\n }\n const files = await this.openai.selectFiles();\n const imageIds: string[] = [];\n for (const file of files) {\n if (isImage(file.mimeType)) {\n imageIds.push(file.fileId);\n }\n }\n if (imageIds.length > 0) {\n await this.trackFileIds(...imageIds);\n }\n return files;\n };\n\n public openModal = (options: RequestModalOptions): void => {\n if (this.openai) {\n this.openai.requestModal(options);\n return;\n }\n this._polyfillDisplay = { mode: \"modal\", params: options.params };\n this.polyfillDisplayListeners.forEach((l) => {\n l();\n });\n };\n\n public setOpenInAppUrl = (href: string): Promise<void> => {\n if (!this.openai) {\n return Promise.reject(new NotSupportedError(\"setOpenInAppUrl\"));\n }\n const trimmed = href.trim();\n if (!trimmed) {\n return Promise.reject(new Error(\"The href parameter is required.\"));\n }\n return this.openai.setOpenInAppUrl({ href: trimmed });\n };\n\n public closeModal = (): void => {\n if (this.openai) {\n return; // host owns modal lifecycle\n }\n this._polyfillDisplay = { mode: \"inline\" };\n this.polyfillDisplayListeners.forEach((l) => {\n l();\n });\n };\n\n private async trackFileIds(...fileIds: string[]): Promise<void> {\n if (!this.openai) {\n return;\n }\n const current = this.openai.widgetState;\n const state: AppsSdkWidgetState = current\n ? { ...current }\n : { modelContent: {}, privateContent: {} };\n if (!state.imageIds) {\n state.imageIds = [];\n }\n state.imageIds.push(...fileIds);\n await this.openai.setWidgetState(state);\n }\n\n // ---- viewState persistence helpers ----\n\n private subscribeToViewUUID(): void {\n this.unsubscribeViewUUID = this.mcp.subscribe(\"toolResult\")(() => {\n const toolResult = this.mcp.getSnapshot(\"toolResult\");\n const viewUUID = (\n toolResult?._meta as Record<string, unknown> | undefined\n )?.viewUUID as string | undefined;\n if (viewUUID && viewUUID !== this._viewUUID) {\n this._viewUUID = viewUUID;\n this.restoreFromLocalStorage(viewUUID);\n }\n });\n }\n\n private restoreFromLocalStorage(viewUUID: string): void {\n try {\n const existingKey = findStorageKey(viewUUID);\n if (existingKey) {\n const stored = localStorage.getItem(existingKey);\n if (stored !== null) {\n this._viewState = JSON.parse(stored);\n this.viewStateListeners.forEach((l) => {\n l();\n });\n }\n }\n } catch (err) {\n console.error(err);\n }\n }\n\n protected persistToLocalStorage(state: Record<string, unknown> | null): void {\n if (!this._viewUUID || state === null) {\n return;\n }\n try {\n const oldKey = findStorageKey(this._viewUUID);\n if (oldKey) {\n localStorage.removeItem(oldKey);\n }\n const newKey = `${STORAGE_PREFIX}${Date.now()}:${this._viewUUID}`;\n localStorage.setItem(newKey, JSON.stringify(state));\n const keys: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(STORAGE_PREFIX)) {\n keys.push(key);\n }\n }\n if (keys.length <= MAX_STORAGE_ENTRIES) {\n return;\n }\n keys.sort();\n const toRemove = keys.slice(0, keys.length - MAX_STORAGE_ENTRIES);\n for (const key of toRemove) {\n localStorage.removeItem(key);\n }\n } catch (err) {\n console.error(err);\n }\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};