skybridge 0.0.0-dev.f621de8 → 0.0.0-dev.f6998b2

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 (410) hide show
  1. package/README.md +123 -130
  2. package/dist/cli/build-helpers.d.ts +7 -0
  3. package/dist/cli/build-helpers.js +82 -0
  4. package/dist/cli/build-helpers.js.map +1 -0
  5. package/dist/cli/build-helpers.test.js +64 -0
  6. package/dist/cli/build-helpers.test.js.map +1 -0
  7. package/dist/cli/detect-port.d.ts +2 -2
  8. package/dist/cli/detect-port.js +9 -20
  9. package/dist/cli/detect-port.js.map +1 -1
  10. package/dist/cli/header.js +1 -1
  11. package/dist/cli/header.js.map +1 -1
  12. package/dist/cli/resolve-views-dir.d.ts +1 -0
  13. package/dist/cli/resolve-views-dir.js +17 -0
  14. package/dist/cli/resolve-views-dir.js.map +1 -0
  15. package/dist/cli/run-command.js.map +1 -1
  16. package/dist/cli/telemetry.js.map +1 -1
  17. package/dist/cli/tunnel-control-server.d.ts +9 -0
  18. package/dist/cli/tunnel-control-server.js +31 -0
  19. package/dist/cli/tunnel-control-server.js.map +1 -0
  20. package/dist/cli/tunnel-control-server.test.js +39 -0
  21. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  22. package/dist/cli/tunnel-handler.d.ts +3 -0
  23. package/dist/cli/tunnel-handler.js +48 -0
  24. package/dist/cli/tunnel-handler.js.map +1 -0
  25. package/dist/cli/tunnel-handler.test.js +105 -0
  26. package/dist/cli/tunnel-handler.test.js.map +1 -0
  27. package/dist/cli/tunnel.d.ts +57 -0
  28. package/dist/cli/tunnel.js +154 -0
  29. package/dist/cli/tunnel.js.map +1 -0
  30. package/dist/cli/tunnel.test.d.ts +1 -0
  31. package/dist/cli/tunnel.test.js +190 -0
  32. package/dist/cli/tunnel.test.js.map +1 -0
  33. package/dist/cli/types.js.map +1 -1
  34. package/dist/cli/use-execute-steps.js.map +1 -1
  35. package/dist/cli/use-messages.d.ts +3 -0
  36. package/dist/cli/use-messages.js +11 -0
  37. package/dist/cli/use-messages.js.map +1 -0
  38. package/dist/cli/use-nodemon.d.ts +2 -2
  39. package/dist/cli/use-nodemon.js +18 -25
  40. package/dist/cli/use-nodemon.js.map +1 -1
  41. package/dist/cli/use-open-browser.d.ts +1 -0
  42. package/dist/cli/use-open-browser.js +44 -0
  43. package/dist/cli/use-open-browser.js.map +1 -0
  44. package/dist/cli/use-tunnel.d.ts +13 -7
  45. package/dist/cli/use-tunnel.js +103 -73
  46. package/dist/cli/use-tunnel.js.map +1 -1
  47. package/dist/cli/use-typescript-check.d.ts +1 -0
  48. package/dist/cli/use-typescript-check.js +42 -7
  49. package/dist/cli/use-typescript-check.js.map +1 -1
  50. package/dist/commands/build.d.ts +0 -1
  51. package/dist/commands/build.js +52 -8
  52. package/dist/commands/build.js.map +1 -1
  53. package/dist/commands/create.d.ts +9 -0
  54. package/dist/commands/create.js +30 -0
  55. package/dist/commands/create.js.map +1 -0
  56. package/dist/commands/dev.d.ts +2 -0
  57. package/dist/commands/dev.js +58 -6
  58. package/dist/commands/dev.js.map +1 -1
  59. package/dist/commands/start.js +13 -10
  60. package/dist/commands/start.js.map +1 -1
  61. package/dist/commands/telemetry/disable.js.map +1 -1
  62. package/dist/commands/telemetry/enable.js.map +1 -1
  63. package/dist/commands/telemetry/status.js.map +1 -1
  64. package/dist/server/asset-base-url-transform-plugin.d.ts +6 -6
  65. package/dist/server/asset-base-url-transform-plugin.js +25 -11
  66. package/dist/server/asset-base-url-transform-plugin.js.map +1 -1
  67. package/dist/server/asset-base-url-transform-plugin.test.js +92 -14
  68. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -1
  69. package/dist/server/auth/discovery.d.ts +32 -0
  70. package/dist/server/auth/discovery.js +56 -0
  71. package/dist/server/auth/discovery.js.map +1 -0
  72. package/dist/server/auth/discovery.test.d.ts +1 -0
  73. package/dist/server/auth/discovery.test.js +93 -0
  74. package/dist/server/auth/discovery.test.js.map +1 -0
  75. package/dist/server/auth/index.d.ts +18 -0
  76. package/dist/server/auth/index.js +2 -0
  77. package/dist/server/auth/index.js.map +1 -0
  78. package/dist/server/auth/providers/auth0.d.ts +18 -0
  79. package/dist/server/auth/providers/auth0.js +31 -0
  80. package/dist/server/auth/providers/auth0.js.map +1 -0
  81. package/dist/server/auth/providers/auth0.test.d.ts +1 -0
  82. package/dist/server/auth/providers/auth0.test.js +48 -0
  83. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  84. package/dist/server/auth/providers/clerk.d.ts +14 -0
  85. package/dist/server/auth/providers/clerk.js +16 -0
  86. package/dist/server/auth/providers/clerk.js.map +1 -0
  87. package/dist/server/auth/providers/clerk.test.d.ts +1 -0
  88. package/dist/server/auth/providers/clerk.test.js +28 -0
  89. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  90. package/dist/server/auth/providers/custom.d.ts +24 -0
  91. package/dist/server/auth/providers/custom.js +37 -0
  92. package/dist/server/auth/providers/custom.js.map +1 -0
  93. package/dist/server/auth/providers/custom.test.d.ts +1 -0
  94. package/dist/server/auth/providers/custom.test.js +107 -0
  95. package/dist/server/auth/providers/custom.test.js.map +1 -0
  96. package/dist/server/auth/providers/descope.d.ts +15 -0
  97. package/dist/server/auth/providers/descope.js +33 -0
  98. package/dist/server/auth/providers/descope.js.map +1 -0
  99. package/dist/server/auth/providers/descope.test.d.ts +1 -0
  100. package/dist/server/auth/providers/descope.test.js +37 -0
  101. package/dist/server/auth/providers/descope.test.js.map +1 -0
  102. package/dist/server/auth/providers/shared.d.ts +2 -0
  103. package/dist/server/auth/providers/shared.js +6 -0
  104. package/dist/server/auth/providers/shared.js.map +1 -0
  105. package/dist/server/auth/providers/shared.test.d.ts +1 -0
  106. package/dist/server/auth/providers/shared.test.js +10 -0
  107. package/dist/server/auth/providers/shared.test.js.map +1 -0
  108. package/dist/server/auth/providers/stytch.d.ts +12 -0
  109. package/dist/server/auth/providers/stytch.js +13 -0
  110. package/dist/server/auth/providers/stytch.js.map +1 -0
  111. package/dist/server/auth/providers/workos.d.ts +11 -0
  112. package/dist/server/auth/providers/workos.js +12 -0
  113. package/dist/server/auth/providers/workos.js.map +1 -0
  114. package/dist/server/auth/setup.d.ts +4 -0
  115. package/dist/server/auth/setup.js +51 -0
  116. package/dist/server/auth/setup.js.map +1 -0
  117. package/dist/server/auth/setup.test.d.ts +1 -0
  118. package/dist/server/auth/setup.test.js +185 -0
  119. package/dist/server/auth/setup.test.js.map +1 -0
  120. package/dist/server/auth/verify.d.ts +12 -0
  121. package/dist/server/auth/verify.js +38 -0
  122. package/dist/server/auth/verify.js.map +1 -0
  123. package/dist/server/auth/verify.test.d.ts +1 -0
  124. package/dist/server/auth/verify.test.js +100 -0
  125. package/dist/server/auth/verify.test.js.map +1 -0
  126. package/dist/server/auth.d.ts +20 -0
  127. package/dist/server/auth.js +28 -0
  128. package/dist/server/auth.js.map +1 -0
  129. package/dist/server/build-manifest.test.d.ts +1 -0
  130. package/dist/server/build-manifest.test.js +27 -0
  131. package/dist/server/build-manifest.test.js.map +1 -0
  132. package/dist/server/content-helpers.d.ts +67 -0
  133. package/dist/server/content-helpers.js +79 -0
  134. package/dist/server/content-helpers.js.map +1 -0
  135. package/dist/server/content-helpers.test.d.ts +1 -0
  136. package/dist/server/content-helpers.test.js +70 -0
  137. package/dist/server/content-helpers.test.js.map +1 -0
  138. package/dist/server/express.d.ts +2 -6
  139. package/dist/server/express.js +34 -10
  140. package/dist/server/express.js.map +1 -1
  141. package/dist/server/express.test.js +310 -71
  142. package/dist/server/express.test.js.map +1 -1
  143. package/dist/server/file-ref.d.ts +28 -0
  144. package/dist/server/file-ref.js +27 -0
  145. package/dist/server/file-ref.js.map +1 -0
  146. package/dist/server/index.d.ts +13 -3
  147. package/dist/server/index.js +11 -2
  148. package/dist/server/index.js.map +1 -1
  149. package/dist/server/inferUtilityTypes.d.ts +6 -6
  150. package/dist/server/inferUtilityTypes.js.map +1 -1
  151. package/dist/server/metric.d.ts +14 -0
  152. package/dist/server/metric.js +62 -0
  153. package/dist/server/metric.js.map +1 -0
  154. package/dist/server/middleware.d.ts +16 -3
  155. package/dist/server/middleware.js.map +1 -1
  156. package/dist/server/middleware.test-d.js.map +1 -1
  157. package/dist/server/middleware.test.js +12 -9
  158. package/dist/server/middleware.test.js.map +1 -1
  159. package/dist/server/requestOrigin.d.ts +7 -0
  160. package/dist/server/requestOrigin.js +25 -0
  161. package/dist/server/requestOrigin.js.map +1 -0
  162. package/dist/server/server.d.ts +341 -72
  163. package/dist/server/server.js +504 -160
  164. package/dist/server/server.js.map +1 -1
  165. package/dist/server/templateHelper.d.ts +5 -7
  166. package/dist/server/templateHelper.js +3 -22
  167. package/dist/server/templateHelper.js.map +1 -1
  168. package/dist/server/templates.generated.d.ts +4 -0
  169. package/dist/server/templates.generated.js +47 -0
  170. package/dist/server/templates.generated.js.map +1 -0
  171. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  172. package/dist/server/tunnel-proxy-router.js +110 -0
  173. package/dist/server/tunnel-proxy-router.js.map +1 -0
  174. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  175. package/dist/server/tunnel-proxy-router.test.js +229 -0
  176. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  177. package/dist/server/view-name.test-d.d.ts +1 -0
  178. package/dist/server/view-name.test-d.js +8 -0
  179. package/dist/server/view-name.test-d.js.map +1 -0
  180. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  181. package/dist/server/view-resource-resolution.test.js +171 -0
  182. package/dist/server/view-resource-resolution.test.js.map +1 -0
  183. package/dist/server/viewsDevServer.d.ts +14 -0
  184. package/dist/server/viewsDevServer.js +45 -0
  185. package/dist/server/viewsDevServer.js.map +1 -0
  186. package/dist/test/utils.d.ts +13 -21
  187. package/dist/test/utils.js +42 -37
  188. package/dist/test/utils.js.map +1 -1
  189. package/dist/test/view.test.d.ts +1 -0
  190. package/dist/test/view.test.js +536 -0
  191. package/dist/test/view.test.js.map +1 -0
  192. package/dist/version.d.ts +1 -0
  193. package/dist/version.js +3 -0
  194. package/dist/version.js.map +1 -0
  195. package/dist/web/bridges/adaptor.d.ts +51 -0
  196. package/dist/web/bridges/adaptor.js +310 -0
  197. package/dist/web/bridges/adaptor.js.map +1 -0
  198. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  199. package/dist/web/bridges/adaptor.test.js +197 -0
  200. package/dist/web/bridges/adaptor.test.js.map +1 -0
  201. package/dist/web/bridges/apps-sdk/bridge.d.ts +6 -1
  202. package/dist/web/bridges/apps-sdk/bridge.js +15 -3
  203. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  204. package/dist/web/bridges/apps-sdk/index.d.ts +0 -1
  205. package/dist/web/bridges/apps-sdk/index.js +0 -1
  206. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  207. package/dist/web/bridges/apps-sdk/types.d.ts +18 -6
  208. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  209. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +11 -0
  210. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +11 -0
  211. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  212. package/dist/web/bridges/get-adaptor.d.ts +7 -0
  213. package/dist/web/bridges/get-adaptor.js +9 -7
  214. package/dist/web/bridges/get-adaptor.js.map +1 -1
  215. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  216. package/dist/web/bridges/get-adaptor.test.js +32 -0
  217. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  218. package/dist/web/bridges/index.js.map +1 -1
  219. package/dist/web/bridges/mcp-app/bridge.d.ts +15 -2
  220. package/dist/web/bridges/mcp-app/bridge.js +68 -4
  221. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  222. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  223. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  224. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  225. package/dist/web/bridges/mcp-app/index.d.ts +0 -1
  226. package/dist/web/bridges/mcp-app/index.js +0 -1
  227. package/dist/web/bridges/mcp-app/index.js.map +1 -1
  228. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  229. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +12 -0
  230. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +12 -0
  231. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  232. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  233. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  234. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  235. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  236. package/dist/web/bridges/types.d.ts +122 -11
  237. package/dist/web/bridges/types.js +14 -1
  238. package/dist/web/bridges/types.js.map +1 -1
  239. package/dist/web/bridges/types.test.d.ts +1 -0
  240. package/dist/web/bridges/types.test.js +19 -0
  241. package/dist/web/bridges/types.test.js.map +1 -0
  242. package/dist/web/bridges/use-host-context.d.ts +5 -0
  243. package/dist/web/bridges/use-host-context.js +5 -0
  244. package/dist/web/bridges/use-host-context.js.map +1 -1
  245. package/dist/web/components/modal-provider.js +4 -3
  246. package/dist/web/components/modal-provider.js.map +1 -1
  247. package/dist/web/create-store.d.ts +26 -0
  248. package/dist/web/create-store.js +43 -3
  249. package/dist/web/create-store.js.map +1 -1
  250. package/dist/web/create-store.test.js +22 -21
  251. package/dist/web/create-store.test.js.map +1 -1
  252. package/dist/web/data-llm.d.ts +34 -1
  253. package/dist/web/data-llm.js +31 -3
  254. package/dist/web/data-llm.js.map +1 -1
  255. package/dist/web/data-llm.test.js +31 -27
  256. package/dist/web/data-llm.test.js.map +1 -1
  257. package/dist/web/generate-helpers.d.ts +22 -18
  258. package/dist/web/generate-helpers.js +22 -18
  259. package/dist/web/generate-helpers.js.map +1 -1
  260. package/dist/web/generate-helpers.test-d.js +30 -28
  261. package/dist/web/generate-helpers.test-d.js.map +1 -1
  262. package/dist/web/generate-helpers.test.js.map +1 -1
  263. package/dist/web/helpers/state.d.ts +2 -2
  264. package/dist/web/helpers/state.js +11 -11
  265. package/dist/web/helpers/state.js.map +1 -1
  266. package/dist/web/helpers/state.test.js +9 -9
  267. package/dist/web/helpers/state.test.js.map +1 -1
  268. package/dist/web/hooks/index.d.ts +5 -1
  269. package/dist/web/hooks/index.js +5 -1
  270. package/dist/web/hooks/index.js.map +1 -1
  271. package/dist/web/hooks/test/utils.d.ts +6 -2
  272. package/dist/web/hooks/test/utils.js +13 -2
  273. package/dist/web/hooks/test/utils.js.map +1 -1
  274. package/dist/web/hooks/use-call-tool.d.ts +45 -0
  275. package/dist/web/hooks/use-call-tool.js +28 -0
  276. package/dist/web/hooks/use-call-tool.js.map +1 -1
  277. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -1
  278. package/dist/web/hooks/use-call-tool.test.js +62 -27
  279. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  280. package/dist/web/hooks/use-display-mode.d.ts +20 -0
  281. package/dist/web/hooks/use-display-mode.js +20 -0
  282. package/dist/web/hooks/use-display-mode.js.map +1 -1
  283. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -1
  284. package/dist/web/hooks/use-display-mode.test.js +56 -20
  285. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  286. package/dist/web/hooks/use-download.d.ts +5 -0
  287. package/dist/web/hooks/use-download.js +8 -0
  288. package/dist/web/hooks/use-download.js.map +1 -0
  289. package/dist/web/hooks/use-download.test.d.ts +1 -0
  290. package/dist/web/hooks/use-download.test.js +103 -0
  291. package/dist/web/hooks/use-download.test.js.map +1 -0
  292. package/dist/web/hooks/use-files.d.ts +34 -1
  293. package/dist/web/hooks/use-files.js +33 -0
  294. package/dist/web/hooks/use-files.js.map +1 -1
  295. package/dist/web/hooks/use-files.test.js +30 -2
  296. package/dist/web/hooks/use-files.test.js.map +1 -1
  297. package/dist/web/hooks/use-layout.d.ts +2 -0
  298. package/dist/web/hooks/use-layout.js +2 -0
  299. package/dist/web/hooks/use-layout.js.map +1 -1
  300. package/dist/web/hooks/use-layout.test.js +59 -26
  301. package/dist/web/hooks/use-layout.test.js.map +1 -1
  302. package/dist/web/hooks/use-open-external.d.ts +17 -0
  303. package/dist/web/hooks/use-open-external.js +16 -0
  304. package/dist/web/hooks/use-open-external.js.map +1 -1
  305. package/dist/web/hooks/use-open-external.test.js +13 -3
  306. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  307. package/dist/web/hooks/use-register-view-tool.d.ts +38 -0
  308. package/dist/web/hooks/use-register-view-tool.js +50 -0
  309. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  310. package/dist/web/hooks/use-request-close.d.ts +16 -0
  311. package/dist/web/hooks/use-request-close.js +21 -0
  312. package/dist/web/hooks/use-request-close.js.map +1 -0
  313. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  314. package/dist/web/hooks/use-request-close.test.js +47 -0
  315. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  316. package/dist/web/hooks/use-request-modal.d.ts +16 -1
  317. package/dist/web/hooks/use-request-modal.js +19 -4
  318. package/dist/web/hooks/use-request-modal.js.map +1 -1
  319. package/dist/web/hooks/use-request-modal.test.js +11 -1
  320. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  321. package/dist/web/hooks/use-request-size.d.ts +20 -0
  322. package/dist/web/hooks/use-request-size.js +24 -0
  323. package/dist/web/hooks/use-request-size.js.map +1 -0
  324. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  325. package/dist/web/hooks/use-request-size.test.js +47 -0
  326. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  327. package/dist/web/hooks/use-send-follow-up-message.d.ts +19 -1
  328. package/dist/web/hooks/use-send-follow-up-message.js +19 -2
  329. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
  330. package/dist/web/hooks/use-set-open-in-app-url.d.ts +17 -0
  331. package/dist/web/hooks/use-set-open-in-app-url.js +17 -0
  332. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -1
  333. package/dist/web/hooks/use-set-open-in-app-url.test.js +28 -8
  334. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  335. package/dist/web/hooks/use-tool-info.d.ts +53 -2
  336. package/dist/web/hooks/use-tool-info.js +30 -7
  337. package/dist/web/hooks/use-tool-info.js.map +1 -1
  338. package/dist/web/hooks/use-tool-info.test-d.js +11 -29
  339. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  340. package/dist/web/hooks/use-tool-info.test.js +42 -32
  341. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  342. package/dist/web/hooks/use-user.d.ts +2 -0
  343. package/dist/web/hooks/use-user.js +2 -0
  344. package/dist/web/hooks/use-user.js.map +1 -1
  345. package/dist/web/hooks/use-user.test.js +81 -35
  346. package/dist/web/hooks/use-user.test.js.map +1 -1
  347. package/dist/web/hooks/use-view-state.d.ts +25 -0
  348. package/dist/web/hooks/use-view-state.js +32 -0
  349. package/dist/web/hooks/use-view-state.js.map +1 -0
  350. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  351. package/dist/web/hooks/use-view-state.test.js +181 -0
  352. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  353. package/dist/web/index.d.ts +1 -2
  354. package/dist/web/index.js +1 -2
  355. package/dist/web/index.js.map +1 -1
  356. package/dist/web/mount-view.d.ts +20 -0
  357. package/dist/web/{mount-widget.js → mount-view.js} +21 -2
  358. package/dist/web/mount-view.js.map +1 -0
  359. package/dist/web/plugin/data-llm.test.js.map +1 -1
  360. package/dist/web/plugin/plugin.d.ts +32 -1
  361. package/dist/web/plugin/plugin.js +160 -25
  362. package/dist/web/plugin/plugin.js.map +1 -1
  363. package/dist/web/plugin/scan-views.d.ts +16 -0
  364. package/dist/web/plugin/scan-views.js +88 -0
  365. package/dist/web/plugin/scan-views.js.map +1 -0
  366. package/dist/web/plugin/scan-views.test.d.ts +1 -0
  367. package/dist/web/plugin/scan-views.test.js +99 -0
  368. package/dist/web/plugin/scan-views.test.js.map +1 -0
  369. package/dist/web/plugin/transform-data-llm.js +1 -1
  370. package/dist/web/plugin/transform-data-llm.js.map +1 -1
  371. package/dist/web/plugin/transform-data-llm.test.js.map +1 -1
  372. package/dist/web/plugin/validate-view.d.ts +1 -0
  373. package/dist/web/plugin/validate-view.js +9 -0
  374. package/dist/web/plugin/validate-view.js.map +1 -0
  375. package/dist/web/plugin/validate-view.test.d.ts +1 -0
  376. package/dist/web/plugin/validate-view.test.js +24 -0
  377. package/dist/web/plugin/validate-view.test.js.map +1 -0
  378. package/dist/web/proxy.js.map +1 -1
  379. package/dist/web/types.d.ts +4 -0
  380. package/dist/web/types.js.map +1 -1
  381. package/package.json +31 -14
  382. package/tsconfig.base.json +2 -0
  383. package/dist/server/templates/development.hbs +0 -12
  384. package/dist/server/templates/production.hbs +0 -6
  385. package/dist/server/widgetsDevServer.d.ts +0 -13
  386. package/dist/server/widgetsDevServer.js +0 -57
  387. package/dist/server/widgetsDevServer.js.map +0 -1
  388. package/dist/test/widget.test.js +0 -263
  389. package/dist/test/widget.test.js.map +0 -1
  390. package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -22
  391. package/dist/web/bridges/apps-sdk/adaptor.js +0 -75
  392. package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
  393. package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -38
  394. package/dist/web/bridges/mcp-app/adaptor.js +0 -184
  395. package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
  396. package/dist/web/hooks/use-widget-state.d.ts +0 -4
  397. package/dist/web/hooks/use-widget-state.js +0 -32
  398. package/dist/web/hooks/use-widget-state.js.map +0 -1
  399. package/dist/web/hooks/use-widget-state.test.js +0 -64
  400. package/dist/web/hooks/use-widget-state.test.js.map +0 -1
  401. package/dist/web/mount-widget.d.ts +0 -1
  402. package/dist/web/mount-widget.js.map +0 -1
  403. package/dist/web/plugin/validate-widget.d.ts +0 -5
  404. package/dist/web/plugin/validate-widget.js +0 -27
  405. package/dist/web/plugin/validate-widget.js.map +0 -1
  406. package/dist/web/plugin/validate-widget.test.js +0 -42
  407. package/dist/web/plugin/validate-widget.test.js.map +0 -1
  408. /package/dist/{test/widget.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
  409. /package/dist/{web/hooks/use-widget-state.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  410. /package/dist/{web/plugin/validate-widget.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
@@ -1,12 +1,14 @@
1
1
  import { cleanup } from "@testing-library/react";
2
2
  import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
3
- import { McpAppAdaptor } from "./bridges/mcp-app/adaptor.js";
3
+ import { HostAdaptor } from "./bridges/adaptor.js";
4
+ import { getAdaptor } from "./bridges/get-adaptor.js";
4
5
  import { McpAppBridge } from "./bridges/mcp-app/bridge.js";
5
6
  import { createStore } from "./create-store.js";
6
- import { WIDGET_CONTEXT_KEY } from "./data-llm.js";
7
+ import { VIEW_CONTEXT_KEY } from "./data-llm.js";
7
8
  import { getMcpAppHostPostMessageMock, MockResizeObserver, } from "./hooks/test/utils.js";
8
9
  describe("createStore", () => {
9
10
  afterEach(() => {
11
+ HostAdaptor.resetInstance();
10
12
  vi.unstubAllGlobals();
11
13
  vi.resetAllMocks();
12
14
  });
@@ -62,36 +64,35 @@ describe("createStore", () => {
62
64
  privateContent: {},
63
65
  });
64
66
  });
65
- it("should filter widget context from initial state", () => {
67
+ it("should filter view context from initial state", () => {
66
68
  const storeCreator = () => ({
67
69
  count: 0,
68
70
  });
69
71
  const windowState = {
70
72
  count: 5,
71
- [WIDGET_CONTEXT_KEY]: "context-value",
73
+ [VIEW_CONTEXT_KEY]: "context-value",
72
74
  };
73
75
  OpenaiMock.widgetState = { modelContent: windowState };
74
76
  const store = createStore(storeCreator);
75
77
  expect(store.getState()).toEqual({ count: 5 });
76
- expect(store.getState()[WIDGET_CONTEXT_KEY]).toBeUndefined();
78
+ expect(store.getState()[VIEW_CONTEXT_KEY]).toBeUndefined();
77
79
  });
78
80
  });
79
81
  describe("mcp-app mode", () => {
80
82
  beforeEach(() => {
83
+ vi.stubGlobal("openai", undefined);
81
84
  vi.stubGlobal("skybridge", { hostType: "mcp-app" });
82
85
  vi.stubGlobal("ResizeObserver", MockResizeObserver);
83
86
  });
84
87
  afterEach(async () => {
85
88
  cleanup();
89
+ HostAdaptor.resetInstance();
86
90
  McpAppBridge.resetInstance();
87
- McpAppAdaptor.resetInstance();
88
91
  });
89
- it("should initialize with null widgetState", () => {
90
- const adaptor = McpAppAdaptor.getInstance();
91
- const widgetState = adaptor
92
- .getHostContextStore("widgetState")
93
- .getSnapshot();
94
- expect(widgetState).toBeNull();
92
+ it("should initialize with null viewState", () => {
93
+ const adaptor = getAdaptor();
94
+ const viewState = adaptor.getHostContextStore("viewState").getSnapshot();
95
+ expect(viewState).toBeNull();
95
96
  });
96
97
  it("should create a store with default state when no persisted state exists", () => {
97
98
  const storeCreator = () => ({
@@ -100,9 +101,9 @@ describe("createStore", () => {
100
101
  const store = createStore(storeCreator);
101
102
  expect(store.getState()).toEqual({ count: 0 });
102
103
  });
103
- it("should update in-memory state via setWidgetState", async () => {
104
- const adaptor = McpAppAdaptor.getInstance();
105
- vi.spyOn(adaptor, "setWidgetState").mockResolvedValue(undefined);
104
+ it("should update in-memory state via setViewState", async () => {
105
+ const adaptor = getAdaptor();
106
+ vi.spyOn(adaptor, "setViewState").mockResolvedValue(undefined);
106
107
  const storeCreator = (set) => ({
107
108
  count: 0,
108
109
  increment: () => set((state) => ({ count: state.count + 1 })),
@@ -110,19 +111,19 @@ describe("createStore", () => {
110
111
  const store = createStore(storeCreator);
111
112
  store.getState().increment();
112
113
  await vi.waitFor(() => {
113
- expect(adaptor.setWidgetState).toHaveBeenCalledWith({ count: 1 });
114
+ expect(adaptor.setViewState).toHaveBeenCalledWith({ count: 1 });
114
115
  });
115
116
  });
116
- it("should notify listeners when widget state changes", async () => {
117
+ it("should notify listeners when view state changes", async () => {
117
118
  const postMessageMock = getMcpAppHostPostMessageMock();
118
119
  vi.stubGlobal("parent", { postMessage: postMessageMock });
119
- const adaptor = McpAppAdaptor.getInstance();
120
+ const adaptor = getAdaptor();
120
121
  const listener = vi.fn();
121
- adaptor.getHostContextStore("widgetState").subscribe(listener);
122
- await adaptor.setWidgetState({ count: 42 });
122
+ adaptor.getHostContextStore("viewState").subscribe(listener);
123
+ await adaptor.setViewState({ count: 42 });
123
124
  expect(postMessageMock).toHaveBeenCalledWith(expect.objectContaining({ method: "ui/update-model-context" }), "*");
124
125
  expect(listener).toHaveBeenCalled();
125
- expect(adaptor.getHostContextStore("widgetState").getSnapshot()).toEqual({
126
+ expect(adaptor.getHostContextStore("viewState").getSnapshot()).toEqual({
126
127
  count: 42,
127
128
  });
128
129
  });
@@ -1 +1 @@
1
- {"version":3,"file":"create-store.test.js","sourceRoot":"","sources":["../../src/web/create-store.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EACR,MAAM,EACN,EAAE,EAEF,EAAE,GACH,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAE/B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACtB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,IAAI,UAGH,CAAC;QAEF,UAAU,CAAC,GAAG,EAAE;YACd,UAAU,GAAG;gBACX,WAAW,EAAE,IAAI;gBACjB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;aACrD,CAAC;YACF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACpC,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YAErD,MAAM,YAAY,GAA+C,GAAG,EAAE,CAAC,CAAC;gBACtE,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YAExC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAElD,MAAM,YAAY,GAA+C,GAAG,EAAE,CAAC,CAAC;gBACtE,KAAK,EAAE,CAAC;gBACR,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;YACH,MAAM,YAAY,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAEnD,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAEtD,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YAEzE,MAAM,YAAY,GAA+C,GAAG,EAAE,CAAC,CAAC;gBACtE,KAAK,EAAE,CAAC;gBACR,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAClD,UAAU,CAAC,WAAW,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;YAEvD,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YAExC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;YAE5E,MAAM,YAAY,GAA+C,CAC/D,GAAG,EACH,EAAE,CAAC,CAAC;gBACJ,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;aAC9D,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YACxC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC;YAE7B,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBACpB,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACvD,CAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBACvB,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC1B,cAAc,EAAE,EAAE;aACnB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YAEzD,MAAM,YAAY,GAA+C,GAAG,EAAE,CAAC,CAAC;gBACtE,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YACH,MAAM,WAAW,GAAG;gBAClB,KAAK,EAAE,CAAC;gBACR,CAAC,kBAAkB,CAAC,EAAE,eAAe;aACtC,CAAC;YACF,UAAU,CAAC,WAAW,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;YAEvD,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YAExC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/C,MAAM,CACH,KAAK,CAAC,QAAQ,EAA8B,CAAC,kBAAkB,CAAC,CAClE,CAAC,aAAa,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,UAAU,CAAC,GAAG,EAAE;YACd,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;YACpD,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,OAAO,EAAE,CAAC;YACV,YAAY,CAAC,aAAa,EAAE,CAAC;YAC7B,aAAa,CAAC,aAAa,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,WAAW,GAAG,OAAO;iBACxB,mBAAmB,CAAC,aAAa,CAAC;iBAClC,WAAW,EAAE,CAAC;YAEjB,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;YAEjF,MAAM,YAAY,GAA+C,GAAG,EAAE,CAAC,CAAC;gBACtE,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YAExC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;YAC5C,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAGjE,MAAM,YAAY,GAA+C,CAC/D,GAAG,EACH,EAAE,CAAC,CAAC;gBACJ,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;aAC9D,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YACxC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC;YAE7B,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBACpB,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,eAAe,GAAG,4BAA4B,EAAE,CAAC;YACvD,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;YAE1D,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAEzB,OAAO,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC/D,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YAE5C,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAC1C,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,EAC9D,GAAG,CACJ,CAAC;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC;gBACvE,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"create-store.test.js","sourceRoot":"","sources":["../../src/web/create-store.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EACR,MAAM,EACN,EAAE,EAEF,EAAE,GACH,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EACL,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAE/B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,CAAC,aAAa,EAAE,CAAC;QAC5B,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACtB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,IAAI,UAGH,CAAC;QAEF,UAAU,CAAC,GAAG,EAAE;YACd,UAAU,GAAG;gBACX,WAAW,EAAE,IAAI;gBACjB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;aACrD,CAAC;YACF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACpC,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YAErD,MAAM,YAAY,GAA+C,GAAG,EAAE,CAAC,CAAC;gBACtE,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YAExC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAElD,MAAM,YAAY,GAA+C,GAAG,EAAE,CAAC,CAAC;gBACtE,KAAK,EAAE,CAAC;gBACR,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;YACH,MAAM,YAAY,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAEnD,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAEtD,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YAEzE,MAAM,YAAY,GAA+C,GAAG,EAAE,CAAC,CAAC;gBACtE,KAAK,EAAE,CAAC;gBACR,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAClD,UAAU,CAAC,WAAW,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;YAEvD,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YAExC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;YAE5E,MAAM,YAAY,GAA+C,CAC/D,GAAG,EACH,EAAE,CAAC,CAAC;gBACJ,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;aAC9D,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YACxC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC;YAE7B,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBACpB,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACvD,CAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBACvB,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC1B,cAAc,EAAE,EAAE;aACnB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YAEvD,MAAM,YAAY,GAA+C,GAAG,EAAE,CAAC,CAAC;gBACtE,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YACH,MAAM,WAAW,GAAG;gBAClB,KAAK,EAAE,CAAC;gBACR,CAAC,gBAAgB,CAAC,EAAE,eAAe;aACpC,CAAC;YACF,UAAU,CAAC,WAAW,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;YAEvD,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YAExC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/C,MAAM,CACH,KAAK,CAAC,QAAQ,EAA8B,CAAC,gBAAgB,CAAC,CAChE,CAAC,aAAa,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,UAAU,CAAC,GAAG,EAAE;YACd,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACnC,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;YACpD,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,OAAO,EAAE,CAAC;YACV,WAAW,CAAC,aAAa,EAAE,CAAC;YAC5B,YAAY,CAAC,aAAa,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;YAEzE,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;YAEjF,MAAM,YAAY,GAA+C,GAAG,EAAE,CAAC,CAAC;gBACtE,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YAExC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAG/D,MAAM,YAAY,GAA+C,CAC/D,GAAG,EACH,EAAE,CAAC,CAAC;gBACJ,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;aAC9D,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YACxC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC;YAE7B,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBACpB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,eAAe,GAAG,4BAA4B,EAAE,CAAC;YACvD,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;YAE1D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAEzB,OAAO,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC7D,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YAE1C,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAC1C,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,EAC9D,GAAG,CACJ,CAAC;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC;gBACrE,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { cleanup } from \"@testing-library/react\";\nimport {\n afterEach,\n beforeEach,\n describe,\n expect,\n it,\n type Mock,\n vi,\n} from \"vitest\";\nimport type { StateCreator } from \"zustand\";\nimport { HostAdaptor } from \"./bridges/adaptor.js\";\nimport { getAdaptor } from \"./bridges/get-adaptor.js\";\nimport { McpAppBridge } from \"./bridges/mcp-app/bridge.js\";\nimport { createStore } from \"./create-store.js\";\nimport { VIEW_CONTEXT_KEY } from \"./data-llm.js\";\nimport {\n getMcpAppHostPostMessageMock,\n MockResizeObserver,\n} from \"./hooks/test/utils.js\";\n\ndescribe(\"createStore\", () => {\n afterEach(() => {\n HostAdaptor.resetInstance();\n vi.unstubAllGlobals();\n vi.resetAllMocks();\n });\n\n describe(\"apps-sdk mode\", () => {\n let OpenaiMock: {\n widgetState: unknown;\n setWidgetState: Mock;\n };\n\n beforeEach(() => {\n OpenaiMock = {\n widgetState: null,\n setWidgetState: vi.fn().mockResolvedValue(undefined),\n };\n vi.stubGlobal(\"openai\", OpenaiMock);\n vi.stubGlobal(\"skybridge\", { hostType: \"apps-sdk\" });\n });\n\n it(\"should create a store without default state\", () => {\n type TestState = { count: number };\n const storeCreator: StateCreator<TestState, [], [], TestState> = () => ({\n count: 0,\n });\n\n const store = createStore(storeCreator);\n\n expect(store.getState()).toEqual({ count: 0 });\n });\n\n it(\"should create a store with default state\", () => {\n type TestState = { count: number; name: string };\n const storeCreator: StateCreator<TestState, [], [], TestState> = () => ({\n count: 0,\n name: \"initial\",\n });\n const defaultState = { count: 5, name: \"default\" };\n\n const store = createStore(storeCreator, defaultState);\n\n expect(store.getState()).toEqual({ count: 5, name: \"default\" });\n });\n\n it(\"should initialize from window.openai.widgetState when available\", () => {\n type TestState = { count: number; name: string };\n const storeCreator: StateCreator<TestState, [], [], TestState> = () => ({\n count: 0,\n name: \"initial\",\n });\n const windowState = { count: 20, name: \"window\" };\n OpenaiMock.widgetState = { modelContent: windowState };\n\n const store = createStore(storeCreator);\n\n expect(store.getState()).toEqual({ count: 20, name: \"window\" });\n });\n\n it(\"should persist state changes to window.openai.setWidgetState\", async () => {\n type TestState = { count: number; increment: () => void };\n const storeCreator: StateCreator<TestState, [], [], TestState> = (\n set,\n ) => ({\n count: 0,\n increment: () => set((state) => ({ count: state.count + 1 })),\n });\n\n const store = createStore(storeCreator);\n store.getState().increment();\n\n await vi.waitFor(() => {\n expect(OpenaiMock.setWidgetState).toHaveBeenCalled();\n });\n\n const callArgs = OpenaiMock.setWidgetState.mock.calls[0]?.[0];\n expect(callArgs).toEqual({\n modelContent: { count: 1 },\n privateContent: {},\n });\n });\n\n it(\"should filter view context from initial state\", () => {\n type TestState = { count: number };\n const storeCreator: StateCreator<TestState, [], [], TestState> = () => ({\n count: 0,\n });\n const windowState = {\n count: 5,\n [VIEW_CONTEXT_KEY]: \"context-value\",\n };\n OpenaiMock.widgetState = { modelContent: windowState };\n\n const store = createStore(storeCreator);\n\n expect(store.getState()).toEqual({ count: 5 });\n expect(\n (store.getState() as Record<string, unknown>)[VIEW_CONTEXT_KEY],\n ).toBeUndefined();\n });\n });\n\n describe(\"mcp-app mode\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"openai\", undefined);\n vi.stubGlobal(\"skybridge\", { hostType: \"mcp-app\" });\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n });\n\n afterEach(async () => {\n cleanup();\n HostAdaptor.resetInstance();\n McpAppBridge.resetInstance();\n });\n\n it(\"should initialize with null viewState\", () => {\n const adaptor = getAdaptor();\n const viewState = adaptor.getHostContextStore(\"viewState\").getSnapshot();\n\n expect(viewState).toBeNull();\n });\n\n it(\"should create a store with default state when no persisted state exists\", () => {\n type TestState = { count: number };\n const storeCreator: StateCreator<TestState, [], [], TestState> = () => ({\n count: 0,\n });\n\n const store = createStore(storeCreator);\n\n expect(store.getState()).toEqual({ count: 0 });\n });\n\n it(\"should update in-memory state via setViewState\", async () => {\n const adaptor = getAdaptor();\n vi.spyOn(adaptor, \"setViewState\").mockResolvedValue(undefined);\n\n type TestState = { count: number; increment: () => void };\n const storeCreator: StateCreator<TestState, [], [], TestState> = (\n set,\n ) => ({\n count: 0,\n increment: () => set((state) => ({ count: state.count + 1 })),\n });\n\n const store = createStore(storeCreator);\n store.getState().increment();\n\n await vi.waitFor(() => {\n expect(adaptor.setViewState).toHaveBeenCalledWith({ count: 1 });\n });\n });\n\n it(\"should notify listeners when view state changes\", async () => {\n const postMessageMock = getMcpAppHostPostMessageMock();\n vi.stubGlobal(\"parent\", { postMessage: postMessageMock });\n\n const adaptor = getAdaptor();\n const listener = vi.fn();\n\n adaptor.getHostContextStore(\"viewState\").subscribe(listener);\n await adaptor.setViewState({ count: 42 });\n\n expect(postMessageMock).toHaveBeenCalledWith(\n expect.objectContaining({ method: \"ui/update-model-context\" }),\n \"*\",\n );\n expect(listener).toHaveBeenCalled();\n expect(adaptor.getHostContextStore(\"viewState\").getSnapshot()).toEqual({\n count: 42,\n });\n });\n });\n});\n"]}
@@ -1,14 +1,47 @@
1
1
  import { type ReactNode } from "react";
2
+ /** Text content surfaced to the model by a {@link DataLLM} component. */
2
3
  export type DataLLMContent = string;
4
+ /**
5
+ * A node in the {@link DataLLM} tree. Nested `<DataLLM>` elements form a
6
+ * hierarchy that is serialized as an indented bullet list for the model.
7
+ */
3
8
  export interface DataLLMNode {
4
9
  id: string;
5
10
  parentId: string | null;
6
11
  content: string | null;
7
12
  }
8
- export declare const WIDGET_CONTEXT_KEY: "__widget_context";
13
+ /**
14
+ * Key under which the serialized {@link DataLLM} tree is persisted on the
15
+ * host's `viewState`. The host exposes the value to the model on subsequent
16
+ * turns.
17
+ */
18
+ export declare const VIEW_CONTEXT_KEY: "__view_context";
9
19
  interface DataLLMProps {
10
20
  content: DataLLMContent | null | undefined;
11
21
  children?: ReactNode;
12
22
  }
23
+ /**
24
+ * Surface in-view content to the LLM so it can reason about what the user is
25
+ * seeing without an extra tool call.
26
+ *
27
+ * Each `<DataLLM>` registers `content` as a node in a tree (parented by any
28
+ * enclosing `<DataLLM>`). The flattened tree is serialized as an indented
29
+ * bullet list and persisted on the host's `viewState` under
30
+ * {@link VIEW_CONTEXT_KEY}; the host then surfaces it to the model as part of
31
+ * the next turn's context.
32
+ *
33
+ * Pass `null`/`undefined` for `content` to register only as a structural
34
+ * parent (useful for grouping).
35
+ *
36
+ * @example
37
+ * ```tsx
38
+ * <DataLLM content="Active filters">
39
+ * <DataLLM content={`Sort: ${sort}`} />
40
+ * <DataLLM content={`Page: ${page}`} />
41
+ * </DataLLM>
42
+ * ```
43
+ *
44
+ * @see https://docs.skybridge.tech/api-reference/data-llm
45
+ */
13
46
  export declare function DataLLM({ content, children }: DataLLMProps): import("react/jsx-runtime").JSX.Element;
14
47
  export {};
@@ -1,7 +1,12 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { createContext, useContext, useEffect, useId, } from "react";
3
3
  import { getAdaptor } from "./bridges/index.js";
4
- export const WIDGET_CONTEXT_KEY = "__widget_context";
4
+ /**
5
+ * Key under which the serialized {@link DataLLM} tree is persisted on the
6
+ * host's `viewState`. The host exposes the value to the model on subsequent
7
+ * turns.
8
+ */
9
+ export const VIEW_CONTEXT_KEY = "__view_context";
5
10
  const nodes = new Map();
6
11
  function setNode(node) {
7
12
  nodes.set(node.id, node);
@@ -14,12 +19,35 @@ function removeNode(id) {
14
19
  function onChange() {
15
20
  const description = getLLMDescriptionString();
16
21
  const adaptor = getAdaptor();
17
- adaptor.setWidgetState((prevState) => ({
22
+ adaptor.setViewState((prevState) => ({
18
23
  ...prevState,
19
- [WIDGET_CONTEXT_KEY]: description,
24
+ [VIEW_CONTEXT_KEY]: description,
20
25
  }));
21
26
  }
22
27
  const ParentIdContext = createContext(null);
28
+ /**
29
+ * Surface in-view content to the LLM so it can reason about what the user is
30
+ * seeing without an extra tool call.
31
+ *
32
+ * Each `<DataLLM>` registers `content` as a node in a tree (parented by any
33
+ * enclosing `<DataLLM>`). The flattened tree is serialized as an indented
34
+ * bullet list and persisted on the host's `viewState` under
35
+ * {@link VIEW_CONTEXT_KEY}; the host then surfaces it to the model as part of
36
+ * the next turn's context.
37
+ *
38
+ * Pass `null`/`undefined` for `content` to register only as a structural
39
+ * parent (useful for grouping).
40
+ *
41
+ * @example
42
+ * ```tsx
43
+ * <DataLLM content="Active filters">
44
+ * <DataLLM content={`Sort: ${sort}`} />
45
+ * <DataLLM content={`Page: ${page}`} />
46
+ * </DataLLM>
47
+ * ```
48
+ *
49
+ * @see https://docs.skybridge.tech/api-reference/data-llm
50
+ */
23
51
  export function DataLLM({ content, children }) {
24
52
  const parentId = useContext(ParentIdContext);
25
53
  const id = useId();
@@ -1 +1 @@
1
- {"version":3,"file":"data-llm.js","sourceRoot":"","sources":["../../src/web/data-llm.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-llm.js","sourceRoot":"","sources":["../../src/web/data-llm.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EAEb,UAAU,EACV,SAAS,EACT,KAAK,GACN,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAehD;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAyB,CAAC;AAE1D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;AAE7C,SAAS,OAAO,CAAC,IAAiB;IAChC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACzB,QAAQ,EAAE,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,EAAU;IAC5B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjB,QAAQ,EAAE,CAAC;AACb,CAAC;AAED,SAAS,QAAQ;IACf,MAAM,WAAW,GAAG,uBAAuB,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnC,GAAG,SAAS;QACZ,CAAC,gBAAgB,CAAC,EAAE,WAAW;KAChC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,eAAe,GAAG,aAAa,CAAgB,IAAI,CAAC,CAAC;AAO3D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAgB;IACzD,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC;gBACN,EAAE;gBACF,QAAQ;gBACR,OAAO;aACR,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,OAAO,GAAG,EAAE;YACV,UAAU,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5B,OAAO,CACL,KAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,YAAG,QAAQ,GAA4B,CAC3E,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB;IAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgC,CAAC;IACzD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS,YAAY,CAAC,QAAuB,EAAE,KAAa;QAC1D,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEtB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC","sourcesContent":["import {\n createContext,\n type ReactNode,\n useContext,\n useEffect,\n useId,\n} from \"react\";\nimport { getAdaptor } from \"./bridges/index.js\";\n\n/** Text content surfaced to the model by a {@link DataLLM} component. */\nexport type DataLLMContent = string;\n\n/**\n * A node in the {@link DataLLM} tree. Nested `<DataLLM>` elements form a\n * hierarchy that is serialized as an indented bullet list for the model.\n */\nexport interface DataLLMNode {\n id: string;\n parentId: string | null;\n content: string | null;\n}\n\n/**\n * Key under which the serialized {@link DataLLM} tree is persisted on the\n * host's `viewState`. The host exposes the value to the model on subsequent\n * turns.\n */\nexport const VIEW_CONTEXT_KEY = \"__view_context\" as const;\n\nconst nodes = new Map<string, DataLLMNode>();\n\nfunction setNode(node: DataLLMNode) {\n nodes.set(node.id, node);\n onChange();\n}\n\nfunction removeNode(id: string) {\n nodes.delete(id);\n onChange();\n}\n\nfunction onChange() {\n const description = getLLMDescriptionString();\n const adaptor = getAdaptor();\n adaptor.setViewState((prevState) => ({\n ...prevState,\n [VIEW_CONTEXT_KEY]: description,\n }));\n}\n\nconst ParentIdContext = createContext<string | null>(null);\n\ninterface DataLLMProps {\n content: DataLLMContent | null | undefined;\n children?: ReactNode;\n}\n\n/**\n * Surface in-view content to the LLM so it can reason about what the user is\n * seeing without an extra tool call.\n *\n * Each `<DataLLM>` registers `content` as a node in a tree (parented by any\n * enclosing `<DataLLM>`). The flattened tree is serialized as an indented\n * bullet list and persisted on the host's `viewState` under\n * {@link VIEW_CONTEXT_KEY}; the host then surfaces it to the model as part of\n * the next turn's context.\n *\n * Pass `null`/`undefined` for `content` to register only as a structural\n * parent (useful for grouping).\n *\n * @example\n * ```tsx\n * <DataLLM content=\"Active filters\">\n * <DataLLM content={`Sort: ${sort}`} />\n * <DataLLM content={`Page: ${page}`} />\n * </DataLLM>\n * ```\n *\n * @see https://docs.skybridge.tech/api-reference/data-llm\n */\nexport function DataLLM({ content, children }: DataLLMProps) {\n const parentId = useContext(ParentIdContext);\n const id = useId();\n\n useEffect(() => {\n if (content) {\n setNode({\n id,\n parentId,\n content,\n });\n } else {\n removeNode(id);\n }\n\n return () => {\n removeNode(id);\n };\n }, [id, parentId, content]);\n\n return (\n <ParentIdContext.Provider value={id}>{children}</ParentIdContext.Provider>\n );\n}\n\nfunction getLLMDescriptionString(): string {\n const byParent = new Map<string | null, DataLLMNode[]>();\n for (const node of Array.from(nodes.values())) {\n const key = node.parentId ?? null;\n if (!byParent.has(key)) {\n byParent.set(key, []);\n }\n byParent.get(key)?.push(node);\n }\n\n for (const list of byParent.values()) {\n list.sort((a, b) => a.id.localeCompare(b.id));\n }\n\n const lines: string[] = [];\n\n function traverseTree(parentId: string | null, depth: number) {\n const children = byParent.get(parentId);\n if (!children) {\n return;\n }\n\n for (const child of children) {\n if (child.content?.trim()) {\n const indent = \" \".repeat(depth);\n lines.push(`${indent}- ${child.content.trim()}`);\n }\n traverseTree(child.id, depth + 1);\n }\n }\n\n traverseTree(null, 0);\n\n return lines.join(\"\\n\");\n}\n"]}
@@ -1,13 +1,16 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { cleanup, render } from "@testing-library/react";
3
3
  import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
4
- import { McpAppAdaptor, McpAppBridge } from "./bridges/mcp-app/index.js";
4
+ import { HostAdaptor } from "./bridges/adaptor.js";
5
+ import { getAdaptor } from "./bridges/get-adaptor.js";
6
+ import { McpAppBridge } from "./bridges/mcp-app/index.js";
5
7
  import { DataLLM } from "./data-llm.js";
6
8
  import { getMcpAppHostPostMessageMock, MockResizeObserver, } from "./hooks/test/utils.js";
7
9
  describe("DataLLM", () => {
8
10
  afterEach(() => {
9
11
  // Clean up React components BEFORE unstubbing globals
10
12
  cleanup();
13
+ HostAdaptor.resetInstance();
11
14
  vi.unstubAllGlobals();
12
15
  vi.resetAllMocks();
13
16
  });
@@ -42,26 +45,26 @@ describe("DataLLM", () => {
42
45
  window.openai.widgetState = { modelContent: {}, privateContent: {} };
43
46
  }
44
47
  });
45
- it("should register a node with content and call setWidgetState", () => {
48
+ it("should register a node with content and call setViewState", () => {
46
49
  render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
47
50
  expect(OpenaiMock.setWidgetState).toHaveBeenCalled();
48
51
  const callArgs = OpenaiMock.setWidgetState.mock.calls[0]?.[0]?.modelContent;
49
- expect(callArgs).toHaveProperty("__widget_context");
50
- expect(callArgs?.__widget_context).toContain("- Test content");
52
+ expect(callArgs).toHaveProperty("__view_context");
53
+ expect(callArgs?.__view_context).toContain("- Test content");
51
54
  });
52
- it("should preserve existing widgetState when updating context", () => {
55
+ it("should preserve existing viewState when updating context", () => {
53
56
  OpenaiMock.widgetState = {
54
57
  modelContent: { existingKey: "existingValue" },
55
58
  };
56
59
  render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
57
60
  const callArgs = OpenaiMock.setWidgetState.mock.calls[0]?.[0]?.modelContent;
58
61
  expect(callArgs).toHaveProperty("existingKey", "existingValue");
59
- expect(callArgs).toHaveProperty("__widget_context");
62
+ expect(callArgs).toHaveProperty("__view_context");
60
63
  });
61
64
  it("should handle deeply nested DataLLM components", () => {
62
65
  render(_jsxs(DataLLM, { content: "Level 1", children: [_jsx(DataLLM, { content: "Level 2A" }), _jsx(DataLLM, { content: "Level 2B", children: _jsx(DataLLM, { content: "Level 3", children: _jsx("div", { children: "Content" }) }) })] }));
63
66
  const callArgs = OpenaiMock.setWidgetState.mock.calls[OpenaiMock.setWidgetState.mock.calls.length - 1]?.[0]?.modelContent;
64
- const context = callArgs?.__widget_context;
67
+ const context = callArgs?.__view_context;
65
68
  expect(context).toContain("- Level 1");
66
69
  expect(context).toContain(" - Level 2A");
67
70
  expect(context).toContain(" - Level 2B");
@@ -73,7 +76,7 @@ describe("DataLLM", () => {
73
76
  rerender(_jsx(DataLLM, { content: "Updated content", children: _jsx("div", { children: "Child" }) }));
74
77
  expect(OpenaiMock.setWidgetState.mock.calls.length).toBeGreaterThan(initialCalls);
75
78
  const lastCallArgs = OpenaiMock.setWidgetState.mock.calls[OpenaiMock.setWidgetState.mock.calls.length - 1]?.[0]?.modelContent;
76
- expect(lastCallArgs?.__widget_context).toContain("- Updated content");
79
+ expect(lastCallArgs?.__view_context).toContain("- Updated content");
77
80
  });
78
81
  it("should remove node and update context when component unmounts", () => {
79
82
  const { unmount } = render(_jsx(DataLLM, { content: "Content to remove", children: _jsx("div", { children: "Child" }) }));
@@ -81,13 +84,14 @@ describe("DataLLM", () => {
81
84
  unmount();
82
85
  expect(OpenaiMock.setWidgetState.mock.calls.length).toBeGreaterThan(callsBeforeUnmount);
83
86
  const lastCallArgs = OpenaiMock.setWidgetState.mock.calls[OpenaiMock.setWidgetState.mock.calls.length - 1]?.[0]?.modelContent;
84
- expect(lastCallArgs?.__widget_context).not.toContain("Content to remove");
87
+ expect(lastCallArgs?.__view_context).not.toContain("Content to remove");
85
88
  });
86
89
  });
87
90
  describe("mcp-app mode", () => {
88
91
  let postMessageMock;
89
92
  beforeEach(() => {
90
93
  vi.stubGlobal("skybridge", { hostType: "mcp-app" });
94
+ vi.stubGlobal("openai", undefined);
91
95
  vi.stubGlobal("ResizeObserver", MockResizeObserver);
92
96
  postMessageMock = getMcpAppHostPostMessageMock();
93
97
  vi.stubGlobal("parent", { postMessage: postMessageMock });
@@ -95,43 +99,43 @@ describe("DataLLM", () => {
95
99
  afterEach(() => {
96
100
  cleanup();
97
101
  McpAppBridge.resetInstance();
98
- McpAppAdaptor.resetInstance();
102
+ HostAdaptor.resetInstance();
99
103
  });
100
- it("should register a node and update widget state via adaptor", async () => {
101
- const adaptor = McpAppAdaptor.getInstance();
104
+ it("should register a node and update view state via adaptor", async () => {
105
+ const adaptor = getAdaptor();
102
106
  render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
103
107
  await vi.waitFor(() => {
104
- const widgetState = adaptor
105
- .getHostContextStore("widgetState")
108
+ const viewState = adaptor
109
+ .getHostContextStore("viewState")
106
110
  .getSnapshot();
107
- expect(widgetState?.__widget_context).toContain("- Test content");
111
+ expect(viewState?.__view_context).toContain("- Test content");
108
112
  });
109
113
  });
110
- it("should preserve existing widget state when updating context", async () => {
111
- const adaptor = McpAppAdaptor.getInstance();
112
- await adaptor.setWidgetState({ existingKey: "existingValue" });
114
+ it("should preserve existing view state when updating context", async () => {
115
+ const adaptor = getAdaptor();
116
+ await adaptor.setViewState({ existingKey: "existingValue" });
113
117
  render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
114
118
  await vi.waitFor(() => {
115
- const widgetState = adaptor
116
- .getHostContextStore("widgetState")
119
+ const viewState = adaptor
120
+ .getHostContextStore("viewState")
117
121
  .getSnapshot();
118
- expect(widgetState?.existingKey).toBe("existingValue");
119
- expect(widgetState?.__widget_context).toContain("- Test content");
122
+ expect(viewState?.existingKey).toBe("existingValue");
123
+ expect(viewState?.__view_context).toContain("- Test content");
120
124
  });
121
125
  });
122
126
  it("should handle multiple DataLLM components sharing state through adaptor", async () => {
123
- const adaptor = McpAppAdaptor.getInstance();
127
+ const adaptor = getAdaptor();
124
128
  render(_jsxs(_Fragment, { children: [_jsx(DataLLM, { content: "First component", children: _jsx("div", { children: "First" }) }), _jsx(DataLLM, { content: "Second component", children: _jsx("div", { children: "Second" }) })] }));
125
129
  await vi.waitFor(() => {
126
- const widgetState = adaptor
127
- .getHostContextStore("widgetState")
130
+ const viewState = adaptor
131
+ .getHostContextStore("viewState")
128
132
  .getSnapshot();
129
- const context = widgetState?.__widget_context;
133
+ const context = viewState?.__view_context;
130
134
  expect(context).toContain("- First component");
131
135
  expect(context).toContain("- Second component");
132
136
  });
133
137
  });
134
- it("should call ui/update-model-context when widget state changes", async () => {
138
+ it("should call ui/update-model-context when view state changes", async () => {
135
139
  render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
136
140
  await vi.waitFor(() => {
137
141
  expect(postMessageMock).toHaveBeenCalledWith(expect.objectContaining({ method: "ui/update-model-context" }), "*");
@@ -1 +1 @@
1
- {"version":3,"file":"data-llm.test.js","sourceRoot":"","sources":["../../src/web/data-llm.test.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-llm.test.js","sourceRoot":"","sources":["../../src/web/data-llm.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { cleanup, render } from \"@testing-library/react\";\nimport {\n afterEach,\n beforeEach,\n describe,\n expect,\n it,\n type Mock,\n vi,\n} from \"vitest\";\nimport { HostAdaptor } from \"./bridges/adaptor.js\";\nimport { getAdaptor } from \"./bridges/get-adaptor.js\";\nimport { McpAppBridge } from \"./bridges/mcp-app/index.js\";\nimport { DataLLM } from \"./data-llm.js\";\nimport {\n getMcpAppHostPostMessageMock,\n MockResizeObserver,\n} from \"./hooks/test/utils.js\";\n\ndescribe(\"DataLLM\", () => {\n afterEach(() => {\n // Clean up React components BEFORE unstubbing globals\n cleanup();\n HostAdaptor.resetInstance();\n vi.unstubAllGlobals();\n vi.resetAllMocks();\n });\n\n describe(\"apps-sdk mode\", () => {\n let OpenaiMock: { widgetState: unknown; setWidgetState: Mock };\n\n beforeEach(() => {\n OpenaiMock = {\n widgetState: { modelContent: {} },\n setWidgetState: vi.fn(),\n };\n // Use Object.defineProperty to ensure it persists\n Object.defineProperty(globalThis, \"openai\", {\n value: OpenaiMock,\n writable: true,\n configurable: true,\n });\n // Also set on window for browser-like environment\n if (typeof window !== \"undefined\") {\n Object.defineProperty(window, \"openai\", {\n value: OpenaiMock,\n writable: true,\n configurable: true,\n });\n }\n vi.stubGlobal(\"openai\", OpenaiMock);\n vi.stubGlobal(\"skybridge\", { hostType: \"apps-sdk\" });\n });\n\n afterEach(() => {\n // Keep the mock available for React cleanup, but reset it\n if (typeof window !== \"undefined\" && window.openai) {\n window.openai.setWidgetState = vi.fn();\n window.openai.widgetState = { modelContent: {}, privateContent: {} };\n }\n });\n\n it(\"should register a node with content and call setViewState\", () => {\n render(\n <DataLLM content=\"Test content\">\n <div>Child</div>\n </DataLLM>,\n );\n\n expect(OpenaiMock.setWidgetState).toHaveBeenCalled();\n const callArgs =\n OpenaiMock.setWidgetState.mock.calls[0]?.[0]?.modelContent;\n expect(callArgs).toHaveProperty(\"__view_context\");\n expect(callArgs?.__view_context).toContain(\"- Test content\");\n });\n it(\"should preserve existing viewState when updating context\", () => {\n OpenaiMock.widgetState = {\n modelContent: { existingKey: \"existingValue\" },\n };\n\n render(\n <DataLLM content=\"Test content\">\n <div>Child</div>\n </DataLLM>,\n );\n\n const callArgs =\n OpenaiMock.setWidgetState.mock.calls[0]?.[0]?.modelContent;\n expect(callArgs).toHaveProperty(\"existingKey\", \"existingValue\");\n expect(callArgs).toHaveProperty(\"__view_context\");\n });\n\n it(\"should handle deeply nested DataLLM components\", () => {\n render(\n <DataLLM content=\"Level 1\">\n <DataLLM content=\"Level 2A\" />\n <DataLLM content=\"Level 2B\">\n <DataLLM content=\"Level 3\">\n <div>Content</div>\n </DataLLM>\n </DataLLM>\n </DataLLM>,\n );\n\n const callArgs =\n OpenaiMock.setWidgetState.mock.calls[\n OpenaiMock.setWidgetState.mock.calls.length - 1\n ]?.[0]?.modelContent;\n const context = callArgs?.__view_context as string;\n expect(context).toContain(\"- Level 1\");\n expect(context).toContain(\" - Level 2A\");\n expect(context).toContain(\" - Level 2B\");\n expect(context).toContain(\" - Level 3\");\n });\n\n it(\"should update context when content changes\", () => {\n const { rerender } = render(\n <DataLLM content=\"Initial content\">\n <div>Child</div>\n </DataLLM>,\n );\n\n const initialCalls = OpenaiMock.setWidgetState.mock.calls.length;\n\n rerender(\n <DataLLM content=\"Updated content\">\n <div>Child</div>\n </DataLLM>,\n );\n\n expect(OpenaiMock.setWidgetState.mock.calls.length).toBeGreaterThan(\n initialCalls,\n );\n const lastCallArgs =\n OpenaiMock.setWidgetState.mock.calls[\n OpenaiMock.setWidgetState.mock.calls.length - 1\n ]?.[0]?.modelContent;\n expect(lastCallArgs?.__view_context).toContain(\"- Updated content\");\n });\n\n it(\"should remove node and update context when component unmounts\", () => {\n const { unmount } = render(\n <DataLLM content=\"Content to remove\">\n <div>Child</div>\n </DataLLM>,\n );\n\n const callsBeforeUnmount = OpenaiMock.setWidgetState.mock.calls.length;\n\n unmount();\n\n expect(OpenaiMock.setWidgetState.mock.calls.length).toBeGreaterThan(\n callsBeforeUnmount,\n );\n const lastCallArgs =\n OpenaiMock.setWidgetState.mock.calls[\n OpenaiMock.setWidgetState.mock.calls.length - 1\n ]?.[0]?.modelContent;\n expect(lastCallArgs?.__view_context).not.toContain(\"Content to remove\");\n });\n });\n\n describe(\"mcp-app mode\", () => {\n let postMessageMock: ReturnType<typeof getMcpAppHostPostMessageMock>;\n\n beforeEach(() => {\n vi.stubGlobal(\"skybridge\", { hostType: \"mcp-app\" });\n vi.stubGlobal(\"openai\", undefined);\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n postMessageMock = getMcpAppHostPostMessageMock();\n vi.stubGlobal(\"parent\", { postMessage: postMessageMock });\n });\n\n afterEach(() => {\n cleanup();\n McpAppBridge.resetInstance();\n HostAdaptor.resetInstance();\n });\n\n it(\"should register a node and update view state via adaptor\", async () => {\n const adaptor = getAdaptor();\n\n render(\n <DataLLM content=\"Test content\">\n <div>Child</div>\n </DataLLM>,\n );\n\n await vi.waitFor(() => {\n const viewState = adaptor\n .getHostContextStore(\"viewState\")\n .getSnapshot();\n expect(viewState?.__view_context).toContain(\"- Test content\");\n });\n });\n\n it(\"should preserve existing view state when updating context\", async () => {\n const adaptor = getAdaptor();\n await adaptor.setViewState({ existingKey: \"existingValue\" });\n\n render(\n <DataLLM content=\"Test content\">\n <div>Child</div>\n </DataLLM>,\n );\n\n await vi.waitFor(() => {\n const viewState = adaptor\n .getHostContextStore(\"viewState\")\n .getSnapshot();\n expect(viewState?.existingKey).toBe(\"existingValue\");\n expect(viewState?.__view_context).toContain(\"- Test content\");\n });\n });\n\n it(\"should handle multiple DataLLM components sharing state through adaptor\", async () => {\n const adaptor = getAdaptor();\n\n render(\n <>\n <DataLLM content=\"First component\">\n <div>First</div>\n </DataLLM>\n <DataLLM content=\"Second component\">\n <div>Second</div>\n </DataLLM>\n </>,\n );\n\n await vi.waitFor(() => {\n const viewState = adaptor\n .getHostContextStore(\"viewState\")\n .getSnapshot();\n const context = viewState?.__view_context as string;\n expect(context).toContain(\"- First component\");\n expect(context).toContain(\"- Second component\");\n });\n });\n\n it(\"should call ui/update-model-context when view state changes\", async () => {\n render(\n <DataLLM content=\"Test content\">\n <div>Child</div>\n </DataLLM>,\n );\n\n await vi.waitFor(() => {\n expect(postMessageMock).toHaveBeenCalledWith(\n expect.objectContaining({ method: \"ui/update-model-context\" }),\n \"*\",\n );\n });\n });\n });\n});\n"]}
@@ -15,7 +15,7 @@ type TypedToolInfoReturn<TInput, TOutput, TResponseMetadata> = ToolState<Objecti
15
15
  * Creates typed versions of skybridge hooks with full type inference
16
16
  * for tool names, inputs, and outputs.
17
17
  *
18
- * This is the recommended way to use skybridge hooks in your widgets.
18
+ * This is the recommended way to use skybridge hooks in your views.
19
19
  * Set this up once in a dedicated file and export the typed hooks for use across your app.
20
20
  *
21
21
  * @typeParam ServerType - The type of your McpServer instance (use `typeof server`).
@@ -24,11 +24,13 @@ type TypedToolInfoReturn<TInput, TOutput, TResponseMetadata> = ToolState<Objecti
24
24
  *
25
25
  * @example
26
26
  * ```typescript
27
- * // server/src/index.ts
27
+ * // src/server.ts
28
28
  * const server = new McpServer({ name: "my-app", version: "1.0" }, {})
29
- * .widget("search-voyage", {}, {
29
+ * .registerTool({
30
+ * name: "search-trip",
30
31
  * inputSchema: { destination: z.string() },
31
32
  * outputSchema: { results: z.array(z.string()) },
33
+ * view: { component: "search-trip", description: "Search trips" },
32
34
  * }, async ({ destination }) => {
33
35
  * return { content: [{ type: "text", text: `Found trips to ${destination}` }] };
34
36
  * });
@@ -38,8 +40,8 @@ type TypedToolInfoReturn<TInput, TOutput, TResponseMetadata> = ToolState<Objecti
38
40
  *
39
41
  * @example
40
42
  * ```typescript
41
- * // web/src/helpers.ts (one-time setup)
42
- * import type { AppType } from "../server";
43
+ * // src/helpers.ts (one-time setup)
44
+ * import type { AppType } from "./server";
43
45
  * import { generateHelpers } from "skybridge/web";
44
46
  *
45
47
  * export const { useCallTool, useToolInfo } = generateHelpers<AppType>();
@@ -47,33 +49,35 @@ type TypedToolInfoReturn<TInput, TOutput, TResponseMetadata> = ToolState<Objecti
47
49
  *
48
50
  * @example
49
51
  * ```typescript
50
- * // web/src/widgets/search.tsx (usage)
51
- * import { useCallTool, useToolInfo } from "../skybridge";
52
+ * // src/views/search.tsx (usage)
53
+ * import { useCallTool, useToolInfo } from "../helpers";
52
54
  *
53
- * export function SearchWidget() {
54
- * const { callTool, data } = useCallTool("search-voyage");
55
+ * export function SearchView() {
56
+ * const { callTool, data } = useCallTool("search-trip");
55
57
  * // ^ autocomplete for tool names
56
58
  * callTool({ destination: "Spain" });
57
59
  * // ^ autocomplete for input fields
58
60
  *
59
- * const toolInfo = useToolInfo<"search-voyage">();
60
- * // ^ autocomplete for widget names
61
- * // toolInfo.input is typed based on widget input schema
62
- * // toolInfo.output.structuredContent is typed based on widget output schema
61
+ * const toolInfo = useToolInfo<"search-trip">();
62
+ * // ^ autocomplete for view names
63
+ * // toolInfo.input is typed based on view input schema
64
+ * // toolInfo.output.structuredContent is typed based on view output schema
63
65
  * }
64
66
  * ```
67
+ *
68
+ * @see https://docs.skybridge.tech/api-reference/generate-helpers
65
69
  */
66
70
  export declare function generateHelpers<ServerType = never>(): {
67
71
  /**
68
72
  * Typed version of `useCallTool` that provides autocomplete for tool names
69
73
  * and type inference for inputs and outputs.
70
74
  *
71
- * @param name - The name of the widget to call. Autocompletes based on your server's widget registry.
75
+ * @param name - The name of the tool to call. Autocompletes based on your server's tool registry.
72
76
  * @returns A hook with typed `callTool` function and `data` property.
73
77
  *
74
78
  * @example
75
79
  * ```typescript
76
- * const { callTool, data, isPending } = useCallTool("search-voyage");
80
+ * const { callTool, data, isPending } = useCallTool("search-trip");
77
81
  * // TypeScript knows callTool expects { destination: string }
78
82
  * callTool({ destination: "Spain" });
79
83
  *
@@ -85,15 +89,15 @@ export declare function generateHelpers<ServerType = never>(): {
85
89
  */
86
90
  useCallTool: <ToolName extends keyof InferTools<ServerType> & string>(name: ToolName) => TypedCallToolReturn<ToolInput<ServerType, ToolName>, ToolOutput<ServerType, ToolName>>;
87
91
  /**
88
- * Typed version of `useToolInfo` that provides autocomplete for widget names
92
+ * Typed version of `useToolInfo` that provides autocomplete for tool names
89
93
  * and type inference for inputs, outputs, and responseMetadata.
90
94
  *
91
- * @typeParam K - The name of the widget. Autocompletes based on your server's widget registry.
95
+ * @typeParam K - The name of the tool. Autocompletes based on your server's tool registry.
92
96
  * @returns A discriminated union with `status: "pending" | "success"` that narrows correctly.
93
97
  *
94
98
  * @example
95
99
  * ```typescript
96
- * const toolInfo = useToolInfo<"search-voyage">();
100
+ * const toolInfo = useToolInfo<"search-trip">();
97
101
  * // toolInfo.input is typed as { destination: string; ... }
98
102
  * // toolInfo.output is typed as { results: Array<...>; ... }
99
103
  * // toolInfo.responseMetadata is typed based on _meta in callback return