@wardby/cli 0.6.0 → 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 (576) hide show
  1. package/deploy/local/docker-compose.quickstart-coding.yml +13 -0
  2. package/dist/claude-coding-worker/driver.d.ts +21 -3
  3. package/dist/claude-coding-worker/driver.js +125 -17
  4. package/dist/claude-coding-worker/main.js +34 -6
  5. package/dist/claude-coding-worker/sdk.js +12 -1
  6. package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
  7. package/dist/claude-coding-worker/tool-socket.js +111 -0
  8. package/dist/claude-coding-worker/transcript.d.ts +18 -0
  9. package/dist/claude-coding-worker/transcript.js +77 -0
  10. package/dist/cli-help.d.ts +1 -1
  11. package/dist/cli-help.js +1 -0
  12. package/dist/cli.js +24 -10
  13. package/dist/coding/continuation-wording.d.ts +35 -0
  14. package/dist/coding/continuation-wording.js +73 -0
  15. package/dist/coding/linked-issue-note.d.ts +23 -0
  16. package/dist/coding/linked-issue-note.js +47 -0
  17. package/dist/coding/merge-wording.d.ts +28 -0
  18. package/dist/coding/merge-wording.js +78 -0
  19. package/dist/coding/pr-description-note.d.ts +9 -0
  20. package/dist/coding/pr-description-note.js +32 -0
  21. package/dist/coding/profile.d.ts +46 -126
  22. package/dist/coding/profile.js +45 -4
  23. package/dist/coding/protected-path-wording.d.ts +8 -0
  24. package/dist/coding/protected-path-wording.js +1 -1
  25. package/dist/coding/protocol.d.ts +264 -346
  26. package/dist/coding/protocol.js +235 -12
  27. package/dist/coding/redact.d.ts +3 -0
  28. package/dist/coding/redact.js +12 -0
  29. package/dist/coding/registry/allowlist.d.ts +12 -0
  30. package/dist/coding/registry/allowlist.js +14 -1
  31. package/dist/coding/registry/audit-mode.d.ts +153 -0
  32. package/dist/coding/registry/audit-mode.js +304 -0
  33. package/dist/coding/registry/lockfile-shared.d.ts +36 -0
  34. package/dist/coding/registry/lockfile-shared.js +128 -0
  35. package/dist/coding/registry/lockfiles.js +1 -1
  36. package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
  37. package/dist/coding/registry/npm-lockfile-formats.js +41 -0
  38. package/dist/coding/registry/npm-lockfile.d.ts +8 -4
  39. package/dist/coding/registry/npm-lockfile.js +4 -6
  40. package/dist/coding/registry/npm.js +78 -8
  41. package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
  42. package/dist/coding/registry/pnpm-lockfile.js +189 -0
  43. package/dist/coding/registry/pypi-plan.d.ts +50 -0
  44. package/dist/coding/registry/pypi-plan.js +406 -0
  45. package/dist/coding/registry/pypi-requirements.d.ts +58 -0
  46. package/dist/coding/registry/pypi-requirements.js +155 -0
  47. package/dist/coding/registry/pypi.d.ts +3 -27
  48. package/dist/coding/registry/pypi.js +40 -154
  49. package/dist/coding/registry/refusal-hints.d.ts +20 -0
  50. package/dist/coding/registry/refusal-hints.js +61 -0
  51. package/dist/coding/registry/refusal-wording.d.ts +11 -0
  52. package/dist/coding/registry/refusal-wording.js +56 -0
  53. package/dist/coding/registry/report.d.ts +70 -8
  54. package/dist/coding/registry/report.js +112 -5
  55. package/dist/coding/registry/types.d.ts +58 -8
  56. package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
  57. package/dist/coding/registry/yarn-lockfile.js +367 -0
  58. package/dist/coding/services/catalog.d.ts +37 -351
  59. package/dist/coding/transcript/claude-code.d.ts +13 -0
  60. package/dist/coding/transcript/claude-code.js +273 -0
  61. package/dist/coding/transcript/download-protocol.d.ts +30 -0
  62. package/dist/coding/transcript/download-protocol.js +18 -0
  63. package/dist/coding/transcript/format.d.ts +20 -0
  64. package/dist/coding/transcript/format.js +32 -0
  65. package/dist/coding/transcript/recorder.d.ts +51 -0
  66. package/dist/coding/transcript/recorder.js +225 -0
  67. package/dist/coding/transcript/resume/checkout.d.ts +31 -0
  68. package/dist/coding/transcript/resume/checkout.js +203 -0
  69. package/dist/coding/transcript/resume/command.d.ts +17 -0
  70. package/dist/coding/transcript/resume/command.js +176 -0
  71. package/dist/coding/transcript/resume/download.d.ts +20 -0
  72. package/dist/coding/transcript/resume/download.js +153 -0
  73. package/dist/coding/transcript/resume/launch.d.ts +38 -0
  74. package/dist/coding/transcript/resume/launch.js +128 -0
  75. package/dist/coding/transcript/resume/session-file.d.ts +13 -0
  76. package/dist/coding/transcript/resume/session-file.js +79 -0
  77. package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
  78. package/dist/coding/transcript/resume/stand-in.js +49 -0
  79. package/dist/coding-worker/artifact.d.ts +8 -3
  80. package/dist/coding-worker/artifact.js +3 -1
  81. package/dist/coding-worker/debug-trace.d.ts +6 -5
  82. package/dist/coding-worker/debug-trace.js +13 -18
  83. package/dist/coding-worker/dependency-cache.d.mts +229 -0
  84. package/dist/coding-worker/dependency-cache.mjs +2123 -0
  85. package/dist/coding-worker/driver.d.ts +4 -3
  86. package/dist/coding-worker/driver.js +116 -38
  87. package/dist/coding-worker/errors.d.ts +1 -0
  88. package/dist/coding-worker/errors.js +32 -0
  89. package/dist/coding-worker/task-note.d.ts +11 -0
  90. package/dist/coding-worker/task-note.js +13 -0
  91. package/dist/coding-worker/types.d.ts +11 -0
  92. package/dist/config/dependency-cache.d.ts +23 -0
  93. package/dist/config/dependency-cache.js +32 -0
  94. package/dist/config/providers.d.ts +12 -3
  95. package/dist/config/providers.js +55 -5
  96. package/dist/config/test-simulators.d.ts +82 -0
  97. package/dist/config/test-simulators.js +305 -0
  98. package/dist/core/async-context.d.ts +2 -0
  99. package/dist/core/async-context.js +12 -0
  100. package/dist/core/budget-events.d.ts +108 -0
  101. package/dist/core/budget-events.js +346 -0
  102. package/dist/core/budget-groups.d.ts +50 -1
  103. package/dist/core/budget-groups.js +236 -27
  104. package/dist/core/budget-stopped-head.d.ts +46 -0
  105. package/dist/core/budget-stopped-head.js +81 -0
  106. package/dist/core/budget-topup.d.ts +51 -0
  107. package/dist/core/budget-topup.js +156 -0
  108. package/dist/core/budget-wording.d.ts +16 -2
  109. package/dist/core/budget-wording.js +40 -2
  110. package/dist/core/coding-queue.d.ts +2 -1
  111. package/dist/core/coding-queue.js +7 -0
  112. package/dist/core/cron.d.ts +19 -1
  113. package/dist/core/cron.js +17 -0
  114. package/dist/core/datastores.js +1 -1
  115. package/dist/core/deferred-coding.d.ts +14 -0
  116. package/dist/core/deferred-coding.js +62 -0
  117. package/dist/core/delegation-child.d.ts +25 -0
  118. package/dist/core/delegation-child.js +37 -0
  119. package/dist/core/dispatch.d.ts +42 -0
  120. package/dist/core/dispatch.js +131 -56
  121. package/dist/core/engine-native.js +1 -1
  122. package/dist/core/error-code.d.ts +38 -0
  123. package/dist/core/error-code.js +168 -0
  124. package/dist/core/grants.d.ts +19 -6
  125. package/dist/core/grants.js +55 -6
  126. package/dist/core/host-events.d.ts +18 -2
  127. package/dist/core/host-events.js +284 -24
  128. package/dist/core/host-status.d.ts +85 -3
  129. package/dist/core/host-status.js +298 -20
  130. package/dist/core/issue-bridge.d.ts +50 -6
  131. package/dist/core/issue-bridge.js +124 -33
  132. package/dist/core/issue-events.d.ts +1 -1
  133. package/dist/core/issue-events.js +4 -10
  134. package/dist/core/issue-status.d.ts +1 -1
  135. package/dist/core/issue-status.js +54 -26
  136. package/dist/core/logger.d.ts +5 -0
  137. package/dist/core/logger.js +14 -1
  138. package/dist/core/lost-run-children.d.ts +6 -0
  139. package/dist/core/lost-run-children.js +32 -0
  140. package/dist/core/mark-ready.d.ts +34 -0
  141. package/dist/core/mark-ready.js +152 -0
  142. package/dist/core/markdown-code.d.ts +8 -0
  143. package/dist/core/markdown-code.js +107 -0
  144. package/dist/core/memory-tools.js +7 -0
  145. package/dist/core/merge-order-check.d.ts +2 -1
  146. package/dist/core/merge-order-check.js +8 -1
  147. package/dist/core/notification-templates.d.ts +1 -7
  148. package/dist/core/notification-templates.js +36 -2
  149. package/dist/core/pull-request-state-sync.js +2 -2
  150. package/dist/core/reconciler.d.ts +4 -3
  151. package/dist/core/reconciler.js +8 -1
  152. package/dist/core/related-pull-requests.d.ts +11 -3
  153. package/dist/core/related-pull-requests.js +27 -14
  154. package/dist/core/reply-parts.d.ts +21 -0
  155. package/dist/core/reply-parts.js +73 -0
  156. package/dist/core/review-fix.d.ts +1 -1
  157. package/dist/core/review-fix.js +2 -1
  158. package/dist/core/review-host-checks.d.ts +1 -1
  159. package/dist/core/review-host-tools.d.ts +3 -0
  160. package/dist/core/review-host-tools.js +99 -13
  161. package/dist/core/review-reads.d.ts +55 -0
  162. package/dist/core/review-reads.js +233 -0
  163. package/dist/core/run-status.d.ts +12 -0
  164. package/dist/core/run-status.js +12 -0
  165. package/dist/core/runner.d.ts +80 -34
  166. package/dist/core/runner.js +439 -144
  167. package/dist/core/schedule-start.d.ts +12 -0
  168. package/dist/core/schedule-start.js +14 -0
  169. package/dist/core/secret-broker-config.d.ts +10 -74
  170. package/dist/core/secret-guard.d.ts +46 -0
  171. package/dist/core/secret-guard.js +104 -0
  172. package/dist/core/secret-guarded-stores.d.ts +12 -0
  173. package/dist/core/secret-guarded-stores.js +41 -0
  174. package/dist/core/secret-spans.d.ts +50 -0
  175. package/dist/core/secret-spans.js +94 -0
  176. package/dist/core/stop-run.d.ts +46 -0
  177. package/dist/core/stop-run.js +61 -0
  178. package/dist/core/workflow-events.d.ts +14 -2
  179. package/dist/core/workflow-events.js +4 -0
  180. package/dist/core/workflow-run-events.d.ts +5 -3
  181. package/dist/core/workflow-run-events.js +43 -8
  182. package/dist/core/zod-json-schema.d.ts +4 -0
  183. package/dist/core/zod-json-schema.js +39 -0
  184. package/dist/core/zod3-window.d.ts +35 -0
  185. package/dist/core/zod3-window.js +124 -0
  186. package/dist/generated/prisma/browser.d.ts +34 -3
  187. package/dist/generated/prisma/client.d.ts +34 -3
  188. package/dist/generated/prisma/commonInputTypes.d.ts +220 -60
  189. package/dist/generated/prisma/enums.d.ts +10 -0
  190. package/dist/generated/prisma/enums.js +8 -0
  191. package/dist/generated/prisma/internal/class.d.ts +44 -0
  192. package/dist/generated/prisma/internal/class.js +4 -4
  193. package/dist/generated/prisma/internal/prismaNamespace.d.ts +428 -9
  194. package/dist/generated/prisma/internal/prismaNamespace.js +92 -1
  195. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +95 -0
  196. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +92 -1
  197. package/dist/generated/prisma/models/Agent.d.ts +106 -8
  198. package/dist/generated/prisma/models/AgentRepository.d.ts +42 -1
  199. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +229 -1
  200. package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
  201. package/dist/generated/prisma/models/CodingProxySession.d.ts +114 -1
  202. package/dist/generated/prisma/models/CodingRun.d.ts +1637 -1
  203. package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
  204. package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
  205. package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
  206. package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
  207. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +39 -1
  208. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
  209. package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
  210. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
  211. package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
  212. package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
  213. package/dist/generated/prisma/models/Run.d.ts +738 -2
  214. package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
  215. package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
  216. package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
  217. package/dist/generated/prisma/models/RunTranscript.js +1 -0
  218. package/dist/generated/prisma/models.d.ts +4 -0
  219. package/dist/help-index.json +1320 -69
  220. package/dist/import/create.js +32 -3
  221. package/dist/import/neutral-schema.d.ts +50 -281
  222. package/dist/import/neutral-schema.js +5 -4
  223. package/dist/knowledge/check.d.ts +1 -1
  224. package/dist/knowledge/cli.d.ts +11 -1
  225. package/dist/knowledge/cli.js +37 -4
  226. package/dist/knowledge/concept.d.ts +3 -19
  227. package/dist/knowledge/location.d.ts +31 -0
  228. package/dist/knowledge/location.js +78 -0
  229. package/dist/mcp/auth/access.d.ts +10 -2
  230. package/dist/mcp/auth/access.js +15 -1
  231. package/dist/mcp/auth/ownership.d.ts +7 -7
  232. package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
  233. package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
  234. package/dist/mcp/host-events/github-ingress.d.ts +2 -0
  235. package/dist/mcp/host-events/github-ingress.js +2 -1
  236. package/dist/mcp/index.d.ts +6 -0
  237. package/dist/mcp/index.js +58 -10
  238. package/dist/mcp/server.d.ts +13 -0
  239. package/dist/mcp/server.js +33 -14
  240. package/dist/mcp/tools/agents.d.ts +4 -0
  241. package/dist/mcp/tools/agents.js +198 -16
  242. package/dist/mcp/tools/datastore.js +17 -8
  243. package/dist/mcp/tools/grants.js +9 -3
  244. package/dist/mcp/tools/memory.js +11 -1
  245. package/dist/mcp/tools/notification-channels.js +2 -2
  246. package/dist/mcp/tools/packages.d.ts +2 -0
  247. package/dist/mcp/tools/packages.js +195 -0
  248. package/dist/mcp/tools/repositories.js +18 -5
  249. package/dist/mcp/tools/run-access.d.ts +16 -0
  250. package/dist/mcp/tools/run-access.js +25 -0
  251. package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
  252. package/dist/mcp/tools/run-transcript-download.js +129 -0
  253. package/dist/mcp/tools/run-transcript.d.ts +19 -0
  254. package/dist/mcp/tools/run-transcript.js +70 -0
  255. package/dist/mcp/tools/runs.js +34 -12
  256. package/dist/mcp/tools/scheduling.js +3 -1
  257. package/dist/mcp/tools/secret-elicitation-form.js +5 -0
  258. package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
  259. package/dist/mcp/tools/secret-elicitation-server.js +10 -61
  260. package/dist/mcp/tools/secrets.js +2 -2
  261. package/dist/mcp/tools/stop-run.d.ts +2 -0
  262. package/dist/mcp/tools/stop-run.js +82 -0
  263. package/dist/mcp/tools/subagents.js +2 -2
  264. package/dist/mcp/tools/tools.d.ts +1 -1
  265. package/dist/mcp/tools/tools.js +25 -9
  266. package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
  267. package/dist/mcp/transport/stdio-link-host.js +67 -0
  268. package/dist/mcp/transport/streamable-http.d.ts +13 -0
  269. package/dist/mcp/transport/streamable-http.js +41 -1
  270. package/dist/native-worker/docker-launcher.d.ts +38 -2
  271. package/dist/native-worker/docker-launcher.js +65 -5
  272. package/dist/native-worker/gateway-server.d.ts +41 -3
  273. package/dist/native-worker/gateway-server.js +124 -27
  274. package/dist/native-worker/gateway.d.ts +27 -1
  275. package/dist/native-worker/gateway.js +70 -4
  276. package/dist/native-worker/http-server.d.ts +3 -1
  277. package/dist/native-worker/http-server.js +11 -7
  278. package/dist/native-worker/http-transport.js +1 -1
  279. package/dist/native-worker/kubernetes-launcher.d.ts +7 -3
  280. package/dist/native-worker/kubernetes-launcher.js +43 -3
  281. package/dist/native-worker/launch.d.ts +18 -1
  282. package/dist/native-worker/launch.js +6 -1
  283. package/dist/native-worker/ledger.d.ts +18 -2
  284. package/dist/native-worker/ledger.js +57 -4
  285. package/dist/native-worker/loopback.js +3 -8
  286. package/dist/native-worker/main.d.ts +2 -1
  287. package/dist/native-worker/main.js +14 -3
  288. package/dist/native-worker/protocol.d.ts +129 -577
  289. package/dist/native-worker/protocol.js +47 -1
  290. package/dist/native-worker/sandbox-executor.d.ts +17 -2
  291. package/dist/native-worker/sandbox-executor.js +78 -4
  292. package/dist/native-worker/stderr-redaction.d.ts +77 -0
  293. package/dist/native-worker/stderr-redaction.js +237 -0
  294. package/dist/native-worker/stdio.d.ts +1 -1
  295. package/dist/native-worker/stdio.js +6 -5
  296. package/dist/native-worker/warm-pool.d.ts +2 -2
  297. package/dist/native-worker/warm-pool.js +4 -4
  298. package/dist/native-worker/worker.js +28 -2
  299. package/dist/observability/metrics.js +6 -1
  300. package/dist/providers/auth/self-hosted.d.ts +1 -1
  301. package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
  302. package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
  303. package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
  304. package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
  305. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
  306. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
  307. package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
  308. package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
  309. package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
  310. package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
  311. package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
  312. package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
  313. package/dist/providers/coding-proxy/hold.d.ts +32 -0
  314. package/dist/providers/coding-proxy/hold.js +86 -0
  315. package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
  316. package/dist/providers/coding-proxy/interrupted.js +104 -0
  317. package/dist/providers/coding-proxy/memory-ledger.d.ts +15 -2
  318. package/dist/providers/coding-proxy/memory-ledger.js +84 -8
  319. package/dist/providers/coding-proxy/metering.d.ts +16 -0
  320. package/dist/providers/coding-proxy/metering.js +27 -4
  321. package/dist/providers/coding-proxy/prisma-ledger.d.ts +15 -2
  322. package/dist/providers/coding-proxy/prisma-ledger.js +179 -67
  323. package/dist/providers/coding-proxy/proxy.d.ts +14 -1
  324. package/dist/providers/coding-proxy/proxy.js +166 -14
  325. package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
  326. package/dist/providers/coding-proxy/registry/audit.js +94 -17
  327. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
  328. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
  329. package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
  330. package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
  331. package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
  332. package/dist/providers/coding-proxy/registry/plan.js +201 -48
  333. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
  334. package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
  335. package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
  336. package/dist/providers/coding-proxy/registry/service.js +579 -112
  337. package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
  338. package/dist/providers/coding-proxy/registry/store.js +54 -1
  339. package/dist/providers/coding-proxy/runtime.d.ts +4 -0
  340. package/dist/providers/coding-proxy/runtime.js +78 -16
  341. package/dist/providers/coding-proxy/server.d.ts +6 -1
  342. package/dist/providers/coding-proxy/server.js +45 -1
  343. package/dist/providers/coding-proxy/types.d.ts +65 -1
  344. package/dist/providers/datastore/types.d.ts +5 -0
  345. package/dist/providers/engine/types.d.ts +17 -2
  346. package/dist/providers/engine/types.js +17 -0
  347. package/dist/providers/executor/composition.d.ts +10 -3
  348. package/dist/providers/executor/composition.js +47 -7
  349. package/dist/providers/executor/container.d.ts +361 -8
  350. package/dist/providers/executor/container.js +1136 -91
  351. package/dist/providers/executor/dbos-status.d.ts +31 -0
  352. package/dist/providers/executor/dbos-status.js +64 -0
  353. package/dist/providers/executor/dbos.d.ts +50 -1
  354. package/dist/providers/executor/dbos.js +207 -20
  355. package/dist/providers/executor/deferred.d.ts +12 -24
  356. package/dist/providers/executor/deferred.js +10 -29
  357. package/dist/providers/executor/in-process.d.ts +9 -1
  358. package/dist/providers/executor/in-process.js +14 -4
  359. package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
  360. package/dist/providers/executor/linked-issue-reader.js +30 -0
  361. package/dist/providers/executor/routing.d.ts +2 -0
  362. package/dist/providers/executor/routing.js +4 -0
  363. package/dist/providers/executor/types.d.ts +13 -0
  364. package/dist/providers/index.d.ts +2 -1
  365. package/dist/providers/issue-tracker/types.d.ts +17 -0
  366. package/dist/providers/issue-tracker/types.js +39 -1
  367. package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
  368. package/dist/providers/jobs/claude-tool-setup.js +5 -2
  369. package/dist/providers/jobs/docker-isolation.d.ts +8 -0
  370. package/dist/providers/jobs/docker-isolation.js +17 -0
  371. package/dist/providers/jobs/docker.d.ts +1 -0
  372. package/dist/providers/jobs/docker.js +27 -2
  373. package/dist/providers/jobs/fake-kubernetes-api.d.ts +2 -0
  374. package/dist/providers/jobs/fake-kubernetes-api.js +3 -0
  375. package/dist/providers/jobs/kubernetes-api.d.ts +8 -0
  376. package/dist/providers/jobs/kubernetes-api.js +10 -0
  377. package/dist/providers/jobs/kubernetes-client.js +10 -1
  378. package/dist/providers/jobs/kubernetes-isolation.d.ts +2 -0
  379. package/dist/providers/jobs/kubernetes-isolation.js +17 -1
  380. package/dist/providers/jobs/kubernetes.d.ts +6 -1
  381. package/dist/providers/jobs/kubernetes.js +105 -16
  382. package/dist/providers/jobs/types.d.ts +33 -0
  383. package/dist/providers/jobs/types.js +13 -1
  384. package/dist/providers/llm/anthropic.js +5 -1
  385. package/dist/providers/llm/bedrock.d.ts +0 -12
  386. package/dist/providers/llm/bedrock.js +4 -0
  387. package/dist/providers/llm/claude-messages.d.ts +3 -1
  388. package/dist/providers/llm/claude-messages.js +4 -1
  389. package/dist/providers/llm/claude-provider.d.ts +2 -2
  390. package/dist/providers/llm/claude-provider.js +2 -2
  391. package/dist/providers/llm/openai.d.ts +2 -2
  392. package/dist/providers/llm/openai.js +6 -2
  393. package/dist/providers/llm/routing.d.ts +2 -2
  394. package/dist/providers/llm/routing.js +2 -2
  395. package/dist/providers/llm/types.d.ts +12 -2
  396. package/dist/providers/review-host/github-events.d.ts +9 -1
  397. package/dist/providers/review-host/github-events.js +34 -12
  398. package/dist/providers/review-host/github.d.ts +29 -2
  399. package/dist/providers/review-host/github.js +224 -29
  400. package/dist/providers/review-host/local.d.ts +8 -4
  401. package/dist/providers/review-host/local.js +49 -31
  402. package/dist/providers/review-host/patch-pages.d.ts +41 -0
  403. package/dist/providers/review-host/patch-pages.js +176 -0
  404. package/dist/providers/review-host/review-format.d.ts +19 -1
  405. package/dist/providers/review-host/review-format.js +38 -7
  406. package/dist/providers/review-host/types.d.ts +134 -2
  407. package/dist/providers/review-host/types.js +8 -0
  408. package/dist/providers/storage/gcs.d.ts +63 -0
  409. package/dist/providers/storage/gcs.js +69 -0
  410. package/dist/providers/storage/index.d.ts +15 -0
  411. package/dist/providers/storage/index.js +14 -0
  412. package/dist/providers/storage/local.d.ts +24 -0
  413. package/dist/providers/storage/local.js +92 -0
  414. package/dist/providers/storage/meter.d.ts +14 -0
  415. package/dist/providers/storage/meter.js +34 -0
  416. package/dist/providers/storage/s3.d.ts +41 -0
  417. package/dist/providers/storage/s3.js +107 -0
  418. package/dist/providers/storage/types.d.ts +37 -3
  419. package/dist/providers/storage/types.js +21 -4
  420. package/dist/providers/vcs/git.d.ts +33 -2
  421. package/dist/providers/vcs/git.js +324 -22
  422. package/dist/providers/vcs/github-remote.d.ts +26 -3
  423. package/dist/providers/vcs/github-remote.js +124 -14
  424. package/dist/providers/vcs/github.d.ts +214 -6
  425. package/dist/providers/vcs/github.js +447 -45
  426. package/dist/providers/vcs/index.js +8 -1
  427. package/dist/providers/vcs/pr-description.d.ts +127 -0
  428. package/dist/providers/vcs/pr-description.js +270 -0
  429. package/dist/providers/vcs/remote.d.ts +33 -1
  430. package/dist/providers/vcs/routing.d.ts +4 -2
  431. package/dist/providers/vcs/routing.js +6 -0
  432. package/dist/providers/vcs/types.d.ts +80 -3
  433. package/dist/quickstart/coding-seed.d.ts +14 -3
  434. package/dist/quickstart/coding-seed.js +213 -4
  435. package/dist/quickstart/reviewer-prompt.d.ts +1 -1
  436. package/dist/quickstart/reviewer-prompt.js +6 -6
  437. package/dist/quickstart-images.json +1 -1
  438. package/dist/sandbox/generated/zod.bundle.js +62 -1
  439. package/dist/sandbox/generated/zod3.bundle.js +5 -0
  440. package/dist/sandbox/host-functions.d.ts +1 -0
  441. package/dist/sandbox/host-functions.js +6 -11
  442. package/dist/sandbox/secret-broker.js +3 -4
  443. package/dist/sandbox/tool-capabilities.d.ts +10 -30
  444. package/dist/sandbox/zod-params.d.ts +37 -5
  445. package/dist/sandbox/zod-params.js +181 -26
  446. package/dist/serve.js +8 -1
  447. package/dist/viewer/api-schema.d.ts +349 -2627
  448. package/dist/viewer/api-schema.js +7 -0
  449. package/dist/viewer/build-schemas.js +6 -2
  450. package/dist/viewer/openapi.js +2 -4
  451. package/dist/wardby-bin.js +10 -0
  452. package/docs/agent-recipes.md +58 -20
  453. package/docs/code-review-agents.md +551 -41
  454. package/docs/coding-agent-setup.md +489 -7
  455. package/docs/coding-packages.md +1033 -90
  456. package/docs/coding-services.md +27 -12
  457. package/docs/coding-worker-byo-images.md +20 -0
  458. package/docs/coding-worker-isolation.md +105 -30
  459. package/docs/getting-started-gke.md +124 -137
  460. package/docs/getting-started-identity-provider.md +10 -1
  461. package/docs/getting-started.md +9 -0
  462. package/docs/jira-agents.md +17 -8
  463. package/docs/knowledge/blob-not-found-semantics.md +41 -0
  464. package/docs/knowledge/bounded-file-descriptor.md +52 -0
  465. package/docs/knowledge/delegation-admission-slots.md +52 -0
  466. package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
  467. package/docs/knowledge/import-rename-target.md +52 -0
  468. package/docs/knowledge/index.md +57 -0
  469. package/docs/knowledge/log.md +9 -0
  470. package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
  471. package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
  472. package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
  473. package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
  474. package/docs/knowledge/overview-cli.md +74 -0
  475. package/docs/knowledge/overview-coding-proxy.md +72 -0
  476. package/docs/knowledge/overview-coding.md +72 -0
  477. package/docs/knowledge/overview-config.md +60 -0
  478. package/docs/knowledge/overview-core.md +72 -0
  479. package/docs/knowledge/overview-deploy.md +83 -0
  480. package/docs/knowledge/overview-mcp.md +61 -0
  481. package/docs/knowledge/overview-prisma.md +72 -0
  482. package/docs/knowledge/overview-providers.md +89 -0
  483. package/docs/knowledge/overview-sandbox.md +83 -0
  484. package/docs/knowledge/overview-surfaces.md +83 -0
  485. package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
  486. package/docs/knowledge/proxy-settlement-projections.md +41 -0
  487. package/docs/knowledge/run-pricing-first-writer.md +43 -0
  488. package/docs/knowledge/schedule-claim-transaction.md +41 -0
  489. package/docs/knowledge/secret-entry-replica-contract.md +52 -0
  490. package/docs/knowledge/terminal-run-first-writer.md +41 -0
  491. package/docs/knowledge/transactional-agent-authorization.md +52 -0
  492. package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
  493. package/docs/knowledge/warm-input-publication.md +30 -0
  494. package/docs/knowledge/workspace-staging-failure.md +54 -0
  495. package/docs/knowledge.md +54 -14
  496. package/docs/native-sandbox.md +119 -23
  497. package/docs/observability.md +4 -0
  498. package/docs/security-deployment.md +33 -2
  499. package/docs/slack-notifications.md +35 -19
  500. package/docs/tool-secrets.md +42 -10
  501. package/docs/viewer-api.openapi.yml +1 -1
  502. package/help/admin-viewer.md +24 -2
  503. package/help/architecture-agent.md +11 -6
  504. package/help/build-worker-image.md +3 -1
  505. package/help/builder-agent.md +19 -6
  506. package/help/code-review-agents.md +177 -6
  507. package/help/coding-packages.md +156 -6
  508. package/help/cost-attribution.md +9 -5
  509. package/help/creating-agents.md +14 -1
  510. package/help/dependency-cache.md +143 -0
  511. package/help/deploy-gke.md +15 -8
  512. package/help/errors/budget-exhausted.md +187 -0
  513. package/help/errors/budget-group-exhausted.md +5 -1
  514. package/help/errors/coding-stream-quota-exceeded.md +33 -0
  515. package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
  516. package/help/errors/continuation-closed.md +9 -12
  517. package/help/errors/delegation-conflict.md +24 -0
  518. package/help/errors/file-list-truncated.md +45 -0
  519. package/help/errors/full-read-required.md +49 -0
  520. package/help/errors/github-account-not-allowed.md +4 -0
  521. package/help/errors/graph-incomplete.md +43 -0
  522. package/help/errors/graph-limit.md +43 -0
  523. package/help/errors/merge-conflict.md +49 -0
  524. package/help/errors/native-sandbox-gateway-error.md +20 -0
  525. package/help/errors/native-sandbox-launch-abandoned.md +21 -0
  526. package/help/errors/native-sandbox-worker-exited.md +3 -2
  527. package/help/errors/package-not-allowed-pending.md +52 -0
  528. package/help/errors/package-not-allowed.md +51 -0
  529. package/help/errors/package-refusals.md +43 -0
  530. package/help/errors/patch-cursor-malformed.md +31 -0
  531. package/help/errors/run-lost.md +39 -0
  532. package/help/errors/run-transcript-download.md +44 -0
  533. package/help/errors/secret-in-value.md +69 -0
  534. package/help/errors/target-merge.md +40 -0
  535. package/help/fix-merge-conflicts.md +73 -0
  536. package/help/github-app-setup.md +132 -0
  537. package/help/github.md +22 -0
  538. package/help/identity-and-access.md +2 -0
  539. package/help/jira.md +23 -6
  540. package/help/knowledge.md +16 -7
  541. package/help/local-repositories.md +1 -1
  542. package/help/low-power-mode.md +7 -1
  543. package/help/merge-order-check.md +5 -0
  544. package/help/native-capabilities.md +29 -1
  545. package/help/native-sandbox.md +15 -1
  546. package/help/operating-agents.md +5 -0
  547. package/help/package-audit-mode.md +91 -0
  548. package/help/related-pull-requests.md +10 -7
  549. package/help/resume-runs-locally.md +131 -0
  550. package/help/review-fix-rounds.md +33 -1
  551. package/help/sharing-agents.md +59 -0
  552. package/help/slack-notifications.md +19 -5
  553. package/help/status-comments.md +31 -0
  554. package/help/stop-run.md +58 -0
  555. package/help/troubleshooting/budgets.md +28 -0
  556. package/help/troubleshooting/coding-workers.md +78 -7
  557. package/package.json +17 -10
  558. package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
  559. package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
  560. package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
  561. package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
  562. package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
  563. package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
  564. package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
  565. package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
  566. package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
  567. package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
  568. package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
  569. package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
  570. package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
  571. package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
  572. package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
  573. package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
  574. package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
  575. package/prisma/schema.prisma +311 -97
  576. package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
@@ -8,24 +8,37 @@
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
43
  // resolveCodingWorkerImage/resolveCodingToolImage in container.ts). For a Codex agent it
31
44
  // replaces the one container that runs the whole agent; for a Claude Code agent it replaces
@@ -67,12 +80,53 @@ function withOperatorMode(agent) {
67
80
  nativeExecutionMode: agent.kind !== "native" ? null : agent.nativeExecutionMode === "sandbox" ? "sandbox" : "control-plane",
68
81
  };
69
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
+ }
70
123
  const agentFields = {
71
124
  name: z.string().trim().min(1).max(MAX_AGENT_NAME_CHARS),
72
125
  systemPrompt: z.string().min(1).max(MAX_SYSTEM_PROMPT_CHARS),
73
126
  model: z.string().trim().min(1).max(MAX_MODEL_CHARS),
74
127
  budgetUsd: z.number().finite().positive().max(MAX_BUDGET_USD),
75
128
  maxTurns: z.number().int().min(1).max(100),
129
+ allowedOverrunPercent: z.number().int().min(0).max(100),
76
130
  maxDelegationsPerRun: z.number().int().min(1).max(MAX_DELEGATIONS_PER_RUN),
77
131
  parallelDelegations: z.boolean(),
78
132
  schedule: z.string().trim().min(1).max(256),
@@ -107,6 +161,7 @@ const CreateAgentSchema = z
107
161
  model: agentFields.model,
108
162
  budgetUsd: agentFields.budgetUsd,
109
163
  maxTurns: agentFields.maxTurns.optional(),
164
+ allowedOverrunPercent: agentFields.allowedOverrunPercent.optional(),
110
165
  maxDelegationsPerRun: agentFields.maxDelegationsPerRun.optional(),
111
166
  parallelDelegations: agentFields.parallelDelegations.optional(),
112
167
  schedule: agentFields.schedule.optional(),
@@ -164,6 +219,7 @@ const UpdateAgentSchema = z
164
219
  model: agentFields.model.optional(),
165
220
  budgetUsd: agentFields.budgetUsd.optional(),
166
221
  maxTurns: agentFields.maxTurns.optional(),
222
+ allowedOverrunPercent: agentFields.allowedOverrunPercent.optional(),
167
223
  maxDelegationsPerRun: agentFields.maxDelegationsPerRun.optional(),
168
224
  parallelDelegations: agentFields.parallelDelegations.optional(),
169
225
  schedule: agentFields.schedule.nullable().optional(),
@@ -179,6 +235,12 @@ const UpdateAgentSchema = z
179
235
  codingProfile: CodingProfilePatchSchema.extend({
180
236
  /** Not a stored profile field: sets CodingAgentProfile.debugTraceUntil = now + minutes (null clears). */
181
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(),
182
244
  }).optional(),
183
245
  repositoryAdminOverride: z.boolean().optional(),
184
246
  })
@@ -242,6 +304,12 @@ const profileJsonSchema = {
242
304
  maximum: MAX_CODING_TURNS,
243
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.`,
244
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
+ },
245
313
  repoSkills: {
246
314
  type: "boolean",
247
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.",
@@ -250,6 +318,14 @@ const profileJsonSchema = {
250
318
  type: "boolean",
251
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.",
252
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
+ },
253
329
  packageAllowlist: {
254
330
  type: "object",
255
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.",
@@ -257,7 +333,16 @@ const profileJsonSchema = {
257
333
  },
258
334
  packagePolicy: {
259
335
  type: "object",
260
- 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
+ },
261
346
  additionalProperties: false,
262
347
  },
263
348
  services: {
@@ -363,11 +448,14 @@ function storedProfile(profile) {
363
448
  workerImageRef: profile.workerImageRef,
364
449
  workspaceDiskMb: profile.workspaceDiskMb,
365
450
  maxTurns: profile.maxTurns,
451
+ maxOutputTokens: profile.maxOutputTokens,
366
452
  packageAllowlist: profile.packageAllowlist,
367
453
  packagePolicy: profile.packagePolicy,
368
454
  services: profile.services,
369
455
  repoSkills: profile.repoSkills,
370
456
  claudeBareMode: profile.claudeBareMode,
457
+ dependencyCache: profile.dependencyCache,
458
+ sessionResume: profile.sessionResume,
371
459
  });
372
460
  }
373
461
  /** A service name an agent is allowed must exist in the catalog (any version); typos fail here, not at a run. */
@@ -393,6 +481,12 @@ export function registerAgentTools(mcp) {
393
481
  model: { type: "string" },
394
482
  budgetUsd: { type: "number" },
395
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
+ },
396
490
  maxDelegationsPerRun: {
397
491
  type: "integer",
398
492
  minimum: 1,
@@ -431,12 +525,14 @@ export function registerAgentTools(mcp) {
431
525
  const packages = args.codingProfile;
432
526
  if (packages &&
433
527
  (Object.keys(packages.packageAllowlist ?? {}).length > 0 ||
434
- Object.keys(packages.packagePolicy ?? {}).length > 0))
528
+ Object.keys(packages.packagePolicy ?? {}).length > 0 ||
529
+ packages.dependencyCache === true))
435
530
  requirePackageApproval(ctx);
436
531
  validateSchedule(args.schedule, args.timezone ?? "UTC");
437
532
  requireModelAvailable(ctx, args.model, args.kind);
438
533
  validateEffort(args.kind, args.model, args.effort);
439
534
  validateNativeExecutionMode(ctx, args.kind, args.nativeExecutionMode);
535
+ validateWorkspaceDiskMb(args.codingProfile?.workspaceDiskMb);
440
536
  if (args.codingProfile)
441
537
  await requireCatalogServiceNames(ctx.db, args.codingProfile.services);
442
538
  if (args.budgetGroupId) {
@@ -463,6 +559,11 @@ export function registerAgentTools(mcp) {
463
559
  const agent = await ctx.db.agent.create({
464
560
  data: {
465
561
  ...agentData,
562
+ ...(await scheduleStartFields(ctx.db, null, {
563
+ schedule: agentData.schedule ?? null,
564
+ timezone: agentData.timezone ?? "UTC",
565
+ scheduleEnabled: agentData.scheduleEnabled ?? true,
566
+ })),
466
567
  ownerId: ctx.principal.id,
467
568
  ...(codingProfile && authorization
468
569
  ? { codingProfile: { create: { ...codingProfile, ...profileStamp(authorization) } } }
@@ -470,7 +571,7 @@ export function registerAgentTools(mcp) {
470
571
  },
471
572
  include: { codingProfile: true },
472
573
  });
473
- return textResult(withOperatorMode(agent));
574
+ return textResult(withProfileWarnings(withOperatorMode(agent)));
474
575
  },
475
576
  });
476
577
  mcp.registerTool({
@@ -486,6 +587,12 @@ export function registerAgentTools(mcp) {
486
587
  model: { type: "string" },
487
588
  budgetUsd: { type: "number" },
488
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
+ },
489
596
  maxDelegationsPerRun: {
490
597
  type: "integer",
491
598
  minimum: 1,
@@ -531,6 +638,27 @@ export function registerAgentTools(mcp) {
531
638
  maximum: MAX_DEBUG_TRACE_MINUTES,
532
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.",
533
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
+ },
534
662
  },
535
663
  },
536
664
  repositoryAdminOverride: REPOSITORY_ADMIN_OVERRIDE,
@@ -542,9 +670,18 @@ export function registerAgentTools(mcp) {
542
670
  if (args.codingProfile?.workerImageRef !== undefined)
543
671
  requireWorkerImageRefScope(ctx);
544
672
  const debugTraceMinutes = args.codingProfile?.debugTraceMinutes;
545
- if (debugTraceMinutes !== undefined)
673
+ const debugTraceMaxMb = args.codingProfile?.debugTraceMaxMb;
674
+ if (debugTraceMinutes !== undefined || debugTraceMaxMb !== undefined)
546
675
  requireDebugTraceScope(ctx);
547
- 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)
548
685
  requirePackageApproval(ctx);
549
686
  // Repository authorization calls GitHub, so it runs before (outside) the
550
687
  // serializable transaction, on a pre-read; the transaction then verifies
@@ -615,6 +752,7 @@ export function registerAgentTools(mcp) {
615
752
  : debugTraceMinutes === null
616
753
  ? null
617
754
  : new Date(Date.now() + debugTraceMinutes * 60_000);
755
+ let auditSet;
618
756
  const agent = await ctx.db.$transaction(async (tx) => {
619
757
  const existing = await tx.agent.findUnique({ where: { id: args.id }, include: { codingProfile: true } });
620
758
  if (!existing)
@@ -636,6 +774,12 @@ export function registerAgentTools(mcp) {
636
774
  await requireReadableBudgetGroup(tx, args.budgetGroupId, ctx.principal.id);
637
775
  }
638
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
+ }
639
783
  if (nextKind === "native" && args.codingProfile) {
640
784
  throw new McpError(400, "A coding profile is only valid for coding agents.");
641
785
  }
@@ -659,11 +803,14 @@ export function registerAgentTools(mcp) {
659
803
  throw new McpError(400, "Detach all native sandbox tools before changing an agent to coding.");
660
804
  }
661
805
  const currentProfile = existing.codingProfile ? storedProfile(existing.codingProfile) : undefined;
662
- const { debugTraceMinutes: _minutes, ...profilePatch } = args.codingProfile ?? {};
806
+ const { debugTraceMinutes: _minutes, debugTraceMaxMb: _maxMb, packageAuditMode: _auditMode, packageAuditMinutes: _auditMinutes, ...profilePatch } = args.codingProfile ?? {};
663
807
  const profileResult = CodingProfileSchema.safeParse({ ...currentProfile, ...profilePatch });
664
808
  if (!profileResult.success)
665
809
  throw invalidArguments("coding profile", profileResult.error);
666
810
  nextProfile = profileResult.data;
811
+ if (typeof args.codingProfile?.workspaceDiskMb === "number" || nextKind !== existing.kind) {
812
+ validateWorkspaceDiskMb(nextProfile.workspaceDiskMb);
813
+ }
667
814
  if (args.codingProfile?.services !== undefined)
668
815
  await requireCatalogServiceNames(tx, nextProfile.services);
669
816
  const nextModel = args.model ?? existing.model;
@@ -674,6 +821,19 @@ export function registerAgentTools(mcp) {
674
821
  throw new McpError(400, `Model "${nextModel}" is not supported by coding provider "${nextProfile.provider}".`);
675
822
  }
676
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;
677
837
  const nextSchedule = args.schedule !== undefined ? args.schedule : existing.schedule;
678
838
  const nextTimezone = args.timezone ?? existing.timezone;
679
839
  const nextScheduleEnabled = args.scheduleEnabled ?? existing.scheduleEnabled;
@@ -687,7 +847,11 @@ export function registerAgentTools(mcp) {
687
847
  ...(modeArg ? { nativeExecutionMode: toStoredMode(modeArg) } : {}),
688
848
  };
689
849
  const stamp = authorization ? profileStamp(authorization) : {};
690
- 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
+ };
691
855
  const profileMutation = nextKind === "native"
692
856
  ? existing.codingProfile
693
857
  ? { delete: true }
@@ -695,29 +859,46 @@ export function registerAgentTools(mcp) {
695
859
  : existing.codingProfile
696
860
  ? { update: { ...nextProfile, ...stamp, ...trace } }
697
861
  : { create: { ...nextProfile, ...stamp, ...trace } };
862
+ const scheduleStart = await scheduleStartFields(tx, existing, {
863
+ schedule: nextSchedule,
864
+ timezone: nextTimezone,
865
+ scheduleEnabled: nextScheduleEnabled,
866
+ });
698
867
  return tx.agent.update({
699
868
  where: { id },
700
869
  data: {
701
870
  ...updates,
871
+ ...scheduleStart,
702
872
  ...(profileMutation ? { codingProfile: profileMutation } : {}),
703
873
  },
704
874
  include: { codingProfile: true },
705
875
  });
706
876
  }, { isolationLevel: Prisma.TransactionIsolationLevel.Serializable });
707
- if (debugTraceUntil !== undefined) {
877
+ if (debugTraceUntil !== undefined || debugTraceMaxMb !== undefined) {
708
878
  agentsLog.info({
709
879
  event: "coding.debug_trace.set",
710
880
  agentId: agent.id,
711
- until: debugTraceUntil?.toISOString() ?? null,
881
+ ...(debugTraceUntil !== undefined ? { until: debugTraceUntil?.toISOString() ?? null } : {}),
882
+ ...(debugTraceMaxMb !== undefined ? { maxMb: debugTraceMaxMb } : {}),
712
883
  by: ctx.principal.id,
713
884
  }, "coding debug trace set");
714
885
  }
715
- return textResult(withOperatorMode(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)));
716
896
  },
717
897
  });
718
898
  mcp.registerTool({
719
899
  name: "list_agents",
720
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.",
721
902
  inputSchema: { type: "object", properties: {}, additionalProperties: false },
722
903
  handler: async (_args, ctx) => {
723
904
  const [where, accessOf] = await Promise.all([readableAgentsWhere(ctx), agentAccessResolver(ctx)]);
@@ -742,12 +923,13 @@ export function registerAgentTools(mcp) {
742
923
  // A7: a tool's code and schema are its owner's, whoever can read the
743
924
  // agent (the agent's owner included). Capabilities stay visible: config.
744
925
  return textResult({
745
- ...withOperatorMode(agent),
926
+ ...withProfileWarnings(withOperatorMode(agent)),
746
927
  access,
747
- 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) => ({
748
930
  ...attachment,
749
- tool: projectTool(attachment.tool, ctx.principal.id),
750
- })),
931
+ tool: await withZod3ToolWarnings(projectTool(attachment.tool, ctx.principal.id)),
932
+ }))),
751
933
  });
752
934
  },
753
935
  });
@@ -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({
@@ -12,7 +12,7 @@
12
12
  */
13
13
  import { z } from "zod";
14
14
  import { Prisma } from "#prisma";
15
- import { EVERYONE_KEY, EVERYONE_MAX, LEVELS, SHAREABLE_TYPES, accessRank, atLeast, isLevel, isResourceType, principalGranteeKey, } from "../../core/grants.js";
15
+ import { EVERYONE_KEY, EVERYONE_MAX, LEVELS, agentOwnerBindings, SHAREABLE_TYPES, accessRank, atLeast, isLevel, isResourceType, principalGranteeKey, } from "../../core/grants.js";
16
16
  import { agentNotFound, assertAgentAccess, agentAccess } from "../auth/access.js";
17
17
  import { permissionsOf } from "../auth/resource-server.js";
18
18
  import { McpError } from "../errors.js";
@@ -107,7 +107,7 @@ export function registerGrantTools(mcp) {
107
107
  "Owner-only whatever the level: the coding profile (task, base ref, protected paths, task-override opt-in, image, packages, limits), kind, budget group, sub-agents, secret/datastore/repository bindings, tool capabilities, memory and datastore contents, grants, delete. " +
108
108
  "Consequences: execute lets them run your agent with your tools, secrets, datastores and repository, and every run shares the agent's memory; they supply no task text unless it's a coding agent with allowWebhookTaskOverride. " +
109
109
  "Write lets them rewrite what those runs do: the prompt can make a run use everything the agent can already reach (the capabilities you granted, its memory, its linked repositories), and on a coding agent the prompt is part of every coding task, so write directs work done with your GitHub access. " +
110
- "Granting again replaces the level. Everyone is capped at execute. The grantee must have signed in once.",
110
+ "Granting again replaces the level. Everyone may get write only on a native agent with no secrets, datastores, repositories, sub-agents or tool capabilities. The grantee must have signed in once.",
111
111
  inputSchema: {
112
112
  type: "object",
113
113
  additionalProperties: false,
@@ -131,7 +131,13 @@ export function registerGrantTools(mcp) {
131
131
  throw new McpError(400, "The owner already has full access; a grant to yourself or the owner changes nothing.");
132
132
  }
133
133
  if (!principal && accessRank(type, args.level) > accessRank(type, EVERYONE_MAX[type])) {
134
- throw new McpError(400, `An everyone grant can be at most ${EVERYONE_MAX[type]}: write for everyone would let anyone rewrite an agent that holds your tools and secrets.`);
134
+ throw new McpError(400, `An everyone grant can be at most ${EVERYONE_MAX[type]}.`);
135
+ }
136
+ if (!principal && atLeast(type, args.level, "write")) {
137
+ const bindings = await agentOwnerBindings(tx, resource.id);
138
+ if (bindings.length) {
139
+ throw new McpError(409, `Agent "${resource.id}" holds ${bindings.join(", ")}: write for everyone would let anyone rewrite an agent that uses them. Detach them first, or grant everyone execute.`);
140
+ }
135
141
  }
136
142
  const granteeKey = principal ? principalGranteeKey(principal.id) : EVERYONE_KEY;
137
143
  const grant = await tx.resourceGrant.upsert({
@@ -1,5 +1,7 @@
1
1
  import { requireAgentAccess } from "../auth/access.js";
2
2
  import { textResult } from "./text-result.js";
3
+ import { SecretInValueError, SecretCheckUnavailableError } from "../../core/secret-guard.js";
4
+ import { McpError } from "../errors.js";
3
5
  export function registerMemoryTools(mcp) {
4
6
  mcp.registerTool({
5
7
  name: "get_agent_memory",
@@ -39,7 +41,15 @@ export function registerMemoryTools(mcp) {
39
41
  },
40
42
  handler: async (args, ctx) => {
41
43
  await requireAgentAccess(ctx, args.agentId, "owner");
42
- await ctx.providers.memory.set(args.agentId, args.key, args.content);
44
+ try {
45
+ await ctx.providers.memory.set(args.agentId, args.key, args.content);
46
+ }
47
+ catch (err) {
48
+ if (err instanceof SecretInValueError || err instanceof SecretCheckUnavailableError) {
49
+ throw new McpError(400, err.message);
50
+ }
51
+ throw err;
52
+ }
43
53
  return textResult({ ok: true });
44
54
  },
45
55
  });
@@ -10,7 +10,7 @@
10
10
  * for the whole deployment, no per-user OAuth), so link/unlink/test need
11
11
  * agents:admin with the admin role, and the approver is stamped on the
12
12
  * link. Exactly one of projectKey/agentId is the link's subject (enforced
13
- * again by a DB CHECK constraint); `events` narrows which of the six
13
+ * again by a DB CHECK constraint); `events` narrows which of the
14
14
  * workflow event kinds post to it (empty/omitted = all); private Slack
15
15
  * channels always need /invite @<app> before the bot can see or post to
16
16
  * them. See docs/private/2026-10-08-slack-workflow-notifications-design.md §8.
@@ -52,7 +52,7 @@ export function registerNotificationChannelTools(mcp) {
52
52
  "matches events for issues in that project; an agent link matches events for that agent's runs. " +
53
53
  "channel is the Slack channel id (C… for public, G… for private), never a #name — find it in the channel's " +
54
54
  "details in Slack. Private channels always need /invite @<app> before the bot can see or post to them. " +
55
- "events narrows which of the six workflow event kinds post to this link; empty or omitted means all. " +
55
+ "events narrows which of the workflow event kinds post to this link; empty or omitted means all. " +
56
56
  "includeCost appends the run's spend line to messages. Re-linking the same channel + subject replaces events and " +
57
57
  "includeCost and clears any previously recorded delivery error — always send the full desired state.",
58
58
  inputSchema: {
@@ -0,0 +1,2 @@
1
+ import type { WardbyMcpServer } from "../server.js";
2
+ export declare function registerPackageTools(mcp: WardbyMcpServer): void;