wicked-crew 0.7.40 → 0.7.46

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 (361) hide show
  1. package/dist/api/audit.d.ts +3 -0
  2. package/dist/api/audit.d.ts.map +1 -1
  3. package/dist/api/audit.js +2 -0
  4. package/dist/api/audit.js.map +1 -1
  5. package/dist/api/capture.d.ts +149 -0
  6. package/dist/api/capture.d.ts.map +1 -0
  7. package/dist/api/capture.js +330 -0
  8. package/dist/api/capture.js.map +1 -0
  9. package/dist/api/chat-citations.d.ts +174 -0
  10. package/dist/api/chat-citations.d.ts.map +1 -0
  11. package/dist/api/chat-citations.js +528 -0
  12. package/dist/api/chat-citations.js.map +1 -0
  13. package/dist/api/chat-transcripts.d.ts +20 -1
  14. package/dist/api/chat-transcripts.d.ts.map +1 -1
  15. package/dist/api/chat-transcripts.js +29 -0
  16. package/dist/api/chat-transcripts.js.map +1 -1
  17. package/dist/api/delivery-cache.d.ts +2 -2
  18. package/dist/api/delivery-freeze.d.ts +66 -0
  19. package/dist/api/delivery-freeze.d.ts.map +1 -0
  20. package/dist/api/delivery-freeze.js +104 -0
  21. package/dist/api/delivery-freeze.js.map +1 -0
  22. package/dist/api/delivery-index.d.ts +53 -9
  23. package/dist/api/delivery-index.d.ts.map +1 -1
  24. package/dist/api/delivery-index.js +115 -22
  25. package/dist/api/delivery-index.js.map +1 -1
  26. package/dist/api/demo.d.ts +90 -0
  27. package/dist/api/demo.d.ts.map +1 -0
  28. package/dist/api/demo.js +492 -0
  29. package/dist/api/demo.js.map +1 -0
  30. package/dist/api/diagnostics.d.ts +64 -1
  31. package/dist/api/diagnostics.d.ts.map +1 -1
  32. package/dist/api/diagnostics.js +129 -1
  33. package/dist/api/diagnostics.js.map +1 -1
  34. package/dist/api/eval-sample.d.ts +6 -6
  35. package/dist/api/governance-steering.d.ts +2 -2
  36. package/dist/api/mcp.d.ts +282 -0
  37. package/dist/api/mcp.d.ts.map +1 -0
  38. package/dist/api/mcp.js +521 -0
  39. package/dist/api/mcp.js.map +1 -0
  40. package/dist/api/plan-schema.d.ts +56 -0
  41. package/dist/api/plan-schema.d.ts.map +1 -0
  42. package/dist/api/plan-schema.js +26 -0
  43. package/dist/api/plan-schema.js.map +1 -0
  44. package/dist/api/roster-standing.d.ts +15 -2
  45. package/dist/api/roster-standing.d.ts.map +1 -1
  46. package/dist/api/roster-standing.js +59 -3
  47. package/dist/api/roster-standing.js.map +1 -1
  48. package/dist/api/routes.d.ts +630 -51
  49. package/dist/api/routes.d.ts.map +1 -1
  50. package/dist/api/routes.js +738 -127
  51. package/dist/api/routes.js.map +1 -1
  52. package/dist/api/run-files.d.ts.map +1 -1
  53. package/dist/api/run-files.js +31 -2
  54. package/dist/api/run-files.js.map +1 -1
  55. package/dist/api/run-liveness.d.ts +41 -0
  56. package/dist/api/run-liveness.d.ts.map +1 -0
  57. package/dist/api/run-liveness.js +166 -0
  58. package/dist/api/run-liveness.js.map +1 -0
  59. package/dist/api/seat-health.d.ts +35 -0
  60. package/dist/api/seat-health.d.ts.map +1 -1
  61. package/dist/api/seat-health.js +92 -4
  62. package/dist/api/seat-health.js.map +1 -1
  63. package/dist/api/seat-probe.d.ts +141 -0
  64. package/dist/api/seat-probe.d.ts.map +1 -0
  65. package/dist/api/seat-probe.js +257 -0
  66. package/dist/api/seat-probe.js.map +1 -0
  67. package/dist/api/seat-record.d.ts +40 -0
  68. package/dist/api/seat-record.d.ts.map +1 -0
  69. package/dist/api/seat-record.js +218 -0
  70. package/dist/api/seat-record.js.map +1 -0
  71. package/dist/api/seat-signin.d.ts.map +1 -1
  72. package/dist/api/seat-signin.js +3 -1
  73. package/dist/api/seat-signin.js.map +1 -1
  74. package/dist/api/seat-standing.d.ts +25 -5
  75. package/dist/api/seat-standing.d.ts.map +1 -1
  76. package/dist/api/seat-standing.js +76 -9
  77. package/dist/api/seat-standing.js.map +1 -1
  78. package/dist/api/server.d.ts +34 -48
  79. package/dist/api/server.d.ts.map +1 -1
  80. package/dist/api/server.js +283 -107
  81. package/dist/api/server.js.map +1 -1
  82. package/dist/api/skills.d.ts +3 -1
  83. package/dist/api/skills.d.ts.map +1 -1
  84. package/dist/api/skills.js +7 -2
  85. package/dist/api/skills.js.map +1 -1
  86. package/dist/api/stall-watchdog.d.ts +34 -3
  87. package/dist/api/stall-watchdog.d.ts.map +1 -1
  88. package/dist/api/stall-watchdog.js +107 -8
  89. package/dist/api/stall-watchdog.js.map +1 -1
  90. package/dist/api/steering-landing.d.ts +6 -6
  91. package/dist/api/steering-landing.d.ts.map +1 -1
  92. package/dist/api/steering-landing.js +7 -9
  93. package/dist/api/steering-landing.js.map +1 -1
  94. package/dist/api/testing.d.ts +6 -4
  95. package/dist/api/testing.d.ts.map +1 -1
  96. package/dist/api/testing.js +82 -47
  97. package/dist/api/testing.js.map +1 -1
  98. package/dist/campaign/boot-resume.d.ts +34 -0
  99. package/dist/campaign/boot-resume.d.ts.map +1 -0
  100. package/dist/campaign/boot-resume.js +45 -0
  101. package/dist/campaign/boot-resume.js.map +1 -0
  102. package/dist/campaigns/rollup.d.ts +4 -1
  103. package/dist/campaigns/rollup.d.ts.map +1 -1
  104. package/dist/campaigns/rollup.js +6 -1
  105. package/dist/campaigns/rollup.js.map +1 -1
  106. package/dist/campaigns/routes.d.ts +2 -2
  107. package/dist/cli/bearer.d.ts +27 -1
  108. package/dist/cli/bearer.d.ts.map +1 -1
  109. package/dist/cli/bearer.js +62 -2
  110. package/dist/cli/bearer.js.map +1 -1
  111. package/dist/cli/governance.d.ts +11 -0
  112. package/dist/cli/governance.d.ts.map +1 -1
  113. package/dist/cli/governance.js +8 -2
  114. package/dist/cli/governance.js.map +1 -1
  115. package/dist/cli/index.d.ts.map +1 -1
  116. package/dist/cli/index.js +140 -75
  117. package/dist/cli/index.js.map +1 -1
  118. package/dist/cli/mcp.d.ts +11 -0
  119. package/dist/cli/mcp.d.ts.map +1 -1
  120. package/dist/cli/mcp.js +40 -9
  121. package/dist/cli/mcp.js.map +1 -1
  122. package/dist/cli/service.d.ts +78 -0
  123. package/dist/cli/service.d.ts.map +1 -0
  124. package/dist/cli/service.js +334 -0
  125. package/dist/cli/service.js.map +1 -0
  126. package/dist/core/adapter.d.ts +238 -12
  127. package/dist/core/adapter.d.ts.map +1 -1
  128. package/dist/core/adapter.js +619 -157
  129. package/dist/core/adapter.js.map +1 -1
  130. package/dist/core/bridge-reaper.d.ts +4 -1
  131. package/dist/core/bridge-reaper.d.ts.map +1 -1
  132. package/dist/core/bridge-reaper.js +15 -1
  133. package/dist/core/bridge-reaper.js.map +1 -1
  134. package/dist/core/bus-notice.d.ts +27 -0
  135. package/dist/core/bus-notice.d.ts.map +1 -0
  136. package/dist/core/bus-notice.js +24 -0
  137. package/dist/core/bus-notice.js.map +1 -0
  138. package/dist/core/bus.d.ts +99 -0
  139. package/dist/core/bus.d.ts.map +1 -0
  140. package/dist/core/bus.js +176 -0
  141. package/dist/core/bus.js.map +1 -0
  142. package/dist/core/deliver-exclusions.d.ts +71 -0
  143. package/dist/core/deliver-exclusions.d.ts.map +1 -0
  144. package/dist/core/deliver-exclusions.js +110 -0
  145. package/dist/core/deliver-exclusions.js.map +1 -0
  146. package/dist/core/deliver-text.d.ts +61 -14
  147. package/dist/core/deliver-text.d.ts.map +1 -1
  148. package/dist/core/deliver-text.js +178 -30
  149. package/dist/core/deliver-text.js.map +1 -1
  150. package/dist/core/deliver-triage.d.ts +11 -2
  151. package/dist/core/deliver-triage.d.ts.map +1 -1
  152. package/dist/core/deliver-triage.js +19 -1
  153. package/dist/core/deliver-triage.js.map +1 -1
  154. package/dist/core/deliver.d.ts +161 -3
  155. package/dist/core/deliver.d.ts.map +1 -1
  156. package/dist/core/deliver.js +463 -25
  157. package/dist/core/deliver.js.map +1 -1
  158. package/dist/core/deliverable-floor.d.ts.map +1 -1
  159. package/dist/core/deliverable-floor.js +5 -7
  160. package/dist/core/deliverable-floor.js.map +1 -1
  161. package/dist/core/engine-bus.d.ts +40 -0
  162. package/dist/core/engine-bus.d.ts.map +1 -0
  163. package/dist/core/engine-bus.js +27 -0
  164. package/dist/core/engine-bus.js.map +1 -0
  165. package/dist/core/estate-mcp-client.d.ts +87 -5
  166. package/dist/core/estate-mcp-client.d.ts.map +1 -1
  167. package/dist/core/estate-mcp-client.js +90 -11
  168. package/dist/core/estate-mcp-client.js.map +1 -1
  169. package/dist/core/linked-issues.d.ts +46 -0
  170. package/dist/core/linked-issues.d.ts.map +1 -0
  171. package/dist/core/linked-issues.js +123 -0
  172. package/dist/core/linked-issues.js.map +1 -0
  173. package/dist/core/run-identity.d.ts +100 -0
  174. package/dist/core/run-identity.d.ts.map +1 -0
  175. package/dist/core/run-identity.js +178 -0
  176. package/dist/core/run-identity.js.map +1 -0
  177. package/dist/core/shutdown.d.ts +16 -0
  178. package/dist/core/shutdown.d.ts.map +1 -0
  179. package/dist/core/shutdown.js +39 -0
  180. package/dist/core/shutdown.js.map +1 -0
  181. package/dist/core/types.d.ts +15 -1
  182. package/dist/core/types.d.ts.map +1 -1
  183. package/dist/core/types.js +4 -0
  184. package/dist/core/types.js.map +1 -1
  185. package/dist/interactive/bridge-pool.d.ts +67 -3
  186. package/dist/interactive/bridge-pool.d.ts.map +1 -1
  187. package/dist/interactive/bridge-pool.js +129 -13
  188. package/dist/interactive/bridge-pool.js.map +1 -1
  189. package/dist/interactive/bridge-root.d.ts +9 -0
  190. package/dist/interactive/bridge-root.d.ts.map +1 -1
  191. package/dist/interactive/bridge-root.js +11 -4
  192. package/dist/interactive/bridge-root.js.map +1 -1
  193. package/dist/interactive/chat-events.d.ts +14 -9
  194. package/dist/interactive/chat-events.d.ts.map +1 -1
  195. package/dist/interactive/chat-events.js +55 -57
  196. package/dist/interactive/chat-events.js.map +1 -1
  197. package/dist/interactive/council-outcome.d.ts +1 -0
  198. package/dist/interactive/council-outcome.d.ts.map +1 -1
  199. package/dist/interactive/council-outcome.js +33 -0
  200. package/dist/interactive/council-outcome.js.map +1 -1
  201. package/dist/interactive/draft-events.d.ts +36 -17
  202. package/dist/interactive/draft-events.d.ts.map +1 -1
  203. package/dist/interactive/draft-events.js +121 -92
  204. package/dist/interactive/draft-events.js.map +1 -1
  205. package/dist/interactive/draft-skill.d.ts +59 -0
  206. package/dist/interactive/draft-skill.d.ts.map +1 -1
  207. package/dist/interactive/draft-skill.js +233 -0
  208. package/dist/interactive/draft-skill.js.map +1 -1
  209. package/dist/interactive/edit-events.d.ts +1 -14
  210. package/dist/interactive/edit-events.d.ts.map +1 -1
  211. package/dist/interactive/edit-events.js +37 -70
  212. package/dist/interactive/edit-events.js.map +1 -1
  213. package/dist/interactive/proxy-routes.d.ts +2 -2
  214. package/dist/interactive/proxy-routes.d.ts.map +1 -1
  215. package/dist/interactive/proxy-routes.js +4 -13
  216. package/dist/interactive/proxy-routes.js.map +1 -1
  217. package/dist/interactive/ws-relay.d.ts +9 -10
  218. package/dist/interactive/ws-relay.d.ts.map +1 -1
  219. package/dist/interactive/ws-relay.js +23 -50
  220. package/dist/interactive/ws-relay.js.map +1 -1
  221. package/dist/mcp/broker.d.ts +88 -0
  222. package/dist/mcp/broker.d.ts.map +1 -0
  223. package/dist/mcp/broker.js +307 -0
  224. package/dist/mcp/broker.js.map +1 -0
  225. package/dist/mcp/call-records.d.ts +61 -0
  226. package/dist/mcp/call-records.d.ts.map +1 -0
  227. package/dist/mcp/call-records.js +135 -0
  228. package/dist/mcp/call-records.js.map +1 -0
  229. package/dist/mcp/classify.d.ts +45 -0
  230. package/dist/mcp/classify.d.ts.map +1 -0
  231. package/dist/mcp/classify.js +83 -0
  232. package/dist/mcp/classify.js.map +1 -0
  233. package/dist/mcp/discovery.d.ts +24 -0
  234. package/dist/mcp/discovery.d.ts.map +1 -0
  235. package/dist/mcp/discovery.js +78 -0
  236. package/dist/mcp/discovery.js.map +1 -0
  237. package/dist/mcp/invoke.d.ts +36 -0
  238. package/dist/mcp/invoke.d.ts.map +1 -0
  239. package/dist/mcp/invoke.js +80 -0
  240. package/dist/mcp/invoke.js.map +1 -0
  241. package/dist/mcp/policies.d.ts +110 -0
  242. package/dist/mcp/policies.d.ts.map +1 -0
  243. package/dist/mcp/policies.js +400 -0
  244. package/dist/mcp/policies.js.map +1 -0
  245. package/dist/mcp/probe.d.ts +66 -0
  246. package/dist/mcp/probe.d.ts.map +1 -0
  247. package/dist/mcp/probe.js +116 -0
  248. package/dist/mcp/probe.js.map +1 -0
  249. package/dist/mcp/redact.d.ts +34 -0
  250. package/dist/mcp/redact.d.ts.map +1 -0
  251. package/dist/mcp/redact.js +84 -0
  252. package/dist/mcp/redact.js.map +1 -0
  253. package/dist/mcp/registry-store.d.ts +69 -0
  254. package/dist/mcp/registry-store.d.ts.map +1 -0
  255. package/dist/mcp/registry-store.js +82 -0
  256. package/dist/mcp/registry-store.js.map +1 -0
  257. package/dist/mcp/registry.d.ts +147 -0
  258. package/dist/mcp/registry.d.ts.map +1 -0
  259. package/dist/mcp/registry.js +509 -0
  260. package/dist/mcp/registry.js.map +1 -0
  261. package/dist/mcp/rest.d.ts +111 -0
  262. package/dist/mcp/rest.d.ts.map +1 -0
  263. package/dist/mcp/rest.js +606 -0
  264. package/dist/mcp/rest.js.map +1 -0
  265. package/dist/mcp/secrets.d.ts +66 -0
  266. package/dist/mcp/secrets.d.ts.map +1 -0
  267. package/dist/mcp/secrets.js +180 -0
  268. package/dist/mcp/secrets.js.map +1 -0
  269. package/dist/mcp/tool-list.d.ts +25 -0
  270. package/dist/mcp/tool-list.d.ts.map +1 -0
  271. package/dist/mcp/tool-list.js +62 -0
  272. package/dist/mcp/tool-list.js.map +1 -0
  273. package/dist/mcp/upstream-error.d.ts +12 -0
  274. package/dist/mcp/upstream-error.d.ts.map +1 -0
  275. package/dist/mcp/upstream-error.js +14 -0
  276. package/dist/mcp/upstream-error.js.map +1 -0
  277. package/dist/mcp/usage.d.ts +31 -0
  278. package/dist/mcp/usage.d.ts.map +1 -0
  279. package/dist/mcp/usage.js +159 -0
  280. package/dist/mcp/usage.js.map +1 -0
  281. package/dist/presets/routes.d.ts +53 -0
  282. package/dist/presets/routes.d.ts.map +1 -0
  283. package/dist/presets/routes.js +115 -0
  284. package/dist/presets/routes.js.map +1 -0
  285. package/dist/projects/activity.d.ts +6 -18
  286. package/dist/projects/activity.d.ts.map +1 -1
  287. package/dist/projects/activity.js +17 -60
  288. package/dist/projects/activity.js.map +1 -1
  289. package/dist/projects/events.d.ts +6 -5
  290. package/dist/projects/events.d.ts.map +1 -1
  291. package/dist/projects/events.js +33 -58
  292. package/dist/projects/events.js.map +1 -1
  293. package/dist/projects/routes.d.ts.map +1 -1
  294. package/dist/projects/routes.js +19 -0
  295. package/dist/projects/routes.js.map +1 -1
  296. package/dist/projects/state-home-preflight.d.ts.map +1 -1
  297. package/dist/projects/state-home-preflight.js +7 -0
  298. package/dist/projects/state-home-preflight.js.map +1 -1
  299. package/dist/projects/state-home-registry.d.ts.map +1 -1
  300. package/dist/projects/state-home-registry.js +9 -1
  301. package/dist/projects/state-home-registry.js.map +1 -1
  302. package/dist/qe/acceptance.d.ts +28 -28
  303. package/dist/qe/acceptance.d.ts.map +1 -1
  304. package/dist/qe/acceptance.js +60 -61
  305. package/dist/qe/acceptance.js.map +1 -1
  306. package/dist/qe/test-sets.d.ts +3 -5
  307. package/dist/qe/test-sets.d.ts.map +1 -1
  308. package/dist/qe/test-sets.js +5 -7
  309. package/dist/qe/test-sets.js.map +1 -1
  310. package/dist/skills/installed.d.ts +51 -0
  311. package/dist/skills/installed.d.ts.map +1 -0
  312. package/dist/skills/installed.js +46 -0
  313. package/dist/skills/installed.js.map +1 -0
  314. package/dist/standing-orders/evaluator.d.ts +113 -0
  315. package/dist/standing-orders/evaluator.d.ts.map +1 -0
  316. package/dist/standing-orders/evaluator.js +225 -0
  317. package/dist/standing-orders/evaluator.js.map +1 -0
  318. package/dist/standing-orders/history.d.ts +58 -0
  319. package/dist/standing-orders/history.d.ts.map +1 -0
  320. package/dist/standing-orders/history.js +117 -0
  321. package/dist/standing-orders/history.js.map +1 -0
  322. package/dist/standing-orders/parse.d.ts +19 -0
  323. package/dist/standing-orders/parse.d.ts.map +1 -0
  324. package/dist/standing-orders/parse.js +75 -0
  325. package/dist/standing-orders/parse.js.map +1 -0
  326. package/dist/standing-orders/routes.d.ts +180 -0
  327. package/dist/standing-orders/routes.d.ts.map +1 -0
  328. package/dist/standing-orders/routes.js +95 -0
  329. package/dist/standing-orders/routes.js.map +1 -0
  330. package/dist/standing-orders/store.d.ts +154 -0
  331. package/dist/standing-orders/store.d.ts.map +1 -0
  332. package/dist/standing-orders/store.js +189 -0
  333. package/dist/standing-orders/store.js.map +1 -0
  334. package/dist/studio/assets/index-CvV5qITf.css +32 -0
  335. package/dist/studio/assets/index-jCOy6Ns7.js +568 -0
  336. package/dist/studio/index.html +3 -3
  337. package/dist/studio/testid-inventory.json +3274 -894
  338. package/dist/team/key.d.ts +5 -0
  339. package/dist/team/key.d.ts.map +1 -0
  340. package/dist/team/key.js +21 -0
  341. package/dist/team/key.js.map +1 -0
  342. package/dist/team/routes.d.ts +196 -0
  343. package/dist/team/routes.d.ts.map +1 -0
  344. package/dist/team/routes.js +274 -0
  345. package/dist/team/routes.js.map +1 -0
  346. package/dist/team/ws-relay.d.ts +39 -0
  347. package/dist/team/ws-relay.d.ts.map +1 -0
  348. package/dist/team/ws-relay.js +63 -0
  349. package/dist/team/ws-relay.js.map +1 -0
  350. package/endpoint-manifest.json +502 -6
  351. package/package.json +6 -6
  352. package/dist/interactive/demo-events.d.ts +0 -367
  353. package/dist/interactive/demo-events.d.ts.map +0 -1
  354. package/dist/interactive/demo-events.js +0 -1293
  355. package/dist/interactive/demo-events.js.map +0 -1
  356. package/dist/qe/gate-events.d.ts +0 -113
  357. package/dist/qe/gate-events.d.ts.map +0 -1
  358. package/dist/qe/gate-events.js +0 -172
  359. package/dist/qe/gate-events.js.map +0 -1
  360. package/dist/studio/assets/index-Bg7Z3BR-.css +0 -32
  361. package/dist/studio/assets/index-BvOFMjf9.js +0 -554
@@ -0,0 +1,400 @@
1
+ /**
2
+ * MCP policies: the preview matrix and the approvals (DES-MCP-TOOLS-001 §4.5, §4.7, §8; slice S6).
3
+ *
4
+ * - **Preview.** `preview` answers what a call to each tool WOULD get, per phase role × seat × run
5
+ * mode, under the policies in the store right now. It is the engine's own evaluation
6
+ * (`Core.previewMcpCalls`, the same `evaluate` the broker's `evaluateMcpCall` runs) over
7
+ * synthetic unit cells, and nothing is recorded. `previewUnsaved` does the same for a server
8
+ * that is being added, judged as if it were saved now.
9
+ * - **Approvals.** An approval is an audited policy edit, never a grant. It adds a token to the
10
+ * `excludes` of the ledger rules the `mcp-defaults` pack ships: `MCP-FIRST-USE` (the first use
11
+ * of a server asks in every mode) and `MCP-POSTURE-WRITE` (balanced mode asks for a write until
12
+ * the tool is approved). Approving a SERVER (`mcp:<server>`) approves its first use only, so its
13
+ * write tools still ask in balanced mode, one by one (§4.5: a server-level grant would hide the
14
+ * destructive tools behind the one read the operator tried). Approving a TOOL
15
+ * (`mcp:<server>/<tool>`) approves that tool's first use and its writes. Revoking removes the
16
+ * token from both. An approval never lifts an engine gate (D-1, D-5) or an explicit deny:
17
+ * deny dominates in the engine.
18
+ * - **Withdrawal.** A saved tool whose schema changed, and a removed server, lose their approvals,
19
+ * so the next call asks again (operator decision 1: first use asks, "and again when a tool's
20
+ * schema changes"). A server-wide approval cannot exclude one tool, so a changed tool withdraws
21
+ * the server's approval too: the server asks again on its next first use.
22
+ *
23
+ * Ledger edits are read-modify-write of one rule, so they are serialized here.
24
+ */
25
+ import { MCP_SERVER_NAME_RE, parseMcpSubject } from './classify.js';
26
+ import { McpRegistryError } from './registry.js';
27
+ /**
28
+ * A ledger edit that failed part-way. `changed` names the rules still changed after the rollback
29
+ * (empty when the rollback restored them all); the route audits those before answering 502.
30
+ */
31
+ export class McpLedgerEditError extends McpRegistryError {
32
+ changed;
33
+ constructor(changed, message) {
34
+ super(502, 'ledger_edit_failed', message);
35
+ this.changed = changed;
36
+ }
37
+ }
38
+ /** The first-use approvals ledger (the engine reads its `excludes`, active or retired). */
39
+ export const FIRST_USE_LEDGER = 'MCP-FIRST-USE';
40
+ /** The balanced-mode write approvals ledger. */
41
+ export const WRITE_LEDGER = 'MCP-POSTURE-WRITE';
42
+ /** The six seats a governed unit can run on; the matrix has one column per seat. */
43
+ export const MCP_PREVIEW_SEATS = ['claude', 'codex', 'opencode', 'copilot', 'pi', 'agy'];
44
+ export const MCP_PREVIEW_ROLES = ['creator', 'evaluator', 'recon'];
45
+ export const MCP_RUN_MODES = ['ask', 'balanced', 'autonomous'];
46
+ /** `mcp:<server>` or `mcp:<server>/<tool>` → its parts, or `null`. */
47
+ export function parseApprovalSubject(subject) {
48
+ if (!subject.startsWith('mcp:'))
49
+ return null;
50
+ const rest = subject.slice(4);
51
+ if (!rest.includes('/'))
52
+ return MCP_SERVER_NAME_RE.test(rest) ? { server: rest, tool: null } : null;
53
+ const parts = parseMcpSubject(subject);
54
+ if (parts === null || !/^[A-Za-z0-9_.-]{1,128}$/.test(parts.tool))
55
+ return null;
56
+ return parts;
57
+ }
58
+ /** Engine tool annotations: only the hints (the engine ignores `title`). */
59
+ function hints(a) {
60
+ if (a === null)
61
+ return null;
62
+ const out = {};
63
+ if (a.readOnlyHint !== undefined)
64
+ out.readOnlyHint = a.readOnlyHint;
65
+ if (a.destructiveHint !== undefined)
66
+ out.destructiveHint = a.destructiveHint;
67
+ if (a.idempotentHint !== undefined)
68
+ out.idempotentHint = a.idempotentHint;
69
+ if (a.openWorldHint !== undefined)
70
+ out.openWorldHint = a.openWorldHint;
71
+ return out;
72
+ }
73
+ function approvalState(tokens, server, subject) {
74
+ if (tokens.has(`mcp:${server}`))
75
+ return 'server';
76
+ if (tokens.has(subject))
77
+ return 'tool';
78
+ return null;
79
+ }
80
+ export class McpPolicies {
81
+ registry;
82
+ engine;
83
+ chain = Promise.resolve();
84
+ constructor(registry, engine) {
85
+ this.registry = registry;
86
+ this.engine = engine;
87
+ }
88
+ // ── the preview ────────────────────────────────────────────────────────────────────────────
89
+ async preview(query) {
90
+ const cells = this.cells(query);
91
+ const { servers } = await this.registry.list();
92
+ let targets;
93
+ if (query.subject !== undefined) {
94
+ const parts = parseMcpSubject(query.subject);
95
+ const server = parts === null ? undefined : servers.find((s) => s.name === parts.server);
96
+ const tool = server?.tools.find((t) => t.name === parts?.tool);
97
+ if (server === undefined || tool === undefined)
98
+ throw new McpRegistryError(404, 'unknown_tool', `no tool ${query.subject}`);
99
+ targets = [{ server, tool }];
100
+ }
101
+ else if (query.server !== undefined) {
102
+ const server = servers.find((s) => s.name === query.server);
103
+ if (server === undefined)
104
+ throw new McpRegistryError(404, 'unknown_server', `no MCP server named ${query.server}`);
105
+ targets = server.tools.filter((t) => t.status !== 'gone').map((tool) => ({ server, tool }));
106
+ }
107
+ else {
108
+ targets = servers.flatMap((server) => server.tools.filter((t) => t.status !== 'gone').map((tool) => ({ server, tool })));
109
+ }
110
+ const ledgers = await this.ledgers();
111
+ const calls = targets.map(({ server, tool }) => ({
112
+ server: server.name,
113
+ tool: tool.name,
114
+ annotations: hints(tool.annotations),
115
+ classOverride: tool.classOverride,
116
+ // What the broker will send (§6 step 2): unknown, disabled or changed is unregistered.
117
+ registered: server.enabled && tool.enabled && tool.status === 'registered',
118
+ kind: server.kind,
119
+ }));
120
+ const results = await this.judge(calls, cells);
121
+ return {
122
+ ...this.axes(cells, query.phaseId),
123
+ withdrawOnSave: [],
124
+ tools: targets.map(({ server, tool }, i) => ({
125
+ subject: tool.subject,
126
+ server: server.name,
127
+ tool: tool.name,
128
+ class: results[i]?.[0]?.class ?? tool.class,
129
+ status: tool.status,
130
+ enabled: server.enabled && tool.enabled,
131
+ registered: calls[i]?.registered ?? false,
132
+ approval: this.approvalOf(ledgers, server.name, tool.subject),
133
+ cells: results[i] ?? [],
134
+ })),
135
+ };
136
+ }
137
+ /**
138
+ * The matrix for a server that is being added (`POST /mcp/servers/preview`): every tool judged
139
+ * as if the preview were saved now, so the operator sees what would run, ask or be denied.
140
+ */
141
+ async previewUnsaved(server, tools) {
142
+ const cells = this.cells({});
143
+ const ledgers = await this.ledgers();
144
+ const withdrawOnSave = await this.withdrawnBySave({ name: server.name, tools });
145
+ const calls = tools.map((t) => ({
146
+ server: server.name,
147
+ tool: t.name,
148
+ annotations: hints(t.annotations),
149
+ classOverride: null,
150
+ registered: true,
151
+ kind: server.kind,
152
+ }));
153
+ const results = await this.judge(calls, cells);
154
+ return {
155
+ ...this.axes(cells, undefined),
156
+ withdrawOnSave,
157
+ tools: tools.map((t, i) => ({
158
+ subject: t.subject,
159
+ server: server.name,
160
+ tool: t.name,
161
+ class: results[i]?.[0]?.class ?? t.class,
162
+ status: 'registered',
163
+ enabled: true,
164
+ registered: true,
165
+ approval: this.approvalOf(ledgers, server.name, t.subject),
166
+ cells: results[i] ?? [],
167
+ })),
168
+ };
169
+ }
170
+ // ── approvals ──────────────────────────────────────────────────────────────────────────────
171
+ async approvals() {
172
+ const ledgers = await this.ledgers();
173
+ const tokens = new Set([...ledgers.firstUse.tokens, ...ledgers.write.tokens]);
174
+ const approved = [...tokens].sort().map((subject) => ({
175
+ subject,
176
+ scope: subject.includes('/') ? 'tool' : 'server',
177
+ firstUse: ledgers.firstUse.tokens.has(subject),
178
+ write: ledgers.write.tokens.has(subject),
179
+ }));
180
+ const { servers } = await this.registry.list();
181
+ const pending = [];
182
+ for (const s of servers) {
183
+ if (!s.enabled)
184
+ continue;
185
+ for (const t of s.tools) {
186
+ if (!t.enabled || t.status !== 'registered')
187
+ continue;
188
+ const needs = [];
189
+ if (approvalState(ledgers.firstUse.tokens, s.name, t.subject) === null)
190
+ needs.push('first-use');
191
+ if (t.class !== 'read' && approvalState(ledgers.write.tokens, s.name, t.subject) === null)
192
+ needs.push('write');
193
+ if (needs.length > 0)
194
+ pending.push({ subject: t.subject, server: s.name, tool: t.name, class: t.class, needs });
195
+ }
196
+ }
197
+ return { approved, pending, ledgers: { firstUse: ledgers.firstUse.state, write: ledgers.write.state } };
198
+ }
199
+ /** Approve a subject (a server: first use; a tool: first use and writes). Answers the rule ids that changed. */
200
+ async approve(subject) {
201
+ const parts = parseApprovalSubject(subject);
202
+ if (parts === null)
203
+ throw new McpRegistryError(400, 'bad_subject', 'a subject is mcp:<server> or mcp:<server>/<tool>');
204
+ const server = (await this.registry.list()).servers.find((s) => s.name === parts.server);
205
+ if (server === undefined)
206
+ throw new McpRegistryError(404, 'unknown_server', `no MCP server named ${parts.server}`);
207
+ if (parts.tool !== null && !server.tools.some((t) => t.name === parts.tool && t.status !== 'gone')) {
208
+ throw new McpRegistryError(404, 'unknown_tool', `no tool ${subject}`);
209
+ }
210
+ const ledgers = parts.tool === null ? [FIRST_USE_LEDGER] : [FIRST_USE_LEDGER, WRITE_LEDGER];
211
+ return this.edit((rule) => {
212
+ if (!ledgers.includes(rule.id))
213
+ return null;
214
+ const excludes = rule.excludes ?? [];
215
+ if (excludes.includes(subject))
216
+ return null;
217
+ return [...excludes, subject];
218
+ });
219
+ }
220
+ /** Revoke a subject's approval from both ledgers. 404 when neither holds it. */
221
+ async revoke(subject) {
222
+ if (parseApprovalSubject(subject) === null)
223
+ throw new McpRegistryError(400, 'bad_subject', 'a subject is mcp:<server> or mcp:<server>/<tool>');
224
+ const changed = await this.withdraw([subject]);
225
+ if (changed.length === 0)
226
+ throw new McpRegistryError(404, 'not_approved', `${subject} is not approved`);
227
+ return changed;
228
+ }
229
+ /** Remove every listed token from both ledgers (revoke, a changed schema, a removed server). */
230
+ async withdraw(tokens) {
231
+ if (tokens.length === 0)
232
+ return [];
233
+ const drop = new Set(tokens);
234
+ return this.edit((rule) => {
235
+ const excludes = rule.excludes ?? [];
236
+ const kept = excludes.filter((x) => !drop.has(x));
237
+ return kept.length === excludes.length ? null : kept;
238
+ });
239
+ }
240
+ /**
241
+ * The approval tokens saving `next` over the registered server of the same name withdraws: each
242
+ * tool whose saved schema changed, and the server's own token when any did (a server-wide
243
+ * approval cannot leave one tool out). Empty for a new server or an unchanged one.
244
+ */
245
+ async withdrawnBySave(next) {
246
+ let prior;
247
+ try {
248
+ prior = await this.registry.get(next.name);
249
+ }
250
+ catch (err) {
251
+ if (err instanceof McpRegistryError && err.status === 404)
252
+ return [];
253
+ throw err;
254
+ }
255
+ // A `gone` tool keeps its last saved schema hash (the registry never deletes one), so a tool
256
+ // that is dropped and later returns with a different schema counts as changed here too; one
257
+ // that returns unchanged keeps its approval, and while gone it is unregistered (D-5) anyway.
258
+ const changed = prior.tools.filter((t) => {
259
+ if (t.schemaHash === null)
260
+ return false;
261
+ const now = next.tools.find((x) => x.name === t.name);
262
+ return now !== undefined && now.schemaHash !== t.schemaHash;
263
+ });
264
+ if (changed.length === 0)
265
+ return [];
266
+ const held = new Set(await this.tokensOf(next.name));
267
+ return [`mcp:${next.name}`, ...changed.map((t) => t.subject)].filter((t) => held.has(t));
268
+ }
269
+ /** Every approval token that names `server` (the server's own and each of its tools'). */
270
+ async tokensOf(server) {
271
+ const l = await this.ledgers();
272
+ return [...new Set([...l.firstUse.tokens, ...l.write.tokens])].filter((t) => t === `mcp:${server}` || t.startsWith(`mcp:${server}/`));
273
+ }
274
+ // ── internals ──────────────────────────────────────────────────────────────────────────────
275
+ cells(query) {
276
+ const roles = query.phaseRole !== undefined ? [query.phaseRole] : MCP_PREVIEW_ROLES;
277
+ const seats = query.seat !== undefined ? [query.seat] : MCP_PREVIEW_SEATS;
278
+ const modes = query.mode !== undefined ? [query.mode] : MCP_RUN_MODES;
279
+ const cells = [];
280
+ for (const role of roles)
281
+ for (const seat of seats)
282
+ for (const mode of modes)
283
+ cells.push({ role, seat, mode, ...(query.phaseId !== undefined ? { phaseId: query.phaseId } : {}) });
284
+ return cells;
285
+ }
286
+ axes(cells, phaseId) {
287
+ const uniq = (xs) => [...new Set(xs)];
288
+ return {
289
+ roles: uniq(cells.map((c) => c.role)),
290
+ seats: uniq(cells.map((c) => c.seat)),
291
+ modes: uniq(cells.map((c) => c.mode)),
292
+ phaseId: phaseId ?? null,
293
+ };
294
+ }
295
+ async judge(calls, cells) {
296
+ if (calls.length === 0)
297
+ return [];
298
+ let raw;
299
+ try {
300
+ raw = await this.engine.previewCalls(JSON.stringify({ calls, cells }));
301
+ }
302
+ catch (err) {
303
+ const msg = err instanceof Error ? err.message : String(err);
304
+ if (msg.startsWith('bad_request:'))
305
+ throw new McpRegistryError(400, 'bad_request', msg);
306
+ if (msg.startsWith('mcp_preview_unsupported:'))
307
+ throw new McpRegistryError(501, 'mcp_preview_unsupported', msg);
308
+ throw new McpRegistryError(502, 'preview_failed', `the engine could not judge the preview: ${msg}`);
309
+ }
310
+ let parsed;
311
+ try {
312
+ parsed = JSON.parse(raw);
313
+ if (!Array.isArray(parsed) || parsed.length !== calls.length || !parsed.every((r) => Array.isArray(r?.cells)))
314
+ throw new Error('not one verdict row per call');
315
+ }
316
+ catch (err) {
317
+ const msg = err instanceof Error ? err.message : String(err);
318
+ throw new McpRegistryError(502, 'preview_failed', `the engine answered an unreadable preview: ${msg}`);
319
+ }
320
+ return parsed.map((r) => r.cells.map((c) => ({
321
+ role: c.role,
322
+ seat: c.seat,
323
+ mode: c.mode,
324
+ ...(c.phaseId !== undefined ? { phaseId: c.phaseId } : {}),
325
+ decision: c.decision,
326
+ class: c.class,
327
+ ruleIds: c.ruleIds,
328
+ obligations: c.obligations,
329
+ reason: c.reason ?? null,
330
+ })));
331
+ }
332
+ async ledgers() {
333
+ const rules = await this.engine.listRules();
334
+ const one = (id) => {
335
+ const r = rules.find((x) => x.id === id);
336
+ return {
337
+ state: { id, present: r !== undefined, retired: r?.retired === true },
338
+ tokens: new Set(r?.excludes ?? []),
339
+ };
340
+ };
341
+ return { firstUse: one(FIRST_USE_LEDGER), write: one(WRITE_LEDGER) };
342
+ }
343
+ approvalOf(ledgers, server, subject) {
344
+ return {
345
+ firstUse: approvalState(ledgers.firstUse.tokens, server, subject),
346
+ write: approvalState(ledgers.write.tokens, server, subject),
347
+ };
348
+ }
349
+ /**
350
+ * Apply `next` to both ledgers' `excludes`, serialized. `next` answers the new list or `null` for
351
+ * no change. A missing ledger refuses the edit: the pack is seeded at boot, so its absence means
352
+ * the store is not the engine's (fail closed, nothing half-written).
353
+ */
354
+ edit(next) {
355
+ const run = async () => {
356
+ const rules = await this.engine.listRules();
357
+ const changed = [];
358
+ const edits = [];
359
+ for (const id of [FIRST_USE_LEDGER, WRITE_LEDGER]) {
360
+ const rule = rules.find((r) => r.id === id);
361
+ if (rule === undefined) {
362
+ throw new McpRegistryError(503, 'ledger_missing', `the mcp-defaults rule ${id} is not in the policy store; restart the daemon to seed it`);
363
+ }
364
+ const excludes = next(rule);
365
+ if (excludes === null)
366
+ continue;
367
+ edits.push({ ...rule, excludes });
368
+ changed.push(id);
369
+ }
370
+ // Two rules, no store transaction: on a failed write, put back the ones already written, so
371
+ // an approval lands in both ledgers or in neither. What a failed rollback leaves changed is
372
+ // named on the error, so the route audits it (every ledger change is audited, even a partial one).
373
+ const applied = [];
374
+ try {
375
+ for (const rule of edits) {
376
+ await this.engine.upsertRule(rule);
377
+ applied.push(rules.find((r) => r.id === rule.id));
378
+ }
379
+ }
380
+ catch (err) {
381
+ const stuck = [];
382
+ for (const original of applied.reverse()) {
383
+ try {
384
+ await this.engine.upsertRule(original);
385
+ }
386
+ catch {
387
+ stuck.push(original.id);
388
+ }
389
+ }
390
+ const msg = err instanceof Error ? err.message : String(err);
391
+ throw new McpLedgerEditError(stuck, `the approval ledger edit failed and was rolled back${stuck.length > 0 ? ` except ${stuck.join(', ')}` : ''}: ${msg}`);
392
+ }
393
+ return changed;
394
+ };
395
+ const result = this.chain.then(run, run);
396
+ this.chain = result.catch(() => undefined);
397
+ return result;
398
+ }
399
+ }
400
+ //# sourceMappingURL=policies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies.js","sourceRoot":"","sources":["../../src/mcp/policies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Probe an upstream MCP server: connect, `initialize`, page through `tools/list`, disconnect
3
+ * (DES-MCP-TOOLS-001 §8 `POST /mcp/servers/preview` and `/test`).
4
+ *
5
+ * - Bounded: the whole probe has one deadline (10 s by default); a server that hangs is closed and
6
+ * the probe fails with `timed out`.
7
+ * - Hardened env for stdio: the SDK's safe inherited set (HOME, LOGNAME, PATH, SHELL, TERM, USER on
8
+ * POSIX) plus, when the server has auth, the ONE variable the secret is injected into. Nothing
9
+ * else of the daemon's env (tokens, `WICKED_*`) reaches the upstream.
10
+ * - Scrubbed: the resolved secret is removed from everything the probe returns — tool
11
+ * descriptions and schemas, server info, and an error's message and stderr tail — so an
12
+ * upstream that echoes its credential cannot carry it into a response (D-2).
13
+ */
14
+ import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
15
+ import type { McpAuthConfig, McpRestMapping, McpToolAnnotations, McpUpstreamKind } from '../core/types.js';
16
+ export declare const MCP_PROBE_TIMEOUT_MS = 10000;
17
+ /** What crew needs to reach an upstream. Secret values are passed separately, never stored here. */
18
+ export interface McpUpstreamConfig {
19
+ name: string;
20
+ kind: McpUpstreamKind;
21
+ command: string | null;
22
+ args: string[];
23
+ url: string | null;
24
+ auth: McpAuthConfig | null;
25
+ /** `rest` only (slice S5a): where the OpenAPI document is fetched from. */
26
+ openapiUrl?: string | null;
27
+ /** `rest` only: the OpenAPI document as pasted (instead of `openapiUrl`). */
28
+ openapi?: Record<string, unknown> | null;
29
+ /** `rest` only: the operations to wrap; `null`/absent = all. */
30
+ operations?: string[] | null;
31
+ }
32
+ export interface ProbedTool {
33
+ name: string;
34
+ description: string | null;
35
+ inputSchema: Record<string, unknown> | null;
36
+ outputSchema: Record<string, unknown> | null;
37
+ annotations: McpToolAnnotations | null;
38
+ /** A `rest` tool's request mapping; absent/`null` for an MCP server's tool. */
39
+ rest?: McpRestMapping | null;
40
+ }
41
+ export type ProbeResult = {
42
+ ok: true;
43
+ serverInfo: {
44
+ name: string;
45
+ version: string;
46
+ } | null;
47
+ tools: ProbedTool[];
48
+ skipped?: string[];
49
+ } | {
50
+ ok: false;
51
+ error: string;
52
+ };
53
+ export type Prober = (config: McpUpstreamConfig, secret: string | null) => Promise<ProbeResult>;
54
+ /** Keep only the annotation fields the spec defines, with the types it defines. */
55
+ export declare function normalizeAnnotations(raw: unknown): McpToolAnnotations | null;
56
+ /**
57
+ * The transport to one upstream, with the hardened env (stdio) or the auth header (http). Shared by
58
+ * the probe and the broker's call path (`invoke.ts`), so both reach an upstream the same way.
59
+ */
60
+ export declare function transportFor(config: McpUpstreamConfig, secret: string | null): {
61
+ transport: Transport;
62
+ stderrTail: () => string;
63
+ };
64
+ /** The real prober. Every string it returns has `secret` scrubbed out. */
65
+ export declare const probeMcpServer: Prober;
66
+ //# sourceMappingURL=probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../src/mcp/probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAE/E,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAI3G,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAK3C,oGAAoG;AACpG,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7C,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACvC,+EAA+E;IAC/E,IAAI,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC3G;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,MAAM,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAIhG,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAS5E;AAMD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG;IAAE,SAAS,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,MAAM,CAAA;CAAE,CAkBjI;AAED,0EAA0E;AAC1E,eAAO,MAAM,cAAc,EAAE,MA0C5B,CAAC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Probe an upstream MCP server: connect, `initialize`, page through `tools/list`, disconnect
3
+ * (DES-MCP-TOOLS-001 §8 `POST /mcp/servers/preview` and `/test`).
4
+ *
5
+ * - Bounded: the whole probe has one deadline (10 s by default); a server that hangs is closed and
6
+ * the probe fails with `timed out`.
7
+ * - Hardened env for stdio: the SDK's safe inherited set (HOME, LOGNAME, PATH, SHELL, TERM, USER on
8
+ * POSIX) plus, when the server has auth, the ONE variable the secret is injected into. Nothing
9
+ * else of the daemon's env (tokens, `WICKED_*`) reaches the upstream.
10
+ * - Scrubbed: the resolved secret is removed from everything the probe returns — tool
11
+ * descriptions and schemas, server info, and an error's message and stderr tail — so an
12
+ * upstream that echoes its credential cannot carry it into a response (D-2).
13
+ */
14
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
15
+ import { getDefaultEnvironment, StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
16
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
17
+ import { probeRestServer } from './rest.js';
18
+ import { scrubSecrets } from './secrets.js';
19
+ export const MCP_PROBE_TIMEOUT_MS = 10_000;
20
+ const STDERR_TAIL_BYTES = 2048;
21
+ const MAX_TOOLS = 512;
22
+ const MAX_PAGES = 32;
23
+ const ANNOTATION_BOOLEANS = ['readOnlyHint', 'destructiveHint', 'idempotentHint', 'openWorldHint'];
24
+ /** Keep only the annotation fields the spec defines, with the types it defines. */
25
+ export function normalizeAnnotations(raw) {
26
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
27
+ return null;
28
+ const src = raw;
29
+ const out = {};
30
+ for (const key of ANNOTATION_BOOLEANS) {
31
+ if (typeof src[key] === 'boolean')
32
+ out[key] = src[key];
33
+ }
34
+ if (typeof src['title'] === 'string')
35
+ out.title = src['title'];
36
+ return Object.keys(out).length === 0 ? null : out;
37
+ }
38
+ function objectOrNull(raw) {
39
+ return raw !== null && typeof raw === 'object' && !Array.isArray(raw) ? raw : null;
40
+ }
41
+ /**
42
+ * The transport to one upstream, with the hardened env (stdio) or the auth header (http). Shared by
43
+ * the probe and the broker's call path (`invoke.ts`), so both reach an upstream the same way.
44
+ */
45
+ export function transportFor(config, secret) {
46
+ if (config.kind === 'rest')
47
+ throw new Error('a rest upstream is not an MCP server; it has no MCP transport');
48
+ if (config.kind === 'mcp-stdio') {
49
+ const env = { ...getDefaultEnvironment() };
50
+ if (config.auth?.env !== undefined && secret !== null)
51
+ env[config.auth.env] = secret;
52
+ const transport = new StdioClientTransport({ command: config.command ?? '', args: config.args, env, stderr: 'pipe' });
53
+ let tail = '';
54
+ transport.stderr?.on('data', (chunk) => {
55
+ tail = (tail + chunk.toString('utf8')).slice(-STDERR_TAIL_BYTES);
56
+ });
57
+ return { transport, stderrTail: () => tail };
58
+ }
59
+ const headers = {};
60
+ if (config.auth?.header !== undefined && secret !== null)
61
+ headers[config.auth.header] = `${config.auth.prefix ?? ''}${secret}`;
62
+ const http = new StreamableHTTPClientTransport(new URL(config.url ?? ''), { requestInit: { headers } });
63
+ // The SDK's own class declares `sessionId?: string` against its `Transport` interface, which
64
+ // `exactOptionalPropertyTypes` refuses; the runtime shapes are the same.
65
+ return { transport: http, stderrTail: () => '' };
66
+ }
67
+ /** The real prober. Every string it returns has `secret` scrubbed out. */
68
+ export const probeMcpServer = async (config, secret) => {
69
+ if (config.kind === 'rest')
70
+ return probeRestServer(config, secret);
71
+ const secrets = secret === null ? [] : [secret];
72
+ const { transport, stderrTail } = transportFor(config, secret);
73
+ const client = new Client({ name: 'wicked-crew-mcp-probe', version: '1' }, { capabilities: {} });
74
+ let timer;
75
+ const deadline = new Promise((_, reject) => {
76
+ timer = setTimeout(() => reject(new Error(`timed out after ${MCP_PROBE_TIMEOUT_MS / 1000} s`)), MCP_PROBE_TIMEOUT_MS);
77
+ });
78
+ const work = (async () => {
79
+ await client.connect(transport);
80
+ const tools = [];
81
+ let cursor;
82
+ for (let page = 0; page < MAX_PAGES; page++) {
83
+ const res = await client.listTools(cursor === undefined ? {} : { cursor });
84
+ for (const t of res.tools) {
85
+ if (tools.length >= MAX_TOOLS)
86
+ break;
87
+ tools.push({
88
+ name: t.name,
89
+ description: typeof t.description === 'string' ? t.description : null,
90
+ inputSchema: objectOrNull(t.inputSchema),
91
+ outputSchema: objectOrNull(t.outputSchema),
92
+ annotations: normalizeAnnotations(t.annotations),
93
+ });
94
+ }
95
+ cursor = res.nextCursor;
96
+ if (cursor === undefined || tools.length >= MAX_TOOLS)
97
+ break;
98
+ }
99
+ const info = client.getServerVersion();
100
+ return { ok: true, serverInfo: info === undefined ? null : { name: info.name, version: info.version }, tools };
101
+ })();
102
+ try {
103
+ return scrubSecrets(await Promise.race([work, deadline]), secrets);
104
+ }
105
+ catch (err) {
106
+ work.catch(() => undefined);
107
+ const message = err instanceof Error ? err.message : String(err);
108
+ const tail = stderrTail().trim();
109
+ return scrubSecrets({ ok: false, error: tail === '' ? message : `${message}; stderr: ${tail}` }, secrets);
110
+ }
111
+ finally {
112
+ clearTimeout(timer);
113
+ await client.close().catch(() => undefined);
114
+ }
115
+ };
116
+ //# sourceMappingURL=probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/mcp/probe.ts"],"names":[],"mappings":"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"}