@wardby/cli 0.5.3 → 0.7.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 (763) hide show
  1. package/.env.example +33 -0
  2. package/README.md +25 -14
  3. package/deploy/local/docker-compose.quickstart-coding.yml +13 -0
  4. package/dist/claude-coding-worker/context.d.ts +22 -0
  5. package/dist/claude-coding-worker/context.js +92 -0
  6. package/dist/claude-coding-worker/driver.d.ts +27 -3
  7. package/dist/claude-coding-worker/driver.js +161 -20
  8. package/dist/claude-coding-worker/main.js +34 -6
  9. package/dist/claude-coding-worker/sdk.js +25 -5
  10. package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
  11. package/dist/claude-coding-worker/tool-socket.js +111 -0
  12. package/dist/claude-coding-worker/transcript.d.ts +18 -0
  13. package/dist/claude-coding-worker/transcript.js +77 -0
  14. package/dist/cli-help.d.ts +1 -1
  15. package/dist/cli-help.js +6 -2
  16. package/dist/cli-native-mode.d.ts +9 -0
  17. package/dist/cli-native-mode.js +20 -0
  18. package/dist/cli.d.ts +3 -1
  19. package/dist/cli.js +161 -11
  20. package/dist/coding/claude-context.d.ts +45 -0
  21. package/dist/coding/claude-context.js +434 -0
  22. package/dist/coding/continuation-wording.d.ts +35 -0
  23. package/dist/coding/continuation-wording.js +73 -0
  24. package/dist/coding/linked-issue-note.d.ts +23 -0
  25. package/dist/coding/linked-issue-note.js +47 -0
  26. package/dist/coding/merge-wording.d.ts +28 -0
  27. package/dist/coding/merge-wording.js +78 -0
  28. package/dist/coding/pr-description-note.d.ts +9 -0
  29. package/dist/coding/pr-description-note.js +32 -0
  30. package/dist/coding/profile.d.ts +50 -118
  31. package/dist/coding/profile.js +51 -4
  32. package/dist/coding/protected-path-wording.d.ts +8 -0
  33. package/dist/coding/protected-path-wording.js +1 -1
  34. package/dist/coding/protocol.d.ts +292 -270
  35. package/dist/coding/protocol.js +322 -15
  36. package/dist/coding/redact.d.ts +3 -0
  37. package/dist/coding/redact.js +12 -0
  38. package/dist/coding/registry/allowlist.d.ts +12 -0
  39. package/dist/coding/registry/allowlist.js +14 -1
  40. package/dist/coding/registry/audit-mode.d.ts +153 -0
  41. package/dist/coding/registry/audit-mode.js +304 -0
  42. package/dist/coding/registry/lockfile-shared.d.ts +36 -0
  43. package/dist/coding/registry/lockfile-shared.js +128 -0
  44. package/dist/coding/registry/lockfiles.js +1 -1
  45. package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
  46. package/dist/coding/registry/npm-lockfile-formats.js +41 -0
  47. package/dist/coding/registry/npm-lockfile.d.ts +8 -4
  48. package/dist/coding/registry/npm-lockfile.js +4 -6
  49. package/dist/coding/registry/npm.js +78 -8
  50. package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
  51. package/dist/coding/registry/pnpm-lockfile.js +189 -0
  52. package/dist/coding/registry/pypi-plan.d.ts +50 -0
  53. package/dist/coding/registry/pypi-plan.js +406 -0
  54. package/dist/coding/registry/pypi-requirements.d.ts +58 -0
  55. package/dist/coding/registry/pypi-requirements.js +155 -0
  56. package/dist/coding/registry/pypi.d.ts +3 -27
  57. package/dist/coding/registry/pypi.js +40 -154
  58. package/dist/coding/registry/refusal-hints.d.ts +20 -0
  59. package/dist/coding/registry/refusal-hints.js +61 -0
  60. package/dist/coding/registry/refusal-wording.d.ts +11 -0
  61. package/dist/coding/registry/refusal-wording.js +56 -0
  62. package/dist/coding/registry/report.d.ts +70 -8
  63. package/dist/coding/registry/report.js +112 -5
  64. package/dist/coding/registry/types.d.ts +58 -8
  65. package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
  66. package/dist/coding/registry/yarn-lockfile.js +367 -0
  67. package/dist/coding/services/catalog.d.ts +37 -351
  68. package/dist/coding/transcript/claude-code.d.ts +13 -0
  69. package/dist/coding/transcript/claude-code.js +273 -0
  70. package/dist/coding/transcript/download-protocol.d.ts +30 -0
  71. package/dist/coding/transcript/download-protocol.js +18 -0
  72. package/dist/coding/transcript/format.d.ts +20 -0
  73. package/dist/coding/transcript/format.js +32 -0
  74. package/dist/coding/transcript/recorder.d.ts +51 -0
  75. package/dist/coding/transcript/recorder.js +225 -0
  76. package/dist/coding/transcript/resume/checkout.d.ts +31 -0
  77. package/dist/coding/transcript/resume/checkout.js +203 -0
  78. package/dist/coding/transcript/resume/command.d.ts +17 -0
  79. package/dist/coding/transcript/resume/command.js +176 -0
  80. package/dist/coding/transcript/resume/download.d.ts +20 -0
  81. package/dist/coding/transcript/resume/download.js +153 -0
  82. package/dist/coding/transcript/resume/launch.d.ts +38 -0
  83. package/dist/coding/transcript/resume/launch.js +128 -0
  84. package/dist/coding/transcript/resume/session-file.d.ts +13 -0
  85. package/dist/coding/transcript/resume/session-file.js +79 -0
  86. package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
  87. package/dist/coding/transcript/resume/stand-in.js +49 -0
  88. package/dist/coding-worker/artifact.d.ts +16 -3
  89. package/dist/coding-worker/artifact.js +5 -3
  90. package/dist/coding-worker/debug-trace.d.ts +6 -5
  91. package/dist/coding-worker/debug-trace.js +13 -18
  92. package/dist/coding-worker/dependency-cache.d.mts +229 -0
  93. package/dist/coding-worker/dependency-cache.mjs +2123 -0
  94. package/dist/coding-worker/driver.d.ts +4 -3
  95. package/dist/coding-worker/driver.js +118 -38
  96. package/dist/coding-worker/errors.d.ts +1 -0
  97. package/dist/coding-worker/errors.js +32 -0
  98. package/dist/coding-worker/sdk.d.ts +6 -0
  99. package/dist/coding-worker/sdk.js +1 -0
  100. package/dist/coding-worker/skills.d.ts +23 -0
  101. package/dist/coding-worker/skills.js +117 -0
  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 +13 -0
  105. package/dist/config/dependency-cache.d.ts +23 -0
  106. package/dist/config/dependency-cache.js +32 -0
  107. package/dist/config/github-allowed-accounts.d.ts +15 -0
  108. package/dist/config/github-allowed-accounts.js +36 -0
  109. package/dist/config/low-power.d.ts +12 -0
  110. package/dist/config/low-power.js +18 -0
  111. package/dist/config/mobile.d.ts +12 -0
  112. package/dist/config/mobile.js +18 -0
  113. package/dist/config/providers.d.ts +65 -3
  114. package/dist/config/providers.js +147 -11
  115. package/dist/config/test-simulators.d.ts +82 -0
  116. package/dist/config/test-simulators.js +305 -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-queue.d.ts +2 -1
  130. package/dist/core/coding-queue.js +7 -0
  131. package/dist/core/cron.d.ts +19 -1
  132. package/dist/core/cron.js +17 -0
  133. package/dist/core/datastores.js +1 -1
  134. package/dist/core/db.d.ts +16 -6
  135. package/dist/core/db.js +12 -10
  136. package/dist/core/deferred-coding.d.ts +14 -0
  137. package/dist/core/deferred-coding.js +62 -0
  138. package/dist/core/delegation-child.d.ts +25 -0
  139. package/dist/core/delegation-child.js +37 -0
  140. package/dist/core/dispatch.d.ts +53 -0
  141. package/dist/core/dispatch.js +167 -57
  142. package/dist/core/engine-native.js +10 -6
  143. package/dist/core/error-code.d.ts +38 -0
  144. package/dist/core/error-code.js +168 -0
  145. package/dist/core/grants.d.ts +19 -6
  146. package/dist/core/grants.js +55 -6
  147. package/dist/core/host-events.d.ts +67 -5
  148. package/dist/core/host-events.js +571 -37
  149. package/dist/core/host-status.d.ts +85 -3
  150. package/dist/core/host-status.js +298 -20
  151. package/dist/core/issue-bridge.d.ts +50 -6
  152. package/dist/core/issue-bridge.js +151 -20
  153. package/dist/core/issue-events.d.ts +1 -1
  154. package/dist/core/issue-events.js +16 -11
  155. package/dist/core/issue-status.d.ts +1 -1
  156. package/dist/core/issue-status.js +68 -29
  157. package/dist/core/logger.d.ts +5 -0
  158. package/dist/core/logger.js +14 -1
  159. package/dist/core/lost-run-children.d.ts +6 -0
  160. package/dist/core/lost-run-children.js +32 -0
  161. package/dist/core/mark-ready.d.ts +34 -0
  162. package/dist/core/mark-ready.js +152 -0
  163. package/dist/core/markdown-code.d.ts +8 -0
  164. package/dist/core/markdown-code.js +107 -0
  165. package/dist/core/memory-tools.js +7 -0
  166. package/dist/core/merge-order-check.d.ts +130 -0
  167. package/dist/core/merge-order-check.js +343 -0
  168. package/dist/core/notification-dispatcher.d.ts +70 -0
  169. package/dist/core/notification-dispatcher.js +368 -0
  170. package/dist/core/notification-templates.d.ts +19 -0
  171. package/dist/core/notification-templates.js +139 -0
  172. package/dist/core/notifications.d.ts +10 -0
  173. package/dist/core/notifications.js +38 -0
  174. package/dist/core/pg-auth.d.ts +22 -0
  175. package/dist/core/pg-auth.js +152 -0
  176. package/dist/core/power-composition.d.ts +16 -0
  177. package/dist/core/power-composition.js +37 -0
  178. package/dist/core/power-idle.d.ts +14 -0
  179. package/dist/core/power-idle.js +30 -0
  180. package/dist/core/power.d.ts +71 -0
  181. package/dist/core/power.js +202 -0
  182. package/dist/core/pull-request-state-sync.js +2 -2
  183. package/dist/core/reconciler.d.ts +8 -5
  184. package/dist/core/reconciler.js +37 -6
  185. package/dist/core/related-pull-requests.d.ts +59 -7
  186. package/dist/core/related-pull-requests.js +140 -25
  187. package/dist/core/reply-parts.d.ts +21 -0
  188. package/dist/core/reply-parts.js +73 -0
  189. package/dist/core/repo-access.d.ts +15 -0
  190. package/dist/core/repo-access.js +66 -0
  191. package/dist/core/review-fix.d.ts +38 -1
  192. package/dist/core/review-fix.js +209 -7
  193. package/dist/core/review-host-checks.d.ts +1 -1
  194. package/dist/core/review-host-tools.d.ts +23 -0
  195. package/dist/core/review-host-tools.js +156 -14
  196. package/dist/core/review-reads.d.ts +55 -0
  197. package/dist/core/review-reads.js +233 -0
  198. package/dist/core/run-status.d.ts +12 -0
  199. package/dist/core/run-status.js +12 -0
  200. package/dist/core/runner.d.ts +384 -5
  201. package/dist/core/runner.js +1244 -372
  202. package/dist/core/schedule-start.d.ts +12 -0
  203. package/dist/core/schedule-start.js +14 -0
  204. package/dist/core/secret-broker-config.d.ts +39 -0
  205. package/dist/core/secret-broker-config.js +112 -0
  206. package/dist/core/secret-guard.d.ts +46 -0
  207. package/dist/core/secret-guard.js +104 -0
  208. package/dist/core/secret-guarded-stores.d.ts +12 -0
  209. package/dist/core/secret-guarded-stores.js +41 -0
  210. package/dist/core/secret-spans.d.ts +50 -0
  211. package/dist/core/secret-spans.js +94 -0
  212. package/dist/core/secrets.d.ts +39 -4
  213. package/dist/core/secrets.js +148 -40
  214. package/dist/core/stop-run.d.ts +46 -0
  215. package/dist/core/stop-run.js +61 -0
  216. package/dist/core/workflow-event-recorder.d.ts +14 -0
  217. package/dist/core/workflow-event-recorder.js +120 -0
  218. package/dist/core/workflow-events.d.ts +94 -0
  219. package/dist/core/workflow-events.js +48 -0
  220. package/dist/core/workflow-run-events.d.ts +18 -0
  221. package/dist/core/workflow-run-events.js +75 -0
  222. package/dist/core/zod-json-schema.d.ts +4 -0
  223. package/dist/core/zod-json-schema.js +39 -0
  224. package/dist/core/zod3-window.d.ts +35 -0
  225. package/dist/core/zod3-window.js +124 -0
  226. package/dist/generated/prisma/browser.d.ts +92 -3
  227. package/dist/generated/prisma/client.d.ts +92 -3
  228. package/dist/generated/prisma/commonInputTypes.d.ts +364 -54
  229. package/dist/generated/prisma/enums.d.ts +37 -0
  230. package/dist/generated/prisma/enums.js +31 -0
  231. package/dist/generated/prisma/internal/class.d.ts +132 -0
  232. package/dist/generated/prisma/internal/class.js +4 -4
  233. package/dist/generated/prisma/internal/prismaNamespace.d.ts +1332 -142
  234. package/dist/generated/prisma/internal/prismaNamespace.js +227 -5
  235. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +234 -0
  236. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +227 -5
  237. package/dist/generated/prisma/models/Agent.d.ts +464 -7
  238. package/dist/generated/prisma/models/AgentRepository.d.ts +42 -1
  239. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +301 -1
  240. package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
  241. package/dist/generated/prisma/models/CodingProxySession.d.ts +114 -1
  242. package/dist/generated/prisma/models/CodingRun.d.ts +1841 -1
  243. package/dist/generated/prisma/models/DeferredReview.d.ts +78 -1
  244. package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
  245. package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
  246. package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
  247. package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
  248. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +1713 -0
  249. package/dist/generated/prisma/models/NativeGatewayCall.js +1 -0
  250. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +1551 -0
  251. package/dist/generated/prisma/models/NativeGatewaySession.js +1 -0
  252. package/dist/generated/prisma/models/NativeWarmWorker.d.ts +1296 -0
  253. package/dist/generated/prisma/models/NativeWarmWorker.js +1 -0
  254. package/dist/generated/prisma/models/NotificationChannel.d.ts +1543 -0
  255. package/dist/generated/prisma/models/NotificationChannel.js +1 -0
  256. package/dist/generated/prisma/models/NotificationDelivery.d.ts +1502 -0
  257. package/dist/generated/prisma/models/NotificationDelivery.js +1 -0
  258. package/dist/generated/prisma/models/NotificationThread.d.ts +1090 -0
  259. package/dist/generated/prisma/models/NotificationThread.js +1 -0
  260. package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
  261. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
  262. package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
  263. package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
  264. package/dist/generated/prisma/models/Run.d.ts +1619 -58
  265. package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
  266. package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
  267. package/dist/generated/prisma/models/RunHostCheck.d.ts +36 -1
  268. package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
  269. package/dist/generated/prisma/models/RunTranscript.js +1 -0
  270. package/dist/generated/prisma/models/Secret.d.ts +37 -1
  271. package/dist/generated/prisma/models/SecretBrokerChange.d.ts +1101 -0
  272. package/dist/generated/prisma/models/SecretBrokerChange.js +1 -0
  273. package/dist/generated/prisma/models/WorkflowEvent.d.ts +1422 -0
  274. package/dist/generated/prisma/models/WorkflowEvent.js +1 -0
  275. package/dist/generated/prisma/models.d.ts +12 -0
  276. package/dist/help/build.js +4 -2
  277. package/dist/help/catalog.d.ts +1 -1
  278. package/dist/help/catalog.js +31 -6
  279. package/dist/help-index.json +2584 -146
  280. package/dist/import/create.js +49 -3
  281. package/dist/import/neutral-schema.d.ts +50 -277
  282. package/dist/import/neutral-schema.js +7 -4
  283. package/dist/knowledge/check.d.ts +1 -1
  284. package/dist/knowledge/cli.d.ts +11 -1
  285. package/dist/knowledge/cli.js +37 -4
  286. package/dist/knowledge/concept.d.ts +3 -19
  287. package/dist/knowledge/location.d.ts +31 -0
  288. package/dist/knowledge/location.js +78 -0
  289. package/dist/mcp/auth/access.d.ts +11 -2
  290. package/dist/mcp/auth/access.js +15 -1
  291. package/dist/mcp/auth/ownership.d.ts +7 -7
  292. package/dist/mcp/auth/repo-authorization.js +14 -0
  293. package/dist/mcp/auth/resource-server.d.ts +2 -1
  294. package/dist/mcp/auth/resource-server.js +7 -2
  295. package/dist/mcp/auth/self-hosted/browser.d.ts +1 -1
  296. package/dist/mcp/auth/self-hosted/browser.js +19 -6
  297. package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
  298. package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
  299. package/dist/mcp/context.d.ts +6 -0
  300. package/dist/mcp/host-events/github-ingress.d.ts +25 -1
  301. package/dist/mcp/host-events/github-ingress.js +70 -1
  302. package/dist/mcp/index.d.ts +19 -0
  303. package/dist/mcp/index.js +117 -20
  304. package/dist/mcp/server.d.ts +13 -0
  305. package/dist/mcp/server.js +33 -14
  306. package/dist/mcp/tools/agents.d.ts +4 -0
  307. package/dist/mcp/tools/agents.js +277 -24
  308. package/dist/mcp/tools/datastore.js +17 -8
  309. package/dist/mcp/tools/grants.js +9 -3
  310. package/dist/mcp/tools/memory.js +11 -1
  311. package/dist/mcp/tools/notification-channels.d.ts +2 -0
  312. package/dist/mcp/tools/notification-channels.js +293 -0
  313. package/dist/mcp/tools/packages.d.ts +2 -0
  314. package/dist/mcp/tools/packages.js +195 -0
  315. package/dist/mcp/tools/power.d.ts +2 -0
  316. package/dist/mcp/tools/power.js +77 -0
  317. package/dist/mcp/tools/repositories.js +18 -5
  318. package/dist/mcp/tools/run-access.d.ts +16 -0
  319. package/dist/mcp/tools/run-access.js +25 -0
  320. package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
  321. package/dist/mcp/tools/run-transcript-download.js +129 -0
  322. package/dist/mcp/tools/run-transcript.d.ts +19 -0
  323. package/dist/mcp/tools/run-transcript.js +70 -0
  324. package/dist/mcp/tools/runs.d.ts +0 -6
  325. package/dist/mcp/tools/runs.js +41 -14
  326. package/dist/mcp/tools/scheduling.js +3 -1
  327. package/dist/mcp/tools/secret-broker-compat.d.ts +12 -0
  328. package/dist/mcp/tools/secret-broker-compat.js +23 -0
  329. package/dist/mcp/tools/secret-elicitation-form.d.ts +22 -2
  330. package/dist/mcp/tools/secret-elicitation-form.js +205 -10
  331. package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
  332. package/dist/mcp/tools/secret-elicitation-server.js +10 -54
  333. package/dist/mcp/tools/secret-elicitation.d.ts +38 -3
  334. package/dist/mcp/tools/secret-elicitation.js +110 -12
  335. package/dist/mcp/tools/secrets.js +186 -9
  336. package/dist/mcp/tools/stop-run.d.ts +2 -0
  337. package/dist/mcp/tools/stop-run.js +82 -0
  338. package/dist/mcp/tools/subagents.js +2 -2
  339. package/dist/mcp/tools/tools.d.ts +2 -2
  340. package/dist/mcp/tools/tools.js +47 -11
  341. package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
  342. package/dist/mcp/transport/stdio-link-host.js +67 -0
  343. package/dist/mcp/transport/streamable-http.d.ts +13 -0
  344. package/dist/mcp/transport/streamable-http.js +41 -1
  345. package/dist/native-worker/composition.d.ts +23 -0
  346. package/dist/native-worker/composition.js +77 -0
  347. package/dist/native-worker/docker-isolation.d.ts +65 -0
  348. package/dist/native-worker/docker-isolation.js +183 -0
  349. package/dist/native-worker/docker-launcher.d.ts +110 -0
  350. package/dist/native-worker/docker-launcher.js +297 -0
  351. package/dist/native-worker/gateway-server.d.ts +77 -0
  352. package/dist/native-worker/gateway-server.js +412 -0
  353. package/dist/native-worker/gateway.d.ts +70 -0
  354. package/dist/native-worker/gateway.js +263 -0
  355. package/dist/native-worker/http-server.d.ts +24 -0
  356. package/dist/native-worker/http-server.js +113 -0
  357. package/dist/native-worker/http-transport.d.ts +17 -0
  358. package/dist/native-worker/http-transport.js +88 -0
  359. package/dist/native-worker/kubernetes-isolation.d.ts +90 -0
  360. package/dist/native-worker/kubernetes-isolation.js +218 -0
  361. package/dist/native-worker/kubernetes-launcher.d.ts +106 -0
  362. package/dist/native-worker/kubernetes-launcher.js +375 -0
  363. package/dist/native-worker/launch.d.ts +62 -0
  364. package/dist/native-worker/launch.js +49 -0
  365. package/dist/native-worker/ledger.d.ts +125 -0
  366. package/dist/native-worker/ledger.js +245 -0
  367. package/dist/native-worker/loopback.d.ts +12 -0
  368. package/dist/native-worker/loopback.js +44 -0
  369. package/dist/native-worker/main.d.ts +8 -0
  370. package/dist/native-worker/main.js +85 -0
  371. package/dist/native-worker/protocol.d.ts +296 -0
  372. package/dist/native-worker/protocol.js +246 -0
  373. package/dist/native-worker/sandbox-executor.d.ts +83 -0
  374. package/dist/native-worker/sandbox-executor.js +284 -0
  375. package/dist/native-worker/stderr-redaction.d.ts +77 -0
  376. package/dist/native-worker/stderr-redaction.js +237 -0
  377. package/dist/native-worker/stdio.d.ts +29 -0
  378. package/dist/native-worker/stdio.js +189 -0
  379. package/dist/native-worker/warm-delivery.d.ts +16 -0
  380. package/dist/native-worker/warm-delivery.js +33 -0
  381. package/dist/native-worker/warm-pool-ledger.d.ts +39 -0
  382. package/dist/native-worker/warm-pool-ledger.js +73 -0
  383. package/dist/native-worker/warm-pool.d.ts +107 -0
  384. package/dist/native-worker/warm-pool.js +283 -0
  385. package/dist/native-worker/worker.d.ts +17 -0
  386. package/dist/native-worker/worker.js +141 -0
  387. package/dist/observability/metrics.js +6 -1
  388. package/dist/providers/auth/authorization-server.d.ts +3 -0
  389. package/dist/providers/auth/index.js +2 -0
  390. package/dist/providers/auth/self-hosted.d.ts +14 -2
  391. package/dist/providers/auth/self-hosted.js +54 -4
  392. package/dist/providers/chat/fake.d.ts +46 -0
  393. package/dist/providers/chat/fake.js +39 -0
  394. package/dist/providers/chat/index.d.ts +4 -0
  395. package/dist/providers/chat/index.js +8 -0
  396. package/dist/providers/chat/slack.d.ts +37 -0
  397. package/dist/providers/chat/slack.js +105 -0
  398. package/dist/providers/chat/types.d.ts +42 -0
  399. package/dist/providers/chat/types.js +19 -0
  400. package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
  401. package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
  402. package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
  403. package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
  404. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
  405. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
  406. package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
  407. package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
  408. package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
  409. package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
  410. package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
  411. package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
  412. package/dist/providers/coding-proxy/hold.d.ts +32 -0
  413. package/dist/providers/coding-proxy/hold.js +86 -0
  414. package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
  415. package/dist/providers/coding-proxy/interrupted.js +104 -0
  416. package/dist/providers/coding-proxy/memory-ledger.d.ts +15 -2
  417. package/dist/providers/coding-proxy/memory-ledger.js +84 -8
  418. package/dist/providers/coding-proxy/metering.d.ts +16 -0
  419. package/dist/providers/coding-proxy/metering.js +27 -4
  420. package/dist/providers/coding-proxy/prisma-ledger.d.ts +15 -2
  421. package/dist/providers/coding-proxy/prisma-ledger.js +179 -67
  422. package/dist/providers/coding-proxy/proxy.d.ts +14 -1
  423. package/dist/providers/coding-proxy/proxy.js +166 -14
  424. package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
  425. package/dist/providers/coding-proxy/registry/audit.js +94 -17
  426. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
  427. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
  428. package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
  429. package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
  430. package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
  431. package/dist/providers/coding-proxy/registry/plan.js +201 -48
  432. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
  433. package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
  434. package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
  435. package/dist/providers/coding-proxy/registry/service.js +579 -112
  436. package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
  437. package/dist/providers/coding-proxy/registry/store.js +54 -1
  438. package/dist/providers/coding-proxy/runtime.d.ts +4 -0
  439. package/dist/providers/coding-proxy/runtime.js +78 -16
  440. package/dist/providers/coding-proxy/server.d.ts +6 -1
  441. package/dist/providers/coding-proxy/server.js +45 -1
  442. package/dist/providers/coding-proxy/types.d.ts +65 -1
  443. package/dist/providers/datastore/types.d.ts +5 -0
  444. package/dist/providers/engine/types.d.ts +36 -2
  445. package/dist/providers/engine/types.js +39 -0
  446. package/dist/providers/executor/composition.d.ts +31 -1
  447. package/dist/providers/executor/composition.js +81 -8
  448. package/dist/providers/executor/container.d.ts +385 -9
  449. package/dist/providers/executor/container.js +1234 -99
  450. package/dist/providers/executor/dbos-status.d.ts +31 -0
  451. package/dist/providers/executor/dbos-status.js +64 -0
  452. package/dist/providers/executor/dbos.d.ts +91 -0
  453. package/dist/providers/executor/dbos.js +319 -26
  454. package/dist/providers/executor/deferred.d.ts +44 -0
  455. package/dist/providers/executor/deferred.js +100 -0
  456. package/dist/providers/executor/in-process.d.ts +9 -1
  457. package/dist/providers/executor/in-process.js +14 -4
  458. package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
  459. package/dist/providers/executor/linked-issue-reader.js +30 -0
  460. package/dist/providers/executor/routing.d.ts +39 -10
  461. package/dist/providers/executor/routing.js +77 -32
  462. package/dist/providers/executor/types.d.ts +25 -0
  463. package/dist/providers/index.d.ts +2 -1
  464. package/dist/providers/issue-tracker/types.d.ts +17 -0
  465. package/dist/providers/issue-tracker/types.js +39 -1
  466. package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
  467. package/dist/providers/jobs/claude-tool-setup.js +5 -2
  468. package/dist/providers/jobs/docker-isolation.d.ts +8 -0
  469. package/dist/providers/jobs/docker-isolation.js +17 -0
  470. package/dist/providers/jobs/docker.d.ts +1 -0
  471. package/dist/providers/jobs/docker.js +29 -4
  472. package/dist/providers/jobs/fake-kubernetes-api.d.ts +23 -2
  473. package/dist/providers/jobs/fake-kubernetes-api.js +45 -1
  474. package/dist/providers/jobs/kubernetes-api.d.ts +25 -1
  475. package/dist/providers/jobs/kubernetes-api.js +17 -0
  476. package/dist/providers/jobs/kubernetes-client.d.ts +10 -1
  477. package/dist/providers/jobs/kubernetes-client.js +61 -3
  478. package/dist/providers/jobs/kubernetes-dry-run-fixture.d.ts +6 -1
  479. package/dist/providers/jobs/kubernetes-dry-run-fixture.js +6 -3
  480. package/dist/providers/jobs/kubernetes-isolation.d.ts +5 -1
  481. package/dist/providers/jobs/kubernetes-isolation.js +23 -1
  482. package/dist/providers/jobs/kubernetes-platform.d.ts +4 -1
  483. package/dist/providers/jobs/kubernetes-platform.js +38 -1
  484. package/dist/providers/jobs/kubernetes-preflight.d.ts +2 -1
  485. package/dist/providers/jobs/kubernetes-preflight.js +4 -2
  486. package/dist/providers/jobs/kubernetes.d.ts +42 -2
  487. package/dist/providers/jobs/kubernetes.js +178 -19
  488. package/dist/providers/jobs/metadata-probes.d.ts +11 -0
  489. package/dist/providers/jobs/metadata-probes.js +13 -0
  490. package/dist/providers/jobs/types.d.ts +42 -0
  491. package/dist/providers/jobs/types.js +13 -1
  492. package/dist/providers/llm/anthropic.js +5 -1
  493. package/dist/providers/llm/bedrock.d.ts +0 -12
  494. package/dist/providers/llm/bedrock.js +4 -0
  495. package/dist/providers/llm/claude-messages.d.ts +3 -1
  496. package/dist/providers/llm/claude-messages.js +4 -1
  497. package/dist/providers/llm/claude-provider.d.ts +2 -2
  498. package/dist/providers/llm/claude-provider.js +2 -2
  499. package/dist/providers/llm/openai.d.ts +2 -2
  500. package/dist/providers/llm/openai.js +6 -2
  501. package/dist/providers/llm/routing.d.ts +2 -2
  502. package/dist/providers/llm/routing.js +2 -2
  503. package/dist/providers/llm/types.d.ts +12 -2
  504. package/dist/providers/review-host/github-events.d.ts +9 -1
  505. package/dist/providers/review-host/github-events.js +34 -12
  506. package/dist/providers/review-host/github.d.ts +39 -2
  507. package/dist/providers/review-host/github.js +274 -29
  508. package/dist/providers/review-host/local.d.ts +8 -4
  509. package/dist/providers/review-host/local.js +49 -31
  510. package/dist/providers/review-host/patch-pages.d.ts +41 -0
  511. package/dist/providers/review-host/patch-pages.js +176 -0
  512. package/dist/providers/review-host/review-format.d.ts +19 -1
  513. package/dist/providers/review-host/review-format.js +38 -7
  514. package/dist/providers/review-host/types.d.ts +157 -2
  515. package/dist/providers/review-host/types.js +8 -0
  516. package/dist/providers/storage/gcs.d.ts +63 -0
  517. package/dist/providers/storage/gcs.js +69 -0
  518. package/dist/providers/storage/index.d.ts +15 -0
  519. package/dist/providers/storage/index.js +14 -0
  520. package/dist/providers/storage/local.d.ts +24 -0
  521. package/dist/providers/storage/local.js +92 -0
  522. package/dist/providers/storage/meter.d.ts +14 -0
  523. package/dist/providers/storage/meter.js +34 -0
  524. package/dist/providers/storage/s3.d.ts +41 -0
  525. package/dist/providers/storage/s3.js +107 -0
  526. package/dist/providers/storage/types.d.ts +37 -3
  527. package/dist/providers/storage/types.js +21 -4
  528. package/dist/providers/vcs/git.d.ts +33 -2
  529. package/dist/providers/vcs/git.js +324 -22
  530. package/dist/providers/vcs/github-remote.d.ts +26 -3
  531. package/dist/providers/vcs/github-remote.js +124 -14
  532. package/dist/providers/vcs/github.d.ts +246 -12
  533. package/dist/providers/vcs/github.js +521 -61
  534. package/dist/providers/vcs/index.js +8 -1
  535. package/dist/providers/vcs/pr-description.d.ts +127 -0
  536. package/dist/providers/vcs/pr-description.js +270 -0
  537. package/dist/providers/vcs/remote.d.ts +33 -1
  538. package/dist/providers/vcs/routing.d.ts +4 -2
  539. package/dist/providers/vcs/routing.js +6 -0
  540. package/dist/providers/vcs/types.d.ts +80 -3
  541. package/dist/quickstart/coding-seed.d.ts +21 -3
  542. package/dist/quickstart/coding-seed.js +283 -3
  543. package/dist/quickstart/images.d.ts +2 -0
  544. package/dist/quickstart/images.js +7 -1
  545. package/dist/quickstart/reviewer-prompt.d.ts +1 -1
  546. package/dist/quickstart/reviewer-prompt.js +6 -6
  547. package/dist/quickstart-images.json +1 -1
  548. package/dist/sandbox/brokered-fetch.d.ts +23 -0
  549. package/dist/sandbox/brokered-fetch.js +37 -0
  550. package/dist/sandbox/generated/zod.bundle.js +62 -1
  551. package/dist/sandbox/generated/zod3.bundle.js +5 -0
  552. package/dist/sandbox/host-functions.d.ts +35 -0
  553. package/dist/sandbox/host-functions.js +150 -91
  554. package/dist/sandbox/prelude.js +7 -1
  555. package/dist/sandbox/run-in-sandbox.d.ts +19 -0
  556. package/dist/sandbox/run-in-sandbox.js +28 -10
  557. package/dist/sandbox/safe-fetch.d.ts +2 -0
  558. package/dist/sandbox/safe-fetch.js +3 -1
  559. package/dist/sandbox/secret-broker-sigv4.d.ts +2 -0
  560. package/dist/sandbox/secret-broker-sigv4.js +49 -0
  561. package/dist/sandbox/secret-broker.d.ts +34 -0
  562. package/dist/sandbox/secret-broker.js +161 -0
  563. package/dist/sandbox/tool-capabilities.d.ts +10 -30
  564. package/dist/sandbox/user-tool.d.ts +14 -0
  565. package/dist/sandbox/user-tool.js +32 -0
  566. package/dist/sandbox/zod-params.d.ts +37 -5
  567. package/dist/sandbox/zod-params.js +181 -26
  568. package/dist/serve.js +25 -0
  569. package/dist/viewer/api-schema.d.ts +372 -2454
  570. package/dist/viewer/api-schema.js +29 -0
  571. package/dist/viewer/build-schemas.js +10 -3
  572. package/dist/viewer/event-bus.d.ts +6 -0
  573. package/dist/viewer/event-bus.js +16 -7
  574. package/dist/viewer/graph.d.ts +5 -2
  575. package/dist/viewer/graph.js +7 -2
  576. package/dist/viewer/http.d.ts +0 -1
  577. package/dist/viewer/http.js +2 -2
  578. package/dist/viewer/infra.js +25 -2
  579. package/dist/viewer/limits.d.ts +4 -0
  580. package/dist/viewer/limits.js +4 -0
  581. package/dist/viewer/openapi.d.ts +15 -0
  582. package/dist/viewer/openapi.js +170 -0
  583. package/dist/wardby-bin.js +10 -0
  584. package/docs/README.md +7 -0
  585. package/docs/agent-recipes.md +114 -27
  586. package/docs/architecture-runtime.md +16 -1
  587. package/docs/code-review-agents.md +689 -45
  588. package/docs/coding-agent-setup.md +602 -12
  589. package/docs/coding-packages.md +1037 -92
  590. package/docs/coding-services.md +30 -13
  591. package/docs/coding-worker-byo-images.md +218 -6
  592. package/docs/coding-worker-isolation.md +173 -44
  593. package/docs/getting-started-gke.md +332 -129
  594. package/docs/getting-started-identity-provider.md +31 -11
  595. package/docs/getting-started.md +14 -4
  596. package/docs/jira-agents.md +22 -9
  597. package/docs/knowledge/blob-not-found-semantics.md +41 -0
  598. package/docs/knowledge/bounded-file-descriptor.md +52 -0
  599. package/docs/knowledge/delegation-admission-slots.md +52 -0
  600. package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
  601. package/docs/knowledge/import-rename-target.md +52 -0
  602. package/docs/knowledge/index.md +57 -0
  603. package/docs/knowledge/log.md +9 -0
  604. package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
  605. package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
  606. package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
  607. package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
  608. package/docs/knowledge/overview-cli.md +74 -0
  609. package/docs/knowledge/overview-coding-proxy.md +72 -0
  610. package/docs/knowledge/overview-coding.md +72 -0
  611. package/docs/knowledge/overview-config.md +60 -0
  612. package/docs/knowledge/overview-core.md +72 -0
  613. package/docs/knowledge/overview-deploy.md +83 -0
  614. package/docs/knowledge/overview-mcp.md +61 -0
  615. package/docs/knowledge/overview-prisma.md +72 -0
  616. package/docs/knowledge/overview-providers.md +89 -0
  617. package/docs/knowledge/overview-sandbox.md +83 -0
  618. package/docs/knowledge/overview-surfaces.md +83 -0
  619. package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
  620. package/docs/knowledge/proxy-settlement-projections.md +41 -0
  621. package/docs/knowledge/run-pricing-first-writer.md +43 -0
  622. package/docs/knowledge/schedule-claim-transaction.md +41 -0
  623. package/docs/knowledge/secret-entry-replica-contract.md +52 -0
  624. package/docs/knowledge/terminal-run-first-writer.md +41 -0
  625. package/docs/knowledge/transactional-agent-authorization.md +52 -0
  626. package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
  627. package/docs/knowledge/warm-input-publication.md +30 -0
  628. package/docs/knowledge/workspace-staging-failure.md +54 -0
  629. package/docs/knowledge.md +54 -14
  630. package/docs/native-sandbox.md +731 -0
  631. package/docs/observability.md +4 -0
  632. package/docs/release-verification.md +9 -0
  633. package/docs/security-deployment.md +146 -14
  634. package/docs/slack-notifications.md +268 -0
  635. package/docs/tool-secrets.md +284 -0
  636. package/docs/viewer-api.md +46 -5
  637. package/docs/viewer-api.openapi.yml +1404 -0
  638. package/help/admin-viewer.md +29 -3
  639. package/help/agent-recipes.md +27 -0
  640. package/help/architecture-agent.md +11 -6
  641. package/help/brokered-secrets.md +79 -0
  642. package/help/build-claude-code-image.md +131 -0
  643. package/help/build-worker-image.md +6 -7
  644. package/help/builder-agent.md +19 -6
  645. package/help/code-review-agents.md +243 -10
  646. package/help/coding-packages.md +156 -6
  647. package/help/cost-attribution.md +9 -5
  648. package/help/creating-agents.md +14 -1
  649. package/help/dependency-cache.md +143 -0
  650. package/help/deploy-gke.md +23 -9
  651. package/help/deployment-targets.md +25 -14
  652. package/help/errors/budget-exhausted.md +187 -0
  653. package/help/errors/budget-group-exhausted.md +5 -1
  654. package/help/errors/coding-provider-not-configured.md +2 -2
  655. package/help/errors/coding-stream-quota-exceeded.md +33 -0
  656. package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
  657. package/help/errors/continuation-closed.md +9 -12
  658. package/help/errors/database-auth-invalid.md +28 -0
  659. package/help/errors/delegation-conflict.md +24 -0
  660. package/help/errors/file-list-truncated.md +45 -0
  661. package/help/errors/full-read-required.md +49 -0
  662. package/help/errors/github-account-not-allowed.md +29 -0
  663. package/help/errors/graph-incomplete.md +43 -0
  664. package/help/errors/graph-limit.md +43 -0
  665. package/help/errors/low-power-disabled.md +29 -0
  666. package/help/errors/low-power-scale-forbidden.md +35 -0
  667. package/help/errors/low-power-wake-timeout.md +30 -0
  668. package/help/errors/merge-conflict.md +49 -0
  669. package/help/errors/mobile-disabled.md +31 -0
  670. package/help/errors/native-sandbox-capacity.md +22 -0
  671. package/help/errors/native-sandbox-deadline-exceeded.md +19 -0
  672. package/help/errors/native-sandbox-docker-failed.md +20 -0
  673. package/help/errors/native-sandbox-gateway-error.md +20 -0
  674. package/help/errors/native-sandbox-gateway-unavailable.md +21 -0
  675. package/help/errors/native-sandbox-image-not-pinned.md +19 -0
  676. package/help/errors/native-sandbox-isolation-mismatch.md +20 -0
  677. package/help/errors/native-sandbox-launch-abandoned.md +21 -0
  678. package/help/errors/native-sandbox-network-unenforced.md +22 -0
  679. package/help/errors/native-sandbox-requires-catalog.md +31 -0
  680. package/help/errors/native-sandbox-unavailable.md +19 -0
  681. package/help/errors/native-sandbox-warm-delivery-failed.md +21 -0
  682. package/help/errors/native-sandbox-worker-exited.md +21 -0
  683. package/help/errors/native-sandbox-worker-lost.md +20 -0
  684. package/help/errors/native-sandbox-worker-unready.md +22 -0
  685. package/help/errors/package-not-allowed-pending.md +52 -0
  686. package/help/errors/package-not-allowed.md +51 -0
  687. package/help/errors/package-refusals.md +43 -0
  688. package/help/errors/patch-cursor-malformed.md +31 -0
  689. package/help/errors/run-lost.md +39 -0
  690. package/help/errors/run-transcript-download.md +44 -0
  691. package/help/errors/secret-broker-body-invalid.md +26 -0
  692. package/help/errors/secret-broker-changed.md +20 -0
  693. package/help/errors/secret-broker-config-invalid.md +30 -0
  694. package/help/errors/secret-broker-conflict.md +27 -0
  695. package/help/errors/secret-broker-destination-denied.md +28 -0
  696. package/help/errors/secret-broker-value-invalid.md +28 -0
  697. package/help/errors/secret-brokered.md +24 -0
  698. package/help/errors/secret-in-value.md +69 -0
  699. package/help/errors/secret-not-brokered.md +25 -0
  700. package/help/errors/slack-auth-failed.md +48 -0
  701. package/help/errors/slack-channel-unreachable.md +39 -0
  702. package/help/errors/slack-not-configured.md +33 -0
  703. package/help/errors/target-merge.md +40 -0
  704. package/help/fix-merge-conflicts.md +73 -0
  705. package/help/getting-started.md +4 -5
  706. package/help/github-app-setup.md +132 -0
  707. package/help/github.md +40 -1
  708. package/help/identity-and-access.md +7 -1
  709. package/help/jira.md +23 -6
  710. package/help/knowledge.md +16 -7
  711. package/help/local-repositories.md +3 -4
  712. package/help/low-power-mode.md +131 -0
  713. package/help/merge-order-check.md +122 -0
  714. package/help/mobile-app.md +54 -0
  715. package/help/native-capabilities.md +29 -1
  716. package/help/native-sandbox.md +150 -0
  717. package/help/observability.md +8 -0
  718. package/help/operating-agents.md +5 -0
  719. package/help/package-audit-mode.md +91 -0
  720. package/help/related-pull-requests.md +80 -16
  721. package/help/repo-instructions-and-skills.md +91 -0
  722. package/help/resume-runs-locally.md +131 -0
  723. package/help/review-fix-rounds.md +43 -1
  724. package/help/sharing-agents.md +59 -0
  725. package/help/slack-notifications.md +76 -0
  726. package/help/status-comments.md +31 -0
  727. package/help/stop-run.md +58 -0
  728. package/help/troubleshooting/budgets.md +28 -0
  729. package/help/troubleshooting/coding-workers.md +99 -7
  730. package/package.json +27 -13
  731. package/prisma/migrations/20261009000003_native_execution_mode/migration.sql +12 -0
  732. package/prisma/migrations/20261009000004_native_gateway_ledger/migration.sql +65 -0
  733. package/prisma/migrations/20261009000005_native_gateway_call_child_agent/migration.sql +5 -0
  734. package/prisma/migrations/20261009000006_run_deferred_start_stop/migration.sql +14 -0
  735. package/prisma/migrations/20261009000007_native_gateway_network_ready/migration.sql +5 -0
  736. package/prisma/migrations/20261010000001_workflow_notifications/migration.sql +99 -0
  737. package/prisma/migrations/20261011000001_native_gateway_session_status_index/migration.sql +2 -0
  738. package/prisma/migrations/20261012000001_native_warm_worker/migration.sql +32 -0
  739. package/prisma/migrations/20261013000001_coding_run_merge_order/migration.sql +2 -0
  740. package/prisma/migrations/20261013000001_secret_broker/migration.sql +17 -0
  741. package/prisma/migrations/20261013000002_deferred_review_request/migration.sql +4 -0
  742. package/prisma/migrations/20261014000000_repo_skills/migration.sql +15 -0
  743. package/prisma/migrations/20261015000001_coding_run_merge_order_index/migration.sql +2 -0
  744. package/prisma/migrations/20261015000002_no_change_rereview/migration.sql +2 -0
  745. package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
  746. package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
  747. package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
  748. package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
  749. package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
  750. package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
  751. package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
  752. package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
  753. package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
  754. package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
  755. package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
  756. package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
  757. package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
  758. package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
  759. package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
  760. package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
  761. package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
  762. package/prisma/schema.prisma +631 -146
  763. package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
@@ -8,28 +8,44 @@
8
8
  import { Prisma } from "#prisma";
9
9
  import { z } from "zod";
10
10
  import { CodingProfilePatchSchema, CodingProfileSchema } from "../../coding/profile.js";
11
- import { DEFAULT_CLAUDE_MAX_TURNS, MAX_CODING_TURNS, isLocalRepository } from "../../coding/protocol.js";
11
+ 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";
12
+ import { loadBlobStoreConfig, loadContainerExecutorConfig } from "../../config/providers.js";
12
13
  import { codingProviderSupportsModel } from "../../coding/provider.js";
14
+ import { ACCEPTED_ADVISORY_ID, MAX_ACCEPTED_ADVISORIES } from "../../coding/registry/allowlist.js";
15
+ import { DEFAULT_PACKAGE_AUDIT_MINUTES, isPackageAuditActive, isPackageAuditMode, MAX_PACKAGE_AUDIT_MINUTES, PACKAGE_AUDIT_MODES, PackageAuditPatchError, packageAuditActiveWarning, resolvePackageAuditPatch, } from "../../coding/registry/audit-mode.js";
13
16
  import { assertAgentModelAvailable } from "../../core/run-pricing.js";
14
17
  import { ModelUnavailableError } from "../../providers/llm/catalog-types.js";
15
18
  import { currentModelCatalog } from "../../providers/llm/catalog-store.js";
16
19
  import { validateCronExpression } from "../../core/cron.js";
20
+ import { scheduleStartFields } from "../../core/schedule-start.js";
17
21
  import { modelSupportedEfforts } from "../../providers/llm/routing.js";
18
22
  import { PROJECT_KEY } from "../../providers/issue-tracker/types.js";
19
23
  import { LLM_EFFORT_LEVELS, isLlmEffort } from "../../providers/llm/types.js";
20
24
  import { requireReadableBudgetGroup } from "../auth/ownership.js";
21
25
  import { agentAccessResolver, agentNotFound, assertAgentAccess, readableAgentsWhere, requireAgentAccess, } from "../auth/access.js";
22
- import { EVERYONE_KEY, atLeast, canDelegate, deleteGrantsFor, effectiveAccess } from "../../core/grants.js";
26
+ import { EVERYONE_KEY, atLeast, canDelegate, deleteGrantsFor, effectiveAccess, isPublicWritable, } from "../../core/grants.js";
23
27
  import { projectTool } from "./tools.js";
28
+ import { withZod3ToolWarnings } from "../../core/zod3-window.js";
24
29
  import { requireAnyScope, requireScope } from "../auth/resource-server.js";
25
30
  import { logger } from "../../core/logger.js";
26
31
  import { authorizeRepositoryForSet, canonicalLocalRepository, } from "../auth/repo-authorization.js";
27
32
  import { McpError } from "../errors.js";
28
33
  import { textResult } from "./text-result.js";
34
+ function validateWorkspaceDiskMb(workspaceDiskMb) {
35
+ if (workspaceDiskMb == null)
36
+ return;
37
+ const { maxDiskMb } = loadContainerExecutorConfig();
38
+ if (workspaceDiskMb > maxDiskMb) {
39
+ throw new McpError(400, `workspaceDiskMb (${workspaceDiskMb} MiB) exceeds the deployment cap (${maxDiskMb} MiB). Raise CODING_MAX_DISK_MB to allow this size.`);
40
+ }
41
+ }
29
42
  // workerImageRef is the BYO-arbitrary-image escape hatch (see
30
- // resolveCodingWorkerImage in container.ts) — setting or changing it
31
- // requires a step-up beyond agents:write, the same pattern make_owner below
32
- // uses for its own sensitive, ownership-bypassing mutation.
43
+ // resolveCodingWorkerImage/resolveCodingToolImage in container.ts). For a Codex agent it
44
+ // replaces the one container that runs the whole agent; for a Claude Code agent it replaces
45
+ // only the tool-runner container that runs the agent's commands, never the agent container
46
+ // (which always stays the deployment's standard Claude Code image). Either way, setting or
47
+ // changing it requires a step-up beyond agents:write, the same pattern make_owner below uses
48
+ // for its own sensitive, ownership-bypassing mutation.
33
49
  function requireWorkerImageRefScope(ctx) {
34
50
  requireScope(ctx, ctx.canonicalUri, "agents:admin");
35
51
  }
@@ -54,12 +70,63 @@ const MAX_DELEGATIONS_PER_RUN = 20;
54
70
  const PARALLEL_DELEGATIONS_DESCRIPTION = "Native agents with sub-agents: when true, the delegate_to_* calls the agent makes in one model turn run at the same time " +
55
71
  "instead of one after another (other tool calls still run in order). The run tree still shares one budget, so later " +
56
72
  "sub-agents get what earlier ones leave. Coding sub-agents still queue for CODING_MAX_CONCURRENT slots. Default false.";
73
+ /** Operator-facing spellings of Agent.nativeExecutionMode (the Prisma enum is `control_plane` | `sandbox`). */
74
+ const NATIVE_EXECUTION_MODES = ["control-plane", "sandbox"];
75
+ const toStoredMode = (mode) => mode === "sandbox" ? "sandbox" : "control_plane";
76
+ /** An agent row as returned to operators: the mode in its hyphenated spelling, null for coding agents. */
77
+ function withOperatorMode(agent) {
78
+ return {
79
+ ...agent,
80
+ nativeExecutionMode: agent.kind !== "native" ? null : agent.nativeExecutionMode === "sandbox" ? "sandbox" : "control-plane",
81
+ };
82
+ }
83
+ /** The warning create_agent / update_agent return (not a refusal): wardby can't tell how old a custom image is. */
84
+ 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.";
85
+ 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).";
86
+ 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.";
87
+ /** For a warning only: a half-set BLOB_STORE (which throws) counts as none, and never fails the tool call. */
88
+ function blobStoreConfigured() {
89
+ try {
90
+ return loadBlobStoreConfig(process.env) !== undefined;
91
+ }
92
+ catch {
93
+ return false;
94
+ }
95
+ }
96
+ /** Non-blocking warnings about an agent's coding profile as stored. */
97
+ function profileWarnings(profile, now) {
98
+ const warnings = profile?.dependencyCache && profile.workerImageRef ? [DEPENDENCY_CACHE_IMAGE_WARNING] : [];
99
+ if (profile?.sessionResume && profile.workerImageRef)
100
+ warnings.push(SESSION_RESUME_IMAGE_WARNING);
101
+ if (profile?.sessionResume && !blobStoreConfigured())
102
+ warnings.push(SESSION_RESUME_NO_STORE_WARNING);
103
+ if (profile && isPackageAuditActive(profile.packageAuditMode, profile.packageAuditUntil, now))
104
+ warnings.push(packageAuditActiveWarning(profile.packageAuditMode, profile.packageAuditUntil));
105
+ return warnings;
106
+ }
107
+ /** An agent as returned to operators: profile warnings, and whether package audit mode is in force now. */
108
+ function withProfileWarnings(agent) {
109
+ const now = new Date();
110
+ const profile = agent.codingProfile;
111
+ const shown = profile
112
+ ? {
113
+ ...agent,
114
+ codingProfile: {
115
+ ...profile,
116
+ packageAuditActive: isPackageAuditActive(profile.packageAuditMode, profile.packageAuditUntil, now),
117
+ },
118
+ }
119
+ : agent;
120
+ const warnings = profileWarnings(profile, now);
121
+ return warnings.length ? { ...shown, warnings } : shown;
122
+ }
57
123
  const agentFields = {
58
124
  name: z.string().trim().min(1).max(MAX_AGENT_NAME_CHARS),
59
125
  systemPrompt: z.string().min(1).max(MAX_SYSTEM_PROMPT_CHARS),
60
126
  model: z.string().trim().min(1).max(MAX_MODEL_CHARS),
61
127
  budgetUsd: z.number().finite().positive().max(MAX_BUDGET_USD),
62
128
  maxTurns: z.number().int().min(1).max(100),
129
+ allowedOverrunPercent: z.number().int().min(0).max(100),
63
130
  maxDelegationsPerRun: z.number().int().min(1).max(MAX_DELEGATIONS_PER_RUN),
64
131
  parallelDelegations: z.boolean(),
65
132
  schedule: z.string().trim().min(1).max(256),
@@ -69,6 +136,7 @@ const agentFields = {
69
136
  budgetGroupId: z.string().min(1).max(128),
70
137
  memoryEnabled: z.boolean(),
71
138
  effort: z.enum(LLM_EFFORT_LEVELS),
139
+ nativeExecutionMode: z.enum(NATIVE_EXECUTION_MODES),
72
140
  defectProjectKey: z.string().regex(PROJECT_KEY, "must be an upper-case Jira project key"),
73
141
  defectIssueType: z.string().trim().min(1).max(100),
74
142
  };
@@ -93,6 +161,7 @@ const CreateAgentSchema = z
93
161
  model: agentFields.model,
94
162
  budgetUsd: agentFields.budgetUsd,
95
163
  maxTurns: agentFields.maxTurns.optional(),
164
+ allowedOverrunPercent: agentFields.allowedOverrunPercent.optional(),
96
165
  maxDelegationsPerRun: agentFields.maxDelegationsPerRun.optional(),
97
166
  parallelDelegations: agentFields.parallelDelegations.optional(),
98
167
  schedule: agentFields.schedule.optional(),
@@ -102,6 +171,7 @@ const CreateAgentSchema = z
102
171
  budgetGroupId: agentFields.budgetGroupId.optional(),
103
172
  memoryEnabled: agentFields.memoryEnabled.default(false),
104
173
  effort: agentFields.effort.optional(),
174
+ nativeExecutionMode: agentFields.nativeExecutionMode.optional(),
105
175
  defectProjectKey: agentFields.defectProjectKey.optional(),
106
176
  defectIssueType: agentFields.defectIssueType.optional(),
107
177
  codingProfile: CodingProfileSchema.optional(),
@@ -149,6 +219,7 @@ const UpdateAgentSchema = z
149
219
  model: agentFields.model.optional(),
150
220
  budgetUsd: agentFields.budgetUsd.optional(),
151
221
  maxTurns: agentFields.maxTurns.optional(),
222
+ allowedOverrunPercent: agentFields.allowedOverrunPercent.optional(),
152
223
  maxDelegationsPerRun: agentFields.maxDelegationsPerRun.optional(),
153
224
  parallelDelegations: agentFields.parallelDelegations.optional(),
154
225
  schedule: agentFields.schedule.nullable().optional(),
@@ -158,11 +229,18 @@ const UpdateAgentSchema = z
158
229
  budgetGroupId: agentFields.budgetGroupId.nullable().optional(),
159
230
  memoryEnabled: agentFields.memoryEnabled.optional(),
160
231
  effort: agentFields.effort.nullable().optional(),
232
+ nativeExecutionMode: agentFields.nativeExecutionMode.optional(),
161
233
  defectProjectKey: agentFields.defectProjectKey.nullable().optional(),
162
234
  defectIssueType: agentFields.defectIssueType.nullable().optional(),
163
235
  codingProfile: CodingProfilePatchSchema.extend({
164
236
  /** Not a stored profile field: sets CodingAgentProfile.debugTraceUntil = now + minutes (null clears). */
165
237
  debugTraceMinutes: z.number().int().min(1).max(MAX_DEBUG_TRACE_MINUTES).nullable().optional(),
238
+ /** Admin-only like debugTraceMinutes: CodingAgentProfile.debugTraceMaxMb (null = the default). */
239
+ debugTraceMaxMb: z.number().int().min(1).max(MAX_DEBUG_TRACE_MAX_MB).nullable().optional(),
240
+ /** Not stored as given: sets CodingAgentProfile.packageAuditMode and packageAuditUntil (null clears both). */
241
+ packageAuditMode: z.enum(PACKAGE_AUDIT_MODES).nullable().optional(),
242
+ /** Not a stored field: the audit window, in minutes from now (default 24 hours). */
243
+ packageAuditMinutes: z.number().int().min(1).max(MAX_PACKAGE_AUDIT_MINUTES).optional(),
166
244
  }).optional(),
167
245
  repositoryAdminOverride: z.boolean().optional(),
168
246
  })
@@ -210,7 +288,10 @@ const profileJsonSchema = {
210
288
  collectExclude: { type: "array", maxItems: 64, items: { type: "string" } },
211
289
  toolchain: { type: "string", enum: ["node", "node-python"] },
212
290
  toolchainVersion: { type: ["string", "null"] },
213
- workerImageRef: { type: ["string", "null"] },
291
+ workerImageRef: {
292
+ type: ["string", "null"],
293
+ description: "A digest-pinned custom image that this agent's commands run in, for your own languages and tools. Codex: build it FROM the coding-worker driver image; it runs the whole agent. Claude Code: build it FROM this release's wardby-claude-tool-runner image; it runs the agent's commands, while Claude Code itself stays on the standard image. Needs agents:admin. Null uses the toolchain's standard image.",
294
+ },
214
295
  workspaceDiskMb: {
215
296
  type: ["integer", "null"],
216
297
  minimum: 64,
@@ -223,6 +304,28 @@ const profileJsonSchema = {
223
304
  maximum: MAX_CODING_TURNS,
224
305
  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.`,
225
306
  },
307
+ maxOutputTokens: {
308
+ type: ["integer", "null"],
309
+ minimum: MIN_CLAUDE_MAX_OUTPUT_TOKENS,
310
+ maximum: MAX_CLAUDE_MAX_OUTPUT_TOKENS,
311
+ 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.`,
312
+ },
313
+ repoSkills: {
314
+ type: "boolean",
315
+ 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.",
316
+ },
317
+ claudeBareMode: {
318
+ type: "boolean",
319
+ 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.",
320
+ },
321
+ dependencyCache: {
322
+ type: "boolean",
323
+ 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.",
324
+ },
325
+ sessionResume: {
326
+ type: "boolean",
327
+ 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.",
328
+ },
226
329
  packageAllowlist: {
227
330
  type: "object",
228
331
  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.",
@@ -230,7 +333,16 @@ const profileJsonSchema = {
230
333
  },
231
334
  packagePolicy: {
232
335
  type: "object",
233
- properties: { minReleaseAgeDays: { type: "integer", minimum: 0, maximum: 30 } },
336
+ 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.",
337
+ properties: {
338
+ minReleaseAgeDays: { type: "integer", minimum: 0, maximum: 30 },
339
+ acceptedAdvisories: {
340
+ type: "array",
341
+ maxItems: MAX_ACCEPTED_ADVISORIES,
342
+ uniqueItems: true,
343
+ items: { type: "string", pattern: ACCEPTED_ADVISORY_ID.source },
344
+ },
345
+ },
234
346
  additionalProperties: false,
235
347
  },
236
348
  services: {
@@ -285,6 +397,23 @@ function validateEffort(kind, model, effort) {
285
397
  : "It accepts no effort setting; leave effort unset (or null)."));
286
398
  }
287
399
  }
400
+ const NATIVE_SANDBOX_MODE_DESCRIPTION = "Where a native agent's runs execute: control-plane (default, in the server process) or sandbox (an isolated container; needs the server's native sandbox configured).";
401
+ /**
402
+ * The mode only applies to native agents, and `sandbox` only works where the
403
+ * server composed a native sandbox executor; refuse it otherwise rather than
404
+ * store a mode whose every run would fail closed.
405
+ */
406
+ function validateNativeExecutionMode(ctx, kind, mode) {
407
+ if (mode == null)
408
+ return;
409
+ if (kind !== "native") {
410
+ throw new McpError(400, "nativeExecutionMode is only valid for native agents; coding agents do not use it.");
411
+ }
412
+ if (mode === "sandbox" && ctx.providers.executor.supportsNativeSandbox?.() !== true) {
413
+ throw new McpError(400, "native_sandbox_unavailable: this server has no native sandbox configured (set NATIVE_SANDBOX_LAUNCHER), " +
414
+ 'so an agent cannot use nativeExecutionMode "sandbox".');
415
+ }
416
+ }
288
417
  /**
289
418
  * A model being set (create, or update with `model`) must be runnable here:
290
419
  * in the catalog and enabled; for a native agent, its provider must also be
@@ -319,9 +448,14 @@ function storedProfile(profile) {
319
448
  workerImageRef: profile.workerImageRef,
320
449
  workspaceDiskMb: profile.workspaceDiskMb,
321
450
  maxTurns: profile.maxTurns,
451
+ maxOutputTokens: profile.maxOutputTokens,
322
452
  packageAllowlist: profile.packageAllowlist,
323
453
  packagePolicy: profile.packagePolicy,
324
454
  services: profile.services,
455
+ repoSkills: profile.repoSkills,
456
+ claudeBareMode: profile.claudeBareMode,
457
+ dependencyCache: profile.dependencyCache,
458
+ sessionResume: profile.sessionResume,
325
459
  });
326
460
  }
327
461
  /** A service name an agent is allowed must exist in the catalog (any version); typos fail here, not at a run. */
@@ -347,6 +481,12 @@ export function registerAgentTools(mcp) {
347
481
  model: { type: "string" },
348
482
  budgetUsd: { type: "number" },
349
483
  maxTurns: { type: "integer" },
484
+ allowedOverrunPercent: {
485
+ type: "integer",
486
+ minimum: 0,
487
+ maximum: 100,
488
+ 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.",
489
+ },
350
490
  maxDelegationsPerRun: {
351
491
  type: "integer",
352
492
  minimum: 1,
@@ -366,6 +506,11 @@ export function registerAgentTools(mcp) {
366
506
  enum: [...LLM_EFFORT_LEVELS],
367
507
  description: "Reasoning effort for native agents. Unset uses the provider default.",
368
508
  },
509
+ nativeExecutionMode: {
510
+ type: "string",
511
+ enum: [...NATIVE_EXECUTION_MODES],
512
+ description: NATIVE_SANDBOX_MODE_DESCRIPTION,
513
+ },
369
514
  defectProjectKey: { type: "string", pattern: PROJECT_KEY.source, description: DEFECT_DESCRIPTION },
370
515
  defectIssueType: { type: "string", minLength: 1, maxLength: 100, description: DEFECT_DESCRIPTION },
371
516
  codingProfile: { ...profileJsonSchema, required: ["repository"] },
@@ -380,17 +525,24 @@ export function registerAgentTools(mcp) {
380
525
  const packages = args.codingProfile;
381
526
  if (packages &&
382
527
  (Object.keys(packages.packageAllowlist ?? {}).length > 0 ||
383
- Object.keys(packages.packagePolicy ?? {}).length > 0))
528
+ Object.keys(packages.packagePolicy ?? {}).length > 0 ||
529
+ packages.dependencyCache === true))
384
530
  requirePackageApproval(ctx);
385
531
  validateSchedule(args.schedule, args.timezone ?? "UTC");
386
532
  requireModelAvailable(ctx, args.model, args.kind);
387
533
  validateEffort(args.kind, args.model, args.effort);
534
+ validateNativeExecutionMode(ctx, args.kind, args.nativeExecutionMode);
535
+ validateWorkspaceDiskMb(args.codingProfile?.workspaceDiskMb);
388
536
  if (args.codingProfile)
389
537
  await requireCatalogServiceNames(ctx.db, args.codingProfile.services);
390
538
  if (args.budgetGroupId) {
391
539
  await requireReadableBudgetGroup(ctx.db, args.budgetGroupId, ctx.principal.id);
392
540
  }
393
- const { codingProfile, repositoryAdminOverride, ...agentData } = args;
541
+ const { codingProfile, repositoryAdminOverride, nativeExecutionMode, ...agentFieldsData } = args;
542
+ const agentData = {
543
+ ...agentFieldsData,
544
+ ...(nativeExecutionMode ? { nativeExecutionMode: toStoredMode(nativeExecutionMode) } : {}),
545
+ };
394
546
  if (repositoryAdminOverride === true && !codingProfile) {
395
547
  throw new McpError(400, "repositoryAdminOverride only applies with a codingProfile repository.");
396
548
  }
@@ -407,6 +559,11 @@ export function registerAgentTools(mcp) {
407
559
  const agent = await ctx.db.agent.create({
408
560
  data: {
409
561
  ...agentData,
562
+ ...(await scheduleStartFields(ctx.db, null, {
563
+ schedule: agentData.schedule ?? null,
564
+ timezone: agentData.timezone ?? "UTC",
565
+ scheduleEnabled: agentData.scheduleEnabled ?? true,
566
+ })),
410
567
  ownerId: ctx.principal.id,
411
568
  ...(codingProfile && authorization
412
569
  ? { codingProfile: { create: { ...codingProfile, ...profileStamp(authorization) } } }
@@ -414,7 +571,7 @@ export function registerAgentTools(mcp) {
414
571
  },
415
572
  include: { codingProfile: true },
416
573
  });
417
- return textResult(agent);
574
+ return textResult(withProfileWarnings(withOperatorMode(agent)));
418
575
  },
419
576
  });
420
577
  mcp.registerTool({
@@ -430,6 +587,12 @@ export function registerAgentTools(mcp) {
430
587
  model: { type: "string" },
431
588
  budgetUsd: { type: "number" },
432
589
  maxTurns: { type: "integer" },
590
+ allowedOverrunPercent: {
591
+ type: "integer",
592
+ minimum: 0,
593
+ maximum: 100,
594
+ 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.",
595
+ },
433
596
  maxDelegationsPerRun: {
434
597
  type: "integer",
435
598
  minimum: 1,
@@ -449,6 +612,11 @@ export function registerAgentTools(mcp) {
449
612
  enum: [...LLM_EFFORT_LEVELS, null],
450
613
  description: "Reasoning effort for native agents. Null clears it back to the provider default.",
451
614
  },
615
+ nativeExecutionMode: {
616
+ type: "string",
617
+ enum: [...NATIVE_EXECUTION_MODES],
618
+ description: NATIVE_SANDBOX_MODE_DESCRIPTION,
619
+ },
452
620
  defectProjectKey: {
453
621
  type: ["string", "null"],
454
622
  pattern: PROJECT_KEY.source,
@@ -470,6 +638,27 @@ export function registerAgentTools(mcp) {
470
638
  maximum: MAX_DEBUG_TRACE_MINUTES,
471
639
  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.",
472
640
  },
641
+ debugTraceMaxMb: {
642
+ type: ["integer", "null"],
643
+ minimum: 1,
644
+ maximum: MAX_DEBUG_TRACE_MAX_MB,
645
+ 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.`,
646
+ },
647
+ packageAuditMode: {
648
+ type: ["string", "null"],
649
+ enum: [...PACKAGE_AUDIT_MODES, null],
650
+ description: "Package audit mode, for a limited time (packageAuditMinutes). Needs packages:approve or agents:admin, and only the agent's owner may set it. " +
651
+ '"audit": the registry installs packages outside this agent\'s allowlist instead of refusing them, and records each one; ' +
652
+ '"full": also installs versions withheld only by high or critical advisories. Malware is refused and the release-age limit enforced in every mode. ' +
653
+ "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. " +
654
+ "Fixed per run when the run is dispatched. Null turns it off.",
655
+ },
656
+ packageAuditMinutes: {
657
+ type: "integer",
658
+ minimum: 1,
659
+ maximum: MAX_PACKAGE_AUDIT_MINUTES,
660
+ 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.`,
661
+ },
473
662
  },
474
663
  },
475
664
  repositoryAdminOverride: REPOSITORY_ADMIN_OVERRIDE,
@@ -481,9 +670,18 @@ export function registerAgentTools(mcp) {
481
670
  if (args.codingProfile?.workerImageRef !== undefined)
482
671
  requireWorkerImageRefScope(ctx);
483
672
  const debugTraceMinutes = args.codingProfile?.debugTraceMinutes;
484
- if (debugTraceMinutes !== undefined)
673
+ const debugTraceMaxMb = args.codingProfile?.debugTraceMaxMb;
674
+ if (debugTraceMinutes !== undefined || debugTraceMaxMb !== undefined)
485
675
  requireDebugTraceScope(ctx);
486
- if (args.codingProfile?.packageAllowlist !== undefined || args.codingProfile?.packagePolicy !== undefined)
676
+ const auditPatch = {
677
+ packageAuditMode: args.codingProfile?.packageAuditMode,
678
+ packageAuditMinutes: args.codingProfile?.packageAuditMinutes,
679
+ };
680
+ if (args.codingProfile?.packageAllowlist !== undefined ||
681
+ args.codingProfile?.packagePolicy !== undefined ||
682
+ args.codingProfile?.dependencyCache !== undefined ||
683
+ auditPatch.packageAuditMode !== undefined ||
684
+ auditPatch.packageAuditMinutes !== undefined)
487
685
  requirePackageApproval(ctx);
488
686
  // Repository authorization calls GitHub, so it runs before (outside) the
489
687
  // serializable transaction, on a pre-read; the transaction then verifies
@@ -554,6 +752,7 @@ export function registerAgentTools(mcp) {
554
752
  : debugTraceMinutes === null
555
753
  ? null
556
754
  : new Date(Date.now() + debugTraceMinutes * 60_000);
755
+ let auditSet;
557
756
  const agent = await ctx.db.$transaction(async (tx) => {
558
757
  const existing = await tx.agent.findUnique({ where: { id: args.id }, include: { codingProfile: true } });
559
758
  if (!existing)
@@ -575,6 +774,12 @@ export function registerAgentTools(mcp) {
575
774
  await requireReadableBudgetGroup(tx, args.budgetGroupId, ctx.principal.id);
576
775
  }
577
776
  const nextKind = args.kind ?? existing.kind;
777
+ // A coding repository is an owner binding (agentOwnerBindings): an
778
+ // agent everyone can write never gets one, as attach_* refuse theirs.
779
+ if (((nextKind === "coding" && existing.kind !== "coding") || repositoryChanges(existing)) &&
780
+ (await isPublicWritable(tx, existing.id))) {
781
+ 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.`);
782
+ }
578
783
  if (nextKind === "native" && args.codingProfile) {
579
784
  throw new McpError(400, "A coding profile is only valid for coding agents.");
580
785
  }
@@ -585,6 +790,12 @@ export function registerAgentTools(mcp) {
585
790
  if (args.model !== undefined || args.effort !== undefined || nextKind !== existing.kind) {
586
791
  validateEffort(nextKind, args.model ?? existing.model, args.effort !== undefined ? args.effort : existing.effort);
587
792
  }
793
+ if (args.nativeExecutionMode !== undefined) {
794
+ validateNativeExecutionMode(ctx, nextKind, args.nativeExecutionMode);
795
+ }
796
+ else if (nextKind === "coding" && existing.nativeExecutionMode === "sandbox") {
797
+ throw new McpError(400, 'nativeExecutionMode is only valid for native agents; set nativeExecutionMode to "control-plane" before changing this agent to coding.');
798
+ }
588
799
  let nextProfile = null;
589
800
  if (nextKind === "coding") {
590
801
  const attachedTools = await tx.agentTool.count({ where: { agentId: args.id } });
@@ -592,11 +803,14 @@ export function registerAgentTools(mcp) {
592
803
  throw new McpError(400, "Detach all native sandbox tools before changing an agent to coding.");
593
804
  }
594
805
  const currentProfile = existing.codingProfile ? storedProfile(existing.codingProfile) : undefined;
595
- const { debugTraceMinutes: _minutes, ...profilePatch } = args.codingProfile ?? {};
806
+ const { debugTraceMinutes: _minutes, debugTraceMaxMb: _maxMb, packageAuditMode: _auditMode, packageAuditMinutes: _auditMinutes, ...profilePatch } = args.codingProfile ?? {};
596
807
  const profileResult = CodingProfileSchema.safeParse({ ...currentProfile, ...profilePatch });
597
808
  if (!profileResult.success)
598
809
  throw invalidArguments("coding profile", profileResult.error);
599
810
  nextProfile = profileResult.data;
811
+ if (typeof args.codingProfile?.workspaceDiskMb === "number" || nextKind !== existing.kind) {
812
+ validateWorkspaceDiskMb(nextProfile.workspaceDiskMb);
813
+ }
600
814
  if (args.codingProfile?.services !== undefined)
601
815
  await requireCatalogServiceNames(tx, nextProfile.services);
602
816
  const nextModel = args.model ?? existing.model;
@@ -607,6 +821,19 @@ export function registerAgentTools(mcp) {
607
821
  throw new McpError(400, `Model "${nextModel}" is not supported by coding provider "${nextProfile.provider}".`);
608
822
  }
609
823
  }
824
+ // Package audit mode: resolved against the stored mode inside the
825
+ // transaction, so minutes alone re-arm what is stored now.
826
+ let audit;
827
+ try {
828
+ const storedMode = existing.codingProfile?.packageAuditMode;
829
+ audit = resolvePackageAuditPatch({ mode: isPackageAuditMode(storedMode) ? storedMode : null }, auditPatch, new Date());
830
+ }
831
+ catch (error) {
832
+ if (error instanceof PackageAuditPatchError)
833
+ throw new McpError(400, error.message);
834
+ throw error;
835
+ }
836
+ auditSet = audit;
610
837
  const nextSchedule = args.schedule !== undefined ? args.schedule : existing.schedule;
611
838
  const nextTimezone = args.timezone ?? existing.timezone;
612
839
  const nextScheduleEnabled = args.scheduleEnabled ?? existing.scheduleEnabled;
@@ -614,9 +841,17 @@ export function registerAgentTools(mcp) {
614
841
  if (nextKind === "coding" && nextSchedule && nextScheduleEnabled && !nextProfile?.defaultTask) {
615
842
  throw new McpError(400, "A default task is required for an enabled coding-agent schedule.");
616
843
  }
617
- const { id, codingProfile: _profilePatch, repositoryAdminOverride: _override, ...updates } = args;
844
+ const { id, codingProfile: _profilePatch, repositoryAdminOverride: _override, nativeExecutionMode: modeArg, ...fieldUpdates } = args;
845
+ const updates = {
846
+ ...fieldUpdates,
847
+ ...(modeArg ? { nativeExecutionMode: toStoredMode(modeArg) } : {}),
848
+ };
618
849
  const stamp = authorization ? profileStamp(authorization) : {};
619
- const trace = debugTraceUntil === undefined ? {} : { debugTraceUntil };
850
+ const trace = {
851
+ ...(debugTraceUntil === undefined ? {} : { debugTraceUntil }),
852
+ ...(debugTraceMaxMb === undefined ? {} : { debugTraceMaxMb }),
853
+ ...(audit === undefined ? {} : { packageAuditMode: audit.mode, packageAuditUntil: audit.until }),
854
+ };
620
855
  const profileMutation = nextKind === "native"
621
856
  ? existing.codingProfile
622
857
  ? { delete: true }
@@ -624,34 +859,51 @@ export function registerAgentTools(mcp) {
624
859
  : existing.codingProfile
625
860
  ? { update: { ...nextProfile, ...stamp, ...trace } }
626
861
  : { create: { ...nextProfile, ...stamp, ...trace } };
862
+ const scheduleStart = await scheduleStartFields(tx, existing, {
863
+ schedule: nextSchedule,
864
+ timezone: nextTimezone,
865
+ scheduleEnabled: nextScheduleEnabled,
866
+ });
627
867
  return tx.agent.update({
628
868
  where: { id },
629
869
  data: {
630
870
  ...updates,
871
+ ...scheduleStart,
631
872
  ...(profileMutation ? { codingProfile: profileMutation } : {}),
632
873
  },
633
874
  include: { codingProfile: true },
634
875
  });
635
876
  }, { isolationLevel: Prisma.TransactionIsolationLevel.Serializable });
636
- if (debugTraceUntil !== undefined) {
877
+ if (debugTraceUntil !== undefined || debugTraceMaxMb !== undefined) {
637
878
  agentsLog.info({
638
879
  event: "coding.debug_trace.set",
639
880
  agentId: agent.id,
640
- until: debugTraceUntil?.toISOString() ?? null,
881
+ ...(debugTraceUntil !== undefined ? { until: debugTraceUntil?.toISOString() ?? null } : {}),
882
+ ...(debugTraceMaxMb !== undefined ? { maxMb: debugTraceMaxMb } : {}),
641
883
  by: ctx.principal.id,
642
884
  }, "coding debug trace set");
643
885
  }
644
- return textResult(agent);
886
+ if (auditSet !== undefined) {
887
+ agentsLog.info({
888
+ event: "coding.package_audit.set",
889
+ agentId: agent.id,
890
+ mode: auditSet.mode,
891
+ until: auditSet.until?.toISOString() ?? null,
892
+ by: ctx.principal.id,
893
+ }, "coding package audit mode set");
894
+ }
895
+ return textResult(withProfileWarnings(withOperatorMode(agent)));
645
896
  },
646
897
  });
647
898
  mcp.registerTool({
648
899
  name: "list_agents",
649
900
  scope: "agents:read",
901
+ 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.",
650
902
  inputSchema: { type: "object", properties: {}, additionalProperties: false },
651
903
  handler: async (_args, ctx) => {
652
904
  const [where, accessOf] = await Promise.all([readableAgentsWhere(ctx), agentAccessResolver(ctx)]);
653
905
  const agents = await ctx.db.agent.findMany({ where, include: { codingProfile: true } });
654
- return textResult(agents.map((agent) => ({ ...agent, access: accessOf(agent) })));
906
+ return textResult(agents.map((agent) => ({ ...withOperatorMode(agent), access: accessOf(agent) })));
655
907
  },
656
908
  });
657
909
  mcp.registerTool({
@@ -671,12 +923,13 @@ export function registerAgentTools(mcp) {
671
923
  // A7: a tool's code and schema are its owner's, whoever can read the
672
924
  // agent (the agent's owner included). Capabilities stay visible: config.
673
925
  return textResult({
674
- ...agent,
926
+ ...withProfileWarnings(withOperatorMode(agent)),
675
927
  access,
676
- tools: agent.tools.map((attachment) => ({
928
+ // Zod 3 window: the caller's own tools carry their warnings (see core/zod3-window.ts).
929
+ tools: await Promise.all(agent.tools.map(async (attachment) => ({
677
930
  ...attachment,
678
- tool: projectTool(attachment.tool, ctx.principal.id),
679
- })),
931
+ tool: await withZod3ToolWarnings(projectTool(attachment.tool, ctx.principal.id)),
932
+ }))),
680
933
  });
681
934
  },
682
935
  });
@@ -870,7 +1123,7 @@ export function registerAgentTools(mcp) {
870
1123
  }
871
1124
  }
872
1125
  return {
873
- ...updated,
1126
+ ...withOperatorMode(updated),
874
1127
  repositoryApprovalsRevoked: revoked,
875
1128
  bindingsRemoved,
876
1129
  toolCapabilitiesSuspended,
@@ -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({