skybridge 0.0.0-dev.e4c9359 → 0.0.0-dev.e50416a

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 (611) hide show
  1. package/LICENSE +21 -674
  2. package/README.md +125 -294
  3. package/bin/run.js +5 -0
  4. package/dist/cli/build-helpers.d.ts +11 -0
  5. package/dist/cli/build-helpers.js +107 -0
  6. package/dist/cli/build-helpers.js.map +1 -0
  7. package/dist/cli/build-helpers.test.js +132 -0
  8. package/dist/cli/build-helpers.test.js.map +1 -0
  9. package/dist/cli/build-steps.d.ts +2 -0
  10. package/dist/cli/build-steps.js +73 -0
  11. package/dist/cli/build-steps.js.map +1 -0
  12. package/dist/cli/build-steps.test.js +52 -0
  13. package/dist/cli/build-steps.test.js.map +1 -0
  14. package/dist/cli/detect-port.d.ts +18 -0
  15. package/dist/cli/detect-port.js +50 -0
  16. package/dist/cli/detect-port.js.map +1 -0
  17. package/dist/cli/header.d.ts +4 -0
  18. package/dist/cli/header.js +6 -0
  19. package/dist/cli/header.js.map +1 -0
  20. package/dist/cli/resolve-skybridge-config.d.ts +5 -0
  21. package/dist/cli/resolve-skybridge-config.js +18 -0
  22. package/dist/cli/resolve-skybridge-config.js.map +1 -0
  23. package/dist/cli/run-command.d.ts +2 -0
  24. package/dist/cli/run-command.js +43 -0
  25. package/dist/cli/run-command.js.map +1 -0
  26. package/dist/cli/run-plain.d.ts +18 -0
  27. package/dist/cli/run-plain.js +89 -0
  28. package/dist/cli/run-plain.js.map +1 -0
  29. package/dist/cli/telemetry.d.ts +7 -0
  30. package/dist/cli/telemetry.js +123 -0
  31. package/dist/cli/telemetry.js.map +1 -0
  32. package/dist/cli/tunnel-control-server.d.ts +9 -0
  33. package/dist/cli/tunnel-control-server.js +31 -0
  34. package/dist/cli/tunnel-control-server.js.map +1 -0
  35. package/dist/cli/tunnel-control-server.test.js +39 -0
  36. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  37. package/dist/cli/tunnel-handler.d.ts +3 -0
  38. package/dist/cli/tunnel-handler.js +48 -0
  39. package/dist/cli/tunnel-handler.js.map +1 -0
  40. package/dist/cli/tunnel-handler.test.js +105 -0
  41. package/dist/cli/tunnel-handler.test.js.map +1 -0
  42. package/dist/cli/tunnel.d.ts +57 -0
  43. package/dist/cli/tunnel.js +154 -0
  44. package/dist/cli/tunnel.js.map +1 -0
  45. package/dist/cli/tunnel.test.js +190 -0
  46. package/dist/cli/tunnel.test.js.map +1 -0
  47. package/dist/cli/types.d.ts +5 -0
  48. package/dist/cli/types.js +2 -0
  49. package/dist/cli/types.js.map +1 -0
  50. package/dist/cli/use-execute-steps.d.ts +11 -0
  51. package/dist/cli/use-execute-steps.js +36 -0
  52. package/dist/cli/use-execute-steps.js.map +1 -0
  53. package/dist/cli/use-messages.d.ts +3 -0
  54. package/dist/cli/use-messages.js +11 -0
  55. package/dist/cli/use-messages.js.map +1 -0
  56. package/dist/cli/use-nodemon.d.ts +16 -0
  57. package/dist/cli/use-nodemon.js +84 -0
  58. package/dist/cli/use-nodemon.js.map +1 -0
  59. package/dist/cli/use-open-browser.d.ts +1 -0
  60. package/dist/cli/use-open-browser.js +44 -0
  61. package/dist/cli/use-open-browser.js.map +1 -0
  62. package/dist/cli/use-tunnel.d.ts +14 -0
  63. package/dist/cli/use-tunnel.js +131 -0
  64. package/dist/cli/use-tunnel.js.map +1 -0
  65. package/dist/cli/use-typescript-check.d.ts +15 -0
  66. package/dist/cli/use-typescript-check.js +97 -0
  67. package/dist/cli/use-typescript-check.js.map +1 -0
  68. package/dist/commands/build.d.ts +6 -0
  69. package/dist/commands/build.js +31 -0
  70. package/dist/commands/build.js.map +1 -0
  71. package/dist/commands/create.d.ts +9 -0
  72. package/dist/commands/create.js +30 -0
  73. package/dist/commands/create.js.map +1 -0
  74. package/dist/commands/dev.d.ts +13 -0
  75. package/dist/commands/dev.js +128 -0
  76. package/dist/commands/dev.js.map +1 -0
  77. package/dist/commands/start.d.ts +9 -0
  78. package/dist/commands/start.js +55 -0
  79. package/dist/commands/start.js.map +1 -0
  80. package/dist/commands/telemetry/disable.d.ts +5 -0
  81. package/dist/commands/telemetry/disable.js +14 -0
  82. package/dist/commands/telemetry/disable.js.map +1 -0
  83. package/dist/commands/telemetry/enable.d.ts +5 -0
  84. package/dist/commands/telemetry/enable.js +14 -0
  85. package/dist/commands/telemetry/enable.js.map +1 -0
  86. package/dist/commands/telemetry/status.d.ts +5 -0
  87. package/dist/commands/telemetry/status.js +14 -0
  88. package/dist/commands/telemetry/status.js.map +1 -0
  89. package/dist/context-warnings.d.ts +5 -0
  90. package/dist/context-warnings.js +31 -0
  91. package/dist/context-warnings.js.map +1 -0
  92. package/dist/context-warnings.test.js +28 -0
  93. package/dist/context-warnings.test.js.map +1 -0
  94. package/dist/server/asset-base-url-transform-plugin.d.ts +11 -0
  95. package/dist/server/asset-base-url-transform-plugin.js +48 -0
  96. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  97. package/dist/server/asset-base-url-transform-plugin.test.js +134 -0
  98. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  99. package/dist/server/auth/discovery.d.ts +32 -0
  100. package/dist/server/auth/discovery.js +56 -0
  101. package/dist/server/auth/discovery.js.map +1 -0
  102. package/dist/server/auth/discovery.test.js +93 -0
  103. package/dist/server/auth/discovery.test.js.map +1 -0
  104. package/dist/server/auth/index.d.ts +44 -0
  105. package/dist/server/auth/index.js +2 -0
  106. package/dist/server/auth/index.js.map +1 -0
  107. package/dist/server/auth/providers/auth0.d.ts +40 -0
  108. package/dist/server/auth/providers/auth0.js +31 -0
  109. package/dist/server/auth/providers/auth0.js.map +1 -0
  110. package/dist/server/auth/providers/auth0.test.js +50 -0
  111. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  112. package/dist/server/auth/providers/authplane.d.ts +49 -0
  113. package/dist/server/auth/providers/authplane.js +57 -0
  114. package/dist/server/auth/providers/authplane.js.map +1 -0
  115. package/dist/server/auth/providers/authplane.test.js +140 -0
  116. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  117. package/dist/server/auth/providers/clerk.d.ts +51 -0
  118. package/dist/server/auth/providers/clerk.js +19 -0
  119. package/dist/server/auth/providers/clerk.js.map +1 -0
  120. package/dist/server/auth/providers/clerk.test.js +30 -0
  121. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  122. package/dist/server/auth/providers/custom.d.ts +40 -0
  123. package/dist/server/auth/providers/custom.js +56 -0
  124. package/dist/server/auth/providers/custom.js.map +1 -0
  125. package/dist/server/auth/providers/custom.test.js +158 -0
  126. package/dist/server/auth/providers/custom.test.js.map +1 -0
  127. package/dist/server/auth/providers/descope.d.ts +44 -0
  128. package/dist/server/auth/providers/descope.js +44 -0
  129. package/dist/server/auth/providers/descope.js.map +1 -0
  130. package/dist/server/auth/providers/descope.test.js +62 -0
  131. package/dist/server/auth/providers/descope.test.js.map +1 -0
  132. package/dist/server/auth/providers/shared.d.ts +2 -0
  133. package/dist/server/auth/providers/shared.js +6 -0
  134. package/dist/server/auth/providers/shared.js.map +1 -0
  135. package/dist/server/auth/providers/shared.test.d.ts +1 -0
  136. package/dist/server/auth/providers/shared.test.js +10 -0
  137. package/dist/server/auth/providers/shared.test.js.map +1 -0
  138. package/dist/server/auth/providers/stytch.d.ts +25 -0
  139. package/dist/server/auth/providers/stytch.js +16 -0
  140. package/dist/server/auth/providers/stytch.js.map +1 -0
  141. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  142. package/dist/server/auth/providers/verify-spy.js +21 -0
  143. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  144. package/dist/server/auth/providers/workos.d.ts +33 -0
  145. package/dist/server/auth/providers/workos.js +15 -0
  146. package/dist/server/auth/providers/workos.js.map +1 -0
  147. package/dist/server/auth/security-schemes.d.ts +23 -0
  148. package/dist/server/auth/security-schemes.js +64 -0
  149. package/dist/server/auth/security-schemes.js.map +1 -0
  150. package/dist/server/auth/security-schemes.test.d.ts +1 -0
  151. package/dist/server/auth/security-schemes.test.js +99 -0
  152. package/dist/server/auth/security-schemes.test.js.map +1 -0
  153. package/dist/server/auth/setup.d.ts +6 -0
  154. package/dist/server/auth/setup.js +92 -0
  155. package/dist/server/auth/setup.js.map +1 -0
  156. package/dist/server/auth/setup.test.d.ts +1 -0
  157. package/dist/server/auth/setup.test.js +508 -0
  158. package/dist/server/auth/setup.test.js.map +1 -0
  159. package/dist/server/auth/verify.d.ts +46 -0
  160. package/dist/server/auth/verify.js +62 -0
  161. package/dist/server/auth/verify.js.map +1 -0
  162. package/dist/server/auth/verify.test.d.ts +1 -0
  163. package/dist/server/auth/verify.test.js +149 -0
  164. package/dist/server/auth/verify.test.js.map +1 -0
  165. package/dist/server/auth-extra.test-d.js +82 -0
  166. package/dist/server/auth-extra.test-d.js.map +1 -0
  167. package/dist/server/auth.d.ts +58 -0
  168. package/dist/server/auth.js +28 -0
  169. package/dist/server/auth.js.map +1 -0
  170. package/dist/server/build-manifest.test.d.ts +1 -0
  171. package/dist/server/build-manifest.test.js +27 -0
  172. package/dist/server/build-manifest.test.js.map +1 -0
  173. package/dist/server/content-helpers.d.ts +67 -0
  174. package/dist/server/content-helpers.js +79 -0
  175. package/dist/server/content-helpers.js.map +1 -0
  176. package/dist/server/content-helpers.test.d.ts +1 -0
  177. package/dist/server/content-helpers.test.js +70 -0
  178. package/dist/server/content-helpers.test.js.map +1 -0
  179. package/dist/server/express.d.ts +11 -0
  180. package/dist/server/express.js +101 -0
  181. package/dist/server/express.js.map +1 -0
  182. package/dist/server/express.test.d.ts +1 -0
  183. package/dist/server/express.test.js +491 -0
  184. package/dist/server/express.test.js.map +1 -0
  185. package/dist/server/file-ref.d.ts +28 -0
  186. package/dist/server/file-ref.js +27 -0
  187. package/dist/server/file-ref.js.map +1 -0
  188. package/dist/server/host.d.ts +2 -0
  189. package/dist/server/host.js +11 -0
  190. package/dist/server/host.js.map +1 -0
  191. package/dist/server/host.test.d.ts +1 -0
  192. package/dist/server/host.test.js +13 -0
  193. package/dist/server/host.test.js.map +1 -0
  194. package/dist/server/index.d.ts +19 -0
  195. package/dist/server/index.js +16 -0
  196. package/dist/server/index.js.map +1 -0
  197. package/dist/server/inferUtilityTypes.d.ts +64 -0
  198. package/dist/server/inferUtilityTypes.js.map +1 -0
  199. package/dist/server/metric.d.ts +14 -0
  200. package/dist/server/metric.js +62 -0
  201. package/dist/server/metric.js.map +1 -0
  202. package/dist/server/middleware.d.ts +162 -0
  203. package/dist/server/middleware.js +126 -0
  204. package/dist/server/middleware.js.map +1 -0
  205. package/dist/server/middleware.test-d.d.ts +1 -0
  206. package/dist/server/middleware.test-d.js +75 -0
  207. package/dist/server/middleware.test-d.js.map +1 -0
  208. package/dist/server/middleware.test.d.ts +1 -0
  209. package/dist/server/middleware.test.js +529 -0
  210. package/dist/server/middleware.test.js.map +1 -0
  211. package/dist/server/requestOrigin.d.ts +7 -0
  212. package/dist/server/requestOrigin.js +25 -0
  213. package/dist/server/requestOrigin.js.map +1 -0
  214. package/dist/server/server.d.ts +465 -0
  215. package/dist/server/server.js +742 -0
  216. package/dist/server/server.js.map +1 -0
  217. package/dist/server/skills-integration.test.d.ts +1 -0
  218. package/dist/server/skills-integration.test.js +79 -0
  219. package/dist/server/skills-integration.test.js.map +1 -0
  220. package/dist/server/skills.d.ts +29 -0
  221. package/dist/server/skills.js +195 -0
  222. package/dist/server/skills.js.map +1 -0
  223. package/dist/server/skills.test.d.ts +1 -0
  224. package/dist/server/skills.test.js +247 -0
  225. package/dist/server/skills.test.js.map +1 -0
  226. package/dist/{src/server → server}/templateHelper.d.ts +5 -4
  227. package/dist/server/templateHelper.js +11 -0
  228. package/dist/server/templateHelper.js.map +1 -0
  229. package/dist/server/templates.generated.d.ts +4 -0
  230. package/dist/server/templates.generated.js +47 -0
  231. package/dist/server/templates.generated.js.map +1 -0
  232. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  233. package/dist/server/tunnel-proxy-router.js +110 -0
  234. package/dist/server/tunnel-proxy-router.js.map +1 -0
  235. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  236. package/dist/server/tunnel-proxy-router.test.js +229 -0
  237. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  238. package/dist/server/view-name.test-d.d.ts +1 -0
  239. package/dist/server/view-name.test-d.js +8 -0
  240. package/dist/server/view-name.test-d.js.map +1 -0
  241. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  242. package/dist/server/view-resource-resolution.test.js +171 -0
  243. package/dist/server/view-resource-resolution.test.js.map +1 -0
  244. package/dist/server/viewsDevServer.d.ts +14 -0
  245. package/dist/server/viewsDevServer.js +48 -0
  246. package/dist/server/viewsDevServer.js.map +1 -0
  247. package/dist/test/utils.d.ts +127 -0
  248. package/dist/test/utils.js +247 -0
  249. package/dist/test/utils.js.map +1 -0
  250. package/dist/test/view.test.d.ts +1 -0
  251. package/dist/test/view.test.js +552 -0
  252. package/dist/test/view.test.js.map +1 -0
  253. package/dist/version.d.ts +1 -0
  254. package/dist/version.js +3 -0
  255. package/dist/version.js.map +1 -0
  256. package/dist/web/bridges/adaptor.d.ts +51 -0
  257. package/dist/web/bridges/adaptor.js +327 -0
  258. package/dist/web/bridges/adaptor.js.map +1 -0
  259. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  260. package/dist/web/bridges/adaptor.test.js +225 -0
  261. package/dist/web/bridges/adaptor.test.js.map +1 -0
  262. package/dist/web/bridges/apps-sdk/bridge.d.ts +15 -0
  263. package/dist/web/bridges/apps-sdk/bridge.js +58 -0
  264. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
  265. package/dist/web/bridges/apps-sdk/index.d.ts +4 -0
  266. package/dist/web/bridges/apps-sdk/index.js +4 -0
  267. package/dist/web/bridges/apps-sdk/index.js.map +1 -0
  268. package/dist/web/bridges/apps-sdk/types.d.ts +133 -0
  269. package/dist/web/bridges/apps-sdk/types.js.map +1 -0
  270. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +13 -0
  271. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +18 -0
  272. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
  273. package/dist/web/bridges/get-adaptor.d.ts +9 -0
  274. package/dist/web/bridges/get-adaptor.js +10 -0
  275. package/dist/web/bridges/get-adaptor.js.map +1 -0
  276. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  277. package/dist/web/bridges/get-adaptor.test.js +32 -0
  278. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  279. package/dist/web/bridges/index.d.ts +5 -0
  280. package/dist/web/bridges/index.js +6 -0
  281. package/dist/web/bridges/index.js.map +1 -0
  282. package/dist/web/bridges/mcp-app/bridge.d.ts +39 -0
  283. package/dist/web/bridges/mcp-app/bridge.js +168 -0
  284. package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
  285. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  286. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  287. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  288. package/dist/web/bridges/mcp-app/index.d.ts +3 -0
  289. package/dist/web/bridges/mcp-app/index.js +3 -0
  290. package/dist/web/bridges/mcp-app/index.js.map +1 -0
  291. package/dist/web/bridges/mcp-app/types.d.ts +10 -0
  292. package/dist/web/bridges/mcp-app/types.js +2 -0
  293. package/dist/web/bridges/mcp-app/types.js.map +1 -0
  294. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +19 -0
  295. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +19 -0
  296. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
  297. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.d.ts +1 -0
  298. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +26 -0
  299. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
  300. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  301. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  302. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  303. package/dist/web/bridges/types.d.ts +214 -0
  304. package/dist/web/bridges/types.js +15 -0
  305. package/dist/web/bridges/types.js.map +1 -0
  306. package/dist/web/bridges/types.test.d.ts +1 -0
  307. package/dist/web/bridges/types.test.js +19 -0
  308. package/dist/web/bridges/types.test.js.map +1 -0
  309. package/dist/web/bridges/use-host-context.d.ts +7 -0
  310. package/dist/web/bridges/use-host-context.js +13 -0
  311. package/dist/web/bridges/use-host-context.js.map +1 -0
  312. package/dist/web/components/modal-provider.d.ts +4 -0
  313. package/dist/web/components/modal-provider.js +46 -0
  314. package/dist/web/components/modal-provider.js.map +1 -0
  315. package/dist/web/create-store.d.ts +29 -0
  316. package/dist/web/create-store.js +64 -0
  317. package/dist/web/create-store.js.map +1 -0
  318. package/dist/web/create-store.test.d.ts +1 -0
  319. package/dist/web/create-store.test.js +132 -0
  320. package/dist/web/create-store.test.js.map +1 -0
  321. package/dist/web/data-llm.d.ts +47 -0
  322. package/dist/web/data-llm.js +100 -0
  323. package/dist/web/data-llm.js.map +1 -0
  324. package/dist/web/data-llm.test.d.ts +1 -0
  325. package/dist/web/data-llm.test.js +155 -0
  326. package/dist/web/data-llm.test.js.map +1 -0
  327. package/dist/web/generate-helpers.d.ts +120 -0
  328. package/dist/{src/web/typed-hooks.js → web/generate-helpers.js} +35 -27
  329. package/dist/web/generate-helpers.js.map +1 -0
  330. package/dist/web/generate-helpers.test-d.d.ts +1 -0
  331. package/dist/web/generate-helpers.test-d.js +211 -0
  332. package/dist/web/generate-helpers.test-d.js.map +1 -0
  333. package/dist/web/generate-helpers.test.d.ts +1 -0
  334. package/dist/{src/web/typed-hooks.test.js → web/generate-helpers.test.js} +5 -5
  335. package/dist/web/generate-helpers.test.js.map +1 -0
  336. package/dist/web/helpers/state.d.ts +7 -0
  337. package/dist/web/helpers/state.js +45 -0
  338. package/dist/web/helpers/state.js.map +1 -0
  339. package/dist/web/helpers/state.test.d.ts +1 -0
  340. package/dist/web/helpers/state.test.js +53 -0
  341. package/dist/web/helpers/state.test.js.map +1 -0
  342. package/dist/web/hooks/index.d.ts +16 -0
  343. package/dist/web/hooks/index.js +17 -0
  344. package/dist/web/hooks/index.js.map +1 -0
  345. package/dist/web/hooks/test/utils.d.ts +21 -0
  346. package/dist/web/hooks/test/utils.js +75 -0
  347. package/dist/web/hooks/test/utils.js.map +1 -0
  348. package/dist/web/hooks/use-call-tool.d.ts +146 -0
  349. package/dist/web/hooks/use-call-tool.js +96 -0
  350. package/dist/web/hooks/use-call-tool.js.map +1 -0
  351. package/dist/web/hooks/use-call-tool.test-d.d.ts +1 -0
  352. package/dist/web/hooks/use-call-tool.test-d.js +104 -0
  353. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -0
  354. package/dist/web/hooks/use-call-tool.test.d.ts +1 -0
  355. package/dist/{src/web → web}/hooks/use-call-tool.test.js +98 -36
  356. package/dist/web/hooks/use-call-tool.test.js.map +1 -0
  357. package/dist/web/hooks/use-display-mode.d.ts +24 -0
  358. package/dist/web/hooks/use-display-mode.js +29 -0
  359. package/dist/web/hooks/use-display-mode.js.map +1 -0
  360. package/dist/web/hooks/use-display-mode.test-d.d.ts +1 -0
  361. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  362. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  363. package/dist/web/hooks/use-display-mode.test.d.ts +1 -0
  364. package/dist/web/hooks/use-display-mode.test.js +77 -0
  365. package/dist/web/hooks/use-display-mode.test.js.map +1 -0
  366. package/dist/web/hooks/use-download.d.ts +5 -0
  367. package/dist/web/hooks/use-download.js +8 -0
  368. package/dist/web/hooks/use-download.js.map +1 -0
  369. package/dist/web/hooks/use-download.test.d.ts +1 -0
  370. package/dist/web/hooks/use-download.test.js +103 -0
  371. package/dist/web/hooks/use-download.test.js.map +1 -0
  372. package/dist/web/hooks/use-files.d.ts +39 -0
  373. package/dist/web/hooks/use-files.js +42 -0
  374. package/dist/web/hooks/use-files.js.map +1 -0
  375. package/dist/web/hooks/use-files.test.d.ts +1 -0
  376. package/dist/web/hooks/use-files.test.js +62 -0
  377. package/dist/web/hooks/use-files.test.js.map +1 -0
  378. package/dist/web/hooks/use-host-info.d.ts +22 -0
  379. package/dist/web/hooks/use-host-info.js +30 -0
  380. package/dist/web/hooks/use-host-info.js.map +1 -0
  381. package/dist/web/hooks/use-host-info.test.d.ts +1 -0
  382. package/dist/web/hooks/use-host-info.test.js +59 -0
  383. package/dist/web/hooks/use-host-info.test.js.map +1 -0
  384. package/dist/web/hooks/use-layout.d.ts +24 -0
  385. package/dist/web/hooks/use-layout.js +25 -0
  386. package/dist/web/hooks/use-layout.js.map +1 -0
  387. package/dist/web/hooks/use-layout.test.d.ts +1 -0
  388. package/dist/web/hooks/use-layout.test.js +129 -0
  389. package/dist/web/hooks/use-layout.test.js.map +1 -0
  390. package/dist/web/hooks/use-open-external.d.ts +20 -0
  391. package/dist/web/hooks/use-open-external.js +24 -0
  392. package/dist/web/hooks/use-open-external.js.map +1 -0
  393. package/dist/web/hooks/use-open-external.test.d.ts +1 -0
  394. package/dist/web/hooks/use-open-external.test.js +75 -0
  395. package/dist/web/hooks/use-open-external.test.js.map +1 -0
  396. package/dist/web/hooks/use-register-view-tool.d.ts +38 -0
  397. package/dist/web/hooks/use-register-view-tool.js +50 -0
  398. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  399. package/dist/web/hooks/use-request-close.d.ts +16 -0
  400. package/dist/web/hooks/use-request-close.js +21 -0
  401. package/dist/web/hooks/use-request-close.js.map +1 -0
  402. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  403. package/dist/web/hooks/use-request-close.test.js +47 -0
  404. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  405. package/dist/web/hooks/use-request-modal.d.ts +24 -0
  406. package/dist/web/hooks/use-request-modal.js +31 -0
  407. package/dist/web/hooks/use-request-modal.js.map +1 -0
  408. package/dist/web/hooks/use-request-modal.test.d.ts +1 -0
  409. package/dist/web/hooks/use-request-modal.test.js +71 -0
  410. package/dist/web/hooks/use-request-modal.test.js.map +1 -0
  411. package/dist/web/hooks/use-request-size.d.ts +20 -0
  412. package/dist/web/hooks/use-request-size.js +24 -0
  413. package/dist/web/hooks/use-request-size.js.map +1 -0
  414. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  415. package/dist/web/hooks/use-request-size.test.js +47 -0
  416. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  417. package/dist/web/hooks/use-send-follow-up-message.d.ts +19 -0
  418. package/dist/web/hooks/use-send-follow-up-message.js +25 -0
  419. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
  420. package/dist/web/hooks/use-set-open-in-app-url.d.ts +18 -0
  421. package/dist/web/hooks/use-set-open-in-app-url.js +25 -0
  422. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  423. package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
  424. package/dist/web/hooks/use-set-open-in-app-url.test.js +63 -0
  425. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  426. package/dist/web/hooks/use-tool-info.d.ts +87 -0
  427. package/dist/web/hooks/use-tool-info.js +49 -0
  428. package/dist/web/hooks/use-tool-info.js.map +1 -0
  429. package/dist/web/hooks/use-tool-info.test-d.d.ts +1 -0
  430. package/dist/{src/web → web}/hooks/use-tool-info.test-d.js +24 -7
  431. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
  432. package/dist/web/hooks/use-tool-info.test.d.ts +1 -0
  433. package/dist/web/hooks/use-tool-info.test.js +140 -0
  434. package/dist/web/hooks/use-tool-info.test.js.map +1 -0
  435. package/dist/web/hooks/use-user.d.ts +20 -0
  436. package/dist/web/hooks/use-user.js +37 -0
  437. package/dist/web/hooks/use-user.js.map +1 -0
  438. package/dist/web/hooks/use-user.test.d.ts +1 -0
  439. package/dist/web/hooks/use-user.test.js +168 -0
  440. package/dist/web/hooks/use-user.test.js.map +1 -0
  441. package/dist/web/hooks/use-view-state.d.ts +25 -0
  442. package/dist/web/hooks/use-view-state.js +42 -0
  443. package/dist/web/hooks/use-view-state.js.map +1 -0
  444. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  445. package/dist/web/hooks/use-view-state.test.js +212 -0
  446. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  447. package/dist/web/index.d.ts +7 -0
  448. package/dist/web/index.js +8 -0
  449. package/dist/web/index.js.map +1 -0
  450. package/dist/web/mount-view.d.ts +20 -0
  451. package/dist/web/mount-view.js +46 -0
  452. package/dist/web/mount-view.js.map +1 -0
  453. package/dist/web/plugin/data-llm.test.d.ts +1 -0
  454. package/dist/web/plugin/data-llm.test.js +81 -0
  455. package/dist/web/plugin/data-llm.test.js.map +1 -0
  456. package/dist/web/plugin/plugin-build.test.d.ts +1 -0
  457. package/dist/web/plugin/plugin-build.test.js +54 -0
  458. package/dist/web/plugin/plugin-build.test.js.map +1 -0
  459. package/dist/web/plugin/plugin.d.ts +39 -0
  460. package/dist/web/plugin/plugin.js +200 -0
  461. package/dist/web/plugin/plugin.js.map +1 -0
  462. package/dist/web/plugin/plugin.test.d.ts +1 -0
  463. package/dist/web/plugin/plugin.test.js +61 -0
  464. package/dist/web/plugin/plugin.test.js.map +1 -0
  465. package/dist/web/plugin/scan-views.d.ts +16 -0
  466. package/dist/web/plugin/scan-views.js +88 -0
  467. package/dist/web/plugin/scan-views.js.map +1 -0
  468. package/dist/web/plugin/scan-views.test.d.ts +1 -0
  469. package/dist/web/plugin/scan-views.test.js +99 -0
  470. package/dist/web/plugin/scan-views.test.js.map +1 -0
  471. package/dist/web/plugin/transform-data-llm.d.ts +12 -0
  472. package/dist/web/plugin/transform-data-llm.js +96 -0
  473. package/dist/web/plugin/transform-data-llm.js.map +1 -0
  474. package/dist/web/plugin/transform-data-llm.test.d.ts +1 -0
  475. package/dist/web/plugin/transform-data-llm.test.js +81 -0
  476. package/dist/web/plugin/transform-data-llm.test.js.map +1 -0
  477. package/dist/web/plugin/validate-view.d.ts +1 -0
  478. package/dist/web/plugin/validate-view.js +9 -0
  479. package/dist/web/plugin/validate-view.js.map +1 -0
  480. package/dist/web/plugin/validate-view.test.d.ts +1 -0
  481. package/dist/web/plugin/validate-view.test.js +24 -0
  482. package/dist/web/plugin/validate-view.test.js.map +1 -0
  483. package/dist/{src/web → web}/proxy.js +6 -2
  484. package/dist/web/proxy.js.map +1 -0
  485. package/dist/web/types.d.ts +20 -0
  486. package/dist/web/types.js +2 -0
  487. package/dist/web/types.js.map +1 -0
  488. package/package.json +89 -36
  489. package/tsconfig.base.json +33 -0
  490. package/dist/src/server/index.d.ts +0 -4
  491. package/dist/src/server/index.js +0 -3
  492. package/dist/src/server/index.js.map +0 -1
  493. package/dist/src/server/inferUtilityTypes.d.ts +0 -48
  494. package/dist/src/server/inferUtilityTypes.js.map +0 -1
  495. package/dist/src/server/server.d.ts +0 -35
  496. package/dist/src/server/server.js +0 -62
  497. package/dist/src/server/server.js.map +0 -1
  498. package/dist/src/server/templateHelper.js +0 -29
  499. package/dist/src/server/templateHelper.js.map +0 -1
  500. package/dist/src/server/templates/development.hbs +0 -12
  501. package/dist/src/server/templates/production.hbs +0 -6
  502. package/dist/src/server/widgetsDevServer.d.ts +0 -12
  503. package/dist/src/server/widgetsDevServer.js +0 -39
  504. package/dist/src/server/widgetsDevServer.js.map +0 -1
  505. package/dist/src/test/utils.d.ts +0 -89
  506. package/dist/src/test/utils.js +0 -164
  507. package/dist/src/test/utils.js.map +0 -1
  508. package/dist/src/test/widget.test.js +0 -90
  509. package/dist/src/test/widget.test.js.map +0 -1
  510. package/dist/src/web/hooks/index.d.ts +0 -14
  511. package/dist/src/web/hooks/index.js +0 -15
  512. package/dist/src/web/hooks/index.js.map +0 -1
  513. package/dist/src/web/hooks/use-call-tool.d.ts +0 -99
  514. package/dist/src/web/hooks/use-call-tool.js +0 -68
  515. package/dist/src/web/hooks/use-call-tool.js.map +0 -1
  516. package/dist/src/web/hooks/use-call-tool.test.js.map +0 -1
  517. package/dist/src/web/hooks/use-display-mode.d.ts +0 -4
  518. package/dist/src/web/hooks/use-display-mode.js +0 -7
  519. package/dist/src/web/hooks/use-display-mode.js.map +0 -1
  520. package/dist/src/web/hooks/use-display-mode.test.js +0 -40
  521. package/dist/src/web/hooks/use-display-mode.test.js.map +0 -1
  522. package/dist/src/web/hooks/use-files.d.ts +0 -10
  523. package/dist/src/web/hooks/use-files.js +0 -7
  524. package/dist/src/web/hooks/use-files.js.map +0 -1
  525. package/dist/src/web/hooks/use-files.test.js +0 -29
  526. package/dist/src/web/hooks/use-files.test.js.map +0 -1
  527. package/dist/src/web/hooks/use-locale.d.ts +0 -1
  528. package/dist/src/web/hooks/use-locale.js +0 -5
  529. package/dist/src/web/hooks/use-locale.js.map +0 -1
  530. package/dist/src/web/hooks/use-locale.test.js +0 -21
  531. package/dist/src/web/hooks/use-locale.test.js.map +0 -1
  532. package/dist/src/web/hooks/use-open-external.d.ts +0 -1
  533. package/dist/src/web/hooks/use-open-external.js +0 -6
  534. package/dist/src/web/hooks/use-open-external.js.map +0 -1
  535. package/dist/src/web/hooks/use-open-external.test.js +0 -24
  536. package/dist/src/web/hooks/use-open-external.test.js.map +0 -1
  537. package/dist/src/web/hooks/use-openai-global.d.ts +0 -2
  538. package/dist/src/web/hooks/use-openai-global.js +0 -23
  539. package/dist/src/web/hooks/use-openai-global.js.map +0 -1
  540. package/dist/src/web/hooks/use-request-modal.d.ts +0 -6
  541. package/dist/src/web/hooks/use-request-modal.js +0 -9
  542. package/dist/src/web/hooks/use-request-modal.js.map +0 -1
  543. package/dist/src/web/hooks/use-request-modal.test.js +0 -24
  544. package/dist/src/web/hooks/use-request-modal.test.js.map +0 -1
  545. package/dist/src/web/hooks/use-send-follow-up-message.d.ts +0 -1
  546. package/dist/src/web/hooks/use-send-follow-up-message.js +0 -11
  547. package/dist/src/web/hooks/use-send-follow-up-message.js.map +0 -1
  548. package/dist/src/web/hooks/use-theme.d.ts +0 -1
  549. package/dist/src/web/hooks/use-theme.js +0 -5
  550. package/dist/src/web/hooks/use-theme.js.map +0 -1
  551. package/dist/src/web/hooks/use-theme.test.js +0 -26
  552. package/dist/src/web/hooks/use-theme.test.js.map +0 -1
  553. package/dist/src/web/hooks/use-tool-info.d.ts +0 -25
  554. package/dist/src/web/hooks/use-tool-info.js +0 -22
  555. package/dist/src/web/hooks/use-tool-info.js.map +0 -1
  556. package/dist/src/web/hooks/use-tool-info.test-d.js.map +0 -1
  557. package/dist/src/web/hooks/use-tool-info.test.js +0 -59
  558. package/dist/src/web/hooks/use-tool-info.test.js.map +0 -1
  559. package/dist/src/web/hooks/use-tool-output.d.ts +0 -4
  560. package/dist/src/web/hooks/use-tool-output.js +0 -9
  561. package/dist/src/web/hooks/use-tool-output.js.map +0 -1
  562. package/dist/src/web/hooks/use-tool-response-metadata.d.ts +0 -4
  563. package/dist/src/web/hooks/use-tool-response-metadata.js +0 -8
  564. package/dist/src/web/hooks/use-tool-response-metadata.js.map +0 -1
  565. package/dist/src/web/hooks/use-user-agent.d.ts +0 -1
  566. package/dist/src/web/hooks/use-user-agent.js +0 -5
  567. package/dist/src/web/hooks/use-user-agent.js.map +0 -1
  568. package/dist/src/web/hooks/use-user-agent.test.js +0 -31
  569. package/dist/src/web/hooks/use-user-agent.test.js.map +0 -1
  570. package/dist/src/web/hooks/use-widget-state.d.ts +0 -4
  571. package/dist/src/web/hooks/use-widget-state.js +0 -30
  572. package/dist/src/web/hooks/use-widget-state.js.map +0 -1
  573. package/dist/src/web/hooks/use-widget-state.test.js +0 -60
  574. package/dist/src/web/hooks/use-widget-state.test.js.map +0 -1
  575. package/dist/src/web/index.d.ts +0 -5
  576. package/dist/src/web/index.js +0 -6
  577. package/dist/src/web/index.js.map +0 -1
  578. package/dist/src/web/mount-widget.d.ts +0 -1
  579. package/dist/src/web/mount-widget.js +0 -19
  580. package/dist/src/web/mount-widget.js.map +0 -1
  581. package/dist/src/web/plugin.d.ts +0 -2
  582. package/dist/src/web/plugin.js +0 -28
  583. package/dist/src/web/plugin.js.map +0 -1
  584. package/dist/src/web/proxy.js.map +0 -1
  585. package/dist/src/web/typed-hooks.d.ts +0 -112
  586. package/dist/src/web/typed-hooks.js.map +0 -1
  587. package/dist/src/web/typed-hooks.test-d.js +0 -90
  588. package/dist/src/web/typed-hooks.test-d.js.map +0 -1
  589. package/dist/src/web/typed-hooks.test.js.map +0 -1
  590. package/dist/src/web/types.d.ts +0 -123
  591. package/dist/src/web/types.js.map +0 -1
  592. package/dist/vitest.config.d.ts +0 -2
  593. package/dist/vitest.config.js +0 -8
  594. package/dist/vitest.config.js.map +0 -1
  595. /package/dist/{src/test/widget.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
  596. /package/dist/{src/web/hooks/use-call-tool.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  597. /package/dist/{src/web/hooks/use-display-mode.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  598. /package/dist/{src/web/hooks/use-files.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
  599. /package/dist/{src/web/hooks/use-locale.test.d.ts → cli/tunnel.test.d.ts} +0 -0
  600. /package/dist/{src/web/hooks/use-open-external.test.d.ts → context-warnings.test.d.ts} +0 -0
  601. /package/dist/{src/web/hooks/use-request-modal.test.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
  602. /package/dist/{src/web/hooks/use-tool-info.test-d.d.ts → server/auth/discovery.test.d.ts} +0 -0
  603. /package/dist/{src/web/hooks/use-tool-info.test.d.ts → server/auth/providers/auth0.test.d.ts} +0 -0
  604. /package/dist/{src/web/hooks/use-user-agent.test.d.ts → server/auth/providers/authplane.test.d.ts} +0 -0
  605. /package/dist/{src/web/hooks/use-widget-state.test.d.ts → server/auth/providers/clerk.test.d.ts} +0 -0
  606. /package/dist/{src/web/typed-hooks.test-d.d.ts → server/auth/providers/custom.test.d.ts} +0 -0
  607. /package/dist/{src/web/typed-hooks.test.d.ts → server/auth/providers/descope.test.d.ts} +0 -0
  608. /package/dist/{src/web/hooks/use-theme.test.d.ts → server/auth-extra.test-d.d.ts} +0 -0
  609. /package/dist/{src/server → server}/inferUtilityTypes.js +0 -0
  610. /package/dist/{src/web → web/bridges/apps-sdk}/types.js +0 -0
  611. /package/dist/{src/web → web}/proxy.d.ts +0 -0
@@ -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 {};
@@ -1,17 +1,27 @@
1
1
  import { act, renderHook, waitFor } from "@testing-library/react";
2
- import { afterEach, beforeEach, describe, expect, it, vi, expectTypeOf, } from "vitest";
2
+ import { afterEach, beforeEach, describe, expect, expectTypeOf, it, vi, } from "vitest";
3
+ import { HostAdaptor } from "../bridges/adaptor.js";
4
+ import { AppsSdkBridge } from "../bridges/apps-sdk/bridge.js";
5
+ import { getAdaptor } from "../bridges/get-adaptor.js";
6
+ import { McpAppBridge } from "../bridges/mcp-app/bridge.js";
3
7
  import { useCallTool } from "./use-call-tool.js";
4
8
  describe("useCallTool - onSuccess callback", () => {
5
- let OpenaiMock;
9
+ let callToolMock;
6
10
  beforeEach(() => {
7
- OpenaiMock = {
8
- callTool: vi.fn(),
9
- };
10
- vi.stubGlobal("openai", OpenaiMock);
11
+ HostAdaptor.resetInstance();
12
+ McpAppBridge.resetInstance();
13
+ AppsSdkBridge.resetInstance();
14
+ vi.stubGlobal("parent", { postMessage: vi.fn() });
15
+ vi.stubGlobal("skybridge", { hostType: "apps-sdk" });
16
+ vi.stubGlobal("openai", { callTool: vi.fn() });
17
+ callToolMock = vi.spyOn(getAdaptor(), "callTool");
11
18
  });
12
19
  afterEach(() => {
13
20
  vi.unstubAllGlobals();
14
21
  vi.resetAllMocks();
22
+ HostAdaptor.resetInstance();
23
+ McpAppBridge.resetInstance();
24
+ AppsSdkBridge.resetInstance();
15
25
  });
16
26
  const toolName = "test-tool";
17
27
  const args = { input: "test input" };
@@ -19,21 +29,38 @@ describe("useCallTool - onSuccess callback", () => {
19
29
  content: [{ type: "text", text: "test result" }],
20
30
  structuredContent: { result: "test" },
21
31
  isError: false,
22
- result: "test result",
23
32
  meta: {},
24
33
  };
25
34
  const error = new Error("test error");
26
- it("should call window.openai.callTool with correct arguments", async () => {
35
+ it("should normalize _meta to meta when SDK returns _meta instead of meta", async () => {
36
+ const rawSdkResponse = {
37
+ content: [{ type: "text", text: "result" }],
38
+ structuredContent: { value: 1 },
39
+ isError: false,
40
+ meta: { secret: "only visible to widget" },
41
+ };
42
+ callToolMock.mockResolvedValueOnce(rawSdkResponse);
27
43
  const { result } = renderHook(() => useCallTool(toolName));
28
- act(() => {
44
+ await act(async () => {
29
45
  result.current.callTool(args);
30
46
  });
31
- expect(OpenaiMock.callTool).toHaveBeenCalledWith(toolName, args);
47
+ await waitFor(() => {
48
+ expect(result.current.data).toMatchObject({
49
+ meta: { secret: "only visible to widget" },
50
+ });
51
+ });
52
+ });
53
+ it("should call adaptor.callTool with correct arguments", async () => {
54
+ const { result } = renderHook(() => useCallTool(toolName));
55
+ await act(async () => {
56
+ result.current.callTool(args);
57
+ });
58
+ expect(callToolMock).toHaveBeenCalledWith(toolName, args);
32
59
  });
33
60
  it("should call onSuccess callback with correct data and toolArgs on successful execution", async () => {
34
61
  const onSuccess = vi.fn();
35
62
  const onError = vi.fn();
36
- OpenaiMock.callTool.mockResolvedValueOnce(data);
63
+ callToolMock.mockResolvedValueOnce(data);
37
64
  const { result } = renderHook(() => useCallTool(toolName));
38
65
  act(() => {
39
66
  result.current.callTool(args, {
@@ -49,7 +76,7 @@ describe("useCallTool - onSuccess callback", () => {
49
76
  it("should call onError callback with error and toolArgs on failed execution", async () => {
50
77
  const onSuccess = vi.fn();
51
78
  const onError = vi.fn();
52
- OpenaiMock.callTool.mockRejectedValueOnce(error);
79
+ callToolMock.mockRejectedValueOnce(error);
53
80
  const { result } = renderHook(() => useCallTool(toolName));
54
81
  act(() => {
55
82
  result.current.callTool(args, {
@@ -66,7 +93,7 @@ describe("useCallTool - onSuccess callback", () => {
66
93
  const onSuccess = vi.fn();
67
94
  const onError = vi.fn();
68
95
  const onSettled = vi.fn();
69
- OpenaiMock.callTool.mockResolvedValueOnce(data);
96
+ callToolMock.mockResolvedValueOnce(data);
70
97
  const { result } = renderHook(() => useCallTool(toolName));
71
98
  act(() => {
72
99
  result.current.callTool(args, {
@@ -85,7 +112,7 @@ describe("useCallTool - onSuccess callback", () => {
85
112
  const onSuccess = vi.fn();
86
113
  const onError = vi.fn();
87
114
  const onSettled = vi.fn();
88
- OpenaiMock.callTool.mockRejectedValueOnce(error);
115
+ callToolMock.mockRejectedValueOnce(error);
89
116
  const { result } = renderHook(() => useCallTool(toolName));
90
117
  act(() => {
91
118
  result.current.callTool(args, {
@@ -100,33 +127,67 @@ describe("useCallTool - onSuccess callback", () => {
100
127
  expect(onSuccess).not.toHaveBeenCalled();
101
128
  });
102
129
  });
130
+ it("should always return last call started state", async () => {
131
+ const { result } = renderHook(() => useCallTool(toolName));
132
+ const firstCallData = {
133
+ ...data,
134
+ structuredContent: { result: "first call result" },
135
+ };
136
+ const secondCallData = {
137
+ ...data,
138
+ structuredContent: { result: "second call result" },
139
+ };
140
+ const { promise: firstCallToolPromise, resolve: resolveFirstCallTool } = Promise.withResolvers();
141
+ const { promise: secondCallToolPromise, resolve: resolveSecondCallTool } = Promise.withResolvers();
142
+ callToolMock
143
+ .mockImplementationOnce(() => firstCallToolPromise)
144
+ .mockImplementationOnce(() => secondCallToolPromise);
145
+ await act(() => {
146
+ result.current.callTool(args);
147
+ result.current.callTool(args);
148
+ resolveFirstCallTool(firstCallData);
149
+ return firstCallToolPromise;
150
+ });
151
+ expect(result.current.status).toEqual("pending");
152
+ expect(result.current.data).toEqual(undefined);
153
+ resolveSecondCallTool(secondCallData);
154
+ await waitFor(() => {
155
+ expect(result.current.status).toEqual("success");
156
+ expect(result.current.data).toEqual(secondCallData);
157
+ });
158
+ });
103
159
  });
104
160
  describe("useCallTool - TypeScript typing", () => {
105
- let OpenaiMock;
161
+ let callToolMock;
106
162
  beforeEach(() => {
107
- OpenaiMock = {
108
- callTool: vi.fn(),
109
- };
110
- vi.stubGlobal("openai", OpenaiMock);
163
+ HostAdaptor.resetInstance();
164
+ McpAppBridge.resetInstance();
165
+ AppsSdkBridge.resetInstance();
166
+ vi.stubGlobal("parent", { postMessage: vi.fn() });
167
+ vi.stubGlobal("skybridge", { hostType: "apps-sdk" });
168
+ vi.stubGlobal("openai", { callTool: vi.fn() });
169
+ callToolMock = vi.spyOn(getAdaptor(), "callTool");
111
170
  });
112
171
  afterEach(() => {
113
172
  vi.unstubAllGlobals();
114
173
  vi.resetAllMocks();
174
+ HostAdaptor.resetInstance();
175
+ McpAppBridge.resetInstance();
176
+ AppsSdkBridge.resetInstance();
115
177
  });
116
- it("should have correct return types when ToolArgs is null and ToolResponse is specified", () => {
178
+ it("should have correct return types when ToolArgs is null and ToolResponse is specified", async () => {
117
179
  const { result } = renderHook(() => useCallTool("test-tool"));
118
180
  const data = {
119
181
  content: [{ type: "text", text: "test" }],
120
182
  structuredContent: { result: "test" },
121
183
  isError: false,
122
- result: "test",
123
184
  meta: { id: 123 },
124
185
  };
125
- OpenaiMock.callTool.mockResolvedValueOnce(data);
126
- act(() => {
186
+ callToolMock.mockResolvedValueOnce(data);
187
+ await act(async () => {
127
188
  result.current.callTool();
128
189
  });
129
- expect(OpenaiMock.callTool).toHaveBeenCalledWith("test-tool", null);
190
+ expect(callToolMock).toHaveBeenCalledWith("test-tool", null);
130
191
  expectTypeOf(result.current.data);
131
192
  });
132
193
  it("should correctly type callToolAsync return value", async () => {
@@ -136,14 +197,14 @@ describe("useCallTool - TypeScript typing", () => {
136
197
  content: [{ type: "text", text: "answer" }],
137
198
  structuredContent: { answer: "test answer" },
138
199
  isError: false,
139
- result: "answer",
140
200
  meta: {},
141
201
  };
142
- OpenaiMock.callTool.mockResolvedValueOnce(mockResponse);
143
- const promise = result.current.callToolAsync(testArgs);
144
- expectTypeOf(promise);
145
- const resolvedValue = await promise;
146
- expect(resolvedValue).toEqual(mockResponse);
202
+ callToolMock.mockResolvedValueOnce(mockResponse);
203
+ const returnedValue = await act(async () => {
204
+ return result.current.callToolAsync(testArgs);
205
+ });
206
+ expectTypeOf(returnedValue);
207
+ expect(returnedValue).toEqual(mockResponse);
147
208
  });
148
209
  it("should correctly type callToolAsync when ToolArgs is null", async () => {
149
210
  const { result } = renderHook(() => useCallTool("test-tool"));
@@ -151,13 +212,14 @@ describe("useCallTool - TypeScript typing", () => {
151
212
  content: [{ type: "text", text: "data" }],
152
213
  structuredContent: { data: "test data" },
153
214
  isError: false,
154
- result: "data",
215
+ meta: {},
155
216
  };
156
- OpenaiMock.callTool.mockResolvedValueOnce(mockResponse);
157
- const promise = result.current.callToolAsync();
158
- expectTypeOf(promise);
159
- const resolvedValue = await promise;
160
- expect(resolvedValue).toEqual(mockResponse);
217
+ callToolMock.mockResolvedValueOnce(mockResponse);
218
+ const returnedValue = await act(async () => {
219
+ return result.current.callToolAsync();
220
+ });
221
+ expectTypeOf(returnedValue);
222
+ expect(returnedValue).toEqual(mockResponse);
161
223
  });
162
224
  });
163
225
  //# sourceMappingURL=use-call-tool.test.js.map