skybridge 0.0.0-dev.bcab395 → 0.0.0-dev.bcb73da

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 (466) hide show
  1. package/README.md +126 -124
  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.map +1 -1
  17. package/dist/cli/resolve-skybridge-config.d.ts +5 -0
  18. package/dist/cli/resolve-skybridge-config.js +18 -0
  19. package/dist/cli/resolve-skybridge-config.js.map +1 -0
  20. package/dist/cli/run-command.js.map +1 -1
  21. package/dist/cli/run-plain.d.ts +18 -0
  22. package/dist/cli/run-plain.js +90 -0
  23. package/dist/cli/run-plain.js.map +1 -0
  24. package/dist/cli/telemetry.js.map +1 -1
  25. package/dist/cli/tunnel-control-server.js.map +1 -1
  26. package/dist/cli/tunnel-control-server.test.js.map +1 -1
  27. package/dist/cli/tunnel-handler.js.map +1 -1
  28. package/dist/cli/tunnel-handler.test.js.map +1 -1
  29. package/dist/cli/tunnel.js +2 -2
  30. package/dist/cli/tunnel.js.map +1 -1
  31. package/dist/cli/tunnel.test.js.map +1 -1
  32. package/dist/cli/types.js.map +1 -1
  33. package/dist/cli/use-execute-steps.d.ts +1 -1
  34. package/dist/cli/use-execute-steps.js.map +1 -1
  35. package/dist/cli/use-messages.js.map +1 -1
  36. package/dist/cli/use-nodemon.d.ts +25 -1
  37. package/dist/cli/use-nodemon.js +97 -55
  38. package/dist/cli/use-nodemon.js.map +1 -1
  39. package/dist/cli/use-open-browser.d.ts +1 -0
  40. package/dist/cli/use-open-browser.js +44 -0
  41. package/dist/cli/use-open-browser.js.map +1 -0
  42. package/dist/cli/use-tunnel.js.map +1 -1
  43. package/dist/cli/use-typescript-check.d.ts +9 -2
  44. package/dist/cli/use-typescript-check.js +89 -51
  45. package/dist/cli/use-typescript-check.js.map +1 -1
  46. package/dist/commands/build.d.ts +0 -3
  47. package/dist/commands/build.js +2 -38
  48. package/dist/commands/build.js.map +1 -1
  49. package/dist/commands/create.d.ts +9 -0
  50. package/dist/commands/create.js +30 -0
  51. package/dist/commands/create.js.map +1 -0
  52. package/dist/commands/dev.d.ts +2 -0
  53. package/dist/commands/dev.js +58 -3
  54. package/dist/commands/dev.js.map +1 -1
  55. package/dist/commands/start.js +7 -1
  56. package/dist/commands/start.js.map +1 -1
  57. package/dist/commands/telemetry/disable.js.map +1 -1
  58. package/dist/commands/telemetry/enable.js.map +1 -1
  59. package/dist/commands/telemetry/status.js.map +1 -1
  60. package/dist/context-warnings.d.ts +5 -0
  61. package/dist/context-warnings.js +31 -0
  62. package/dist/context-warnings.js.map +1 -0
  63. package/dist/context-warnings.test.js +28 -0
  64. package/dist/context-warnings.test.js.map +1 -0
  65. package/dist/server/app.d.ts +194 -0
  66. package/dist/server/app.js +266 -0
  67. package/dist/server/app.js.map +1 -0
  68. package/dist/server/app.test.js +97 -0
  69. package/dist/server/app.test.js.map +1 -0
  70. package/dist/server/asset-base-url-transform-plugin.d.ts +1 -0
  71. package/dist/server/asset-base-url-transform-plugin.js +17 -2
  72. package/dist/server/asset-base-url-transform-plugin.js.map +1 -1
  73. package/dist/server/asset-base-url-transform-plugin.test.js +80 -1
  74. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -1
  75. package/dist/server/auth/discovery.d.ts +33 -0
  76. package/dist/server/auth/discovery.js +56 -0
  77. package/dist/server/auth/discovery.js.map +1 -0
  78. package/dist/server/auth/discovery.test.js +93 -0
  79. package/dist/server/auth/discovery.test.js.map +1 -0
  80. package/dist/server/auth/index.d.ts +48 -0
  81. package/dist/server/auth/index.js +2 -0
  82. package/dist/server/auth/index.js.map +1 -0
  83. package/dist/server/auth/providers/auth0.d.ts +40 -0
  84. package/dist/server/auth/providers/auth0.js +36 -0
  85. package/dist/server/auth/providers/auth0.js.map +1 -0
  86. package/dist/server/auth/providers/auth0.test.d.ts +1 -0
  87. package/dist/server/auth/providers/auth0.test.js +50 -0
  88. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  89. package/dist/server/auth/providers/authplane.d.ts +49 -0
  90. package/dist/server/auth/providers/authplane.js +57 -0
  91. package/dist/server/auth/providers/authplane.js.map +1 -0
  92. package/dist/server/auth/providers/authplane.test.d.ts +1 -0
  93. package/dist/server/auth/providers/authplane.test.js +143 -0
  94. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  95. package/dist/server/auth/providers/clerk.d.ts +51 -0
  96. package/dist/server/auth/providers/clerk.js +19 -0
  97. package/dist/server/auth/providers/clerk.js.map +1 -0
  98. package/dist/server/auth/providers/clerk.test.d.ts +1 -0
  99. package/dist/server/auth/providers/clerk.test.js +30 -0
  100. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  101. package/dist/server/auth/providers/custom.d.ts +40 -0
  102. package/dist/server/auth/providers/custom.js +59 -0
  103. package/dist/server/auth/providers/custom.js.map +1 -0
  104. package/dist/server/auth/providers/custom.test.d.ts +1 -0
  105. package/dist/server/auth/providers/custom.test.js +161 -0
  106. package/dist/server/auth/providers/custom.test.js.map +1 -0
  107. package/dist/server/auth/providers/descope.d.ts +44 -0
  108. package/dist/server/auth/providers/descope.js +44 -0
  109. package/dist/server/auth/providers/descope.js.map +1 -0
  110. package/dist/server/auth/providers/descope.test.d.ts +1 -0
  111. package/dist/server/auth/providers/descope.test.js +62 -0
  112. package/dist/server/auth/providers/descope.test.js.map +1 -0
  113. package/dist/server/auth/providers/shared.d.ts +2 -0
  114. package/dist/server/auth/providers/shared.js +6 -0
  115. package/dist/server/auth/providers/shared.js.map +1 -0
  116. package/dist/server/auth/providers/shared.test.d.ts +1 -0
  117. package/dist/server/auth/providers/shared.test.js +10 -0
  118. package/dist/server/auth/providers/shared.test.js.map +1 -0
  119. package/dist/server/auth/providers/stytch.d.ts +25 -0
  120. package/dist/server/auth/providers/stytch.js +16 -0
  121. package/dist/server/auth/providers/stytch.js.map +1 -0
  122. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  123. package/dist/server/auth/providers/verify-spy.js +21 -0
  124. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  125. package/dist/server/auth/providers/workos.d.ts +33 -0
  126. package/dist/server/auth/providers/workos.js +15 -0
  127. package/dist/server/auth/providers/workos.js.map +1 -0
  128. package/dist/server/auth/security-schemes.d.ts +23 -0
  129. package/dist/server/auth/security-schemes.js +64 -0
  130. package/dist/server/auth/security-schemes.js.map +1 -0
  131. package/dist/server/auth/security-schemes.test.d.ts +1 -0
  132. package/dist/server/auth/security-schemes.test.js +99 -0
  133. package/dist/server/auth/security-schemes.test.js.map +1 -0
  134. package/dist/server/auth/setup.d.ts +6 -0
  135. package/dist/server/auth/setup.js +91 -0
  136. package/dist/server/auth/setup.js.map +1 -0
  137. package/dist/server/auth/setup.test.d.ts +1 -0
  138. package/dist/server/auth/setup.test.js +514 -0
  139. package/dist/server/auth/setup.test.js.map +1 -0
  140. package/dist/server/auth/verify.d.ts +46 -0
  141. package/dist/server/auth/verify.js +62 -0
  142. package/dist/server/auth/verify.js.map +1 -0
  143. package/dist/server/auth/verify.test.d.ts +1 -0
  144. package/dist/server/auth/verify.test.js +149 -0
  145. package/dist/server/auth/verify.test.js.map +1 -0
  146. package/dist/server/auth-extra.test-d.js +130 -0
  147. package/dist/server/auth-extra.test-d.js.map +1 -0
  148. package/dist/server/auth.d.ts +57 -0
  149. package/dist/server/auth.js +27 -0
  150. package/dist/server/auth.js.map +1 -0
  151. package/dist/server/build-manifest.test.d.ts +1 -0
  152. package/dist/server/build-manifest.test.js +28 -0
  153. package/dist/server/build-manifest.test.js.map +1 -0
  154. package/dist/server/content-helpers.d.ts +41 -1
  155. package/dist/server/content-helpers.js +33 -0
  156. package/dist/server/content-helpers.js.map +1 -1
  157. package/dist/server/content-helpers.test.js.map +1 -1
  158. package/dist/server/express.d.ts +23 -7
  159. package/dist/server/express.js +42 -30
  160. package/dist/server/express.js.map +1 -1
  161. package/dist/server/express.test.js +345 -85
  162. package/dist/server/express.test.js.map +1 -1
  163. package/dist/server/file-ref.d.ts +28 -0
  164. package/dist/server/file-ref.js +27 -0
  165. package/dist/server/file-ref.js.map +1 -0
  166. package/dist/server/host.d.ts +2 -0
  167. package/dist/server/host.js +11 -0
  168. package/dist/server/host.js.map +1 -0
  169. package/dist/server/host.test.d.ts +1 -0
  170. package/dist/server/host.test.js +13 -0
  171. package/dist/server/host.test.js.map +1 -0
  172. package/dist/server/index.d.ts +18 -2
  173. package/dist/server/index.js +15 -1
  174. package/dist/server/index.js.map +1 -1
  175. package/dist/server/inferUtilityTypes.d.ts +6 -6
  176. package/dist/server/inferUtilityTypes.js.map +1 -1
  177. package/dist/server/mcp-errors.test.d.ts +1 -0
  178. package/dist/server/mcp-errors.test.js +41 -0
  179. package/dist/server/mcp-errors.test.js.map +1 -0
  180. package/dist/server/metric.js.map +1 -1
  181. package/dist/server/middleware.d.ts +51 -13
  182. package/dist/server/middleware.js +33 -0
  183. package/dist/server/middleware.js.map +1 -1
  184. package/dist/server/middleware.test-d.js +1 -1
  185. package/dist/server/middleware.test-d.js.map +1 -1
  186. package/dist/server/middleware.test.js +242 -134
  187. package/dist/server/middleware.test.js.map +1 -1
  188. package/dist/server/register-tool.test.d.ts +1 -0
  189. package/dist/server/register-tool.test.js +27 -0
  190. package/dist/server/register-tool.test.js.map +1 -0
  191. package/dist/server/requestOrigin.d.ts +7 -0
  192. package/dist/server/requestOrigin.js +25 -0
  193. package/dist/server/requestOrigin.js.map +1 -0
  194. package/dist/server/server.d.ts +300 -53
  195. package/dist/server/server.js +408 -286
  196. package/dist/server/server.js.map +1 -1
  197. package/dist/server/skills-integration.test.d.ts +1 -0
  198. package/dist/server/skills-integration.test.js +86 -0
  199. package/dist/server/skills-integration.test.js.map +1 -0
  200. package/dist/server/skills.d.ts +27 -0
  201. package/dist/server/skills.js +188 -0
  202. package/dist/server/skills.js.map +1 -0
  203. package/dist/server/skills.test.d.ts +1 -0
  204. package/dist/server/skills.test.js +243 -0
  205. package/dist/server/skills.test.js.map +1 -0
  206. package/dist/server/templateHelper.d.ts +0 -5
  207. package/dist/server/templateHelper.js +3 -22
  208. package/dist/server/templateHelper.js.map +1 -1
  209. package/dist/server/templates.generated.d.ts +4 -0
  210. package/dist/server/templates.generated.js +43 -0
  211. package/dist/server/templates.generated.js.map +1 -0
  212. package/dist/server/tool-extra.test.d.ts +1 -0
  213. package/dist/server/tool-extra.test.js +88 -0
  214. package/dist/server/tool-extra.test.js.map +1 -0
  215. package/dist/server/tunnel-proxy-router.js.map +1 -1
  216. package/dist/server/tunnel-proxy-router.test.js.map +1 -1
  217. package/dist/server/view-name.test-d.d.ts +1 -0
  218. package/dist/server/view-name.test-d.js +8 -0
  219. package/dist/server/view-name.test-d.js.map +1 -0
  220. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  221. package/dist/server/view-resource-resolution.test.js +176 -0
  222. package/dist/server/view-resource-resolution.test.js.map +1 -0
  223. package/dist/server/viewsDevServer.js +4 -1
  224. package/dist/server/viewsDevServer.js.map +1 -1
  225. package/dist/test/utils.d.ts +9 -11
  226. package/dist/test/utils.js +220 -201
  227. package/dist/test/utils.js.map +1 -1
  228. package/dist/test/view.test.js +165 -148
  229. package/dist/test/view.test.js.map +1 -1
  230. package/dist/version.js +1 -3
  231. package/dist/version.js.map +1 -1
  232. package/dist/views/index.d.ts +10 -0
  233. package/dist/views/index.js +3 -0
  234. package/dist/views/index.js.map +1 -0
  235. package/dist/{web/plugin → views}/scan-views.d.ts +8 -0
  236. package/dist/{web/plugin → views}/scan-views.js +26 -8
  237. package/dist/views/scan-views.js.map +1 -0
  238. package/dist/views/scan-views.test.d.ts +1 -0
  239. package/dist/{web/plugin → views}/scan-views.test.js +33 -1
  240. package/dist/views/scan-views.test.js.map +1 -0
  241. package/dist/views/validate-view.d.ts +1 -0
  242. package/dist/{web/plugin → views}/validate-view.js +2 -2
  243. package/dist/views/validate-view.js.map +1 -0
  244. package/dist/views/validate-view.test.d.ts +1 -0
  245. package/dist/views/validate-view.test.js.map +1 -0
  246. package/dist/web/bridges/adaptor.d.ts +51 -0
  247. package/dist/web/bridges/adaptor.js +327 -0
  248. package/dist/web/bridges/adaptor.js.map +1 -0
  249. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  250. package/dist/web/bridges/adaptor.test.js +225 -0
  251. package/dist/web/bridges/adaptor.test.js.map +1 -0
  252. package/dist/web/bridges/apps-sdk/bridge.d.ts +6 -1
  253. package/dist/web/bridges/apps-sdk/bridge.js +15 -3
  254. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  255. package/dist/web/bridges/apps-sdk/index.d.ts +0 -1
  256. package/dist/web/bridges/apps-sdk/index.js +0 -1
  257. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  258. package/dist/web/bridges/apps-sdk/types.d.ts +8 -1
  259. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  260. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +11 -0
  261. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +11 -0
  262. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  263. package/dist/web/bridges/get-adaptor.d.ts +7 -0
  264. package/dist/web/bridges/get-adaptor.js +9 -7
  265. package/dist/web/bridges/get-adaptor.js.map +1 -1
  266. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  267. package/dist/web/bridges/get-adaptor.test.js +32 -0
  268. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  269. package/dist/web/bridges/index.js.map +1 -1
  270. package/dist/web/bridges/mcp-app/bridge.d.ts +15 -2
  271. package/dist/web/bridges/mcp-app/bridge.js +73 -7
  272. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  273. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  274. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  275. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  276. package/dist/web/bridges/mcp-app/index.d.ts +0 -1
  277. package/dist/web/bridges/mcp-app/index.js +0 -1
  278. package/dist/web/bridges/mcp-app/index.js.map +1 -1
  279. package/dist/web/bridges/mcp-app/types.d.ts +2 -0
  280. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  281. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +12 -0
  282. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +12 -0
  283. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  284. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +1 -1
  285. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  286. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  287. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  288. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  289. package/dist/web/bridges/types.d.ts +120 -10
  290. package/dist/web/bridges/types.js +14 -1
  291. package/dist/web/bridges/types.js.map +1 -1
  292. package/dist/web/bridges/types.test.d.ts +1 -0
  293. package/dist/web/bridges/types.test.js +19 -0
  294. package/dist/web/bridges/types.test.js.map +1 -0
  295. package/dist/web/bridges/use-host-context.d.ts +5 -0
  296. package/dist/web/bridges/use-host-context.js +5 -0
  297. package/dist/web/bridges/use-host-context.js.map +1 -1
  298. package/dist/web/components/modal-provider.d.ts +1 -1
  299. package/dist/web/components/modal-provider.js +4 -3
  300. package/dist/web/components/modal-provider.js.map +1 -1
  301. package/dist/web/create-store.d.ts +26 -0
  302. package/dist/web/create-store.js +35 -9
  303. package/dist/web/create-store.js.map +1 -1
  304. package/dist/web/create-store.test.js +24 -23
  305. package/dist/web/create-store.test.js.map +1 -1
  306. package/dist/web/data-llm.d.ts +35 -2
  307. package/dist/web/data-llm.js +31 -3
  308. package/dist/web/data-llm.js.map +1 -1
  309. package/dist/web/data-llm.test.js +42 -29
  310. package/dist/web/data-llm.test.js.map +1 -1
  311. package/dist/web/generate-helpers.d.ts +24 -18
  312. package/dist/web/generate-helpers.js +21 -15
  313. package/dist/web/generate-helpers.js.map +1 -1
  314. package/dist/web/generate-helpers.test-d.js +14 -12
  315. package/dist/web/generate-helpers.test-d.js.map +1 -1
  316. package/dist/web/generate-helpers.test.js +2 -2
  317. package/dist/web/generate-helpers.test.js.map +1 -1
  318. package/dist/web/helpers/state.d.ts +2 -2
  319. package/dist/web/helpers/state.js +11 -11
  320. package/dist/web/helpers/state.js.map +1 -1
  321. package/dist/web/helpers/state.test.js +9 -9
  322. package/dist/web/helpers/state.test.js.map +1 -1
  323. package/dist/web/hooks/index.d.ts +7 -2
  324. package/dist/web/hooks/index.js +7 -2
  325. package/dist/web/hooks/index.js.map +1 -1
  326. package/dist/web/hooks/test/utils.d.ts +7 -2
  327. package/dist/web/hooks/test/utils.js +14 -3
  328. package/dist/web/hooks/test/utils.js.map +1 -1
  329. package/dist/web/hooks/use-call-tool.d.ts +45 -0
  330. package/dist/web/hooks/use-call-tool.js +28 -0
  331. package/dist/web/hooks/use-call-tool.js.map +1 -1
  332. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -1
  333. package/dist/web/hooks/use-call-tool.test.js +64 -29
  334. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  335. package/dist/web/hooks/use-display-mode.d.ts +20 -0
  336. package/dist/web/hooks/use-display-mode.js +20 -0
  337. package/dist/web/hooks/use-display-mode.js.map +1 -1
  338. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -1
  339. package/dist/web/hooks/use-display-mode.test.js +57 -21
  340. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  341. package/dist/web/hooks/use-download.d.ts +3 -0
  342. package/dist/web/hooks/use-download.js +7 -0
  343. package/dist/web/hooks/use-download.js.map +1 -0
  344. package/dist/web/hooks/use-download.test.d.ts +1 -0
  345. package/dist/web/hooks/use-download.test.js +103 -0
  346. package/dist/web/hooks/use-download.test.js.map +1 -0
  347. package/dist/web/hooks/use-files.d.ts +32 -0
  348. package/dist/web/hooks/use-files.js +32 -0
  349. package/dist/web/hooks/use-files.js.map +1 -1
  350. package/dist/web/hooks/use-files.test.js +11 -3
  351. package/dist/web/hooks/use-files.test.js.map +1 -1
  352. package/dist/web/hooks/use-host.d.ts +22 -0
  353. package/dist/web/hooks/use-host.js +30 -0
  354. package/dist/web/hooks/use-host.js.map +1 -0
  355. package/dist/web/hooks/use-host.test.d.ts +1 -0
  356. package/dist/web/hooks/use-host.test.js +59 -0
  357. package/dist/web/hooks/use-host.test.js.map +1 -0
  358. package/dist/web/hooks/use-open-external.d.ts +17 -0
  359. package/dist/web/hooks/use-open-external.js +16 -0
  360. package/dist/web/hooks/use-open-external.js.map +1 -1
  361. package/dist/web/hooks/use-open-external.test.js +15 -5
  362. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  363. package/dist/web/hooks/use-register-view-tool.d.ts +37 -0
  364. package/dist/web/hooks/use-register-view-tool.js +50 -0
  365. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  366. package/dist/web/hooks/use-request-close.d.ts +16 -0
  367. package/dist/web/hooks/use-request-close.js +21 -0
  368. package/dist/web/hooks/use-request-close.js.map +1 -0
  369. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  370. package/dist/web/hooks/use-request-close.test.js +47 -0
  371. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  372. package/dist/web/hooks/use-request-modal.d.ts +16 -1
  373. package/dist/web/hooks/use-request-modal.js +19 -4
  374. package/dist/web/hooks/use-request-modal.js.map +1 -1
  375. package/dist/web/hooks/use-request-modal.test.js +12 -2
  376. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  377. package/dist/web/hooks/use-request-size.d.ts +20 -0
  378. package/dist/web/hooks/use-request-size.js +24 -0
  379. package/dist/web/hooks/use-request-size.js.map +1 -0
  380. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  381. package/dist/web/hooks/use-request-size.test.js +47 -0
  382. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  383. package/dist/web/hooks/use-send-follow-up-message.d.ts +19 -1
  384. package/dist/web/hooks/use-send-follow-up-message.js +19 -2
  385. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
  386. package/dist/web/hooks/use-set-open-in-app-url.d.ts +17 -0
  387. package/dist/web/hooks/use-set-open-in-app-url.js +17 -0
  388. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -1
  389. package/dist/web/hooks/use-set-open-in-app-url.test.js +26 -12
  390. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  391. package/dist/web/hooks/use-tool-info.d.ts +46 -14
  392. package/dist/web/hooks/use-tool-info.js +29 -7
  393. package/dist/web/hooks/use-tool-info.js.map +1 -1
  394. package/dist/web/hooks/use-tool-info.test-d.js +11 -34
  395. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  396. package/dist/web/hooks/use-tool-info.test.js +42 -37
  397. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  398. package/dist/web/hooks/use-user.d.ts +5 -2
  399. package/dist/web/hooks/use-user.js +6 -3
  400. package/dist/web/hooks/use-user.js.map +1 -1
  401. package/dist/web/hooks/use-user.test.js +85 -37
  402. package/dist/web/hooks/use-user.test.js.map +1 -1
  403. package/dist/web/hooks/use-view-state.d.ts +25 -0
  404. package/dist/web/hooks/use-view-state.js +42 -0
  405. package/dist/web/hooks/use-view-state.js.map +1 -0
  406. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  407. package/dist/web/hooks/{use-widget-state.test.js → use-view-state.test.js} +56 -21
  408. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  409. package/dist/web/hooks/use-viewport.d.ts +20 -0
  410. package/dist/web/hooks/use-viewport.js +21 -0
  411. package/dist/web/hooks/use-viewport.js.map +1 -0
  412. package/dist/web/hooks/use-viewport.test.d.ts +1 -0
  413. package/dist/web/hooks/use-viewport.test.js +109 -0
  414. package/dist/web/hooks/use-viewport.test.js.map +1 -0
  415. package/dist/web/index.d.ts +1 -3
  416. package/dist/web/index.js +1 -2
  417. package/dist/web/index.js.map +1 -1
  418. package/dist/web/mount-view.d.ts +21 -0
  419. package/dist/web/mount-view.js +43 -0
  420. package/dist/web/mount-view.js.map +1 -0
  421. package/dist/web/proxy.js.map +1 -1
  422. package/dist/web/types.d.ts +4 -0
  423. package/dist/web/types.js.map +1 -1
  424. package/package.json +44 -28
  425. package/dist/server/templates/development.hbs +0 -12
  426. package/dist/server/templates/production.hbs +0 -6
  427. package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -24
  428. package/dist/web/bridges/apps-sdk/adaptor.js +0 -87
  429. package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
  430. package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -48
  431. package/dist/web/bridges/mcp-app/adaptor.js +0 -268
  432. package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
  433. package/dist/web/hooks/use-layout.d.ts +0 -22
  434. package/dist/web/hooks/use-layout.js +0 -23
  435. package/dist/web/hooks/use-layout.js.map +0 -1
  436. package/dist/web/hooks/use-layout.test.js +0 -96
  437. package/dist/web/hooks/use-layout.test.js.map +0 -1
  438. package/dist/web/hooks/use-widget-state.d.ts +0 -4
  439. package/dist/web/hooks/use-widget-state.js +0 -32
  440. package/dist/web/hooks/use-widget-state.js.map +0 -1
  441. package/dist/web/hooks/use-widget-state.test.js.map +0 -1
  442. package/dist/web/mount-widget.d.ts +0 -1
  443. package/dist/web/mount-widget.js +0 -27
  444. package/dist/web/mount-widget.js.map +0 -1
  445. package/dist/web/plugin/data-llm.test.js +0 -81
  446. package/dist/web/plugin/data-llm.test.js.map +0 -1
  447. package/dist/web/plugin/plugin.d.ts +0 -5
  448. package/dist/web/plugin/plugin.js +0 -141
  449. package/dist/web/plugin/plugin.js.map +0 -1
  450. package/dist/web/plugin/scan-views.js.map +0 -1
  451. package/dist/web/plugin/scan-views.test.js.map +0 -1
  452. package/dist/web/plugin/transform-data-llm.d.ts +0 -12
  453. package/dist/web/plugin/transform-data-llm.js +0 -96
  454. package/dist/web/plugin/transform-data-llm.js.map +0 -1
  455. package/dist/web/plugin/transform-data-llm.test.js +0 -81
  456. package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
  457. package/dist/web/plugin/validate-view.d.ts +0 -1
  458. package/dist/web/plugin/validate-view.js.map +0 -1
  459. package/dist/web/plugin/validate-view.test.js.map +0 -1
  460. /package/dist/{web/hooks/use-layout.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
  461. /package/dist/{web/hooks/use-widget-state.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  462. /package/dist/{web/plugin/data-llm.test.d.ts → context-warnings.test.d.ts} +0 -0
  463. /package/dist/{web/plugin/scan-views.test.d.ts → server/app.test.d.ts} +0 -0
  464. /package/dist/{web/plugin/validate-view.test.d.ts → server/auth/discovery.test.d.ts} +0 -0
  465. /package/dist/{web/plugin/transform-data-llm.test.d.ts → server/auth-extra.test-d.d.ts} +0 -0
  466. /package/dist/{web/plugin → views}/validate-view.test.js +0 -0
@@ -1,15 +1,18 @@
1
1
  import crypto from "node:crypto";
2
+ import { Client, InMemoryTransport } from "@modelcontextprotocol/client";
2
3
  import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
4
+ import { TOOL_OUTPUT_WARNING_TOKENS } from "../context-warnings.js";
5
+ import { Skybridge } from "../server/app.js";
3
6
  import { createMockExtra, createMockMcpServer, resetTestEnv, setTestEnv, } from "./utils.js";
4
7
  const mockManifest = {
5
- "skybridge:view:my-widget": {
6
- file: "assets/my-widget-abc123.js",
7
- name: "my-widget",
8
+ "skybridge:view:my-view": {
9
+ file: "assets/my-view-abc123.js",
10
+ name: "my-view",
8
11
  isEntry: true,
9
12
  },
10
- "skybridge:view:folder-widget": {
11
- file: "assets/folder-widget-def456.js",
12
- name: "folder-widget",
13
+ "skybridge:view:folder-view": {
14
+ file: "assets/folder-view-def456.js",
15
+ name: "folder-view",
13
16
  isEntry: true,
14
17
  },
15
18
  "style.css": { file: "style.css" },
@@ -57,10 +60,10 @@ describe("McpServer.registerTool (unified API)", () => {
57
60
  it("should generate correct HTML for development mode", async () => {
58
61
  setTestEnv({ NODE_ENV: "development" });
59
62
  server.registerTool({
60
- name: "my-widget",
63
+ name: "my-view",
61
64
  description: "Test tool",
62
65
  view: {
63
- component: "my-widget",
66
+ component: "my-view",
64
67
  description: "Test view",
65
68
  },
66
69
  }, vi.fn());
@@ -71,20 +74,24 @@ describe("McpServer.registerTool (unified API)", () => {
71
74
  const serverUrl = `http://${host}`;
72
75
  const hmrUrl = `ws://${host}`;
73
76
  const mockExtra = createMockExtra(host);
74
- const result = await appsSdkResourceCallback(new URL("ui://widgets/apps-sdk/my-widget.html"), mockExtra);
77
+ const result = await appsSdkResourceCallback(new URL("ui://views/ext-apps/my-view.html"), mockExtra);
75
78
  expect(mockRegisterTool).toHaveBeenCalled();
76
79
  expect(result).toEqual({
77
80
  contents: [
78
81
  {
79
- uri: "ui://widgets/apps-sdk/my-widget.html",
80
- mimeType: "text/html+skybridge",
82
+ uri: "ui://views/ext-apps/my-view.html",
83
+ mimeType: "text/html;profile=mcp-app",
81
84
  text: expect.stringContaining('<div id="root"></div>'),
82
85
  _meta: {
83
- "openai/widgetCSP": {
84
- resource_domains: [serverUrl],
85
- connect_domains: [serverUrl, hmrUrl],
86
+ ui: {
87
+ csp: {
88
+ resourceDomains: [serverUrl],
89
+ connectDomains: [serverUrl, hmrUrl],
90
+ baseUriDomains: [serverUrl],
91
+ },
92
+ domain: serverUrl,
93
+ description: "Test view",
86
94
  },
87
- "openai/widgetDomain": serverUrl,
88
95
  "openai/widgetDescription": "Test view",
89
96
  },
90
97
  },
@@ -92,15 +99,15 @@ describe("McpServer.registerTool (unified API)", () => {
92
99
  });
93
100
  expect(result.contents[0]?.text).toContain(`${serverUrl}/assets/@react-refresh`);
94
101
  expect(result.contents[0]?.text).toContain(`${serverUrl}/@vite/client`);
95
- expect(result.contents[0]?.text).toContain(`${serverUrl}/_skybridge/view/my-widget`);
102
+ expect(result.contents[0]?.text).toContain(`${serverUrl}/_skybridge/view/my-view`);
96
103
  });
97
104
  it("should generate correct HTML for production mode", async () => {
98
105
  setTestEnv({ NODE_ENV: "production" });
99
106
  server.registerTool({
100
- name: "my-widget",
107
+ name: "my-view",
101
108
  description: "Test tool",
102
109
  view: {
103
- component: "my-widget",
110
+ component: "my-view",
104
111
  description: "Test view",
105
112
  },
106
113
  }, vi.fn());
@@ -110,20 +117,24 @@ describe("McpServer.registerTool (unified API)", () => {
110
117
  const host = "myapp.com";
111
118
  const serverUrl = `https://${host}`;
112
119
  const mockExtra = createMockExtra(host);
113
- const versionedUri = `ui://widgets/apps-sdk/my-widget.html${expectedVersionParam("assets/my-widget-abc123.js", "style.css")}`;
120
+ const versionedUri = `ui://views/ext-apps/my-view.html${expectedVersionParam("assets/my-view-abc123.js", "style.css")}`;
114
121
  const result = await appsSdkResourceCallback(new URL(versionedUri), mockExtra);
115
122
  expect(result).toEqual({
116
123
  contents: [
117
124
  {
118
125
  uri: versionedUri,
119
- mimeType: "text/html+skybridge",
126
+ mimeType: "text/html;profile=mcp-app",
120
127
  text: expect.stringContaining('<div id="root"></div>'),
121
128
  _meta: {
122
- "openai/widgetCSP": {
123
- resource_domains: [serverUrl],
124
- connect_domains: [serverUrl],
129
+ ui: {
130
+ csp: {
131
+ resourceDomains: [serverUrl],
132
+ connectDomains: [serverUrl],
133
+ baseUriDomains: [serverUrl],
134
+ },
135
+ domain: serverUrl,
136
+ description: "Test view",
125
137
  },
126
- "openai/widgetDomain": serverUrl,
127
138
  "openai/widgetDescription": "Test view",
128
139
  },
129
140
  },
@@ -131,18 +142,18 @@ describe("McpServer.registerTool (unified API)", () => {
131
142
  });
132
143
  expect(result.contents[0]?.text).not.toContain(`${serverUrl}/assets/@react-refresh`);
133
144
  expect(result.contents[0]?.text).not.toContain(`${serverUrl}@vite/client`);
134
- expect(result.contents[0]?.text).toContain(`${serverUrl}/assets/assets/my-widget-abc123.js`);
145
+ expect(result.contents[0]?.text).toContain(`${serverUrl}/assets/assets/my-view-abc123.js`);
135
146
  expect(result.contents[0]?.text).toContain(`${serverUrl}/assets/style.css`);
136
147
  });
137
148
  it("should prefer x-alpic-forwarded-url when hashing Claude view domains", async () => {
138
149
  setTestEnv({ NODE_ENV: "production" });
139
150
  server.registerTool({
140
- name: "my-widget",
151
+ name: "my-view",
141
152
  description: "Test tool",
142
- view: { component: "my-widget", description: "Test view" },
153
+ view: { component: "my-view", description: "Test view" },
143
154
  }, vi.fn());
144
155
  const extAppsResourceCallback = mockRegisterResource.mock
145
- .calls[1]?.[3];
156
+ .calls[0]?.[3];
146
157
  expect(extAppsResourceCallback).toBeDefined();
147
158
  const forwardedUrl = "https://everything-3a2c1264.staging.alpic.live/mcp?foo=bar";
148
159
  const expectedDomain = `${crypto
@@ -150,7 +161,7 @@ describe("McpServer.registerTool (unified API)", () => {
150
161
  .update(forwardedUrl)
151
162
  .digest("hex")
152
163
  .slice(0, 32)}.claudemcpcontent.com`;
153
- const result = await extAppsResourceCallback(new URL(`ui://widgets/ext-apps/my-widget.html${expectedVersionParam("assets/my-widget-abc123.js", "style.css")}`), createMockExtra("localhost:3000", {
164
+ const result = await extAppsResourceCallback(new URL(`ui://views/ext-apps/my-view.html${expectedVersionParam("assets/my-view-abc123.js", "style.css")}`), createMockExtra("localhost:3000", {
154
165
  headers: {
155
166
  "user-agent": "Claude-User",
156
167
  "x-alpic-forwarded-url": forwardedUrl,
@@ -167,52 +178,30 @@ describe("McpServer.registerTool (unified API)", () => {
167
178
  description: "Test view",
168
179
  domain: expectedDomain,
169
180
  },
181
+ "openai/widgetDescription": "Test view",
170
182
  });
171
183
  });
172
- it("should register resources with correct hostType for both apps-sdk and ext-apps", async () => {
184
+ it("should register a single ext-apps resource", async () => {
173
185
  server.registerTool({
174
- name: "my-widget",
186
+ name: "my-view",
175
187
  description: "Test tool",
176
188
  view: {
177
- component: "my-widget",
189
+ component: "my-view",
178
190
  description: "Test view",
179
191
  prefersBorder: true,
180
192
  },
181
193
  }, vi.fn());
182
- expect(mockRegisterResource).toHaveBeenCalledTimes(2);
183
- const appsSdkCallback = mockRegisterResource.mock
194
+ expect(mockRegisterResource).toHaveBeenCalledTimes(1);
195
+ const resourceCallback = mockRegisterResource.mock
184
196
  .calls[0]?.[3];
185
197
  const host = "localhost:3000";
186
198
  const serverUrl = `http://${host}`;
187
199
  const hmrUrl = `ws://${host}`;
188
- const appsSdkResult = await appsSdkCallback(new URL("ui://widgets/apps-sdk/my-widget.html"), createMockExtra(host));
189
- expect(appsSdkResult).toEqual({
190
- contents: [
191
- {
192
- uri: "ui://widgets/apps-sdk/my-widget.html",
193
- mimeType: "text/html+skybridge",
194
- text: expect.stringContaining('<div id="root"></div>'),
195
- _meta: {
196
- "openai/widgetCSP": {
197
- resource_domains: [serverUrl],
198
- connect_domains: [serverUrl, hmrUrl],
199
- },
200
- "openai/widgetDomain": serverUrl,
201
- "openai/widgetDescription": "Test view",
202
- "openai/widgetPrefersBorder": true,
203
- },
204
- },
205
- ],
206
- });
207
- expect(appsSdkResult.contents[0]?.text).toContain('window.skybridge = { hostType: "apps-sdk", serverUrl: "http://localhost:3000" };');
208
- const extAppsResourceCallback = mockRegisterResource.mock
209
- .calls[1]?.[3];
210
- expect(extAppsResourceCallback).toBeDefined();
211
- const extAppsResult = await extAppsResourceCallback(new URL("ui://widgets/ext-apps/my-widget.html"), createMockExtra(host));
212
- expect(extAppsResult).toEqual({
200
+ const result = await resourceCallback(new URL("ui://views/ext-apps/my-view.html"), createMockExtra(host));
201
+ expect(result).toEqual({
213
202
  contents: [
214
203
  {
215
- uri: "ui://widgets/ext-apps/my-widget.html",
204
+ uri: "ui://views/ext-apps/my-view.html",
216
205
  mimeType: "text/html;profile=mcp-app",
217
206
  text: expect.stringContaining('<div id="root"></div>'),
218
207
  _meta: {
@@ -226,116 +215,78 @@ describe("McpServer.registerTool (unified API)", () => {
226
215
  description: "Test view",
227
216
  prefersBorder: true,
228
217
  },
218
+ "openai/widgetDescription": "Test view",
229
219
  },
230
220
  },
231
221
  ],
232
222
  });
233
- expect(extAppsResult.contents[0]?.text).toContain('window.skybridge = { hostType: "mcp-app", serverUrl: "http://localhost:3000" };');
234
- });
235
- it("should register tool with ui.resourceUri metadata", async () => {
236
- server.registerTool({
237
- name: "my-widget",
238
- description: "Test tool",
239
- view: { component: "my-widget", description: "Test view" },
240
- }, vi.fn());
241
- expect(mockRegisterTool).toHaveBeenCalledTimes(1);
242
- const toolCallArgs = mockRegisterTool.mock.calls[0];
243
- const toolConfig = toolCallArgs?.[1];
244
- expect(toolConfig._meta).toHaveProperty("ui");
245
- expect(toolConfig._meta?.ui).toEqual({
246
- resourceUri: "ui://widgets/ext-apps/my-widget.html",
247
- });
223
+ expect(result.contents[0]?.text).toContain('window.skybridge = { serverUrl: "http://localhost:3000" };');
248
224
  });
249
- it("should register tool with openai/outputTemplate when apps-sdk only", async () => {
225
+ it("should advertise the single resource via ui.resourceUri only (no openai/outputTemplate)", async () => {
250
226
  server.registerTool({
251
- name: "my-widget",
227
+ name: "my-view",
252
228
  description: "Test tool",
253
- view: {
254
- component: "my-widget",
255
- description: "Test view",
256
- hosts: ["apps-sdk"],
257
- },
229
+ view: { component: "my-view", description: "Test view" },
258
230
  }, vi.fn());
259
- expect(mockRegisterTool).toHaveBeenCalledTimes(1);
260
- const toolCallArgs = mockRegisterTool.mock.calls[0];
261
- const toolConfig = toolCallArgs?.[1];
262
- expect(toolConfig._meta).not.toHaveProperty("ui");
263
- expect(toolConfig._meta?.["openai/outputTemplate"]).toBe("ui://widgets/apps-sdk/my-widget.html");
231
+ const toolConfig = mockRegisterTool.mock.calls[0]?.[1];
232
+ const uri = "ui://views/ext-apps/my-view.html";
233
+ expect(toolConfig._meta?.ui?.resourceUri).toBe(uri);
234
+ expect(toolConfig._meta?.["ui/resourceUri"]).toBe(uri);
235
+ expect(toolConfig._meta?.["openai/outputTemplate"]).toBeUndefined();
264
236
  });
265
237
  it("should not version view URIs in development", () => {
266
238
  server.registerTool({
267
- name: "my-widget",
239
+ name: "my-view",
268
240
  description: "Test tool",
269
- view: { component: "my-widget", description: "Test view" },
241
+ view: { component: "my-view", description: "Test view" },
270
242
  }, vi.fn());
271
243
  const toolConfig = mockRegisterTool.mock.calls[0]?.[1];
272
- expect(toolConfig._meta?.["openai/outputTemplate"]).toBe("ui://widgets/apps-sdk/my-widget.html");
273
- expect(toolConfig._meta?.ui?.resourceUri).toBe("ui://widgets/ext-apps/my-widget.html");
274
- // The URI registered with the resource handler must match the URI in
275
- // outputTemplate exactly so the SDK can resolve `resources/read` requests.
276
- expect(mockRegisterResource.mock.calls[0]?.[1]).toBe("ui://widgets/apps-sdk/my-widget.html");
277
- expect(mockRegisterResource.mock.calls[1]?.[1]).toBe("ui://widgets/ext-apps/my-widget.html");
244
+ expect(toolConfig._meta?.["openai/outputTemplate"]).toBeUndefined();
245
+ expect(toolConfig._meta?.ui?.resourceUri).toBe("ui://views/ext-apps/my-view.html");
246
+ // The URI registered with the resource handler must match ui.resourceUri
247
+ // exactly so the SDK can resolve `resources/read` requests.
248
+ expect(mockRegisterResource.mock.calls[0]?.[1]).toBe("ui://views/ext-apps/my-view.html");
278
249
  });
279
250
  it("should append a stable content hash to view URIs in production", () => {
280
251
  setTestEnv({ NODE_ENV: "production" });
281
252
  server.registerTool({
282
- name: "my-widget",
253
+ name: "my-view",
283
254
  description: "Test tool",
284
- view: { component: "my-widget", description: "Test view" },
255
+ view: { component: "my-view", description: "Test view" },
285
256
  }, vi.fn());
286
- const expected = expectedVersionParam("assets/my-widget-abc123.js", "style.css");
257
+ const expected = expectedVersionParam("assets/my-view-abc123.js", "style.css");
287
258
  const toolConfig = mockRegisterTool.mock.calls[0]?.[1];
288
- expect(toolConfig._meta?.["openai/outputTemplate"]).toBe(`ui://widgets/apps-sdk/my-widget.html${expected}`);
289
- expect(toolConfig._meta?.ui?.resourceUri).toBe(`ui://widgets/ext-apps/my-widget.html${expected}`);
290
- expect(mockRegisterResource.mock.calls[0]?.[1]).toBe(`ui://widgets/apps-sdk/my-widget.html${expected}`);
291
- expect(mockRegisterResource.mock.calls[1]?.[1]).toBe(`ui://widgets/ext-apps/my-widget.html${expected}`);
259
+ expect(toolConfig._meta?.["openai/outputTemplate"]).toBeUndefined();
260
+ expect(toolConfig._meta?.ui?.resourceUri).toBe(`ui://views/ext-apps/my-view.html${expected}`);
261
+ expect(mockRegisterResource.mock.calls[0]?.[1]).toBe(`ui://views/ext-apps/my-view.html${expected}`);
292
262
  });
293
263
  it("should produce different version params for views with different bundles", () => {
294
264
  setTestEnv({ NODE_ENV: "production" });
295
265
  server.registerTool({
296
- name: "my-widget",
266
+ name: "my-view",
297
267
  description: "First tool",
298
- view: { component: "my-widget" },
268
+ view: { component: "my-view" },
299
269
  }, vi.fn());
300
270
  server.registerTool({
301
- name: "folder-widget",
271
+ name: "folder-view",
302
272
  description: "Second tool",
303
- view: { component: "folder-widget" },
273
+ view: { component: "folder-view" },
304
274
  }, vi.fn());
305
- const myWidgetTemplate = (mockRegisterTool.mock.calls[0]?.[1])._meta?.["openai/outputTemplate"];
306
- const folderWidgetTemplate = (mockRegisterTool.mock.calls[1]?.[1])._meta?.["openai/outputTemplate"];
307
- expect(myWidgetTemplate).not.toEqual(folderWidgetTemplate);
308
- expect(myWidgetTemplate).toMatch(/\?v=[0-9a-f]{8}$/);
309
- expect(folderWidgetTemplate).toMatch(/\?v=[0-9a-f]{8}$/);
275
+ const myviewTemplate = mockRegisterTool.mock.calls[0][1]._meta?.ui?.resourceUri;
276
+ const folderviewTemplate = mockRegisterTool.mock.calls[1][1]._meta?.ui?.resourceUri;
277
+ expect(myviewTemplate).not.toEqual(folderviewTemplate);
278
+ expect(myviewTemplate).toMatch(/\?v=[0-9a-f]{8}$/);
279
+ expect(folderviewTemplate).toMatch(/\?v=[0-9a-f]{8}$/);
310
280
  });
311
281
  it("should fall back to bare URI in production when manifest is missing", () => {
312
282
  setTestEnv({ NODE_ENV: "production" });
313
283
  server.registerTool({
314
- name: "unknown-widget",
284
+ name: "unknown-view",
315
285
  description: "Test tool",
316
- view: { component: "unknown-widget" },
286
+ view: { component: "unknown-view" },
317
287
  }, vi.fn());
318
288
  const toolConfig = mockRegisterTool.mock.calls[0]?.[1];
319
- expect(toolConfig._meta?.["openai/outputTemplate"]).toBe("ui://widgets/apps-sdk/unknown-widget.html");
320
- });
321
- it("should register tool with ui.resourceUri only when mcp-app only", async () => {
322
- server.registerTool({
323
- name: "my-widget",
324
- description: "Test tool",
325
- view: {
326
- component: "my-widget",
327
- description: "Test view",
328
- hosts: ["mcp-app"],
329
- },
330
- }, vi.fn());
331
- expect(mockRegisterTool).toHaveBeenCalledTimes(1);
332
- const toolCallArgs = mockRegisterTool.mock.calls[0];
333
- const toolConfig = toolCallArgs?.[1];
334
- expect(toolConfig._meta).toHaveProperty("ui");
335
- expect(toolConfig._meta?.ui).toEqual({
336
- resourceUri: "ui://widgets/ext-apps/my-widget.html",
337
- });
338
- expect(toolConfig._meta?.["openai/outputTemplate"]).toBeUndefined();
289
+ expect(toolConfig._meta?.ui?.resourceUri).toBe("ui://views/ext-apps/unknown-view.html");
339
290
  });
340
291
  it("should inject viewUUID into _meta of tool callback results", async () => {
341
292
  const mockToolCallback = vi.fn().mockResolvedValue({
@@ -343,9 +294,9 @@ describe("McpServer.registerTool (unified API)", () => {
343
294
  structuredContent: { data: "test" },
344
295
  });
345
296
  server.registerTool({
346
- name: "my-widget",
297
+ name: "my-view",
347
298
  description: "Test tool",
348
- view: { component: "my-widget", description: "Test view" },
299
+ view: { component: "my-view", description: "Test view" },
349
300
  }, mockToolCallback);
350
301
  const wrappedCallback = mockRegisterTool.mock.calls[0]?.[2];
351
302
  expect(wrappedCallback).toBeDefined();
@@ -355,6 +306,21 @@ describe("McpServer.registerTool (unified API)", () => {
355
306
  expect(typeof result._meta?.viewUUID).toBe("string");
356
307
  expect(result._meta?.viewUUID).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
357
308
  });
309
+ it("warns when a tool callback returns large model-visible output", async () => {
310
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
311
+ server.registerTool({ name: "large-output", description: "Test tool" }, vi.fn().mockResolvedValue({
312
+ content: [
313
+ {
314
+ type: "text",
315
+ text: "x".repeat(TOOL_OUTPUT_WARNING_TOKENS * 4),
316
+ },
317
+ ],
318
+ }));
319
+ const wrappedCallback = mockRegisterTool.mock.calls[0]?.[2];
320
+ await wrappedCallback({}, {});
321
+ expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Tool "large-output" returned'));
322
+ warnSpy.mockRestore();
323
+ });
358
324
  it("should preserve existing _meta when injecting viewUUID", async () => {
359
325
  const mockToolCallback = vi.fn().mockResolvedValue({
360
326
  content: [{ type: "text", text: "result" }],
@@ -362,9 +328,9 @@ describe("McpServer.registerTool (unified API)", () => {
362
328
  _meta: { requestId: "req-123", cached: true },
363
329
  });
364
330
  server.registerTool({
365
- name: "my-widget",
331
+ name: "my-view",
366
332
  description: "Test tool",
367
- view: { component: "my-widget", description: "Test view" },
333
+ view: { component: "my-view", description: "Test view" },
368
334
  }, mockToolCallback);
369
335
  const wrappedCallback = mockRegisterTool.mock.calls[0]?.[2];
370
336
  const result = await wrappedCallback({}, {});
@@ -378,9 +344,9 @@ describe("McpServer.registerTool (unified API)", () => {
378
344
  structuredContent: {},
379
345
  });
380
346
  server.registerTool({
381
- name: "my-widget",
347
+ name: "my-view",
382
348
  description: "Test tool",
383
- view: { component: "my-widget", description: "Test view" },
349
+ view: { component: "my-view", description: "Test view" },
384
350
  }, mockToolCallback);
385
351
  const wrappedCallback = mockRegisterTool.mock.calls[0]?.[2];
386
352
  const result1 = await wrappedCallback({}, {});
@@ -473,11 +439,12 @@ describe("McpServer.registerTool (unified API)", () => {
473
439
  const host = "localhost:3000";
474
440
  const serverUrl = `http://${host}`;
475
441
  const hmrUrl = `ws://${host}`;
476
- const result = await appsSdkCallback(new URL("ui://widgets/apps-sdk/csp-tool.html"), createMockExtra(host));
442
+ const result = await appsSdkCallback(new URL("ui://views/ext-apps/csp-tool.html"), createMockExtra(host));
477
443
  const meta = result.contents[0]?._meta;
478
- expect(meta["openai/widgetCSP"]).toEqual({
479
- resource_domains: [serverUrl, "https://cdn.example.com"],
480
- connect_domains: [serverUrl, hmrUrl, "https://api.example.com"],
444
+ expect(meta.ui?.csp).toEqual({
445
+ resourceDomains: [serverUrl, "https://cdn.example.com"],
446
+ connectDomains: [serverUrl, hmrUrl, "https://api.example.com"],
447
+ baseUriDomains: [serverUrl],
481
448
  });
482
449
  });
483
450
  it("should let view._meta override framework-computed keys", async () => {
@@ -489,18 +456,20 @@ describe("McpServer.registerTool (unified API)", () => {
489
456
  description: "Test view",
490
457
  csp: { connectDomains: ["https://api.x.com"] },
491
458
  _meta: {
492
- "openai/widgetCSP": {
493
- connect_domains: ["https://api.y.com"],
459
+ ui: {
460
+ csp: {
461
+ connectDomains: ["https://api.y.com"],
462
+ },
494
463
  },
495
464
  },
496
465
  },
497
466
  }, vi.fn());
498
467
  const appsSdkCallback = mockRegisterResource.mock
499
468
  .calls[0]?.[3];
500
- const result = await appsSdkCallback(new URL("ui://widgets/apps-sdk/override-tool.html"), createMockExtra("localhost:3000"));
469
+ const result = await appsSdkCallback(new URL("ui://views/ext-apps/override-tool.html"), createMockExtra("localhost:3000"));
501
470
  const meta = result.contents[0]?._meta;
502
- expect(meta["openai/widgetCSP"]).toEqual({
503
- connect_domains: ["https://api.y.com"],
471
+ expect(meta.ui?.csp).toEqual({
472
+ connectDomains: ["https://api.y.com"],
504
473
  });
505
474
  });
506
475
  it("should pass user _meta keys through to tool config", () => {
@@ -520,4 +489,52 @@ describe("McpServer.registerTool (unified API)", () => {
520
489
  expect(toolConfig._meta?.["acme.com/category"]).toBe("utility");
521
490
  });
522
491
  });
492
+ describe("resources/list view _meta injection", () => {
493
+ afterEach(() => resetTestEnv());
494
+ it("attaches CSP, domain, and connectDomains _meta to view resources at list time", async () => {
495
+ setTestEnv({ NODE_ENV: "production" });
496
+ const app = new Skybridge({
497
+ name: "test",
498
+ version: "1.0.0",
499
+ handler: (server) => server.registerTool({
500
+ name: "start",
501
+ description: "Start",
502
+ view: {
503
+ component: "my-view",
504
+ description: "Onboarding deck",
505
+ domain: "skybridge.tech",
506
+ csp: {
507
+ resourceDomains: ["https://fonts.googleapis.com"],
508
+ redirectDomains: ["https://docs.skybridge.tech"],
509
+ },
510
+ },
511
+ }, vi.fn().mockResolvedValue({
512
+ content: [{ type: "text", text: "ok" }],
513
+ structuredContent: {},
514
+ })),
515
+ });
516
+ const instance = await app.createServerInstance();
517
+ const client = new Client({ name: "test-client", version: "1.0.0" });
518
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
519
+ await instance.connect(serverTransport);
520
+ await client.connect(clientTransport);
521
+ const { resources } = await client.listResources();
522
+ await client.close();
523
+ await instance.close();
524
+ const appsSdk = resources.find((r) => r.uri.includes("apps-sdk"));
525
+ const extApps = resources.find((r) => r.uri.includes("ext-apps"));
526
+ expect(appsSdk).toBeUndefined();
527
+ expect(extApps?._meta).toBeDefined();
528
+ const extUi = extApps._meta?.ui;
529
+ expect(extUi?.csp?.connectDomains?.length).toBeGreaterThan(0);
530
+ expect(extUi?.csp?.resourceDomains).toContain("https://fonts.googleapis.com");
531
+ expect(extUi?.domain).toBe("skybridge.tech");
532
+ const meta = extApps?._meta;
533
+ expect(meta["openai/widgetDescription"]).toBe("Onboarding deck");
534
+ expect(meta["openai/widgetCSP"]?.redirect_domains).toEqual([
535
+ "https://docs.skybridge.tech",
536
+ ]);
537
+ expect(meta.ui?.csp).not.toHaveProperty("redirectDomains");
538
+ });
539
+ });
523
540
  //# sourceMappingURL=view.test.js.map