skybridge 0.0.0-dev.fd1d3d8 → 0.0.0-dev.fd4b722

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 (515) hide show
  1. package/README.md +126 -116
  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 +2 -2
  13. package/dist/cli/detect-port.js +8 -20
  14. package/dist/cli/detect-port.js.map +1 -1
  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 -7
  51. package/dist/cli/use-nodemon.js +97 -67
  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 +4 -1
  69. package/dist/commands/dev.js +95 -9
  70. package/dist/commands/dev.js.map +1 -1
  71. package/dist/commands/start.js +13 -10
  72. package/dist/commands/start.js.map +1 -1
  73. package/dist/commands/telemetry/disable.js.map +1 -1
  74. package/dist/commands/telemetry/enable.js.map +1 -1
  75. package/dist/commands/telemetry/status.js.map +1 -1
  76. package/dist/context-warnings.d.ts +5 -0
  77. package/dist/context-warnings.js +31 -0
  78. package/dist/context-warnings.js.map +1 -0
  79. package/dist/context-warnings.test.js +28 -0
  80. package/dist/context-warnings.test.js.map +1 -0
  81. package/dist/server/app.d.ts +194 -0
  82. package/dist/server/app.js +266 -0
  83. package/dist/server/app.js.map +1 -0
  84. package/dist/server/app.test.d.ts +1 -0
  85. package/dist/server/app.test.js +97 -0
  86. package/dist/server/app.test.js.map +1 -0
  87. package/dist/server/asset-base-url-transform-plugin.d.ts +6 -6
  88. package/dist/server/asset-base-url-transform-plugin.js +25 -11
  89. package/dist/server/asset-base-url-transform-plugin.js.map +1 -1
  90. package/dist/server/asset-base-url-transform-plugin.test.js +92 -14
  91. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -1
  92. package/dist/server/auth/discovery.d.ts +33 -0
  93. package/dist/server/auth/discovery.js +56 -0
  94. package/dist/server/auth/discovery.js.map +1 -0
  95. package/dist/server/auth/discovery.test.d.ts +1 -0
  96. package/dist/server/auth/discovery.test.js +93 -0
  97. package/dist/server/auth/discovery.test.js.map +1 -0
  98. package/dist/server/auth/index.d.ts +48 -0
  99. package/dist/server/auth/index.js +2 -0
  100. package/dist/server/auth/index.js.map +1 -0
  101. package/dist/server/auth/providers/auth0.d.ts +40 -0
  102. package/dist/server/auth/providers/auth0.js +36 -0
  103. package/dist/server/auth/providers/auth0.js.map +1 -0
  104. package/dist/server/auth/providers/auth0.test.d.ts +1 -0
  105. package/dist/server/auth/providers/auth0.test.js +50 -0
  106. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  107. package/dist/server/auth/providers/authplane.d.ts +49 -0
  108. package/dist/server/auth/providers/authplane.js +57 -0
  109. package/dist/server/auth/providers/authplane.js.map +1 -0
  110. package/dist/server/auth/providers/authplane.test.d.ts +1 -0
  111. package/dist/server/auth/providers/authplane.test.js +143 -0
  112. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  113. package/dist/server/auth/providers/clerk.d.ts +51 -0
  114. package/dist/server/auth/providers/clerk.js +19 -0
  115. package/dist/server/auth/providers/clerk.js.map +1 -0
  116. package/dist/server/auth/providers/clerk.test.d.ts +1 -0
  117. package/dist/server/auth/providers/clerk.test.js +30 -0
  118. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  119. package/dist/server/auth/providers/custom.d.ts +42 -0
  120. package/dist/server/auth/providers/custom.js +59 -0
  121. package/dist/server/auth/providers/custom.js.map +1 -0
  122. package/dist/server/auth/providers/custom.test.d.ts +1 -0
  123. package/dist/server/auth/providers/custom.test.js +161 -0
  124. package/dist/server/auth/providers/custom.test.js.map +1 -0
  125. package/dist/server/auth/providers/descope.d.ts +44 -0
  126. package/dist/server/auth/providers/descope.js +44 -0
  127. package/dist/server/auth/providers/descope.js.map +1 -0
  128. package/dist/server/auth/providers/descope.test.d.ts +1 -0
  129. package/dist/server/auth/providers/descope.test.js +62 -0
  130. package/dist/server/auth/providers/descope.test.js.map +1 -0
  131. package/dist/server/auth/providers/shared.d.ts +2 -0
  132. package/dist/server/auth/providers/shared.js +6 -0
  133. package/dist/server/auth/providers/shared.js.map +1 -0
  134. package/dist/server/auth/providers/shared.test.d.ts +1 -0
  135. package/dist/server/auth/providers/shared.test.js +10 -0
  136. package/dist/server/auth/providers/shared.test.js.map +1 -0
  137. package/dist/server/auth/providers/stytch.d.ts +25 -0
  138. package/dist/server/auth/providers/stytch.js +16 -0
  139. package/dist/server/auth/providers/stytch.js.map +1 -0
  140. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  141. package/dist/server/auth/providers/verify-spy.js +21 -0
  142. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  143. package/dist/server/auth/providers/workos.d.ts +34 -0
  144. package/dist/server/auth/providers/workos.js +16 -0
  145. package/dist/server/auth/providers/workos.js.map +1 -0
  146. package/dist/server/auth/security-schemes.d.ts +23 -0
  147. package/dist/server/auth/security-schemes.js +64 -0
  148. package/dist/server/auth/security-schemes.js.map +1 -0
  149. package/dist/server/auth/security-schemes.test.d.ts +1 -0
  150. package/dist/server/auth/security-schemes.test.js +99 -0
  151. package/dist/server/auth/security-schemes.test.js.map +1 -0
  152. package/dist/server/auth/setup.d.ts +6 -0
  153. package/dist/server/auth/setup.js +91 -0
  154. package/dist/server/auth/setup.js.map +1 -0
  155. package/dist/server/auth/setup.test.d.ts +1 -0
  156. package/dist/server/auth/setup.test.js +514 -0
  157. package/dist/server/auth/setup.test.js.map +1 -0
  158. package/dist/server/auth/verify.d.ts +48 -0
  159. package/dist/server/auth/verify.js +62 -0
  160. package/dist/server/auth/verify.js.map +1 -0
  161. package/dist/server/auth/verify.test.d.ts +1 -0
  162. package/dist/server/auth/verify.test.js +165 -0
  163. package/dist/server/auth/verify.test.js.map +1 -0
  164. package/dist/server/auth-extra.test-d.d.ts +1 -0
  165. package/dist/server/auth-extra.test-d.js +130 -0
  166. package/dist/server/auth-extra.test-d.js.map +1 -0
  167. package/dist/server/auth.d.ts +57 -0
  168. package/dist/server/auth.js +27 -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 +28 -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 +27 -5
  180. package/dist/server/express.js +78 -43
  181. package/dist/server/express.js.map +1 -1
  182. package/dist/server/express.test.js +556 -22
  183. package/dist/server/express.test.js.map +1 -1
  184. package/dist/server/file-ref.d.ts +28 -0
  185. package/dist/server/file-ref.js +27 -0
  186. package/dist/server/file-ref.js.map +1 -0
  187. package/dist/server/host.d.ts +2 -0
  188. package/dist/server/host.js +11 -0
  189. package/dist/server/host.js.map +1 -0
  190. package/dist/server/host.test.d.ts +1 -0
  191. package/dist/server/host.test.js +13 -0
  192. package/dist/server/host.test.js.map +1 -0
  193. package/dist/server/index.d.ts +21 -4
  194. package/dist/server/index.js +17 -2
  195. package/dist/server/index.js.map +1 -1
  196. package/dist/server/inferUtilityTypes.d.ts +6 -6
  197. package/dist/server/inferUtilityTypes.js.map +1 -1
  198. package/dist/server/mcp-errors.test.d.ts +1 -0
  199. package/dist/server/mcp-errors.test.js +41 -0
  200. package/dist/server/mcp-errors.test.js.map +1 -0
  201. package/dist/server/metric.d.ts +14 -0
  202. package/dist/server/metric.js +62 -0
  203. package/dist/server/metric.js.map +1 -0
  204. package/dist/server/middleware.d.ts +80 -14
  205. package/dist/server/middleware.js +33 -0
  206. package/dist/server/middleware.js.map +1 -1
  207. package/dist/server/middleware.test-d.js +42 -19
  208. package/dist/server/middleware.test-d.js.map +1 -1
  209. package/dist/server/middleware.test.js +291 -73
  210. package/dist/server/middleware.test.js.map +1 -1
  211. package/dist/server/register-tool.test.d.ts +1 -0
  212. package/dist/server/register-tool.test.js +77 -0
  213. package/dist/server/register-tool.test.js.map +1 -0
  214. package/dist/server/requestOrigin.d.ts +7 -0
  215. package/dist/server/requestOrigin.js +25 -0
  216. package/dist/server/requestOrigin.js.map +1 -0
  217. package/dist/server/server.d.ts +443 -86
  218. package/dist/server/server.js +533 -201
  219. package/dist/server/server.js.map +1 -1
  220. package/dist/server/skills-integration.test.d.ts +1 -0
  221. package/dist/server/skills-integration.test.js +86 -0
  222. package/dist/server/skills-integration.test.js.map +1 -0
  223. package/dist/server/skills.d.ts +27 -0
  224. package/dist/server/skills.js +188 -0
  225. package/dist/server/skills.js.map +1 -0
  226. package/dist/server/skills.test.d.ts +1 -0
  227. package/dist/server/skills.test.js +243 -0
  228. package/dist/server/skills.test.js.map +1 -0
  229. package/dist/server/templateHelper.d.ts +2 -8
  230. package/dist/server/templateHelper.js +3 -22
  231. package/dist/server/templateHelper.js.map +1 -1
  232. package/dist/server/templates.generated.d.ts +4 -0
  233. package/dist/server/templates.generated.js +43 -0
  234. package/dist/server/templates.generated.js.map +1 -0
  235. package/dist/server/tool-extra.test.d.ts +1 -0
  236. package/dist/server/tool-extra.test.js +88 -0
  237. package/dist/server/tool-extra.test.js.map +1 -0
  238. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  239. package/dist/server/tunnel-proxy-router.js +110 -0
  240. package/dist/server/tunnel-proxy-router.js.map +1 -0
  241. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  242. package/dist/server/tunnel-proxy-router.test.js +229 -0
  243. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  244. package/dist/server/view-name.test-d.d.ts +1 -0
  245. package/dist/server/view-name.test-d.js +8 -0
  246. package/dist/server/view-name.test-d.js.map +1 -0
  247. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  248. package/dist/server/view-resource-resolution.test.js +176 -0
  249. package/dist/server/view-resource-resolution.test.js.map +1 -0
  250. package/dist/server/viewsDevServer.d.ts +14 -0
  251. package/dist/server/viewsDevServer.js +48 -0
  252. package/dist/server/viewsDevServer.js.map +1 -0
  253. package/dist/test/utils.d.ts +21 -31
  254. package/dist/test/utils.js +222 -198
  255. package/dist/test/utils.js.map +1 -1
  256. package/dist/test/view.test.d.ts +1 -0
  257. package/dist/test/view.test.js +540 -0
  258. package/dist/test/view.test.js.map +1 -0
  259. package/dist/version.d.ts +1 -0
  260. package/dist/version.js +3 -0
  261. package/dist/version.js.map +1 -0
  262. package/dist/views/index.d.ts +10 -0
  263. package/dist/views/index.js +3 -0
  264. package/dist/views/index.js.map +1 -0
  265. package/dist/views/scan-views.d.ts +16 -0
  266. package/dist/views/scan-views.js +88 -0
  267. package/dist/views/scan-views.js.map +1 -0
  268. package/dist/views/scan-views.test.d.ts +1 -0
  269. package/dist/views/scan-views.test.js +99 -0
  270. package/dist/views/scan-views.test.js.map +1 -0
  271. package/dist/views/validate-view.d.ts +1 -0
  272. package/dist/views/validate-view.js +9 -0
  273. package/dist/views/validate-view.js.map +1 -0
  274. package/dist/views/validate-view.test.d.ts +1 -0
  275. package/dist/views/validate-view.test.js +24 -0
  276. package/dist/views/validate-view.test.js.map +1 -0
  277. package/dist/web/bridges/adaptor.d.ts +55 -0
  278. package/dist/web/bridges/adaptor.js +373 -0
  279. package/dist/web/bridges/adaptor.js.map +1 -0
  280. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  281. package/dist/web/bridges/adaptor.test.js +231 -0
  282. package/dist/web/bridges/adaptor.test.js.map +1 -0
  283. package/dist/web/bridges/apps-sdk/bridge.d.ts +6 -1
  284. package/dist/web/bridges/apps-sdk/bridge.js +15 -3
  285. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  286. package/dist/web/bridges/apps-sdk/index.d.ts +0 -1
  287. package/dist/web/bridges/apps-sdk/index.js +0 -1
  288. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  289. package/dist/web/bridges/apps-sdk/types.d.ts +18 -6
  290. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  291. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +11 -0
  292. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +11 -0
  293. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  294. package/dist/web/bridges/get-adaptor.d.ts +7 -0
  295. package/dist/web/bridges/get-adaptor.js +9 -7
  296. package/dist/web/bridges/get-adaptor.js.map +1 -1
  297. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  298. package/dist/web/bridges/get-adaptor.test.js +32 -0
  299. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  300. package/dist/web/bridges/index.js.map +1 -1
  301. package/dist/web/bridges/mcp-app/bridge.d.ts +27 -31
  302. package/dist/web/bridges/mcp-app/bridge.js +118 -203
  303. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  304. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  305. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  306. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  307. package/dist/web/bridges/mcp-app/index.d.ts +0 -1
  308. package/dist/web/bridges/mcp-app/index.js +0 -1
  309. package/dist/web/bridges/mcp-app/index.js.map +1 -1
  310. package/dist/web/bridges/mcp-app/types.d.ts +27 -2
  311. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  312. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +17 -3
  313. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +14 -2
  314. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  315. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +2 -42
  316. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  317. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  318. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  319. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  320. package/dist/web/bridges/types.d.ts +143 -12
  321. package/dist/web/bridges/types.js +14 -1
  322. package/dist/web/bridges/types.js.map +1 -1
  323. package/dist/web/bridges/types.test.d.ts +1 -0
  324. package/dist/web/bridges/types.test.js +19 -0
  325. package/dist/web/bridges/types.test.js.map +1 -0
  326. package/dist/web/bridges/use-host-context.d.ts +5 -0
  327. package/dist/web/bridges/use-host-context.js +5 -0
  328. package/dist/web/bridges/use-host-context.js.map +1 -1
  329. package/dist/web/components/modal-provider.d.ts +1 -1
  330. package/dist/web/components/modal-provider.js +5 -6
  331. package/dist/web/components/modal-provider.js.map +1 -1
  332. package/dist/web/create-store.d.ts +26 -0
  333. package/dist/web/create-store.js +43 -3
  334. package/dist/web/create-store.js.map +1 -1
  335. package/dist/web/create-store.test.js +27 -24
  336. package/dist/web/create-store.test.js.map +1 -1
  337. package/dist/web/data-llm.d.ts +35 -2
  338. package/dist/web/data-llm.js +34 -5
  339. package/dist/web/data-llm.js.map +1 -1
  340. package/dist/web/data-llm.test.js +49 -29
  341. package/dist/web/data-llm.test.js.map +1 -1
  342. package/dist/web/generate-helpers.d.ts +40 -32
  343. package/dist/web/generate-helpers.js +38 -30
  344. package/dist/web/generate-helpers.js.map +1 -1
  345. package/dist/web/generate-helpers.test-d.js +33 -31
  346. package/dist/web/generate-helpers.test-d.js.map +1 -1
  347. package/dist/web/generate-helpers.test.js +2 -2
  348. package/dist/web/generate-helpers.test.js.map +1 -1
  349. package/dist/web/helpers/state.d.ts +2 -2
  350. package/dist/web/helpers/state.js +11 -11
  351. package/dist/web/helpers/state.js.map +1 -1
  352. package/dist/web/helpers/state.test.js +9 -9
  353. package/dist/web/helpers/state.test.js.map +1 -1
  354. package/dist/web/hooks/index.d.ts +9 -2
  355. package/dist/web/hooks/index.js +9 -2
  356. package/dist/web/hooks/index.js.map +1 -1
  357. package/dist/web/hooks/openai-extensions.test.d.ts +1 -0
  358. package/dist/web/hooks/openai-extensions.test.js +114 -0
  359. package/dist/web/hooks/openai-extensions.test.js.map +1 -0
  360. package/dist/web/hooks/test/utils.d.ts +7 -2
  361. package/dist/web/hooks/test/utils.js +18 -3
  362. package/dist/web/hooks/test/utils.js.map +1 -1
  363. package/dist/web/hooks/use-call-tool.d.ts +47 -2
  364. package/dist/web/hooks/use-call-tool.js +43 -10
  365. package/dist/web/hooks/use-call-tool.js.map +1 -1
  366. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -1
  367. package/dist/web/hooks/use-call-tool.test.js +71 -29
  368. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  369. package/dist/web/hooks/use-deep-link.d.ts +22 -0
  370. package/dist/web/hooks/use-deep-link.js +60 -0
  371. package/dist/web/hooks/use-deep-link.js.map +1 -0
  372. package/dist/web/hooks/use-display-mode.d.ts +20 -0
  373. package/dist/web/hooks/use-display-mode.js +20 -0
  374. package/dist/web/hooks/use-display-mode.js.map +1 -1
  375. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -1
  376. package/dist/web/hooks/use-display-mode.test.js +57 -21
  377. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  378. package/dist/web/hooks/use-download.d.ts +3 -0
  379. package/dist/web/hooks/use-download.js +7 -0
  380. package/dist/web/hooks/use-download.js.map +1 -0
  381. package/dist/web/hooks/use-download.test.d.ts +1 -0
  382. package/dist/web/hooks/use-download.test.js +103 -0
  383. package/dist/web/hooks/use-download.test.js.map +1 -0
  384. package/dist/web/hooks/use-files.d.ts +34 -1
  385. package/dist/web/hooks/use-files.js +33 -0
  386. package/dist/web/hooks/use-files.js.map +1 -1
  387. package/dist/web/hooks/use-files.test.js +31 -3
  388. package/dist/web/hooks/use-files.test.js.map +1 -1
  389. package/dist/web/hooks/use-host.d.ts +44 -0
  390. package/dist/web/hooks/use-host.js +45 -0
  391. package/dist/web/hooks/use-host.js.map +1 -0
  392. package/dist/web/hooks/use-host.test.d.ts +1 -0
  393. package/dist/web/hooks/use-host.test.js +59 -0
  394. package/dist/web/hooks/use-host.test.js.map +1 -0
  395. package/dist/web/hooks/use-model-context.d.ts +44 -0
  396. package/dist/web/hooks/use-model-context.js +65 -0
  397. package/dist/web/hooks/use-model-context.js.map +1 -0
  398. package/dist/web/hooks/use-open-external.d.ts +17 -0
  399. package/dist/web/hooks/use-open-external.js +16 -0
  400. package/dist/web/hooks/use-open-external.js.map +1 -1
  401. package/dist/web/hooks/use-open-external.test.js +30 -15
  402. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  403. package/dist/web/hooks/use-register-view-tool.d.ts +37 -0
  404. package/dist/web/hooks/use-register-view-tool.js +50 -0
  405. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  406. package/dist/web/hooks/use-request-close.d.ts +16 -0
  407. package/dist/web/hooks/use-request-close.js +21 -0
  408. package/dist/web/hooks/use-request-close.js.map +1 -0
  409. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  410. package/dist/web/hooks/use-request-close.test.js +47 -0
  411. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  412. package/dist/web/hooks/use-request-modal.d.ts +16 -1
  413. package/dist/web/hooks/use-request-modal.js +19 -4
  414. package/dist/web/hooks/use-request-modal.js.map +1 -1
  415. package/dist/web/hooks/use-request-modal.test.js +16 -2
  416. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  417. package/dist/web/hooks/use-request-size.d.ts +20 -0
  418. package/dist/web/hooks/use-request-size.js +24 -0
  419. package/dist/web/hooks/use-request-size.js.map +1 -0
  420. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  421. package/dist/web/hooks/use-request-size.test.js +47 -0
  422. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  423. package/dist/web/hooks/use-send-follow-up-message.d.ts +19 -1
  424. package/dist/web/hooks/use-send-follow-up-message.js +19 -2
  425. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
  426. package/dist/web/hooks/use-set-open-in-app-url.d.ts +17 -0
  427. package/dist/web/hooks/use-set-open-in-app-url.js +17 -0
  428. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -1
  429. package/dist/web/hooks/use-set-open-in-app-url.test.js +26 -12
  430. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  431. package/dist/web/hooks/use-tool-info.d.ts +46 -14
  432. package/dist/web/hooks/use-tool-info.js +29 -7
  433. package/dist/web/hooks/use-tool-info.js.map +1 -1
  434. package/dist/web/hooks/use-tool-info.test-d.js +11 -34
  435. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  436. package/dist/web/hooks/use-tool-info.test.js +43 -38
  437. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  438. package/dist/web/hooks/use-user.d.ts +5 -2
  439. package/dist/web/hooks/use-user.js +23 -4
  440. package/dist/web/hooks/use-user.js.map +1 -1
  441. package/dist/web/hooks/use-user.test.js +105 -29
  442. package/dist/web/hooks/use-user.test.js.map +1 -1
  443. package/dist/web/hooks/use-view-state.d.ts +25 -0
  444. package/dist/web/hooks/use-view-state.js +42 -0
  445. package/dist/web/hooks/use-view-state.js.map +1 -0
  446. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  447. package/dist/web/hooks/use-view-state.test.js +212 -0
  448. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  449. package/dist/web/hooks/use-viewport.d.ts +20 -0
  450. package/dist/web/hooks/use-viewport.js +21 -0
  451. package/dist/web/hooks/use-viewport.js.map +1 -0
  452. package/dist/web/hooks/use-viewport.test.d.ts +1 -0
  453. package/dist/web/hooks/use-viewport.test.js +109 -0
  454. package/dist/web/hooks/use-viewport.test.js.map +1 -0
  455. package/dist/web/index.d.ts +1 -2
  456. package/dist/web/index.js +1 -2
  457. package/dist/web/index.js.map +1 -1
  458. package/dist/web/mount-view.d.ts +21 -0
  459. package/dist/web/mount-view.js +43 -0
  460. package/dist/web/mount-view.js.map +1 -0
  461. package/dist/web/proxy.js.map +1 -1
  462. package/dist/web/types.d.ts +4 -0
  463. package/dist/web/types.js.map +1 -1
  464. package/package.json +47 -27
  465. package/tsconfig.base.json +5 -0
  466. package/dist/server/const.d.ts +0 -1
  467. package/dist/server/const.js +0 -2
  468. package/dist/server/const.js.map +0 -1
  469. package/dist/server/templates/development.hbs +0 -67
  470. package/dist/server/templates/production.hbs +0 -6
  471. package/dist/server/widgetsDevServer.d.ts +0 -12
  472. package/dist/server/widgetsDevServer.js +0 -63
  473. package/dist/server/widgetsDevServer.js.map +0 -1
  474. package/dist/test/widget.test.js +0 -261
  475. package/dist/test/widget.test.js.map +0 -1
  476. package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -22
  477. package/dist/web/bridges/apps-sdk/adaptor.js +0 -75
  478. package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
  479. package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -36
  480. package/dist/web/bridges/mcp-app/adaptor.js +0 -190
  481. package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
  482. package/dist/web/hooks/use-layout.d.ts +0 -22
  483. package/dist/web/hooks/use-layout.js +0 -23
  484. package/dist/web/hooks/use-layout.js.map +0 -1
  485. package/dist/web/hooks/use-layout.test.js +0 -96
  486. package/dist/web/hooks/use-layout.test.js.map +0 -1
  487. package/dist/web/hooks/use-widget-state.d.ts +0 -4
  488. package/dist/web/hooks/use-widget-state.js +0 -32
  489. package/dist/web/hooks/use-widget-state.js.map +0 -1
  490. package/dist/web/hooks/use-widget-state.test.js +0 -64
  491. package/dist/web/hooks/use-widget-state.test.js.map +0 -1
  492. package/dist/web/mount-widget.d.ts +0 -1
  493. package/dist/web/mount-widget.js +0 -27
  494. package/dist/web/mount-widget.js.map +0 -1
  495. package/dist/web/plugin/data-llm.test.js +0 -81
  496. package/dist/web/plugin/data-llm.test.js.map +0 -1
  497. package/dist/web/plugin/plugin.d.ts +0 -2
  498. package/dist/web/plugin/plugin.js +0 -54
  499. package/dist/web/plugin/plugin.js.map +0 -1
  500. package/dist/web/plugin/transform-data-llm.d.ts +0 -12
  501. package/dist/web/plugin/transform-data-llm.js +0 -96
  502. package/dist/web/plugin/transform-data-llm.js.map +0 -1
  503. package/dist/web/plugin/transform-data-llm.test.js +0 -81
  504. package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
  505. package/dist/web/plugin/validate-widget.d.ts +0 -5
  506. package/dist/web/plugin/validate-widget.js +0 -27
  507. package/dist/web/plugin/validate-widget.js.map +0 -1
  508. package/dist/web/plugin/validate-widget.test.js +0 -42
  509. package/dist/web/plugin/validate-widget.test.js.map +0 -1
  510. /package/dist/{test/widget.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
  511. /package/dist/{web/hooks/use-layout.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  512. /package/dist/{web/hooks/use-widget-state.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  513. /package/dist/{web/plugin/data-llm.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
  514. /package/dist/{web/plugin/transform-data-llm.test.d.ts → cli/tunnel.test.d.ts} +0 -0
  515. /package/dist/{web/plugin/validate-widget.test.d.ts → context-warnings.test.d.ts} +0 -0
@@ -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,38 @@ 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);
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, {
@@ -102,11 +129,17 @@ describe("useCallTool - onSuccess callback", () => {
102
129
  });
103
130
  it("should always return last call started state", async () => {
104
131
  const { result } = renderHook(() => useCallTool(toolName));
105
- const firstCallData = { ...data, result: "first call result" };
106
- const secondCallData = { ...data, result: "second call result" };
132
+ const firstCallData = {
133
+ ...data,
134
+ structuredContent: { result: "first call result" },
135
+ };
136
+ const secondCallData = {
137
+ ...data,
138
+ structuredContent: { result: "second call result" },
139
+ };
107
140
  const { promise: firstCallToolPromise, resolve: resolveFirstCallTool } = Promise.withResolvers();
108
141
  const { promise: secondCallToolPromise, resolve: resolveSecondCallTool } = Promise.withResolvers();
109
- OpenaiMock.callTool
142
+ callToolMock
110
143
  .mockImplementationOnce(() => firstCallToolPromise)
111
144
  .mockImplementationOnce(() => secondCallToolPromise);
112
145
  await act(() => {
@@ -123,19 +156,31 @@ describe("useCallTool - onSuccess callback", () => {
123
156
  expect(result.current.data).toEqual(secondCallData);
124
157
  });
125
158
  });
159
+ it("should keep callTool and callToolAsync stable across renders", () => {
160
+ const { result, rerender } = renderHook(() => useCallTool(toolName));
161
+ const { callTool, callToolAsync } = result.current;
162
+ rerender();
163
+ expect(result.current.callTool).toBe(callTool);
164
+ expect(result.current.callToolAsync).toBe(callToolAsync);
165
+ });
126
166
  });
127
167
  describe("useCallTool - TypeScript typing", () => {
128
- let OpenaiMock;
168
+ let callToolMock;
129
169
  beforeEach(() => {
130
- OpenaiMock = {
131
- callTool: vi.fn(),
132
- };
133
- vi.stubGlobal("openai", OpenaiMock);
134
- vi.stubGlobal("skybridge", { hostType: "apps-sdk" });
170
+ HostAdaptor.resetInstance();
171
+ McpAppBridge.resetInstance();
172
+ AppsSdkBridge.resetInstance();
173
+ vi.stubGlobal("parent", { postMessage: vi.fn() });
174
+ vi.stubGlobal("skybridge", {});
175
+ vi.stubGlobal("openai", { callTool: vi.fn() });
176
+ callToolMock = vi.spyOn(getAdaptor(), "callTool");
135
177
  });
136
178
  afterEach(() => {
137
179
  vi.unstubAllGlobals();
138
180
  vi.resetAllMocks();
181
+ HostAdaptor.resetInstance();
182
+ McpAppBridge.resetInstance();
183
+ AppsSdkBridge.resetInstance();
139
184
  });
140
185
  it("should have correct return types when ToolArgs is null and ToolResponse is specified", async () => {
141
186
  const { result } = renderHook(() => useCallTool("test-tool"));
@@ -143,14 +188,13 @@ describe("useCallTool - TypeScript typing", () => {
143
188
  content: [{ type: "text", text: "test" }],
144
189
  structuredContent: { result: "test" },
145
190
  isError: false,
146
- result: "test",
147
191
  meta: { id: 123 },
148
192
  };
149
- OpenaiMock.callTool.mockResolvedValueOnce(data);
193
+ callToolMock.mockResolvedValueOnce(data);
150
194
  await act(async () => {
151
195
  result.current.callTool();
152
196
  });
153
- expect(OpenaiMock.callTool).toHaveBeenCalledWith("test-tool", null);
197
+ expect(callToolMock).toHaveBeenCalledWith("test-tool", null);
154
198
  expectTypeOf(result.current.data);
155
199
  });
156
200
  it("should correctly type callToolAsync return value", async () => {
@@ -160,10 +204,9 @@ describe("useCallTool - TypeScript typing", () => {
160
204
  content: [{ type: "text", text: "answer" }],
161
205
  structuredContent: { answer: "test answer" },
162
206
  isError: false,
163
- result: "answer",
164
207
  meta: {},
165
208
  };
166
- OpenaiMock.callTool.mockResolvedValueOnce(mockResponse);
209
+ callToolMock.mockResolvedValueOnce(mockResponse);
167
210
  const returnedValue = await act(async () => {
168
211
  return result.current.callToolAsync(testArgs);
169
212
  });
@@ -176,10 +219,9 @@ describe("useCallTool - TypeScript typing", () => {
176
219
  content: [{ type: "text", text: "data" }],
177
220
  structuredContent: { data: "test data" },
178
221
  isError: false,
179
- result: "data",
180
222
  meta: {},
181
223
  };
182
- OpenaiMock.callTool.mockResolvedValueOnce(mockResponse);
224
+ callToolMock.mockResolvedValueOnce(mockResponse);
183
225
  const returnedValue = await act(async () => {
184
226
  return result.current.callToolAsync();
185
227
  });
@@ -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 });\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 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,60 @@
1
+ import { useMcpAppContext } from "../bridges/index.js";
2
+ function toUrl(deepLink) {
3
+ if (typeof deepLink !== "object" || deepLink === null) {
4
+ return undefined;
5
+ }
6
+ if ("url" in deepLink) {
7
+ return deepLink.url;
8
+ }
9
+ if ("path" in deepLink &&
10
+ Array.isArray(deepLink.path) &&
11
+ deepLink.path.every((segment) => typeof segment === "string") &&
12
+ "query" in deepLink &&
13
+ Array.isArray(deepLink.query) &&
14
+ deepLink.query.every((pair) => Array.isArray(pair) &&
15
+ pair.length === 2 &&
16
+ pair.every((part) => typeof part === "string"))) {
17
+ try {
18
+ const search = new URLSearchParams(deepLink.query).toString();
19
+ const path = deepLink.path.map(encodeURIComponent).join("/");
20
+ return `/${path}${search ? `?${search}` : ""}`;
21
+ }
22
+ catch {
23
+ return undefined;
24
+ }
25
+ }
26
+ return undefined;
27
+ }
28
+ /**
29
+ * App-relative URL (path and query, e.g. `"/parts?tag=bolt"`) that ChatGPT
30
+ * opened the view on through a deep link. Updates when the user follows
31
+ * another deep link while the view is open. `undefined` when the view was not
32
+ * opened through a deep link, on hosts other than ChatGPT, or when the host
33
+ * sends a URL that isn't app-relative (it must start with a single `/`) or
34
+ * that contains a fragment.
35
+ *
36
+ * Deep links target global entrypoints: set `openai.entrypoints` to include
37
+ * `{ type: "global" }` on the tool.
38
+ *
39
+ * @example
40
+ * ```tsx
41
+ * const deepLink = useDeepLink();
42
+ * useEffect(() => {
43
+ * if (deepLink) navigate(deepLink);
44
+ * }, [deepLink, navigate]);
45
+ * ```
46
+ *
47
+ * @see https://docs.skybridge.tech/api-reference/use-deep-link
48
+ */
49
+ export function useDeepLink() {
50
+ const url = toUrl(useMcpAppContext("openai/deepLink"));
51
+ if (typeof url !== "string" ||
52
+ !url.startsWith("/") ||
53
+ url.startsWith("//") ||
54
+ url.startsWith("/\\") ||
55
+ url.includes("#")) {
56
+ return undefined;
57
+ }
58
+ return url;
59
+ }
60
+ //# sourceMappingURL=use-deep-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-deep-link.js","sourceRoot":"","sources":["../../../src/web/hooks/use-deep-link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,SAAS,KAAK,CAAC,QAAiB;IAC9B,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC,GAAG,CAAC;IACtB,CAAC;IACD,IACE,MAAM,IAAI,QAAQ;QAClB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC;QAC7D,OAAO,IAAI,QAAQ;QACnB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC7B,QAAQ,CAAC,KAAK,CAAC,KAAK,CAClB,CAAC,IAAI,EAAE,EAAE,CACP,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YACnB,IAAI,CAAC,MAAM,KAAK,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CACjD,EACD,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC9D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,GAAG,GAAG,KAAK,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACvD,IACE,OAAO,GAAG,KAAK,QAAQ;QACvB,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QACpB,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QACpB,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;QACrB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EACjB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import { useMcpAppContext } from \"../bridges/index.js\";\n\nfunction toUrl(deepLink: unknown): unknown {\n if (typeof deepLink !== \"object\" || deepLink === null) {\n return undefined;\n }\n if (\"url\" in deepLink) {\n return deepLink.url;\n }\n if (\n \"path\" in deepLink &&\n Array.isArray(deepLink.path) &&\n deepLink.path.every((segment) => typeof segment === \"string\") &&\n \"query\" in deepLink &&\n Array.isArray(deepLink.query) &&\n deepLink.query.every(\n (pair) =>\n Array.isArray(pair) &&\n pair.length === 2 &&\n pair.every((part) => typeof part === \"string\"),\n )\n ) {\n try {\n const search = new URLSearchParams(deepLink.query).toString();\n const path = deepLink.path.map(encodeURIComponent).join(\"/\");\n return `/${path}${search ? `?${search}` : \"\"}`;\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n\n/**\n * App-relative URL (path and query, e.g. `\"/parts?tag=bolt\"`) that ChatGPT\n * opened the view on through a deep link. Updates when the user follows\n * another deep link while the view is open. `undefined` when the view was not\n * opened through a deep link, on hosts other than ChatGPT, or when the host\n * sends a URL that isn't app-relative (it must start with a single `/`) or\n * that contains a fragment.\n *\n * Deep links target global entrypoints: set `openai.entrypoints` to include\n * `{ type: \"global\" }` on the tool.\n *\n * @example\n * ```tsx\n * const deepLink = useDeepLink();\n * useEffect(() => {\n * if (deepLink) navigate(deepLink);\n * }, [deepLink, navigate]);\n * ```\n *\n * @see https://docs.skybridge.tech/api-reference/use-deep-link\n */\nexport function useDeepLink(): string | undefined {\n const url = toUrl(useMcpAppContext(\"openai/deepLink\"));\n if (\n typeof url !== \"string\" ||\n !url.startsWith(\"/\") ||\n url.startsWith(\"//\") ||\n url.startsWith(\"/\\\\\") ||\n url.includes(\"#\")\n ) {\n return undefined;\n }\n return url;\n}\n"]}
@@ -1,4 +1,24 @@
1
1
  import type { RequestDisplayMode } from "../bridges/types.js";
2
+ /**
3
+ * Read and change the view's display mode (`"inline"`, `"pip"`, `"fullscreen"`).
4
+ *
5
+ * Returns a tuple `[displayMode, setDisplayMode]`. `setDisplayMode` asks the
6
+ * host to switch modes — the host returns the mode it actually applied, which
7
+ * may differ from the request. The reported value also updates when the host
8
+ * changes the mode on its own (e.g. user expands the widget).
9
+ *
10
+ * `"modal"` is reachable via {@link useRequestModal}, not this hook. To react
11
+ * to layout changes that come with display-mode switches (e.g. `maxHeight`),
12
+ * pair with {@link useViewport}.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * const [mode, setMode] = useDisplayMode();
17
+ * <button onClick={() => setMode("fullscreen")}>Expand</button>
18
+ * ```
19
+ *
20
+ * @see https://docs.skybridge.tech/api-reference/use-display-mode
21
+ */
2
22
  export declare function useDisplayMode(): readonly [import("../index.js").DisplayMode, (mode: RequestDisplayMode) => Promise<{
3
23
  mode: RequestDisplayMode;
4
24
  }>];
@@ -1,5 +1,25 @@
1
1
  import { useCallback } from "react";
2
2
  import { getAdaptor, useHostContext } from "../bridges/index.js";
3
+ /**
4
+ * Read and change the view's display mode (`"inline"`, `"pip"`, `"fullscreen"`).
5
+ *
6
+ * Returns a tuple `[displayMode, setDisplayMode]`. `setDisplayMode` asks the
7
+ * host to switch modes — the host returns the mode it actually applied, which
8
+ * may differ from the request. The reported value also updates when the host
9
+ * changes the mode on its own (e.g. user expands the widget).
10
+ *
11
+ * `"modal"` is reachable via {@link useRequestModal}, not this hook. To react
12
+ * to layout changes that come with display-mode switches (e.g. `maxHeight`),
13
+ * pair with {@link useViewport}.
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * const [mode, setMode] = useDisplayMode();
18
+ * <button onClick={() => setMode("fullscreen")}>Expand</button>
19
+ * ```
20
+ *
21
+ * @see https://docs.skybridge.tech/api-reference/use-display-mode
22
+ */
3
23
  export function useDisplayMode() {
4
24
  const displayMode = useHostContext("displayMode");
5
25
  const adaptor = getAdaptor();
@@ -1 +1 @@
1
- {"version":3,"file":"use-display-mode.js","sourceRoot":"","sources":["../../../src/web/hooks/use-display-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGjE,MAAM,UAAU,cAAc;IAC5B,MAAM,WAAW,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,IAAwB,EAAE,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAC9D,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,OAAO,CAAC,WAAW,EAAE,cAAc,CAAU,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"use-display-mode.js","sourceRoot":"","sources":["../../../src/web/hooks/use-display-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGjE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,WAAW,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,IAAwB,EAAE,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAC9D,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,OAAO,CAAC,WAAW,EAAE,cAAc,CAAU,CAAC;AAChD,CAAC","sourcesContent":["import { useCallback } from \"react\";\nimport { getAdaptor, useHostContext } from \"../bridges/index.js\";\nimport type { RequestDisplayMode } from \"../bridges/types.js\";\n\n/**\n * Read and change the view's display mode (`\"inline\"`, `\"pip\"`, `\"fullscreen\"`).\n *\n * Returns a tuple `[displayMode, setDisplayMode]`. `setDisplayMode` asks the\n * host to switch modes — the host returns the mode it actually applied, which\n * may differ from the request. The reported value also updates when the host\n * changes the mode on its own (e.g. user expands the widget).\n *\n * `\"modal\"` is reachable via {@link useRequestModal}, not this hook. To react\n * to layout changes that come with display-mode switches (e.g. `maxHeight`),\n * pair with {@link useViewport}.\n *\n * @example\n * ```tsx\n * const [mode, setMode] = useDisplayMode();\n * <button onClick={() => setMode(\"fullscreen\")}>Expand</button>\n * ```\n *\n * @see https://docs.skybridge.tech/api-reference/use-display-mode\n */\nexport function useDisplayMode() {\n const displayMode = useHostContext(\"displayMode\");\n const adaptor = getAdaptor();\n const setDisplayMode = useCallback(\n (mode: RequestDisplayMode) => adaptor.requestDisplayMode(mode),\n [adaptor],\n );\n\n return [displayMode, setDisplayMode] as const;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"use-display-mode.test-d.js","sourceRoot":"","sources":["../../../src/web/hooks/use-display-mode.test-d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAI5C,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;IAGjE,YAAY,EAET,CAAC,aAAa,EAAsB,CAAC;IAExC,qEAAqE;IACrE,MAAM,YAAY,GAAkC,OAAO,CAAC;IAC5D,KAAK,YAAY,CAAC;AACpB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"use-display-mode.test-d.js","sourceRoot":"","sources":["../../../src/web/hooks/use-display-mode.test-d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAI5C,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;IAGjE,YAAY,EAET,CAAC,aAAa,EAAsB,CAAC;IAExC,qEAAqE;IACrE,MAAM,YAAY,GAAkC,OAAO,CAAC;IAC5D,KAAK,YAAY,CAAC;AACpB,CAAC,CAAC,CAAC","sourcesContent":["import { expectTypeOf, test } from \"vitest\";\nimport type { RequestDisplayMode } from \"../bridges/types.js\";\nimport type { useDisplayMode } from \"./use-display-mode.js\";\n\ntest(\"setDisplayMode only accepts requestable display modes\", () => {\n type SetDisplayMode = ReturnType<typeof useDisplayMode>[1];\n\n expectTypeOf<\n Parameters<SetDisplayMode>[0]\n >().toEqualTypeOf<RequestDisplayMode>();\n\n // @ts-expect-error \"modal\" is a host state, not a valid request mode\n const _invalidMode: Parameters<SetDisplayMode>[0] = \"modal\";\n void _invalidMode;\n});\n"]}
@@ -1,39 +1,75 @@
1
- import { act, renderHook } from "@testing-library/react";
2
- import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
1
+ import { act, fireEvent, renderHook, waitFor } from "@testing-library/react";
2
+ import { afterEach, beforeEach, describe, expect, 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";
7
+ import { getMcpAppHostPostMessageMock, MockResizeObserver, } from "./test/utils.js";
3
8
  import { useDisplayMode } from "./use-display-mode.js";
4
9
  describe("useDisplayMode", () => {
5
- let OpenaiMock;
6
10
  beforeEach(() => {
7
- OpenaiMock = {
8
- displayMode: "inline",
9
- requestDisplayMode: vi.fn().mockResolvedValue({ mode: "inline" }),
10
- };
11
- vi.stubGlobal("openai", OpenaiMock);
12
- vi.stubGlobal("skybridge", { hostType: "apps-sdk" });
11
+ HostAdaptor.resetInstance();
12
+ McpAppBridge.resetInstance();
13
+ AppsSdkBridge.resetInstance();
14
+ vi.stubGlobal("skybridge", {});
15
+ vi.stubGlobal("openai", { view: { mode: "inline" } });
16
+ vi.stubGlobal("ResizeObserver", MockResizeObserver);
13
17
  });
14
18
  afterEach(() => {
15
19
  vi.unstubAllGlobals();
16
20
  vi.resetAllMocks();
21
+ HostAdaptor.resetInstance();
22
+ McpAppBridge.resetInstance();
23
+ AppsSdkBridge.resetInstance();
17
24
  });
18
- it("should return the current display mode from window.openai.displayMode", () => {
19
- OpenaiMock.displayMode = "inline";
25
+ it("should return the current display mode from MCP host context", async () => {
26
+ vi.stubGlobal("parent", {
27
+ postMessage: getMcpAppHostPostMessageMock({ displayMode: "inline" }),
28
+ });
20
29
  const { result } = renderHook(() => useDisplayMode());
21
- expect(result.current[0]).toBe("inline");
30
+ await waitFor(() => {
31
+ expect(result.current[0]).toBe("inline");
32
+ });
22
33
  });
23
- it("should return different display modes when window.openai.displayMode changes", () => {
24
- OpenaiMock.displayMode = "inline";
25
- const { result, rerender } = renderHook(() => useDisplayMode());
26
- expect(result.current[0]).toBe("inline");
27
- OpenaiMock.displayMode = "fullscreen";
28
- rerender();
29
- expect(result.current[0]).toBe("fullscreen");
34
+ it("should update display mode on host-context-changed notification", async () => {
35
+ vi.stubGlobal("parent", {
36
+ postMessage: getMcpAppHostPostMessageMock({ displayMode: "inline" }),
37
+ });
38
+ const { result } = renderHook(() => useDisplayMode());
39
+ await waitFor(() => {
40
+ expect(result.current[0]).toBe("inline");
41
+ });
42
+ act(() => {
43
+ fireEvent(window, new MessageEvent("message", {
44
+ source: window.parent,
45
+ data: {
46
+ jsonrpc: "2.0",
47
+ method: "ui/notifications/host-context-changed",
48
+ params: { displayMode: "fullscreen" },
49
+ },
50
+ }));
51
+ });
52
+ await waitFor(() => {
53
+ expect(result.current[0]).toBe("fullscreen");
54
+ });
30
55
  });
31
- it("should call window.openai.requestDisplayMode with correct mode when setDisplayMode is called", async () => {
56
+ it("should call requestDisplayMode on the adaptor when setDisplayMode is called", async () => {
57
+ vi.stubGlobal("parent", {
58
+ postMessage: getMcpAppHostPostMessageMock({ displayMode: "inline" }),
59
+ });
32
60
  const { result } = renderHook(() => useDisplayMode());
61
+ await waitFor(() => expect(result.current[0]).toBe("inline"));
62
+ // Patch mcp.getApp to avoid real protocol request
63
+ const adaptor = getAdaptor();
64
+ const fakeApp = {
65
+ requestDisplayMode: vi.fn().mockResolvedValue({ mode: "fullscreen" }),
66
+ };
67
+ // biome-ignore lint/suspicious/noExplicitAny: test seam
68
+ adaptor.mcp.getApp = vi.fn().mockResolvedValue(fakeApp);
33
69
  await act(async () => {
34
70
  await result.current[1]("fullscreen");
35
71
  });
36
- expect(OpenaiMock.requestDisplayMode).toHaveBeenCalledWith({
72
+ expect(fakeApp.requestDisplayMode).toHaveBeenCalledWith({
37
73
  mode: "fullscreen",
38
74
  });
39
75
  });
@@ -1 +1 @@
1
- {"version":3,"file":"use-display-mode.test.js","sourceRoot":"","sources":["../../../src/web/hooks/use-display-mode.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EACR,MAAM,EACN,EAAE,EAEF,EAAE,GACH,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,UAGH,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG;YACX,WAAW,EAAE,QAAQ;YACrB,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;SAClE,CAAC;QACF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACpC,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACtB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,UAAU,CAAC,WAAW,GAAG,QAAQ,CAAC;QAClC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;QAEtD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,UAAU,CAAC,WAAW,GAAG,QAAQ,CAAC;QAClC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;QAEhE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEzC,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC;QACtC,QAAQ,EAAE,CAAC;QAEX,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8FAA8F,EAAE,KAAK,IAAI,EAAE;QAC5G,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;QAEtD,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CAAC;YACzD,IAAI,EAAE,YAAY;SACnB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"use-display-mode.test.js","sourceRoot":"","sources":["../../../src/web/hooks/use-display-mode.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { act, fireEvent, renderHook, waitFor } from \"@testing-library/react\";\nimport { afterEach, beforeEach, describe, expect, it, vi } 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 {\n getMcpAppHostPostMessageMock,\n MockResizeObserver,\n} from \"./test/utils.js\";\nimport { useDisplayMode } from \"./use-display-mode.js\";\n\ndescribe(\"useDisplayMode\", () => {\n beforeEach(() => {\n HostAdaptor.resetInstance();\n McpAppBridge.resetInstance();\n AppsSdkBridge.resetInstance();\n vi.stubGlobal(\"skybridge\", {});\n vi.stubGlobal(\"openai\", { view: { mode: \"inline\" } });\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n });\n\n afterEach(() => {\n vi.unstubAllGlobals();\n vi.resetAllMocks();\n HostAdaptor.resetInstance();\n McpAppBridge.resetInstance();\n AppsSdkBridge.resetInstance();\n });\n\n it(\"should return the current display mode from MCP host context\", async () => {\n vi.stubGlobal(\"parent\", {\n postMessage: getMcpAppHostPostMessageMock({ displayMode: \"inline\" }),\n });\n\n const { result } = renderHook(() => useDisplayMode());\n\n await waitFor(() => {\n expect(result.current[0]).toBe(\"inline\");\n });\n });\n\n it(\"should update display mode on host-context-changed notification\", async () => {\n vi.stubGlobal(\"parent\", {\n postMessage: getMcpAppHostPostMessageMock({ displayMode: \"inline\" }),\n });\n\n const { result } = renderHook(() => useDisplayMode());\n\n await waitFor(() => {\n expect(result.current[0]).toBe(\"inline\");\n });\n\n act(() => {\n fireEvent(\n window,\n new MessageEvent(\"message\", {\n source: window.parent,\n data: {\n jsonrpc: \"2.0\",\n method: \"ui/notifications/host-context-changed\",\n params: { displayMode: \"fullscreen\" },\n },\n }),\n );\n });\n\n await waitFor(() => {\n expect(result.current[0]).toBe(\"fullscreen\");\n });\n });\n\n it(\"should call requestDisplayMode on the adaptor when setDisplayMode is called\", async () => {\n vi.stubGlobal(\"parent\", {\n postMessage: getMcpAppHostPostMessageMock({ displayMode: \"inline\" }),\n });\n\n const { result } = renderHook(() => useDisplayMode());\n\n await waitFor(() => expect(result.current[0]).toBe(\"inline\"));\n\n // Patch mcp.getApp to avoid real protocol request\n const adaptor = getAdaptor();\n const fakeApp = {\n requestDisplayMode: vi.fn().mockResolvedValue({ mode: \"fullscreen\" }),\n };\n // biome-ignore lint/suspicious/noExplicitAny: test seam\n (adaptor as any).mcp.getApp = vi.fn().mockResolvedValue(fakeApp);\n\n await act(async () => {\n await result.current[1](\"fullscreen\");\n });\n\n expect(fakeApp.requestDisplayMode).toHaveBeenCalledWith({\n mode: \"fullscreen\",\n });\n });\n});\n"]}
@@ -0,0 +1,3 @@
1
+ import type { DownloadParams, DownloadResult } from "../bridges/types.js";
2
+ export type DownloadFn = (params: DownloadParams) => Promise<DownloadResult>;
3
+ export declare function useDownload(): DownloadFn;
@@ -0,0 +1,7 @@
1
+ import { useCallback } from "react";
2
+ import { getAdaptor } from "../bridges/index.js";
3
+ export function useDownload() {
4
+ const adaptor = getAdaptor();
5
+ return useCallback((params) => adaptor.download(params), [adaptor]);
6
+ }
7
+ //# sourceMappingURL=use-download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-download.js","sourceRoot":"","sources":["../../../src/web/hooks/use-download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKjD,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,OAAO,WAAW,CAChB,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EACpC,CAAC,OAAO,CAAC,CACV,CAAC;AACJ,CAAC","sourcesContent":["import { useCallback } from \"react\";\nimport { getAdaptor } from \"../bridges/index.js\";\nimport type { DownloadParams, DownloadResult } from \"../bridges/types.js\";\n\nexport type DownloadFn = (params: DownloadParams) => Promise<DownloadResult>;\n\nexport function useDownload(): DownloadFn {\n const adaptor = getAdaptor();\n return useCallback<DownloadFn>(\n (params) => adaptor.download(params),\n [adaptor],\n );\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};