@vibesdotdev/mcp 0.0.0-stage → 1.0.0-rc.1

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 (602) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +96 -2
  3. package/dist/adapters/auth-middleware.d.ts +68 -0
  4. package/dist/adapters/auth-middleware.d.ts.map +1 -0
  5. package/dist/adapters/auth-middleware.js +161 -0
  6. package/dist/adapters/auth-middleware.js.map +1 -0
  7. package/dist/adapters/compatibility.d.ts +20 -0
  8. package/dist/adapters/compatibility.d.ts.map +1 -0
  9. package/dist/adapters/compatibility.js +57 -0
  10. package/dist/adapters/compatibility.js.map +1 -0
  11. package/dist/adapters/host-context.consumer.d.ts +12 -0
  12. package/dist/adapters/host-context.consumer.d.ts.map +1 -0
  13. package/dist/adapters/host-context.consumer.js +10 -0
  14. package/dist/adapters/host-context.consumer.js.map +1 -0
  15. package/dist/adapters/host-context.d.ts +32 -0
  16. package/dist/adapters/host-context.d.ts.map +1 -0
  17. package/dist/adapters/host-context.js +17 -0
  18. package/dist/adapters/host-context.js.map +1 -0
  19. package/dist/adapters/index.d.ts +12 -0
  20. package/dist/adapters/index.d.ts.map +1 -0
  21. package/dist/adapters/index.js +13 -0
  22. package/dist/adapters/index.js.map +1 -0
  23. package/dist/adapters/mcp/ambient-envelope.d.ts +26 -0
  24. package/dist/adapters/mcp/ambient-envelope.d.ts.map +1 -0
  25. package/dist/adapters/mcp/ambient-envelope.js +70 -0
  26. package/dist/adapters/mcp/ambient-envelope.js.map +1 -0
  27. package/dist/adapters/mcp/catalog.d.ts +15 -0
  28. package/dist/adapters/mcp/catalog.d.ts.map +1 -0
  29. package/dist/adapters/mcp/catalog.js +26 -0
  30. package/dist/adapters/mcp/catalog.js.map +1 -0
  31. package/dist/adapters/mcp/connection-identity.d.ts +81 -0
  32. package/dist/adapters/mcp/connection-identity.d.ts.map +1 -0
  33. package/dist/adapters/mcp/connection-identity.js +114 -0
  34. package/dist/adapters/mcp/connection-identity.js.map +1 -0
  35. package/dist/adapters/mcp/context.d.ts +137 -0
  36. package/dist/adapters/mcp/context.d.ts.map +1 -0
  37. package/dist/adapters/mcp/context.js +230 -0
  38. package/dist/adapters/mcp/context.js.map +1 -0
  39. package/dist/adapters/mcp/formatters.d.ts +41 -0
  40. package/dist/adapters/mcp/formatters.d.ts.map +1 -0
  41. package/dist/adapters/mcp/formatters.js +102 -0
  42. package/dist/adapters/mcp/formatters.js.map +1 -0
  43. package/dist/adapters/mcp/from-api-endpoint.d.ts +59 -0
  44. package/dist/adapters/mcp/from-api-endpoint.d.ts.map +1 -0
  45. package/dist/adapters/mcp/from-api-endpoint.js +206 -0
  46. package/dist/adapters/mcp/from-api-endpoint.js.map +1 -0
  47. package/dist/adapters/mcp/generation-contract.d.ts +5 -0
  48. package/dist/adapters/mcp/generation-contract.d.ts.map +1 -0
  49. package/dist/adapters/mcp/generation-contract.js +34 -0
  50. package/dist/adapters/mcp/generation-contract.js.map +1 -0
  51. package/dist/adapters/mcp/host-registry.d.ts +159 -0
  52. package/dist/adapters/mcp/host-registry.d.ts.map +1 -0
  53. package/dist/adapters/mcp/host-registry.js +237 -0
  54. package/dist/adapters/mcp/host-registry.js.map +1 -0
  55. package/dist/adapters/mcp/index.d.ts +12 -0
  56. package/dist/adapters/mcp/index.d.ts.map +1 -0
  57. package/dist/adapters/mcp/index.js +17 -0
  58. package/dist/adapters/mcp/index.js.map +1 -0
  59. package/dist/adapters/mcp/isolated-notice.d.ts +111 -0
  60. package/dist/adapters/mcp/isolated-notice.d.ts.map +1 -0
  61. package/dist/adapters/mcp/isolated-notice.js +217 -0
  62. package/dist/adapters/mcp/isolated-notice.js.map +1 -0
  63. package/dist/adapters/mcp/json-rpc.d.ts +16 -0
  64. package/dist/adapters/mcp/json-rpc.d.ts.map +1 -0
  65. package/dist/adapters/mcp/json-rpc.js +32 -0
  66. package/dist/adapters/mcp/json-rpc.js.map +1 -0
  67. package/dist/adapters/mcp/local-origin.d.ts +18 -0
  68. package/dist/adapters/mcp/local-origin.d.ts.map +1 -0
  69. package/dist/adapters/mcp/local-origin.js +37 -0
  70. package/dist/adapters/mcp/local-origin.js.map +1 -0
  71. package/dist/adapters/mcp/logging/mcp-cloud.descriptor.d.ts +11 -0
  72. package/dist/adapters/mcp/logging/mcp-cloud.descriptor.d.ts.map +1 -0
  73. package/dist/adapters/mcp/logging/mcp-cloud.descriptor.js +21 -0
  74. package/dist/adapters/mcp/logging/mcp-cloud.descriptor.js.map +1 -0
  75. package/dist/adapters/mcp/logging/mcp-http.descriptor.d.ts +10 -0
  76. package/dist/adapters/mcp/logging/mcp-http.descriptor.d.ts.map +1 -0
  77. package/dist/adapters/mcp/logging/mcp-http.descriptor.js +20 -0
  78. package/dist/adapters/mcp/logging/mcp-http.descriptor.js.map +1 -0
  79. package/dist/adapters/mcp/logging/mcp-server.descriptor.d.ts +9 -0
  80. package/dist/adapters/mcp/logging/mcp-server.descriptor.d.ts.map +1 -0
  81. package/dist/adapters/mcp/logging/mcp-server.descriptor.js +25 -0
  82. package/dist/adapters/mcp/logging/mcp-server.descriptor.js.map +1 -0
  83. package/dist/adapters/mcp/logging/mcp-stdio.descriptor.d.ts +10 -0
  84. package/dist/adapters/mcp/logging/mcp-stdio.descriptor.d.ts.map +1 -0
  85. package/dist/adapters/mcp/logging/mcp-stdio.descriptor.js +20 -0
  86. package/dist/adapters/mcp/logging/mcp-stdio.descriptor.js.map +1 -0
  87. package/dist/adapters/mcp/mcp-http-session.d.ts +140 -0
  88. package/dist/adapters/mcp/mcp-http-session.d.ts.map +1 -0
  89. package/dist/adapters/mcp/mcp-http-session.js +797 -0
  90. package/dist/adapters/mcp/mcp-http-session.js.map +1 -0
  91. package/dist/adapters/mcp/mcp-wire-name.d.ts +9 -0
  92. package/dist/adapters/mcp/mcp-wire-name.d.ts.map +1 -0
  93. package/dist/adapters/mcp/mcp-wire-name.js +52 -0
  94. package/dist/adapters/mcp/mcp-wire-name.js.map +1 -0
  95. package/dist/adapters/mcp/projection-doctor.d.ts +101 -0
  96. package/dist/adapters/mcp/projection-doctor.d.ts.map +1 -0
  97. package/dist/adapters/mcp/projection-doctor.js +285 -0
  98. package/dist/adapters/mcp/projection-doctor.js.map +1 -0
  99. package/dist/adapters/mcp/projection.d.ts +36 -0
  100. package/dist/adapters/mcp/projection.d.ts.map +1 -0
  101. package/dist/adapters/mcp/projection.js +136 -0
  102. package/dist/adapters/mcp/projection.js.map +1 -0
  103. package/dist/adapters/mcp/prompts/continuity-wake.prompt.descriptor.d.ts +113 -0
  104. package/dist/adapters/mcp/prompts/continuity-wake.prompt.descriptor.d.ts.map +1 -0
  105. package/dist/adapters/mcp/prompts/continuity-wake.prompt.descriptor.js +15 -0
  106. package/dist/adapters/mcp/prompts/continuity-wake.prompt.descriptor.js.map +1 -0
  107. package/dist/adapters/mcp/prompts/empty-tool-kind.prompt.descriptor.d.ts +113 -0
  108. package/dist/adapters/mcp/prompts/empty-tool-kind.prompt.descriptor.d.ts.map +1 -0
  109. package/dist/adapters/mcp/prompts/empty-tool-kind.prompt.descriptor.js +18 -0
  110. package/dist/adapters/mcp/prompts/empty-tool-kind.prompt.descriptor.js.map +1 -0
  111. package/dist/adapters/mcp/prompts/index.d.ts +113 -0
  112. package/dist/adapters/mcp/prompts/index.d.ts.map +1 -0
  113. package/dist/adapters/mcp/prompts/index.js +24 -0
  114. package/dist/adapters/mcp/prompts/index.js.map +1 -0
  115. package/dist/adapters/mcp/prompts/isolated-runtime.prompt.descriptor.d.ts +114 -0
  116. package/dist/adapters/mcp/prompts/isolated-runtime.prompt.descriptor.d.ts.map +1 -0
  117. package/dist/adapters/mcp/prompts/isolated-runtime.prompt.descriptor.js +37 -0
  118. package/dist/adapters/mcp/prompts/isolated-runtime.prompt.descriptor.js.map +1 -0
  119. package/dist/adapters/mcp/prompts/local-tools.prompt.descriptor.d.ts +113 -0
  120. package/dist/adapters/mcp/prompts/local-tools.prompt.descriptor.d.ts.map +1 -0
  121. package/dist/adapters/mcp/prompts/local-tools.prompt.descriptor.js +20 -0
  122. package/dist/adapters/mcp/prompts/local-tools.prompt.descriptor.js.map +1 -0
  123. package/dist/adapters/mcp/prompts/max-tools.prompt.descriptor.d.ts +113 -0
  124. package/dist/adapters/mcp/prompts/max-tools.prompt.descriptor.d.ts.map +1 -0
  125. package/dist/adapters/mcp/prompts/max-tools.prompt.descriptor.js +20 -0
  126. package/dist/adapters/mcp/prompts/max-tools.prompt.descriptor.js.map +1 -0
  127. package/dist/adapters/mcp/prompts/private-runtime.prompt.descriptor.d.ts +114 -0
  128. package/dist/adapters/mcp/prompts/private-runtime.prompt.descriptor.d.ts.map +1 -0
  129. package/dist/adapters/mcp/prompts/private-runtime.prompt.descriptor.js +21 -0
  130. package/dist/adapters/mcp/prompts/private-runtime.prompt.descriptor.js.map +1 -0
  131. package/dist/adapters/mcp/prompts/registration-failure.prompt.descriptor.d.ts +113 -0
  132. package/dist/adapters/mcp/prompts/registration-failure.prompt.descriptor.d.ts.map +1 -0
  133. package/dist/adapters/mcp/prompts/registration-failure.prompt.descriptor.js +19 -0
  134. package/dist/adapters/mcp/prompts/registration-failure.prompt.descriptor.js.map +1 -0
  135. package/dist/adapters/mcp/prompts/required-checklist.prompt.descriptor.d.ts +113 -0
  136. package/dist/adapters/mcp/prompts/required-checklist.prompt.descriptor.d.ts.map +1 -0
  137. package/dist/adapters/mcp/prompts/required-checklist.prompt.descriptor.js +18 -0
  138. package/dist/adapters/mcp/prompts/required-checklist.prompt.descriptor.js.map +1 -0
  139. package/dist/adapters/mcp/prompts/required-tools-missing.prompt.descriptor.d.ts +113 -0
  140. package/dist/adapters/mcp/prompts/required-tools-missing.prompt.descriptor.d.ts.map +1 -0
  141. package/dist/adapters/mcp/prompts/required-tools-missing.prompt.descriptor.js +19 -0
  142. package/dist/adapters/mcp/prompts/required-tools-missing.prompt.descriptor.js.map +1 -0
  143. package/dist/adapters/mcp/prompts/unknown-client.prompt.descriptor.d.ts +113 -0
  144. package/dist/adapters/mcp/prompts/unknown-client.prompt.descriptor.d.ts.map +1 -0
  145. package/dist/adapters/mcp/prompts/unknown-client.prompt.descriptor.js +18 -0
  146. package/dist/adapters/mcp/prompts/unknown-client.prompt.descriptor.js.map +1 -0
  147. package/dist/adapters/mcp/request-context.d.ts +28 -0
  148. package/dist/adapters/mcp/request-context.d.ts.map +1 -0
  149. package/dist/adapters/mcp/request-context.js +49 -0
  150. package/dist/adapters/mcp/request-context.js.map +1 -0
  151. package/dist/adapters/mcp/roster-announcer.d.ts +3 -0
  152. package/dist/adapters/mcp/roster-announcer.d.ts.map +1 -0
  153. package/dist/adapters/mcp/roster-announcer.js +22 -0
  154. package/dist/adapters/mcp/roster-announcer.js.map +1 -0
  155. package/dist/adapters/mcp/sampling-context.d.ts +12 -0
  156. package/dist/adapters/mcp/sampling-context.d.ts.map +1 -0
  157. package/dist/adapters/mcp/sampling-context.js +30 -0
  158. package/dist/adapters/mcp/sampling-context.js.map +1 -0
  159. package/dist/adapters/mcp/sampling.d.ts +17 -0
  160. package/dist/adapters/mcp/sampling.d.ts.map +1 -0
  161. package/dist/adapters/mcp/sampling.js +43 -0
  162. package/dist/adapters/mcp/sampling.js.map +1 -0
  163. package/dist/adapters/mcp/schemas/index.d.ts +37 -0
  164. package/dist/adapters/mcp/schemas/index.d.ts.map +1 -0
  165. package/dist/adapters/mcp/schemas/index.js +5 -0
  166. package/dist/adapters/mcp/schemas/index.js.map +1 -0
  167. package/dist/adapters/mcp/schemas/tool-selection.d.ts +12 -0
  168. package/dist/adapters/mcp/schemas/tool-selection.d.ts.map +1 -0
  169. package/dist/adapters/mcp/schemas/tool-selection.js +2 -0
  170. package/dist/adapters/mcp/schemas/tool-selection.js.map +1 -0
  171. package/dist/adapters/mcp/serve-identity.d.ts +64 -0
  172. package/dist/adapters/mcp/serve-identity.d.ts.map +1 -0
  173. package/dist/adapters/mcp/serve-identity.js +220 -0
  174. package/dist/adapters/mcp/serve-identity.js.map +1 -0
  175. package/dist/adapters/mcp/server.consumer.d.ts +5 -0
  176. package/dist/adapters/mcp/server.consumer.d.ts.map +1 -0
  177. package/dist/adapters/mcp/server.consumer.js +300 -0
  178. package/dist/adapters/mcp/server.consumer.js.map +1 -0
  179. package/dist/adapters/mcp/server.d.ts +56 -0
  180. package/dist/adapters/mcp/server.d.ts.map +1 -0
  181. package/dist/adapters/mcp/server.js +1423 -0
  182. package/dist/adapters/mcp/server.js.map +1 -0
  183. package/dist/adapters/mcp/stale-body.consumer.d.ts +85 -0
  184. package/dist/adapters/mcp/stale-body.consumer.d.ts.map +1 -0
  185. package/dist/adapters/mcp/stale-body.consumer.js +183 -0
  186. package/dist/adapters/mcp/stale-body.consumer.js.map +1 -0
  187. package/dist/adapters/mcp/startup-refusal.d.ts +8 -0
  188. package/dist/adapters/mcp/startup-refusal.d.ts.map +1 -0
  189. package/dist/adapters/mcp/startup-refusal.js +141 -0
  190. package/dist/adapters/mcp/startup-refusal.js.map +1 -0
  191. package/dist/adapters/mcp/stdio-relay.d.ts +232 -0
  192. package/dist/adapters/mcp/stdio-relay.d.ts.map +1 -0
  193. package/dist/adapters/mcp/stdio-relay.js +1169 -0
  194. package/dist/adapters/mcp/stdio-relay.js.map +1 -0
  195. package/dist/adapters/mcp/tool-audit-live.d.ts +109 -0
  196. package/dist/adapters/mcp/tool-audit-live.d.ts.map +1 -0
  197. package/dist/adapters/mcp/tool-audit-live.js +538 -0
  198. package/dist/adapters/mcp/tool-audit-live.js.map +1 -0
  199. package/dist/adapters/mcp/tool-audit.d.ts +44 -0
  200. package/dist/adapters/mcp/tool-audit.d.ts.map +1 -0
  201. package/dist/adapters/mcp/tool-audit.js +168 -0
  202. package/dist/adapters/mcp/tool-audit.js.map +1 -0
  203. package/dist/adapters/mcp/tool-catalog.d.ts +179 -0
  204. package/dist/adapters/mcp/tool-catalog.d.ts.map +1 -0
  205. package/dist/adapters/mcp/tool-catalog.js +330 -0
  206. package/dist/adapters/mcp/tool-catalog.js.map +1 -0
  207. package/dist/adapters/mcp/tool-selection.d.ts +77 -0
  208. package/dist/adapters/mcp/tool-selection.d.ts.map +1 -0
  209. package/dist/adapters/mcp/tool-selection.js +266 -0
  210. package/dist/adapters/mcp/tool-selection.js.map +1 -0
  211. package/dist/adapters/mcp/transport-registry.d.ts +5 -0
  212. package/dist/adapters/mcp/transport-registry.d.ts.map +1 -0
  213. package/dist/adapters/mcp/transport-registry.js +13 -0
  214. package/dist/adapters/mcp/transport-registry.js.map +1 -0
  215. package/dist/adapters/mcp/trust-tag.d.ts +69 -0
  216. package/dist/adapters/mcp/trust-tag.d.ts.map +1 -0
  217. package/dist/adapters/mcp/trust-tag.js +120 -0
  218. package/dist/adapters/mcp/trust-tag.js.map +1 -0
  219. package/dist/adapters/mcp/vibes-types.d.ts +115 -0
  220. package/dist/adapters/mcp/vibes-types.d.ts.map +1 -0
  221. package/dist/adapters/mcp/vibes-types.js +7 -0
  222. package/dist/adapters/mcp/vibes-types.js.map +1 -0
  223. package/dist/adapters/mcp/web-handler.d.ts +49 -0
  224. package/dist/adapters/mcp/web-handler.d.ts.map +1 -0
  225. package/dist/adapters/mcp/web-handler.js +129 -0
  226. package/dist/adapters/mcp/web-handler.js.map +1 -0
  227. package/dist/adapters/session-id.d.ts +3 -0
  228. package/dist/adapters/session-id.d.ts.map +1 -0
  229. package/dist/adapters/session-id.js +42 -0
  230. package/dist/adapters/session-id.js.map +1 -0
  231. package/dist/adapters/transport-bun-http.d.ts +39 -0
  232. package/dist/adapters/transport-bun-http.d.ts.map +1 -0
  233. package/dist/adapters/transport-bun-http.js +42 -0
  234. package/dist/adapters/transport-bun-http.js.map +1 -0
  235. package/dist/adapters/types.d.ts +135 -0
  236. package/dist/adapters/types.d.ts.map +1 -0
  237. package/dist/adapters/types.js +2 -0
  238. package/dist/adapters/types.js.map +1 -0
  239. package/dist/adapters/web-compatibility.d.ts +6 -0
  240. package/dist/adapters/web-compatibility.d.ts.map +1 -0
  241. package/dist/adapters/web-compatibility.js +13 -0
  242. package/dist/adapters/web-compatibility.js.map +1 -0
  243. package/dist/adapters/zod-mcp.d.ts +139 -0
  244. package/dist/adapters/zod-mcp.d.ts.map +1 -0
  245. package/dist/adapters/zod-mcp.js +617 -0
  246. package/dist/adapters/zod-mcp.js.map +1 -0
  247. package/dist/cli/mcp/audit/dev.audit.tools.descriptor.d.ts +15 -0
  248. package/dist/cli/mcp/audit/dev.audit.tools.descriptor.d.ts.map +1 -0
  249. package/dist/cli/mcp/audit/dev.audit.tools.descriptor.js +58 -0
  250. package/dist/cli/mcp/audit/dev.audit.tools.descriptor.js.map +1 -0
  251. package/dist/cli/mcp/audit/dev.audit.tools.impl.consumer.d.ts +6 -0
  252. package/dist/cli/mcp/audit/dev.audit.tools.impl.consumer.d.ts.map +1 -0
  253. package/dist/cli/mcp/audit/dev.audit.tools.impl.consumer.js +180 -0
  254. package/dist/cli/mcp/audit/dev.audit.tools.impl.consumer.js.map +1 -0
  255. package/dist/cli/mcp/lifecycle/dev.mcp.restart.descriptor.d.ts +22 -0
  256. package/dist/cli/mcp/lifecycle/dev.mcp.restart.descriptor.d.ts.map +1 -0
  257. package/dist/cli/mcp/lifecycle/dev.mcp.restart.descriptor.js +19 -0
  258. package/dist/cli/mcp/lifecycle/dev.mcp.restart.descriptor.js.map +1 -0
  259. package/dist/cli/mcp/lifecycle/dev.mcp.restart.impl.consumer.d.ts +23 -0
  260. package/dist/cli/mcp/lifecycle/dev.mcp.restart.impl.consumer.d.ts.map +1 -0
  261. package/dist/cli/mcp/lifecycle/dev.mcp.restart.impl.consumer.js +41 -0
  262. package/dist/cli/mcp/lifecycle/dev.mcp.restart.impl.consumer.js.map +1 -0
  263. package/dist/cli/mcp/lifecycle/dev.mcp.serve.descriptor.d.ts +75 -0
  264. package/dist/cli/mcp/lifecycle/dev.mcp.serve.descriptor.d.ts.map +1 -0
  265. package/dist/cli/mcp/lifecycle/dev.mcp.serve.descriptor.js +84 -0
  266. package/dist/cli/mcp/lifecycle/dev.mcp.serve.descriptor.js.map +1 -0
  267. package/dist/cli/mcp/lifecycle/dev.mcp.start.descriptor.d.ts +35 -0
  268. package/dist/cli/mcp/lifecycle/dev.mcp.start.descriptor.d.ts.map +1 -0
  269. package/dist/cli/mcp/lifecycle/dev.mcp.start.descriptor.js +28 -0
  270. package/dist/cli/mcp/lifecycle/dev.mcp.start.descriptor.js.map +1 -0
  271. package/dist/cli/mcp/lifecycle/dev.mcp.start.impl.consumer.d.ts +11 -0
  272. package/dist/cli/mcp/lifecycle/dev.mcp.start.impl.consumer.d.ts.map +1 -0
  273. package/dist/cli/mcp/lifecycle/dev.mcp.start.impl.consumer.js +47 -0
  274. package/dist/cli/mcp/lifecycle/dev.mcp.start.impl.consumer.js.map +1 -0
  275. package/dist/cli/mcp/lifecycle/dev.mcp.stop.descriptor.d.ts +18 -0
  276. package/dist/cli/mcp/lifecycle/dev.mcp.stop.descriptor.d.ts.map +1 -0
  277. package/dist/cli/mcp/lifecycle/dev.mcp.stop.descriptor.js +18 -0
  278. package/dist/cli/mcp/lifecycle/dev.mcp.stop.descriptor.js.map +1 -0
  279. package/dist/cli/mcp/lifecycle/dev.mcp.stop.impl.consumer.d.ts +12 -0
  280. package/dist/cli/mcp/lifecycle/dev.mcp.stop.impl.consumer.d.ts.map +1 -0
  281. package/dist/cli/mcp/lifecycle/dev.mcp.stop.impl.consumer.js +17 -0
  282. package/dist/cli/mcp/lifecycle/dev.mcp.stop.impl.consumer.js.map +1 -0
  283. package/dist/cli/mcp/management/dev.mcp.install.descriptor.d.ts +41 -0
  284. package/dist/cli/mcp/management/dev.mcp.install.descriptor.d.ts.map +1 -0
  285. package/dist/cli/mcp/management/dev.mcp.install.descriptor.js +49 -0
  286. package/dist/cli/mcp/management/dev.mcp.install.descriptor.js.map +1 -0
  287. package/dist/cli/mcp/management/dev.mcp.install.impl.consumer.d.ts +16 -0
  288. package/dist/cli/mcp/management/dev.mcp.install.impl.consumer.d.ts.map +1 -0
  289. package/dist/cli/mcp/management/dev.mcp.install.impl.consumer.js +244 -0
  290. package/dist/cli/mcp/management/dev.mcp.install.impl.consumer.js.map +1 -0
  291. package/dist/cli/mcp/management/dev.mcp.list.descriptor.d.ts +22 -0
  292. package/dist/cli/mcp/management/dev.mcp.list.descriptor.d.ts.map +1 -0
  293. package/dist/cli/mcp/management/dev.mcp.list.descriptor.js +24 -0
  294. package/dist/cli/mcp/management/dev.mcp.list.descriptor.js.map +1 -0
  295. package/dist/cli/mcp/management/dev.mcp.list.impl.consumer.d.ts +29 -0
  296. package/dist/cli/mcp/management/dev.mcp.list.impl.consumer.d.ts.map +1 -0
  297. package/dist/cli/mcp/management/dev.mcp.list.impl.consumer.js +127 -0
  298. package/dist/cli/mcp/management/dev.mcp.list.impl.consumer.js.map +1 -0
  299. package/dist/cli/mcp/management/dev.mcp.status.descriptor.d.ts +48 -0
  300. package/dist/cli/mcp/management/dev.mcp.status.descriptor.d.ts.map +1 -0
  301. package/dist/cli/mcp/management/dev.mcp.status.descriptor.js +56 -0
  302. package/dist/cli/mcp/management/dev.mcp.status.descriptor.js.map +1 -0
  303. package/dist/cli/mcp/management/dev.mcp.status.impl.consumer.d.ts +9 -0
  304. package/dist/cli/mcp/management/dev.mcp.status.impl.consumer.d.ts.map +1 -0
  305. package/dist/cli/mcp/management/dev.mcp.status.impl.consumer.js +253 -0
  306. package/dist/cli/mcp/management/dev.mcp.status.impl.consumer.js.map +1 -0
  307. package/dist/cli/mcp/management/install-helpers.d.ts +26 -0
  308. package/dist/cli/mcp/management/install-helpers.d.ts.map +1 -0
  309. package/dist/cli/mcp/management/install-helpers.js +95 -0
  310. package/dist/cli/mcp/management/install-helpers.js.map +1 -0
  311. package/dist/cli/mcp/management/process-audit.impl.consumer.d.ts +38 -0
  312. package/dist/cli/mcp/management/process-audit.impl.consumer.d.ts.map +1 -0
  313. package/dist/cli/mcp/management/process-audit.impl.consumer.js +145 -0
  314. package/dist/cli/mcp/management/process-audit.impl.consumer.js.map +1 -0
  315. package/dist/cli/mcp/management/rules-debt-summary.impl.consumer.d.ts +21 -0
  316. package/dist/cli/mcp/management/rules-debt-summary.impl.consumer.d.ts.map +1 -0
  317. package/dist/cli/mcp/management/rules-debt-summary.impl.consumer.js +82 -0
  318. package/dist/cli/mcp/management/rules-debt-summary.impl.consumer.js.map +1 -0
  319. package/dist/cli/mcp/management/status-doctor.d.ts +22 -0
  320. package/dist/cli/mcp/management/status-doctor.d.ts.map +1 -0
  321. package/dist/cli/mcp/management/status-doctor.js +153 -0
  322. package/dist/cli/mcp/management/status-doctor.js.map +1 -0
  323. package/dist/cli/mcp/schemas/status-doctor.d.ts +75 -0
  324. package/dist/cli/mcp/schemas/status-doctor.d.ts.map +1 -0
  325. package/dist/cli/mcp/schemas/status-doctor.js +2 -0
  326. package/dist/cli/mcp/schemas/status-doctor.js.map +1 -0
  327. package/dist/cli/mcp/support/host-port.d.ts +31 -0
  328. package/dist/cli/mcp/support/host-port.d.ts.map +1 -0
  329. package/dist/cli/mcp/support/host-port.js +31 -0
  330. package/dist/cli/mcp/support/host-port.js.map +1 -0
  331. package/dist/cli/mcp/support/server-process.impl.consumer.d.ts +24 -0
  332. package/dist/cli/mcp/support/server-process.impl.consumer.d.ts.map +1 -0
  333. package/dist/cli/mcp/support/server-process.impl.consumer.js +86 -0
  334. package/dist/cli/mcp/support/server-process.impl.consumer.js.map +1 -0
  335. package/dist/cli/mcp/support/status-doctor.d.ts +33 -0
  336. package/dist/cli/mcp/support/status-doctor.d.ts.map +1 -0
  337. package/dist/cli/mcp/support/status-doctor.js +104 -0
  338. package/dist/cli/mcp/support/status-doctor.js.map +1 -0
  339. package/dist/cli/print.d.ts +12 -0
  340. package/dist/cli/print.d.ts.map +1 -0
  341. package/dist/cli/print.js +25 -0
  342. package/dist/cli/print.js.map +1 -0
  343. package/dist/cli/surface-mcp/client-connection-identity.consumer.d.ts +19 -0
  344. package/dist/cli/surface-mcp/client-connection-identity.consumer.d.ts.map +1 -0
  345. package/dist/cli/surface-mcp/client-connection-identity.consumer.js +53 -0
  346. package/dist/cli/surface-mcp/client-connection-identity.consumer.js.map +1 -0
  347. package/dist/cli/surface-mcp/dev.mcp.serve.impl.cloud.d.ts +7 -0
  348. package/dist/cli/surface-mcp/dev.mcp.serve.impl.cloud.d.ts.map +1 -0
  349. package/dist/cli/surface-mcp/dev.mcp.serve.impl.cloud.js +345 -0
  350. package/dist/cli/surface-mcp/dev.mcp.serve.impl.cloud.js.map +1 -0
  351. package/dist/cli/surface-mcp/dev.mcp.serve.impl.consumer.d.ts +12 -0
  352. package/dist/cli/surface-mcp/dev.mcp.serve.impl.consumer.d.ts.map +1 -0
  353. package/dist/cli/surface-mcp/dev.mcp.serve.impl.consumer.js +657 -0
  354. package/dist/cli/surface-mcp/dev.mcp.serve.impl.consumer.js.map +1 -0
  355. package/dist/cli/surface-mcp/local-dev-flag.d.ts +24 -0
  356. package/dist/cli/surface-mcp/local-dev-flag.d.ts.map +1 -0
  357. package/dist/cli/surface-mcp/local-dev-flag.js +37 -0
  358. package/dist/cli/surface-mcp/local-dev-flag.js.map +1 -0
  359. package/dist/cli/surface-mcp/shared-host-startup.d.ts +14 -0
  360. package/dist/cli/surface-mcp/shared-host-startup.d.ts.map +1 -0
  361. package/dist/cli/surface-mcp/shared-host-startup.js +46 -0
  362. package/dist/cli/surface-mcp/shared-host-startup.js.map +1 -0
  363. package/dist/cli/surface-mcp/stdio-relay-transport.d.ts +2 -0
  364. package/dist/cli/surface-mcp/stdio-relay-transport.d.ts.map +1 -0
  365. package/dist/cli/surface-mcp/stdio-relay-transport.js +21 -0
  366. package/dist/cli/surface-mcp/stdio-relay-transport.js.map +1 -0
  367. package/dist/cli/surface-mcp/teardown.d.ts +17 -0
  368. package/dist/cli/surface-mcp/teardown.d.ts.map +1 -0
  369. package/dist/cli/surface-mcp/teardown.js +28 -0
  370. package/dist/cli/surface-mcp/teardown.js.map +1 -0
  371. package/dist/client.d.ts +49 -0
  372. package/dist/client.d.ts.map +1 -0
  373. package/dist/client.js +131 -0
  374. package/dist/client.js.map +1 -0
  375. package/dist/config/load.d.ts +6 -0
  376. package/dist/config/load.d.ts.map +1 -0
  377. package/dist/config/load.js +18 -0
  378. package/dist/config/load.js.map +1 -0
  379. package/dist/config/mcp.config.descriptor.d.ts +108 -0
  380. package/dist/config/mcp.config.descriptor.d.ts.map +1 -0
  381. package/dist/config/mcp.config.descriptor.js +63 -0
  382. package/dist/config/mcp.config.descriptor.js.map +1 -0
  383. package/dist/docs/mcp.docs.descriptor.d.ts +4 -0
  384. package/dist/docs/mcp.docs.descriptor.d.ts.map +1 -0
  385. package/dist/docs/mcp.docs.descriptor.js +44 -0
  386. package/dist/docs/mcp.docs.descriptor.js.map +1 -0
  387. package/dist/docs/prompts.docs.descriptor.d.ts +4 -0
  388. package/dist/docs/prompts.docs.descriptor.d.ts.map +1 -0
  389. package/dist/docs/prompts.docs.descriptor.js +130 -0
  390. package/dist/docs/prompts.docs.descriptor.js.map +1 -0
  391. package/dist/docs/resources.docs.descriptor.d.ts +4 -0
  392. package/dist/docs/resources.docs.descriptor.d.ts.map +1 -0
  393. package/dist/docs/resources.docs.descriptor.js +390 -0
  394. package/dist/docs/resources.docs.descriptor.js.map +1 -0
  395. package/dist/docs/server.docs.descriptor.d.ts +4 -0
  396. package/dist/docs/server.docs.descriptor.d.ts.map +1 -0
  397. package/dist/docs/server.docs.descriptor.js +383 -0
  398. package/dist/docs/server.docs.descriptor.js.map +1 -0
  399. package/dist/docs/tools.docs.descriptor.d.ts +4 -0
  400. package/dist/docs/tools.docs.descriptor.d.ts.map +1 -0
  401. package/dist/docs/tools.docs.descriptor.js +316 -0
  402. package/dist/docs/tools.docs.descriptor.js.map +1 -0
  403. package/dist/harness-identity.descriptors.d.ts +11 -0
  404. package/dist/harness-identity.descriptors.d.ts.map +1 -0
  405. package/dist/harness-identity.descriptors.js +41 -0
  406. package/dist/harness-identity.descriptors.js.map +1 -0
  407. package/dist/index.d.ts +36 -0
  408. package/dist/index.d.ts.map +1 -0
  409. package/dist/index.js +36 -0
  410. package/dist/index.js.map +1 -0
  411. package/dist/kinds/harness-identity.kind.d.ts +3 -0
  412. package/dist/kinds/harness-identity.kind.d.ts.map +1 -0
  413. package/dist/kinds/harness-identity.kind.js +16 -0
  414. package/dist/kinds/harness-identity.kind.js.map +1 -0
  415. package/dist/kinds/sampling.kind.d.ts +15 -0
  416. package/dist/kinds/sampling.kind.d.ts.map +1 -0
  417. package/dist/kinds/sampling.kind.js +24 -0
  418. package/dist/kinds/sampling.kind.js.map +1 -0
  419. package/dist/lifecycle-repeat.d.ts +23 -0
  420. package/dist/lifecycle-repeat.d.ts.map +1 -0
  421. package/dist/lifecycle-repeat.js +21 -0
  422. package/dist/lifecycle-repeat.js.map +1 -0
  423. package/dist/mcp/dev.mcp.descriptor.d.ts +18 -0
  424. package/dist/mcp/dev.mcp.descriptor.d.ts.map +1 -0
  425. package/dist/mcp/dev.mcp.descriptor.js +18 -0
  426. package/dist/mcp/dev.mcp.descriptor.js.map +1 -0
  427. package/dist/mcp/index.d.ts +20 -0
  428. package/dist/mcp/index.d.ts.map +1 -0
  429. package/dist/mcp/index.js +19 -0
  430. package/dist/mcp/index.js.map +1 -0
  431. package/dist/mcp/mcp.plugin.d.ts +9 -0
  432. package/dist/mcp/mcp.plugin.d.ts.map +1 -0
  433. package/dist/mcp/mcp.plugin.js +59 -0
  434. package/dist/mcp/mcp.plugin.js.map +1 -0
  435. package/dist/mcp-client.plugin.d.ts +4 -0
  436. package/dist/mcp-client.plugin.d.ts.map +1 -0
  437. package/dist/mcp-client.plugin.js +13 -0
  438. package/dist/mcp-client.plugin.js.map +1 -0
  439. package/dist/mcp.client.descriptor.d.ts +27 -0
  440. package/dist/mcp.client.descriptor.d.ts.map +1 -0
  441. package/dist/mcp.client.descriptor.js +7 -0
  442. package/dist/mcp.client.descriptor.js.map +1 -0
  443. package/dist/mcp.consumer.plugin.d.ts +4 -0
  444. package/dist/mcp.consumer.plugin.d.ts.map +1 -0
  445. package/dist/mcp.consumer.plugin.js +19 -0
  446. package/dist/mcp.consumer.plugin.js.map +1 -0
  447. package/dist/mcp.runtime.plugin.d.ts +10 -0
  448. package/dist/mcp.runtime.plugin.d.ts.map +1 -0
  449. package/dist/mcp.runtime.plugin.js +40 -0
  450. package/dist/mcp.runtime.plugin.js.map +1 -0
  451. package/dist/root-state.d.ts +3 -0
  452. package/dist/root-state.d.ts.map +1 -0
  453. package/dist/root-state.js +3 -0
  454. package/dist/root-state.js.map +1 -0
  455. package/dist/schemas/api-endpoint.d.ts +12 -0
  456. package/dist/schemas/api-endpoint.d.ts.map +1 -0
  457. package/dist/schemas/api-endpoint.js +11 -0
  458. package/dist/schemas/api-endpoint.js.map +1 -0
  459. package/dist/schemas/audit.d.ts +172 -0
  460. package/dist/schemas/audit.d.ts.map +1 -0
  461. package/dist/schemas/audit.js +82 -0
  462. package/dist/schemas/audit.js.map +1 -0
  463. package/dist/schemas/harness-identity.d.ts +41 -0
  464. package/dist/schemas/harness-identity.d.ts.map +1 -0
  465. package/dist/schemas/harness-identity.js +19 -0
  466. package/dist/schemas/harness-identity.js.map +1 -0
  467. package/dist/schemas/host-adapters.d.ts +14 -0
  468. package/dist/schemas/host-adapters.d.ts.map +1 -0
  469. package/dist/schemas/host-adapters.js +7 -0
  470. package/dist/schemas/host-adapters.js.map +1 -0
  471. package/dist/schemas/projection.d.ts +10 -0
  472. package/dist/schemas/projection.d.ts.map +1 -0
  473. package/dist/schemas/projection.js +9 -0
  474. package/dist/schemas/projection.js.map +1 -0
  475. package/dist/schemas/tool.d.ts +8 -0
  476. package/dist/schemas/tool.d.ts.map +1 -0
  477. package/dist/schemas/tool.js +8 -0
  478. package/dist/schemas/tool.js.map +1 -0
  479. package/dist/surface-mcp/build-provenance.d.ts +67 -0
  480. package/dist/surface-mcp/build-provenance.d.ts.map +1 -0
  481. package/dist/surface-mcp/build-provenance.js +287 -0
  482. package/dist/surface-mcp/build-provenance.js.map +1 -0
  483. package/dist/surface-mcp/crash-reporting.d.ts +28 -0
  484. package/dist/surface-mcp/crash-reporting.d.ts.map +1 -0
  485. package/dist/surface-mcp/crash-reporting.js +41 -0
  486. package/dist/surface-mcp/crash-reporting.js.map +1 -0
  487. package/dist/surface-mcp/executable-freshness-watch.d.ts +89 -0
  488. package/dist/surface-mcp/executable-freshness-watch.d.ts.map +1 -0
  489. package/dist/surface-mcp/executable-freshness-watch.js +225 -0
  490. package/dist/surface-mcp/executable-freshness-watch.js.map +1 -0
  491. package/dist/surface-mcp/host-provenance-banner.d.ts +49 -0
  492. package/dist/surface-mcp/host-provenance-banner.d.ts.map +1 -0
  493. package/dist/surface-mcp/host-provenance-banner.js +135 -0
  494. package/dist/surface-mcp/host-provenance-banner.js.map +1 -0
  495. package/dist/surface-mcp/index.d.ts +51 -0
  496. package/dist/surface-mcp/index.d.ts.map +1 -0
  497. package/dist/surface-mcp/index.js +92 -0
  498. package/dist/surface-mcp/index.js.map +1 -0
  499. package/dist/surface-mcp/local-tools-bootstrap.d.ts +36 -0
  500. package/dist/surface-mcp/local-tools-bootstrap.d.ts.map +1 -0
  501. package/dist/surface-mcp/local-tools-bootstrap.js +43 -0
  502. package/dist/surface-mcp/local-tools-bootstrap.js.map +1 -0
  503. package/dist/surface-mcp/mcp-serve.plugin.d.ts +9 -0
  504. package/dist/surface-mcp/mcp-serve.plugin.d.ts.map +1 -0
  505. package/dist/surface-mcp/mcp-serve.plugin.js +24 -0
  506. package/dist/surface-mcp/mcp-serve.plugin.js.map +1 -0
  507. package/dist/surface-mcp/project-config.d.ts +35 -0
  508. package/dist/surface-mcp/project-config.d.ts.map +1 -0
  509. package/dist/surface-mcp/project-config.js +74 -0
  510. package/dist/surface-mcp/project-config.js.map +1 -0
  511. package/dist/surface-mcp/serve-lifecycle.d.ts +102 -0
  512. package/dist/surface-mcp/serve-lifecycle.d.ts.map +1 -0
  513. package/dist/surface-mcp/serve-lifecycle.js +343 -0
  514. package/dist/surface-mcp/serve-lifecycle.js.map +1 -0
  515. package/dist/surface-mcp/session-bridge.d.ts +18 -0
  516. package/dist/surface-mcp/session-bridge.d.ts.map +1 -0
  517. package/dist/surface-mcp/session-bridge.js +26 -0
  518. package/dist/surface-mcp/session-bridge.js.map +1 -0
  519. package/dist/surface-mcp/subscriptions/session.bound.workspace.descriptor.d.ts +13 -0
  520. package/dist/surface-mcp/subscriptions/session.bound.workspace.descriptor.d.ts.map +1 -0
  521. package/dist/surface-mcp/subscriptions/session.bound.workspace.descriptor.js +13 -0
  522. package/dist/surface-mcp/subscriptions/session.bound.workspace.descriptor.js.map +1 -0
  523. package/dist/surface-mcp/subscriptions/session.bound.workspace.impl.consumer.d.ts +11 -0
  524. package/dist/surface-mcp/subscriptions/session.bound.workspace.impl.consumer.d.ts.map +1 -0
  525. package/dist/surface-mcp/subscriptions/session.bound.workspace.impl.consumer.js +36 -0
  526. package/dist/surface-mcp/subscriptions/session.bound.workspace.impl.consumer.js.map +1 -0
  527. package/dist/surface-mcp/workspace-warning.d.ts +16 -0
  528. package/dist/surface-mcp/workspace-warning.d.ts.map +1 -0
  529. package/dist/surface-mcp/workspace-warning.js +44 -0
  530. package/dist/surface-mcp/workspace-warning.js.map +1 -0
  531. package/dist/svelte/index.d.ts +12 -0
  532. package/dist/svelte/index.d.ts.map +1 -0
  533. package/dist/svelte/index.js +11 -0
  534. package/dist/svelte/mcp-svelte.plugin.d.ts +10 -0
  535. package/dist/svelte/mcp-svelte.plugin.d.ts.map +1 -0
  536. package/dist/svelte/mcp-svelte.plugin.js +24 -0
  537. package/dist/svelte/tool-widgets/VibesContextToolCard.svelte +91 -0
  538. package/dist/svelte/tool-widgets/VibesContextToolCard.svelte.d.ts +9 -0
  539. package/dist/svelte/tool-widgets/VibesContextToolCard.svelte.d.ts.map +1 -0
  540. package/dist/svelte/tool-widgets/index.d.ts +3 -0
  541. package/dist/svelte/tool-widgets/index.d.ts.map +1 -0
  542. package/dist/svelte/tool-widgets/index.js +2 -0
  543. package/dist/svelte/tool-widgets/summary.d.ts +48 -0
  544. package/dist/svelte/tool-widgets/summary.d.ts.map +1 -0
  545. package/dist/svelte/tool-widgets/summary.js +117 -0
  546. package/dist/tools/vibes-context/schemas.d.ts +85 -0
  547. package/dist/tools/vibes-context/schemas.d.ts.map +1 -0
  548. package/dist/tools/vibes-context/schemas.js +76 -0
  549. package/dist/tools/vibes-context/schemas.js.map +1 -0
  550. package/dist/tools/vibes-context/vibes-context.descriptor.d.ts +4 -0
  551. package/dist/tools/vibes-context/vibes-context.descriptor.d.ts.map +1 -0
  552. package/dist/tools/vibes-context/vibes-context.descriptor.js +30 -0
  553. package/dist/tools/vibes-context/vibes-context.descriptor.js.map +1 -0
  554. package/dist/tools/vibes-context/vibes-context.impl.d.ts +34 -0
  555. package/dist/tools/vibes-context/vibes-context.impl.d.ts.map +1 -0
  556. package/dist/tools/vibes-context/vibes-context.impl.js +207 -0
  557. package/dist/tools/vibes-context/vibes-context.impl.js.map +1 -0
  558. package/dist/tui/index.d.ts +4 -0
  559. package/dist/tui/index.d.ts.map +1 -0
  560. package/dist/tui/index.js +4 -0
  561. package/dist/tui/index.js.map +1 -0
  562. package/dist/tui/mcp-health.d.ts +7 -0
  563. package/dist/tui/mcp-health.d.ts.map +1 -0
  564. package/dist/tui/mcp-health.js +16 -0
  565. package/dist/tui/mcp-health.js.map +1 -0
  566. package/dist/tui/mcp-tui.plugin.d.ts +3 -0
  567. package/dist/tui/mcp-tui.plugin.d.ts.map +1 -0
  568. package/dist/tui/mcp-tui.plugin.js +18 -0
  569. package/dist/tui/mcp-tui.plugin.js.map +1 -0
  570. package/dist/tui/mcp.tui-app.descriptor.d.ts +4 -0
  571. package/dist/tui/mcp.tui-app.descriptor.d.ts.map +1 -0
  572. package/dist/tui/mcp.tui-app.descriptor.js +19 -0
  573. package/dist/tui/mcp.tui-app.descriptor.js.map +1 -0
  574. package/dist/tui/mcp.tui-app.impl.consumer.d.ts +4 -0
  575. package/dist/tui/mcp.tui-app.impl.consumer.d.ts.map +1 -0
  576. package/dist/tui/mcp.tui-app.impl.consumer.js +48 -0
  577. package/dist/tui/mcp.tui-app.impl.consumer.js.map +1 -0
  578. package/dist/tui/mcp.tui-state.descriptor.d.ts +8 -0
  579. package/dist/tui/mcp.tui-state.descriptor.d.ts.map +1 -0
  580. package/dist/tui/mcp.tui-state.descriptor.js +37 -0
  581. package/dist/tui/mcp.tui-state.descriptor.js.map +1 -0
  582. package/dist/tui/mcp.tui-state.impl.consumer.d.ts +5 -0
  583. package/dist/tui/mcp.tui-state.impl.consumer.d.ts.map +1 -0
  584. package/dist/tui/mcp.tui-state.impl.consumer.js +97 -0
  585. package/dist/tui/mcp.tui-state.impl.consumer.js.map +1 -0
  586. package/dist/tui/mcp.tui-state.key.d.ts +45 -0
  587. package/dist/tui/mcp.tui-state.key.d.ts.map +1 -0
  588. package/dist/tui/mcp.tui-state.key.js +25 -0
  589. package/dist/tui/mcp.tui-state.key.js.map +1 -0
  590. package/dist/types.core.d.ts +25 -0
  591. package/dist/types.core.d.ts.map +1 -0
  592. package/dist/types.core.js +8 -0
  593. package/dist/types.core.js.map +1 -0
  594. package/dist/types.d.ts +71 -0
  595. package/dist/types.d.ts.map +1 -0
  596. package/dist/types.js +2 -0
  597. package/dist/types.js.map +1 -0
  598. package/dist/types.registry.d.ts +93 -0
  599. package/dist/types.registry.d.ts.map +1 -0
  600. package/dist/types.registry.js +32 -0
  601. package/dist/types.registry.js.map +1 -0
  602. package/package.json +323 -4
@@ -0,0 +1,797 @@
1
+ import { rpcMessage, jsonRpcError, jsonRpcRequestId } from "./json-rpc.js";
2
+ export { jsonRpcError, jsonRpcRequestId } from "./json-rpc.js";
3
+ /**
4
+ * Shared MCP streamable HTTP session handler (Bun.serve and serverless isolate hosts).
5
+ */
6
+ import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
7
+ import { CaughtFailureSchema, isCapabilityError, settle, settleNow, valueFreeFailure } from '@vibesdotdev/kernel';
8
+ import { JsonObjectSchema, JsonValueSchema } from '@vibesdotdev/kernel/schemas/json';
9
+ import * as z from 'zod/v4';
10
+ import { resolveSessionIdFromWebHeaders } from "../session-id.js";
11
+ import { wrapTransportWithSchemaTightening } from "../zod-mcp.js";
12
+ import { MCP_WORKSPACE_HEADER, parseMcpRequestScope, runWithMcpRequestScope } from "./request-context.js";
13
+ import { connectionIdentityFromMeta, RELAY_ATTESTATION_SOURCE } from "./connection-identity.js";
14
+ import { agentForClientName } from "./serve-identity.js";
15
+ const InitializeParamsSchema = z.object({
16
+ clientInfo: z.object({
17
+ name: z.string(),
18
+ version: z.string().optional().catch(undefined)
19
+ }).loose(),
20
+ _meta: JsonObjectSchema.optional().catch(undefined)
21
+ }).loose();
22
+ const InitializeMessageSchema = z.object({
23
+ method: z.literal('initialize'),
24
+ params: InitializeParamsSchema
25
+ }).loose();
26
+ /** The first JSON-RPC message: a batch's first element, or the body itself. */
27
+ function jsonString(value) {
28
+ const parsed = z.string().safeParse(value);
29
+ return parsed.success ? parsed.data : undefined;
30
+ }
31
+ function initializeParams(body) {
32
+ const parsed = InitializeMessageSchema.safeParse(rpcMessage(body));
33
+ if (!parsed.success)
34
+ return undefined;
35
+ return { clientInfo: parsed.data.params.clientInfo, _meta: parsed.data.params._meta };
36
+ }
37
+ /**
38
+ * The connection an `initialize` opens. `attested` is whether it presented the
39
+ * host's relay secret. An attested relay declares its launch identity in
40
+ * `_meta` (and a harness clientInfo name implies its agent); that identity is
41
+ * verified. Any other loopback client's `_meta` identity stays a declaration,
42
+ * which admission refuses, and its clientInfo name implies nothing: only
43
+ * verified identity reaches the connection's clientInfo, which session binding
44
+ * reads.
45
+ */
46
+ function initializeConnection(body, attested, source) {
47
+ const params = initializeParams(body);
48
+ if (!params)
49
+ return {};
50
+ const declared = connectionIdentityFromMeta(params._meta);
51
+ const impliedAgent = attested && !declared?.agentId ? agentForClientName(source, params.clientInfo.name) : undefined;
52
+ const identity = impliedAgent
53
+ ? Object.freeze({ ...declared, agentId: impliedAgent })
54
+ : declared;
55
+ const verified = attested && identity ? Object.freeze({ source: RELAY_ATTESTATION_SOURCE, caller: identity }) : undefined;
56
+ return {
57
+ identity: identity || undefined,
58
+ verified: verified || undefined,
59
+ clientInfo: {
60
+ name: params.clientInfo.name,
61
+ version: params.clientInfo.version,
62
+ agentId: verified?.caller.agentId || undefined,
63
+ harnessSessionId: verified?.caller.harnessSessionId || undefined
64
+ }
65
+ };
66
+ }
67
+ /**
68
+ * SESSION POOL SIZING — why these numbers, and what the old ones cost.
69
+ *
70
+ * This host serves two client shapes at once. Short-lived ones (the external
71
+ * hooks runner) handshake, call one tool, and `DELETE` — verified: a DELETE
72
+ * does terminate the session and the count drops. Long-lived ones (an agent's
73
+ * interactive MCP client) attach for hours and are IDLE most of that time,
74
+ * because an agent spends its time thinking, not calling tools.
75
+ *
76
+ * A 50-session cap with LRU eviction is exactly wrong for that mix: "least
77
+ * recently active" selects the interactive clients — the hook sessions are
78
+ * always the freshest thing in the pool. Measured on this machine over 53 h of
79
+ * uptime: 7,291 sessions opened, 483 cap evictions. Each one silently killed a
80
+ * live agent's session; every later request on it then failed, permanently,
81
+ * with no recovery path. That is a coordination outage, and AGENT-CONSTITUTION
82
+ * names a failing coordination surface the highest-priority defect there is.
83
+ *
84
+ * So: the cap becomes a backstop rather than a routine event (256), idle TTL
85
+ * does the reclaiming (halved to 2 h, swept every minute instead of every
86
+ * five), and a session that was active in the last minute is never sacrificed
87
+ * to admit a new one — the host refuses the new session instead, which is a
88
+ * loud, recoverable failure on a client that is still connected and retrying,
89
+ * not a silent one on a client that has merely gone quiet.
90
+ */
91
+ const DEFAULT_MAX_SESSIONS = 256;
92
+ const DEFAULT_SESSION_TTL_MS = 2 * 60 * 60 * 1000;
93
+ const DEFAULT_MIN_EVICTION_IDLE_MS = 60 * 1000;
94
+ const SESSION_SWEEP_INTERVAL_MS = 60 * 1000;
95
+ const DEFAULT_DURABLE_RESTORE_DEADLINE_MS = 15 * 1000;
96
+ /**
97
+ * A session's SSE streams write a keep-alive comment this often. The Bun
98
+ * listener closes a quiet connection on Bun.serve's default 10 s idleTimeout,
99
+ * checked on a coarse timer, so a cut can land from about 8 s. The SDK's
100
+ * default interval is 15 s, so a relay's quiet notification stream was cut
101
+ * before its first frame and every relay lost its host about every 10 s.
102
+ */
103
+ const SSE_KEEP_ALIVE_MS = 5 * 1000;
104
+ const InitializeRequestSchema = z.object({
105
+ jsonrpc: z.literal('2.0'),
106
+ method: z.literal('initialize')
107
+ }).loose();
108
+ function isInitializeRequest(body) {
109
+ return InitializeRequestSchema.safeParse(body).success;
110
+ }
111
+ /**
112
+ * Session lifecycle binds cross SQLite-backed participant/session authority.
113
+ * Serialize both the current receipt replay and the legacy authored-init replay
114
+ * used by already-running relays from before the durable receipt cutover. An
115
+ * exact status join is also a bind, even when an older relay lacks receiptOnly.
116
+ * Ordinary tools and ambient status reads never enter this lane.
117
+ */
118
+ const SessionArgumentsSchema = z.object({
119
+ action: z.string().optional(),
120
+ sessionId: JsonValueSchema.optional(),
121
+ participantId: JsonValueSchema.optional(),
122
+ receiptOnly: JsonValueSchema.optional(),
123
+ newSession: JsonValueSchema.optional()
124
+ }).loose();
125
+ const SessionCallSchema = z.object({
126
+ method: z.string(),
127
+ params: z.object({
128
+ name: z.string(),
129
+ arguments: SessionArgumentsSchema.optional()
130
+ }).loose()
131
+ }).loose();
132
+ function sessionCall(body) {
133
+ const parsed = SessionCallSchema.safeParse(rpcMessage(body));
134
+ return parsed.success ? parsed.data : undefined;
135
+ }
136
+ function isDurableSessionRestoreRequest(body) {
137
+ const candidate = sessionCall(body);
138
+ const args = candidate?.params.arguments;
139
+ return (candidate?.method === 'tools/call' &&
140
+ candidate.params.name === 'session' &&
141
+ (args?.action === 'init' ||
142
+ (args?.action === 'status' &&
143
+ jsonString(args.sessionId) !== undefined &&
144
+ jsonString(args.participantId) !== undefined)));
145
+ }
146
+ function durableRestoreIdentity(body) {
147
+ const candidate = sessionCall(body);
148
+ if (candidate?.method !== 'tools/call' || candidate.params.name !== 'session')
149
+ return null;
150
+ const args = candidate.params.arguments;
151
+ const sessionId = jsonString(args?.sessionId);
152
+ const participantId = jsonString(args?.participantId);
153
+ if (args?.action === 'status' && args.receiptOnly === true && sessionId !== undefined && participantId !== undefined) {
154
+ return {
155
+ key: `status:${participantId}:${sessionId}`,
156
+ readOnly: true
157
+ };
158
+ }
159
+ if (args?.action === 'init' && args.newSession !== true && participantId !== undefined) {
160
+ return {
161
+ key: `init:${participantId}:${sessionId ?? 'active'}`,
162
+ readOnly: false
163
+ };
164
+ }
165
+ return null;
166
+ }
167
+ function durableRestoreRequest(body) {
168
+ const candidate = sessionCall(body);
169
+ const args = candidate?.params.arguments;
170
+ if (candidate?.method !== 'tools/call' ||
171
+ candidate.params.name !== 'session' ||
172
+ (args?.action !== 'init' && args?.action !== 'status')) {
173
+ return null;
174
+ }
175
+ return {
176
+ action: args.action,
177
+ sessionId: jsonString(args.sessionId),
178
+ participantId: jsonString(args.participantId),
179
+ receiptOnly: args.receiptOnly === true,
180
+ newSession: args.newSession === true
181
+ };
182
+ }
183
+ function asCanonicalReceiptRestore(body, receipt) {
184
+ const rewrite = (candidate) => {
185
+ const record = JsonObjectSchema.safeParse(candidate);
186
+ if (!record.success)
187
+ return candidate;
188
+ const params = JsonObjectSchema.safeParse(record.data.params);
189
+ if (!params.success)
190
+ return candidate;
191
+ return {
192
+ ...record.data,
193
+ params: {
194
+ ...params.data,
195
+ name: 'session',
196
+ arguments: {
197
+ action: 'status',
198
+ sessionId: receipt.sessionId,
199
+ participantId: receipt.participantId,
200
+ receiptOnly: true
201
+ }
202
+ }
203
+ };
204
+ };
205
+ if (body === undefined)
206
+ return undefined;
207
+ return Array.isArray(body) ? body.map(rewrite) : rewrite(body);
208
+ }
209
+ function responseReceipt(body, log) {
210
+ const dataLines = body
211
+ .split('\n')
212
+ .filter((line) => line.startsWith('data:'))
213
+ .map((line) => line.slice(5).trim());
214
+ const payloads = dataLines.length > 0 ? dataLines : [body];
215
+ for (const payload of payloads) {
216
+ const read = settleNow(() => JsonValueSchema.parse(JSON.parse(payload)));
217
+ if (!read.ok) {
218
+ log.debug('restore response payload is not JSON; skipping', { error: valueFreeFailure(read.cause) });
219
+ continue;
220
+ }
221
+ const parsed = z.object({
222
+ result: z.object({
223
+ structuredContent: z.object({
224
+ sessionId: JsonValueSchema.optional(),
225
+ session: z.object({ id: JsonValueSchema.optional() }).loose().optional(),
226
+ participant: z.object({ id: JsonValueSchema.optional() }).loose().optional()
227
+ }).loose().optional()
228
+ }).loose().optional()
229
+ }).loose().safeParse(read.value);
230
+ if (!parsed.success)
231
+ continue;
232
+ const content = parsed.data.result?.structuredContent;
233
+ const sessionId = jsonString(content?.sessionId ?? content?.session?.id);
234
+ const participantId = jsonString(content?.participant?.id);
235
+ if (sessionId !== undefined && participantId !== undefined)
236
+ return { sessionId, participantId };
237
+ }
238
+ return undefined;
239
+ }
240
+ function replayBufferedResponse(buffered, requestId, log) {
241
+ const rewrite = (payload) => {
242
+ const read = settleNow(() => JsonObjectSchema.parse(JSON.parse(payload)));
243
+ if (!read.ok) {
244
+ log.debug('SSE payload is not JSON; forwarded unrewritten', { error: valueFreeFailure(read.cause) });
245
+ return payload;
246
+ }
247
+ const parsed = read.value;
248
+ if ('id' in parsed)
249
+ return JSON.stringify({ ...parsed, id: requestId });
250
+ return JSON.stringify(parsed);
251
+ };
252
+ const contentType = new Headers(buffered.headers).get('content-type') ?? '';
253
+ const body = contentType.includes('text/event-stream')
254
+ ? buffered.body
255
+ .split('\n')
256
+ .map((line) => (line.startsWith('data:') ? `data: ${rewrite(line.slice(5).trim())}` : line))
257
+ .join('\n')
258
+ : rewrite(buffered.body);
259
+ return new Response(body, {
260
+ status: buffered.status,
261
+ statusText: buffered.statusText,
262
+ headers: buffered.headers
263
+ });
264
+ }
265
+ function withSessionHeader(req, sessionId) {
266
+ if (req.headers.get('mcp-session-id') === sessionId)
267
+ return req;
268
+ const headers = new Headers(req.headers);
269
+ headers.set('mcp-session-id', sessionId);
270
+ return new Request(req, { headers });
271
+ }
272
+ export function createMcpHttpSessionHandler(options) {
273
+ /** A request naming a workspace this host cannot serve is refused, never run without it. */
274
+ const refuseUnservedWorkspace = (scope, body) => scope.workspacePath && !options.runInRequestWorkspace
275
+ ? jsonRpcError(400, -32602, `This MCP host serves no per-request workspace; drop the ${MCP_WORKSPACE_HEADER} header.`, { id: jsonRpcRequestId(body) })
276
+ : null;
277
+ const sessions = new Map();
278
+ const startedAt = Date.now();
279
+ const maxSessions = options.maxSessions ?? DEFAULT_MAX_SESSIONS;
280
+ const sessionTtlMs = options.sessionTtlMs ?? DEFAULT_SESSION_TTL_MS;
281
+ const minEvictionIdleMs = options.minEvictionIdleMs ?? DEFAULT_MIN_EVICTION_IDLE_MS;
282
+ const durableRestoreDeadlineMs = options.durableRestoreDeadlineMs ?? DEFAULT_DURABLE_RESTORE_DEADLINE_MS;
283
+ const maxParallelReceiptRestores = options.maxParallelReceiptRestores ?? 64;
284
+ const now = options.now ?? Date.now;
285
+ const log = options.logger.child('http-session');
286
+ /**
287
+ * Sessions this host terminated, and why. A client whose session was reaped
288
+ * cannot tell that from "wrong id" unless the host remembers, and "your
289
+ * session expired, re-initialize" is the difference between a reconnect and
290
+ * an agent concluding the tool is broken.
291
+ */
292
+ const terminatedSessions = new Map();
293
+ const TERMINATED_MEMORY = 512;
294
+ let restoreQueueDepth = 0;
295
+ let restoreTail = Promise.resolve();
296
+ const activeRestoreStartedAt = new Map();
297
+ let activeReceiptRestores = 0;
298
+ let receiptRestoreExecutions = 0;
299
+ let mutationRestoreExecutions = 0;
300
+ let legacyRestoreAttempts = 0;
301
+ let legacyRestoreResolved = 0;
302
+ let legacyRestoreUnresolved = 0;
303
+ const receiptRestoreWaiters = [];
304
+ const restoreCache = new Map();
305
+ const RESTORE_CACHE_TTL_MS = 60_000;
306
+ async function acquireReceiptRestoreSlot() {
307
+ if (activeReceiptRestores < maxParallelReceiptRestores) {
308
+ activeReceiptRestores += 1;
309
+ return;
310
+ }
311
+ await new Promise((resolve) => receiptRestoreWaiters.push(resolve));
312
+ activeReceiptRestores += 1;
313
+ }
314
+ function releaseReceiptRestoreSlot() {
315
+ activeReceiptRestores -= 1;
316
+ receiptRestoreWaiters.shift()?.();
317
+ }
318
+ /**
319
+ * Exact receipt restores are read-only Session authority checks followed by
320
+ * a transport-local memory bind. Run those in a bounded parallel lane so a
321
+ * real fleet of distinct relays does not spend minutes behind one global
322
+ * queue. Legacy init/status requests can still mutate authority and therefore
323
+ * retain the single-writer lane.
324
+ */
325
+ async function admitDurableRestore(identity, transportSessionId, requestId, operation) {
326
+ // A cached receipt is safe only when this host can revalidate Session
327
+ // authority and publish the replacement transport's memory-only binding.
328
+ const cacheIdentity = options.bindCachedDurableRestore ? identity : null;
329
+ const cached = cacheIdentity ? restoreCache.get(cacheIdentity.key) : undefined;
330
+ if (cached &&
331
+ (cached.completedAt === undefined || now() - cached.completedAt < RESTORE_CACHE_TTL_MS)) {
332
+ const buffered = await cached.promise;
333
+ if (buffered.receipt) {
334
+ await options.bindCachedDurableRestore?.({
335
+ transportSessionId,
336
+ ...buffered.receipt
337
+ });
338
+ }
339
+ return replayBufferedResponse(buffered, requestId, log);
340
+ }
341
+ if (cacheIdentity && cached)
342
+ restoreCache.delete(cacheIdentity.key);
343
+ const run = (async () => {
344
+ restoreQueueDepth += 1;
345
+ let release;
346
+ if (identity?.readOnly) {
347
+ receiptRestoreExecutions += 1;
348
+ await acquireReceiptRestoreSlot();
349
+ release = releaseReceiptRestoreSlot;
350
+ }
351
+ else {
352
+ mutationRestoreExecutions += 1;
353
+ const preceding = restoreTail;
354
+ let releaseWriter;
355
+ restoreTail = new Promise((resolve) => {
356
+ releaseWriter = resolve;
357
+ });
358
+ await preceding;
359
+ release = releaseWriter;
360
+ }
361
+ const restoreToken = Symbol('durable-restore');
362
+ activeRestoreStartedAt.set(restoreToken, now());
363
+ try {
364
+ const response = await operation();
365
+ // Streamable HTTP returns the Response shell before its tool handler has
366
+ // settled. Buffer this one tiny status receipt inside admission; otherwise
367
+ // the lane appears free while the storage-heavy restore is still running.
368
+ const body = await response.text();
369
+ return {
370
+ status: response.status,
371
+ statusText: response.statusText,
372
+ headers: [...response.headers.entries()],
373
+ body,
374
+ receipt: responseReceipt(body, log)
375
+ };
376
+ }
377
+ finally {
378
+ activeRestoreStartedAt.delete(restoreToken);
379
+ restoreQueueDepth -= 1;
380
+ try {
381
+ if (!identity?.readOnly) {
382
+ // Promise-only handoff keeps draining microtasks and can still starve
383
+ // node:http. One runtime-owned timer turn admits /health before the
384
+ // next writer; disposal cancels it, and the lane is released either way.
385
+ await options.lifecycle.delay(0);
386
+ }
387
+ }
388
+ finally {
389
+ release();
390
+ }
391
+ }
392
+ })();
393
+ if (cacheIdentity) {
394
+ const entry = { promise: run };
395
+ restoreCache.set(cacheIdentity.key, entry);
396
+ run.then((buffered) => {
397
+ if (buffered.receipt)
398
+ entry.completedAt = now();
399
+ else if (restoreCache.get(cacheIdentity.key) === entry) {
400
+ restoreCache.delete(cacheIdentity.key);
401
+ }
402
+ }, (cause) => {
403
+ log.debug('durable restore failed; dropping the cached receipt', {
404
+ error: valueFreeFailure(CaughtFailureSchema.parse(cause))
405
+ });
406
+ if (restoreCache.get(cacheIdentity.key) === entry)
407
+ restoreCache.delete(cacheIdentity.key);
408
+ return cause;
409
+ });
410
+ while (restoreCache.size > maxSessions * 2) {
411
+ const oldest = restoreCache.entries().next();
412
+ if (oldest.done || oldest.value[1].completedAt === undefined)
413
+ break;
414
+ restoreCache.delete(oldest.value[0]);
415
+ }
416
+ }
417
+ const buffered = await run;
418
+ return replayBufferedResponse(buffered, requestId, log);
419
+ }
420
+ function rememberTerminated(sessionId, reason) {
421
+ terminatedSessions.set(sessionId, { at: Date.now(), reason });
422
+ while (terminatedSessions.size > TERMINATED_MEMORY) {
423
+ const oldest = terminatedSessions.keys().next();
424
+ if (oldest.done)
425
+ break;
426
+ terminatedSessions.delete(oldest.value);
427
+ }
428
+ }
429
+ /** Close a server; a failed close is reported, never dropped. */
430
+ function closeServer(server, sessionId, reason) {
431
+ void settle(() => server.close()).then((closed) => {
432
+ if (closed.ok)
433
+ return;
434
+ log.warn('MCP server close failed', {
435
+ sessionId,
436
+ reason,
437
+ error: valueFreeFailure(closed.cause)
438
+ });
439
+ });
440
+ }
441
+ function dropSession(sessionId, reason) {
442
+ const session = sessions.get(sessionId);
443
+ if (!session)
444
+ return;
445
+ session.releaseMembership?.();
446
+ sessions.delete(sessionId);
447
+ rememberTerminated(sessionId, reason);
448
+ closeServer(session.server, sessionId, reason);
449
+ }
450
+ /** Drop every session idle past the TTL. */
451
+ let lastSweepAt = Date.now();
452
+ function expireIdleSessions() {
453
+ const current = Date.now();
454
+ lastSweepAt = current;
455
+ for (const [sid, session] of sessions) {
456
+ if (current - session.lastActivityAt > sessionTtlMs) {
457
+ log.info('Evicting expired MCP session', {
458
+ sessionId: sid,
459
+ idleMs: current - session.lastActivityAt
460
+ });
461
+ dropSession(sid, 'idle-ttl');
462
+ }
463
+ }
464
+ }
465
+ /**
466
+ * Per-request expiry, on every host: the first request after each sweep
467
+ * interval sweeps, and a session named by a request is expired before use.
468
+ * A stateless handler keeps no sessions and sweeps nothing.
469
+ */
470
+ function expireForRequest(sessionId) {
471
+ if (Date.now() - lastSweepAt >= SESSION_SWEEP_INTERVAL_MS)
472
+ expireIdleSessions();
473
+ const named = sessionId ? sessions.get(sessionId) : undefined;
474
+ if (sessionId && named && Date.now() - named.lastActivityAt > sessionTtlMs)
475
+ dropSession(sessionId, 'idle-ttl');
476
+ }
477
+ /**
478
+ * A persistent host also sweeps in the background on its runtime-owned
479
+ * interval, so an idle host releases its sessions without traffic. A finite
480
+ * host refuses the interval (confirmed absence of background work) and
481
+ * relies on per-request expiry alone.
482
+ */
483
+ let stopSweep = null;
484
+ if (!options.stateless) {
485
+ const started = settleNow(() => options.lifecycle.interval(expireIdleSessions, SESSION_SWEEP_INTERVAL_MS));
486
+ if (started.ok)
487
+ stopSweep = started.value;
488
+ else if (valueFreeFailure(started.cause).reason !== 'lifecycle-interval-finite')
489
+ throw started.cause;
490
+ }
491
+ async function handleMcpHttpRequest(req) {
492
+ const url = new URL(req.url);
493
+ if (url.pathname === '/health' || url.pathname === '/mcp/health') {
494
+ const oldestRestoreStartedAt = activeRestoreStartedAt.size === 0
495
+ ? null
496
+ : Math.min(...activeRestoreStartedAt.values());
497
+ const activeRestoreAgeMs = oldestRestoreStartedAt === null ? null : Math.max(0, now() - oldestRestoreStartedAt);
498
+ const restoreHealthy = activeRestoreAgeMs === null || activeRestoreAgeMs < durableRestoreDeadlineMs;
499
+ return new Response(JSON.stringify({
500
+ ...options.healthExtras,
501
+ ok: restoreHealthy,
502
+ sessions: sessions.size,
503
+ maxSessions,
504
+ restoreQueueDepth,
505
+ activeReceiptRestores,
506
+ restoreExecutions: {
507
+ readOnly: receiptRestoreExecutions,
508
+ mutation: mutationRestoreExecutions
509
+ },
510
+ legacyRestoreClassifications: {
511
+ attempted: legacyRestoreAttempts,
512
+ resolved: legacyRestoreResolved,
513
+ unresolved: legacyRestoreUnresolved
514
+ },
515
+ activeRestoreAgeMs,
516
+ restoreDeadlineMs: durableRestoreDeadlineMs,
517
+ reason: restoreHealthy ? undefined : 'durable-restore-overdue',
518
+ uptime: Math.floor((Date.now() - startedAt) / 1000),
519
+ }), {
520
+ status: restoreHealthy ? 200 : 503,
521
+ headers: { 'content-type': 'application/json' }
522
+ });
523
+ }
524
+ const isMcpEndpoint = (options.endpointPaths ?? ['/mcp', '/']).includes(url.pathname);
525
+ if (!isMcpEndpoint) {
526
+ return new Response('Not Found', { status: 404 });
527
+ }
528
+ const authenticate = options.authenticate;
529
+ if (authenticate) {
530
+ const fakeReq = {
531
+ headers: Object.fromEntries(req.headers.entries())
532
+ };
533
+ // An authenticator that throws answers a JSON-RPC error, never a
534
+ // rejection into the host: a typed UNAVAILABLE refusal is 503,
535
+ // anything else 500. Fixed text on the wire; the cause is logged once.
536
+ const authed = await settle(() => authenticate(fakeReq));
537
+ if (!authed.ok) {
538
+ const failure = valueFreeFailure(authed.cause);
539
+ if (isCapabilityError(authed.cause) && authed.cause.code === 'UNAVAILABLE') {
540
+ log.warn('MCP authentication unavailable; answering 503', { failure, reason: authed.cause.reason });
541
+ return jsonRpcError(503, -32001, 'Service unavailable: authentication is temporarily unreachable');
542
+ }
543
+ log.error('MCP authenticator failed; answering 500', { failure });
544
+ return jsonRpcError(500, -32603, 'Internal error: authentication failed');
545
+ }
546
+ if (!authed.value) {
547
+ return jsonRpcError(401, -32001, 'Unauthorized: Valid API key with mcp scope required');
548
+ }
549
+ }
550
+ // Stateless edge mode: build an ephemeral server+transport per request.
551
+ // No session Map, no cross-request continuity required — each JSON-RPC
552
+ // message (initialize / tools/list / tools/call) is self-contained, which
553
+ // is the only model that works across serverless isolates.
554
+ if (options.stateless) {
555
+ const served = await settle(async () => {
556
+ let parsedBody;
557
+ if (req.method === 'POST') {
558
+ const text = await req.text();
559
+ if (text.trim().length > 0) {
560
+ const parsed = settleNow(() => JsonValueSchema.parse(JSON.parse(text)));
561
+ if (!parsed.ok)
562
+ return jsonRpcError(400, -32700, 'Parse error: invalid JSON payload');
563
+ parsedBody = parsed.value;
564
+ }
565
+ }
566
+ const requestScope = parseMcpRequestScope(req.headers);
567
+ const refusal = refuseUnservedWorkspace(requestScope, parsedBody);
568
+ if (refusal)
569
+ return refusal;
570
+ const server = options.buildServer();
571
+ const transport = new WebStandardStreamableHTTPServerTransport({
572
+ sessionIdGenerator: undefined,
573
+ // Await the complete response before disposing this request's server.
574
+ enableJsonResponse: true
575
+ });
576
+ // Same tools/list tightening (pattern strip + union dedup) the stdio
577
+ // transport gets in server.consumer.ts.
578
+ wrapTransportWithSchemaTightening(transport, { omitOutputSchema: options.omitOutputSchema });
579
+ await server.connect(transport);
580
+ try {
581
+ return await runWithMcpRequestScope(requestScope, () => transport.handleRequest(req, { parsedBody }), options.runInRequestWorkspace);
582
+ }
583
+ finally {
584
+ // Tear down the ephemeral server so it doesn't leak.
585
+ closeServer(server, null, 'stateless-request-complete');
586
+ }
587
+ });
588
+ if (!served.ok) {
589
+ log.error('Error handling stateless MCP request', { error: valueFreeFailure(served.cause) });
590
+ return jsonRpcError(500, -32603, 'Internal error');
591
+ }
592
+ return served.value;
593
+ }
594
+ const sessionId = resolveSessionIdFromWebHeaders(req.headers);
595
+ const served = await settle(async () => {
596
+ let parsedBody;
597
+ if (req.method === 'POST') {
598
+ const text = await req.text();
599
+ if (text.trim().length > 0) {
600
+ const parsed = settleNow(() => JsonValueSchema.parse(JSON.parse(text)));
601
+ if (!parsed.ok)
602
+ return jsonRpcError(400, -32700, 'Parse error: invalid JSON payload');
603
+ parsedBody = parsed.value;
604
+ }
605
+ }
606
+ expireForRequest(sessionId ?? undefined);
607
+ const session = sessionId ? sessions.get(sessionId) : undefined;
608
+ const requestScope = parseMcpRequestScope(req.headers);
609
+ const refusal = refuseUnservedWorkspace(requestScope, parsedBody);
610
+ if (refusal)
611
+ return refusal;
612
+ if (sessionId && session) {
613
+ session.lastActivityAt = Date.now();
614
+ let restoreBody = parsedBody;
615
+ let restoreIdentity = durableRestoreIdentity(restoreBody);
616
+ const restoreRequest = durableRestoreRequest(restoreBody);
617
+ if (restoreRequest &&
618
+ !restoreRequest.receiptOnly &&
619
+ !restoreRequest.newSession &&
620
+ options.resolveReadOnlyDurableRestore) {
621
+ legacyRestoreAttempts += 1;
622
+ const clientVersion = session.server.server.getClientVersion?.();
623
+ const clientInfo = session.connection.clientInfo ??
624
+ (clientVersion?.name
625
+ ? {
626
+ name: clientVersion.name,
627
+ version: clientVersion.version || undefined
628
+ }
629
+ : undefined);
630
+ const receipt = await options.resolveReadOnlyDurableRestore({
631
+ ...restoreRequest,
632
+ transportSessionId: sessionId,
633
+ clientInfo: clientInfo || undefined
634
+ });
635
+ if (receipt) {
636
+ legacyRestoreResolved += 1;
637
+ restoreBody = asCanonicalReceiptRestore(restoreBody, receipt);
638
+ restoreIdentity = durableRestoreIdentity(restoreBody);
639
+ }
640
+ else {
641
+ legacyRestoreUnresolved += 1;
642
+ // Refuse only the BARE init: with no session named the tool
643
+ // would mint, and an identity-less caller gives the host no
644
+ // durable seat to attach it to. An init that NAMES a session
645
+ // is a fresh bind, not a restore — there is no prior binding
646
+ // to resurrect, and the tool never mints for a named id: it
647
+ // binds or rejects (foreign/archived/ambiguous) with proper
648
+ // tool errors. Gating it here broke the documented bind flow
649
+ // (docs/session-binding.md) for every harness that declares
650
+ // no stable identity.
651
+ if (restoreRequest.action === 'init' &&
652
+ !restoreRequest.sessionId &&
653
+ !restoreRequest.participantId &&
654
+ !clientInfo?.harnessSessionId) {
655
+ return jsonRpcError(409, -32004, 'Legacy session restore requires a stable participant or harness session identity', { id: jsonRpcRequestId(restoreBody) });
656
+ }
657
+ }
658
+ }
659
+ const execute = () => runWithMcpRequestScope(requestScope, () => session.transport.handleRequest(withSessionHeader(req, sessionId), {
660
+ parsedBody: restoreBody
661
+ }), options.runInRequestWorkspace);
662
+ return isDurableSessionRestoreRequest(restoreBody)
663
+ ? admitDurableRestore(restoreIdentity, sessionId, jsonRpcRequestId(restoreBody), execute)
664
+ : execute();
665
+ }
666
+ if (isInitializeRequest(parsedBody) && !session) {
667
+ if (sessions.size >= maxSessions) {
668
+ // Only a session quiet for `minEvictionIdleMs` may be sacrificed. Plain
669
+ // LRU picked the interactive agents every time: they are idle while their
670
+ // agent thinks, and the short-lived hook sessions churning past them are
671
+ // always fresher.
672
+ const now = Date.now();
673
+ let oldestSid = null;
674
+ let oldestTime = Infinity;
675
+ for (const [sid, candidate] of sessions) {
676
+ if (now - candidate.lastActivityAt < minEvictionIdleMs)
677
+ continue;
678
+ if (candidate.lastActivityAt < oldestTime) {
679
+ oldestTime = candidate.lastActivityAt;
680
+ oldestSid = sid;
681
+ }
682
+ }
683
+ if (!oldestSid) {
684
+ // Every live session is in active use. Refusing the NEW connection is
685
+ // recoverable: that client is here, sees the error, and can retry.
686
+ // Killing an established one is not — that client is elsewhere and
687
+ // finds out only when its next tool call fails.
688
+ log.error('Session cap reached with no idle session to reclaim', {
689
+ totalSessions: sessions.size,
690
+ maxSessions,
691
+ minEvictionIdleMs
692
+ });
693
+ return jsonRpcError(503, -32000, `MCP host is at its session cap (${maxSessions}) and every session is in ` +
694
+ `active use. Retry shortly; this is not a missing tool.`, { id: jsonRpcRequestId(parsedBody), headers: { 'retry-after': '5' } });
695
+ }
696
+ log.warn('Session cap reached, evicting the most idle session', {
697
+ evictedSession: oldestSid,
698
+ idleMs: now - oldestTime,
699
+ totalSessions: sessions.size,
700
+ maxSessions
701
+ });
702
+ dropSession(oldestSid, 'session-cap');
703
+ }
704
+ const connectionContext = initializeConnection(parsedBody, options.relayAttestation?.verify(req.headers.get('authorization')) === true, options.runtime);
705
+ const server = options.buildServer(connectionContext);
706
+ let releaseMembership;
707
+ const transport = new WebStandardStreamableHTTPServerTransport({
708
+ sessionIdGenerator: options.sessionIdGenerator ?? (() => crypto.randomUUID()),
709
+ keepAliveMs: SSE_KEEP_ALIVE_MS,
710
+ onsessioninitialized: (sid) => {
711
+ releaseMembership = options.bindMembershipOwner?.(sid);
712
+ connectionContext.transportSessionId = sid;
713
+ sessions.set(sid, {
714
+ transport,
715
+ server,
716
+ lastActivityAt: Date.now(),
717
+ connection: connectionContext,
718
+ releaseMembership
719
+ });
720
+ }
721
+ });
722
+ transport.onclose = () => {
723
+ releaseMembership?.();
724
+ releaseMembership = undefined;
725
+ const sid = transport.sessionId;
726
+ if (sid) {
727
+ sessions.delete(sid);
728
+ // A client DELETE, a transport error, and our own eviction all land
729
+ // here. Recording it means a later request on that id is told the
730
+ // session was terminated rather than that it is unknown.
731
+ if (!terminatedSessions.has(sid))
732
+ rememberTerminated(sid, 'closed');
733
+ }
734
+ log.debug('MCP HTTP session closed', { sessionId: sid });
735
+ };
736
+ transport.onerror = (err) => {
737
+ log.error('HTTP transport error', {
738
+ error: valueFreeFailure(CaughtFailureSchema.parse(err)),
739
+ sessionId: transport.sessionId
740
+ });
741
+ return err;
742
+ };
743
+ // Same tools/list tightening (pattern strip + union dedup) the stdio
744
+ // transport gets in server.consumer.ts.
745
+ wrapTransportWithSchemaTightening(transport, { omitOutputSchema: options.omitOutputSchema });
746
+ await server.connect(transport);
747
+ server.server.onerror = (err) => {
748
+ log.error('MCP protocol error (HTTP)', {
749
+ error: valueFreeFailure(CaughtFailureSchema.parse(err)),
750
+ sessionId: transport.sessionId
751
+ });
752
+ return err;
753
+ };
754
+ return runWithMcpRequestScope(requestScope, () => transport.handleRequest(req, { parsedBody }), options.runInRequestWorkspace);
755
+ }
756
+ if (sessionId) {
757
+ // MCP streamable HTTP: a request carrying a session id the host does not
758
+ // hold MUST answer 404, which is a client's instruction to start a new
759
+ // session with a fresh InitializeRequest. Answering 400 (as this did)
760
+ // reads as "malformed request" and leaves the client permanently broken
761
+ // against a host that would happily serve it again.
762
+ const terminated = terminatedSessions.get(sessionId);
763
+ log.info('Request for a session this host no longer holds', {
764
+ sessionId,
765
+ reason: terminated?.reason ?? 'unknown'
766
+ });
767
+ return jsonRpcError(404, -32001, terminated
768
+ ? `MCP session ${sessionId} was terminated by the host (${terminated.reason}). ` +
769
+ `Start a new session with a fresh initialize request.`
770
+ : `MCP session ${sessionId} is not known to this host. ` +
771
+ `Start a new session with a fresh initialize request.`, { id: jsonRpcRequestId(parsedBody) });
772
+ }
773
+ return jsonRpcError(400, -32000, 'Bad Request: No valid session ID provided', {
774
+ id: jsonRpcRequestId(parsedBody)
775
+ });
776
+ });
777
+ if (!served.ok) {
778
+ log.error('Error handling MCP request', { error: valueFreeFailure(served.cause) });
779
+ return jsonRpcError(500, -32603, 'Internal error');
780
+ }
781
+ return served.value;
782
+ }
783
+ return {
784
+ handleRequest: handleMcpHttpRequest,
785
+ dispose: () => {
786
+ stopSweep?.();
787
+ stopSweep = null;
788
+ for (const [sid, session] of sessions) {
789
+ session.releaseMembership?.();
790
+ rememberTerminated(sid, 'host-shutdown');
791
+ closeServer(session.server, sid, 'host-shutdown');
792
+ }
793
+ sessions.clear();
794
+ }
795
+ };
796
+ }
797
+ //# sourceMappingURL=mcp-http-session.js.map