@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
@@ -7,25 +7,42 @@
7
7
  */
8
8
  import { Prisma } from "#prisma";
9
9
  import { z } from "zod";
10
+ import { codeProviderOf } from "../../coding/code-host.js";
10
11
  import { CodingProfilePatchSchema, CodingProfileSchema } from "../../coding/profile.js";
11
- import { DEFAULT_CLAUDE_MAX_TURNS, MAX_CODING_TURNS, isLocalRepository } from "../../coding/protocol.js";
12
+ import { DEFAULT_CLAUDE_MAX_OUTPUT_TOKENS, DEFAULT_CLAUDE_MAX_TURNS, MAX_CLAUDE_MAX_OUTPUT_TOKENS, MIN_CLAUDE_MAX_OUTPUT_TOKENS, DEFAULT_DEBUG_TRACE_MAX_MB, MAX_CODING_TURNS, MAX_DEBUG_TRACE_MAX_MB, isLocalRepository, } from "../../coding/protocol.js";
13
+ import { loadBlobStoreConfig, loadContainerExecutorConfig } from "../../config/providers.js";
12
14
  import { codingProviderSupportsModel } from "../../coding/provider.js";
15
+ import { ACCEPTED_ADVISORY_ID, MAX_ACCEPTED_ADVISORIES } from "../../coding/registry/allowlist.js";
16
+ import { DEFAULT_PACKAGE_AUDIT_MINUTES, isPackageAuditActive, isPackageAuditMode, MAX_PACKAGE_AUDIT_MINUTES, PACKAGE_AUDIT_MODES, PackageAuditPatchError, packageAuditActiveWarning, resolvePackageAuditPatch, } from "../../coding/registry/audit-mode.js";
13
17
  import { assertAgentModelAvailable } from "../../core/run-pricing.js";
14
18
  import { ModelUnavailableError } from "../../providers/llm/catalog-types.js";
15
19
  import { currentModelCatalog } from "../../providers/llm/catalog-store.js";
16
20
  import { validateCronExpression } from "../../core/cron.js";
21
+ import { scheduleStartFields } from "../../core/schedule-start.js";
22
+ import { preferIndexScans, withSerializableRetry } from "../../core/serializable-retry.js";
17
23
  import { modelSupportedEfforts } from "../../providers/llm/routing.js";
24
+ import { agentMcpServerViews, codexUnavailableMcpTools, codexWriteToolsWarning } from "./mcp-servers.js";
25
+ import { isCodexCoding } from "../../core/mcp-tools.js";
18
26
  import { PROJECT_KEY } from "../../providers/issue-tracker/types.js";
19
27
  import { LLM_EFFORT_LEVELS, isLlmEffort } from "../../providers/llm/types.js";
20
28
  import { requireReadableBudgetGroup } from "../auth/ownership.js";
21
29
  import { agentAccessResolver, agentNotFound, assertAgentAccess, readableAgentsWhere, requireAgentAccess, } from "../auth/access.js";
22
- import { EVERYONE_KEY, atLeast, canDelegate, deleteGrantsFor, effectiveAccess } from "../../core/grants.js";
30
+ import { EVERYONE_KEY, atLeast, canDelegate, deleteGrantsFor, effectiveAccess, isPublicWritable, filterUnusableMcpServers, } from "../../core/grants.js";
23
31
  import { projectTool } from "./tools.js";
32
+ import { withZod3ToolWarnings } from "../../core/zod3-window.js";
24
33
  import { requireAnyScope, requireScope } from "../auth/resource-server.js";
25
34
  import { logger } from "../../core/logger.js";
26
35
  import { authorizeRepositoryForSet, canonicalLocalRepository, } from "../auth/repo-authorization.js";
27
36
  import { McpError } from "../errors.js";
28
37
  import { textResult } from "./text-result.js";
38
+ function validateWorkspaceDiskMb(workspaceDiskMb) {
39
+ if (workspaceDiskMb == null)
40
+ return;
41
+ const { maxDiskMb } = loadContainerExecutorConfig();
42
+ if (workspaceDiskMb > maxDiskMb) {
43
+ throw new McpError(400, `workspaceDiskMb (${workspaceDiskMb} MiB) exceeds the deployment cap (${maxDiskMb} MiB). Raise CODING_MAX_DISK_MB to allow this size.`);
44
+ }
45
+ }
29
46
  // workerImageRef is the BYO-arbitrary-image escape hatch (see
30
47
  // resolveCodingWorkerImage/resolveCodingToolImage in container.ts). For a Codex agent it
31
48
  // replaces the one container that runs the whole agent; for a Claude Code agent it replaces
@@ -67,12 +84,53 @@ function withOperatorMode(agent) {
67
84
  nativeExecutionMode: agent.kind !== "native" ? null : agent.nativeExecutionMode === "sandbox" ? "sandbox" : "control-plane",
68
85
  };
69
86
  }
87
+ /** The warning create_agent / update_agent return (not a refusal): wardby can't tell how old a custom image is. */
88
+ export const DEPENDENCY_CACHE_IMAGE_WARNING = "dependencyCache is on and this agent runs its own worker image (workerImageRef): rebuild that image FROM the wardby release that includes the dependency cache before its next run, or the run fails at input (worker_input_failed). See the dependency-cache help article.";
89
+ export const SESSION_RESUME_IMAGE_WARNING = "sessionResume is on and this agent runs its own worker image (workerImageRef): rebuild that image FROM the wardby release that includes session resume before its next run, or the run fails at input (worker_input_failed).";
90
+ export const SESSION_RESUME_NO_STORE_WARNING = "sessionResume is on but this server has no blob store (BLOB_STORE), so transcripts are not kept. See the resume-runs-locally help article.";
91
+ /** For a warning only: a half-set BLOB_STORE (which throws) counts as none, and never fails the tool call. */
92
+ function blobStoreConfigured() {
93
+ try {
94
+ return loadBlobStoreConfig(process.env) !== undefined;
95
+ }
96
+ catch {
97
+ return false;
98
+ }
99
+ }
100
+ /** Non-blocking warnings about an agent's coding profile as stored. */
101
+ function profileWarnings(profile, now) {
102
+ const warnings = profile?.dependencyCache && profile.workerImageRef ? [DEPENDENCY_CACHE_IMAGE_WARNING] : [];
103
+ if (profile?.sessionResume && profile.workerImageRef)
104
+ warnings.push(SESSION_RESUME_IMAGE_WARNING);
105
+ if (profile?.sessionResume && !blobStoreConfigured())
106
+ warnings.push(SESSION_RESUME_NO_STORE_WARNING);
107
+ if (profile && isPackageAuditActive(profile.packageAuditMode, profile.packageAuditUntil, now))
108
+ warnings.push(packageAuditActiveWarning(profile.packageAuditMode, profile.packageAuditUntil));
109
+ return warnings;
110
+ }
111
+ /** An agent as returned to operators: profile warnings, and whether package audit mode is in force now. */
112
+ function withProfileWarnings(agent) {
113
+ const now = new Date();
114
+ const profile = agent.codingProfile;
115
+ const shown = profile
116
+ ? {
117
+ ...agent,
118
+ codingProfile: {
119
+ ...profile,
120
+ packageAuditActive: isPackageAuditActive(profile.packageAuditMode, profile.packageAuditUntil, now),
121
+ },
122
+ }
123
+ : agent;
124
+ const warnings = profileWarnings(profile, now);
125
+ return warnings.length ? { ...shown, warnings } : shown;
126
+ }
70
127
  const agentFields = {
71
128
  name: z.string().trim().min(1).max(MAX_AGENT_NAME_CHARS),
72
129
  systemPrompt: z.string().min(1).max(MAX_SYSTEM_PROMPT_CHARS),
73
130
  model: z.string().trim().min(1).max(MAX_MODEL_CHARS),
74
131
  budgetUsd: z.number().finite().positive().max(MAX_BUDGET_USD),
75
132
  maxTurns: z.number().int().min(1).max(100),
133
+ allowedOverrunPercent: z.number().int().min(0).max(100),
76
134
  maxDelegationsPerRun: z.number().int().min(1).max(MAX_DELEGATIONS_PER_RUN),
77
135
  parallelDelegations: z.boolean(),
78
136
  schedule: z.string().trim().min(1).max(256),
@@ -107,6 +165,7 @@ const CreateAgentSchema = z
107
165
  model: agentFields.model,
108
166
  budgetUsd: agentFields.budgetUsd,
109
167
  maxTurns: agentFields.maxTurns.optional(),
168
+ allowedOverrunPercent: agentFields.allowedOverrunPercent.optional(),
110
169
  maxDelegationsPerRun: agentFields.maxDelegationsPerRun.optional(),
111
170
  parallelDelegations: agentFields.parallelDelegations.optional(),
112
171
  schedule: agentFields.schedule.optional(),
@@ -164,6 +223,7 @@ const UpdateAgentSchema = z
164
223
  model: agentFields.model.optional(),
165
224
  budgetUsd: agentFields.budgetUsd.optional(),
166
225
  maxTurns: agentFields.maxTurns.optional(),
226
+ allowedOverrunPercent: agentFields.allowedOverrunPercent.optional(),
167
227
  maxDelegationsPerRun: agentFields.maxDelegationsPerRun.optional(),
168
228
  parallelDelegations: agentFields.parallelDelegations.optional(),
169
229
  schedule: agentFields.schedule.nullable().optional(),
@@ -179,6 +239,12 @@ const UpdateAgentSchema = z
179
239
  codingProfile: CodingProfilePatchSchema.extend({
180
240
  /** Not a stored profile field: sets CodingAgentProfile.debugTraceUntil = now + minutes (null clears). */
181
241
  debugTraceMinutes: z.number().int().min(1).max(MAX_DEBUG_TRACE_MINUTES).nullable().optional(),
242
+ /** Admin-only like debugTraceMinutes: CodingAgentProfile.debugTraceMaxMb (null = the default). */
243
+ debugTraceMaxMb: z.number().int().min(1).max(MAX_DEBUG_TRACE_MAX_MB).nullable().optional(),
244
+ /** Not stored as given: sets CodingAgentProfile.packageAuditMode and packageAuditUntil (null clears both). */
245
+ packageAuditMode: z.enum(PACKAGE_AUDIT_MODES).nullable().optional(),
246
+ /** Not a stored field: the audit window, in minutes from now (default 24 hours). */
247
+ packageAuditMinutes: z.number().int().min(1).max(MAX_PACKAGE_AUDIT_MINUTES).optional(),
182
248
  }).optional(),
183
249
  repositoryAdminOverride: z.boolean().optional(),
184
250
  })
@@ -242,6 +308,12 @@ const profileJsonSchema = {
242
308
  maximum: MAX_CODING_TURNS,
243
309
  description: `Claude Code runs only: the most agent turns (model calls) a run may take before it stops with coding_turn_limit. Null uses the worker default (${DEFAULT_CLAUDE_MAX_TURNS}). The run's budget and timeout still apply. Codex runs have no turn limit.`,
244
310
  },
311
+ maxOutputTokens: {
312
+ type: ["integer", "null"],
313
+ minimum: MIN_CLAUDE_MAX_OUTPUT_TOKENS,
314
+ maximum: MAX_CLAUDE_MAX_OUTPUT_TOKENS,
315
+ description: `Claude Code runs only: the most output tokens per model reply (default ${DEFAULT_CLAUDE_MAX_OUTPUT_TOKENS}, up to ${MAX_CLAUDE_MAX_OUTPUT_TOKENS}). The coding proxy reserves this × the model's output price per request against the run budget, so higher values need a larger budgetUsd. Refused on a Codex agent. Null uses the default.`,
316
+ },
245
317
  repoSkills: {
246
318
  type: "boolean",
247
319
  description: "Load the repository's agent skills into runs (Codex: .agents/skills and .codex/skills; Claude Code: .claude/skills). Default true. Repository instructions (AGENTS.md for Codex, CLAUDE.md for Claude Code) load either way.",
@@ -250,6 +322,14 @@ const profileJsonSchema = {
250
322
  type: "boolean",
251
323
  description: "Claude Code runs only. Default true: Claude Code runs in bare mode and wardby adds the repository's CLAUDE.md and its skill list to the system prompt; the model reads a skill's SKILL.md with run_command. False: bare mode is off and Claude Code loads CLAUDE.md and skills itself (native Skill tool). Repository settings, hooks, and MCP config are never loaded either way.",
252
324
  },
325
+ dependencyCache: {
326
+ type: "boolean",
327
+ description: "Restore npm node_modules from a snapshot the proxy re-approves; needs package approval (packages:approve or agents:admin). Default false. The worker images must be a release that includes the cache; with a workerImageRef the result carries a warning to rebuild that image from it.",
328
+ },
329
+ sessionResume: {
330
+ type: "boolean",
331
+ description: "Claude Code runs only. Keep each run's session transcript (redacted) on the server so the session can later be continued in a local Claude Code CLI. Once transcripts are served, anyone who can read a run can read everything its agent saw. Needs a blob store (BLOB_STORE) on the server. Default false.",
332
+ },
253
333
  packageAllowlist: {
254
334
  type: "object",
255
335
  description: "Approved top-level packages per ecosystem (npm, pypi). A PyPI entry may name extras, e.g. psycopg[binary]. Needs packages:approve or agents:admin.",
@@ -257,7 +337,16 @@ const profileJsonSchema = {
257
337
  },
258
338
  packagePolicy: {
259
339
  type: "object",
260
- properties: { minReleaseAgeDays: { type: "integer", minimum: 0, maximum: 30 } },
340
+ description: "minReleaseAgeDays: days a release must have been public before it can be installed (0-30, default 3). acceptedAdvisories: advisory ids (GHSA-…, CVE-…) this agent's runs may install despite; malware never; every waiver is reported in the PR. Needs packages:approve or agents:admin.",
341
+ properties: {
342
+ minReleaseAgeDays: { type: "integer", minimum: 0, maximum: 30 },
343
+ acceptedAdvisories: {
344
+ type: "array",
345
+ maxItems: MAX_ACCEPTED_ADVISORIES,
346
+ uniqueItems: true,
347
+ items: { type: "string", pattern: ACCEPTED_ADVISORY_ID.source },
348
+ },
349
+ },
261
350
  additionalProperties: false,
262
351
  },
263
352
  services: {
@@ -363,11 +452,14 @@ function storedProfile(profile) {
363
452
  workerImageRef: profile.workerImageRef,
364
453
  workspaceDiskMb: profile.workspaceDiskMb,
365
454
  maxTurns: profile.maxTurns,
455
+ maxOutputTokens: profile.maxOutputTokens,
366
456
  packageAllowlist: profile.packageAllowlist,
367
457
  packagePolicy: profile.packagePolicy,
368
458
  services: profile.services,
369
459
  repoSkills: profile.repoSkills,
370
460
  claudeBareMode: profile.claudeBareMode,
461
+ dependencyCache: profile.dependencyCache,
462
+ sessionResume: profile.sessionResume,
371
463
  });
372
464
  }
373
465
  /** A service name an agent is allowed must exist in the catalog (any version); typos fail here, not at a run. */
@@ -393,11 +485,17 @@ export function registerAgentTools(mcp) {
393
485
  model: { type: "string" },
394
486
  budgetUsd: { type: "number" },
395
487
  maxTurns: { type: "integer" },
488
+ allowedOverrunPercent: {
489
+ type: "integer",
490
+ minimum: 0,
491
+ maximum: 100,
492
+ description: "Percent above budgetUsd a run may spend before it is stopped. On a coding agent it raises each of its runs' limit; on a lead agent that delegates, it raises its run tree's ceiling for coding sub-agents. Native runs' own model calls are not affected. Budget group caps still apply. 0 = stop at budgetUsd.",
493
+ },
396
494
  maxDelegationsPerRun: {
397
495
  type: "integer",
398
496
  minimum: 1,
399
497
  maximum: MAX_DELEGATIONS_PER_RUN,
400
- description: "Native agents with sub-agents: how many delegate_to_* calls one run may make, each to a different sub-agent " +
498
+ description: "Native agents with sub-agents: how many delegate_to_* calls one run may make, to each sub-agent and repository at most once " +
401
499
  "(one after another, or together with parallelDelegations). Default 1: route to exactly one.",
402
500
  },
403
501
  parallelDelegations: { type: "boolean", description: PARALLEL_DELEGATIONS_DESCRIPTION },
@@ -431,12 +529,14 @@ export function registerAgentTools(mcp) {
431
529
  const packages = args.codingProfile;
432
530
  if (packages &&
433
531
  (Object.keys(packages.packageAllowlist ?? {}).length > 0 ||
434
- Object.keys(packages.packagePolicy ?? {}).length > 0))
532
+ Object.keys(packages.packagePolicy ?? {}).length > 0 ||
533
+ packages.dependencyCache === true))
435
534
  requirePackageApproval(ctx);
436
535
  validateSchedule(args.schedule, args.timezone ?? "UTC");
437
536
  requireModelAvailable(ctx, args.model, args.kind);
438
537
  validateEffort(args.kind, args.model, args.effort);
439
538
  validateNativeExecutionMode(ctx, args.kind, args.nativeExecutionMode);
539
+ validateWorkspaceDiskMb(args.codingProfile?.workspaceDiskMb);
440
540
  if (args.codingProfile)
441
541
  await requireCatalogServiceNames(ctx.db, args.codingProfile.services);
442
542
  if (args.budgetGroupId) {
@@ -454,7 +554,7 @@ export function registerAgentTools(mcp) {
454
554
  const authorization = codingProfile
455
555
  ? await authorizeRepositoryForSet(ctx, {
456
556
  ownerId: ctx.principal.id,
457
- provider: "github",
557
+ provider: codeProviderOf(codingProfile.repository),
458
558
  repository: codingProfile.repository,
459
559
  kind: "coding",
460
560
  adminOverride: repositoryAdminOverride === true,
@@ -463,6 +563,11 @@ export function registerAgentTools(mcp) {
463
563
  const agent = await ctx.db.agent.create({
464
564
  data: {
465
565
  ...agentData,
566
+ ...(await scheduleStartFields(ctx.db, null, {
567
+ schedule: agentData.schedule ?? null,
568
+ timezone: agentData.timezone ?? "UTC",
569
+ scheduleEnabled: agentData.scheduleEnabled ?? true,
570
+ })),
466
571
  ownerId: ctx.principal.id,
467
572
  ...(codingProfile && authorization
468
573
  ? { codingProfile: { create: { ...codingProfile, ...profileStamp(authorization) } } }
@@ -470,7 +575,7 @@ export function registerAgentTools(mcp) {
470
575
  },
471
576
  include: { codingProfile: true },
472
577
  });
473
- return textResult(withOperatorMode(agent));
578
+ return textResult(withProfileWarnings(withOperatorMode(agent)));
474
579
  },
475
580
  });
476
581
  mcp.registerTool({
@@ -486,11 +591,17 @@ export function registerAgentTools(mcp) {
486
591
  model: { type: "string" },
487
592
  budgetUsd: { type: "number" },
488
593
  maxTurns: { type: "integer" },
594
+ allowedOverrunPercent: {
595
+ type: "integer",
596
+ minimum: 0,
597
+ maximum: 100,
598
+ description: "Percent above budgetUsd a run may spend before it is stopped. On a coding agent it raises each of its runs' limit; on a lead agent that delegates, it raises its run tree's ceiling for coding sub-agents. Native runs' own model calls are not affected. Budget group caps still apply. 0 = stop at budgetUsd.",
599
+ },
489
600
  maxDelegationsPerRun: {
490
601
  type: "integer",
491
602
  minimum: 1,
492
603
  maximum: MAX_DELEGATIONS_PER_RUN,
493
- description: "Native agents with sub-agents: how many delegate_to_* calls one run may make, each to a different sub-agent " +
604
+ description: "Native agents with sub-agents: how many delegate_to_* calls one run may make, to each sub-agent and repository at most once " +
494
605
  "(one after another, or together with parallelDelegations). Default 1: route to exactly one.",
495
606
  },
496
607
  parallelDelegations: { type: "boolean", description: PARALLEL_DELEGATIONS_DESCRIPTION },
@@ -531,6 +642,27 @@ export function registerAgentTools(mcp) {
531
642
  maximum: MAX_DEBUG_TRACE_MINUTES,
532
643
  description: "Admins only (agents:admin): trace every coding run of this agent for this many minutes from now; the worker writes its full stream trace, which can include prompts and repository content, to the run pod's log. Null turns it off.",
533
644
  },
645
+ debugTraceMaxMb: {
646
+ type: ["integer", "null"],
647
+ minimum: 1,
648
+ maximum: MAX_DEBUG_TRACE_MAX_MB,
649
+ description: `Admins only (agents:admin): cap on one traced run's trace output, in MiB (default ${DEFAULT_DEBUG_TRACE_MAX_MB}); the trace stops with a limit_reached line once it is reached. Null restores the default.`,
650
+ },
651
+ packageAuditMode: {
652
+ type: ["string", "null"],
653
+ enum: [...PACKAGE_AUDIT_MODES, null],
654
+ description: "Package audit mode, for a limited time (packageAuditMinutes). Needs packages:approve or agents:admin, and only the agent's owner may set it. " +
655
+ '"audit": the registry installs packages outside this agent\'s allowlist instead of refusing them, and records each one; ' +
656
+ '"full": also installs versions withheld only by high or critical advisories. Malware is refused and the release-age limit enforced in every mode. ' +
657
+ "This weakens the supply-chain guard while it is on: use it to find out which packages a task needs, then add them to packageAllowlist. " +
658
+ "Fixed per run when the run is dispatched. Null turns it off.",
659
+ },
660
+ packageAuditMinutes: {
661
+ type: "integer",
662
+ minimum: 1,
663
+ maximum: MAX_PACKAGE_AUDIT_MINUTES,
664
+ description: `How long package audit mode stays on, in minutes from now (default ${DEFAULT_PACKAGE_AUDIT_MINUTES}, at most ${MAX_PACKAGE_AUDIT_MINUTES}: 7 days). Given alone, it re-arms the stored mode. Needs packages:approve or agents:admin.`,
665
+ },
534
666
  },
535
667
  },
536
668
  repositoryAdminOverride: REPOSITORY_ADMIN_OVERRIDE,
@@ -542,9 +674,18 @@ export function registerAgentTools(mcp) {
542
674
  if (args.codingProfile?.workerImageRef !== undefined)
543
675
  requireWorkerImageRefScope(ctx);
544
676
  const debugTraceMinutes = args.codingProfile?.debugTraceMinutes;
545
- if (debugTraceMinutes !== undefined)
677
+ const debugTraceMaxMb = args.codingProfile?.debugTraceMaxMb;
678
+ if (debugTraceMinutes !== undefined || debugTraceMaxMb !== undefined)
546
679
  requireDebugTraceScope(ctx);
547
- if (args.codingProfile?.packageAllowlist !== undefined || args.codingProfile?.packagePolicy !== undefined)
680
+ const auditPatch = {
681
+ packageAuditMode: args.codingProfile?.packageAuditMode,
682
+ packageAuditMinutes: args.codingProfile?.packageAuditMinutes,
683
+ };
684
+ if (args.codingProfile?.packageAllowlist !== undefined ||
685
+ args.codingProfile?.packagePolicy !== undefined ||
686
+ args.codingProfile?.dependencyCache !== undefined ||
687
+ auditPatch.packageAuditMode !== undefined ||
688
+ auditPatch.packageAuditMinutes !== undefined)
548
689
  requirePackageApproval(ctx);
549
690
  // Repository authorization calls GitHub, so it runs before (outside) the
550
691
  // serializable transaction, on a pre-read; the transaction then verifies
@@ -601,7 +742,7 @@ export function registerAgentTools(mcp) {
601
742
  const authorization = plannedRepository !== null && repositoryChanges(before)
602
743
  ? await authorizeRepositoryForSet(ctx, {
603
744
  ownerId: before.ownerId,
604
- provider: "github",
745
+ provider: codeProviderOf(plannedRepository),
605
746
  repository: plannedRepository,
606
747
  kind: "coding",
607
748
  adminOverride: args.repositoryAdminOverride === true,
@@ -615,6 +756,7 @@ export function registerAgentTools(mcp) {
615
756
  : debugTraceMinutes === null
616
757
  ? null
617
758
  : new Date(Date.now() + debugTraceMinutes * 60_000);
759
+ let auditSet;
618
760
  const agent = await ctx.db.$transaction(async (tx) => {
619
761
  const existing = await tx.agent.findUnique({ where: { id: args.id }, include: { codingProfile: true } });
620
762
  if (!existing)
@@ -636,6 +778,23 @@ export function registerAgentTools(mcp) {
636
778
  await requireReadableBudgetGroup(tx, args.budgetGroupId, ctx.principal.id);
637
779
  }
638
780
  const nextKind = args.kind ?? existing.kind;
781
+ if (nextKind !== existing.kind) {
782
+ // A write link without triggers is a coding agent's extra repository
783
+ // and a native agent's plain write access; changing kind would
784
+ // silently reinterpret it.
785
+ const reinterpreted = await tx.agentRepository.count({
786
+ where: { agentId: args.id, access: "write", triggers: { isEmpty: true } },
787
+ });
788
+ if (reinterpreted > 0) {
789
+ throw new McpError(400, `Agent "${args.id}" has write repository links without triggers, which mean different things on native and coding agents; unlink them before changing its kind.`);
790
+ }
791
+ }
792
+ // A coding repository is an owner binding (agentOwnerBindings): an
793
+ // agent everyone can write never gets one, as attach_* refuse theirs.
794
+ if (((nextKind === "coding" && existing.kind !== "coding") || repositoryChanges(existing)) &&
795
+ (await isPublicWritable(tx, existing.id))) {
796
+ throw new McpError(409, `Agent "${args.id}" is writable by everyone, so it can't become a coding agent or get a repository; revoke or lower the everyone grant first.`);
797
+ }
639
798
  if (nextKind === "native" && args.codingProfile) {
640
799
  throw new McpError(400, "A coding profile is only valid for coding agents.");
641
800
  }
@@ -659,11 +818,14 @@ export function registerAgentTools(mcp) {
659
818
  throw new McpError(400, "Detach all native sandbox tools before changing an agent to coding.");
660
819
  }
661
820
  const currentProfile = existing.codingProfile ? storedProfile(existing.codingProfile) : undefined;
662
- const { debugTraceMinutes: _minutes, ...profilePatch } = args.codingProfile ?? {};
821
+ const { debugTraceMinutes: _minutes, debugTraceMaxMb: _maxMb, packageAuditMode: _auditMode, packageAuditMinutes: _auditMinutes, ...profilePatch } = args.codingProfile ?? {};
663
822
  const profileResult = CodingProfileSchema.safeParse({ ...currentProfile, ...profilePatch });
664
823
  if (!profileResult.success)
665
824
  throw invalidArguments("coding profile", profileResult.error);
666
825
  nextProfile = profileResult.data;
826
+ if (typeof args.codingProfile?.workspaceDiskMb === "number" || nextKind !== existing.kind) {
827
+ validateWorkspaceDiskMb(nextProfile.workspaceDiskMb);
828
+ }
667
829
  if (args.codingProfile?.services !== undefined)
668
830
  await requireCatalogServiceNames(tx, nextProfile.services);
669
831
  const nextModel = args.model ?? existing.model;
@@ -674,6 +836,19 @@ export function registerAgentTools(mcp) {
674
836
  throw new McpError(400, `Model "${nextModel}" is not supported by coding provider "${nextProfile.provider}".`);
675
837
  }
676
838
  }
839
+ // Package audit mode: resolved against the stored mode inside the
840
+ // transaction, so minutes alone re-arm what is stored now.
841
+ let audit;
842
+ try {
843
+ const storedMode = existing.codingProfile?.packageAuditMode;
844
+ audit = resolvePackageAuditPatch({ mode: isPackageAuditMode(storedMode) ? storedMode : null }, auditPatch, new Date());
845
+ }
846
+ catch (error) {
847
+ if (error instanceof PackageAuditPatchError)
848
+ throw new McpError(400, error.message);
849
+ throw error;
850
+ }
851
+ auditSet = audit;
677
852
  const nextSchedule = args.schedule !== undefined ? args.schedule : existing.schedule;
678
853
  const nextTimezone = args.timezone ?? existing.timezone;
679
854
  const nextScheduleEnabled = args.scheduleEnabled ?? existing.scheduleEnabled;
@@ -687,7 +862,11 @@ export function registerAgentTools(mcp) {
687
862
  ...(modeArg ? { nativeExecutionMode: toStoredMode(modeArg) } : {}),
688
863
  };
689
864
  const stamp = authorization ? profileStamp(authorization) : {};
690
- const trace = debugTraceUntil === undefined ? {} : { debugTraceUntil };
865
+ const trace = {
866
+ ...(debugTraceUntil === undefined ? {} : { debugTraceUntil }),
867
+ ...(debugTraceMaxMb === undefined ? {} : { debugTraceMaxMb }),
868
+ ...(audit === undefined ? {} : { packageAuditMode: audit.mode, packageAuditUntil: audit.until }),
869
+ };
691
870
  const profileMutation = nextKind === "native"
692
871
  ? existing.codingProfile
693
872
  ? { delete: true }
@@ -695,32 +874,91 @@ export function registerAgentTools(mcp) {
695
874
  : existing.codingProfile
696
875
  ? { update: { ...nextProfile, ...stamp, ...trace } }
697
876
  : { create: { ...nextProfile, ...stamp, ...trace } };
877
+ const scheduleStart = await scheduleStartFields(tx, existing, {
878
+ schedule: nextSchedule,
879
+ timezone: nextTimezone,
880
+ scheduleEnabled: nextScheduleEnabled,
881
+ });
698
882
  return tx.agent.update({
699
883
  where: { id },
700
884
  data: {
701
885
  ...updates,
886
+ ...scheduleStart,
702
887
  ...(profileMutation ? { codingProfile: profileMutation } : {}),
703
888
  },
704
889
  include: { codingProfile: true },
705
890
  });
706
891
  }, { isolationLevel: Prisma.TransactionIsolationLevel.Serializable });
707
- if (debugTraceUntil !== undefined) {
892
+ if (debugTraceUntil !== undefined || debugTraceMaxMb !== undefined) {
708
893
  agentsLog.info({
709
894
  event: "coding.debug_trace.set",
710
895
  agentId: agent.id,
711
- until: debugTraceUntil?.toISOString() ?? null,
896
+ ...(debugTraceUntil !== undefined ? { until: debugTraceUntil?.toISOString() ?? null } : {}),
897
+ ...(debugTraceMaxMb !== undefined ? { maxMb: debugTraceMaxMb } : {}),
712
898
  by: ctx.principal.id,
713
899
  }, "coding debug trace set");
714
900
  }
715
- return textResult(withOperatorMode(agent));
901
+ if (auditSet !== undefined) {
902
+ agentsLog.info({
903
+ event: "coding.package_audit.set",
904
+ agentId: agent.id,
905
+ mode: auditSet.mode,
906
+ until: auditSet.until?.toISOString() ?? null,
907
+ by: ctx.principal.id,
908
+ }, "coding package audit mode set");
909
+ }
910
+ const shown = withProfileWarnings(withOperatorMode(agent));
911
+ // Becoming Codex (a provider switch, or a native agent becoming coding) leaves out every attached
912
+ // MCP tool the server doesn't mark read-only: say which, so the owner isn't surprised by a run.
913
+ const wasCodex = before.kind === "coding" && isCodexCoding(before.codingProfile?.provider);
914
+ if (agent.kind === "coding" && isCodexCoding(agent.codingProfile?.provider) && !wasCodex) {
915
+ const writers = await codexUnavailableMcpTools(ctx.db, agent.id);
916
+ if (writers.length > 0) {
917
+ return textResult({ ...shown, warnings: [...(shown.warnings ?? []), codexWriteToolsWarning(writers)] });
918
+ }
919
+ }
920
+ return textResult(shown);
716
921
  },
717
922
  });
718
923
  mcp.registerTool({
719
924
  name: "list_agents",
720
925
  scope: "agents:read",
721
- inputSchema: { type: "object", properties: {}, additionalProperties: false },
722
- handler: async (_args, ctx) => {
723
- const [where, accessOf] = await Promise.all([readableAgentsWhere(ctx), agentAccessResolver(ctx)]);
926
+ description: "Lists the agents you can see. Each row has an `access` field, your level on that agent: owner > write > execute > read. When showing the agents as a table, include `access` as a column. " +
927
+ "summary: true returns only id, name, kind, model, codingProvider, budgetUsd, ownerId and access per agent, for listings that don't need the full configuration. " +
928
+ "all: true lists every agent in the deployment (admins only, admin:view); an agent you have no grant on shows access `none`.",
929
+ inputSchema: {
930
+ type: "object",
931
+ properties: { summary: { type: "boolean" }, all: { type: "boolean" } },
932
+ additionalProperties: false,
933
+ },
934
+ handler: async (args, ctx) => {
935
+ if (args.all === true && !ctx.operator)
936
+ requireScope(ctx, ctx.canonicalUri, "admin:view");
937
+ const [where, accessOf] = await Promise.all([
938
+ args.all === true ? Promise.resolve({}) : readableAgentsWhere(ctx),
939
+ agentAccessResolver(ctx),
940
+ ]);
941
+ if (args.summary === true) {
942
+ const agents = await ctx.db.agent.findMany({
943
+ where,
944
+ select: {
945
+ id: true,
946
+ name: true,
947
+ kind: true,
948
+ model: true,
949
+ budgetUsd: true,
950
+ ownerId: true,
951
+ codingProfile: { select: { provider: true } },
952
+ },
953
+ orderBy: { name: "asc" },
954
+ });
955
+ return textResult(agents.map(({ codingProfile, budgetUsd, ...agent }) => ({
956
+ ...agent,
957
+ codingProvider: codingProfile?.provider ?? null,
958
+ budgetUsd: Number(budgetUsd),
959
+ access: accessOf(agent),
960
+ })));
961
+ }
724
962
  const agents = await ctx.db.agent.findMany({ where, include: { codingProfile: true } });
725
963
  return textResult(agents.map((agent) => ({ ...withOperatorMode(agent), access: accessOf(agent) })));
726
964
  },
@@ -742,12 +980,14 @@ export function registerAgentTools(mcp) {
742
980
  // A7: a tool's code and schema are its owner's, whoever can read the
743
981
  // agent (the agent's owner included). Capabilities stay visible: config.
744
982
  return textResult({
745
- ...withOperatorMode(agent),
983
+ ...withProfileWarnings(withOperatorMode(agent)),
746
984
  access,
747
- tools: agent.tools.map((attachment) => ({
985
+ mcpServers: await agentMcpServerViews(ctx.db, agent.id),
986
+ // Zod 3 window: the caller's own tools carry their warnings (see core/zod3-window.ts).
987
+ tools: await Promise.all(agent.tools.map(async (attachment) => ({
748
988
  ...attachment,
749
- tool: projectTool(attachment.tool, ctx.principal.id),
750
- })),
989
+ tool: await withZod3ToolWarnings(projectTool(attachment.tool, ctx.principal.id)),
990
+ }))),
751
991
  });
752
992
  },
753
993
  });
@@ -792,7 +1032,7 @@ export function registerAgentTools(mcp) {
792
1032
  mcp.registerTool({
793
1033
  name: "make_owner",
794
1034
  scope: "agents:admin",
795
- description: "Admins: gives an agent a new owner (an existing principal id). Secret and datastore bindings the new owner doesn't own are removed; tool capabilities the new owner never granted are suspended until they re-run attach_tool; sub-agent edges the new owner can't delegate are removed; between two owners every grant on the agent is reset (adopting an owner-less agent keeps them). Returns what changed.",
1035
+ description: "Admins: gives an agent a new owner (an existing principal id). Secret, datastore and MCP server bindings the new owner doesn't own are removed; tool capabilities the new owner never granted are suspended until they re-run attach_tool; sub-agent edges the new owner can't delegate are removed; between two owners every grant on the agent is reset (adopting an owner-less agent keeps them). Returns what changed.",
796
1036
  inputSchema: {
797
1037
  type: "object",
798
1038
  additionalProperties: false,
@@ -814,7 +1054,9 @@ export function registerAgentTools(mcp) {
814
1054
  const principal = await ctx.db.principal.findUnique({ where: { id: newOwner } });
815
1055
  if (!principal)
816
1056
  throw new McpError(400, `Principal "${newOwner}" not found.`);
817
- const result = await ctx.db.$transaction(async (tx) => {
1057
+ // Bounded retry: a concurrent grant or attach on the same rows aborts one side (Serializable).
1058
+ const result = await withSerializableRetry(() => ctx.db.$transaction(async (tx) => {
1059
+ await preferIndexScans(tx);
818
1060
  const agent = await tx.agent.findUnique({ where: { id: args.agentId }, include: { codingProfile: true } });
819
1061
  if (!agent)
820
1062
  throw agentNotFound(args.agentId);
@@ -833,7 +1075,10 @@ export function registerAgentTools(mcp) {
833
1075
  where: { agentId: agent.id, authorizedVia: approved },
834
1076
  orderBy: { repository: "asc" },
835
1077
  });
836
- await tx.agentRepository.updateMany({ where: { agentId: agent.id, authorizedVia: approved }, data: reset });
1078
+ await tx.agentRepository.updateMany({
1079
+ where: { agentId: agent.id, authorizedVia: approved },
1080
+ data: reset,
1081
+ });
837
1082
  revoked.push(...links.map((l) => l.repository));
838
1083
  const profile = await tx.codingAgentProfile.updateMany({
839
1084
  where: { agentId: agent.id, repositoryAuthorizedVia: approved },
@@ -890,9 +1135,31 @@ export function registerAgentTools(mcp) {
890
1135
  where: { agentId: agent.id, datastoreId: { in: foreignDatastores.map((b) => b.datastoreId) } },
891
1136
  });
892
1137
  }
1138
+ // MCP server attachments: the server's brokered secrets act for its
1139
+ // owner, so a server the new owner neither owns nor holds use on is detached.
1140
+ const mcpServers = await tx.agentMcpServer.findMany({
1141
+ where: { agentId: agent.id },
1142
+ include: { server: { select: { id: true, name: true, ownerId: true } } },
1143
+ orderBy: { serverId: "asc" },
1144
+ });
1145
+ const foreignMcpServers = await filterUnusableMcpServers(tx, () => newOwner, mcpServers);
1146
+ if (foreignMcpServers.length > 0) {
1147
+ await tx.agentMcpServer.deleteMany({
1148
+ where: { agentId: agent.id, serverId: { in: foreignMcpServers.map((b) => b.serverId) } },
1149
+ });
1150
+ }
893
1151
  const bindingsRemoved = [
894
1152
  ...foreignSecrets.map((b) => ({ kind: "secret", boundName: b.boundName, resourceId: b.secretId })),
895
- ...foreignDatastores.map((b) => ({ kind: "datastore", boundName: b.boundName, resourceId: b.datastoreId })),
1153
+ ...foreignDatastores.map((b) => ({
1154
+ kind: "datastore",
1155
+ boundName: b.boundName,
1156
+ resourceId: b.datastoreId,
1157
+ })),
1158
+ ...foreignMcpServers.map((b) => ({
1159
+ kind: "mcp_server",
1160
+ boundName: b.server.name,
1161
+ resourceId: b.serverId,
1162
+ })),
896
1163
  ];
897
1164
  // Tool capabilities: rows aren't rewritten; the runner ignores any
898
1165
  // the new owner never stamped (capabilitiesGrantedById).
@@ -950,7 +1217,7 @@ export function registerAgentTools(mcp) {
950
1217
  everyoneGrant,
951
1218
  webhooksInactive,
952
1219
  };
953
- }, { isolationLevel: Prisma.TransactionIsolationLevel.Serializable });
1220
+ }, { isolationLevel: Prisma.TransactionIsolationLevel.Serializable }));
954
1221
  return textResult(result);
955
1222
  },
956
1223
  });
@@ -1,9 +1,10 @@
1
1
  import { Prisma } from "#prisma";
2
2
  import { requireOwnedDatastore, canRead, assertCanMutate } from "../auth/ownership.js";
3
- import { requireAgentAccess, requireBindingOwner } from "../auth/access.js";
3
+ import { requireAgentAccess, requireBindable, requireBindingOwner } from "../auth/access.js";
4
4
  import { createDatastore, listDatastores, deleteDatastore, attachDatastore, detachDatastore, buildSharedDatastoreAccessor, } from "../../core/datastores.js";
5
5
  import { McpError } from "../errors.js";
6
6
  import { textResult } from "./text-result.js";
7
+ import { SecretInValueError, SecretCheckUnavailableError } from "../../core/secret-guard.js";
7
8
  /**
8
9
  * A `boundName` names an *attachment* (agentId, boundName) -> Datastore.
9
10
  * Agent data (the private store and bound stores) is owner-only (resource-
@@ -99,7 +100,7 @@ export function registerDatastoreTools(mcp) {
99
100
  // read it: strictly the agent owner's own datastore on the owner's
100
101
  // own agent (A2/S2-2). Not even the stdio operator crosses owners.
101
102
  const { agent } = await requireAgentAccess(ctx, args.agentId, "read");
102
- requireBindingOwner(ctx, agent);
103
+ await requireBindable(ctx, agent);
103
104
  const datastore = await requireOwnedDatastore(ctx.db, args.datastoreId, ctx.principal.id);
104
105
  if (datastore.ownerId !== agent.ownerId) {
105
106
  throw new McpError(403, "Only a datastore owned by the agent's owner can be attached to it.");
@@ -191,14 +192,22 @@ export function registerDatastoreTools(mcp) {
191
192
  },
192
193
  handler: async (args, ctx) => {
193
194
  await requireAgentAccess(ctx, args.agentId, "owner");
194
- if (args.boundName) {
195
- await requireMutableSharedDatastore(ctx.db, args.agentId, args.boundName, ctx.principal.id);
196
- const accessor = buildSharedDatastoreAccessor(args.agentId, ctx.providers.datastore, ctx.db);
197
- await accessor.set(args.boundName, args.key, args.value, { pii: args.pii });
195
+ try {
196
+ if (args.boundName) {
197
+ await requireMutableSharedDatastore(ctx.db, args.agentId, args.boundName, ctx.principal.id);
198
+ const accessor = buildSharedDatastoreAccessor(args.agentId, ctx.providers.datastore, ctx.db);
199
+ await accessor.set(args.boundName, args.key, args.value, { pii: args.pii });
200
+ return textResult({ ok: true });
201
+ }
202
+ await ctx.providers.datastore.set(args.agentId, args.key, args.value, { pii: args.pii });
198
203
  return textResult({ ok: true });
199
204
  }
200
- await ctx.providers.datastore.set(args.agentId, args.key, args.value, { pii: args.pii });
201
- return textResult({ ok: true });
205
+ catch (err) {
206
+ if (err instanceof SecretInValueError || err instanceof SecretCheckUnavailableError) {
207
+ throw new McpError(400, err.message);
208
+ }
209
+ throw err;
210
+ }
202
211
  },
203
212
  });
204
213
  mcp.registerTool({