skybridge 0.0.0-dev.db8be9c → 0.0.0-dev.dbab7df

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 (517) hide show
  1. package/README.md +155 -0
  2. package/bin/run.js +0 -4
  3. package/dist/cli/build-helpers.d.ts +11 -0
  4. package/dist/cli/build-helpers.js +107 -0
  5. package/dist/cli/build-helpers.js.map +1 -0
  6. package/dist/cli/build-helpers.test.js +132 -0
  7. package/dist/cli/build-helpers.test.js.map +1 -0
  8. package/dist/cli/build-steps.d.ts +2 -0
  9. package/dist/cli/build-steps.js +73 -0
  10. package/dist/cli/build-steps.js.map +1 -0
  11. package/dist/cli/build-steps.test.js +52 -0
  12. package/dist/cli/build-steps.test.js.map +1 -0
  13. package/dist/cli/detect-port.d.ts +18 -0
  14. package/dist/cli/detect-port.js +50 -0
  15. package/dist/cli/detect-port.js.map +1 -0
  16. package/dist/cli/header.d.ts +1 -1
  17. package/dist/cli/header.js +1 -1
  18. package/dist/cli/header.js.map +1 -1
  19. package/dist/cli/resolve-skybridge-config.d.ts +5 -0
  20. package/dist/cli/resolve-skybridge-config.js +18 -0
  21. package/dist/cli/resolve-skybridge-config.js.map +1 -0
  22. package/dist/cli/run-command.js.map +1 -1
  23. package/dist/cli/run-plain.d.ts +18 -0
  24. package/dist/cli/run-plain.js +89 -0
  25. package/dist/cli/run-plain.js.map +1 -0
  26. package/dist/{hooks → cli}/telemetry.js +1 -3
  27. package/dist/cli/telemetry.js.map +1 -0
  28. package/dist/cli/tunnel-control-server.d.ts +9 -0
  29. package/dist/cli/tunnel-control-server.js +31 -0
  30. package/dist/cli/tunnel-control-server.js.map +1 -0
  31. package/dist/cli/tunnel-control-server.test.js +39 -0
  32. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  33. package/dist/cli/tunnel-handler.d.ts +3 -0
  34. package/dist/cli/tunnel-handler.js +48 -0
  35. package/dist/cli/tunnel-handler.js.map +1 -0
  36. package/dist/cli/tunnel-handler.test.js +105 -0
  37. package/dist/cli/tunnel-handler.test.js.map +1 -0
  38. package/dist/cli/tunnel.d.ts +57 -0
  39. package/dist/cli/tunnel.js +154 -0
  40. package/dist/cli/tunnel.js.map +1 -0
  41. package/dist/cli/tunnel.test.js +190 -0
  42. package/dist/cli/tunnel.test.js.map +1 -0
  43. package/dist/cli/types.d.ts +5 -0
  44. package/dist/cli/types.js +2 -0
  45. package/dist/cli/types.js.map +1 -0
  46. package/dist/cli/use-execute-steps.d.ts +2 -1
  47. package/dist/cli/use-execute-steps.js +6 -1
  48. package/dist/cli/use-execute-steps.js.map +1 -1
  49. package/dist/cli/use-messages.d.ts +3 -0
  50. package/dist/cli/use-messages.js +11 -0
  51. package/dist/cli/use-messages.js.map +1 -0
  52. package/dist/cli/use-nodemon.d.ts +16 -0
  53. package/dist/cli/use-nodemon.js +84 -0
  54. package/dist/cli/use-nodemon.js.map +1 -0
  55. package/dist/cli/use-open-browser.d.ts +1 -0
  56. package/dist/cli/use-open-browser.js +44 -0
  57. package/dist/cli/use-open-browser.js.map +1 -0
  58. package/dist/cli/use-tunnel.d.ts +14 -0
  59. package/dist/cli/use-tunnel.js +131 -0
  60. package/dist/cli/use-tunnel.js.map +1 -0
  61. package/dist/cli/use-typescript-check.d.ts +15 -0
  62. package/dist/cli/use-typescript-check.js +97 -0
  63. package/dist/cli/use-typescript-check.js.map +1 -0
  64. package/dist/commands/build.d.ts +0 -3
  65. package/dist/commands/build.js +3 -16
  66. package/dist/commands/build.js.map +1 -1
  67. package/dist/commands/create.d.ts +9 -0
  68. package/dist/commands/create.js +30 -0
  69. package/dist/commands/create.js.map +1 -0
  70. package/dist/commands/dev.d.ts +7 -1
  71. package/dist/commands/dev.js +117 -9
  72. package/dist/commands/dev.js.map +1 -1
  73. package/dist/commands/start.d.ts +3 -1
  74. package/dist/commands/start.js +37 -15
  75. package/dist/commands/start.js.map +1 -1
  76. package/dist/commands/telemetry/disable.js +4 -3
  77. package/dist/commands/telemetry/disable.js.map +1 -1
  78. package/dist/commands/telemetry/enable.js +3 -2
  79. package/dist/commands/telemetry/enable.js.map +1 -1
  80. package/dist/commands/telemetry/status.js +3 -2
  81. package/dist/commands/telemetry/status.js.map +1 -1
  82. package/dist/context-warnings.d.ts +5 -0
  83. package/dist/context-warnings.js +31 -0
  84. package/dist/context-warnings.js.map +1 -0
  85. package/dist/context-warnings.test.d.ts +1 -0
  86. package/dist/context-warnings.test.js +28 -0
  87. package/dist/context-warnings.test.js.map +1 -0
  88. package/dist/server/app.d.ts +180 -0
  89. package/dist/server/app.js +266 -0
  90. package/dist/server/app.js.map +1 -0
  91. package/dist/server/asset-base-url-transform-plugin.d.ts +11 -0
  92. package/dist/server/asset-base-url-transform-plugin.js +48 -0
  93. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  94. package/dist/server/asset-base-url-transform-plugin.test.d.ts +1 -0
  95. package/dist/server/asset-base-url-transform-plugin.test.js +134 -0
  96. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  97. package/dist/server/auth/discovery.d.ts +33 -0
  98. package/dist/server/auth/discovery.js +56 -0
  99. package/dist/server/auth/discovery.js.map +1 -0
  100. package/dist/server/auth/discovery.test.d.ts +1 -0
  101. package/dist/server/auth/discovery.test.js +93 -0
  102. package/dist/server/auth/discovery.test.js.map +1 -0
  103. package/dist/server/auth/index.d.ts +30 -0
  104. package/dist/server/auth/index.js +2 -0
  105. package/dist/server/auth/index.js.map +1 -0
  106. package/dist/server/auth/providers/auth0.d.ts +40 -0
  107. package/dist/server/auth/providers/auth0.js +31 -0
  108. package/dist/server/auth/providers/auth0.js.map +1 -0
  109. package/dist/server/auth/providers/auth0.test.d.ts +1 -0
  110. package/dist/server/auth/providers/auth0.test.js +50 -0
  111. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  112. package/dist/server/auth/providers/authplane.d.ts +49 -0
  113. package/dist/server/auth/providers/authplane.js +57 -0
  114. package/dist/server/auth/providers/authplane.js.map +1 -0
  115. package/dist/server/auth/providers/authplane.test.d.ts +1 -0
  116. package/dist/server/auth/providers/authplane.test.js +140 -0
  117. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  118. package/dist/server/auth/providers/clerk.d.ts +51 -0
  119. package/dist/server/auth/providers/clerk.js +19 -0
  120. package/dist/server/auth/providers/clerk.js.map +1 -0
  121. package/dist/server/auth/providers/clerk.test.d.ts +1 -0
  122. package/dist/server/auth/providers/clerk.test.js +30 -0
  123. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  124. package/dist/server/auth/providers/custom.d.ts +40 -0
  125. package/dist/server/auth/providers/custom.js +56 -0
  126. package/dist/server/auth/providers/custom.js.map +1 -0
  127. package/dist/server/auth/providers/custom.test.d.ts +1 -0
  128. package/dist/server/auth/providers/custom.test.js +158 -0
  129. package/dist/server/auth/providers/custom.test.js.map +1 -0
  130. package/dist/server/auth/providers/descope.d.ts +44 -0
  131. package/dist/server/auth/providers/descope.js +44 -0
  132. package/dist/server/auth/providers/descope.js.map +1 -0
  133. package/dist/server/auth/providers/descope.test.d.ts +1 -0
  134. package/dist/server/auth/providers/descope.test.js +62 -0
  135. package/dist/server/auth/providers/descope.test.js.map +1 -0
  136. package/dist/server/auth/providers/shared.d.ts +2 -0
  137. package/dist/server/auth/providers/shared.js +6 -0
  138. package/dist/server/auth/providers/shared.js.map +1 -0
  139. package/dist/server/auth/providers/shared.test.d.ts +1 -0
  140. package/dist/server/auth/providers/shared.test.js +10 -0
  141. package/dist/server/auth/providers/shared.test.js.map +1 -0
  142. package/dist/server/auth/providers/stytch.d.ts +25 -0
  143. package/dist/server/auth/providers/stytch.js +16 -0
  144. package/dist/server/auth/providers/stytch.js.map +1 -0
  145. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  146. package/dist/server/auth/providers/verify-spy.js +21 -0
  147. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  148. package/dist/server/auth/providers/workos.d.ts +33 -0
  149. package/dist/server/auth/providers/workos.js +15 -0
  150. package/dist/server/auth/providers/workos.js.map +1 -0
  151. package/dist/server/auth/security-schemes.d.ts +23 -0
  152. package/dist/server/auth/security-schemes.js +64 -0
  153. package/dist/server/auth/security-schemes.js.map +1 -0
  154. package/dist/server/auth/security-schemes.test.d.ts +1 -0
  155. package/dist/server/auth/security-schemes.test.js +99 -0
  156. package/dist/server/auth/security-schemes.test.js.map +1 -0
  157. package/dist/server/auth/setup.d.ts +6 -0
  158. package/dist/server/auth/setup.js +91 -0
  159. package/dist/server/auth/setup.js.map +1 -0
  160. package/dist/server/auth/setup.test.d.ts +1 -0
  161. package/dist/server/auth/setup.test.js +512 -0
  162. package/dist/server/auth/setup.test.js.map +1 -0
  163. package/dist/server/auth/verify.d.ts +46 -0
  164. package/dist/server/auth/verify.js +62 -0
  165. package/dist/server/auth/verify.js.map +1 -0
  166. package/dist/server/auth/verify.test.d.ts +1 -0
  167. package/dist/server/auth/verify.test.js +149 -0
  168. package/dist/server/auth/verify.test.js.map +1 -0
  169. package/dist/server/auth-extra.test-d.d.ts +1 -0
  170. package/dist/server/auth-extra.test-d.js +70 -0
  171. package/dist/server/auth-extra.test-d.js.map +1 -0
  172. package/dist/server/auth.d.ts +57 -0
  173. package/dist/server/auth.js +27 -0
  174. package/dist/server/auth.js.map +1 -0
  175. package/dist/server/build-manifest.test.d.ts +1 -0
  176. package/dist/server/build-manifest.test.js +28 -0
  177. package/dist/server/build-manifest.test.js.map +1 -0
  178. package/dist/server/content-helpers.d.ts +67 -0
  179. package/dist/server/content-helpers.js +79 -0
  180. package/dist/server/content-helpers.js.map +1 -0
  181. package/dist/server/content-helpers.test.d.ts +1 -0
  182. package/dist/server/content-helpers.test.js +70 -0
  183. package/dist/server/content-helpers.test.js.map +1 -0
  184. package/dist/server/express.d.ts +13 -0
  185. package/dist/server/express.js +77 -0
  186. package/dist/server/express.js.map +1 -0
  187. package/dist/server/express.test.d.ts +1 -0
  188. package/dist/server/express.test.js +519 -0
  189. package/dist/server/express.test.js.map +1 -0
  190. package/dist/server/file-ref.d.ts +28 -0
  191. package/dist/server/file-ref.js +27 -0
  192. package/dist/server/file-ref.js.map +1 -0
  193. package/dist/server/host.d.ts +2 -0
  194. package/dist/server/host.js +11 -0
  195. package/dist/server/host.js.map +1 -0
  196. package/dist/server/host.test.d.ts +1 -0
  197. package/dist/server/host.test.js +13 -0
  198. package/dist/server/host.test.js.map +1 -0
  199. package/dist/server/index.d.ts +21 -3
  200. package/dist/server/index.js +16 -2
  201. package/dist/server/index.js.map +1 -1
  202. package/dist/server/inferUtilityTypes.d.ts +6 -6
  203. package/dist/server/inferUtilityTypes.js.map +1 -1
  204. package/dist/server/mcp-errors.test.d.ts +1 -0
  205. package/dist/server/mcp-errors.test.js +37 -0
  206. package/dist/server/mcp-errors.test.js.map +1 -0
  207. package/dist/server/metric.d.ts +14 -0
  208. package/dist/server/metric.js +62 -0
  209. package/dist/server/metric.js.map +1 -0
  210. package/dist/server/middleware.d.ts +162 -0
  211. package/dist/server/middleware.js +126 -0
  212. package/dist/server/middleware.js.map +1 -0
  213. package/dist/server/middleware.test-d.d.ts +1 -0
  214. package/dist/server/middleware.test-d.js +75 -0
  215. package/dist/server/middleware.test-d.js.map +1 -0
  216. package/dist/server/middleware.test.d.ts +1 -0
  217. package/dist/server/middleware.test.js +559 -0
  218. package/dist/server/middleware.test.js.map +1 -0
  219. package/dist/server/register-tool.test.d.ts +1 -0
  220. package/dist/server/register-tool.test.js +23 -0
  221. package/dist/server/register-tool.test.js.map +1 -0
  222. package/dist/server/requestOrigin.d.ts +7 -0
  223. package/dist/server/requestOrigin.js +25 -0
  224. package/dist/server/requestOrigin.js.map +1 -0
  225. package/dist/server/server.d.ts +387 -65
  226. package/dist/server/server.js +532 -99
  227. package/dist/server/server.js.map +1 -1
  228. package/dist/server/skills-integration.test.d.ts +1 -0
  229. package/dist/server/skills-integration.test.js +79 -0
  230. package/dist/server/skills-integration.test.js.map +1 -0
  231. package/dist/server/skills.d.ts +27 -0
  232. package/dist/server/skills.js +188 -0
  233. package/dist/server/skills.js.map +1 -0
  234. package/dist/server/skills.test.d.ts +1 -0
  235. package/dist/server/skills.test.js +243 -0
  236. package/dist/server/skills.test.js.map +1 -0
  237. package/dist/server/templateHelper.d.ts +5 -7
  238. package/dist/server/templateHelper.js +3 -22
  239. package/dist/server/templateHelper.js.map +1 -1
  240. package/dist/server/templates.generated.d.ts +4 -0
  241. package/dist/server/templates.generated.js +47 -0
  242. package/dist/server/templates.generated.js.map +1 -0
  243. package/dist/server/tool-extra.test.d.ts +1 -0
  244. package/dist/server/tool-extra.test.js +72 -0
  245. package/dist/server/tool-extra.test.js.map +1 -0
  246. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  247. package/dist/server/tunnel-proxy-router.js +110 -0
  248. package/dist/server/tunnel-proxy-router.js.map +1 -0
  249. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  250. package/dist/server/tunnel-proxy-router.test.js +229 -0
  251. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  252. package/dist/server/view-name.test-d.d.ts +1 -0
  253. package/dist/server/view-name.test-d.js +8 -0
  254. package/dist/server/view-name.test-d.js.map +1 -0
  255. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  256. package/dist/server/view-resource-resolution.test.js +172 -0
  257. package/dist/server/view-resource-resolution.test.js.map +1 -0
  258. package/dist/server/viewsDevServer.d.ts +14 -0
  259. package/dist/server/viewsDevServer.js +48 -0
  260. package/dist/server/viewsDevServer.js.map +1 -0
  261. package/dist/standard-schema.d.ts +3 -0
  262. package/dist/standard-schema.js +2 -0
  263. package/dist/standard-schema.js.map +1 -0
  264. package/dist/test/utils.d.ts +21 -31
  265. package/dist/test/utils.js +55 -45
  266. package/dist/test/utils.js.map +1 -1
  267. package/dist/test/view.test.d.ts +1 -0
  268. package/dist/test/view.test.js +536 -0
  269. package/dist/test/view.test.js.map +1 -0
  270. package/dist/version.d.ts +1 -0
  271. package/dist/version.js +3 -0
  272. package/dist/version.js.map +1 -0
  273. package/dist/views/index.d.ts +3 -0
  274. package/dist/views/index.js +3 -0
  275. package/dist/views/index.js.map +1 -0
  276. package/dist/views/scan-views.d.ts +16 -0
  277. package/dist/views/scan-views.js +88 -0
  278. package/dist/views/scan-views.js.map +1 -0
  279. package/dist/views/scan-views.test.d.ts +1 -0
  280. package/dist/views/scan-views.test.js +99 -0
  281. package/dist/views/scan-views.test.js.map +1 -0
  282. package/dist/views/validate-view.d.ts +1 -0
  283. package/dist/views/validate-view.js +9 -0
  284. package/dist/views/validate-view.js.map +1 -0
  285. package/dist/views/validate-view.test.d.ts +1 -0
  286. package/dist/views/validate-view.test.js +24 -0
  287. package/dist/views/validate-view.test.js.map +1 -0
  288. package/dist/web/bridges/adaptor.d.ts +51 -0
  289. package/dist/web/bridges/adaptor.js +327 -0
  290. package/dist/web/bridges/adaptor.js.map +1 -0
  291. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  292. package/dist/web/bridges/adaptor.test.js +225 -0
  293. package/dist/web/bridges/adaptor.test.js.map +1 -0
  294. package/dist/web/bridges/apps-sdk/bridge.d.ts +7 -2
  295. package/dist/web/bridges/apps-sdk/bridge.js +15 -3
  296. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  297. package/dist/web/bridges/apps-sdk/index.d.ts +1 -2
  298. package/dist/web/bridges/apps-sdk/index.js +0 -1
  299. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  300. package/dist/web/bridges/apps-sdk/types.d.ts +38 -26
  301. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  302. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +11 -0
  303. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +11 -0
  304. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  305. package/dist/web/bridges/get-adaptor.d.ts +7 -0
  306. package/dist/web/bridges/get-adaptor.js +9 -7
  307. package/dist/web/bridges/get-adaptor.js.map +1 -1
  308. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  309. package/dist/web/bridges/get-adaptor.test.js +32 -0
  310. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  311. package/dist/web/bridges/index.js.map +1 -1
  312. package/dist/web/bridges/mcp-app/bridge.d.ts +27 -31
  313. package/dist/web/bridges/mcp-app/bridge.js +111 -198
  314. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  315. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  316. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  317. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  318. package/dist/web/bridges/mcp-app/index.d.ts +0 -1
  319. package/dist/web/bridges/mcp-app/index.js +0 -1
  320. package/dist/web/bridges/mcp-app/index.js.map +1 -1
  321. package/dist/web/bridges/mcp-app/types.d.ts +2 -0
  322. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  323. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +17 -3
  324. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +14 -2
  325. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  326. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +1 -41
  327. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  328. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  329. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  330. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  331. package/dist/web/bridges/types.d.ts +160 -12
  332. package/dist/web/bridges/types.js +14 -1
  333. package/dist/web/bridges/types.js.map +1 -1
  334. package/dist/web/bridges/types.test.d.ts +1 -0
  335. package/dist/web/bridges/types.test.js +19 -0
  336. package/dist/web/bridges/types.test.js.map +1 -0
  337. package/dist/web/bridges/use-host-context.d.ts +5 -0
  338. package/dist/web/bridges/use-host-context.js +5 -0
  339. package/dist/web/bridges/use-host-context.js.map +1 -1
  340. package/dist/web/components/modal-provider.d.ts +4 -0
  341. package/dist/web/components/modal-provider.js +46 -0
  342. package/dist/web/components/modal-provider.js.map +1 -0
  343. package/dist/web/create-store.d.ts +26 -0
  344. package/dist/web/create-store.js +43 -3
  345. package/dist/web/create-store.js.map +1 -1
  346. package/dist/web/create-store.test.js +32 -26
  347. package/dist/web/create-store.test.js.map +1 -1
  348. package/dist/web/data-llm.d.ts +35 -2
  349. package/dist/web/data-llm.js +31 -3
  350. package/dist/web/data-llm.js.map +1 -1
  351. package/dist/web/data-llm.test.js +52 -36
  352. package/dist/web/data-llm.test.js.map +1 -1
  353. package/dist/web/generate-helpers.d.ts +32 -27
  354. package/dist/web/generate-helpers.js +29 -24
  355. package/dist/web/generate-helpers.js.map +1 -1
  356. package/dist/web/generate-helpers.test-d.js +33 -31
  357. package/dist/web/generate-helpers.test-d.js.map +1 -1
  358. package/dist/web/generate-helpers.test.js +2 -2
  359. package/dist/web/generate-helpers.test.js.map +1 -1
  360. package/dist/web/helpers/state.d.ts +2 -2
  361. package/dist/web/helpers/state.js +11 -11
  362. package/dist/web/helpers/state.js.map +1 -1
  363. package/dist/web/helpers/state.test.js +9 -9
  364. package/dist/web/helpers/state.test.js.map +1 -1
  365. package/dist/web/hooks/index.d.ts +9 -3
  366. package/dist/web/hooks/index.js +8 -2
  367. package/dist/web/hooks/index.js.map +1 -1
  368. package/dist/web/hooks/test/utils.d.ts +7 -2
  369. package/dist/web/hooks/test/utils.js +18 -3
  370. package/dist/web/hooks/test/utils.js.map +1 -1
  371. package/dist/web/hooks/use-call-tool.d.ts +45 -0
  372. package/dist/web/hooks/use-call-tool.js +28 -0
  373. package/dist/web/hooks/use-call-tool.js.map +1 -1
  374. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -1
  375. package/dist/web/hooks/use-call-tool.test.js +64 -29
  376. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  377. package/dist/web/hooks/use-display-mode.d.ts +23 -3
  378. package/dist/web/hooks/use-display-mode.js +20 -0
  379. package/dist/web/hooks/use-display-mode.js.map +1 -1
  380. package/dist/web/hooks/use-display-mode.test-d.d.ts +1 -0
  381. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  382. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  383. package/dist/web/hooks/use-display-mode.test.js +57 -21
  384. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  385. package/dist/web/hooks/use-download.d.ts +3 -0
  386. package/dist/web/hooks/use-download.js +7 -0
  387. package/dist/web/hooks/use-download.js.map +1 -0
  388. package/dist/web/hooks/use-download.test.d.ts +1 -0
  389. package/dist/web/hooks/use-download.test.js +103 -0
  390. package/dist/web/hooks/use-download.test.js.map +1 -0
  391. package/dist/web/hooks/use-files.d.ts +35 -6
  392. package/dist/web/hooks/use-files.js +37 -2
  393. package/dist/web/hooks/use-files.js.map +1 -1
  394. package/dist/web/hooks/use-files.test.js +36 -3
  395. package/dist/web/hooks/use-files.test.js.map +1 -1
  396. package/dist/web/hooks/use-host.d.ts +22 -0
  397. package/dist/web/hooks/use-host.js +30 -0
  398. package/dist/web/hooks/use-host.js.map +1 -0
  399. package/dist/web/hooks/use-host.test.d.ts +1 -0
  400. package/dist/web/hooks/use-host.test.js +59 -0
  401. package/dist/web/hooks/use-host.test.js.map +1 -0
  402. package/dist/web/hooks/use-open-external.d.ts +20 -1
  403. package/dist/web/hooks/use-open-external.js +17 -1
  404. package/dist/web/hooks/use-open-external.js.map +1 -1
  405. package/dist/web/hooks/use-open-external.test.js +39 -14
  406. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  407. package/dist/web/hooks/use-register-view-tool.d.ts +37 -0
  408. package/dist/web/hooks/use-register-view-tool.js +50 -0
  409. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  410. package/dist/web/hooks/use-request-close.d.ts +16 -0
  411. package/dist/web/hooks/use-request-close.js +21 -0
  412. package/dist/web/hooks/use-request-close.js.map +1 -0
  413. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  414. package/dist/web/hooks/use-request-close.test.js +47 -0
  415. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  416. package/dist/web/hooks/use-request-modal.d.ts +18 -3
  417. package/dist/web/hooks/use-request-modal.js +25 -8
  418. package/dist/web/hooks/use-request-modal.js.map +1 -1
  419. package/dist/web/hooks/use-request-modal.test.js +16 -2
  420. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  421. package/dist/web/hooks/use-request-size.d.ts +20 -0
  422. package/dist/web/hooks/use-request-size.js +24 -0
  423. package/dist/web/hooks/use-request-size.js.map +1 -0
  424. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  425. package/dist/web/hooks/use-request-size.test.js +47 -0
  426. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  427. package/dist/web/hooks/use-send-follow-up-message.d.ts +19 -1
  428. package/dist/web/hooks/use-send-follow-up-message.js +19 -2
  429. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
  430. package/dist/web/hooks/use-set-open-in-app-url.d.ts +18 -0
  431. package/dist/web/hooks/use-set-open-in-app-url.js +25 -0
  432. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  433. package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
  434. package/dist/web/hooks/use-set-open-in-app-url.test.js +63 -0
  435. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  436. package/dist/web/hooks/use-tool-info.d.ts +46 -14
  437. package/dist/web/hooks/use-tool-info.js +29 -7
  438. package/dist/web/hooks/use-tool-info.js.map +1 -1
  439. package/dist/web/hooks/use-tool-info.test-d.js +11 -34
  440. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  441. package/dist/web/hooks/use-tool-info.test.js +42 -37
  442. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  443. package/dist/web/hooks/use-user.d.ts +5 -2
  444. package/dist/web/hooks/use-user.js +23 -4
  445. package/dist/web/hooks/use-user.js.map +1 -1
  446. package/dist/web/hooks/use-user.test.js +104 -28
  447. package/dist/web/hooks/use-user.test.js.map +1 -1
  448. package/dist/web/hooks/use-view-state.d.ts +25 -0
  449. package/dist/web/hooks/use-view-state.js +42 -0
  450. package/dist/web/hooks/use-view-state.js.map +1 -0
  451. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  452. package/dist/web/hooks/use-view-state.test.js +212 -0
  453. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  454. package/dist/web/hooks/use-viewport.d.ts +20 -0
  455. package/dist/web/hooks/use-viewport.js +21 -0
  456. package/dist/web/hooks/use-viewport.js.map +1 -0
  457. package/dist/web/hooks/use-viewport.test.d.ts +1 -0
  458. package/dist/web/hooks/use-viewport.test.js +109 -0
  459. package/dist/web/hooks/use-viewport.test.js.map +1 -0
  460. package/dist/web/index.d.ts +2 -2
  461. package/dist/web/index.js +1 -2
  462. package/dist/web/index.js.map +1 -1
  463. package/dist/web/mount-view.d.ts +21 -0
  464. package/dist/web/mount-view.js +47 -0
  465. package/dist/web/mount-view.js.map +1 -0
  466. package/dist/web/proxy.js +0 -1
  467. package/dist/web/proxy.js.map +1 -1
  468. package/dist/web/types.d.ts +4 -0
  469. package/dist/web/types.js.map +1 -1
  470. package/package.json +59 -33
  471. package/tsconfig.base.json +33 -0
  472. package/dist/commands/telemetry.d.ts +0 -9
  473. package/dist/commands/telemetry.js +0 -39
  474. package/dist/commands/telemetry.js.map +0 -1
  475. package/dist/hooks/telemetry.js.map +0 -1
  476. package/dist/server/templates/development.hbs +0 -66
  477. package/dist/server/templates/production.hbs +0 -7
  478. package/dist/server/widgetsDevServer.d.ts +0 -12
  479. package/dist/server/widgetsDevServer.js +0 -47
  480. package/dist/server/widgetsDevServer.js.map +0 -1
  481. package/dist/test/widget.test.js +0 -255
  482. package/dist/test/widget.test.js.map +0 -1
  483. package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -14
  484. package/dist/web/bridges/apps-sdk/adaptor.js +0 -39
  485. package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
  486. package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -19
  487. package/dist/web/bridges/mcp-app/adaptor.js +0 -145
  488. package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
  489. package/dist/web/hooks/use-layout.d.ts +0 -22
  490. package/dist/web/hooks/use-layout.js +0 -23
  491. package/dist/web/hooks/use-layout.js.map +0 -1
  492. package/dist/web/hooks/use-layout.test.js +0 -96
  493. package/dist/web/hooks/use-layout.test.js.map +0 -1
  494. package/dist/web/hooks/use-widget-state.d.ts +0 -4
  495. package/dist/web/hooks/use-widget-state.js +0 -32
  496. package/dist/web/hooks/use-widget-state.js.map +0 -1
  497. package/dist/web/hooks/use-widget-state.test.js +0 -61
  498. package/dist/web/hooks/use-widget-state.test.js.map +0 -1
  499. package/dist/web/mount-widget.d.ts +0 -1
  500. package/dist/web/mount-widget.js +0 -19
  501. package/dist/web/mount-widget.js.map +0 -1
  502. package/dist/web/plugin/data-llm.test.js +0 -81
  503. package/dist/web/plugin/data-llm.test.js.map +0 -1
  504. package/dist/web/plugin/plugin.d.ts +0 -2
  505. package/dist/web/plugin/plugin.js +0 -39
  506. package/dist/web/plugin/plugin.js.map +0 -1
  507. package/dist/web/plugin/transform-data-llm.d.ts +0 -12
  508. package/dist/web/plugin/transform-data-llm.js +0 -96
  509. package/dist/web/plugin/transform-data-llm.js.map +0 -1
  510. package/dist/web/plugin/transform-data-llm.test.js +0 -81
  511. package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
  512. /package/dist/{test/widget.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
  513. /package/dist/{web/hooks/use-layout.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  514. /package/dist/{hooks → cli}/telemetry.d.ts +0 -0
  515. /package/dist/{web/hooks/use-widget-state.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  516. /package/dist/{web/plugin/data-llm.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
  517. /package/dist/{web/plugin/transform-data-llm.test.d.ts → cli/tunnel.test.d.ts} +0 -0
@@ -0,0 +1,559 @@
1
+ import { Client, InMemoryTransport } from "@modelcontextprotocol/client";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { z } from "zod";
4
+ import { Skybridge } from "./app.js";
5
+ import { buildMiddlewareChain, getHandlerMaps, getToolError, matchesFilter, } from "./middleware.js";
6
+ // ---------------------------------------------------------------------------
7
+ // matchesFilter
8
+ // ---------------------------------------------------------------------------
9
+ describe("matchesFilter", () => {
10
+ it("matches exact method", () => {
11
+ expect(matchesFilter("tools/call", "tools/call", false)).toBe(true);
12
+ });
13
+ it("rejects non-matching exact method", () => {
14
+ expect(matchesFilter("tools/list", "tools/call", false)).toBe(false);
15
+ });
16
+ it("matches wildcard", () => {
17
+ expect(matchesFilter("tools/call", "tools/*", false)).toBe(true);
18
+ expect(matchesFilter("tools/list", "tools/*", false)).toBe(true);
19
+ });
20
+ it("rejects non-matching wildcard", () => {
21
+ expect(matchesFilter("resources/read", "tools/*", false)).toBe(false);
22
+ });
23
+ it('category "request" matches when isNotification=false', () => {
24
+ expect(matchesFilter("tools/call", "request", false)).toBe(true);
25
+ });
26
+ it('category "request" rejects when isNotification=true', () => {
27
+ expect(matchesFilter("notifications/initialized", "request", true)).toBe(false);
28
+ });
29
+ it('category "notification" matches when isNotification=true', () => {
30
+ expect(matchesFilter("notifications/initialized", "notification", true)).toBe(true);
31
+ });
32
+ it('category "notification" rejects when isNotification=false', () => {
33
+ expect(matchesFilter("tools/call", "notification", false)).toBe(false);
34
+ });
35
+ });
36
+ // ---------------------------------------------------------------------------
37
+ // buildMiddlewareChain
38
+ // ---------------------------------------------------------------------------
39
+ describe("buildMiddlewareChain", () => {
40
+ const fakeExtra = {};
41
+ const makeHandler = (returnValue) => vi.fn(async () => returnValue);
42
+ const makeEntry = (filter, handler) => ({ filter, handler });
43
+ it("returns original handler when no middleware applies", () => {
44
+ const original = makeHandler("result");
45
+ const chain = buildMiddlewareChain("tools/call", false, original, [
46
+ makeEntry("resources/*", async (_req, _extra, next) => next()),
47
+ ]);
48
+ expect(chain).toBe(original);
49
+ });
50
+ it("catch-all middleware runs for any method", async () => {
51
+ const original = makeHandler("ok");
52
+ const spy = vi.fn();
53
+ const chain = buildMiddlewareChain("tools/call", false, original, [
54
+ makeEntry(null, async (request, _extra, next) => {
55
+ spy(request.method);
56
+ return next();
57
+ }),
58
+ ]);
59
+ const result = await chain({ method: "tools/call", params: {} }, fakeExtra);
60
+ expect(spy).toHaveBeenCalledWith("tools/call");
61
+ expect(result).toBe("ok");
62
+ });
63
+ it("method-scoped middleware only runs for matching methods", async () => {
64
+ const original = makeHandler("ok");
65
+ const spy = vi.fn();
66
+ const entries = [
67
+ makeEntry("tools/call", async (_req, _extra, next) => {
68
+ spy("tools/call");
69
+ return next();
70
+ }),
71
+ ];
72
+ // Matching
73
+ const chain1 = buildMiddlewareChain("tools/call", false, original, entries);
74
+ await chain1({ method: "tools/call", params: {} }, fakeExtra);
75
+ expect(spy).toHaveBeenCalledTimes(1);
76
+ // Non-matching — returns original handler directly
77
+ const chain2 = buildMiddlewareChain("tools/list", false, original, entries);
78
+ expect(chain2).toBe(original);
79
+ });
80
+ it("executes middleware in registration order (onion model)", async () => {
81
+ const calls = [];
82
+ const original = makeHandler("result");
83
+ const chain = buildMiddlewareChain("tools/call", false, original, [
84
+ makeEntry(null, async (_req, _extra, next) => {
85
+ calls.push("A:before");
86
+ const result = await next();
87
+ calls.push("A:after");
88
+ return result;
89
+ }),
90
+ makeEntry(null, async (_req, _extra, next) => {
91
+ calls.push("B:before");
92
+ const result = await next();
93
+ calls.push("B:after");
94
+ return result;
95
+ }),
96
+ ]);
97
+ await chain({ method: "tools/call", params: {} }, fakeExtra);
98
+ expect(calls).toEqual(["A:before", "B:before", "B:after", "A:after"]);
99
+ });
100
+ it("short-circuit (no next() call) skips handler", async () => {
101
+ const original = makeHandler("original");
102
+ const chain = buildMiddlewareChain("tools/call", false, original, [
103
+ makeEntry(null, async () => "short-circuited"),
104
+ ]);
105
+ const result = await chain({ method: "tools/call", params: {} }, fakeExtra);
106
+ expect(result).toBe("short-circuited");
107
+ expect(original).not.toHaveBeenCalled();
108
+ });
109
+ it("middleware can modify result post-next()", async () => {
110
+ const original = makeHandler({ value: 1 });
111
+ const chain = buildMiddlewareChain("tools/call", false, original, [
112
+ makeEntry(null, async (_req, _extra, next) => {
113
+ const result = (await next());
114
+ return { value: result.value + 10 };
115
+ }),
116
+ ]);
117
+ const result = await chain({ method: "tools/call", params: {} }, fakeExtra);
118
+ expect(result).toEqual({ value: 11 });
119
+ });
120
+ it("throws on double next() call", async () => {
121
+ const original = makeHandler("ok");
122
+ const chain = buildMiddlewareChain("tools/call", false, original, [
123
+ makeEntry(null, async (_req, _extra, next) => {
124
+ await next();
125
+ return next(); // double call
126
+ }),
127
+ ]);
128
+ await expect(chain({ method: "tools/call", params: {} }, fakeExtra)).rejects.toThrow("next() called multiple times");
129
+ });
130
+ it("propagates errors from handler and middleware", async () => {
131
+ // Error from original handler bubbles through middleware
132
+ const failingHandler = vi.fn(async () => {
133
+ throw new Error("handler boom");
134
+ });
135
+ const chain1 = buildMiddlewareChain("tools/call", false, failingHandler, [
136
+ makeEntry(null, async (_req, _extra, next) => next()),
137
+ ]);
138
+ await expect(chain1({ method: "tools/call", params: {} }, fakeExtra)).rejects.toThrow("handler boom");
139
+ // Error thrown inside middleware propagates
140
+ const chain2 = buildMiddlewareChain("tools/call", false, makeHandler("ok"), [
141
+ makeEntry(null, async () => {
142
+ throw new Error("middleware boom");
143
+ }),
144
+ ]);
145
+ await expect(chain2({ method: "tools/call", params: {} }, fakeExtra)).rejects.toThrow("middleware boom");
146
+ });
147
+ it("passes extra as undefined for notifications (isNotification=true)", async () => {
148
+ const original = makeHandler(undefined);
149
+ let capturedExtra = {};
150
+ const chain = buildMiddlewareChain("notifications/initialized", true, original, [
151
+ makeEntry(null, async (_req, extra, next) => {
152
+ capturedExtra = extra;
153
+ return next();
154
+ }),
155
+ ]);
156
+ await chain({ method: "notifications/initialized" });
157
+ expect(capturedExtra).toBeUndefined();
158
+ });
159
+ it("defaults params to empty object when rawRequest has no params", async () => {
160
+ const original = makeHandler("ok");
161
+ let capturedParams;
162
+ const chain = buildMiddlewareChain("tools/call", false, original, [
163
+ makeEntry(null, async (request, _extra, next) => {
164
+ capturedParams = request.params;
165
+ return next();
166
+ }),
167
+ ]);
168
+ await chain({ method: "tools/call" }, fakeExtra);
169
+ expect(capturedParams).toEqual({});
170
+ });
171
+ it("propagates in-place param mutation to original handler", async () => {
172
+ let handlerReceivedName = "";
173
+ const original = vi.fn(async (rawReq) => {
174
+ handlerReceivedName = rawReq.params.name;
175
+ return "ok";
176
+ });
177
+ const chain = buildMiddlewareChain("tools/call", false, original, [
178
+ makeEntry(null, async (request, _extra, next) => {
179
+ request.params.name = "mutated";
180
+ return next();
181
+ }),
182
+ ]);
183
+ await chain({ params: { name: "original" } }, fakeExtra);
184
+ expect(handlerReceivedName).toBe("mutated");
185
+ });
186
+ it("propagates full param replacement to original handler", async () => {
187
+ let handlerReceivedParams = {};
188
+ const original = vi.fn(async (rawReq) => {
189
+ handlerReceivedParams = rawReq.params;
190
+ return "ok";
191
+ });
192
+ const chain = buildMiddlewareChain("tools/call", false, original, [
193
+ makeEntry(null, async (request, _extra, next) => {
194
+ request.params = { replaced: true };
195
+ return next();
196
+ }),
197
+ ]);
198
+ await chain({ params: { original: true } }, fakeExtra);
199
+ expect(handlerReceivedParams).toEqual({ replaced: true });
200
+ });
201
+ });
202
+ // ---------------------------------------------------------------------------
203
+ // Skybridge.mcpMiddleware() integration tests
204
+ // ---------------------------------------------------------------------------
205
+ describe("Skybridge.mcpMiddleware()", () => {
206
+ function createClient() {
207
+ return new Client({ name: "test-client", version: "1.0.0" });
208
+ }
209
+ it("returns this for chaining", () => {
210
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => server);
211
+ const result = app.mcpMiddleware(async (_req, _extra, next) => next());
212
+ expect(result).toBe(app);
213
+ });
214
+ it("intercepts tools/call and exposes request params", async () => {
215
+ let capturedMethod = "";
216
+ let capturedParams = {};
217
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
218
+ server.registerTool({
219
+ name: "greet",
220
+ description: "greet",
221
+ inputSchema: { name: z.string() },
222
+ }, (args) => ({
223
+ content: [{ type: "text", text: `hi ${args.name}` }],
224
+ }));
225
+ return server;
226
+ });
227
+ app.mcpMiddleware("tools/call", async (request, _extra, next) => {
228
+ capturedMethod = request.method;
229
+ capturedParams = request.params;
230
+ return next();
231
+ });
232
+ const client = createClient();
233
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
234
+ const instance = app.createServerInstance();
235
+ await instance.connect(serverTransport);
236
+ await client.connect(clientTransport);
237
+ const result = await client.callTool({
238
+ name: "greet",
239
+ arguments: { name: "World" },
240
+ });
241
+ expect(capturedMethod).toBe("tools/call");
242
+ expect(capturedParams).toMatchObject({
243
+ name: "greet",
244
+ arguments: { name: "World" },
245
+ });
246
+ expect(result.content).toEqual([{ type: "text", text: "hi World" }]);
247
+ await client.close();
248
+ await instance.close();
249
+ });
250
+ it("array filter works", async () => {
251
+ const matchedMethods = [];
252
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
253
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
254
+ content: [{ type: "text", text: "ok" }],
255
+ }));
256
+ return server;
257
+ });
258
+ app.mcpMiddleware(["tools/call", "tools/list"], async (request, _extra, next) => {
259
+ matchedMethods.push(request.method);
260
+ return next();
261
+ });
262
+ const client = createClient();
263
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
264
+ const instance = app.createServerInstance();
265
+ await instance.connect(serverTransport);
266
+ await client.connect(clientTransport);
267
+ await client.listTools();
268
+ await client.callTool({ name: "t1" });
269
+ expect(matchedMethods).toEqual(["tools/list", "tools/call"]);
270
+ await client.close();
271
+ await instance.close();
272
+ });
273
+ it("throws if registered after connect()", async () => {
274
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => server);
275
+ const [_clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
276
+ const instance = app.createServerInstance();
277
+ await instance.connect(serverTransport);
278
+ expect(() => app.mcpMiddleware(async (_req, _extra, next) => next())).toThrow("Cannot register MCP middleware after run() or connect()");
279
+ await instance.close();
280
+ });
281
+ it("throws when filter provided without handler", () => {
282
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => server);
283
+ expect(() =>
284
+ // @ts-expect-error intentionally passing filter without handler
285
+ app.mcpMiddleware("tools/call")).toThrow("mcpMiddleware requires a handler function");
286
+ });
287
+ it("catch-all middleware + filtered middleware stack correctly", async () => {
288
+ const calls = [];
289
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
290
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
291
+ content: [{ type: "text", text: "ok" }],
292
+ }));
293
+ return server;
294
+ });
295
+ app
296
+ .mcpMiddleware(async (request, _extra, next) => {
297
+ calls.push(`global:${request.method}`);
298
+ return next();
299
+ })
300
+ .mcpMiddleware("tools/call", async (_req, _extra, next) => {
301
+ calls.push("tools-only");
302
+ return next();
303
+ });
304
+ const client = createClient();
305
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
306
+ const instance = app.createServerInstance();
307
+ await instance.connect(serverTransport);
308
+ await client.connect(clientTransport);
309
+ await client.listTools();
310
+ await client.callTool({ name: "t1" });
311
+ // Catch-all also intercepts initialize + notifications/initialized from handshake.
312
+ // tools/list: only global middleware runs
313
+ // tools/call: global + tools-only both run
314
+ expect(calls).toContain("global:tools/list");
315
+ expect(calls).toContain("global:tools/call");
316
+ expect(calls).toContain("tools-only");
317
+ // "tools-only" must come right after "global:tools/call"
318
+ const toolsCallIdx = calls.indexOf("global:tools/call");
319
+ expect(calls[toolsCallIdx + 1]).toBe("tools-only");
320
+ await client.close();
321
+ await instance.close();
322
+ });
323
+ it("notification middleware receives extra as undefined", async () => {
324
+ let capturedExtra = "sentinel";
325
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
326
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
327
+ content: [{ type: "text", text: "ok" }],
328
+ }));
329
+ return server;
330
+ });
331
+ app.mcpMiddleware("notification", async (_request, extra, next) => {
332
+ capturedExtra = extra;
333
+ return next();
334
+ });
335
+ const client = createClient();
336
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
337
+ const instance = app.createServerInstance();
338
+ await instance.connect(serverTransport);
339
+ await client.connect(clientTransport);
340
+ // The client sends notifications/initialized automatically on connect.
341
+ await client.listTools();
342
+ expect(capturedExtra).toBeUndefined();
343
+ await client.close();
344
+ await instance.close();
345
+ });
346
+ it("wildcard filter intercepts matching methods only", async () => {
347
+ const matchedMethods = [];
348
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
349
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
350
+ content: [{ type: "text", text: "ok" }],
351
+ }));
352
+ return server;
353
+ });
354
+ app.mcpMiddleware("tools/*", async (request, _extra, next) => {
355
+ matchedMethods.push(request.method);
356
+ return next();
357
+ });
358
+ const client = createClient();
359
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
360
+ const instance = app.createServerInstance();
361
+ await instance.connect(serverTransport);
362
+ await client.connect(clientTransport);
363
+ await client.listTools();
364
+ await client.callTool({ name: "t1" });
365
+ expect(matchedMethods).toContain("tools/list");
366
+ expect(matchedMethods).toContain("tools/call");
367
+ // Should not match initialize or notifications
368
+ expect(matchedMethods).not.toContain("initialize");
369
+ expect(matchedMethods).not.toContain("notifications/initialized");
370
+ await client.close();
371
+ await instance.close();
372
+ });
373
+ it("middleware can modify tool result via Skybridge integration", async () => {
374
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
375
+ server.registerTool({
376
+ name: "greet",
377
+ description: "greet",
378
+ inputSchema: { name: z.string() },
379
+ }, (args) => ({
380
+ content: [{ type: "text", text: `hi ${args.name}` }],
381
+ }));
382
+ return server;
383
+ });
384
+ app.mcpMiddleware("tools/call", async (_req, _extra, next) => {
385
+ const result = (await next());
386
+ return {
387
+ ...result,
388
+ content: [
389
+ ...result.content,
390
+ { type: "text", text: " (modified)" },
391
+ ],
392
+ };
393
+ });
394
+ const client = createClient();
395
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
396
+ const instance = app.createServerInstance();
397
+ await instance.connect(serverTransport);
398
+ await client.connect(clientTransport);
399
+ const result = await client.callTool({
400
+ name: "greet",
401
+ arguments: { name: "World" },
402
+ });
403
+ expect(result.content).toEqual([
404
+ { type: "text", text: "hi World" },
405
+ { type: "text", text: " (modified)" },
406
+ ]);
407
+ await client.close();
408
+ await instance.close();
409
+ });
410
+ it("middleware can short-circuit via Skybridge integration", async () => {
411
+ const handlerCalled = vi.fn();
412
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
413
+ server.registerTool({ name: "t1", description: "t1" }, () => {
414
+ handlerCalled();
415
+ return {
416
+ content: [{ type: "text", text: "original" }],
417
+ };
418
+ });
419
+ return server;
420
+ });
421
+ app.mcpMiddleware("tools/call", async () => ({
422
+ content: [{ type: "text", text: "short-circuited" }],
423
+ }));
424
+ const client = createClient();
425
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
426
+ const instance = app.createServerInstance();
427
+ await instance.connect(serverTransport);
428
+ await client.connect(clientTransport);
429
+ const result = await client.callTool({ name: "t1" });
430
+ expect(result.content).toEqual([{ type: "text", text: "short-circuited" }]);
431
+ expect(handlerCalled).not.toHaveBeenCalled();
432
+ await client.close();
433
+ await instance.close();
434
+ });
435
+ it("exposes a thrown tool error to middleware via getToolError", async () => {
436
+ const schemaError = new Error("boom with schema");
437
+ const schemalessError = new Error("boom without schema");
438
+ let captured;
439
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
440
+ server.registerTool({
441
+ name: "withSchema",
442
+ description: "withSchema",
443
+ inputSchema: { name: z.string() },
444
+ }, () => {
445
+ throw schemaError;
446
+ });
447
+ server.registerTool({ name: "withoutSchema", description: "withoutSchema" }, () => {
448
+ throw schemalessError;
449
+ });
450
+ return server;
451
+ });
452
+ app.mcpMiddleware("tools/call", async (_request, extra, next) => {
453
+ const result = await next();
454
+ captured = getToolError(extra);
455
+ return result;
456
+ });
457
+ const client = createClient();
458
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
459
+ const instance = app.createServerInstance();
460
+ await instance.connect(serverTransport);
461
+ await client.connect(clientTransport);
462
+ const withSchema = await client.callTool({
463
+ name: "withSchema",
464
+ arguments: { name: "World" },
465
+ });
466
+ expect(withSchema.isError).toBe(true);
467
+ expect(captured).toBe(schemaError);
468
+ const withoutSchema = await client.callTool({ name: "withoutSchema" });
469
+ expect(withoutSchema.isError).toBe(true);
470
+ expect(captured).toBe(schemalessError);
471
+ await client.close();
472
+ await instance.close();
473
+ });
474
+ it("middleware can mutate tool call params via Skybridge integration", async () => {
475
+ let receivedName = "";
476
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
477
+ server.registerTool({
478
+ name: "greet",
479
+ description: "greet",
480
+ inputSchema: { name: z.string() },
481
+ }, (args) => {
482
+ receivedName = args.name;
483
+ return {
484
+ content: [{ type: "text", text: `hi ${args.name}` }],
485
+ };
486
+ });
487
+ return server;
488
+ });
489
+ app.mcpMiddleware("tools/call", async (request, _extra, next) => {
490
+ request.params.arguments = { name: "Overridden" };
491
+ return next();
492
+ });
493
+ const client = createClient();
494
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
495
+ const instance = app.createServerInstance();
496
+ await instance.connect(serverTransport);
497
+ await client.connect(clientTransport);
498
+ await client.callTool({
499
+ name: "greet",
500
+ arguments: { name: "Original" },
501
+ });
502
+ expect(receivedName).toBe("Overridden");
503
+ await client.close();
504
+ await instance.close();
505
+ });
506
+ it("category 'request' filter matches requests but not notifications", async () => {
507
+ const matchedMethods = [];
508
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
509
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
510
+ content: [{ type: "text", text: "ok" }],
511
+ }));
512
+ return server;
513
+ });
514
+ app.mcpMiddleware("request", async (request, _extra, next) => {
515
+ matchedMethods.push(request.method);
516
+ return next();
517
+ });
518
+ const client = createClient();
519
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
520
+ const instance = app.createServerInstance();
521
+ await instance.connect(serverTransport);
522
+ await client.connect(clientTransport);
523
+ await client.listTools();
524
+ await client.callTool({ name: "t1" });
525
+ expect(matchedMethods).toContain("tools/list");
526
+ expect(matchedMethods).toContain("tools/call");
527
+ expect(matchedMethods).not.toContain("notifications/initialized");
528
+ await client.close();
529
+ await instance.close();
530
+ });
531
+ });
532
+ // ---------------------------------------------------------------------------
533
+ // getHandlerMaps
534
+ // ---------------------------------------------------------------------------
535
+ describe("getHandlerMaps", () => {
536
+ it("throws for incompatible server objects", () => {
537
+ // Empty object
538
+ expect(() => getHandlerMaps({})).toThrow("Incompatible MCP SDK version");
539
+ // Only _requestHandlers (missing _notificationHandlers)
540
+ expect(() => getHandlerMaps({ _requestHandlers: new Map() })).toThrow("Incompatible MCP SDK version");
541
+ // Non-Map values
542
+ expect(() => getHandlerMaps({
543
+ _requestHandlers: {},
544
+ _notificationHandlers: {},
545
+ })).toThrow("Incompatible MCP SDK version");
546
+ });
547
+ it("returns handler maps from valid server", () => {
548
+ const reqMap = new Map();
549
+ const notifMap = new Map();
550
+ const fake = {
551
+ _requestHandlers: reqMap,
552
+ _notificationHandlers: notifMap,
553
+ };
554
+ const result = getHandlerMaps(fake);
555
+ expect(result.requestHandlers).toBe(reqMap);
556
+ expect(result.notificationHandlers).toBe(notifMap);
557
+ });
558
+ });
559
+ //# sourceMappingURL=middleware.test.js.map