skybridge 0.0.0-dev.ddadd25 → 0.0.0-dev.dde647a

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 (456) hide show
  1. package/README.md +126 -124
  2. package/dist/cli/build-helpers.d.ts +11 -0
  3. package/dist/cli/build-helpers.js +107 -0
  4. package/dist/cli/build-helpers.js.map +1 -0
  5. package/dist/cli/build-helpers.test.js +132 -0
  6. package/dist/cli/build-helpers.test.js.map +1 -0
  7. package/dist/cli/build-steps.d.ts +2 -0
  8. package/dist/cli/build-steps.js +73 -0
  9. package/dist/cli/build-steps.js.map +1 -0
  10. package/dist/cli/build-steps.test.js +52 -0
  11. package/dist/cli/build-steps.test.js.map +1 -0
  12. package/dist/cli/detect-port.d.ts +2 -2
  13. package/dist/cli/detect-port.js +9 -20
  14. package/dist/cli/detect-port.js.map +1 -1
  15. package/dist/cli/header.d.ts +1 -1
  16. package/dist/cli/header.js +1 -1
  17. package/dist/cli/header.js.map +1 -1
  18. package/dist/cli/resolve-skybridge-config.d.ts +5 -0
  19. package/dist/cli/resolve-skybridge-config.js +18 -0
  20. package/dist/cli/resolve-skybridge-config.js.map +1 -0
  21. package/dist/cli/run-command.js.map +1 -1
  22. package/dist/cli/run-plain.d.ts +18 -0
  23. package/dist/cli/run-plain.js +89 -0
  24. package/dist/cli/run-plain.js.map +1 -0
  25. package/dist/cli/telemetry.js.map +1 -1
  26. package/dist/cli/tunnel-control-server.d.ts +9 -0
  27. package/dist/cli/tunnel-control-server.js +31 -0
  28. package/dist/cli/tunnel-control-server.js.map +1 -0
  29. package/dist/cli/tunnel-control-server.test.js +39 -0
  30. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  31. package/dist/cli/tunnel-handler.d.ts +3 -0
  32. package/dist/cli/tunnel-handler.js +48 -0
  33. package/dist/cli/tunnel-handler.js.map +1 -0
  34. package/dist/cli/tunnel-handler.test.js +105 -0
  35. package/dist/cli/tunnel-handler.test.js.map +1 -0
  36. package/dist/cli/tunnel.d.ts +57 -0
  37. package/dist/cli/tunnel.js +154 -0
  38. package/dist/cli/tunnel.js.map +1 -0
  39. package/dist/cli/tunnel.test.js +190 -0
  40. package/dist/cli/tunnel.test.js.map +1 -0
  41. package/dist/cli/types.js.map +1 -1
  42. package/dist/cli/use-execute-steps.js.map +1 -1
  43. package/dist/cli/use-messages.js.map +1 -1
  44. package/dist/cli/use-nodemon.d.ts +14 -0
  45. package/dist/cli/use-nodemon.js +72 -52
  46. package/dist/cli/use-nodemon.js.map +1 -1
  47. package/dist/cli/use-open-browser.d.ts +1 -0
  48. package/dist/cli/use-open-browser.js +44 -0
  49. package/dist/cli/use-open-browser.js.map +1 -0
  50. package/dist/cli/use-tunnel.d.ts +12 -5
  51. package/dist/cli/use-tunnel.js +102 -63
  52. package/dist/cli/use-tunnel.js.map +1 -1
  53. package/dist/cli/use-typescript-check.d.ts +9 -2
  54. package/dist/cli/use-typescript-check.js +89 -51
  55. package/dist/cli/use-typescript-check.js.map +1 -1
  56. package/dist/commands/build.d.ts +0 -3
  57. package/dist/commands/build.js +3 -18
  58. package/dist/commands/build.js.map +1 -1
  59. package/dist/commands/create.d.ts +9 -0
  60. package/dist/commands/create.js +30 -0
  61. package/dist/commands/create.js.map +1 -0
  62. package/dist/commands/dev.d.ts +3 -0
  63. package/dist/commands/dev.js +87 -3
  64. package/dist/commands/dev.js.map +1 -1
  65. package/dist/commands/start.js +13 -10
  66. package/dist/commands/start.js.map +1 -1
  67. package/dist/commands/telemetry/disable.js.map +1 -1
  68. package/dist/commands/telemetry/enable.js.map +1 -1
  69. package/dist/commands/telemetry/status.js.map +1 -1
  70. package/dist/context-warnings.d.ts +5 -0
  71. package/dist/context-warnings.js +31 -0
  72. package/dist/context-warnings.js.map +1 -0
  73. package/dist/context-warnings.test.d.ts +1 -0
  74. package/dist/context-warnings.test.js +28 -0
  75. package/dist/context-warnings.test.js.map +1 -0
  76. package/dist/server/asset-base-url-transform-plugin.d.ts +1 -0
  77. package/dist/server/asset-base-url-transform-plugin.js +17 -2
  78. package/dist/server/asset-base-url-transform-plugin.js.map +1 -1
  79. package/dist/server/asset-base-url-transform-plugin.test.js +80 -1
  80. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -1
  81. package/dist/server/auth/discovery.d.ts +32 -0
  82. package/dist/server/auth/discovery.js +56 -0
  83. package/dist/server/auth/discovery.js.map +1 -0
  84. package/dist/server/auth/discovery.test.d.ts +1 -0
  85. package/dist/server/auth/discovery.test.js +93 -0
  86. package/dist/server/auth/discovery.test.js.map +1 -0
  87. package/dist/server/auth/index.d.ts +44 -0
  88. package/dist/server/auth/index.js +2 -0
  89. package/dist/server/auth/index.js.map +1 -0
  90. package/dist/server/auth/providers/auth0.d.ts +40 -0
  91. package/dist/server/auth/providers/auth0.js +31 -0
  92. package/dist/server/auth/providers/auth0.js.map +1 -0
  93. package/dist/server/auth/providers/auth0.test.d.ts +1 -0
  94. package/dist/server/auth/providers/auth0.test.js +50 -0
  95. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  96. package/dist/server/auth/providers/authplane.d.ts +49 -0
  97. package/dist/server/auth/providers/authplane.js +57 -0
  98. package/dist/server/auth/providers/authplane.js.map +1 -0
  99. package/dist/server/auth/providers/authplane.test.d.ts +1 -0
  100. package/dist/server/auth/providers/authplane.test.js +140 -0
  101. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  102. package/dist/server/auth/providers/clerk.d.ts +51 -0
  103. package/dist/server/auth/providers/clerk.js +19 -0
  104. package/dist/server/auth/providers/clerk.js.map +1 -0
  105. package/dist/server/auth/providers/clerk.test.d.ts +1 -0
  106. package/dist/server/auth/providers/clerk.test.js +30 -0
  107. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  108. package/dist/server/auth/providers/custom.d.ts +40 -0
  109. package/dist/server/auth/providers/custom.js +56 -0
  110. package/dist/server/auth/providers/custom.js.map +1 -0
  111. package/dist/server/auth/providers/custom.test.d.ts +1 -0
  112. package/dist/server/auth/providers/custom.test.js +158 -0
  113. package/dist/server/auth/providers/custom.test.js.map +1 -0
  114. package/dist/server/auth/providers/descope.d.ts +44 -0
  115. package/dist/server/auth/providers/descope.js +44 -0
  116. package/dist/server/auth/providers/descope.js.map +1 -0
  117. package/dist/server/auth/providers/descope.test.d.ts +1 -0
  118. package/dist/server/auth/providers/descope.test.js +62 -0
  119. package/dist/server/auth/providers/descope.test.js.map +1 -0
  120. package/dist/server/auth/providers/shared.d.ts +2 -0
  121. package/dist/server/auth/providers/shared.js +6 -0
  122. package/dist/server/auth/providers/shared.js.map +1 -0
  123. package/dist/server/auth/providers/shared.test.d.ts +1 -0
  124. package/dist/server/auth/providers/shared.test.js +10 -0
  125. package/dist/server/auth/providers/shared.test.js.map +1 -0
  126. package/dist/server/auth/providers/stytch.d.ts +25 -0
  127. package/dist/server/auth/providers/stytch.js +16 -0
  128. package/dist/server/auth/providers/stytch.js.map +1 -0
  129. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  130. package/dist/server/auth/providers/verify-spy.js +21 -0
  131. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  132. package/dist/server/auth/providers/workos.d.ts +33 -0
  133. package/dist/server/auth/providers/workos.js +15 -0
  134. package/dist/server/auth/providers/workos.js.map +1 -0
  135. package/dist/server/auth/security-schemes.d.ts +23 -0
  136. package/dist/server/auth/security-schemes.js +64 -0
  137. package/dist/server/auth/security-schemes.js.map +1 -0
  138. package/dist/server/auth/security-schemes.test.d.ts +1 -0
  139. package/dist/server/auth/security-schemes.test.js +99 -0
  140. package/dist/server/auth/security-schemes.test.js.map +1 -0
  141. package/dist/server/auth/setup.d.ts +6 -0
  142. package/dist/server/auth/setup.js +92 -0
  143. package/dist/server/auth/setup.js.map +1 -0
  144. package/dist/server/auth/setup.test.d.ts +1 -0
  145. package/dist/server/auth/setup.test.js +508 -0
  146. package/dist/server/auth/setup.test.js.map +1 -0
  147. package/dist/server/auth/verify.d.ts +46 -0
  148. package/dist/server/auth/verify.js +62 -0
  149. package/dist/server/auth/verify.js.map +1 -0
  150. package/dist/server/auth/verify.test.d.ts +1 -0
  151. package/dist/server/auth/verify.test.js +149 -0
  152. package/dist/server/auth/verify.test.js.map +1 -0
  153. package/dist/server/auth-extra.test-d.d.ts +1 -0
  154. package/dist/server/auth-extra.test-d.js +82 -0
  155. package/dist/server/auth-extra.test-d.js.map +1 -0
  156. package/dist/server/auth.d.ts +58 -0
  157. package/dist/server/auth.js +28 -0
  158. package/dist/server/auth.js.map +1 -0
  159. package/dist/server/build-manifest.test.d.ts +1 -0
  160. package/dist/server/build-manifest.test.js +27 -0
  161. package/dist/server/build-manifest.test.js.map +1 -0
  162. package/dist/server/content-helpers.d.ts +67 -0
  163. package/dist/server/content-helpers.js +79 -0
  164. package/dist/server/content-helpers.js.map +1 -0
  165. package/dist/server/content-helpers.test.d.ts +1 -0
  166. package/dist/server/content-helpers.test.js +70 -0
  167. package/dist/server/content-helpers.test.js.map +1 -0
  168. package/dist/server/express.d.ts +1 -5
  169. package/dist/server/express.js +34 -10
  170. package/dist/server/express.js.map +1 -1
  171. package/dist/server/express.test.js +310 -71
  172. package/dist/server/express.test.js.map +1 -1
  173. package/dist/server/file-ref.d.ts +28 -0
  174. package/dist/server/file-ref.js +27 -0
  175. package/dist/server/file-ref.js.map +1 -0
  176. package/dist/server/host.d.ts +2 -0
  177. package/dist/server/host.js +11 -0
  178. package/dist/server/host.js.map +1 -0
  179. package/dist/server/host.test.d.ts +1 -0
  180. package/dist/server/host.test.js +13 -0
  181. package/dist/server/host.test.js.map +1 -0
  182. package/dist/server/index.d.ts +17 -3
  183. package/dist/server/index.js +15 -2
  184. package/dist/server/index.js.map +1 -1
  185. package/dist/server/inferUtilityTypes.d.ts +6 -6
  186. package/dist/server/inferUtilityTypes.js.map +1 -1
  187. package/dist/server/metric.js.map +1 -1
  188. package/dist/server/middleware.d.ts +47 -9
  189. package/dist/server/middleware.js +33 -0
  190. package/dist/server/middleware.js.map +1 -1
  191. package/dist/server/middleware.test-d.js.map +1 -1
  192. package/dist/server/middleware.test.js +49 -10
  193. package/dist/server/middleware.test.js.map +1 -1
  194. package/dist/server/register-tool.test.d.ts +1 -0
  195. package/dist/server/register-tool.test.js +26 -0
  196. package/dist/server/register-tool.test.js.map +1 -0
  197. package/dist/server/requestOrigin.d.ts +7 -0
  198. package/dist/server/requestOrigin.js +25 -0
  199. package/dist/server/requestOrigin.js.map +1 -0
  200. package/dist/server/server.d.ts +396 -78
  201. package/dist/server/server.js +621 -175
  202. package/dist/server/server.js.map +1 -1
  203. package/dist/server/skills-integration.test.d.ts +1 -0
  204. package/dist/server/skills-integration.test.js +79 -0
  205. package/dist/server/skills-integration.test.js.map +1 -0
  206. package/dist/server/skills.d.ts +29 -0
  207. package/dist/server/skills.js +195 -0
  208. package/dist/server/skills.js.map +1 -0
  209. package/dist/server/skills.test.d.ts +1 -0
  210. package/dist/server/skills.test.js +247 -0
  211. package/dist/server/skills.test.js.map +1 -0
  212. package/dist/server/templateHelper.d.ts +5 -7
  213. package/dist/server/templateHelper.js +3 -22
  214. package/dist/server/templateHelper.js.map +1 -1
  215. package/dist/server/templates.generated.d.ts +4 -0
  216. package/dist/server/templates.generated.js +47 -0
  217. package/dist/server/templates.generated.js.map +1 -0
  218. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  219. package/dist/server/tunnel-proxy-router.js +110 -0
  220. package/dist/server/tunnel-proxy-router.js.map +1 -0
  221. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  222. package/dist/server/tunnel-proxy-router.test.js +229 -0
  223. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  224. package/dist/server/view-name.test-d.d.ts +1 -0
  225. package/dist/server/view-name.test-d.js +8 -0
  226. package/dist/server/view-name.test-d.js.map +1 -0
  227. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  228. package/dist/server/view-resource-resolution.test.js +171 -0
  229. package/dist/server/view-resource-resolution.test.js.map +1 -0
  230. package/dist/server/viewsDevServer.d.ts +14 -0
  231. package/dist/server/viewsDevServer.js +48 -0
  232. package/dist/server/viewsDevServer.js.map +1 -0
  233. package/dist/test/utils.d.ts +11 -23
  234. package/dist/test/utils.js +39 -35
  235. package/dist/test/utils.js.map +1 -1
  236. package/dist/test/view.test.d.ts +1 -0
  237. package/dist/test/view.test.js +552 -0
  238. package/dist/test/view.test.js.map +1 -0
  239. package/dist/version.js +1 -3
  240. package/dist/version.js.map +1 -1
  241. package/dist/web/bridges/adaptor.d.ts +51 -0
  242. package/dist/web/bridges/adaptor.js +327 -0
  243. package/dist/web/bridges/adaptor.js.map +1 -0
  244. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  245. package/dist/web/bridges/adaptor.test.js +225 -0
  246. package/dist/web/bridges/adaptor.test.js.map +1 -0
  247. package/dist/web/bridges/apps-sdk/bridge.d.ts +6 -1
  248. package/dist/web/bridges/apps-sdk/bridge.js +15 -3
  249. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  250. package/dist/web/bridges/apps-sdk/index.d.ts +0 -1
  251. package/dist/web/bridges/apps-sdk/index.js +0 -1
  252. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  253. package/dist/web/bridges/apps-sdk/types.d.ts +8 -1
  254. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  255. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +11 -0
  256. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +11 -0
  257. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  258. package/dist/web/bridges/get-adaptor.d.ts +7 -0
  259. package/dist/web/bridges/get-adaptor.js +9 -7
  260. package/dist/web/bridges/get-adaptor.js.map +1 -1
  261. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  262. package/dist/web/bridges/get-adaptor.test.js +32 -0
  263. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  264. package/dist/web/bridges/index.js.map +1 -1
  265. package/dist/web/bridges/mcp-app/bridge.d.ts +15 -2
  266. package/dist/web/bridges/mcp-app/bridge.js +73 -7
  267. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  268. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  269. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  270. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  271. package/dist/web/bridges/mcp-app/index.d.ts +0 -1
  272. package/dist/web/bridges/mcp-app/index.js +0 -1
  273. package/dist/web/bridges/mcp-app/index.js.map +1 -1
  274. package/dist/web/bridges/mcp-app/types.d.ts +2 -0
  275. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  276. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +12 -0
  277. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +12 -0
  278. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  279. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  280. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  281. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  282. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  283. package/dist/web/bridges/types.d.ts +115 -10
  284. package/dist/web/bridges/types.js +14 -1
  285. package/dist/web/bridges/types.js.map +1 -1
  286. package/dist/web/bridges/types.test.d.ts +1 -0
  287. package/dist/web/bridges/types.test.js +19 -0
  288. package/dist/web/bridges/types.test.js.map +1 -0
  289. package/dist/web/bridges/use-host-context.d.ts +5 -0
  290. package/dist/web/bridges/use-host-context.js +5 -0
  291. package/dist/web/bridges/use-host-context.js.map +1 -1
  292. package/dist/web/components/modal-provider.d.ts +1 -1
  293. package/dist/web/components/modal-provider.js +4 -3
  294. package/dist/web/components/modal-provider.js.map +1 -1
  295. package/dist/web/create-store.d.ts +26 -0
  296. package/dist/web/create-store.js +35 -9
  297. package/dist/web/create-store.js.map +1 -1
  298. package/dist/web/create-store.test.js +22 -21
  299. package/dist/web/create-store.test.js.map +1 -1
  300. package/dist/web/data-llm.d.ts +35 -2
  301. package/dist/web/data-llm.js +31 -3
  302. package/dist/web/data-llm.js.map +1 -1
  303. package/dist/web/data-llm.test.js +40 -27
  304. package/dist/web/data-llm.test.js.map +1 -1
  305. package/dist/web/generate-helpers.d.ts +22 -18
  306. package/dist/web/generate-helpers.js +22 -18
  307. package/dist/web/generate-helpers.js.map +1 -1
  308. package/dist/web/generate-helpers.test-d.js +30 -28
  309. package/dist/web/generate-helpers.test-d.js.map +1 -1
  310. package/dist/web/generate-helpers.test.js.map +1 -1
  311. package/dist/web/helpers/state.d.ts +2 -2
  312. package/dist/web/helpers/state.js +11 -11
  313. package/dist/web/helpers/state.js.map +1 -1
  314. package/dist/web/helpers/state.test.js +9 -9
  315. package/dist/web/helpers/state.test.js.map +1 -1
  316. package/dist/web/hooks/index.d.ts +6 -1
  317. package/dist/web/hooks/index.js +6 -1
  318. package/dist/web/hooks/index.js.map +1 -1
  319. package/dist/web/hooks/test/utils.d.ts +7 -2
  320. package/dist/web/hooks/test/utils.js +14 -3
  321. package/dist/web/hooks/test/utils.js.map +1 -1
  322. package/dist/web/hooks/use-call-tool.d.ts +45 -0
  323. package/dist/web/hooks/use-call-tool.js +28 -0
  324. package/dist/web/hooks/use-call-tool.js.map +1 -1
  325. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -1
  326. package/dist/web/hooks/use-call-tool.test.js +62 -27
  327. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  328. package/dist/web/hooks/use-display-mode.d.ts +20 -0
  329. package/dist/web/hooks/use-display-mode.js +20 -0
  330. package/dist/web/hooks/use-display-mode.js.map +1 -1
  331. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -1
  332. package/dist/web/hooks/use-display-mode.test.js +56 -20
  333. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  334. package/dist/web/hooks/use-download.d.ts +5 -0
  335. package/dist/web/hooks/use-download.js +8 -0
  336. package/dist/web/hooks/use-download.js.map +1 -0
  337. package/dist/web/hooks/use-download.test.d.ts +1 -0
  338. package/dist/web/hooks/use-download.test.js +103 -0
  339. package/dist/web/hooks/use-download.test.js.map +1 -0
  340. package/dist/web/hooks/use-files.d.ts +32 -0
  341. package/dist/web/hooks/use-files.js +32 -0
  342. package/dist/web/hooks/use-files.js.map +1 -1
  343. package/dist/web/hooks/use-files.test.js +10 -2
  344. package/dist/web/hooks/use-files.test.js.map +1 -1
  345. package/dist/web/hooks/use-host-info.d.ts +22 -0
  346. package/dist/web/hooks/use-host-info.js +30 -0
  347. package/dist/web/hooks/use-host-info.js.map +1 -0
  348. package/dist/web/hooks/use-host-info.test.d.ts +1 -0
  349. package/dist/web/hooks/use-host-info.test.js +59 -0
  350. package/dist/web/hooks/use-host-info.test.js.map +1 -0
  351. package/dist/web/hooks/use-layout.d.ts +2 -0
  352. package/dist/web/hooks/use-layout.js +2 -0
  353. package/dist/web/hooks/use-layout.js.map +1 -1
  354. package/dist/web/hooks/use-layout.test.js +59 -26
  355. package/dist/web/hooks/use-layout.test.js.map +1 -1
  356. package/dist/web/hooks/use-open-external.d.ts +17 -0
  357. package/dist/web/hooks/use-open-external.js +16 -0
  358. package/dist/web/hooks/use-open-external.js.map +1 -1
  359. package/dist/web/hooks/use-open-external.test.js +13 -3
  360. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  361. package/dist/web/hooks/use-register-view-tool.d.ts +38 -0
  362. package/dist/web/hooks/use-register-view-tool.js +50 -0
  363. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  364. package/dist/web/hooks/use-request-close.d.ts +16 -0
  365. package/dist/web/hooks/use-request-close.js +21 -0
  366. package/dist/web/hooks/use-request-close.js.map +1 -0
  367. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  368. package/dist/web/hooks/use-request-close.test.js +47 -0
  369. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  370. package/dist/web/hooks/use-request-modal.d.ts +16 -1
  371. package/dist/web/hooks/use-request-modal.js +19 -4
  372. package/dist/web/hooks/use-request-modal.js.map +1 -1
  373. package/dist/web/hooks/use-request-modal.test.js +11 -1
  374. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  375. package/dist/web/hooks/use-request-size.d.ts +20 -0
  376. package/dist/web/hooks/use-request-size.js +24 -0
  377. package/dist/web/hooks/use-request-size.js.map +1 -0
  378. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  379. package/dist/web/hooks/use-request-size.test.js +47 -0
  380. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  381. package/dist/web/hooks/use-send-follow-up-message.d.ts +19 -1
  382. package/dist/web/hooks/use-send-follow-up-message.js +19 -2
  383. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
  384. package/dist/web/hooks/use-set-open-in-app-url.d.ts +17 -0
  385. package/dist/web/hooks/use-set-open-in-app-url.js +17 -0
  386. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -1
  387. package/dist/web/hooks/use-set-open-in-app-url.test.js +28 -8
  388. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  389. package/dist/web/hooks/use-tool-info.d.ts +53 -2
  390. package/dist/web/hooks/use-tool-info.js +30 -7
  391. package/dist/web/hooks/use-tool-info.js.map +1 -1
  392. package/dist/web/hooks/use-tool-info.test-d.js +11 -29
  393. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  394. package/dist/web/hooks/use-tool-info.test.js +42 -32
  395. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  396. package/dist/web/hooks/use-user.d.ts +2 -0
  397. package/dist/web/hooks/use-user.js +2 -0
  398. package/dist/web/hooks/use-user.js.map +1 -1
  399. package/dist/web/hooks/use-user.test.js +81 -35
  400. package/dist/web/hooks/use-user.test.js.map +1 -1
  401. package/dist/web/hooks/use-view-state.d.ts +25 -0
  402. package/dist/web/hooks/use-view-state.js +42 -0
  403. package/dist/web/hooks/use-view-state.js.map +1 -0
  404. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  405. package/dist/web/hooks/{use-widget-state.test.js → use-view-state.test.js} +54 -19
  406. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  407. package/dist/web/index.d.ts +1 -2
  408. package/dist/web/index.js +1 -2
  409. package/dist/web/index.js.map +1 -1
  410. package/dist/web/mount-view.d.ts +20 -0
  411. package/dist/web/{mount-widget.js → mount-view.js} +21 -2
  412. package/dist/web/mount-view.js.map +1 -0
  413. package/dist/web/proxy.js.map +1 -1
  414. package/dist/web/types.d.ts +4 -0
  415. package/dist/web/types.js.map +1 -1
  416. package/package.json +35 -23
  417. package/tsconfig.base.json +2 -0
  418. package/dist/server/templates/development.hbs +0 -12
  419. package/dist/server/templates/production.hbs +0 -6
  420. package/dist/server/widgetsDevServer.d.ts +0 -13
  421. package/dist/server/widgetsDevServer.js +0 -52
  422. package/dist/server/widgetsDevServer.js.map +0 -1
  423. package/dist/test/widget.test.js +0 -334
  424. package/dist/test/widget.test.js.map +0 -1
  425. package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -24
  426. package/dist/web/bridges/apps-sdk/adaptor.js +0 -87
  427. package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
  428. package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -48
  429. package/dist/web/bridges/mcp-app/adaptor.js +0 -268
  430. package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
  431. package/dist/web/hooks/use-widget-state.d.ts +0 -4
  432. package/dist/web/hooks/use-widget-state.js +0 -32
  433. package/dist/web/hooks/use-widget-state.js.map +0 -1
  434. package/dist/web/hooks/use-widget-state.test.js.map +0 -1
  435. package/dist/web/mount-widget.d.ts +0 -1
  436. package/dist/web/mount-widget.js.map +0 -1
  437. package/dist/web/plugin/data-llm.test.js +0 -81
  438. package/dist/web/plugin/data-llm.test.js.map +0 -1
  439. package/dist/web/plugin/plugin.d.ts +0 -2
  440. package/dist/web/plugin/plugin.js +0 -54
  441. package/dist/web/plugin/plugin.js.map +0 -1
  442. package/dist/web/plugin/transform-data-llm.d.ts +0 -12
  443. package/dist/web/plugin/transform-data-llm.js +0 -96
  444. package/dist/web/plugin/transform-data-llm.js.map +0 -1
  445. package/dist/web/plugin/transform-data-llm.test.js +0 -81
  446. package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
  447. package/dist/web/plugin/validate-widget.d.ts +0 -5
  448. package/dist/web/plugin/validate-widget.js +0 -27
  449. package/dist/web/plugin/validate-widget.js.map +0 -1
  450. package/dist/web/plugin/validate-widget.test.js +0 -42
  451. package/dist/web/plugin/validate-widget.test.js.map +0 -1
  452. /package/dist/{test/widget.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
  453. /package/dist/{web/hooks/use-widget-state.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  454. /package/dist/{web/plugin/data-llm.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  455. /package/dist/{web/plugin/transform-data-llm.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
  456. /package/dist/{web/plugin/validate-widget.test.d.ts → cli/tunnel.test.d.ts} +0 -0
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Zod schema for a host-managed file reference passed between tools and views.
4
+ *
5
+ * Use it inside a tool's `inputSchema` or `outputSchema` so the host can
6
+ * recognize the field as a file and surface attach / preview affordances.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * server.registerTool({
11
+ * name: "summarize-document",
12
+ * inputSchema: { document: FileRef },
13
+ * }, async ({ document }) => {
14
+ * const res = await fetch(document.download_url);
15
+ * // …
16
+ * });
17
+ * ```
18
+ *
19
+ * @see https://docs.skybridge.tech/api-reference/file-ref
20
+ */
21
+ export declare const FileRef: z.ZodObject<{
22
+ file_id: z.ZodString;
23
+ download_url: z.ZodString;
24
+ mime_type: z.ZodOptional<z.ZodString>;
25
+ file_name: z.ZodOptional<z.ZodString>;
26
+ }, z.core.$strip>;
27
+ /** Inferred TypeScript type for {@link FileRef}. */
28
+ export type FileRef = z.infer<typeof FileRef>;
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Zod schema for a host-managed file reference passed between tools and views.
4
+ *
5
+ * Use it inside a tool's `inputSchema` or `outputSchema` so the host can
6
+ * recognize the field as a file and surface attach / preview affordances.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * server.registerTool({
11
+ * name: "summarize-document",
12
+ * inputSchema: { document: FileRef },
13
+ * }, async ({ document }) => {
14
+ * const res = await fetch(document.download_url);
15
+ * // …
16
+ * });
17
+ * ```
18
+ *
19
+ * @see https://docs.skybridge.tech/api-reference/file-ref
20
+ */
21
+ export const FileRef = z.object({
22
+ file_id: z.string(),
23
+ download_url: z.string(),
24
+ mime_type: z.string().optional(),
25
+ file_name: z.string().optional(),
26
+ });
27
+ //# sourceMappingURL=file-ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-ref.js","sourceRoot":"","sources":["../../src/server/file-ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC","sourcesContent":["import { z } from \"zod\";\n\n/**\n * Zod schema for a host-managed file reference passed between tools and views.\n *\n * Use it inside a tool's `inputSchema` or `outputSchema` so the host can\n * recognize the field as a file and surface attach / preview affordances.\n *\n * @example\n * ```ts\n * server.registerTool({\n * name: \"summarize-document\",\n * inputSchema: { document: FileRef },\n * }, async ({ document }) => {\n * const res = await fetch(document.download_url);\n * // …\n * });\n * ```\n *\n * @see https://docs.skybridge.tech/api-reference/file-ref\n */\nexport const FileRef = z.object({\n file_id: z.string(),\n download_url: z.string(),\n mime_type: z.string().optional(),\n file_name: z.string().optional(),\n});\n\n/** Inferred TypeScript type for {@link FileRef}. */\nexport type FileRef = z.infer<typeof FileRef>;\n"]}
@@ -0,0 +1,2 @@
1
+ export type HostKind = "openai" | "claude" | "unknown";
2
+ export declare function hostFromUserAgent(userAgent: string | undefined): HostKind;
@@ -0,0 +1,11 @@
1
+ export function hostFromUserAgent(userAgent) {
2
+ const ua = (userAgent ?? "").toLowerCase();
3
+ if (ua.includes("openai") || ua.includes("chatgpt")) {
4
+ return "openai";
5
+ }
6
+ if (ua === "claude-user") {
7
+ return "claude";
8
+ }
9
+ return "unknown";
10
+ }
11
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/server/host.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,SAA6B;IAC7D,MAAM,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACpD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,EAAE,KAAK,aAAa,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["export type HostKind = \"openai\" | \"claude\" | \"unknown\";\n\nexport function hostFromUserAgent(userAgent: string | undefined): HostKind {\n const ua = (userAgent ?? \"\").toLowerCase();\n if (ua.includes(\"openai\") || ua.includes(\"chatgpt\")) {\n return \"openai\";\n }\n if (ua === \"claude-user\") {\n return \"claude\";\n }\n return \"unknown\";\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { hostFromUserAgent } from "./host.js";
3
+ describe("hostFromUserAgent", () => {
4
+ it("classifies known hosts case-insensitively and defaults to unknown", () => {
5
+ expect(hostFromUserAgent("openai-mcp/1.0")).toBe("openai");
6
+ expect(hostFromUserAgent("ChatGPT")).toBe("openai");
7
+ expect(hostFromUserAgent("claude-user")).toBe("claude");
8
+ expect(hostFromUserAgent("Claude-User/1.0")).toBe("unknown");
9
+ expect(hostFromUserAgent("Mozilla/5.0")).toBe("unknown");
10
+ expect(hostFromUserAgent(undefined)).toBe("unknown");
11
+ });
12
+ });
13
+ //# sourceMappingURL=host.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.test.js","sourceRoot":"","sources":["../../src/server/host.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { hostFromUserAgent } from \"./host.js\";\n\ndescribe(\"hostFromUserAgent\", () => {\n it(\"classifies known hosts case-insensitively and defaults to unknown\", () => {\n expect(hostFromUserAgent(\"openai-mcp/1.0\")).toBe(\"openai\");\n expect(hostFromUserAgent(\"ChatGPT\")).toBe(\"openai\");\n expect(hostFromUserAgent(\"claude-user\")).toBe(\"claude\");\n expect(hostFromUserAgent(\"Claude-User/1.0\")).toBe(\"unknown\");\n expect(hostFromUserAgent(\"Mozilla/5.0\")).toBe(\"unknown\");\n expect(hostFromUserAgent(undefined)).toBe(\"unknown\");\n });\n});\n"]}
@@ -1,5 +1,19 @@
1
+ export type { OAuthConfig } from "./auth/index.js";
2
+ export { type Auth0Claims, auth0Provider } from "./auth/providers/auth0.js";
3
+ export { authplaneProvider } from "./auth/providers/authplane.js";
4
+ export { type ClerkClaims, clerkProvider } from "./auth/providers/clerk.js";
5
+ export { customProvider } from "./auth/providers/custom.js";
6
+ export { type DescopeClaims, descopeProvider, } from "./auth/providers/descope.js";
7
+ export { type StytchClaims, stytchProvider } from "./auth/providers/stytch.js";
8
+ export { type WorkosClaims, workosProvider } from "./auth/providers/workos.js";
9
+ export { createJwksVerifier, type JwksVerifyConfig, } from "./auth/verify.js";
10
+ export { type AuthInfo, type AuthMetadataOptions, type BearerAuthMiddlewareOptions, type ExtraClaims, InvalidTokenError, mcpAuthMetadataRouter, optionalBearerAuth, requireBearerAuth, type TokenVerifier, } from "./auth.js";
11
+ export { audio, embeddedResource, image, resourceLink, text, } from "./content-helpers.js";
12
+ export { FileRef } from "./file-ref.js";
1
13
  export type { AnyToolRegistry, InferTools, ToolInput, ToolNames, ToolOutput, ToolResponseMetadata, } from "./inferUtilityTypes.js";
2
14
  export type { McpExtra, McpMethodString, McpMiddlewareFilter, McpMiddlewareFn, McpResultFor, McpTypedMiddlewareFn, McpWildcard, } from "./middleware.js";
3
- export type { McpServerTypes, ToolDef, WidgetHostType } from "./server.js";
4
- export { McpServer } from "./server.js";
5
- export { widgetsDevServer } from "./widgetsDevServer.js";
15
+ export { getToolError } from "./middleware.js";
16
+ export type { HandlerContent, JsonOptions, KnownToolMeta, McpServerTypes, SecurityScheme, SkybridgeServerOptions, ToolDef, ToolMeta, ViewConfig, ViewCsp, ViewHostType, ViewName, ViewNameRegistry, } from "./server.js";
17
+ export { __setBuildManifest, __setSkillsManifest, McpServer, normalizeContent, } from "./server.js";
18
+ export { discoverSkills, type Skill, type SkillsManifest, } from "./skills.js";
19
+ export { viewsDevServer } from "./viewsDevServer.js";
@@ -1,3 +1,16 @@
1
- export { McpServer } from "./server.js";
2
- export { widgetsDevServer } from "./widgetsDevServer.js";
1
+ export { auth0Provider } from "./auth/providers/auth0.js";
2
+ export { authplaneProvider } from "./auth/providers/authplane.js";
3
+ export { clerkProvider } from "./auth/providers/clerk.js";
4
+ export { customProvider } from "./auth/providers/custom.js";
5
+ export { descopeProvider, } from "./auth/providers/descope.js";
6
+ export { stytchProvider } from "./auth/providers/stytch.js";
7
+ export { workosProvider } from "./auth/providers/workos.js";
8
+ export { createJwksVerifier, } from "./auth/verify.js";
9
+ export { InvalidTokenError, mcpAuthMetadataRouter, optionalBearerAuth, requireBearerAuth, } from "./auth.js";
10
+ export { audio, embeddedResource, image, resourceLink, text, } from "./content-helpers.js";
11
+ export { FileRef } from "./file-ref.js";
12
+ export { getToolError } from "./middleware.js";
13
+ export { __setBuildManifest, __setSkillsManifest, McpServer, normalizeContent, } from "./server.js";
14
+ export { discoverSkills, } from "./skills.js";
15
+ export { viewsDevServer } from "./viewsDevServer.js";
3
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAoB,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAEL,eAAe,GAChB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAqB,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAqB,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EACL,kBAAkB,GAEnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAKL,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,GAElB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,KAAK,EACL,YAAY,EACZ,IAAI,GACL,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAkBxC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAgB/C,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,SAAS,EACT,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["export type { OAuthConfig } from \"./auth/index.js\";\nexport { type Auth0Claims, auth0Provider } from \"./auth/providers/auth0.js\";\nexport { authplaneProvider } from \"./auth/providers/authplane.js\";\nexport { type ClerkClaims, clerkProvider } from \"./auth/providers/clerk.js\";\nexport { customProvider } from \"./auth/providers/custom.js\";\nexport {\n type DescopeClaims,\n descopeProvider,\n} from \"./auth/providers/descope.js\";\nexport { type StytchClaims, stytchProvider } from \"./auth/providers/stytch.js\";\nexport { type WorkosClaims, workosProvider } from \"./auth/providers/workos.js\";\nexport {\n createJwksVerifier,\n type JwksVerifyConfig,\n} from \"./auth/verify.js\";\nexport {\n type AuthInfo,\n type AuthMetadataOptions,\n type BearerAuthMiddlewareOptions,\n type ExtraClaims,\n InvalidTokenError,\n mcpAuthMetadataRouter,\n optionalBearerAuth,\n requireBearerAuth,\n type TokenVerifier,\n} from \"./auth.js\";\nexport {\n audio,\n embeddedResource,\n image,\n resourceLink,\n text,\n} from \"./content-helpers.js\";\nexport { FileRef } from \"./file-ref.js\";\nexport type {\n AnyToolRegistry,\n InferTools,\n ToolInput,\n ToolNames,\n ToolOutput,\n ToolResponseMetadata,\n} from \"./inferUtilityTypes.js\";\nexport type {\n McpExtra,\n McpMethodString,\n McpMiddlewareFilter,\n McpMiddlewareFn,\n McpResultFor,\n McpTypedMiddlewareFn,\n McpWildcard,\n} from \"./middleware.js\";\nexport { getToolError } from \"./middleware.js\";\nexport type {\n HandlerContent,\n JsonOptions,\n KnownToolMeta,\n McpServerTypes,\n SecurityScheme,\n SkybridgeServerOptions,\n ToolDef,\n ToolMeta,\n ViewConfig,\n ViewCsp,\n ViewHostType,\n ViewName,\n ViewNameRegistry,\n} from \"./server.js\";\nexport {\n __setBuildManifest,\n __setSkillsManifest,\n McpServer,\n normalizeContent,\n} from \"./server.js\";\nexport {\n discoverSkills,\n type Skill,\n type SkillsManifest,\n} from \"./skills.js\";\nexport { viewsDevServer } from \"./viewsDevServer.js\";\n"]}
@@ -1,12 +1,12 @@
1
1
  import type { McpServerTypes, ToolDef } from "./server.js";
2
2
  /**
3
- * Any tool registry shape (includes both widgets and regular tools).
3
+ * Any tool registry shape (includes both views and regular tools).
4
4
  * Used as a constraint for type parameters that accept tool registries.
5
5
  */
6
6
  export type AnyToolRegistry = Record<string, ToolDef>;
7
7
  /**
8
8
  * Extract the tool registry type from an McpServer instance.
9
- * This includes both widgets (registered via widget()) and regular tools (registered via registerTool()).
9
+ * This includes both views (registered via view()) and regular tools (registered via registerTool()).
10
10
  *
11
11
  * Uses the `$types` property pattern for cross-package type inference.
12
12
  * This works across package boundaries because TypeScript uses structural typing
@@ -24,7 +24,7 @@ export type InferTools<ServerType> = ServerType extends {
24
24
  type ExtractTool<ServerType, K extends ToolNames<ServerType>> = InferTools<ServerType>[K];
25
25
  /**
26
26
  * Get a union of all tool names from an McpServer instance.
27
- * This includes both widgets and regular tools.
27
+ * This includes both views and regular tools.
28
28
  *
29
29
  * @example
30
30
  * ```ts
@@ -34,7 +34,7 @@ type ExtractTool<ServerType, K extends ToolNames<ServerType>> = InferTools<Serve
34
34
  */
35
35
  export type ToolNames<ServerType> = keyof InferTools<ServerType> & string;
36
36
  /**
37
- * Get the input type for a specific tool (widget or regular tool).
37
+ * Get the input type for a specific tool (view or regular tool).
38
38
  *
39
39
  * @example
40
40
  * ```ts
@@ -43,7 +43,7 @@ export type ToolNames<ServerType> = keyof InferTools<ServerType> & string;
43
43
  */
44
44
  export type ToolInput<ServerType, ToolName extends ToolNames<ServerType>> = ExtractTool<ServerType, ToolName>["input"];
45
45
  /**
46
- * Get the output type for a specific tool (widget or regular tool).
46
+ * Get the output type for a specific tool (view or regular tool).
47
47
  *
48
48
  * @example
49
49
  * ```ts
@@ -52,7 +52,7 @@ export type ToolInput<ServerType, ToolName extends ToolNames<ServerType>> = Extr
52
52
  */
53
53
  export type ToolOutput<ServerType, ToolName extends ToolNames<ServerType>> = ExtractTool<ServerType, ToolName>["output"];
54
54
  /**
55
- * Get the responseMetadata type for a specific tool (widget or regular tool).
55
+ * Get the responseMetadata type for a specific tool (view or regular tool).
56
56
  * This is inferred from the `_meta` property of the tool callback's return value.
57
57
  *
58
58
  * @example
@@ -1 +1 @@
1
- {"version":3,"file":"inferUtilityTypes.js","sourceRoot":"","sources":["../../src/server/inferUtilityTypes.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"inferUtilityTypes.js","sourceRoot":"","sources":["../../src/server/inferUtilityTypes.ts"],"names":[],"mappings":"","sourcesContent":["import type { McpServerTypes, ToolDef } from \"./server.js\";\n\n/**\n * Any tool registry shape (includes both views and regular tools).\n * Used as a constraint for type parameters that accept tool registries.\n */\nexport type AnyToolRegistry = Record<string, ToolDef>;\n\n/**\n * Extract the tool registry type from an McpServer instance.\n * This includes both views (registered via view()) and regular tools (registered via registerTool()).\n *\n * Uses the `$types` property pattern for cross-package type inference.\n * This works across package boundaries because TypeScript uses structural typing\n * on the shape of `$types`, rather than nominal typing on the McpServer class itself.\n *\n * @example\n * ```ts\n * type MyTools = InferTools<MyServer>;\n * // { \"search\": ToolDef<...>, \"calculate\": ToolDef<...> }\n * ```\n */\nexport type InferTools<ServerType> = ServerType extends {\n $types: McpServerTypes<infer W>;\n}\n ? W\n : never;\ntype ExtractTool<\n ServerType,\n K extends ToolNames<ServerType>,\n> = InferTools<ServerType>[K];\n\n/**\n * Get a union of all tool names from an McpServer instance.\n * This includes both views and regular tools.\n *\n * @example\n * ```ts\n * type Names = ToolNames<MyServer>;\n * // \"search\" | \"calculate\" | \"details\"\n * ```\n */\nexport type ToolNames<ServerType> = keyof InferTools<ServerType> & string;\n\n/**\n * Get the input type for a specific tool (view or regular tool).\n *\n * @example\n * ```ts\n * type SearchInput = ToolInput<MyServer, \"search\">;\n * ```\n */\nexport type ToolInput<\n ServerType,\n ToolName extends ToolNames<ServerType>,\n> = ExtractTool<ServerType, ToolName>[\"input\"];\n\n/**\n * Get the output type for a specific tool (view or regular tool).\n *\n * @example\n * ```ts\n * type SearchOutput = ToolOutput<MyServer, \"search\">;\n * ```\n */\nexport type ToolOutput<\n ServerType,\n ToolName extends ToolNames<ServerType>,\n> = ExtractTool<ServerType, ToolName>[\"output\"];\n\n/**\n * Get the responseMetadata type for a specific tool (view or regular tool).\n * This is inferred from the `_meta` property of the tool callback's return value.\n *\n * @example\n * ```ts\n * type SearchMeta = ToolResponseMetadata<MyServer, \"search\">;\n * ```\n */\nexport type ToolResponseMetadata<\n ServerType,\n ToolName extends ToolNames<ServerType>,\n> = ExtractTool<ServerType, ToolName>[\"responseMetadata\"];\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"metric.js","sourceRoot":"","sources":["../../src/server/metric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACvC,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;AAE5C,MAAM,WAAW,GAAG,gBAAgB,CAAC;AACrC,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB,IAAI,MAAM,GAA2C,IAAI,CAAC;AAE1D,SAAS,SAAS;IAChB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,SAAS,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE;QACvD,qDAAqD;IACvD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAoB,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QAC5D,2EAA2E;QAC3E,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"metric.js","sourceRoot":"","sources":["../../src/server/metric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACvC,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;AAE5C,MAAM,WAAW,GAAG,gBAAgB,CAAC;AACrC,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB,IAAI,MAAM,GAA2C,IAAI,CAAC;AAE1D,SAAS,SAAS;IAChB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,SAAS,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE;QACvD,qDAAqD;IACvD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAoB,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QAC5D,2EAA2E;QAC3E,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AAC3C,CAAC","sourcesContent":["import { createSocket } from \"node:dgram\";\nimport { isEnabled } from \"../cli/telemetry.js\";\nimport { VERSION } from \"../version.js\";\nimport type { McpMiddlewareEntry, McpMiddlewareFn } from \"./middleware.js\";\n\nfunction parseMajorMinor(version: string): string | null {\n const parts = version.split(\".\");\n if (parts.length < 2) {\n return null;\n }\n return `${parts[0]}.${parts[1]}`;\n}\n\nconst isDev = VERSION.includes(\"-dev\");\nconst versionTag = parseMajorMinor(VERSION);\n\nconst STATSD_HOST = \"18.208.242.161\";\nconst STATSD_PORT = 8125;\n\nlet socket: ReturnType<typeof createSocket> | null = null;\n\nfunction getSocket() {\n if (!socket) {\n socket = createSocket(\"udp4\");\n socket.unref();\n }\n return socket;\n}\n\nfunction sendMetric(metric: string): void {\n if (!STATSD_HOST) {\n return;\n }\n const payload = Buffer.from(metric);\n getSocket().send(payload, STATSD_PORT, STATSD_HOST, () => {\n // fire-and-forget: errors are intentionally silenced\n });\n}\n\n/**\n * Returns an internal MCP middleware entry that emits a DogStatsD counter over UDP\n * for every tool call. Enabled by default; respects the existing telemetry\n * opt-out (SKYBRIDGE_TELEMETRY_DISABLED, DO_NOT_TRACK, or `skybridge telemetry disable`).\n *\n * Returns `null` when the version string contains \"-dev\" (e.g. development\n * builds) or when the version cannot be parsed into major.minor, so that\n * malformed data does not pollute production metrics.\n *\n * Metric (DogStatsD counter format with tags):\n * Requests:1|c|#version:<major>.<minor> — every tools/call\n */\nexport function createMiddlewareEntry(): McpMiddlewareEntry | null {\n if (isDev || !versionTag) {\n return null;\n }\n\n const handler: McpMiddlewareFn = async (_req, _extra, next) => {\n // Check on every call so opt-out takes effect immediately without restart.\n if (!isEnabled()) {\n return next();\n }\n\n try {\n return await next();\n } finally {\n sendMetric(`Requests:1|c|#version:${versionTag}`);\n }\n };\n\n return { filter: \"tools/call\", handler };\n}\n"]}
@@ -1,25 +1,55 @@
1
1
  import type { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
2
  import type { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
3
3
  import type { CallToolResult, CancelTaskResult, ClientNotification, ClientRequest, CompleteResult, EmptyResult, GetPromptResult, GetTaskPayloadResult, GetTaskResult, InitializeResult, ListPromptsResult, ListResourcesResult, ListResourceTemplatesResult, ListTasksResult, ListToolsResult, ReadResourceResult, ServerNotification, ServerRequest, ServerResult } from "@modelcontextprotocol/sdk/types.js";
4
+ import type { AuthInfo, ExtraClaims } from "./auth.js";
4
5
  /**
5
6
  * The `extra` context object provided by the MCP SDK to request handlers.
6
7
  */
7
- export type McpExtra = RequestHandlerExtra<ServerRequest, ServerNotification>;
8
+ export type McpExtra<TAuthExtra extends ExtraClaims = ExtraClaims> = Omit<RequestHandlerExtra<ServerRequest, ServerNotification>, "authInfo"> & {
9
+ authInfo?: AuthInfo<TAuthExtra>;
10
+ };
8
11
  /**
9
12
  * A single MCP middleware function following the onion model.
10
13
  * Call `next()` to invoke the next middleware or the final handler.
11
14
  * For notifications, `extra` is `undefined` (SDK does not provide extra context)
12
15
  * and `next()` resolves to `undefined`.
13
16
  */
14
- export type McpMiddlewareFn = (request: {
17
+ export type McpMiddlewareFn<TAuthExtra extends ExtraClaims = ExtraClaims> = (request: {
15
18
  method: string;
16
19
  params: Record<string, unknown>;
17
- }, extra: McpExtra | undefined, next: () => Promise<unknown>) => Promise<unknown> | unknown;
20
+ }, extra: McpExtra<TAuthExtra> | undefined, next: () => Promise<unknown>) => Promise<unknown> | unknown;
21
+ export declare function captureToolError(extra: McpExtra | undefined, error: unknown): void;
22
+ /**
23
+ * Retrieve the error a tool handler threw during this request, if any.
24
+ *
25
+ * The MCP SDK catches anything a tool handler throws and turns it into an
26
+ * `isError` tool result, so `await next()` in middleware resolves normally and
27
+ * the original `Error` — stack, `cause` — is lost. Skybridge stores it on
28
+ * `extra` (never serialized to the client) so observability middleware can
29
+ * report it:
30
+ *
31
+ * ```ts
32
+ * server.mcpMiddleware("tools/call", async (request, extra, next) => {
33
+ * const result = await next();
34
+ * const error = getToolError(extra);
35
+ * if (error) {
36
+ * Sentry.captureException(error);
37
+ * }
38
+ * return result;
39
+ * });
40
+ * ```
41
+ */
42
+ export declare function getToolError(extra: McpExtra | undefined): unknown;
18
43
  /**
19
44
  * MCP methods the server handles (incoming from client).
20
45
  */
21
46
  export type McpMethodString = ClientRequest["method"] | ClientNotification["method"];
22
- /** Extract params type for a specific MCP method from SDK unions. */
47
+ /**
48
+ * Resolve the `params` type for a specific MCP method (request or notification)
49
+ * from the SDK's typed unions. Falls back to `Record<string, unknown>` for
50
+ * unknown methods. Used by {@link McpTypedMiddlewareFn} to narrow the request
51
+ * shape in typed middleware.
52
+ */
23
53
  export type McpRequestParams<M extends string> = Extract<ClientRequest, {
24
54
  method: M;
25
55
  }> extends {
@@ -29,8 +59,12 @@ export type McpRequestParams<M extends string> = Extract<ClientRequest, {
29
59
  }> extends {
30
60
  params: infer P;
31
61
  } ? P : Record<string, unknown>;
32
- /** Resolve extra type: McpExtra for requests, undefined for notifications. */
33
- export type McpExtraFor<M extends string> = M extends ClientRequest["method"] ? McpExtra : M extends ClientNotification["method"] ? undefined : McpExtra | undefined;
62
+ /**
63
+ * Resolve the `extra` arg type for a specific MCP method: {@link McpExtra} for
64
+ * request methods, `undefined` for notification methods (the SDK does not
65
+ * pass extra context for notifications).
66
+ */
67
+ export type McpExtraFor<M extends string, TAuthExtra extends ExtraClaims = ExtraClaims> = M extends ClientRequest["method"] ? McpExtra<TAuthExtra> : M extends ClientNotification["method"] ? undefined : McpExtra<TAuthExtra> | undefined;
34
68
  /** Maps each MCP request method to its SDK result type. */
35
69
  interface McpResultMap {
36
70
  ping: EmptyResult;
@@ -59,11 +93,15 @@ interface McpResultMap {
59
93
  * For unknown/unmatched methods, falls back to `ServerResult`.
60
94
  */
61
95
  export type McpResultFor<M extends string> = M extends keyof McpResultMap ? McpResultMap[M] : M extends `${infer Prefix}/*` ? [McpResultMap[keyof McpResultMap & `${Prefix}/${string}`]] extends [never] ? M extends ToWildcard<ClientNotification["method"]> ? undefined : ServerResult : McpResultMap[keyof McpResultMap & `${Prefix}/${string}`] : M extends ClientNotification["method"] ? undefined : ServerResult;
62
- /** Typed middleware fn for a specific method — narrows params, extra, and next() result. */
63
- export type McpTypedMiddlewareFn<M extends string> = (request: {
96
+ /**
97
+ * Typed middleware function for a specific method. Narrows `request.params`
98
+ * via {@link McpRequestParams}, `extra` via {@link McpExtraFor}, and the
99
+ * resolved value of `next()` via {@link McpResultFor}.
100
+ */
101
+ export type McpTypedMiddlewareFn<M extends string, TAuthExtra extends ExtraClaims = ExtraClaims> = (request: {
64
102
  method: M;
65
103
  params: McpRequestParams<M>;
66
- }, extra: McpExtraFor<M>, next: () => Promise<McpResultFor<M>>) => Promise<unknown> | unknown;
104
+ }, extra: McpExtraFor<M, TAuthExtra>, next: () => Promise<McpResultFor<M>>) => Promise<unknown> | unknown;
67
105
  /** Extracts `"prefix/*"` from `"prefix/anything"` — distributive over unions. */
68
106
  type ToWildcard<T extends string> = T extends `${infer Prefix}/${string}` ? `${Prefix}/*` : never;
69
107
  /** Wildcard prefixes derived from method strings (e.g. `"tools/*"` from `"tools/call"`). */
@@ -1,3 +1,36 @@
1
+ const TOOL_ERROR = Symbol.for("skybridge.toolError");
2
+ function toolErrorSlot(extra) {
3
+ return extra;
4
+ }
5
+ export function captureToolError(extra, error) {
6
+ const slot = toolErrorSlot(extra);
7
+ if (slot) {
8
+ slot[TOOL_ERROR] = error;
9
+ }
10
+ }
11
+ /**
12
+ * Retrieve the error a tool handler threw during this request, if any.
13
+ *
14
+ * The MCP SDK catches anything a tool handler throws and turns it into an
15
+ * `isError` tool result, so `await next()` in middleware resolves normally and
16
+ * the original `Error` — stack, `cause` — is lost. Skybridge stores it on
17
+ * `extra` (never serialized to the client) so observability middleware can
18
+ * report it:
19
+ *
20
+ * ```ts
21
+ * server.mcpMiddleware("tools/call", async (request, extra, next) => {
22
+ * const result = await next();
23
+ * const error = getToolError(extra);
24
+ * if (error) {
25
+ * Sentry.captureException(error);
26
+ * }
27
+ * return result;
28
+ * });
29
+ * ```
30
+ */
31
+ export function getToolError(extra) {
32
+ return toolErrorSlot(extra)?.[TOOL_ERROR];
33
+ }
1
34
  /**
2
35
  * Extract the TS-private `_requestHandlers` and `_notificationHandlers` maps
3
36
  * from the SDK's `Server` (extends `Protocol`). These are runtime-accessible
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport type { RequestHandlerExtra } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n CallToolResult,\n CancelTaskResult,\n ClientNotification,\n ClientRequest,\n CompleteResult,\n EmptyResult,\n GetPromptResult,\n GetTaskPayloadResult,\n GetTaskResult,\n InitializeResult,\n ListPromptsResult,\n ListResourcesResult,\n ListResourceTemplatesResult,\n ListTasksResult,\n ListToolsResult,\n ReadResourceResult,\n ServerNotification,\n ServerRequest,\n ServerResult,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { AuthInfo, ExtraClaims } from \"./auth.js\";\n\n/**\n * The `extra` context object provided by the MCP SDK to request handlers.\n */\nexport type McpExtra<TAuthExtra extends ExtraClaims = ExtraClaims> = Omit<\n RequestHandlerExtra<ServerRequest, ServerNotification>,\n \"authInfo\"\n> & {\n authInfo?: AuthInfo<TAuthExtra>;\n};\n\n/**\n * A single MCP middleware function following the onion model.\n * Call `next()` to invoke the next middleware or the final handler.\n * For notifications, `extra` is `undefined` (SDK does not provide extra context)\n * and `next()` resolves to `undefined`.\n */\nexport type McpMiddlewareFn<TAuthExtra extends ExtraClaims = ExtraClaims> = (\n request: { method: string; params: Record<string, unknown> },\n extra: McpExtra<TAuthExtra> | undefined,\n next: () => Promise<unknown>,\n) => Promise<unknown> | unknown;\n\nconst TOOL_ERROR = Symbol.for(\"skybridge.toolError\");\n\nfunction toolErrorSlot(\n extra: McpExtra | undefined,\n): Record<symbol, unknown> | undefined {\n return extra as unknown as Record<symbol, unknown> | undefined;\n}\n\nexport function captureToolError(\n extra: McpExtra | undefined,\n error: unknown,\n): void {\n const slot = toolErrorSlot(extra);\n if (slot) {\n slot[TOOL_ERROR] = error;\n }\n}\n\n/**\n * Retrieve the error a tool handler threw during this request, if any.\n *\n * The MCP SDK catches anything a tool handler throws and turns it into an\n * `isError` tool result, so `await next()` in middleware resolves normally and\n * the original `Error` — stack, `cause` — is lost. Skybridge stores it on\n * `extra` (never serialized to the client) so observability middleware can\n * report it:\n *\n * ```ts\n * server.mcpMiddleware(\"tools/call\", async (request, extra, next) => {\n * const result = await next();\n * const error = getToolError(extra);\n * if (error) {\n * Sentry.captureException(error);\n * }\n * return result;\n * });\n * ```\n */\nexport function getToolError(extra: McpExtra | undefined): unknown {\n return toolErrorSlot(extra)?.[TOOL_ERROR];\n}\n\n/**\n * MCP methods the server handles (incoming from client).\n */\nexport type McpMethodString =\n | ClientRequest[\"method\"]\n | ClientNotification[\"method\"];\n\n/**\n * Resolve the `params` type for a specific MCP method (request or notification)\n * from the SDK's typed unions. Falls back to `Record<string, unknown>` for\n * unknown methods. Used by {@link McpTypedMiddlewareFn} to narrow the request\n * shape in typed middleware.\n */\nexport type McpRequestParams<M extends string> =\n Extract<ClientRequest, { method: M }> extends { params: infer P }\n ? P\n : Extract<ClientNotification, { method: M }> extends { params: infer P }\n ? P\n : Record<string, unknown>;\n\n/**\n * Resolve the `extra` arg type for a specific MCP method: {@link McpExtra} for\n * request methods, `undefined` for notification methods (the SDK does not\n * pass extra context for notifications).\n */\nexport type McpExtraFor<\n M extends string,\n TAuthExtra extends ExtraClaims = ExtraClaims,\n> = M extends ClientRequest[\"method\"]\n ? McpExtra<TAuthExtra>\n : M extends ClientNotification[\"method\"]\n ? undefined\n : McpExtra<TAuthExtra> | undefined;\n\n/** Maps each MCP request method to its SDK result type. */\ninterface McpResultMap {\n ping: EmptyResult;\n initialize: InitializeResult;\n \"tools/list\": ListToolsResult;\n \"tools/call\": CallToolResult;\n \"resources/list\": ListResourcesResult;\n \"resources/templates/list\": ListResourceTemplatesResult;\n \"resources/read\": ReadResourceResult;\n \"resources/subscribe\": EmptyResult;\n \"resources/unsubscribe\": EmptyResult;\n \"prompts/list\": ListPromptsResult;\n \"prompts/get\": GetPromptResult;\n \"completion/complete\": CompleteResult;\n \"logging/setLevel\": EmptyResult;\n \"tasks/get\": GetTaskResult;\n \"tasks/result\": GetTaskPayloadResult;\n \"tasks/list\": ListTasksResult;\n \"tasks/cancel\": CancelTaskResult;\n}\n\n/**\n * Map an MCP method string to its corresponding result type.\n * For request methods, resolves to the specific SDK result type.\n * For wildcard patterns (e.g. `\"tools/*\"`), resolves to the union of matching result types.\n * For notification methods, resolves to `undefined`.\n * For unknown/unmatched methods, falls back to `ServerResult`.\n */\nexport type McpResultFor<M extends string> = M extends keyof McpResultMap\n ? McpResultMap[M]\n : M extends `${infer Prefix}/*`\n ? [McpResultMap[keyof McpResultMap & `${Prefix}/${string}`]] extends [never]\n ? M extends ToWildcard<ClientNotification[\"method\"]>\n ? undefined\n : ServerResult\n : McpResultMap[keyof McpResultMap & `${Prefix}/${string}`]\n : M extends ClientNotification[\"method\"]\n ? undefined\n : ServerResult;\n\n/**\n * Typed middleware function for a specific method. Narrows `request.params`\n * via {@link McpRequestParams}, `extra` via {@link McpExtraFor}, and the\n * resolved value of `next()` via {@link McpResultFor}.\n */\nexport type McpTypedMiddlewareFn<\n M extends string,\n TAuthExtra extends ExtraClaims = ExtraClaims,\n> = (\n request: { method: M; params: McpRequestParams<M> },\n extra: McpExtraFor<M, TAuthExtra>,\n next: () => Promise<McpResultFor<M>>,\n) => Promise<unknown> | unknown;\n\n/** Extracts `\"prefix/*\"` from `\"prefix/anything\"` — distributive over unions. */\ntype ToWildcard<T extends string> = T extends `${infer Prefix}/${string}`\n ? `${Prefix}/*`\n : never;\n\n/** Wildcard prefixes derived from method strings (e.g. `\"tools/*\"` from `\"tools/call\"`). */\nexport type McpWildcard = ToWildcard<McpMethodString>;\n\n/** Category keywords matching all requests or all notifications. */\ntype McpCategory = \"request\" | \"notification\";\n\n/**\n * A single filter pattern for MCP middleware:\n * - Exact method: `\"tools/call\"`\n * - Wildcard: `\"tools/*\"`\n * - Category: `\"request\"` | `\"notification\"`\n * - Escape hatch: arbitrary string via `string & {}`\n */\ntype McpMiddlewareFilterPattern =\n | McpMethodString\n | McpWildcard\n | McpCategory\n | (string & {});\n\n/**\n * Filter determining which MCP methods a middleware applies to.\n * A single pattern or an array of patterns (OR logic).\n */\nexport type McpMiddlewareFilter =\n | McpMiddlewareFilterPattern\n | McpMiddlewareFilterPattern[];\n\n/**\n * Internal entry stored for each registered middleware.\n * `filter: null` means catch-all (matches everything).\n */\nexport type McpMiddlewareEntry = {\n filter: McpMiddlewareFilter | null;\n handler: McpMiddlewareFn;\n};\n\ntype HandlerMap = Map<string, (...args: unknown[]) => Promise<unknown>>;\n\n/**\n * Extract the TS-private `_requestHandlers` and `_notificationHandlers` maps\n * from the SDK's `Server` (extends `Protocol`). These are runtime-accessible\n * but declared `private` in TypeScript.\n *\n * Validates with `instanceof Map` so an incompatible SDK version fails fast\n * instead of silently breaking.\n */\nexport function getHandlerMaps(server: Server) {\n const obj: object = server;\n\n if (\n !(\"_requestHandlers\" in obj && obj._requestHandlers instanceof Map) ||\n !(\n \"_notificationHandlers\" in obj && obj._notificationHandlers instanceof Map\n )\n ) {\n throw new Error(\n \"Incompatible MCP SDK version: expected _requestHandlers and _notificationHandlers on Server\",\n );\n }\n\n return {\n requestHandlers: obj._requestHandlers as HandlerMap,\n notificationHandlers: obj._notificationHandlers as HandlerMap,\n };\n}\n\n/**\n * Check if a single filter pattern matches a given method.\n *\n * - Exact: `\"tools/call\"` matches only `\"tools/call\"`\n * - Wildcard: `\"tools/*\"` matches any method starting with `\"tools/\"`\n * - Category `\"request\"`: matches when `isNotification` is false\n * - Category `\"notification\"`: matches when `isNotification` is true\n */\nexport function matchesFilter(\n method: string,\n filter: string,\n isNotification: boolean,\n): boolean {\n if (filter === \"request\") {\n return !isNotification;\n }\n if (filter === \"notification\") {\n return isNotification;\n }\n if (filter.endsWith(\"/*\")) {\n const prefix = filter.slice(0, -1); // \"tools/*\" → \"tools/\"\n return method.startsWith(prefix);\n }\n return method === filter;\n}\n\nfunction matchesAnyFilter(\n method: string,\n filter: McpMiddlewareFilter | null,\n isNotification: boolean,\n): boolean {\n if (filter === null) {\n return true;\n }\n if (typeof filter === \"string\") {\n return matchesFilter(method, filter, isNotification);\n }\n return filter.some((pattern) =>\n matchesFilter(method, pattern, isNotification),\n );\n}\n\n/**\n * Build an onion-model middleware chain for a specific method.\n *\n * Filters `entries` to those matching `method`, then composes them\n * so the first registered middleware is the outermost layer.\n * `next()` is guarded against multiple calls within a single middleware.\n */\nexport function buildMiddlewareChain(\n method: string,\n isNotification: boolean,\n originalHandler: (...args: unknown[]) => Promise<unknown>,\n entries: McpMiddlewareEntry[],\n) {\n const applicable = entries.filter((entry) =>\n matchesAnyFilter(method, entry.filter, isNotification),\n );\n\n if (applicable.length === 0) {\n return originalHandler;\n }\n\n return (...args: unknown[]) => {\n const rawRequest = args[0] as Record<string, unknown> | undefined;\n // SDK calls request handlers as handler(request, extra) but\n // notification handlers as handler(notification) — no extra arg.\n const extra = isNotification ? undefined : (args[1] as McpExtra);\n const mcpRequest = {\n method,\n params: (rawRequest?.params as Record<string, unknown>) ?? {},\n };\n\n let index = 0;\n\n const executeLayer = (): Promise<unknown> => {\n const entry = applicable[index++];\n if (!entry) {\n if (rawRequest) {\n rawRequest.params = mcpRequest.params;\n }\n return originalHandler(...args);\n }\n\n let nextCalled = false;\n\n const next = (): Promise<unknown> => {\n if (nextCalled) {\n throw new Error(\n `next() called multiple times in middleware for \"${method}\"`,\n );\n }\n nextCalled = true;\n return executeLayer();\n };\n\n return Promise.resolve(entry.handler(mcpRequest, extra, next));\n };\n\n return executeLayer();\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.test-d.js","sourceRoot":"","sources":["../../src/server/middleware.test-d.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.test-d.js","sourceRoot":"","sources":["../../src/server/middleware.test-d.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CallToolResult,\n ListToolsResult,\n ServerResult,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { expectTypeOf, test } from \"vitest\";\nimport type {\n McpExtra,\n McpResultFor,\n McpTypedMiddlewareFn,\n} from \"./middleware.js\";\nimport type { McpServer } from \"./server.js\";\n\nconst server = null as unknown as McpServer;\n\ntest(\"request category narrows extra and next() result\", () => {\n server.mcpMiddleware(\"request\", async (_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<McpExtra>();\n extra.signal;\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<ServerResult>();\n return result;\n });\n});\n\ntest(\"notification category narrows extra and next() result\", () => {\n server.mcpMiddleware(\"notification\", async (_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<undefined>();\n // @ts-expect-error extra is undefined, cannot access .signal\n extra.signal;\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<undefined>();\n });\n});\n\ntest(\"exact method tools/call narrows params, extra, and next() result\", () => {\n server.mcpMiddleware(\"tools/call\", async (request, extra, next) => {\n expectTypeOf(request.params.name).toBeString();\n expectTypeOf(extra).toEqualTypeOf<McpExtra>();\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<CallToolResult>();\n return result;\n });\n});\n\ntest(\"exact method tools/list narrows next() to ListToolsResult\", () => {\n server.mcpMiddleware(\"tools/list\", async (_request, _extra, next) => {\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<ListToolsResult>();\n return result;\n });\n});\n\ntest(\"exact notification method narrows extra and next() result\", () => {\n server.mcpMiddleware(\n \"notifications/initialized\",\n async (_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<undefined>();\n // @ts-expect-error extra is undefined\n extra.signal;\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<undefined>();\n },\n );\n});\n\ntest(\"McpTypedMiddlewareFn narrows params, extra, and next() per method\", () => {\n expectTypeOf<\n Parameters<McpTypedMiddlewareFn<\"tools/call\">>[0][\"params\"][\"name\"]\n >().toBeString();\n expectTypeOf<\n Parameters<McpTypedMiddlewareFn<\"tools/call\">>[1]\n >().toEqualTypeOf<McpExtra>();\n expectTypeOf<\n Parameters<McpTypedMiddlewareFn<\"notifications/initialized\">>[1]\n >().toEqualTypeOf<undefined>();\n expectTypeOf<\n ReturnType<Parameters<McpTypedMiddlewareFn<\"tools/list\">>[2]>\n >().toEqualTypeOf<Promise<ListToolsResult>>();\n expectTypeOf<\n ReturnType<Parameters<McpTypedMiddlewareFn<\"notifications/initialized\">>[2]>\n >().toEqualTypeOf<Promise<undefined>>();\n});\n\ntest(\"McpResultFor maps methods to correct result types\", () => {\n expectTypeOf<McpResultFor<\"tools/list\">>().toEqualTypeOf<ListToolsResult>();\n expectTypeOf<McpResultFor<\"tools/call\">>().toEqualTypeOf<CallToolResult>();\n expectTypeOf<\n McpResultFor<\"notifications/initialized\">\n >().toEqualTypeOf<undefined>();\n});\n\ntest(\"wildcard tools/* narrows next() to union of tools result types\", () => {\n server.mcpMiddleware(\"tools/*\", async (_request, _extra, next) => {\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<ListToolsResult | CallToolResult>();\n return result;\n });\n});\n\ntest(\"McpResultFor resolves wildcards to union of matching result types\", () => {\n expectTypeOf<McpResultFor<\"tools/*\">>().toEqualTypeOf<\n ListToolsResult | CallToolResult\n >();\n});\n\ntest(\"catch-all middleware has no narrowing on extra or params\", () => {\n server.mcpMiddleware((_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<McpExtra | undefined>();\n expectTypeOf(_request.params).toEqualTypeOf<Record<string, unknown>>();\n return next();\n });\n});\n"]}
@@ -2,7 +2,7 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
2
  import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
3
3
  import { describe, expect, it, vi } from "vitest";
4
4
  import { z } from "zod";
5
- import { buildMiddlewareChain, getHandlerMaps, matchesFilter, } from "./middleware.js";
5
+ import { buildMiddlewareChain, getHandlerMaps, getToolError, matchesFilter, } from "./middleware.js";
6
6
  import { McpServer } from "./server.js";
7
7
  // ---------------------------------------------------------------------------
8
8
  // matchesFilter
@@ -216,7 +216,8 @@ describe("McpServer.mcpMiddleware()", () => {
216
216
  let capturedMethod = "";
217
217
  let capturedParams = {};
218
218
  const server = new McpServer({ name: "test", version: "1.0.0" });
219
- server.registerTool("greet", {
219
+ server.registerTool({
220
+ name: "greet",
220
221
  description: "greet",
221
222
  inputSchema: { name: z.string() },
222
223
  }, (args) => ({
@@ -247,7 +248,7 @@ describe("McpServer.mcpMiddleware()", () => {
247
248
  it("array filter works", async () => {
248
249
  const matchedMethods = [];
249
250
  const server = new McpServer({ name: "test", version: "1.0.0" });
250
- server.registerTool("t1", { description: "t1" }, () => ({
251
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
251
252
  content: [{ type: "text", text: "ok" }],
252
253
  }));
253
254
  server.mcpMiddleware(["tools/call", "tools/list"], async (request, _extra, next) => {
@@ -280,7 +281,7 @@ describe("McpServer.mcpMiddleware()", () => {
280
281
  it("catch-all middleware + filtered middleware stack correctly", async () => {
281
282
  const calls = [];
282
283
  const server = new McpServer({ name: "test", version: "1.0.0" });
283
- server.registerTool("t1", { description: "t1" }, () => ({
284
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
284
285
  content: [{ type: "text", text: "ok" }],
285
286
  }));
286
287
  server
@@ -313,7 +314,7 @@ describe("McpServer.mcpMiddleware()", () => {
313
314
  it("notification middleware receives extra as undefined", async () => {
314
315
  let capturedExtra = "sentinel";
315
316
  const server = new McpServer({ name: "test", version: "1.0.0" });
316
- server.registerTool("t1", { description: "t1" }, () => ({
317
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
317
318
  content: [{ type: "text", text: "ok" }],
318
319
  }));
319
320
  server.mcpMiddleware("notification", async (_request, extra, next) => {
@@ -333,7 +334,7 @@ describe("McpServer.mcpMiddleware()", () => {
333
334
  it("wildcard filter intercepts matching methods only", async () => {
334
335
  const matchedMethods = [];
335
336
  const server = new McpServer({ name: "test", version: "1.0.0" });
336
- server.registerTool("t1", { description: "t1" }, () => ({
337
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
337
338
  content: [{ type: "text", text: "ok" }],
338
339
  }));
339
340
  server.mcpMiddleware("tools/*", async (request, _extra, next) => {
@@ -356,7 +357,8 @@ describe("McpServer.mcpMiddleware()", () => {
356
357
  });
357
358
  it("middleware can modify tool result via McpServer integration", async () => {
358
359
  const server = new McpServer({ name: "test", version: "1.0.0" });
359
- server.registerTool("greet", {
360
+ server.registerTool({
361
+ name: "greet",
360
362
  description: "greet",
361
363
  inputSchema: { name: z.string() },
362
364
  }, (args) => ({
@@ -390,7 +392,7 @@ describe("McpServer.mcpMiddleware()", () => {
390
392
  it("middleware can short-circuit via McpServer integration", async () => {
391
393
  const handlerCalled = vi.fn();
392
394
  const server = new McpServer({ name: "test", version: "1.0.0" });
393
- server.registerTool("t1", { description: "t1" }, () => {
395
+ server.registerTool({ name: "t1", description: "t1" }, () => {
394
396
  handlerCalled();
395
397
  return {
396
398
  content: [{ type: "text", text: "original" }],
@@ -409,10 +411,47 @@ describe("McpServer.mcpMiddleware()", () => {
409
411
  await client.close();
410
412
  await server.close();
411
413
  });
414
+ it("exposes a thrown tool error to middleware via getToolError", async () => {
415
+ const schemaError = new Error("boom with schema");
416
+ const schemalessError = new Error("boom without schema");
417
+ let captured;
418
+ const server = new McpServer({ name: "test", version: "1.0.0" });
419
+ server.registerTool({
420
+ name: "withSchema",
421
+ description: "withSchema",
422
+ inputSchema: { name: z.string() },
423
+ }, () => {
424
+ throw schemaError;
425
+ });
426
+ server.registerTool({ name: "withoutSchema", description: "withoutSchema" }, () => {
427
+ throw schemalessError;
428
+ });
429
+ server.mcpMiddleware("tools/call", async (_request, extra, next) => {
430
+ const result = await next();
431
+ captured = getToolError(extra);
432
+ return result;
433
+ });
434
+ const client = createClient();
435
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
436
+ await server.connect(serverTransport);
437
+ await client.connect(clientTransport);
438
+ const withSchema = await client.callTool({
439
+ name: "withSchema",
440
+ arguments: { name: "World" },
441
+ });
442
+ expect(withSchema.isError).toBe(true);
443
+ expect(captured).toBe(schemaError);
444
+ const withoutSchema = await client.callTool({ name: "withoutSchema" });
445
+ expect(withoutSchema.isError).toBe(true);
446
+ expect(captured).toBe(schemalessError);
447
+ await client.close();
448
+ await server.close();
449
+ });
412
450
  it("middleware can mutate tool call params via McpServer integration", async () => {
413
451
  let receivedName = "";
414
452
  const server = new McpServer({ name: "test", version: "1.0.0" });
415
- server.registerTool("greet", {
453
+ server.registerTool({
454
+ name: "greet",
416
455
  description: "greet",
417
456
  inputSchema: { name: z.string() },
418
457
  }, (args) => {
@@ -440,7 +479,7 @@ describe("McpServer.mcpMiddleware()", () => {
440
479
  it("category 'request' filter matches requests but not notifications", async () => {
441
480
  const matchedMethods = [];
442
481
  const server = new McpServer({ name: "test", version: "1.0.0" });
443
- server.registerTool("t1", { description: "t1" }, () => ({
482
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
444
483
  content: [{ type: "text", text: "ok" }],
445
484
  }));
446
485
  server.mcpMiddleware("request", async (request, _extra, next) => {