skybridge 0.0.0-dev.e97960f → 0.0.0-dev.e99ee17

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 (439) 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/resolve-skybridge-config.d.ts +5 -0
  17. package/dist/cli/resolve-skybridge-config.js +18 -0
  18. package/dist/cli/resolve-skybridge-config.js.map +1 -0
  19. package/dist/cli/run-plain.d.ts +18 -0
  20. package/dist/cli/run-plain.js +90 -0
  21. package/dist/cli/run-plain.js.map +1 -0
  22. package/dist/cli/telemetry.js +2 -0
  23. package/dist/cli/telemetry.js.map +1 -1
  24. package/dist/cli/use-execute-steps.d.ts +1 -1
  25. package/dist/cli/use-nodemon.d.ts +25 -1
  26. package/dist/cli/use-nodemon.js +96 -63
  27. package/dist/cli/use-nodemon.js.map +1 -1
  28. package/dist/cli/use-typescript-check.d.ts +8 -2
  29. package/dist/cli/use-typescript-check.js +71 -68
  30. package/dist/cli/use-typescript-check.js.map +1 -1
  31. package/dist/commands/build.d.ts +0 -3
  32. package/dist/commands/build.js +2 -73
  33. package/dist/commands/build.js.map +1 -1
  34. package/dist/commands/create.d.ts +9 -0
  35. package/dist/commands/create.js +30 -0
  36. package/dist/commands/create.js.map +1 -0
  37. package/dist/commands/dev.d.ts +1 -0
  38. package/dist/commands/dev.js +51 -3
  39. package/dist/commands/dev.js.map +1 -1
  40. package/dist/commands/start.js +7 -1
  41. package/dist/commands/start.js.map +1 -1
  42. package/dist/context-warnings.d.ts +5 -0
  43. package/dist/context-warnings.js +31 -0
  44. package/dist/context-warnings.js.map +1 -0
  45. package/dist/context-warnings.test.js +28 -0
  46. package/dist/context-warnings.test.js.map +1 -0
  47. package/dist/server/app.d.ts +194 -0
  48. package/dist/server/app.js +266 -0
  49. package/dist/server/app.js.map +1 -0
  50. package/dist/server/app.test.js +97 -0
  51. package/dist/server/app.test.js.map +1 -0
  52. package/dist/server/asset-base-url-transform-plugin.d.ts +1 -0
  53. package/dist/server/asset-base-url-transform-plugin.js +16 -1
  54. package/dist/server/asset-base-url-transform-plugin.js.map +1 -1
  55. package/dist/server/asset-base-url-transform-plugin.test.js +51 -1
  56. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -1
  57. package/dist/server/auth/discovery.d.ts +33 -0
  58. package/dist/server/auth/discovery.js +56 -0
  59. package/dist/server/auth/discovery.js.map +1 -0
  60. package/dist/server/auth/discovery.test.d.ts +1 -0
  61. package/dist/server/auth/discovery.test.js +93 -0
  62. package/dist/server/auth/discovery.test.js.map +1 -0
  63. package/dist/server/auth/index.d.ts +48 -0
  64. package/dist/server/auth/index.js +2 -0
  65. package/dist/server/auth/index.js.map +1 -0
  66. package/dist/server/auth/providers/auth0.d.ts +40 -0
  67. package/dist/server/auth/providers/auth0.js +36 -0
  68. package/dist/server/auth/providers/auth0.js.map +1 -0
  69. package/dist/server/auth/providers/auth0.test.d.ts +1 -0
  70. package/dist/server/auth/providers/auth0.test.js +50 -0
  71. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  72. package/dist/server/auth/providers/authplane.d.ts +49 -0
  73. package/dist/server/auth/providers/authplane.js +57 -0
  74. package/dist/server/auth/providers/authplane.js.map +1 -0
  75. package/dist/server/auth/providers/authplane.test.d.ts +1 -0
  76. package/dist/server/auth/providers/authplane.test.js +143 -0
  77. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  78. package/dist/server/auth/providers/clerk.d.ts +51 -0
  79. package/dist/server/auth/providers/clerk.js +19 -0
  80. package/dist/server/auth/providers/clerk.js.map +1 -0
  81. package/dist/server/auth/providers/clerk.test.d.ts +1 -0
  82. package/dist/server/auth/providers/clerk.test.js +30 -0
  83. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  84. package/dist/server/auth/providers/custom.d.ts +42 -0
  85. package/dist/server/auth/providers/custom.js +59 -0
  86. package/dist/server/auth/providers/custom.js.map +1 -0
  87. package/dist/server/auth/providers/custom.test.d.ts +1 -0
  88. package/dist/server/auth/providers/custom.test.js +161 -0
  89. package/dist/server/auth/providers/custom.test.js.map +1 -0
  90. package/dist/server/auth/providers/descope.d.ts +44 -0
  91. package/dist/server/auth/providers/descope.js +44 -0
  92. package/dist/server/auth/providers/descope.js.map +1 -0
  93. package/dist/server/auth/providers/descope.test.d.ts +1 -0
  94. package/dist/server/auth/providers/descope.test.js +62 -0
  95. package/dist/server/auth/providers/descope.test.js.map +1 -0
  96. package/dist/server/auth/providers/shared.d.ts +2 -0
  97. package/dist/server/auth/providers/shared.js +6 -0
  98. package/dist/server/auth/providers/shared.js.map +1 -0
  99. package/dist/server/auth/providers/shared.test.d.ts +1 -0
  100. package/dist/server/auth/providers/shared.test.js +10 -0
  101. package/dist/server/auth/providers/shared.test.js.map +1 -0
  102. package/dist/server/auth/providers/stytch.d.ts +25 -0
  103. package/dist/server/auth/providers/stytch.js +16 -0
  104. package/dist/server/auth/providers/stytch.js.map +1 -0
  105. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  106. package/dist/server/auth/providers/verify-spy.js +21 -0
  107. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  108. package/dist/server/auth/providers/workos.d.ts +34 -0
  109. package/dist/server/auth/providers/workos.js +16 -0
  110. package/dist/server/auth/providers/workos.js.map +1 -0
  111. package/dist/server/auth/security-schemes.d.ts +23 -0
  112. package/dist/server/auth/security-schemes.js +64 -0
  113. package/dist/server/auth/security-schemes.js.map +1 -0
  114. package/dist/server/auth/security-schemes.test.d.ts +1 -0
  115. package/dist/server/auth/security-schemes.test.js +99 -0
  116. package/dist/server/auth/security-schemes.test.js.map +1 -0
  117. package/dist/server/auth/setup.d.ts +6 -0
  118. package/dist/server/auth/setup.js +91 -0
  119. package/dist/server/auth/setup.js.map +1 -0
  120. package/dist/server/auth/setup.test.d.ts +1 -0
  121. package/dist/server/auth/setup.test.js +514 -0
  122. package/dist/server/auth/setup.test.js.map +1 -0
  123. package/dist/server/auth/verify.d.ts +48 -0
  124. package/dist/server/auth/verify.js +62 -0
  125. package/dist/server/auth/verify.js.map +1 -0
  126. package/dist/server/auth/verify.test.d.ts +1 -0
  127. package/dist/server/auth/verify.test.js +165 -0
  128. package/dist/server/auth/verify.test.js.map +1 -0
  129. package/dist/server/auth-extra.test-d.js +130 -0
  130. package/dist/server/auth-extra.test-d.js.map +1 -0
  131. package/dist/server/auth.d.ts +57 -0
  132. package/dist/server/auth.js +27 -0
  133. package/dist/server/auth.js.map +1 -0
  134. package/dist/server/build-manifest.test.d.ts +1 -0
  135. package/dist/server/build-manifest.test.js +28 -0
  136. package/dist/server/build-manifest.test.js.map +1 -0
  137. package/dist/server/content-helpers.d.ts +41 -1
  138. package/dist/server/content-helpers.js +33 -0
  139. package/dist/server/content-helpers.js.map +1 -1
  140. package/dist/server/events.d.ts +113 -0
  141. package/dist/server/events.js +318 -0
  142. package/dist/server/events.js.map +1 -0
  143. package/dist/server/events.test.d.ts +1 -0
  144. package/dist/server/events.test.js +172 -0
  145. package/dist/server/events.test.js.map +1 -0
  146. package/dist/server/express.d.ts +23 -3
  147. package/dist/server/express.js +43 -32
  148. package/dist/server/express.js.map +1 -1
  149. package/dist/server/express.test.js +269 -90
  150. package/dist/server/express.test.js.map +1 -1
  151. package/dist/server/file-ref.d.ts +21 -1
  152. package/dist/server/file-ref.js +20 -1
  153. package/dist/server/file-ref.js.map +1 -1
  154. package/dist/server/form-input.d.ts +120 -0
  155. package/dist/server/form-input.js +89 -0
  156. package/dist/server/form-input.js.map +1 -0
  157. package/dist/server/host.d.ts +2 -0
  158. package/dist/server/host.js +11 -0
  159. package/dist/server/host.js.map +1 -0
  160. package/dist/server/host.test.d.ts +1 -0
  161. package/dist/server/host.test.js +13 -0
  162. package/dist/server/host.test.js.map +1 -0
  163. package/dist/server/index.d.ts +19 -2
  164. package/dist/server/index.js +16 -1
  165. package/dist/server/index.js.map +1 -1
  166. package/dist/server/mcp-errors.test.d.ts +1 -0
  167. package/dist/server/mcp-errors.test.js +41 -0
  168. package/dist/server/mcp-errors.test.js.map +1 -0
  169. package/dist/server/middleware.d.ts +51 -13
  170. package/dist/server/middleware.js +33 -0
  171. package/dist/server/middleware.js.map +1 -1
  172. package/dist/server/middleware.test-d.js +1 -1
  173. package/dist/server/middleware.test-d.js.map +1 -1
  174. package/dist/server/middleware.test.js +242 -134
  175. package/dist/server/middleware.test.js.map +1 -1
  176. package/dist/server/register-tool.test.d.ts +1 -0
  177. package/dist/server/register-tool.test.js +230 -0
  178. package/dist/server/register-tool.test.js.map +1 -0
  179. package/dist/server/requestOrigin.d.ts +7 -0
  180. package/dist/server/requestOrigin.js +25 -0
  181. package/dist/server/requestOrigin.js.map +1 -0
  182. package/dist/server/server.d.ts +532 -67
  183. package/dist/server/server.js +646 -315
  184. package/dist/server/server.js.map +1 -1
  185. package/dist/server/skills-integration.test.d.ts +1 -0
  186. package/dist/server/skills-integration.test.js +86 -0
  187. package/dist/server/skills-integration.test.js.map +1 -0
  188. package/dist/server/skills.d.ts +27 -0
  189. package/dist/server/skills.js +188 -0
  190. package/dist/server/skills.js.map +1 -0
  191. package/dist/server/skills.test.d.ts +1 -0
  192. package/dist/server/skills.test.js +243 -0
  193. package/dist/server/skills.test.js.map +1 -0
  194. package/dist/server/templateHelper.d.ts +0 -3
  195. package/dist/server/templateHelper.js.map +1 -1
  196. package/dist/server/templates.generated.js +4 -8
  197. package/dist/server/templates.generated.js.map +1 -1
  198. package/dist/server/tool-extra.test.d.ts +1 -0
  199. package/dist/server/tool-extra.test.js +167 -0
  200. package/dist/server/tool-extra.test.js.map +1 -0
  201. package/dist/server/view-name.test-d.d.ts +1 -0
  202. package/dist/server/view-name.test-d.js +8 -0
  203. package/dist/server/view-name.test-d.js.map +1 -0
  204. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  205. package/dist/server/view-resource-resolution.test.js +176 -0
  206. package/dist/server/view-resource-resolution.test.js.map +1 -0
  207. package/dist/server/viewsDevServer.js +4 -1
  208. package/dist/server/viewsDevServer.js.map +1 -1
  209. package/dist/test/utils.d.ts +9 -11
  210. package/dist/test/utils.js +220 -201
  211. package/dist/test/utils.js.map +1 -1
  212. package/dist/test/view.test.js +123 -106
  213. package/dist/test/view.test.js.map +1 -1
  214. package/dist/views/index.d.ts +10 -0
  215. package/dist/views/index.js +3 -0
  216. package/dist/views/index.js.map +1 -0
  217. package/dist/{web/plugin → views}/scan-views.js +1 -1
  218. package/dist/views/scan-views.js.map +1 -0
  219. package/dist/views/scan-views.test.d.ts +1 -0
  220. package/dist/views/scan-views.test.js.map +1 -0
  221. package/dist/views/validate-view.d.ts +1 -0
  222. package/dist/{web/plugin → views}/validate-view.js +2 -2
  223. package/dist/views/validate-view.js.map +1 -0
  224. package/dist/views/validate-view.test.d.ts +1 -0
  225. package/dist/views/validate-view.test.js.map +1 -0
  226. package/dist/web/bridges/adaptor.d.ts +62 -0
  227. package/dist/web/bridges/adaptor.js +471 -0
  228. package/dist/web/bridges/adaptor.js.map +1 -0
  229. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  230. package/dist/web/bridges/adaptor.test.js +264 -0
  231. package/dist/web/bridges/adaptor.test.js.map +1 -0
  232. package/dist/web/bridges/apps-sdk/bridge.d.ts +6 -1
  233. package/dist/web/bridges/apps-sdk/bridge.js +15 -3
  234. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  235. package/dist/web/bridges/apps-sdk/index.d.ts +0 -1
  236. package/dist/web/bridges/apps-sdk/index.js +0 -1
  237. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  238. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +11 -0
  239. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +11 -0
  240. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  241. package/dist/web/bridges/get-adaptor.d.ts +7 -0
  242. package/dist/web/bridges/get-adaptor.js +9 -7
  243. package/dist/web/bridges/get-adaptor.js.map +1 -1
  244. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  245. package/dist/web/bridges/get-adaptor.test.js +32 -0
  246. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  247. package/dist/web/bridges/mcp-app/bridge.d.ts +15 -2
  248. package/dist/web/bridges/mcp-app/bridge.js +80 -7
  249. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  250. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  251. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  252. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  253. package/dist/web/bridges/mcp-app/index.d.ts +0 -1
  254. package/dist/web/bridges/mcp-app/index.js +0 -1
  255. package/dist/web/bridges/mcp-app/index.js.map +1 -1
  256. package/dist/web/bridges/mcp-app/types.d.ts +19 -2
  257. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  258. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +13 -1
  259. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +12 -0
  260. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  261. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +1 -1
  262. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  263. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  264. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  265. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  266. package/dist/web/bridges/types.d.ts +160 -5
  267. package/dist/web/bridges/types.js +14 -1
  268. package/dist/web/bridges/types.js.map +1 -1
  269. package/dist/web/bridges/types.test.d.ts +1 -0
  270. package/dist/web/bridges/types.test.js +19 -0
  271. package/dist/web/bridges/types.test.js.map +1 -0
  272. package/dist/web/bridges/use-host-context.d.ts +5 -0
  273. package/dist/web/bridges/use-host-context.js +5 -0
  274. package/dist/web/bridges/use-host-context.js.map +1 -1
  275. package/dist/web/components/modal-provider.d.ts +1 -1
  276. package/dist/web/components/modal-provider.js +4 -3
  277. package/dist/web/components/modal-provider.js.map +1 -1
  278. package/dist/web/create-store.d.ts +26 -0
  279. package/dist/web/create-store.js +26 -0
  280. package/dist/web/create-store.js.map +1 -1
  281. package/dist/web/create-store.test.js +10 -7
  282. package/dist/web/create-store.test.js.map +1 -1
  283. package/dist/web/data-llm.d.ts +34 -1
  284. package/dist/web/data-llm.js +31 -2
  285. package/dist/web/data-llm.js.map +1 -1
  286. package/dist/web/data-llm.test.js +26 -7
  287. package/dist/web/data-llm.test.js.map +1 -1
  288. package/dist/web/generate-helpers.d.ts +25 -19
  289. package/dist/web/generate-helpers.js +23 -17
  290. package/dist/web/generate-helpers.js.map +1 -1
  291. package/dist/web/generate-helpers.test-d.js +7 -5
  292. package/dist/web/generate-helpers.test-d.js.map +1 -1
  293. package/dist/web/generate-helpers.test.js +2 -2
  294. package/dist/web/generate-helpers.test.js.map +1 -1
  295. package/dist/web/hooks/index.d.ts +8 -1
  296. package/dist/web/hooks/index.js +8 -1
  297. package/dist/web/hooks/index.js.map +1 -1
  298. package/dist/web/hooks/openai-extensions.test.d.ts +1 -0
  299. package/dist/web/hooks/openai-extensions.test.js +107 -0
  300. package/dist/web/hooks/openai-extensions.test.js.map +1 -0
  301. package/dist/web/hooks/test/utils.d.ts +7 -2
  302. package/dist/web/hooks/test/utils.js +14 -3
  303. package/dist/web/hooks/test/utils.js.map +1 -1
  304. package/dist/web/hooks/use-call-tool.d.ts +47 -2
  305. package/dist/web/hooks/use-call-tool.js +43 -10
  306. package/dist/web/hooks/use-call-tool.js.map +1 -1
  307. package/dist/web/hooks/use-call-tool.test.js +75 -25
  308. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  309. package/dist/web/hooks/use-deep-link.d.ts +22 -0
  310. package/dist/web/hooks/use-deep-link.js +34 -0
  311. package/dist/web/hooks/use-deep-link.js.map +1 -0
  312. package/dist/web/hooks/use-display-mode.d.ts +20 -0
  313. package/dist/web/hooks/use-display-mode.js +20 -0
  314. package/dist/web/hooks/use-display-mode.js.map +1 -1
  315. package/dist/web/hooks/use-display-mode.test.js +57 -21
  316. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  317. package/dist/web/hooks/use-download.d.ts +3 -0
  318. package/dist/web/hooks/use-download.js +7 -0
  319. package/dist/web/hooks/use-download.js.map +1 -0
  320. package/dist/web/hooks/use-download.test.d.ts +1 -0
  321. package/dist/web/hooks/use-download.test.js +103 -0
  322. package/dist/web/hooks/use-download.test.js.map +1 -0
  323. package/dist/web/hooks/use-file-resource.d.ts +37 -0
  324. package/dist/web/hooks/use-file-resource.js +98 -0
  325. package/dist/web/hooks/use-file-resource.js.map +1 -0
  326. package/dist/web/hooks/use-file-resource.test.d.ts +1 -0
  327. package/dist/web/hooks/use-file-resource.test.js +65 -0
  328. package/dist/web/hooks/use-file-resource.test.js.map +1 -0
  329. package/dist/web/hooks/use-files.d.ts +32 -0
  330. package/dist/web/hooks/use-files.js +32 -0
  331. package/dist/web/hooks/use-files.js.map +1 -1
  332. package/dist/web/hooks/use-files.test.js +11 -3
  333. package/dist/web/hooks/use-files.test.js.map +1 -1
  334. package/dist/web/hooks/use-host.d.ts +44 -0
  335. package/dist/web/hooks/use-host.js +45 -0
  336. package/dist/web/hooks/use-host.js.map +1 -0
  337. package/dist/web/hooks/use-host.test.d.ts +1 -0
  338. package/dist/web/hooks/use-host.test.js +59 -0
  339. package/dist/web/hooks/use-host.test.js.map +1 -0
  340. package/dist/web/hooks/use-model-context.d.ts +44 -0
  341. package/dist/web/hooks/use-model-context.js +63 -0
  342. package/dist/web/hooks/use-model-context.js.map +1 -0
  343. package/dist/web/hooks/use-open-external.d.ts +17 -0
  344. package/dist/web/hooks/use-open-external.js +16 -0
  345. package/dist/web/hooks/use-open-external.js.map +1 -1
  346. package/dist/web/hooks/use-open-external.test.js +15 -5
  347. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  348. package/dist/web/hooks/use-open-file.d.ts +20 -0
  349. package/dist/web/hooks/use-open-file.js +25 -0
  350. package/dist/web/hooks/use-open-file.js.map +1 -0
  351. package/dist/web/hooks/use-register-view-tool.d.ts +37 -0
  352. package/dist/web/hooks/use-register-view-tool.js +50 -0
  353. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  354. package/dist/web/hooks/use-request-close.d.ts +14 -0
  355. package/dist/web/hooks/use-request-close.js +13 -0
  356. package/dist/web/hooks/use-request-close.js.map +1 -1
  357. package/dist/web/hooks/use-request-close.test.js +35 -40
  358. package/dist/web/hooks/use-request-close.test.js.map +1 -1
  359. package/dist/web/hooks/use-request-modal.d.ts +16 -1
  360. package/dist/web/hooks/use-request-modal.js +16 -1
  361. package/dist/web/hooks/use-request-modal.js.map +1 -1
  362. package/dist/web/hooks/use-request-modal.test.js +11 -1
  363. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  364. package/dist/web/hooks/use-request-size.d.ts +17 -0
  365. package/dist/web/hooks/use-request-size.js +16 -0
  366. package/dist/web/hooks/use-request-size.js.map +1 -1
  367. package/dist/web/hooks/use-request-size.test.js +35 -53
  368. package/dist/web/hooks/use-request-size.test.js.map +1 -1
  369. package/dist/web/hooks/use-send-follow-up-message.d.ts +25 -2
  370. package/dist/web/hooks/use-send-follow-up-message.js +23 -0
  371. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
  372. package/dist/web/hooks/use-set-open-in-app-url.d.ts +17 -0
  373. package/dist/web/hooks/use-set-open-in-app-url.js +17 -0
  374. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -1
  375. package/dist/web/hooks/use-set-open-in-app-url.test.js +26 -12
  376. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  377. package/dist/web/hooks/use-tool-info.d.ts +46 -14
  378. package/dist/web/hooks/use-tool-info.js +29 -7
  379. package/dist/web/hooks/use-tool-info.js.map +1 -1
  380. package/dist/web/hooks/use-tool-info.test-d.js +11 -34
  381. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  382. package/dist/web/hooks/use-tool-info.test.js +42 -37
  383. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  384. package/dist/web/hooks/use-user.d.ts +5 -2
  385. package/dist/web/hooks/use-user.js +6 -3
  386. package/dist/web/hooks/use-user.js.map +1 -1
  387. package/dist/web/hooks/use-user.test.js +85 -37
  388. package/dist/web/hooks/use-user.test.js.map +1 -1
  389. package/dist/web/hooks/use-view-state.d.ts +21 -0
  390. package/dist/web/hooks/use-view-state.js +19 -9
  391. package/dist/web/hooks/use-view-state.js.map +1 -1
  392. package/dist/web/hooks/use-view-state.test.js +39 -4
  393. package/dist/web/hooks/use-view-state.test.js.map +1 -1
  394. package/dist/web/hooks/use-viewport.d.ts +20 -0
  395. package/dist/web/hooks/use-viewport.js +21 -0
  396. package/dist/web/hooks/use-viewport.js.map +1 -0
  397. package/dist/web/hooks/use-viewport.test.d.ts +1 -0
  398. package/dist/web/hooks/use-viewport.test.js +109 -0
  399. package/dist/web/hooks/use-viewport.test.js.map +1 -0
  400. package/dist/web/mount-view.d.ts +20 -0
  401. package/dist/web/mount-view.js +22 -6
  402. package/dist/web/mount-view.js.map +1 -1
  403. package/dist/web/types.d.ts +4 -0
  404. package/dist/web/types.js.map +1 -1
  405. package/package.json +35 -23
  406. package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -26
  407. package/dist/web/bridges/apps-sdk/adaptor.js +0 -102
  408. package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
  409. package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -50
  410. package/dist/web/bridges/mcp-app/adaptor.js +0 -271
  411. package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
  412. package/dist/web/hooks/use-layout.d.ts +0 -22
  413. package/dist/web/hooks/use-layout.js +0 -23
  414. package/dist/web/hooks/use-layout.js.map +0 -1
  415. package/dist/web/hooks/use-layout.test.js +0 -96
  416. package/dist/web/hooks/use-layout.test.js.map +0 -1
  417. package/dist/web/plugin/data-llm.test.js +0 -81
  418. package/dist/web/plugin/data-llm.test.js.map +0 -1
  419. package/dist/web/plugin/plugin.d.ts +0 -5
  420. package/dist/web/plugin/plugin.js +0 -163
  421. package/dist/web/plugin/plugin.js.map +0 -1
  422. package/dist/web/plugin/scan-views.js.map +0 -1
  423. package/dist/web/plugin/scan-views.test.js.map +0 -1
  424. package/dist/web/plugin/transform-data-llm.d.ts +0 -12
  425. package/dist/web/plugin/transform-data-llm.js +0 -96
  426. package/dist/web/plugin/transform-data-llm.js.map +0 -1
  427. package/dist/web/plugin/transform-data-llm.test.js +0 -81
  428. package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
  429. package/dist/web/plugin/validate-view.d.ts +0 -1
  430. package/dist/web/plugin/validate-view.js.map +0 -1
  431. package/dist/web/plugin/validate-view.test.js.map +0 -1
  432. /package/dist/{web/hooks/use-layout.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
  433. /package/dist/{web/plugin/data-llm.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  434. /package/dist/{web/plugin/scan-views.test.d.ts → context-warnings.test.d.ts} +0 -0
  435. /package/dist/{web/plugin/transform-data-llm.test.d.ts → server/app.test.d.ts} +0 -0
  436. /package/dist/{web/plugin/validate-view.test.d.ts → server/auth-extra.test-d.d.ts} +0 -0
  437. /package/dist/{web/plugin → views}/scan-views.d.ts +0 -0
  438. /package/dist/{web/plugin → views}/scan-views.test.js +0 -0
  439. /package/dist/{web/plugin → views}/validate-view.test.js +0 -0
@@ -1,6 +1,7 @@
1
1
  import http from "node:http";
2
+ import { Client, StreamableHTTPClientTransport, } from "@modelcontextprotocol/client";
2
3
  import { afterEach, describe, expect, it, vi } from "vitest";
3
- import { McpServer } from "./server.js";
4
+ import { Skybridge } from "./app.js";
4
5
  vi.mock("@skybridge/devtools", () => ({
5
6
  devtoolsStaticServer: () => ((_req, _res, next) => next()),
6
7
  }));
@@ -25,36 +26,49 @@ async function postMcp(port) {
25
26
  async function postApi(port) {
26
27
  return fetch(`http://localhost:${port}/api/test`, { method: "POST" });
27
28
  }
28
- describe("McpServer.express", () => {
29
+ describe("Skybridge.express", () => {
29
30
  it("exposes a ready Express app immediately after construction", () => {
30
- const server = new McpServer({ name: "t", version: "0.0.0" });
31
- expect(server.express).toBeDefined();
32
- expect(typeof server.express.use).toBe("function");
33
- expect(typeof server.express.get).toBe("function");
31
+ const app = new Skybridge({
32
+ name: "t",
33
+ version: "0.0.0",
34
+ handler: (server) => server,
35
+ });
36
+ expect(app.express).toBeDefined();
37
+ expect(typeof app.express.use).toBe("function");
38
+ expect(typeof app.express.get).toBe("function");
34
39
  });
35
- it("server.express.get registers a route reachable alongside /mcp", async () => {
40
+ it("app.express.get registers a route reachable alongside /mcp", async () => {
36
41
  const { createApp } = await import("./express.js");
37
- const server = new McpServer({ name: "t", version: "0.0.0" });
38
- server.express.get("/health", (_req, res) => {
42
+ const app = new Skybridge({
43
+ name: "t",
44
+ version: "0.0.0",
45
+ handler: (server) => server,
46
+ });
47
+ app.express.get("/health", (_req, res) => {
39
48
  res.json({ status: "ok" });
40
49
  });
41
50
  const httpServer = http.createServer();
42
- await createApp({ mcpServer: server, httpServer });
43
- const { port, server: listening } = await listen(server.express);
51
+ await createApp({ app, httpServer });
52
+ const { port, server: listening } = await listen(app.express);
44
53
  openServer = listening;
45
54
  const health = await fetch(`http://localhost:${port}/health`);
46
55
  expect(health.status).toBe(200);
56
+ expect(health.headers.get("x-powered-by")).toBe("skybridge");
47
57
  expect(await health.json()).toEqual({ status: "ok" });
48
58
  // /mcp still works (POST returns 200/4xx, not 404)
49
59
  const mcp = await postMcp(port);
50
60
  expect(mcp.status).not.toBe(404);
51
61
  });
52
- it("server.use and server.express.use produce the same registration order", async () => {
62
+ it("app.use and app.express.use produce the same registration order", async () => {
53
63
  const { createApp } = await import("./express.js");
54
64
  const callsA = [];
55
65
  const callsB = [];
56
- const buildServer = () => new McpServer({ name: "t", version: "0.0.0" });
57
- const sA = buildServer();
66
+ const buildApp = () => new Skybridge({
67
+ name: "t",
68
+ version: "0.0.0",
69
+ handler: (server) => server,
70
+ });
71
+ const sA = buildApp();
58
72
  sA.use((_req, _res, next) => {
59
73
  callsA.push("first");
60
74
  next();
@@ -63,7 +77,7 @@ describe("McpServer.express", () => {
63
77
  callsA.push("second");
64
78
  next();
65
79
  });
66
- const sB = buildServer();
80
+ const sB = buildApp();
67
81
  sB.express.use((_req, _res, next) => {
68
82
  callsB.push("first");
69
83
  next();
@@ -75,7 +89,7 @@ describe("McpServer.express", () => {
75
89
  for (const s of [sA, sB]) {
76
90
  s.express.get("/probe", (_req, res) => res.json({ ok: true }));
77
91
  const httpServer = http.createServer();
78
- await createApp({ mcpServer: s, httpServer });
92
+ await createApp({ app: s, httpServer });
79
93
  const { port, server: listening } = await listen(s.express);
80
94
  openServer = listening;
81
95
  await fetch(`http://localhost:${port}/probe`);
@@ -86,26 +100,32 @@ describe("McpServer.express", () => {
86
100
  });
87
101
  it("useOnError still wraps thrown /mcp errors after the route is mounted", async () => {
88
102
  const { createApp } = await import("./express.js");
89
- const server = new McpServer({ name: "t", version: "0.0.0" });
103
+ const app = new Skybridge({
104
+ name: "t",
105
+ version: "0.0.0",
106
+ handler: (server) => server,
107
+ });
90
108
  // Register the error handler BEFORE createApp — useOnError should still
91
109
  // apply it after /mcp, so /mcp errors hit it.
92
110
  const seen = [];
93
- server.useOnError((_err, _req, res, _next) => {
111
+ app.useOnError((_err, _req, res, _next) => {
94
112
  seen.push("useOnError");
95
113
  res.status(503).json({ from: "useOnError" });
96
114
  });
97
115
  // Force the /mcp handler to throw so the error pipeline runs.
98
- vi.spyOn(server, "connectStatelessTransport").mockRejectedValue(new Error("boom"));
116
+ app.use("/mcp", () => {
117
+ throw new Error("boom");
118
+ });
99
119
  const httpServer = http.createServer();
100
120
  await createApp({
101
- mcpServer: server,
121
+ app,
102
122
  httpServer,
103
- // Mirror what run() does: forward the McpServer's useOnError handlers
123
+ // Mirror what run() does: forward the app's useOnError handlers
104
124
  // to createApp so they get applied after /mcp.
105
125
  // biome-ignore lint/complexity/useLiteralKeys: test mirrors run() internals to verify useOnError ordering
106
- errorMiddleware: server["customErrorMiddleware"],
126
+ errorMiddleware: app["errorMiddleware"],
107
127
  });
108
- const { port, server: listening } = await listen(server.express);
128
+ const { port, server: listening } = await listen(app.express);
109
129
  openServer = listening;
110
130
  const res = await postMcp(port);
111
131
  expect(seen).toEqual(["useOnError"]);
@@ -113,6 +133,46 @@ describe("McpServer.express", () => {
113
133
  expect(await res.json()).toEqual({ from: "useOnError" });
114
134
  });
115
135
  });
136
+ describe("Skybridge JSON body parser options", () => {
137
+ const largeBody = JSON.stringify({ data: "x".repeat(200 * 1024) });
138
+ async function postEcho(port, body) {
139
+ return fetch(`http://localhost:${port}/echo`, {
140
+ method: "POST",
141
+ headers: { "Content-Type": "application/json" },
142
+ body,
143
+ });
144
+ }
145
+ it("forwards json options to express.json", async () => {
146
+ const app = new Skybridge({
147
+ name: "t",
148
+ version: "0.0.0",
149
+ json: { limit: "10mb" },
150
+ handler: (server) => server,
151
+ });
152
+ app.express.post("/echo", (req, res) => {
153
+ res.json({ received: req.body.data.length });
154
+ });
155
+ const { port, server: listening } = await listen(app.express);
156
+ openServer = listening;
157
+ const res = await postEcho(port, largeBody);
158
+ expect(res.status).toBe(200);
159
+ expect(await res.json()).toEqual({ received: 200 * 1024 });
160
+ });
161
+ it("keeps the default 100kb limit when no options are passed", async () => {
162
+ const app = new Skybridge({
163
+ name: "t",
164
+ version: "0.0.0",
165
+ handler: (server) => server,
166
+ });
167
+ app.express.post("/echo", (_req, res) => {
168
+ res.json({ ok: true });
169
+ });
170
+ const { port, server: listening } = await listen(app.express);
171
+ openServer = listening;
172
+ const res = await postEcho(port, largeBody);
173
+ expect(res.status).toBe(413);
174
+ });
175
+ });
116
176
  describe("createApp", () => {
117
177
  it("runs global custom middleware before the /mcp handler", async () => {
118
178
  const { createApp } = await import("./express.js");
@@ -121,11 +181,15 @@ describe("createApp", () => {
121
181
  calls.push("custom");
122
182
  next();
123
183
  };
124
- const server = new McpServer({ name: "t", version: "0.0.0" });
125
- server.use(mw);
184
+ const app = new Skybridge({
185
+ name: "t",
186
+ version: "0.0.0",
187
+ handler: (server) => server,
188
+ });
189
+ app.use(mw);
126
190
  const httpServer = http.createServer();
127
- const app = await createApp({ mcpServer: server, httpServer });
128
- const { port, server: httpListening } = await listen(app);
191
+ const expressApp = await createApp({ app, httpServer });
192
+ const { port, server: httpListening } = await listen(expressApp);
129
193
  openServer = httpListening;
130
194
  await postMcp(port);
131
195
  expect(calls).toEqual(["custom"]);
@@ -137,11 +201,15 @@ describe("createApp", () => {
137
201
  calls.push("auth");
138
202
  next();
139
203
  };
140
- const server = new McpServer({ name: "t", version: "0.0.0" });
141
- server.use("/mcp", mw);
204
+ const app = new Skybridge({
205
+ name: "t",
206
+ version: "0.0.0",
207
+ handler: (server) => server,
208
+ });
209
+ app.use("/mcp", mw);
142
210
  const httpServer = http.createServer();
143
- const app = await createApp({ mcpServer: server, httpServer });
144
- const { port, server: httpListening } = await listen(app);
211
+ const expressApp = await createApp({ app, httpServer });
212
+ const { port, server: httpListening } = await listen(expressApp);
145
213
  openServer = httpListening;
146
214
  await postMcp(port);
147
215
  expect(calls).toEqual(["auth"]);
@@ -153,11 +221,15 @@ describe("createApp", () => {
153
221
  calls.push("reject");
154
222
  res.status(401).json({ error: "Unauthorized" });
155
223
  };
156
- const server = new McpServer({ name: "t", version: "0.0.0" });
157
- server.use("/mcp", reject);
224
+ const app = new Skybridge({
225
+ name: "t",
226
+ version: "0.0.0",
227
+ handler: (server) => server,
228
+ });
229
+ app.use("/mcp", reject);
158
230
  const httpServer = http.createServer();
159
- const app = await createApp({ mcpServer: server, httpServer });
160
- const { port, server: httpListening } = await listen(app);
231
+ const expressApp = await createApp({ app, httpServer });
232
+ const { port, server: httpListening } = await listen(expressApp);
161
233
  openServer = httpListening;
162
234
  const res = await postMcp(port);
163
235
  expect(calls).toEqual(["reject"]);
@@ -175,12 +247,16 @@ describe("createApp", () => {
175
247
  calls.push("B");
176
248
  next();
177
249
  };
178
- const server = new McpServer({ name: "t", version: "0.0.0" });
179
- server.use(mwA);
180
- server.use(mwB);
250
+ const app = new Skybridge({
251
+ name: "t",
252
+ version: "0.0.0",
253
+ handler: (server) => server,
254
+ });
255
+ app.use(mwA);
256
+ app.use(mwB);
181
257
  const httpServer = http.createServer();
182
- const app = await createApp({ mcpServer: server, httpServer });
183
- const { port, server: httpListening } = await listen(app);
258
+ const expressApp = await createApp({ app, httpServer });
259
+ const { port, server: httpListening } = await listen(expressApp);
184
260
  openServer = httpListening;
185
261
  await postMcp(port);
186
262
  expect(calls).toEqual(["A", "B"]);
@@ -192,11 +268,15 @@ describe("createApp", () => {
192
268
  calls.push("api");
193
269
  next();
194
270
  };
195
- const server = new McpServer({ name: "t", version: "0.0.0" });
196
- server.use("/api", apiMw);
271
+ const app = new Skybridge({
272
+ name: "t",
273
+ version: "0.0.0",
274
+ handler: (server) => server,
275
+ });
276
+ app.use("/api", apiMw);
197
277
  const httpServer = http.createServer();
198
- const app = await createApp({ mcpServer: server, httpServer });
199
- const { port, server: httpListening } = await listen(app);
278
+ const expressApp = await createApp({ app, httpServer });
279
+ const { port, server: httpListening } = await listen(expressApp);
200
280
  openServer = httpListening;
201
281
  // Hit /mcp — the /api middleware should NOT fire
202
282
  await postMcp(port);
@@ -209,11 +289,15 @@ describe("createApp", () => {
209
289
  router.get("/health", (_req, res) => {
210
290
  res.json({ status: "ok" });
211
291
  });
212
- const server = new McpServer({ name: "t", version: "0.0.0" });
213
- server.use(router);
292
+ const app = new Skybridge({
293
+ name: "t",
294
+ version: "0.0.0",
295
+ handler: (server) => server,
296
+ });
297
+ app.use(router);
214
298
  const httpServer = http.createServer();
215
- const app = await createApp({ mcpServer: server, httpServer });
216
- const { port, server: httpListening } = await listen(app);
299
+ const expressApp = await createApp({ app, httpServer });
300
+ const { port, server: httpListening } = await listen(expressApp);
217
301
  openServer = httpListening;
218
302
  const res = await fetch(`http://localhost:${port}/health`);
219
303
  expect(res.status).toBe(200);
@@ -226,11 +310,15 @@ describe("createApp", () => {
226
310
  router.get("/data", (_req, res) => {
227
311
  res.json({ value: 42 });
228
312
  });
229
- const server = new McpServer({ name: "t", version: "0.0.0" });
230
- server.use("/api", router);
313
+ const app = new Skybridge({
314
+ name: "t",
315
+ version: "0.0.0",
316
+ handler: (server) => server,
317
+ });
318
+ app.use("/api", router);
231
319
  const httpServer = http.createServer();
232
- const app = await createApp({ mcpServer: server, httpServer });
233
- const { port, server: httpListening } = await listen(app);
320
+ const expressApp = await createApp({ app, httpServer });
321
+ const { port, server: httpListening } = await listen(expressApp);
234
322
  openServer = httpListening;
235
323
  const res = await fetch(`http://localhost:${port}/api/data`);
236
324
  expect(res.status).toBe(200);
@@ -241,11 +329,15 @@ describe("createApp", () => {
241
329
  const throwing = () => {
242
330
  throw new Error("boom");
243
331
  };
244
- const server = new McpServer({ name: "t", version: "0.0.0" });
245
- server.use("/explode", throwing);
332
+ const app = new Skybridge({
333
+ name: "t",
334
+ version: "0.0.0",
335
+ handler: (server) => server,
336
+ });
337
+ app.use("/explode", throwing);
246
338
  const httpServer = http.createServer();
247
- const app = await createApp({ mcpServer: server, httpServer });
248
- const { port, server: httpListening } = await listen(app);
339
+ const expressApp = await createApp({ app, httpServer });
340
+ const { port, server: httpListening } = await listen(expressApp);
249
341
  openServer = httpListening;
250
342
  const res = await fetch(`http://localhost:${port}/explode`);
251
343
  expect(res.status).toBe(500);
@@ -256,14 +348,19 @@ describe("createApp", () => {
256
348
  it("returns 500 JSON-RPC error when the MCP handler throws and no error middleware is registered", async () => {
257
349
  const { createApp } = await import("./express.js");
258
350
  const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
259
- const mcpServer = new McpServer({ name: "t", version: "0.0.0" });
260
- // Force the express-level error path: make connectStatelessTransport
261
- // reject so the request handler hits its try/catch and calls next(error),
262
- // which lands in the default /mcp error handler.
263
- vi.spyOn(mcpServer, "connectStatelessTransport").mockRejectedValue(new Error("boom"));
351
+ const app = new Skybridge({
352
+ name: "t",
353
+ version: "0.0.0",
354
+ handler: (server) => server,
355
+ });
356
+ // Force the express-level error path: make a /mcp middleware throw so the
357
+ // error pipeline runs and lands in the default /mcp error handler.
358
+ app.use("/mcp", () => {
359
+ throw new Error("boom");
360
+ });
264
361
  const httpServer = http.createServer();
265
- const app = await createApp({ mcpServer, httpServer });
266
- const { port, server: httpListening } = await listen(app);
362
+ const expressApp = await createApp({ app, httpServer });
363
+ const { port, server: httpListening } = await listen(expressApp);
267
364
  openServer = httpListening;
268
365
  const res = await postMcp(port);
269
366
  expect(res.status).toBe(500);
@@ -282,15 +379,21 @@ describe("createApp", () => {
282
379
  calls.push("error-handler");
283
380
  res.status(503).json({ custom: true });
284
381
  };
285
- const mcpServer = new McpServer({ name: "t", version: "0.0.0" });
286
- vi.spyOn(mcpServer, "connectStatelessTransport").mockRejectedValue(new Error("boom"));
382
+ const app = new Skybridge({
383
+ name: "t",
384
+ version: "0.0.0",
385
+ handler: (server) => server,
386
+ });
387
+ app.use("/mcp", () => {
388
+ throw new Error("boom");
389
+ });
287
390
  const httpServer = http.createServer();
288
- const app = await createApp({
289
- mcpServer,
391
+ const expressApp = await createApp({
392
+ app,
290
393
  httpServer,
291
394
  errorMiddleware: [{ handlers: [errorHandler] }],
292
395
  });
293
- const { port, server: httpListening } = await listen(app);
396
+ const { port, server: httpListening } = await listen(expressApp);
294
397
  openServer = httpListening;
295
398
  const res = await postMcp(port);
296
399
  expect(calls).toEqual(["error-handler"]);
@@ -307,16 +410,22 @@ describe("createApp", () => {
307
410
  const throwingApiRoute = (_req, _res, next) => {
308
411
  next(new Error("api error"));
309
412
  };
310
- const mcpServer = new McpServer({ name: "t", version: "0.0.0" });
311
- vi.spyOn(mcpServer, "connectStatelessTransport").mockRejectedValue(new Error("boom"));
312
- mcpServer.use("/api/test", throwingApiRoute);
413
+ const app = new Skybridge({
414
+ name: "t",
415
+ version: "0.0.0",
416
+ handler: (server) => server,
417
+ });
418
+ app.use("/mcp", () => {
419
+ throw new Error("boom");
420
+ });
421
+ app.use("/api/test", throwingApiRoute);
313
422
  const httpServer = http.createServer();
314
- const app = await createApp({
315
- mcpServer,
423
+ const expressApp = await createApp({
424
+ app,
316
425
  httpServer,
317
426
  errorMiddleware: [{ path: "/mcp", handlers: [mcpErrorHandler] }],
318
427
  });
319
- const { port, server: httpListening } = await listen(app);
428
+ const { port, server: httpListening } = await listen(expressApp);
320
429
  openServer = httpListening;
321
430
  const mcpRes = await postMcp(port);
322
431
  expect(calls).toEqual(["mcp-error-handler"]);
@@ -330,20 +439,20 @@ describe("createApp", () => {
330
439
  });
331
440
  it("handles concurrent /mcp requests without 'Already connected to a transport'", async () => {
332
441
  const { createApp } = await import("./express.js");
333
- const mcpServer = new McpServer({
334
- name: "concurrent-test",
335
- version: "0.0.0",
336
- });
337
442
  // Slow tool: keeps the underlying transport bound long enough to overlap
338
443
  // with concurrent requests, exposing the shared-McpServer race.
339
- mcpServer.registerTool({ name: "slow", description: "slow" }, async () => {
340
- await new Promise((r) => setTimeout(r, 50));
341
- return { content: [{ type: "text", text: "done" }] };
444
+ const app = new Skybridge({
445
+ name: "concurrent-test",
446
+ version: "0.0.0",
447
+ handler: (server) => server.registerTool({ name: "slow", description: "slow" }, async () => {
448
+ await new Promise((r) => setTimeout(r, 50));
449
+ return { content: [{ type: "text", text: "done" }] };
450
+ }),
342
451
  });
343
452
  const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
344
453
  const httpServer = http.createServer();
345
- const app = await createApp({ mcpServer, httpServer });
346
- const { port, server } = await listen(app);
454
+ const expressApp = await createApp({ app, httpServer });
455
+ const { port, server } = await listen(expressApp);
347
456
  openServer = server;
348
457
  const callBody = (id) => JSON.stringify({
349
458
  jsonrpc: "2.0",
@@ -365,6 +474,40 @@ describe("createApp", () => {
365
474
  consoleSpy.mockRestore();
366
475
  });
367
476
  });
477
+ describe("createApp Vercel mode", () => {
478
+ it("app.run() returns the Express app without binding a port when VERCEL=1", async () => {
479
+ const prevVercel = process.env.VERCEL;
480
+ const prevEnv = process.env.NODE_ENV;
481
+ process.env.VERCEL = "1";
482
+ process.env.NODE_ENV = "production";
483
+ try {
484
+ vi.resetModules();
485
+ const { Skybridge: Reloaded } = await import("./app.js");
486
+ const app = new Reloaded({
487
+ name: "t",
488
+ version: "0.0.0",
489
+ handler: (server) => server,
490
+ });
491
+ const result = await app.run();
492
+ expect(typeof result).toBe("function");
493
+ expect(result).toBe(app.express);
494
+ const { port, server: listening } = await listen(app.express);
495
+ openServer = listening;
496
+ const res = await postMcp(port);
497
+ expect(res.status).not.toBe(404);
498
+ }
499
+ finally {
500
+ if (prevVercel === undefined) {
501
+ delete process.env.VERCEL;
502
+ }
503
+ else {
504
+ process.env.VERCEL = prevVercel;
505
+ }
506
+ process.env.NODE_ENV = prevEnv;
507
+ vi.resetModules();
508
+ }
509
+ });
510
+ });
368
511
  describe("createApp tunnel routes", () => {
369
512
  it("proxies POST /__skybridge/tunnel to the cli control server in dev mode", async () => {
370
513
  // Stand up a fake control listener that returns a known JSON body.
@@ -383,10 +526,14 @@ describe("createApp tunnel routes", () => {
383
526
  process.env.__TUNNEL_CONTROL_PORT = String(controlPort);
384
527
  try {
385
528
  const { createApp } = await import("./express.js");
386
- const mcpServer = new McpServer({ name: "t", version: "0.0.0" });
529
+ const app = new Skybridge({
530
+ name: "t",
531
+ version: "0.0.0",
532
+ handler: (server) => server,
533
+ });
387
534
  const httpServer = http.createServer();
388
- const app = await createApp({ mcpServer, httpServer });
389
- const { port, server } = await listen(app);
535
+ const expressApp = await createApp({ app, httpServer });
536
+ const { port, server } = await listen(expressApp);
390
537
  openServer = server;
391
538
  const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
392
539
  method: "POST",
@@ -410,11 +557,15 @@ describe("createApp tunnel routes", () => {
410
557
  try {
411
558
  vi.resetModules();
412
559
  const { createApp } = await import("./express.js");
413
- const { McpServer: ReloadedMcpServer } = await import("./server.js");
414
- const mcpServer = new ReloadedMcpServer({ name: "t", version: "0.0.0" });
560
+ const { Skybridge: ReloadedSkybridge } = await import("./app.js");
561
+ const app = new ReloadedSkybridge({
562
+ name: "t",
563
+ version: "0.0.0",
564
+ handler: (server) => server,
565
+ });
415
566
  const httpServer = http.createServer();
416
- const app = await createApp({ mcpServer, httpServer });
417
- const { port, server } = await listen(app);
567
+ const expressApp = await createApp({ app, httpServer });
568
+ const { port, server } = await listen(expressApp);
418
569
  openServer = server;
419
570
  const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
420
571
  method: "POST",
@@ -427,4 +578,32 @@ describe("createApp tunnel routes", () => {
427
578
  }
428
579
  });
429
580
  });
581
+ describe("createApp mount path", () => {
582
+ it("serves /mcp with the mount path intact on the request URL", async () => {
583
+ const { createApp } = await import("./express.js");
584
+ const app = new Skybridge({
585
+ name: "t",
586
+ version: "0.0.0",
587
+ handler: (server) => server.registerTool({
588
+ name: "echo-url",
589
+ description: "Echoes the request URL.",
590
+ inputSchema: {},
591
+ }, (_args, extra) => ({
592
+ content: [{ type: "text", text: extra.http?.req?.url ?? "" }],
593
+ })),
594
+ });
595
+ const httpServer = http.createServer();
596
+ const expressApp = await createApp({ app, httpServer });
597
+ const { port, server } = await listen(expressApp);
598
+ openServer = server;
599
+ const client = new Client({ name: "test-client", version: "0.0.0" });
600
+ await client.connect(new StreamableHTTPClientTransport(new URL(`http://localhost:${port}/mcp`)));
601
+ const result = (await client.callTool({
602
+ name: "echo-url",
603
+ arguments: {},
604
+ }));
605
+ await client.close();
606
+ expect(new URL(result.content[0]?.text ?? "").pathname).toBe("/mcp");
607
+ });
608
+ });
430
609
  //# sourceMappingURL=express.test.js.map