skybridge 0.0.0-dev.f1ff41a → 0.0.0-dev.f2073a1

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 (531) hide show
  1. package/README.md +126 -115
  2. package/dist/cli/build-helpers.d.ts +11 -0
  3. package/dist/cli/build-helpers.js +107 -0
  4. package/dist/cli/build-helpers.js.map +1 -0
  5. package/dist/cli/build-helpers.test.js +132 -0
  6. package/dist/cli/build-helpers.test.js.map +1 -0
  7. package/dist/cli/build-steps.d.ts +2 -0
  8. package/dist/cli/build-steps.js +73 -0
  9. package/dist/cli/build-steps.js.map +1 -0
  10. package/dist/cli/build-steps.test.js +52 -0
  11. package/dist/cli/build-steps.test.js.map +1 -0
  12. package/dist/cli/detect-port.d.ts +18 -0
  13. package/dist/cli/detect-port.js +49 -0
  14. package/dist/cli/detect-port.js.map +1 -0
  15. package/dist/cli/header.d.ts +1 -1
  16. package/dist/cli/header.js +1 -1
  17. package/dist/cli/header.js.map +1 -1
  18. package/dist/cli/resolve-skybridge-config.d.ts +5 -0
  19. package/dist/cli/resolve-skybridge-config.js +18 -0
  20. package/dist/cli/resolve-skybridge-config.js.map +1 -0
  21. package/dist/cli/run-command.js.map +1 -1
  22. package/dist/cli/run-plain.d.ts +18 -0
  23. package/dist/cli/run-plain.js +90 -0
  24. package/dist/cli/run-plain.js.map +1 -0
  25. package/dist/cli/telemetry.js +2 -0
  26. package/dist/cli/telemetry.js.map +1 -1
  27. package/dist/cli/tunnel-control-server.d.ts +9 -0
  28. package/dist/cli/tunnel-control-server.js +31 -0
  29. package/dist/cli/tunnel-control-server.js.map +1 -0
  30. package/dist/cli/tunnel-control-server.test.js +39 -0
  31. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  32. package/dist/cli/tunnel-handler.d.ts +3 -0
  33. package/dist/cli/tunnel-handler.js +48 -0
  34. package/dist/cli/tunnel-handler.js.map +1 -0
  35. package/dist/cli/tunnel-handler.test.js +105 -0
  36. package/dist/cli/tunnel-handler.test.js.map +1 -0
  37. package/dist/cli/tunnel.d.ts +57 -0
  38. package/dist/cli/tunnel.js +154 -0
  39. package/dist/cli/tunnel.js.map +1 -0
  40. package/dist/cli/tunnel.test.js +190 -0
  41. package/dist/cli/tunnel.test.js.map +1 -0
  42. package/dist/cli/types.d.ts +5 -0
  43. package/dist/cli/types.js +2 -0
  44. package/dist/cli/types.js.map +1 -0
  45. package/dist/cli/use-execute-steps.d.ts +1 -1
  46. package/dist/cli/use-execute-steps.js.map +1 -1
  47. package/dist/cli/use-messages.d.ts +3 -0
  48. package/dist/cli/use-messages.js +11 -0
  49. package/dist/cli/use-messages.js.map +1 -0
  50. package/dist/cli/use-nodemon.d.ts +26 -6
  51. package/dist/cli/use-nodemon.js +99 -54
  52. package/dist/cli/use-nodemon.js.map +1 -1
  53. package/dist/cli/use-open-browser.d.ts +1 -0
  54. package/dist/cli/use-open-browser.js +44 -0
  55. package/dist/cli/use-open-browser.js.map +1 -0
  56. package/dist/cli/use-tunnel.d.ts +14 -0
  57. package/dist/cli/use-tunnel.js +131 -0
  58. package/dist/cli/use-tunnel.js.map +1 -0
  59. package/dist/cli/use-typescript-check.d.ts +9 -2
  60. package/dist/cli/use-typescript-check.js +89 -51
  61. package/dist/cli/use-typescript-check.js.map +1 -1
  62. package/dist/commands/build.d.ts +0 -3
  63. package/dist/commands/build.js +3 -18
  64. package/dist/commands/build.js.map +1 -1
  65. package/dist/commands/create.d.ts +9 -0
  66. package/dist/commands/create.js +30 -0
  67. package/dist/commands/create.js.map +1 -0
  68. package/dist/commands/dev.d.ts +5 -1
  69. package/dist/commands/dev.js +106 -9
  70. package/dist/commands/dev.js.map +1 -1
  71. package/dist/commands/start.d.ts +3 -1
  72. package/dist/commands/start.js +36 -9
  73. package/dist/commands/start.js.map +1 -1
  74. package/dist/commands/telemetry/disable.js.map +1 -1
  75. package/dist/commands/telemetry/enable.js.map +1 -1
  76. package/dist/commands/telemetry/status.js.map +1 -1
  77. package/dist/context-warnings.d.ts +5 -0
  78. package/dist/context-warnings.js +31 -0
  79. package/dist/context-warnings.js.map +1 -0
  80. package/dist/context-warnings.test.d.ts +1 -0
  81. package/dist/context-warnings.test.js +28 -0
  82. package/dist/context-warnings.test.js.map +1 -0
  83. package/dist/server/app.d.ts +194 -0
  84. package/dist/server/app.js +266 -0
  85. package/dist/server/app.js.map +1 -0
  86. package/dist/server/app.test.d.ts +1 -0
  87. package/dist/server/app.test.js +97 -0
  88. package/dist/server/app.test.js.map +1 -0
  89. package/dist/server/asset-base-url-transform-plugin.d.ts +6 -6
  90. package/dist/server/asset-base-url-transform-plugin.js +25 -11
  91. package/dist/server/asset-base-url-transform-plugin.js.map +1 -1
  92. package/dist/server/asset-base-url-transform-plugin.test.js +92 -14
  93. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -1
  94. package/dist/server/auth/discovery.d.ts +33 -0
  95. package/dist/server/auth/discovery.js +56 -0
  96. package/dist/server/auth/discovery.js.map +1 -0
  97. package/dist/server/auth/discovery.test.d.ts +1 -0
  98. package/dist/server/auth/discovery.test.js +93 -0
  99. package/dist/server/auth/discovery.test.js.map +1 -0
  100. package/dist/server/auth/index.d.ts +48 -0
  101. package/dist/server/auth/index.js +2 -0
  102. package/dist/server/auth/index.js.map +1 -0
  103. package/dist/server/auth/providers/auth0.d.ts +40 -0
  104. package/dist/server/auth/providers/auth0.js +36 -0
  105. package/dist/server/auth/providers/auth0.js.map +1 -0
  106. package/dist/server/auth/providers/auth0.test.d.ts +1 -0
  107. package/dist/server/auth/providers/auth0.test.js +50 -0
  108. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  109. package/dist/server/auth/providers/authplane.d.ts +49 -0
  110. package/dist/server/auth/providers/authplane.js +57 -0
  111. package/dist/server/auth/providers/authplane.js.map +1 -0
  112. package/dist/server/auth/providers/authplane.test.d.ts +1 -0
  113. package/dist/server/auth/providers/authplane.test.js +143 -0
  114. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  115. package/dist/server/auth/providers/clerk.d.ts +51 -0
  116. package/dist/server/auth/providers/clerk.js +19 -0
  117. package/dist/server/auth/providers/clerk.js.map +1 -0
  118. package/dist/server/auth/providers/clerk.test.d.ts +1 -0
  119. package/dist/server/auth/providers/clerk.test.js +30 -0
  120. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  121. package/dist/server/auth/providers/custom.d.ts +42 -0
  122. package/dist/server/auth/providers/custom.js +59 -0
  123. package/dist/server/auth/providers/custom.js.map +1 -0
  124. package/dist/server/auth/providers/custom.test.d.ts +1 -0
  125. package/dist/server/auth/providers/custom.test.js +161 -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.d.ts +1 -0
  131. package/dist/server/auth/providers/descope.test.js +62 -0
  132. package/dist/server/auth/providers/descope.test.js.map +1 -0
  133. package/dist/server/auth/providers/shared.d.ts +2 -0
  134. package/dist/server/auth/providers/shared.js +6 -0
  135. package/dist/server/auth/providers/shared.js.map +1 -0
  136. package/dist/server/auth/providers/shared.test.d.ts +1 -0
  137. package/dist/server/auth/providers/shared.test.js +10 -0
  138. package/dist/server/auth/providers/shared.test.js.map +1 -0
  139. package/dist/server/auth/providers/stytch.d.ts +25 -0
  140. package/dist/server/auth/providers/stytch.js +16 -0
  141. package/dist/server/auth/providers/stytch.js.map +1 -0
  142. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  143. package/dist/server/auth/providers/verify-spy.js +21 -0
  144. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  145. package/dist/server/auth/providers/workos.d.ts +34 -0
  146. package/dist/server/auth/providers/workos.js +16 -0
  147. package/dist/server/auth/providers/workos.js.map +1 -0
  148. package/dist/server/auth/security-schemes.d.ts +23 -0
  149. package/dist/server/auth/security-schemes.js +64 -0
  150. package/dist/server/auth/security-schemes.js.map +1 -0
  151. package/dist/server/auth/security-schemes.test.d.ts +1 -0
  152. package/dist/server/auth/security-schemes.test.js +99 -0
  153. package/dist/server/auth/security-schemes.test.js.map +1 -0
  154. package/dist/server/auth/setup.d.ts +6 -0
  155. package/dist/server/auth/setup.js +91 -0
  156. package/dist/server/auth/setup.js.map +1 -0
  157. package/dist/server/auth/setup.test.d.ts +1 -0
  158. package/dist/server/auth/setup.test.js +514 -0
  159. package/dist/server/auth/setup.test.js.map +1 -0
  160. package/dist/server/auth/verify.d.ts +48 -0
  161. package/dist/server/auth/verify.js +62 -0
  162. package/dist/server/auth/verify.js.map +1 -0
  163. package/dist/server/auth/verify.test.d.ts +1 -0
  164. package/dist/server/auth/verify.test.js +165 -0
  165. package/dist/server/auth/verify.test.js.map +1 -0
  166. package/dist/server/auth-extra.test-d.d.ts +1 -0
  167. package/dist/server/auth-extra.test-d.js +130 -0
  168. package/dist/server/auth-extra.test-d.js.map +1 -0
  169. package/dist/server/auth.d.ts +57 -0
  170. package/dist/server/auth.js +27 -0
  171. package/dist/server/auth.js.map +1 -0
  172. package/dist/server/build-manifest.test.d.ts +1 -0
  173. package/dist/server/build-manifest.test.js +28 -0
  174. package/dist/server/build-manifest.test.js.map +1 -0
  175. package/dist/server/content-helpers.d.ts +67 -0
  176. package/dist/server/content-helpers.js +79 -0
  177. package/dist/server/content-helpers.js.map +1 -0
  178. package/dist/server/content-helpers.test.d.ts +1 -0
  179. package/dist/server/content-helpers.test.js +70 -0
  180. package/dist/server/content-helpers.test.js.map +1 -0
  181. package/dist/server/events.d.ts +113 -0
  182. package/dist/server/events.js +318 -0
  183. package/dist/server/events.js.map +1 -0
  184. package/dist/server/events.test.d.ts +1 -0
  185. package/dist/server/events.test.js +172 -0
  186. package/dist/server/events.test.js.map +1 -0
  187. package/dist/server/express.d.ts +31 -0
  188. package/dist/server/express.js +112 -0
  189. package/dist/server/express.js.map +1 -0
  190. package/dist/server/express.test.d.ts +1 -0
  191. package/dist/server/express.test.js +609 -0
  192. package/dist/server/express.test.js.map +1 -0
  193. package/dist/server/file-ref.d.ts +28 -0
  194. package/dist/server/file-ref.js +27 -0
  195. package/dist/server/file-ref.js.map +1 -0
  196. package/dist/server/form-input.d.ts +120 -0
  197. package/dist/server/form-input.js +89 -0
  198. package/dist/server/form-input.js.map +1 -0
  199. package/dist/server/host.d.ts +2 -0
  200. package/dist/server/host.js +11 -0
  201. package/dist/server/host.js.map +1 -0
  202. package/dist/server/host.test.d.ts +1 -0
  203. package/dist/server/host.test.js +13 -0
  204. package/dist/server/host.test.js.map +1 -0
  205. package/dist/server/index.d.ts +23 -3
  206. package/dist/server/index.js +19 -2
  207. package/dist/server/index.js.map +1 -1
  208. package/dist/server/inferUtilityTypes.d.ts +6 -6
  209. package/dist/server/inferUtilityTypes.js.map +1 -1
  210. package/dist/server/mcp-errors.test.d.ts +1 -0
  211. package/dist/server/mcp-errors.test.js +41 -0
  212. package/dist/server/mcp-errors.test.js.map +1 -0
  213. package/dist/server/metric.d.ts +14 -0
  214. package/dist/server/metric.js +62 -0
  215. package/dist/server/metric.js.map +1 -0
  216. package/dist/server/middleware.d.ts +162 -0
  217. package/dist/server/middleware.js +126 -0
  218. package/dist/server/middleware.js.map +1 -0
  219. package/dist/server/middleware.test-d.d.ts +1 -0
  220. package/dist/server/middleware.test-d.js +75 -0
  221. package/dist/server/middleware.test-d.js.map +1 -0
  222. package/dist/server/middleware.test.d.ts +1 -0
  223. package/dist/server/middleware.test.js +601 -0
  224. package/dist/server/middleware.test.js.map +1 -0
  225. package/dist/server/register-tool.test.d.ts +1 -0
  226. package/dist/server/register-tool.test.js +230 -0
  227. package/dist/server/register-tool.test.js.map +1 -0
  228. package/dist/server/requestOrigin.d.ts +7 -0
  229. package/dist/server/requestOrigin.js +25 -0
  230. package/dist/server/requestOrigin.js.map +1 -0
  231. package/dist/server/server.d.ts +629 -64
  232. package/dist/server/server.js +767 -121
  233. package/dist/server/server.js.map +1 -1
  234. package/dist/server/skills-integration.test.d.ts +1 -0
  235. package/dist/server/skills-integration.test.js +86 -0
  236. package/dist/server/skills-integration.test.js.map +1 -0
  237. package/dist/server/skills.d.ts +27 -0
  238. package/dist/server/skills.js +188 -0
  239. package/dist/server/skills.js.map +1 -0
  240. package/dist/server/skills.test.d.ts +1 -0
  241. package/dist/server/skills.test.js +243 -0
  242. package/dist/server/skills.test.js.map +1 -0
  243. package/dist/server/templateHelper.d.ts +2 -8
  244. package/dist/server/templateHelper.js +3 -22
  245. package/dist/server/templateHelper.js.map +1 -1
  246. package/dist/server/templates.generated.d.ts +4 -0
  247. package/dist/server/templates.generated.js +43 -0
  248. package/dist/server/templates.generated.js.map +1 -0
  249. package/dist/server/tool-extra.test.d.ts +1 -0
  250. package/dist/server/tool-extra.test.js +167 -0
  251. package/dist/server/tool-extra.test.js.map +1 -0
  252. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  253. package/dist/server/tunnel-proxy-router.js +110 -0
  254. package/dist/server/tunnel-proxy-router.js.map +1 -0
  255. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  256. package/dist/server/tunnel-proxy-router.test.js +229 -0
  257. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  258. package/dist/server/view-name.test-d.d.ts +1 -0
  259. package/dist/server/view-name.test-d.js +8 -0
  260. package/dist/server/view-name.test-d.js.map +1 -0
  261. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  262. package/dist/server/view-resource-resolution.test.js +176 -0
  263. package/dist/server/view-resource-resolution.test.js.map +1 -0
  264. package/dist/server/viewsDevServer.d.ts +14 -0
  265. package/dist/server/viewsDevServer.js +48 -0
  266. package/dist/server/viewsDevServer.js.map +1 -0
  267. package/dist/test/utils.d.ts +21 -31
  268. package/dist/test/utils.js +222 -198
  269. package/dist/test/utils.js.map +1 -1
  270. package/dist/test/view.test.d.ts +1 -0
  271. package/dist/test/view.test.js +540 -0
  272. package/dist/test/view.test.js.map +1 -0
  273. package/dist/version.d.ts +1 -0
  274. package/dist/version.js +3 -0
  275. package/dist/version.js.map +1 -0
  276. package/dist/views/index.d.ts +10 -0
  277. package/dist/views/index.js +3 -0
  278. package/dist/views/index.js.map +1 -0
  279. package/dist/views/scan-views.d.ts +16 -0
  280. package/dist/views/scan-views.js +88 -0
  281. package/dist/views/scan-views.js.map +1 -0
  282. package/dist/views/scan-views.test.d.ts +1 -0
  283. package/dist/views/scan-views.test.js +99 -0
  284. package/dist/views/scan-views.test.js.map +1 -0
  285. package/dist/views/validate-view.d.ts +1 -0
  286. package/dist/views/validate-view.js +9 -0
  287. package/dist/views/validate-view.js.map +1 -0
  288. package/dist/views/validate-view.test.d.ts +1 -0
  289. package/dist/views/validate-view.test.js +24 -0
  290. package/dist/views/validate-view.test.js.map +1 -0
  291. package/dist/web/bridges/adaptor.d.ts +62 -0
  292. package/dist/web/bridges/adaptor.js +471 -0
  293. package/dist/web/bridges/adaptor.js.map +1 -0
  294. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  295. package/dist/web/bridges/adaptor.test.js +264 -0
  296. package/dist/web/bridges/adaptor.test.js.map +1 -0
  297. package/dist/web/bridges/apps-sdk/bridge.d.ts +7 -2
  298. package/dist/web/bridges/apps-sdk/bridge.js +15 -3
  299. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  300. package/dist/web/bridges/apps-sdk/index.d.ts +1 -2
  301. package/dist/web/bridges/apps-sdk/index.js +0 -1
  302. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  303. package/dist/web/bridges/apps-sdk/types.d.ts +32 -14
  304. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  305. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +11 -0
  306. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +11 -0
  307. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  308. package/dist/web/bridges/get-adaptor.d.ts +7 -0
  309. package/dist/web/bridges/get-adaptor.js +9 -7
  310. package/dist/web/bridges/get-adaptor.js.map +1 -1
  311. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  312. package/dist/web/bridges/get-adaptor.test.js +32 -0
  313. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  314. package/dist/web/bridges/index.js.map +1 -1
  315. package/dist/web/bridges/mcp-app/bridge.d.ts +27 -31
  316. package/dist/web/bridges/mcp-app/bridge.js +118 -198
  317. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  318. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  319. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  320. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  321. package/dist/web/bridges/mcp-app/index.d.ts +0 -1
  322. package/dist/web/bridges/mcp-app/index.js +0 -1
  323. package/dist/web/bridges/mcp-app/index.js.map +1 -1
  324. package/dist/web/bridges/mcp-app/types.d.ts +19 -2
  325. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  326. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +17 -3
  327. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +14 -2
  328. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  329. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +2 -42
  330. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  331. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  332. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  333. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  334. package/dist/web/bridges/types.d.ts +189 -15
  335. package/dist/web/bridges/types.js +14 -1
  336. package/dist/web/bridges/types.js.map +1 -1
  337. package/dist/web/bridges/types.test.d.ts +1 -0
  338. package/dist/web/bridges/types.test.js +19 -0
  339. package/dist/web/bridges/types.test.js.map +1 -0
  340. package/dist/web/bridges/use-host-context.d.ts +5 -0
  341. package/dist/web/bridges/use-host-context.js +5 -0
  342. package/dist/web/bridges/use-host-context.js.map +1 -1
  343. package/dist/web/components/modal-provider.d.ts +1 -1
  344. package/dist/web/components/modal-provider.js +5 -6
  345. package/dist/web/components/modal-provider.js.map +1 -1
  346. package/dist/web/create-store.d.ts +26 -0
  347. package/dist/web/create-store.js +43 -3
  348. package/dist/web/create-store.js.map +1 -1
  349. package/dist/web/create-store.test.js +33 -27
  350. package/dist/web/create-store.test.js.map +1 -1
  351. package/dist/web/data-llm.d.ts +35 -2
  352. package/dist/web/data-llm.js +34 -5
  353. package/dist/web/data-llm.js.map +1 -1
  354. package/dist/web/data-llm.test.js +59 -37
  355. package/dist/web/data-llm.test.js.map +1 -1
  356. package/dist/web/generate-helpers.d.ts +40 -32
  357. package/dist/web/generate-helpers.js +38 -30
  358. package/dist/web/generate-helpers.js.map +1 -1
  359. package/dist/web/generate-helpers.test-d.js +33 -31
  360. package/dist/web/generate-helpers.test-d.js.map +1 -1
  361. package/dist/web/generate-helpers.test.js +2 -2
  362. package/dist/web/generate-helpers.test.js.map +1 -1
  363. package/dist/web/helpers/state.d.ts +2 -2
  364. package/dist/web/helpers/state.js +11 -11
  365. package/dist/web/helpers/state.js.map +1 -1
  366. package/dist/web/helpers/state.test.js +9 -9
  367. package/dist/web/helpers/state.test.js.map +1 -1
  368. package/dist/web/hooks/index.d.ts +12 -3
  369. package/dist/web/hooks/index.js +11 -2
  370. package/dist/web/hooks/index.js.map +1 -1
  371. package/dist/web/hooks/openai-extensions.test.d.ts +1 -0
  372. package/dist/web/hooks/openai-extensions.test.js +107 -0
  373. package/dist/web/hooks/openai-extensions.test.js.map +1 -0
  374. package/dist/web/hooks/test/utils.d.ts +7 -2
  375. package/dist/web/hooks/test/utils.js +18 -3
  376. package/dist/web/hooks/test/utils.js.map +1 -1
  377. package/dist/web/hooks/use-call-tool.d.ts +47 -2
  378. package/dist/web/hooks/use-call-tool.js +43 -10
  379. package/dist/web/hooks/use-call-tool.js.map +1 -1
  380. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -1
  381. package/dist/web/hooks/use-call-tool.test.js +75 -29
  382. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  383. package/dist/web/hooks/use-deep-link.d.ts +22 -0
  384. package/dist/web/hooks/use-deep-link.js +34 -0
  385. package/dist/web/hooks/use-deep-link.js.map +1 -0
  386. package/dist/web/hooks/use-display-mode.d.ts +23 -3
  387. package/dist/web/hooks/use-display-mode.js +20 -0
  388. package/dist/web/hooks/use-display-mode.js.map +1 -1
  389. package/dist/web/hooks/use-display-mode.test-d.d.ts +1 -0
  390. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  391. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  392. package/dist/web/hooks/use-display-mode.test.js +57 -21
  393. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  394. package/dist/web/hooks/use-download.d.ts +3 -0
  395. package/dist/web/hooks/use-download.js +7 -0
  396. package/dist/web/hooks/use-download.js.map +1 -0
  397. package/dist/web/hooks/use-download.test.d.ts +1 -0
  398. package/dist/web/hooks/use-download.test.js +103 -0
  399. package/dist/web/hooks/use-download.test.js.map +1 -0
  400. package/dist/web/hooks/use-file-resource.d.ts +37 -0
  401. package/dist/web/hooks/use-file-resource.js +98 -0
  402. package/dist/web/hooks/use-file-resource.js.map +1 -0
  403. package/dist/web/hooks/use-file-resource.test.d.ts +1 -0
  404. package/dist/web/hooks/use-file-resource.test.js +65 -0
  405. package/dist/web/hooks/use-file-resource.test.js.map +1 -0
  406. package/dist/web/hooks/use-files.d.ts +34 -1
  407. package/dist/web/hooks/use-files.js +33 -0
  408. package/dist/web/hooks/use-files.js.map +1 -1
  409. package/dist/web/hooks/use-files.test.js +36 -4
  410. package/dist/web/hooks/use-files.test.js.map +1 -1
  411. package/dist/web/hooks/use-host.d.ts +44 -0
  412. package/dist/web/hooks/use-host.js +45 -0
  413. package/dist/web/hooks/use-host.js.map +1 -0
  414. package/dist/web/hooks/use-host.test.d.ts +1 -0
  415. package/dist/web/hooks/use-host.test.js +59 -0
  416. package/dist/web/hooks/use-host.test.js.map +1 -0
  417. package/dist/web/hooks/use-model-context.d.ts +44 -0
  418. package/dist/web/hooks/use-model-context.js +63 -0
  419. package/dist/web/hooks/use-model-context.js.map +1 -0
  420. package/dist/web/hooks/use-open-external.d.ts +20 -1
  421. package/dist/web/hooks/use-open-external.js +17 -1
  422. package/dist/web/hooks/use-open-external.js.map +1 -1
  423. package/dist/web/hooks/use-open-external.test.js +40 -15
  424. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  425. package/dist/web/hooks/use-open-file.d.ts +20 -0
  426. package/dist/web/hooks/use-open-file.js +25 -0
  427. package/dist/web/hooks/use-open-file.js.map +1 -0
  428. package/dist/web/hooks/use-register-view-tool.d.ts +37 -0
  429. package/dist/web/hooks/use-register-view-tool.js +50 -0
  430. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  431. package/dist/web/hooks/use-request-close.d.ts +16 -0
  432. package/dist/web/hooks/use-request-close.js +21 -0
  433. package/dist/web/hooks/use-request-close.js.map +1 -0
  434. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  435. package/dist/web/hooks/use-request-close.test.js +47 -0
  436. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  437. package/dist/web/hooks/use-request-modal.d.ts +16 -1
  438. package/dist/web/hooks/use-request-modal.js +19 -4
  439. package/dist/web/hooks/use-request-modal.js.map +1 -1
  440. package/dist/web/hooks/use-request-modal.test.js +16 -2
  441. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  442. package/dist/web/hooks/use-request-size.d.ts +20 -0
  443. package/dist/web/hooks/use-request-size.js +24 -0
  444. package/dist/web/hooks/use-request-size.js.map +1 -0
  445. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  446. package/dist/web/hooks/use-request-size.test.js +47 -0
  447. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  448. package/dist/web/hooks/use-send-follow-up-message.d.ts +25 -1
  449. package/dist/web/hooks/use-send-follow-up-message.js +25 -2
  450. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
  451. package/dist/web/hooks/use-set-open-in-app-url.d.ts +17 -0
  452. package/dist/web/hooks/use-set-open-in-app-url.js +17 -0
  453. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -1
  454. package/dist/web/hooks/use-set-open-in-app-url.test.js +29 -21
  455. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  456. package/dist/web/hooks/use-tool-info.d.ts +46 -14
  457. package/dist/web/hooks/use-tool-info.js +29 -7
  458. package/dist/web/hooks/use-tool-info.js.map +1 -1
  459. package/dist/web/hooks/use-tool-info.test-d.js +11 -34
  460. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  461. package/dist/web/hooks/use-tool-info.test.js +43 -38
  462. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  463. package/dist/web/hooks/use-user.d.ts +5 -2
  464. package/dist/web/hooks/use-user.js +23 -4
  465. package/dist/web/hooks/use-user.js.map +1 -1
  466. package/dist/web/hooks/use-user.test.js +105 -29
  467. package/dist/web/hooks/use-user.test.js.map +1 -1
  468. package/dist/web/hooks/use-view-state.d.ts +25 -0
  469. package/dist/web/hooks/use-view-state.js +42 -0
  470. package/dist/web/hooks/use-view-state.js.map +1 -0
  471. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  472. package/dist/web/hooks/use-view-state.test.js +212 -0
  473. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  474. package/dist/web/hooks/use-viewport.d.ts +20 -0
  475. package/dist/web/hooks/use-viewport.js +21 -0
  476. package/dist/web/hooks/use-viewport.js.map +1 -0
  477. package/dist/web/hooks/use-viewport.test.d.ts +1 -0
  478. package/dist/web/hooks/use-viewport.test.js +109 -0
  479. package/dist/web/hooks/use-viewport.test.js.map +1 -0
  480. package/dist/web/index.d.ts +1 -2
  481. package/dist/web/index.js +1 -2
  482. package/dist/web/index.js.map +1 -1
  483. package/dist/web/mount-view.d.ts +21 -0
  484. package/dist/web/mount-view.js +43 -0
  485. package/dist/web/mount-view.js.map +1 -0
  486. package/dist/web/proxy.js.map +1 -1
  487. package/dist/web/types.d.ts +4 -0
  488. package/dist/web/types.js.map +1 -1
  489. package/package.json +55 -29
  490. package/tsconfig.base.json +33 -0
  491. package/dist/server/templates/development.hbs +0 -67
  492. package/dist/server/templates/production.hbs +0 -6
  493. package/dist/server/widgetsDevServer.d.ts +0 -12
  494. package/dist/server/widgetsDevServer.js +0 -57
  495. package/dist/server/widgetsDevServer.js.map +0 -1
  496. package/dist/test/widget.test.js +0 -255
  497. package/dist/test/widget.test.js.map +0 -1
  498. package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -22
  499. package/dist/web/bridges/apps-sdk/adaptor.js +0 -64
  500. package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
  501. package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -36
  502. package/dist/web/bridges/mcp-app/adaptor.js +0 -188
  503. package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
  504. package/dist/web/hooks/use-layout.d.ts +0 -22
  505. package/dist/web/hooks/use-layout.js +0 -23
  506. package/dist/web/hooks/use-layout.js.map +0 -1
  507. package/dist/web/hooks/use-layout.test.js +0 -96
  508. package/dist/web/hooks/use-layout.test.js.map +0 -1
  509. package/dist/web/hooks/use-widget-state.d.ts +0 -4
  510. package/dist/web/hooks/use-widget-state.js +0 -32
  511. package/dist/web/hooks/use-widget-state.js.map +0 -1
  512. package/dist/web/hooks/use-widget-state.test.js +0 -61
  513. package/dist/web/hooks/use-widget-state.test.js.map +0 -1
  514. package/dist/web/mount-widget.d.ts +0 -1
  515. package/dist/web/mount-widget.js +0 -27
  516. package/dist/web/mount-widget.js.map +0 -1
  517. package/dist/web/plugin/data-llm.test.js +0 -81
  518. package/dist/web/plugin/data-llm.test.js.map +0 -1
  519. package/dist/web/plugin/plugin.d.ts +0 -2
  520. package/dist/web/plugin/plugin.js +0 -46
  521. package/dist/web/plugin/plugin.js.map +0 -1
  522. package/dist/web/plugin/transform-data-llm.d.ts +0 -12
  523. package/dist/web/plugin/transform-data-llm.js +0 -96
  524. package/dist/web/plugin/transform-data-llm.js.map +0 -1
  525. package/dist/web/plugin/transform-data-llm.test.js +0 -81
  526. package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
  527. /package/dist/{test/widget.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
  528. /package/dist/{web/hooks/use-layout.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  529. /package/dist/{web/hooks/use-widget-state.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  530. /package/dist/{web/plugin/data-llm.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
  531. /package/dist/{web/plugin/transform-data-llm.test.d.ts → cli/tunnel.test.d.ts} +0 -0
@@ -7,16 +7,17 @@ export class MockResizeObserver {
7
7
  disconnect() { }
8
8
  }
9
9
  const DEFAULT_CONTEXT = {};
10
- export const getMcpAppHostPostMessageMock = (initialContext = DEFAULT_CONTEXT) => vi.fn((message) => {
10
+ export const getMcpAppHostPostMessageMock = (initialContext = DEFAULT_CONTEXT, options = {}) => vi.fn((message) => {
11
11
  switch (message.method) {
12
12
  case "ui/initialize": {
13
13
  const result = {
14
14
  protocolVersion: "2025-06-18",
15
- hostInfo: { name: "test-host", version: "1.0.0" },
16
- hostCapabilities: {},
15
+ hostInfo: options.hostInfo ?? { name: "test-host", version: "1.0.0" },
16
+ hostCapabilities: options.hostCapabilities ?? {},
17
17
  hostContext: initialContext,
18
18
  };
19
19
  act(() => fireEvent(window, new MessageEvent("message", {
20
+ source: window.parent,
20
21
  data: {
21
22
  jsonrpc: "2.0",
22
23
  id: message.id,
@@ -27,6 +28,7 @@ export const getMcpAppHostPostMessageMock = (initialContext = DEFAULT_CONTEXT) =
27
28
  }
28
29
  case "ui/update-model-context": {
29
30
  act(() => fireEvent(window, new MessageEvent("message", {
31
+ source: window.parent,
30
32
  data: {
31
33
  jsonrpc: "2.0",
32
34
  id: message.id,
@@ -35,10 +37,22 @@ export const getMcpAppHostPostMessageMock = (initialContext = DEFAULT_CONTEXT) =
35
37
  })));
36
38
  break;
37
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
+ }
38
51
  }
39
52
  });
40
53
  export const fireToolInputNotification = (args) => {
41
54
  fireEvent(window, new MessageEvent("message", {
55
+ source: window.parent,
42
56
  data: {
43
57
  jsonrpc: "2.0",
44
58
  method: "ui/notifications/tool-input",
@@ -50,6 +64,7 @@ export const fireToolInputNotification = (args) => {
50
64
  };
51
65
  export const fireToolResultNotification = (params) => {
52
66
  fireEvent(window, new MessageEvent("message", {
67
+ source: window.parent,
53
68
  data: {
54
69
  jsonrpc: "2.0",
55
70
  method: "ui/notifications/tool-result",
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/web/hooks/test/utils.ts"],"names":[],"mappings":"AAMA,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;AAE7C,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,iBAAmC,eAAe,EAClD,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,EAAE;gBACpB,WAAW,EAAE,cAAc;aAC5B,CAAC;YACF,GAAG,CAAC,GAAG,EAAE,CACP,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CAIb,SAAS,EAAE;gBACZ,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,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;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,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,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,8BAA8B;YACtC,MAAM;SACP;KACF,CACF,CACF,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/web/hooks/test/utils.ts"],"names":[],"mappings":"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","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 hostInfo?: McpUiInitializeResult[\"hostInfo\"];\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: options.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"]}
@@ -1,4 +1,4 @@
1
- import { type CallToolArgs, type CallToolResponse } from "../bridges/index.js";
1
+ import { type CallToolArgs, type CallToolOptions, type CallToolResponse } from "../bridges/index.js";
2
2
  import type { HasRequiredKeys } from "../types.js";
3
3
  type CallToolIdleState = {
4
4
  status: "idle";
@@ -36,13 +36,26 @@ type CallToolErrorState = {
36
36
  data: undefined;
37
37
  error: unknown;
38
38
  };
39
+ /**
40
+ * State of a {@link useCallTool} invocation, discriminated by `status`.
41
+ * Use `isIdle` / `isPending` / `isSuccess` / `isError` for ergonomic conditional rendering.
42
+ */
39
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
+ */
40
48
  export type SideEffects<ToolArgs, ToolResponse> = {
41
49
  onSuccess?: (data: ToolResponse, toolArgs: ToolArgs) => void;
42
50
  onError?: (error: unknown, toolArgs: ToolArgs) => void;
43
51
  onSettled?: (data: ToolResponse | undefined, error: unknown | undefined, toolArgs: ToolArgs) => void;
44
52
  };
45
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
+ */
46
59
  export type CallToolFn<TArgs, TResponse> = IsArgsOptional<TArgs> extends true ? {
47
60
  (): void;
48
61
  (sideEffects: SideEffects<TArgs, TResponse>): void;
@@ -52,12 +65,44 @@ export type CallToolFn<TArgs, TResponse> = IsArgsOptional<TArgs> extends true ?
52
65
  (args: TArgs): void;
53
66
  (args: TArgs, sideEffects: SideEffects<TArgs, TResponse>): void;
54
67
  };
68
+ /**
69
+ * Promise-returning call function returned by {@link useCallTool}. Rejects
70
+ * if the tool errors; use `try/catch` for error handling.
71
+ */
55
72
  export type CallToolAsyncFn<TArgs, TResponse> = IsArgsOptional<TArgs> extends true ? {
56
73
  (): Promise<TResponse>;
57
74
  (args: TArgs): Promise<TResponse>;
58
75
  } : (args: TArgs) => Promise<TResponse>;
59
76
  type ToolResponseSignature = Pick<CallToolResponse, "structuredContent" | "meta">;
60
- export declare const useCallTool: <ToolArgs extends CallToolArgs = null, ToolResponse extends Partial<ToolResponseSignature> = Record<string, never>>(name: string) => {
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, options?: CallToolOptions) => {
61
106
  callTool: CallToolFn<ToolArgs, CallToolResponse & ToolResponse>;
62
107
  callToolAsync: CallToolAsyncFn<ToolArgs, CallToolResponse & ToolResponse>;
63
108
  status: "idle";
@@ -1,14 +1,47 @@
1
- import { useRef, useState } from "react";
1
+ import { useCallback, useRef, useState } from "react";
2
2
  import { getAdaptor, } from "../bridges/index.js";
3
- export const useCallTool = (name) => {
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, options) => {
4
32
  const [{ status, data, error }, setCallToolState] = useState({ status: "idle", data: undefined, error: undefined });
5
33
  const callIdRef = useRef(0);
6
34
  const adaptor = getAdaptor();
7
- const execute = async (toolArgs) => {
35
+ const timeout = options?.timeout;
36
+ const execute = useCallback(async (toolArgs) => {
8
37
  const callId = ++callIdRef.current;
9
- setCallToolState({ status: "pending", data: undefined, error: undefined });
38
+ setCallToolState({
39
+ status: "pending",
40
+ data: undefined,
41
+ error: undefined,
42
+ });
10
43
  try {
11
- const data = await adaptor.callTool(name, toolArgs);
44
+ const data = await adaptor.callTool(name, toolArgs, { timeout });
12
45
  if (callId === callIdRef.current) {
13
46
  setCallToolState({ status: "success", data, error: undefined });
14
47
  }
@@ -20,14 +53,14 @@ export const useCallTool = (name) => {
20
53
  }
21
54
  throw error;
22
55
  }
23
- };
24
- const callToolAsync = ((toolArgs) => {
56
+ }, [adaptor, name, timeout]);
57
+ const callToolAsync = useCallback((toolArgs) => {
25
58
  if (toolArgs === undefined) {
26
59
  return execute(null);
27
60
  }
28
61
  return execute(toolArgs);
29
- });
30
- const callTool = ((firstArg, sideEffects) => {
62
+ }, [execute]);
63
+ const callTool = useCallback((firstArg, sideEffects) => {
31
64
  let toolArgs;
32
65
  if (firstArg &&
33
66
  typeof firstArg === "object" &&
@@ -49,7 +82,7 @@ export const useCallTool = (name) => {
49
82
  sideEffects?.onError?.(error, toolArgs);
50
83
  sideEffects?.onSettled?.(undefined, error, toolArgs);
51
84
  });
52
- });
85
+ }, [execute]);
53
86
  const callToolState = {
54
87
  status,
55
88
  data,
@@ -1 +1 @@
1
- {"version":3,"file":"use-call-tool.js","sourceRoot":"","sources":["../../../src/web/hooks/use-call-tool.ts"],"names":[],"mappings":"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"}
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 { useCallback, useRef, useState } from \"react\";\n\nimport {\n type CallToolArgs,\n type CallToolOptions,\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 options?: CallToolOptions,\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 const timeout = options?.timeout;\n\n const execute = useCallback(\n async (toolArgs: ToolArgs): Promise<CombinedCallToolResponse> => {\n const callId = ++callIdRef.current;\n setCallToolState({\n status: \"pending\",\n data: undefined,\n error: undefined,\n });\n\n try {\n const data = await adaptor.callTool<ToolArgs, CombinedCallToolResponse>(\n name,\n toolArgs,\n { timeout },\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 [adaptor, name, timeout],\n );\n\n const callToolAsync = useCallback(\n (toolArgs?: ToolArgs) => {\n if (toolArgs === undefined) {\n return execute(null as ToolArgs);\n }\n return execute(toolArgs);\n },\n [execute],\n ) as CallToolAsyncFn<ToolArgs, CombinedCallToolResponse>;\n\n const callTool = useCallback(\n (\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 },\n [execute],\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"]}
@@ -1 +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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"}
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"]}
@@ -1,18 +1,27 @@
1
1
  import { act, renderHook, waitFor } from "@testing-library/react";
2
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
- vi.stubGlobal("skybridge", { hostType: "apps-sdk" });
11
+ HostAdaptor.resetInstance();
12
+ McpAppBridge.resetInstance();
13
+ AppsSdkBridge.resetInstance();
14
+ vi.stubGlobal("parent", { postMessage: vi.fn() });
15
+ vi.stubGlobal("skybridge", {});
16
+ vi.stubGlobal("openai", { callTool: vi.fn() });
17
+ callToolMock = vi.spyOn(getAdaptor(), "callTool");
12
18
  });
13
19
  afterEach(() => {
14
20
  vi.unstubAllGlobals();
15
21
  vi.resetAllMocks();
22
+ HostAdaptor.resetInstance();
23
+ McpAppBridge.resetInstance();
24
+ AppsSdkBridge.resetInstance();
16
25
  });
17
26
  const toolName = "test-tool";
18
27
  const args = { input: "test input" };
@@ -20,20 +29,40 @@ describe("useCallTool - onSuccess callback", () => {
20
29
  content: [{ type: "text", text: "test result" }],
21
30
  structuredContent: { result: "test" },
22
31
  isError: false,
23
- result: "test result",
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
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, {
59
+ timeout: undefined,
60
+ });
32
61
  });
33
62
  it("should call onSuccess callback with correct data and toolArgs on successful execution", async () => {
34
63
  const onSuccess = vi.fn();
35
64
  const onError = vi.fn();
36
- OpenaiMock.callTool.mockResolvedValueOnce(data);
65
+ callToolMock.mockResolvedValueOnce(data);
37
66
  const { result } = renderHook(() => useCallTool(toolName));
38
67
  act(() => {
39
68
  result.current.callTool(args, {
@@ -49,7 +78,7 @@ describe("useCallTool - onSuccess callback", () => {
49
78
  it("should call onError callback with error and toolArgs on failed execution", async () => {
50
79
  const onSuccess = vi.fn();
51
80
  const onError = vi.fn();
52
- OpenaiMock.callTool.mockRejectedValueOnce(error);
81
+ callToolMock.mockRejectedValueOnce(error);
53
82
  const { result } = renderHook(() => useCallTool(toolName));
54
83
  act(() => {
55
84
  result.current.callTool(args, {
@@ -66,7 +95,7 @@ describe("useCallTool - onSuccess callback", () => {
66
95
  const onSuccess = vi.fn();
67
96
  const onError = vi.fn();
68
97
  const onSettled = vi.fn();
69
- OpenaiMock.callTool.mockResolvedValueOnce(data);
98
+ callToolMock.mockResolvedValueOnce(data);
70
99
  const { result } = renderHook(() => useCallTool(toolName));
71
100
  act(() => {
72
101
  result.current.callTool(args, {
@@ -85,7 +114,7 @@ describe("useCallTool - onSuccess callback", () => {
85
114
  const onSuccess = vi.fn();
86
115
  const onError = vi.fn();
87
116
  const onSettled = vi.fn();
88
- OpenaiMock.callTool.mockRejectedValueOnce(error);
117
+ callToolMock.mockRejectedValueOnce(error);
89
118
  const { result } = renderHook(() => useCallTool(toolName));
90
119
  act(() => {
91
120
  result.current.callTool(args, {
@@ -102,11 +131,17 @@ describe("useCallTool - onSuccess callback", () => {
102
131
  });
103
132
  it("should always return last call started state", async () => {
104
133
  const { result } = renderHook(() => useCallTool(toolName));
105
- const firstCallData = { ...data, result: "first call result" };
106
- const secondCallData = { ...data, result: "second call result" };
134
+ const firstCallData = {
135
+ ...data,
136
+ structuredContent: { result: "first call result" },
137
+ };
138
+ const secondCallData = {
139
+ ...data,
140
+ structuredContent: { result: "second call result" },
141
+ };
107
142
  const { promise: firstCallToolPromise, resolve: resolveFirstCallTool } = Promise.withResolvers();
108
143
  const { promise: secondCallToolPromise, resolve: resolveSecondCallTool } = Promise.withResolvers();
109
- OpenaiMock.callTool
144
+ callToolMock
110
145
  .mockImplementationOnce(() => firstCallToolPromise)
111
146
  .mockImplementationOnce(() => secondCallToolPromise);
112
147
  await act(() => {
@@ -123,19 +158,31 @@ describe("useCallTool - onSuccess callback", () => {
123
158
  expect(result.current.data).toEqual(secondCallData);
124
159
  });
125
160
  });
161
+ it("should keep callTool and callToolAsync stable across renders", () => {
162
+ const { result, rerender } = renderHook(() => useCallTool(toolName));
163
+ const { callTool, callToolAsync } = result.current;
164
+ rerender();
165
+ expect(result.current.callTool).toBe(callTool);
166
+ expect(result.current.callToolAsync).toBe(callToolAsync);
167
+ });
126
168
  });
127
169
  describe("useCallTool - TypeScript typing", () => {
128
- let OpenaiMock;
170
+ let callToolMock;
129
171
  beforeEach(() => {
130
- OpenaiMock = {
131
- callTool: vi.fn(),
132
- };
133
- vi.stubGlobal("openai", OpenaiMock);
134
- vi.stubGlobal("skybridge", { hostType: "apps-sdk" });
172
+ HostAdaptor.resetInstance();
173
+ McpAppBridge.resetInstance();
174
+ AppsSdkBridge.resetInstance();
175
+ vi.stubGlobal("parent", { postMessage: vi.fn() });
176
+ vi.stubGlobal("skybridge", {});
177
+ vi.stubGlobal("openai", { callTool: vi.fn() });
178
+ callToolMock = vi.spyOn(getAdaptor(), "callTool");
135
179
  });
136
180
  afterEach(() => {
137
181
  vi.unstubAllGlobals();
138
182
  vi.resetAllMocks();
183
+ HostAdaptor.resetInstance();
184
+ McpAppBridge.resetInstance();
185
+ AppsSdkBridge.resetInstance();
139
186
  });
140
187
  it("should have correct return types when ToolArgs is null and ToolResponse is specified", async () => {
141
188
  const { result } = renderHook(() => useCallTool("test-tool"));
@@ -143,14 +190,15 @@ describe("useCallTool - TypeScript typing", () => {
143
190
  content: [{ type: "text", text: "test" }],
144
191
  structuredContent: { result: "test" },
145
192
  isError: false,
146
- result: "test",
147
193
  meta: { id: 123 },
148
194
  };
149
- OpenaiMock.callTool.mockResolvedValueOnce(data);
195
+ callToolMock.mockResolvedValueOnce(data);
150
196
  await act(async () => {
151
197
  result.current.callTool();
152
198
  });
153
- expect(OpenaiMock.callTool).toHaveBeenCalledWith("test-tool", null);
199
+ expect(callToolMock).toHaveBeenCalledWith("test-tool", null, {
200
+ timeout: undefined,
201
+ });
154
202
  expectTypeOf(result.current.data);
155
203
  });
156
204
  it("should correctly type callToolAsync return value", async () => {
@@ -160,10 +208,9 @@ describe("useCallTool - TypeScript typing", () => {
160
208
  content: [{ type: "text", text: "answer" }],
161
209
  structuredContent: { answer: "test answer" },
162
210
  isError: false,
163
- result: "answer",
164
211
  meta: {},
165
212
  };
166
- OpenaiMock.callTool.mockResolvedValueOnce(mockResponse);
213
+ callToolMock.mockResolvedValueOnce(mockResponse);
167
214
  const returnedValue = await act(async () => {
168
215
  return result.current.callToolAsync(testArgs);
169
216
  });
@@ -176,10 +223,9 @@ describe("useCallTool - TypeScript typing", () => {
176
223
  content: [{ type: "text", text: "data" }],
177
224
  structuredContent: { data: "test data" },
178
225
  isError: false,
179
- result: "data",
180
226
  meta: {},
181
227
  };
182
- OpenaiMock.callTool.mockResolvedValueOnce(mockResponse);
228
+ callToolMock.mockResolvedValueOnce(mockResponse);
183
229
  const returnedValue = await act(async () => {
184
230
  return result.current.callToolAsync();
185
231
  });
@@ -1 +1 @@
1
- {"version":3,"file":"use-call-tool.test.js","sourceRoot":"","sources":["../../../src/web/hooks/use-call-tool.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-call-tool.test.js","sourceRoot":"","sources":["../../../src/web/hooks/use-call-tool.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { act, renderHook, waitFor } from \"@testing-library/react\";\nimport {\n afterEach,\n beforeEach,\n describe,\n expect,\n expectTypeOf,\n it,\n type Mock,\n vi,\n} from \"vitest\";\nimport { HostAdaptor } from \"../bridges/adaptor.js\";\nimport { AppsSdkBridge } from \"../bridges/apps-sdk/bridge.js\";\nimport { getAdaptor } from \"../bridges/get-adaptor.js\";\nimport { McpAppBridge } from \"../bridges/mcp-app/bridge.js\";\nimport type { CallToolResponse } from \"../bridges/types.js\";\nimport { useCallTool } from \"./use-call-tool.js\";\n\ndescribe(\"useCallTool - onSuccess callback\", () => {\n let callToolMock: Mock;\n\n beforeEach(() => {\n HostAdaptor.resetInstance();\n McpAppBridge.resetInstance();\n AppsSdkBridge.resetInstance();\n vi.stubGlobal(\"parent\", { postMessage: vi.fn() });\n vi.stubGlobal(\"skybridge\", {});\n vi.stubGlobal(\"openai\", { callTool: vi.fn() });\n callToolMock = vi.spyOn(getAdaptor(), \"callTool\") as unknown as Mock;\n });\n\n afterEach(() => {\n vi.unstubAllGlobals();\n vi.resetAllMocks();\n HostAdaptor.resetInstance();\n McpAppBridge.resetInstance();\n AppsSdkBridge.resetInstance();\n });\n\n const toolName = \"test-tool\";\n const args = { input: \"test input\" };\n const data: CallToolResponse = {\n content: [{ type: \"text\" as const, text: \"test result\" }],\n structuredContent: { result: \"test\" },\n isError: false,\n meta: {},\n };\n const error = new Error(\"test error\");\n\n it(\"should normalize _meta to meta when SDK returns _meta instead of meta\", async () => {\n const rawSdkResponse = {\n content: [{ type: \"text\" as const, text: \"result\" }],\n structuredContent: { value: 1 },\n isError: false,\n meta: { secret: \"only visible to widget\" },\n };\n callToolMock.mockResolvedValueOnce(rawSdkResponse);\n const { result } = renderHook(() =>\n useCallTool<typeof args, typeof data>(toolName),\n );\n\n await act(async () => {\n result.current.callTool(args);\n });\n\n await waitFor(() => {\n expect(result.current.data).toMatchObject({\n meta: { secret: \"only visible to widget\" },\n });\n });\n });\n\n it(\"should call adaptor.callTool with correct arguments\", async () => {\n const { result } = renderHook(() =>\n useCallTool<typeof args, typeof data>(toolName),\n );\n await act(async () => {\n result.current.callTool(args);\n });\n expect(callToolMock).toHaveBeenCalledWith(toolName, args, {\n timeout: undefined,\n });\n });\n\n it(\"should call onSuccess callback with correct data and toolArgs on successful execution\", async () => {\n const onSuccess = vi.fn();\n const onError = vi.fn();\n callToolMock.mockResolvedValueOnce(data);\n const { result } = renderHook(() =>\n useCallTool<typeof args, typeof data>(toolName),\n );\n\n act(() => {\n result.current.callTool(args, {\n onSuccess,\n onError,\n });\n });\n\n await waitFor(() => {\n expect(onSuccess).toHaveBeenCalledWith(data, args);\n expect(onError).not.toHaveBeenCalled();\n });\n });\n\n it(\"should call onError callback with error and toolArgs on failed execution\", async () => {\n const onSuccess = vi.fn();\n const onError = vi.fn();\n callToolMock.mockRejectedValueOnce(error);\n const { result } = renderHook(() =>\n useCallTool<typeof args, typeof data>(toolName),\n );\n\n act(() => {\n result.current.callTool(args, {\n onSuccess,\n onError,\n });\n });\n\n await waitFor(() => {\n expect(onSuccess).not.toHaveBeenCalled();\n expect(onError).toHaveBeenCalledWith(error, args);\n });\n });\n\n it(\"should call onSettled callback with data and undefined error on successful execution\", async () => {\n const onSuccess = vi.fn();\n const onError = vi.fn();\n const onSettled = vi.fn();\n callToolMock.mockResolvedValueOnce(data);\n const { result } = renderHook(() =>\n useCallTool<typeof args, typeof data>(toolName),\n );\n\n act(() => {\n result.current.callTool(args, {\n onSuccess,\n onError,\n onSettled,\n });\n });\n\n await waitFor(() => {\n expect(onSuccess).toHaveBeenCalledWith(data, args);\n expect(onSettled).toHaveBeenCalledWith(data, undefined, args);\n expect(onError).not.toHaveBeenCalled();\n });\n });\n\n it(\"should call onSettled callback with undefined data and error on failed execution\", async () => {\n const onSuccess = vi.fn();\n const onError = vi.fn();\n const onSettled = vi.fn();\n callToolMock.mockRejectedValueOnce(error);\n const { result } = renderHook(() =>\n useCallTool<typeof args, typeof data>(toolName),\n );\n\n act(() => {\n result.current.callTool(args, {\n onSuccess,\n onError,\n onSettled,\n });\n });\n\n await waitFor(() => {\n expect(onError).toHaveBeenCalledWith(error, args);\n expect(onSettled).toHaveBeenCalledWith(undefined, error, args);\n expect(onSuccess).not.toHaveBeenCalled();\n });\n });\n\n it(\"should always return last call started state\", async () => {\n const { result } = renderHook(() =>\n useCallTool<typeof args, typeof data>(toolName),\n );\n\n const firstCallData = {\n ...data,\n structuredContent: { result: \"first call result\" },\n };\n const secondCallData = {\n ...data,\n structuredContent: { result: \"second call result\" },\n };\n const { promise: firstCallToolPromise, resolve: resolveFirstCallTool } =\n Promise.withResolvers();\n const { promise: secondCallToolPromise, resolve: resolveSecondCallTool } =\n Promise.withResolvers();\n callToolMock\n .mockImplementationOnce(() => firstCallToolPromise)\n .mockImplementationOnce(() => secondCallToolPromise);\n\n await act(() => {\n result.current.callTool(args);\n result.current.callTool(args);\n resolveFirstCallTool(firstCallData);\n return firstCallToolPromise;\n });\n\n expect(result.current.status).toEqual(\"pending\");\n expect(result.current.data).toEqual(undefined);\n resolveSecondCallTool(secondCallData);\n\n await waitFor(() => {\n expect(result.current.status).toEqual(\"success\");\n expect(result.current.data).toEqual(secondCallData);\n });\n });\n\n it(\"should keep callTool and callToolAsync stable across renders\", () => {\n const { result, rerender } = renderHook(() => useCallTool(toolName));\n const { callTool, callToolAsync } = result.current;\n\n rerender();\n\n expect(result.current.callTool).toBe(callTool);\n expect(result.current.callToolAsync).toBe(callToolAsync);\n });\n});\n\ndescribe(\"useCallTool - TypeScript typing\", () => {\n let callToolMock: Mock;\n\n beforeEach(() => {\n HostAdaptor.resetInstance();\n McpAppBridge.resetInstance();\n AppsSdkBridge.resetInstance();\n vi.stubGlobal(\"parent\", { postMessage: vi.fn() });\n vi.stubGlobal(\"skybridge\", {});\n vi.stubGlobal(\"openai\", { callTool: vi.fn() });\n callToolMock = vi.spyOn(getAdaptor(), \"callTool\") as unknown as Mock;\n });\n\n afterEach(() => {\n vi.unstubAllGlobals();\n vi.resetAllMocks();\n HostAdaptor.resetInstance();\n McpAppBridge.resetInstance();\n AppsSdkBridge.resetInstance();\n });\n\n it(\"should have correct return types when ToolArgs is null and ToolResponse is specified\", async () => {\n type TestResponse = CallToolResponse & {\n structuredContent: { result: string };\n meta: { id: number };\n };\n\n const { result } = renderHook(() =>\n useCallTool<null, TestResponse>(\"test-tool\"),\n );\n const data: TestResponse = {\n content: [{ type: \"text\" as const, text: \"test\" }],\n structuredContent: { result: \"test\" },\n isError: false,\n meta: { id: 123 },\n };\n\n callToolMock.mockResolvedValueOnce(data);\n\n await act(async () => {\n result.current.callTool();\n });\n\n expect(callToolMock).toHaveBeenCalledWith(\"test-tool\", null, {\n timeout: undefined,\n });\n expectTypeOf<typeof data | undefined>(result.current.data);\n });\n\n it(\"should correctly type callToolAsync return value\", async () => {\n type TestArgs = { query: string };\n type TestResponse = CallToolResponse & {\n structuredContent: { answer: string };\n };\n\n const { result } = renderHook(() =>\n useCallTool<TestArgs, TestResponse>(\"test-tool\"),\n );\n\n const testArgs: TestArgs = { query: \"test\" };\n const mockResponse: TestResponse = {\n content: [{ type: \"text\" as const, text: \"answer\" }],\n structuredContent: { answer: \"test answer\" },\n isError: false,\n meta: {},\n };\n\n callToolMock.mockResolvedValueOnce(mockResponse);\n\n const returnedValue = await act(async () => {\n return result.current.callToolAsync(testArgs);\n });\n expectTypeOf<typeof mockResponse>(returnedValue);\n expect(returnedValue).toEqual(mockResponse);\n });\n\n it(\"should correctly type callToolAsync when ToolArgs is null\", async () => {\n type TestResponse = CallToolResponse & {\n structuredContent: { data: string };\n };\n\n const { result } = renderHook(() =>\n useCallTool<null, TestResponse>(\"test-tool\"),\n );\n\n const mockResponse: TestResponse = {\n content: [{ type: \"text\" as const, text: \"data\" }],\n structuredContent: { data: \"test data\" },\n isError: false,\n meta: {},\n };\n\n callToolMock.mockResolvedValueOnce(mockResponse);\n\n const returnedValue = await act(async () => {\n return result.current.callToolAsync();\n });\n expectTypeOf<typeof mockResponse>(returnedValue);\n expect(returnedValue).toEqual(mockResponse);\n });\n});\n"]}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * App-relative URL (path and query, e.g. `"/parts?tag=bolt"`) that ChatGPT
3
+ * opened the view on through a deep link. Updates when the user follows
4
+ * another deep link while the view is open. `undefined` when the view was not
5
+ * opened through a deep link, on hosts other than ChatGPT, or when the host
6
+ * sends a URL that isn't app-relative (it must start with a single `/`) or
7
+ * that contains a fragment.
8
+ *
9
+ * Deep links target global entrypoints: set `openai.entrypoints` to include
10
+ * `{ type: "global" }` on the tool.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * const deepLink = useDeepLink();
15
+ * useEffect(() => {
16
+ * if (deepLink) navigate(deepLink);
17
+ * }, [deepLink, navigate]);
18
+ * ```
19
+ *
20
+ * @see https://docs.skybridge.tech/api-reference/use-deep-link
21
+ */
22
+ export declare function useDeepLink(): string | undefined;
@@ -0,0 +1,34 @@
1
+ import { useMcpAppContext } from "../bridges/index.js";
2
+ /**
3
+ * App-relative URL (path and query, e.g. `"/parts?tag=bolt"`) that ChatGPT
4
+ * opened the view on through a deep link. Updates when the user follows
5
+ * another deep link while the view is open. `undefined` when the view was not
6
+ * opened through a deep link, on hosts other than ChatGPT, or when the host
7
+ * sends a URL that isn't app-relative (it must start with a single `/`) or
8
+ * that contains a fragment.
9
+ *
10
+ * Deep links target global entrypoints: set `openai.entrypoints` to include
11
+ * `{ type: "global" }` on the tool.
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * const deepLink = useDeepLink();
16
+ * useEffect(() => {
17
+ * if (deepLink) navigate(deepLink);
18
+ * }, [deepLink, navigate]);
19
+ * ```
20
+ *
21
+ * @see https://docs.skybridge.tech/api-reference/use-deep-link
22
+ */
23
+ export function useDeepLink() {
24
+ const url = useMcpAppContext("openai/deepLink")?.url;
25
+ if (typeof url !== "string" ||
26
+ !url.startsWith("/") ||
27
+ url.startsWith("//") ||
28
+ url.startsWith("/\\") ||
29
+ url.includes("#")) {
30
+ return undefined;
31
+ }
32
+ return url;
33
+ }
34
+ //# sourceMappingURL=use-deep-link.js.map