skybridge 0.0.0-dev.e9705ff → 0.0.0-dev.e99ee17

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 (648) hide show
  1. package/LICENSE +21 -674
  2. package/README.md +126 -386
  3. package/bin/run.js +5 -0
  4. package/dist/cli/build-helpers.d.ts +11 -0
  5. package/dist/cli/build-helpers.js +107 -0
  6. package/dist/cli/build-helpers.js.map +1 -0
  7. package/dist/cli/build-helpers.test.js +132 -0
  8. package/dist/cli/build-helpers.test.js.map +1 -0
  9. package/dist/cli/build-steps.d.ts +2 -0
  10. package/dist/cli/build-steps.js +73 -0
  11. package/dist/cli/build-steps.js.map +1 -0
  12. package/dist/cli/build-steps.test.js +52 -0
  13. package/dist/cli/build-steps.test.js.map +1 -0
  14. package/dist/cli/detect-port.d.ts +18 -0
  15. package/dist/cli/detect-port.js +49 -0
  16. package/dist/cli/detect-port.js.map +1 -0
  17. package/dist/cli/header.d.ts +4 -0
  18. package/dist/cli/header.js +6 -0
  19. package/dist/cli/header.js.map +1 -0
  20. package/dist/cli/resolve-skybridge-config.d.ts +5 -0
  21. package/dist/cli/resolve-skybridge-config.js +18 -0
  22. package/dist/cli/resolve-skybridge-config.js.map +1 -0
  23. package/dist/cli/run-command.d.ts +2 -0
  24. package/dist/cli/run-command.js +43 -0
  25. package/dist/cli/run-command.js.map +1 -0
  26. package/dist/cli/run-plain.d.ts +18 -0
  27. package/dist/cli/run-plain.js +90 -0
  28. package/dist/cli/run-plain.js.map +1 -0
  29. package/dist/cli/telemetry.d.ts +7 -0
  30. package/dist/cli/telemetry.js +125 -0
  31. package/dist/cli/telemetry.js.map +1 -0
  32. package/dist/cli/tunnel-control-server.d.ts +9 -0
  33. package/dist/cli/tunnel-control-server.js +31 -0
  34. package/dist/cli/tunnel-control-server.js.map +1 -0
  35. package/dist/cli/tunnel-control-server.test.js +39 -0
  36. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  37. package/dist/cli/tunnel-handler.d.ts +3 -0
  38. package/dist/cli/tunnel-handler.js +48 -0
  39. package/dist/cli/tunnel-handler.js.map +1 -0
  40. package/dist/cli/tunnel-handler.test.js +105 -0
  41. package/dist/cli/tunnel-handler.test.js.map +1 -0
  42. package/dist/cli/tunnel.d.ts +57 -0
  43. package/dist/cli/tunnel.js +154 -0
  44. package/dist/cli/tunnel.js.map +1 -0
  45. package/dist/cli/tunnel.test.js +190 -0
  46. package/dist/cli/tunnel.test.js.map +1 -0
  47. package/dist/cli/types.d.ts +5 -0
  48. package/dist/cli/types.js +2 -0
  49. package/dist/cli/types.js.map +1 -0
  50. package/dist/cli/use-execute-steps.d.ts +11 -0
  51. package/dist/cli/use-execute-steps.js +36 -0
  52. package/dist/cli/use-execute-steps.js.map +1 -0
  53. package/dist/cli/use-messages.d.ts +3 -0
  54. package/dist/cli/use-messages.js +11 -0
  55. package/dist/cli/use-messages.js.map +1 -0
  56. package/dist/cli/use-nodemon.d.ts +26 -0
  57. package/dist/cli/use-nodemon.js +106 -0
  58. package/dist/cli/use-nodemon.js.map +1 -0
  59. package/dist/cli/use-open-browser.d.ts +1 -0
  60. package/dist/cli/use-open-browser.js +44 -0
  61. package/dist/cli/use-open-browser.js.map +1 -0
  62. package/dist/cli/use-tunnel.d.ts +14 -0
  63. package/dist/cli/use-tunnel.js +131 -0
  64. package/dist/cli/use-tunnel.js.map +1 -0
  65. package/dist/cli/use-typescript-check.d.ts +15 -0
  66. package/dist/cli/use-typescript-check.js +97 -0
  67. package/dist/cli/use-typescript-check.js.map +1 -0
  68. package/dist/commands/build.d.ts +6 -0
  69. package/dist/commands/build.js +31 -0
  70. package/dist/commands/build.js.map +1 -0
  71. package/dist/commands/create.d.ts +9 -0
  72. package/dist/commands/create.js +30 -0
  73. package/dist/commands/create.js.map +1 -0
  74. package/dist/commands/dev.d.ts +13 -0
  75. package/dist/commands/dev.js +128 -0
  76. package/dist/commands/dev.js.map +1 -0
  77. package/dist/commands/start.d.ts +9 -0
  78. package/dist/commands/start.js +55 -0
  79. package/dist/commands/start.js.map +1 -0
  80. package/dist/commands/telemetry/disable.d.ts +5 -0
  81. package/dist/commands/telemetry/disable.js +14 -0
  82. package/dist/commands/telemetry/disable.js.map +1 -0
  83. package/dist/commands/telemetry/enable.d.ts +5 -0
  84. package/dist/commands/telemetry/enable.js +14 -0
  85. package/dist/commands/telemetry/enable.js.map +1 -0
  86. package/dist/commands/telemetry/status.d.ts +5 -0
  87. package/dist/commands/telemetry/status.js +14 -0
  88. package/dist/commands/telemetry/status.js.map +1 -0
  89. package/dist/context-warnings.d.ts +5 -0
  90. package/dist/context-warnings.js +31 -0
  91. package/dist/context-warnings.js.map +1 -0
  92. package/dist/context-warnings.test.js +28 -0
  93. package/dist/context-warnings.test.js.map +1 -0
  94. package/dist/server/app.d.ts +194 -0
  95. package/dist/server/app.js +266 -0
  96. package/dist/server/app.js.map +1 -0
  97. package/dist/server/app.test.js +97 -0
  98. package/dist/server/app.test.js.map +1 -0
  99. package/dist/server/asset-base-url-transform-plugin.d.ts +11 -0
  100. package/dist/server/asset-base-url-transform-plugin.js +48 -0
  101. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  102. package/dist/server/asset-base-url-transform-plugin.test.js +134 -0
  103. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  104. package/dist/server/auth/discovery.d.ts +33 -0
  105. package/dist/server/auth/discovery.js +56 -0
  106. package/dist/server/auth/discovery.js.map +1 -0
  107. package/dist/server/auth/discovery.test.js +93 -0
  108. package/dist/server/auth/discovery.test.js.map +1 -0
  109. package/dist/server/auth/index.d.ts +48 -0
  110. package/dist/server/auth/index.js +2 -0
  111. package/dist/server/auth/index.js.map +1 -0
  112. package/dist/server/auth/providers/auth0.d.ts +40 -0
  113. package/dist/server/auth/providers/auth0.js +36 -0
  114. package/dist/server/auth/providers/auth0.js.map +1 -0
  115. package/dist/server/auth/providers/auth0.test.js +50 -0
  116. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  117. package/dist/server/auth/providers/authplane.d.ts +49 -0
  118. package/dist/server/auth/providers/authplane.js +57 -0
  119. package/dist/server/auth/providers/authplane.js.map +1 -0
  120. package/dist/server/auth/providers/authplane.test.js +143 -0
  121. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  122. package/dist/server/auth/providers/clerk.d.ts +51 -0
  123. package/dist/server/auth/providers/clerk.js +19 -0
  124. package/dist/server/auth/providers/clerk.js.map +1 -0
  125. package/dist/server/auth/providers/clerk.test.js +30 -0
  126. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  127. package/dist/server/auth/providers/custom.d.ts +42 -0
  128. package/dist/server/auth/providers/custom.js +59 -0
  129. package/dist/server/auth/providers/custom.js.map +1 -0
  130. package/dist/server/auth/providers/custom.test.js +161 -0
  131. package/dist/server/auth/providers/custom.test.js.map +1 -0
  132. package/dist/server/auth/providers/descope.d.ts +44 -0
  133. package/dist/server/auth/providers/descope.js +44 -0
  134. package/dist/server/auth/providers/descope.js.map +1 -0
  135. package/dist/server/auth/providers/descope.test.js +62 -0
  136. package/dist/server/auth/providers/descope.test.js.map +1 -0
  137. package/dist/server/auth/providers/shared.d.ts +2 -0
  138. package/dist/server/auth/providers/shared.js +6 -0
  139. package/dist/server/auth/providers/shared.js.map +1 -0
  140. package/dist/server/auth/providers/shared.test.js +10 -0
  141. package/dist/server/auth/providers/shared.test.js.map +1 -0
  142. package/dist/server/auth/providers/stytch.d.ts +25 -0
  143. package/dist/server/auth/providers/stytch.js +16 -0
  144. package/dist/server/auth/providers/stytch.js.map +1 -0
  145. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  146. package/dist/server/auth/providers/verify-spy.js +21 -0
  147. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  148. package/dist/server/auth/providers/workos.d.ts +34 -0
  149. package/dist/server/auth/providers/workos.js +16 -0
  150. package/dist/server/auth/providers/workos.js.map +1 -0
  151. package/dist/server/auth/security-schemes.d.ts +23 -0
  152. package/dist/server/auth/security-schemes.js +64 -0
  153. package/dist/server/auth/security-schemes.js.map +1 -0
  154. package/dist/server/auth/security-schemes.test.js +99 -0
  155. package/dist/server/auth/security-schemes.test.js.map +1 -0
  156. package/dist/server/auth/setup.d.ts +6 -0
  157. package/dist/server/auth/setup.js +91 -0
  158. package/dist/server/auth/setup.js.map +1 -0
  159. package/dist/server/auth/setup.test.js +514 -0
  160. package/dist/server/auth/setup.test.js.map +1 -0
  161. package/dist/server/auth/verify.d.ts +48 -0
  162. package/dist/server/auth/verify.js +62 -0
  163. package/dist/server/auth/verify.js.map +1 -0
  164. package/dist/server/auth/verify.test.js +165 -0
  165. package/dist/server/auth/verify.test.js.map +1 -0
  166. package/dist/server/auth-extra.test-d.js +130 -0
  167. package/dist/server/auth-extra.test-d.js.map +1 -0
  168. package/dist/server/auth.d.ts +57 -0
  169. package/dist/server/auth.js +27 -0
  170. package/dist/server/auth.js.map +1 -0
  171. package/dist/server/build-manifest.test.js +28 -0
  172. package/dist/server/build-manifest.test.js.map +1 -0
  173. package/dist/server/content-helpers.d.ts +67 -0
  174. package/dist/server/content-helpers.js +79 -0
  175. package/dist/server/content-helpers.js.map +1 -0
  176. package/dist/server/content-helpers.test.d.ts +1 -0
  177. package/dist/server/content-helpers.test.js +70 -0
  178. package/dist/server/content-helpers.test.js.map +1 -0
  179. package/dist/server/events.d.ts +113 -0
  180. package/dist/server/events.js +318 -0
  181. package/dist/server/events.js.map +1 -0
  182. package/dist/server/events.test.d.ts +1 -0
  183. package/dist/server/events.test.js +172 -0
  184. package/dist/server/events.test.js.map +1 -0
  185. package/dist/server/express.d.ts +31 -0
  186. package/dist/server/express.js +112 -0
  187. package/dist/server/express.js.map +1 -0
  188. package/dist/server/express.test.d.ts +1 -0
  189. package/dist/server/express.test.js +609 -0
  190. package/dist/server/express.test.js.map +1 -0
  191. package/dist/server/file-ref.d.ts +28 -0
  192. package/dist/server/file-ref.js +27 -0
  193. package/dist/server/file-ref.js.map +1 -0
  194. package/dist/server/form-input.d.ts +120 -0
  195. package/dist/server/form-input.js +89 -0
  196. package/dist/server/form-input.js.map +1 -0
  197. package/dist/server/host.d.ts +2 -0
  198. package/dist/server/host.js +11 -0
  199. package/dist/server/host.js.map +1 -0
  200. package/dist/server/host.test.d.ts +1 -0
  201. package/dist/server/host.test.js +13 -0
  202. package/dist/server/host.test.js.map +1 -0
  203. package/dist/server/index.d.ts +24 -0
  204. package/dist/server/index.js +20 -0
  205. package/dist/server/index.js.map +1 -0
  206. package/dist/{src/server → server}/inferUtilityTypes.d.ts +15 -5
  207. package/dist/server/inferUtilityTypes.js.map +1 -0
  208. package/dist/server/mcp-errors.test.d.ts +1 -0
  209. package/dist/server/mcp-errors.test.js +41 -0
  210. package/dist/server/mcp-errors.test.js.map +1 -0
  211. package/dist/server/metric.d.ts +14 -0
  212. package/dist/server/metric.js +62 -0
  213. package/dist/server/metric.js.map +1 -0
  214. package/dist/server/middleware.d.ts +162 -0
  215. package/dist/server/middleware.js +126 -0
  216. package/dist/server/middleware.js.map +1 -0
  217. package/dist/server/middleware.test-d.d.ts +1 -0
  218. package/dist/server/middleware.test-d.js +75 -0
  219. package/dist/server/middleware.test-d.js.map +1 -0
  220. package/dist/server/middleware.test.d.ts +1 -0
  221. package/dist/server/middleware.test.js +601 -0
  222. package/dist/server/middleware.test.js.map +1 -0
  223. package/dist/server/register-tool.test.d.ts +1 -0
  224. package/dist/server/register-tool.test.js +230 -0
  225. package/dist/server/register-tool.test.js.map +1 -0
  226. package/dist/server/requestOrigin.d.ts +7 -0
  227. package/dist/server/requestOrigin.js +25 -0
  228. package/dist/server/requestOrigin.js.map +1 -0
  229. package/dist/server/server.d.ts +664 -0
  230. package/dist/server/server.js +799 -0
  231. package/dist/server/server.js.map +1 -0
  232. package/dist/server/skills-integration.test.d.ts +1 -0
  233. package/dist/server/skills-integration.test.js +86 -0
  234. package/dist/server/skills-integration.test.js.map +1 -0
  235. package/dist/server/skills.d.ts +27 -0
  236. package/dist/server/skills.js +188 -0
  237. package/dist/server/skills.js.map +1 -0
  238. package/dist/server/skills.test.d.ts +1 -0
  239. package/dist/server/skills.test.js +243 -0
  240. package/dist/server/skills.test.js.map +1 -0
  241. package/dist/{src/server → server}/templateHelper.d.ts +2 -4
  242. package/dist/server/templateHelper.js +11 -0
  243. package/dist/server/templateHelper.js.map +1 -0
  244. package/dist/server/templates.generated.d.ts +4 -0
  245. package/dist/server/templates.generated.js +43 -0
  246. package/dist/server/templates.generated.js.map +1 -0
  247. package/dist/server/tool-extra.test.d.ts +1 -0
  248. package/dist/server/tool-extra.test.js +167 -0
  249. package/dist/server/tool-extra.test.js.map +1 -0
  250. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  251. package/dist/server/tunnel-proxy-router.js +110 -0
  252. package/dist/server/tunnel-proxy-router.js.map +1 -0
  253. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  254. package/dist/server/tunnel-proxy-router.test.js +229 -0
  255. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  256. package/dist/server/view-name.test-d.d.ts +1 -0
  257. package/dist/server/view-name.test-d.js +8 -0
  258. package/dist/server/view-name.test-d.js.map +1 -0
  259. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  260. package/dist/server/view-resource-resolution.test.js +176 -0
  261. package/dist/server/view-resource-resolution.test.js.map +1 -0
  262. package/dist/server/viewsDevServer.d.ts +14 -0
  263. package/dist/server/viewsDevServer.js +48 -0
  264. package/dist/server/viewsDevServer.js.map +1 -0
  265. package/dist/test/utils.d.ts +125 -0
  266. package/dist/test/utils.js +266 -0
  267. package/dist/test/utils.js.map +1 -0
  268. package/dist/test/view.test.d.ts +1 -0
  269. package/dist/test/view.test.js +540 -0
  270. package/dist/test/view.test.js.map +1 -0
  271. package/dist/version.d.ts +1 -0
  272. package/dist/version.js +3 -0
  273. package/dist/version.js.map +1 -0
  274. package/dist/views/index.d.ts +10 -0
  275. package/dist/views/index.js +3 -0
  276. package/dist/views/index.js.map +1 -0
  277. package/dist/views/scan-views.d.ts +16 -0
  278. package/dist/views/scan-views.js +88 -0
  279. package/dist/views/scan-views.js.map +1 -0
  280. package/dist/views/scan-views.test.d.ts +1 -0
  281. package/dist/views/scan-views.test.js +99 -0
  282. package/dist/views/scan-views.test.js.map +1 -0
  283. package/dist/views/validate-view.d.ts +1 -0
  284. package/dist/views/validate-view.js +9 -0
  285. package/dist/views/validate-view.js.map +1 -0
  286. package/dist/views/validate-view.test.d.ts +1 -0
  287. package/dist/views/validate-view.test.js +24 -0
  288. package/dist/views/validate-view.test.js.map +1 -0
  289. package/dist/web/bridges/adaptor.d.ts +62 -0
  290. package/dist/web/bridges/adaptor.js +471 -0
  291. package/dist/web/bridges/adaptor.js.map +1 -0
  292. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  293. package/dist/web/bridges/adaptor.test.js +264 -0
  294. package/dist/web/bridges/adaptor.test.js.map +1 -0
  295. package/dist/web/bridges/apps-sdk/bridge.d.ts +15 -0
  296. package/dist/web/bridges/apps-sdk/bridge.js +58 -0
  297. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
  298. package/dist/web/bridges/apps-sdk/index.d.ts +4 -0
  299. package/dist/web/bridges/apps-sdk/index.js +4 -0
  300. package/dist/web/bridges/apps-sdk/index.js.map +1 -0
  301. package/dist/web/bridges/apps-sdk/types.d.ts +133 -0
  302. package/dist/{src/web → web/bridges/apps-sdk}/types.js +0 -1
  303. package/dist/web/bridges/apps-sdk/types.js.map +1 -0
  304. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +13 -0
  305. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +18 -0
  306. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
  307. package/dist/web/bridges/get-adaptor.d.ts +9 -0
  308. package/dist/web/bridges/get-adaptor.js +10 -0
  309. package/dist/web/bridges/get-adaptor.js.map +1 -0
  310. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  311. package/dist/web/bridges/get-adaptor.test.js +32 -0
  312. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  313. package/dist/web/bridges/index.d.ts +5 -0
  314. package/dist/web/bridges/index.js +6 -0
  315. package/dist/web/bridges/index.js.map +1 -0
  316. package/dist/web/bridges/mcp-app/bridge.d.ts +39 -0
  317. package/dist/web/bridges/mcp-app/bridge.js +175 -0
  318. package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
  319. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  320. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  321. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  322. package/dist/web/bridges/mcp-app/index.d.ts +3 -0
  323. package/dist/web/bridges/mcp-app/index.js +3 -0
  324. package/dist/web/bridges/mcp-app/index.js.map +1 -0
  325. package/dist/web/bridges/mcp-app/types.d.ts +25 -0
  326. package/dist/web/bridges/mcp-app/types.js +2 -0
  327. package/dist/web/bridges/mcp-app/types.js.map +1 -0
  328. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +19 -0
  329. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +19 -0
  330. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
  331. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.d.ts +1 -0
  332. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +26 -0
  333. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
  334. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  335. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  336. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  337. package/dist/web/bridges/types.d.ts +272 -0
  338. package/dist/web/bridges/types.js +15 -0
  339. package/dist/web/bridges/types.js.map +1 -0
  340. package/dist/web/bridges/types.test.d.ts +1 -0
  341. package/dist/web/bridges/types.test.js +19 -0
  342. package/dist/web/bridges/types.test.js.map +1 -0
  343. package/dist/web/bridges/use-host-context.d.ts +7 -0
  344. package/dist/web/bridges/use-host-context.js +13 -0
  345. package/dist/web/bridges/use-host-context.js.map +1 -0
  346. package/dist/web/components/modal-provider.d.ts +4 -0
  347. package/dist/web/components/modal-provider.js +46 -0
  348. package/dist/web/components/modal-provider.js.map +1 -0
  349. package/dist/web/create-store.d.ts +29 -0
  350. package/dist/web/create-store.js +64 -0
  351. package/dist/web/create-store.js.map +1 -0
  352. package/dist/web/create-store.test.d.ts +1 -0
  353. package/dist/web/create-store.test.js +132 -0
  354. package/dist/web/create-store.test.js.map +1 -0
  355. package/dist/web/data-llm.d.ts +47 -0
  356. package/dist/{src/web → web}/data-llm.js +44 -11
  357. package/dist/web/data-llm.js.map +1 -0
  358. package/dist/web/data-llm.test.d.ts +1 -0
  359. package/dist/web/data-llm.test.js +161 -0
  360. package/dist/web/data-llm.test.js.map +1 -0
  361. package/dist/web/generate-helpers.d.ts +124 -0
  362. package/dist/{src/web → web}/generate-helpers.js +42 -32
  363. package/dist/web/generate-helpers.js.map +1 -0
  364. package/dist/web/generate-helpers.test-d.d.ts +1 -0
  365. package/dist/{src/web → web}/generate-helpers.test-d.js +82 -24
  366. package/dist/web/generate-helpers.test-d.js.map +1 -0
  367. package/dist/web/generate-helpers.test.d.ts +1 -0
  368. package/dist/{src/web → web}/generate-helpers.test.js +2 -2
  369. package/dist/web/generate-helpers.test.js.map +1 -0
  370. package/dist/{src/web → web}/helpers/state.d.ts +2 -2
  371. package/dist/web/helpers/state.js +45 -0
  372. package/dist/web/helpers/state.js.map +1 -0
  373. package/dist/web/helpers/state.test.d.ts +1 -0
  374. package/dist/web/helpers/state.test.js +53 -0
  375. package/dist/web/helpers/state.test.js.map +1 -0
  376. package/dist/web/hooks/index.d.ts +20 -0
  377. package/dist/web/hooks/index.js +21 -0
  378. package/dist/web/hooks/index.js.map +1 -0
  379. package/dist/web/hooks/openai-extensions.test.d.ts +1 -0
  380. package/dist/web/hooks/openai-extensions.test.js +107 -0
  381. package/dist/web/hooks/openai-extensions.test.js.map +1 -0
  382. package/dist/web/hooks/test/utils.d.ts +21 -0
  383. package/dist/web/hooks/test/utils.js +75 -0
  384. package/dist/web/hooks/test/utils.js.map +1 -0
  385. package/dist/{src/web → web}/hooks/use-call-tool.d.ts +48 -2
  386. package/dist/web/hooks/use-call-tool.js +101 -0
  387. package/dist/web/hooks/use-call-tool.js.map +1 -0
  388. package/dist/web/hooks/use-call-tool.test-d.d.ts +1 -0
  389. package/dist/{src/web → web}/hooks/use-call-tool.test-d.js +1 -1
  390. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -0
  391. package/dist/web/hooks/use-call-tool.test.d.ts +1 -0
  392. package/dist/{src/web → web}/hooks/use-call-tool.test.js +104 -39
  393. package/dist/web/hooks/use-call-tool.test.js.map +1 -0
  394. package/dist/web/hooks/use-deep-link.d.ts +22 -0
  395. package/dist/web/hooks/use-deep-link.js +34 -0
  396. package/dist/web/hooks/use-deep-link.js.map +1 -0
  397. package/dist/web/hooks/use-display-mode.d.ts +24 -0
  398. package/dist/web/hooks/use-display-mode.js +29 -0
  399. package/dist/web/hooks/use-display-mode.js.map +1 -0
  400. package/dist/web/hooks/use-display-mode.test-d.d.ts +1 -0
  401. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  402. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  403. package/dist/web/hooks/use-display-mode.test.d.ts +1 -0
  404. package/dist/web/hooks/use-display-mode.test.js +77 -0
  405. package/dist/web/hooks/use-display-mode.test.js.map +1 -0
  406. package/dist/web/hooks/use-download.d.ts +3 -0
  407. package/dist/web/hooks/use-download.js +7 -0
  408. package/dist/web/hooks/use-download.js.map +1 -0
  409. package/dist/web/hooks/use-download.test.d.ts +1 -0
  410. package/dist/web/hooks/use-download.test.js +103 -0
  411. package/dist/web/hooks/use-download.test.js.map +1 -0
  412. package/dist/web/hooks/use-file-resource.d.ts +37 -0
  413. package/dist/web/hooks/use-file-resource.js +98 -0
  414. package/dist/web/hooks/use-file-resource.js.map +1 -0
  415. package/dist/web/hooks/use-file-resource.test.d.ts +1 -0
  416. package/dist/web/hooks/use-file-resource.test.js +65 -0
  417. package/dist/web/hooks/use-file-resource.test.js.map +1 -0
  418. package/dist/web/hooks/use-files.d.ts +39 -0
  419. package/dist/web/hooks/use-files.js +42 -0
  420. package/dist/web/hooks/use-files.js.map +1 -0
  421. package/dist/web/hooks/use-files.test.d.ts +1 -0
  422. package/dist/web/hooks/use-files.test.js +62 -0
  423. package/dist/web/hooks/use-files.test.js.map +1 -0
  424. package/dist/web/hooks/use-host.d.ts +44 -0
  425. package/dist/web/hooks/use-host.js +45 -0
  426. package/dist/web/hooks/use-host.js.map +1 -0
  427. package/dist/web/hooks/use-host.test.d.ts +1 -0
  428. package/dist/web/hooks/use-host.test.js +59 -0
  429. package/dist/web/hooks/use-host.test.js.map +1 -0
  430. package/dist/web/hooks/use-model-context.d.ts +44 -0
  431. package/dist/web/hooks/use-model-context.js +63 -0
  432. package/dist/web/hooks/use-model-context.js.map +1 -0
  433. package/dist/web/hooks/use-open-external.d.ts +20 -0
  434. package/dist/web/hooks/use-open-external.js +24 -0
  435. package/dist/web/hooks/use-open-external.js.map +1 -0
  436. package/dist/web/hooks/use-open-external.test.d.ts +1 -0
  437. package/dist/web/hooks/use-open-external.test.js +75 -0
  438. package/dist/web/hooks/use-open-external.test.js.map +1 -0
  439. package/dist/web/hooks/use-open-file.d.ts +20 -0
  440. package/dist/web/hooks/use-open-file.js +25 -0
  441. package/dist/web/hooks/use-open-file.js.map +1 -0
  442. package/dist/web/hooks/use-register-view-tool.d.ts +37 -0
  443. package/dist/web/hooks/use-register-view-tool.js +50 -0
  444. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  445. package/dist/web/hooks/use-request-close.d.ts +16 -0
  446. package/dist/web/hooks/use-request-close.js +21 -0
  447. package/dist/web/hooks/use-request-close.js.map +1 -0
  448. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  449. package/dist/web/hooks/use-request-close.test.js +47 -0
  450. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  451. package/dist/web/hooks/use-request-modal.d.ts +24 -0
  452. package/dist/web/hooks/use-request-modal.js +31 -0
  453. package/dist/web/hooks/use-request-modal.js.map +1 -0
  454. package/dist/web/hooks/use-request-modal.test.d.ts +1 -0
  455. package/dist/web/hooks/use-request-modal.test.js +71 -0
  456. package/dist/web/hooks/use-request-modal.test.js.map +1 -0
  457. package/dist/web/hooks/use-request-size.d.ts +20 -0
  458. package/dist/web/hooks/use-request-size.js +24 -0
  459. package/dist/web/hooks/use-request-size.js.map +1 -0
  460. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  461. package/dist/web/hooks/use-request-size.test.js +47 -0
  462. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  463. package/dist/web/hooks/use-send-follow-up-message.d.ts +25 -0
  464. package/dist/web/hooks/use-send-follow-up-message.js +31 -0
  465. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
  466. package/dist/web/hooks/use-set-open-in-app-url.d.ts +18 -0
  467. package/dist/web/hooks/use-set-open-in-app-url.js +25 -0
  468. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  469. package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
  470. package/dist/web/hooks/use-set-open-in-app-url.test.js +57 -0
  471. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  472. package/dist/web/hooks/use-tool-info.d.ts +68 -0
  473. package/dist/web/hooks/use-tool-info.js +48 -0
  474. package/dist/web/hooks/use-tool-info.js.map +1 -0
  475. package/dist/web/hooks/use-tool-info.test-d.d.ts +1 -0
  476. package/dist/{src/web → web}/hooks/use-tool-info.test-d.js +19 -7
  477. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
  478. package/dist/web/hooks/use-tool-info.test.d.ts +1 -0
  479. package/dist/web/hooks/use-tool-info.test.js +135 -0
  480. package/dist/web/hooks/use-tool-info.test.js.map +1 -0
  481. package/dist/web/hooks/use-user.d.ts +21 -0
  482. package/dist/web/hooks/use-user.js +38 -0
  483. package/dist/web/hooks/use-user.js.map +1 -0
  484. package/dist/web/hooks/use-user.test.d.ts +1 -0
  485. package/dist/web/hooks/use-user.test.js +170 -0
  486. package/dist/web/hooks/use-user.test.js.map +1 -0
  487. package/dist/web/hooks/use-view-state.d.ts +25 -0
  488. package/dist/web/hooks/use-view-state.js +42 -0
  489. package/dist/web/hooks/use-view-state.js.map +1 -0
  490. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  491. package/dist/web/hooks/use-view-state.test.js +212 -0
  492. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  493. package/dist/web/hooks/use-viewport.d.ts +20 -0
  494. package/dist/web/hooks/use-viewport.js +21 -0
  495. package/dist/web/hooks/use-viewport.js.map +1 -0
  496. package/dist/web/hooks/use-viewport.test.d.ts +1 -0
  497. package/dist/web/hooks/use-viewport.test.js +109 -0
  498. package/dist/web/hooks/use-viewport.test.js.map +1 -0
  499. package/dist/{src/web → web}/index.d.ts +5 -5
  500. package/dist/{src/web → web}/index.js +5 -5
  501. package/dist/web/index.js.map +1 -0
  502. package/dist/web/mount-view.d.ts +21 -0
  503. package/dist/web/mount-view.js +43 -0
  504. package/dist/web/mount-view.js.map +1 -0
  505. package/dist/{src/web → web}/proxy.js +6 -2
  506. package/dist/web/proxy.js.map +1 -0
  507. package/dist/web/types.d.ts +20 -0
  508. package/dist/web/types.js +2 -0
  509. package/dist/web/types.js.map +1 -0
  510. package/package.json +92 -39
  511. package/tsconfig.base.json +33 -0
  512. package/dist/src/server/index.d.ts +0 -4
  513. package/dist/src/server/index.js +0 -3
  514. package/dist/src/server/index.js.map +0 -1
  515. package/dist/src/server/inferUtilityTypes.js.map +0 -1
  516. package/dist/src/server/server.d.ts +0 -48
  517. package/dist/src/server/server.js +0 -62
  518. package/dist/src/server/server.js.map +0 -1
  519. package/dist/src/server/templateHelper.js +0 -29
  520. package/dist/src/server/templateHelper.js.map +0 -1
  521. package/dist/src/server/templates/development.hbs +0 -12
  522. package/dist/src/server/templates/production.hbs +0 -6
  523. package/dist/src/server/widgetsDevServer.d.ts +0 -12
  524. package/dist/src/server/widgetsDevServer.js +0 -39
  525. package/dist/src/server/widgetsDevServer.js.map +0 -1
  526. package/dist/src/test/utils.d.ts +0 -89
  527. package/dist/src/test/utils.js +0 -164
  528. package/dist/src/test/utils.js.map +0 -1
  529. package/dist/src/test/widget.test.js +0 -90
  530. package/dist/src/test/widget.test.js.map +0 -1
  531. package/dist/src/web/create-store.d.ts +0 -3
  532. package/dist/src/web/create-store.js +0 -25
  533. package/dist/src/web/create-store.js.map +0 -1
  534. package/dist/src/web/create-store.test.js +0 -70
  535. package/dist/src/web/create-store.test.js.map +0 -1
  536. package/dist/src/web/data-llm.d.ts +0 -14
  537. package/dist/src/web/data-llm.js.map +0 -1
  538. package/dist/src/web/data-llm.test.js +0 -76
  539. package/dist/src/web/data-llm.test.js.map +0 -1
  540. package/dist/src/web/generate-helpers.d.ts +0 -113
  541. package/dist/src/web/generate-helpers.js.map +0 -1
  542. package/dist/src/web/generate-helpers.test-d.js.map +0 -1
  543. package/dist/src/web/generate-helpers.test.js.map +0 -1
  544. package/dist/src/web/helpers/state.js +0 -40
  545. package/dist/src/web/helpers/state.js.map +0 -1
  546. package/dist/src/web/helpers/state.test.js +0 -46
  547. package/dist/src/web/helpers/state.test.js.map +0 -1
  548. package/dist/src/web/hooks/index.d.ts +0 -12
  549. package/dist/src/web/hooks/index.js +0 -13
  550. package/dist/src/web/hooks/index.js.map +0 -1
  551. package/dist/src/web/hooks/use-call-tool.js +0 -60
  552. package/dist/src/web/hooks/use-call-tool.js.map +0 -1
  553. package/dist/src/web/hooks/use-call-tool.test-d.js.map +0 -1
  554. package/dist/src/web/hooks/use-call-tool.test.js.map +0 -1
  555. package/dist/src/web/hooks/use-display-mode.d.ts +0 -4
  556. package/dist/src/web/hooks/use-display-mode.js +0 -7
  557. package/dist/src/web/hooks/use-display-mode.js.map +0 -1
  558. package/dist/src/web/hooks/use-display-mode.test.js +0 -40
  559. package/dist/src/web/hooks/use-display-mode.test.js.map +0 -1
  560. package/dist/src/web/hooks/use-files.d.ts +0 -10
  561. package/dist/src/web/hooks/use-files.js +0 -7
  562. package/dist/src/web/hooks/use-files.js.map +0 -1
  563. package/dist/src/web/hooks/use-files.test.js +0 -29
  564. package/dist/src/web/hooks/use-files.test.js.map +0 -1
  565. package/dist/src/web/hooks/use-locale.d.ts +0 -1
  566. package/dist/src/web/hooks/use-locale.js +0 -5
  567. package/dist/src/web/hooks/use-locale.js.map +0 -1
  568. package/dist/src/web/hooks/use-locale.test.js +0 -21
  569. package/dist/src/web/hooks/use-locale.test.js.map +0 -1
  570. package/dist/src/web/hooks/use-open-external.d.ts +0 -1
  571. package/dist/src/web/hooks/use-open-external.js +0 -6
  572. package/dist/src/web/hooks/use-open-external.js.map +0 -1
  573. package/dist/src/web/hooks/use-open-external.test.js +0 -24
  574. package/dist/src/web/hooks/use-open-external.test.js.map +0 -1
  575. package/dist/src/web/hooks/use-openai-global.d.ts +0 -2
  576. package/dist/src/web/hooks/use-openai-global.js +0 -23
  577. package/dist/src/web/hooks/use-openai-global.js.map +0 -1
  578. package/dist/src/web/hooks/use-request-modal.d.ts +0 -6
  579. package/dist/src/web/hooks/use-request-modal.js +0 -9
  580. package/dist/src/web/hooks/use-request-modal.js.map +0 -1
  581. package/dist/src/web/hooks/use-request-modal.test.js +0 -24
  582. package/dist/src/web/hooks/use-request-modal.test.js.map +0 -1
  583. package/dist/src/web/hooks/use-send-follow-up-message.d.ts +0 -1
  584. package/dist/src/web/hooks/use-send-follow-up-message.js +0 -11
  585. package/dist/src/web/hooks/use-send-follow-up-message.js.map +0 -1
  586. package/dist/src/web/hooks/use-theme.d.ts +0 -1
  587. package/dist/src/web/hooks/use-theme.js +0 -5
  588. package/dist/src/web/hooks/use-theme.js.map +0 -1
  589. package/dist/src/web/hooks/use-theme.test.js +0 -26
  590. package/dist/src/web/hooks/use-theme.test.js.map +0 -1
  591. package/dist/src/web/hooks/use-tool-info.d.ts +0 -25
  592. package/dist/src/web/hooks/use-tool-info.js +0 -22
  593. package/dist/src/web/hooks/use-tool-info.js.map +0 -1
  594. package/dist/src/web/hooks/use-tool-info.test-d.js.map +0 -1
  595. package/dist/src/web/hooks/use-tool-info.test.js +0 -59
  596. package/dist/src/web/hooks/use-tool-info.test.js.map +0 -1
  597. package/dist/src/web/hooks/use-user-agent.d.ts +0 -1
  598. package/dist/src/web/hooks/use-user-agent.js +0 -5
  599. package/dist/src/web/hooks/use-user-agent.js.map +0 -1
  600. package/dist/src/web/hooks/use-user-agent.test.js +0 -31
  601. package/dist/src/web/hooks/use-user-agent.test.js.map +0 -1
  602. package/dist/src/web/hooks/use-widget-state.d.ts +0 -4
  603. package/dist/src/web/hooks/use-widget-state.js +0 -32
  604. package/dist/src/web/hooks/use-widget-state.js.map +0 -1
  605. package/dist/src/web/hooks/use-widget-state.test.js +0 -60
  606. package/dist/src/web/hooks/use-widget-state.test.js.map +0 -1
  607. package/dist/src/web/index.js.map +0 -1
  608. package/dist/src/web/mount-widget.d.ts +0 -1
  609. package/dist/src/web/mount-widget.js +0 -19
  610. package/dist/src/web/mount-widget.js.map +0 -1
  611. package/dist/src/web/plugin/data-llm.test.js +0 -81
  612. package/dist/src/web/plugin/data-llm.test.js.map +0 -1
  613. package/dist/src/web/plugin/plugin.d.ts +0 -2
  614. package/dist/src/web/plugin/plugin.js +0 -33
  615. package/dist/src/web/plugin/plugin.js.map +0 -1
  616. package/dist/src/web/plugin/transform-data-llm.d.ts +0 -12
  617. package/dist/src/web/plugin/transform-data-llm.js +0 -93
  618. package/dist/src/web/plugin/transform-data-llm.js.map +0 -1
  619. package/dist/src/web/plugin/transform-data-llm.test.js +0 -81
  620. package/dist/src/web/plugin/transform-data-llm.test.js.map +0 -1
  621. package/dist/src/web/proxy.js.map +0 -1
  622. package/dist/src/web/types.d.ts +0 -133
  623. package/dist/src/web/types.js.map +0 -1
  624. package/dist/vitest.config.d.ts +0 -2
  625. package/dist/vitest.config.js +0 -8
  626. package/dist/vitest.config.js.map +0 -1
  627. /package/dist/{src/test/widget.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
  628. /package/dist/{src/web/create-store.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  629. /package/dist/{src/web/data-llm.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  630. /package/dist/{src/web/generate-helpers.test-d.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
  631. /package/dist/{src/web/generate-helpers.test.d.ts → cli/tunnel.test.d.ts} +0 -0
  632. /package/dist/{src/web/helpers/state.test.d.ts → context-warnings.test.d.ts} +0 -0
  633. /package/dist/{src/web/hooks/use-call-tool.test-d.d.ts → server/app.test.d.ts} +0 -0
  634. /package/dist/{src/web/hooks/use-call-tool.test.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
  635. /package/dist/{src/web/hooks/use-files.test.d.ts → server/auth/discovery.test.d.ts} +0 -0
  636. /package/dist/{src/web/hooks/use-locale.test.d.ts → server/auth/providers/auth0.test.d.ts} +0 -0
  637. /package/dist/{src/web/hooks/use-open-external.test.d.ts → server/auth/providers/authplane.test.d.ts} +0 -0
  638. /package/dist/{src/web/hooks/use-request-modal.test.d.ts → server/auth/providers/clerk.test.d.ts} +0 -0
  639. /package/dist/{src/web/hooks/use-theme.test.d.ts → server/auth/providers/custom.test.d.ts} +0 -0
  640. /package/dist/{src/web/hooks/use-tool-info.test-d.d.ts → server/auth/providers/descope.test.d.ts} +0 -0
  641. /package/dist/{src/web/hooks/use-tool-info.test.d.ts → server/auth/providers/shared.test.d.ts} +0 -0
  642. /package/dist/{src/web/hooks/use-user-agent.test.d.ts → server/auth/security-schemes.test.d.ts} +0 -0
  643. /package/dist/{src/web/hooks/use-widget-state.test.d.ts → server/auth/setup.test.d.ts} +0 -0
  644. /package/dist/{src/web/plugin/data-llm.test.d.ts → server/auth/verify.test.d.ts} +0 -0
  645. /package/dist/{src/web/hooks/use-display-mode.test.d.ts → server/auth-extra.test-d.d.ts} +0 -0
  646. /package/dist/{src/web/plugin/transform-data-llm.test.d.ts → server/build-manifest.test.d.ts} +0 -0
  647. /package/dist/{src/server → server}/inferUtilityTypes.js +0 -0
  648. /package/dist/{src/web → web}/proxy.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-tools.test.js","sourceRoot":"","sources":["../../../../src/web/bridges/mcp-app/view-tools.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { waitFor } from \"@testing-library/react\";\nimport { act } from \"react\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport * as z from \"zod\";\nimport { MockResizeObserver } from \"../../hooks/test/utils.js\";\nimport { HostAdaptor } from \"../adaptor.js\";\nimport { McpAppBridge } from \"./bridge.js\";\n\ntype JsonRpcMessage = {\n jsonrpc: \"2.0\";\n id?: number;\n method?: string;\n params?: Record<string, unknown>;\n result?: Record<string, unknown>;\n error?: { message: string };\n};\n\nconst outgoing: JsonRpcMessage[] = [];\n\n/**\n * Stand-in MCP Apps host: replies to `ui/initialize` and records every message\n * the app posts so tests can assert on responses and notifications.\n */\nfunction installHostMock() {\n outgoing.length = 0;\n const postMessage = vi.fn((message: JsonRpcMessage) => {\n outgoing.push(message);\n if (message.method === \"ui/initialize\" && message.id !== undefined) {\n act(() => {\n window.dispatchEvent(\n new MessageEvent(\"message\", {\n source: window.parent,\n data: {\n jsonrpc: \"2.0\",\n id: message.id,\n result: {\n protocolVersion: \"2025-06-18\",\n hostInfo: { name: \"test-host\", version: \"1.0.0\" },\n hostCapabilities: {},\n hostContext: {},\n },\n },\n }),\n );\n });\n }\n });\n vi.stubGlobal(\"parent\", { postMessage });\n}\n\nlet nextId = 1000;\n\n/** Send a host → app JSON-RPC request and resolve with the full response (result or error). */\nasync function callHost(method: string, params: Record<string, unknown> = {}) {\n const id = ++nextId;\n act(() => {\n window.dispatchEvent(\n new MessageEvent(\"message\", {\n source: window.parent,\n data: { jsonrpc: \"2.0\", id, method, params },\n }),\n );\n });\n await waitFor(() => {\n expect(outgoing.some((m) => m.id === id)).toBe(true);\n });\n return outgoing.find((m) => m.id === id);\n}\n\ndescribe(\"McpApp view tools\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"skybridge\", {});\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n McpAppBridge.resetInstance();\n installHostMock();\n });\n\n afterEach(() => {\n vi.unstubAllGlobals();\n vi.clearAllMocks();\n });\n\n it(\"advertises the tools capability during ui/initialize\", async () => {\n await McpAppBridge.getInstance().getApp();\n const init = outgoing.find((m) => m.method === \"ui/initialize\");\n expect(init?.params?.appCapabilities).toMatchObject({\n tools: { listChanged: true },\n });\n });\n\n it(\"lists a registered view tool with its input schema\", async () => {\n const adaptor = new HostAdaptor();\n await McpAppBridge.getInstance().getApp();\n\n adaptor.registerViewTool(\n {\n name: \"chess_make_move\",\n description: \"Play a move\",\n inputSchema: { san: z.string() },\n annotations: { readOnlyHint: false },\n },\n () => ({ content: [{ type: \"text\", text: \"ok\" }] }),\n );\n\n const response = await callHost(\"tools/list\");\n const tools = response?.result?.tools as Array<{\n name: string;\n description?: string;\n inputSchema: { properties?: Record<string, unknown> };\n annotations?: { readOnlyHint?: boolean };\n }>;\n expect(tools).toHaveLength(1);\n const [tool] = tools;\n expect(tool?.name).toBe(\"chess_make_move\");\n expect(tool?.description).toBe(\"Play a move\");\n expect(tool?.inputSchema.properties).toHaveProperty(\"san\");\n expect(tool?.annotations?.readOnlyHint).toBe(false);\n });\n\n it(\"invokes the handler with validated args and returns its result\", async () => {\n const adaptor = new HostAdaptor();\n await McpAppBridge.getInstance().getApp();\n\n const handler = vi.fn(({ san }: { san: string }) => ({\n content: [{ type: \"text\" as const, text: `played ${san}` }],\n structuredContent: { lastMove: san },\n }));\n\n adaptor.registerViewTool(\n { name: \"chess_make_move\", inputSchema: { san: z.string() } },\n handler as never,\n );\n\n const response = await callHost(\"tools/call\", {\n name: \"chess_make_move\",\n arguments: { san: \"e4\" },\n });\n const result = response?.result;\n\n // ext-apps invokes the callback as `(args, extra)`; assert on the args only.\n expect(handler.mock.calls[0]?.[0]).toEqual({ san: \"e4\" });\n expect(result?.structuredContent).toEqual({ lastMove: \"e4\" });\n expect(result?.isError).toBeFalsy();\n expect(result?.content).toEqual([{ type: \"text\", text: \"played e4\" }]);\n });\n\n it(\"rejects the call without invoking the handler when args are invalid\", async () => {\n const adaptor = new HostAdaptor();\n await McpAppBridge.getInstance().getApp();\n\n const handler = vi.fn(() => ({ content: [] }));\n adaptor.registerViewTool(\n { name: \"chess_make_move\", inputSchema: { san: z.string() } },\n handler as never,\n );\n\n // ext-apps validates input against the schema and rejects with a JSON-RPC\n // error before the handler runs.\n const response = await callHost(\"tools/call\", {\n name: \"chess_make_move\",\n arguments: { san: 42 },\n });\n\n expect(handler).not.toHaveBeenCalled();\n expect(response?.error).toBeDefined();\n });\n\n it(\"rejects a call to an unknown tool\", async () => {\n await McpAppBridge.getInstance().getApp();\n const response = await callHost(\"tools/call\", {\n name: \"nope\",\n arguments: {},\n });\n expect(response?.error).toBeDefined();\n });\n\n it(\"removes the tool and notifies the host when unregistered\", async () => {\n const adaptor = new HostAdaptor();\n await McpAppBridge.getInstance().getApp();\n\n const unregister = adaptor.registerViewTool(\n { name: \"chess_reset\" },\n () => ({ content: [{ type: \"text\", text: \"reset\" }] }),\n );\n\n await waitFor(() => {\n expect(\n outgoing.some((m) => m.method === \"notifications/tools/list_changed\"),\n ).toBe(true);\n });\n\n let listed = await callHost(\"tools/list\");\n expect(listed?.result?.tools).toHaveLength(1);\n\n unregister();\n listed = await callHost(\"tools/list\");\n expect(listed?.result?.tools).toHaveLength(0);\n });\n});\n"]}
@@ -0,0 +1,272 @@
1
+ import type { CallToolResult, ContentBlock, EmbeddedResource, ResourceLink, ToolAnnotations } from "@modelcontextprotocol/client";
2
+ import type { McpUiUpdateModelContextRequest } from "@modelcontextprotocol/ext-apps";
3
+ import type { useSyncExternalStore } from "react";
4
+ import type { output as ZodOutput, ZodType } from "zod/v4";
5
+ /**
6
+ * Globals injected on `window.skybridge` by the host. Tells the view where to
7
+ * reach the MCP server.
8
+ */
9
+ export type SkybridgeProperties = {
10
+ serverUrl: string;
11
+ };
12
+ declare global {
13
+ interface Window {
14
+ skybridge: SkybridgeProperties;
15
+ }
16
+ }
17
+ /** Arguments passed to a tool call. `null` for tools that take no input. */
18
+ export type CallToolArgs = Record<string, unknown> | null;
19
+ /** Options for a tool call made from the view. */
20
+ export type CallToolOptions = {
21
+ /**
22
+ * Request timeout in milliseconds. Omit it to keep the SDK default (60s).
23
+ * Raise it for tools that wait on the user, such as ChatGPT forms.
24
+ */
25
+ timeout?: number;
26
+ };
27
+ /** Payload of `ui/update-model-context`. Content blocks may carry `_meta`. */
28
+ export type ModelContextParams = McpUiUpdateModelContextRequest["params"];
29
+ /**
30
+ * Result of a tool call as surfaced to the view: MCP `content` blocks plus
31
+ * the typed `structuredContent` and optional `meta`. `isError` is set when
32
+ * the server marks the call as failed.
33
+ */
34
+ export type CallToolResponse = {
35
+ content: CallToolResult["content"];
36
+ structuredContent: NonNullable<CallToolResult["structuredContent"]>;
37
+ isError: NonNullable<CallToolResult["isError"]>;
38
+ meta?: CallToolResult["_meta"];
39
+ };
40
+ /**
41
+ * How the view is laid out by the host. `"modal"` is host-driven (see
42
+ * {@link useRequestModal}); `"pip"`, `"inline"`, and `"fullscreen"` are
43
+ * requestable via {@link useDisplayMode}.
44
+ */
45
+ export type DisplayMode = "pip" | "inline" | "fullscreen" | "modal";
46
+ /** Subset of {@link DisplayMode} that the view can request from the host. */
47
+ export type RequestDisplayMode = Exclude<DisplayMode, "modal">;
48
+ /** Host theme. Mirror this in your view's styling for a native feel. */
49
+ export type Theme = "light" | "dark";
50
+ /** Coarse device class reported by the host. `"unknown"` when unavailable. */
51
+ export type DeviceType = "mobile" | "tablet" | "desktop" | "unknown";
52
+ /** Pixel insets the view should keep clear of (notches, home indicators, etc.). */
53
+ export type SafeAreaInsets = {
54
+ top: number;
55
+ right: number;
56
+ bottom: number;
57
+ left: number;
58
+ };
59
+ /** Wrapper around {@link SafeAreaInsets} exposed via {@link useViewport}. */
60
+ export type SafeArea = {
61
+ insets: SafeAreaInsets;
62
+ };
63
+ /** Device and input-capability hints exposed via {@link useUser}. */
64
+ export type UserAgent = {
65
+ device: {
66
+ type: DeviceType;
67
+ };
68
+ capabilities: {
69
+ hover: boolean;
70
+ touch: boolean;
71
+ };
72
+ };
73
+ /**
74
+ * Full snapshot of state the host exposes to the view. Most fields are
75
+ * better accessed through their dedicated hooks (`useViewport`, `useUser`,
76
+ * `useToolInfo`, etc.) — read this directly only for advanced cases.
77
+ */
78
+ export interface HostContext {
79
+ theme: Theme;
80
+ locale: string;
81
+ displayMode: DisplayMode;
82
+ safeArea: SafeArea;
83
+ maxHeight: number | undefined;
84
+ userAgent: UserAgent;
85
+ toolInput: Record<string, unknown> | null;
86
+ toolOutput: Record<string, unknown> | null;
87
+ toolResponseMetadata: Record<string, unknown> | null;
88
+ display: {
89
+ mode: DisplayMode;
90
+ params?: Record<string, unknown>;
91
+ };
92
+ viewState: Record<string, unknown> | null;
93
+ }
94
+ /** @internal `useSyncExternalStore` subscribe signature, re-exported for bridge implementations. */
95
+ export type Subscribe = Parameters<typeof useSyncExternalStore>[0];
96
+ /** @internal Bridge contract implemented by per-host bridge classes. */
97
+ export interface Bridge<Context> {
98
+ subscribe(key: keyof Context): Subscribe;
99
+ subscribe(keys: readonly (keyof Context)[]): Subscribe;
100
+ getSnapshot<K extends keyof Context>(key: K): Context[K] | undefined;
101
+ }
102
+ /** @internal Per-key snapshot store backing {@link useHostContext}. */
103
+ export type HostContextStore<K extends keyof HostContext> = {
104
+ subscribe: Subscribe;
105
+ getSnapshot: () => HostContext[K];
106
+ };
107
+ /** Persisted view state shape (a plain object). See {@link useViewState}. */
108
+ export type ViewState = Record<string, unknown>;
109
+ /** Updater form accepted when writing to view state. */
110
+ export type SetViewStateAction = ViewState | ((prevState: ViewState | null) => ViewState);
111
+ /** Reference to a host-managed file (returned by {@link useFiles}). */
112
+ export type FileMetadata = {
113
+ fileId: string;
114
+ fileName?: string;
115
+ mimeType?: string;
116
+ };
117
+ /** Options for {@link useFiles}'s `upload`. `library: true` saves into the user's library when supported. */
118
+ export type UploadFileOptions = {
119
+ library?: boolean;
120
+ };
121
+ /** Options for {@link useRequestModal}'s `open` call. */
122
+ export type RequestModalOptions = {
123
+ title?: string;
124
+ params?: Record<string, unknown>;
125
+ template?: string;
126
+ anchor?: {
127
+ top?: number;
128
+ left?: number;
129
+ width?: number;
130
+ height?: number;
131
+ };
132
+ };
133
+ /**
134
+ * Options for {@link useOpenExternal}. Set `redirectUrl: false` to tell the
135
+ * host not to append its `?redirectUrl=…` tracking query parameter when
136
+ * opening allowlisted targets.
137
+ */
138
+ export type OpenExternalOptions = {
139
+ redirectUrl?: false;
140
+ };
141
+ /** Options for {@link useSendFollowUpMessage}. */
142
+ export type SendFollowUpMessageOptions = {
143
+ /** Apps SDK only: set to `false` to keep the chat scroll position. */
144
+ scrollToBottom?: boolean;
145
+ /**
146
+ * ChatGPT only, from the OpenAI MCP extensions: `"new"` starts a new
147
+ * conversation with the message. Defaults to the active conversation.
148
+ * Rejects on hosts that don't advertise `openai/message`.
149
+ */
150
+ target?: "active" | "new";
151
+ };
152
+ /** How the host should return a file resource's contents. */
153
+ export type ResourceRepresentation = "text" | "blob";
154
+ /** Contents of a file resource: text, or a base64 `blob`. */
155
+ export type FileResourceContent = {
156
+ text: string;
157
+ } | {
158
+ blob: string;
159
+ };
160
+ /** A file resource as read from the host. */
161
+ export type FileResource = FileResourceContent & {
162
+ mimeType?: string;
163
+ /** Whether the host accepts writes to this resource. */
164
+ writable: boolean;
165
+ /** Version token of these contents, sent back as `ifMatch` on write. */
166
+ etag?: string;
167
+ };
168
+ /** Result of `openai/resources/write`. */
169
+ export type FileResourceWriteResult = {
170
+ outcome: "saved" | "conflict";
171
+ etag: string;
172
+ } | {
173
+ outcome: "too-large";
174
+ maxBytes: number;
175
+ };
176
+ /**
177
+ * A follow-up message: plain text, or content blocks. On ChatGPT, a text or
178
+ * image block with `_meta["openai/title"]` becomes a labeled item the user can
179
+ * remove.
180
+ */
181
+ export type FollowUpMessage = string | ContentBlock[];
182
+ /** Options for {@link useRequestSize}. Omit a dimension to leave it unchanged. */
183
+ export type RequestSizeOptions = {
184
+ width?: number;
185
+ height?: number;
186
+ };
187
+ export type DownloadParams = {
188
+ contents: (EmbeddedResource | ResourceLink)[];
189
+ };
190
+ export type DownloadResult = {
191
+ isError?: boolean;
192
+ };
193
+ /**
194
+ * Shape of a view tool's `inputSchema`: a map of zod schemas. Narrower than
195
+ * the server's `Record<string, StandardSchemaWithJSON>` input shape because the MCP Apps bridge validates with
196
+ * `z.object()` at runtime — other Standard Schema libraries would type-check
197
+ * but throw on the first call.
198
+ */
199
+ export type ViewToolInputShape = Record<string, ZodType>;
200
+ /**
201
+ * Args passed to a {@link ViewToolHandler}, inferred from the tool's
202
+ * `inputSchema` (optionality preserved). Mirrors the server's `registerTool`.
203
+ */
204
+ export type InferViewToolArgs<Shape extends ViewToolInputShape> = {
205
+ [K in keyof Shape as undefined extends ZodOutput<Shape[K]> ? never : K]: ZodOutput<Shape[K]>;
206
+ } & {
207
+ [K in keyof Shape as undefined extends ZodOutput<Shape[K]> ? K : never]?: ZodOutput<Shape[K]>;
208
+ };
209
+ /**
210
+ * Declares a tool the view exposes to the host/model (the MCP Apps
211
+ * "app-provided tools" feature). Mirrors the server-side `registerTool` config.
212
+ * Namespace `name` (e.g. `chess_make_move`) to avoid clashing with server tools.
213
+ */
214
+ export type ViewToolConfig<TInput extends ViewToolInputShape = ViewToolInputShape> = {
215
+ name: string;
216
+ title?: string;
217
+ description?: string;
218
+ inputSchema?: TInput;
219
+ annotations?: ToolAnnotations;
220
+ };
221
+ /**
222
+ * Value a {@link ViewToolHandler} returns — a standard MCP `CallToolResult`
223
+ * (`content` blocks plus optional `structuredContent` / `isError` / `_meta`),
224
+ * exactly as `ext-apps`' app tool callbacks return it.
225
+ */
226
+ export type ViewToolResult = CallToolResult;
227
+ /** Handler run when the host calls a view tool. Receives validated, typed args. */
228
+ export type ViewToolHandler<TInput extends ViewToolInputShape = ViewToolInputShape> = (args: InferViewToolArgs<TInput>) => ViewToolResult | Promise<ViewToolResult>;
229
+ /** @internal Untyped handler signature stored by the adaptor/bridge after type erasure. */
230
+ export type AnyViewToolHandler = (args: Record<string, unknown>) => ViewToolResult | Promise<ViewToolResult>;
231
+ /**
232
+ * @internal
233
+ * Low-level interface every host bridge implements. End-user code should use
234
+ * the React hooks (`useCallTool`, `useViewState`, `useFiles`, …) rather than
235
+ * calling this directly.
236
+ */
237
+ export interface Adaptor {
238
+ getHostContextStore<K extends keyof HostContext>(key: K): HostContextStore<K>;
239
+ callTool<ToolArgs extends CallToolArgs = null, ToolResponse extends CallToolResponse = CallToolResponse>(name: string, args: ToolArgs, options?: CallToolOptions): Promise<ToolResponse>;
240
+ requestDisplayMode(mode: RequestDisplayMode): Promise<{
241
+ mode: RequestDisplayMode;
242
+ }>;
243
+ requestClose(): Promise<void>;
244
+ requestSize(size: RequestSizeOptions): Promise<void>;
245
+ sendFollowUpMessage(prompt: FollowUpMessage, options?: SendFollowUpMessageOptions): Promise<void>;
246
+ openExternal(href: string, options?: OpenExternalOptions): void;
247
+ download(params: DownloadParams): Promise<DownloadResult>;
248
+ setViewState(stateOrUpdater: SetViewStateAction): Promise<void>;
249
+ updateModelContext(params: ModelContextParams): Promise<string | undefined>;
250
+ openFile(path: string): Promise<void>;
251
+ readResource(uri: string, representation?: ResourceRepresentation): Promise<FileResource>;
252
+ watchResource(uri: string, onUpdate: () => void): () => void;
253
+ writeResource(uri: string, content: FileResourceContent, ifMatch?: string): Promise<FileResourceWriteResult>;
254
+ uploadFile(file: File, options?: UploadFileOptions): Promise<FileMetadata>;
255
+ getFileDownloadUrl(file: FileMetadata): Promise<{
256
+ downloadUrl: string;
257
+ }>;
258
+ selectFiles(): Promise<FileMetadata[]>;
259
+ openModal(options: RequestModalOptions): void;
260
+ setOpenInAppUrl(href: string): Promise<void>;
261
+ closeModal(): void;
262
+ registerViewTool(config: ViewToolConfig, handler: AnyViewToolHandler): () => void;
263
+ }
264
+ /**
265
+ * Thrown when a host bridge method is called in a runtime that doesn't
266
+ * support it (e.g. `uploadFile` outside the ChatGPT runtime).
267
+ */
268
+ export declare class NotSupportedError extends Error {
269
+ readonly method: string;
270
+ readonly reason?: string | undefined;
271
+ constructor(method: string, reason?: string | undefined);
272
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Thrown when a host bridge method is called in a runtime that doesn't
3
+ * support it (e.g. `uploadFile` outside the ChatGPT runtime).
4
+ */
5
+ export class NotSupportedError extends Error {
6
+ method;
7
+ reason;
8
+ constructor(method, reason) {
9
+ super(`${method} is not supported in this runtime${reason ? `: ${reason}` : ""}`);
10
+ this.method = method;
11
+ this.reason = reason;
12
+ this.name = "NotSupportedError";
13
+ }
14
+ }
15
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/web/bridges/types.ts"],"names":[],"mappings":"AAqUA;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAExB;IACA;IAFlB,YACkB,MAAc,EACd,MAAe;QAE/B,KAAK,CACH,GAAG,MAAM,oCAAoC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3E,CAAC;QALc,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAS;QAK/B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF","sourcesContent":["import type {\n CallToolResult,\n ContentBlock,\n EmbeddedResource,\n ResourceLink,\n ToolAnnotations,\n} from \"@modelcontextprotocol/client\";\nimport type { McpUiUpdateModelContextRequest } from \"@modelcontextprotocol/ext-apps\";\nimport type { useSyncExternalStore } from \"react\";\nimport type { output as ZodOutput, ZodType } from \"zod/v4\";\n\n/**\n * Globals injected on `window.skybridge` by the host. Tells the view where to\n * reach the MCP server.\n */\nexport type SkybridgeProperties = {\n serverUrl: string;\n};\n\ndeclare global {\n interface Window {\n skybridge: SkybridgeProperties;\n }\n}\n\n/** Arguments passed to a tool call. `null` for tools that take no input. */\nexport type CallToolArgs = Record<string, unknown> | null;\n\n/** Options for a tool call made from the view. */\nexport type CallToolOptions = {\n /**\n * Request timeout in milliseconds. Omit it to keep the SDK default (60s).\n * Raise it for tools that wait on the user, such as ChatGPT forms.\n */\n timeout?: number;\n};\n\n/** Payload of `ui/update-model-context`. Content blocks may carry `_meta`. */\nexport type ModelContextParams = McpUiUpdateModelContextRequest[\"params\"];\n\n/**\n * Result of a tool call as surfaced to the view: MCP `content` blocks plus\n * the typed `structuredContent` and optional `meta`. `isError` is set when\n * the server marks the call as failed.\n */\nexport type CallToolResponse = {\n content: CallToolResult[\"content\"];\n structuredContent: NonNullable<CallToolResult[\"structuredContent\"]>;\n isError: NonNullable<CallToolResult[\"isError\"]>;\n meta?: CallToolResult[\"_meta\"];\n};\n\n/**\n * How the view is laid out by the host. `\"modal\"` is host-driven (see\n * {@link useRequestModal}); `\"pip\"`, `\"inline\"`, and `\"fullscreen\"` are\n * requestable via {@link useDisplayMode}.\n */\nexport type DisplayMode = \"pip\" | \"inline\" | \"fullscreen\" | \"modal\";\n/** Subset of {@link DisplayMode} that the view can request from the host. */\nexport type RequestDisplayMode = Exclude<DisplayMode, \"modal\">;\n\n/** Host theme. Mirror this in your view's styling for a native feel. */\nexport type Theme = \"light\" | \"dark\";\n\n/** Coarse device class reported by the host. `\"unknown\"` when unavailable. */\nexport type DeviceType = \"mobile\" | \"tablet\" | \"desktop\" | \"unknown\";\n\n/** Pixel insets the view should keep clear of (notches, home indicators, etc.). */\nexport type SafeAreaInsets = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n};\n\n/** Wrapper around {@link SafeAreaInsets} exposed via {@link useViewport}. */\nexport type SafeArea = {\n insets: SafeAreaInsets;\n};\n\n/** Device and input-capability hints exposed via {@link useUser}. */\nexport type UserAgent = {\n device: {\n type: DeviceType;\n };\n capabilities: {\n hover: boolean;\n touch: boolean;\n };\n};\n\n/**\n * Full snapshot of state the host exposes to the view. Most fields are\n * better accessed through their dedicated hooks (`useViewport`, `useUser`,\n * `useToolInfo`, etc.) — read this directly only for advanced cases.\n */\nexport interface HostContext {\n theme: Theme;\n locale: string;\n displayMode: DisplayMode;\n safeArea: SafeArea;\n maxHeight: number | undefined;\n userAgent: UserAgent;\n toolInput: Record<string, unknown> | null;\n toolOutput: Record<string, unknown> | null;\n toolResponseMetadata: Record<string, unknown> | null;\n display: {\n mode: DisplayMode;\n params?: Record<string, unknown>;\n };\n viewState: Record<string, unknown> | null;\n}\n\n/** @internal `useSyncExternalStore` subscribe signature, re-exported for bridge implementations. */\nexport type Subscribe = Parameters<typeof useSyncExternalStore>[0];\n\n/** @internal Bridge contract implemented by per-host bridge classes. */\nexport interface Bridge<Context> {\n subscribe(key: keyof Context): Subscribe;\n subscribe(keys: readonly (keyof Context)[]): Subscribe;\n getSnapshot<K extends keyof Context>(key: K): Context[K] | undefined;\n}\n\n/** @internal Per-key snapshot store backing {@link useHostContext}. */\nexport type HostContextStore<K extends keyof HostContext> = {\n subscribe: Subscribe;\n getSnapshot: () => HostContext[K];\n};\n\n/** Persisted view state shape (a plain object). See {@link useViewState}. */\nexport type ViewState = Record<string, unknown>;\n\n/** Updater form accepted when writing to view state. */\nexport type SetViewStateAction =\n | ViewState\n | ((prevState: ViewState | null) => ViewState);\n\n/** Reference to a host-managed file (returned by {@link useFiles}). */\nexport type FileMetadata = {\n fileId: string;\n fileName?: string;\n mimeType?: string;\n};\n\n/** Options for {@link useFiles}'s `upload`. `library: true` saves into the user's library when supported. */\nexport type UploadFileOptions = { library?: boolean };\n\n/** Options for {@link useRequestModal}'s `open` call. */\nexport type RequestModalOptions = {\n title?: string;\n params?: Record<string, unknown>;\n template?: string;\n anchor?: { top?: number; left?: number; width?: number; height?: number };\n};\n\n/**\n * Options for {@link useOpenExternal}. Set `redirectUrl: false` to tell the\n * host not to append its `?redirectUrl=…` tracking query parameter when\n * opening allowlisted targets.\n */\nexport type OpenExternalOptions = {\n redirectUrl?: false;\n};\n\n/** Options for {@link useSendFollowUpMessage}. */\nexport type SendFollowUpMessageOptions = {\n /** Apps SDK only: set to `false` to keep the chat scroll position. */\n scrollToBottom?: boolean;\n /**\n * ChatGPT only, from the OpenAI MCP extensions: `\"new\"` starts a new\n * conversation with the message. Defaults to the active conversation.\n * Rejects on hosts that don't advertise `openai/message`.\n */\n target?: \"active\" | \"new\";\n};\n\n/** How the host should return a file resource's contents. */\nexport type ResourceRepresentation = \"text\" | \"blob\";\n\n/** Contents of a file resource: text, or a base64 `blob`. */\nexport type FileResourceContent = { text: string } | { blob: string };\n\n/** A file resource as read from the host. */\nexport type FileResource = FileResourceContent & {\n mimeType?: string;\n /** Whether the host accepts writes to this resource. */\n writable: boolean;\n /** Version token of these contents, sent back as `ifMatch` on write. */\n etag?: string;\n};\n\n/** Result of `openai/resources/write`. */\nexport type FileResourceWriteResult =\n | { outcome: \"saved\" | \"conflict\"; etag: string }\n | { outcome: \"too-large\"; maxBytes: number };\n\n/**\n * A follow-up message: plain text, or content blocks. On ChatGPT, a text or\n * image block with `_meta[\"openai/title\"]` becomes a labeled item the user can\n * remove.\n */\nexport type FollowUpMessage = string | ContentBlock[];\n\n/** Options for {@link useRequestSize}. Omit a dimension to leave it unchanged. */\nexport type RequestSizeOptions = {\n width?: number;\n height?: number;\n};\n\nexport type DownloadParams = {\n contents: (EmbeddedResource | ResourceLink)[];\n};\n\nexport type DownloadResult = {\n isError?: boolean;\n};\n\n/**\n * Shape of a view tool's `inputSchema`: a map of zod schemas. Narrower than\n * the server's `Record<string, StandardSchemaWithJSON>` input shape because the MCP Apps bridge validates with\n * `z.object()` at runtime — other Standard Schema libraries would type-check\n * but throw on the first call.\n */\nexport type ViewToolInputShape = Record<string, ZodType>;\n\n/**\n * Args passed to a {@link ViewToolHandler}, inferred from the tool's\n * `inputSchema` (optionality preserved). Mirrors the server's `registerTool`.\n */\nexport type InferViewToolArgs<Shape extends ViewToolInputShape> = {\n [K in keyof Shape as undefined extends ZodOutput<Shape[K]>\n ? never\n : K]: ZodOutput<Shape[K]>;\n} & {\n [K in keyof Shape as undefined extends ZodOutput<Shape[K]>\n ? K\n : never]?: ZodOutput<Shape[K]>;\n};\n\n/**\n * Declares a tool the view exposes to the host/model (the MCP Apps\n * \"app-provided tools\" feature). Mirrors the server-side `registerTool` config.\n * Namespace `name` (e.g. `chess_make_move`) to avoid clashing with server tools.\n */\nexport type ViewToolConfig<\n TInput extends ViewToolInputShape = ViewToolInputShape,\n> = {\n name: string;\n title?: string;\n description?: string;\n inputSchema?: TInput;\n annotations?: ToolAnnotations;\n};\n\n/**\n * Value a {@link ViewToolHandler} returns — a standard MCP `CallToolResult`\n * (`content` blocks plus optional `structuredContent` / `isError` / `_meta`),\n * exactly as `ext-apps`' app tool callbacks return it.\n */\nexport type ViewToolResult = CallToolResult;\n\n/** Handler run when the host calls a view tool. Receives validated, typed args. */\nexport type ViewToolHandler<\n TInput extends ViewToolInputShape = ViewToolInputShape,\n> = (\n args: InferViewToolArgs<TInput>,\n) => ViewToolResult | Promise<ViewToolResult>;\n\n/** @internal Untyped handler signature stored by the adaptor/bridge after type erasure. */\nexport type AnyViewToolHandler = (\n args: Record<string, unknown>,\n) => ViewToolResult | Promise<ViewToolResult>;\n\n/**\n * @internal\n * Low-level interface every host bridge implements. End-user code should use\n * the React hooks (`useCallTool`, `useViewState`, `useFiles`, …) rather than\n * calling this directly.\n */\nexport interface Adaptor {\n getHostContextStore<K extends keyof HostContext>(key: K): HostContextStore<K>;\n callTool<\n ToolArgs extends CallToolArgs = null,\n ToolResponse extends CallToolResponse = CallToolResponse,\n >(\n name: string,\n args: ToolArgs,\n options?: CallToolOptions,\n ): Promise<ToolResponse>;\n requestDisplayMode(mode: RequestDisplayMode): Promise<{\n mode: RequestDisplayMode;\n }>;\n requestClose(): Promise<void>;\n requestSize(size: RequestSizeOptions): Promise<void>;\n sendFollowUpMessage(\n prompt: FollowUpMessage,\n options?: SendFollowUpMessageOptions,\n ): Promise<void>;\n openExternal(href: string, options?: OpenExternalOptions): void;\n download(params: DownloadParams): Promise<DownloadResult>;\n setViewState(stateOrUpdater: SetViewStateAction): Promise<void>;\n updateModelContext(params: ModelContextParams): Promise<string | undefined>;\n openFile(path: string): Promise<void>;\n readResource(\n uri: string,\n representation?: ResourceRepresentation,\n ): Promise<FileResource>;\n watchResource(uri: string, onUpdate: () => void): () => void;\n writeResource(\n uri: string,\n content: FileResourceContent,\n ifMatch?: string,\n ): Promise<FileResourceWriteResult>;\n uploadFile(file: File, options?: UploadFileOptions): Promise<FileMetadata>;\n getFileDownloadUrl(file: FileMetadata): Promise<{ downloadUrl: string }>;\n selectFiles(): Promise<FileMetadata[]>;\n openModal(options: RequestModalOptions): void;\n setOpenInAppUrl(href: string): Promise<void>;\n closeModal(): void;\n registerViewTool(\n config: ViewToolConfig,\n handler: AnyViewToolHandler,\n ): () => void;\n}\n\n/**\n * Thrown when a host bridge method is called in a runtime that doesn't\n * support it (e.g. `uploadFile` outside the ChatGPT runtime).\n */\nexport class NotSupportedError extends Error {\n constructor(\n public readonly method: string,\n public readonly reason?: string,\n ) {\n super(\n `${method} is not supported in this runtime${reason ? `: ${reason}` : \"\"}`,\n );\n this.name = \"NotSupportedError\";\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,19 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { NotSupportedError } from "./types.js";
3
+ describe("NotSupportedError", () => {
4
+ it("includes method name in message", () => {
5
+ const err = new NotSupportedError("uploadFile");
6
+ expect(err.message).toBe("uploadFile is not supported in this runtime");
7
+ expect(err.name).toBe("NotSupportedError");
8
+ expect(err.method).toBe("uploadFile");
9
+ });
10
+ it("includes reason when provided", () => {
11
+ const err = new NotSupportedError("callTool", "MCP transport unavailable");
12
+ expect(err.message).toBe("callTool is not supported in this runtime: MCP transport unavailable");
13
+ expect(err.reason).toBe("MCP transport unavailable");
14
+ });
15
+ it("is an instance of Error", () => {
16
+ expect(new NotSupportedError("x")).toBeInstanceOf(Error);
17
+ });
18
+ });
19
+ //# sourceMappingURL=types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../../src/web/bridges/types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QACxE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;QAC3E,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CACtB,sEAAsE,CACvE,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { NotSupportedError } from \"./types.js\";\n\ndescribe(\"NotSupportedError\", () => {\n it(\"includes method name in message\", () => {\n const err = new NotSupportedError(\"uploadFile\");\n expect(err.message).toBe(\"uploadFile is not supported in this runtime\");\n expect(err.name).toBe(\"NotSupportedError\");\n expect(err.method).toBe(\"uploadFile\");\n });\n\n it(\"includes reason when provided\", () => {\n const err = new NotSupportedError(\"callTool\", \"MCP transport unavailable\");\n expect(err.message).toBe(\n \"callTool is not supported in this runtime: MCP transport unavailable\",\n );\n expect(err.reason).toBe(\"MCP transport unavailable\");\n });\n\n it(\"is an instance of Error\", () => {\n expect(new NotSupportedError(\"x\")).toBeInstanceOf(Error);\n });\n});\n"]}
@@ -0,0 +1,7 @@
1
+ import type { HostContext } from "./types.js";
2
+ /**
3
+ * @internal
4
+ * Subscribe to a single {@link HostContext} key via `useSyncExternalStore`.
5
+ * Used to build the higher-level hooks; prefer those for app code.
6
+ */
7
+ export declare const useHostContext: <K extends keyof HostContext>(key: K) => HostContext[K];
@@ -0,0 +1,13 @@
1
+ import { useSyncExternalStore } from "react";
2
+ import { getAdaptor } from "./get-adaptor.js";
3
+ /**
4
+ * @internal
5
+ * Subscribe to a single {@link HostContext} key via `useSyncExternalStore`.
6
+ * Used to build the higher-level hooks; prefer those for app code.
7
+ */
8
+ export const useHostContext = (key) => {
9
+ const adaptor = getAdaptor();
10
+ const store = adaptor.getHostContextStore(key);
11
+ return useSyncExternalStore(store.subscribe, store.getSnapshot);
12
+ };
13
+ //# sourceMappingURL=use-host-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-host-context.js","sourceRoot":"","sources":["../../../src/web/bridges/use-host-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,GAAM,EACU,EAAE;IAClB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAE/C,OAAO,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;AAClE,CAAC,CAAC","sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport { getAdaptor } from \"./get-adaptor.js\";\nimport type { HostContext } from \"./types.js\";\n\n/**\n * @internal\n * Subscribe to a single {@link HostContext} key via `useSyncExternalStore`.\n * Used to build the higher-level hooks; prefer those for app code.\n */\nexport const useHostContext = <K extends keyof HostContext>(\n key: K,\n): HostContext[K] => {\n const adaptor = getAdaptor();\n const store = adaptor.getHostContextStore(key);\n\n return useSyncExternalStore(store.subscribe, store.getSnapshot);\n};\n"]}
@@ -0,0 +1,4 @@
1
+ import { type ReactNode } from "react";
2
+ export declare function ModalProvider({ children }: {
3
+ children: ReactNode;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,46 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useSyncExternalStore } from "react";
3
+ import { getAdaptor } from "../bridges/index.js";
4
+ const modalStyles = `
5
+ .sb-modal-backdrop {
6
+ position: fixed;
7
+ inset: 0;
8
+ background: rgba(0, 0, 0, 0.5);
9
+ z-index: 9998;
10
+ }
11
+ .sb-modal-container {
12
+ border-radius: 12px;
13
+ position: fixed;
14
+ inset: 0;
15
+ margin: auto;
16
+ width: fit-content;
17
+ height: fit-content;
18
+ background: white;
19
+ z-index: 9999;
20
+ }
21
+ `;
22
+ export function ModalProvider({ children }) {
23
+ const adaptor = getAdaptor();
24
+ const displayStore = adaptor.getHostContextStore("display");
25
+ const { mode } = useSyncExternalStore(displayStore.subscribe, displayStore.getSnapshot);
26
+ const isOpen = mode === "modal";
27
+ const handleBackdropClick = (e) => {
28
+ if (e.target === e.currentTarget) {
29
+ adaptor.closeModal();
30
+ }
31
+ };
32
+ useEffect(() => {
33
+ if (!isOpen) {
34
+ return;
35
+ }
36
+ const handler = (e) => {
37
+ if (e.key === "Escape") {
38
+ adaptor.closeModal();
39
+ }
40
+ };
41
+ document.addEventListener("keydown", handler);
42
+ return () => document.removeEventListener("keydown", handler);
43
+ }, [isOpen, adaptor]);
44
+ return (_jsxs(_Fragment, { children: [_jsx("style", { children: modalStyles }), isOpen && (_jsx("div", { role: "dialog", className: "sb-modal-backdrop", onClick: handleBackdropClick })), _jsx("div", { className: isOpen ? "sb-modal-container" : undefined, children: children })] }));
45
+ }
46
+ //# sourceMappingURL=modal-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal-provider.js","sourceRoot":"","sources":["../../../src/web/components/modal-provider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,SAAS,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;CAiBnB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAA2B;IACjE,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAoB,CACnC,YAAY,CAAC,SAAS,EACtB,YAAY,CAAC,WAAW,CACzB,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC;IAEhC,MAAM,mBAAmB,GAAG,CAAC,CAAmB,EAAE,EAAE;QAClD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;YACjC,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,CAAgB,EAAE,EAAE;YACnC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvB,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtB,OAAO,CACL,8BACE,0BAAQ,WAAW,GAAS,EAC3B,MAAM,IAAI,CAET,cACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mBAAmB,EAC7B,OAAO,EAAE,mBAAmB,GAC5B,CACH,EACD,cAAK,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,YACtD,QAAQ,GACL,IACL,CACJ,CAAC;AACJ,CAAC","sourcesContent":["import { type ReactNode, useEffect, useSyncExternalStore } from \"react\";\nimport { getAdaptor } from \"../bridges/index.js\";\n\nconst modalStyles = `\n.sb-modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: 9998;\n}\n.sb-modal-container {\n border-radius: 12px;\n position: fixed;\n inset: 0;\n margin: auto;\n width: fit-content;\n height: fit-content;\n background: white;\n z-index: 9999;\n}\n`;\n\nexport function ModalProvider({ children }: { children: ReactNode }) {\n const adaptor = getAdaptor();\n const displayStore = adaptor.getHostContextStore(\"display\");\n const { mode } = useSyncExternalStore(\n displayStore.subscribe,\n displayStore.getSnapshot,\n );\n const isOpen = mode === \"modal\";\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n adaptor.closeModal();\n }\n };\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n adaptor.closeModal();\n }\n };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [isOpen, adaptor]);\n\n return (\n <>\n <style>{modalStyles}</style>\n {isOpen && (\n // biome-ignore lint/a11y/useKeyWithClickEvents: backdrop isn't focusable\n <div\n role=\"dialog\"\n className=\"sb-modal-backdrop\"\n onClick={handleBackdropClick}\n />\n )}\n <div className={isOpen ? \"sb-modal-container\" : undefined}>\n {children}\n </div>\n </>\n );\n}\n"]}
@@ -0,0 +1,29 @@
1
+ import { type StateCreator } from "zustand";
2
+ import type { UnknownObject } from "./types.js";
3
+ /**
4
+ * Create a Zustand store that is bidirectionally synced with the host's
5
+ * `viewState`. Local store updates persist to the host, and external host
6
+ * updates rehydrate the store — making the store the single source of truth
7
+ * for state that should survive view remounts.
8
+ *
9
+ * Use this when you outgrow {@link useViewState} and want first-class Zustand
10
+ * ergonomics (selectors, actions, middleware). Otherwise prefer `useViewState`.
11
+ *
12
+ * Skybridge-internal context fields (see {@link DataLLM}) are filtered out
13
+ * automatically before reaching your store.
14
+ *
15
+ * @typeParam State - Shape of the store's state. Must be a plain object.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * export const useStore = createStore<{ count: number; inc: () => void }>(
20
+ * (set) => ({
21
+ * count: 0,
22
+ * inc: () => set((s) => ({ count: s.count + 1 })),
23
+ * }),
24
+ * );
25
+ * ```
26
+ *
27
+ * @see https://docs.skybridge.tech/api-reference/create-store
28
+ */
29
+ export declare function createStore<State extends UnknownObject>(storeCreator: StateCreator<State, [], [], State>, defaultState?: State | (() => State)): import("zustand").UseBoundStore<import("zustand").StoreApi<State>>;
@@ -0,0 +1,64 @@
1
+ import { dequal } from "dequal/lite";
2
+ import { create } from "zustand";
3
+ import { getAdaptor } from "./bridges/index.js";
4
+ import { filterViewContext, getInitialState, injectViewContext, serializeState, } from "./helpers/state.js";
5
+ /**
6
+ * Create a Zustand store that is bidirectionally synced with the host's
7
+ * `viewState`. Local store updates persist to the host, and external host
8
+ * updates rehydrate the store — making the store the single source of truth
9
+ * for state that should survive view remounts.
10
+ *
11
+ * Use this when you outgrow {@link useViewState} and want first-class Zustand
12
+ * ergonomics (selectors, actions, middleware). Otherwise prefer `useViewState`.
13
+ *
14
+ * Skybridge-internal context fields (see {@link DataLLM}) are filtered out
15
+ * automatically before reaching your store.
16
+ *
17
+ * @typeParam State - Shape of the store's state. Must be a plain object.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * export const useStore = createStore<{ count: number; inc: () => void }>(
22
+ * (set) => ({
23
+ * count: 0,
24
+ * inc: () => set((s) => ({ count: s.count + 1 })),
25
+ * }),
26
+ * );
27
+ * ```
28
+ *
29
+ * @see https://docs.skybridge.tech/api-reference/create-store
30
+ */
31
+ export function createStore(storeCreator, defaultState) {
32
+ const initialState = getInitialState(defaultState);
33
+ const store = create()((...args) => {
34
+ const baseStore = storeCreator(...args);
35
+ if (initialState !== null) {
36
+ return { ...baseStore, ...initialState };
37
+ }
38
+ return baseStore;
39
+ });
40
+ // Bidirectional sync between the Zustand store and the adaptor's viewState.
41
+ // Store changes persist to the host; external viewState changes rehydrate the store.
42
+ store.subscribe((state) => {
43
+ const serializedState = serializeState(state);
44
+ if (serializedState !== null && serializedState !== undefined) {
45
+ const stateToPersist = injectViewContext(serializedState);
46
+ if (stateToPersist !== null) {
47
+ getAdaptor().setViewState(stateToPersist);
48
+ }
49
+ }
50
+ });
51
+ const viewStateStore = getAdaptor().getHostContextStore("viewState");
52
+ viewStateStore.subscribe(() => {
53
+ const externalState = viewStateStore.getSnapshot();
54
+ if (externalState !== null) {
55
+ const filtered = filterViewContext(externalState);
56
+ const current = serializeState(store.getState());
57
+ if (!dequal(filtered, current)) {
58
+ store.setState(filtered);
59
+ }
60
+ }
61
+ });
62
+ return store;
63
+ }
64
+ //# sourceMappingURL=create-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-store.js","sourceRoot":"","sources":["../../src/web/create-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAG5B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,WAAW,CACzB,YAAgD,EAChD,YAAoC;IAEpC,MAAM,YAAY,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,MAAM,EAAS,CAC3B,CAAC,GAAG,IAAoD,EAAE,EAAE;QAC1D,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;QAExC,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,EAAE,GAAG,SAAS,EAAE,GAAG,YAAY,EAAE,CAAC;QAC3C,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CACF,CAAC;IAEF,4EAA4E;IAC5E,qFAAqF;IACrF,KAAK,CAAC,SAAS,CAAC,CAAC,KAAY,EAAE,EAAE;QAC/B,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,eAAe,KAAK,IAAI,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAC9D,MAAM,cAAc,GAAG,iBAAiB,CAAC,eAAwB,CAAC,CAAC;YACnE,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;gBAC5B,UAAU,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACrE,cAAc,CAAC,SAAS,CAAC,GAAG,EAAE;QAC5B,MAAM,aAAa,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;QACnD,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,aAAa,CAAU,CAAC;YAC3D,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAU,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC/B,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { dequal } from \"dequal/lite\";\nimport { create, type StateCreator } from \"zustand\";\nimport { getAdaptor } from \"./bridges/index.js\";\nimport {\n filterViewContext,\n getInitialState,\n injectViewContext,\n serializeState,\n} from \"./helpers/state.js\";\nimport type { UnknownObject } from \"./types.js\";\n\n/**\n * Create a Zustand store that is bidirectionally synced with the host's\n * `viewState`. Local store updates persist to the host, and external host\n * updates rehydrate the store — making the store the single source of truth\n * for state that should survive view remounts.\n *\n * Use this when you outgrow {@link useViewState} and want first-class Zustand\n * ergonomics (selectors, actions, middleware). Otherwise prefer `useViewState`.\n *\n * Skybridge-internal context fields (see {@link DataLLM}) are filtered out\n * automatically before reaching your store.\n *\n * @typeParam State - Shape of the store's state. Must be a plain object.\n *\n * @example\n * ```ts\n * export const useStore = createStore<{ count: number; inc: () => void }>(\n * (set) => ({\n * count: 0,\n * inc: () => set((s) => ({ count: s.count + 1 })),\n * }),\n * );\n * ```\n *\n * @see https://docs.skybridge.tech/api-reference/create-store\n */\nexport function createStore<State extends UnknownObject>(\n storeCreator: StateCreator<State, [], [], State>,\n defaultState?: State | (() => State),\n) {\n const initialState = getInitialState(defaultState);\n\n const store = create<State>()(\n (...args: Parameters<StateCreator<State, [], [], State>>) => {\n const baseStore = storeCreator(...args);\n\n if (initialState !== null) {\n return { ...baseStore, ...initialState };\n }\n\n return baseStore;\n },\n );\n\n // Bidirectional sync between the Zustand store and the adaptor's viewState.\n // Store changes persist to the host; external viewState changes rehydrate the store.\n store.subscribe((state: State) => {\n const serializedState = serializeState(state);\n if (serializedState !== null && serializedState !== undefined) {\n const stateToPersist = injectViewContext(serializedState as State);\n if (stateToPersist !== null) {\n getAdaptor().setViewState(stateToPersist);\n }\n }\n });\n\n const viewStateStore = getAdaptor().getHostContextStore(\"viewState\");\n viewStateStore.subscribe(() => {\n const externalState = viewStateStore.getSnapshot();\n if (externalState !== null) {\n const filtered = filterViewContext(externalState) as State;\n const current = serializeState(store.getState()) as State;\n if (!dequal(filtered, current)) {\n store.setState(filtered);\n }\n }\n });\n\n return store;\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};