skybridge 0.0.0-dev.fc2b7e8 → 0.0.0-dev.fc2b815

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 (461) hide show
  1. package/README.md +152 -0
  2. package/bin/run.js +5 -0
  3. package/dist/cli/detect-port.d.ts +18 -0
  4. package/dist/cli/detect-port.js +61 -0
  5. package/dist/cli/detect-port.js.map +1 -0
  6. package/dist/cli/header.d.ts +4 -0
  7. package/dist/cli/header.js +6 -0
  8. package/dist/cli/header.js.map +1 -0
  9. package/dist/cli/run-command.d.ts +2 -0
  10. package/dist/cli/run-command.js +43 -0
  11. package/dist/cli/run-command.js.map +1 -0
  12. package/dist/cli/telemetry.d.ts +7 -0
  13. package/dist/cli/telemetry.js +123 -0
  14. package/dist/cli/telemetry.js.map +1 -0
  15. package/dist/cli/tunnel-control-server.d.ts +9 -0
  16. package/dist/cli/tunnel-control-server.js +31 -0
  17. package/dist/cli/tunnel-control-server.js.map +1 -0
  18. package/dist/cli/tunnel-control-server.test.js +39 -0
  19. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  20. package/dist/cli/tunnel-handler.d.ts +3 -0
  21. package/dist/cli/tunnel-handler.js +48 -0
  22. package/dist/cli/tunnel-handler.js.map +1 -0
  23. package/dist/cli/tunnel-handler.test.js +105 -0
  24. package/dist/cli/tunnel-handler.test.js.map +1 -0
  25. package/dist/cli/tunnel.d.ts +57 -0
  26. package/dist/cli/tunnel.js +154 -0
  27. package/dist/cli/tunnel.js.map +1 -0
  28. package/dist/cli/tunnel.test.js +190 -0
  29. package/dist/cli/tunnel.test.js.map +1 -0
  30. package/dist/cli/types.d.ts +5 -0
  31. package/dist/cli/types.js +2 -0
  32. package/dist/cli/types.js.map +1 -0
  33. package/dist/cli/use-execute-steps.d.ts +11 -0
  34. package/dist/cli/use-execute-steps.js +36 -0
  35. package/dist/cli/use-execute-steps.js.map +1 -0
  36. package/dist/cli/use-messages.d.ts +3 -0
  37. package/dist/cli/use-messages.js +11 -0
  38. package/dist/cli/use-messages.js.map +1 -0
  39. package/dist/cli/use-nodemon.d.ts +2 -0
  40. package/dist/cli/use-nodemon.js +73 -0
  41. package/dist/cli/use-nodemon.js.map +1 -0
  42. package/dist/cli/use-open-browser.d.ts +1 -0
  43. package/dist/cli/use-open-browser.js +44 -0
  44. package/dist/cli/use-open-browser.js.map +1 -0
  45. package/dist/cli/use-tunnel.d.ts +14 -0
  46. package/dist/cli/use-tunnel.js +131 -0
  47. package/dist/cli/use-tunnel.js.map +1 -0
  48. package/dist/cli/use-typescript-check.d.ts +9 -0
  49. package/dist/cli/use-typescript-check.js +94 -0
  50. package/dist/cli/use-typescript-check.js.map +1 -0
  51. package/dist/commands/build.d.ts +9 -0
  52. package/dist/commands/build.js +102 -0
  53. package/dist/commands/build.js.map +1 -0
  54. package/dist/commands/create.d.ts +9 -0
  55. package/dist/commands/create.js +30 -0
  56. package/dist/commands/create.js.map +1 -0
  57. package/dist/commands/dev.d.ts +12 -0
  58. package/dist/commands/dev.js +80 -0
  59. package/dist/commands/dev.js.map +1 -0
  60. package/dist/commands/start.d.ts +9 -0
  61. package/dist/commands/start.js +49 -0
  62. package/dist/commands/start.js.map +1 -0
  63. package/dist/commands/telemetry/disable.d.ts +5 -0
  64. package/dist/commands/telemetry/disable.js +14 -0
  65. package/dist/commands/telemetry/disable.js.map +1 -0
  66. package/dist/commands/telemetry/enable.d.ts +5 -0
  67. package/dist/commands/telemetry/enable.js +14 -0
  68. package/dist/commands/telemetry/enable.js.map +1 -0
  69. package/dist/commands/telemetry/status.d.ts +5 -0
  70. package/dist/commands/telemetry/status.js +14 -0
  71. package/dist/commands/telemetry/status.js.map +1 -0
  72. package/dist/server/asset-base-url-transform-plugin.d.ts +11 -0
  73. package/dist/server/asset-base-url-transform-plugin.js +48 -0
  74. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  75. package/dist/server/asset-base-url-transform-plugin.test.js +134 -0
  76. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  77. package/dist/server/auth.d.ts +20 -0
  78. package/dist/server/auth.js +28 -0
  79. package/dist/server/auth.js.map +1 -0
  80. package/dist/server/content-helpers.d.ts +67 -0
  81. package/dist/server/content-helpers.js +79 -0
  82. package/dist/server/content-helpers.js.map +1 -0
  83. package/dist/server/content-helpers.test.js +70 -0
  84. package/dist/server/content-helpers.test.js.map +1 -0
  85. package/dist/server/express.d.ts +11 -0
  86. package/dist/server/express.js +101 -0
  87. package/dist/server/express.js.map +1 -0
  88. package/dist/server/express.test.js +430 -0
  89. package/dist/server/express.test.js.map +1 -0
  90. package/dist/server/file-ref.d.ts +28 -0
  91. package/dist/server/file-ref.js +27 -0
  92. package/dist/server/file-ref.js.map +1 -0
  93. package/dist/server/index.d.ts +8 -0
  94. package/dist/server/index.js +6 -0
  95. package/dist/server/index.js.map +1 -0
  96. package/dist/{src/server → server}/inferUtilityTypes.d.ts +6 -6
  97. package/dist/server/inferUtilityTypes.js.map +1 -0
  98. package/dist/server/metric.d.ts +14 -0
  99. package/dist/server/metric.js +62 -0
  100. package/dist/server/metric.js.map +1 -0
  101. package/dist/server/middleware.d.ts +137 -0
  102. package/dist/server/middleware.js +93 -0
  103. package/dist/server/middleware.js.map +1 -0
  104. package/dist/server/middleware.test-d.js +75 -0
  105. package/dist/server/middleware.test-d.js.map +1 -0
  106. package/dist/server/middleware.test.js +493 -0
  107. package/dist/server/middleware.test.js.map +1 -0
  108. package/dist/server/server.d.ts +398 -0
  109. package/dist/server/server.js +561 -0
  110. package/dist/server/server.js.map +1 -0
  111. package/dist/{src/server → server}/templateHelper.d.ts +5 -4
  112. package/dist/server/templateHelper.js +11 -0
  113. package/dist/server/templateHelper.js.map +1 -0
  114. package/dist/server/templates.generated.d.ts +4 -0
  115. package/dist/server/templates.generated.js +47 -0
  116. package/dist/server/templates.generated.js.map +1 -0
  117. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  118. package/dist/server/tunnel-proxy-router.js +110 -0
  119. package/dist/server/tunnel-proxy-router.js.map +1 -0
  120. package/dist/server/tunnel-proxy-router.test.js +229 -0
  121. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  122. package/dist/server/viewsDevServer.d.ts +14 -0
  123. package/dist/server/viewsDevServer.js +45 -0
  124. package/dist/server/viewsDevServer.js.map +1 -0
  125. package/dist/{src/test → test}/utils.d.ts +23 -20
  126. package/dist/{src/test → test}/utils.js +60 -35
  127. package/dist/test/utils.js.map +1 -0
  128. package/dist/test/view.test.js +568 -0
  129. package/dist/test/view.test.js.map +1 -0
  130. package/dist/version.d.ts +1 -0
  131. package/dist/version.js +3 -0
  132. package/dist/version.js.map +1 -0
  133. package/dist/web/bridges/apps-sdk/adaptor.d.ts +28 -0
  134. package/dist/web/bridges/apps-sdk/adaptor.js +113 -0
  135. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -0
  136. package/dist/web/bridges/apps-sdk/bridge.d.ts +11 -0
  137. package/dist/web/bridges/apps-sdk/bridge.js +47 -0
  138. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
  139. package/dist/web/bridges/apps-sdk/index.d.ts +5 -0
  140. package/dist/web/bridges/apps-sdk/index.js +5 -0
  141. package/dist/web/bridges/apps-sdk/index.js.map +1 -0
  142. package/dist/web/bridges/apps-sdk/types.d.ts +133 -0
  143. package/dist/{src/web → web/bridges/apps-sdk}/types.js +0 -1
  144. package/dist/web/bridges/apps-sdk/types.js.map +1 -0
  145. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +13 -0
  146. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +18 -0
  147. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
  148. package/dist/web/bridges/get-adaptor.d.ts +9 -0
  149. package/dist/web/bridges/get-adaptor.js +15 -0
  150. package/dist/web/bridges/get-adaptor.js.map +1 -0
  151. package/dist/web/bridges/index.d.ts +5 -0
  152. package/dist/web/bridges/index.js +6 -0
  153. package/dist/web/bridges/index.js.map +1 -0
  154. package/dist/web/bridges/mcp-app/adaptor.d.ts +52 -0
  155. package/dist/web/bridges/mcp-app/adaptor.js +280 -0
  156. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -0
  157. package/dist/web/bridges/mcp-app/bridge.d.ts +27 -0
  158. package/dist/web/bridges/mcp-app/bridge.js +103 -0
  159. package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
  160. package/dist/web/bridges/mcp-app/index.d.ts +4 -0
  161. package/dist/web/bridges/mcp-app/index.js +4 -0
  162. package/dist/web/bridges/mcp-app/index.js.map +1 -0
  163. package/dist/web/bridges/mcp-app/types.d.ts +8 -0
  164. package/dist/web/bridges/mcp-app/types.js +2 -0
  165. package/dist/web/bridges/mcp-app/types.js.map +1 -0
  166. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +19 -0
  167. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +19 -0
  168. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
  169. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +26 -0
  170. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
  171. package/dist/web/bridges/types.d.ts +171 -0
  172. package/dist/web/bridges/types.js +2 -0
  173. package/dist/web/bridges/types.js.map +1 -0
  174. package/dist/web/bridges/use-host-context.d.ts +7 -0
  175. package/dist/web/bridges/use-host-context.js +13 -0
  176. package/dist/web/bridges/use-host-context.js.map +1 -0
  177. package/dist/web/components/modal-provider.d.ts +4 -0
  178. package/dist/web/components/modal-provider.js +45 -0
  179. package/dist/web/components/modal-provider.js.map +1 -0
  180. package/dist/web/create-store.d.ts +29 -0
  181. package/dist/web/create-store.js +64 -0
  182. package/dist/web/create-store.js.map +1 -0
  183. package/dist/web/create-store.test.js +129 -0
  184. package/dist/web/create-store.test.js.map +1 -0
  185. package/dist/web/data-llm.d.ts +47 -0
  186. package/dist/{src/web → web}/data-llm.js +39 -7
  187. package/dist/web/data-llm.js.map +1 -0
  188. package/dist/web/data-llm.test.js +142 -0
  189. package/dist/web/data-llm.test.js.map +1 -0
  190. package/dist/{src/web → web}/generate-helpers.d.ts +24 -19
  191. package/dist/{src/web → web}/generate-helpers.js +22 -18
  192. package/dist/web/generate-helpers.js.map +1 -0
  193. package/dist/{src/web → web}/generate-helpers.test-d.js +56 -27
  194. package/dist/web/generate-helpers.test-d.js.map +1 -0
  195. package/dist/web/generate-helpers.test.js.map +1 -0
  196. package/dist/{src/web → web}/helpers/state.d.ts +2 -2
  197. package/dist/web/helpers/state.js +45 -0
  198. package/dist/web/helpers/state.js.map +1 -0
  199. package/dist/{src/web → web}/helpers/state.test.js +9 -9
  200. package/dist/web/helpers/state.test.js.map +1 -0
  201. package/dist/web/hooks/index.d.ts +14 -0
  202. package/dist/web/hooks/index.js +15 -0
  203. package/dist/web/hooks/index.js.map +1 -0
  204. package/dist/web/hooks/test/utils.d.ts +20 -0
  205. package/dist/web/hooks/test/utils.js +75 -0
  206. package/dist/web/hooks/test/utils.js.map +1 -0
  207. package/dist/{src/web → web}/hooks/use-call-tool.d.ts +47 -1
  208. package/dist/web/hooks/use-call-tool.js +96 -0
  209. package/dist/web/hooks/use-call-tool.js.map +1 -0
  210. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -0
  211. package/dist/{src/web → web}/hooks/use-call-tool.test.js +50 -4
  212. package/dist/web/hooks/use-call-tool.test.js.map +1 -0
  213. package/dist/web/hooks/use-display-mode.d.ts +24 -0
  214. package/dist/web/hooks/use-display-mode.js +29 -0
  215. package/dist/web/hooks/use-display-mode.js.map +1 -0
  216. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  217. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  218. package/dist/{src/web → web}/hooks/use-display-mode.test.js +1 -0
  219. package/dist/web/hooks/use-display-mode.test.js.map +1 -0
  220. package/dist/web/hooks/use-download.d.ts +5 -0
  221. package/dist/web/hooks/use-download.js +8 -0
  222. package/dist/web/hooks/use-download.js.map +1 -0
  223. package/dist/web/hooks/use-download.test.d.ts +1 -0
  224. package/dist/web/hooks/use-download.test.js +95 -0
  225. package/dist/web/hooks/use-download.test.js.map +1 -0
  226. package/dist/web/hooks/use-files.d.ts +39 -0
  227. package/dist/web/hooks/use-files.js +42 -0
  228. package/dist/web/hooks/use-files.js.map +1 -0
  229. package/dist/web/hooks/use-files.test.d.ts +1 -0
  230. package/dist/web/hooks/use-files.test.js +54 -0
  231. package/dist/web/hooks/use-files.test.js.map +1 -0
  232. package/dist/web/hooks/use-layout.d.ts +24 -0
  233. package/dist/web/hooks/use-layout.js +25 -0
  234. package/dist/web/hooks/use-layout.js.map +1 -0
  235. package/dist/web/hooks/use-layout.test.d.ts +1 -0
  236. package/dist/web/hooks/use-layout.test.js +96 -0
  237. package/dist/web/hooks/use-layout.test.js.map +1 -0
  238. package/dist/web/hooks/use-open-external.d.ts +20 -0
  239. package/dist/web/hooks/use-open-external.js +24 -0
  240. package/dist/web/hooks/use-open-external.js.map +1 -0
  241. package/dist/web/hooks/use-open-external.test.d.ts +1 -0
  242. package/dist/web/hooks/use-open-external.test.js +65 -0
  243. package/dist/web/hooks/use-open-external.test.js.map +1 -0
  244. package/dist/web/hooks/use-request-close.d.ts +16 -0
  245. package/dist/web/hooks/use-request-close.js +21 -0
  246. package/dist/web/hooks/use-request-close.js.map +1 -0
  247. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  248. package/dist/web/hooks/use-request-close.test.js +52 -0
  249. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  250. package/dist/web/hooks/use-request-modal.d.ts +24 -0
  251. package/dist/web/hooks/use-request-modal.js +31 -0
  252. package/dist/web/hooks/use-request-modal.js.map +1 -0
  253. package/dist/web/hooks/use-request-modal.test.d.ts +1 -0
  254. package/dist/web/hooks/use-request-modal.test.js +61 -0
  255. package/dist/web/hooks/use-request-modal.test.js.map +1 -0
  256. package/dist/web/hooks/use-request-size.d.ts +20 -0
  257. package/dist/web/hooks/use-request-size.js +24 -0
  258. package/dist/web/hooks/use-request-size.js.map +1 -0
  259. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  260. package/dist/web/hooks/use-request-size.test.js +65 -0
  261. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  262. package/dist/web/hooks/use-send-follow-up-message.d.ts +19 -0
  263. package/dist/web/hooks/use-send-follow-up-message.js +25 -0
  264. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
  265. package/dist/web/hooks/use-set-open-in-app-url.d.ts +18 -0
  266. package/dist/web/hooks/use-set-open-in-app-url.js +25 -0
  267. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  268. package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
  269. package/dist/web/hooks/use-set-open-in-app-url.test.js +43 -0
  270. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  271. package/dist/web/hooks/use-tool-info.d.ts +69 -0
  272. package/dist/web/hooks/use-tool-info.js +52 -0
  273. package/dist/web/hooks/use-tool-info.js.map +1 -0
  274. package/dist/web/hooks/use-tool-info.test-d.d.ts +1 -0
  275. package/dist/{src/web → web}/hooks/use-tool-info.test-d.js +40 -4
  276. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
  277. package/dist/web/hooks/use-tool-info.test.d.ts +1 -0
  278. package/dist/web/hooks/use-tool-info.test.js +130 -0
  279. package/dist/web/hooks/use-tool-info.test.js.map +1 -0
  280. package/dist/web/hooks/use-user.d.ts +20 -0
  281. package/dist/web/hooks/use-user.js +37 -0
  282. package/dist/web/hooks/use-user.js.map +1 -0
  283. package/dist/web/hooks/use-user.test.d.ts +1 -0
  284. package/dist/web/hooks/use-user.test.js +122 -0
  285. package/dist/web/hooks/use-user.test.js.map +1 -0
  286. package/dist/web/hooks/use-view-state.d.ts +25 -0
  287. package/dist/web/hooks/use-view-state.js +32 -0
  288. package/dist/web/hooks/use-view-state.js.map +1 -0
  289. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  290. package/dist/web/hooks/use-view-state.test.js +177 -0
  291. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  292. package/dist/{src/web → web}/index.d.ts +2 -2
  293. package/dist/{src/web → web}/index.js +2 -2
  294. package/dist/web/index.js.map +1 -0
  295. package/dist/web/mount-view.d.ts +20 -0
  296. package/dist/web/mount-view.js +46 -0
  297. package/dist/web/mount-view.js.map +1 -0
  298. package/dist/web/plugin/data-llm.test.d.ts +1 -0
  299. package/dist/web/plugin/data-llm.test.js.map +1 -0
  300. package/dist/web/plugin/plugin.d.ts +33 -0
  301. package/dist/web/plugin/plugin.js +189 -0
  302. package/dist/web/plugin/plugin.js.map +1 -0
  303. package/dist/web/plugin/scan-views.d.ts +16 -0
  304. package/dist/web/plugin/scan-views.js +88 -0
  305. package/dist/web/plugin/scan-views.js.map +1 -0
  306. package/dist/web/plugin/scan-views.test.d.ts +1 -0
  307. package/dist/web/plugin/scan-views.test.js +99 -0
  308. package/dist/web/plugin/scan-views.test.js.map +1 -0
  309. package/dist/{src/web → web}/plugin/transform-data-llm.js +7 -4
  310. package/dist/web/plugin/transform-data-llm.js.map +1 -0
  311. package/dist/web/plugin/transform-data-llm.test.d.ts +1 -0
  312. package/dist/web/plugin/transform-data-llm.test.js.map +1 -0
  313. package/dist/web/plugin/validate-view.d.ts +1 -0
  314. package/dist/web/plugin/validate-view.js +9 -0
  315. package/dist/web/plugin/validate-view.js.map +1 -0
  316. package/dist/web/plugin/validate-view.test.d.ts +1 -0
  317. package/dist/web/plugin/validate-view.test.js +24 -0
  318. package/dist/web/plugin/validate-view.test.js.map +1 -0
  319. package/dist/{src/web → web}/proxy.js +5 -1
  320. package/dist/web/proxy.js.map +1 -0
  321. package/dist/web/types.d.ts +20 -0
  322. package/dist/web/types.js +2 -0
  323. package/dist/web/types.js.map +1 -0
  324. package/package.json +78 -33
  325. package/tsconfig.base.json +33 -0
  326. package/dist/src/server/devtoolsStaticServer.d.ts +0 -15
  327. package/dist/src/server/devtoolsStaticServer.js +0 -43
  328. package/dist/src/server/devtoolsStaticServer.js.map +0 -1
  329. package/dist/src/server/index.d.ts +0 -5
  330. package/dist/src/server/index.js +0 -4
  331. package/dist/src/server/index.js.map +0 -1
  332. package/dist/src/server/inferUtilityTypes.js.map +0 -1
  333. package/dist/src/server/server.d.ts +0 -62
  334. package/dist/src/server/server.js +0 -62
  335. package/dist/src/server/server.js.map +0 -1
  336. package/dist/src/server/templateHelper.js +0 -30
  337. package/dist/src/server/templateHelper.js.map +0 -1
  338. package/dist/src/server/templates/development.hbs +0 -12
  339. package/dist/src/server/templates/production.hbs +0 -6
  340. package/dist/src/server/widgetsDevServer.d.ts +0 -12
  341. package/dist/src/server/widgetsDevServer.js +0 -39
  342. package/dist/src/server/widgetsDevServer.js.map +0 -1
  343. package/dist/src/test/utils.js.map +0 -1
  344. package/dist/src/test/widget.test.js +0 -95
  345. package/dist/src/test/widget.test.js.map +0 -1
  346. package/dist/src/web/create-store.d.ts +0 -3
  347. package/dist/src/web/create-store.js +0 -25
  348. package/dist/src/web/create-store.js.map +0 -1
  349. package/dist/src/web/create-store.test.js +0 -70
  350. package/dist/src/web/create-store.test.js.map +0 -1
  351. package/dist/src/web/data-llm.d.ts +0 -14
  352. package/dist/src/web/data-llm.js.map +0 -1
  353. package/dist/src/web/data-llm.test.js +0 -76
  354. package/dist/src/web/data-llm.test.js.map +0 -1
  355. package/dist/src/web/generate-helpers.js.map +0 -1
  356. package/dist/src/web/generate-helpers.test-d.js.map +0 -1
  357. package/dist/src/web/generate-helpers.test.js.map +0 -1
  358. package/dist/src/web/helpers/state.js +0 -40
  359. package/dist/src/web/helpers/state.js.map +0 -1
  360. package/dist/src/web/helpers/state.test.js.map +0 -1
  361. package/dist/src/web/hooks/index.d.ts +0 -12
  362. package/dist/src/web/hooks/index.js +0 -13
  363. package/dist/src/web/hooks/index.js.map +0 -1
  364. package/dist/src/web/hooks/use-call-tool.js +0 -60
  365. package/dist/src/web/hooks/use-call-tool.js.map +0 -1
  366. package/dist/src/web/hooks/use-call-tool.test-d.js.map +0 -1
  367. package/dist/src/web/hooks/use-call-tool.test.js.map +0 -1
  368. package/dist/src/web/hooks/use-display-mode.d.ts +0 -4
  369. package/dist/src/web/hooks/use-display-mode.js +0 -7
  370. package/dist/src/web/hooks/use-display-mode.js.map +0 -1
  371. package/dist/src/web/hooks/use-display-mode.test.js.map +0 -1
  372. package/dist/src/web/hooks/use-files.d.ts +0 -10
  373. package/dist/src/web/hooks/use-files.js +0 -7
  374. package/dist/src/web/hooks/use-files.js.map +0 -1
  375. package/dist/src/web/hooks/use-files.test.js +0 -29
  376. package/dist/src/web/hooks/use-files.test.js.map +0 -1
  377. package/dist/src/web/hooks/use-locale.d.ts +0 -1
  378. package/dist/src/web/hooks/use-locale.js +0 -5
  379. package/dist/src/web/hooks/use-locale.js.map +0 -1
  380. package/dist/src/web/hooks/use-locale.test.js +0 -21
  381. package/dist/src/web/hooks/use-locale.test.js.map +0 -1
  382. package/dist/src/web/hooks/use-open-external.d.ts +0 -1
  383. package/dist/src/web/hooks/use-open-external.js +0 -6
  384. package/dist/src/web/hooks/use-open-external.js.map +0 -1
  385. package/dist/src/web/hooks/use-open-external.test.js +0 -24
  386. package/dist/src/web/hooks/use-open-external.test.js.map +0 -1
  387. package/dist/src/web/hooks/use-openai-global.d.ts +0 -2
  388. package/dist/src/web/hooks/use-openai-global.js +0 -25
  389. package/dist/src/web/hooks/use-openai-global.js.map +0 -1
  390. package/dist/src/web/hooks/use-request-modal.d.ts +0 -6
  391. package/dist/src/web/hooks/use-request-modal.js +0 -9
  392. package/dist/src/web/hooks/use-request-modal.js.map +0 -1
  393. package/dist/src/web/hooks/use-request-modal.test.js +0 -24
  394. package/dist/src/web/hooks/use-request-modal.test.js.map +0 -1
  395. package/dist/src/web/hooks/use-send-follow-up-message.d.ts +0 -1
  396. package/dist/src/web/hooks/use-send-follow-up-message.js +0 -11
  397. package/dist/src/web/hooks/use-send-follow-up-message.js.map +0 -1
  398. package/dist/src/web/hooks/use-theme.d.ts +0 -1
  399. package/dist/src/web/hooks/use-theme.js +0 -5
  400. package/dist/src/web/hooks/use-theme.js.map +0 -1
  401. package/dist/src/web/hooks/use-theme.test.js +0 -26
  402. package/dist/src/web/hooks/use-theme.test.js.map +0 -1
  403. package/dist/src/web/hooks/use-tool-info.d.ts +0 -25
  404. package/dist/src/web/hooks/use-tool-info.js +0 -20
  405. package/dist/src/web/hooks/use-tool-info.js.map +0 -1
  406. package/dist/src/web/hooks/use-tool-info.test-d.js.map +0 -1
  407. package/dist/src/web/hooks/use-tool-info.test.js +0 -59
  408. package/dist/src/web/hooks/use-tool-info.test.js.map +0 -1
  409. package/dist/src/web/hooks/use-user-agent.d.ts +0 -1
  410. package/dist/src/web/hooks/use-user-agent.js +0 -5
  411. package/dist/src/web/hooks/use-user-agent.js.map +0 -1
  412. package/dist/src/web/hooks/use-user-agent.test.js +0 -31
  413. package/dist/src/web/hooks/use-user-agent.test.js.map +0 -1
  414. package/dist/src/web/hooks/use-widget-state.d.ts +0 -4
  415. package/dist/src/web/hooks/use-widget-state.js +0 -32
  416. package/dist/src/web/hooks/use-widget-state.js.map +0 -1
  417. package/dist/src/web/hooks/use-widget-state.test.js +0 -60
  418. package/dist/src/web/hooks/use-widget-state.test.js.map +0 -1
  419. package/dist/src/web/index.js.map +0 -1
  420. package/dist/src/web/mount-widget.d.ts +0 -1
  421. package/dist/src/web/mount-widget.js +0 -19
  422. package/dist/src/web/mount-widget.js.map +0 -1
  423. package/dist/src/web/plugin/data-llm.test.js.map +0 -1
  424. package/dist/src/web/plugin/plugin.d.ts +0 -2
  425. package/dist/src/web/plugin/plugin.js +0 -33
  426. package/dist/src/web/plugin/plugin.js.map +0 -1
  427. package/dist/src/web/plugin/transform-data-llm.js.map +0 -1
  428. package/dist/src/web/plugin/transform-data-llm.test.js.map +0 -1
  429. package/dist/src/web/proxy.js.map +0 -1
  430. package/dist/src/web/types.d.ts +0 -133
  431. package/dist/src/web/types.js.map +0 -1
  432. package/dist/vitest.config.d.ts +0 -2
  433. package/dist/vitest.config.js +0 -8
  434. package/dist/vitest.config.js.map +0 -1
  435. /package/dist/{src/test/widget.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  436. /package/dist/{src/web/create-store.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
  437. /package/dist/{src/web/data-llm.test.d.ts → cli/tunnel.test.d.ts} +0 -0
  438. /package/dist/{src/web/generate-helpers.test-d.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
  439. /package/dist/{src/web/generate-helpers.test.d.ts → server/content-helpers.test.d.ts} +0 -0
  440. /package/dist/{src/web/helpers/state.test.d.ts → server/express.test.d.ts} +0 -0
  441. /package/dist/{src/server → server}/inferUtilityTypes.js +0 -0
  442. /package/dist/{src/web/hooks/use-call-tool.test-d.d.ts → server/middleware.test-d.d.ts} +0 -0
  443. /package/dist/{src/web/hooks/use-call-tool.test.d.ts → server/middleware.test.d.ts} +0 -0
  444. /package/dist/{src/web/hooks/use-display-mode.test.d.ts → server/tunnel-proxy-router.test.d.ts} +0 -0
  445. /package/dist/{src/web/hooks/use-files.test.d.ts → test/view.test.d.ts} +0 -0
  446. /package/dist/{src/web/hooks/use-locale.test.d.ts → web/bridges/mcp-app/use-mcp-app-context.test.d.ts} +0 -0
  447. /package/dist/{src/web/hooks/use-open-external.test.d.ts → web/create-store.test.d.ts} +0 -0
  448. /package/dist/{src/web/plugin → web}/data-llm.test.d.ts +0 -0
  449. /package/dist/{src/web/hooks/use-request-modal.test.d.ts → web/generate-helpers.test-d.d.ts} +0 -0
  450. /package/dist/{src/web/hooks/use-theme.test.d.ts → web/generate-helpers.test.d.ts} +0 -0
  451. /package/dist/{src/web → web}/generate-helpers.test.js +0 -0
  452. /package/dist/{src/web/hooks/use-tool-info.test-d.d.ts → web/helpers/state.test.d.ts} +0 -0
  453. /package/dist/{src/web/hooks/use-tool-info.test.d.ts → web/hooks/use-call-tool.test-d.d.ts} +0 -0
  454. /package/dist/{src/web → web}/hooks/use-call-tool.test-d.js +0 -0
  455. /package/dist/{src/web/hooks/use-user-agent.test.d.ts → web/hooks/use-call-tool.test.d.ts} +0 -0
  456. /package/dist/{src/web/hooks/use-widget-state.test.d.ts → web/hooks/use-display-mode.test-d.d.ts} +0 -0
  457. /package/dist/{src/web/plugin/transform-data-llm.test.d.ts → web/hooks/use-display-mode.test.d.ts} +0 -0
  458. /package/dist/{src/web → web}/plugin/data-llm.test.js +0 -0
  459. /package/dist/{src/web → web}/plugin/transform-data-llm.d.ts +0 -0
  460. /package/dist/{src/web → web}/plugin/transform-data-llm.test.js +0 -0
  461. /package/dist/{src/web → web}/proxy.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-request-modal.test.js","sourceRoot":"","sources":["../../../src/web/hooks/use-request-modal.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { renderHook } from \"@testing-library/react\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { useRequestModal } from \"./use-request-modal.js\";\n\ndescribe(\"useRequestModal\", () => {\n let requestModalMock: ReturnType<typeof vi.fn>;\n\n beforeEach(() => {\n requestModalMock = vi.fn();\n vi.stubGlobal(\"skybridge\", { hostType: \"apps-sdk\" });\n vi.stubGlobal(\"openai\", {\n requestModal: requestModalMock,\n view: { mode: \"inline\" },\n });\n });\n\n afterEach(() => {\n vi.unstubAllGlobals();\n vi.resetAllMocks();\n });\n\n it(\"should return an object with open, isOpen, and params properties where isOpen is false when mode is not modal\", () => {\n const { result } = renderHook(() => useRequestModal());\n\n expect(typeof result.current).toBe(\"object\");\n expect(result.current).toHaveProperty(\"open\");\n expect(result.current).toHaveProperty(\"isOpen\");\n expect(result.current).toHaveProperty(\"params\");\n\n const { open, isOpen, params } = result.current;\n expect(typeof open).toBe(\"function\");\n expect(isOpen).toBe(false);\n expect(params).toBeUndefined();\n });\n\n it(\"should return isOpen as true when mode is modal\", () => {\n vi.stubGlobal(\"openai\", {\n requestModal: requestModalMock,\n view: { mode: \"modal\" },\n });\n\n const { result } = renderHook(() => useRequestModal());\n const { isOpen } = result.current;\n\n expect(isOpen).toBe(true);\n });\n\n it(\"should return params from view when available\", () => {\n const testParams = { foo: \"bar\", baz: 42 };\n vi.stubGlobal(\"openai\", {\n requestModal: requestModalMock,\n view: { mode: \"modal\", params: testParams },\n });\n\n const { result } = renderHook(() => useRequestModal());\n const { params } = result.current;\n\n expect(params).toEqual(testParams);\n });\n\n it(\"should call window.openai.requestModal with the options when open is called\", () => {\n const { result } = renderHook(() => useRequestModal());\n const { open } = result.current;\n\n const options = {\n title: \"Test Modal\",\n params: { foo: \"bar\" },\n template: \"ui://view/modal-template.html\",\n };\n open(options);\n\n expect(requestModalMock).toHaveBeenCalledTimes(1);\n expect(requestModalMock).toHaveBeenCalledWith(options);\n });\n});\n"]}
@@ -0,0 +1,20 @@
1
+ import type { RequestSizeOptions } from "../bridges/types.js";
2
+ /** Function that asks the host to resize the view, returned by {@link useRequestSize}. */
3
+ export type RequestSizeFn = (size: RequestSizeOptions) => Promise<void>;
4
+ /**
5
+ * Ask the host to resize the view iframe. The applied size is host-driven —
6
+ * the host decides whether and how to honor the request, and {@link useLayout}
7
+ * still reports the final `maxHeight` it allows.
8
+ *
9
+ * Pair with a `ResizeObserver` on your root element to react to content size
10
+ * changes without hard-coded values.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * const requestSize = useRequestSize();
15
+ * useEffect(() => { requestSize({ height: rootRef.current!.scrollHeight }); }, [content]);
16
+ * ```
17
+ *
18
+ * @see https://docs.skybridge.tech/api-reference/use-request-size
19
+ */
20
+ export declare function useRequestSize(): RequestSizeFn;
@@ -0,0 +1,24 @@
1
+ import { useCallback } from "react";
2
+ import { getAdaptor } from "../bridges/index.js";
3
+ /**
4
+ * Ask the host to resize the view iframe. The applied size is host-driven —
5
+ * the host decides whether and how to honor the request, and {@link useLayout}
6
+ * still reports the final `maxHeight` it allows.
7
+ *
8
+ * Pair with a `ResizeObserver` on your root element to react to content size
9
+ * changes without hard-coded values.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * const requestSize = useRequestSize();
14
+ * useEffect(() => { requestSize({ height: rootRef.current!.scrollHeight }); }, [content]);
15
+ * ```
16
+ *
17
+ * @see https://docs.skybridge.tech/api-reference/use-request-size
18
+ */
19
+ export function useRequestSize() {
20
+ const adaptor = getAdaptor();
21
+ const requestSize = useCallback((size) => adaptor.requestSize(size), [adaptor]);
22
+ return requestSize;
23
+ }
24
+ //# sourceMappingURL=use-request-size.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-request-size.js","sourceRoot":"","sources":["../../../src/web/hooks/use-request-size.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAMjD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,IAAwB,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EACvD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,OAAO,WAAW,CAAC;AACrB,CAAC","sourcesContent":["import { useCallback } from \"react\";\nimport { getAdaptor } from \"../bridges/index.js\";\nimport type { RequestSizeOptions } from \"../bridges/types.js\";\n\n/** Function that asks the host to resize the view, returned by {@link useRequestSize}. */\nexport type RequestSizeFn = (size: RequestSizeOptions) => Promise<void>;\n\n/**\n * Ask the host to resize the view iframe. The applied size is host-driven —\n * the host decides whether and how to honor the request, and {@link useLayout}\n * still reports the final `maxHeight` it allows.\n *\n * Pair with a `ResizeObserver` on your root element to react to content size\n * changes without hard-coded values.\n *\n * @example\n * ```tsx\n * const requestSize = useRequestSize();\n * useEffect(() => { requestSize({ height: rootRef.current!.scrollHeight }); }, [content]);\n * ```\n *\n * @see https://docs.skybridge.tech/api-reference/use-request-size\n */\nexport function useRequestSize(): RequestSizeFn {\n const adaptor = getAdaptor();\n const requestSize = useCallback(\n (size: RequestSizeOptions) => adaptor.requestSize(size),\n [adaptor],\n );\n\n return requestSize;\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,65 @@
1
+ import { renderHook, waitFor } from "@testing-library/react";
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { AppsSdkAdaptor } from "../bridges/apps-sdk/adaptor.js";
4
+ import { McpAppBridge } from "../bridges/mcp-app/bridge.js";
5
+ import { getMcpAppHostPostMessageMock, MockResizeObserver, } from "./test/utils.js";
6
+ import { useRequestSize } from "./use-request-size.js";
7
+ describe("useRequestSize", () => {
8
+ describe("apps-sdk host", () => {
9
+ let consoleWarnSpy;
10
+ beforeEach(() => {
11
+ AppsSdkAdaptor.resetInstance();
12
+ vi.stubGlobal("openai", {});
13
+ vi.stubGlobal("skybridge", { hostType: "apps-sdk" });
14
+ consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
15
+ });
16
+ afterEach(() => {
17
+ AppsSdkAdaptor.resetInstance();
18
+ vi.unstubAllGlobals();
19
+ vi.resetAllMocks();
20
+ });
21
+ it("warns that requestSize is not supported on Apps SDK", async () => {
22
+ const { result } = renderHook(() => useRequestSize());
23
+ await result.current({ height: 400 });
24
+ expect(consoleWarnSpy).toHaveBeenCalledTimes(1);
25
+ expect(consoleWarnSpy.mock.calls[0]?.[0]).toContain("not supported");
26
+ });
27
+ });
28
+ describe("mcp-app host", () => {
29
+ let postMessageMock;
30
+ beforeEach(() => {
31
+ vi.stubGlobal("skybridge", { hostType: "mcp-app" });
32
+ vi.stubGlobal("ResizeObserver", MockResizeObserver);
33
+ postMessageMock = getMcpAppHostPostMessageMock();
34
+ vi.stubGlobal("parent", { postMessage: postMessageMock });
35
+ });
36
+ afterEach(async () => {
37
+ vi.unstubAllGlobals();
38
+ vi.resetAllMocks();
39
+ McpAppBridge.resetInstance();
40
+ });
41
+ it("sends a ui/notifications/size-changed notification with width and height", async () => {
42
+ const { result } = renderHook(() => useRequestSize());
43
+ await result.current({ width: 800, height: 400 });
44
+ await waitFor(() => {
45
+ expect(postMessageMock).toHaveBeenCalledWith(expect.objectContaining({
46
+ jsonrpc: "2.0",
47
+ method: "ui/notifications/size-changed",
48
+ params: { width: 800, height: 400 },
49
+ }), "*");
50
+ });
51
+ });
52
+ it("forwards height-only payloads as-is", async () => {
53
+ const { result } = renderHook(() => useRequestSize());
54
+ await result.current({ height: 400 });
55
+ await waitFor(() => {
56
+ expect(postMessageMock).toHaveBeenCalledWith(expect.objectContaining({
57
+ jsonrpc: "2.0",
58
+ method: "ui/notifications/size-changed",
59
+ params: { height: 400 },
60
+ }), "*");
61
+ });
62
+ });
63
+ });
64
+ });
65
+ //# sourceMappingURL=use-request-size.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-request-size.test.js","sourceRoot":"","sources":["../../../src/web/hooks/use-request-size.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { renderHook, waitFor } from \"@testing-library/react\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { AppsSdkAdaptor } from \"../bridges/apps-sdk/adaptor.js\";\nimport { McpAppBridge } from \"../bridges/mcp-app/bridge.js\";\nimport {\n getMcpAppHostPostMessageMock,\n MockResizeObserver,\n} from \"./test/utils.js\";\nimport { useRequestSize } from \"./use-request-size.js\";\n\ndescribe(\"useRequestSize\", () => {\n describe(\"apps-sdk host\", () => {\n let consoleWarnSpy: ReturnType<typeof vi.spyOn>;\n\n beforeEach(() => {\n AppsSdkAdaptor.resetInstance();\n vi.stubGlobal(\"openai\", {});\n vi.stubGlobal(\"skybridge\", { hostType: \"apps-sdk\" });\n consoleWarnSpy = vi.spyOn(console, \"warn\").mockImplementation(() => {});\n });\n\n afterEach(() => {\n AppsSdkAdaptor.resetInstance();\n vi.unstubAllGlobals();\n vi.resetAllMocks();\n });\n\n it(\"warns that requestSize is not supported on Apps SDK\", async () => {\n const { result } = renderHook(() => useRequestSize());\n\n await result.current({ height: 400 });\n\n expect(consoleWarnSpy).toHaveBeenCalledTimes(1);\n expect(consoleWarnSpy.mock.calls[0]?.[0]).toContain(\"not supported\");\n });\n });\n\n describe(\"mcp-app host\", () => {\n let postMessageMock: ReturnType<typeof getMcpAppHostPostMessageMock>;\n\n beforeEach(() => {\n vi.stubGlobal(\"skybridge\", { hostType: \"mcp-app\" });\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n postMessageMock = getMcpAppHostPostMessageMock();\n vi.stubGlobal(\"parent\", { postMessage: postMessageMock });\n });\n\n afterEach(async () => {\n vi.unstubAllGlobals();\n vi.resetAllMocks();\n McpAppBridge.resetInstance();\n });\n\n it(\"sends a ui/notifications/size-changed notification with width and height\", async () => {\n const { result } = renderHook(() => useRequestSize());\n\n await result.current({ width: 800, height: 400 });\n\n await waitFor(() => {\n expect(postMessageMock).toHaveBeenCalledWith(\n expect.objectContaining({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/size-changed\",\n params: { width: 800, height: 400 },\n }),\n \"*\",\n );\n });\n });\n\n it(\"forwards height-only payloads as-is\", async () => {\n const { result } = renderHook(() => useRequestSize());\n\n await result.current({ height: 400 });\n\n await waitFor(() => {\n expect(postMessageMock).toHaveBeenCalledWith(\n expect.objectContaining({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/size-changed\",\n params: { height: 400 },\n }),\n \"*\",\n );\n });\n });\n });\n});\n"]}
@@ -0,0 +1,19 @@
1
+ import { type SendFollowUpMessageOptions } from "../bridges/index.js";
2
+ /**
3
+ * Send a follow-up message to the LLM on behalf of the view, as if the user
4
+ * had sent it. Use to chain interactions from view UI (e.g. a button that
5
+ * triggers the next assistant turn).
6
+ *
7
+ * Pass `scrollToBottom: false` to keep the chat scroll position when the host
8
+ * posts the message. This option is Apps-SDK-only; it is silently ignored in
9
+ * the MCP Apps runtime.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * const send = useSendFollowUpMessage();
14
+ * <button onClick={() => send("Summarize the last 5 results")}>Summarize</button>
15
+ * ```
16
+ *
17
+ * @see https://docs.skybridge.tech/api-reference/use-send-follow-up-message
18
+ */
19
+ export declare function useSendFollowUpMessage(): (prompt: string, options?: SendFollowUpMessageOptions) => Promise<void>;
@@ -0,0 +1,25 @@
1
+ import { useCallback } from "react";
2
+ import { getAdaptor, } from "../bridges/index.js";
3
+ /**
4
+ * Send a follow-up message to the LLM on behalf of the view, as if the user
5
+ * had sent it. Use to chain interactions from view UI (e.g. a button that
6
+ * triggers the next assistant turn).
7
+ *
8
+ * Pass `scrollToBottom: false` to keep the chat scroll position when the host
9
+ * posts the message. This option is Apps-SDK-only; it is silently ignored in
10
+ * the MCP Apps runtime.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * const send = useSendFollowUpMessage();
15
+ * <button onClick={() => send("Summarize the last 5 results")}>Summarize</button>
16
+ * ```
17
+ *
18
+ * @see https://docs.skybridge.tech/api-reference/use-send-follow-up-message
19
+ */
20
+ export function useSendFollowUpMessage() {
21
+ const adaptor = getAdaptor();
22
+ const sendFollowUpMessage = useCallback((prompt, options) => adaptor.sendFollowUpMessage(prompt, options), [adaptor]);
23
+ return sendFollowUpMessage;
24
+ }
25
+ //# sourceMappingURL=use-send-follow-up-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-send-follow-up-message.js","sourceRoot":"","sources":["../../../src/web/hooks/use-send-follow-up-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EACL,UAAU,GAEX,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,mBAAmB,GAAG,WAAW,CACrC,CAAC,MAAc,EAAE,OAAoC,EAAE,EAAE,CACvD,OAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9C,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,OAAO,mBAAmB,CAAC;AAC7B,CAAC","sourcesContent":["import { useCallback } from \"react\";\nimport {\n getAdaptor,\n type SendFollowUpMessageOptions,\n} from \"../bridges/index.js\";\n\n/**\n * Send a follow-up message to the LLM on behalf of the view, as if the user\n * had sent it. Use to chain interactions from view UI (e.g. a button that\n * triggers the next assistant turn).\n *\n * Pass `scrollToBottom: false` to keep the chat scroll position when the host\n * posts the message. This option is Apps-SDK-only; it is silently ignored in\n * the MCP Apps runtime.\n *\n * @example\n * ```tsx\n * const send = useSendFollowUpMessage();\n * <button onClick={() => send(\"Summarize the last 5 results\")}>Summarize</button>\n * ```\n *\n * @see https://docs.skybridge.tech/api-reference/use-send-follow-up-message\n */\nexport function useSendFollowUpMessage() {\n const adaptor = getAdaptor();\n const sendFollowUpMessage = useCallback(\n (prompt: string, options?: SendFollowUpMessageOptions) =>\n adaptor.sendFollowUpMessage(prompt, options),\n [adaptor],\n );\n\n return sendFollowUpMessage;\n}\n"]}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Override the target URL the host opens from its fullscreen "Open in <App>"
3
+ * affordance. If unset, the host opens the view's current iframe path.
4
+ *
5
+ * Currently Apps-SDK-only — calling this from MCP Apps throws.
6
+ *
7
+ * Call this once your view has enough context to construct the canonical URL
8
+ * (e.g. a permalink to the entity the user is currently viewing).
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * const setOpenInAppUrl = useSetOpenInAppUrl();
13
+ * useEffect(() => { setOpenInAppUrl(`https://example.com/orders/${orderId}`); }, [orderId]);
14
+ * ```
15
+ *
16
+ * @see https://docs.skybridge.tech/api-reference/use-set-open-in-app-url
17
+ */
18
+ export declare function useSetOpenInAppUrl(): (href: string) => Promise<void>;
@@ -0,0 +1,25 @@
1
+ import { useCallback } from "react";
2
+ import { getAdaptor } from "../bridges/index.js";
3
+ /**
4
+ * Override the target URL the host opens from its fullscreen "Open in <App>"
5
+ * affordance. If unset, the host opens the view's current iframe path.
6
+ *
7
+ * Currently Apps-SDK-only — calling this from MCP Apps throws.
8
+ *
9
+ * Call this once your view has enough context to construct the canonical URL
10
+ * (e.g. a permalink to the entity the user is currently viewing).
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * const setOpenInAppUrl = useSetOpenInAppUrl();
15
+ * useEffect(() => { setOpenInAppUrl(`https://example.com/orders/${orderId}`); }, [orderId]);
16
+ * ```
17
+ *
18
+ * @see https://docs.skybridge.tech/api-reference/use-set-open-in-app-url
19
+ */
20
+ export function useSetOpenInAppUrl() {
21
+ const adaptor = getAdaptor();
22
+ const setOpenInAppUrl = useCallback((href) => adaptor.setOpenInAppUrl(href), [adaptor]);
23
+ return setOpenInAppUrl;
24
+ }
25
+ //# sourceMappingURL=use-set-open-in-app-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-set-open-in-app-url.js","sourceRoot":"","sources":["../../../src/web/hooks/use-set-open-in-app-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,eAAe,GAAG,WAAW,CACjC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,EAC/C,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,OAAO,eAAe,CAAC;AACzB,CAAC","sourcesContent":["import { useCallback } from \"react\";\nimport { getAdaptor } from \"../bridges/index.js\";\n\n/**\n * Override the target URL the host opens from its fullscreen \"Open in <App>\"\n * affordance. If unset, the host opens the view's current iframe path.\n *\n * Currently Apps-SDK-only — calling this from MCP Apps throws.\n *\n * Call this once your view has enough context to construct the canonical URL\n * (e.g. a permalink to the entity the user is currently viewing).\n *\n * @example\n * ```tsx\n * const setOpenInAppUrl = useSetOpenInAppUrl();\n * useEffect(() => { setOpenInAppUrl(`https://example.com/orders/${orderId}`); }, [orderId]);\n * ```\n *\n * @see https://docs.skybridge.tech/api-reference/use-set-open-in-app-url\n */\nexport function useSetOpenInAppUrl() {\n const adaptor = getAdaptor();\n const setOpenInAppUrl = useCallback(\n (href: string) => adaptor.setOpenInAppUrl(href),\n [adaptor],\n );\n\n return setOpenInAppUrl;\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,43 @@
1
+ import { renderHook } from "@testing-library/react";
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { AppsSdkAdaptor } from "../bridges/apps-sdk/adaptor.js";
4
+ import { useSetOpenInAppUrl } from "./use-set-open-in-app-url.js";
5
+ describe("useSetOpenInAppUrl", () => {
6
+ describe("apps-sdk host", () => {
7
+ let setOpenInAppUrlMock;
8
+ beforeEach(() => {
9
+ setOpenInAppUrlMock = vi.fn().mockResolvedValue(undefined);
10
+ vi.stubGlobal("openai", {
11
+ setOpenInAppUrl: setOpenInAppUrlMock,
12
+ });
13
+ vi.stubGlobal("skybridge", {
14
+ hostType: "apps-sdk",
15
+ serverUrl: "https://example.com",
16
+ });
17
+ });
18
+ afterEach(() => {
19
+ vi.unstubAllGlobals();
20
+ vi.resetAllMocks();
21
+ AppsSdkAdaptor.resetInstance();
22
+ });
23
+ it("should return a function that calls window.openai.setOpenInAppUrl with the href", async () => {
24
+ const { result } = renderHook(() => useSetOpenInAppUrl());
25
+ const href = "https://example.com/path";
26
+ await result.current(href);
27
+ expect(setOpenInAppUrlMock).toHaveBeenCalledTimes(1);
28
+ expect(setOpenInAppUrlMock).toHaveBeenCalledWith({ href });
29
+ });
30
+ it("should throw an error when href is empty", () => {
31
+ const { result } = renderHook(() => useSetOpenInAppUrl());
32
+ expect(() => result.current("")).toThrow("The href parameter is required.");
33
+ });
34
+ it("should call setOpenInAppUrl when href origin differs from serverUrl origin", async () => {
35
+ const { result } = renderHook(() => useSetOpenInAppUrl());
36
+ const href = "https://different-domain.com/path";
37
+ await result.current(href);
38
+ expect(setOpenInAppUrlMock).toHaveBeenCalledTimes(1);
39
+ expect(setOpenInAppUrlMock).toHaveBeenCalledWith({ href });
40
+ });
41
+ });
42
+ });
43
+ //# sourceMappingURL=use-set-open-in-app-url.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-set-open-in-app-url.test.js","sourceRoot":"","sources":["../../../src/web/hooks/use-set-open-in-app-url.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,IAAI,mBAA6C,CAAC;QAElD,UAAU,CAAC,GAAG,EAAE;YACd,mBAAmB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC3D,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE;gBACtB,eAAe,EAAE,mBAAmB;aACrC,CAAC,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE;gBACzB,QAAQ,EAAE,UAAU;gBACpB,SAAS,EAAE,qBAAqB;aACjC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,GAAG,EAAE;YACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;YACtB,EAAE,CAAC,aAAa,EAAE,CAAC;YACnB,cAAc,CAAC,aAAa,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;YAC/F,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;YAE1D,MAAM,IAAI,GAAG,0BAA0B,CAAC;YACxC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAE3B,MAAM,CAAC,mBAAmB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,CAAC,mBAAmB,CAAC,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;YAE1D,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CACtC,iCAAiC,CAClC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;YAE1D,MAAM,IAAI,GAAG,mCAAmC,CAAC;YACjD,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAE3B,MAAM,CAAC,mBAAmB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,CAAC,mBAAmB,CAAC,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { renderHook } from \"@testing-library/react\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { AppsSdkAdaptor } from \"../bridges/apps-sdk/adaptor.js\";\nimport { useSetOpenInAppUrl } from \"./use-set-open-in-app-url.js\";\n\ndescribe(\"useSetOpenInAppUrl\", () => {\n describe(\"apps-sdk host\", () => {\n let setOpenInAppUrlMock: ReturnType<typeof vi.fn>;\n\n beforeEach(() => {\n setOpenInAppUrlMock = vi.fn().mockResolvedValue(undefined);\n vi.stubGlobal(\"openai\", {\n setOpenInAppUrl: setOpenInAppUrlMock,\n });\n vi.stubGlobal(\"skybridge\", {\n hostType: \"apps-sdk\",\n serverUrl: \"https://example.com\",\n });\n });\n\n afterEach(() => {\n vi.unstubAllGlobals();\n vi.resetAllMocks();\n AppsSdkAdaptor.resetInstance();\n });\n\n it(\"should return a function that calls window.openai.setOpenInAppUrl with the href\", async () => {\n const { result } = renderHook(() => useSetOpenInAppUrl());\n\n const href = \"https://example.com/path\";\n await result.current(href);\n\n expect(setOpenInAppUrlMock).toHaveBeenCalledTimes(1);\n expect(setOpenInAppUrlMock).toHaveBeenCalledWith({ href });\n });\n\n it(\"should throw an error when href is empty\", () => {\n const { result } = renderHook(() => useSetOpenInAppUrl());\n\n expect(() => result.current(\"\")).toThrow(\n \"The href parameter is required.\",\n );\n });\n\n it(\"should call setOpenInAppUrl when href origin differs from serverUrl origin\", async () => {\n const { result } = renderHook(() => useSetOpenInAppUrl());\n\n const href = \"https://different-domain.com/path\";\n await result.current(href);\n\n expect(setOpenInAppUrlMock).toHaveBeenCalledTimes(1);\n expect(setOpenInAppUrlMock).toHaveBeenCalledWith({ href });\n });\n });\n});\n"]}
@@ -0,0 +1,69 @@
1
+ import type { UnknownObject } from "../types.js";
2
+ /** {@link useToolInfo} state before the tool has been invoked. */
3
+ export type ToolIdleState = {
4
+ status: "idle";
5
+ isIdle: true;
6
+ isPending: false;
7
+ isSuccess: false;
8
+ input: undefined;
9
+ output: undefined;
10
+ responseMetadata: undefined;
11
+ };
12
+ /** {@link useToolInfo} state while the tool is executing — `input` is available, output is not yet. */
13
+ export type ToolPendingState<ToolInput extends UnknownObject> = {
14
+ status: "pending";
15
+ isIdle: false;
16
+ isPending: true;
17
+ isSuccess: false;
18
+ input: ToolInput;
19
+ output: undefined;
20
+ responseMetadata: undefined;
21
+ };
22
+ /** {@link useToolInfo} state once the tool returned — `input`, `output`, and `responseMetadata` are all available. */
23
+ export type ToolSuccessState<ToolInput extends UnknownObject, ToolOutput extends UnknownObject, ToolResponseMetadata extends UnknownObject> = {
24
+ status: "success";
25
+ isIdle: false;
26
+ isPending: false;
27
+ isSuccess: true;
28
+ input: ToolInput;
29
+ output: ToolOutput;
30
+ responseMetadata: ToolResponseMetadata;
31
+ };
32
+ /**
33
+ * Discriminated union describing the tool invocation that triggered the
34
+ * current view render. Use `isIdle` / `isPending` / `isSuccess` to narrow.
35
+ */
36
+ export type ToolState<ToolInput extends UnknownObject, ToolOutput extends UnknownObject, ToolResponseMetadata extends UnknownObject> = ToolIdleState | ToolPendingState<ToolInput> | ToolSuccessState<ToolInput, ToolOutput, ToolResponseMetadata>;
37
+ type ToolSignature = {
38
+ input: UnknownObject;
39
+ output: UnknownObject;
40
+ responseMetadata: UnknownObject;
41
+ };
42
+ /**
43
+ * Access the tool invocation that produced the current view: its `input`,
44
+ * resulting `output`, and `responseMetadata`. The shape evolves as the tool
45
+ * runs (idle → pending → success), exposed through {@link ToolState}.
46
+ *
47
+ * For full input/output typing per tool name, prefer the typed `useToolInfo`
48
+ * returned by {@link generateHelpers} over the generic form.
49
+ *
50
+ * @typeParam TS - Optional partial shape `{ input, output, responseMetadata }`
51
+ * to refine each field's type. When omitted, each typed field resolves to
52
+ * `never` — pass an explicit shape or use the typed helper from
53
+ * {@link generateHelpers} to get usable types.
54
+ *
55
+ * @example
56
+ * ```tsx
57
+ * const { isSuccess, input, output } = useToolInfo<{
58
+ * input: { query: string };
59
+ * output: { results: Result[] };
60
+ * }>();
61
+ *
62
+ * if (!isSuccess || !output) return <Skeleton />;
63
+ * return <Results items={output.results} />;
64
+ * ```
65
+ *
66
+ * @see https://docs.skybridge.tech/api-reference/use-tool-info
67
+ */
68
+ export declare function useToolInfo<TS extends Partial<ToolSignature> = Record<string, never>>(): ToolState<UnknownObject & TS["input"], UnknownObject & TS["output"], UnknownObject & TS["responseMetadata"]>;
69
+ export {};
@@ -0,0 +1,52 @@
1
+ import { useHostContext } from "../bridges/index.js";
2
+ function deriveStatus(input, output, responseMetadata) {
3
+ if (input === null) {
4
+ return "idle";
5
+ }
6
+ if (output === null && responseMetadata === null) {
7
+ return "pending";
8
+ }
9
+ return "success";
10
+ }
11
+ /**
12
+ * Access the tool invocation that produced the current view: its `input`,
13
+ * resulting `output`, and `responseMetadata`. The shape evolves as the tool
14
+ * runs (idle → pending → success), exposed through {@link ToolState}.
15
+ *
16
+ * For full input/output typing per tool name, prefer the typed `useToolInfo`
17
+ * returned by {@link generateHelpers} over the generic form.
18
+ *
19
+ * @typeParam TS - Optional partial shape `{ input, output, responseMetadata }`
20
+ * to refine each field's type. When omitted, each typed field resolves to
21
+ * `never` — pass an explicit shape or use the typed helper from
22
+ * {@link generateHelpers} to get usable types.
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * const { isSuccess, input, output } = useToolInfo<{
27
+ * input: { query: string };
28
+ * output: { results: Result[] };
29
+ * }>();
30
+ *
31
+ * if (!isSuccess || !output) return <Skeleton />;
32
+ * return <Results items={output.results} />;
33
+ * ```
34
+ *
35
+ * @see https://docs.skybridge.tech/api-reference/use-tool-info
36
+ */
37
+ export function useToolInfo() {
38
+ const input = useHostContext("toolInput");
39
+ const output = useHostContext("toolOutput");
40
+ const responseMetadata = useHostContext("toolResponseMetadata");
41
+ const status = deriveStatus(input, output, responseMetadata);
42
+ return {
43
+ input,
44
+ status,
45
+ isIdle: status === "idle",
46
+ isPending: status === "pending",
47
+ isSuccess: status === "success",
48
+ output,
49
+ responseMetadata,
50
+ };
51
+ }
52
+ //# sourceMappingURL=use-tool-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tool-info.js","sourceRoot":"","sources":["../../../src/web/hooks/use-tool-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA2DrD,SAAS,YAAY,CACnB,KAAqC,EACrC,MAAsC,EACtC,gBAAgD;IAEhD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;QACjD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,WAAW;IAGzB,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,gBAAgB,GAAG,cAAc,CAAC,sBAAsB,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAM7D,OAAO;QACL,KAAK;QACL,MAAM;QACN,MAAM,EAAE,MAAM,KAAK,MAAM;QACzB,SAAS,EAAE,MAAM,KAAK,SAAS;QAC/B,SAAS,EAAE,MAAM,KAAK,SAAS;QAC/B,MAAM;QACN,gBAAgB;KACqB,CAAC;AAC1C,CAAC","sourcesContent":["import { useHostContext } from \"../bridges/index.js\";\nimport type { UnknownObject } from \"../types.js\";\n\n/** {@link useToolInfo} state before the tool has been invoked. */\nexport type ToolIdleState = {\n status: \"idle\";\n isIdle: true;\n isPending: false;\n isSuccess: false;\n input: undefined;\n output: undefined;\n responseMetadata: undefined;\n};\n\n/** {@link useToolInfo} state while the tool is executing — `input` is available, output is not yet. */\nexport type ToolPendingState<ToolInput extends UnknownObject> = {\n status: \"pending\";\n isIdle: false;\n isPending: true;\n isSuccess: false;\n input: ToolInput;\n output: undefined;\n responseMetadata: undefined;\n};\n\n/** {@link useToolInfo} state once the tool returned — `input`, `output`, and `responseMetadata` are all available. */\nexport type ToolSuccessState<\n ToolInput extends UnknownObject,\n ToolOutput extends UnknownObject,\n ToolResponseMetadata extends UnknownObject,\n> = {\n status: \"success\";\n isIdle: false;\n isPending: false;\n isSuccess: true;\n input: ToolInput;\n output: ToolOutput;\n responseMetadata: ToolResponseMetadata;\n};\n\n/**\n * Discriminated union describing the tool invocation that triggered the\n * current view render. Use `isIdle` / `isPending` / `isSuccess` to narrow.\n */\nexport type ToolState<\n ToolInput extends UnknownObject,\n ToolOutput extends UnknownObject,\n ToolResponseMetadata extends UnknownObject,\n> =\n | ToolIdleState\n | ToolPendingState<ToolInput>\n | ToolSuccessState<ToolInput, ToolOutput, ToolResponseMetadata>;\n\ntype ToolSignature = {\n input: UnknownObject;\n output: UnknownObject;\n responseMetadata: UnknownObject;\n};\n\nfunction deriveStatus(\n input: Record<string, unknown> | null,\n output: Record<string, unknown> | null,\n responseMetadata: Record<string, unknown> | null,\n): \"idle\" | \"pending\" | \"success\" {\n if (input === null) {\n return \"idle\";\n }\n if (output === null && responseMetadata === null) {\n return \"pending\";\n }\n return \"success\";\n}\n\n/**\n * Access the tool invocation that produced the current view: its `input`,\n * resulting `output`, and `responseMetadata`. The shape evolves as the tool\n * runs (idle → pending → success), exposed through {@link ToolState}.\n *\n * For full input/output typing per tool name, prefer the typed `useToolInfo`\n * returned by {@link generateHelpers} over the generic form.\n *\n * @typeParam TS - Optional partial shape `{ input, output, responseMetadata }`\n * to refine each field's type. When omitted, each typed field resolves to\n * `never` — pass an explicit shape or use the typed helper from\n * {@link generateHelpers} to get usable types.\n *\n * @example\n * ```tsx\n * const { isSuccess, input, output } = useToolInfo<{\n * input: { query: string };\n * output: { results: Result[] };\n * }>();\n *\n * if (!isSuccess || !output) return <Skeleton />;\n * return <Results items={output.results} />;\n * ```\n *\n * @see https://docs.skybridge.tech/api-reference/use-tool-info\n */\nexport function useToolInfo<\n TS extends Partial<ToolSignature> = Record<string, never>,\n>() {\n const input = useHostContext(\"toolInput\");\n const output = useHostContext(\"toolOutput\");\n const responseMetadata = useHostContext(\"toolResponseMetadata\");\n\n const status = deriveStatus(input, output, responseMetadata);\n\n type Input = UnknownObject & TS[\"input\"];\n type Output = UnknownObject & TS[\"output\"];\n type Metadata = UnknownObject & TS[\"responseMetadata\"];\n\n return {\n input,\n status,\n isIdle: status === \"idle\",\n isPending: status === \"pending\",\n isSuccess: status === \"success\",\n output,\n responseMetadata,\n } as ToolState<Input, Output, Metadata>;\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -6,27 +6,46 @@ test("useToolInfo - TypeScript typing", () => {
6
6
  expectTypeOf(result.status);
7
7
  expectTypeOf(result.isPending);
8
8
  expectTypeOf(result.isSuccess);
9
+ expectTypeOf(result.isIdle);
9
10
  expectTypeOf(result.input);
10
11
  });
11
12
  test("should correctly type input, output, and responseMetadata with explicit ToolSignature", () => {
12
13
  const result = useToolInfo();
13
- expectTypeOf(result.input);
14
+ // When idle, input should be undefined
15
+ if (result.status === "idle") {
16
+ expectTypeOf(result.input);
17
+ expectTypeOf(result.output);
18
+ expectTypeOf(result.responseMetadata);
19
+ }
14
20
  // When pending, output and responseMetadata should be undefined
15
21
  if (result.status === "pending") {
22
+ expectTypeOf(result.input);
16
23
  expectTypeOf(result.output);
17
24
  expectTypeOf(result.responseMetadata);
18
25
  }
19
26
  // When success, output and responseMetadata should be defined
20
27
  if (result.status === "success") {
28
+ expectTypeOf(result.input);
21
29
  expectTypeOf(result.output);
22
30
  expectTypeOf(result.responseMetadata);
23
31
  }
24
32
  });
25
33
  test("should correctly narrow types based on status discriminated union", () => {
26
34
  const result = useToolInfo();
27
- // Test type narrowing
35
+ // Test type narrowing for idle
36
+ if (result.isIdle) {
37
+ expectTypeOf(result.status);
38
+ expectTypeOf(result.isIdle);
39
+ expectTypeOf(result.isPending);
40
+ expectTypeOf(result.isSuccess);
41
+ expectTypeOf(result.input);
42
+ expectTypeOf(result.output);
43
+ expectTypeOf(result.responseMetadata);
44
+ }
45
+ // Test type narrowing for pending
28
46
  if (result.isPending) {
29
47
  expectTypeOf(result.status);
48
+ expectTypeOf(result.isIdle);
30
49
  expectTypeOf(result.isPending);
31
50
  expectTypeOf(result.isSuccess);
32
51
  expectTypeOf(result.output);
@@ -34,13 +53,23 @@ test("useToolInfo - TypeScript typing", () => {
34
53
  }
35
54
  if (result.isSuccess) {
36
55
  expectTypeOf(result.status);
56
+ expectTypeOf(result.isIdle);
37
57
  expectTypeOf(result.isPending);
38
58
  expectTypeOf(result.isSuccess);
39
59
  expectTypeOf(result.output);
40
60
  expectTypeOf(result.responseMetadata);
41
61
  }
62
+ if (result.status === "idle") {
63
+ expectTypeOf(result.isIdle);
64
+ expectTypeOf(result.isPending);
65
+ expectTypeOf(result.isSuccess);
66
+ expectTypeOf(result.input);
67
+ expectTypeOf(result.output);
68
+ expectTypeOf(result.responseMetadata);
69
+ }
42
70
  if (result.status === "pending") {
43
71
  expectTypeOf(result.input);
72
+ expectTypeOf(result.isIdle);
44
73
  expectTypeOf(result.isPending);
45
74
  expectTypeOf(result.isSuccess);
46
75
  expectTypeOf(result.output);
@@ -48,6 +77,7 @@ test("useToolInfo - TypeScript typing", () => {
48
77
  }
49
78
  if (result.status === "success") {
50
79
  expectTypeOf(result.input);
80
+ expectTypeOf(result.isIdle);
51
81
  expectTypeOf(result.isPending);
52
82
  expectTypeOf(result.isSuccess);
53
83
  expectTypeOf(result.output);
@@ -56,7 +86,10 @@ test("useToolInfo - TypeScript typing", () => {
56
86
  });
57
87
  test("should handle partial ToolSignature with only input specified", () => {
58
88
  const result = useToolInfo();
59
- expectTypeOf(result.input);
89
+ // Input can be TestInput or undefined (when idle)
90
+ if (result.status === "pending" || result.status === "success") {
91
+ expectTypeOf(result.input);
92
+ }
60
93
  if (result.status === "success") {
61
94
  expectTypeOf(result.output);
62
95
  expectTypeOf(result.responseMetadata);
@@ -64,7 +97,10 @@ test("useToolInfo - TypeScript typing", () => {
64
97
  });
65
98
  test("should handle ToolSignature with only output specified", () => {
66
99
  const result = useToolInfo();
67
- expectTypeOf(result.input);
100
+ // Input can be Record<string, unknown> or undefined (when idle)
101
+ if (result.status === "pending" || result.status === "success") {
102
+ expectTypeOf(result.input);
103
+ }
68
104
  if (result.status === "success") {
69
105
  expectTypeOf(result.output);
70
106
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tool-info.test-d.js","sourceRoot":"","sources":["../../../src/web/hooks/use-tool-info.test-d.ts"],"names":[],"mappings":"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","sourcesContent":["import { expectTypeOf, test } from \"vitest\";\nimport { useToolInfo } from \"./use-tool-info.js\";\n\ntest(\"useToolInfo - TypeScript typing\", () => {\n test(\"should have correct types when no generic parameter is provided\", () => {\n const result = useToolInfo();\n\n expectTypeOf<\"idle\" | \"pending\" | \"success\">(result.status);\n expectTypeOf<boolean>(result.isPending);\n expectTypeOf<boolean>(result.isSuccess);\n expectTypeOf<boolean>(result.isIdle);\n expectTypeOf<Record<string, unknown> | undefined>(result.input);\n });\n\n test(\"should correctly type input, output, and responseMetadata with explicit ToolSignature\", () => {\n type TestInput = { name: string; args: { name: string } };\n type TestOutput = { name: string; color: string };\n type TestMetadata = { id: number };\n\n const result = useToolInfo<{\n input: TestInput;\n output: TestOutput;\n responseMetadata: TestMetadata;\n }>();\n\n // When idle, input should be undefined\n if (result.status === \"idle\") {\n expectTypeOf<undefined>(result.input);\n expectTypeOf<undefined>(result.output);\n expectTypeOf<undefined>(result.responseMetadata);\n }\n\n // When pending, output and responseMetadata should be undefined\n if (result.status === \"pending\") {\n expectTypeOf<TestInput>(result.input);\n expectTypeOf<undefined>(result.output);\n expectTypeOf<undefined>(result.responseMetadata);\n }\n\n // When success, output and responseMetadata should be defined\n if (result.status === \"success\") {\n expectTypeOf<TestInput>(result.input);\n expectTypeOf<TestOutput>(result.output);\n expectTypeOf<TestMetadata>(result.responseMetadata);\n }\n });\n\n test(\"should correctly narrow types based on status discriminated union\", () => {\n type TestInput = { query: string };\n type TestOutput = { result: string };\n type TestMetadata = { timestamp: number };\n\n const result = useToolInfo<{\n input: TestInput;\n output: TestOutput;\n responseMetadata: TestMetadata;\n }>();\n\n // Test type narrowing for idle\n if (result.isIdle) {\n expectTypeOf<\"idle\">(result.status);\n expectTypeOf<true>(result.isIdle);\n expectTypeOf<false>(result.isPending);\n expectTypeOf<false>(result.isSuccess);\n expectTypeOf<undefined>(result.input);\n expectTypeOf<undefined>(result.output);\n expectTypeOf<undefined>(result.responseMetadata);\n }\n\n // Test type narrowing for pending\n if (result.isPending) {\n expectTypeOf<\"pending\">(result.status);\n expectTypeOf<false>(result.isIdle);\n expectTypeOf<true>(result.isPending);\n expectTypeOf<false>(result.isSuccess);\n expectTypeOf<undefined>(result.output);\n expectTypeOf<undefined>(result.responseMetadata);\n }\n\n if (result.isSuccess) {\n expectTypeOf<\"success\">(result.status);\n expectTypeOf<false>(result.isIdle);\n expectTypeOf<false>(result.isPending);\n expectTypeOf<true>(result.isSuccess);\n expectTypeOf<TestOutput>(result.output);\n expectTypeOf<TestMetadata>(result.responseMetadata);\n }\n\n if (result.status === \"idle\") {\n expectTypeOf<true>(result.isIdle);\n expectTypeOf<false>(result.isPending);\n expectTypeOf<false>(result.isSuccess);\n expectTypeOf<undefined>(result.input);\n expectTypeOf<undefined>(result.output);\n expectTypeOf<undefined>(result.responseMetadata);\n }\n\n if (result.status === \"pending\") {\n expectTypeOf<TestInput>(result.input);\n expectTypeOf<false>(result.isIdle);\n expectTypeOf<true>(result.isPending);\n expectTypeOf<false>(result.isSuccess);\n expectTypeOf<undefined>(result.output);\n expectTypeOf<undefined>(result.responseMetadata);\n }\n\n if (result.status === \"success\") {\n expectTypeOf<TestInput>(result.input);\n expectTypeOf<false>(result.isIdle);\n expectTypeOf<false>(result.isPending);\n expectTypeOf<true>(result.isSuccess);\n expectTypeOf<TestOutput>(result.output);\n expectTypeOf<TestMetadata>(result.responseMetadata);\n }\n });\n\n test(\"should handle partial ToolSignature with only input specified\", () => {\n type TestInput = { id: number };\n\n const result = useToolInfo<{\n input: TestInput;\n }>();\n\n // Input can be TestInput or undefined (when idle)\n if (result.status === \"pending\" || result.status === \"success\") {\n expectTypeOf<TestInput>(result.input);\n }\n\n if (result.status === \"success\") {\n expectTypeOf<Record<string, unknown>>(result.output);\n expectTypeOf<Record<string, unknown>>(result.responseMetadata);\n }\n });\n\n test(\"should handle ToolSignature with only output specified\", () => {\n type TestOutput = { data: string[] };\n\n const result = useToolInfo<{\n output: TestOutput;\n }>();\n\n // Input can be Record<string, unknown> or undefined (when idle)\n if (result.status === \"pending\" || result.status === \"success\") {\n expectTypeOf<Record<string, unknown>>(result.input);\n }\n\n if (result.status === \"success\") {\n expectTypeOf<TestOutput>(result.output);\n }\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ export {};