skybridge 0.0.0-dev.cb51733 → 0.0.0-dev.cb83b5b

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 (415) hide show
  1. package/README.md +17 -14
  2. package/dist/cli/build-helpers.d.ts +11 -0
  3. package/dist/cli/build-helpers.js +115 -0
  4. package/dist/cli/build-helpers.js.map +1 -0
  5. package/dist/cli/build-helpers.test.js +156 -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 +84 -0
  9. package/dist/cli/build-steps.js.map +1 -0
  10. package/dist/cli/build-steps.test.js +72 -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 +6 -0
  17. package/dist/cli/resolve-skybridge-config.js +28 -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 +72 -67
  30. package/dist/cli/use-typescript-check.js.map +1 -1
  31. package/dist/commands/build.d.ts +0 -8
  32. package/dist/commands/build.js +9 -138
  33. package/dist/commands/build.js.map +1 -1
  34. package/dist/commands/dev.d.ts +1 -0
  35. package/dist/commands/dev.js +51 -3
  36. package/dist/commands/dev.js.map +1 -1
  37. package/dist/commands/start.js +7 -5
  38. package/dist/commands/start.js.map +1 -1
  39. package/dist/context-warnings.d.ts +5 -0
  40. package/dist/context-warnings.js +31 -0
  41. package/dist/context-warnings.js.map +1 -0
  42. package/dist/context-warnings.test.js +28 -0
  43. package/dist/context-warnings.test.js.map +1 -0
  44. package/dist/server/app.d.ts +211 -0
  45. package/dist/server/app.js +277 -0
  46. package/dist/server/app.js.map +1 -0
  47. package/dist/server/app.test.js +178 -0
  48. package/dist/server/app.test.js.map +1 -0
  49. package/dist/server/auth/discovery.d.ts +33 -0
  50. package/dist/server/auth/discovery.js +56 -0
  51. package/dist/server/auth/discovery.js.map +1 -0
  52. package/dist/server/auth/discovery.test.js +93 -0
  53. package/dist/server/auth/discovery.test.js.map +1 -0
  54. package/dist/server/auth/index.d.ts +48 -0
  55. package/dist/server/auth/index.js +2 -0
  56. package/dist/server/auth/index.js.map +1 -0
  57. package/dist/server/auth/providers/auth0.d.ts +40 -0
  58. package/dist/server/auth/providers/auth0.js +36 -0
  59. package/dist/server/auth/providers/auth0.js.map +1 -0
  60. package/dist/server/auth/providers/auth0.test.d.ts +1 -0
  61. package/dist/server/auth/providers/auth0.test.js +50 -0
  62. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  63. package/dist/server/auth/providers/authplane.d.ts +49 -0
  64. package/dist/server/auth/providers/authplane.js +57 -0
  65. package/dist/server/auth/providers/authplane.js.map +1 -0
  66. package/dist/server/auth/providers/authplane.test.d.ts +1 -0
  67. package/dist/server/auth/providers/authplane.test.js +143 -0
  68. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  69. package/dist/server/auth/providers/clerk.d.ts +51 -0
  70. package/dist/server/auth/providers/clerk.js +19 -0
  71. package/dist/server/auth/providers/clerk.js.map +1 -0
  72. package/dist/server/auth/providers/clerk.test.d.ts +1 -0
  73. package/dist/server/auth/providers/clerk.test.js +30 -0
  74. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  75. package/dist/server/auth/providers/custom.d.ts +42 -0
  76. package/dist/server/auth/providers/custom.js +59 -0
  77. package/dist/server/auth/providers/custom.js.map +1 -0
  78. package/dist/server/auth/providers/custom.test.d.ts +1 -0
  79. package/dist/server/auth/providers/custom.test.js +161 -0
  80. package/dist/server/auth/providers/custom.test.js.map +1 -0
  81. package/dist/server/auth/providers/descope.d.ts +44 -0
  82. package/dist/server/auth/providers/descope.js +44 -0
  83. package/dist/server/auth/providers/descope.js.map +1 -0
  84. package/dist/server/auth/providers/descope.test.d.ts +1 -0
  85. package/dist/server/auth/providers/descope.test.js +62 -0
  86. package/dist/server/auth/providers/descope.test.js.map +1 -0
  87. package/dist/server/auth/providers/shared.d.ts +2 -0
  88. package/dist/server/auth/providers/shared.js +6 -0
  89. package/dist/server/auth/providers/shared.js.map +1 -0
  90. package/dist/server/auth/providers/shared.test.d.ts +1 -0
  91. package/dist/server/auth/providers/shared.test.js +10 -0
  92. package/dist/server/auth/providers/shared.test.js.map +1 -0
  93. package/dist/server/auth/providers/stytch.d.ts +25 -0
  94. package/dist/server/auth/providers/stytch.js +16 -0
  95. package/dist/server/auth/providers/stytch.js.map +1 -0
  96. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  97. package/dist/server/auth/providers/verify-spy.js +21 -0
  98. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  99. package/dist/server/auth/providers/workos.d.ts +34 -0
  100. package/dist/server/auth/providers/workos.js +16 -0
  101. package/dist/server/auth/providers/workos.js.map +1 -0
  102. package/dist/server/auth/security-schemes.d.ts +23 -0
  103. package/dist/server/auth/security-schemes.js +64 -0
  104. package/dist/server/auth/security-schemes.js.map +1 -0
  105. package/dist/server/auth/security-schemes.test.d.ts +1 -0
  106. package/dist/server/auth/security-schemes.test.js +99 -0
  107. package/dist/server/auth/security-schemes.test.js.map +1 -0
  108. package/dist/server/auth/setup.d.ts +6 -0
  109. package/dist/server/auth/setup.js +91 -0
  110. package/dist/server/auth/setup.js.map +1 -0
  111. package/dist/server/auth/setup.test.d.ts +1 -0
  112. package/dist/server/auth/setup.test.js +514 -0
  113. package/dist/server/auth/setup.test.js.map +1 -0
  114. package/dist/server/auth/verify.d.ts +48 -0
  115. package/dist/server/auth/verify.js +62 -0
  116. package/dist/server/auth/verify.js.map +1 -0
  117. package/dist/server/auth/verify.test.d.ts +1 -0
  118. package/dist/server/auth/verify.test.js +165 -0
  119. package/dist/server/auth/verify.test.js.map +1 -0
  120. package/dist/server/auth-extra.test-d.js +130 -0
  121. package/dist/server/auth-extra.test-d.js.map +1 -0
  122. package/dist/server/auth.d.ts +43 -6
  123. package/dist/server/auth.js +4 -5
  124. package/dist/server/auth.js.map +1 -1
  125. package/dist/server/build-manifest.test.d.ts +1 -0
  126. package/dist/server/build-manifest.test.js +28 -0
  127. package/dist/server/build-manifest.test.js.map +1 -0
  128. package/dist/server/content-helpers.d.ts +1 -1
  129. package/dist/server/content-helpers.js.map +1 -1
  130. package/dist/server/events.d.ts +113 -0
  131. package/dist/server/events.js +318 -0
  132. package/dist/server/events.js.map +1 -0
  133. package/dist/server/events.test.d.ts +1 -0
  134. package/dist/server/events.test.js +172 -0
  135. package/dist/server/events.test.js.map +1 -0
  136. package/dist/server/express.d.ts +24 -3
  137. package/dist/server/express.js +45 -35
  138. package/dist/server/express.js.map +1 -1
  139. package/dist/server/express.test.js +273 -108
  140. package/dist/server/express.test.js.map +1 -1
  141. package/dist/server/file-ref.d.ts +1 -1
  142. package/dist/server/file-ref.js +1 -1
  143. package/dist/server/file-ref.js.map +1 -1
  144. package/dist/server/form-input.d.ts +120 -0
  145. package/dist/server/form-input.js +89 -0
  146. package/dist/server/form-input.js.map +1 -0
  147. package/dist/server/host.d.ts +2 -0
  148. package/dist/server/host.js +11 -0
  149. package/dist/server/host.js.map +1 -0
  150. package/dist/server/host.test.d.ts +1 -0
  151. package/dist/server/host.test.js +13 -0
  152. package/dist/server/host.test.js.map +1 -0
  153. package/dist/server/index.d.ts +19 -3
  154. package/dist/server/index.js +16 -2
  155. package/dist/server/index.js.map +1 -1
  156. package/dist/server/mcp-errors.test.d.ts +1 -0
  157. package/dist/server/mcp-errors.test.js +229 -0
  158. package/dist/server/mcp-errors.test.js.map +1 -0
  159. package/dist/server/metric.d.ts +5 -3
  160. package/dist/server/metric.js +5 -5
  161. package/dist/server/metric.js.map +1 -1
  162. package/dist/server/middleware.d.ts +35 -10
  163. package/dist/server/middleware.js +33 -0
  164. package/dist/server/middleware.js.map +1 -1
  165. package/dist/server/middleware.test-d.js +1 -1
  166. package/dist/server/middleware.test-d.js.map +1 -1
  167. package/dist/server/middleware.test.js +242 -134
  168. package/dist/server/middleware.test.js.map +1 -1
  169. package/dist/server/register-tool.test.d.ts +1 -0
  170. package/dist/server/register-tool.test.js +230 -0
  171. package/dist/server/register-tool.test.js.map +1 -0
  172. package/dist/server/requestOrigin.d.ts +7 -0
  173. package/dist/server/requestOrigin.js +25 -0
  174. package/dist/server/requestOrigin.js.map +1 -0
  175. package/dist/server/server.d.ts +397 -132
  176. package/dist/server/server.js +584 -341
  177. package/dist/server/server.js.map +1 -1
  178. package/dist/server/skills-integration.test.d.ts +1 -0
  179. package/dist/server/skills-integration.test.js +86 -0
  180. package/dist/server/skills-integration.test.js.map +1 -0
  181. package/dist/server/skills.d.ts +27 -0
  182. package/dist/server/skills.js +188 -0
  183. package/dist/server/skills.js.map +1 -0
  184. package/dist/server/skills.test.d.ts +1 -0
  185. package/dist/server/skills.test.js +243 -0
  186. package/dist/server/skills.test.js.map +1 -0
  187. package/dist/server/templateHelper.d.ts +1 -3
  188. package/dist/server/templateHelper.js.map +1 -1
  189. package/dist/server/templates.generated.js +28 -18
  190. package/dist/server/templates.generated.js.map +1 -1
  191. package/dist/server/tool-extra.test.d.ts +1 -0
  192. package/dist/server/tool-extra.test.js +167 -0
  193. package/dist/server/tool-extra.test.js.map +1 -0
  194. package/dist/server/view-name.test-d.d.ts +1 -0
  195. package/dist/server/view-name.test-d.js +8 -0
  196. package/dist/server/view-name.test-d.js.map +1 -0
  197. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  198. package/dist/server/view-resource-resolution.test.js +211 -0
  199. package/dist/server/view-resource-resolution.test.js.map +1 -0
  200. package/dist/server/viewsDevServer.js +4 -1
  201. package/dist/server/viewsDevServer.js.map +1 -1
  202. package/dist/test/utils.d.ts +9 -11
  203. package/dist/test/utils.js +220 -201
  204. package/dist/test/utils.js.map +1 -1
  205. package/dist/test/view.test.js +105 -133
  206. package/dist/test/view.test.js.map +1 -1
  207. package/dist/views/index.d.ts +10 -0
  208. package/dist/views/index.js +3 -0
  209. package/dist/views/index.js.map +1 -0
  210. package/dist/{web/plugin → views}/scan-views.js +1 -1
  211. package/dist/views/scan-views.js.map +1 -0
  212. package/dist/views/scan-views.test.d.ts +1 -0
  213. package/dist/views/scan-views.test.js.map +1 -0
  214. package/dist/views/validate-view.d.ts +1 -0
  215. package/dist/{web/plugin → views}/validate-view.js +2 -2
  216. package/dist/views/validate-view.js.map +1 -0
  217. package/dist/views/validate-view.test.d.ts +1 -0
  218. package/dist/views/validate-view.test.js.map +1 -0
  219. package/dist/web/bridges/adaptor.d.ts +62 -0
  220. package/dist/web/bridges/adaptor.js +477 -0
  221. package/dist/web/bridges/adaptor.js.map +1 -0
  222. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  223. package/dist/web/bridges/adaptor.test.js +281 -0
  224. package/dist/web/bridges/adaptor.test.js.map +1 -0
  225. package/dist/web/bridges/apps-sdk/bridge.d.ts +6 -2
  226. package/dist/web/bridges/apps-sdk/bridge.js +15 -4
  227. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  228. package/dist/web/bridges/apps-sdk/index.d.ts +0 -1
  229. package/dist/web/bridges/apps-sdk/index.js +0 -1
  230. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  231. package/dist/web/bridges/apps-sdk/types.d.ts +2 -3
  232. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  233. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +4 -4
  234. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +4 -4
  235. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  236. package/dist/web/bridges/get-adaptor.d.ts +4 -4
  237. package/dist/web/bridges/get-adaptor.js +6 -11
  238. package/dist/web/bridges/get-adaptor.js.map +1 -1
  239. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  240. package/dist/web/bridges/get-adaptor.test.js +32 -0
  241. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  242. package/dist/web/bridges/mcp-app/bridge.d.ts +15 -3
  243. package/dist/web/bridges/mcp-app/bridge.js +80 -8
  244. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  245. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  246. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  247. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  248. package/dist/web/bridges/mcp-app/index.d.ts +0 -1
  249. package/dist/web/bridges/mcp-app/index.js +0 -1
  250. package/dist/web/bridges/mcp-app/index.js.map +1 -1
  251. package/dist/web/bridges/mcp-app/types.d.ts +19 -2
  252. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  253. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +2 -2
  254. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +1 -1
  255. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  256. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +1 -1
  257. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  258. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  259. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  260. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  261. package/dist/web/bridges/types.d.ts +110 -9
  262. package/dist/web/bridges/types.js +14 -1
  263. package/dist/web/bridges/types.js.map +1 -1
  264. package/dist/web/bridges/types.test.d.ts +1 -0
  265. package/dist/web/bridges/types.test.js +19 -0
  266. package/dist/web/bridges/types.test.js.map +1 -0
  267. package/dist/web/components/modal-provider.d.ts +1 -1
  268. package/dist/web/components/modal-provider.js +4 -3
  269. package/dist/web/components/modal-provider.js.map +1 -1
  270. package/dist/web/create-store.test.js +10 -7
  271. package/dist/web/create-store.test.js.map +1 -1
  272. package/dist/web/data-llm.d.ts +1 -1
  273. package/dist/web/data-llm.js +3 -2
  274. package/dist/web/data-llm.js.map +1 -1
  275. package/dist/web/data-llm.test.js +26 -7
  276. package/dist/web/data-llm.test.js.map +1 -1
  277. package/dist/web/generate-helpers.d.ts +23 -19
  278. package/dist/web/generate-helpers.js +21 -17
  279. package/dist/web/generate-helpers.js.map +1 -1
  280. package/dist/web/generate-helpers.test-d.js +7 -5
  281. package/dist/web/generate-helpers.test-d.js.map +1 -1
  282. package/dist/web/generate-helpers.test.js +2 -2
  283. package/dist/web/generate-helpers.test.js.map +1 -1
  284. package/dist/web/hooks/index.d.ts +7 -1
  285. package/dist/web/hooks/index.js +7 -1
  286. package/dist/web/hooks/index.js.map +1 -1
  287. package/dist/web/hooks/openai-extensions.test.d.ts +1 -0
  288. package/dist/web/hooks/openai-extensions.test.js +107 -0
  289. package/dist/web/hooks/openai-extensions.test.js.map +1 -0
  290. package/dist/web/hooks/test/utils.d.ts +2 -1
  291. package/dist/web/hooks/test/utils.js +1 -1
  292. package/dist/web/hooks/test/utils.js.map +1 -1
  293. package/dist/web/hooks/use-call-tool.d.ts +2 -2
  294. package/dist/web/hooks/use-call-tool.js +15 -10
  295. package/dist/web/hooks/use-call-tool.js.map +1 -1
  296. package/dist/web/hooks/use-call-tool.test.js +50 -25
  297. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  298. package/dist/web/hooks/use-deep-link.d.ts +22 -0
  299. package/dist/web/hooks/use-deep-link.js +34 -0
  300. package/dist/web/hooks/use-deep-link.js.map +1 -0
  301. package/dist/web/hooks/use-display-mode.d.ts +1 -1
  302. package/dist/web/hooks/use-display-mode.js +1 -1
  303. package/dist/web/hooks/use-display-mode.js.map +1 -1
  304. package/dist/web/hooks/use-display-mode.test.js +57 -21
  305. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  306. package/dist/web/hooks/use-download.d.ts +1 -3
  307. package/dist/web/hooks/use-download.js +1 -2
  308. package/dist/web/hooks/use-download.js.map +1 -1
  309. package/dist/web/hooks/use-download.test.js +18 -10
  310. package/dist/web/hooks/use-download.test.js.map +1 -1
  311. package/dist/web/hooks/use-file-resource.d.ts +37 -0
  312. package/dist/web/hooks/use-file-resource.js +98 -0
  313. package/dist/web/hooks/use-file-resource.js.map +1 -0
  314. package/dist/web/hooks/use-file-resource.test.d.ts +1 -0
  315. package/dist/web/hooks/use-file-resource.test.js +65 -0
  316. package/dist/web/hooks/use-file-resource.test.js.map +1 -0
  317. package/dist/web/hooks/use-files.test.js +11 -3
  318. package/dist/web/hooks/use-files.test.js.map +1 -1
  319. package/dist/web/hooks/use-host.d.ts +44 -0
  320. package/dist/web/hooks/use-host.js +45 -0
  321. package/dist/web/hooks/use-host.js.map +1 -0
  322. package/dist/web/hooks/use-host.test.d.ts +1 -0
  323. package/dist/web/hooks/use-host.test.js +59 -0
  324. package/dist/web/hooks/use-host.test.js.map +1 -0
  325. package/dist/web/hooks/use-model-context.d.ts +44 -0
  326. package/dist/web/hooks/use-model-context.js +63 -0
  327. package/dist/web/hooks/use-model-context.js.map +1 -0
  328. package/dist/web/hooks/use-open-external.test.js +15 -5
  329. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  330. package/dist/web/hooks/use-open-file.d.ts +20 -0
  331. package/dist/web/hooks/use-open-file.js +25 -0
  332. package/dist/web/hooks/use-open-file.js.map +1 -0
  333. package/dist/web/hooks/use-register-view-tool.d.ts +37 -0
  334. package/dist/web/hooks/use-register-view-tool.js +50 -0
  335. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  336. package/dist/web/hooks/use-request-close.test.js +35 -40
  337. package/dist/web/hooks/use-request-close.test.js.map +1 -1
  338. package/dist/web/hooks/use-request-modal.test.js +11 -1
  339. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  340. package/dist/web/hooks/use-request-size.d.ts +1 -1
  341. package/dist/web/hooks/use-request-size.js +1 -1
  342. package/dist/web/hooks/use-request-size.js.map +1 -1
  343. package/dist/web/hooks/use-request-size.test.js +35 -53
  344. package/dist/web/hooks/use-request-size.test.js.map +1 -1
  345. package/dist/web/hooks/use-send-follow-up-message.d.ts +8 -2
  346. package/dist/web/hooks/use-send-follow-up-message.js +6 -0
  347. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
  348. package/dist/web/hooks/use-set-open-in-app-url.test.js +26 -12
  349. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  350. package/dist/web/hooks/use-tool-info.d.ts +18 -19
  351. package/dist/web/hooks/use-tool-info.js +4 -8
  352. package/dist/web/hooks/use-tool-info.js.map +1 -1
  353. package/dist/web/hooks/use-tool-info.test-d.js +11 -34
  354. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  355. package/dist/web/hooks/use-tool-info.test.js +42 -37
  356. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  357. package/dist/web/hooks/use-user.d.ts +3 -2
  358. package/dist/web/hooks/use-user.js +4 -3
  359. package/dist/web/hooks/use-user.js.map +1 -1
  360. package/dist/web/hooks/use-user.test.js +85 -37
  361. package/dist/web/hooks/use-user.test.js.map +1 -1
  362. package/dist/web/hooks/use-view-state.js +19 -9
  363. package/dist/web/hooks/use-view-state.js.map +1 -1
  364. package/dist/web/hooks/use-view-state.test.js +39 -4
  365. package/dist/web/hooks/use-view-state.test.js.map +1 -1
  366. package/dist/web/hooks/use-viewport.d.ts +20 -0
  367. package/dist/web/hooks/use-viewport.js +21 -0
  368. package/dist/web/hooks/use-viewport.js.map +1 -0
  369. package/dist/web/hooks/use-viewport.test.d.ts +1 -0
  370. package/dist/web/hooks/use-viewport.test.js +109 -0
  371. package/dist/web/hooks/use-viewport.test.js.map +1 -0
  372. package/dist/web/mount-view.d.ts +3 -2
  373. package/dist/web/mount-view.js +6 -11
  374. package/dist/web/mount-view.js.map +1 -1
  375. package/package.json +35 -27
  376. package/dist/commands/build-helpers.d.ts +0 -26
  377. package/dist/commands/build-helpers.js +0 -93
  378. package/dist/commands/build-helpers.js.map +0 -1
  379. package/dist/commands/build-helpers.test.js +0 -116
  380. package/dist/commands/build-helpers.test.js.map +0 -1
  381. package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -28
  382. package/dist/web/bridges/apps-sdk/adaptor.js +0 -113
  383. package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
  384. package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -52
  385. package/dist/web/bridges/mcp-app/adaptor.js +0 -280
  386. package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
  387. package/dist/web/hooks/use-layout.d.ts +0 -24
  388. package/dist/web/hooks/use-layout.js +0 -25
  389. package/dist/web/hooks/use-layout.js.map +0 -1
  390. package/dist/web/hooks/use-layout.test.js +0 -96
  391. package/dist/web/hooks/use-layout.test.js.map +0 -1
  392. package/dist/web/plugin/data-llm.test.js +0 -81
  393. package/dist/web/plugin/data-llm.test.js.map +0 -1
  394. package/dist/web/plugin/plugin.d.ts +0 -33
  395. package/dist/web/plugin/plugin.js +0 -189
  396. package/dist/web/plugin/plugin.js.map +0 -1
  397. package/dist/web/plugin/scan-views.js.map +0 -1
  398. package/dist/web/plugin/scan-views.test.js.map +0 -1
  399. package/dist/web/plugin/transform-data-llm.d.ts +0 -12
  400. package/dist/web/plugin/transform-data-llm.js +0 -96
  401. package/dist/web/plugin/transform-data-llm.js.map +0 -1
  402. package/dist/web/plugin/transform-data-llm.test.js +0 -81
  403. package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
  404. package/dist/web/plugin/validate-view.d.ts +0 -1
  405. package/dist/web/plugin/validate-view.js.map +0 -1
  406. package/dist/web/plugin/validate-view.test.js.map +0 -1
  407. /package/dist/{commands → cli}/build-helpers.test.d.ts +0 -0
  408. /package/dist/{web/hooks/use-layout.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  409. /package/dist/{web/plugin/data-llm.test.d.ts → context-warnings.test.d.ts} +0 -0
  410. /package/dist/{web/plugin/scan-views.test.d.ts → server/app.test.d.ts} +0 -0
  411. /package/dist/{web/plugin/validate-view.test.d.ts → server/auth/discovery.test.d.ts} +0 -0
  412. /package/dist/{web/plugin/transform-data-llm.test.d.ts → server/auth-extra.test-d.d.ts} +0 -0
  413. /package/dist/{web/plugin → views}/scan-views.d.ts +0 -0
  414. /package/dist/{web/plugin → views}/scan-views.test.js +0 -0
  415. /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",
@@ -366,22 +475,26 @@ describe("createApp", () => {
366
475
  });
367
476
  });
368
477
  describe("createApp Vercel mode", () => {
369
- it("does not mount /assets in production when VERCEL=1", async () => {
478
+ it("app.run() returns the Express app without binding a port when VERCEL=1", async () => {
370
479
  const prevVercel = process.env.VERCEL;
371
480
  const prevEnv = process.env.NODE_ENV;
372
481
  process.env.VERCEL = "1";
373
482
  process.env.NODE_ENV = "production";
374
483
  try {
375
484
  vi.resetModules();
376
- const { createApp } = await import("./express.js");
377
- const { McpServer: Reloaded } = await import("./server.js");
378
- const server = new Reloaded({ name: "t", version: "0.0.0" });
379
- const httpServer = http.createServer();
380
- const app = await createApp({ mcpServer: server, httpServer });
381
- const { port, server: listening } = await listen(app);
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);
382
495
  openServer = listening;
383
- const res = await fetch(`http://localhost:${port}/assets/foo.js`);
384
- expect(res.status).toBe(404);
496
+ const res = await postMcp(port);
497
+ expect(res.status).not.toBe(404);
385
498
  }
386
499
  finally {
387
500
  if (prevVercel === undefined) {
@@ -394,24 +507,40 @@ describe("createApp Vercel mode", () => {
394
507
  vi.resetModules();
395
508
  }
396
509
  });
397
- it("server.run() returns the Express app without binding a port when VERCEL=1", async () => {
510
+ it("passes onMcpError to the /mcp handler when VERCEL=1", async () => {
398
511
  const prevVercel = process.env.VERCEL;
399
512
  const prevEnv = process.env.NODE_ENV;
400
513
  process.env.VERCEL = "1";
401
514
  process.env.NODE_ENV = "production";
515
+ const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
402
516
  try {
403
517
  vi.resetModules();
404
- const { McpServer: Reloaded } = await import("./server.js");
405
- const server = new Reloaded({ name: "t", version: "0.0.0" });
406
- const result = await server.run();
407
- expect(typeof result).toBe("function");
408
- expect(result).toBe(server.express);
409
- const { port, server: listening } = await listen(server.express);
518
+ const { Skybridge: Reloaded } = await import("./app.js");
519
+ const onMcpError = vi.fn();
520
+ const app = new Reloaded({
521
+ name: "t",
522
+ version: "0.0.0",
523
+ onMcpError,
524
+ handler: (server) => server,
525
+ });
526
+ await app.run();
527
+ const { port, server: listening } = await listen(app.express);
410
528
  openServer = listening;
411
- const res = await postMcp(port);
412
- expect(res.status).not.toBe(404);
529
+ const res = await fetch(`http://localhost:${port}/mcp`, {
530
+ method: "POST",
531
+ headers: {
532
+ "content-type": "application/json",
533
+ accept: "application/json, text/event-stream",
534
+ "mcp-protocol-version": "client-supplied-text",
535
+ },
536
+ body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/list" }),
537
+ });
538
+ expect(res.status).toBe(400);
539
+ expect(onMcpError).toHaveBeenCalledTimes(1);
540
+ expect(consoleSpy).not.toHaveBeenCalled();
413
541
  }
414
542
  finally {
543
+ consoleSpy.mockRestore();
415
544
  if (prevVercel === undefined) {
416
545
  delete process.env.VERCEL;
417
546
  }
@@ -441,10 +570,14 @@ describe("createApp tunnel routes", () => {
441
570
  process.env.__TUNNEL_CONTROL_PORT = String(controlPort);
442
571
  try {
443
572
  const { createApp } = await import("./express.js");
444
- const mcpServer = new McpServer({ name: "t", version: "0.0.0" });
573
+ const app = new Skybridge({
574
+ name: "t",
575
+ version: "0.0.0",
576
+ handler: (server) => server,
577
+ });
445
578
  const httpServer = http.createServer();
446
- const app = await createApp({ mcpServer, httpServer });
447
- const { port, server } = await listen(app);
579
+ const expressApp = await createApp({ app, httpServer });
580
+ const { port, server } = await listen(expressApp);
448
581
  openServer = server;
449
582
  const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
450
583
  method: "POST",
@@ -468,11 +601,15 @@ describe("createApp tunnel routes", () => {
468
601
  try {
469
602
  vi.resetModules();
470
603
  const { createApp } = await import("./express.js");
471
- const { McpServer: ReloadedMcpServer } = await import("./server.js");
472
- const mcpServer = new ReloadedMcpServer({ name: "t", version: "0.0.0" });
604
+ const { Skybridge: ReloadedSkybridge } = await import("./app.js");
605
+ const app = new ReloadedSkybridge({
606
+ name: "t",
607
+ version: "0.0.0",
608
+ handler: (server) => server,
609
+ });
473
610
  const httpServer = http.createServer();
474
- const app = await createApp({ mcpServer, httpServer });
475
- const { port, server } = await listen(app);
611
+ const expressApp = await createApp({ app, httpServer });
612
+ const { port, server } = await listen(expressApp);
476
613
  openServer = server;
477
614
  const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
478
615
  method: "POST",
@@ -485,4 +622,32 @@ describe("createApp tunnel routes", () => {
485
622
  }
486
623
  });
487
624
  });
625
+ describe("createApp mount path", () => {
626
+ it("serves /mcp with the mount path intact on the request URL", async () => {
627
+ const { createApp } = await import("./express.js");
628
+ const app = new Skybridge({
629
+ name: "t",
630
+ version: "0.0.0",
631
+ handler: (server) => server.registerTool({
632
+ name: "echo-url",
633
+ description: "Echoes the request URL.",
634
+ inputSchema: {},
635
+ }, (_args, extra) => ({
636
+ content: [{ type: "text", text: extra.http?.req?.url ?? "" }],
637
+ })),
638
+ });
639
+ const httpServer = http.createServer();
640
+ const expressApp = await createApp({ app, httpServer });
641
+ const { port, server } = await listen(expressApp);
642
+ openServer = server;
643
+ const client = new Client({ name: "test-client", version: "0.0.0" });
644
+ await client.connect(new StreamableHTTPClientTransport(new URL(`http://localhost:${port}/mcp`)));
645
+ const result = (await client.callTool({
646
+ name: "echo-url",
647
+ arguments: {},
648
+ }));
649
+ await client.close();
650
+ expect(new URL(result.content[0]?.text ?? "").pathname).toBe("/mcp");
651
+ });
652
+ });
488
653
  //# sourceMappingURL=express.test.js.map