skybridge 0.0.0-dev.e41a369 → 0.0.0-dev.e434f62

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 (443) hide show
  1. package/README.md +52 -22
  2. package/bin/run.js +5 -0
  3. package/dist/cli/detect-port.d.ts +18 -0
  4. package/dist/cli/detect-port.js +61 -0
  5. package/dist/cli/detect-port.js.map +1 -0
  6. package/dist/cli/header.d.ts +4 -0
  7. package/dist/cli/header.js +6 -0
  8. package/dist/cli/header.js.map +1 -0
  9. package/dist/cli/run-command.d.ts +2 -0
  10. package/dist/cli/run-command.js +43 -0
  11. package/dist/cli/run-command.js.map +1 -0
  12. package/dist/cli/telemetry.d.ts +7 -0
  13. package/dist/cli/telemetry.js +123 -0
  14. package/dist/cli/telemetry.js.map +1 -0
  15. package/dist/cli/tunnel-control-server.d.ts +9 -0
  16. package/dist/cli/tunnel-control-server.js +31 -0
  17. package/dist/cli/tunnel-control-server.js.map +1 -0
  18. package/dist/cli/tunnel-control-server.test.js +39 -0
  19. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  20. package/dist/cli/tunnel-handler.d.ts +3 -0
  21. package/dist/cli/tunnel-handler.js +48 -0
  22. package/dist/cli/tunnel-handler.js.map +1 -0
  23. package/dist/cli/tunnel-handler.test.js +105 -0
  24. package/dist/cli/tunnel-handler.test.js.map +1 -0
  25. package/dist/cli/tunnel.d.ts +57 -0
  26. package/dist/cli/tunnel.js +154 -0
  27. package/dist/cli/tunnel.js.map +1 -0
  28. package/dist/cli/tunnel.test.js +190 -0
  29. package/dist/cli/tunnel.test.js.map +1 -0
  30. package/dist/cli/types.d.ts +5 -0
  31. package/dist/cli/types.js +2 -0
  32. package/dist/cli/types.js.map +1 -0
  33. package/dist/cli/use-execute-steps.d.ts +11 -0
  34. package/dist/cli/use-execute-steps.js +36 -0
  35. package/dist/cli/use-execute-steps.js.map +1 -0
  36. package/dist/cli/use-messages.d.ts +3 -0
  37. package/dist/cli/use-messages.js +11 -0
  38. package/dist/cli/use-messages.js.map +1 -0
  39. package/dist/cli/use-nodemon.d.ts +2 -0
  40. package/dist/cli/use-nodemon.js +73 -0
  41. package/dist/cli/use-nodemon.js.map +1 -0
  42. package/dist/cli/use-open-browser.d.ts +1 -0
  43. package/dist/cli/use-open-browser.js +44 -0
  44. package/dist/cli/use-open-browser.js.map +1 -0
  45. package/dist/cli/use-tunnel.d.ts +14 -0
  46. package/dist/cli/use-tunnel.js +131 -0
  47. package/dist/cli/use-tunnel.js.map +1 -0
  48. package/dist/cli/use-typescript-check.d.ts +9 -0
  49. package/dist/cli/use-typescript-check.js +94 -0
  50. package/dist/cli/use-typescript-check.js.map +1 -0
  51. package/dist/commands/build.d.ts +9 -0
  52. package/dist/commands/build.js +102 -0
  53. package/dist/commands/build.js.map +1 -0
  54. package/dist/commands/dev.d.ts +12 -0
  55. package/dist/commands/dev.js +80 -0
  56. package/dist/commands/dev.js.map +1 -0
  57. package/dist/commands/start.d.ts +9 -0
  58. package/dist/commands/start.js +49 -0
  59. package/dist/commands/start.js.map +1 -0
  60. package/dist/commands/telemetry/disable.d.ts +5 -0
  61. package/dist/commands/telemetry/disable.js +14 -0
  62. package/dist/commands/telemetry/disable.js.map +1 -0
  63. package/dist/commands/telemetry/enable.d.ts +5 -0
  64. package/dist/commands/telemetry/enable.js +14 -0
  65. package/dist/commands/telemetry/enable.js.map +1 -0
  66. package/dist/commands/telemetry/status.d.ts +5 -0
  67. package/dist/commands/telemetry/status.js +14 -0
  68. package/dist/commands/telemetry/status.js.map +1 -0
  69. package/dist/server/asset-base-url-transform-plugin.d.ts +10 -0
  70. package/dist/server/asset-base-url-transform-plugin.js +33 -0
  71. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  72. package/dist/server/asset-base-url-transform-plugin.test.js +84 -0
  73. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  74. package/dist/server/content-helpers.d.ts +27 -0
  75. package/dist/server/content-helpers.js +46 -0
  76. package/dist/server/content-helpers.js.map +1 -0
  77. package/dist/server/content-helpers.test.js +70 -0
  78. package/dist/server/content-helpers.test.js.map +1 -0
  79. package/dist/server/express.d.ts +11 -0
  80. package/dist/server/express.js +101 -0
  81. package/dist/server/express.js.map +1 -0
  82. package/dist/server/express.test.js +430 -0
  83. package/dist/server/express.test.js.map +1 -0
  84. package/dist/server/index.d.ts +6 -0
  85. package/dist/server/index.js +4 -0
  86. package/dist/server/index.js.map +1 -0
  87. package/dist/{src/server → server}/inferUtilityTypes.d.ts +6 -6
  88. package/dist/server/inferUtilityTypes.js.map +1 -0
  89. package/dist/server/metric.d.ts +14 -0
  90. package/dist/server/metric.js +62 -0
  91. package/dist/server/metric.js.map +1 -0
  92. package/dist/server/middleware.d.ts +124 -0
  93. package/dist/server/middleware.js +93 -0
  94. package/dist/server/middleware.js.map +1 -0
  95. package/dist/server/middleware.test-d.js +75 -0
  96. package/dist/server/middleware.test-d.js.map +1 -0
  97. package/dist/server/middleware.test.js +493 -0
  98. package/dist/server/middleware.test.js.map +1 -0
  99. package/dist/server/server.d.ts +203 -0
  100. package/dist/server/server.js +523 -0
  101. package/dist/server/server.js.map +1 -0
  102. package/dist/{src/server → server}/templateHelper.d.ts +5 -4
  103. package/dist/server/templateHelper.js +11 -0
  104. package/dist/server/templateHelper.js.map +1 -0
  105. package/dist/server/templates.generated.d.ts +4 -0
  106. package/dist/server/templates.generated.js +47 -0
  107. package/dist/server/templates.generated.js.map +1 -0
  108. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  109. package/dist/server/tunnel-proxy-router.js +110 -0
  110. package/dist/server/tunnel-proxy-router.js.map +1 -0
  111. package/dist/server/tunnel-proxy-router.test.js +229 -0
  112. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  113. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  114. package/dist/server/view-resource-resolution.test.js +90 -0
  115. package/dist/server/view-resource-resolution.test.js.map +1 -0
  116. package/dist/server/viewsDevServer.d.ts +14 -0
  117. package/dist/server/viewsDevServer.js +45 -0
  118. package/dist/server/viewsDevServer.js.map +1 -0
  119. package/dist/{src/test → test}/utils.d.ts +25 -22
  120. package/dist/{src/test → test}/utils.js +60 -35
  121. package/dist/test/utils.js.map +1 -0
  122. package/dist/test/view.test.js +523 -0
  123. package/dist/test/view.test.js.map +1 -0
  124. package/dist/version.d.ts +1 -0
  125. package/dist/version.js +3 -0
  126. package/dist/version.js.map +1 -0
  127. package/dist/web/bridges/apps-sdk/adaptor.d.ts +26 -0
  128. package/dist/web/bridges/apps-sdk/adaptor.js +102 -0
  129. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -0
  130. package/dist/web/bridges/apps-sdk/bridge.d.ts +10 -0
  131. package/dist/web/bridges/apps-sdk/bridge.js +46 -0
  132. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
  133. package/dist/web/bridges/apps-sdk/index.d.ts +5 -0
  134. package/dist/web/bridges/apps-sdk/index.js +5 -0
  135. package/dist/web/bridges/apps-sdk/index.js.map +1 -0
  136. package/dist/web/bridges/apps-sdk/types.d.ts +133 -0
  137. package/dist/{src/web → web/bridges/apps-sdk}/types.js +0 -1
  138. package/dist/web/bridges/apps-sdk/types.js.map +1 -0
  139. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +2 -0
  140. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +7 -0
  141. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
  142. package/dist/web/bridges/get-adaptor.d.ts +2 -0
  143. package/dist/web/bridges/get-adaptor.js +8 -0
  144. package/dist/web/bridges/get-adaptor.js.map +1 -0
  145. package/dist/web/bridges/index.d.ts +5 -0
  146. package/dist/web/bridges/index.js +6 -0
  147. package/dist/web/bridges/index.js.map +1 -0
  148. package/dist/web/bridges/mcp-app/adaptor.d.ts +50 -0
  149. package/dist/web/bridges/mcp-app/adaptor.js +271 -0
  150. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -0
  151. package/dist/web/bridges/mcp-app/bridge.d.ts +26 -0
  152. package/dist/web/bridges/mcp-app/bridge.js +102 -0
  153. package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
  154. package/dist/web/bridges/mcp-app/index.d.ts +4 -0
  155. package/dist/web/bridges/mcp-app/index.js +4 -0
  156. package/dist/web/bridges/mcp-app/index.js.map +1 -0
  157. package/dist/web/bridges/mcp-app/types.d.ts +8 -0
  158. package/dist/web/bridges/mcp-app/types.js +2 -0
  159. package/dist/web/bridges/mcp-app/types.js.map +1 -0
  160. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +7 -0
  161. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +7 -0
  162. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
  163. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +26 -0
  164. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
  165. package/dist/web/bridges/types.d.ts +117 -0
  166. package/dist/web/bridges/types.js +2 -0
  167. package/dist/web/bridges/types.js.map +1 -0
  168. package/dist/web/bridges/use-host-context.d.ts +2 -0
  169. package/dist/web/bridges/use-host-context.js +8 -0
  170. package/dist/web/bridges/use-host-context.js.map +1 -0
  171. package/dist/web/components/modal-provider.d.ts +4 -0
  172. package/dist/web/components/modal-provider.js +45 -0
  173. package/dist/web/components/modal-provider.js.map +1 -0
  174. package/dist/web/create-store.js +38 -0
  175. package/dist/web/create-store.js.map +1 -0
  176. package/dist/web/create-store.test.js +129 -0
  177. package/dist/web/create-store.test.js.map +1 -0
  178. package/dist/{src/web → web}/data-llm.d.ts +1 -1
  179. package/dist/{src/web → web}/data-llm.js +11 -7
  180. package/dist/web/data-llm.js.map +1 -0
  181. package/dist/web/data-llm.test.js +142 -0
  182. package/dist/web/data-llm.test.js.map +1 -0
  183. package/dist/{src/web → web}/generate-helpers.d.ts +22 -19
  184. package/dist/{src/web → web}/generate-helpers.js +20 -18
  185. package/dist/web/generate-helpers.js.map +1 -0
  186. package/dist/{src/web → web}/generate-helpers.test-d.js +56 -27
  187. package/dist/web/generate-helpers.test-d.js.map +1 -0
  188. package/dist/web/generate-helpers.test.js.map +1 -0
  189. package/dist/{src/web → web}/helpers/state.d.ts +2 -2
  190. package/dist/web/helpers/state.js +45 -0
  191. package/dist/web/helpers/state.js.map +1 -0
  192. package/dist/{src/web → web}/helpers/state.test.js +9 -9
  193. package/dist/web/helpers/state.test.js.map +1 -0
  194. package/dist/web/hooks/index.d.ts +13 -0
  195. package/dist/{src/web → web}/hooks/index.js +6 -5
  196. package/dist/web/hooks/index.js.map +1 -0
  197. package/dist/web/hooks/test/utils.d.ts +16 -0
  198. package/dist/web/hooks/test/utils.js +64 -0
  199. package/dist/web/hooks/test/utils.js.map +1 -0
  200. package/dist/{src/web → web}/hooks/use-call-tool.d.ts +3 -2
  201. package/dist/{src/web → web}/hooks/use-call-tool.js +12 -4
  202. package/dist/web/hooks/use-call-tool.js.map +1 -0
  203. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -0
  204. package/dist/{src/web → web}/hooks/use-call-tool.test.js +34 -19
  205. package/dist/web/hooks/use-call-tool.test.js.map +1 -0
  206. package/dist/web/hooks/use-display-mode.d.ts +4 -0
  207. package/dist/web/hooks/use-display-mode.js +9 -0
  208. package/dist/web/hooks/use-display-mode.js.map +1 -0
  209. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  210. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  211. package/dist/{src/web → web}/hooks/use-display-mode.test.js +1 -0
  212. package/dist/web/hooks/use-display-mode.test.js.map +1 -0
  213. package/dist/web/hooks/use-files.d.ts +7 -0
  214. package/dist/web/hooks/use-files.js +10 -0
  215. package/dist/web/hooks/use-files.js.map +1 -0
  216. package/dist/web/hooks/use-files.test.d.ts +1 -0
  217. package/dist/web/hooks/use-files.test.js +54 -0
  218. package/dist/web/hooks/use-files.test.js.map +1 -0
  219. package/dist/web/hooks/use-layout.d.ts +22 -0
  220. package/dist/web/hooks/use-layout.js +23 -0
  221. package/dist/web/hooks/use-layout.js.map +1 -0
  222. package/dist/web/hooks/use-layout.test.d.ts +1 -0
  223. package/dist/web/hooks/use-layout.test.js +96 -0
  224. package/dist/web/hooks/use-layout.test.js.map +1 -0
  225. package/dist/web/hooks/use-open-external.d.ts +3 -0
  226. package/dist/web/hooks/use-open-external.js +8 -0
  227. package/dist/web/hooks/use-open-external.js.map +1 -0
  228. package/dist/web/hooks/use-open-external.test.d.ts +1 -0
  229. package/dist/web/hooks/use-open-external.test.js +65 -0
  230. package/dist/web/hooks/use-open-external.test.js.map +1 -0
  231. package/dist/web/hooks/use-request-close.d.ts +2 -0
  232. package/dist/web/hooks/use-request-close.js +8 -0
  233. package/dist/web/hooks/use-request-close.js.map +1 -0
  234. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  235. package/dist/web/hooks/use-request-close.test.js +52 -0
  236. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  237. package/dist/web/hooks/use-request-modal.d.ts +9 -0
  238. package/dist/web/hooks/use-request-modal.js +16 -0
  239. package/dist/web/hooks/use-request-modal.js.map +1 -0
  240. package/dist/web/hooks/use-request-modal.test.d.ts +1 -0
  241. package/dist/web/hooks/use-request-modal.test.js +61 -0
  242. package/dist/web/hooks/use-request-modal.test.js.map +1 -0
  243. package/dist/web/hooks/use-request-size.d.ts +3 -0
  244. package/dist/web/hooks/use-request-size.js +8 -0
  245. package/dist/web/hooks/use-request-size.js.map +1 -0
  246. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  247. package/dist/web/hooks/use-request-size.test.js +65 -0
  248. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  249. package/dist/web/hooks/use-send-follow-up-message.d.ts +2 -0
  250. package/dist/web/hooks/use-send-follow-up-message.js +8 -0
  251. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
  252. package/dist/web/hooks/use-set-open-in-app-url.d.ts +1 -0
  253. package/dist/web/hooks/use-set-open-in-app-url.js +8 -0
  254. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  255. package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
  256. package/dist/web/hooks/use-set-open-in-app-url.test.js +43 -0
  257. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  258. package/dist/{src/web → web}/hooks/use-tool-info.d.ts +13 -2
  259. package/dist/web/hooks/use-tool-info.js +26 -0
  260. package/dist/web/hooks/use-tool-info.js.map +1 -0
  261. package/dist/web/hooks/use-tool-info.test-d.d.ts +1 -0
  262. package/dist/{src/web → web}/hooks/use-tool-info.test-d.js +40 -4
  263. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
  264. package/dist/web/hooks/use-tool-info.test.d.ts +1 -0
  265. package/dist/web/hooks/use-tool-info.test.js +130 -0
  266. package/dist/web/hooks/use-tool-info.test.js.map +1 -0
  267. package/dist/web/hooks/use-user.d.ts +18 -0
  268. package/dist/web/hooks/use-user.js +35 -0
  269. package/dist/web/hooks/use-user.js.map +1 -0
  270. package/dist/web/hooks/use-user.test.d.ts +1 -0
  271. package/dist/web/hooks/use-user.test.js +122 -0
  272. package/dist/web/hooks/use-user.test.js.map +1 -0
  273. package/dist/web/hooks/use-view-state.d.ts +4 -0
  274. package/dist/web/hooks/use-view-state.js +32 -0
  275. package/dist/web/hooks/use-view-state.js.map +1 -0
  276. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  277. package/dist/web/hooks/use-view-state.test.js +177 -0
  278. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  279. package/dist/{src/web → web}/index.d.ts +2 -2
  280. package/dist/{src/web → web}/index.js +2 -2
  281. package/dist/web/index.js.map +1 -0
  282. package/dist/web/mount-view.d.ts +1 -0
  283. package/dist/{src/web/mount-widget.js → web/mount-view.js} +11 -3
  284. package/dist/web/mount-view.js.map +1 -0
  285. package/dist/web/plugin/data-llm.test.d.ts +1 -0
  286. package/dist/web/plugin/data-llm.test.js.map +1 -0
  287. package/dist/web/plugin/plugin.d.ts +5 -0
  288. package/dist/web/plugin/plugin.js +156 -0
  289. package/dist/web/plugin/plugin.js.map +1 -0
  290. package/dist/web/plugin/scan-views.d.ts +16 -0
  291. package/dist/web/plugin/scan-views.js +88 -0
  292. package/dist/web/plugin/scan-views.js.map +1 -0
  293. package/dist/web/plugin/scan-views.test.d.ts +1 -0
  294. package/dist/web/plugin/scan-views.test.js +99 -0
  295. package/dist/web/plugin/scan-views.test.js.map +1 -0
  296. package/dist/{src/web → web}/plugin/transform-data-llm.js +7 -4
  297. package/dist/web/plugin/transform-data-llm.js.map +1 -0
  298. package/dist/web/plugin/transform-data-llm.test.d.ts +1 -0
  299. package/dist/web/plugin/transform-data-llm.test.js.map +1 -0
  300. package/dist/web/plugin/validate-view.d.ts +1 -0
  301. package/dist/web/plugin/validate-view.js +9 -0
  302. package/dist/web/plugin/validate-view.js.map +1 -0
  303. package/dist/web/plugin/validate-view.test.d.ts +1 -0
  304. package/dist/web/plugin/validate-view.test.js +24 -0
  305. package/dist/web/plugin/validate-view.test.js.map +1 -0
  306. package/dist/{src/web → web}/proxy.js +5 -1
  307. package/dist/web/proxy.js.map +1 -0
  308. package/dist/web/types.d.ts +16 -0
  309. package/dist/web/types.js +2 -0
  310. package/dist/web/types.js.map +1 -0
  311. package/package.json +79 -42
  312. package/tsconfig.base.json +33 -0
  313. package/dist/src/server/emulatorStaticServer.d.ts +0 -15
  314. package/dist/src/server/emulatorStaticServer.js +0 -38
  315. package/dist/src/server/emulatorStaticServer.js.map +0 -1
  316. package/dist/src/server/index.d.ts +0 -5
  317. package/dist/src/server/index.js +0 -4
  318. package/dist/src/server/index.js.map +0 -1
  319. package/dist/src/server/inferUtilityTypes.js.map +0 -1
  320. package/dist/src/server/server.d.ts +0 -62
  321. package/dist/src/server/server.js +0 -62
  322. package/dist/src/server/server.js.map +0 -1
  323. package/dist/src/server/templateHelper.js +0 -29
  324. package/dist/src/server/templateHelper.js.map +0 -1
  325. package/dist/src/server/templates/development.hbs +0 -12
  326. package/dist/src/server/templates/production.hbs +0 -6
  327. package/dist/src/server/widgetsDevServer.d.ts +0 -12
  328. package/dist/src/server/widgetsDevServer.js +0 -39
  329. package/dist/src/server/widgetsDevServer.js.map +0 -1
  330. package/dist/src/test/utils.js.map +0 -1
  331. package/dist/src/test/widget.test.js +0 -89
  332. package/dist/src/test/widget.test.js.map +0 -1
  333. package/dist/src/web/create-store.js +0 -25
  334. package/dist/src/web/create-store.js.map +0 -1
  335. package/dist/src/web/create-store.test.js +0 -70
  336. package/dist/src/web/create-store.test.js.map +0 -1
  337. package/dist/src/web/data-llm.js.map +0 -1
  338. package/dist/src/web/data-llm.test.js +0 -76
  339. package/dist/src/web/data-llm.test.js.map +0 -1
  340. package/dist/src/web/generate-helpers.js.map +0 -1
  341. package/dist/src/web/generate-helpers.test-d.js.map +0 -1
  342. package/dist/src/web/generate-helpers.test.js.map +0 -1
  343. package/dist/src/web/helpers/state.js +0 -40
  344. package/dist/src/web/helpers/state.js.map +0 -1
  345. package/dist/src/web/helpers/state.test.js.map +0 -1
  346. package/dist/src/web/hooks/index.d.ts +0 -12
  347. package/dist/src/web/hooks/index.js.map +0 -1
  348. package/dist/src/web/hooks/use-call-tool.js.map +0 -1
  349. package/dist/src/web/hooks/use-call-tool.test-d.js.map +0 -1
  350. package/dist/src/web/hooks/use-call-tool.test.js.map +0 -1
  351. package/dist/src/web/hooks/use-display-mode.d.ts +0 -4
  352. package/dist/src/web/hooks/use-display-mode.js +0 -7
  353. package/dist/src/web/hooks/use-display-mode.js.map +0 -1
  354. package/dist/src/web/hooks/use-display-mode.test.js.map +0 -1
  355. package/dist/src/web/hooks/use-files.d.ts +0 -10
  356. package/dist/src/web/hooks/use-files.js +0 -7
  357. package/dist/src/web/hooks/use-files.js.map +0 -1
  358. package/dist/src/web/hooks/use-files.test.js +0 -29
  359. package/dist/src/web/hooks/use-files.test.js.map +0 -1
  360. package/dist/src/web/hooks/use-locale.d.ts +0 -1
  361. package/dist/src/web/hooks/use-locale.js +0 -5
  362. package/dist/src/web/hooks/use-locale.js.map +0 -1
  363. package/dist/src/web/hooks/use-locale.test.js +0 -21
  364. package/dist/src/web/hooks/use-locale.test.js.map +0 -1
  365. package/dist/src/web/hooks/use-open-external.d.ts +0 -1
  366. package/dist/src/web/hooks/use-open-external.js +0 -6
  367. package/dist/src/web/hooks/use-open-external.js.map +0 -1
  368. package/dist/src/web/hooks/use-open-external.test.js +0 -24
  369. package/dist/src/web/hooks/use-open-external.test.js.map +0 -1
  370. package/dist/src/web/hooks/use-openai-global.d.ts +0 -2
  371. package/dist/src/web/hooks/use-openai-global.js +0 -23
  372. package/dist/src/web/hooks/use-openai-global.js.map +0 -1
  373. package/dist/src/web/hooks/use-request-modal.d.ts +0 -6
  374. package/dist/src/web/hooks/use-request-modal.js +0 -9
  375. package/dist/src/web/hooks/use-request-modal.js.map +0 -1
  376. package/dist/src/web/hooks/use-request-modal.test.js +0 -24
  377. package/dist/src/web/hooks/use-request-modal.test.js.map +0 -1
  378. package/dist/src/web/hooks/use-send-follow-up-message.d.ts +0 -1
  379. package/dist/src/web/hooks/use-send-follow-up-message.js +0 -11
  380. package/dist/src/web/hooks/use-send-follow-up-message.js.map +0 -1
  381. package/dist/src/web/hooks/use-theme.d.ts +0 -1
  382. package/dist/src/web/hooks/use-theme.js +0 -5
  383. package/dist/src/web/hooks/use-theme.js.map +0 -1
  384. package/dist/src/web/hooks/use-theme.test.js +0 -26
  385. package/dist/src/web/hooks/use-theme.test.js.map +0 -1
  386. package/dist/src/web/hooks/use-tool-info.js +0 -22
  387. package/dist/src/web/hooks/use-tool-info.js.map +0 -1
  388. package/dist/src/web/hooks/use-tool-info.test-d.js.map +0 -1
  389. package/dist/src/web/hooks/use-tool-info.test.js +0 -59
  390. package/dist/src/web/hooks/use-tool-info.test.js.map +0 -1
  391. package/dist/src/web/hooks/use-user-agent.d.ts +0 -1
  392. package/dist/src/web/hooks/use-user-agent.js +0 -5
  393. package/dist/src/web/hooks/use-user-agent.js.map +0 -1
  394. package/dist/src/web/hooks/use-user-agent.test.js +0 -31
  395. package/dist/src/web/hooks/use-user-agent.test.js.map +0 -1
  396. package/dist/src/web/hooks/use-widget-state.d.ts +0 -4
  397. package/dist/src/web/hooks/use-widget-state.js +0 -32
  398. package/dist/src/web/hooks/use-widget-state.js.map +0 -1
  399. package/dist/src/web/hooks/use-widget-state.test.js +0 -60
  400. package/dist/src/web/hooks/use-widget-state.test.js.map +0 -1
  401. package/dist/src/web/index.js.map +0 -1
  402. package/dist/src/web/mount-widget.d.ts +0 -1
  403. package/dist/src/web/mount-widget.js.map +0 -1
  404. package/dist/src/web/plugin/data-llm.test.js.map +0 -1
  405. package/dist/src/web/plugin/plugin.d.ts +0 -2
  406. package/dist/src/web/plugin/plugin.js +0 -33
  407. package/dist/src/web/plugin/plugin.js.map +0 -1
  408. package/dist/src/web/plugin/transform-data-llm.js.map +0 -1
  409. package/dist/src/web/plugin/transform-data-llm.test.js.map +0 -1
  410. package/dist/src/web/proxy.js.map +0 -1
  411. package/dist/src/web/types.d.ts +0 -133
  412. package/dist/src/web/types.js.map +0 -1
  413. package/dist/vitest.config.d.ts +0 -2
  414. package/dist/vitest.config.js +0 -8
  415. package/dist/vitest.config.js.map +0 -1
  416. /package/dist/{src/test/widget.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  417. /package/dist/{src/web/create-store.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
  418. /package/dist/{src/web/data-llm.test.d.ts → cli/tunnel.test.d.ts} +0 -0
  419. /package/dist/{src/web/generate-helpers.test-d.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
  420. /package/dist/{src/web/generate-helpers.test.d.ts → server/content-helpers.test.d.ts} +0 -0
  421. /package/dist/{src/web/helpers/state.test.d.ts → server/express.test.d.ts} +0 -0
  422. /package/dist/{src/server → server}/inferUtilityTypes.js +0 -0
  423. /package/dist/{src/web/hooks/use-call-tool.test-d.d.ts → server/middleware.test-d.d.ts} +0 -0
  424. /package/dist/{src/web/hooks/use-call-tool.test.d.ts → server/middleware.test.d.ts} +0 -0
  425. /package/dist/{src/web/hooks/use-display-mode.test.d.ts → server/tunnel-proxy-router.test.d.ts} +0 -0
  426. /package/dist/{src/web/hooks/use-files.test.d.ts → test/view.test.d.ts} +0 -0
  427. /package/dist/{src/web/hooks/use-locale.test.d.ts → web/bridges/mcp-app/use-mcp-app-context.test.d.ts} +0 -0
  428. /package/dist/{src/web → web}/create-store.d.ts +0 -0
  429. /package/dist/{src/web/hooks/use-open-external.test.d.ts → web/create-store.test.d.ts} +0 -0
  430. /package/dist/{src/web/plugin → web}/data-llm.test.d.ts +0 -0
  431. /package/dist/{src/web/hooks/use-request-modal.test.d.ts → web/generate-helpers.test-d.d.ts} +0 -0
  432. /package/dist/{src/web/hooks/use-theme.test.d.ts → web/generate-helpers.test.d.ts} +0 -0
  433. /package/dist/{src/web → web}/generate-helpers.test.js +0 -0
  434. /package/dist/{src/web/hooks/use-tool-info.test-d.d.ts → web/helpers/state.test.d.ts} +0 -0
  435. /package/dist/{src/web/hooks/use-tool-info.test.d.ts → web/hooks/use-call-tool.test-d.d.ts} +0 -0
  436. /package/dist/{src/web → web}/hooks/use-call-tool.test-d.js +0 -0
  437. /package/dist/{src/web/hooks/use-user-agent.test.d.ts → web/hooks/use-call-tool.test.d.ts} +0 -0
  438. /package/dist/{src/web/hooks/use-widget-state.test.d.ts → web/hooks/use-display-mode.test-d.d.ts} +0 -0
  439. /package/dist/{src/web/plugin/transform-data-llm.test.d.ts → web/hooks/use-display-mode.test.d.ts} +0 -0
  440. /package/dist/{src/web → web}/plugin/data-llm.test.js +0 -0
  441. /package/dist/{src/web → web}/plugin/transform-data-llm.d.ts +0 -0
  442. /package/dist/{src/web → web}/plugin/transform-data-llm.test.js +0 -0
  443. /package/dist/{src/web → web}/proxy.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-resource-resolution.test.js","sourceRoot":"","sources":["../../src/server/view-resource-resolution.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { InMemoryTransport } from \"@modelcontextprotocol/sdk/inMemory.js\";\nimport { afterEach, describe, expect, it } from \"vitest\";\nimport { McpServer } from \"./index.js\";\n\n// Mirror what the Skybridge Vite plugin generates in `.skybridge/views.d.ts`:\n// narrow `ViewName` so `component: \"widget\"` typechecks against the registry.\ndeclare module \"./server.js\" {\n interface ViewNameRegistry {\n widget: true;\n }\n}\n\n// - a view resource must resolve no matter the `?v=` query param value.\n// The version param is a content-derived cache key for external consumers\n// (it busts host/CDN caches when the bundle changes); it is not part of the\n// resource's identity, so a stale, absent, or arbitrary param must still serve\n// the underlying asset.\n\nasync function connect(register: (server: McpServer) => void) {\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n register(server);\n const client = new Client({ name: \"test-client\", version: \"1.0.0\" });\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n return {\n client,\n teardown: async () => {\n await client.close();\n await server.close();\n },\n };\n}\n\nfunction registerWidget(server: McpServer) {\n server.registerTool(\n { name: \"show\", description: \"show\", view: { component: \"widget\" } },\n () => ({ content: [{ type: \"text\" as const, text: \"ok\" }] }),\n );\n}\n\n/** Narrow a read-resource content entry to its text variant. */\nfunction textContent(contents: Array<{ uri: string }>): {\n uri: string;\n text: string;\n} {\n return contents[0] as { uri: string; text: string };\n}\n\ndescribe(\"view resource resolution (cache key)\", () => {\n afterEach(() => {\n delete process.env.NODE_ENV;\n });\n\n it(\"resolves regardless of the ?v= param and echoes the requested URI\", async () => {\n const { client, teardown } = await connect(registerWidget);\n\n const { resources } = await client.listResources();\n const listed = resources.find((r) =>\n r.uri.startsWith(\"ui://views/apps-sdk/widget.html\"),\n );\n // Dev build advertises no cache key.\n expect(listed?.uri).toBe(\"ui://views/apps-sdk/widget.html\");\n\n // A stale/arbitrary/absent param all resolve the same underlying asset,\n // and the response echoes the URI the consumer asked for (never rewritten).\n for (const uri of [\n \"ui://views/apps-sdk/widget.html?v=stale123\",\n \"ui://views/apps-sdk/widget.html?v=whatever-else\",\n \"ui://views/apps-sdk/widget.html\",\n ]) {\n const { contents } = await client.readResource({ uri });\n expect(contents).toHaveLength(1);\n const content = textContent(contents);\n expect(typeof content.text).toBe(\"string\");\n expect(content.text.length).toBeGreaterThan(0);\n expect(content.uri).toBe(uri);\n }\n\n await teardown();\n });\n\n it(\"resolves a stale cache key when the canonical URI carries ?v= (prod)\", async () => {\n process.env.NODE_ENV = \"production\";\n\n const { client, teardown } = await connect((server) => {\n server.setViteManifest({\n \"src/views/widget.tsx\": {\n isEntry: true,\n name: \"widget\",\n file: \"assets/widget-ABC123.js\",\n },\n \"style.css\": { file: \"assets/style-XYZ.css\" },\n } as unknown as Record<string, { file: string }>);\n registerWidget(server);\n });\n\n const { resources } = await client.listResources();\n const listed = resources.find((r) =>\n r.uri.startsWith(\"ui://views/apps-sdk/widget.html\"),\n );\n // Production advertises a content-derived cache key.\n expect(listed?.uri).toMatch(\n /^ui:\\/\\/views\\/apps-sdk\\/widget\\.html\\?v=[0-9a-f]{8}$/,\n );\n\n // A consumer holding a stale key still resolves the current asset.\n const staleUri = \"ui://views/apps-sdk/widget.html?v=00000000\";\n const { contents } = await client.readResource({ uri: staleUri });\n expect(contents).toHaveLength(1);\n const content = textContent(contents);\n expect(typeof content.text).toBe(\"string\");\n expect(content.uri).toBe(staleUri);\n\n await teardown();\n });\n\n it(\"still throws for an unknown view path\", async () => {\n const { client, teardown } = await connect(registerWidget);\n\n await expect(\n client.readResource({ uri: \"ui://views/apps-sdk/nope.html?v=1\" }),\n ).rejects.toThrow();\n\n await teardown();\n });\n});\n"]}
@@ -0,0 +1,14 @@
1
+ import type http from "node:http";
2
+ import { type Router } from "express";
3
+ /**
4
+ * Vite dev-server middleware for view assets.
5
+ *
6
+ * MUST be mounted at the Express app root so Vite can intercept
7
+ * `/@vite/client`, `/@react-refresh`, and `/_skybridge/view/...` imports:
8
+ *
9
+ * const app = express();
10
+ * if (env.NODE_ENV !== "production") {
11
+ * app.use(await viewsDevServer(httpServer));
12
+ * }
13
+ */
14
+ export declare const viewsDevServer: (httpServer: http.Server) => Promise<Router>;
@@ -0,0 +1,45 @@
1
+ import path from "node:path";
2
+ import cors from "cors";
3
+ import express, {} from "express";
4
+ import { assetBaseUrlTransformPlugin } from "./asset-base-url-transform-plugin.js";
5
+ /**
6
+ * Vite dev-server middleware for view assets.
7
+ *
8
+ * MUST be mounted at the Express app root so Vite can intercept
9
+ * `/@vite/client`, `/@react-refresh`, and `/_skybridge/view/...` imports:
10
+ *
11
+ * const app = express();
12
+ * if (env.NODE_ENV !== "production") {
13
+ * app.use(await viewsDevServer(httpServer));
14
+ * }
15
+ */
16
+ export const viewsDevServer = async (httpServer) => {
17
+ const router = express.Router();
18
+ const { createServer, loadConfigFromFile } = await import("vite");
19
+ const root = process.cwd();
20
+ const configFile = path.join(root, "vite.config.ts");
21
+ const configResult = await loadConfigFromFile({ command: "serve", mode: "development" }, configFile, root);
22
+ const { build, preview, plugins: userPlugins = [], ...devConfig } = configResult?.config || {};
23
+ const vite = await createServer({
24
+ ...devConfig,
25
+ // Pass `false` so Vite skips re-resolving a config file — we already
26
+ // loaded and spread the user's config above.
27
+ configFile: false,
28
+ appType: "custom",
29
+ server: {
30
+ allowedHosts: true,
31
+ middlewareMode: true,
32
+ hmr: {
33
+ server: httpServer,
34
+ },
35
+ },
36
+ root,
37
+ // optimizeDeps is set by the skybridge Vite plugin (entries + include)
38
+ // so it can derive the view glob from `viewsDir`.
39
+ plugins: [...userPlugins, assetBaseUrlTransformPlugin()],
40
+ });
41
+ router.use(cors());
42
+ router.use("/", vite.middlewares);
43
+ return router;
44
+ };
45
+ //# sourceMappingURL=viewsDevServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewsDevServer.js","sourceRoot":"","sources":["../../src/server/viewsDevServer.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,EAAE,EAAe,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAEnF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,UAAuB,EACN,EAAE;IACnB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAElE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAErD,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAC3C,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,EACzC,UAAU,EACV,IAAI,CACL,CAAC;IAEF,MAAM,EACJ,KAAK,EACL,OAAO,EACP,OAAO,EAAE,WAAW,GAAG,EAAE,EACzB,GAAG,SAAS,EACb,GAAG,YAAY,EAAE,MAAM,IAAI,EAAE,CAAC;IAE/B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC;QAC9B,GAAG,SAAS;QACZ,qEAAqE;QACrE,6CAA6C;QAC7C,UAAU,EAAE,KAAK;QACjB,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE;YACN,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;YACpB,GAAG,EAAE;gBACH,MAAM,EAAE,UAAU;aACnB;SACF;QACD,IAAI;QACJ,uEAAuE;QACvE,kDAAkD;QAClD,OAAO,EAAE,CAAC,GAAG,WAAW,EAAE,2BAA2B,EAAE,CAAC;KACzD,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAElC,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC","sourcesContent":["import type http from \"node:http\";\nimport path from \"node:path\";\nimport cors from \"cors\";\nimport express, { type Router } from \"express\";\nimport { assetBaseUrlTransformPlugin } from \"./asset-base-url-transform-plugin.js\";\n\n/**\n * Vite dev-server middleware for view assets.\n *\n * MUST be mounted at the Express app root so Vite can intercept\n * `/@vite/client`, `/@react-refresh`, and `/_skybridge/view/...` imports:\n *\n * const app = express();\n * if (env.NODE_ENV !== \"production\") {\n * app.use(await viewsDevServer(httpServer));\n * }\n */\nexport const viewsDevServer = async (\n httpServer: http.Server,\n): Promise<Router> => {\n const router = express.Router();\n\n const { createServer, loadConfigFromFile } = await import(\"vite\");\n\n const root = process.cwd();\n const configFile = path.join(root, \"vite.config.ts\");\n\n const configResult = await loadConfigFromFile(\n { command: \"serve\", mode: \"development\" },\n configFile,\n root,\n );\n\n const {\n build,\n preview,\n plugins: userPlugins = [],\n ...devConfig\n } = configResult?.config || {};\n\n const vite = await createServer({\n ...devConfig,\n // Pass `false` so Vite skips re-resolving a config file — we already\n // loaded and spread the user's config above.\n configFile: false,\n appType: \"custom\",\n server: {\n allowedHosts: true,\n middlewareMode: true,\n hmr: {\n server: httpServer,\n },\n },\n root,\n // optimizeDeps is set by the skybridge Vite plugin (entries + include)\n // so it can derive the view glob from `viewsDir`.\n plugins: [...userPlugins, assetBaseUrlTransformPlugin()],\n });\n\n router.use(cors());\n router.use(\"/\", vite.middlewares);\n\n return router;\n};\n"]}
@@ -1,15 +1,12 @@
1
1
  import { type MockInstance } from "vitest";
2
2
  import { McpServer } from "../server/server.js";
3
- /**
4
- * Creates a real McpServer instance for testing
5
- */
6
3
  export declare function createMockMcpServer(): {
7
4
  server: McpServer;
8
5
  mockRegisterResource: MockInstance<McpServer["registerResource"]>;
9
- mockRegisterTool: MockInstance<McpServer["registerTool"]>;
6
+ mockRegisterTool: MockInstance;
10
7
  };
11
- export declare function createTestServer(): McpServer<{
12
- "search-voyage": import("../server/server.js").ToolDef<{
8
+ export declare function createTestServer(): McpServer<Record<never, import("../server/server.js").ToolDef<unknown, unknown, unknown>> & {
9
+ "search-trip": import("../server/server.js").ToolDef<{
13
10
  destination: string;
14
11
  departureDate?: string | undefined;
15
12
  maxPrice?: number | undefined;
@@ -30,9 +27,9 @@ export declare function createTestServer(): McpServer<{
30
27
  images: string[];
31
28
  }, unknown>;
32
29
  } & {
33
- "no-input-widget": import("../server/server.js").ToolDef<{}, {}, unknown>;
30
+ "no-input-view": import("../server/server.js").ToolDef<{}, {}, unknown>;
34
31
  } & {
35
- "inferred-output-widget": import("../server/server.js").ToolDef<{
32
+ "inferred-output-view": import("../server/server.js").ToolDef<{
36
33
  query: string;
37
34
  }, {
38
35
  inferredResults: {
@@ -60,7 +57,7 @@ export declare function createTestServer(): McpServer<{
60
57
  fetchedAt: string;
61
58
  }, unknown>;
62
59
  } & {
63
- "widget-with-metadata": import("../server/server.js").ToolDef<{
60
+ "view-with-metadata": import("../server/server.js").ToolDef<{
64
61
  resourceId: string;
65
62
  }, {
66
63
  data: {
@@ -82,7 +79,7 @@ export declare function createTestServer(): McpServer<{
82
79
  source: string;
83
80
  }>;
84
81
  } & {
85
- "widget-with-mixed-returns": import("../server/server.js").ToolDef<{
82
+ "view-with-mixed-returns": import("../server/server.js").ToolDef<{
86
83
  shouldSucceed: boolean;
87
84
  }, {
88
85
  error: string;
@@ -95,8 +92,8 @@ export declare function createTestServer(): McpServer<{
95
92
  region: string;
96
93
  }>;
97
94
  }>;
98
- export declare function createMinimalTestServer(): McpServer<{
99
- "search-voyage": import("../server/server.js").ToolDef<{
95
+ export declare function createMinimalTestServer(): McpServer<Record<never, import("../server/server.js").ToolDef<unknown, unknown, unknown>> & {
96
+ "search-trip": import("../server/server.js").ToolDef<{
100
97
  destination: string;
101
98
  }, {
102
99
  results: {
@@ -104,21 +101,27 @@ export declare function createMinimalTestServer(): McpServer<{
104
101
  }[];
105
102
  }, unknown>;
106
103
  }>;
107
- /**
108
- * Mock extra parameter for resource callback
109
- */
110
- export declare function createMockExtra(host: string): {
104
+ export declare function createInterfaceTestServer(): McpServer<Record<never, import("../server/server.js").ToolDef<unknown, unknown, unknown>> & {
105
+ "interface-view": import("../server/server.js").ToolDef<{
106
+ id: string;
107
+ }, {
108
+ itemName: string;
109
+ quantity: number;
110
+ }, {
111
+ processedBy: string;
112
+ version: number;
113
+ }>;
114
+ }>;
115
+ export declare function createMockExtra(host: string, options?: {
116
+ headers?: Record<string, string | string[]>;
117
+ url?: URL | string;
118
+ }): {
111
119
  requestInfo: {
120
+ url?: string | URL | undefined;
112
121
  headers: {
113
122
  host: string;
114
123
  };
115
124
  };
116
125
  };
117
- /**
118
- * Sets up environment variables for testing
119
- */
120
126
  export declare function setTestEnv(env: Record<string, string>): void;
121
- /**
122
- * Resets environment variables
123
- */
124
127
  export declare function resetTestEnv(): void;
@@ -1,18 +1,14 @@
1
+ import { McpServer as McpServerBase } from "@modelcontextprotocol/sdk/server/mcp.js";
1
2
  import { vi } from "vitest";
2
3
  import * as z from "zod";
3
4
  import { McpServer } from "../server/server.js";
4
- /**
5
- * Creates a real McpServer instance for testing
6
- */
7
5
  export function createMockMcpServer() {
8
- // Create a real McpServer instance
9
6
  const server = new McpServer({
10
7
  name: "alpic-openai-app",
11
8
  version: "0.0.1",
12
9
  }, { capabilities: {} });
13
- // Mock the underlying methods to track calls
14
10
  const mockRegisterResource = vi.spyOn(server, "registerResource");
15
- const mockRegisterTool = vi.spyOn(server, "registerTool");
11
+ const mockRegisterTool = vi.spyOn(McpServerBase.prototype, "registerTool");
16
12
  return {
17
13
  server,
18
14
  mockRegisterResource,
@@ -21,8 +17,9 @@ export function createMockMcpServer() {
21
17
  }
22
18
  export function createTestServer() {
23
19
  return new McpServer({ name: "test-app", version: "1.0.0" }, {})
24
- .registerWidget("search-voyage", {}, {
25
- description: "Search for voyages",
20
+ .registerTool({
21
+ name: "search-trip",
22
+ description: "Search for trips",
26
23
  inputSchema: {
27
24
  destination: z.string(),
28
25
  departureDate: z.string().optional(),
@@ -36,6 +33,7 @@ export function createTestServer() {
36
33
  })),
37
34
  totalCount: z.number(),
38
35
  },
36
+ view: { component: "search-trip" },
39
37
  }, async ({ destination }) => {
40
38
  return {
41
39
  content: [{ type: "text", text: `Found trips to ${destination}` }],
@@ -45,7 +43,8 @@ export function createTestServer() {
45
43
  },
46
44
  };
47
45
  })
48
- .registerWidget("get-trip-details", {}, {
46
+ .registerTool({
47
+ name: "get-trip-details",
49
48
  description: "Get trip details",
50
49
  inputSchema: {
51
50
  tripId: z.string(),
@@ -55,6 +54,7 @@ export function createTestServer() {
55
54
  description: z.string(),
56
55
  images: z.array(z.string()),
57
56
  },
57
+ view: { component: "get-trip-details" },
58
58
  }, async ({ tripId }) => {
59
59
  return {
60
60
  content: [{ type: "text", text: `Details for ${tripId}` }],
@@ -65,21 +65,25 @@ export function createTestServer() {
65
65
  },
66
66
  };
67
67
  })
68
- .registerWidget("no-input-widget", {}, {
69
- description: "Widget with no input",
68
+ .registerTool({
69
+ name: "no-input-view",
70
+ description: "View with no input",
70
71
  inputSchema: {},
71
72
  outputSchema: {},
73
+ view: { component: "no-input-view" },
72
74
  }, async () => {
73
75
  return {
74
76
  content: [{ type: "text", text: "No input needed" }],
75
77
  structuredContent: {},
76
78
  };
77
79
  })
78
- .registerWidget("inferred-output-widget", {}, {
79
- description: "Widget with output inferred from callback",
80
+ .registerTool({
81
+ name: "inferred-output-view",
82
+ description: "View with output inferred from callback",
80
83
  inputSchema: {
81
84
  query: z.string(),
82
85
  },
86
+ view: { component: "inferred-output-view" },
83
87
  }, async ({ query }) => {
84
88
  return {
85
89
  content: [{ type: "text", text: `Query: ${query}` }],
@@ -89,7 +93,8 @@ export function createTestServer() {
89
93
  },
90
94
  };
91
95
  })
92
- .registerTool("calculate-price", {
96
+ .registerTool({
97
+ name: "calculate-price",
93
98
  description: "Calculate trip price",
94
99
  inputSchema: {
95
100
  tripId: z.string(),
@@ -108,7 +113,8 @@ export function createTestServer() {
108
113
  },
109
114
  };
110
115
  })
111
- .registerTool("inferred-tool", {
116
+ .registerTool({
117
+ name: "inferred-tool",
112
118
  description: "Tool with output inferred from callback",
113
119
  inputSchema: {
114
120
  itemId: z.string(),
@@ -122,11 +128,13 @@ export function createTestServer() {
122
128
  },
123
129
  };
124
130
  })
125
- .registerWidget("widget-with-metadata", {}, {
126
- description: "Widget that returns response metadata",
131
+ .registerTool({
132
+ name: "view-with-metadata",
133
+ description: "View that returns response metadata",
127
134
  inputSchema: {
128
135
  resourceId: z.string(),
129
136
  },
137
+ view: { component: "view-with-metadata" },
130
138
  }, async ({ resourceId }) => {
131
139
  return {
132
140
  content: [{ type: "text", text: `Resource: ${resourceId}` }],
@@ -140,7 +148,8 @@ export function createTestServer() {
140
148
  },
141
149
  };
142
150
  })
143
- .registerTool("tool-with-metadata", {
151
+ .registerTool({
152
+ name: "tool-with-metadata",
144
153
  description: "Tool that returns response metadata",
145
154
  inputSchema: {
146
155
  query: z.string(),
@@ -157,20 +166,20 @@ export function createTestServer() {
157
166
  },
158
167
  };
159
168
  })
160
- .registerWidget("widget-with-mixed-returns", {}, {
161
- description: "Widget with mixed return paths (some with _meta, some without)",
169
+ .registerTool({
170
+ name: "view-with-mixed-returns",
171
+ description: "View with mixed return paths (some with _meta, some without)",
162
172
  inputSchema: {
163
173
  shouldSucceed: z.boolean(),
164
174
  },
175
+ view: { component: "view-with-mixed-returns" },
165
176
  }, async ({ shouldSucceed }) => {
166
177
  if (!shouldSucceed) {
167
- // Error path - no _meta
168
178
  return {
169
179
  content: [{ type: "text", text: "Error occurred" }],
170
180
  structuredContent: { error: "Something went wrong" },
171
181
  };
172
182
  }
173
- // Success path - has _meta
174
183
  return {
175
184
  content: [{ type: "text", text: "Success" }],
176
185
  structuredContent: { data: "result" },
@@ -182,14 +191,16 @@ export function createTestServer() {
182
191
  });
183
192
  }
184
193
  export function createMinimalTestServer() {
185
- return new McpServer({ name: "test-app", version: "1.0.0" }, {}).registerWidget("search-voyage", {}, {
186
- description: "Search for voyages",
194
+ return new McpServer({ name: "test-app", version: "1.0.0" }, {}).registerTool({
195
+ name: "search-trip",
196
+ description: "Search for trips",
187
197
  inputSchema: {
188
198
  destination: z.string(),
189
199
  },
190
200
  outputSchema: {
191
201
  results: z.array(z.object({ id: z.string() })),
192
202
  },
203
+ view: { component: "search-trip" },
193
204
  }, async ({ destination }) => {
194
205
  return {
195
206
  content: [{ type: "text", text: `Found trips to ${destination}` }],
@@ -197,25 +208,39 @@ export function createMinimalTestServer() {
197
208
  };
198
209
  });
199
210
  }
200
- /**
201
- * Mock extra parameter for resource callback
202
- */
203
- export function createMockExtra(host) {
211
+ export function createInterfaceTestServer() {
212
+ return new McpServer({ name: "interface-test-app", version: "1.0.0" }, {}).registerTool({
213
+ name: "interface-view",
214
+ description: "View with interface-typed output",
215
+ inputSchema: {
216
+ id: z.string(),
217
+ },
218
+ view: { component: "interface-view" },
219
+ }, async ({ id }) => {
220
+ return {
221
+ content: [{ type: "text", text: `Item ${id}` }],
222
+ structuredContent: {
223
+ itemName: "Test Item",
224
+ quantity: 42,
225
+ },
226
+ _meta: {
227
+ processedBy: "test",
228
+ version: 1,
229
+ },
230
+ };
231
+ });
232
+ }
233
+ export function createMockExtra(host, options) {
204
234
  return {
205
235
  requestInfo: {
206
- headers: { host },
236
+ headers: { host, ...(options?.headers ?? {}) },
237
+ ...(options?.url ? { url: options.url } : {}),
207
238
  },
208
239
  };
209
240
  }
210
- /**
211
- * Sets up environment variables for testing
212
- */
213
241
  export function setTestEnv(env) {
214
242
  Object.assign(process.env, env);
215
243
  }
216
- /**
217
- * Resets environment variables
218
- */
219
244
  export function resetTestEnv() {
220
245
  delete process.env.NODE_ENV;
221
246
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/test/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { McpServer as McpServerBase } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { type MockInstance, vi } from \"vitest\";\nimport * as z from \"zod\";\nimport { McpServer, type ViewName } from \"../server/server.js\";\n\nexport function createMockMcpServer(): {\n server: McpServer;\n mockRegisterResource: MockInstance<McpServer[\"registerResource\"]>;\n mockRegisterTool: MockInstance;\n} {\n const server = new McpServer(\n {\n name: \"alpic-openai-app\",\n version: \"0.0.1\",\n },\n { capabilities: {} },\n );\n\n const mockRegisterResource = vi.spyOn(server, \"registerResource\");\n const mockRegisterTool = vi.spyOn(McpServerBase.prototype, \"registerTool\");\n\n return {\n server,\n mockRegisterResource,\n mockRegisterTool,\n };\n}\n\nexport function createTestServer() {\n return new McpServer({ name: \"test-app\", version: \"1.0.0\" }, {})\n .registerTool(\n {\n name: \"search-trip\",\n description: \"Search for trips\",\n inputSchema: {\n destination: z.string(),\n departureDate: z.string().optional(),\n maxPrice: z.number().optional(),\n },\n outputSchema: {\n results: z.array(\n z.object({\n id: z.string(),\n name: z.string(),\n price: z.number(),\n }),\n ),\n totalCount: z.number(),\n },\n view: { component: \"search-trip\" as ViewName },\n },\n async ({ destination }) => {\n return {\n content: [{ type: \"text\", text: `Found trips to ${destination}` }],\n structuredContent: {\n results: [{ id: \"1\", name: \"Trip\", price: 1000 }],\n totalCount: 1,\n },\n };\n },\n )\n .registerTool(\n {\n name: \"get-trip-details\",\n description: \"Get trip details\",\n inputSchema: {\n tripId: z.string(),\n },\n outputSchema: {\n name: z.string(),\n description: z.string(),\n images: z.array(z.string()),\n },\n view: { component: \"get-trip-details\" as ViewName },\n },\n async ({ tripId }) => {\n return {\n content: [{ type: \"text\", text: `Details for ${tripId}` }],\n structuredContent: {\n name: \"Trip\",\n description: \"A great trip\",\n images: [\"image1.jpg\"],\n },\n };\n },\n )\n .registerTool(\n {\n name: \"no-input-view\",\n description: \"View with no input\",\n inputSchema: {},\n outputSchema: {},\n view: { component: \"no-input-view\" as ViewName },\n },\n async () => {\n return {\n content: [{ type: \"text\", text: \"No input needed\" }],\n structuredContent: {},\n };\n },\n )\n .registerTool(\n {\n name: \"inferred-output-view\",\n description: \"View with output inferred from callback\",\n inputSchema: {\n query: z.string(),\n },\n view: { component: \"inferred-output-view\" as ViewName },\n },\n async ({ query }) => {\n return {\n content: [{ type: \"text\", text: `Query: ${query}` }],\n structuredContent: {\n inferredResults: [{ id: \"inferred-1\", score: 0.95 }],\n inferredCount: 1,\n },\n };\n },\n )\n .registerTool(\n {\n name: \"calculate-price\",\n description: \"Calculate trip price\",\n inputSchema: {\n tripId: z.string(),\n passengers: z.number(),\n },\n outputSchema: {\n totalPrice: z.number(),\n currency: z.string(),\n },\n },\n async ({ tripId, passengers }) => {\n return {\n content: [{ type: \"text\", text: `Price for ${tripId}` }],\n structuredContent: {\n totalPrice: 1000 * passengers,\n currency: \"USD\",\n },\n };\n },\n )\n .registerTool(\n {\n name: \"inferred-tool\",\n description: \"Tool with output inferred from callback\",\n inputSchema: {\n itemId: z.string(),\n },\n },\n async ({ itemId }) => {\n return {\n content: [{ type: \"text\", text: `Item: ${itemId}` }],\n structuredContent: {\n itemDetails: { name: \"Inferred Item\", available: true },\n fetchedAt: \"2024-01-01\",\n },\n };\n },\n )\n .registerTool(\n {\n name: \"view-with-metadata\",\n description: \"View that returns response metadata\",\n inputSchema: {\n resourceId: z.string(),\n },\n view: { component: \"view-with-metadata\" as ViewName },\n },\n async ({ resourceId }) => {\n return {\n content: [{ type: \"text\", text: `Resource: ${resourceId}` }],\n structuredContent: {\n data: { id: resourceId, loaded: true },\n },\n _meta: {\n requestId: \"req-123\",\n timestamp: 1704067200000,\n cached: false,\n },\n };\n },\n )\n .registerTool(\n {\n name: \"tool-with-metadata\",\n description: \"Tool that returns response metadata\",\n inputSchema: {\n query: z.string(),\n },\n },\n async ({ query }) => {\n return {\n content: [{ type: \"text\", text: `Query: ${query}` }],\n structuredContent: {\n results: [query],\n },\n _meta: {\n executionTime: 150,\n source: \"cache\",\n },\n };\n },\n )\n .registerTool(\n {\n name: \"view-with-mixed-returns\",\n description:\n \"View with mixed return paths (some with _meta, some without)\",\n inputSchema: {\n shouldSucceed: z.boolean(),\n },\n view: { component: \"view-with-mixed-returns\" as ViewName },\n },\n async ({ shouldSucceed }) => {\n if (!shouldSucceed) {\n return {\n content: [{ type: \"text\", text: \"Error occurred\" }],\n structuredContent: { error: \"Something went wrong\" },\n };\n }\n return {\n content: [{ type: \"text\", text: \"Success\" }],\n structuredContent: { data: \"result\" },\n _meta: {\n processedAt: 1704067200000,\n region: \"eu-west-1\",\n },\n };\n },\n );\n}\n\nexport function createMinimalTestServer() {\n return new McpServer({ name: \"test-app\", version: \"1.0.0\" }, {}).registerTool(\n {\n name: \"search-trip\",\n description: \"Search for trips\",\n inputSchema: {\n destination: z.string(),\n },\n outputSchema: {\n results: z.array(z.object({ id: z.string() })),\n },\n view: { component: \"search-trip\" as ViewName },\n },\n async ({ destination }) => {\n return {\n content: [{ type: \"text\", text: `Found trips to ${destination}` }],\n structuredContent: { results: [{ id: \"1\" }] },\n };\n },\n );\n}\n\ninterface InterfaceOutput {\n itemName: string;\n quantity: number;\n}\n\ninterface InterfaceMeta {\n processedBy: string;\n version: number;\n}\n\ninterface InterfaceReturnType {\n content: [{ type: \"text\"; text: string }];\n structuredContent: InterfaceOutput;\n _meta: InterfaceMeta;\n}\n\nexport function createInterfaceTestServer() {\n return new McpServer(\n { name: \"interface-test-app\", version: \"1.0.0\" },\n {},\n ).registerTool(\n {\n name: \"interface-view\" as const,\n description: \"View with interface-typed output\",\n inputSchema: {\n id: z.string(),\n },\n view: { component: \"interface-view\" as ViewName },\n },\n async ({ id }): Promise<InterfaceReturnType> => {\n return {\n content: [{ type: \"text\", text: `Item ${id}` }],\n structuredContent: {\n itemName: \"Test Item\",\n quantity: 42,\n },\n _meta: {\n processedBy: \"test\",\n version: 1,\n },\n };\n },\n );\n}\n\nexport function createMockExtra(\n host: string,\n options?: {\n headers?: Record<string, string | string[]>;\n url?: URL | string;\n },\n) {\n return {\n requestInfo: {\n headers: { host, ...(options?.headers ?? {}) },\n ...(options?.url ? { url: options.url } : {}),\n },\n };\n}\n\nexport function setTestEnv(env: Record<string, string>) {\n Object.assign(process.env, env);\n}\n\nexport function resetTestEnv() {\n delete process.env.NODE_ENV;\n}\n"]}