skybridge 0.0.0-dev.f561bc3 → 0.0.0-dev.f57f202

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 (656) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +155 -0
  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.map +1 -0
  49. package/dist/cli/use-execute-steps.d.ts +11 -0
  50. package/dist/cli/use-execute-steps.js +36 -0
  51. package/dist/cli/use-execute-steps.js.map +1 -0
  52. package/dist/cli/use-messages.d.ts +3 -0
  53. package/dist/cli/use-messages.js +11 -0
  54. package/dist/cli/use-messages.js.map +1 -0
  55. package/dist/cli/use-nodemon.d.ts +26 -0
  56. package/dist/cli/use-nodemon.js +106 -0
  57. package/dist/cli/use-nodemon.js.map +1 -0
  58. package/dist/cli/use-open-browser.d.ts +1 -0
  59. package/dist/cli/use-open-browser.js +44 -0
  60. package/dist/cli/use-open-browser.js.map +1 -0
  61. package/dist/cli/use-tunnel.d.ts +14 -0
  62. package/dist/cli/use-tunnel.js +131 -0
  63. package/dist/cli/use-tunnel.js.map +1 -0
  64. package/dist/cli/use-typescript-check.d.ts +15 -0
  65. package/dist/cli/use-typescript-check.js +97 -0
  66. package/dist/cli/use-typescript-check.js.map +1 -0
  67. package/dist/commands/build.d.ts +6 -0
  68. package/dist/commands/build.js +31 -0
  69. package/dist/commands/build.js.map +1 -0
  70. package/dist/commands/create.d.ts +9 -0
  71. package/dist/commands/create.js +30 -0
  72. package/dist/commands/create.js.map +1 -0
  73. package/dist/commands/dev.d.ts +13 -0
  74. package/dist/commands/dev.js +128 -0
  75. package/dist/commands/dev.js.map +1 -0
  76. package/dist/commands/start.d.ts +9 -0
  77. package/dist/commands/start.js +55 -0
  78. package/dist/commands/start.js.map +1 -0
  79. package/dist/commands/telemetry/disable.d.ts +5 -0
  80. package/dist/commands/telemetry/disable.js +14 -0
  81. package/dist/commands/telemetry/disable.js.map +1 -0
  82. package/dist/commands/telemetry/enable.d.ts +5 -0
  83. package/dist/commands/telemetry/enable.js +14 -0
  84. package/dist/commands/telemetry/enable.js.map +1 -0
  85. package/dist/commands/telemetry/status.d.ts +5 -0
  86. package/dist/commands/telemetry/status.js +14 -0
  87. package/dist/commands/telemetry/status.js.map +1 -0
  88. package/dist/context-warnings.d.ts +5 -0
  89. package/dist/context-warnings.js +31 -0
  90. package/dist/context-warnings.js.map +1 -0
  91. package/dist/context-warnings.test.js +28 -0
  92. package/dist/context-warnings.test.js.map +1 -0
  93. package/dist/server/app.d.ts +194 -0
  94. package/dist/server/app.js +266 -0
  95. package/dist/server/app.js.map +1 -0
  96. package/dist/server/app.test.js +97 -0
  97. package/dist/server/app.test.js.map +1 -0
  98. package/dist/server/asset-base-url-transform-plugin.d.ts +11 -0
  99. package/dist/server/asset-base-url-transform-plugin.js +48 -0
  100. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  101. package/dist/server/asset-base-url-transform-plugin.test.js +134 -0
  102. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  103. package/dist/server/auth/discovery.d.ts +33 -0
  104. package/dist/server/auth/discovery.js +56 -0
  105. package/dist/server/auth/discovery.js.map +1 -0
  106. package/dist/server/auth/discovery.test.js +93 -0
  107. package/dist/server/auth/discovery.test.js.map +1 -0
  108. package/dist/server/auth/index.d.ts +48 -0
  109. package/dist/server/auth/index.js +2 -0
  110. package/dist/server/auth/index.js.map +1 -0
  111. package/dist/server/auth/providers/auth0.d.ts +40 -0
  112. package/dist/server/auth/providers/auth0.js +36 -0
  113. package/dist/server/auth/providers/auth0.js.map +1 -0
  114. package/dist/server/auth/providers/auth0.test.js +50 -0
  115. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  116. package/dist/server/auth/providers/authplane.d.ts +49 -0
  117. package/dist/server/auth/providers/authplane.js +57 -0
  118. package/dist/server/auth/providers/authplane.js.map +1 -0
  119. package/dist/server/auth/providers/authplane.test.js +143 -0
  120. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  121. package/dist/server/auth/providers/clerk.d.ts +51 -0
  122. package/dist/server/auth/providers/clerk.js +19 -0
  123. package/dist/server/auth/providers/clerk.js.map +1 -0
  124. package/dist/server/auth/providers/clerk.test.js +30 -0
  125. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  126. package/dist/server/auth/providers/custom.d.ts +42 -0
  127. package/dist/server/auth/providers/custom.js +59 -0
  128. package/dist/server/auth/providers/custom.js.map +1 -0
  129. package/dist/server/auth/providers/custom.test.js +161 -0
  130. package/dist/server/auth/providers/custom.test.js.map +1 -0
  131. package/dist/server/auth/providers/descope.d.ts +44 -0
  132. package/dist/server/auth/providers/descope.js +44 -0
  133. package/dist/server/auth/providers/descope.js.map +1 -0
  134. package/dist/server/auth/providers/descope.test.js +62 -0
  135. package/dist/server/auth/providers/descope.test.js.map +1 -0
  136. package/dist/server/auth/providers/shared.d.ts +2 -0
  137. package/dist/server/auth/providers/shared.js +6 -0
  138. package/dist/server/auth/providers/shared.js.map +1 -0
  139. package/dist/server/auth/providers/shared.test.js +10 -0
  140. package/dist/server/auth/providers/shared.test.js.map +1 -0
  141. package/dist/server/auth/providers/stytch.d.ts +25 -0
  142. package/dist/server/auth/providers/stytch.js +16 -0
  143. package/dist/server/auth/providers/stytch.js.map +1 -0
  144. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  145. package/dist/server/auth/providers/verify-spy.js +21 -0
  146. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  147. package/dist/server/auth/providers/workos.d.ts +34 -0
  148. package/dist/server/auth/providers/workos.js +16 -0
  149. package/dist/server/auth/providers/workos.js.map +1 -0
  150. package/dist/server/auth/security-schemes.d.ts +23 -0
  151. package/dist/server/auth/security-schemes.js +64 -0
  152. package/dist/server/auth/security-schemes.js.map +1 -0
  153. package/dist/server/auth/security-schemes.test.js +99 -0
  154. package/dist/server/auth/security-schemes.test.js.map +1 -0
  155. package/dist/server/auth/setup.d.ts +6 -0
  156. package/dist/server/auth/setup.js +91 -0
  157. package/dist/server/auth/setup.js.map +1 -0
  158. package/dist/server/auth/setup.test.js +514 -0
  159. package/dist/server/auth/setup.test.js.map +1 -0
  160. package/dist/server/auth/verify.d.ts +48 -0
  161. package/dist/server/auth/verify.js +62 -0
  162. package/dist/server/auth/verify.js.map +1 -0
  163. package/dist/server/auth/verify.test.js +165 -0
  164. package/dist/server/auth/verify.test.js.map +1 -0
  165. package/dist/server/auth-extra.test-d.js +130 -0
  166. package/dist/server/auth-extra.test-d.js.map +1 -0
  167. package/dist/server/auth.d.ts +57 -0
  168. package/dist/server/auth.js +27 -0
  169. package/dist/server/auth.js.map +1 -0
  170. package/dist/server/build-manifest.test.js +28 -0
  171. package/dist/server/build-manifest.test.js.map +1 -0
  172. package/dist/server/content-helpers.d.ts +67 -0
  173. package/dist/server/content-helpers.js +79 -0
  174. package/dist/server/content-helpers.js.map +1 -0
  175. package/dist/server/content-helpers.test.d.ts +1 -0
  176. package/dist/server/content-helpers.test.js +70 -0
  177. package/dist/server/content-helpers.test.js.map +1 -0
  178. package/dist/server/express.d.ts +31 -0
  179. package/dist/server/express.js +107 -0
  180. package/dist/server/express.js.map +1 -0
  181. package/dist/server/express.test.d.ts +1 -0
  182. package/dist/server/express.test.js +608 -0
  183. package/dist/server/express.test.js.map +1 -0
  184. package/dist/server/file-ref.d.ts +28 -0
  185. package/dist/server/file-ref.js +27 -0
  186. package/dist/server/file-ref.js.map +1 -0
  187. package/dist/server/host.d.ts +2 -0
  188. package/dist/server/host.js +11 -0
  189. package/dist/server/host.js.map +1 -0
  190. package/dist/server/host.test.d.ts +1 -0
  191. package/dist/server/host.test.js +13 -0
  192. package/dist/server/host.test.js.map +1 -0
  193. package/dist/server/index.d.ts +22 -0
  194. package/dist/server/index.js +18 -0
  195. package/dist/server/index.js.map +1 -0
  196. package/dist/{src/server → server}/inferUtilityTypes.d.ts +6 -6
  197. package/dist/server/inferUtilityTypes.js.map +1 -0
  198. package/dist/server/mcp-errors.test.d.ts +1 -0
  199. package/dist/server/mcp-errors.test.js +41 -0
  200. package/dist/server/mcp-errors.test.js.map +1 -0
  201. package/dist/server/metric.d.ts +14 -0
  202. package/dist/server/metric.js +62 -0
  203. package/dist/server/metric.js.map +1 -0
  204. package/dist/server/middleware.d.ts +162 -0
  205. package/dist/server/middleware.js +126 -0
  206. package/dist/server/middleware.js.map +1 -0
  207. package/dist/server/middleware.test-d.d.ts +1 -0
  208. package/dist/server/middleware.test-d.js +75 -0
  209. package/dist/server/middleware.test-d.js.map +1 -0
  210. package/dist/server/middleware.test.d.ts +1 -0
  211. package/dist/server/middleware.test.js +601 -0
  212. package/dist/server/middleware.test.js.map +1 -0
  213. package/dist/server/register-tool.test.d.ts +1 -0
  214. package/dist/server/register-tool.test.js +77 -0
  215. package/dist/server/register-tool.test.js.map +1 -0
  216. package/dist/server/requestOrigin.d.ts +7 -0
  217. package/dist/server/requestOrigin.js +25 -0
  218. package/dist/server/requestOrigin.js.map +1 -0
  219. package/dist/server/server.d.ts +496 -0
  220. package/dist/server/server.js +591 -0
  221. package/dist/server/server.js.map +1 -0
  222. package/dist/server/skills-integration.test.d.ts +1 -0
  223. package/dist/server/skills-integration.test.js +86 -0
  224. package/dist/server/skills-integration.test.js.map +1 -0
  225. package/dist/server/skills.d.ts +27 -0
  226. package/dist/server/skills.js +188 -0
  227. package/dist/server/skills.js.map +1 -0
  228. package/dist/server/skills.test.d.ts +1 -0
  229. package/dist/server/skills.test.js +243 -0
  230. package/dist/server/skills.test.js.map +1 -0
  231. package/dist/{src/server → server}/templateHelper.d.ts +2 -7
  232. package/dist/server/templateHelper.js +11 -0
  233. package/dist/server/templateHelper.js.map +1 -0
  234. package/dist/server/templates.generated.d.ts +4 -0
  235. package/dist/server/templates.generated.js +43 -0
  236. package/dist/server/templates.generated.js.map +1 -0
  237. package/dist/server/tool-extra.test.d.ts +1 -0
  238. package/dist/server/tool-extra.test.js +88 -0
  239. package/dist/server/tool-extra.test.js.map +1 -0
  240. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  241. package/dist/server/tunnel-proxy-router.js +110 -0
  242. package/dist/server/tunnel-proxy-router.js.map +1 -0
  243. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  244. package/dist/server/tunnel-proxy-router.test.js +229 -0
  245. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  246. package/dist/server/view-name.test-d.d.ts +1 -0
  247. package/dist/server/view-name.test-d.js +8 -0
  248. package/dist/server/view-name.test-d.js.map +1 -0
  249. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  250. package/dist/server/view-resource-resolution.test.js +176 -0
  251. package/dist/server/view-resource-resolution.test.js.map +1 -0
  252. package/dist/server/viewsDevServer.d.ts +14 -0
  253. package/dist/server/viewsDevServer.js +48 -0
  254. package/dist/server/viewsDevServer.js.map +1 -0
  255. package/dist/{src/test → test}/utils.d.ts +21 -31
  256. package/dist/test/utils.js +266 -0
  257. package/dist/test/utils.js.map +1 -0
  258. package/dist/test/view.test.d.ts +1 -0
  259. package/dist/test/view.test.js +540 -0
  260. package/dist/test/view.test.js.map +1 -0
  261. package/dist/version.d.ts +1 -0
  262. package/dist/version.js +3 -0
  263. package/dist/version.js.map +1 -0
  264. package/dist/views/index.d.ts +10 -0
  265. package/dist/views/index.js +3 -0
  266. package/dist/views/index.js.map +1 -0
  267. package/dist/views/scan-views.d.ts +16 -0
  268. package/dist/views/scan-views.js +88 -0
  269. package/dist/views/scan-views.js.map +1 -0
  270. package/dist/views/scan-views.test.d.ts +1 -0
  271. package/dist/views/scan-views.test.js +99 -0
  272. package/dist/views/scan-views.test.js.map +1 -0
  273. package/dist/views/validate-view.d.ts +1 -0
  274. package/dist/views/validate-view.js +9 -0
  275. package/dist/views/validate-view.js.map +1 -0
  276. package/dist/views/validate-view.test.d.ts +1 -0
  277. package/dist/views/validate-view.test.js +24 -0
  278. package/dist/views/validate-view.test.js.map +1 -0
  279. package/dist/web/bridges/adaptor.d.ts +55 -0
  280. package/dist/web/bridges/adaptor.js +377 -0
  281. package/dist/web/bridges/adaptor.js.map +1 -0
  282. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  283. package/dist/web/bridges/adaptor.test.js +231 -0
  284. package/dist/web/bridges/adaptor.test.js.map +1 -0
  285. package/dist/web/bridges/apps-sdk/bridge.d.ts +15 -0
  286. package/dist/web/bridges/apps-sdk/bridge.js +58 -0
  287. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
  288. package/dist/web/bridges/apps-sdk/index.d.ts +4 -0
  289. package/dist/web/bridges/apps-sdk/index.js +4 -0
  290. package/dist/web/bridges/apps-sdk/index.js.map +1 -0
  291. package/dist/web/bridges/apps-sdk/types.d.ts +133 -0
  292. package/dist/{src/web → web/bridges/apps-sdk}/types.js +0 -1
  293. package/dist/web/bridges/apps-sdk/types.js.map +1 -0
  294. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +13 -0
  295. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +18 -0
  296. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
  297. package/dist/web/bridges/get-adaptor.d.ts +9 -0
  298. package/dist/web/bridges/get-adaptor.js +10 -0
  299. package/dist/web/bridges/get-adaptor.js.map +1 -0
  300. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  301. package/dist/web/bridges/get-adaptor.test.js +32 -0
  302. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  303. package/dist/web/bridges/index.d.ts +5 -0
  304. package/dist/web/bridges/index.js +6 -0
  305. package/dist/web/bridges/index.js.map +1 -0
  306. package/dist/web/bridges/mcp-app/bridge.d.ts +39 -0
  307. package/dist/web/bridges/mcp-app/bridge.js +175 -0
  308. package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
  309. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  310. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  311. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  312. package/dist/web/bridges/mcp-app/index.d.ts +3 -0
  313. package/dist/web/bridges/mcp-app/index.js +3 -0
  314. package/dist/web/bridges/mcp-app/index.js.map +1 -0
  315. package/dist/web/bridges/mcp-app/types.d.ts +33 -0
  316. package/dist/web/bridges/mcp-app/types.js.map +1 -0
  317. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +19 -0
  318. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +19 -0
  319. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
  320. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.d.ts +1 -0
  321. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +26 -0
  322. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
  323. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  324. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  325. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  326. package/dist/web/bridges/types.d.ts +233 -0
  327. package/dist/web/bridges/types.js +15 -0
  328. package/dist/web/bridges/types.js.map +1 -0
  329. package/dist/web/bridges/types.test.d.ts +1 -0
  330. package/dist/web/bridges/types.test.js +19 -0
  331. package/dist/web/bridges/types.test.js.map +1 -0
  332. package/dist/web/bridges/use-host-context.d.ts +7 -0
  333. package/dist/web/bridges/use-host-context.js +13 -0
  334. package/dist/web/bridges/use-host-context.js.map +1 -0
  335. package/dist/web/components/modal-provider.d.ts +4 -0
  336. package/dist/web/components/modal-provider.js +46 -0
  337. package/dist/web/components/modal-provider.js.map +1 -0
  338. package/dist/web/create-store.d.ts +29 -0
  339. package/dist/web/create-store.js +64 -0
  340. package/dist/web/create-store.js.map +1 -0
  341. package/dist/web/create-store.test.d.ts +1 -0
  342. package/dist/web/create-store.test.js +132 -0
  343. package/dist/web/create-store.test.js.map +1 -0
  344. package/dist/web/data-llm.d.ts +47 -0
  345. package/dist/{src/web → web}/data-llm.js +42 -9
  346. package/dist/web/data-llm.js.map +1 -0
  347. package/dist/web/data-llm.test.d.ts +1 -0
  348. package/dist/web/data-llm.test.js +161 -0
  349. package/dist/web/data-llm.test.js.map +1 -0
  350. package/dist/{src/web → web}/generate-helpers.d.ts +41 -32
  351. package/dist/{src/web → web}/generate-helpers.js +38 -30
  352. package/dist/web/generate-helpers.js.map +1 -0
  353. package/dist/web/generate-helpers.test-d.d.ts +1 -0
  354. package/dist/{src/web → web}/generate-helpers.test-d.js +35 -30
  355. package/dist/web/generate-helpers.test-d.js.map +1 -0
  356. package/dist/web/generate-helpers.test.d.ts +1 -0
  357. package/dist/{src/web → web}/generate-helpers.test.js +2 -2
  358. package/dist/web/generate-helpers.test.js.map +1 -0
  359. package/dist/{src/web → web}/helpers/state.d.ts +2 -2
  360. package/dist/web/helpers/state.js +45 -0
  361. package/dist/web/helpers/state.js.map +1 -0
  362. package/dist/web/helpers/state.test.d.ts +1 -0
  363. package/dist/{src/web → web}/helpers/state.test.js +9 -9
  364. package/dist/web/helpers/state.test.js.map +1 -0
  365. package/dist/web/hooks/index.d.ts +18 -0
  366. package/dist/web/hooks/index.js +19 -0
  367. package/dist/web/hooks/index.js.map +1 -0
  368. package/dist/web/hooks/openai-extensions.test.d.ts +1 -0
  369. package/dist/web/hooks/openai-extensions.test.js +114 -0
  370. package/dist/web/hooks/openai-extensions.test.js.map +1 -0
  371. package/dist/web/hooks/test/utils.d.ts +21 -0
  372. package/dist/web/hooks/test/utils.js +75 -0
  373. package/dist/web/hooks/test/utils.js.map +1 -0
  374. package/dist/{src/web → web}/hooks/use-call-tool.d.ts +48 -2
  375. package/dist/web/hooks/use-call-tool.js +101 -0
  376. package/dist/web/hooks/use-call-tool.js.map +1 -0
  377. package/dist/web/hooks/use-call-tool.test-d.d.ts +1 -0
  378. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -0
  379. package/dist/web/hooks/use-call-tool.test.d.ts +1 -0
  380. package/dist/{src/web → web}/hooks/use-call-tool.test.js +91 -24
  381. package/dist/web/hooks/use-call-tool.test.js.map +1 -0
  382. package/dist/web/hooks/use-deep-link.d.ts +22 -0
  383. package/dist/web/hooks/use-deep-link.js +60 -0
  384. package/dist/web/hooks/use-deep-link.js.map +1 -0
  385. package/dist/web/hooks/use-display-mode.d.ts +24 -0
  386. package/dist/web/hooks/use-display-mode.js +29 -0
  387. package/dist/web/hooks/use-display-mode.js.map +1 -0
  388. package/dist/web/hooks/use-display-mode.test-d.d.ts +1 -0
  389. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  390. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  391. package/dist/web/hooks/use-display-mode.test.d.ts +1 -0
  392. package/dist/web/hooks/use-display-mode.test.js +77 -0
  393. package/dist/web/hooks/use-display-mode.test.js.map +1 -0
  394. package/dist/web/hooks/use-download.d.ts +3 -0
  395. package/dist/web/hooks/use-download.js +7 -0
  396. package/dist/web/hooks/use-download.js.map +1 -0
  397. package/dist/web/hooks/use-download.test.d.ts +1 -0
  398. package/dist/web/hooks/use-download.test.js +103 -0
  399. package/dist/web/hooks/use-download.test.js.map +1 -0
  400. package/dist/web/hooks/use-files.d.ts +39 -0
  401. package/dist/web/hooks/use-files.js +42 -0
  402. package/dist/web/hooks/use-files.js.map +1 -0
  403. package/dist/web/hooks/use-files.test.d.ts +1 -0
  404. package/dist/web/hooks/use-files.test.js +62 -0
  405. package/dist/web/hooks/use-files.test.js.map +1 -0
  406. package/dist/web/hooks/use-host.d.ts +44 -0
  407. package/dist/web/hooks/use-host.js +45 -0
  408. package/dist/web/hooks/use-host.js.map +1 -0
  409. package/dist/web/hooks/use-host.test.d.ts +1 -0
  410. package/dist/web/hooks/use-host.test.js +59 -0
  411. package/dist/web/hooks/use-host.test.js.map +1 -0
  412. package/dist/web/hooks/use-model-context.d.ts +44 -0
  413. package/dist/web/hooks/use-model-context.js +65 -0
  414. package/dist/web/hooks/use-model-context.js.map +1 -0
  415. package/dist/web/hooks/use-open-external.d.ts +20 -0
  416. package/dist/web/hooks/use-open-external.js +24 -0
  417. package/dist/web/hooks/use-open-external.js.map +1 -0
  418. package/dist/web/hooks/use-open-external.test.d.ts +1 -0
  419. package/dist/web/hooks/use-open-external.test.js +75 -0
  420. package/dist/web/hooks/use-open-external.test.js.map +1 -0
  421. package/dist/web/hooks/use-register-view-tool.d.ts +37 -0
  422. package/dist/web/hooks/use-register-view-tool.js +50 -0
  423. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  424. package/dist/web/hooks/use-request-close.d.ts +16 -0
  425. package/dist/web/hooks/use-request-close.js +21 -0
  426. package/dist/web/hooks/use-request-close.js.map +1 -0
  427. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  428. package/dist/web/hooks/use-request-close.test.js +47 -0
  429. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  430. package/dist/web/hooks/use-request-modal.d.ts +24 -0
  431. package/dist/web/hooks/use-request-modal.js +31 -0
  432. package/dist/web/hooks/use-request-modal.js.map +1 -0
  433. package/dist/web/hooks/use-request-modal.test.d.ts +1 -0
  434. package/dist/{src/web → web}/hooks/use-request-modal.test.js +16 -2
  435. package/dist/web/hooks/use-request-modal.test.js.map +1 -0
  436. package/dist/web/hooks/use-request-size.d.ts +20 -0
  437. package/dist/web/hooks/use-request-size.js +24 -0
  438. package/dist/web/hooks/use-request-size.js.map +1 -0
  439. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  440. package/dist/web/hooks/use-request-size.test.js +47 -0
  441. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  442. package/dist/web/hooks/use-send-follow-up-message.d.ts +19 -0
  443. package/dist/web/hooks/use-send-follow-up-message.js +25 -0
  444. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
  445. package/dist/web/hooks/use-set-open-in-app-url.d.ts +18 -0
  446. package/dist/web/hooks/use-set-open-in-app-url.js +25 -0
  447. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  448. package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
  449. package/dist/web/hooks/use-set-open-in-app-url.test.js +57 -0
  450. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  451. package/dist/web/hooks/use-tool-info.d.ts +68 -0
  452. package/dist/web/hooks/use-tool-info.js +48 -0
  453. package/dist/web/hooks/use-tool-info.js.map +1 -0
  454. package/dist/web/hooks/use-tool-info.test-d.d.ts +1 -0
  455. package/dist/{src/web → web}/hooks/use-tool-info.test-d.js +19 -6
  456. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
  457. package/dist/web/hooks/use-tool-info.test.d.ts +1 -0
  458. package/dist/web/hooks/use-tool-info.test.js +135 -0
  459. package/dist/web/hooks/use-tool-info.test.js.map +1 -0
  460. package/dist/{src/web → web}/hooks/use-user.d.ts +5 -2
  461. package/dist/web/hooks/use-user.js +38 -0
  462. package/dist/web/hooks/use-user.js.map +1 -0
  463. package/dist/web/hooks/use-user.test.d.ts +1 -0
  464. package/dist/web/hooks/use-user.test.js +170 -0
  465. package/dist/web/hooks/use-user.test.js.map +1 -0
  466. package/dist/web/hooks/use-view-state.d.ts +25 -0
  467. package/dist/web/hooks/use-view-state.js +42 -0
  468. package/dist/web/hooks/use-view-state.js.map +1 -0
  469. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  470. package/dist/web/hooks/use-view-state.test.js +212 -0
  471. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  472. package/dist/web/hooks/use-viewport.d.ts +20 -0
  473. package/dist/web/hooks/use-viewport.js +21 -0
  474. package/dist/web/hooks/use-viewport.js.map +1 -0
  475. package/dist/web/hooks/use-viewport.test.d.ts +1 -0
  476. package/dist/web/hooks/use-viewport.test.js +109 -0
  477. package/dist/web/hooks/use-viewport.test.js.map +1 -0
  478. package/dist/{src/web → web}/index.d.ts +1 -2
  479. package/dist/{src/web → web}/index.js +1 -2
  480. package/dist/web/index.js.map +1 -0
  481. package/dist/web/mount-view.d.ts +21 -0
  482. package/dist/web/mount-view.js +43 -0
  483. package/dist/web/mount-view.js.map +1 -0
  484. package/dist/{src/web → web}/proxy.js +0 -1
  485. package/dist/web/proxy.js.map +1 -0
  486. package/dist/web/types.d.ts +20 -0
  487. package/dist/web/types.js +2 -0
  488. package/dist/web/types.js.map +1 -0
  489. package/package.json +86 -41
  490. package/tsconfig.base.json +33 -0
  491. package/dist/src/server/devtoolsStaticServer.d.ts +0 -15
  492. package/dist/src/server/devtoolsStaticServer.js +0 -38
  493. package/dist/src/server/devtoolsStaticServer.js.map +0 -1
  494. package/dist/src/server/index.d.ts +0 -5
  495. package/dist/src/server/index.js +0 -4
  496. package/dist/src/server/index.js.map +0 -1
  497. package/dist/src/server/inferUtilityTypes.js.map +0 -1
  498. package/dist/src/server/server.d.ts +0 -74
  499. package/dist/src/server/server.js +0 -82
  500. package/dist/src/server/server.js.map +0 -1
  501. package/dist/src/server/templateHelper.js +0 -30
  502. package/dist/src/server/templateHelper.js.map +0 -1
  503. package/dist/src/server/templates/development.hbs +0 -13
  504. package/dist/src/server/templates/production.hbs +0 -7
  505. package/dist/src/server/widgetsDevServer.d.ts +0 -12
  506. package/dist/src/server/widgetsDevServer.js +0 -39
  507. package/dist/src/server/widgetsDevServer.js.map +0 -1
  508. package/dist/src/test/utils.js +0 -242
  509. package/dist/src/test/utils.js.map +0 -1
  510. package/dist/src/test/widget.test.js +0 -146
  511. package/dist/src/test/widget.test.js.map +0 -1
  512. package/dist/src/web/bridges/apps-sdk-adapter.d.ts +0 -3
  513. package/dist/src/web/bridges/apps-sdk-adapter.js +0 -7
  514. package/dist/src/web/bridges/apps-sdk-adapter.js.map +0 -1
  515. package/dist/src/web/bridges/apps-sdk-bridge.d.ts +0 -8
  516. package/dist/src/web/bridges/apps-sdk-bridge.js +0 -41
  517. package/dist/src/web/bridges/apps-sdk-bridge.js.map +0 -1
  518. package/dist/src/web/bridges/get-bridge-methods.d.ts +0 -2
  519. package/dist/src/web/bridges/get-bridge-methods.js +0 -8
  520. package/dist/src/web/bridges/get-bridge-methods.js.map +0 -1
  521. package/dist/src/web/bridges/hooks/types.d.ts +0 -6
  522. package/dist/src/web/bridges/hooks/types.js.map +0 -1
  523. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.d.ts +0 -2
  524. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.js +0 -7
  525. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.js.map +0 -1
  526. package/dist/src/web/bridges/hooks/use-bridge.d.ts +0 -2
  527. package/dist/src/web/bridges/hooks/use-bridge.js +0 -19
  528. package/dist/src/web/bridges/hooks/use-bridge.js.map +0 -1
  529. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.d.ts +0 -4
  530. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.js +0 -7
  531. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.js.map +0 -1
  532. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js +0 -58
  533. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js.map +0 -1
  534. package/dist/src/web/bridges/index.d.ts +0 -4
  535. package/dist/src/web/bridges/index.js +0 -5
  536. package/dist/src/web/bridges/index.js.map +0 -1
  537. package/dist/src/web/bridges/mcp-app-adapter.d.ts +0 -5
  538. package/dist/src/web/bridges/mcp-app-adapter.js +0 -56
  539. package/dist/src/web/bridges/mcp-app-adapter.js.map +0 -1
  540. package/dist/src/web/bridges/mcp-app-bridge.d.ts +0 -30
  541. package/dist/src/web/bridges/mcp-app-bridge.js +0 -139
  542. package/dist/src/web/bridges/mcp-app-bridge.js.map +0 -1
  543. package/dist/src/web/bridges/types.d.ts +0 -33
  544. package/dist/src/web/bridges/types.js.map +0 -1
  545. package/dist/src/web/create-store.d.ts +0 -3
  546. package/dist/src/web/create-store.js +0 -25
  547. package/dist/src/web/create-store.js.map +0 -1
  548. package/dist/src/web/create-store.test.js +0 -70
  549. package/dist/src/web/create-store.test.js.map +0 -1
  550. package/dist/src/web/data-llm.d.ts +0 -14
  551. package/dist/src/web/data-llm.js.map +0 -1
  552. package/dist/src/web/data-llm.test.js +0 -76
  553. package/dist/src/web/data-llm.test.js.map +0 -1
  554. package/dist/src/web/generate-helpers.js.map +0 -1
  555. package/dist/src/web/generate-helpers.test-d.js.map +0 -1
  556. package/dist/src/web/generate-helpers.test.js.map +0 -1
  557. package/dist/src/web/helpers/state.js +0 -40
  558. package/dist/src/web/helpers/state.js.map +0 -1
  559. package/dist/src/web/helpers/state.test.js.map +0 -1
  560. package/dist/src/web/hooks/index.d.ts +0 -11
  561. package/dist/src/web/hooks/index.js +0 -12
  562. package/dist/src/web/hooks/index.js.map +0 -1
  563. package/dist/src/web/hooks/use-call-tool.js +0 -60
  564. package/dist/src/web/hooks/use-call-tool.js.map +0 -1
  565. package/dist/src/web/hooks/use-call-tool.test-d.js.map +0 -1
  566. package/dist/src/web/hooks/use-call-tool.test.js.map +0 -1
  567. package/dist/src/web/hooks/use-display-mode.d.ts +0 -4
  568. package/dist/src/web/hooks/use-display-mode.js +0 -10
  569. package/dist/src/web/hooks/use-display-mode.js.map +0 -1
  570. package/dist/src/web/hooks/use-display-mode.test.js +0 -41
  571. package/dist/src/web/hooks/use-display-mode.test.js.map +0 -1
  572. package/dist/src/web/hooks/use-files.d.ts +0 -10
  573. package/dist/src/web/hooks/use-files.js +0 -7
  574. package/dist/src/web/hooks/use-files.js.map +0 -1
  575. package/dist/src/web/hooks/use-files.test.js +0 -29
  576. package/dist/src/web/hooks/use-files.test.js.map +0 -1
  577. package/dist/src/web/hooks/use-layout.d.ts +0 -22
  578. package/dist/src/web/hooks/use-layout.js +0 -23
  579. package/dist/src/web/hooks/use-layout.js.map +0 -1
  580. package/dist/src/web/hooks/use-layout.test.js +0 -46
  581. package/dist/src/web/hooks/use-layout.test.js.map +0 -1
  582. package/dist/src/web/hooks/use-open-external.d.ts +0 -1
  583. package/dist/src/web/hooks/use-open-external.js +0 -6
  584. package/dist/src/web/hooks/use-open-external.js.map +0 -1
  585. package/dist/src/web/hooks/use-open-external.test.js +0 -24
  586. package/dist/src/web/hooks/use-open-external.test.js.map +0 -1
  587. package/dist/src/web/hooks/use-openai-global.d.ts +0 -3
  588. package/dist/src/web/hooks/use-openai-global.js +0 -6
  589. package/dist/src/web/hooks/use-openai-global.js.map +0 -1
  590. package/dist/src/web/hooks/use-request-modal.d.ts +0 -9
  591. package/dist/src/web/hooks/use-request-modal.js +0 -14
  592. package/dist/src/web/hooks/use-request-modal.js.map +0 -1
  593. package/dist/src/web/hooks/use-request-modal.test.js.map +0 -1
  594. package/dist/src/web/hooks/use-send-follow-up-message.d.ts +0 -1
  595. package/dist/src/web/hooks/use-send-follow-up-message.js +0 -6
  596. package/dist/src/web/hooks/use-send-follow-up-message.js.map +0 -1
  597. package/dist/src/web/hooks/use-tool-info.d.ts +0 -25
  598. package/dist/src/web/hooks/use-tool-info.js +0 -20
  599. package/dist/src/web/hooks/use-tool-info.js.map +0 -1
  600. package/dist/src/web/hooks/use-tool-info.test-d.js.map +0 -1
  601. package/dist/src/web/hooks/use-tool-info.test.js +0 -60
  602. package/dist/src/web/hooks/use-tool-info.test.js.map +0 -1
  603. package/dist/src/web/hooks/use-user.js +0 -19
  604. package/dist/src/web/hooks/use-user.js.map +0 -1
  605. package/dist/src/web/hooks/use-user.test.js +0 -44
  606. package/dist/src/web/hooks/use-user.test.js.map +0 -1
  607. package/dist/src/web/hooks/use-widget-state.d.ts +0 -4
  608. package/dist/src/web/hooks/use-widget-state.js +0 -32
  609. package/dist/src/web/hooks/use-widget-state.js.map +0 -1
  610. package/dist/src/web/hooks/use-widget-state.test.js +0 -61
  611. package/dist/src/web/hooks/use-widget-state.test.js.map +0 -1
  612. package/dist/src/web/index.js.map +0 -1
  613. package/dist/src/web/mount-widget.d.ts +0 -1
  614. package/dist/src/web/mount-widget.js +0 -19
  615. package/dist/src/web/mount-widget.js.map +0 -1
  616. package/dist/src/web/plugin/data-llm.test.js +0 -81
  617. package/dist/src/web/plugin/data-llm.test.js.map +0 -1
  618. package/dist/src/web/plugin/plugin.d.ts +0 -2
  619. package/dist/src/web/plugin/plugin.js +0 -39
  620. package/dist/src/web/plugin/plugin.js.map +0 -1
  621. package/dist/src/web/plugin/transform-data-llm.d.ts +0 -12
  622. package/dist/src/web/plugin/transform-data-llm.js +0 -93
  623. package/dist/src/web/plugin/transform-data-llm.js.map +0 -1
  624. package/dist/src/web/plugin/transform-data-llm.test.js +0 -81
  625. package/dist/src/web/plugin/transform-data-llm.test.js.map +0 -1
  626. package/dist/src/web/proxy.js.map +0 -1
  627. package/dist/src/web/types.d.ts +0 -151
  628. package/dist/src/web/types.js.map +0 -1
  629. package/dist/vitest.config.d.ts +0 -2
  630. package/dist/vitest.config.js +0 -8
  631. package/dist/vitest.config.js.map +0 -1
  632. /package/dist/{src/test/widget.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
  633. /package/dist/{src/web/bridges/hooks/use-mcp-app-bridge.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  634. /package/dist/{src/web/create-store.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  635. /package/dist/{src/web/data-llm.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
  636. /package/dist/{src/web/generate-helpers.test-d.d.ts → cli/tunnel.test.d.ts} +0 -0
  637. /package/dist/{src/web/bridges/hooks → cli}/types.js +0 -0
  638. /package/dist/{src/web/generate-helpers.test.d.ts → context-warnings.test.d.ts} +0 -0
  639. /package/dist/{src/web/helpers/state.test.d.ts → server/app.test.d.ts} +0 -0
  640. /package/dist/{src/web/hooks/use-call-tool.test-d.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
  641. /package/dist/{src/web/hooks/use-display-mode.test.d.ts → server/auth/discovery.test.d.ts} +0 -0
  642. /package/dist/{src/web/hooks/use-files.test.d.ts → server/auth/providers/auth0.test.d.ts} +0 -0
  643. /package/dist/{src/web/hooks/use-layout.test.d.ts → server/auth/providers/authplane.test.d.ts} +0 -0
  644. /package/dist/{src/web/hooks/use-open-external.test.d.ts → server/auth/providers/clerk.test.d.ts} +0 -0
  645. /package/dist/{src/web/hooks/use-request-modal.test.d.ts → server/auth/providers/custom.test.d.ts} +0 -0
  646. /package/dist/{src/web/hooks/use-tool-info.test-d.d.ts → server/auth/providers/descope.test.d.ts} +0 -0
  647. /package/dist/{src/web/hooks/use-tool-info.test.d.ts → server/auth/providers/shared.test.d.ts} +0 -0
  648. /package/dist/{src/web/hooks/use-user.test.d.ts → server/auth/security-schemes.test.d.ts} +0 -0
  649. /package/dist/{src/web/hooks/use-widget-state.test.d.ts → server/auth/setup.test.d.ts} +0 -0
  650. /package/dist/{src/web/plugin/data-llm.test.d.ts → server/auth/verify.test.d.ts} +0 -0
  651. /package/dist/{src/web/hooks/use-call-tool.test.d.ts → server/auth-extra.test-d.d.ts} +0 -0
  652. /package/dist/{src/web/plugin/transform-data-llm.test.d.ts → server/build-manifest.test.d.ts} +0 -0
  653. /package/dist/{src/server → server}/inferUtilityTypes.js +0 -0
  654. /package/dist/{src/web/bridges → web/bridges/mcp-app}/types.js +0 -0
  655. /package/dist/{src/web → web}/hooks/use-call-tool.test-d.js +0 -0
  656. /package/dist/{src/web → web}/proxy.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-store.test.js","sourceRoot":"","sources":["../../src/web/create-store.test.ts"],"names":[],"mappings":"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","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\", {});\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\", {});\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"]}
@@ -0,0 +1,47 @@
1
+ import { type ReactNode } from "react";
2
+ /** Text content surfaced to the model by a {@link DataLLM} component. */
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
+ */
8
+ export interface DataLLMNode {
9
+ id: string;
10
+ parentId: string | null;
11
+ content: string | null;
12
+ }
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";
19
+ interface DataLLMProps {
20
+ content: DataLLMContent | null | undefined;
21
+ children?: ReactNode;
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
+ */
46
+ export declare function DataLLM({ content, children }: DataLLMProps): import("react").JSX.Element;
47
+ export {};
@@ -1,23 +1,54 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { createContext, useContext, useEffect, useId, } from "react";
3
- export const WIDGET_CONTEXT_KEY = "__widget_context";
3
+ import { getAdaptor } from "./bridges/index.js";
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";
4
10
  const nodes = new Map();
5
11
  function setNode(node) {
6
12
  nodes.set(node.id, node);
7
13
  onChange();
8
14
  }
9
15
  function removeNode(id) {
10
- nodes.delete(id);
11
- onChange();
16
+ if (nodes.delete(id)) {
17
+ onChange();
18
+ }
12
19
  }
13
20
  function onChange() {
14
21
  const description = getLLMDescriptionString();
15
- window.openai.setWidgetState({
16
- ...window.openai.widgetState,
17
- [WIDGET_CONTEXT_KEY]: description,
18
- });
22
+ const adaptor = getAdaptor();
23
+ adaptor.setViewState((prevState) => ({
24
+ ...prevState,
25
+ [VIEW_CONTEXT_KEY]: description,
26
+ }));
19
27
  }
20
28
  const ParentIdContext = createContext(null);
29
+ /**
30
+ * Surface in-view content to the LLM so it can reason about what the user is
31
+ * seeing without an extra tool call.
32
+ *
33
+ * Each `<DataLLM>` registers `content` as a node in a tree (parented by any
34
+ * enclosing `<DataLLM>`). The flattened tree is serialized as an indented
35
+ * bullet list and persisted on the host's `viewState` under
36
+ * {@link VIEW_CONTEXT_KEY}; the host then surfaces it to the model as part of
37
+ * the next turn's context.
38
+ *
39
+ * Pass `null`/`undefined` for `content` to register only as a structural
40
+ * parent (useful for grouping).
41
+ *
42
+ * @example
43
+ * ```tsx
44
+ * <DataLLM content="Active filters">
45
+ * <DataLLM content={`Sort: ${sort}`} />
46
+ * <DataLLM content={`Page: ${page}`} />
47
+ * </DataLLM>
48
+ * ```
49
+ *
50
+ * @see https://docs.skybridge.tech/api-reference/data-llm
51
+ */
21
52
  export function DataLLM({ content, children }) {
22
53
  const parentId = useContext(ParentIdContext);
23
54
  const id = useId();
@@ -42,8 +73,9 @@ function getLLMDescriptionString() {
42
73
  const byParent = new Map();
43
74
  for (const node of Array.from(nodes.values())) {
44
75
  const key = node.parentId ?? null;
45
- if (!byParent.has(key))
76
+ if (!byParent.has(key)) {
46
77
  byParent.set(key, []);
78
+ }
47
79
  byParent.get(key)?.push(node);
48
80
  }
49
81
  for (const list of byParent.values()) {
@@ -52,8 +84,9 @@ function getLLMDescriptionString() {
52
84
  const lines = [];
53
85
  function traverseTree(parentId, depth) {
54
86
  const children = byParent.get(parentId);
55
- if (!children)
87
+ if (!children) {
56
88
  return;
89
+ }
57
90
  for (const child of children) {
58
91
  if (child.content?.trim()) {
59
92
  const indent = " ".repeat(depth);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-llm.js","sourceRoot":"","sources":["../../src/web/data-llm.tsx"],"names":[],"mappings":"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","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 if (nodes.delete(id)) {\n onChange();\n }\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"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,161 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { cleanup, render } from "@testing-library/react";
3
+ import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
4
+ import { VIEW_STATE_WARNING_TOKENS } from "../context-warnings.js";
5
+ import { HostAdaptor } from "./bridges/adaptor.js";
6
+ import { getAdaptor } from "./bridges/get-adaptor.js";
7
+ import { McpAppBridge } from "./bridges/mcp-app/index.js";
8
+ import { DataLLM } from "./data-llm.js";
9
+ import { getMcpAppHostPostMessageMock, MockResizeObserver, } from "./hooks/test/utils.js";
10
+ describe("DataLLM", () => {
11
+ afterEach(() => {
12
+ // Clean up React components BEFORE unstubbing globals
13
+ cleanup();
14
+ HostAdaptor.resetInstance();
15
+ vi.unstubAllGlobals();
16
+ vi.resetAllMocks();
17
+ });
18
+ describe("apps-sdk mode", () => {
19
+ let OpenaiMock;
20
+ beforeEach(() => {
21
+ OpenaiMock = {
22
+ widgetState: { modelContent: {} },
23
+ setWidgetState: vi.fn(),
24
+ };
25
+ // Use Object.defineProperty to ensure it persists
26
+ Object.defineProperty(globalThis, "openai", {
27
+ value: OpenaiMock,
28
+ writable: true,
29
+ configurable: true,
30
+ });
31
+ // Also set on window for browser-like environment
32
+ if (typeof window !== "undefined") {
33
+ Object.defineProperty(window, "openai", {
34
+ value: OpenaiMock,
35
+ writable: true,
36
+ configurable: true,
37
+ });
38
+ }
39
+ vi.stubGlobal("openai", OpenaiMock);
40
+ vi.stubGlobal("skybridge", {});
41
+ });
42
+ afterEach(() => {
43
+ // Keep the mock available for React cleanup, but reset it
44
+ if (typeof window !== "undefined" && window.openai) {
45
+ window.openai.setWidgetState = vi.fn();
46
+ window.openai.widgetState = { modelContent: {}, privateContent: {} };
47
+ }
48
+ });
49
+ it("does not publish context when content-less nodes mount, change or unmount", () => {
50
+ const { rerender, unmount } = render(_jsx(DataLLM, { content: undefined, children: _jsx("div", { children: "Child" }) }));
51
+ rerender(_jsx(DataLLM, { content: "", children: _jsx("div", { children: "Child" }) }));
52
+ unmount();
53
+ expect(OpenaiMock.setWidgetState).not.toHaveBeenCalled();
54
+ });
55
+ it("should register a node with content and call setViewState", () => {
56
+ render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
57
+ expect(OpenaiMock.setWidgetState).toHaveBeenCalled();
58
+ const callArgs = OpenaiMock.setWidgetState.mock.calls[0]?.[0]?.modelContent;
59
+ expect(callArgs).toHaveProperty("__view_context");
60
+ expect(callArgs?.__view_context).toContain("- Test content");
61
+ });
62
+ it("should preserve existing viewState when updating context", () => {
63
+ OpenaiMock.widgetState = {
64
+ modelContent: { existingKey: "existingValue" },
65
+ };
66
+ render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
67
+ const callArgs = OpenaiMock.setWidgetState.mock.calls[0]?.[0]?.modelContent;
68
+ expect(callArgs).toHaveProperty("existingKey", "existingValue");
69
+ expect(callArgs).toHaveProperty("__view_context");
70
+ });
71
+ it("warns when DataLLM content reaches the 20K token warning threshold", async () => {
72
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
73
+ render(_jsx(DataLLM, { content: "x".repeat(VIEW_STATE_WARNING_TOKENS * 4), children: _jsx("div", { children: "Child" }) }));
74
+ await vi.waitFor(() => {
75
+ expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining("setWidgetState is persisting"));
76
+ });
77
+ warnSpy.mockRestore();
78
+ });
79
+ it("should handle deeply nested DataLLM components", () => {
80
+ 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" }) }) })] }));
81
+ const callArgs = OpenaiMock.setWidgetState.mock.calls[OpenaiMock.setWidgetState.mock.calls.length - 1]?.[0]?.modelContent;
82
+ const context = callArgs?.__view_context;
83
+ expect(context).toContain("- Level 1");
84
+ expect(context).toContain(" - Level 2A");
85
+ expect(context).toContain(" - Level 2B");
86
+ expect(context).toContain(" - Level 3");
87
+ });
88
+ it("should update context when content changes", () => {
89
+ const { rerender } = render(_jsx(DataLLM, { content: "Initial content", children: _jsx("div", { children: "Child" }) }));
90
+ const initialCalls = OpenaiMock.setWidgetState.mock.calls.length;
91
+ rerender(_jsx(DataLLM, { content: "Updated content", children: _jsx("div", { children: "Child" }) }));
92
+ expect(OpenaiMock.setWidgetState.mock.calls.length).toBeGreaterThan(initialCalls);
93
+ const lastCallArgs = OpenaiMock.setWidgetState.mock.calls[OpenaiMock.setWidgetState.mock.calls.length - 1]?.[0]?.modelContent;
94
+ expect(lastCallArgs?.__view_context).toContain("- Updated content");
95
+ });
96
+ it("should remove node and update context when component unmounts", () => {
97
+ const { unmount } = render(_jsx(DataLLM, { content: "Content to remove", children: _jsx("div", { children: "Child" }) }));
98
+ const callsBeforeUnmount = OpenaiMock.setWidgetState.mock.calls.length;
99
+ unmount();
100
+ expect(OpenaiMock.setWidgetState.mock.calls.length).toBeGreaterThan(callsBeforeUnmount);
101
+ const lastCallArgs = OpenaiMock.setWidgetState.mock.calls[OpenaiMock.setWidgetState.mock.calls.length - 1]?.[0]?.modelContent;
102
+ expect(lastCallArgs?.__view_context).not.toContain("Content to remove");
103
+ });
104
+ });
105
+ describe("mcp-app mode", () => {
106
+ let postMessageMock;
107
+ beforeEach(() => {
108
+ vi.stubGlobal("skybridge", {});
109
+ vi.stubGlobal("openai", undefined);
110
+ vi.stubGlobal("ResizeObserver", MockResizeObserver);
111
+ postMessageMock = getMcpAppHostPostMessageMock();
112
+ vi.stubGlobal("parent", { postMessage: postMessageMock });
113
+ });
114
+ afterEach(() => {
115
+ cleanup();
116
+ McpAppBridge.resetInstance();
117
+ HostAdaptor.resetInstance();
118
+ });
119
+ it("should register a node and update view state via adaptor", async () => {
120
+ const adaptor = getAdaptor();
121
+ render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
122
+ await vi.waitFor(() => {
123
+ const viewState = adaptor
124
+ .getHostContextStore("viewState")
125
+ .getSnapshot();
126
+ expect(viewState?.__view_context).toContain("- Test content");
127
+ });
128
+ });
129
+ it("should preserve existing view state when updating context", async () => {
130
+ const adaptor = getAdaptor();
131
+ await adaptor.setViewState({ existingKey: "existingValue" });
132
+ render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
133
+ await vi.waitFor(() => {
134
+ const viewState = adaptor
135
+ .getHostContextStore("viewState")
136
+ .getSnapshot();
137
+ expect(viewState?.existingKey).toBe("existingValue");
138
+ expect(viewState?.__view_context).toContain("- Test content");
139
+ });
140
+ });
141
+ it("should handle multiple DataLLM components sharing state through adaptor", async () => {
142
+ const adaptor = getAdaptor();
143
+ render(_jsxs(_Fragment, { children: [_jsx(DataLLM, { content: "First component", children: _jsx("div", { children: "First" }) }), _jsx(DataLLM, { content: "Second component", children: _jsx("div", { children: "Second" }) })] }));
144
+ await vi.waitFor(() => {
145
+ const viewState = adaptor
146
+ .getHostContextStore("viewState")
147
+ .getSnapshot();
148
+ const context = viewState?.__view_context;
149
+ expect(context).toContain("- First component");
150
+ expect(context).toContain("- Second component");
151
+ });
152
+ });
153
+ it("should call ui/update-model-context when view state changes", async () => {
154
+ render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
155
+ await vi.waitFor(() => {
156
+ expect(postMessageMock).toHaveBeenCalledWith(expect.objectContaining({ method: "ui/update-model-context" }), "*");
157
+ });
158
+ });
159
+ });
160
+ });
161
+ //# sourceMappingURL=data-llm.test.js.map
@@ -0,0 +1 @@
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 { VIEW_STATE_WARNING_TOKENS } from \"../context-warnings.js\";\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\", {});\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(\"does not publish context when content-less nodes mount, change or unmount\", () => {\n const { rerender, unmount } = render(\n <DataLLM content={undefined}>\n <div>Child</div>\n </DataLLM>,\n );\n rerender(\n <DataLLM content=\"\">\n <div>Child</div>\n </DataLLM>,\n );\n unmount();\n expect(OpenaiMock.setWidgetState).not.toHaveBeenCalled();\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(\"warns when DataLLM content reaches the 20K token warning threshold\", async () => {\n const warnSpy = vi.spyOn(console, \"warn\").mockImplementation(() => {});\n\n render(\n <DataLLM content={\"x\".repeat(VIEW_STATE_WARNING_TOKENS * 4)}>\n <div>Child</div>\n </DataLLM>,\n );\n\n await vi.waitFor(() => {\n expect(warnSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"setWidgetState is persisting\"),\n );\n });\n\n warnSpy.mockRestore();\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\", {});\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"]}
@@ -1,7 +1,8 @@
1
1
  import type { InferTools, ToolInput, ToolOutput, ToolResponseMetadata } from "../server/index.js";
2
+ import type { CallToolOptions, CallToolResponse } from "./bridges/types.js";
2
3
  import { type CallToolAsyncFn, type CallToolFn, type CallToolState } from "./hooks/use-call-tool.js";
3
4
  import { type ToolState } from "./hooks/use-tool-info.js";
4
- import type { CallToolResponse, Objectify, Prettify } from "./types.js";
5
+ import type { Objectify, Prettify } from "./types.js";
5
6
  type TypedCallToolResponse<TOutput> = CallToolResponse & {
6
7
  structuredContent: TOutput;
7
8
  };
@@ -14,31 +15,37 @@ type TypedToolInfoReturn<TInput, TOutput, TResponseMetadata> = ToolState<Objecti
14
15
  * Creates typed versions of skybridge hooks with full type inference
15
16
  * for tool names, inputs, and outputs.
16
17
  *
17
- * 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.
18
19
  * Set this up once in a dedicated file and export the typed hooks for use across your app.
19
20
  *
20
- * @typeParam ServerType - The type of your McpServer instance (use `typeof server`).
21
- * Must be a server instance created with method chaining.
22
- * TypeScript will validate that tools can be inferred from this type.
21
+ * @typeParam AppType - The type of your Skybridge app (use `typeof app`). The
22
+ * handler must return the chained server so the tool
23
+ * types are carried on the app type.
23
24
  *
24
25
  * @example
25
26
  * ```typescript
26
- * // server/src/index.ts
27
- * const server = new McpServer({ name: "my-app", version: "1.0" }, {})
28
- * .widget("search-voyage", {}, {
29
- * inputSchema: { destination: z.string() },
30
- * outputSchema: { results: z.array(z.string()) },
31
- * }, async ({ destination }) => {
32
- * return { content: [{ type: "text", text: `Found trips to ${destination}` }] };
33
- * });
27
+ * // src/server.ts
28
+ * export const app = new Skybridge({
29
+ * name: "my-app",
30
+ * version: "1.0",
31
+ * handler: (server) =>
32
+ * server.registerTool({
33
+ * name: "search-trip",
34
+ * inputSchema: { destination: z.string() },
35
+ * outputSchema: { results: z.array(z.string()) },
36
+ * view: { component: "search-trip", description: "Search trips" },
37
+ * }, async ({ destination }) => {
38
+ * return { content: [{ type: "text", text: `Found trips to ${destination}` }] };
39
+ * }),
40
+ * });
34
41
  *
35
- * export type AppType = typeof server;
42
+ * export type AppType = typeof app;
36
43
  * ```
37
44
  *
38
45
  * @example
39
46
  * ```typescript
40
- * // web/src/skybridge.ts (one-time setup)
41
- * import type { AppType } from "../server";
47
+ * // src/helpers.ts (one-time setup)
48
+ * import type { AppType } from "./server";
42
49
  * import { generateHelpers } from "skybridge/web";
43
50
  *
44
51
  * export const { useCallTool, useToolInfo } = generateHelpers<AppType>();
@@ -46,33 +53,35 @@ type TypedToolInfoReturn<TInput, TOutput, TResponseMetadata> = ToolState<Objecti
46
53
  *
47
54
  * @example
48
55
  * ```typescript
49
- * // web/src/widgets/search.tsx (usage)
50
- * import { useCallTool, useToolInfo } from "../skybridge";
56
+ * // src/views/search.tsx (usage)
57
+ * import { useCallTool, useToolInfo } from "../helpers";
51
58
  *
52
- * export function SearchWidget() {
53
- * const { callTool, data } = useCallTool("search-voyage");
59
+ * export function SearchView() {
60
+ * const { callTool, data } = useCallTool("search-trip");
54
61
  * // ^ autocomplete for tool names
55
62
  * callTool({ destination: "Spain" });
56
63
  * // ^ autocomplete for input fields
57
64
  *
58
- * const toolInfo = useToolInfo<"search-voyage">();
59
- * // ^ autocomplete for widget names
60
- * // toolInfo.input is typed based on widget input schema
61
- * // toolInfo.output.structuredContent is typed based on widget output schema
65
+ * const toolInfo = useToolInfo<"search-trip">();
66
+ * // ^ autocomplete for view names
67
+ * // toolInfo.input is typed based on view input schema
68
+ * // toolInfo.output.structuredContent is typed based on view output schema
62
69
  * }
63
70
  * ```
71
+ *
72
+ * @see https://docs.skybridge.tech/api-reference/generate-helpers
64
73
  */
65
- export declare function generateHelpers<ServerType = never>(): {
74
+ export declare function generateHelpers<AppType = never>(): {
66
75
  /**
67
76
  * Typed version of `useCallTool` that provides autocomplete for tool names
68
77
  * and type inference for inputs and outputs.
69
78
  *
70
- * @param name - The name of the widget to call. Autocompletes based on your server's widget registry.
79
+ * @param name - The name of the tool to call. Autocompletes based on your app's tool registry.
71
80
  * @returns A hook with typed `callTool` function and `data` property.
72
81
  *
73
82
  * @example
74
83
  * ```typescript
75
- * const { callTool, data, isPending } = useCallTool("search-voyage");
84
+ * const { callTool, data, isPending } = useCallTool("search-trip");
76
85
  * // TypeScript knows callTool expects { destination: string }
77
86
  * callTool({ destination: "Spain" });
78
87
  *
@@ -82,17 +91,17 @@ export declare function generateHelpers<ServerType = never>(): {
82
91
  * }
83
92
  * ```
84
93
  */
85
- useCallTool: <ToolName extends keyof InferTools<ServerType> & string>(name: ToolName) => TypedCallToolReturn<ToolInput<ServerType, ToolName>, ToolOutput<ServerType, ToolName>>;
94
+ useCallTool: <ToolName extends keyof InferTools<AppType> & string>(name: ToolName, options?: CallToolOptions) => TypedCallToolReturn<ToolInput<AppType, ToolName>, ToolOutput<AppType, ToolName>>;
86
95
  /**
87
- * Typed version of `useToolInfo` that provides autocomplete for widget names
96
+ * Typed version of `useToolInfo` that provides autocomplete for tool names
88
97
  * and type inference for inputs, outputs, and responseMetadata.
89
98
  *
90
- * @typeParam K - The name of the widget. Autocompletes based on your server's widget registry.
99
+ * @typeParam K - The name of the tool. Autocompletes based on your app's tool registry.
91
100
  * @returns A discriminated union with `status: "pending" | "success"` that narrows correctly.
92
101
  *
93
102
  * @example
94
103
  * ```typescript
95
- * const toolInfo = useToolInfo<"search-voyage">();
104
+ * const toolInfo = useToolInfo<"search-trip">();
96
105
  * // toolInfo.input is typed as { destination: string; ... }
97
106
  * // toolInfo.output is typed as { results: Array<...>; ... }
98
107
  * // toolInfo.responseMetadata is typed based on _meta in callback return
@@ -110,6 +119,6 @@ export declare function generateHelpers<ServerType = never>(): {
110
119
  * }
111
120
  * ```
112
121
  */
113
- useToolInfo: <ToolName extends keyof InferTools<ServerType> & string>() => TypedToolInfoReturn<ToolInput<ServerType, ToolName>, ToolOutput<ServerType, ToolName>, ToolResponseMetadata<ServerType, ToolName>>;
122
+ useToolInfo: <ToolName extends keyof InferTools<AppType> & string>() => TypedToolInfoReturn<ToolInput<AppType, ToolName>, ToolOutput<AppType, ToolName>, ToolResponseMetadata<AppType, ToolName>>;
114
123
  };
115
124
  export {};