skybridge 0.0.0-dev.efb7a49 → 0.0.0-dev.efba8c5

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 (500) hide show
  1. package/README.md +126 -128
  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 +89 -0
  24. package/dist/cli/run-plain.js.map +1 -0
  25. package/dist/cli/telemetry.js.map +1 -1
  26. package/dist/cli/tunnel-control-server.d.ts +9 -0
  27. package/dist/cli/tunnel-control-server.js +31 -0
  28. package/dist/cli/tunnel-control-server.js.map +1 -0
  29. package/dist/cli/tunnel-control-server.test.js +39 -0
  30. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  31. package/dist/cli/tunnel-handler.d.ts +3 -0
  32. package/dist/cli/tunnel-handler.js +48 -0
  33. package/dist/cli/tunnel-handler.js.map +1 -0
  34. package/dist/cli/tunnel-handler.test.js +105 -0
  35. package/dist/cli/tunnel-handler.test.js.map +1 -0
  36. package/dist/cli/tunnel.d.ts +57 -0
  37. package/dist/cli/tunnel.js +154 -0
  38. package/dist/cli/tunnel.js.map +1 -0
  39. package/dist/cli/tunnel.test.js +190 -0
  40. package/dist/cli/tunnel.test.js.map +1 -0
  41. package/dist/cli/types.js.map +1 -1
  42. package/dist/cli/use-execute-steps.d.ts +1 -1
  43. package/dist/cli/use-execute-steps.js.map +1 -1
  44. package/dist/cli/use-messages.d.ts +3 -0
  45. package/dist/cli/use-messages.js +11 -0
  46. package/dist/cli/use-messages.js.map +1 -0
  47. package/dist/cli/use-nodemon.d.ts +16 -2
  48. package/dist/cli/use-nodemon.js +84 -72
  49. package/dist/cli/use-nodemon.js.map +1 -1
  50. package/dist/cli/use-open-browser.d.ts +1 -0
  51. package/dist/cli/use-open-browser.js +44 -0
  52. package/dist/cli/use-open-browser.js.map +1 -0
  53. package/dist/cli/use-tunnel.d.ts +13 -7
  54. package/dist/cli/use-tunnel.js +103 -73
  55. package/dist/cli/use-tunnel.js.map +1 -1
  56. package/dist/cli/use-typescript-check.d.ts +9 -2
  57. package/dist/cli/use-typescript-check.js +89 -51
  58. package/dist/cli/use-typescript-check.js.map +1 -1
  59. package/dist/commands/build.d.ts +0 -3
  60. package/dist/commands/build.js +3 -18
  61. package/dist/commands/build.js.map +1 -1
  62. package/dist/commands/create.d.ts +9 -0
  63. package/dist/commands/create.js +30 -0
  64. package/dist/commands/create.js.map +1 -0
  65. package/dist/commands/dev.d.ts +3 -0
  66. package/dist/commands/dev.js +90 -6
  67. package/dist/commands/dev.js.map +1 -1
  68. package/dist/commands/start.js +13 -10
  69. package/dist/commands/start.js.map +1 -1
  70. package/dist/commands/telemetry/disable.js.map +1 -1
  71. package/dist/commands/telemetry/enable.js.map +1 -1
  72. package/dist/commands/telemetry/status.js.map +1 -1
  73. package/dist/context-warnings.d.ts +5 -0
  74. package/dist/context-warnings.js +31 -0
  75. package/dist/context-warnings.js.map +1 -0
  76. package/dist/context-warnings.test.js +28 -0
  77. package/dist/context-warnings.test.js.map +1 -0
  78. package/dist/server/app.d.ts +194 -0
  79. package/dist/server/app.js +266 -0
  80. package/dist/server/app.js.map +1 -0
  81. package/dist/server/app.test.d.ts +1 -0
  82. package/dist/server/app.test.js +97 -0
  83. package/dist/server/app.test.js.map +1 -0
  84. package/dist/server/asset-base-url-transform-plugin.d.ts +6 -6
  85. package/dist/server/asset-base-url-transform-plugin.js +25 -11
  86. package/dist/server/asset-base-url-transform-plugin.js.map +1 -1
  87. package/dist/server/asset-base-url-transform-plugin.test.js +92 -14
  88. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -1
  89. package/dist/server/auth/discovery.d.ts +33 -0
  90. package/dist/server/auth/discovery.js +56 -0
  91. package/dist/server/auth/discovery.js.map +1 -0
  92. package/dist/server/auth/discovery.test.d.ts +1 -0
  93. package/dist/server/auth/discovery.test.js +93 -0
  94. package/dist/server/auth/discovery.test.js.map +1 -0
  95. package/dist/server/auth/index.d.ts +48 -0
  96. package/dist/server/auth/index.js +2 -0
  97. package/dist/server/auth/index.js.map +1 -0
  98. package/dist/server/auth/providers/auth0.d.ts +40 -0
  99. package/dist/server/auth/providers/auth0.js +36 -0
  100. package/dist/server/auth/providers/auth0.js.map +1 -0
  101. package/dist/server/auth/providers/auth0.test.d.ts +1 -0
  102. package/dist/server/auth/providers/auth0.test.js +50 -0
  103. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  104. package/dist/server/auth/providers/authplane.d.ts +49 -0
  105. package/dist/server/auth/providers/authplane.js +57 -0
  106. package/dist/server/auth/providers/authplane.js.map +1 -0
  107. package/dist/server/auth/providers/authplane.test.d.ts +1 -0
  108. package/dist/server/auth/providers/authplane.test.js +143 -0
  109. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  110. package/dist/server/auth/providers/clerk.d.ts +51 -0
  111. package/dist/server/auth/providers/clerk.js +19 -0
  112. package/dist/server/auth/providers/clerk.js.map +1 -0
  113. package/dist/server/auth/providers/clerk.test.d.ts +1 -0
  114. package/dist/server/auth/providers/clerk.test.js +30 -0
  115. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  116. package/dist/server/auth/providers/custom.d.ts +40 -0
  117. package/dist/server/auth/providers/custom.js +59 -0
  118. package/dist/server/auth/providers/custom.js.map +1 -0
  119. package/dist/server/auth/providers/custom.test.d.ts +1 -0
  120. package/dist/server/auth/providers/custom.test.js +161 -0
  121. package/dist/server/auth/providers/custom.test.js.map +1 -0
  122. package/dist/server/auth/providers/descope.d.ts +44 -0
  123. package/dist/server/auth/providers/descope.js +44 -0
  124. package/dist/server/auth/providers/descope.js.map +1 -0
  125. package/dist/server/auth/providers/descope.test.d.ts +1 -0
  126. package/dist/server/auth/providers/descope.test.js +62 -0
  127. package/dist/server/auth/providers/descope.test.js.map +1 -0
  128. package/dist/server/auth/providers/shared.d.ts +2 -0
  129. package/dist/server/auth/providers/shared.js +6 -0
  130. package/dist/server/auth/providers/shared.js.map +1 -0
  131. package/dist/server/auth/providers/shared.test.d.ts +1 -0
  132. package/dist/server/auth/providers/shared.test.js +10 -0
  133. package/dist/server/auth/providers/shared.test.js.map +1 -0
  134. package/dist/server/auth/providers/stytch.d.ts +25 -0
  135. package/dist/server/auth/providers/stytch.js +16 -0
  136. package/dist/server/auth/providers/stytch.js.map +1 -0
  137. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  138. package/dist/server/auth/providers/verify-spy.js +21 -0
  139. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  140. package/dist/server/auth/providers/workos.d.ts +33 -0
  141. package/dist/server/auth/providers/workos.js +15 -0
  142. package/dist/server/auth/providers/workos.js.map +1 -0
  143. package/dist/server/auth/security-schemes.d.ts +23 -0
  144. package/dist/server/auth/security-schemes.js +64 -0
  145. package/dist/server/auth/security-schemes.js.map +1 -0
  146. package/dist/server/auth/security-schemes.test.d.ts +1 -0
  147. package/dist/server/auth/security-schemes.test.js +99 -0
  148. package/dist/server/auth/security-schemes.test.js.map +1 -0
  149. package/dist/server/auth/setup.d.ts +6 -0
  150. package/dist/server/auth/setup.js +91 -0
  151. package/dist/server/auth/setup.js.map +1 -0
  152. package/dist/server/auth/setup.test.d.ts +1 -0
  153. package/dist/server/auth/setup.test.js +514 -0
  154. package/dist/server/auth/setup.test.js.map +1 -0
  155. package/dist/server/auth/verify.d.ts +46 -0
  156. package/dist/server/auth/verify.js +62 -0
  157. package/dist/server/auth/verify.js.map +1 -0
  158. package/dist/server/auth/verify.test.d.ts +1 -0
  159. package/dist/server/auth/verify.test.js +149 -0
  160. package/dist/server/auth/verify.test.js.map +1 -0
  161. package/dist/server/auth-extra.test-d.d.ts +1 -0
  162. package/dist/server/auth-extra.test-d.js +130 -0
  163. package/dist/server/auth-extra.test-d.js.map +1 -0
  164. package/dist/server/auth.d.ts +57 -0
  165. package/dist/server/auth.js +27 -0
  166. package/dist/server/auth.js.map +1 -0
  167. package/dist/server/build-manifest.test.d.ts +1 -0
  168. package/dist/server/build-manifest.test.js +28 -0
  169. package/dist/server/build-manifest.test.js.map +1 -0
  170. package/dist/server/content-helpers.d.ts +67 -0
  171. package/dist/server/content-helpers.js +79 -0
  172. package/dist/server/content-helpers.js.map +1 -0
  173. package/dist/server/content-helpers.test.d.ts +1 -0
  174. package/dist/server/content-helpers.test.js +70 -0
  175. package/dist/server/content-helpers.test.js.map +1 -0
  176. package/dist/server/express.d.ts +23 -7
  177. package/dist/server/express.js +62 -32
  178. package/dist/server/express.js.map +1 -1
  179. package/dist/server/express.test.js +429 -73
  180. package/dist/server/express.test.js.map +1 -1
  181. package/dist/server/file-ref.d.ts +28 -0
  182. package/dist/server/file-ref.js +27 -0
  183. package/dist/server/file-ref.js.map +1 -0
  184. package/dist/server/host.d.ts +2 -0
  185. package/dist/server/host.js +11 -0
  186. package/dist/server/host.js.map +1 -0
  187. package/dist/server/host.test.d.ts +1 -0
  188. package/dist/server/host.test.js +13 -0
  189. package/dist/server/host.test.js.map +1 -0
  190. package/dist/server/index.d.ts +20 -3
  191. package/dist/server/index.js +17 -2
  192. package/dist/server/index.js.map +1 -1
  193. package/dist/server/inferUtilityTypes.d.ts +6 -6
  194. package/dist/server/inferUtilityTypes.js.map +1 -1
  195. package/dist/server/mcp-errors.test.d.ts +1 -0
  196. package/dist/server/mcp-errors.test.js +41 -0
  197. package/dist/server/mcp-errors.test.js.map +1 -0
  198. package/dist/server/metric.d.ts +14 -0
  199. package/dist/server/metric.js +62 -0
  200. package/dist/server/metric.js.map +1 -0
  201. package/dist/server/middleware.d.ts +51 -13
  202. package/dist/server/middleware.js +33 -0
  203. package/dist/server/middleware.js.map +1 -1
  204. package/dist/server/middleware.test-d.js +1 -1
  205. package/dist/server/middleware.test-d.js.map +1 -1
  206. package/dist/server/middleware.test.js +242 -131
  207. package/dist/server/middleware.test.js.map +1 -1
  208. package/dist/server/register-tool.test.d.ts +1 -0
  209. package/dist/server/register-tool.test.js +27 -0
  210. package/dist/server/register-tool.test.js.map +1 -0
  211. package/dist/server/requestOrigin.d.ts +7 -0
  212. package/dist/server/requestOrigin.js +25 -0
  213. package/dist/server/requestOrigin.js.map +1 -0
  214. package/dist/server/server.d.ts +359 -89
  215. package/dist/server/server.js +488 -230
  216. package/dist/server/server.js.map +1 -1
  217. package/dist/server/skills-integration.test.d.ts +1 -0
  218. package/dist/server/skills-integration.test.js +86 -0
  219. package/dist/server/skills-integration.test.js.map +1 -0
  220. package/dist/server/skills.d.ts +27 -0
  221. package/dist/server/skills.js +188 -0
  222. package/dist/server/skills.js.map +1 -0
  223. package/dist/server/skills.test.d.ts +1 -0
  224. package/dist/server/skills.test.js +243 -0
  225. package/dist/server/skills.test.js.map +1 -0
  226. package/dist/server/templateHelper.d.ts +2 -7
  227. package/dist/server/templateHelper.js +3 -22
  228. package/dist/server/templateHelper.js.map +1 -1
  229. package/dist/server/templates.generated.d.ts +4 -0
  230. package/dist/server/templates.generated.js +43 -0
  231. package/dist/server/templates.generated.js.map +1 -0
  232. package/dist/server/tool-extra.test.d.ts +1 -0
  233. package/dist/server/tool-extra.test.js +88 -0
  234. package/dist/server/tool-extra.test.js.map +1 -0
  235. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  236. package/dist/server/tunnel-proxy-router.js +110 -0
  237. package/dist/server/tunnel-proxy-router.js.map +1 -0
  238. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  239. package/dist/server/tunnel-proxy-router.test.js +229 -0
  240. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  241. package/dist/server/view-name.test-d.d.ts +1 -0
  242. package/dist/server/view-name.test-d.js +8 -0
  243. package/dist/server/view-name.test-d.js.map +1 -0
  244. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  245. package/dist/server/view-resource-resolution.test.js +176 -0
  246. package/dist/server/view-resource-resolution.test.js.map +1 -0
  247. package/dist/server/viewsDevServer.d.ts +14 -0
  248. package/dist/server/viewsDevServer.js +48 -0
  249. package/dist/server/viewsDevServer.js.map +1 -0
  250. package/dist/test/utils.d.ts +21 -31
  251. package/dist/test/utils.js +222 -198
  252. package/dist/test/utils.js.map +1 -1
  253. package/dist/test/view.test.d.ts +1 -0
  254. package/dist/test/view.test.js +540 -0
  255. package/dist/test/view.test.js.map +1 -0
  256. package/dist/version.d.ts +1 -0
  257. package/dist/version.js +3 -0
  258. package/dist/version.js.map +1 -0
  259. package/dist/views/index.d.ts +10 -0
  260. package/dist/views/index.js +3 -0
  261. package/dist/views/index.js.map +1 -0
  262. package/dist/views/scan-views.d.ts +16 -0
  263. package/dist/views/scan-views.js +88 -0
  264. package/dist/views/scan-views.js.map +1 -0
  265. package/dist/views/scan-views.test.d.ts +1 -0
  266. package/dist/views/scan-views.test.js +99 -0
  267. package/dist/views/scan-views.test.js.map +1 -0
  268. package/dist/views/validate-view.d.ts +1 -0
  269. package/dist/views/validate-view.js +9 -0
  270. package/dist/views/validate-view.js.map +1 -0
  271. package/dist/views/validate-view.test.d.ts +1 -0
  272. package/dist/views/validate-view.test.js +24 -0
  273. package/dist/views/validate-view.test.js.map +1 -0
  274. package/dist/web/bridges/adaptor.d.ts +51 -0
  275. package/dist/web/bridges/adaptor.js +327 -0
  276. package/dist/web/bridges/adaptor.js.map +1 -0
  277. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  278. package/dist/web/bridges/adaptor.test.js +225 -0
  279. package/dist/web/bridges/adaptor.test.js.map +1 -0
  280. package/dist/web/bridges/apps-sdk/bridge.d.ts +6 -1
  281. package/dist/web/bridges/apps-sdk/bridge.js +15 -3
  282. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  283. package/dist/web/bridges/apps-sdk/index.d.ts +0 -1
  284. package/dist/web/bridges/apps-sdk/index.js +0 -1
  285. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  286. package/dist/web/bridges/apps-sdk/types.d.ts +18 -6
  287. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  288. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +11 -0
  289. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +11 -0
  290. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  291. package/dist/web/bridges/get-adaptor.d.ts +7 -0
  292. package/dist/web/bridges/get-adaptor.js +9 -7
  293. package/dist/web/bridges/get-adaptor.js.map +1 -1
  294. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  295. package/dist/web/bridges/get-adaptor.test.js +32 -0
  296. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  297. package/dist/web/bridges/index.js.map +1 -1
  298. package/dist/web/bridges/mcp-app/bridge.d.ts +15 -2
  299. package/dist/web/bridges/mcp-app/bridge.js +73 -7
  300. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  301. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  302. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  303. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  304. package/dist/web/bridges/mcp-app/index.d.ts +0 -1
  305. package/dist/web/bridges/mcp-app/index.js +0 -1
  306. package/dist/web/bridges/mcp-app/index.js.map +1 -1
  307. package/dist/web/bridges/mcp-app/types.d.ts +2 -0
  308. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  309. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +12 -0
  310. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +12 -0
  311. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  312. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +1 -1
  313. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  314. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  315. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  316. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  317. package/dist/web/bridges/types.d.ts +127 -11
  318. package/dist/web/bridges/types.js +14 -1
  319. package/dist/web/bridges/types.js.map +1 -1
  320. package/dist/web/bridges/types.test.d.ts +1 -0
  321. package/dist/web/bridges/types.test.js +19 -0
  322. package/dist/web/bridges/types.test.js.map +1 -0
  323. package/dist/web/bridges/use-host-context.d.ts +5 -0
  324. package/dist/web/bridges/use-host-context.js +5 -0
  325. package/dist/web/bridges/use-host-context.js.map +1 -1
  326. package/dist/web/components/modal-provider.d.ts +1 -1
  327. package/dist/web/components/modal-provider.js +4 -3
  328. package/dist/web/components/modal-provider.js.map +1 -1
  329. package/dist/web/create-store.d.ts +26 -0
  330. package/dist/web/create-store.js +43 -3
  331. package/dist/web/create-store.js.map +1 -1
  332. package/dist/web/create-store.test.js +24 -23
  333. package/dist/web/create-store.test.js.map +1 -1
  334. package/dist/web/data-llm.d.ts +35 -2
  335. package/dist/web/data-llm.js +31 -3
  336. package/dist/web/data-llm.js.map +1 -1
  337. package/dist/web/data-llm.test.js +42 -29
  338. package/dist/web/data-llm.test.js.map +1 -1
  339. package/dist/web/generate-helpers.d.ts +39 -31
  340. package/dist/web/generate-helpers.js +36 -28
  341. package/dist/web/generate-helpers.js.map +1 -1
  342. package/dist/web/generate-helpers.test-d.js +33 -31
  343. package/dist/web/generate-helpers.test-d.js.map +1 -1
  344. package/dist/web/generate-helpers.test.js +2 -2
  345. package/dist/web/generate-helpers.test.js.map +1 -1
  346. package/dist/web/helpers/state.d.ts +2 -2
  347. package/dist/web/helpers/state.js +11 -11
  348. package/dist/web/helpers/state.js.map +1 -1
  349. package/dist/web/helpers/state.test.js +9 -9
  350. package/dist/web/helpers/state.test.js.map +1 -1
  351. package/dist/web/hooks/index.d.ts +7 -2
  352. package/dist/web/hooks/index.js +7 -2
  353. package/dist/web/hooks/index.js.map +1 -1
  354. package/dist/web/hooks/test/utils.d.ts +7 -2
  355. package/dist/web/hooks/test/utils.js +14 -3
  356. package/dist/web/hooks/test/utils.js.map +1 -1
  357. package/dist/web/hooks/use-call-tool.d.ts +45 -0
  358. package/dist/web/hooks/use-call-tool.js +28 -0
  359. package/dist/web/hooks/use-call-tool.js.map +1 -1
  360. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -1
  361. package/dist/web/hooks/use-call-tool.test.js +64 -29
  362. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  363. package/dist/web/hooks/use-display-mode.d.ts +20 -0
  364. package/dist/web/hooks/use-display-mode.js +20 -0
  365. package/dist/web/hooks/use-display-mode.js.map +1 -1
  366. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -1
  367. package/dist/web/hooks/use-display-mode.test.js +57 -21
  368. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  369. package/dist/web/hooks/use-download.d.ts +3 -0
  370. package/dist/web/hooks/use-download.js +7 -0
  371. package/dist/web/hooks/use-download.js.map +1 -0
  372. package/dist/web/hooks/use-download.test.d.ts +1 -0
  373. package/dist/web/hooks/use-download.test.js +103 -0
  374. package/dist/web/hooks/use-download.test.js.map +1 -0
  375. package/dist/web/hooks/use-files.d.ts +34 -1
  376. package/dist/web/hooks/use-files.js +33 -0
  377. package/dist/web/hooks/use-files.js.map +1 -1
  378. package/dist/web/hooks/use-files.test.js +31 -3
  379. package/dist/web/hooks/use-files.test.js.map +1 -1
  380. package/dist/web/hooks/use-host.d.ts +22 -0
  381. package/dist/web/hooks/use-host.js +30 -0
  382. package/dist/web/hooks/use-host.js.map +1 -0
  383. package/dist/web/hooks/use-host.test.d.ts +1 -0
  384. package/dist/web/hooks/use-host.test.js +59 -0
  385. package/dist/web/hooks/use-host.test.js.map +1 -0
  386. package/dist/web/hooks/use-open-external.d.ts +17 -0
  387. package/dist/web/hooks/use-open-external.js +16 -0
  388. package/dist/web/hooks/use-open-external.js.map +1 -1
  389. package/dist/web/hooks/use-open-external.test.js +15 -5
  390. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  391. package/dist/web/hooks/use-register-view-tool.d.ts +37 -0
  392. package/dist/web/hooks/use-register-view-tool.js +50 -0
  393. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  394. package/dist/web/hooks/use-request-close.d.ts +16 -0
  395. package/dist/web/hooks/use-request-close.js +21 -0
  396. package/dist/web/hooks/use-request-close.js.map +1 -0
  397. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  398. package/dist/web/hooks/use-request-close.test.js +47 -0
  399. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  400. package/dist/web/hooks/use-request-modal.d.ts +16 -1
  401. package/dist/web/hooks/use-request-modal.js +19 -4
  402. package/dist/web/hooks/use-request-modal.js.map +1 -1
  403. package/dist/web/hooks/use-request-modal.test.js +12 -2
  404. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  405. package/dist/web/hooks/use-request-size.d.ts +20 -0
  406. package/dist/web/hooks/use-request-size.js +24 -0
  407. package/dist/web/hooks/use-request-size.js.map +1 -0
  408. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  409. package/dist/web/hooks/use-request-size.test.js +47 -0
  410. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  411. package/dist/web/hooks/use-send-follow-up-message.d.ts +19 -1
  412. package/dist/web/hooks/use-send-follow-up-message.js +19 -2
  413. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
  414. package/dist/web/hooks/use-set-open-in-app-url.d.ts +17 -0
  415. package/dist/web/hooks/use-set-open-in-app-url.js +17 -0
  416. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -1
  417. package/dist/web/hooks/use-set-open-in-app-url.test.js +26 -12
  418. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  419. package/dist/web/hooks/use-tool-info.d.ts +46 -14
  420. package/dist/web/hooks/use-tool-info.js +29 -7
  421. package/dist/web/hooks/use-tool-info.js.map +1 -1
  422. package/dist/web/hooks/use-tool-info.test-d.js +11 -34
  423. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  424. package/dist/web/hooks/use-tool-info.test.js +42 -37
  425. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  426. package/dist/web/hooks/use-user.d.ts +5 -2
  427. package/dist/web/hooks/use-user.js +6 -3
  428. package/dist/web/hooks/use-user.js.map +1 -1
  429. package/dist/web/hooks/use-user.test.js +85 -37
  430. package/dist/web/hooks/use-user.test.js.map +1 -1
  431. package/dist/web/hooks/use-view-state.d.ts +25 -0
  432. package/dist/web/hooks/use-view-state.js +42 -0
  433. package/dist/web/hooks/use-view-state.js.map +1 -0
  434. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  435. package/dist/web/hooks/use-view-state.test.js +212 -0
  436. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  437. package/dist/web/hooks/use-viewport.d.ts +20 -0
  438. package/dist/web/hooks/use-viewport.js +21 -0
  439. package/dist/web/hooks/use-viewport.js.map +1 -0
  440. package/dist/web/hooks/use-viewport.test.d.ts +1 -0
  441. package/dist/web/hooks/use-viewport.test.js +109 -0
  442. package/dist/web/hooks/use-viewport.test.js.map +1 -0
  443. package/dist/web/index.d.ts +1 -2
  444. package/dist/web/index.js +1 -2
  445. package/dist/web/index.js.map +1 -1
  446. package/dist/web/mount-view.d.ts +21 -0
  447. package/dist/web/mount-view.js +43 -0
  448. package/dist/web/mount-view.js.map +1 -0
  449. package/dist/web/proxy.js.map +1 -1
  450. package/dist/web/types.d.ts +4 -0
  451. package/dist/web/types.js.map +1 -1
  452. package/package.json +46 -26
  453. package/tsconfig.base.json +2 -0
  454. package/dist/server/templates/development.hbs +0 -12
  455. package/dist/server/templates/production.hbs +0 -6
  456. package/dist/server/widgetsDevServer.d.ts +0 -13
  457. package/dist/server/widgetsDevServer.js +0 -57
  458. package/dist/server/widgetsDevServer.js.map +0 -1
  459. package/dist/test/widget.test.js +0 -263
  460. package/dist/test/widget.test.js.map +0 -1
  461. package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -22
  462. package/dist/web/bridges/apps-sdk/adaptor.js +0 -75
  463. package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
  464. package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -38
  465. package/dist/web/bridges/mcp-app/adaptor.js +0 -184
  466. package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
  467. package/dist/web/hooks/use-layout.d.ts +0 -22
  468. package/dist/web/hooks/use-layout.js +0 -23
  469. package/dist/web/hooks/use-layout.js.map +0 -1
  470. package/dist/web/hooks/use-layout.test.js +0 -96
  471. package/dist/web/hooks/use-layout.test.js.map +0 -1
  472. package/dist/web/hooks/use-widget-state.d.ts +0 -4
  473. package/dist/web/hooks/use-widget-state.js +0 -32
  474. package/dist/web/hooks/use-widget-state.js.map +0 -1
  475. package/dist/web/hooks/use-widget-state.test.js +0 -64
  476. package/dist/web/hooks/use-widget-state.test.js.map +0 -1
  477. package/dist/web/mount-widget.d.ts +0 -1
  478. package/dist/web/mount-widget.js +0 -27
  479. package/dist/web/mount-widget.js.map +0 -1
  480. package/dist/web/plugin/data-llm.test.js +0 -81
  481. package/dist/web/plugin/data-llm.test.js.map +0 -1
  482. package/dist/web/plugin/plugin.d.ts +0 -2
  483. package/dist/web/plugin/plugin.js +0 -54
  484. package/dist/web/plugin/plugin.js.map +0 -1
  485. package/dist/web/plugin/transform-data-llm.d.ts +0 -12
  486. package/dist/web/plugin/transform-data-llm.js +0 -96
  487. package/dist/web/plugin/transform-data-llm.js.map +0 -1
  488. package/dist/web/plugin/transform-data-llm.test.js +0 -81
  489. package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
  490. package/dist/web/plugin/validate-widget.d.ts +0 -5
  491. package/dist/web/plugin/validate-widget.js +0 -27
  492. package/dist/web/plugin/validate-widget.js.map +0 -1
  493. package/dist/web/plugin/validate-widget.test.js +0 -42
  494. package/dist/web/plugin/validate-widget.test.js.map +0 -1
  495. /package/dist/{test/widget.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
  496. /package/dist/{web/hooks/use-layout.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  497. /package/dist/{web/hooks/use-widget-state.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  498. /package/dist/{web/plugin/data-llm.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
  499. /package/dist/{web/plugin/transform-data-llm.test.d.ts → cli/tunnel.test.d.ts} +0 -0
  500. /package/dist/{web/plugin/validate-widget.test.d.ts → context-warnings.test.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"use-tool-info.test.js","sourceRoot":"","sources":["../../../src/web/hooks/use-tool-info.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAEL,sBAAsB,EACtB,eAAe,GAChB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,IAAI,UAGH,CAAC;QAEF,UAAU,CAAC,GAAG,EAAE;YACd,UAAU,GAAG;gBACX,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;gBACzD,UAAU,EAAE,IAAI;gBAChB,oBAAoB,EAAE,IAAI;aAC3B,CAAC;YACF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACpC,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,GAAG,EAAE;YACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;YACtB,EAAE,CAAC,aAAa,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YAEnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;gBACnC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;gBACrD,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;YACnG,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,QAAQ;gBACf,WAAW,EACT,kGAAkG;aACrG,CAAC;YACF,MAAM,oBAAoB,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YACxC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YAEnD,GAAG,CAAC,GAAG,EAAE;gBACP,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC;gBACnC,UAAU,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;gBACvD,SAAS,CACP,MAAM,EACN,IAAI,eAAe,CAAC,sBAAsB,EAAE;oBAC1C,MAAM,EAAE;wBACN,OAAO,EAAE;4BACP,UAAU;4BACV,oBAAoB;yBACrB;qBACF;iBACF,CAAC,CACH,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;oBACnC,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,KAAK;oBACb,SAAS,EAAE,KAAK;oBAChB,SAAS,EAAE,IAAI;oBACf,MAAM,EAAE,UAAU;oBAClB,gBAAgB,EAAE,oBAAoB;iBACvC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,UAAU,CAAC,GAAG,EAAE;YACd,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,4BAA4B,EAAE,EAAE,CAAC,CAAC;YACzE,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;YACpD,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,EAAE,CAAC,gBAAgB,EAAE,CAAC;YACtB,EAAE,CAAC,aAAa,EAAE,CAAC;YACnB,YAAY,CAAC,aAAa,EAAE,CAAC;YAC7B,aAAa,CAAC,aAAa,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;YACjF,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YAEnD,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;oBACnC,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,IAAI;oBACZ,SAAS,EAAE,KAAK;oBAChB,SAAS,EAAE,KAAK;oBAChB,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,IAAI;oBACZ,gBAAgB,EAAE,IAAI;iBACvB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;YACxF,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YAEnD,GAAG,CAAC,GAAG,EAAE;gBACP,yBAAyB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;oBACnC,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,KAAK;oBACb,SAAS,EAAE,IAAI;oBACf,SAAS,EAAE,KAAK;oBAChB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;iBAC7C,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;YACrF,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YAEnD,GAAG,CAAC,GAAG,EAAE;gBACP,yBAAyB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBACjE,0BAA0B,CAAC;oBACzB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;oBACjD,iBAAiB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACvD,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;iBAC5B,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;oBACnC,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,KAAK;oBACb,SAAS,EAAE,KAAK;oBAChB,SAAS,EAAE,IAAI;oBACf,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;oBAC5C,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;oBAC5C,gBAAgB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;iBACvC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"use-tool-info.test.js","sourceRoot":"","sources":["../../../src/web/hooks/use-tool-info.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { act, renderHook, waitFor } from \"@testing-library/react\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { HostAdaptor } from \"../bridges/adaptor.js\";\nimport { McpAppBridge } from \"../bridges/mcp-app/index.js\";\nimport {\n fireToolInputNotification,\n fireToolResultNotification,\n getMcpAppHostPostMessageMock,\n MockResizeObserver,\n} from \"./test/utils.js\";\nimport { useToolInfo } from \"./use-tool-info.js\";\n\ndescribe(\"useToolInfo\", () => {\n describe(\"apps-sdk host\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"parent\", { postMessage: getMcpAppHostPostMessageMock() });\n vi.stubGlobal(\"openai\", {\n toolInput: null,\n toolOutput: null,\n toolResponseMetadata: null,\n });\n vi.stubGlobal(\"skybridge\", {});\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n });\n\n afterEach(() => {\n HostAdaptor.resetInstance();\n vi.unstubAllGlobals();\n vi.resetAllMocks();\n McpAppBridge.resetInstance();\n });\n\n it(\"should return pending state with tool input from tool-input notification\", async () => {\n const { result } = renderHook(() => useToolInfo());\n\n act(() => {\n fireToolInputNotification({\n name: \"pokemon\",\n args: { name: \"pikachu\" },\n });\n });\n\n await waitFor(() => {\n expect(result.current).toMatchObject({\n input: { name: \"pokemon\", args: { name: \"pikachu\" } },\n status: \"pending\",\n isPending: true,\n isSuccess: false,\n });\n });\n });\n\n it(\"should return success state once tool-result notification arrives\", async () => {\n const toolOutput = {\n name: \"pikachu\",\n color: \"yellow\",\n description:\n \"When several of these POKéMON gather, their\\felectricity could build and cause lightning storms.\",\n };\n const toolResponseMetadata = { id: 12 };\n const { result } = renderHook(() => useToolInfo());\n\n act(() => {\n fireToolInputNotification({\n name: \"pokemon\",\n args: { name: \"pikachu\" },\n });\n fireToolResultNotification({\n content: [{ type: \"text\", text: JSON.stringify(toolOutput) }],\n structuredContent: toolOutput,\n _meta: toolResponseMetadata,\n });\n });\n\n await waitFor(() => {\n expect(result.current).toMatchObject({\n status: \"success\",\n isPending: false,\n isSuccess: true,\n output: toolOutput,\n responseMetadata: toolResponseMetadata,\n });\n });\n });\n });\n\n describe(\"mcp-app host\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"parent\", { postMessage: getMcpAppHostPostMessageMock() });\n vi.stubGlobal(\"skybridge\", {});\n vi.stubGlobal(\"openai\", undefined);\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n });\n\n afterEach(async () => {\n HostAdaptor.resetInstance();\n vi.unstubAllGlobals();\n vi.resetAllMocks();\n McpAppBridge.resetInstance();\n });\n\n it(\"should return pending state with undefined input before tool-input notification arrives\", async () => {\n const { result } = renderHook(() => useToolInfo());\n\n await waitFor(() => {\n expect(result.current).toMatchObject({\n status: \"pending\",\n isPending: true,\n isSuccess: false,\n input: undefined,\n output: null,\n responseMetadata: null,\n });\n });\n });\n\n it(\"should return pending state with tool input from tool-input notification\", async () => {\n const { result } = renderHook(() => useToolInfo());\n\n act(() => {\n fireToolInputNotification({ name: \"pokemon\", query: \"pikachu\" });\n });\n\n await waitFor(() => {\n expect(result.current).toMatchObject({\n status: \"pending\",\n isPending: true,\n isSuccess: false,\n input: { name: \"pokemon\", query: \"pikachu\" },\n });\n });\n });\n\n it(\"should return success state with output from tool-result notification\", async () => {\n const { result } = renderHook(() => useToolInfo());\n\n act(() => {\n fireToolInputNotification({ name: \"pokemon\", query: \"pikachu\" });\n fireToolResultNotification({\n content: [{ type: \"text\", text: \"Pikachu data\" }],\n structuredContent: { name: \"pikachu\", color: \"yellow\" },\n _meta: { requestId: \"123\" },\n });\n });\n\n await waitFor(() => {\n expect(result.current).toMatchObject({\n status: \"success\",\n isPending: false,\n isSuccess: true,\n input: { name: \"pokemon\", query: \"pikachu\" },\n output: { name: \"pikachu\", color: \"yellow\" },\n responseMetadata: { requestId: \"123\" },\n });\n });\n });\n });\n});\n"]}
@@ -1,6 +1,7 @@
1
- import { type UserAgent } from "../bridges/index.js";
1
+ import { type Theme, type UserAgent } from "../bridges/index.js";
2
2
  export type UserState = {
3
3
  locale: string;
4
+ theme: Theme;
4
5
  userAgent: UserAgent;
5
6
  };
6
7
  /**
@@ -9,10 +10,12 @@ export type UserState = {
9
10
  *
10
11
  * @example
11
12
  * ```tsx
12
- * const { locale, userAgent } = useUser();
13
+ * const { locale, theme, userAgent } = useUser();
13
14
  *
14
15
  * // Access device type
15
16
  * const isMobile = userAgent.device.type === "mobile";
16
17
  * ```
18
+ *
19
+ * @see https://docs.skybridge.tech/api-reference/use-user
17
20
  */
18
21
  export declare function useUser(): UserState;
@@ -1,4 +1,4 @@
1
- import { useHostContext } from "../bridges/index.js";
1
+ import { useHostContext, } from "../bridges/index.js";
2
2
  const DEFAULT_LOCALE = "en-US";
3
3
  /**
4
4
  * Normalizes a locale string to canonical BCP 47 format using {@link Intl.Locale}.
@@ -21,15 +21,18 @@ function normalizeLocale(locale) {
21
21
  *
22
22
  * @example
23
23
  * ```tsx
24
- * const { locale, userAgent } = useUser();
24
+ * const { locale, theme, userAgent } = useUser();
25
25
  *
26
26
  * // Access device type
27
27
  * const isMobile = userAgent.device.type === "mobile";
28
28
  * ```
29
+ *
30
+ * @see https://docs.skybridge.tech/api-reference/use-user
29
31
  */
30
32
  export function useUser() {
31
33
  const rawLocale = useHostContext("locale");
34
+ const theme = useHostContext("theme");
32
35
  const userAgent = useHostContext("userAgent");
33
- return { locale: normalizeLocale(rawLocale), userAgent };
36
+ return { locale: normalizeLocale(rawLocale), theme, userAgent };
34
37
  }
35
38
  //# sourceMappingURL=use-user.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-user.js","sourceRoot":"","sources":["../../../src/web/hooks/use-user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAOrE,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,MAAc;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,OAAO;IACrB,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAE9C,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"use-user.js","sourceRoot":"","sources":["../../../src/web/hooks/use-user.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,cAAc,GACf,MAAM,qBAAqB,CAAC;AAQ7B,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,MAAc;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,OAAO;IACrB,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAE9C,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAClE,CAAC","sourcesContent":["import {\n type Theme,\n type UserAgent,\n useHostContext,\n} from \"../bridges/index.js\";\n\nexport type UserState = {\n locale: string;\n theme: Theme;\n userAgent: UserAgent;\n};\n\nconst DEFAULT_LOCALE = \"en-US\";\n\n/**\n * Normalizes a locale string to canonical BCP 47 format using {@link Intl.Locale}.\n *\n * Handles underscored identifiers returned by the ChatGPT mobile app (e.g. \"fr_FR\" → \"fr-FR\"),\n * incorrect casing (e.g. \"en-us\" → \"en-US\"), and complex subtags (e.g. \"zh_Hans_CN\" → \"zh-Hans-CN\").\n * Falls back to \"en-US\" if the locale is invalid.\n */\nfunction normalizeLocale(locale: string): string {\n try {\n return new Intl.Locale(locale.replace(/_/g, \"-\")).toString();\n } catch {\n return DEFAULT_LOCALE;\n }\n}\n\n/**\n * Hook for accessing session-stable user information.\n * These values are set once at initialization and do not change during the session.\n *\n * @example\n * ```tsx\n * const { locale, theme, userAgent } = useUser();\n *\n * // Access device type\n * const isMobile = userAgent.device.type === \"mobile\";\n * ```\n *\n * @see https://docs.skybridge.tech/api-reference/use-user\n */\nexport function useUser(): UserState {\n const rawLocale = useHostContext(\"locale\");\n const theme = useHostContext(\"theme\");\n const userAgent = useHostContext(\"userAgent\");\n\n return { locale: normalizeLocale(rawLocale), theme, userAgent };\n}\n"]}
@@ -1,75 +1,123 @@
1
1
  import { renderHook, waitFor } from "@testing-library/react";
2
2
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
- import { McpAppAdaptor } from "../bridges/mcp-app/adaptor.js";
3
+ import { HostAdaptor } from "../bridges/adaptor.js";
4
4
  import { McpAppBridge } from "../bridges/mcp-app/bridge.js";
5
5
  import { getMcpAppHostPostMessageMock, MockResizeObserver, } from "./test/utils.js";
6
6
  import { useUser } from "./use-user.js";
7
7
  describe("useUser", () => {
8
8
  describe("apps-sdk host type", () => {
9
- let OpenaiMock;
10
9
  beforeEach(() => {
11
- OpenaiMock = {
12
- locale: "en-US",
13
- userAgent: {
14
- device: { type: "desktop" },
15
- capabilities: { hover: true, touch: false },
16
- },
17
- };
18
- vi.stubGlobal("openai", OpenaiMock);
19
- vi.stubGlobal("skybridge", { hostType: "apps-sdk" });
10
+ HostAdaptor.resetInstance();
11
+ McpAppBridge.resetInstance();
12
+ vi.stubGlobal("openai", { locale: "en-US" });
13
+ vi.stubGlobal("skybridge", {});
14
+ vi.stubGlobal("ResizeObserver", MockResizeObserver);
20
15
  });
21
16
  afterEach(() => {
22
17
  vi.unstubAllGlobals();
23
18
  vi.resetAllMocks();
19
+ McpAppBridge.resetInstance();
20
+ HostAdaptor.resetInstance();
24
21
  });
25
- it("should return locale and userAgent from window.openai", () => {
22
+ it("should return locale, theme and userAgent from mcp host context", async () => {
23
+ vi.stubGlobal("parent", {
24
+ postMessage: getMcpAppHostPostMessageMock({
25
+ locale: "en-US",
26
+ theme: "dark",
27
+ platform: "web",
28
+ deviceCapabilities: { hover: true, touch: false },
29
+ }),
30
+ });
26
31
  const { result } = renderHook(() => useUser());
27
- expect(result.current.locale).toBe("en-US");
28
- expect(result.current.userAgent).toEqual({
29
- device: { type: "desktop" },
30
- capabilities: { hover: true, touch: false },
32
+ await waitFor(() => {
33
+ expect(result.current.locale).toBe("en-US");
34
+ expect(result.current.theme).toBe("dark");
35
+ expect(result.current.userAgent).toEqual({
36
+ device: { type: "desktop" },
37
+ capabilities: { hover: true, touch: false },
38
+ });
31
39
  });
32
40
  });
33
- it("should return mobile userAgent when set to mobile", () => {
34
- OpenaiMock.userAgent = {
35
- device: { type: "mobile" },
36
- capabilities: { hover: false, touch: true },
37
- };
41
+ it("should return mobile userAgent when set to mobile", async () => {
42
+ vi.stubGlobal("parent", {
43
+ postMessage: getMcpAppHostPostMessageMock({
44
+ locale: "en-US",
45
+ platform: "mobile",
46
+ deviceCapabilities: { hover: false, touch: true },
47
+ }),
48
+ });
38
49
  const { result } = renderHook(() => useUser());
39
- expect(result.current.userAgent.device.type).toBe("mobile");
40
- expect(result.current.userAgent.capabilities.touch).toBe(true);
50
+ await waitFor(() => {
51
+ expect(result.current.userAgent.device.type).toBe("mobile");
52
+ expect(result.current.userAgent.capabilities.touch).toBe(true);
53
+ });
41
54
  });
42
- it("should return different locale when set", () => {
43
- OpenaiMock.locale = "es-ES";
55
+ it("should return different locale when set", async () => {
56
+ vi.stubGlobal("parent", {
57
+ postMessage: getMcpAppHostPostMessageMock({
58
+ locale: "es-ES",
59
+ platform: "web",
60
+ deviceCapabilities: { hover: true, touch: false },
61
+ }),
62
+ });
44
63
  const { result } = renderHook(() => useUser());
45
- expect(result.current.locale).toBe("es-ES");
64
+ await waitFor(() => {
65
+ expect(result.current.locale).toBe("es-ES");
66
+ });
46
67
  });
47
- it("should normalize underscore locale to BCP 47 hyphen format", () => {
48
- OpenaiMock.locale = "fr_FR";
68
+ it("should normalize underscore locale to BCP 47 hyphen format", async () => {
69
+ vi.stubGlobal("parent", {
70
+ postMessage: getMcpAppHostPostMessageMock({
71
+ locale: "fr_FR",
72
+ platform: "web",
73
+ deviceCapabilities: { hover: true, touch: false },
74
+ }),
75
+ });
49
76
  const { result } = renderHook(() => useUser());
50
- expect(result.current.locale).toBe("fr-FR");
77
+ await waitFor(() => {
78
+ expect(result.current.locale).toBe("fr-FR");
79
+ });
51
80
  });
52
- it("should canonicalize locale casing", () => {
53
- OpenaiMock.locale = "en-us";
81
+ it("should canonicalize locale casing", async () => {
82
+ vi.stubGlobal("parent", {
83
+ postMessage: getMcpAppHostPostMessageMock({
84
+ locale: "en-us",
85
+ platform: "web",
86
+ deviceCapabilities: { hover: true, touch: false },
87
+ }),
88
+ });
54
89
  const { result } = renderHook(() => useUser());
55
- expect(result.current.locale).toBe("en-US");
90
+ await waitFor(() => {
91
+ expect(result.current.locale).toBe("en-US");
92
+ });
56
93
  });
57
- it("should fall back to en-US for invalid locale", () => {
58
- OpenaiMock.locale = "not-a-locale-!!";
94
+ it("should fall back to en-US for invalid locale", async () => {
95
+ vi.stubGlobal("parent", {
96
+ postMessage: getMcpAppHostPostMessageMock({
97
+ locale: "not-a-locale-!!",
98
+ platform: "web",
99
+ deviceCapabilities: { hover: true, touch: false },
100
+ }),
101
+ });
59
102
  const { result } = renderHook(() => useUser());
60
- expect(result.current.locale).toBe("en-US");
103
+ await waitFor(() => {
104
+ expect(result.current.locale).toBe("en-US");
105
+ });
61
106
  });
62
107
  });
63
108
  describe("mcp-app host type", () => {
64
109
  beforeEach(() => {
65
- vi.stubGlobal("skybridge", { hostType: "mcp-app" });
110
+ HostAdaptor.resetInstance();
111
+ McpAppBridge.resetInstance();
112
+ vi.stubGlobal("openai", undefined);
113
+ vi.stubGlobal("skybridge", {});
66
114
  vi.stubGlobal("ResizeObserver", MockResizeObserver);
67
115
  });
68
116
  afterEach(async () => {
69
117
  vi.unstubAllGlobals();
70
118
  vi.resetAllMocks();
71
119
  McpAppBridge.resetInstance();
72
- McpAppAdaptor.resetInstance();
120
+ HostAdaptor.resetInstance();
73
121
  });
74
122
  it("should return locale and userAgent from mcp host context", async () => {
75
123
  vi.stubGlobal("parent", {
@@ -1 +1 @@
1
- {"version":3,"file":"use-user.test.js","sourceRoot":"","sources":["../../../src/web/hooks/use-user.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,EACL,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,IAAI,UAGH,CAAC;QAEF,UAAU,CAAC,GAAG,EAAE;YACd,UAAU,GAAG;gBACX,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE;oBACT,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oBAC3B,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;iBAC5C;aACF,CAAC;YACF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACpC,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,GAAG,EAAE;YACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;YACtB,EAAE,CAAC,aAAa,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAE/C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;gBACvC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC3B,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;aAC5C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,UAAU,CAAC,SAAS,GAAG;gBACrB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;aAC5C,CAAC;YACF,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAE/C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC;YAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAE/C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC;YAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAE/C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC;YAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAE/C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,UAAU,CAAC,MAAM,GAAG,iBAAiB,CAAC;YACtC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAE/C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,UAAU,CAAC,GAAG,EAAE;YACd,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;YACpD,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,EAAE,CAAC,gBAAgB,EAAE,CAAC;YACtB,EAAE,CAAC,aAAa,EAAE,CAAC;YACnB,YAAY,CAAC,aAAa,EAAE,CAAC;YAC7B,aAAa,CAAC,aAAa,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE;gBACtB,WAAW,EAAE,4BAA4B,CAAC;oBACxC,MAAM,EAAE,OAAO;oBACf,QAAQ,EAAE,KAAK;oBACf,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;iBAClD,CAAC;aACH,CAAC,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAE/C,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;oBACvC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oBAC3B,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;iBAC5C,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE;gBACtB,WAAW,EAAE,4BAA4B,CAAC;oBACxC,MAAM,EAAE,OAAO;oBACf,QAAQ,EAAE,KAAK;oBACf,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;iBAClD,CAAC;aACH,CAAC,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAE/C,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;YACzF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE;gBACtB,WAAW,EAAE,4BAA4B,CAAC;oBACxC,MAAM,EAAE,OAAO;oBACf,QAAQ,EAAE,KAAK;oBACf,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;iBAClD,CAAC;aACH,CAAC,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAEzD,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;YAElD,QAAQ,EAAE,CAAC;YAEX,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"use-user.test.js","sourceRoot":"","sources":["../../../src/web/hooks/use-user.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { renderHook, waitFor } from \"@testing-library/react\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { HostAdaptor } from \"../bridges/adaptor.js\";\nimport { McpAppBridge } from \"../bridges/mcp-app/bridge.js\";\nimport {\n getMcpAppHostPostMessageMock,\n MockResizeObserver,\n} from \"./test/utils.js\";\nimport { useUser } from \"./use-user.js\";\n\ndescribe(\"useUser\", () => {\n describe(\"apps-sdk host type\", () => {\n beforeEach(() => {\n HostAdaptor.resetInstance();\n McpAppBridge.resetInstance();\n vi.stubGlobal(\"openai\", { locale: \"en-US\" });\n vi.stubGlobal(\"skybridge\", {});\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n });\n\n afterEach(() => {\n vi.unstubAllGlobals();\n vi.resetAllMocks();\n McpAppBridge.resetInstance();\n HostAdaptor.resetInstance();\n });\n\n it(\"should return locale, theme and userAgent from mcp host context\", async () => {\n vi.stubGlobal(\"parent\", {\n postMessage: getMcpAppHostPostMessageMock({\n locale: \"en-US\",\n theme: \"dark\",\n platform: \"web\",\n deviceCapabilities: { hover: true, touch: false },\n }),\n });\n const { result } = renderHook(() => useUser());\n\n await waitFor(() => {\n expect(result.current.locale).toBe(\"en-US\");\n expect(result.current.theme).toBe(\"dark\");\n expect(result.current.userAgent).toEqual({\n device: { type: \"desktop\" },\n capabilities: { hover: true, touch: false },\n });\n });\n });\n\n it(\"should return mobile userAgent when set to mobile\", async () => {\n vi.stubGlobal(\"parent\", {\n postMessage: getMcpAppHostPostMessageMock({\n locale: \"en-US\",\n platform: \"mobile\",\n deviceCapabilities: { hover: false, touch: true },\n }),\n });\n const { result } = renderHook(() => useUser());\n\n await waitFor(() => {\n expect(result.current.userAgent.device.type).toBe(\"mobile\");\n expect(result.current.userAgent.capabilities.touch).toBe(true);\n });\n });\n\n it(\"should return different locale when set\", async () => {\n vi.stubGlobal(\"parent\", {\n postMessage: getMcpAppHostPostMessageMock({\n locale: \"es-ES\",\n platform: \"web\",\n deviceCapabilities: { hover: true, touch: false },\n }),\n });\n const { result } = renderHook(() => useUser());\n\n await waitFor(() => {\n expect(result.current.locale).toBe(\"es-ES\");\n });\n });\n\n it(\"should normalize underscore locale to BCP 47 hyphen format\", async () => {\n vi.stubGlobal(\"parent\", {\n postMessage: getMcpAppHostPostMessageMock({\n locale: \"fr_FR\",\n platform: \"web\",\n deviceCapabilities: { hover: true, touch: false },\n }),\n });\n const { result } = renderHook(() => useUser());\n\n await waitFor(() => {\n expect(result.current.locale).toBe(\"fr-FR\");\n });\n });\n\n it(\"should canonicalize locale casing\", async () => {\n vi.stubGlobal(\"parent\", {\n postMessage: getMcpAppHostPostMessageMock({\n locale: \"en-us\",\n platform: \"web\",\n deviceCapabilities: { hover: true, touch: false },\n }),\n });\n const { result } = renderHook(() => useUser());\n\n await waitFor(() => {\n expect(result.current.locale).toBe(\"en-US\");\n });\n });\n\n it(\"should fall back to en-US for invalid locale\", async () => {\n vi.stubGlobal(\"parent\", {\n postMessage: getMcpAppHostPostMessageMock({\n locale: \"not-a-locale-!!\",\n platform: \"web\",\n deviceCapabilities: { hover: true, touch: false },\n }),\n });\n const { result } = renderHook(() => useUser());\n\n await waitFor(() => {\n expect(result.current.locale).toBe(\"en-US\");\n });\n });\n });\n\n describe(\"mcp-app host type\", () => {\n beforeEach(() => {\n HostAdaptor.resetInstance();\n McpAppBridge.resetInstance();\n vi.stubGlobal(\"openai\", undefined);\n vi.stubGlobal(\"skybridge\", {});\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n });\n\n afterEach(async () => {\n vi.unstubAllGlobals();\n vi.resetAllMocks();\n McpAppBridge.resetInstance();\n HostAdaptor.resetInstance();\n });\n\n it(\"should return locale and userAgent from mcp host context\", async () => {\n vi.stubGlobal(\"parent\", {\n postMessage: getMcpAppHostPostMessageMock({\n locale: \"fr-FR\",\n platform: \"web\",\n deviceCapabilities: { hover: true, touch: false },\n }),\n });\n const { result } = renderHook(() => useUser());\n\n await waitFor(() => {\n expect(result.current.locale).toBe(\"fr-FR\");\n expect(result.current.userAgent).toEqual({\n device: { type: \"desktop\" },\n capabilities: { hover: true, touch: false },\n });\n });\n });\n\n it(\"should normalize underscore locale to BCP 47 hyphen format\", async () => {\n vi.stubGlobal(\"parent\", {\n postMessage: getMcpAppHostPostMessageMock({\n locale: \"fr_FR\",\n platform: \"web\",\n deviceCapabilities: { hover: true, touch: false },\n }),\n });\n const { result } = renderHook(() => useUser());\n\n await waitFor(() => {\n expect(result.current.locale).toBe(\"fr-FR\");\n });\n });\n\n it(\"should maintain userAgent referential stability when data has not changed\", async () => {\n vi.stubGlobal(\"parent\", {\n postMessage: getMcpAppHostPostMessageMock({\n locale: \"en-US\",\n platform: \"web\",\n deviceCapabilities: { hover: true, touch: false },\n }),\n });\n const { result, rerender } = renderHook(() => useUser());\n\n await waitFor(() => {\n expect(result.current.userAgent).toBeDefined();\n });\n\n const initialUserAgent = result.current.userAgent;\n\n rerender();\n\n expect(result.current.userAgent).toBe(initialUserAgent);\n });\n });\n});\n"]}
@@ -0,0 +1,25 @@
1
+ import { type SetStateAction } from "react";
2
+ import type { UnknownObject } from "../types.js";
3
+ /**
4
+ * Persist a piece of UI state on the host, so it survives view remounts and
5
+ * is restored on subsequent renders of the same tool invocation.
6
+ *
7
+ * Returns a `[state, setState]` pair with the same ergonomics as
8
+ * `useState`. State is filtered to strip Skybridge-internal context fields
9
+ * (see {@link DataLLM}) before being returned to your component.
10
+ *
11
+ * Provide a `defaultState` (value or lazy initializer) to get a non-nullable
12
+ * tuple; omit it for `T | null`.
13
+ *
14
+ * @typeParam T - Shape of the persisted state. Must be a plain object.
15
+ *
16
+ * @example
17
+ * ```tsx
18
+ * const [filters, setFilters] = useViewState({ sort: "newest", page: 1 });
19
+ * setFilters((f) => ({ ...f, page: f.page + 1 }));
20
+ * ```
21
+ *
22
+ * @see https://docs.skybridge.tech/api-reference/use-view-state
23
+ */
24
+ export declare function useViewState<T extends UnknownObject>(defaultState: T | (() => T)): readonly [T, (state: SetStateAction<T>) => void];
25
+ export declare function useViewState<T extends UnknownObject>(defaultState?: T | (() => T | null) | null): readonly [T | null, (state: SetStateAction<T | null>) => void];
@@ -0,0 +1,42 @@
1
+ import { useCallback, useEffect, useRef, useState, } from "react";
2
+ import { getAdaptor, useHostContext } from "../bridges/index.js";
3
+ import { filterViewContext, injectViewContext } from "../helpers/state.js";
4
+ export function useViewState(defaultState) {
5
+ const adaptor = getAdaptor();
6
+ const viewStateFromBridge = useHostContext("viewState");
7
+ const [viewState, _setViewState] = useState(() => {
8
+ if (viewStateFromBridge !== null) {
9
+ return filterViewContext(viewStateFromBridge);
10
+ }
11
+ return typeof defaultState === "function"
12
+ ? defaultState()
13
+ : (defaultState ?? null);
14
+ });
15
+ const mountedStateRef = useRef(viewState);
16
+ useEffect(() => {
17
+ mountedStateRef.current = viewState;
18
+ return () => {
19
+ mountedStateRef.current = undefined;
20
+ };
21
+ }, [viewState]);
22
+ useEffect(() => {
23
+ if (viewStateFromBridge !== null) {
24
+ _setViewState(filterViewContext(viewStateFromBridge));
25
+ }
26
+ }, [viewStateFromBridge]);
27
+ const setViewState = useCallback((state) => {
28
+ const prevState = mountedStateRef.current;
29
+ if (prevState === undefined) {
30
+ return;
31
+ }
32
+ const newState = typeof state === "function" ? state(prevState) : state;
33
+ const stateToSet = injectViewContext(newState);
34
+ mountedStateRef.current = newState;
35
+ _setViewState(newState);
36
+ if (stateToSet !== null) {
37
+ adaptor.setViewState(stateToSet);
38
+ }
39
+ }, [adaptor]);
40
+ return [viewState, setViewState];
41
+ }
42
+ //# sourceMappingURL=use-view-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-view-state.js","sourceRoot":"","sources":["../../../src/web/hooks/use-view-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,SAAS,EACT,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AA8B3E,MAAM,UAAU,YAAY,CAC1B,YAA0C;IAE1C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,mBAAmB,GAAG,cAAc,CAAC,WAAW,CAAa,CAAC;IAEpE,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAW,GAAG,EAAE;QACzD,IAAI,mBAAmB,KAAK,IAAI,EAAE,CAAC;YACjC,OAAO,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,OAAO,YAAY,KAAK,UAAU;YACvC,CAAC,CAAC,YAAY,EAAE;YAChB,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,MAAM,CAAuB,SAAS,CAAC,CAAC;IAEhE,SAAS,CAAC,GAAG,EAAE;QACb,eAAe,CAAC,OAAO,GAAG,SAAS,CAAC;QAEpC,OAAO,GAAG,EAAE;YACV,eAAe,CAAC,OAAO,GAAG,SAAS,CAAC;QACtC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,mBAAmB,KAAK,IAAI,EAAE,CAAC;YACjC,aAAa,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE1B,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,KAA+B,EAAE,EAAE;QAClC,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC;QAE1C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACxE,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAE/C,eAAe,CAAC,OAAO,GAAG,QAAQ,CAAC;QACnC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAExB,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,OAAO,CAAC,SAAS,EAAE,YAAY,CAAU,CAAC;AAC5C,CAAC","sourcesContent":["import {\n type SetStateAction,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { getAdaptor, useHostContext } from \"../bridges/index.js\";\nimport { filterViewContext, injectViewContext } from \"../helpers/state.js\";\nimport type { UnknownObject } from \"../types.js\";\n\n/**\n * Persist a piece of UI state on the host, so it survives view remounts and\n * is restored on subsequent renders of the same tool invocation.\n *\n * Returns a `[state, setState]` pair with the same ergonomics as\n * `useState`. State is filtered to strip Skybridge-internal context fields\n * (see {@link DataLLM}) before being returned to your component.\n *\n * Provide a `defaultState` (value or lazy initializer) to get a non-nullable\n * tuple; omit it for `T | null`.\n *\n * @typeParam T - Shape of the persisted state. Must be a plain object.\n *\n * @example\n * ```tsx\n * const [filters, setFilters] = useViewState({ sort: \"newest\", page: 1 });\n * setFilters((f) => ({ ...f, page: f.page + 1 }));\n * ```\n *\n * @see https://docs.skybridge.tech/api-reference/use-view-state\n */\nexport function useViewState<T extends UnknownObject>(\n defaultState: T | (() => T),\n): readonly [T, (state: SetStateAction<T>) => void];\nexport function useViewState<T extends UnknownObject>(\n defaultState?: T | (() => T | null) | null,\n): readonly [T | null, (state: SetStateAction<T | null>) => void];\nexport function useViewState<T extends UnknownObject>(\n defaultState?: T | (() => T | null) | null,\n): readonly [T | null, (state: SetStateAction<T | null>) => void] {\n const adaptor = getAdaptor();\n const viewStateFromBridge = useHostContext(\"viewState\") as T | null;\n\n const [viewState, _setViewState] = useState<T | null>(() => {\n if (viewStateFromBridge !== null) {\n return filterViewContext(viewStateFromBridge);\n }\n\n return typeof defaultState === \"function\"\n ? defaultState()\n : (defaultState ?? null);\n });\n\n const mountedStateRef = useRef<T | null | undefined>(viewState);\n\n useEffect(() => {\n mountedStateRef.current = viewState;\n\n return () => {\n mountedStateRef.current = undefined;\n };\n }, [viewState]);\n\n useEffect(() => {\n if (viewStateFromBridge !== null) {\n _setViewState(filterViewContext(viewStateFromBridge));\n }\n }, [viewStateFromBridge]);\n\n const setViewState = useCallback(\n (state: SetStateAction<T | null>) => {\n const prevState = mountedStateRef.current;\n\n if (prevState === undefined) {\n return;\n }\n\n const newState = typeof state === \"function\" ? state(prevState) : state;\n const stateToSet = injectViewContext(newState);\n\n mountedStateRef.current = newState;\n _setViewState(newState);\n\n if (stateToSet !== null) {\n adaptor.setViewState(stateToSet);\n }\n },\n [adaptor],\n );\n\n return [viewState, setViewState] as const;\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,212 @@
1
+ import { act, renderHook, waitFor } from "@testing-library/react";
2
+ import { StrictMode } from "react";
3
+ import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
4
+ import { HostAdaptor } from "../bridges/adaptor.js";
5
+ import { McpAppBridge } from "../bridges/mcp-app/index.js";
6
+ import { fireToolResultNotification, getMcpAppHostPostMessageMock, MockResizeObserver, } from "./test/utils.js";
7
+ import { useViewState } from "./use-view-state.js";
8
+ describe("useViewState", () => {
9
+ let OpenaiMock;
10
+ beforeEach(() => {
11
+ OpenaiMock = {
12
+ widgetState: null,
13
+ setWidgetState: vi.fn().mockResolvedValue(undefined),
14
+ };
15
+ vi.stubGlobal("openai", OpenaiMock);
16
+ vi.stubGlobal("skybridge", {});
17
+ });
18
+ afterEach(() => {
19
+ vi.unstubAllGlobals();
20
+ vi.resetAllMocks();
21
+ HostAdaptor.resetInstance();
22
+ McpAppBridge.resetInstance();
23
+ });
24
+ const defaultState = { count: 0, name: "test" };
25
+ const windowState = { count: 5, name: "window" };
26
+ it("should initialize with default state when window.openai.widgetState is null", () => {
27
+ OpenaiMock.widgetState = null;
28
+ const { result } = renderHook(() => useViewState(defaultState));
29
+ expect(result.current[0]).toEqual(defaultState);
30
+ });
31
+ it("should initialize with window.openai.widgetState when available", () => {
32
+ OpenaiMock.widgetState = { modelContent: windowState };
33
+ const { result } = renderHook(() => useViewState(defaultState));
34
+ expect(result.current[0]).toEqual(windowState);
35
+ });
36
+ it("should call window.openai.setWidgetState when setViewState is called with a new state", async () => {
37
+ const { result } = renderHook(() => useViewState(defaultState));
38
+ const newState = { count: 10, name: "updated" };
39
+ act(() => {
40
+ result.current[1](newState);
41
+ });
42
+ expect(OpenaiMock.setWidgetState).toHaveBeenCalledWith({
43
+ modelContent: newState,
44
+ privateContent: {},
45
+ });
46
+ expect(result.current[0]).toEqual(newState);
47
+ });
48
+ it("should call window.openai.setWidgetState when setViewState is called with a function updater", async () => {
49
+ const { result } = renderHook(() => useViewState(defaultState));
50
+ act(() => {
51
+ result.current[1]((prev) => ({ ...prev, count: prev.count + 1 }));
52
+ });
53
+ expect(OpenaiMock.setWidgetState).toHaveBeenCalledWith({
54
+ modelContent: { count: 1, name: "test" },
55
+ privateContent: {},
56
+ });
57
+ expect(result.current[0]).toEqual({ count: 1, name: "test" });
58
+ });
59
+ it("should call window.openai.setWidgetState once per update under StrictMode", () => {
60
+ const { result } = renderHook(() => useViewState(defaultState), {
61
+ wrapper: StrictMode,
62
+ });
63
+ act(() => {
64
+ result.current[1]({ count: 10, name: "updated" });
65
+ });
66
+ expect(OpenaiMock.setWidgetState).toHaveBeenCalledTimes(1);
67
+ });
68
+ it("should not persist anything on mount", () => {
69
+ renderHook(() => useViewState(defaultState), { wrapper: StrictMode });
70
+ expect(OpenaiMock.setWidgetState).not.toHaveBeenCalled();
71
+ });
72
+ it("should persist state when setViewState and unmount happen in the same tick", () => {
73
+ const { result, unmount } = renderHook(() => useViewState(defaultState));
74
+ act(() => {
75
+ result.current[1]({ count: 10, name: "updated" });
76
+ unmount();
77
+ });
78
+ expect(OpenaiMock.setWidgetState).toHaveBeenCalledTimes(1);
79
+ });
80
+ it("should not persist state when setViewState is called after unmount", () => {
81
+ const { result, unmount } = renderHook(() => useViewState(defaultState));
82
+ const setViewState = result.current[1];
83
+ unmount();
84
+ act(() => {
85
+ setViewState({ count: 10, name: "updated" });
86
+ });
87
+ expect(OpenaiMock.setWidgetState).not.toHaveBeenCalled();
88
+ });
89
+ it("should update state when window.openai.widgetState changes", () => {
90
+ OpenaiMock.widgetState = { modelContent: defaultState };
91
+ const { result, rerender } = renderHook(() => useViewState(defaultState));
92
+ expect(result.current[0]).toEqual(defaultState);
93
+ // Simulate window.openai.widgetState changing
94
+ OpenaiMock.widgetState = { modelContent: windowState };
95
+ // Trigger re-render to simulate the useEffect running
96
+ rerender();
97
+ expect(result.current[0]).toEqual(windowState);
98
+ });
99
+ });
100
+ describe("useViewState (mcp-app host — localStorage persistence)", () => {
101
+ beforeEach(() => {
102
+ vi.stubGlobal("parent", { postMessage: getMcpAppHostPostMessageMock() });
103
+ vi.stubGlobal("skybridge", {});
104
+ vi.stubGlobal("openai", undefined);
105
+ vi.stubGlobal("ResizeObserver", MockResizeObserver);
106
+ localStorage.clear();
107
+ });
108
+ afterEach(() => {
109
+ vi.unstubAllGlobals();
110
+ vi.resetAllMocks();
111
+ HostAdaptor.resetInstance();
112
+ McpAppBridge.resetInstance();
113
+ localStorage.clear();
114
+ });
115
+ it("should persist state to localStorage when viewUUID is available", async () => {
116
+ const viewUUID = "test-uuid-123";
117
+ const { result } = renderHook(() => useViewState({ page: 1, zoom: 100 }));
118
+ await act(async () => {
119
+ fireToolResultNotification({
120
+ content: [{ type: "text", text: "result" }],
121
+ structuredContent: {},
122
+ _meta: { viewUUID },
123
+ });
124
+ });
125
+ act(() => {
126
+ result.current[1]({ page: 3, zoom: 150 });
127
+ });
128
+ expect(result.current[0]).toEqual({ page: 3, zoom: 150 });
129
+ expect(localStorage.length).toBe(1);
130
+ });
131
+ it("should restore state from localStorage when viewUUID arrives", async () => {
132
+ const viewUUID = "test-uuid-456";
133
+ // Pre-seed with the sb:{timestamp}:{viewUUID} format
134
+ localStorage.setItem(`sb:1700000000000:${viewUUID}`, JSON.stringify({ page: 5, zoom: 200 }));
135
+ const { result } = renderHook(() => useViewState({ page: 1, zoom: 100 }));
136
+ act(() => {
137
+ fireToolResultNotification({
138
+ content: [{ type: "text", text: "result" }],
139
+ structuredContent: {},
140
+ _meta: { viewUUID },
141
+ });
142
+ });
143
+ await waitFor(() => {
144
+ expect(result.current[0]).toEqual({ page: 5, zoom: 200 });
145
+ });
146
+ });
147
+ it("should not persist when no viewUUID is available", () => {
148
+ const { result } = renderHook(() => useViewState({ page: 1 }));
149
+ act(() => {
150
+ result.current[1]({ page: 2 });
151
+ });
152
+ expect(result.current[0]).toEqual({ page: 2 });
153
+ expect(localStorage.length).toBe(0);
154
+ });
155
+ it("should handle corrupted localStorage data gracefully", async () => {
156
+ const viewUUID = "test-uuid-corrupt";
157
+ localStorage.setItem(`sb:1700000000000:${viewUUID}`, "not valid json{{{");
158
+ const { result } = renderHook(() => useViewState({ page: 1 }));
159
+ act(() => {
160
+ fireToolResultNotification({
161
+ content: [{ type: "text", text: "result" }],
162
+ structuredContent: {},
163
+ _meta: { viewUUID },
164
+ });
165
+ });
166
+ await waitFor(() => {
167
+ expect(result.current[0]).toEqual({ page: 1 });
168
+ });
169
+ });
170
+ it("should refresh localStorage timestamp on each persist (LRU)", async () => {
171
+ const viewUUID = "lru-test-uuid";
172
+ const oldKey = `sb:1000000000000:${viewUUID}`;
173
+ localStorage.setItem(oldKey, JSON.stringify({ page: 1 }));
174
+ const { result } = renderHook(() => useViewState({ page: 1 }));
175
+ await act(async () => {
176
+ fireToolResultNotification({
177
+ content: [{ type: "text", text: "result" }],
178
+ structuredContent: {},
179
+ _meta: { viewUUID },
180
+ });
181
+ });
182
+ act(() => {
183
+ result.current[1]({ page: 2 });
184
+ });
185
+ // Old key removed, replaced with a new one (still just 1 entry)
186
+ expect(localStorage.getItem(oldKey)).toBeNull();
187
+ expect(localStorage.length).toBe(1);
188
+ });
189
+ it("should evict oldest entries when exceeding max storage entries", async () => {
190
+ // Fill localStorage with 200 entries (the max)
191
+ for (let i = 0; i < 200; i++) {
192
+ localStorage.setItem(`sb:${String(1000000000000 + i)}:old-uuid-${String(i).padStart(4, "0")}`, JSON.stringify({ i }));
193
+ }
194
+ expect(localStorage.length).toBe(200);
195
+ const viewUUID = "eviction-test-uuid";
196
+ const { result } = renderHook(() => useViewState({ page: 1 }));
197
+ await act(async () => {
198
+ fireToolResultNotification({
199
+ content: [{ type: "text", text: "result" }],
200
+ structuredContent: {},
201
+ _meta: { viewUUID },
202
+ });
203
+ });
204
+ act(() => {
205
+ result.current[1]({ page: 99 });
206
+ });
207
+ // Should have evicted the oldest entry to stay at 200
208
+ expect(localStorage.length).toBe(200);
209
+ expect(localStorage.getItem("sb:1000000000000:old-uuid-0000")).toBeNull();
210
+ });
211
+ });
212
+ //# sourceMappingURL=use-view-state.test.js.map