skybridge 0.0.0-dev.df35d17 → 0.0.0-dev.df4090c

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 (467) hide show
  1. package/LICENSE +21 -674
  2. package/README.md +123 -169
  3. package/bin/run.js +5 -0
  4. package/dist/cli/build-helpers.d.ts +7 -0
  5. package/dist/cli/build-helpers.js +82 -0
  6. package/dist/cli/build-helpers.js.map +1 -0
  7. package/dist/cli/build-helpers.test.js +64 -0
  8. package/dist/cli/build-helpers.test.js.map +1 -0
  9. package/dist/cli/detect-port.d.ts +18 -0
  10. package/dist/cli/detect-port.js +50 -0
  11. package/dist/cli/detect-port.js.map +1 -0
  12. package/dist/cli/header.d.ts +4 -0
  13. package/dist/cli/header.js +6 -0
  14. package/dist/cli/header.js.map +1 -0
  15. package/dist/cli/resolve-views-dir.d.ts +1 -0
  16. package/dist/cli/resolve-views-dir.js +17 -0
  17. package/dist/cli/resolve-views-dir.js.map +1 -0
  18. package/dist/cli/run-command.d.ts +2 -0
  19. package/dist/cli/run-command.js +43 -0
  20. package/dist/cli/run-command.js.map +1 -0
  21. package/dist/cli/telemetry.d.ts +7 -0
  22. package/dist/cli/telemetry.js +123 -0
  23. package/dist/cli/telemetry.js.map +1 -0
  24. package/dist/cli/tunnel-control-server.d.ts +9 -0
  25. package/dist/cli/tunnel-control-server.js +31 -0
  26. package/dist/cli/tunnel-control-server.js.map +1 -0
  27. package/dist/cli/tunnel-control-server.test.js +39 -0
  28. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  29. package/dist/cli/tunnel-handler.d.ts +3 -0
  30. package/dist/cli/tunnel-handler.js +48 -0
  31. package/dist/cli/tunnel-handler.js.map +1 -0
  32. package/dist/cli/tunnel-handler.test.js +105 -0
  33. package/dist/cli/tunnel-handler.test.js.map +1 -0
  34. package/dist/cli/tunnel.d.ts +57 -0
  35. package/dist/cli/tunnel.js +154 -0
  36. package/dist/cli/tunnel.js.map +1 -0
  37. package/dist/cli/tunnel.test.js +190 -0
  38. package/dist/cli/tunnel.test.js.map +1 -0
  39. package/dist/cli/types.d.ts +5 -0
  40. package/dist/cli/types.js +2 -0
  41. package/dist/cli/types.js.map +1 -0
  42. package/dist/cli/use-execute-steps.d.ts +11 -0
  43. package/dist/cli/use-execute-steps.js +36 -0
  44. package/dist/cli/use-execute-steps.js.map +1 -0
  45. package/dist/cli/use-messages.d.ts +3 -0
  46. package/dist/cli/use-messages.js +11 -0
  47. package/dist/cli/use-messages.js.map +1 -0
  48. package/dist/cli/use-nodemon.d.ts +2 -0
  49. package/dist/cli/use-nodemon.js +73 -0
  50. package/dist/cli/use-nodemon.js.map +1 -0
  51. package/dist/cli/use-open-browser.d.ts +1 -0
  52. package/dist/cli/use-open-browser.js +44 -0
  53. package/dist/cli/use-open-browser.js.map +1 -0
  54. package/dist/cli/use-tunnel.d.ts +14 -0
  55. package/dist/cli/use-tunnel.js +131 -0
  56. package/dist/cli/use-tunnel.js.map +1 -0
  57. package/dist/cli/use-typescript-check.d.ts +9 -0
  58. package/dist/cli/use-typescript-check.js +94 -0
  59. package/dist/cli/use-typescript-check.js.map +1 -0
  60. package/dist/commands/build.d.ts +8 -0
  61. package/dist/commands/build.js +90 -0
  62. package/dist/commands/build.js.map +1 -0
  63. package/dist/commands/create.d.ts +9 -0
  64. package/dist/commands/create.js +30 -0
  65. package/dist/commands/create.js.map +1 -0
  66. package/dist/commands/dev.d.ts +12 -0
  67. package/dist/commands/dev.js +96 -0
  68. package/dist/commands/dev.js.map +1 -0
  69. package/dist/commands/start.d.ts +9 -0
  70. package/dist/commands/start.js +55 -0
  71. package/dist/commands/start.js.map +1 -0
  72. package/dist/commands/telemetry/disable.d.ts +5 -0
  73. package/dist/commands/telemetry/disable.js +14 -0
  74. package/dist/commands/telemetry/disable.js.map +1 -0
  75. package/dist/commands/telemetry/enable.d.ts +5 -0
  76. package/dist/commands/telemetry/enable.js +14 -0
  77. package/dist/commands/telemetry/enable.js.map +1 -0
  78. package/dist/commands/telemetry/status.d.ts +5 -0
  79. package/dist/commands/telemetry/status.js +14 -0
  80. package/dist/commands/telemetry/status.js.map +1 -0
  81. package/dist/server/asset-base-url-transform-plugin.d.ts +11 -0
  82. package/dist/server/asset-base-url-transform-plugin.js +48 -0
  83. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  84. package/dist/server/asset-base-url-transform-plugin.test.js +134 -0
  85. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  86. package/dist/server/auth.d.ts +20 -0
  87. package/dist/server/auth.js +28 -0
  88. package/dist/server/auth.js.map +1 -0
  89. package/dist/server/build-manifest.test.js +27 -0
  90. package/dist/server/build-manifest.test.js.map +1 -0
  91. package/dist/server/content-helpers.d.ts +67 -0
  92. package/dist/server/content-helpers.js +79 -0
  93. package/dist/server/content-helpers.js.map +1 -0
  94. package/dist/server/content-helpers.test.js +70 -0
  95. package/dist/server/content-helpers.test.js.map +1 -0
  96. package/dist/server/express.d.ts +11 -0
  97. package/dist/server/express.js +101 -0
  98. package/dist/server/express.js.map +1 -0
  99. package/dist/server/express.test.js +491 -0
  100. package/dist/server/express.test.js.map +1 -0
  101. package/dist/server/file-ref.d.ts +28 -0
  102. package/dist/server/file-ref.js +27 -0
  103. package/dist/server/file-ref.js.map +1 -0
  104. package/dist/server/index.d.ts +8 -0
  105. package/dist/server/index.js +6 -0
  106. package/dist/server/index.js.map +1 -0
  107. package/dist/server/inferUtilityTypes.d.ts +64 -0
  108. package/dist/server/inferUtilityTypes.js +2 -0
  109. package/dist/server/inferUtilityTypes.js.map +1 -0
  110. package/dist/server/metric.d.ts +14 -0
  111. package/dist/server/metric.js +62 -0
  112. package/dist/server/metric.js.map +1 -0
  113. package/dist/server/middleware.d.ts +137 -0
  114. package/dist/server/middleware.js +93 -0
  115. package/dist/server/middleware.js.map +1 -0
  116. package/dist/server/middleware.test-d.js +75 -0
  117. package/dist/server/middleware.test-d.js.map +1 -0
  118. package/dist/server/middleware.test.js +493 -0
  119. package/dist/server/middleware.test.js.map +1 -0
  120. package/dist/server/server.d.ts +400 -0
  121. package/dist/server/server.js +656 -0
  122. package/dist/server/server.js.map +1 -0
  123. package/dist/{src/server → server}/templateHelper.d.ts +5 -4
  124. package/dist/server/templateHelper.js +11 -0
  125. package/dist/server/templateHelper.js.map +1 -0
  126. package/dist/server/templates.generated.d.ts +4 -0
  127. package/dist/server/templates.generated.js +47 -0
  128. package/dist/server/templates.generated.js.map +1 -0
  129. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  130. package/dist/server/tunnel-proxy-router.js +110 -0
  131. package/dist/server/tunnel-proxy-router.js.map +1 -0
  132. package/dist/server/tunnel-proxy-router.test.js +229 -0
  133. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  134. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  135. package/dist/server/view-resource-resolution.test.js +88 -0
  136. package/dist/server/view-resource-resolution.test.js.map +1 -0
  137. package/dist/server/viewsDevServer.d.ts +14 -0
  138. package/dist/server/viewsDevServer.js +45 -0
  139. package/dist/server/viewsDevServer.js.map +1 -0
  140. package/dist/test/utils.d.ts +127 -0
  141. package/dist/test/utils.js +247 -0
  142. package/dist/test/utils.js.map +1 -0
  143. package/dist/test/view.test.d.ts +1 -0
  144. package/dist/test/view.test.js +568 -0
  145. package/dist/test/view.test.js.map +1 -0
  146. package/dist/version.d.ts +1 -0
  147. package/dist/version.js +3 -0
  148. package/dist/version.js.map +1 -0
  149. package/dist/web/bridges/apps-sdk/adaptor.d.ts +29 -0
  150. package/dist/web/bridges/apps-sdk/adaptor.js +117 -0
  151. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -0
  152. package/dist/web/bridges/apps-sdk/bridge.d.ts +11 -0
  153. package/dist/web/bridges/apps-sdk/bridge.js +47 -0
  154. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
  155. package/dist/web/bridges/apps-sdk/index.d.ts +5 -0
  156. package/dist/web/bridges/apps-sdk/index.js +5 -0
  157. package/dist/web/bridges/apps-sdk/index.js.map +1 -0
  158. package/dist/web/bridges/apps-sdk/types.d.ts +133 -0
  159. package/dist/web/bridges/apps-sdk/types.js.map +1 -0
  160. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +13 -0
  161. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +18 -0
  162. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
  163. package/dist/web/bridges/get-adaptor.d.ts +9 -0
  164. package/dist/web/bridges/get-adaptor.js +15 -0
  165. package/dist/web/bridges/get-adaptor.js.map +1 -0
  166. package/dist/web/bridges/index.d.ts +5 -0
  167. package/dist/web/bridges/index.js +6 -0
  168. package/dist/web/bridges/index.js.map +1 -0
  169. package/dist/web/bridges/mcp-app/adaptor.d.ts +53 -0
  170. package/dist/web/bridges/mcp-app/adaptor.js +283 -0
  171. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -0
  172. package/dist/web/bridges/mcp-app/bridge.d.ts +28 -0
  173. package/dist/web/bridges/mcp-app/bridge.js +124 -0
  174. package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
  175. package/dist/web/bridges/mcp-app/index.d.ts +4 -0
  176. package/dist/web/bridges/mcp-app/index.js +4 -0
  177. package/dist/web/bridges/mcp-app/index.js.map +1 -0
  178. package/dist/web/bridges/mcp-app/types.d.ts +8 -0
  179. package/dist/web/bridges/mcp-app/types.js +2 -0
  180. package/dist/web/bridges/mcp-app/types.js.map +1 -0
  181. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +19 -0
  182. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +19 -0
  183. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
  184. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.d.ts +1 -0
  185. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +26 -0
  186. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
  187. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  188. package/dist/web/bridges/mcp-app/view-tools.test.js +144 -0
  189. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  190. package/dist/web/bridges/types.d.ts +204 -0
  191. package/dist/web/bridges/types.js +2 -0
  192. package/dist/web/bridges/types.js.map +1 -0
  193. package/dist/web/bridges/use-host-context.d.ts +7 -0
  194. package/dist/web/bridges/use-host-context.js +13 -0
  195. package/dist/web/bridges/use-host-context.js.map +1 -0
  196. package/dist/web/components/modal-provider.d.ts +4 -0
  197. package/dist/web/components/modal-provider.js +45 -0
  198. package/dist/web/components/modal-provider.js.map +1 -0
  199. package/dist/web/create-store.d.ts +29 -0
  200. package/dist/web/create-store.js +64 -0
  201. package/dist/web/create-store.js.map +1 -0
  202. package/dist/web/create-store.test.d.ts +1 -0
  203. package/dist/web/create-store.test.js +129 -0
  204. package/dist/web/create-store.test.js.map +1 -0
  205. package/dist/web/data-llm.d.ts +47 -0
  206. package/dist/web/data-llm.js +100 -0
  207. package/dist/web/data-llm.js.map +1 -0
  208. package/dist/web/data-llm.test.d.ts +1 -0
  209. package/dist/web/data-llm.test.js +142 -0
  210. package/dist/web/data-llm.test.js.map +1 -0
  211. package/dist/web/generate-helpers.d.ts +120 -0
  212. package/dist/web/generate-helpers.js +115 -0
  213. package/dist/web/generate-helpers.js.map +1 -0
  214. package/dist/web/generate-helpers.test-d.d.ts +1 -0
  215. package/dist/web/generate-helpers.test-d.js +211 -0
  216. package/dist/web/generate-helpers.test-d.js.map +1 -0
  217. package/dist/web/generate-helpers.test.d.ts +1 -0
  218. package/dist/web/generate-helpers.test.js +17 -0
  219. package/dist/web/generate-helpers.test.js.map +1 -0
  220. package/dist/web/helpers/state.d.ts +7 -0
  221. package/dist/web/helpers/state.js +45 -0
  222. package/dist/web/helpers/state.js.map +1 -0
  223. package/dist/web/helpers/state.test.d.ts +1 -0
  224. package/dist/web/helpers/state.test.js +53 -0
  225. package/dist/web/helpers/state.test.js.map +1 -0
  226. package/dist/web/hooks/index.d.ts +15 -0
  227. package/dist/web/hooks/index.js +16 -0
  228. package/dist/web/hooks/index.js.map +1 -0
  229. package/dist/web/hooks/test/utils.d.ts +20 -0
  230. package/dist/web/hooks/test/utils.js +75 -0
  231. package/dist/web/hooks/test/utils.js.map +1 -0
  232. package/dist/web/hooks/use-call-tool.d.ts +146 -0
  233. package/dist/web/hooks/use-call-tool.js +96 -0
  234. package/dist/web/hooks/use-call-tool.js.map +1 -0
  235. package/dist/web/hooks/use-call-tool.test-d.d.ts +1 -0
  236. package/dist/web/hooks/use-call-tool.test-d.js +104 -0
  237. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -0
  238. package/dist/web/hooks/use-call-tool.test.d.ts +1 -0
  239. package/dist/web/hooks/use-call-tool.test.js +211 -0
  240. package/dist/web/hooks/use-call-tool.test.js.map +1 -0
  241. package/dist/web/hooks/use-display-mode.d.ts +24 -0
  242. package/dist/web/hooks/use-display-mode.js +29 -0
  243. package/dist/web/hooks/use-display-mode.js.map +1 -0
  244. package/dist/web/hooks/use-display-mode.test-d.d.ts +1 -0
  245. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  246. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  247. package/dist/web/hooks/use-display-mode.test.d.ts +1 -0
  248. package/dist/{src/web → web}/hooks/use-display-mode.test.js +3 -2
  249. package/dist/web/hooks/use-display-mode.test.js.map +1 -0
  250. package/dist/web/hooks/use-download.d.ts +5 -0
  251. package/dist/web/hooks/use-download.js +8 -0
  252. package/dist/web/hooks/use-download.js.map +1 -0
  253. package/dist/web/hooks/use-download.test.d.ts +1 -0
  254. package/dist/web/hooks/use-download.test.js +95 -0
  255. package/dist/web/hooks/use-download.test.js.map +1 -0
  256. package/dist/web/hooks/use-files.d.ts +39 -0
  257. package/dist/web/hooks/use-files.js +42 -0
  258. package/dist/web/hooks/use-files.js.map +1 -0
  259. package/dist/web/hooks/use-files.test.d.ts +1 -0
  260. package/dist/web/hooks/use-files.test.js +54 -0
  261. package/dist/web/hooks/use-files.test.js.map +1 -0
  262. package/dist/web/hooks/use-layout.d.ts +24 -0
  263. package/dist/web/hooks/use-layout.js +25 -0
  264. package/dist/web/hooks/use-layout.js.map +1 -0
  265. package/dist/web/hooks/use-layout.test.d.ts +1 -0
  266. package/dist/web/hooks/use-layout.test.js +96 -0
  267. package/dist/web/hooks/use-layout.test.js.map +1 -0
  268. package/dist/web/hooks/use-open-external.d.ts +20 -0
  269. package/dist/web/hooks/use-open-external.js +24 -0
  270. package/dist/web/hooks/use-open-external.js.map +1 -0
  271. package/dist/web/hooks/use-open-external.test.d.ts +1 -0
  272. package/dist/web/hooks/use-open-external.test.js +65 -0
  273. package/dist/web/hooks/use-open-external.test.js.map +1 -0
  274. package/dist/web/hooks/use-register-view-tool.d.ts +38 -0
  275. package/dist/web/hooks/use-register-view-tool.js +50 -0
  276. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  277. package/dist/web/hooks/use-request-close.d.ts +16 -0
  278. package/dist/web/hooks/use-request-close.js +21 -0
  279. package/dist/web/hooks/use-request-close.js.map +1 -0
  280. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  281. package/dist/web/hooks/use-request-close.test.js +52 -0
  282. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  283. package/dist/web/hooks/use-request-modal.d.ts +24 -0
  284. package/dist/web/hooks/use-request-modal.js +31 -0
  285. package/dist/web/hooks/use-request-modal.js.map +1 -0
  286. package/dist/web/hooks/use-request-modal.test.d.ts +1 -0
  287. package/dist/web/hooks/use-request-modal.test.js +61 -0
  288. package/dist/web/hooks/use-request-modal.test.js.map +1 -0
  289. package/dist/web/hooks/use-request-size.d.ts +20 -0
  290. package/dist/web/hooks/use-request-size.js +24 -0
  291. package/dist/web/hooks/use-request-size.js.map +1 -0
  292. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  293. package/dist/web/hooks/use-request-size.test.js +65 -0
  294. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  295. package/dist/web/hooks/use-send-follow-up-message.d.ts +19 -0
  296. package/dist/web/hooks/use-send-follow-up-message.js +25 -0
  297. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
  298. package/dist/web/hooks/use-set-open-in-app-url.d.ts +18 -0
  299. package/dist/web/hooks/use-set-open-in-app-url.js +25 -0
  300. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  301. package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
  302. package/dist/web/hooks/use-set-open-in-app-url.test.js +43 -0
  303. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  304. package/dist/web/hooks/use-tool-info.d.ts +87 -0
  305. package/dist/web/hooks/use-tool-info.js +49 -0
  306. package/dist/web/hooks/use-tool-info.js.map +1 -0
  307. package/dist/web/hooks/use-tool-info.test-d.d.ts +1 -0
  308. package/dist/web/hooks/use-tool-info.test-d.js +91 -0
  309. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
  310. package/dist/web/hooks/use-tool-info.test.d.ts +1 -0
  311. package/dist/web/hooks/use-tool-info.test.js +130 -0
  312. package/dist/web/hooks/use-tool-info.test.js.map +1 -0
  313. package/dist/web/hooks/use-user.d.ts +20 -0
  314. package/dist/web/hooks/use-user.js +37 -0
  315. package/dist/web/hooks/use-user.js.map +1 -0
  316. package/dist/web/hooks/use-user.test.d.ts +1 -0
  317. package/dist/web/hooks/use-user.test.js +122 -0
  318. package/dist/web/hooks/use-user.test.js.map +1 -0
  319. package/dist/web/hooks/use-view-state.d.ts +25 -0
  320. package/dist/web/hooks/use-view-state.js +32 -0
  321. package/dist/web/hooks/use-view-state.js.map +1 -0
  322. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  323. package/dist/web/hooks/use-view-state.test.js +177 -0
  324. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  325. package/dist/web/index.d.ts +7 -0
  326. package/dist/web/index.js +8 -0
  327. package/dist/web/index.js.map +1 -0
  328. package/dist/web/mount-view.d.ts +20 -0
  329. package/dist/web/mount-view.js +46 -0
  330. package/dist/web/mount-view.js.map +1 -0
  331. package/dist/web/plugin/data-llm.test.d.ts +1 -0
  332. package/dist/web/plugin/data-llm.test.js +81 -0
  333. package/dist/web/plugin/data-llm.test.js.map +1 -0
  334. package/dist/web/plugin/plugin.d.ts +33 -0
  335. package/dist/web/plugin/plugin.js +189 -0
  336. package/dist/web/plugin/plugin.js.map +1 -0
  337. package/dist/web/plugin/scan-views.d.ts +16 -0
  338. package/dist/web/plugin/scan-views.js +88 -0
  339. package/dist/web/plugin/scan-views.js.map +1 -0
  340. package/dist/web/plugin/scan-views.test.d.ts +1 -0
  341. package/dist/web/plugin/scan-views.test.js +99 -0
  342. package/dist/web/plugin/scan-views.test.js.map +1 -0
  343. package/dist/web/plugin/transform-data-llm.d.ts +12 -0
  344. package/dist/web/plugin/transform-data-llm.js +96 -0
  345. package/dist/web/plugin/transform-data-llm.js.map +1 -0
  346. package/dist/web/plugin/transform-data-llm.test.d.ts +1 -0
  347. package/dist/web/plugin/transform-data-llm.test.js +81 -0
  348. package/dist/web/plugin/transform-data-llm.test.js.map +1 -0
  349. package/dist/web/plugin/validate-view.d.ts +1 -0
  350. package/dist/web/plugin/validate-view.js +9 -0
  351. package/dist/web/plugin/validate-view.js.map +1 -0
  352. package/dist/web/plugin/validate-view.test.d.ts +1 -0
  353. package/dist/web/plugin/validate-view.test.js +24 -0
  354. package/dist/web/plugin/validate-view.test.js.map +1 -0
  355. package/dist/web/proxy.d.ts +1 -0
  356. package/dist/web/proxy.js +52 -0
  357. package/dist/web/proxy.js.map +1 -0
  358. package/dist/web/types.d.ts +20 -0
  359. package/dist/web/types.js +2 -0
  360. package/dist/web/types.js.map +1 -0
  361. package/package.json +87 -36
  362. package/tsconfig.base.json +33 -0
  363. package/dist/src/server/index.d.ts +0 -2
  364. package/dist/src/server/index.js +0 -3
  365. package/dist/src/server/index.js.map +0 -1
  366. package/dist/src/server/server.d.ts +0 -13
  367. package/dist/src/server/server.js +0 -54
  368. package/dist/src/server/server.js.map +0 -1
  369. package/dist/src/server/templateHelper.js +0 -29
  370. package/dist/src/server/templateHelper.js.map +0 -1
  371. package/dist/src/server/templates/development.hbs +0 -12
  372. package/dist/src/server/templates/production.hbs +0 -6
  373. package/dist/src/server/widgetsDevServer.d.ts +0 -12
  374. package/dist/src/server/widgetsDevServer.js +0 -39
  375. package/dist/src/server/widgetsDevServer.js.map +0 -1
  376. package/dist/src/test/setup.js +0 -9
  377. package/dist/src/test/setup.js.map +0 -1
  378. package/dist/src/test/utils.d.ts +0 -28
  379. package/dist/src/test/utils.js +0 -43
  380. package/dist/src/test/utils.js.map +0 -1
  381. package/dist/src/test/widget.test.js +0 -90
  382. package/dist/src/test/widget.test.js.map +0 -1
  383. package/dist/src/web/hooks/index.d.ts +0 -13
  384. package/dist/src/web/hooks/index.js +0 -14
  385. package/dist/src/web/hooks/index.js.map +0 -1
  386. package/dist/src/web/hooks/use-call-tool.d.ts +0 -54
  387. package/dist/src/web/hooks/use-call-tool.js +0 -44
  388. package/dist/src/web/hooks/use-call-tool.js.map +0 -1
  389. package/dist/src/web/hooks/use-call-tool.test.js +0 -66
  390. package/dist/src/web/hooks/use-call-tool.test.js.map +0 -1
  391. package/dist/src/web/hooks/use-display-mode.d.ts +0 -4
  392. package/dist/src/web/hooks/use-display-mode.js +0 -7
  393. package/dist/src/web/hooks/use-display-mode.js.map +0 -1
  394. package/dist/src/web/hooks/use-display-mode.test.js.map +0 -1
  395. package/dist/src/web/hooks/use-locale.d.ts +0 -1
  396. package/dist/src/web/hooks/use-locale.js +0 -5
  397. package/dist/src/web/hooks/use-locale.js.map +0 -1
  398. package/dist/src/web/hooks/use-locale.test.js +0 -21
  399. package/dist/src/web/hooks/use-locale.test.js.map +0 -1
  400. package/dist/src/web/hooks/use-open-external.d.ts +0 -1
  401. package/dist/src/web/hooks/use-open-external.js +0 -6
  402. package/dist/src/web/hooks/use-open-external.js.map +0 -1
  403. package/dist/src/web/hooks/use-open-external.test.js +0 -24
  404. package/dist/src/web/hooks/use-open-external.test.js.map +0 -1
  405. package/dist/src/web/hooks/use-openai-global.d.ts +0 -2
  406. package/dist/src/web/hooks/use-openai-global.js +0 -23
  407. package/dist/src/web/hooks/use-openai-global.js.map +0 -1
  408. package/dist/src/web/hooks/use-request-modal.d.ts +0 -5
  409. package/dist/src/web/hooks/use-request-modal.js +0 -9
  410. package/dist/src/web/hooks/use-request-modal.js.map +0 -1
  411. package/dist/src/web/hooks/use-request-modal.test.js +0 -24
  412. package/dist/src/web/hooks/use-request-modal.test.js.map +0 -1
  413. package/dist/src/web/hooks/use-send-follow-up-message.d.ts +0 -1
  414. package/dist/src/web/hooks/use-send-follow-up-message.js +0 -11
  415. package/dist/src/web/hooks/use-send-follow-up-message.js.map +0 -1
  416. package/dist/src/web/hooks/use-theme.d.ts +0 -1
  417. package/dist/src/web/hooks/use-theme.js +0 -5
  418. package/dist/src/web/hooks/use-theme.js.map +0 -1
  419. package/dist/src/web/hooks/use-theme.test.js +0 -26
  420. package/dist/src/web/hooks/use-theme.test.js.map +0 -1
  421. package/dist/src/web/hooks/use-tool-info.d.ts +0 -7
  422. package/dist/src/web/hooks/use-tool-info.js +0 -9
  423. package/dist/src/web/hooks/use-tool-info.js.map +0 -1
  424. package/dist/src/web/hooks/use-tool-info.test.js +0 -38
  425. package/dist/src/web/hooks/use-tool-info.test.js.map +0 -1
  426. package/dist/src/web/hooks/use-tool-output.d.ts +0 -6
  427. package/dist/src/web/hooks/use-tool-output.js +0 -9
  428. package/dist/src/web/hooks/use-tool-output.js.map +0 -1
  429. package/dist/src/web/hooks/use-tool-response-metadata.d.ts +0 -4
  430. package/dist/src/web/hooks/use-tool-response-metadata.js +0 -8
  431. package/dist/src/web/hooks/use-tool-response-metadata.js.map +0 -1
  432. package/dist/src/web/hooks/use-user-agent.d.ts +0 -1
  433. package/dist/src/web/hooks/use-user-agent.js +0 -5
  434. package/dist/src/web/hooks/use-user-agent.js.map +0 -1
  435. package/dist/src/web/hooks/use-user-agent.test.js +0 -31
  436. package/dist/src/web/hooks/use-user-agent.test.js.map +0 -1
  437. package/dist/src/web/hooks/use-widget-state.d.ts +0 -4
  438. package/dist/src/web/hooks/use-widget-state.js +0 -30
  439. package/dist/src/web/hooks/use-widget-state.js.map +0 -1
  440. package/dist/src/web/hooks/use-widget-state.test.js +0 -61
  441. package/dist/src/web/hooks/use-widget-state.test.js.map +0 -1
  442. package/dist/src/web/index.d.ts +0 -4
  443. package/dist/src/web/index.js +0 -5
  444. package/dist/src/web/index.js.map +0 -1
  445. package/dist/src/web/mount-widget.d.ts +0 -1
  446. package/dist/src/web/mount-widget.js +0 -14
  447. package/dist/src/web/mount-widget.js.map +0 -1
  448. package/dist/src/web/plugin.d.ts +0 -2
  449. package/dist/src/web/plugin.js +0 -28
  450. package/dist/src/web/plugin.js.map +0 -1
  451. package/dist/src/web/types.d.ts +0 -111
  452. package/dist/src/web/types.js.map +0 -1
  453. package/dist/vitest.config.d.ts +0 -2
  454. package/dist/vitest.config.js +0 -9
  455. package/dist/vitest.config.js.map +0 -1
  456. /package/dist/{src/test/setup.d.ts → cli/build-helpers.test.d.ts} +0 -0
  457. /package/dist/{src/test/widget.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  458. /package/dist/{src/web/hooks/use-call-tool.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
  459. /package/dist/{src/web/hooks/use-display-mode.test.d.ts → cli/tunnel.test.d.ts} +0 -0
  460. /package/dist/{src/web/hooks/use-locale.test.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
  461. /package/dist/{src/web/hooks/use-open-external.test.d.ts → server/build-manifest.test.d.ts} +0 -0
  462. /package/dist/{src/web/hooks/use-request-modal.test.d.ts → server/content-helpers.test.d.ts} +0 -0
  463. /package/dist/{src/web/hooks/use-theme.test.d.ts → server/express.test.d.ts} +0 -0
  464. /package/dist/{src/web/hooks/use-tool-info.test.d.ts → server/middleware.test-d.d.ts} +0 -0
  465. /package/dist/{src/web/hooks/use-user-agent.test.d.ts → server/middleware.test.d.ts} +0 -0
  466. /package/dist/{src/web/hooks/use-widget-state.test.d.ts → server/tunnel-proxy-router.test.d.ts} +0 -0
  467. /package/dist/{src/web → web/bridges/apps-sdk}/types.js +0 -0
@@ -0,0 +1,75 @@
1
+ import { fireEvent } from "@testing-library/react";
2
+ import { act } from "react";
3
+ import { vi } from "vitest";
4
+ export class MockResizeObserver {
5
+ observe() { }
6
+ unobserve() { }
7
+ disconnect() { }
8
+ }
9
+ const DEFAULT_CONTEXT = {};
10
+ export const getMcpAppHostPostMessageMock = (initialContext = DEFAULT_CONTEXT, options = {}) => vi.fn((message) => {
11
+ switch (message.method) {
12
+ case "ui/initialize": {
13
+ const result = {
14
+ protocolVersion: "2025-06-18",
15
+ hostInfo: { name: "test-host", version: "1.0.0" },
16
+ hostCapabilities: options.hostCapabilities ?? {},
17
+ hostContext: initialContext,
18
+ };
19
+ act(() => fireEvent(window, new MessageEvent("message", {
20
+ source: window.parent,
21
+ data: {
22
+ jsonrpc: "2.0",
23
+ id: message.id,
24
+ result,
25
+ },
26
+ })));
27
+ break;
28
+ }
29
+ case "ui/update-model-context": {
30
+ act(() => fireEvent(window, new MessageEvent("message", {
31
+ source: window.parent,
32
+ data: {
33
+ jsonrpc: "2.0",
34
+ id: message.id,
35
+ result: {},
36
+ },
37
+ })));
38
+ break;
39
+ }
40
+ case "ui/download-file": {
41
+ act(() => fireEvent(window, new MessageEvent("message", {
42
+ source: window.parent,
43
+ data: {
44
+ jsonrpc: "2.0",
45
+ id: message.id,
46
+ result: options.downloadFileResult ?? {},
47
+ },
48
+ })));
49
+ break;
50
+ }
51
+ }
52
+ });
53
+ export const fireToolInputNotification = (args) => {
54
+ fireEvent(window, new MessageEvent("message", {
55
+ source: window.parent,
56
+ data: {
57
+ jsonrpc: "2.0",
58
+ method: "ui/notifications/tool-input",
59
+ params: {
60
+ arguments: args,
61
+ },
62
+ },
63
+ }));
64
+ };
65
+ export const fireToolResultNotification = (params) => {
66
+ fireEvent(window, new MessageEvent("message", {
67
+ source: window.parent,
68
+ data: {
69
+ jsonrpc: "2.0",
70
+ method: "ui/notifications/tool-result",
71
+ params,
72
+ },
73
+ }));
74
+ };
75
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/web/hooks/test/utils.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B,MAAM,OAAO,kBAAkB;IAC7B,OAAO,KAAU,CAAC;IAClB,SAAS,KAAU,CAAC;IACpB,UAAU,KAAU,CAAC;CACtB;AAED,MAAM,eAAe,GAAqB,EAAE,CAAC;AAO7C,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,iBAAmC,eAAe,EAClD,UAAiC,EAAE,EACnC,EAAE,CACF,EAAE,CAAC,EAAE,CAAC,CAAC,OAAuC,EAAE,EAAE;IAChD,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,MAAM,GAA0B;gBACpC,eAAe,EAAE,YAAY;gBAC7B,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE;gBACjD,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,EAAE;gBAChD,WAAW,EAAE,cAAc;aAC5B,CAAC;YACF,GAAG,CAAC,GAAG,EAAE,CACP,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CAIb,SAAS,EAAE;gBACZ,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,IAAI,EAAE;oBACJ,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,MAAM;iBACP;aACF,CAAC,CACH,CACF,CAAC;YACF,MAAM;QACR,CAAC;QACD,KAAK,yBAAyB,CAAC,CAAC,CAAC;YAC/B,GAAG,CAAC,GAAG,EAAE,CACP,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CACd,SAAS,EACT;gBACE,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,IAAI,EAAE;oBACJ,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,MAAM,EAAE,EAAE;iBACX;aACF,CACF,CACF,CACF,CAAC;YACF,MAAM;QACR,CAAC;QACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,GAAG,CAAC,GAAG,EAAE,CACP,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CAIb,SAAS,EAAE;gBACZ,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,IAAI,EAAE;oBACJ,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,MAAM,EAAE,OAAO,CAAC,kBAAkB,IAAI,EAAE;iBACzC;aACF,CAAC,CACH,CACF,CAAC;YACF,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,IAA6B,EAAE,EAAE;IACzE,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CACd,SAAS,EACT;QACE,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,6BAA6B;YACrC,MAAM,EAAE;gBACN,SAAS,EAAE,IAAI;aAChB;SACF;KACF,CACF,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,MAI1C,EAAE,EAAE;IACH,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CACd,SAAS,EACT;QACE,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,8BAA8B;YACtC,MAAM;SACP;KACF,CACF,CACF,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type {\n McpUiDownloadFileResult,\n McpUiHostCapabilities,\n McpUiHostContext,\n McpUiInitializeResult,\n McpUiToolInputNotification,\n McpUiToolResultNotification,\n} from \"@modelcontextprotocol/ext-apps\";\nimport { fireEvent } from \"@testing-library/react\";\nimport { act } from \"react\";\nimport { vi } from \"vitest\";\n\nexport class MockResizeObserver {\n observe(): void {}\n unobserve(): void {}\n disconnect(): void {}\n}\n\nconst DEFAULT_CONTEXT: McpUiHostContext = {};\n\nexport type McpAppHostMockOptions = {\n hostCapabilities?: McpUiHostCapabilities;\n downloadFileResult?: McpUiDownloadFileResult;\n};\n\nexport const getMcpAppHostPostMessageMock = (\n initialContext: McpUiHostContext = DEFAULT_CONTEXT,\n options: McpAppHostMockOptions = {},\n) =>\n vi.fn((message: { method: string; id: number }) => {\n switch (message.method) {\n case \"ui/initialize\": {\n const result: McpUiInitializeResult = {\n protocolVersion: \"2025-06-18\",\n hostInfo: { name: \"test-host\", version: \"1.0.0\" },\n hostCapabilities: options.hostCapabilities ?? {},\n hostContext: initialContext,\n };\n act(() =>\n fireEvent(\n window,\n new MessageEvent<{\n jsonrpc: \"2.0\";\n id: number;\n result: McpUiInitializeResult;\n }>(\"message\", {\n source: window.parent,\n data: {\n jsonrpc: \"2.0\",\n id: message.id,\n result,\n },\n }),\n ),\n );\n break;\n }\n case \"ui/update-model-context\": {\n act(() =>\n fireEvent(\n window,\n new MessageEvent<{ jsonrpc: \"2.0\"; id: number; result: unknown }>(\n \"message\",\n {\n source: window.parent,\n data: {\n jsonrpc: \"2.0\",\n id: message.id,\n result: {},\n },\n },\n ),\n ),\n );\n break;\n }\n case \"ui/download-file\": {\n act(() =>\n fireEvent(\n window,\n new MessageEvent<{\n jsonrpc: \"2.0\";\n id: number;\n result: McpUiDownloadFileResult;\n }>(\"message\", {\n source: window.parent,\n data: {\n jsonrpc: \"2.0\",\n id: message.id,\n result: options.downloadFileResult ?? {},\n },\n }),\n ),\n );\n break;\n }\n }\n });\n\nexport const fireToolInputNotification = (args: Record<string, unknown>) => {\n fireEvent(\n window,\n new MessageEvent<McpUiToolInputNotification & { jsonrpc: \"2.0\" }>(\n \"message\",\n {\n source: window.parent,\n data: {\n jsonrpc: \"2.0\",\n method: \"ui/notifications/tool-input\",\n params: {\n arguments: args,\n },\n },\n },\n ),\n );\n};\n\nexport const fireToolResultNotification = (params: {\n content: McpUiToolResultNotification[\"params\"][\"content\"];\n structuredContent: Record<string, unknown>;\n _meta?: Record<string, unknown>;\n}) => {\n fireEvent(\n window,\n new MessageEvent<McpUiToolResultNotification & { jsonrpc: \"2.0\" }>(\n \"message\",\n {\n source: window.parent,\n data: {\n jsonrpc: \"2.0\",\n method: \"ui/notifications/tool-result\",\n params,\n },\n },\n ),\n );\n};\n"]}
@@ -0,0 +1,146 @@
1
+ import { type CallToolArgs, type CallToolResponse } from "../bridges/index.js";
2
+ import type { HasRequiredKeys } from "../types.js";
3
+ type CallToolIdleState = {
4
+ status: "idle";
5
+ isIdle: true;
6
+ isPending: false;
7
+ isSuccess: false;
8
+ isError: false;
9
+ data: undefined;
10
+ error: undefined;
11
+ };
12
+ type CallToolPendingState = {
13
+ status: "pending";
14
+ isIdle: false;
15
+ isPending: true;
16
+ isSuccess: false;
17
+ isError: false;
18
+ data: undefined;
19
+ error: undefined;
20
+ };
21
+ type CallToolSuccessState<TData extends CallToolResponse = CallToolResponse> = {
22
+ status: "success";
23
+ isIdle: false;
24
+ isPending: false;
25
+ isSuccess: true;
26
+ isError: false;
27
+ data: TData;
28
+ error: undefined;
29
+ };
30
+ type CallToolErrorState = {
31
+ status: "error";
32
+ isIdle: false;
33
+ isPending: false;
34
+ isSuccess: false;
35
+ isError: true;
36
+ data: undefined;
37
+ error: unknown;
38
+ };
39
+ /**
40
+ * State of a {@link useCallTool} invocation, discriminated by `status`.
41
+ * Use `isIdle` / `isPending` / `isSuccess` / `isError` for ergonomic conditional rendering.
42
+ */
43
+ export type CallToolState<TData extends CallToolResponse = CallToolResponse> = CallToolIdleState | CallToolPendingState | CallToolSuccessState<TData> | CallToolErrorState;
44
+ /**
45
+ * Optional callbacks fired around a {@link useCallTool} call.
46
+ * `onSettled` runs after success or error.
47
+ */
48
+ export type SideEffects<ToolArgs, ToolResponse> = {
49
+ onSuccess?: (data: ToolResponse, toolArgs: ToolArgs) => void;
50
+ onError?: (error: unknown, toolArgs: ToolArgs) => void;
51
+ onSettled?: (data: ToolResponse | undefined, error: unknown | undefined, toolArgs: ToolArgs) => void;
52
+ };
53
+ type IsArgsOptional<T> = [T] extends [null] ? true : HasRequiredKeys<T> extends false ? true : false;
54
+ /**
55
+ * Fire-and-forget call function returned by {@link useCallTool}. Tracks state
56
+ * on the hook and supports optional {@link SideEffects} callbacks. Args are
57
+ * optional when the tool accepts none.
58
+ */
59
+ export type CallToolFn<TArgs, TResponse> = IsArgsOptional<TArgs> extends true ? {
60
+ (): void;
61
+ (sideEffects: SideEffects<TArgs, TResponse>): void;
62
+ (args: TArgs): void;
63
+ (args: TArgs, sideEffects: SideEffects<TArgs, TResponse>): void;
64
+ } : {
65
+ (args: TArgs): void;
66
+ (args: TArgs, sideEffects: SideEffects<TArgs, TResponse>): void;
67
+ };
68
+ /**
69
+ * Promise-returning call function returned by {@link useCallTool}. Rejects
70
+ * if the tool errors; use `try/catch` for error handling.
71
+ */
72
+ export type CallToolAsyncFn<TArgs, TResponse> = IsArgsOptional<TArgs> extends true ? {
73
+ (): Promise<TResponse>;
74
+ (args: TArgs): Promise<TResponse>;
75
+ } : (args: TArgs) => Promise<TResponse>;
76
+ type ToolResponseSignature = Pick<CallToolResponse, "structuredContent" | "meta">;
77
+ /**
78
+ * Call a server tool from a view and track its execution state.
79
+ *
80
+ * Returns the current {@link CallToolState} plus two callers: `callTool`
81
+ * (fire-and-forget, with optional {@link SideEffects}) and `callToolAsync`
82
+ * (promise-returning). If the same instance is invoked again while a call is
83
+ * in flight, the older response is dropped from the rendered state (but any
84
+ * `onSuccess` / `onError` / `onSettled` callbacks attached to it still fire).
85
+ *
86
+ * Pair with {@link useToolInfo} to read the result of the tool invocation
87
+ * that produced the current view. For end-to-end type safety across tool
88
+ * inputs and outputs, prefer the typed helpers produced by {@link generateHelpers}
89
+ * over calling this hook directly.
90
+ *
91
+ * @typeParam ToolArgs - Shape of the tool's input args (`null` for no-arg tools).
92
+ * @typeParam ToolResponse - Shape of the tool's `structuredContent` / `meta`.
93
+ *
94
+ * @example
95
+ * ```tsx
96
+ * const { callTool, isPending, data } = useCallTool<{ query: string }>("search");
97
+ *
98
+ * <button onClick={() => callTool({ query: "skybridge" }, {
99
+ * onSuccess: (res) => console.log(res.structuredContent),
100
+ * })} />
101
+ * ```
102
+ *
103
+ * @see https://docs.skybridge.tech/api-reference/use-call-tool
104
+ */
105
+ export declare const useCallTool: <ToolArgs extends CallToolArgs = null, ToolResponse extends Partial<ToolResponseSignature> = Record<string, never>>(name: string) => {
106
+ callTool: CallToolFn<ToolArgs, CallToolResponse & ToolResponse>;
107
+ callToolAsync: CallToolAsyncFn<ToolArgs, CallToolResponse & ToolResponse>;
108
+ status: "idle";
109
+ isIdle: true;
110
+ isPending: false;
111
+ isSuccess: false;
112
+ isError: false;
113
+ data: undefined;
114
+ error: undefined;
115
+ } | {
116
+ callTool: CallToolFn<ToolArgs, CallToolResponse & ToolResponse>;
117
+ callToolAsync: CallToolAsyncFn<ToolArgs, CallToolResponse & ToolResponse>;
118
+ status: "pending";
119
+ isIdle: false;
120
+ isPending: true;
121
+ isSuccess: false;
122
+ isError: false;
123
+ data: undefined;
124
+ error: undefined;
125
+ } | {
126
+ callTool: CallToolFn<ToolArgs, CallToolResponse & ToolResponse>;
127
+ callToolAsync: CallToolAsyncFn<ToolArgs, CallToolResponse & ToolResponse>;
128
+ status: "error";
129
+ isIdle: false;
130
+ isPending: false;
131
+ isSuccess: false;
132
+ isError: true;
133
+ data: undefined;
134
+ error: unknown;
135
+ } | {
136
+ callTool: CallToolFn<ToolArgs, CallToolResponse & ToolResponse>;
137
+ callToolAsync: CallToolAsyncFn<ToolArgs, CallToolResponse & ToolResponse>;
138
+ status: "success";
139
+ isIdle: false;
140
+ isPending: false;
141
+ isSuccess: true;
142
+ isError: false;
143
+ data: CallToolResponse & ToolResponse;
144
+ error: undefined;
145
+ };
146
+ export {};
@@ -0,0 +1,96 @@
1
+ import { useRef, useState } from "react";
2
+ import { getAdaptor, } from "../bridges/index.js";
3
+ /**
4
+ * Call a server tool from a view and track its execution state.
5
+ *
6
+ * Returns the current {@link CallToolState} plus two callers: `callTool`
7
+ * (fire-and-forget, with optional {@link SideEffects}) and `callToolAsync`
8
+ * (promise-returning). If the same instance is invoked again while a call is
9
+ * in flight, the older response is dropped from the rendered state (but any
10
+ * `onSuccess` / `onError` / `onSettled` callbacks attached to it still fire).
11
+ *
12
+ * Pair with {@link useToolInfo} to read the result of the tool invocation
13
+ * that produced the current view. For end-to-end type safety across tool
14
+ * inputs and outputs, prefer the typed helpers produced by {@link generateHelpers}
15
+ * over calling this hook directly.
16
+ *
17
+ * @typeParam ToolArgs - Shape of the tool's input args (`null` for no-arg tools).
18
+ * @typeParam ToolResponse - Shape of the tool's `structuredContent` / `meta`.
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * const { callTool, isPending, data } = useCallTool<{ query: string }>("search");
23
+ *
24
+ * <button onClick={() => callTool({ query: "skybridge" }, {
25
+ * onSuccess: (res) => console.log(res.structuredContent),
26
+ * })} />
27
+ * ```
28
+ *
29
+ * @see https://docs.skybridge.tech/api-reference/use-call-tool
30
+ */
31
+ export const useCallTool = (name) => {
32
+ const [{ status, data, error }, setCallToolState] = useState({ status: "idle", data: undefined, error: undefined });
33
+ const callIdRef = useRef(0);
34
+ const adaptor = getAdaptor();
35
+ const execute = async (toolArgs) => {
36
+ const callId = ++callIdRef.current;
37
+ setCallToolState({ status: "pending", data: undefined, error: undefined });
38
+ try {
39
+ const data = await adaptor.callTool(name, toolArgs);
40
+ if (callId === callIdRef.current) {
41
+ setCallToolState({ status: "success", data, error: undefined });
42
+ }
43
+ return data;
44
+ }
45
+ catch (error) {
46
+ if (callId === callIdRef.current) {
47
+ setCallToolState({ status: "error", data: undefined, error });
48
+ }
49
+ throw error;
50
+ }
51
+ };
52
+ const callToolAsync = ((toolArgs) => {
53
+ if (toolArgs === undefined) {
54
+ return execute(null);
55
+ }
56
+ return execute(toolArgs);
57
+ });
58
+ const callTool = ((firstArg, sideEffects) => {
59
+ let toolArgs;
60
+ if (firstArg &&
61
+ typeof firstArg === "object" &&
62
+ ("onSuccess" in firstArg ||
63
+ "onError" in firstArg ||
64
+ "onSettled" in firstArg)) {
65
+ toolArgs = null; // no toolArgs provided
66
+ sideEffects = firstArg;
67
+ }
68
+ else {
69
+ toolArgs = (firstArg === undefined ? null : firstArg);
70
+ }
71
+ execute(toolArgs)
72
+ .then((data) => {
73
+ sideEffects?.onSuccess?.(data, toolArgs);
74
+ sideEffects?.onSettled?.(data, undefined, toolArgs);
75
+ })
76
+ .catch((error) => {
77
+ sideEffects?.onError?.(error, toolArgs);
78
+ sideEffects?.onSettled?.(undefined, error, toolArgs);
79
+ });
80
+ });
81
+ const callToolState = {
82
+ status,
83
+ data,
84
+ error,
85
+ isIdle: status === "idle",
86
+ isPending: status === "pending",
87
+ isSuccess: status === "success",
88
+ isError: status === "error",
89
+ };
90
+ return {
91
+ ...callToolState,
92
+ callTool,
93
+ callToolAsync,
94
+ };
95
+ };
96
+ //# sourceMappingURL=use-call-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-call-tool.js","sourceRoot":"","sources":["../../../src/web/hooks/use-call-tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { useRef, useState } from \"react\";\n\nimport {\n type CallToolArgs,\n type CallToolResponse,\n getAdaptor,\n} from \"../bridges/index.js\";\nimport type { HasRequiredKeys } from \"../types.js\";\n\ntype CallToolIdleState = {\n status: \"idle\";\n isIdle: true;\n isPending: false;\n isSuccess: false;\n isError: false;\n data: undefined;\n error: undefined;\n};\n\ntype CallToolPendingState = {\n status: \"pending\";\n isIdle: false;\n isPending: true;\n isSuccess: false;\n isError: false;\n data: undefined;\n error: undefined;\n};\n\ntype CallToolSuccessState<TData extends CallToolResponse = CallToolResponse> = {\n status: \"success\";\n isIdle: false;\n isPending: false;\n isSuccess: true;\n isError: false;\n data: TData;\n error: undefined;\n};\n\ntype CallToolErrorState = {\n status: \"error\";\n isIdle: false;\n isPending: false;\n isSuccess: false;\n isError: true;\n data: undefined;\n error: unknown;\n};\n\n/**\n * State of a {@link useCallTool} invocation, discriminated by `status`.\n * Use `isIdle` / `isPending` / `isSuccess` / `isError` for ergonomic conditional rendering.\n */\nexport type CallToolState<TData extends CallToolResponse = CallToolResponse> =\n | CallToolIdleState\n | CallToolPendingState\n | CallToolSuccessState<TData>\n | CallToolErrorState;\n\n/**\n * Optional callbacks fired around a {@link useCallTool} call.\n * `onSettled` runs after success or error.\n */\nexport type SideEffects<ToolArgs, ToolResponse> = {\n onSuccess?: (data: ToolResponse, toolArgs: ToolArgs) => void;\n onError?: (error: unknown, toolArgs: ToolArgs) => void;\n onSettled?: (\n data: ToolResponse | undefined,\n error: unknown | undefined,\n toolArgs: ToolArgs,\n ) => void;\n};\n\ntype IsArgsOptional<T> = [T] extends [null]\n ? true\n : HasRequiredKeys<T> extends false\n ? true\n : false;\n\n/**\n * Fire-and-forget call function returned by {@link useCallTool}. Tracks state\n * on the hook and supports optional {@link SideEffects} callbacks. Args are\n * optional when the tool accepts none.\n */\nexport type CallToolFn<TArgs, TResponse> =\n IsArgsOptional<TArgs> extends true\n ? {\n (): void;\n (sideEffects: SideEffects<TArgs, TResponse>): void;\n (args: TArgs): void;\n (args: TArgs, sideEffects: SideEffects<TArgs, TResponse>): void;\n }\n : {\n (args: TArgs): void;\n (args: TArgs, sideEffects: SideEffects<TArgs, TResponse>): void;\n };\n\n/**\n * Promise-returning call function returned by {@link useCallTool}. Rejects\n * if the tool errors; use `try/catch` for error handling.\n */\nexport type CallToolAsyncFn<TArgs, TResponse> =\n IsArgsOptional<TArgs> extends true\n ? {\n (): Promise<TResponse>;\n (args: TArgs): Promise<TResponse>;\n }\n : (args: TArgs) => Promise<TResponse>;\n\ntype ToolResponseSignature = Pick<\n CallToolResponse,\n \"structuredContent\" | \"meta\"\n>;\n\n/**\n * Call a server tool from a view and track its execution state.\n *\n * Returns the current {@link CallToolState} plus two callers: `callTool`\n * (fire-and-forget, with optional {@link SideEffects}) and `callToolAsync`\n * (promise-returning). If the same instance is invoked again while a call is\n * in flight, the older response is dropped from the rendered state (but any\n * `onSuccess` / `onError` / `onSettled` callbacks attached to it still fire).\n *\n * Pair with {@link useToolInfo} to read the result of the tool invocation\n * that produced the current view. For end-to-end type safety across tool\n * inputs and outputs, prefer the typed helpers produced by {@link generateHelpers}\n * over calling this hook directly.\n *\n * @typeParam ToolArgs - Shape of the tool's input args (`null` for no-arg tools).\n * @typeParam ToolResponse - Shape of the tool's `structuredContent` / `meta`.\n *\n * @example\n * ```tsx\n * const { callTool, isPending, data } = useCallTool<{ query: string }>(\"search\");\n *\n * <button onClick={() => callTool({ query: \"skybridge\" }, {\n * onSuccess: (res) => console.log(res.structuredContent),\n * })} />\n * ```\n *\n * @see https://docs.skybridge.tech/api-reference/use-call-tool\n */\nexport const useCallTool = <\n ToolArgs extends CallToolArgs = null,\n ToolResponse extends Partial<ToolResponseSignature> = Record<string, never>,\n>(\n name: string,\n) => {\n type CombinedCallToolResponse = CallToolResponse & ToolResponse;\n\n const [{ status, data, error }, setCallToolState] = useState<\n Omit<\n CallToolState<CombinedCallToolResponse>,\n \"isIdle\" | \"isPending\" | \"isSuccess\" | \"isError\"\n >\n >({ status: \"idle\", data: undefined, error: undefined });\n\n const callIdRef = useRef(0);\n const adaptor = getAdaptor();\n\n const execute = async (\n toolArgs: ToolArgs,\n ): Promise<CombinedCallToolResponse> => {\n const callId = ++callIdRef.current;\n setCallToolState({ status: \"pending\", data: undefined, error: undefined });\n\n try {\n const data = await adaptor.callTool<ToolArgs, CombinedCallToolResponse>(\n name,\n toolArgs,\n );\n if (callId === callIdRef.current) {\n setCallToolState({ status: \"success\", data, error: undefined });\n }\n\n return data;\n } catch (error) {\n if (callId === callIdRef.current) {\n setCallToolState({ status: \"error\", data: undefined, error });\n }\n throw error;\n }\n };\n\n const callToolAsync = ((toolArgs?: ToolArgs) => {\n if (toolArgs === undefined) {\n return execute(null as ToolArgs);\n }\n return execute(toolArgs);\n }) as CallToolAsyncFn<ToolArgs, CombinedCallToolResponse>;\n\n const callTool = ((\n firstArg?: ToolArgs | SideEffects<ToolArgs, CombinedCallToolResponse>,\n sideEffects?: SideEffects<ToolArgs, CombinedCallToolResponse>,\n ) => {\n let toolArgs: ToolArgs;\n if (\n firstArg &&\n typeof firstArg === \"object\" &&\n (\"onSuccess\" in firstArg ||\n \"onError\" in firstArg ||\n \"onSettled\" in firstArg)\n ) {\n toolArgs = null as ToolArgs; // no toolArgs provided\n sideEffects = firstArg;\n } else {\n toolArgs = (firstArg === undefined ? null : firstArg) as ToolArgs;\n }\n\n execute(toolArgs)\n .then((data) => {\n sideEffects?.onSuccess?.(data, toolArgs);\n sideEffects?.onSettled?.(data, undefined, toolArgs);\n })\n .catch((error) => {\n sideEffects?.onError?.(error, toolArgs);\n sideEffects?.onSettled?.(undefined, error, toolArgs);\n });\n }) as CallToolFn<ToolArgs, CombinedCallToolResponse>;\n\n const callToolState = {\n status,\n data,\n error,\n isIdle: status === \"idle\",\n isPending: status === \"pending\",\n isSuccess: status === \"success\",\n isError: status === \"error\",\n } as CallToolState<CombinedCallToolResponse>;\n\n return {\n ...callToolState,\n callTool,\n callToolAsync,\n };\n};\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,104 @@
1
+ import { expectTypeOf, test } from "vitest";
2
+ import { useCallTool, } from "./use-call-tool.js";
3
+ test("callTool can be called without args when ToolArgs is null", () => {
4
+ const { callTool, callToolAsync } = useCallTool("test-tool");
5
+ callTool();
6
+ callTool({ onSuccess: () => { } });
7
+ callToolAsync();
8
+ });
9
+ test("callTool requires args when ToolArgs has required properties", () => {
10
+ const { callTool, callToolAsync } = useCallTool("test-tool");
11
+ // @ts-expect-error - query is required
12
+ callTool();
13
+ callTool({ query: "test" });
14
+ callTool({ query: "test" }, { onSuccess: () => { } });
15
+ // @ts-expect-error - query is required
16
+ callToolAsync();
17
+ callToolAsync({ query: "test" });
18
+ });
19
+ test("callTool supports sideEffects with correct types", () => {
20
+ const { callTool } = useCallTool("test-tool");
21
+ callTool({ id: 1 }, {
22
+ onSuccess: (data, args) => {
23
+ expectTypeOf(data.structuredContent.result).toBeString();
24
+ expectTypeOf(args.id).toBeNumber();
25
+ },
26
+ onError: (error, args) => {
27
+ expectTypeOf(error).toBeUnknown();
28
+ expectTypeOf(args.id).toBeNumber();
29
+ },
30
+ onSettled: (data, error, args) => {
31
+ if (data) {
32
+ expectTypeOf(data.structuredContent.result).toBeString();
33
+ }
34
+ expectTypeOf(error).toEqualTypeOf();
35
+ expectTypeOf(args.id).toBeNumber();
36
+ },
37
+ });
38
+ });
39
+ test("callTool allows sideEffects as first arg when ToolArgs is null", () => {
40
+ const { callTool } = useCallTool("test-tool");
41
+ callTool({
42
+ onSuccess: (data) => {
43
+ expectTypeOf(data.structuredContent.value).toBeNumber();
44
+ },
45
+ });
46
+ });
47
+ test("callToolAsync returns correctly typed promise", () => {
48
+ const { callToolAsync } = useCallTool("test-tool");
49
+ const promise = callToolAsync({ name: "test" });
50
+ expectTypeOf(promise).resolves.toHaveProperty("structuredContent");
51
+ expectTypeOf(promise).resolves.toHaveProperty("meta");
52
+ });
53
+ test("state narrowing works correctly with status", () => {
54
+ const result = useCallTool("test-tool");
55
+ if (result.status === "idle") {
56
+ expectTypeOf(result.isIdle).toEqualTypeOf();
57
+ expectTypeOf(result.data).toEqualTypeOf();
58
+ }
59
+ if (result.status === "pending") {
60
+ expectTypeOf(result.isPending).toEqualTypeOf();
61
+ expectTypeOf(result.data).toEqualTypeOf();
62
+ }
63
+ if (result.status === "success") {
64
+ expectTypeOf(result.isSuccess).toEqualTypeOf();
65
+ expectTypeOf(result.data).not.toEqualTypeOf();
66
+ expectTypeOf(result.data.structuredContent.data).toBeString();
67
+ }
68
+ if (result.status === "error") {
69
+ expectTypeOf(result.isError).toEqualTypeOf();
70
+ expectTypeOf(result.error).toBeUnknown();
71
+ }
72
+ });
73
+ test("state narrowing works correctly with boolean flags", () => {
74
+ const result = useCallTool("test-tool");
75
+ if (result.isIdle) {
76
+ expectTypeOf(result.status).toEqualTypeOf();
77
+ }
78
+ if (result.isPending) {
79
+ expectTypeOf(result.status).toEqualTypeOf();
80
+ }
81
+ if (result.isSuccess) {
82
+ expectTypeOf(result.status).toEqualTypeOf();
83
+ expectTypeOf(result.data.structuredContent.items).toBeArray();
84
+ }
85
+ if (result.isError) {
86
+ expectTypeOf(result.status).toEqualTypeOf();
87
+ }
88
+ });
89
+ test("CallToolState type is correctly exported and usable", () => {
90
+ const state = {};
91
+ if (state.status === "success") {
92
+ expectTypeOf(state.data.structuredContent.foo).toBeString();
93
+ }
94
+ });
95
+ test("SideEffects type is correctly exported and usable", () => {
96
+ const sideEffects = {
97
+ onSuccess: (data, args) => {
98
+ expectTypeOf(data.structuredContent.y).toBeString();
99
+ expectTypeOf(args.x).toBeNumber();
100
+ },
101
+ };
102
+ expectTypeOf(sideEffects).toHaveProperty("onSuccess");
103
+ });
104
+ //# sourceMappingURL=use-call-tool.test-d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-call-tool.test-d.js","sourceRoot":"","sources":["../../../src/web/hooks/use-call-tool.test-d.ts"],"names":[],"mappings":"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","sourcesContent":["import { expectTypeOf, test } from \"vitest\";\nimport type { CallToolResponse } from \"../bridges/types.js\";\nimport {\n type CallToolState,\n type SideEffects,\n useCallTool,\n} from \"./use-call-tool.js\";\n\ntest(\"callTool can be called without args when ToolArgs is null\", () => {\n const { callTool, callToolAsync } = useCallTool<null>(\"test-tool\");\n callTool();\n callTool({ onSuccess: () => {} });\n callToolAsync();\n});\n\ntest(\"callTool requires args when ToolArgs has required properties\", () => {\n type Args = { query: string };\n const { callTool, callToolAsync } = useCallTool<Args>(\"test-tool\");\n\n // @ts-expect-error - query is required\n callTool();\n\n callTool({ query: \"test\" });\n callTool({ query: \"test\" }, { onSuccess: () => {} });\n\n // @ts-expect-error - query is required\n callToolAsync();\n callToolAsync({ query: \"test\" });\n});\n\ntest(\"callTool supports sideEffects with correct types\", () => {\n type Args = { id: number };\n type Response = { structuredContent: { result: string } };\n\n const { callTool } = useCallTool<Args, Response>(\"test-tool\");\n\n callTool(\n { id: 1 },\n {\n onSuccess: (data, args) => {\n expectTypeOf(data.structuredContent.result).toBeString();\n expectTypeOf(args.id).toBeNumber();\n },\n onError: (error, args) => {\n expectTypeOf(error).toBeUnknown();\n expectTypeOf(args.id).toBeNumber();\n },\n onSettled: (data, error, args) => {\n if (data) {\n expectTypeOf(data.structuredContent.result).toBeString();\n }\n expectTypeOf(error).toEqualTypeOf<unknown | undefined>();\n expectTypeOf(args.id).toBeNumber();\n },\n },\n );\n});\n\ntest(\"callTool allows sideEffects as first arg when ToolArgs is null\", () => {\n type Response = { structuredContent: { value: number } };\n const { callTool } = useCallTool<null, Response>(\"test-tool\");\n\n callTool({\n onSuccess: (data) => {\n expectTypeOf(data.structuredContent.value).toBeNumber();\n },\n });\n});\n\ntest(\"callToolAsync returns correctly typed promise\", () => {\n type Args = { name: string };\n type Response = {\n structuredContent: { greeting: string };\n meta: { id: number };\n };\n\n const { callToolAsync } = useCallTool<Args, Response>(\"test-tool\");\n\n const promise = callToolAsync({ name: \"test\" });\n\n expectTypeOf(promise).resolves.toHaveProperty(\"structuredContent\");\n expectTypeOf(promise).resolves.toHaveProperty(\"meta\");\n});\n\ntest(\"state narrowing works correctly with status\", () => {\n type Response = { structuredContent: { data: string } };\n const result = useCallTool<null, Response>(\"test-tool\");\n\n if (result.status === \"idle\") {\n expectTypeOf(result.isIdle).toEqualTypeOf<true>();\n expectTypeOf(result.data).toEqualTypeOf<undefined>();\n }\n\n if (result.status === \"pending\") {\n expectTypeOf(result.isPending).toEqualTypeOf<true>();\n expectTypeOf(result.data).toEqualTypeOf<undefined>();\n }\n\n if (result.status === \"success\") {\n expectTypeOf(result.isSuccess).toEqualTypeOf<true>();\n expectTypeOf(result.data).not.toEqualTypeOf<undefined>();\n expectTypeOf(result.data.structuredContent.data).toBeString();\n }\n\n if (result.status === \"error\") {\n expectTypeOf(result.isError).toEqualTypeOf<true>();\n expectTypeOf(result.error).toBeUnknown();\n }\n});\n\ntest(\"state narrowing works correctly with boolean flags\", () => {\n type Response = { structuredContent: { items: string[] } };\n const result = useCallTool<null, Response>(\"test-tool\");\n\n if (result.isIdle) {\n expectTypeOf(result.status).toEqualTypeOf<\"idle\">();\n }\n\n if (result.isPending) {\n expectTypeOf(result.status).toEqualTypeOf<\"pending\">();\n }\n\n if (result.isSuccess) {\n expectTypeOf(result.status).toEqualTypeOf<\"success\">();\n expectTypeOf(result.data.structuredContent.items).toBeArray();\n }\n\n if (result.isError) {\n expectTypeOf(result.status).toEqualTypeOf<\"error\">();\n }\n});\n\ntest(\"CallToolState type is correctly exported and usable\", () => {\n type Response = { structuredContent: { foo: string } };\n type MyState = CallToolState<CallToolResponse & Response>;\n\n const state: MyState = {} as MyState;\n\n if (state.status === \"success\") {\n expectTypeOf(state.data.structuredContent.foo).toBeString();\n }\n});\n\ntest(\"SideEffects type is correctly exported and usable\", () => {\n type Args = { x: number };\n type Response = CallToolResponse & { structuredContent: { y: string } };\n\n const sideEffects: SideEffects<Args, Response> = {\n onSuccess: (data, args) => {\n expectTypeOf(data.structuredContent.y).toBeString();\n expectTypeOf(args.x).toBeNumber();\n },\n };\n\n expectTypeOf(sideEffects).toHaveProperty(\"onSuccess\");\n});\n"]}
@@ -0,0 +1 @@
1
+ export {};