skybridge 0.0.0-dev.e0ede01 → 0.0.0-dev.e112094

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 (393) hide show
  1. package/LICENSE +21 -674
  2. package/README.md +91 -355
  3. package/bin/run.js +5 -0
  4. package/dist/cli/detect-port.d.ts +18 -0
  5. package/dist/cli/detect-port.js +61 -0
  6. package/dist/cli/detect-port.js.map +1 -0
  7. package/dist/cli/header.d.ts +4 -0
  8. package/dist/cli/header.js +6 -0
  9. package/dist/cli/header.js.map +1 -0
  10. package/dist/cli/run-command.d.ts +2 -0
  11. package/dist/cli/run-command.js +43 -0
  12. package/dist/cli/run-command.js.map +1 -0
  13. package/dist/cli/telemetry.d.ts +7 -0
  14. package/dist/cli/telemetry.js +123 -0
  15. package/dist/cli/telemetry.js.map +1 -0
  16. package/dist/cli/types.d.ts +5 -0
  17. package/dist/cli/types.js +2 -0
  18. package/dist/cli/types.js.map +1 -0
  19. package/dist/cli/use-execute-steps.d.ts +11 -0
  20. package/dist/cli/use-execute-steps.js +36 -0
  21. package/dist/cli/use-execute-steps.js.map +1 -0
  22. package/dist/cli/use-messages.d.ts +3 -0
  23. package/dist/cli/use-messages.js +11 -0
  24. package/dist/cli/use-messages.js.map +1 -0
  25. package/dist/cli/use-nodemon.d.ts +2 -0
  26. package/dist/cli/use-nodemon.js +64 -0
  27. package/dist/cli/use-nodemon.js.map +1 -0
  28. package/dist/cli/use-tunnel.d.ts +14 -0
  29. package/dist/cli/use-tunnel.js +97 -0
  30. package/dist/cli/use-tunnel.js.map +1 -0
  31. package/dist/cli/use-typescript-check.d.ts +8 -0
  32. package/dist/cli/use-typescript-check.js +59 -0
  33. package/dist/cli/use-typescript-check.js.map +1 -0
  34. package/dist/commands/build.d.ts +9 -0
  35. package/dist/commands/build.js +67 -0
  36. package/dist/commands/build.js.map +1 -0
  37. package/dist/commands/dev.d.ts +11 -0
  38. package/dist/commands/dev.js +49 -0
  39. package/dist/commands/dev.js.map +1 -0
  40. package/dist/commands/start.d.ts +9 -0
  41. package/dist/commands/start.js +49 -0
  42. package/dist/commands/start.js.map +1 -0
  43. package/dist/commands/telemetry/disable.d.ts +5 -0
  44. package/dist/commands/telemetry/disable.js +14 -0
  45. package/dist/commands/telemetry/disable.js.map +1 -0
  46. package/dist/commands/telemetry/enable.d.ts +5 -0
  47. package/dist/commands/telemetry/enable.js +14 -0
  48. package/dist/commands/telemetry/enable.js.map +1 -0
  49. package/dist/commands/telemetry/status.d.ts +5 -0
  50. package/dist/commands/telemetry/status.js +14 -0
  51. package/dist/commands/telemetry/status.js.map +1 -0
  52. package/dist/server/asset-base-url-transform-plugin.d.ts +10 -0
  53. package/dist/server/asset-base-url-transform-plugin.js +33 -0
  54. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  55. package/dist/server/asset-base-url-transform-plugin.test.js +55 -0
  56. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  57. package/dist/server/content-helpers.d.ts +27 -0
  58. package/dist/server/content-helpers.js +46 -0
  59. package/dist/server/content-helpers.js.map +1 -0
  60. package/dist/server/content-helpers.test.js +70 -0
  61. package/dist/server/content-helpers.test.js.map +1 -0
  62. package/dist/server/express.d.ts +15 -0
  63. package/dist/server/express.js +77 -0
  64. package/dist/server/express.js.map +1 -0
  65. package/dist/server/express.test.js +289 -0
  66. package/dist/server/express.test.js.map +1 -0
  67. package/dist/server/index.d.ts +6 -0
  68. package/dist/server/index.js +4 -0
  69. package/dist/server/index.js.map +1 -0
  70. package/dist/{src/server → server}/inferUtilityTypes.d.ts +15 -5
  71. package/dist/server/inferUtilityTypes.js.map +1 -0
  72. package/dist/server/metric.d.ts +14 -0
  73. package/dist/server/metric.js +62 -0
  74. package/dist/server/metric.js.map +1 -0
  75. package/dist/server/middleware.d.ts +124 -0
  76. package/dist/server/middleware.js +93 -0
  77. package/dist/server/middleware.js.map +1 -0
  78. package/dist/server/middleware.test-d.js +75 -0
  79. package/dist/server/middleware.test-d.js.map +1 -0
  80. package/dist/server/middleware.test.js +493 -0
  81. package/dist/server/middleware.test.js.map +1 -0
  82. package/dist/server/server.d.ts +173 -0
  83. package/dist/server/server.js +424 -0
  84. package/dist/server/server.js.map +1 -0
  85. package/dist/{src/server → server}/templateHelper.d.ts +5 -2
  86. package/dist/{src/server → server}/templateHelper.js +5 -4
  87. package/dist/server/templateHelper.js.map +1 -0
  88. package/dist/server/templates/development.hbs +12 -0
  89. package/dist/server/templates/production.hbs +6 -0
  90. package/dist/server/viewsDevServer.d.ts +14 -0
  91. package/dist/server/viewsDevServer.js +45 -0
  92. package/dist/server/viewsDevServer.js.map +1 -0
  93. package/dist/test/utils.d.ts +127 -0
  94. package/dist/test/utils.js +247 -0
  95. package/dist/test/utils.js.map +1 -0
  96. package/dist/test/view.test.js +523 -0
  97. package/dist/test/view.test.js.map +1 -0
  98. package/dist/version.d.ts +1 -0
  99. package/dist/version.js +5 -0
  100. package/dist/version.js.map +1 -0
  101. package/dist/web/bridges/apps-sdk/adaptor.d.ts +24 -0
  102. package/dist/web/bridges/apps-sdk/adaptor.js +93 -0
  103. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -0
  104. package/dist/web/bridges/apps-sdk/bridge.d.ts +10 -0
  105. package/dist/web/bridges/apps-sdk/bridge.js +46 -0
  106. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
  107. package/dist/web/bridges/apps-sdk/index.d.ts +5 -0
  108. package/dist/web/bridges/apps-sdk/index.js +5 -0
  109. package/dist/web/bridges/apps-sdk/index.js.map +1 -0
  110. package/dist/web/bridges/apps-sdk/types.d.ts +126 -0
  111. package/dist/{src/web → web/bridges/apps-sdk}/types.js +0 -1
  112. package/dist/web/bridges/apps-sdk/types.js.map +1 -0
  113. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +2 -0
  114. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +7 -0
  115. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
  116. package/dist/web/bridges/get-adaptor.d.ts +2 -0
  117. package/dist/web/bridges/get-adaptor.js +8 -0
  118. package/dist/web/bridges/get-adaptor.js.map +1 -0
  119. package/dist/web/bridges/index.d.ts +5 -0
  120. package/dist/web/bridges/index.js +6 -0
  121. package/dist/web/bridges/index.js.map +1 -0
  122. package/dist/web/bridges/mcp-app/adaptor.d.ts +48 -0
  123. package/dist/web/bridges/mcp-app/adaptor.js +268 -0
  124. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -0
  125. package/dist/web/bridges/mcp-app/bridge.d.ts +26 -0
  126. package/dist/web/bridges/mcp-app/bridge.js +102 -0
  127. package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
  128. package/dist/web/bridges/mcp-app/index.d.ts +4 -0
  129. package/dist/web/bridges/mcp-app/index.js +4 -0
  130. package/dist/web/bridges/mcp-app/index.js.map +1 -0
  131. package/dist/web/bridges/mcp-app/types.d.ts +8 -0
  132. package/dist/web/bridges/mcp-app/types.js +2 -0
  133. package/dist/web/bridges/mcp-app/types.js.map +1 -0
  134. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +7 -0
  135. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +7 -0
  136. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
  137. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +26 -0
  138. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
  139. package/dist/web/bridges/types.d.ts +109 -0
  140. package/dist/web/bridges/types.js +2 -0
  141. package/dist/web/bridges/types.js.map +1 -0
  142. package/dist/web/bridges/use-host-context.d.ts +2 -0
  143. package/dist/web/bridges/use-host-context.js +8 -0
  144. package/dist/web/bridges/use-host-context.js.map +1 -0
  145. package/dist/web/components/modal-provider.d.ts +4 -0
  146. package/dist/web/components/modal-provider.js +45 -0
  147. package/dist/web/components/modal-provider.js.map +1 -0
  148. package/dist/web/create-store.js +38 -0
  149. package/dist/web/create-store.js.map +1 -0
  150. package/dist/web/create-store.test.js +129 -0
  151. package/dist/web/create-store.test.js.map +1 -0
  152. package/dist/{src/web → web}/data-llm.d.ts +1 -0
  153. package/dist/{src/web → web}/data-llm.js +13 -8
  154. package/dist/web/data-llm.js.map +1 -0
  155. package/dist/web/data-llm.test.js +142 -0
  156. package/dist/web/data-llm.test.js.map +1 -0
  157. package/dist/{src/web → web}/generate-helpers.d.ts +30 -25
  158. package/dist/{src/web → web}/generate-helpers.js +24 -20
  159. package/dist/web/generate-helpers.js.map +1 -0
  160. package/dist/{src/web → web}/generate-helpers.test-d.js +79 -23
  161. package/dist/web/generate-helpers.test-d.js.map +1 -0
  162. package/dist/{src/web → web}/generate-helpers.test.js +1 -1
  163. package/dist/web/generate-helpers.test.js.map +1 -0
  164. package/dist/web/helpers/state.d.ts +7 -0
  165. package/dist/web/helpers/state.js +45 -0
  166. package/dist/web/helpers/state.js.map +1 -0
  167. package/dist/web/helpers/state.test.js +53 -0
  168. package/dist/web/helpers/state.test.js.map +1 -0
  169. package/dist/web/hooks/index.d.ts +11 -0
  170. package/dist/{src/web → web}/hooks/index.js +4 -5
  171. package/dist/web/hooks/index.js.map +1 -0
  172. package/dist/web/hooks/test/utils.d.ts +16 -0
  173. package/dist/web/hooks/test/utils.js +64 -0
  174. package/dist/web/hooks/test/utils.js.map +1 -0
  175. package/dist/{src/web → web}/hooks/use-call-tool.d.ts +3 -2
  176. package/dist/{src/web → web}/hooks/use-call-tool.js +12 -4
  177. package/dist/web/hooks/use-call-tool.js.map +1 -0
  178. package/dist/{src/web → web}/hooks/use-call-tool.test-d.js +1 -1
  179. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -0
  180. package/dist/{src/web → web}/hooks/use-call-tool.test.js +35 -16
  181. package/dist/web/hooks/use-call-tool.test.js.map +1 -0
  182. package/dist/web/hooks/use-display-mode.d.ts +4 -0
  183. package/dist/web/hooks/use-display-mode.js +9 -0
  184. package/dist/web/hooks/use-display-mode.js.map +1 -0
  185. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  186. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  187. package/dist/{src/web → web}/hooks/use-display-mode.test.js +3 -2
  188. package/dist/web/hooks/use-display-mode.test.js.map +1 -0
  189. package/dist/web/hooks/use-files.d.ts +7 -0
  190. package/dist/web/hooks/use-files.js +10 -0
  191. package/dist/web/hooks/use-files.js.map +1 -0
  192. package/dist/web/hooks/use-files.test.js +54 -0
  193. package/dist/web/hooks/use-files.test.js.map +1 -0
  194. package/dist/web/hooks/use-layout.d.ts +22 -0
  195. package/dist/web/hooks/use-layout.js +23 -0
  196. package/dist/web/hooks/use-layout.js.map +1 -0
  197. package/dist/web/hooks/use-layout.test.js +96 -0
  198. package/dist/web/hooks/use-layout.test.js.map +1 -0
  199. package/dist/web/hooks/use-open-external.d.ts +3 -0
  200. package/dist/web/hooks/use-open-external.js +8 -0
  201. package/dist/web/hooks/use-open-external.js.map +1 -0
  202. package/dist/web/hooks/use-open-external.test.d.ts +1 -0
  203. package/dist/web/hooks/use-open-external.test.js +65 -0
  204. package/dist/web/hooks/use-open-external.test.js.map +1 -0
  205. package/dist/web/hooks/use-request-modal.d.ts +9 -0
  206. package/dist/web/hooks/use-request-modal.js +16 -0
  207. package/dist/web/hooks/use-request-modal.js.map +1 -0
  208. package/dist/web/hooks/use-request-modal.test.d.ts +1 -0
  209. package/dist/web/hooks/use-request-modal.test.js +61 -0
  210. package/dist/web/hooks/use-request-modal.test.js.map +1 -0
  211. package/dist/web/hooks/use-send-follow-up-message.js +8 -0
  212. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
  213. package/dist/web/hooks/use-set-open-in-app-url.d.ts +1 -0
  214. package/dist/web/hooks/use-set-open-in-app-url.js +8 -0
  215. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  216. package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
  217. package/dist/web/hooks/use-set-open-in-app-url.test.js +43 -0
  218. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  219. package/dist/{src/web → web}/hooks/use-tool-info.d.ts +13 -2
  220. package/dist/web/hooks/use-tool-info.js +26 -0
  221. package/dist/web/hooks/use-tool-info.js.map +1 -0
  222. package/dist/web/hooks/use-tool-info.test-d.d.ts +1 -0
  223. package/dist/{src/web → web}/hooks/use-tool-info.test-d.js +40 -5
  224. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
  225. package/dist/web/hooks/use-tool-info.test.d.ts +1 -0
  226. package/dist/web/hooks/use-tool-info.test.js +130 -0
  227. package/dist/web/hooks/use-tool-info.test.js.map +1 -0
  228. package/dist/web/hooks/use-user.d.ts +18 -0
  229. package/dist/web/hooks/use-user.js +35 -0
  230. package/dist/web/hooks/use-user.js.map +1 -0
  231. package/dist/web/hooks/use-user.test.d.ts +1 -0
  232. package/dist/web/hooks/use-user.test.js +122 -0
  233. package/dist/web/hooks/use-user.test.js.map +1 -0
  234. package/dist/web/hooks/use-view-state.d.ts +4 -0
  235. package/dist/web/hooks/use-view-state.js +32 -0
  236. package/dist/web/hooks/use-view-state.js.map +1 -0
  237. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  238. package/dist/web/hooks/use-view-state.test.js +177 -0
  239. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  240. package/dist/{src/web → web}/index.d.ts +5 -5
  241. package/dist/{src/web → web}/index.js +5 -5
  242. package/dist/web/index.js.map +1 -0
  243. package/dist/web/mount-view.d.ts +1 -0
  244. package/dist/{src/web/mount-widget.js → web/mount-view.js} +11 -3
  245. package/dist/web/mount-view.js.map +1 -0
  246. package/dist/web/plugin/data-llm.test.d.ts +1 -0
  247. package/dist/web/plugin/data-llm.test.js.map +1 -0
  248. package/dist/web/plugin/plugin.d.ts +5 -0
  249. package/dist/web/plugin/plugin.js +141 -0
  250. package/dist/web/plugin/plugin.js.map +1 -0
  251. package/dist/web/plugin/scan-views.d.ts +8 -0
  252. package/dist/web/plugin/scan-views.js +70 -0
  253. package/dist/web/plugin/scan-views.js.map +1 -0
  254. package/dist/web/plugin/scan-views.test.d.ts +1 -0
  255. package/dist/web/plugin/scan-views.test.js +67 -0
  256. package/dist/web/plugin/scan-views.test.js.map +1 -0
  257. package/dist/{src/web → web}/plugin/transform-data-llm.js +7 -4
  258. package/dist/web/plugin/transform-data-llm.js.map +1 -0
  259. package/dist/web/plugin/transform-data-llm.test.d.ts +1 -0
  260. package/dist/web/plugin/transform-data-llm.test.js.map +1 -0
  261. package/dist/web/plugin/validate-view.d.ts +1 -0
  262. package/dist/web/plugin/validate-view.js +9 -0
  263. package/dist/web/plugin/validate-view.js.map +1 -0
  264. package/dist/web/plugin/validate-view.test.d.ts +1 -0
  265. package/dist/web/plugin/validate-view.test.js +24 -0
  266. package/dist/web/plugin/validate-view.test.js.map +1 -0
  267. package/dist/{src/web → web}/proxy.js +6 -2
  268. package/dist/web/proxy.js.map +1 -0
  269. package/dist/web/types.d.ts +16 -0
  270. package/dist/web/types.js +2 -0
  271. package/dist/web/types.js.map +1 -0
  272. package/package.json +78 -38
  273. package/tsconfig.base.json +33 -0
  274. package/dist/src/server/index.d.ts +0 -4
  275. package/dist/src/server/index.js +0 -3
  276. package/dist/src/server/index.js.map +0 -1
  277. package/dist/src/server/inferUtilityTypes.js.map +0 -1
  278. package/dist/src/server/server.d.ts +0 -48
  279. package/dist/src/server/server.js +0 -62
  280. package/dist/src/server/server.js.map +0 -1
  281. package/dist/src/server/templateHelper.js.map +0 -1
  282. package/dist/src/server/templates/development.hbs +0 -12
  283. package/dist/src/server/templates/production.hbs +0 -6
  284. package/dist/src/server/widgetsDevServer.d.ts +0 -12
  285. package/dist/src/server/widgetsDevServer.js +0 -39
  286. package/dist/src/server/widgetsDevServer.js.map +0 -1
  287. package/dist/src/test/utils.d.ts +0 -89
  288. package/dist/src/test/utils.js +0 -164
  289. package/dist/src/test/utils.js.map +0 -1
  290. package/dist/src/test/widget.test.js +0 -90
  291. package/dist/src/test/widget.test.js.map +0 -1
  292. package/dist/src/web/create-store.js +0 -99
  293. package/dist/src/web/create-store.js.map +0 -1
  294. package/dist/src/web/data-llm.js.map +0 -1
  295. package/dist/src/web/data-llm.test.js +0 -76
  296. package/dist/src/web/data-llm.test.js.map +0 -1
  297. package/dist/src/web/generate-helpers.js.map +0 -1
  298. package/dist/src/web/generate-helpers.test-d.js.map +0 -1
  299. package/dist/src/web/generate-helpers.test.js.map +0 -1
  300. package/dist/src/web/hooks/index.d.ts +0 -12
  301. package/dist/src/web/hooks/index.js.map +0 -1
  302. package/dist/src/web/hooks/use-call-tool.js.map +0 -1
  303. package/dist/src/web/hooks/use-call-tool.test-d.js.map +0 -1
  304. package/dist/src/web/hooks/use-call-tool.test.js.map +0 -1
  305. package/dist/src/web/hooks/use-display-mode.d.ts +0 -4
  306. package/dist/src/web/hooks/use-display-mode.js +0 -7
  307. package/dist/src/web/hooks/use-display-mode.js.map +0 -1
  308. package/dist/src/web/hooks/use-display-mode.test.js.map +0 -1
  309. package/dist/src/web/hooks/use-files.d.ts +0 -10
  310. package/dist/src/web/hooks/use-files.js +0 -7
  311. package/dist/src/web/hooks/use-files.js.map +0 -1
  312. package/dist/src/web/hooks/use-files.test.js +0 -29
  313. package/dist/src/web/hooks/use-files.test.js.map +0 -1
  314. package/dist/src/web/hooks/use-locale.d.ts +0 -1
  315. package/dist/src/web/hooks/use-locale.js +0 -5
  316. package/dist/src/web/hooks/use-locale.js.map +0 -1
  317. package/dist/src/web/hooks/use-locale.test.js +0 -21
  318. package/dist/src/web/hooks/use-locale.test.js.map +0 -1
  319. package/dist/src/web/hooks/use-open-external.d.ts +0 -1
  320. package/dist/src/web/hooks/use-open-external.js +0 -6
  321. package/dist/src/web/hooks/use-open-external.js.map +0 -1
  322. package/dist/src/web/hooks/use-open-external.test.js +0 -24
  323. package/dist/src/web/hooks/use-open-external.test.js.map +0 -1
  324. package/dist/src/web/hooks/use-openai-global.d.ts +0 -2
  325. package/dist/src/web/hooks/use-openai-global.js +0 -23
  326. package/dist/src/web/hooks/use-openai-global.js.map +0 -1
  327. package/dist/src/web/hooks/use-request-modal.d.ts +0 -6
  328. package/dist/src/web/hooks/use-request-modal.js +0 -9
  329. package/dist/src/web/hooks/use-request-modal.js.map +0 -1
  330. package/dist/src/web/hooks/use-request-modal.test.js +0 -24
  331. package/dist/src/web/hooks/use-request-modal.test.js.map +0 -1
  332. package/dist/src/web/hooks/use-send-follow-up-message.js +0 -11
  333. package/dist/src/web/hooks/use-send-follow-up-message.js.map +0 -1
  334. package/dist/src/web/hooks/use-theme.d.ts +0 -1
  335. package/dist/src/web/hooks/use-theme.js +0 -5
  336. package/dist/src/web/hooks/use-theme.js.map +0 -1
  337. package/dist/src/web/hooks/use-theme.test.js +0 -26
  338. package/dist/src/web/hooks/use-theme.test.js.map +0 -1
  339. package/dist/src/web/hooks/use-tool-info.js +0 -22
  340. package/dist/src/web/hooks/use-tool-info.js.map +0 -1
  341. package/dist/src/web/hooks/use-tool-info.test-d.js.map +0 -1
  342. package/dist/src/web/hooks/use-tool-info.test.js +0 -59
  343. package/dist/src/web/hooks/use-tool-info.test.js.map +0 -1
  344. package/dist/src/web/hooks/use-user-agent.d.ts +0 -1
  345. package/dist/src/web/hooks/use-user-agent.js +0 -5
  346. package/dist/src/web/hooks/use-user-agent.js.map +0 -1
  347. package/dist/src/web/hooks/use-user-agent.test.js +0 -31
  348. package/dist/src/web/hooks/use-user-agent.test.js.map +0 -1
  349. package/dist/src/web/hooks/use-widget-state.d.ts +0 -4
  350. package/dist/src/web/hooks/use-widget-state.js +0 -54
  351. package/dist/src/web/hooks/use-widget-state.js.map +0 -1
  352. package/dist/src/web/hooks/use-widget-state.test.js +0 -60
  353. package/dist/src/web/hooks/use-widget-state.test.js.map +0 -1
  354. package/dist/src/web/index.js.map +0 -1
  355. package/dist/src/web/mount-widget.d.ts +0 -1
  356. package/dist/src/web/mount-widget.js.map +0 -1
  357. package/dist/src/web/plugin/data-llm.test.js.map +0 -1
  358. package/dist/src/web/plugin/plugin.d.ts +0 -2
  359. package/dist/src/web/plugin/plugin.js +0 -33
  360. package/dist/src/web/plugin/plugin.js.map +0 -1
  361. package/dist/src/web/plugin/transform-data-llm.js.map +0 -1
  362. package/dist/src/web/plugin/transform-data-llm.test.js.map +0 -1
  363. package/dist/src/web/proxy.js.map +0 -1
  364. package/dist/src/web/types.d.ts +0 -133
  365. package/dist/src/web/types.js.map +0 -1
  366. package/dist/vitest.config.d.ts +0 -2
  367. package/dist/vitest.config.js +0 -8
  368. package/dist/vitest.config.js.map +0 -1
  369. /package/dist/{src/test/widget.test.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
  370. /package/dist/{src/web/data-llm.test.d.ts → server/content-helpers.test.d.ts} +0 -0
  371. /package/dist/{src/web/generate-helpers.test-d.d.ts → server/express.test.d.ts} +0 -0
  372. /package/dist/{src/server → server}/inferUtilityTypes.js +0 -0
  373. /package/dist/{src/web/generate-helpers.test.d.ts → server/middleware.test-d.d.ts} +0 -0
  374. /package/dist/{src/web/hooks/use-call-tool.test-d.d.ts → server/middleware.test.d.ts} +0 -0
  375. /package/dist/{src/web/hooks/use-call-tool.test.d.ts → test/view.test.d.ts} +0 -0
  376. /package/dist/{src/web/hooks/use-display-mode.test.d.ts → web/bridges/mcp-app/use-mcp-app-context.test.d.ts} +0 -0
  377. /package/dist/{src/web → web}/create-store.d.ts +0 -0
  378. /package/dist/{src/web/hooks/use-files.test.d.ts → web/create-store.test.d.ts} +0 -0
  379. /package/dist/{src/web/plugin → web}/data-llm.test.d.ts +0 -0
  380. /package/dist/{src/web/hooks/use-locale.test.d.ts → web/generate-helpers.test-d.d.ts} +0 -0
  381. /package/dist/{src/web/hooks/use-open-external.test.d.ts → web/generate-helpers.test.d.ts} +0 -0
  382. /package/dist/{src/web/hooks/use-request-modal.test.d.ts → web/helpers/state.test.d.ts} +0 -0
  383. /package/dist/{src/web/hooks/use-theme.test.d.ts → web/hooks/use-call-tool.test-d.d.ts} +0 -0
  384. /package/dist/{src/web/hooks/use-tool-info.test-d.d.ts → web/hooks/use-call-tool.test.d.ts} +0 -0
  385. /package/dist/{src/web/hooks/use-tool-info.test.d.ts → web/hooks/use-display-mode.test-d.d.ts} +0 -0
  386. /package/dist/{src/web/hooks/use-user-agent.test.d.ts → web/hooks/use-display-mode.test.d.ts} +0 -0
  387. /package/dist/{src/web/hooks/use-widget-state.test.d.ts → web/hooks/use-files.test.d.ts} +0 -0
  388. /package/dist/{src/web/plugin/transform-data-llm.test.d.ts → web/hooks/use-layout.test.d.ts} +0 -0
  389. /package/dist/{src/web → web}/hooks/use-send-follow-up-message.d.ts +0 -0
  390. /package/dist/{src/web → web}/plugin/data-llm.test.js +0 -0
  391. /package/dist/{src/web → web}/plugin/transform-data-llm.d.ts +0 -0
  392. /package/dist/{src/web → web}/plugin/transform-data-llm.test.js +0 -0
  393. /package/dist/{src/web → web}/proxy.d.ts +0 -0
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useSyncExternalStore } from "react";
3
+ import { McpAppAdaptor } from "../bridges/index.js";
4
+ const modalStyles = `
5
+ .sb-modal-backdrop {
6
+ position: fixed;
7
+ inset: 0;
8
+ background: rgba(0, 0, 0, 0.5);
9
+ z-index: 9998;
10
+ }
11
+ .sb-modal-container {
12
+ border-radius: 12px;
13
+ position: fixed;
14
+ inset: 0;
15
+ margin: auto;
16
+ width: fit-content;
17
+ height: fit-content;
18
+ background: white;
19
+ z-index: 9999;
20
+ }
21
+ `;
22
+ export function ModalProvider({ children }) {
23
+ const adaptor = McpAppAdaptor.getInstance();
24
+ const { mode } = useSyncExternalStore(adaptor.getHostContextStore("display").subscribe, adaptor.getHostContextStore("display").getSnapshot);
25
+ const isOpen = mode === "modal";
26
+ const handleBackdropClick = (e) => {
27
+ if (e.target === e.currentTarget) {
28
+ adaptor.closeModal();
29
+ }
30
+ };
31
+ useEffect(() => {
32
+ if (!isOpen) {
33
+ return;
34
+ }
35
+ const handler = (e) => {
36
+ if (e.key === "Escape") {
37
+ adaptor.closeModal();
38
+ }
39
+ };
40
+ document.addEventListener("keydown", handler);
41
+ return () => document.removeEventListener("keydown", handler);
42
+ }, [isOpen, adaptor]);
43
+ return (_jsxs(_Fragment, { children: [_jsx("style", { children: modalStyles }), isOpen && (_jsx("div", { role: "dialog", className: "sb-modal-backdrop", onClick: handleBackdropClick })), _jsx("div", { className: isOpen ? "sb-modal-container" : undefined, children: children })] }));
44
+ }
45
+ //# sourceMappingURL=modal-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal-provider.js","sourceRoot":"","sources":["../../../src/web/components/modal-provider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,SAAS,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;CAiBnB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAA2B;IACjE,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;IAE5C,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAoB,CACnC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,SAAS,EAChD,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,WAAW,CACnD,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC;IAEhC,MAAM,mBAAmB,GAAG,CAAC,CAAmB,EAAE,EAAE;QAClD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;YACjC,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,CAAgB,EAAE,EAAE;YACnC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvB,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtB,OAAO,CACL,8BACE,0BAAQ,WAAW,GAAS,EAC3B,MAAM,IAAI,CAET,cACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mBAAmB,EAC7B,OAAO,EAAE,mBAAmB,GAC5B,CACH,EACD,cAAK,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,YACtD,QAAQ,GACL,IACL,CACJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { dequal } from "dequal/lite";
2
+ import { create } from "zustand";
3
+ import { getAdaptor } from "./bridges/index.js";
4
+ import { filterViewContext, getInitialState, injectViewContext, serializeState, } from "./helpers/state.js";
5
+ export function createStore(storeCreator, defaultState) {
6
+ const initialState = getInitialState(defaultState);
7
+ const store = create()((...args) => {
8
+ const baseStore = storeCreator(...args);
9
+ if (initialState !== null) {
10
+ return { ...baseStore, ...initialState };
11
+ }
12
+ return baseStore;
13
+ });
14
+ // Bidirectional sync between the Zustand store and the adaptor's viewState.
15
+ // Store changes persist to the host; external viewState changes rehydrate the store.
16
+ store.subscribe((state) => {
17
+ const serializedState = serializeState(state);
18
+ if (serializedState !== null && serializedState !== undefined) {
19
+ const stateToPersist = injectViewContext(serializedState);
20
+ if (stateToPersist !== null) {
21
+ getAdaptor().setViewState(stateToPersist);
22
+ }
23
+ }
24
+ });
25
+ const viewStateStore = getAdaptor().getHostContextStore("viewState");
26
+ viewStateStore.subscribe(() => {
27
+ const externalState = viewStateStore.getSnapshot();
28
+ if (externalState !== null) {
29
+ const filtered = filterViewContext(externalState);
30
+ const current = serializeState(store.getState());
31
+ if (!dequal(filtered, current)) {
32
+ store.setState(filtered);
33
+ }
34
+ }
35
+ });
36
+ return store;
37
+ }
38
+ //# sourceMappingURL=create-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-store.js","sourceRoot":"","sources":["../../src/web/create-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAG5B,MAAM,UAAU,WAAW,CACzB,YAAgD,EAChD,YAAoC;IAEpC,MAAM,YAAY,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,MAAM,EAAS,CAC3B,CAAC,GAAG,IAAoD,EAAE,EAAE;QAC1D,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;QAExC,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,EAAE,GAAG,SAAS,EAAE,GAAG,YAAY,EAAE,CAAC;QAC3C,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CACF,CAAC;IAEF,4EAA4E;IAC5E,qFAAqF;IACrF,KAAK,CAAC,SAAS,CAAC,CAAC,KAAY,EAAE,EAAE;QAC/B,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,eAAe,KAAK,IAAI,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAC9D,MAAM,cAAc,GAAG,iBAAiB,CAAC,eAAwB,CAAC,CAAC;YACnE,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;gBAC5B,UAAU,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACrE,cAAc,CAAC,SAAS,CAAC,GAAG,EAAE;QAC5B,MAAM,aAAa,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;QACnD,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,aAAa,CAAU,CAAC;YAC3D,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAU,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC/B,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,129 @@
1
+ import { cleanup } from "@testing-library/react";
2
+ import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
3
+ import { McpAppAdaptor } from "./bridges/mcp-app/adaptor.js";
4
+ import { McpAppBridge } from "./bridges/mcp-app/bridge.js";
5
+ import { createStore } from "./create-store.js";
6
+ import { VIEW_CONTEXT_KEY } from "./data-llm.js";
7
+ import { getMcpAppHostPostMessageMock, MockResizeObserver, } from "./hooks/test/utils.js";
8
+ describe("createStore", () => {
9
+ afterEach(() => {
10
+ vi.unstubAllGlobals();
11
+ vi.resetAllMocks();
12
+ });
13
+ describe("apps-sdk mode", () => {
14
+ let OpenaiMock;
15
+ beforeEach(() => {
16
+ OpenaiMock = {
17
+ widgetState: null,
18
+ setWidgetState: vi.fn().mockResolvedValue(undefined),
19
+ };
20
+ vi.stubGlobal("openai", OpenaiMock);
21
+ vi.stubGlobal("skybridge", { hostType: "apps-sdk" });
22
+ });
23
+ it("should create a store without default state", () => {
24
+ const storeCreator = () => ({
25
+ count: 0,
26
+ });
27
+ const store = createStore(storeCreator);
28
+ expect(store.getState()).toEqual({ count: 0 });
29
+ });
30
+ it("should create a store with default state", () => {
31
+ const storeCreator = () => ({
32
+ count: 0,
33
+ name: "initial",
34
+ });
35
+ const defaultState = { count: 5, name: "default" };
36
+ const store = createStore(storeCreator, defaultState);
37
+ expect(store.getState()).toEqual({ count: 5, name: "default" });
38
+ });
39
+ it("should initialize from window.openai.widgetState when available", () => {
40
+ const storeCreator = () => ({
41
+ count: 0,
42
+ name: "initial",
43
+ });
44
+ const windowState = { count: 20, name: "window" };
45
+ OpenaiMock.widgetState = { modelContent: windowState };
46
+ const store = createStore(storeCreator);
47
+ expect(store.getState()).toEqual({ count: 20, name: "window" });
48
+ });
49
+ it("should persist state changes to window.openai.setWidgetState", async () => {
50
+ const storeCreator = (set) => ({
51
+ count: 0,
52
+ increment: () => set((state) => ({ count: state.count + 1 })),
53
+ });
54
+ const store = createStore(storeCreator);
55
+ store.getState().increment();
56
+ await vi.waitFor(() => {
57
+ expect(OpenaiMock.setWidgetState).toHaveBeenCalled();
58
+ });
59
+ const callArgs = OpenaiMock.setWidgetState.mock.calls[0]?.[0];
60
+ expect(callArgs).toEqual({
61
+ modelContent: { count: 1 },
62
+ privateContent: {},
63
+ });
64
+ });
65
+ it("should filter view context from initial state", () => {
66
+ const storeCreator = () => ({
67
+ count: 0,
68
+ });
69
+ const windowState = {
70
+ count: 5,
71
+ [VIEW_CONTEXT_KEY]: "context-value",
72
+ };
73
+ OpenaiMock.widgetState = { modelContent: windowState };
74
+ const store = createStore(storeCreator);
75
+ expect(store.getState()).toEqual({ count: 5 });
76
+ expect(store.getState()[VIEW_CONTEXT_KEY]).toBeUndefined();
77
+ });
78
+ });
79
+ describe("mcp-app mode", () => {
80
+ beforeEach(() => {
81
+ vi.stubGlobal("skybridge", { hostType: "mcp-app" });
82
+ vi.stubGlobal("ResizeObserver", MockResizeObserver);
83
+ });
84
+ afterEach(async () => {
85
+ cleanup();
86
+ McpAppBridge.resetInstance();
87
+ McpAppAdaptor.resetInstance();
88
+ });
89
+ it("should initialize with null viewState", () => {
90
+ const adaptor = McpAppAdaptor.getInstance();
91
+ const viewState = adaptor.getHostContextStore("viewState").getSnapshot();
92
+ expect(viewState).toBeNull();
93
+ });
94
+ it("should create a store with default state when no persisted state exists", () => {
95
+ const storeCreator = () => ({
96
+ count: 0,
97
+ });
98
+ const store = createStore(storeCreator);
99
+ expect(store.getState()).toEqual({ count: 0 });
100
+ });
101
+ it("should update in-memory state via setViewState", async () => {
102
+ const adaptor = McpAppAdaptor.getInstance();
103
+ vi.spyOn(adaptor, "setViewState").mockResolvedValue(undefined);
104
+ const storeCreator = (set) => ({
105
+ count: 0,
106
+ increment: () => set((state) => ({ count: state.count + 1 })),
107
+ });
108
+ const store = createStore(storeCreator);
109
+ store.getState().increment();
110
+ await vi.waitFor(() => {
111
+ expect(adaptor.setViewState).toHaveBeenCalledWith({ count: 1 });
112
+ });
113
+ });
114
+ it("should notify listeners when view state changes", async () => {
115
+ const postMessageMock = getMcpAppHostPostMessageMock();
116
+ vi.stubGlobal("parent", { postMessage: postMessageMock });
117
+ const adaptor = McpAppAdaptor.getInstance();
118
+ const listener = vi.fn();
119
+ adaptor.getHostContextStore("viewState").subscribe(listener);
120
+ await adaptor.setViewState({ count: 42 });
121
+ expect(postMessageMock).toHaveBeenCalledWith(expect.objectContaining({ method: "ui/update-model-context" }), "*");
122
+ expect(listener).toHaveBeenCalled();
123
+ expect(adaptor.getHostContextStore("viewState").getSnapshot()).toEqual({
124
+ count: 42,
125
+ });
126
+ });
127
+ });
128
+ });
129
+ //# sourceMappingURL=create-store.test.js.map
@@ -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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"}
@@ -5,6 +5,7 @@ export interface DataLLMNode {
5
5
  parentId: string | null;
6
6
  content: string | null;
7
7
  }
8
+ export declare const VIEW_CONTEXT_KEY: "__view_context";
8
9
  interface DataLLMProps {
9
10
  content: DataLLMContent | null | undefined;
10
11
  children?: ReactNode;
@@ -1,5 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { createContext, useContext, useEffect, useId, } from "react";
3
+ import { getAdaptor } from "./bridges/index.js";
4
+ export const VIEW_CONTEXT_KEY = "__view_context";
3
5
  const nodes = new Map();
4
6
  function setNode(node) {
5
7
  nodes.set(node.id, node);
@@ -11,10 +13,11 @@ function removeNode(id) {
11
13
  }
12
14
  function onChange() {
13
15
  const description = getLLMDescriptionString();
14
- window.openai.setWidgetState({
15
- ...window.openai.widgetState,
16
- __widget_context: description,
17
- });
16
+ const adaptor = getAdaptor();
17
+ adaptor.setViewState((prevState) => ({
18
+ ...prevState,
19
+ [VIEW_CONTEXT_KEY]: description,
20
+ }));
18
21
  }
19
22
  const ParentIdContext = createContext(null);
20
23
  export function DataLLM({ content, children }) {
@@ -41,9 +44,10 @@ function getLLMDescriptionString() {
41
44
  const byParent = new Map();
42
45
  for (const node of Array.from(nodes.values())) {
43
46
  const key = node.parentId ?? null;
44
- if (!byParent.has(key))
47
+ if (!byParent.has(key)) {
45
48
  byParent.set(key, []);
46
- byParent.get(key).push(node);
49
+ }
50
+ byParent.get(key)?.push(node);
47
51
  }
48
52
  for (const list of byParent.values()) {
49
53
  list.sort((a, b) => a.id.localeCompare(b.id));
@@ -51,10 +55,11 @@ function getLLMDescriptionString() {
51
55
  const lines = [];
52
56
  function traverseTree(parentId, depth) {
53
57
  const children = byParent.get(parentId);
54
- if (!children)
58
+ if (!children) {
55
59
  return;
60
+ }
56
61
  for (const child of children) {
57
- if (child.content && child.content.trim()) {
62
+ if (child.content?.trim()) {
58
63
  const indent = " ".repeat(depth);
59
64
  lines.push(`${indent}- ${child.content.trim()}`);
60
65
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-llm.js","sourceRoot":"","sources":["../../src/web/data-llm.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
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 { McpAppAdaptor, McpAppBridge } from "./bridges/mcp-app/index.js";
5
+ import { DataLLM } from "./data-llm.js";
6
+ import { getMcpAppHostPostMessageMock, MockResizeObserver, } from "./hooks/test/utils.js";
7
+ describe("DataLLM", () => {
8
+ afterEach(() => {
9
+ // Clean up React components BEFORE unstubbing globals
10
+ cleanup();
11
+ vi.unstubAllGlobals();
12
+ vi.resetAllMocks();
13
+ });
14
+ describe("apps-sdk mode", () => {
15
+ let OpenaiMock;
16
+ beforeEach(() => {
17
+ OpenaiMock = {
18
+ widgetState: { modelContent: {} },
19
+ setWidgetState: vi.fn(),
20
+ };
21
+ // Use Object.defineProperty to ensure it persists
22
+ Object.defineProperty(globalThis, "openai", {
23
+ value: OpenaiMock,
24
+ writable: true,
25
+ configurable: true,
26
+ });
27
+ // Also set on window for browser-like environment
28
+ if (typeof window !== "undefined") {
29
+ Object.defineProperty(window, "openai", {
30
+ value: OpenaiMock,
31
+ writable: true,
32
+ configurable: true,
33
+ });
34
+ }
35
+ vi.stubGlobal("openai", OpenaiMock);
36
+ vi.stubGlobal("skybridge", { hostType: "apps-sdk" });
37
+ });
38
+ afterEach(() => {
39
+ // Keep the mock available for React cleanup, but reset it
40
+ if (typeof window !== "undefined" && window.openai) {
41
+ window.openai.setWidgetState = vi.fn();
42
+ window.openai.widgetState = { modelContent: {}, privateContent: {} };
43
+ }
44
+ });
45
+ it("should register a node with content and call setViewState", () => {
46
+ render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
47
+ expect(OpenaiMock.setWidgetState).toHaveBeenCalled();
48
+ const callArgs = OpenaiMock.setWidgetState.mock.calls[0]?.[0]?.modelContent;
49
+ expect(callArgs).toHaveProperty("__view_context");
50
+ expect(callArgs?.__view_context).toContain("- Test content");
51
+ });
52
+ it("should preserve existing viewState when updating context", () => {
53
+ OpenaiMock.widgetState = {
54
+ modelContent: { existingKey: "existingValue" },
55
+ };
56
+ render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
57
+ const callArgs = OpenaiMock.setWidgetState.mock.calls[0]?.[0]?.modelContent;
58
+ expect(callArgs).toHaveProperty("existingKey", "existingValue");
59
+ expect(callArgs).toHaveProperty("__view_context");
60
+ });
61
+ it("should handle deeply nested DataLLM components", () => {
62
+ 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
+ const callArgs = OpenaiMock.setWidgetState.mock.calls[OpenaiMock.setWidgetState.mock.calls.length - 1]?.[0]?.modelContent;
64
+ const context = callArgs?.__view_context;
65
+ expect(context).toContain("- Level 1");
66
+ expect(context).toContain(" - Level 2A");
67
+ expect(context).toContain(" - Level 2B");
68
+ expect(context).toContain(" - Level 3");
69
+ });
70
+ it("should update context when content changes", () => {
71
+ const { rerender } = render(_jsx(DataLLM, { content: "Initial content", children: _jsx("div", { children: "Child" }) }));
72
+ const initialCalls = OpenaiMock.setWidgetState.mock.calls.length;
73
+ rerender(_jsx(DataLLM, { content: "Updated content", children: _jsx("div", { children: "Child" }) }));
74
+ expect(OpenaiMock.setWidgetState.mock.calls.length).toBeGreaterThan(initialCalls);
75
+ const lastCallArgs = OpenaiMock.setWidgetState.mock.calls[OpenaiMock.setWidgetState.mock.calls.length - 1]?.[0]?.modelContent;
76
+ expect(lastCallArgs?.__view_context).toContain("- Updated content");
77
+ });
78
+ it("should remove node and update context when component unmounts", () => {
79
+ const { unmount } = render(_jsx(DataLLM, { content: "Content to remove", children: _jsx("div", { children: "Child" }) }));
80
+ const callsBeforeUnmount = OpenaiMock.setWidgetState.mock.calls.length;
81
+ unmount();
82
+ expect(OpenaiMock.setWidgetState.mock.calls.length).toBeGreaterThan(callsBeforeUnmount);
83
+ const lastCallArgs = OpenaiMock.setWidgetState.mock.calls[OpenaiMock.setWidgetState.mock.calls.length - 1]?.[0]?.modelContent;
84
+ expect(lastCallArgs?.__view_context).not.toContain("Content to remove");
85
+ });
86
+ });
87
+ describe("mcp-app mode", () => {
88
+ let postMessageMock;
89
+ beforeEach(() => {
90
+ vi.stubGlobal("skybridge", { hostType: "mcp-app" });
91
+ vi.stubGlobal("ResizeObserver", MockResizeObserver);
92
+ postMessageMock = getMcpAppHostPostMessageMock();
93
+ vi.stubGlobal("parent", { postMessage: postMessageMock });
94
+ });
95
+ afterEach(() => {
96
+ cleanup();
97
+ McpAppBridge.resetInstance();
98
+ McpAppAdaptor.resetInstance();
99
+ });
100
+ it("should register a node and update view state via adaptor", async () => {
101
+ const adaptor = McpAppAdaptor.getInstance();
102
+ render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
103
+ await vi.waitFor(() => {
104
+ const viewState = adaptor
105
+ .getHostContextStore("viewState")
106
+ .getSnapshot();
107
+ expect(viewState?.__view_context).toContain("- Test content");
108
+ });
109
+ });
110
+ it("should preserve existing view state when updating context", async () => {
111
+ const adaptor = McpAppAdaptor.getInstance();
112
+ await adaptor.setViewState({ existingKey: "existingValue" });
113
+ render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
114
+ await vi.waitFor(() => {
115
+ const viewState = adaptor
116
+ .getHostContextStore("viewState")
117
+ .getSnapshot();
118
+ expect(viewState?.existingKey).toBe("existingValue");
119
+ expect(viewState?.__view_context).toContain("- Test content");
120
+ });
121
+ });
122
+ it("should handle multiple DataLLM components sharing state through adaptor", async () => {
123
+ const adaptor = McpAppAdaptor.getInstance();
124
+ 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
+ await vi.waitFor(() => {
126
+ const viewState = adaptor
127
+ .getHostContextStore("viewState")
128
+ .getSnapshot();
129
+ const context = viewState?.__view_context;
130
+ expect(context).toContain("- First component");
131
+ expect(context).toContain("- Second component");
132
+ });
133
+ });
134
+ it("should call ui/update-model-context when view state changes", async () => {
135
+ render(_jsx(DataLLM, { content: "Test content", children: _jsx("div", { children: "Child" }) }));
136
+ await vi.waitFor(() => {
137
+ expect(postMessageMock).toHaveBeenCalledWith(expect.objectContaining({ method: "ui/update-model-context" }), "*");
138
+ });
139
+ });
140
+ });
141
+ });
142
+ //# 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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"}
@@ -1,7 +1,8 @@
1
- import { type CallToolState, type CallToolFn, type CallToolAsyncFn } from "./hooks/use-call-tool.js";
1
+ import type { InferTools, ToolInput, ToolOutput, ToolResponseMetadata } from "../server/index.js";
2
+ import type { CallToolResponse } from "./bridges/types.js";
3
+ import { type CallToolAsyncFn, type CallToolFn, type CallToolState } from "./hooks/use-call-tool.js";
2
4
  import { type ToolState } from "./hooks/use-tool-info.js";
3
- import type { InferTools, ToolInput, ToolOutput } from "../server/index.js";
4
- import type { CallToolResponse, Prettify, Objectify } from "./types.js";
5
+ import type { Objectify, Prettify } from "./types.js";
5
6
  type TypedCallToolResponse<TOutput> = CallToolResponse & {
6
7
  structuredContent: TOutput;
7
8
  };
@@ -9,12 +10,12 @@ type TypedCallToolReturn<TInput, TOutput> = Prettify<CallToolState<TypedCallTool
9
10
  callTool: CallToolFn<TInput, TypedCallToolResponse<TOutput>>;
10
11
  callToolAsync: CallToolAsyncFn<TInput, TypedCallToolResponse<TOutput>>;
11
12
  }>;
12
- type TypedToolInfoReturn<TInput, TOutput> = ToolState<Objectify<TInput>, Objectify<TOutput>, Objectify<{}>>;
13
+ type TypedToolInfoReturn<TInput, TOutput, TResponseMetadata> = ToolState<Objectify<TInput>, Objectify<TOutput>, Objectify<TResponseMetadata>>;
13
14
  /**
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
21
  * @typeParam ServerType - The type of your McpServer instance (use `typeof server`).
@@ -23,11 +24,13 @@ type TypedToolInfoReturn<TInput, TOutput> = ToolState<Objectify<TInput>, Objecti
23
24
  *
24
25
  * @example
25
26
  * ```typescript
26
- * // server/src/index.ts
27
+ * // src/server.ts
27
28
  * const server = new McpServer({ name: "my-app", version: "1.0" }, {})
28
- * .widget("search-voyage", {}, {
29
+ * .registerTool({
30
+ * name: "search-trip",
29
31
  * inputSchema: { destination: z.string() },
30
32
  * outputSchema: { results: z.array(z.string()) },
33
+ * view: { component: "search-trip", description: "Search trips" },
31
34
  * }, async ({ destination }) => {
32
35
  * return { content: [{ type: "text", text: `Found trips to ${destination}` }] };
33
36
  * });
@@ -37,8 +40,8 @@ type TypedToolInfoReturn<TInput, TOutput> = ToolState<Objectify<TInput>, Objecti
37
40
  *
38
41
  * @example
39
42
  * ```typescript
40
- * // web/src/skybridge.ts (one-time setup)
41
- * import type { AppType } from "../server";
43
+ * // src/helpers.ts (one-time setup)
44
+ * import type { AppType } from "./server";
42
45
  * import { generateHelpers } from "skybridge/web";
43
46
  *
44
47
  * export const { useCallTool, useToolInfo } = generateHelpers<AppType>();
@@ -46,19 +49,19 @@ type TypedToolInfoReturn<TInput, TOutput> = ToolState<Objectify<TInput>, Objecti
46
49
  *
47
50
  * @example
48
51
  * ```typescript
49
- * // web/src/widgets/search.tsx (usage)
50
- * import { useCallTool, useToolInfo } from "../skybridge";
52
+ * // src/views/search.tsx (usage)
53
+ * import { useCallTool, useToolInfo } from "../helpers";
51
54
  *
52
- * export function SearchWidget() {
53
- * const { callTool, data } = useCallTool("search-voyage");
55
+ * export function SearchView() {
56
+ * const { callTool, data } = useCallTool("search-trip");
54
57
  * // ^ autocomplete for tool names
55
58
  * callTool({ destination: "Spain" });
56
59
  * // ^ autocomplete for input fields
57
60
  *
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
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
62
65
  * }
63
66
  * ```
64
67
  */
@@ -67,12 +70,12 @@ export declare function generateHelpers<ServerType = never>(): {
67
70
  * Typed version of `useCallTool` that provides autocomplete for tool names
68
71
  * and type inference for inputs and outputs.
69
72
  *
70
- * @param name - The name of the widget to call. Autocompletes based on your server's widget registry.
73
+ * @param name - The name of the tool to call. Autocompletes based on your server's tool registry.
71
74
  * @returns A hook with typed `callTool` function and `data` property.
72
75
  *
73
76
  * @example
74
77
  * ```typescript
75
- * const { callTool, data, isPending } = useCallTool("search-voyage");
78
+ * const { callTool, data, isPending } = useCallTool("search-trip");
76
79
  * // TypeScript knows callTool expects { destination: string }
77
80
  * callTool({ destination: "Spain" });
78
81
  *
@@ -84,30 +87,32 @@ export declare function generateHelpers<ServerType = never>(): {
84
87
  */
85
88
  useCallTool: <ToolName extends keyof InferTools<ServerType> & string>(name: ToolName) => TypedCallToolReturn<ToolInput<ServerType, ToolName>, ToolOutput<ServerType, ToolName>>;
86
89
  /**
87
- * Typed version of `useToolInfo` that provides autocomplete for widget names
90
+ * Typed version of `useToolInfo` that provides autocomplete for tool names
88
91
  * and type inference for inputs, outputs, and responseMetadata.
89
92
  *
90
- * @typeParam K - The name of the widget. Autocompletes based on your server's widget registry.
93
+ * @typeParam K - The name of the tool. Autocompletes based on your server's tool registry.
91
94
  * @returns A discriminated union with `status: "pending" | "success"` that narrows correctly.
92
95
  *
93
96
  * @example
94
97
  * ```typescript
95
- * const toolInfo = useToolInfo<"search-voyage">();
98
+ * const toolInfo = useToolInfo<"search-trip">();
96
99
  * // toolInfo.input is typed as { destination: string; ... }
97
100
  * // toolInfo.output is typed as { results: Array<...>; ... }
101
+ * // toolInfo.responseMetadata is typed based on _meta in callback return
98
102
  * // toolInfo.status narrows correctly: "pending" | "success"
99
103
  *
100
104
  * if (toolInfo.isPending) {
101
- * // TypeScript knows output is undefined here
105
+ * // TypeScript knows output and responseMetadata are undefined here
102
106
  * console.log(toolInfo.input.destination);
103
107
  * }
104
108
  *
105
109
  * if (toolInfo.isSuccess) {
106
- * // TypeScript knows output is defined here
110
+ * // TypeScript knows output and responseMetadata are defined here
107
111
  * console.log(toolInfo.output.results);
112
+ * console.log(toolInfo.responseMetadata);
108
113
  * }
109
114
  * ```
110
115
  */
111
- useToolInfo: <ToolName extends keyof InferTools<ServerType> & string>() => TypedToolInfoReturn<ToolInput<ServerType, ToolName>, ToolOutput<ServerType, ToolName>>;
116
+ useToolInfo: <ToolName extends keyof InferTools<ServerType> & string>() => TypedToolInfoReturn<ToolInput<ServerType, ToolName>, ToolOutput<ServerType, ToolName>, ToolResponseMetadata<ServerType, ToolName>>;
112
117
  };
113
118
  export {};