@wardby/cli 0.6.0 → 0.8.0

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 (740) hide show
  1. package/.env.example +5 -5
  2. package/README.md +6 -1
  3. package/deploy/local/docker-compose.quickstart-coding.yml +19 -0
  4. package/dist/claude-coding-worker/driver.d.ts +33 -3
  5. package/dist/claude-coding-worker/driver.js +151 -21
  6. package/dist/claude-coding-worker/main.js +38 -6
  7. package/dist/claude-coding-worker/sdk.js +29 -2
  8. package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
  9. package/dist/claude-coding-worker/tool-socket.js +111 -0
  10. package/dist/claude-coding-worker/transcript.d.ts +18 -0
  11. package/dist/claude-coding-worker/transcript.js +77 -0
  12. package/dist/claude-plugin/command.d.ts +61 -0
  13. package/dist/claude-plugin/command.js +376 -0
  14. package/dist/cli-help.d.ts +1 -1
  15. package/dist/cli-help.js +3 -1
  16. package/dist/cli.js +71 -13
  17. package/dist/coding/code-host.d.ts +16 -0
  18. package/dist/coding/code-host.js +60 -0
  19. package/dist/coding/continuation-wording.d.ts +35 -0
  20. package/dist/coding/continuation-wording.js +73 -0
  21. package/dist/coding/linked-issue-note.d.ts +23 -0
  22. package/dist/coding/linked-issue-note.js +47 -0
  23. package/dist/coding/mcp-token.d.ts +12 -0
  24. package/dist/coding/mcp-token.js +26 -0
  25. package/dist/coding/merge-wording.d.ts +28 -0
  26. package/dist/coding/merge-wording.js +78 -0
  27. package/dist/coding/pr-description-note.d.ts +9 -0
  28. package/dist/coding/pr-description-note.js +32 -0
  29. package/dist/coding/profile.d.ts +46 -126
  30. package/dist/coding/profile.js +45 -4
  31. package/dist/coding/protected-path-wording.d.ts +8 -0
  32. package/dist/coding/protected-path-wording.js +1 -1
  33. package/dist/coding/protocol.d.ts +264 -346
  34. package/dist/coding/protocol.js +237 -12
  35. package/dist/coding/redact.d.ts +3 -0
  36. package/dist/coding/redact.js +17 -0
  37. package/dist/coding/registry/allowlist.d.ts +12 -0
  38. package/dist/coding/registry/allowlist.js +14 -1
  39. package/dist/coding/registry/audit-mode.d.ts +153 -0
  40. package/dist/coding/registry/audit-mode.js +304 -0
  41. package/dist/coding/registry/lockfile-shared.d.ts +36 -0
  42. package/dist/coding/registry/lockfile-shared.js +128 -0
  43. package/dist/coding/registry/lockfiles.js +1 -1
  44. package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
  45. package/dist/coding/registry/npm-lockfile-formats.js +41 -0
  46. package/dist/coding/registry/npm-lockfile.d.ts +8 -4
  47. package/dist/coding/registry/npm-lockfile.js +4 -6
  48. package/dist/coding/registry/npm.js +78 -8
  49. package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
  50. package/dist/coding/registry/pnpm-lockfile.js +189 -0
  51. package/dist/coding/registry/pypi-plan.d.ts +50 -0
  52. package/dist/coding/registry/pypi-plan.js +406 -0
  53. package/dist/coding/registry/pypi-requirements.d.ts +58 -0
  54. package/dist/coding/registry/pypi-requirements.js +155 -0
  55. package/dist/coding/registry/pypi.d.ts +3 -27
  56. package/dist/coding/registry/pypi.js +40 -154
  57. package/dist/coding/registry/refusal-hints.d.ts +20 -0
  58. package/dist/coding/registry/refusal-hints.js +61 -0
  59. package/dist/coding/registry/refusal-wording.d.ts +11 -0
  60. package/dist/coding/registry/refusal-wording.js +56 -0
  61. package/dist/coding/registry/report.d.ts +70 -8
  62. package/dist/coding/registry/report.js +112 -5
  63. package/dist/coding/registry/types.d.ts +58 -8
  64. package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
  65. package/dist/coding/registry/yarn-lockfile.js +367 -0
  66. package/dist/coding/services/catalog.d.ts +37 -351
  67. package/dist/coding/transcript/claude-code.d.ts +13 -0
  68. package/dist/coding/transcript/claude-code.js +273 -0
  69. package/dist/coding/transcript/download-protocol.d.ts +30 -0
  70. package/dist/coding/transcript/download-protocol.js +18 -0
  71. package/dist/coding/transcript/format.d.ts +20 -0
  72. package/dist/coding/transcript/format.js +32 -0
  73. package/dist/coding/transcript/recorder.d.ts +52 -0
  74. package/dist/coding/transcript/recorder.js +225 -0
  75. package/dist/coding/transcript/resume/checkout.d.ts +31 -0
  76. package/dist/coding/transcript/resume/checkout.js +203 -0
  77. package/dist/coding/transcript/resume/command.d.ts +17 -0
  78. package/dist/coding/transcript/resume/command.js +176 -0
  79. package/dist/coding/transcript/resume/download.d.ts +20 -0
  80. package/dist/coding/transcript/resume/download.js +153 -0
  81. package/dist/coding/transcript/resume/launch.d.ts +38 -0
  82. package/dist/coding/transcript/resume/launch.js +128 -0
  83. package/dist/coding/transcript/resume/session-file.d.ts +13 -0
  84. package/dist/coding/transcript/resume/session-file.js +79 -0
  85. package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
  86. package/dist/coding/transcript/resume/stand-in.js +49 -0
  87. package/dist/coding-worker/artifact.d.ts +8 -3
  88. package/dist/coding-worker/artifact.js +3 -1
  89. package/dist/coding-worker/debug-trace.d.ts +9 -6
  90. package/dist/coding-worker/debug-trace.js +16 -19
  91. package/dist/coding-worker/dependency-cache.d.mts +229 -0
  92. package/dist/coding-worker/dependency-cache.mjs +2123 -0
  93. package/dist/coding-worker/driver.d.ts +4 -3
  94. package/dist/coding-worker/driver.js +124 -39
  95. package/dist/coding-worker/errors.d.ts +1 -0
  96. package/dist/coding-worker/errors.js +32 -0
  97. package/dist/coding-worker/main.js +5 -1
  98. package/dist/coding-worker/mcp-config.d.ts +27 -0
  99. package/dist/coding-worker/mcp-config.js +32 -0
  100. package/dist/coding-worker/sdk.d.ts +36 -0
  101. package/dist/coding-worker/sdk.js +28 -1
  102. package/dist/coding-worker/task-note.d.ts +11 -0
  103. package/dist/coding-worker/task-note.js +13 -0
  104. package/dist/coding-worker/types.d.ts +15 -0
  105. package/dist/config/dependency-cache.d.ts +23 -0
  106. package/dist/config/dependency-cache.js +32 -0
  107. package/dist/config/mcp-call-limit.d.ts +8 -0
  108. package/dist/config/mcp-call-limit.js +18 -0
  109. package/dist/config/mcp-servers.d.ts +8 -0
  110. package/dist/config/mcp-servers.js +12 -0
  111. package/dist/config/providers.d.ts +12 -3
  112. package/dist/config/providers.js +55 -5
  113. package/dist/config/test-simulators.d.ts +92 -0
  114. package/dist/config/test-simulators.js +333 -0
  115. package/dist/config/tool-timeout.d.ts +1 -0
  116. package/dist/config/tool-timeout.js +18 -0
  117. package/dist/core/async-context.d.ts +2 -0
  118. package/dist/core/async-context.js +12 -0
  119. package/dist/core/budget-events.d.ts +108 -0
  120. package/dist/core/budget-events.js +346 -0
  121. package/dist/core/budget-groups.d.ts +50 -1
  122. package/dist/core/budget-groups.js +236 -27
  123. package/dist/core/budget-stopped-head.d.ts +46 -0
  124. package/dist/core/budget-stopped-head.js +81 -0
  125. package/dist/core/budget-topup.d.ts +51 -0
  126. package/dist/core/budget-topup.js +156 -0
  127. package/dist/core/budget-wording.d.ts +16 -2
  128. package/dist/core/budget-wording.js +40 -2
  129. package/dist/core/coding-mcp.d.ts +36 -0
  130. package/dist/core/coding-mcp.js +253 -0
  131. package/dist/core/coding-queue.d.ts +2 -1
  132. package/dist/core/coding-queue.js +7 -0
  133. package/dist/core/coding-repository.d.ts +46 -0
  134. package/dist/core/coding-repository.js +92 -0
  135. package/dist/core/cron.d.ts +19 -1
  136. package/dist/core/cron.js +17 -0
  137. package/dist/core/datastores.js +1 -1
  138. package/dist/core/deferred-coding.d.ts +14 -0
  139. package/dist/core/deferred-coding.js +62 -0
  140. package/dist/core/delegation-child.d.ts +25 -0
  141. package/dist/core/delegation-child.js +37 -0
  142. package/dist/core/delegation-slots.d.ts +27 -0
  143. package/dist/core/delegation-slots.js +44 -0
  144. package/dist/core/dispatch.d.ts +48 -2
  145. package/dist/core/dispatch.js +166 -66
  146. package/dist/core/engine-native.js +1 -1
  147. package/dist/core/error-code.d.ts +38 -0
  148. package/dist/core/error-code.js +169 -0
  149. package/dist/core/grants.d.ts +46 -8
  150. package/dist/core/grants.js +99 -8
  151. package/dist/core/host-events.d.ts +18 -2
  152. package/dist/core/host-events.js +291 -27
  153. package/dist/core/host-status.d.ts +85 -3
  154. package/dist/core/host-status.js +300 -22
  155. package/dist/core/issue-bridge.d.ts +50 -6
  156. package/dist/core/issue-bridge.js +124 -33
  157. package/dist/core/issue-events.d.ts +1 -1
  158. package/dist/core/issue-events.js +4 -10
  159. package/dist/core/issue-status.d.ts +1 -1
  160. package/dist/core/issue-status.js +58 -29
  161. package/dist/core/logger.d.ts +5 -0
  162. package/dist/core/logger.js +14 -1
  163. package/dist/core/lost-run-children.d.ts +6 -0
  164. package/dist/core/lost-run-children.js +32 -0
  165. package/dist/core/mark-ready.d.ts +34 -0
  166. package/dist/core/mark-ready.js +152 -0
  167. package/dist/core/markdown-code.d.ts +8 -0
  168. package/dist/core/markdown-code.js +107 -0
  169. package/dist/core/mcp-client/client.d.ts +47 -0
  170. package/dist/core/mcp-client/client.js +141 -0
  171. package/dist/core/mcp-client/jsonrpc.d.ts +15 -0
  172. package/dist/core/mcp-client/jsonrpc.js +54 -0
  173. package/dist/core/mcp-client/results.d.ts +13 -0
  174. package/dist/core/mcp-client/results.js +42 -0
  175. package/dist/core/mcp-servers.d.ts +90 -0
  176. package/dist/core/mcp-servers.js +230 -0
  177. package/dist/core/mcp-tools.d.ts +108 -0
  178. package/dist/core/mcp-tools.js +287 -0
  179. package/dist/core/memory-tools.js +7 -0
  180. package/dist/core/merge-order-check.d.ts +2 -1
  181. package/dist/core/merge-order-check.js +44 -18
  182. package/dist/core/notification-dispatcher.js +2 -1
  183. package/dist/core/notification-templates.d.ts +1 -7
  184. package/dist/core/notification-templates.js +36 -2
  185. package/dist/core/pull-request-state-sync.js +2 -2
  186. package/dist/core/reconciler.d.ts +4 -3
  187. package/dist/core/reconciler.js +8 -1
  188. package/dist/core/related-pull-requests.d.ts +11 -3
  189. package/dist/core/related-pull-requests.js +49 -20
  190. package/dist/core/reply-parts.d.ts +21 -0
  191. package/dist/core/reply-parts.js +73 -0
  192. package/dist/core/review-fix.d.ts +1 -1
  193. package/dist/core/review-fix.js +4 -3
  194. package/dist/core/review-host-checks.d.ts +1 -1
  195. package/dist/core/review-host-tools.d.ts +3 -0
  196. package/dist/core/review-host-tools.js +102 -14
  197. package/dist/core/review-reads.d.ts +55 -0
  198. package/dist/core/review-reads.js +233 -0
  199. package/dist/core/run-status.d.ts +12 -0
  200. package/dist/core/run-status.js +12 -0
  201. package/dist/core/runner.d.ts +145 -49
  202. package/dist/core/runner.js +719 -216
  203. package/dist/core/schedule-start.d.ts +12 -0
  204. package/dist/core/schedule-start.js +14 -0
  205. package/dist/core/secret-broker-config.d.ts +12 -74
  206. package/dist/core/secret-broker-config.js +1 -1
  207. package/dist/core/secret-guard.d.ts +49 -0
  208. package/dist/core/secret-guard.js +119 -0
  209. package/dist/core/secret-guarded-stores.d.ts +12 -0
  210. package/dist/core/secret-guarded-stores.js +41 -0
  211. package/dist/core/secret-spans.d.ts +50 -0
  212. package/dist/core/secret-spans.js +94 -0
  213. package/dist/core/secrets.d.ts +11 -1
  214. package/dist/core/secrets.js +27 -1
  215. package/dist/core/serializable-retry.d.ts +18 -0
  216. package/dist/core/serializable-retry.js +43 -0
  217. package/dist/core/stop-run.d.ts +46 -0
  218. package/dist/core/stop-run.js +61 -0
  219. package/dist/core/tool-admin.d.ts +5 -1
  220. package/dist/core/tool-admin.js +7 -2
  221. package/dist/core/tool-names.d.ts +13 -0
  222. package/dist/core/tool-names.js +20 -0
  223. package/dist/core/webhooks.d.ts +4 -0
  224. package/dist/core/webhooks.js +68 -49
  225. package/dist/core/workflow-events.d.ts +14 -2
  226. package/dist/core/workflow-events.js +4 -0
  227. package/dist/core/workflow-run-events.d.ts +5 -3
  228. package/dist/core/workflow-run-events.js +45 -9
  229. package/dist/core/zod-json-schema.d.ts +4 -0
  230. package/dist/core/zod-json-schema.js +39 -0
  231. package/dist/core/zod3-window.d.ts +35 -0
  232. package/dist/core/zod3-window.js +124 -0
  233. package/dist/generated/prisma/browser.d.ts +65 -3
  234. package/dist/generated/prisma/client.d.ts +65 -3
  235. package/dist/generated/prisma/commonInputTypes.d.ts +266 -106
  236. package/dist/generated/prisma/enums.d.ts +10 -0
  237. package/dist/generated/prisma/enums.js +8 -0
  238. package/dist/generated/prisma/internal/class.d.ts +110 -0
  239. package/dist/generated/prisma/internal/class.js +4 -4
  240. package/dist/generated/prisma/internal/prismaNamespace.d.ts +957 -9
  241. package/dist/generated/prisma/internal/prismaNamespace.js +166 -2
  242. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +174 -0
  243. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +166 -2
  244. package/dist/generated/prisma/models/Agent.d.ts +377 -8
  245. package/dist/generated/prisma/models/AgentMcpServer.d.ts +1412 -0
  246. package/dist/generated/prisma/models/AgentMcpServer.js +1 -0
  247. package/dist/generated/prisma/models/AgentRepository.d.ts +81 -1
  248. package/dist/generated/prisma/models/AuthUser.d.ts +1 -1
  249. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +228 -7
  250. package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
  251. package/dist/generated/prisma/models/CodingProxySession.d.ts +232 -2
  252. package/dist/generated/prisma/models/CodingRun.d.ts +1712 -1
  253. package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
  254. package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
  255. package/dist/generated/prisma/models/HostProvider.d.ts +2176 -0
  256. package/dist/generated/prisma/models/HostProvider.js +1 -0
  257. package/dist/generated/prisma/models/HostProviderCredential.d.ts +1285 -0
  258. package/dist/generated/prisma/models/HostProviderCredential.js +1 -0
  259. package/dist/generated/prisma/models/HostProviderOperation.d.ts +1470 -0
  260. package/dist/generated/prisma/models/HostProviderOperation.js +1 -0
  261. package/dist/generated/prisma/models/HostProviderTrustedAccount.d.ts +1145 -0
  262. package/dist/generated/prisma/models/HostProviderTrustedAccount.js +1 -0
  263. package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
  264. package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
  265. package/dist/generated/prisma/models/McpServer.d.ts +1500 -0
  266. package/dist/generated/prisma/models/McpServer.js +1 -0
  267. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +77 -1
  268. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
  269. package/dist/generated/prisma/models/Principal.d.ts +167 -0
  270. package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
  271. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
  272. package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
  273. package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
  274. package/dist/generated/prisma/models/ResourceGrant.d.ts +1 -1
  275. package/dist/generated/prisma/models/Run.d.ts +738 -2
  276. package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
  277. package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
  278. package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
  279. package/dist/generated/prisma/models/RunTranscript.js +1 -0
  280. package/dist/generated/prisma/models/Secret.d.ts +387 -0
  281. package/dist/generated/prisma/models/Tool.d.ts +223 -1
  282. package/dist/generated/prisma/models.d.ts +10 -0
  283. package/dist/help/search.js +12 -3
  284. package/dist/help-index.json +2033 -110
  285. package/dist/import/create.js +48 -4
  286. package/dist/import/neutral-schema.d.ts +51 -281
  287. package/dist/import/neutral-schema.js +7 -4
  288. package/dist/knowledge/check.d.ts +1 -1
  289. package/dist/knowledge/cli.d.ts +11 -1
  290. package/dist/knowledge/cli.js +37 -4
  291. package/dist/knowledge/concept.d.ts +3 -19
  292. package/dist/knowledge/location.d.ts +31 -0
  293. package/dist/knowledge/location.js +78 -0
  294. package/dist/mcp/auth/access.d.ts +10 -2
  295. package/dist/mcp/auth/access.js +15 -1
  296. package/dist/mcp/auth/grants-cli.d.ts +6 -4
  297. package/dist/mcp/auth/grants-cli.js +42 -3
  298. package/dist/mcp/auth/ownership.d.ts +7 -7
  299. package/dist/mcp/auth/resource-server.d.ts +3 -1
  300. package/dist/mcp/auth/resource-server.js +17 -2
  301. package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
  302. package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
  303. package/dist/mcp/context.d.ts +3 -0
  304. package/dist/mcp/host-events/github-ingress.d.ts +2 -0
  305. package/dist/mcp/host-events/github-ingress.js +2 -1
  306. package/dist/mcp/index.d.ts +6 -0
  307. package/dist/mcp/index.js +69 -10
  308. package/dist/mcp/server.d.ts +13 -0
  309. package/dist/mcp/server.js +33 -14
  310. package/dist/mcp/tools/agents.d.ts +4 -0
  311. package/dist/mcp/tools/agents.js +295 -28
  312. package/dist/mcp/tools/datastore.js +17 -8
  313. package/dist/mcp/tools/grants.js +73 -29
  314. package/dist/mcp/tools/host-providers.d.ts +2 -0
  315. package/dist/mcp/tools/host-providers.js +215 -0
  316. package/dist/mcp/tools/mcp-servers.d.ts +26 -0
  317. package/dist/mcp/tools/mcp-servers.js +481 -0
  318. package/dist/mcp/tools/memory.js +11 -1
  319. package/dist/mcp/tools/notification-channels.js +2 -2
  320. package/dist/mcp/tools/packages.d.ts +2 -0
  321. package/dist/mcp/tools/packages.js +195 -0
  322. package/dist/mcp/tools/repositories.js +65 -12
  323. package/dist/mcp/tools/run-access.d.ts +16 -0
  324. package/dist/mcp/tools/run-access.js +25 -0
  325. package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
  326. package/dist/mcp/tools/run-transcript-download.js +129 -0
  327. package/dist/mcp/tools/run-transcript.d.ts +19 -0
  328. package/dist/mcp/tools/run-transcript.js +70 -0
  329. package/dist/mcp/tools/runs.js +209 -27
  330. package/dist/mcp/tools/scheduling.js +3 -1
  331. package/dist/mcp/tools/secret-elicitation-form.js +5 -0
  332. package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
  333. package/dist/mcp/tools/secret-elicitation-server.js +10 -61
  334. package/dist/mcp/tools/secret-elicitation.d.ts +2 -0
  335. package/dist/mcp/tools/secret-elicitation.js +25 -2
  336. package/dist/mcp/tools/secrets.js +40 -6
  337. package/dist/mcp/tools/stop-run.d.ts +2 -0
  338. package/dist/mcp/tools/stop-run.js +82 -0
  339. package/dist/mcp/tools/subagents.js +2 -2
  340. package/dist/mcp/tools/tools.d.ts +7 -5
  341. package/dist/mcp/tools/tools.js +64 -16
  342. package/dist/mcp/tools/trigger.js +28 -6
  343. package/dist/mcp/transport/http-limits.d.ts +2 -0
  344. package/dist/mcp/transport/http-limits.js +6 -2
  345. package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
  346. package/dist/mcp/transport/stdio-link-host.js +67 -0
  347. package/dist/mcp/transport/streamable-http.d.ts +13 -0
  348. package/dist/mcp/transport/streamable-http.js +41 -1
  349. package/dist/mcp/webhooks/ingress.js +10 -0
  350. package/dist/native-worker/docker-launcher.d.ts +38 -2
  351. package/dist/native-worker/docker-launcher.js +65 -5
  352. package/dist/native-worker/gateway-server.d.ts +55 -3
  353. package/dist/native-worker/gateway-server.js +152 -34
  354. package/dist/native-worker/gateway.d.ts +29 -1
  355. package/dist/native-worker/gateway.js +74 -4
  356. package/dist/native-worker/http-server.d.ts +7 -1
  357. package/dist/native-worker/http-server.js +62 -7
  358. package/dist/native-worker/http-transport.js +1 -1
  359. package/dist/native-worker/kubernetes-launcher.d.ts +7 -3
  360. package/dist/native-worker/kubernetes-launcher.js +43 -3
  361. package/dist/native-worker/launch.d.ts +18 -1
  362. package/dist/native-worker/launch.js +6 -1
  363. package/dist/native-worker/ledger.d.ts +24 -4
  364. package/dist/native-worker/ledger.js +62 -8
  365. package/dist/native-worker/loopback.js +3 -8
  366. package/dist/native-worker/main.d.ts +2 -1
  367. package/dist/native-worker/main.js +14 -3
  368. package/dist/native-worker/protocol.d.ts +130 -577
  369. package/dist/native-worker/protocol.js +51 -2
  370. package/dist/native-worker/sandbox-executor.d.ts +17 -2
  371. package/dist/native-worker/sandbox-executor.js +78 -4
  372. package/dist/native-worker/stderr-redaction.d.ts +77 -0
  373. package/dist/native-worker/stderr-redaction.js +237 -0
  374. package/dist/native-worker/stdio.d.ts +1 -1
  375. package/dist/native-worker/stdio.js +6 -5
  376. package/dist/native-worker/warm-pool.d.ts +2 -2
  377. package/dist/native-worker/warm-pool.js +4 -4
  378. package/dist/native-worker/worker.js +28 -2
  379. package/dist/observability/metrics.js +6 -1
  380. package/dist/providers/auth/self-hosted.d.ts +1 -1
  381. package/dist/providers/coding-proxy/capability-hash.d.ts +2 -0
  382. package/dist/providers/coding-proxy/capability-hash.js +5 -0
  383. package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
  384. package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
  385. package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
  386. package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
  387. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
  388. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
  389. package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
  390. package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
  391. package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
  392. package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
  393. package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
  394. package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
  395. package/dist/providers/coding-proxy/hold.d.ts +32 -0
  396. package/dist/providers/coding-proxy/hold.js +86 -0
  397. package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
  398. package/dist/providers/coding-proxy/interrupted.js +104 -0
  399. package/dist/providers/coding-proxy/mcp-route.d.ts +34 -0
  400. package/dist/providers/coding-proxy/mcp-route.js +166 -0
  401. package/dist/providers/coding-proxy/memory-ledger.d.ts +17 -2
  402. package/dist/providers/coding-proxy/memory-ledger.js +99 -8
  403. package/dist/providers/coding-proxy/metering.d.ts +16 -0
  404. package/dist/providers/coding-proxy/metering.js +27 -4
  405. package/dist/providers/coding-proxy/prisma-ledger.d.ts +16 -2
  406. package/dist/providers/coding-proxy/prisma-ledger.js +209 -69
  407. package/dist/providers/coding-proxy/proxy.d.ts +21 -2
  408. package/dist/providers/coding-proxy/proxy.js +300 -48
  409. package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
  410. package/dist/providers/coding-proxy/registry/audit.js +94 -17
  411. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
  412. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
  413. package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
  414. package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
  415. package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
  416. package/dist/providers/coding-proxy/registry/plan.js +201 -48
  417. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
  418. package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
  419. package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
  420. package/dist/providers/coding-proxy/registry/service.js +579 -112
  421. package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
  422. package/dist/providers/coding-proxy/registry/store.js +54 -1
  423. package/dist/providers/coding-proxy/runtime.d.ts +10 -0
  424. package/dist/providers/coding-proxy/runtime.js +109 -16
  425. package/dist/providers/coding-proxy/server.d.ts +9 -1
  426. package/dist/providers/coding-proxy/server.js +55 -1
  427. package/dist/providers/coding-proxy/types.d.ts +78 -1
  428. package/dist/providers/datastore/types.d.ts +5 -0
  429. package/dist/providers/engine/types.d.ts +17 -2
  430. package/dist/providers/engine/types.js +17 -0
  431. package/dist/providers/executor/composition.d.ts +10 -3
  432. package/dist/providers/executor/composition.js +52 -7
  433. package/dist/providers/executor/container.d.ts +394 -9
  434. package/dist/providers/executor/container.js +1210 -96
  435. package/dist/providers/executor/dbos-status.d.ts +31 -0
  436. package/dist/providers/executor/dbos-status.js +64 -0
  437. package/dist/providers/executor/dbos.d.ts +50 -1
  438. package/dist/providers/executor/dbos.js +207 -20
  439. package/dist/providers/executor/deferred.d.ts +12 -24
  440. package/dist/providers/executor/deferred.js +10 -29
  441. package/dist/providers/executor/in-process.d.ts +9 -1
  442. package/dist/providers/executor/in-process.js +14 -4
  443. package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
  444. package/dist/providers/executor/linked-issue-reader.js +30 -0
  445. package/dist/providers/executor/routing.d.ts +2 -0
  446. package/dist/providers/executor/routing.js +4 -0
  447. package/dist/providers/executor/types.d.ts +13 -0
  448. package/dist/providers/host-tools/invoke.d.ts +37 -0
  449. package/dist/providers/host-tools/invoke.js +117 -0
  450. package/dist/providers/host-tools/operations.d.ts +65 -0
  451. package/dist/providers/host-tools/operations.js +149 -0
  452. package/dist/providers/host-tools/registry.d.ts +79 -0
  453. package/dist/providers/host-tools/registry.js +362 -0
  454. package/dist/providers/host-tools/request-guard.d.ts +17 -0
  455. package/dist/providers/host-tools/request-guard.js +99 -0
  456. package/dist/providers/host-tools/self-test.d.ts +64 -0
  457. package/dist/providers/host-tools/self-test.js +142 -0
  458. package/dist/providers/index.d.ts +2 -1
  459. package/dist/providers/issue-tracker/types.d.ts +17 -0
  460. package/dist/providers/issue-tracker/types.js +39 -1
  461. package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
  462. package/dist/providers/jobs/claude-tool-setup.js +5 -2
  463. package/dist/providers/jobs/docker-isolation.d.ts +10 -2
  464. package/dist/providers/jobs/docker-isolation.js +47 -8
  465. package/dist/providers/jobs/docker.d.ts +9 -0
  466. package/dist/providers/jobs/docker.js +60 -11
  467. package/dist/providers/jobs/fake-kubernetes-api.d.ts +2 -0
  468. package/dist/providers/jobs/fake-kubernetes-api.js +3 -0
  469. package/dist/providers/jobs/kubernetes-api.d.ts +8 -0
  470. package/dist/providers/jobs/kubernetes-api.js +10 -0
  471. package/dist/providers/jobs/kubernetes-client.js +10 -1
  472. package/dist/providers/jobs/kubernetes-isolation.d.ts +5 -1
  473. package/dist/providers/jobs/kubernetes-isolation.js +32 -3
  474. package/dist/providers/jobs/kubernetes.d.ts +11 -1
  475. package/dist/providers/jobs/kubernetes.js +111 -17
  476. package/dist/providers/jobs/types.d.ts +39 -0
  477. package/dist/providers/jobs/types.js +13 -1
  478. package/dist/providers/llm/anthropic.js +5 -1
  479. package/dist/providers/llm/bedrock.d.ts +0 -12
  480. package/dist/providers/llm/bedrock.js +4 -0
  481. package/dist/providers/llm/claude-messages.d.ts +3 -1
  482. package/dist/providers/llm/claude-messages.js +4 -1
  483. package/dist/providers/llm/claude-provider.d.ts +2 -2
  484. package/dist/providers/llm/claude-provider.js +2 -2
  485. package/dist/providers/llm/openai.d.ts +2 -2
  486. package/dist/providers/llm/openai.js +6 -2
  487. package/dist/providers/llm/routing.d.ts +2 -2
  488. package/dist/providers/llm/routing.js +2 -2
  489. package/dist/providers/llm/types.d.ts +12 -2
  490. package/dist/providers/review-host/github-events.d.ts +9 -1
  491. package/dist/providers/review-host/github-events.js +34 -12
  492. package/dist/providers/review-host/github.d.ts +29 -2
  493. package/dist/providers/review-host/github.js +224 -29
  494. package/dist/providers/review-host/local.d.ts +8 -4
  495. package/dist/providers/review-host/local.js +49 -31
  496. package/dist/providers/review-host/patch-pages.d.ts +41 -0
  497. package/dist/providers/review-host/patch-pages.js +176 -0
  498. package/dist/providers/review-host/review-format.d.ts +19 -1
  499. package/dist/providers/review-host/review-format.js +38 -7
  500. package/dist/providers/review-host/types.d.ts +140 -6
  501. package/dist/providers/review-host/types.js +9 -1
  502. package/dist/providers/storage/gcs.d.ts +63 -0
  503. package/dist/providers/storage/gcs.js +69 -0
  504. package/dist/providers/storage/index.d.ts +15 -0
  505. package/dist/providers/storage/index.js +14 -0
  506. package/dist/providers/storage/local.d.ts +24 -0
  507. package/dist/providers/storage/local.js +92 -0
  508. package/dist/providers/storage/meter.d.ts +14 -0
  509. package/dist/providers/storage/meter.js +34 -0
  510. package/dist/providers/storage/s3.d.ts +41 -0
  511. package/dist/providers/storage/s3.js +107 -0
  512. package/dist/providers/storage/types.d.ts +37 -3
  513. package/dist/providers/storage/types.js +21 -4
  514. package/dist/providers/vcs/git.d.ts +39 -4
  515. package/dist/providers/vcs/git.js +339 -26
  516. package/dist/providers/vcs/github-remote.d.ts +26 -3
  517. package/dist/providers/vcs/github-remote.js +124 -14
  518. package/dist/providers/vcs/github.d.ts +183 -44
  519. package/dist/providers/vcs/github.js +455 -56
  520. package/dist/providers/vcs/index.d.ts +1 -1
  521. package/dist/providers/vcs/index.js +9 -2
  522. package/dist/providers/vcs/pr-description.d.ts +127 -0
  523. package/dist/providers/vcs/pr-description.js +270 -0
  524. package/dist/providers/vcs/remote.d.ts +37 -1
  525. package/dist/providers/vcs/remote.js +7 -1
  526. package/dist/providers/vcs/routing.d.ts +16 -8
  527. package/dist/providers/vcs/routing.js +27 -6
  528. package/dist/providers/vcs/types.d.ts +150 -5
  529. package/dist/quickstart/coding-seed.d.ts +14 -3
  530. package/dist/quickstart/coding-seed.js +213 -4
  531. package/dist/quickstart/index.d.ts +5 -0
  532. package/dist/quickstart/index.js +21 -0
  533. package/dist/quickstart/reviewer-prompt.d.ts +1 -1
  534. package/dist/quickstart/reviewer-prompt.js +6 -6
  535. package/dist/quickstart-images.json +1 -1
  536. package/dist/sandbox/eval-core.d.ts +12 -2
  537. package/dist/sandbox/eval-core.js +20 -4
  538. package/dist/sandbox/generated/zod.bundle.js +62 -1
  539. package/dist/sandbox/generated/zod3.bundle.js +5 -0
  540. package/dist/sandbox/host-functions.d.ts +5 -0
  541. package/dist/sandbox/host-functions.js +13 -13
  542. package/dist/sandbox/limits.d.ts +4 -1
  543. package/dist/sandbox/limits.js +4 -1
  544. package/dist/sandbox/run-in-sandbox.d.ts +6 -0
  545. package/dist/sandbox/run-in-sandbox.js +14 -2
  546. package/dist/sandbox/safe-fetch.d.ts +2 -0
  547. package/dist/sandbox/safe-fetch.js +1 -1
  548. package/dist/sandbox/secret-broker.d.ts +1 -0
  549. package/dist/sandbox/secret-broker.js +4 -5
  550. package/dist/sandbox/tool-capabilities.d.ts +10 -30
  551. package/dist/sandbox/tool-timeout.d.ts +32 -0
  552. package/dist/sandbox/tool-timeout.js +52 -0
  553. package/dist/sandbox/user-tool.d.ts +8 -1
  554. package/dist/sandbox/user-tool.js +9 -3
  555. package/dist/sandbox/zod-params.d.ts +37 -5
  556. package/dist/sandbox/zod-params.js +181 -26
  557. package/dist/serve.js +8 -1
  558. package/dist/viewer/api-schema.d.ts +349 -2627
  559. package/dist/viewer/api-schema.js +7 -0
  560. package/dist/viewer/build-schemas.js +6 -2
  561. package/dist/viewer/graph.js +2 -1
  562. package/dist/viewer/openapi.js +2 -4
  563. package/dist/wardby-bin.js +15 -0
  564. package/docs/README.md +11 -1
  565. package/docs/agent-recipes.md +95 -24
  566. package/docs/architecture-runtime.md +1 -1
  567. package/docs/claude-code-plugin.md +164 -0
  568. package/docs/code-review-agents.md +557 -41
  569. package/docs/coding-agent-setup.md +566 -8
  570. package/docs/coding-packages.md +1033 -90
  571. package/docs/coding-services.md +27 -12
  572. package/docs/coding-worker-byo-images.md +24 -2
  573. package/docs/coding-worker-isolation.md +183 -37
  574. package/docs/debugging-agent-runs.md +242 -0
  575. package/docs/getting-started-gke.md +129 -141
  576. package/docs/getting-started-identity-provider.md +53 -38
  577. package/docs/getting-started.md +17 -0
  578. package/docs/host-providers.md +294 -0
  579. package/docs/jira-agents.md +17 -8
  580. package/docs/knowledge/blob-not-found-semantics.md +41 -0
  581. package/docs/knowledge/bounded-file-descriptor.md +52 -0
  582. package/docs/knowledge/delegation-admission-slots.md +52 -0
  583. package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
  584. package/docs/knowledge/import-rename-target.md +52 -0
  585. package/docs/knowledge/index.md +57 -0
  586. package/docs/knowledge/log.md +9 -0
  587. package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
  588. package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
  589. package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
  590. package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
  591. package/docs/knowledge/overview-cli.md +74 -0
  592. package/docs/knowledge/overview-coding-proxy.md +72 -0
  593. package/docs/knowledge/overview-coding.md +72 -0
  594. package/docs/knowledge/overview-config.md +60 -0
  595. package/docs/knowledge/overview-core.md +72 -0
  596. package/docs/knowledge/overview-deploy.md +83 -0
  597. package/docs/knowledge/overview-mcp.md +61 -0
  598. package/docs/knowledge/overview-prisma.md +72 -0
  599. package/docs/knowledge/overview-providers.md +89 -0
  600. package/docs/knowledge/overview-sandbox.md +83 -0
  601. package/docs/knowledge/overview-surfaces.md +83 -0
  602. package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
  603. package/docs/knowledge/proxy-settlement-projections.md +41 -0
  604. package/docs/knowledge/run-pricing-first-writer.md +43 -0
  605. package/docs/knowledge/schedule-claim-transaction.md +41 -0
  606. package/docs/knowledge/secret-entry-replica-contract.md +52 -0
  607. package/docs/knowledge/terminal-run-first-writer.md +41 -0
  608. package/docs/knowledge/transactional-agent-authorization.md +52 -0
  609. package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
  610. package/docs/knowledge/warm-input-publication.md +30 -0
  611. package/docs/knowledge/workspace-staging-failure.md +54 -0
  612. package/docs/knowledge.md +54 -14
  613. package/docs/mcp-servers.md +254 -0
  614. package/docs/native-sandbox.md +143 -31
  615. package/docs/observability.md +4 -0
  616. package/docs/security-deployment.md +139 -29
  617. package/docs/slack-notifications.md +35 -19
  618. package/docs/tool-secrets.md +45 -10
  619. package/docs/viewer-api.md +6 -0
  620. package/docs/viewer-api.openapi.yml +1 -1
  621. package/help/admin-viewer.md +28 -2
  622. package/help/agent-recipes.md +33 -2
  623. package/help/architecture-agent.md +11 -6
  624. package/help/brokered-secrets.md +3 -0
  625. package/help/build-claude-code-image.md +1 -1
  626. package/help/build-worker-image.md +3 -1
  627. package/help/builder-agent.md +19 -6
  628. package/help/claude-code-run-pane.md +40 -0
  629. package/help/code-review-agents.md +177 -6
  630. package/help/coding-packages.md +156 -6
  631. package/help/cost-attribution.md +9 -5
  632. package/help/creating-agents.md +14 -1
  633. package/help/dependency-cache.md +143 -0
  634. package/help/deploy-gke.md +15 -8
  635. package/help/errors/budget-exhausted.md +187 -0
  636. package/help/errors/budget-group-exhausted.md +5 -1
  637. package/help/errors/coding-mcp-pins-unavailable.md +35 -0
  638. package/help/errors/coding-stream-quota-exceeded.md +33 -0
  639. package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
  640. package/help/errors/continuation-closed.md +9 -12
  641. package/help/errors/database-auth-invalid.md +1 -1
  642. package/help/errors/delegation-conflict.md +24 -0
  643. package/help/errors/file-list-truncated.md +45 -0
  644. package/help/errors/full-read-required.md +49 -0
  645. package/help/errors/github-account-not-allowed.md +4 -0
  646. package/help/errors/graph-incomplete.md +43 -0
  647. package/help/errors/graph-limit.md +43 -0
  648. package/help/errors/host-provider-error.md +40 -0
  649. package/help/errors/host-tool-failed.md +36 -0
  650. package/help/errors/mcp-call-limit.md +22 -0
  651. package/help/errors/mcp-call-timeout.md +22 -0
  652. package/help/errors/mcp-server-auth-failed.md +22 -0
  653. package/help/errors/mcp-server-credentials-unavailable.md +45 -0
  654. package/help/errors/mcp-server-error.md +28 -0
  655. package/help/errors/mcp-server-unreachable.md +22 -0
  656. package/help/errors/mcp-servers-off.md +21 -0
  657. package/help/errors/mcp-tool-not-allowed.md +26 -0
  658. package/help/errors/mcp-tool-removed.md +22 -0
  659. package/help/errors/mcp-unavailable.md +25 -0
  660. package/help/errors/merge-conflict.md +49 -0
  661. package/help/errors/native-sandbox-capacity.md +1 -1
  662. package/help/errors/native-sandbox-deadline-exceeded.md +1 -1
  663. package/help/errors/native-sandbox-docker-failed.md +1 -1
  664. package/help/errors/native-sandbox-gateway-error.md +20 -0
  665. package/help/errors/native-sandbox-gateway-unavailable.md +1 -1
  666. package/help/errors/native-sandbox-image-not-pinned.md +1 -1
  667. package/help/errors/native-sandbox-isolation-mismatch.md +1 -1
  668. package/help/errors/native-sandbox-launch-abandoned.md +21 -0
  669. package/help/errors/native-sandbox-network-unenforced.md +1 -1
  670. package/help/errors/native-sandbox-requires-catalog.md +1 -1
  671. package/help/errors/native-sandbox-unavailable.md +1 -1
  672. package/help/errors/native-sandbox-warm-delivery-failed.md +1 -1
  673. package/help/errors/native-sandbox-worker-exited.md +4 -3
  674. package/help/errors/native-sandbox-worker-lost.md +1 -1
  675. package/help/errors/native-sandbox-worker-unready.md +1 -1
  676. package/help/errors/package-not-allowed-pending.md +52 -0
  677. package/help/errors/package-not-allowed.md +51 -0
  678. package/help/errors/package-refusals.md +43 -0
  679. package/help/errors/patch-cursor-malformed.md +31 -0
  680. package/help/errors/repository-not-listed.md +36 -0
  681. package/help/errors/repository-required.md +36 -0
  682. package/help/errors/run-lost.md +39 -0
  683. package/help/errors/run-transcript-download.md +44 -0
  684. package/help/errors/secret-in-value.md +69 -0
  685. package/help/errors/target-merge.md +40 -0
  686. package/help/errors/tool-timeout.md +38 -0
  687. package/help/fix-merge-conflicts.md +73 -0
  688. package/help/github-app-setup.md +132 -0
  689. package/help/github.md +22 -0
  690. package/help/host-providers.md +40 -0
  691. package/help/identity-and-access.md +6 -1
  692. package/help/jira.md +23 -6
  693. package/help/knowledge.md +16 -7
  694. package/help/local-repositories.md +1 -1
  695. package/help/low-power-mode.md +7 -1
  696. package/help/mcp-servers.md +73 -0
  697. package/help/mcp.md +7 -2
  698. package/help/merge-order-check.md +5 -0
  699. package/help/native-capabilities.md +55 -1
  700. package/help/native-sandbox.md +16 -2
  701. package/help/operating-agents.md +21 -0
  702. package/help/package-audit-mode.md +91 -0
  703. package/help/related-pull-requests.md +17 -10
  704. package/help/repo-instructions-and-skills.md +3 -1
  705. package/help/resume-runs-locally.md +134 -0
  706. package/help/review-fix-rounds.md +33 -1
  707. package/help/sharing-agents.md +59 -0
  708. package/help/slack-notifications.md +19 -5
  709. package/help/status-comments.md +31 -0
  710. package/help/stop-run.md +58 -0
  711. package/help/troubleshooting/budgets.md +28 -0
  712. package/help/troubleshooting/coding-workers.md +86 -7
  713. package/help/troubleshooting/debugging-agent-runs.md +29 -0
  714. package/package.json +18 -10
  715. package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
  716. package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
  717. package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
  718. package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
  719. package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
  720. package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
  721. package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
  722. package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
  723. package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
  724. package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
  725. package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
  726. package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
  727. package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
  728. package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
  729. package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
  730. package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
  731. package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
  732. package/prisma/migrations/20261102000000_host_providers/migration.sql +56 -0
  733. package/prisma/migrations/20261104000000_coding_agent_repository_list/migration.sql +5 -0
  734. package/prisma/migrations/20261106000000_tool_timeout/migration.sql +4 -0
  735. package/prisma/migrations/20261107000000_mcp_servers/migration.sql +33 -0
  736. package/prisma/migrations/20261108000000_coding_mcp/migration.sql +5 -0
  737. package/prisma/migrations/20261109000000_task_run_index/migration.sql +3 -0
  738. package/prisma/schema.prisma +468 -109
  739. package/scripts/git-askpass.sh +1 -1
  740. package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
@@ -0,0 +1,230 @@
1
+ import { redactTokenShapedValues } from "../coding/protocol.js";
2
+ import { McpClientError, McpHttpClient, } from "./mcp-client/client.js";
3
+ import { parseSecretBrokerConfig } from "./secret-broker-config.js";
4
+ import { redactExactSecretValues, withEscapedForms } from "./secret-spans.js";
5
+ import { brokeredFetch } from "../sandbox/brokered-fetch.js";
6
+ import { safeFetch } from "../sandbox/safe-fetch.js";
7
+ import { consoleRedactionValues, encodedForms } from "../sandbox/secret-broker.js";
8
+ export class McpServerInputError extends Error {
9
+ constructor(message) {
10
+ super(message);
11
+ this.name = "McpServerInputError";
12
+ }
13
+ }
14
+ /** What the server's owner (or an admin) sees when a stored secret of the server can't be decrypted. */
15
+ export const CREDENTIALS_UNAVAILABLE_MESSAGE = "The MCP server's credentials can't be decrypted on this server. Check that every Wardby process (control plane, scheduler, native gateway) uses the same SECRET_APP_KEY, or set the secret again.";
16
+ /**
17
+ * A server's brokered secret exists but its stored value can't be decrypted (another
18
+ * SECRET_APP_KEY, a key-id mismatch, a corrupt ciphertext). Not an input problem: the message is
19
+ * fixed and never carries the cipher's error, the ciphertext or a value.
20
+ */
21
+ export class McpCredentialsUnavailableError extends Error {
22
+ serverId;
23
+ serverName;
24
+ secretName;
25
+ code = "mcp_server_credentials_unavailable";
26
+ constructor(
27
+ /** Empty while a server is being registered (it has no id yet). */
28
+ serverId, serverName, secretName) {
29
+ super(CREDENTIALS_UNAVAILABLE_MESSAGE);
30
+ this.serverId = serverId;
31
+ this.serverName = serverName;
32
+ this.secretName = secretName;
33
+ this.name = "McpCredentialsUnavailableError";
34
+ }
35
+ }
36
+ /** The one operator line for an undecryptable server secret: ids and names only, never the cipher's error text. */
37
+ export function logCredentialsUnavailable(log, error) {
38
+ log.warn({
39
+ reason: "mcp_secret_decrypt_failed",
40
+ ...(error.serverId !== "" ? { serverId: error.serverId } : {}),
41
+ serverName: error.serverName,
42
+ secretName: error.secretName,
43
+ }, "MCP server secret could not be decrypted");
44
+ }
45
+ const SERVER_NAME = /^[a-z0-9][a-z0-9_-]{0,31}$/;
46
+ const EXPOSED_NAME = /^[A-Za-z0-9_-]{1,64}$/;
47
+ const DEFAULT_TIMEOUT_MS = 30_000;
48
+ /** Validates a server URL: https, no userinfo, no fragment, default port; returns the normalised string. */
49
+ export function normaliseServerUrl(raw) {
50
+ let url;
51
+ try {
52
+ url = new URL(raw);
53
+ }
54
+ catch {
55
+ throw new McpServerInputError("The MCP server URL is not a valid URL.");
56
+ }
57
+ if (url.protocol !== "https:")
58
+ throw new McpServerInputError("The MCP server URL must use https.");
59
+ if (url.username !== "" || url.password !== "")
60
+ throw new McpServerInputError("The MCP server URL must not contain a username or password; use a brokered secret.");
61
+ if (url.hash !== "")
62
+ throw new McpServerInputError("The MCP server URL must not contain a fragment (#).");
63
+ if (url.port !== "")
64
+ throw new McpServerInputError("The MCP server URL must use the default https port (443).");
65
+ return url.href;
66
+ }
67
+ export function assertServerName(name) {
68
+ if (!SERVER_NAME.test(name)) {
69
+ throw new McpServerInputError("The MCP server name must be 1-32 characters: lower-case letters, digits, _ or -, starting with a letter or digit.");
70
+ }
71
+ }
72
+ /** The tool name the model sees: `<server>__<tool>` with any other character mapped to `_`. */
73
+ export function exposedToolName(serverName, toolName) {
74
+ const name = `${serverName}__${toolName}`.replace(/[^A-Za-z0-9_-]/g, "_");
75
+ if (!EXPOSED_NAME.test(name)) {
76
+ throw new McpServerInputError(`The tool name "${name.slice(0, 40)}..." is longer than 64 characters once prefixed.`);
77
+ }
78
+ return name;
79
+ }
80
+ /** A server's saved tool list (toolSnapshot); anything but an array reads as empty. */
81
+ export function snapshotOf(server) {
82
+ return Array.isArray(server.toolSnapshot) ? server.toolSnapshot : [];
83
+ }
84
+ /** Exposed names of allowed tools; a name too long to expose is left out (refused at attach anyway). */
85
+ export function exposedNames(serverName, allowedTools) {
86
+ return allowedTools.flatMap((tool) => {
87
+ try {
88
+ return [exposedToolName(serverName, tool)];
89
+ }
90
+ catch {
91
+ return [];
92
+ }
93
+ });
94
+ }
95
+ /** Added, removed and changed (description or schema) tool names between two snapshots; order-independent. */
96
+ export function diffSnapshots(before, after) {
97
+ const old = new Map(before.map((t) => [t.name, t]));
98
+ const next = new Map(after.map((t) => [t.name, t]));
99
+ const added = [...next.keys()].filter((n) => !old.has(n)).sort();
100
+ const removed = [...old.keys()].filter((n) => !next.has(n)).sort();
101
+ const changed = [...next.keys()].filter((n) => old.has(n) && canonical(old.get(n)) !== canonical(next.get(n))).sort();
102
+ return { added, removed, changed };
103
+ }
104
+ function canonical(value) {
105
+ return JSON.stringify(value, (_key, v) => v !== null && typeof v === "object" && !Array.isArray(v)
106
+ ? Object.fromEntries(Object.entries(v).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)))
107
+ : v);
108
+ }
109
+ /** Redacts every secret value of this server (exact, every encoded and escaped form) plus token shapes. */
110
+ export function redactForServer(text, values) {
111
+ const forms = withEscapedForms(values.flatMap(encodedForms)).sort((a, b) => b.length - a.length);
112
+ return redactTokenShapedValues(redactExactSecretValues(text, [...values, ...forms]));
113
+ }
114
+ /** The same error with its message redacted; an McpClientError keeps its code, any other keeps its name. */
115
+ export function redactError(error, values) {
116
+ const message = redactForServer(error instanceof Error ? error.message : "The MCP server call failed.", values);
117
+ if (error instanceof McpClientError)
118
+ return new McpClientError(error.code, message);
119
+ if (error instanceof McpServerInputError)
120
+ return new McpServerInputError(message);
121
+ // Its message is fixed and carries no value: keep it (and its ids) as it is.
122
+ if (error instanceof McpCredentialsUnavailableError)
123
+ return error;
124
+ const out = new Error(message);
125
+ if (error instanceof Error)
126
+ out.name = error.name;
127
+ return out;
128
+ }
129
+ /**
130
+ * Loads the owner's secrets for the server; each must exist, be owned by ownerId, be brokered, and list
131
+ * the URL's host (McpServerInputError otherwise). A stored value that can't be decrypted throws
132
+ * McpCredentialsUnavailableError.
133
+ */
134
+ export async function loadServerSecrets(db, cipher, server) {
135
+ const host = new URL(server.url).hostname.toLowerCase();
136
+ const entries = new Map();
137
+ const values = new Set();
138
+ for (const name of server.secretNames) {
139
+ const stored = await db.secret.findUnique({
140
+ where: { ownerId_name: { ownerId: server.ownerId, name } },
141
+ select: { ciphertext: true, broker: true },
142
+ });
143
+ if (!stored)
144
+ throw new McpServerInputError(`Secret "${name}" was not found among your secrets.`);
145
+ if (stored.broker === null || stored.broker === undefined)
146
+ throw new McpServerInputError(`Secret "${name}" is not brokered; set its broker config first (set_secret_broker).`);
147
+ let broker;
148
+ try {
149
+ broker = parseSecretBrokerConfig(stored.broker);
150
+ }
151
+ catch {
152
+ throw new McpServerInputError(`Secret "${name}" has a broker config that cannot be read; set it again.`);
153
+ }
154
+ if (!broker.hosts.includes(host))
155
+ throw new McpServerInputError(`Secret "${name}" is not brokered to host ${host}; add it to the secret's hosts.`);
156
+ let value;
157
+ try {
158
+ value = await cipher.decrypt(stored.ciphertext);
159
+ }
160
+ catch {
161
+ // The cipher's error is dropped: it is not an input problem, and its text is not ours to pass on.
162
+ throw new McpCredentialsUnavailableError(server.id, server.name, name);
163
+ }
164
+ const entry = { value, broker };
165
+ entries.set(name, entry);
166
+ for (const v of withEscapedForms(consoleRedactionValues(entry)))
167
+ values.add(v);
168
+ }
169
+ const accessor = {
170
+ get: async () => {
171
+ throw new Error("secret_brokered: this secret is brokered; it is never readable");
172
+ },
173
+ resolve: async (name) => entries.get(name),
174
+ };
175
+ return { accessor, values: [...values] };
176
+ }
177
+ /** The McpFetch for one server: brokeredFetch over safeFetch with the timeout and signal; text body, lower-case headers. */
178
+ export function serverFetch(server, accessor, options) {
179
+ return async (request, signal) => {
180
+ const response = (await brokeredFetch({
181
+ url: server.url,
182
+ init: { method: request.method, headers: request.headers, body: request.body },
183
+ secretNames: server.secretNames,
184
+ secrets: accessor,
185
+ fetchImpl: options.fetchImpl ?? safeFetch,
186
+ policy: { timeoutMs: options.timeoutMs, signal },
187
+ redactFromConsole: () => { },
188
+ }));
189
+ return {
190
+ status: response.status,
191
+ headers: Object.fromEntries(Object.entries(response.headers).map(([k, v]) => [k.toLowerCase(), v])),
192
+ body: Buffer.from(response.bodyBase64, "base64").toString("utf8"),
193
+ };
194
+ };
195
+ }
196
+ /** initialize + listTools + close; the result is redacted (as JSON text) before it is returned. */
197
+ export async function fetchSnapshot(server, deps) {
198
+ const timeoutMs = deps.timeoutMs ?? DEFAULT_TIMEOUT_MS;
199
+ const { accessor, values } = await loadServerSecrets(deps.db, deps.cipher, server);
200
+ const client = new McpHttpClient({
201
+ fetch: serverFetch(server, accessor, { timeoutMs, fetchImpl: deps.fetchImpl }),
202
+ signal: AbortSignal.timeout(timeoutMs * 3),
203
+ });
204
+ let raw;
205
+ try {
206
+ const serverInfo = await client.initialize();
207
+ raw = { serverInfo, tools: await client.listTools() };
208
+ }
209
+ catch (error) {
210
+ throw redactError(error, values);
211
+ }
212
+ finally {
213
+ await client.close().catch(() => { });
214
+ }
215
+ const redacted = redactForServer(JSON.stringify(raw), values);
216
+ try {
217
+ return JSON.parse(redacted);
218
+ }
219
+ catch {
220
+ throw new McpServerInputError("The MCP server's tool list could not be saved safely.");
221
+ }
222
+ }
223
+ /** For the secret delete guard: names of the owner's MCP servers whose secretNames include the secret. */
224
+ export async function mcpServersUsingSecret(db, ownerId, secretName) {
225
+ const rows = await db.mcpServer.findMany({
226
+ where: { ownerId, secretNames: { has: secretName } },
227
+ select: { name: true },
228
+ });
229
+ return rows.map((r) => r.name).sort();
230
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * A native run's remote MCP tools: the load step pins the agent's attached, allowed tools
3
+ * (loadMcpToolPins), the runner offers them as built-ins (mcpToolDefs), and every call runs on the
4
+ * control plane through handleMcpTool. The pin decides only which tools the model sees for this
5
+ * run; each call re-checks the live attachment, that the agent's owner may still use the server (owns
6
+ * it or holds use on it), and uses the live server row (URL, secrets). A pin carries no URL (a query
7
+ * string can carry a token), secret names or owner id: pins are saved in the run's step results.
8
+ *
9
+ * Secret values never leave: results and errors are redacted against the server's secrets (every
10
+ * encoded form) plus token shapes, the log line carries no arguments, bodies or URL, and
11
+ * mcpNamedSecretValues feeds the run's own redaction (secret-guard.ts loadAgentSecretValues).
12
+ */
13
+ import type { PrismaClient } from "#prisma";
14
+ import type { Logger } from "./logger.js";
15
+ import type { LoadedTool } from "../providers/engine/types.js";
16
+ import type { SecretCipher } from "../providers/secrets/types.js";
17
+ import type { safeFetch } from "../sandbox/safe-fetch.js";
18
+ /** One MCP tool as the load step pins it. */
19
+ export interface McpToolPin {
20
+ /** The name the model sees: `<server name>__<tool name>`. */
21
+ exposedName: string;
22
+ /** The name the server knows. */
23
+ toolName: string;
24
+ serverId: string;
25
+ serverName: string;
26
+ /** Only when the attachment sets one. */
27
+ callTimeoutMs?: number;
28
+ definition: {
29
+ description: string;
30
+ inputSchema: Record<string, unknown>;
31
+ };
32
+ }
33
+ export declare const DEFAULT_MCP_CALL_TIMEOUT_MS = 30000;
34
+ /** What a grantee's run sees when the server owner's credentials can't be loaded. */
35
+ export declare const SHARED_CREDENTIALS_MESSAGE = "The MCP server's credentials can't be used; ask its owner to check it.";
36
+ /**
37
+ * A Codex coding agent runs shell commands that can read the run's MCP token, so it may use only tools
38
+ * the server marks read-only (annotations.readOnlyHint === true in the saved tool list).
39
+ */
40
+ export declare function isMarkedReadOnly(entry: {
41
+ annotations?: Record<string, unknown>;
42
+ } | undefined): boolean;
43
+ /**
44
+ * Whether a coding provider gets the Codex read-only rule. Fails closed: anything but exactly
45
+ * "claude-code" (Codex, an unknown value, or a coding agent with no profile) counts as Codex. A run
46
+ * is judged by the provider it was dispatched with (CodingRun.provider), never the agent's current
47
+ * profile, which can change between dispatch and launch.
48
+ */
49
+ export declare function isCodexCoding(provider: string | null | undefined): boolean;
50
+ type McpToolsDb = Pick<PrismaClient, "agentMcpServer" | "secret" | "resourceGrant">;
51
+ /** Redaction reads attachments and secrets only: it covers every attached server, usable or not. */
52
+ type McpSecretsDb = Pick<PrismaClient, "agentMcpServer" | "secret">;
53
+ export interface McpToolPinOptions {
54
+ /**
55
+ * Pin only tools the server marks read-only: the caller sets it for a Codex coding run, from the
56
+ * provider the run was dispatched with (isCodexCoding(run.provider)). Native runs leave it unset.
57
+ */
58
+ readOnlyOnly?: boolean;
59
+ }
60
+ /**
61
+ * Builds pins for an agent's attachments: allowed tools present in the snapshot only, from servers the
62
+ * agent's owner may still use (owns, or holds use on); none when the mode is off.
63
+ */
64
+ export declare function loadMcpToolPins(db: Pick<PrismaClient, "agentMcpServer" | "resourceGrant">, agentId: string, options?: McpToolPinOptions): Promise<McpToolPin[]>;
65
+ /**
66
+ * The pins whose exposed name no other tool of the run uses. Attach refuses clashes; this covers a
67
+ * name that became a built-in (or an attached tool) later: the MCP tool is left out, with a warning.
68
+ */
69
+ export declare function withoutClashingPins(pins: readonly McpToolPin[], otherNames: readonly string[], log: Pick<Logger, "warn">): McpToolPin[];
70
+ export declare function mcpToolDefs(pins: readonly McpToolPin[]): LoadedTool[];
71
+ export interface McpToolContext {
72
+ db: McpToolsDb;
73
+ cipher: Pick<SecretCipher, "decrypt">;
74
+ /** The agent whose attachment is re-checked on every call. */
75
+ agentId: string;
76
+ /** The run, for the per-call log line. */
77
+ runId: string;
78
+ /** The run's stop signal: aborting it stops a call in flight. */
79
+ signal: AbortSignal;
80
+ /** A sandboxed run's session deadline; the call's time limit never runs past it. */
81
+ deadlineAt?: Date;
82
+ /**
83
+ * Refuse any tool the live tool list doesn't mark read-only: set by the coding gateway for a Codex
84
+ * run, from the run's dispatched provider (isCodexCoding(codingRun.provider)). Native runs leave it unset.
85
+ */
86
+ readOnlyOnly?: boolean;
87
+ fetchImpl?: typeof safeFetch;
88
+ log: Pick<Logger, "info" | "warn">;
89
+ }
90
+ /**
91
+ * Never throws. Re-checks the live attachment, validates the arguments, runs initialize → tools/call →
92
+ * close under the time limit, and returns the redacted result text or a JSON error. One log line per call.
93
+ */
94
+ export declare function handleMcpTool(pin: McpToolPin, argsJson: string, ctx: McpToolContext): Promise<string>;
95
+ export interface NamedMcpSecretValues {
96
+ /** `mcp:<server name>/<secret name>`. */
97
+ name: string;
98
+ values: string[];
99
+ }
100
+ /**
101
+ * Every secret value of every server attached to the agent, named `mcp:<server>/<secret>`, in
102
+ * every form the server's own redaction looks for. A secret that no longer exists has no value to
103
+ * leak and is skipped; a read that fails rejects (callers fail closed).
104
+ */
105
+ export declare function mcpNamedSecretValues(db: McpSecretsDb, cipher: Pick<SecretCipher, "decrypt">, agentId: string): Promise<NamedMcpSecretValues[]>;
106
+ /** Secret values for every attached server of this agent (for run-text masking and gateway cause checks). */
107
+ export declare function mcpSecretValuesForAgent(db: McpSecretsDb, cipher: Pick<SecretCipher, "decrypt">, agentId: string): Promise<string[]>;
108
+ export {};
@@ -0,0 +1,287 @@
1
+ import { ownerCanUseMcpServer } from "./grants.js";
2
+ import { loadMcpServersMode, MCP_SERVERS_OFF_MESSAGE } from "../config/mcp-servers.js";
3
+ import { loadToolMaxTimeoutMs } from "../config/tool-timeout.js";
4
+ import { McpClientError, McpHttpClient } from "./mcp-client/client.js";
5
+ import { toolResultText } from "./mcp-client/results.js";
6
+ import { exposedToolName, loadServerSecrets, logCredentialsUnavailable, McpCredentialsUnavailableError, McpServerInputError, redactForServer, serverFetch, snapshotOf, } from "./mcp-servers.js";
7
+ import { parseSecretBrokerConfig } from "./secret-broker-config.js";
8
+ import { withEscapedForms } from "./secret-spans.js";
9
+ import { consoleRedactionValues, encodedForms } from "../sandbox/secret-broker.js";
10
+ export const DEFAULT_MCP_CALL_TIMEOUT_MS = 30_000;
11
+ /** What a grantee's run sees when the server owner's credentials can't be loaded. */
12
+ export const SHARED_CREDENTIALS_MESSAGE = "The MCP server's credentials can't be used; ask its owner to check it.";
13
+ /**
14
+ * A Codex coding agent runs shell commands that can read the run's MCP token, so it may use only tools
15
+ * the server marks read-only (annotations.readOnlyHint === true in the saved tool list).
16
+ */
17
+ export function isMarkedReadOnly(entry) {
18
+ return entry?.annotations?.readOnlyHint === true;
19
+ }
20
+ /**
21
+ * Whether a coding provider gets the Codex read-only rule. Fails closed: anything but exactly
22
+ * "claude-code" (Codex, an unknown value, or a coding agent with no profile) counts as Codex. A run
23
+ * is judged by the provider it was dispatched with (CodingRun.provider), never the agent's current
24
+ * profile, which can change between dispatch and launch.
25
+ */
26
+ export function isCodexCoding(provider) {
27
+ return provider !== "claude-code";
28
+ }
29
+ /**
30
+ * Builds pins for an agent's attachments: allowed tools present in the snapshot only, from servers the
31
+ * agent's owner may still use (owns, or holds use on); none when the mode is off.
32
+ */
33
+ export async function loadMcpToolPins(db, agentId, options = {}) {
34
+ if (loadMcpServersMode() === "off")
35
+ return [];
36
+ const rows = await db.agentMcpServer.findMany({
37
+ where: { agentId },
38
+ include: { server: true, agent: { select: { ownerId: true } } },
39
+ orderBy: [{ createdAt: "asc" }, { serverId: "asc" }],
40
+ });
41
+ const pins = [];
42
+ for (const row of rows) {
43
+ if (!(await ownerCanUseMcpServer(db, row.agent.ownerId, row.server)))
44
+ continue;
45
+ const byName = new Map(snapshotOf(row.server).map((t) => [t.name, t]));
46
+ for (const toolName of row.allowedTools) {
47
+ const entry = byName.get(toolName);
48
+ if (!entry)
49
+ continue;
50
+ // A refresh can drop readOnlyHint after attach: such a tool stays out of a Codex run.
51
+ if (options.readOnlyOnly === true && !isMarkedReadOnly(entry))
52
+ continue;
53
+ let exposedName;
54
+ try {
55
+ exposedName = exposedToolName(row.server.name, toolName);
56
+ }
57
+ catch {
58
+ continue;
59
+ }
60
+ pins.push({
61
+ exposedName,
62
+ toolName,
63
+ serverId: row.server.id,
64
+ serverName: row.server.name,
65
+ ...(row.callTimeoutMs !== null ? { callTimeoutMs: row.callTimeoutMs } : {}),
66
+ definition: { description: entry.description, inputSchema: entry.inputSchema },
67
+ });
68
+ }
69
+ }
70
+ return pins;
71
+ }
72
+ /**
73
+ * The pins whose exposed name no other tool of the run uses. Attach refuses clashes; this covers a
74
+ * name that became a built-in (or an attached tool) later: the MCP tool is left out, with a warning.
75
+ */
76
+ export function withoutClashingPins(pins, otherNames, log) {
77
+ const taken = new Set(otherNames);
78
+ return pins.filter((pin) => {
79
+ if (!taken.has(pin.exposedName)) {
80
+ taken.add(pin.exposedName);
81
+ return true;
82
+ }
83
+ log.warn({ serverId: pin.serverId, tool: pin.toolName, exposedName: pin.exposedName }, "MCP tool left out of the run: its name clashes with another tool");
84
+ return false;
85
+ });
86
+ }
87
+ export function mcpToolDefs(pins) {
88
+ return pins.map((pin) => ({
89
+ name: pin.exposedName,
90
+ description: `From MCP server ${pin.serverName}: ${pin.definition.description}`,
91
+ jsonSchema: pin.definition.inputSchema,
92
+ }));
93
+ }
94
+ function error(code, message) {
95
+ return JSON.stringify({ error: code, message });
96
+ }
97
+ function parseArgs(argsJson) {
98
+ if (argsJson.trim() === "")
99
+ return {};
100
+ try {
101
+ const value = JSON.parse(argsJson);
102
+ return value !== null && typeof value === "object" && !Array.isArray(value)
103
+ ? value
104
+ : undefined;
105
+ }
106
+ catch {
107
+ return undefined;
108
+ }
109
+ }
110
+ /**
111
+ * Never throws. Re-checks the live attachment, validates the arguments, runs initialize → tools/call →
112
+ * close under the time limit, and returns the redacted result text or a JSON error. One log line per call.
113
+ */
114
+ export async function handleMcpTool(pin, argsJson, ctx) {
115
+ const startedAt = Date.now();
116
+ const done = (text, outcome) => {
117
+ ctx.log.info({
118
+ runId: ctx.runId,
119
+ agentId: ctx.agentId,
120
+ serverId: pin.serverId,
121
+ tool: pin.toolName,
122
+ outcome,
123
+ durationMs: Date.now() - startedAt,
124
+ resultChars: text.length,
125
+ }, "mcp tool call");
126
+ return text;
127
+ };
128
+ const fail = (code, message) => done(error(code, message), code);
129
+ let values = [];
130
+ try {
131
+ if (loadMcpServersMode() === "off")
132
+ return fail("mcp_servers_off", MCP_SERVERS_OFF_MESSAGE);
133
+ const row = await ctx.db.agentMcpServer.findUnique({
134
+ where: { agentId_serverId: { agentId: ctx.agentId, serverId: pin.serverId } },
135
+ include: { server: true, agent: { select: { ownerId: true } } },
136
+ });
137
+ if (!row || !row.allowedTools.includes(pin.toolName)) {
138
+ return fail("mcp_tool_not_allowed", `The tool "${pin.exposedName}" is no longer allowed for this agent: its MCP server was detached or the tool was taken off the allowed list.`);
139
+ }
140
+ // A revoked or lowered grant stops the very next call, even before the attachment is pruned.
141
+ if (!(await ownerCanUseMcpServer(ctx.db, row.agent.ownerId, row.server))) {
142
+ return fail("mcp_tool_not_allowed", `The tool "${pin.exposedName}" is no longer allowed for this agent: its owner no longer has use access to MCP server "${row.server.name}".`);
143
+ }
144
+ const live = snapshotOf(row.server).find((t) => t.name === pin.toolName);
145
+ if (!live) {
146
+ return fail("mcp_tool_removed", `The tool "${pin.exposedName}" is no longer in MCP server "${row.server.name}"'s tool list.`);
147
+ }
148
+ if (ctx.readOnlyOnly === true && !isMarkedReadOnly(live)) {
149
+ return fail("mcp_tool_not_allowed", `The tool "${pin.exposedName}" is no longer allowed for this agent: Codex agents can use only tools the server marks read-only.`);
150
+ }
151
+ const args = parseArgs(argsJson);
152
+ if (!args)
153
+ return fail("invalid_arguments", "The tool's arguments must be a JSON object.");
154
+ const configured = Math.min(row.callTimeoutMs ?? pin.callTimeoutMs ?? DEFAULT_MCP_CALL_TIMEOUT_MS, loadToolMaxTimeoutMs());
155
+ const untilDeadline = ctx.deadlineAt ? ctx.deadlineAt.getTime() - Date.now() : Infinity;
156
+ const limitMs = Math.max(0, Math.min(configured, untilDeadline));
157
+ const timedOut = `The MCP server did not answer within ${limitMs} ms.`;
158
+ if (ctx.signal.aborted)
159
+ return fail("mcp_call_timeout", "The call was stopped.");
160
+ if (limitMs <= 0)
161
+ return fail("mcp_call_timeout", "The run's time limit has been reached.");
162
+ const server = {
163
+ id: row.server.id,
164
+ ownerId: row.server.ownerId,
165
+ name: row.server.name,
166
+ url: row.server.url,
167
+ secretNames: row.server.secretNames,
168
+ };
169
+ let secrets;
170
+ try {
171
+ secrets = await loadServerSecrets(ctx.db, ctx.cipher, server);
172
+ }
173
+ catch (err) {
174
+ const shared = row.agent.ownerId !== server.ownerId;
175
+ if (err instanceof McpCredentialsUnavailableError) {
176
+ logCredentialsUnavailable(ctx.log, err);
177
+ return fail(err.code, shared ? SHARED_CREDENTIALS_MESSAGE : err.message);
178
+ }
179
+ // The detail names the server owner's secrets and speaks to that owner: a grantee's run gets neither.
180
+ if (err instanceof McpServerInputError && shared) {
181
+ return fail("mcp_server_error", SHARED_CREDENTIALS_MESSAGE);
182
+ }
183
+ throw err;
184
+ }
185
+ values = secrets.values;
186
+ const controller = new AbortController();
187
+ let stopped = false;
188
+ const onStop = () => {
189
+ stopped = true;
190
+ controller.abort();
191
+ };
192
+ ctx.signal.addEventListener("abort", onStop, { once: true });
193
+ const timer = setTimeout(() => controller.abort(), limitMs);
194
+ // The race ends the call even if a transport ignores the signal.
195
+ const aborted = new Promise((_resolve, reject) => {
196
+ controller.signal.addEventListener("abort", () => reject(new McpClientError("mcp_call_timeout", "aborted")), {
197
+ once: true,
198
+ });
199
+ });
200
+ aborted.catch(() => { });
201
+ // A stop that fired while the secrets were loading came before the listener; act on it now.
202
+ if (ctx.signal.aborted)
203
+ onStop();
204
+ const client = new McpHttpClient({
205
+ fetch: serverFetch(server, secrets.accessor, { timeoutMs: limitMs, fetchImpl: ctx.fetchImpl }),
206
+ signal: controller.signal,
207
+ });
208
+ try {
209
+ const result = await Promise.race([
210
+ (async () => {
211
+ await client.initialize();
212
+ return client.callTool(pin.toolName, args);
213
+ })(),
214
+ aborted,
215
+ ]);
216
+ const { text, isError } = toolResultText(result, (raw) => redactForServer(raw, values));
217
+ return done(text, isError ? "mcp_server_error" : "ok");
218
+ }
219
+ catch (err) {
220
+ if (controller.signal.aborted) {
221
+ return fail("mcp_call_timeout", stopped ? "The call was stopped." : timedOut);
222
+ }
223
+ throw err;
224
+ }
225
+ finally {
226
+ clearTimeout(timer);
227
+ ctx.signal.removeEventListener("abort", onStop);
228
+ // Best effort; never waits on a server that already ran out of time.
229
+ if (controller.signal.aborted)
230
+ void client.close().catch(() => { });
231
+ else
232
+ await client.close().catch(() => { });
233
+ }
234
+ }
235
+ catch (err) {
236
+ const message = redactForServer(err instanceof Error ? err.message : "The MCP server call failed.", values);
237
+ if (err instanceof McpClientError)
238
+ return fail(err.code, message);
239
+ if (err instanceof McpServerInputError)
240
+ return fail("mcp_server_error", message);
241
+ return fail("mcp_server_unreachable", "The MCP server could not be reached.");
242
+ }
243
+ }
244
+ /**
245
+ * Every secret value of every server attached to the agent, named `mcp:<server>/<secret>`, in
246
+ * every form the server's own redaction looks for. A secret that no longer exists has no value to
247
+ * leak and is skipped; a read that fails rejects (callers fail closed).
248
+ */
249
+ export async function mcpNamedSecretValues(db, cipher, agentId) {
250
+ const rows = await db.agentMcpServer.findMany({
251
+ where: { agentId },
252
+ select: { server: { select: { name: true, ownerId: true, secretNames: true } } },
253
+ });
254
+ const named = [];
255
+ for (const { server } of rows) {
256
+ for (const secretName of server.secretNames) {
257
+ const stored = await db.secret.findUnique({
258
+ where: { ownerId_name: { ownerId: server.ownerId, name: secretName } },
259
+ select: { ciphertext: true, broker: true },
260
+ });
261
+ if (!stored)
262
+ continue;
263
+ const value = await cipher.decrypt(stored.ciphertext);
264
+ const base = consoleRedactionValues({ value, broker: readableBroker(stored.broker) });
265
+ named.push({
266
+ name: `mcp:${server.name}/${secretName}`,
267
+ values: withEscapedForms([...new Set([...base, ...base.flatMap(encodedForms)])]),
268
+ });
269
+ }
270
+ }
271
+ return named;
272
+ }
273
+ /** A stored broker config, or null when there is none or it cannot be read (the value alone is then redacted). */
274
+ function readableBroker(stored) {
275
+ if (stored === null || stored === undefined)
276
+ return null;
277
+ try {
278
+ return parseSecretBrokerConfig(stored);
279
+ }
280
+ catch {
281
+ return null;
282
+ }
283
+ }
284
+ /** Secret values for every attached server of this agent (for run-text masking and gateway cause checks). */
285
+ export async function mcpSecretValuesForAgent(db, cipher, agentId) {
286
+ return (await mcpNamedSecretValues(db, cipher, agentId)).flatMap((n) => n.values);
287
+ }
@@ -10,6 +10,7 @@
10
10
  * agents' data.
11
11
  */
12
12
  import { z } from "zod";
13
+ import { SecretInValueError, SecretCheckUnavailableError } from "./secret-guard.js";
13
14
  import { MEMORY_CONTENT_MAX_BYTES, MEMORY_KEY_MAX_BYTES, MEMORY_MAX_KEYS_PER_AGENT, MEMORY_SEARCH_MAX_LIMIT, } from "../providers/memory/types.js";
14
15
  export const MEMORY_TOOL_NAMES = new Set([
15
16
  "memory_get",
@@ -116,6 +117,12 @@ export async function handleMemoryTool(name, argsJson, agentId, memory) {
116
117
  message: err.issues.map((issue) => `${issue.path.join(".") || "input"}: ${issue.message}`).join("; "),
117
118
  });
118
119
  }
120
+ if (err instanceof SecretInValueError) {
121
+ return JSON.stringify({ error: err.code, message: err.message, secretNames: err.secretNames });
122
+ }
123
+ if (err instanceof SecretCheckUnavailableError) {
124
+ return JSON.stringify({ error: err.code, message: err.message });
125
+ }
119
126
  const code = err instanceof Error ? err.message : "memory_error";
120
127
  return JSON.stringify({ error: code, message: MEMORY_ERROR_MESSAGES[code] ?? code });
121
128
  }
@@ -21,6 +21,7 @@
21
21
  import type { Run } from "#prisma";
22
22
  import type { PullRequestOrigin, ReviewHostRegistry, UpsertNamedCheckInput } from "../providers/review-host/types.js";
23
23
  import { type Logger } from "./logger.js";
24
+ import { type MarkReadyDb } from "./mark-ready.js";
24
25
  import { type RelatedPullRequestsDb } from "./related-pull-requests.js";
25
26
  export declare const MERGE_ORDER_CHECK_NAME = "wardby merge order";
26
27
  export interface MergeOrderMember {
@@ -49,7 +50,7 @@ export type MergeOrderVerdict = {
49
50
  * as its entry in `set`; only `mergeOrder` is read from it.
50
51
  */
51
52
  export declare function mergeOrderVerdict(self: MergeOrderMember, set: readonly MergeOrderMember[]): MergeOrderVerdict;
52
- export type MergeOrderDb = RelatedPullRequestsDb;
53
+ export type MergeOrderDb = RelatedPullRequestsDb & MarkReadyDb;
53
54
  export interface MergeOrderSyncDeps {
54
55
  db: MergeOrderDb;
55
56
  hosts: ReviewHostRegistry | undefined;