@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,156 @@
1
+ import { codingTopUpRoom, MIN_RESERVATION_USD } from "./budget-groups.js";
2
+ import { GROUP_DISPATCH_LOCK_SQL, isSerializationConflict, isTransactionUnavailable } from "./dispatch.js";
3
+ import { logger } from "./logger.js";
4
+ const topUpLog = logger.child({ module: "budget-topup" });
5
+ /** Share of the base one step adds, unless one maximum request hold is more. */
6
+ export const TOP_UP_STEP_SHARE = 0.1;
7
+ /** Headroom: the share of the base, or this many of the run's largest request holds if more. */
8
+ export const TOP_UP_HEADROOM_SHARE = 0.2;
9
+ export const TOP_UP_HEADROOM_HOLDS = 2;
10
+ const roundMicro = (usd) => Math.round(usd / MIN_RESERVATION_USD) * MIN_RESERVATION_USD;
11
+ const floorMicro = (usd) => Math.floor(usd / MIN_RESERVATION_USD + 1e-6) * MIN_RESERVATION_USD;
12
+ /** The run's grant, limit and proxy-session totals, or the outcome when there is nothing to ask for. */
13
+ async function readState(db, runId) {
14
+ const coding = await db.codingRun.findUnique({
15
+ where: { runId },
16
+ select: {
17
+ budgetReservedUsd: true,
18
+ budgetBaseUsd: true,
19
+ budgetLimitUsd: true,
20
+ run: { select: { status: true } },
21
+ proxySession: { select: { id: true, status: true, budgetExhaustedAt: true } },
22
+ },
23
+ });
24
+ if (!coding || coding.budgetLimitUsd == null)
25
+ return { outcome: "closed" };
26
+ const grantedUsd = Number(coding.budgetReservedUsd);
27
+ const limitUsd = Number(coding.budgetLimitUsd);
28
+ const result = { outcome: "closed", grantedUsd };
29
+ if (grantedUsd + MIN_RESERVATION_USD > limitUsd)
30
+ return result;
31
+ if (coding.run.status !== "running" && coding.run.status !== "pending")
32
+ return result;
33
+ // Already refused by the proxy: the worker is stopping, a grant now would only be held for nothing.
34
+ const session = coding.proxySession;
35
+ if (!session || session.status !== "active" || session.budgetExhaustedAt)
36
+ return result;
37
+ const refused = await db.runBudgetEvent.findFirst({
38
+ where: { runId, kind: "overrun_unavailable" },
39
+ select: { id: true },
40
+ });
41
+ if (refused)
42
+ return result;
43
+ // Totals as the proxy ledger counts them (prisma-ledger.ts reserve).
44
+ const totals = await db.$queryRaw `
45
+ SELECT
46
+ COALESCE(SUM(CASE
47
+ WHEN "status" = 'completed' THEN "actualCostUsd"
48
+ WHEN "status" = 'uncertain' AND "costEstimated" THEN "actualCostUsd"
49
+ ELSE 0
50
+ END), 0) AS "spent",
51
+ COALESCE(SUM(CASE
52
+ WHEN "status" = 'reserved' THEN "reservationUsd"
53
+ WHEN "status" = 'uncertain' AND NOT "costEstimated" THEN "reservationUsd"
54
+ ELSE 0
55
+ END), 0) AS "held",
56
+ COALESCE(MAX(COALESCE("ceilingUsd", "reservationUsd")), 0) AS "maxHold"
57
+ FROM "CodingProxyRequest" WHERE "sessionId" = ${session.id}
58
+ `;
59
+ return {
60
+ baseUsd: coding.budgetBaseUsd == null ? grantedUsd : Number(coding.budgetBaseUsd),
61
+ grantedUsd,
62
+ limitUsd,
63
+ sessionId: session.id,
64
+ spentUsd: Number(totals[0]?.spent ?? 0),
65
+ heldUsd: Number(totals[0]?.held ?? 0),
66
+ maxHoldUsd: Number(totals[0]?.maxHold ?? 0),
67
+ };
68
+ }
69
+ /**
70
+ * How far below its grant a run asks for its next step. Agent loops grow their
71
+ * context, so the next request usually holds more than any before it, and the
72
+ * top-up has to land before it is sent.
73
+ */
74
+ function headroomUsd(state) {
75
+ return Math.max(TOP_UP_HEADROOM_HOLDS * state.maxHoldUsd, TOP_UP_HEADROOM_SHARE * state.baseUsd);
76
+ }
77
+ /** Close to its grant: within its headroom. */
78
+ function isClose(state) {
79
+ return state.spentUsd + state.heldUsd >= state.grantedUsd - headroomUsd(state);
80
+ }
81
+ /** Near enough to its grant that the next poll should come soon. */
82
+ function isNear(state) {
83
+ return state.spentUsd + state.heldUsd >= state.grantedUsd - 2 * headroomUsd(state);
84
+ }
85
+ async function grantOnce(tx, runId, now) {
86
+ // First statement: serializes with dispatch and every other top-up (see GROUP_DISPATCH_LOCK_SQL).
87
+ await tx.$executeRawUnsafe(GROUP_DISPATCH_LOCK_SQL);
88
+ const state = await readState(tx, runId);
89
+ if ("outcome" in state)
90
+ return state;
91
+ if (!isClose(state))
92
+ return { outcome: "not_needed", grantedUsd: state.grantedUsd, near: isNear(state) };
93
+ const room = await codingTopUpRoom(tx, runId, now);
94
+ const step = Math.max(TOP_UP_STEP_SHARE * state.baseUsd, state.maxHoldUsd);
95
+ const grant = floorMicro(Math.min(step, state.limitUsd - state.grantedUsd, room.roomUsd));
96
+ if (grant < MIN_RESERVATION_USD) {
97
+ const details = {
98
+ source: "top-up",
99
+ capUsd: room.detail?.capUsd ?? 0,
100
+ spentUsd: room.detail?.spentUsd ?? 0,
101
+ heldUsd: room.detail?.heldUsd ?? 0,
102
+ leftUsd: room.roomUsd,
103
+ baseBudgetUsd: state.baseUsd,
104
+ grantedUsd: state.grantedUsd,
105
+ limitUsd: state.limitUsd,
106
+ ...(room.groupName ? { groupName: room.groupName } : {}),
107
+ };
108
+ await tx.runBudgetEvent.create({
109
+ data: {
110
+ runId,
111
+ kind: "overrun_unavailable",
112
+ limit: room.limitedBy ?? "run",
113
+ details: details,
114
+ },
115
+ });
116
+ return { outcome: "unavailable", grantedUsd: state.grantedUsd };
117
+ }
118
+ const grantedUsd = Math.min(state.limitUsd, roundMicro(state.grantedUsd + grant));
119
+ await tx.codingRun.update({ where: { runId }, data: { budgetReservedUsd: grantedUsd } });
120
+ await tx.codingProxySession.updateMany({
121
+ where: { id: state.sessionId, status: "active" },
122
+ data: { budgetUsd: grantedUsd },
123
+ });
124
+ return { outcome: "granted", grantedUsd, near: true };
125
+ }
126
+ /**
127
+ * Grants the run one overrun step when it is close to its grant and its
128
+ * budget group and run tree have room. Cheap when it is not close: that is
129
+ * read without the lock. One attempt per call, so a poll never blocks on
130
+ * retries: a serialization conflict (or a lock not had in time) answers
131
+ * not_needed and near, and the caller's next poll, soon, asks again.
132
+ */
133
+ export async function topUpCodingBudget(db, runId, now = new Date()) {
134
+ const state = await readState(db, runId);
135
+ if ("outcome" in state)
136
+ return state;
137
+ if (!isClose(state))
138
+ return { outcome: "not_needed", grantedUsd: state.grantedUsd, near: isNear(state) };
139
+ try {
140
+ const result = await db.$transaction((tx) => grantOnce(tx, runId, now), {
141
+ isolationLevel: "Serializable",
142
+ maxWait: TOP_UP_TX_MAX_WAIT_MS,
143
+ });
144
+ if (result.outcome === "granted" || result.outcome === "unavailable") {
145
+ topUpLog.info({ runId, outcome: result.outcome, grantedUsd: result.grantedUsd }, "coding run overrun top-up");
146
+ }
147
+ return result;
148
+ }
149
+ catch (err) {
150
+ if (!isSerializationConflict(err) && !isTransactionUnavailable(err))
151
+ throw err;
152
+ return { outcome: "not_needed", grantedUsd: state.grantedUsd, near: true };
153
+ }
154
+ }
155
+ /** How long one top-up waits to start its transaction: short, so a poll (and its heartbeat) is never held long. */
156
+ export const TOP_UP_TX_MAX_WAIT_MS = 2_000;
@@ -6,17 +6,31 @@
6
6
  */
7
7
  import type { PrismaClient } from "#prisma";
8
8
  export interface BudgetFacts {
9
- /** The run's own budget (a coding run's reservation); falls back to the agent's. */
9
+ /** The run's own budget (a coding run's reservation: its grant); falls back to the agent's. */
10
10
  runBudgetUsd?: number | null;
11
11
  agentBudgetUsd: number;
12
+ /** The run's budget before the agent's allowed overrun; absent for runs from before the setting. */
13
+ baseBudgetUsd?: number | null;
14
+ /** The most the run could have been topped up to (CodingRun.budgetLimitUsd); absent = its reservation. */
15
+ limitUsd?: number | null;
12
16
  budgetGroupName?: string | null;
13
17
  /** The run was refused before it started. */
14
18
  refused?: boolean;
15
19
  }
20
+ /** A group name is operator-chosen text; keep it to one short, quote-free line. */
21
+ export declare function groupName(name: string | null | undefined): string | null;
22
+ /** The allowed overrun as a whole percent, or null when the run had none (no base, or it rounds to 0%). */
23
+ export declare function overrunPercent(baseUsd: number | null | undefined, limitUsd: number): number | null;
16
24
  export declare function budgetSentence(facts: BudgetFacts): string;
25
+ /**
26
+ * For a run that finished over its base budget: what it spent and by how much
27
+ * it went over, and whether that stayed inside the allowed overrun. Undefined
28
+ * when the spend is within the base budget.
29
+ */
30
+ export declare function overrunSentence(costUsd: number, baseUsd: number, limitUsd: number): string | undefined;
17
31
  /**
18
32
  * The sentence for a finished run, read from the database: a coding run's
19
33
  * reserved budget, otherwise the agent's. Falls back to a sentence without
20
34
  * amounts when they cannot be read. Never throws.
21
35
  */
22
- export declare function loadBudgetSentence(db: Pick<PrismaClient, "run">, runId: string, status: string): Promise<string>;
36
+ export declare function loadBudgetSentence(db: Pick<PrismaClient, "run" | "runBudgetEvent">, runId: string, status: string): Promise<string>;
@@ -1,10 +1,18 @@
1
+ import { hostBudgetSentence, loadBudgetEvent } from "./budget-events.js";
1
2
  const MAX_GROUP_NAME_CHARS = 64;
2
3
  const usd = (amount) => `$${amount.toFixed(2)}`;
3
4
  /** A group name is operator-chosen text; keep it to one short, quote-free line. */
4
- function groupName(name) {
5
+ export function groupName(name) {
5
6
  const cleaned = (name ?? "").replace(/["`]/g, "").replace(/\s+/g, " ").trim().slice(0, MAX_GROUP_NAME_CHARS);
6
7
  return cleaned || null;
7
8
  }
9
+ /** The allowed overrun as a whole percent, or null when the run had none (no base, or it rounds to 0%). */
10
+ export function overrunPercent(baseUsd, limitUsd) {
11
+ if (baseUsd == null || !(baseUsd > 0) || !(baseUsd < limitUsd))
12
+ return null;
13
+ const percent = Math.round((limitUsd / baseUsd - 1) * 100);
14
+ return percent > 0 ? percent : null;
15
+ }
8
16
  export function budgetSentence(facts) {
9
17
  const group = groupName(facts.budgetGroupName);
10
18
  if (facts.refused) {
@@ -14,6 +22,16 @@ export function budgetSentence(facts) {
14
22
  : `Out of budget: ${within}.`;
15
23
  }
16
24
  const runBudget = facts.runBudgetUsd ?? facts.agentBudgetUsd;
25
+ const base = facts.baseBudgetUsd;
26
+ const limit = facts.limitUsd ?? runBudget;
27
+ const percent = overrunPercent(base, limit);
28
+ if (base != null && percent !== null && runBudget > base) {
29
+ // Topped up only partly: what of the overrun its group and run tree had room for.
30
+ const overrun = runBudget < limit
31
+ ? `${usd(runBudget - base)} of its ${percent}% allowed overrun`
32
+ : `its ${percent}% allowed overrun`;
33
+ return `Out of budget: this run's ${usd(base)} budget and ${overrun} (${usd(runBudget)} in all) were used up.`;
34
+ }
17
35
  const used = `Out of budget: this run's ${usd(runBudget)} budget was used up`;
18
36
  // A run reserved less than the agent's own budget: its group had only that much left.
19
37
  if (group && runBudget < facts.agentBudgetUsd) {
@@ -21,27 +39,47 @@ export function budgetSentence(facts) {
21
39
  }
22
40
  return `${used}.`;
23
41
  }
42
+ /**
43
+ * For a run that finished over its base budget: what it spent and by how much
44
+ * it went over, and whether that stayed inside the allowed overrun. Undefined
45
+ * when the spend is within the base budget.
46
+ */
47
+ export function overrunSentence(costUsd, baseUsd, limitUsd) {
48
+ if (!(baseUsd > 0) || !(costUsd > baseUsd))
49
+ return undefined;
50
+ const over = costUsd - baseUsd;
51
+ const percent = Math.round((over / baseUsd) * 100);
52
+ const within = costUsd <= limitUsd ? ", within its allowed overrun" : "";
53
+ return `Spent ${usd(costUsd)}, ${usd(over)} (${percent}%) over its ${usd(baseUsd)} budget${within}.`;
54
+ }
24
55
  /**
25
56
  * The sentence for a finished run, read from the database: a coding run's
26
57
  * reserved budget, otherwise the agent's. Falls back to a sentence without
27
58
  * amounts when they cannot be read. Never throws.
28
59
  */
29
60
  export async function loadBudgetSentence(db, runId, status) {
61
+ const loaded = await loadBudgetEvent(db, runId);
62
+ if (loaded)
63
+ return hostBudgetSentence(loaded.event);
30
64
  const refused = status === "refused";
31
65
  try {
32
66
  const row = await db.run.findUnique({
33
67
  where: { id: runId },
34
68
  select: {
35
69
  agent: { select: { budgetUsd: true, budgetGroup: { select: { name: true } } } },
36
- codingRun: { select: { budgetReservedUsd: true } },
70
+ codingRun: { select: { budgetReservedUsd: true, budgetBaseUsd: true, budgetLimitUsd: true } },
37
71
  },
38
72
  });
39
73
  const agentBudgetUsd = Number(row?.agent?.budgetUsd);
40
74
  if (!row?.agent || !Number.isFinite(agentBudgetUsd))
41
75
  throw new Error("budget_facts_unavailable");
42
76
  const reserved = row.codingRun ? Number(row.codingRun.budgetReservedUsd) : NaN;
77
+ const base = row.codingRun?.budgetBaseUsd == null ? NaN : Number(row.codingRun.budgetBaseUsd);
78
+ const limit = row.codingRun?.budgetLimitUsd == null ? NaN : Number(row.codingRun.budgetLimitUsd);
43
79
  return budgetSentence({
44
80
  runBudgetUsd: Number.isFinite(reserved) ? reserved : null,
81
+ baseBudgetUsd: Number.isFinite(base) ? base : null,
82
+ limitUsd: Number.isFinite(limit) ? limit : null,
45
83
  agentBudgetUsd,
46
84
  budgetGroupName: row.agent.budgetGroup?.name ?? null,
47
85
  refused,
@@ -0,0 +1,36 @@
1
+ import type { PrismaClient } from "#prisma";
2
+ import type { SecretCipher } from "../providers/secrets/types.js";
3
+ import type { safeFetch } from "../sandbox/safe-fetch.js";
4
+ import type { Logger } from "./logger.js";
5
+ import { type McpToolPin } from "./mcp-tools.js";
6
+ export declare const CODING_MCP_PATH = "/coding-mcp";
7
+ /** What initialize answers when the client names no protocol version. */
8
+ export declare const CODING_MCP_DEFAULT_PROTOCOL_VERSION = "2025-06-18";
9
+ export interface CodingMcpDeps {
10
+ db: PrismaClient;
11
+ cipher: SecretCipher;
12
+ fetchImpl?: typeof safeFetch;
13
+ log: Logger;
14
+ now?: () => Date;
15
+ /** How often a call in flight checks for stop_run; tests shorten it. */
16
+ stopPollMs?: number;
17
+ }
18
+ export interface CodingMcpResponse {
19
+ status: number;
20
+ body: string;
21
+ contentType: string;
22
+ }
23
+ /**
24
+ * True for handleMcpTool's error shape: exactly `{ error: <code>, message }`. A server result that
25
+ * happens to have that very shape is flagged too; the model sees the same text either way.
26
+ */
27
+ export declare function isMcpErrorText(text: string): boolean;
28
+ /** One stored pin, checked field by field: a malformed entry is left out, never served. */
29
+ export declare function isMcpToolPin(value: unknown): value is McpToolPin;
30
+ /** The session's well-formed pins, first of each exposed name only. */
31
+ export declare function storedPins(stored: unknown): McpToolPin[];
32
+ /**
33
+ * Handles one JSON-RPC request body for /coding-mcp. Never throws. `signal` is the request's own: the
34
+ * listener aborts it when the proxy's connection closes before the answer, which stops a call in flight.
35
+ */
36
+ export declare function handleCodingMcpRequest(authorization: string | undefined, body: string, deps: CodingMcpDeps, signal?: AbortSignal): Promise<CodingMcpResponse>;
@@ -0,0 +1,253 @@
1
+ /**
2
+ * The native gateway's /coding-mcp route (remote MCP servers, phase 2): a stateless Streamable HTTP
3
+ * MCP server that runs a coding run's MCP tool calls. The worker reaches it only through the coding
4
+ * proxy's /mcp route, which forwards the request and the run's MCP token (`rmt_…`) unchanged; the
5
+ * proxy is not trusted, so the token is checked here again: its hash must name a proxy session that
6
+ * is active and before its deadline, whose run is still drivable (not stopped or cancelled).
7
+ *
8
+ * A Codex run (by the provider it was dispatched with, CodingRun.provider) may call only tools the
9
+ * live tool list marks read-only: its shell commands can read the token.
10
+ *
11
+ * tools/list serves the session's pins (no URLs or secrets); tools/call counts the call against the
12
+ * run's limit (WARDBY_MCP_MAX_CALLS_PER_RUN) and runs it through phase 1's handleMcpTool, which
13
+ * re-checks the live attachment and redacts the result against the server's secrets before it gets
14
+ * here. Secrets: this route's own log line carries the method, status and session id only (never the
15
+ * body, arguments, results or token), and every body it sends is either fixed text, the pins, or
16
+ * handleMcpTool's already-redacted string.
17
+ */
18
+ import { readFileSync } from "node:fs";
19
+ import { loadMcpMaxCallsPerRun } from "../config/mcp-call-limit.js";
20
+ import { MCP_TOKEN_REQUIRED_MESSAGE, mcpTokenHash, isMcpToken } from "../coding/mcp-token.js";
21
+ import { HTTP_LIMITS } from "../mcp/transport/http-limits.js";
22
+ import { handleMcpTool, isCodexCoding, mcpToolDefs } from "./mcp-tools.js";
23
+ import { runDrivability, TOOL_STOP_POLL_MS, watchRunStop } from "./runner.js";
24
+ export const CODING_MCP_PATH = "/coding-mcp";
25
+ /** What initialize answers when the client names no protocol version. */
26
+ export const CODING_MCP_DEFAULT_PROTOCOL_VERSION = "2025-06-18";
27
+ /** The package version, reported in server info (package.json sits two levels up from src/core and dist/core). */
28
+ const SERVER_VERSION = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8")).version;
29
+ const LOGGED_METHODS = new Set([
30
+ "initialize",
31
+ "ping",
32
+ "tools/list",
33
+ "tools/call",
34
+ "notifications/initialized",
35
+ "notifications/cancelled",
36
+ ]);
37
+ const JSON_TYPE = "application/json";
38
+ const reply = (status, payload) => ({
39
+ status,
40
+ body: payload === undefined ? "" : JSON.stringify(payload),
41
+ contentType: JSON_TYPE,
42
+ });
43
+ const rpcResult = (id, result) => reply(200, { jsonrpc: "2.0", id, result });
44
+ const rpcError = (status, id, code, message) => reply(status, { jsonrpc: "2.0", id, error: { code, message } });
45
+ /** An MCP tool result: the text handleMcpTool returned, flagged when it is one of its JSON errors. */
46
+ const toolResult = (text, isError) => ({
47
+ content: [{ type: "text", text }],
48
+ ...(isError ? { isError: true } : {}),
49
+ });
50
+ const toolError = (code, message) => toolResult(JSON.stringify({ error: code, message }), true);
51
+ /**
52
+ * True for handleMcpTool's error shape: exactly `{ error: <code>, message }`. A server result that
53
+ * happens to have that very shape is flagged too; the model sees the same text either way.
54
+ */
55
+ export function isMcpErrorText(text) {
56
+ if (!text.startsWith("{"))
57
+ return false;
58
+ try {
59
+ const value = JSON.parse(text);
60
+ if (value === null || typeof value !== "object" || Array.isArray(value))
61
+ return false;
62
+ const keys = Object.keys(value);
63
+ const v = value;
64
+ return (keys.length === 2 &&
65
+ typeof v.error === "string" &&
66
+ /^[a-z][a-z0-9_]*$/.test(v.error) &&
67
+ typeof v.message === "string");
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ /** One stored pin, checked field by field: a malformed entry is left out, never served. */
74
+ export function isMcpToolPin(value) {
75
+ if (value === null || typeof value !== "object" || Array.isArray(value))
76
+ return false;
77
+ const p = value;
78
+ const definition = p.definition;
79
+ return (typeof p.exposedName === "string" &&
80
+ p.exposedName !== "" &&
81
+ typeof p.toolName === "string" &&
82
+ p.toolName !== "" &&
83
+ typeof p.serverId === "string" &&
84
+ p.serverId !== "" &&
85
+ typeof p.serverName === "string" &&
86
+ (p.callTimeoutMs === undefined ||
87
+ (typeof p.callTimeoutMs === "number" && Number.isSafeInteger(p.callTimeoutMs) && p.callTimeoutMs > 0)) &&
88
+ definition !== null &&
89
+ typeof definition === "object" &&
90
+ !Array.isArray(definition) &&
91
+ typeof definition.description === "string" &&
92
+ definition.inputSchema !== null &&
93
+ typeof definition.inputSchema === "object" &&
94
+ !Array.isArray(definition.inputSchema));
95
+ }
96
+ /** The session's well-formed pins, first of each exposed name only. */
97
+ export function storedPins(stored) {
98
+ if (!Array.isArray(stored))
99
+ return [];
100
+ const seen = new Set();
101
+ const pins = [];
102
+ for (const entry of stored) {
103
+ if (!isMcpToolPin(entry) || seen.has(entry.exposedName))
104
+ continue;
105
+ seen.add(entry.exposedName);
106
+ pins.push(entry);
107
+ }
108
+ return pins;
109
+ }
110
+ /**
111
+ * Handles one JSON-RPC request body for /coding-mcp. Never throws. `signal` is the request's own: the
112
+ * listener aborts it when the proxy's connection closes before the answer, which stops a call in flight.
113
+ */
114
+ export async function handleCodingMcpRequest(authorization, body, deps, signal) {
115
+ const seen = {};
116
+ let response;
117
+ try {
118
+ response = await handle(authorization, body, deps, seen, signal);
119
+ }
120
+ catch {
121
+ // Nothing of the error leaves: its message could carry anything the call touched.
122
+ response = rpcError(500, null, -32603, "Internal error.");
123
+ }
124
+ // Method, status and session id only: never the body, the arguments, the result, or the token.
125
+ deps.log.info({ method: seen.method, status: response.status, sessionId: seen.sessionId }, "coding mcp request");
126
+ return response;
127
+ }
128
+ async function handle(authorization, body, deps, seen, signal) {
129
+ if (Buffer.byteLength(body, "utf8") > HTTP_LIMITS.json) {
130
+ return rpcError(413, null, -32600, "The request body is too large.");
131
+ }
132
+ const session = await authenticate(authorization, deps);
133
+ // No WWW-Authenticate: a client must not start OAuth discovery against this route.
134
+ if (!session)
135
+ return rpcError(401, null, -32001, MCP_TOKEN_REQUIRED_MESSAGE);
136
+ seen.sessionId = session.id;
137
+ let message;
138
+ try {
139
+ message = JSON.parse(body);
140
+ }
141
+ catch {
142
+ return rpcError(400, null, -32700, "Parse error.");
143
+ }
144
+ if (message === null || typeof message !== "object" || Array.isArray(message)) {
145
+ return rpcError(400, null, -32600, "Invalid request: one JSON-RPC message per request.");
146
+ }
147
+ const m = message;
148
+ const id = typeof m.id === "string" || typeof m.id === "number" ? m.id : null;
149
+ if (m.jsonrpc !== "2.0" || typeof m.method !== "string") {
150
+ return rpcError(400, id, -32600, "Invalid request.");
151
+ }
152
+ // The method is the client's own text: only a known one is logged, anything else as "other".
153
+ seen.method = LOGGED_METHODS.has(m.method) ? m.method : "other";
154
+ // A notification (no id) has no reply.
155
+ if (m.id === undefined)
156
+ return reply(202, undefined);
157
+ if (id === null)
158
+ return rpcError(400, null, -32600, "Invalid request: id must be a string or number.");
159
+ switch (m.method) {
160
+ case "initialize":
161
+ return rpcResult(id, {
162
+ protocolVersion: protocolVersionOf(m.params),
163
+ capabilities: { tools: {} },
164
+ serverInfo: { name: "wardby", version: SERVER_VERSION },
165
+ });
166
+ case "ping":
167
+ return rpcResult(id, {});
168
+ case "tools/list":
169
+ return rpcResult(id, {
170
+ tools: mcpToolDefs(storedPins(session.mcpTools)).map((def) => ({
171
+ name: def.name,
172
+ description: def.description,
173
+ inputSchema: def.jsonSchema,
174
+ })),
175
+ });
176
+ case "tools/call":
177
+ return rpcResult(id, await callTool(session, m.params, deps, signal));
178
+ default:
179
+ return rpcError(200, id, -32601, "Method not found.");
180
+ }
181
+ }
182
+ function protocolVersionOf(params) {
183
+ const requested = params?.protocolVersion;
184
+ return typeof requested === "string" && /^\d{4}-\d{2}-\d{2}$/.test(requested)
185
+ ? requested
186
+ : CODING_MCP_DEFAULT_PROTOCOL_VERSION;
187
+ }
188
+ async function authenticate(authorization, deps) {
189
+ const token = /^Bearer (\S+)$/.exec(authorization ?? "")?.[1];
190
+ if (!isMcpToken(token))
191
+ return undefined;
192
+ const session = await deps.db.codingProxySession.findUnique({
193
+ where: { mcpTokenHash: mcpTokenHash(token) },
194
+ select: {
195
+ id: true,
196
+ runId: true,
197
+ status: true,
198
+ deadlineAt: true,
199
+ mcpTools: true,
200
+ run: { select: { provider: true } },
201
+ },
202
+ });
203
+ if (!session || session.status !== "active")
204
+ return undefined;
205
+ if ((deps.now?.() ?? new Date()).getTime() >= session.deadlineAt.getTime())
206
+ return undefined;
207
+ // A stopped or cancelled run's session can still read active for a moment: its token ends with the
208
+ // run, as an ended session's does (401, so no call starts and no tool is listed).
209
+ if ((await runDrivability(deps.db, session.runId)) !== "drivable")
210
+ return undefined;
211
+ return session;
212
+ }
213
+ async function callTool(session, params, deps, requestSignal) {
214
+ const p = (params ?? {});
215
+ const name = typeof p.name === "string" ? p.name : "";
216
+ const pin = storedPins(session.mcpTools).find((candidate) => candidate.exposedName === name);
217
+ if (!pin) {
218
+ return toolError("mcp_tool_not_allowed", `The tool "${name.slice(0, 128)}" is not one of this run's MCP tools.`);
219
+ }
220
+ const limit = loadMcpMaxCallsPerRun();
221
+ const counted = await deps.db.$queryRaw `
222
+ UPDATE "CodingProxySession" SET "mcpCallCount" = "mcpCallCount" + 1
223
+ WHERE "id" = ${session.id} AND "mcpCallCount" < ${limit}
224
+ RETURNING "mcpCallCount"
225
+ `;
226
+ if (counted.length === 0) {
227
+ return toolError("mcp_call_limit", `This run reached its limit of ${limit} MCP tool calls.`);
228
+ }
229
+ const run = await deps.db.run.findUnique({ where: { id: session.runId }, select: { agentId: true } });
230
+ if (!run)
231
+ return toolError("mcp_tool_not_allowed", "This run no longer exists.");
232
+ // As for a native run's call: a stop_run aborts the call in flight.
233
+ // The proxy closing its request (its forward limit, or the worker gone) aborts it too.
234
+ const stop = watchRunStop(deps.db, session.runId, deps.stopPollMs ?? TOOL_STOP_POLL_MS);
235
+ const signal = requestSignal ? AbortSignal.any([stop.signal, requestSignal]) : stop.signal;
236
+ try {
237
+ const text = await handleMcpTool(pin, p.arguments === undefined ? "" : JSON.stringify(p.arguments), {
238
+ db: deps.db,
239
+ cipher: deps.cipher,
240
+ agentId: run.agentId,
241
+ runId: session.runId,
242
+ signal,
243
+ deadlineAt: session.deadlineAt,
244
+ readOnlyOnly: isCodexCoding(session.run.provider),
245
+ fetchImpl: deps.fetchImpl,
246
+ log: deps.log,
247
+ });
248
+ return toolResult(text, isMcpErrorText(text));
249
+ }
250
+ finally {
251
+ stop.done();
252
+ }
253
+ }
@@ -5,7 +5,8 @@
5
5
  *
6
6
  * 1. fails queued runs that waited longer than CODING_QUEUE_TIMEOUT_SEC
7
7
  * (coding_queue_timeout), with a conditional update so concurrent
8
- * drains never double-fail a run;
8
+ * drains never double-fail a run, then lets the executor clean up after
9
+ * each (Executor.cleanupQueueTimeout);
9
10
  * 2. starts the oldest queued runs, at most as many as there are free
10
11
  * slots, so order stays FIFO in practice. Starting is fire-and-forget,
11
12
  * like dispatchRun: Executor.start resolves only when the run ends.
@@ -30,6 +30,13 @@ export async function drainCodingQueue(options) {
30
30
  timedOut += 1;
31
31
  // Only this drain made the row failed (a concurrent drain matched zero rows); bounded, never throws.
32
32
  await fileSelfDefectForRun(options.selfDefects, runId);
33
+ // What a launch the cluster refused left behind (a continuation's in-progress check, its input).
34
+ try {
35
+ await executor.cleanupQueueTimeout?.(runId);
36
+ }
37
+ catch (err) {
38
+ queueLog.warn({ err, runId }, "queue-timeout cleanup failed");
39
+ }
33
40
  }
34
41
  }
35
42
  const active = await db.codingRun.count({
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Which repository a coding run works in: the agent's default
3
+ * (codingProfile.repository) or one of its write links without triggers.
4
+ * Every entry point goes through here. Errors never carry the requested value:
5
+ * it is caller- or model-written text and could hold a secret.
6
+ */
7
+ import type { Prisma } from "#prisma";
8
+ export type CodingRepositoryReader = Pick<Prisma.TransactionClient, "agentRepository" | "codingRun">;
9
+ export interface CodingRepositoryTarget {
10
+ repository: string;
11
+ baseRef: string;
12
+ viaRepositoryLink: boolean;
13
+ }
14
+ export type RepositoryRefusalCode = "repository_required" | "repository_not_listed";
15
+ export declare class RepositoryChoiceRefusedError extends Error {
16
+ readonly code: RepositoryRefusalCode;
17
+ readonly allowed: readonly string[];
18
+ constructor(code: RepositoryRefusalCode, allowed: readonly string[]);
19
+ }
20
+ /** Which of an agent's links are repositories on a coding agent's list. */
21
+ export declare const CODING_REPOSITORY_LINK_FILTER: {
22
+ readonly access: "write";
23
+ readonly triggers: {
24
+ readonly isEmpty: true;
25
+ };
26
+ };
27
+ /**
28
+ * The repositories a list adds to its default. A link can come to equal the default when
29
+ * update_agent moves the default onto it; that link adds nothing, and a run there is on the default.
30
+ */
31
+ export declare function extraCodingRepositoryLinks<Link extends {
32
+ repository: string;
33
+ }>(links: readonly Link[], defaultRepository: string): Link[];
34
+ /** Whether the agent has more than its default, for wording only: authorization is resolveCodingRepository's. */
35
+ export declare function hasCodingRepositoryList(reader: Pick<CodingRepositoryReader, "agentRepository">, agentId: string, defaultRepository: string): Promise<boolean>;
36
+ export declare function resolveCodingRepository(reader: CodingRepositoryReader, input: {
37
+ agentId: string;
38
+ profile: {
39
+ repository: string;
40
+ baseRef: string;
41
+ };
42
+ requested?: string;
43
+ continuesCodingRunId?: string;
44
+ /** A delegation must name its repository when the agent has more than its default. */
45
+ requireExplicit?: boolean;
46
+ }): Promise<CodingRepositoryTarget>;