wicked-crew 0.7.39 → 0.7.45

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 (380) 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-scope.d.ts +37 -1
  14. package/dist/api/chat-scope.d.ts.map +1 -1
  15. package/dist/api/chat-scope.js +131 -7
  16. package/dist/api/chat-scope.js.map +1 -1
  17. package/dist/api/chat-transcripts.d.ts +20 -1
  18. package/dist/api/chat-transcripts.d.ts.map +1 -1
  19. package/dist/api/chat-transcripts.js +29 -0
  20. package/dist/api/chat-transcripts.js.map +1 -1
  21. package/dist/api/delivery-cache.d.ts +2 -2
  22. package/dist/api/delivery-freeze.d.ts +66 -0
  23. package/dist/api/delivery-freeze.d.ts.map +1 -0
  24. package/dist/api/delivery-freeze.js +104 -0
  25. package/dist/api/delivery-freeze.js.map +1 -0
  26. package/dist/api/delivery-index.d.ts +53 -9
  27. package/dist/api/delivery-index.d.ts.map +1 -1
  28. package/dist/api/delivery-index.js +115 -22
  29. package/dist/api/delivery-index.js.map +1 -1
  30. package/dist/api/demo.d.ts +90 -0
  31. package/dist/api/demo.d.ts.map +1 -0
  32. package/dist/api/demo.js +492 -0
  33. package/dist/api/demo.js.map +1 -0
  34. package/dist/api/diagnostics.d.ts +64 -1
  35. package/dist/api/diagnostics.d.ts.map +1 -1
  36. package/dist/api/diagnostics.js +129 -1
  37. package/dist/api/diagnostics.js.map +1 -1
  38. package/dist/api/eval-sample.d.ts +6 -6
  39. package/dist/api/governance-steering.d.ts +2 -2
  40. package/dist/api/mcp.d.ts +282 -0
  41. package/dist/api/mcp.d.ts.map +1 -0
  42. package/dist/api/mcp.js +521 -0
  43. package/dist/api/mcp.js.map +1 -0
  44. package/dist/api/plan-schema.d.ts +56 -0
  45. package/dist/api/plan-schema.d.ts.map +1 -0
  46. package/dist/api/plan-schema.js +26 -0
  47. package/dist/api/plan-schema.js.map +1 -0
  48. package/dist/api/roster-standing.d.ts +15 -2
  49. package/dist/api/roster-standing.d.ts.map +1 -1
  50. package/dist/api/roster-standing.js +55 -3
  51. package/dist/api/roster-standing.js.map +1 -1
  52. package/dist/api/routes.d.ts +647 -59
  53. package/dist/api/routes.d.ts.map +1 -1
  54. package/dist/api/routes.js +906 -146
  55. package/dist/api/routes.js.map +1 -1
  56. package/dist/api/run-files.d.ts.map +1 -1
  57. package/dist/api/run-files.js +31 -2
  58. package/dist/api/run-files.js.map +1 -1
  59. package/dist/api/run-liveness.d.ts +41 -0
  60. package/dist/api/run-liveness.d.ts.map +1 -0
  61. package/dist/api/run-liveness.js +166 -0
  62. package/dist/api/run-liveness.js.map +1 -0
  63. package/dist/api/run-timing-index.d.ts +10 -0
  64. package/dist/api/run-timing-index.d.ts.map +1 -1
  65. package/dist/api/run-timing-index.js +24 -0
  66. package/dist/api/run-timing-index.js.map +1 -1
  67. package/dist/api/seat-health.d.ts.map +1 -1
  68. package/dist/api/seat-health.js +20 -4
  69. package/dist/api/seat-health.js.map +1 -1
  70. package/dist/api/seat-probe.d.ts +141 -0
  71. package/dist/api/seat-probe.d.ts.map +1 -0
  72. package/dist/api/seat-probe.js +257 -0
  73. package/dist/api/seat-probe.js.map +1 -0
  74. package/dist/api/seat-record.d.ts +40 -0
  75. package/dist/api/seat-record.d.ts.map +1 -0
  76. package/dist/api/seat-record.js +218 -0
  77. package/dist/api/seat-record.js.map +1 -0
  78. package/dist/api/seat-signin.d.ts.map +1 -1
  79. package/dist/api/seat-signin.js +3 -1
  80. package/dist/api/seat-signin.js.map +1 -1
  81. package/dist/api/seat-standing.d.ts +24 -4
  82. package/dist/api/seat-standing.d.ts.map +1 -1
  83. package/dist/api/seat-standing.js +50 -3
  84. package/dist/api/seat-standing.js.map +1 -1
  85. package/dist/api/server.d.ts +34 -48
  86. package/dist/api/server.d.ts.map +1 -1
  87. package/dist/api/server.js +316 -116
  88. package/dist/api/server.js.map +1 -1
  89. package/dist/api/skills.d.ts +3 -1
  90. package/dist/api/skills.d.ts.map +1 -1
  91. package/dist/api/skills.js +7 -2
  92. package/dist/api/skills.js.map +1 -1
  93. package/dist/api/stall-watchdog.d.ts +34 -3
  94. package/dist/api/stall-watchdog.d.ts.map +1 -1
  95. package/dist/api/stall-watchdog.js +107 -8
  96. package/dist/api/stall-watchdog.js.map +1 -1
  97. package/dist/api/steering-landing.d.ts +6 -6
  98. package/dist/api/steering-landing.d.ts.map +1 -1
  99. package/dist/api/steering-landing.js +7 -9
  100. package/dist/api/steering-landing.js.map +1 -1
  101. package/dist/api/testing.d.ts +6 -4
  102. package/dist/api/testing.d.ts.map +1 -1
  103. package/dist/api/testing.js +82 -47
  104. package/dist/api/testing.js.map +1 -1
  105. package/dist/campaign/boot-resume.d.ts +34 -0
  106. package/dist/campaign/boot-resume.d.ts.map +1 -0
  107. package/dist/campaign/boot-resume.js +45 -0
  108. package/dist/campaign/boot-resume.js.map +1 -0
  109. package/dist/campaigns/rollup.d.ts +4 -1
  110. package/dist/campaigns/rollup.d.ts.map +1 -1
  111. package/dist/campaigns/rollup.js +6 -1
  112. package/dist/campaigns/rollup.js.map +1 -1
  113. package/dist/campaigns/routes.d.ts +2 -2
  114. package/dist/cli/bearer.d.ts +27 -1
  115. package/dist/cli/bearer.d.ts.map +1 -1
  116. package/dist/cli/bearer.js +62 -2
  117. package/dist/cli/bearer.js.map +1 -1
  118. package/dist/cli/governance.d.ts +11 -0
  119. package/dist/cli/governance.d.ts.map +1 -1
  120. package/dist/cli/governance.js +8 -2
  121. package/dist/cli/governance.js.map +1 -1
  122. package/dist/cli/index.d.ts.map +1 -1
  123. package/dist/cli/index.js +140 -75
  124. package/dist/cli/index.js.map +1 -1
  125. package/dist/cli/mcp.d.ts +11 -0
  126. package/dist/cli/mcp.d.ts.map +1 -1
  127. package/dist/cli/mcp.js +40 -9
  128. package/dist/cli/mcp.js.map +1 -1
  129. package/dist/cli/service.d.ts +78 -0
  130. package/dist/cli/service.d.ts.map +1 -0
  131. package/dist/cli/service.js +334 -0
  132. package/dist/cli/service.js.map +1 -0
  133. package/dist/core/adapter.d.ts +247 -14
  134. package/dist/core/adapter.d.ts.map +1 -1
  135. package/dist/core/adapter.js +638 -161
  136. package/dist/core/adapter.js.map +1 -1
  137. package/dist/core/bridge-reaper.d.ts +4 -1
  138. package/dist/core/bridge-reaper.d.ts.map +1 -1
  139. package/dist/core/bridge-reaper.js +15 -1
  140. package/dist/core/bridge-reaper.js.map +1 -1
  141. package/dist/core/bus-notice.d.ts +27 -0
  142. package/dist/core/bus-notice.d.ts.map +1 -0
  143. package/dist/core/bus-notice.js +24 -0
  144. package/dist/core/bus-notice.js.map +1 -0
  145. package/dist/core/bus.d.ts +99 -0
  146. package/dist/core/bus.d.ts.map +1 -0
  147. package/dist/core/bus.js +176 -0
  148. package/dist/core/bus.js.map +1 -0
  149. package/dist/core/deliver-exclusions.d.ts +71 -0
  150. package/dist/core/deliver-exclusions.d.ts.map +1 -0
  151. package/dist/core/deliver-exclusions.js +110 -0
  152. package/dist/core/deliver-exclusions.js.map +1 -0
  153. package/dist/core/deliver-text.d.ts +61 -14
  154. package/dist/core/deliver-text.d.ts.map +1 -1
  155. package/dist/core/deliver-text.js +178 -30
  156. package/dist/core/deliver-text.js.map +1 -1
  157. package/dist/core/deliver-triage.d.ts +11 -2
  158. package/dist/core/deliver-triage.d.ts.map +1 -1
  159. package/dist/core/deliver-triage.js +19 -1
  160. package/dist/core/deliver-triage.js.map +1 -1
  161. package/dist/core/deliver.d.ts +161 -3
  162. package/dist/core/deliver.d.ts.map +1 -1
  163. package/dist/core/deliver.js +463 -25
  164. package/dist/core/deliver.js.map +1 -1
  165. package/dist/core/deliverable-floor.d.ts.map +1 -1
  166. package/dist/core/deliverable-floor.js +5 -7
  167. package/dist/core/deliverable-floor.js.map +1 -1
  168. package/dist/core/engine-bus.d.ts +40 -0
  169. package/dist/core/engine-bus.d.ts.map +1 -0
  170. package/dist/core/engine-bus.js +27 -0
  171. package/dist/core/engine-bus.js.map +1 -0
  172. package/dist/core/estate-mcp-client.d.ts +87 -5
  173. package/dist/core/estate-mcp-client.d.ts.map +1 -1
  174. package/dist/core/estate-mcp-client.js +90 -11
  175. package/dist/core/estate-mcp-client.js.map +1 -1
  176. package/dist/core/linked-issues.d.ts +46 -0
  177. package/dist/core/linked-issues.d.ts.map +1 -0
  178. package/dist/core/linked-issues.js +123 -0
  179. package/dist/core/linked-issues.js.map +1 -0
  180. package/dist/core/run-identity.d.ts +100 -0
  181. package/dist/core/run-identity.d.ts.map +1 -0
  182. package/dist/core/run-identity.js +178 -0
  183. package/dist/core/run-identity.js.map +1 -0
  184. package/dist/core/shutdown.d.ts +16 -0
  185. package/dist/core/shutdown.d.ts.map +1 -0
  186. package/dist/core/shutdown.js +39 -0
  187. package/dist/core/shutdown.js.map +1 -0
  188. package/dist/core/types.d.ts +15 -1
  189. package/dist/core/types.d.ts.map +1 -1
  190. package/dist/core/types.js +4 -0
  191. package/dist/core/types.js.map +1 -1
  192. package/dist/interactive/bridge-pool.d.ts +67 -3
  193. package/dist/interactive/bridge-pool.d.ts.map +1 -1
  194. package/dist/interactive/bridge-pool.js +129 -13
  195. package/dist/interactive/bridge-pool.js.map +1 -1
  196. package/dist/interactive/bridge-root.d.ts +9 -0
  197. package/dist/interactive/bridge-root.d.ts.map +1 -1
  198. package/dist/interactive/bridge-root.js +11 -4
  199. package/dist/interactive/bridge-root.js.map +1 -1
  200. package/dist/interactive/chat-events.d.ts +14 -9
  201. package/dist/interactive/chat-events.d.ts.map +1 -1
  202. package/dist/interactive/chat-events.js +55 -57
  203. package/dist/interactive/chat-events.js.map +1 -1
  204. package/dist/interactive/council-outcome.d.ts +1 -0
  205. package/dist/interactive/council-outcome.d.ts.map +1 -1
  206. package/dist/interactive/council-outcome.js +33 -0
  207. package/dist/interactive/council-outcome.js.map +1 -1
  208. package/dist/interactive/draft-events.d.ts +36 -17
  209. package/dist/interactive/draft-events.d.ts.map +1 -1
  210. package/dist/interactive/draft-events.js +121 -92
  211. package/dist/interactive/draft-events.js.map +1 -1
  212. package/dist/interactive/draft-skill.d.ts +59 -0
  213. package/dist/interactive/draft-skill.d.ts.map +1 -1
  214. package/dist/interactive/draft-skill.js +233 -0
  215. package/dist/interactive/draft-skill.js.map +1 -1
  216. package/dist/interactive/edit-events.d.ts +1 -14
  217. package/dist/interactive/edit-events.d.ts.map +1 -1
  218. package/dist/interactive/edit-events.js +37 -70
  219. package/dist/interactive/edit-events.js.map +1 -1
  220. package/dist/interactive/proxy-routes.d.ts +2 -2
  221. package/dist/interactive/proxy-routes.d.ts.map +1 -1
  222. package/dist/interactive/proxy-routes.js +4 -13
  223. package/dist/interactive/proxy-routes.js.map +1 -1
  224. package/dist/interactive/ws-relay.d.ts +9 -10
  225. package/dist/interactive/ws-relay.d.ts.map +1 -1
  226. package/dist/interactive/ws-relay.js +23 -50
  227. package/dist/interactive/ws-relay.js.map +1 -1
  228. package/dist/mcp/broker.d.ts +88 -0
  229. package/dist/mcp/broker.d.ts.map +1 -0
  230. package/dist/mcp/broker.js +307 -0
  231. package/dist/mcp/broker.js.map +1 -0
  232. package/dist/mcp/call-records.d.ts +61 -0
  233. package/dist/mcp/call-records.d.ts.map +1 -0
  234. package/dist/mcp/call-records.js +135 -0
  235. package/dist/mcp/call-records.js.map +1 -0
  236. package/dist/mcp/classify.d.ts +45 -0
  237. package/dist/mcp/classify.d.ts.map +1 -0
  238. package/dist/mcp/classify.js +83 -0
  239. package/dist/mcp/classify.js.map +1 -0
  240. package/dist/mcp/discovery.d.ts +24 -0
  241. package/dist/mcp/discovery.d.ts.map +1 -0
  242. package/dist/mcp/discovery.js +78 -0
  243. package/dist/mcp/discovery.js.map +1 -0
  244. package/dist/mcp/invoke.d.ts +36 -0
  245. package/dist/mcp/invoke.d.ts.map +1 -0
  246. package/dist/mcp/invoke.js +80 -0
  247. package/dist/mcp/invoke.js.map +1 -0
  248. package/dist/mcp/policies.d.ts +110 -0
  249. package/dist/mcp/policies.d.ts.map +1 -0
  250. package/dist/mcp/policies.js +400 -0
  251. package/dist/mcp/policies.js.map +1 -0
  252. package/dist/mcp/probe.d.ts +66 -0
  253. package/dist/mcp/probe.d.ts.map +1 -0
  254. package/dist/mcp/probe.js +116 -0
  255. package/dist/mcp/probe.js.map +1 -0
  256. package/dist/mcp/redact.d.ts +34 -0
  257. package/dist/mcp/redact.d.ts.map +1 -0
  258. package/dist/mcp/redact.js +84 -0
  259. package/dist/mcp/redact.js.map +1 -0
  260. package/dist/mcp/registry-store.d.ts +69 -0
  261. package/dist/mcp/registry-store.d.ts.map +1 -0
  262. package/dist/mcp/registry-store.js +82 -0
  263. package/dist/mcp/registry-store.js.map +1 -0
  264. package/dist/mcp/registry.d.ts +147 -0
  265. package/dist/mcp/registry.d.ts.map +1 -0
  266. package/dist/mcp/registry.js +509 -0
  267. package/dist/mcp/registry.js.map +1 -0
  268. package/dist/mcp/rest.d.ts +111 -0
  269. package/dist/mcp/rest.d.ts.map +1 -0
  270. package/dist/mcp/rest.js +606 -0
  271. package/dist/mcp/rest.js.map +1 -0
  272. package/dist/mcp/secrets.d.ts +66 -0
  273. package/dist/mcp/secrets.d.ts.map +1 -0
  274. package/dist/mcp/secrets.js +180 -0
  275. package/dist/mcp/secrets.js.map +1 -0
  276. package/dist/mcp/tool-list.d.ts +25 -0
  277. package/dist/mcp/tool-list.d.ts.map +1 -0
  278. package/dist/mcp/tool-list.js +62 -0
  279. package/dist/mcp/tool-list.js.map +1 -0
  280. package/dist/mcp/upstream-error.d.ts +12 -0
  281. package/dist/mcp/upstream-error.d.ts.map +1 -0
  282. package/dist/mcp/upstream-error.js +14 -0
  283. package/dist/mcp/upstream-error.js.map +1 -0
  284. package/dist/mcp/usage.d.ts +31 -0
  285. package/dist/mcp/usage.d.ts.map +1 -0
  286. package/dist/mcp/usage.js +159 -0
  287. package/dist/mcp/usage.js.map +1 -0
  288. package/dist/presets/routes.d.ts +53 -0
  289. package/dist/presets/routes.d.ts.map +1 -0
  290. package/dist/presets/routes.js +115 -0
  291. package/dist/presets/routes.js.map +1 -0
  292. package/dist/projects/activity.d.ts +6 -18
  293. package/dist/projects/activity.d.ts.map +1 -1
  294. package/dist/projects/activity.js +17 -60
  295. package/dist/projects/activity.js.map +1 -1
  296. package/dist/projects/events.d.ts +6 -5
  297. package/dist/projects/events.d.ts.map +1 -1
  298. package/dist/projects/events.js +33 -58
  299. package/dist/projects/events.js.map +1 -1
  300. package/dist/projects/graph.d.ts +11 -0
  301. package/dist/projects/graph.d.ts.map +1 -1
  302. package/dist/projects/graph.js +12 -0
  303. package/dist/projects/graph.js.map +1 -1
  304. package/dist/projects/routes.d.ts.map +1 -1
  305. package/dist/projects/routes.js +19 -0
  306. package/dist/projects/routes.js.map +1 -1
  307. package/dist/projects/state-home-preflight.d.ts.map +1 -1
  308. package/dist/projects/state-home-preflight.js +7 -0
  309. package/dist/projects/state-home-preflight.js.map +1 -1
  310. package/dist/projects/state-home-registry.d.ts.map +1 -1
  311. package/dist/projects/state-home-registry.js +9 -1
  312. package/dist/projects/state-home-registry.js.map +1 -1
  313. package/dist/qe/acceptance.d.ts +28 -28
  314. package/dist/qe/acceptance.d.ts.map +1 -1
  315. package/dist/qe/acceptance.js +60 -61
  316. package/dist/qe/acceptance.js.map +1 -1
  317. package/dist/qe/test-sets.d.ts +3 -5
  318. package/dist/qe/test-sets.d.ts.map +1 -1
  319. package/dist/qe/test-sets.js +5 -7
  320. package/dist/qe/test-sets.js.map +1 -1
  321. package/dist/skills/installed.d.ts +51 -0
  322. package/dist/skills/installed.d.ts.map +1 -0
  323. package/dist/skills/installed.js +46 -0
  324. package/dist/skills/installed.js.map +1 -0
  325. package/dist/skills/phase-skill-gaps.d.ts +108 -0
  326. package/dist/skills/phase-skill-gaps.d.ts.map +1 -0
  327. package/dist/skills/phase-skill-gaps.js +199 -0
  328. package/dist/skills/phase-skill-gaps.js.map +1 -0
  329. package/dist/skills/runtime.d.ts +1 -1
  330. package/dist/skills/runtime.d.ts.map +1 -1
  331. package/dist/skills/runtime.js +2 -1
  332. package/dist/skills/runtime.js.map +1 -1
  333. package/dist/standing-orders/evaluator.d.ts +113 -0
  334. package/dist/standing-orders/evaluator.d.ts.map +1 -0
  335. package/dist/standing-orders/evaluator.js +225 -0
  336. package/dist/standing-orders/evaluator.js.map +1 -0
  337. package/dist/standing-orders/history.d.ts +58 -0
  338. package/dist/standing-orders/history.d.ts.map +1 -0
  339. package/dist/standing-orders/history.js +117 -0
  340. package/dist/standing-orders/history.js.map +1 -0
  341. package/dist/standing-orders/parse.d.ts +19 -0
  342. package/dist/standing-orders/parse.d.ts.map +1 -0
  343. package/dist/standing-orders/parse.js +75 -0
  344. package/dist/standing-orders/parse.js.map +1 -0
  345. package/dist/standing-orders/routes.d.ts +180 -0
  346. package/dist/standing-orders/routes.d.ts.map +1 -0
  347. package/dist/standing-orders/routes.js +95 -0
  348. package/dist/standing-orders/routes.js.map +1 -0
  349. package/dist/standing-orders/store.d.ts +154 -0
  350. package/dist/standing-orders/store.d.ts.map +1 -0
  351. package/dist/standing-orders/store.js +189 -0
  352. package/dist/standing-orders/store.js.map +1 -0
  353. package/dist/studio/assets/index-CvV5qITf.css +32 -0
  354. package/dist/studio/assets/index-jCOy6Ns7.js +568 -0
  355. package/dist/studio/index.html +3 -3
  356. package/dist/studio/testid-inventory.json +3307 -897
  357. package/dist/team/key.d.ts +5 -0
  358. package/dist/team/key.d.ts.map +1 -0
  359. package/dist/team/key.js +21 -0
  360. package/dist/team/key.js.map +1 -0
  361. package/dist/team/routes.d.ts +196 -0
  362. package/dist/team/routes.d.ts.map +1 -0
  363. package/dist/team/routes.js +274 -0
  364. package/dist/team/routes.js.map +1 -0
  365. package/dist/team/ws-relay.d.ts +39 -0
  366. package/dist/team/ws-relay.d.ts.map +1 -0
  367. package/dist/team/ws-relay.js +63 -0
  368. package/dist/team/ws-relay.js.map +1 -0
  369. package/endpoint-manifest.json +502 -6
  370. package/package.json +6 -6
  371. package/dist/interactive/demo-events.d.ts +0 -367
  372. package/dist/interactive/demo-events.d.ts.map +0 -1
  373. package/dist/interactive/demo-events.js +0 -1293
  374. package/dist/interactive/demo-events.js.map +0 -1
  375. package/dist/qe/gate-events.d.ts +0 -113
  376. package/dist/qe/gate-events.d.ts.map +0 -1
  377. package/dist/qe/gate-events.js +0 -172
  378. package/dist/qe/gate-events.js.map +0 -1
  379. package/dist/studio/assets/index-BRDAN35i.js +0 -548
  380. package/dist/studio/assets/index-Drfcsy8b.css +0 -32
@@ -0,0 +1,509 @@
1
+ /**
2
+ * The MCP tools registry (DES-MCP-TOOLS-001 §5, §8; slice S2): register upstream MCP servers,
3
+ * keep their tool lists honest, and hold their secrets out of every response.
4
+ *
5
+ * - **Preview, then save.** `preview` probes the server and answers its tools with their classes
6
+ * and a `previewHash` over the exact config and tool schemas it saw. `save` takes ONLY that hash
7
+ * and registers what the preview showed. A save without a hash, or with one this daemon did not
8
+ * issue (or issued more than {@link PREVIEW_TTL_MS} ago), is refused, so nothing is registered
9
+ * that the operator did not see.
10
+ * - **Tool diff.** `test` probes a registered server again and records the difference. A tool
11
+ * whose schema hash changed, and a tool the server added, is `unregistered` (D-5 denies it)
12
+ * until it is previewed and saved again. A tool the server dropped is `gone`: kept, never
13
+ * deleted, so old call records still resolve. Health turns `failing` after 3 consecutive
14
+ * failed probes.
15
+ * - **Secrets.** Only a reference is stored. A value is resolved just for the probe and scrubbed
16
+ * from its result (`probe.ts`).
17
+ */
18
+ import { canonicalJson, deriveToolClass, effectiveToolClass, mcpSubject, parseMcpSubject, sha256Hex, toolSchemaHash } from './classify.js';
19
+ import { KEYCHAIN_SERVICE, keychainRef, parseSecretRef, resolveSecret, secretIsSet } from './secrets.js';
20
+ /** How long a preview can be saved. */
21
+ export const PREVIEW_TTL_MS = 15 * 60 * 1000;
22
+ /** At most this many previews are held; the oldest is dropped first. */
23
+ const PREVIEW_CACHE_MAX = 64;
24
+ /** Consecutive failed probes before a server's health reads `failing`. */
25
+ export const HEALTH_FAILING_AFTER = 3;
26
+ /** A refusal the routes map to a status code. */
27
+ export class McpRegistryError extends Error {
28
+ status;
29
+ code;
30
+ constructor(
31
+ // 500: the registry and the OS secret store disagree and crew could not reconcile them
32
+ // (crew#719, `secret_orphaned`) — the message names what was left behind.
33
+ status, code, message) {
34
+ super(message);
35
+ this.status = status;
36
+ this.code = code;
37
+ }
38
+ }
39
+ export class McpRegistry {
40
+ deps;
41
+ previews = new Map();
42
+ now;
43
+ env;
44
+ constructor(deps) {
45
+ this.deps = deps;
46
+ this.now = deps.now ?? Date.now;
47
+ this.env = deps.env ?? process.env;
48
+ }
49
+ get secretStoreAvailable() {
50
+ return this.deps.secrets.available;
51
+ }
52
+ async list() {
53
+ const file = await this.deps.store.read();
54
+ const servers = await Promise.all(file.servers.map((s) => this.view(s)));
55
+ const discovered = this.deps.discover(new Set(file.servers.map((s) => s.name)));
56
+ return { servers, discovered };
57
+ }
58
+ async get(name) {
59
+ const file = await this.deps.store.read();
60
+ return this.view(this.find(file.servers, name));
61
+ }
62
+ /**
63
+ * Probe `config` and hold exactly what it showed, for `save` (crew#719: with `stagedSecret`, the
64
+ * secret this server's own keychain reference will hold — probed with now, written only when the
65
+ * save commits, so the OS store and the registry row land together or not at all).
66
+ */
67
+ async preview(config, stagedSecret = null) {
68
+ if (stagedSecret !== null) {
69
+ if (!this.deps.secrets.available) {
70
+ throw new McpRegistryError(501, 'secret_store_unavailable', 'this platform has no OS secret store; reference a daemon env variable instead (auth.ref "env:<NAME>")');
71
+ }
72
+ if (config.auth === null || config.auth.ref !== keychainRef(config.name)) {
73
+ throw new McpRegistryError(400, 'secret_not_staged_here', `a staged secret is stored as this server's own keychain entry, so auth.ref must be ${keychainRef(config.name)}`);
74
+ }
75
+ // The reference is answered back and audited, so a value it contains would be echoed there.
76
+ if (config.auth.ref.includes(stagedSecret)) {
77
+ throw new McpRegistryError(400, 'secret_in_ref', 'the secret must not appear in its own reference; choose a different value');
78
+ }
79
+ }
80
+ const result = await this.probe(config, stagedSecret);
81
+ if ('missingSecret' in result)
82
+ throw new McpRegistryError(409, 'secret_missing', result.error);
83
+ if (!result.ok) {
84
+ const what = config.kind === 'rest' ? 'the OpenAPI document could not be imported' : 'the server did not answer tools/list';
85
+ throw new McpRegistryError(502, 'probe_failed', `${what}: ${result.error}`);
86
+ }
87
+ const tools = result.tools.map((t) => ({ ...t, schemaHash: toolSchemaHash(t) }));
88
+ const previewHash = sha256Hex(canonicalJson({ config, tools: tools.map((t) => [t.name, t.schemaHash]) }));
89
+ const expiresAt = this.now() + PREVIEW_TTL_MS;
90
+ this.hold(previewHash, { config, tools, expiresAt, secret: stagedSecret });
91
+ const existing = (await this.deps.store.read()).servers.find((s) => s.name === config.name);
92
+ return {
93
+ previewHash,
94
+ expiresAt: new Date(expiresAt).toISOString(),
95
+ server: configView(config),
96
+ serverInfo: result.serverInfo,
97
+ tools: tools.map((t) => ({
98
+ name: t.name,
99
+ subject: mcpSubject(config.name, t.name),
100
+ description: t.description,
101
+ annotations: t.annotations,
102
+ inputSchema: t.inputSchema,
103
+ class: deriveToolClass(t.annotations),
104
+ schemaHash: t.schemaHash,
105
+ ...(config.kind === 'rest' ? { rest: t.rest ?? null } : {}),
106
+ })),
107
+ diff: existing === undefined ? null : diffTools(existing.tools, tools),
108
+ ...(result.skipped !== undefined && result.skipped.length > 0 ? { skipped: result.skipped } : {}),
109
+ };
110
+ }
111
+ /**
112
+ * Register exactly what a preview showed. Saving over an existing name re-registers it: every
113
+ * tool of the preview becomes `registered`, a tool it no longer lists becomes `gone`, a tool's
114
+ * `enabled` switch survives, and a class override survives only while the schema is unchanged.
115
+ */
116
+ async save(previewHash) {
117
+ if (previewHash === undefined) {
118
+ throw new McpRegistryError(409, 'preview_required', 'saving a server needs the previewHash of a preview of it: POST /mcp/servers/preview first');
119
+ }
120
+ const held = this.previews.get(previewHash);
121
+ if (held === undefined || held.expiresAt <= this.now()) {
122
+ this.previews.delete(previewHash);
123
+ throw new McpRegistryError(409, 'preview_stale', 'that previewHash is unknown or expired: preview the server again, then save');
124
+ }
125
+ this.previews.delete(previewHash);
126
+ const stamp = new Date(this.now()).toISOString();
127
+ // (crew#719) The staged secret and the registry row commit TOGETHER. Studio used to write the
128
+ // keychain itself and then save, so a failure between the two left a keychain entry with no
129
+ // server — invisible, because nothing can enumerate the entries of a keychain service — or a
130
+ // server whose secret never landed. The write happens here, inside the save, and a save that
131
+ // then fails puts the entry back exactly as it was; the only residue left is one this call
132
+ // NAMES.
133
+ //
134
+ // The PRIOR value is read first (review of PR #724, HIGH). A re-key of a registered server
135
+ // whose registry write then failed used to leave the NEW secret behind under an unchanged row:
136
+ // the credential its running calls use had silently changed, which is a worse outcome than the
137
+ // orphan this was written to prevent. `null` = no prior value, and then the rollback deletes.
138
+ const prior = held.secret === null ? null : await this.deps.secrets.get(held.config.name);
139
+ if (held.secret !== null)
140
+ await this.deps.secrets.set(held.config.name, held.secret);
141
+ const saved = await this.restoreSecretOnFailure(held.config.name, held.secret !== null, prior, () => this.deps.store.mutate((file) => {
142
+ const prior = file.servers.find((s) => s.name === held.config.name);
143
+ const tools = held.tools.map((t) => {
144
+ const was = prior?.tools.find((p) => p.name === t.name);
145
+ return {
146
+ name: t.name,
147
+ description: t.description,
148
+ inputSchema: t.inputSchema,
149
+ outputSchema: t.outputSchema,
150
+ annotations: t.annotations,
151
+ classOverride: was !== undefined && was.schemaHash === t.schemaHash ? was.classOverride : null,
152
+ enabled: was?.enabled ?? true,
153
+ schemaHash: t.schemaHash,
154
+ observedSchemaHash: t.schemaHash,
155
+ present: true,
156
+ ...(t.rest != null ? { rest: t.rest } : {}),
157
+ };
158
+ });
159
+ for (const old of prior?.tools ?? []) {
160
+ if (!tools.some((t) => t.name === old.name))
161
+ tools.push({ ...old, present: false });
162
+ }
163
+ const record = {
164
+ ...held.config,
165
+ enabled: prior?.enabled ?? true,
166
+ health: { state: 'ok', consecutiveFailures: 0, checkedAt: stamp, lastError: null },
167
+ registeredAt: prior?.registeredAt ?? stamp,
168
+ updatedAt: stamp,
169
+ tools,
170
+ };
171
+ file.servers = [...file.servers.filter((s) => s.name !== record.name), record];
172
+ return record;
173
+ }));
174
+ return this.view(saved);
175
+ }
176
+ /**
177
+ * Run `commit`; if it throws and this save had written the OS secret store, put the entry back
178
+ * exactly as it was — deleted when there was no `prior` value, restored to `prior` when there
179
+ * was (crew#719, review of PR #724). Either way the registry row and the credential it
180
+ * references end up as they were before the save.
181
+ *
182
+ * A rollback that ALSO fails is reported rather than swallowed: the operator is told what was
183
+ * left behind and under which account, because nothing else can find a keychain entry for them.
184
+ */
185
+ async restoreSecretOnFailure(name, wrote, prior, commit) {
186
+ try {
187
+ return await commit();
188
+ }
189
+ catch (err) {
190
+ if (!wrote)
191
+ throw err;
192
+ try {
193
+ if (prior === null)
194
+ await this.deps.secrets.delete(name);
195
+ else
196
+ await this.deps.secrets.set(name, prior);
197
+ }
198
+ catch (rollback) {
199
+ const why = err instanceof Error ? err.message : String(err);
200
+ const also = rollback instanceof Error ? rollback.message : String(rollback);
201
+ const left = prior === null
202
+ ? 'its secret could not be taken back out'
203
+ : 'the secret it replaced could not be put back, so the entry now holds the value this save staged';
204
+ throw new McpRegistryError(500, 'secret_orphaned', `${name} was not registered (${why}) and ${left} (${also}); fix the "${KEYCHAIN_SERVICE}" keychain entry for account "${name}" by hand`);
205
+ }
206
+ throw err;
207
+ }
208
+ }
209
+ /** What a held preview would register: its server name and each tool's schema hash (S6). */
210
+ peekPreview(previewHash) {
211
+ const held = this.previews.get(previewHash);
212
+ if (held === undefined || held.expiresAt <= this.now())
213
+ return null;
214
+ return { name: held.config.name, tools: held.tools.map((t) => ({ name: t.name, schemaHash: t.schemaHash })) };
215
+ }
216
+ async setServerEnabled(name, enabled) {
217
+ const rec = await this.deps.store.mutate((file) => {
218
+ const s = this.find(file.servers, name);
219
+ s.enabled = enabled;
220
+ s.updatedAt = new Date(this.now()).toISOString();
221
+ return s;
222
+ });
223
+ return this.view(rec);
224
+ }
225
+ /** Remove a server, and the keychain secret it owns (`keychain:wicked-mcp/<name>`). */
226
+ async remove(name) {
227
+ const removed = await this.deps.store.mutate((file) => {
228
+ const s = this.find(file.servers, name);
229
+ file.servers = file.servers.filter((x) => x.name !== name);
230
+ return s;
231
+ });
232
+ if (removed.auth?.ref === keychainRef(name) && this.deps.secrets.available) {
233
+ try {
234
+ await this.deps.secrets.delete(name);
235
+ }
236
+ catch (err) {
237
+ // (crew#719) The row is already gone, so the secret is now unreachable by any route. Say
238
+ // so — the alternative is a silent orphan in the operator's keychain.
239
+ const why = err instanceof Error ? err.message : String(err);
240
+ throw new McpRegistryError(500, 'secret_orphaned', `${name} was removed but its secret could not be deleted (${why}); remove the "${KEYCHAIN_SERVICE}" keychain entry for account "${name}" by hand`);
241
+ }
242
+ }
243
+ }
244
+ async patchTool(subject, patch) {
245
+ const parts = parseMcpSubject(subject);
246
+ if (parts === null)
247
+ throw new McpRegistryError(404, 'unknown_tool', `no tool ${subject}`);
248
+ const stamp = new Date(this.now()).toISOString();
249
+ const { server, tool } = await this.deps.store.mutate((file) => {
250
+ const s = this.find(file.servers, parts.server);
251
+ const t = s.tools.find((x) => x.name === parts.tool);
252
+ if (t === undefined)
253
+ throw new McpRegistryError(404, 'unknown_tool', `no tool ${subject}`);
254
+ if (patch.enabled !== undefined)
255
+ t.enabled = patch.enabled;
256
+ if (patch.classOverride !== undefined)
257
+ t.classOverride = patch.classOverride;
258
+ s.updatedAt = stamp;
259
+ return { server: s, tool: t };
260
+ });
261
+ return toolView(server.name, tool);
262
+ }
263
+ /** Probe a registered server again: record its health and its tool diff. */
264
+ async test(name) {
265
+ const current = this.find((await this.deps.store.read()).servers, name);
266
+ const config = configOf(current);
267
+ const result = await this.probe(config);
268
+ const stamp = new Date(this.now()).toISOString();
269
+ let diff = null;
270
+ const rec = await this.deps.store.mutate((file) => {
271
+ const s = this.find(file.servers, name);
272
+ // A save with a different config landed while the probe ran: the result describes a server
273
+ // that is no longer registered, so it is not applied to the new one.
274
+ if (canonicalJson(configOf(s)) !== canonicalJson(config)) {
275
+ throw new McpRegistryError(409, 'server_changed', `${name} was saved again while it was being tested; test it again`);
276
+ }
277
+ if (!result.ok) {
278
+ const failures = s.health.consecutiveFailures + 1;
279
+ const state = failures >= HEALTH_FAILING_AFTER ? 'failing' : s.health.state;
280
+ s.health = { state, consecutiveFailures: failures, checkedAt: stamp, lastError: result.error };
281
+ return s;
282
+ }
283
+ const probed = result.tools.map((t) => ({ ...t, schemaHash: toolSchemaHash(t) }));
284
+ diff = diffTools(s.tools, probed);
285
+ for (const t of s.tools) {
286
+ const now = probed.find((p) => p.name === t.name);
287
+ t.present = now !== undefined;
288
+ if (now !== undefined)
289
+ t.observedSchemaHash = now.schemaHash;
290
+ // The mapping a REST call is made with stays the SAVED one: a changed mapping is a changed
291
+ // schema hash, so the tool is unregistered (D-5) until it is previewed and saved again.
292
+ }
293
+ for (const p of probed) {
294
+ if (s.tools.some((t) => t.name === p.name))
295
+ continue;
296
+ s.tools.push({
297
+ name: p.name,
298
+ description: p.description,
299
+ inputSchema: p.inputSchema,
300
+ outputSchema: p.outputSchema,
301
+ annotations: p.annotations,
302
+ classOverride: null,
303
+ enabled: true,
304
+ schemaHash: null,
305
+ observedSchemaHash: p.schemaHash,
306
+ present: true,
307
+ ...(p.rest != null ? { rest: p.rest } : {}),
308
+ });
309
+ }
310
+ s.health = { state: 'ok', consecutiveFailures: 0, checkedAt: stamp, lastError: null };
311
+ return s;
312
+ });
313
+ return { ok: result.ok, error: result.ok ? null : result.error, diff, server: await this.view(rec) };
314
+ }
315
+ /** Write a server's secret to the OS store; answers the reference to put in its `auth.ref`. */
316
+ async setSecret(name, value) {
317
+ if (!this.deps.secrets.available) {
318
+ throw new McpRegistryError(501, 'secret_store_unavailable', 'this platform has no OS secret store; reference a daemon env variable instead (auth.ref "env:<NAME>")');
319
+ }
320
+ const ref = keychainRef(name);
321
+ // The route answers and audits the reference, so a value it contains would be echoed there.
322
+ if (ref.includes(value))
323
+ throw new McpRegistryError(400, 'secret_in_ref', 'the secret must not appear in its own reference; choose a different value');
324
+ // (crew#719) RE-KEY ONLY. A secret written for a name no registered server references is an
325
+ // orphan nothing can find again — a keychain service's entries cannot be enumerated — and it
326
+ // was the first half of the non-atomic add: secret, then save, with a window between them.
327
+ // A NEW server's secret is staged with its preview and committed by `save`.
328
+ const server = this.find((await this.deps.store.read()).servers, name);
329
+ if (server.auth?.ref !== ref) {
330
+ throw new McpRegistryError(400, 'secret_not_referenced', `${name} does not reference ${ref} (auth.ref is ${server.auth?.ref ?? 'unset'}), so a secret stored there would be unreachable; stage it with the preview instead`);
331
+ }
332
+ await this.deps.secrets.set(name, value);
333
+ return ref;
334
+ }
335
+ /**
336
+ * The broker's resolution of one subject (§6 step 2). `null` = no server of that name. A server
337
+ * that is disabled, a tool that is disabled, `gone`, never saved, or whose schema changed since it
338
+ * was saved reads `registered: false`, which the engine denies (D-5).
339
+ */
340
+ async resolveCall(server, tool) {
341
+ const s = (await this.deps.store.read()).servers.find((x) => x.name === server);
342
+ if (s === undefined)
343
+ return null;
344
+ const t = s.tools.find((x) => x.name === tool);
345
+ return {
346
+ config: configOf(s),
347
+ rest: t?.rest ?? null,
348
+ annotations: t?.annotations ?? null,
349
+ classOverride: t?.classOverride ?? null,
350
+ registered: s.enabled && t !== undefined && t.enabled && toolStatus(t) === 'registered',
351
+ };
352
+ }
353
+ /**
354
+ * Every tool a call could reach right now (slice S4, the shim's `list`): enabled servers, and
355
+ * their enabled tools whose saved schema is the one last seen. Anything else is D-5 and would be
356
+ * refused by the broker, so it is never offered.
357
+ */
358
+ async callableTools() {
359
+ const out = [];
360
+ for (const s of (await this.deps.store.read()).servers) {
361
+ if (!s.enabled)
362
+ continue;
363
+ for (const t of s.tools) {
364
+ if (!t.enabled || toolStatus(t) !== 'registered')
365
+ continue;
366
+ out.push({
367
+ server: s.name,
368
+ tool: t.name,
369
+ kind: s.kind,
370
+ annotations: t.annotations,
371
+ classOverride: t.classOverride,
372
+ description: t.description,
373
+ inputSchema: t.inputSchema,
374
+ });
375
+ }
376
+ }
377
+ return out;
378
+ }
379
+ /**
380
+ * The secret a call to `config` is made with, resolved at the moment of the call and nowhere
381
+ * else. `missing` = the server names a secret that resolves to nothing: the call is not made
382
+ * unauthenticated.
383
+ */
384
+ async callSecret(config) {
385
+ if (config.auth === null)
386
+ return { secret: null, missing: false };
387
+ const secret = await resolveSecret(config.auth.ref, this.deps.secrets, this.env);
388
+ return { secret, missing: secret === null };
389
+ }
390
+ // ── internals ──────────────────────────────────────────────────────────────────────────────
391
+ find(servers, name) {
392
+ const s = servers.find((x) => x.name === name);
393
+ if (s === undefined)
394
+ throw new McpRegistryError(404, 'unknown_server', `no MCP server named ${name}`);
395
+ return s;
396
+ }
397
+ hold(hash, preview) {
398
+ const now = this.now();
399
+ for (const [k, v] of this.previews)
400
+ if (v.expiresAt <= now)
401
+ this.previews.delete(k);
402
+ this.previews.delete(hash);
403
+ this.previews.set(hash, preview);
404
+ while (this.previews.size > PREVIEW_CACHE_MAX)
405
+ this.previews.delete(this.previews.keys().next().value);
406
+ }
407
+ /**
408
+ * Probe with the server's secret. A server whose `auth` names a secret that resolves to nothing
409
+ * is NOT probed unauthenticated (that would register what an anonymous caller sees): it fails
410
+ * without connecting.
411
+ */
412
+ async probe(config, staged = null) {
413
+ if (config.auth === null)
414
+ return this.deps.probe(config, null);
415
+ // (crew#719) A staged secret is probed with instead of being written first. The caller has
416
+ // already checked it belongs to THIS server's keychain reference.
417
+ const secret = staged ?? (await resolveSecret(config.auth.ref, this.deps.secrets, this.env));
418
+ if (secret === null) {
419
+ return { ok: false, error: `auth.ref ${config.auth.ref} resolves to no secret: set it, then try again`, missingSecret: true };
420
+ }
421
+ return this.deps.probe(config, secret);
422
+ }
423
+ async authState(auth) {
424
+ if (auth === null)
425
+ return 'none';
426
+ if (parseSecretRef(auth.ref) === null)
427
+ return 'missing';
428
+ return (await secretIsSet(auth.ref, this.deps.secrets, this.env)) ? 'set' : 'missing';
429
+ }
430
+ async view(s) {
431
+ const tools = s.tools.map((t) => toolView(s.name, t));
432
+ const live = tools.filter((t) => t.status !== 'gone');
433
+ return {
434
+ ...configView(configOf(s)),
435
+ authState: await this.authState(s.auth),
436
+ enabled: s.enabled,
437
+ health: s.health,
438
+ registeredAt: s.registeredAt,
439
+ updatedAt: s.updatedAt,
440
+ tools,
441
+ counts: {
442
+ total: live.length,
443
+ enabled: live.filter((t) => t.enabled).length,
444
+ registered: live.filter((t) => t.status === 'registered').length,
445
+ read: live.filter((t) => t.class === 'read').length,
446
+ write: live.filter((t) => t.class === 'write').length,
447
+ destructive: live.filter((t) => t.class === 'destructive').length,
448
+ },
449
+ };
450
+ }
451
+ }
452
+ function configOf(s) {
453
+ const base = { name: s.name, kind: s.kind, command: s.command, args: s.args, url: s.url, auth: s.auth };
454
+ if (s.kind !== 'rest')
455
+ return base;
456
+ return { ...base, openapiUrl: s.openapiUrl ?? null, openapi: s.openapi ?? null, operations: s.operations ?? null };
457
+ }
458
+ /** What a response shows of a config. A pasted OpenAPI document is not echoed back. */
459
+ function configView(c) {
460
+ const view = { name: c.name, kind: c.kind, command: c.command, args: c.args, url: c.url, auth: c.auth };
461
+ if (c.kind === 'rest') {
462
+ view.openapiUrl = c.openapiUrl ?? null;
463
+ view.operations = c.operations ?? null;
464
+ }
465
+ return view;
466
+ }
467
+ export function toolStatus(t) {
468
+ if (!t.present)
469
+ return 'gone';
470
+ return t.schemaHash !== null && t.schemaHash === t.observedSchemaHash ? 'registered' : 'unregistered';
471
+ }
472
+ function toolView(server, t) {
473
+ const derivedClass = deriveToolClass(t.annotations);
474
+ return {
475
+ name: t.name,
476
+ ...(t.rest != null ? { rest: t.rest } : {}),
477
+ subject: mcpSubject(server, t.name),
478
+ description: t.description,
479
+ annotations: t.annotations,
480
+ inputSchema: t.inputSchema,
481
+ derivedClass,
482
+ classOverride: t.classOverride,
483
+ class: effectiveToolClass(derivedClass, t.classOverride),
484
+ enabled: t.enabled,
485
+ status: toolStatus(t),
486
+ schemaHash: t.schemaHash,
487
+ observedSchemaHash: t.observedSchemaHash,
488
+ };
489
+ }
490
+ /** The difference between the registered tools and a probe's (by name, then schema hash). */
491
+ export function diffTools(registered, probed) {
492
+ const known = registered.filter((t) => t.present);
493
+ const diff = { added: [], removed: [], changed: [], unchanged: [] };
494
+ for (const p of probed) {
495
+ const was = known.find((t) => t.name === p.name);
496
+ // A tool that was never registered (added after the last save) is still `added`.
497
+ if (was === undefined || was.schemaHash === null)
498
+ diff.added.push(p.name);
499
+ else if (was.schemaHash === p.schemaHash)
500
+ diff.unchanged.push(p.name);
501
+ else
502
+ diff.changed.push(p.name);
503
+ }
504
+ for (const t of known)
505
+ if (!probed.some((p) => p.name === t.name))
506
+ diff.removed.push(t.name);
507
+ return diff;
508
+ }
509
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/mcp/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * REST upstreams (DES-MCP-TOOLS-001 §2, §5, invariant I6; slice S5a): a plain HTTP API wrapped as
3
+ * brokered tools, one tool per chosen OpenAPI 3 operation.
4
+ *
5
+ * - **Import.** The OpenAPI document is fetched from `openapiUrl` (bounded in time and size; the
6
+ * server's auth header rides along only when the document is on the API's own origin) or taken as
7
+ * pasted. Local `$ref`s are resolved (a cycle becomes `{}`); an external `$ref` is not followed.
8
+ * Each operation becomes a tool whose input schema is its path, query and header parameters and
9
+ * its JSON body, and whose class comes from its method: `GET`/`HEAD`/`OPTIONS` read, `POST`
10
+ * write, `PUT`/`PATCH`/`DELETE` destructive (the broker's classification, §4.2).
11
+ * - **Mapping, an allowlist.** A tool carries its {@link McpRestMapping}: which argument fills
12
+ * which path variable, query parameter, header or body key. An argument no map names is DROPPED,
13
+ * never sent; its name is disclosed in the result's `_meta["wicked/rest"].droppedArgs`.
14
+ * - **Host pin (I6).** Every request is built on the server's base URL and checked before it is
15
+ * sent: its scheme, host and port must be the base URL's and its path must stay under the base
16
+ * path. A request that would leave, and a redirect to another host, are refused with
17
+ * {@link RestBoundaryError}, which the broker records as a `guard_error`. Redirects are never
18
+ * followed. The auth header can't be set or overridden by an argument.
19
+ *
20
+ * Ideas only from ContextForge (`openapi_service.py`, `tool_service.py`); no code is copied.
21
+ */
22
+ import type { McpRestMapping, McpToolAnnotations } from '../core/types.js';
23
+ import type { UpstreamToolResult } from './invoke.js';
24
+ import type { McpUpstreamConfig, ProbedTool, ProbeResult } from './probe.js';
25
+ import { UpstreamCallError } from './upstream-error.js';
26
+ export declare const REST_SPEC_TIMEOUT_MS = 10000;
27
+ /** The largest OpenAPI document crew reads (fetched or pasted). */
28
+ export declare const REST_SPEC_MAX_BYTES: number;
29
+ /** The largest response body handed back; the rest is cut and disclosed as `truncated`. */
30
+ export declare const REST_RESPONSE_MAX_BYTES: number;
31
+ export declare const REST_DEFAULT_TIMEOUT_MS = 30000;
32
+ type Method = McpRestMapping['method'];
33
+ /** A request that would leave the API's pinned base URL (I6). Never retried; recorded as `guard_error`. */
34
+ export declare class RestBoundaryError extends UpstreamCallError {
35
+ constructor(message: string);
36
+ }
37
+ /** A tool probed from an OpenAPI document: an MCP tool shape plus its request mapping. */
38
+ export type RestProbedTool = ProbedTool & {
39
+ rest: McpRestMapping;
40
+ };
41
+ /** Parse a base URL: http(s), no credentials, no query or fragment. `null` = not acceptable. */
42
+ export declare function parseBaseUrl(raw: string | null): URL | null;
43
+ /**
44
+ * The request URL for `pathTemplate` filled with `values`, pinned to `base`: the same origin, and a
45
+ * path under the base path. Anything else is a {@link RestBoundaryError}.
46
+ */
47
+ export declare function pinnedUrl(base: URL, pathTemplate: string, values: Record<string, string>): URL;
48
+ /** Why `url` is outside `base` (another origin, or a path off the base path); `null` = inside. */
49
+ export declare function boundaryEscape(base: URL, url: URL): string | null;
50
+ type Json = Record<string, unknown>;
51
+ /**
52
+ * `value` with every local `$ref` replaced by what it points to. A `$ref` already being resolved
53
+ * on the current path (a cycle), an unresolvable or external one, and anything deeper than
54
+ * {@link MAX_REF_DEPTH} become `{}` (any value): the schema is a hint to the caller, never a check.
55
+ */
56
+ export declare function derefLocal(doc: Json, value: unknown, seen?: ReadonlyArray<string>, depth?: number): unknown;
57
+ /** Parse an OpenAPI document's text: JSON, else YAML. */
58
+ export declare function parseOpenApiText(text: string): Json;
59
+ /** The class an HTTP method implies, as annotations (§4.2): the broker decides it, never the carrier. */
60
+ export declare function annotationsForMethod(method: Method): McpToolAnnotations;
61
+ export interface OpenApiImport {
62
+ serverInfo: {
63
+ name: string;
64
+ version: string;
65
+ } | null;
66
+ tools: RestProbedTool[];
67
+ /** Operations that could not be wrapped, with why (a non-JSON body, a name clash past 512 tools). */
68
+ skipped: string[];
69
+ }
70
+ /**
71
+ * Wrap an OpenAPI 3 document's operations as tools. `operations` (by `operationId` or tool name)
72
+ * picks which; a name that matches no operation is an error, so a typo never silently wraps less.
73
+ */
74
+ export declare function importOpenApi(doc: Json, opts?: {
75
+ authHeader?: string | undefined;
76
+ operations?: ReadonlyArray<string> | null;
77
+ timeoutMs?: number;
78
+ }): OpenApiImport;
79
+ export type RestFetch = typeof fetch;
80
+ /**
81
+ * The `rest` probe: read the OpenAPI document and wrap its operations. The auth header goes to the
82
+ * document's URL only when it is on the base URL's own origin. Every string returned has the
83
+ * secret scrubbed out.
84
+ *
85
+ * The document's URL is NOT pinned to the base URL, by design: it is the operator's own input at
86
+ * preview time (an API's spec often lives elsewhere, e.g. a docs host), not a worker's call, and it
87
+ * carries no secret off the API's origin. The host pin (I6) is on the tools' calls.
88
+ */
89
+ export declare function probeRestServer(config: McpUpstreamConfig, secret: string | null, fetchImpl?: RestFetch): Promise<ProbeResult>;
90
+ /**
91
+ * Build the one HTTP request a `rest` tool call makes, from the ALLOWLISTED arguments only, pinned
92
+ * to the base URL. Exported so the allowlist and the pin are testable without a network.
93
+ */
94
+ export declare function buildRestRequest(config: McpUpstreamConfig, secret: string | null, mapping: McpRestMapping, args: Record<string, unknown>): {
95
+ url: URL;
96
+ init: {
97
+ method: string;
98
+ headers: Record<string, string>;
99
+ body?: string;
100
+ };
101
+ droppedArgs: string[];
102
+ };
103
+ /**
104
+ * Call one `rest` tool. Transport failures, 429 and 5xx are retryable {@link UpstreamCallError}s; a
105
+ * redirect is never followed (one to another host is a {@link RestBoundaryError}); any other
106
+ * status is handed back as the tool's own result (`isError` on 4xx). The result is RAW: the broker
107
+ * scrubs it.
108
+ */
109
+ export declare function invokeRestTool(config: McpUpstreamConfig, secret: string | null, mapping: McpRestMapping, args: Record<string, unknown>, timeoutMs: number, fetchImpl?: RestFetch): Promise<UpstreamToolResult>;
110
+ export {};
111
+ //# sourceMappingURL=rest.d.ts.map