@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
@@ -49,5 +49,9 @@ the coding-proxy coverage, so verify required signals before production use.
49
49
  - Alert on request failures, budget cutoffs, cleanup failures, stalled runs,
50
50
  and sustained latency or memory growth.
51
51
  - Confirm alerts reach an owned channel and rehearse one response path.
52
+ - Watch the logs for package audit mode: the control plane logs
53
+ `coding.package_audit.set` when an owner turns it on, off or extends it, and
54
+ the coding proxy logs `registry.audited` for each package it installs
55
+ because of it (see [Package audit mode](coding-packages.md#package-audit-mode)).
52
56
  - Treat telemetry as operational evidence, not as a replacement for Wardby's
53
57
  accounting database.
@@ -40,6 +40,15 @@ repository-scoped GitHub App installation, and a deliberately small budget.
40
40
  Verify the requested diff, terminal outcome, cost, resource cleanup, and branch
41
41
  cleanup. See [local coding-agent setup](coding-agent-setup.md).
42
42
 
43
+ The bundled help catalog is built for the version in `package.json`.
44
+ `appliesTo` on each help article must name its minimum release; later articles
45
+ stay in source but are omitted from that release's CLI and MCP help. The build
46
+ fails when an included article links to an omitted one. When adding a newer
47
+ feature to an older article, move its guidance into a suitably versioned
48
+ article or update the older article so it remains accurate for its stated
49
+ minimum release. Mark newer features in the public `docs/` guides with their
50
+ minimum release as well.
51
+
43
52
  Before production deployment, review [runtime architecture](architecture-runtime.md),
44
53
  [coding-worker isolation](coding-worker-isolation.md), and the
45
54
  [security deployment guide](security-deployment.md). A self-hosted operator is
@@ -79,15 +79,15 @@ Scopes and roles do different jobs:
79
79
  - **Roles authorize.** A user has a set of roles. With no roles, the user is a
80
80
  member:
81
81
 
82
- | Role | Grants |
83
- | ------------------ | -------------------------------------------------------------------------------------- |
84
- | `admin` | `agents:admin`, `packages:approve`, `services:manage`, `admin:view` and `models:admin` |
85
- | `package-approver` | `packages:approve` |
86
- | `service-manager` | `services:manage` |
87
- | `model-manager` | `models:admin` |
88
- | (none) | nothing privileged; every other scope works as the token allows |
82
+ | Role | Grants |
83
+ | ------------------ | ------------------------------------------------------------------------------------------------------ |
84
+ | `admin` | `agents:admin`, `packages:approve`, `services:manage`, `admin:view`, `models:admin` and `power:manage` |
85
+ | `package-approver` | `packages:approve` |
86
+ | `service-manager` | `services:manage` |
87
+ | `model-manager` | `models:admin` |
88
+ | (none) | nothing privileged; every other scope works as the token allows |
89
89
 
90
- Seven operations are privileged:
90
+ Eight operations are privileged:
91
91
 
92
92
  - `make_owner`, which reassigns any agent's owner, including another
93
93
  principal's private agent (see [Sharing agents](#sharing-agents) for what
@@ -104,7 +104,10 @@ Seven operations are privileged:
104
104
  (`set_model`, `disable_model`, `reset_model`; reading the catalog is
105
105
  `agents:read`, see [models.md](models.md));
106
106
  - reading every owner's runs through the admin viewer API (see
107
- [viewer-api.md](viewer-api.md)).
107
+ [viewer-api.md](viewer-api.md));
108
+ - reading low-power state and scaling the coding proxy and native gateway to
109
+ zero now (`power_status`, `power_sleep`; see
110
+ [Low-power mode](getting-started-gke.md#low-power-mode)).
108
111
 
109
112
  Each needs **both** its scope on the token **and** a role that grants that
110
113
  permission:
@@ -114,10 +117,12 @@ permission:
114
117
  - Service catalog changes need `services:manage`.
115
118
  - Model catalog changes need `models:admin`.
116
119
  - The admin viewer API needs `admin:view`, which only the `admin` role grants.
120
+ - `power_status` and `power_sleep` need `power:manage`, which only the `admin`
121
+ role grants.
117
122
 
118
123
  In practice:
119
124
 
120
- - an `admin` can do all seven;
125
+ - an `admin` can do all eight;
121
126
  - a `package-approver` can approve packages only;
122
127
  - a `service-manager` can change the service catalog only;
123
128
  - a `model-manager` can change the model catalog only;
@@ -190,7 +195,10 @@ See the [Fetch standard](https://fetch.spec.whatwg.org/#append-a-request-origin-
190
195
 
191
196
  Clients must re-register as public clients (`token_endpoint_auth_method=none`).
192
197
  Only S256 PKCE and exact registered redirect strings are accepted. Redirects
193
- must be HTTPS or loopback HTTP, without credentials or fragments. Registration
198
+ must be HTTPS or loopback HTTP, or, only with `WARDBY_MOBILE_ENABLED=true`,
199
+ exactly the configured mobile redirect (`WARDBY_MOBILE_REDIRECT_URI`, default
200
+ `com.wardby.mobile:/oauth`; see the `mobile-app` help article), without
201
+ credentials or fragments. Registration
194
202
  allows 1-10 redirects and a bounded client name. `AUTH_MAX_CLIENTS` defaults to
195
203
  1000; PostgreSQL serializes capacity checks and shares rate limits across
196
204
  processes. There is no confidential-client support or client secret.
@@ -258,8 +266,17 @@ so a tool a write-grantee attaches runs with none until you re-run
258
266
  the coding profile, kind and budget group; and sub-agents, since an edge
259
267
  would hand every run's data to another agent.
260
268
 
261
- **Everyone** can be granted at most `execute`: everyone-write would let
262
- anyone rewrite an agent that holds your tools and secrets.
269
+ **Everyone** (any signed-in principal) can be granted up to `write`, a
270
+ public agent anyone can list, run and edit, but only while the agent holds
271
+ none of its owner's bindings: secrets, datastores, repositories, sub-agents,
272
+ tool capabilities, or a coding repository (so a coding agent is never
273
+ public-write). `grant_access` refuses everyone-`write` on an agent that has
274
+ any, and the binding tools (`attach_secret`, `attach_datastore`,
275
+ `link_repository` including an admin's `adminOverride`, `attach_subagent`,
276
+ and `attach_tool` with capabilities) refuse to add one to an agent everyone
277
+ can write, as `update_agent` refuses making it a coding agent. Otherwise anyone could
278
+ rewrite the prompt of an agent that uses your secrets. Detach the bindings
279
+ first, or grant everyone `execute` instead.
263
280
 
264
281
  **Nothing crosses owners without a grant on that exact resource**, checked
265
282
  when bindings are written and again at run time, so rows written before this
@@ -456,6 +473,15 @@ stale, whichever executor id owns it. Set a fixed id only for a single,
456
473
  long-lived process that should re-drive its own runs at launch rather than
457
474
  after the heartbeat timeout.
458
475
 
476
+ An owner that is stalled but still alive (event-loop or database-pool
477
+ starvation long enough for its heartbeat to go stale) can overlap the attempt
478
+ another process adopted. The first attempt to record a step keeps the run; the
479
+ other stops at that step without writing the run or sending any
480
+ notifications, and DBOS parks it as a duplicate execution. That stopped step's
481
+ model spend is discarded rather than counted against the run, so look for the
482
+ `run_ownership_lost` warning in the server logs (it carries the run id, the
483
+ step, and the discarded usage when known) to see how often this happens.
484
+
459
485
  **New data at rest.** Durable execution checkpoints every step's result into
460
486
  `dbos.operation_outputs`: each turn's assistant text, every tool call's
461
487
  arguments, every tool result in full, and the `load` step's pinned agent
@@ -499,8 +525,10 @@ records. Delete them (see pruning above) if you want the rollback to be final.
499
525
  | Surface | Limit |
500
526
  | ------------------------------ | ------------------------------------------------- |
501
527
  | MCP/webhook bodies | 1 MiB raw bytes |
528
+ | MCP tool-call arguments | 100,000 array elements and object members |
502
529
  | Auth bodies | 64 KiB raw bytes |
503
530
  | Request completion / headers | 15 seconds / 10 seconds |
531
+ | Sandbox invocation | 32 MiB heap, 1 MiB stack, 10 seconds |
504
532
  | Sandbox fetch | 8 MiB encoded and decoded, 5 redirects, 8 seconds |
505
533
  | Bridge input / output | 1 MiB / 12 MiB |
506
534
  | Parser input / console payload | 256 KiB / 16 KiB |
@@ -518,6 +546,26 @@ and pins the validated DNS result to the connection while retaining Host and
518
546
  TLS verification. Cross-origin redirects remove credentials, including custom
519
547
  API-key headers; forwarding a request body across origins is rejected.
520
548
 
549
+ Every sandbox invocation, including the one that validates a custom tool's
550
+ call arguments against its `paramsZod`, runs in a fresh QuickJS runtime with the
551
+ heap, stack, and time limits above. One that hits a limit fails that tool call
552
+ only: the model receives a `validation_failed` or sandbox error result and the
553
+ run continues. The invocation runs on the thread of the process that hosts the
554
+ run (the server, or the run's worker with the native sandbox), so a call that
555
+ runs to the time limit holds that thread for up to 10 seconds.
556
+
557
+ For this release only, a custom tool's `paramsZod` is compiled with Zod 4's
558
+ built-in Zod 3 API (`zod/v3`) so that existing tools keep working; see
559
+ [native capabilities](../help/native-capabilities.md). `zod/v3` does not have
560
+ the fix for GHSA-mrhx-c7xc-m3w5: given an array, set, or map larger than its
561
+ `.max()`, it still checks every element and records an issue for each bad one.
562
+ For a tool's arguments that work stays inside the sandbox limits above, the same
563
+ limits that bound the tool's own code. Wardby's own validation uses Zod 4. A
564
+ tool whose schema the next release (Zod 4 only) would reject is flagged with a
565
+ `warnings` list in `create_tool`, `update_tool`, `dry_run_tool`, `list_tools`
566
+ and `get_agent` results (on tools the caller owns) and in one server log line
567
+ per tool at startup; a warning names only the tool and the removed Zod 3 methods.
568
+
521
569
  Every resolved address must be global. A tool's own `allowedHosts` only
522
570
  narrows egress; it never opens a private, loopback or link-local destination.
523
571
  Only the operator's `WARDBY_FETCH_ALLOWED_HOSTS` (exact normalized hosts) can,
@@ -543,6 +591,23 @@ bound connection pools and concurrent invocations, and review a cancellable
543
591
  database adapter or isolated worker if strict immediate termination is required.
544
592
  Do not claim these per-invocation caps establish a whole-process memory ceiling.
545
593
 
594
+ ## Slack workflow notifications
595
+
596
+ This integration requires Wardby 0.6.0 or later.
597
+
598
+ Optional Slack workflow notifications add no inbound endpoint: wardby only
599
+ ever calls out to Slack's `chat.postMessage`/`chat.update`/`conversations.info`,
600
+ and the app manifest requests no event subscriptions or interactivity, so
601
+ nothing posted in Slack can start or affect a run. What reaches Slack is
602
+ limited to issue keys/titles and their links, pull request numbers and
603
+ links, agent names, review verdicts, fix-round numbers, a failed run's
604
+ reason (its first line, at most 200 characters), and (only when a link opts
605
+ in) the run's spend line — never code, diffs, review bodies, or run output.
606
+ Issue titles are posted regardless of Jira issue security, so link a project
607
+ only to a channel whose members may see every issue in it. The bot token is a provider credential like any other and never
608
+ reaches a sandboxed tool or coding-run worker. See
609
+ [Send workflow updates to Slack](slack-notifications.md).
610
+
546
611
  ## Coding runs on Kubernetes
547
612
 
548
613
  `JOB_LAUNCHER=kubernetes` runs each coding agent in its own pod instead of a
@@ -565,7 +630,7 @@ connects from inside the pod to a destination that must be blocked and requires
565
630
  three consecutive refusals. A cluster that does not enforce policy, or has not
566
631
  yet programmed this pod's rules, never reaches the point of running agent code.
567
632
  The same check runs at startup against a throwaway canary pod, which also
568
- verifies the pod cannot reach DNS, the internet or the cloud metadata endpoint.
633
+ verifies the pod cannot reach DNS, the internet or the cloud metadata endpoints.
569
634
 
570
635
  **RBAC.** The control plane needs a namespace Role (`pods`, `pods/exec`,
571
636
  `pods/log`, `secrets`, `configmaps`, `networkpolicies`, `services`) and a
@@ -579,6 +644,15 @@ has none, so that configuration is development-only and says so. Set
579
644
  `KUBERNETES_RUNTIME_CLASS` to the cluster's sandboxed runtime class in
580
645
  production; the launcher warns loudly when it is unset.
581
646
 
647
+ The `eks` platform profile (Amazon EKS with a gVisor node group) also requires
648
+ the `gvisor` runtime class. The cluster supplies a RuntimeClass `gvisor`
649
+ (handler `runsc`) whose scheduling block targets nodes labelled
650
+ `wardby.dev/sandbox=gvisor` and tainted `sandbox=gvisor:NoSchedule`; coding-pod attestation
651
+ forgives that node selector and toleration and nothing else. The startup canary
652
+ and the native sandbox gate probe the cloud metadata endpoints
653
+ `169.254.169.254`, `169.254.170.23` and `fd00:ec2::23` (EKS Pod Identity agent, IPv4 and IPv6) and
654
+ `fd00:ec2::254` (EC2 IPv6), all on port 80, and require every one to be unreachable.
655
+
582
656
  The `gke-autopilot` platform profile contains narrow admission allowances
583
657
  captured from a real cluster and requires the `gvisor` runtime class. A dry-run
584
658
  capture cannot observe labels added after pod scheduling, so live-run behavior
@@ -592,6 +666,52 @@ Per-run record ConfigMaps currently require operator-managed garbage collection,
592
666
  and the real-cluster suite does not yet cover every Docker containment
593
667
  scenario.
594
668
 
669
+ ## Database authentication
670
+
671
+ By default `DATABASE_URL` carries the database password. On Amazon RDS (or
672
+ Aurora) for PostgreSQL, set `DATABASE_AUTH=rds-iam` to authenticate with IAM
673
+ database authentication instead: the password is a short-lived token signed with
674
+ the workload's AWS credentials (for example EKS Pod Identity), minted when a
675
+ connection opens. Any other value is refused with
676
+ [`database_auth_invalid`](../help/errors/database-auth-invalid.md).
677
+
678
+ Under `rds-iam`:
679
+
680
+ - `DATABASE_URL` must be `postgresql://` (or `postgres://`) with the database
681
+ user and no password, and must contain `sslmode=verify-full` and
682
+ `sslrootcert=<path to the RDS CA bundle>`. The port defaults to 5432.
683
+ - The region comes from `DATABASE_AWS_REGION`, else `AWS_REGION`.
684
+ - The database user must be granted `rds_iam` and the workload's IAM role must
685
+ allow `rds-db:connect` for it.
686
+ - Tokens are valid for 15 minutes and only for opening a connection; Wardby
687
+ reuses one for 10 minutes, and open connections outlive their token.
688
+ - It applies to every app connection: the Prisma clients (server, scheduler,
689
+ coding proxy, native gateway), the DBOS system database
690
+ (`DBOS_SYSTEM_DATABASE_URL`, else `DATABASE_URL`, under the same rules) and
691
+ the viewer's LISTEN connection. The DBOS system pool holds up to 10
692
+ connections; count it in the database's connection budget.
693
+ - URL parameters that are carried over: `application_name`,
694
+ `fallback_application_name`, `options`, `client_encoding`,
695
+ `statement_timeout`, `lock_timeout`, `idle_in_transaction_session_timeout`,
696
+ `query_timeout`. `connection_limit` and `pool_timeout` still size and bound
697
+ the pool, `connect_timeout` (seconds) applies to the DBOS pool, and `schema`
698
+ is accepted with no run-time effect, as in password mode. Every other
699
+ parameter is refused by name, including `sslcert`, `sslkey`, `ssl`, `host` and
700
+ `pgbouncer`; the Cloud SQL `sslcert=` advice does not apply to RDS.
701
+ - A misconfigured setup fails at process start, for every `wardby` command,
702
+ because the database module is loaded at start.
703
+ - `prisma migrate deploy` and `dbos schema` take a URL, not a connection
704
+ config, so they are not covered. Mint a short-lived URL with the helper
705
+ shipped in the migration image and run them within its 15 minutes:
706
+
707
+ ```bash
708
+ DATABASE_URL="$(node scripts/rds-iam-url.mjs)" && export DATABASE_URL && npm run prisma:migrate && npm run dbos:migrate
709
+ ```
710
+
711
+ The helper reads `DATABASE_URL`, `DATABASE_AWS_REGION`/`AWS_REGION` and the
712
+ ambient AWS credentials, and prints a URL containing a credential: never log
713
+ its output. `wardby quickstart` does not support `rds-iam`.
714
+
595
715
  ## Coding package registry
596
716
 
597
717
  Enabling a coding agent's package allowlist widens the trusted proxy's own
@@ -613,6 +733,18 @@ guarantee; and the OSV vulnerability audit fails **closed**
613
733
  operator explicitly sets `REGISTRY_AUDIT_FAIL_OPEN=true` to allow installs
614
734
  through unaudited during an OSV outage.
615
735
 
736
+ ## Native sandbox
737
+
738
+ A native agent set to `nativeExecutionMode=sandbox` runs its turn loop and user
739
+ tools in a single-use container with no credentials, database access, Docker
740
+ socket, or network except the native gateway. The gateway is a trusted
741
+ component: it holds the LLM credentials and integration settings, so give it
742
+ the database and provider settings it needs and nothing else, never the Docker
743
+ socket, and do not publish its port outside the Docker host. Only the server,
744
+ which launches workers, needs Docker access (or, on Kubernetes, permission to
745
+ create pods in the run namespace). See
746
+ [Native sandbox](native-sandbox.md).
747
+
616
748
  ## Images and dependencies
617
749
 
618
750
  ```sh
@@ -0,0 +1,268 @@
1
+ # Send workflow updates to Slack
2
+
3
+ > **Requires Wardby 0.6.0 or later.**
4
+
5
+ Link a Slack channel to a Jira project or to an agent (native or coding), and wardby posts
6
+ that project's or agent's workflow updates there: a card picked up, a pull
7
+ request opened, a review verdict, fix rounds, and the merge — one thread per
8
+ card. This is outbound only: nothing in Slack starts or affects a run, and
9
+ wardby exposes no new inbound endpoint for it.
10
+
11
+ ## What it does
12
+
13
+ ### Events
14
+
15
+ Eight kinds of lifecycle event can post to a linked channel:
16
+
17
+ | Kind | Posts when | Content |
18
+ | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
19
+ | `issue_picked_up` | A Jira event starts a run on a linked issue | Issue key, title, and link; agent name; trigger kind |
20
+ | `run_failed` | A top-level run ends `failed`, `refused`, `budget_exhausted`, `cancelled`, or `lost` | Agent name, status, a short first-line reason (never the full error) |
21
+ | `run_blocked` | A top-level run succeeds without a pull request, but a coding child refused packages and made no changes or failed | ⛔ Blocked status, refused packages, and code-specific fixes |
22
+ | `pr_opened` | A coding run opens a pull request | Repository#number and link, the issue it is for, any Jira status move |
23
+ | `review_posted` | wardby's own review check posts a verdict | `APPROVE` / `CHANGES_REQUESTED` / `COMMENT`, the reviewer agent, the PR link |
24
+ | `review_fix` | An automatic [fix round](../help/review-fix-rounds.md) starts or hits the cap | Round number of the cap, started or capped |
25
+ | `pr_closed` | A pull request is merged or closed | Merged or closed, any Jira status move |
26
+ | `packages_audited` | A top-level run ends (any status) and its coding children installed anything under [package audit mode](coding-packages.md#package-audit-mode) | The mode, up to ten package names to approve, any names of unknown relation listed apart, and counts of their dependencies and of advisories served past |
27
+
28
+ A successful run normally shows up as `pr_opened` or `review_posted`. A run
29
+ blocked by package refusals instead emits `run_blocked`, once per run, using
30
+ the same rule and guidance as [status comments](../help/status-comments.md): a
31
+ run that answered, or worked around a refusal, is not blocked. Child
32
+ coding runs surface through their parent's events.
33
+
34
+ Some runs do not post `run_failed` at all:
35
+
36
+ - a coding agent's run triggered directly (rather than as a child of a
37
+ native agent's run),
38
+ - a review verdict or failure from a coding agent acting as the reviewer, and
39
+ - runs started from the `wardby run` CLI command.
40
+
41
+ `pr_opened` and `pr_closed` also post for a pull request opened from a GitHub
42
+ issue mention, the same as for a Jira issue: GitHub issues record the pull
43
+ requests opened for them. The thread is the issue's, one per GitHub issue
44
+ (`issue:github:owner/repo#N`) however many pull requests it has, not one per
45
+ pull request. Once a pull request is recorded for the issue, its
46
+ `review_posted` and `review_fix` events reply in that thread too. The run
47
+ events (`run_failed`, `run_blocked`, `packages_audited`) of a run a GitHub
48
+ issue mention started are not tied to the issue and post in a thread of
49
+ their own.
50
+
51
+ A pull request linked to several issues posts `pr_opened` and `pr_closed`
52
+ only to the first linked issue's thread.
53
+
54
+ ### Threads
55
+
56
+ Each channel gets one thread per card: one per issue (a Jira issue, or the
57
+ GitHub issue a pull request was opened from) when the event has one, else one
58
+ per pull request. The first event for a card
59
+ posts a parent message naming the issue or pull request; every later event
60
+ for the same card is a reply in that thread, and the parent is kept updated
61
+ with a short status line. The statuses are:
62
+
63
+ | Status | Set by |
64
+ | ---------------------- | ---------------------------------------------------------------- |
65
+ | `picked up` | `issue_picked_up` on a new thread, or after `merged ✅`/`closed` |
66
+ | `PR open` | `pr_opened` |
67
+ | `changes requested` | a `CHANGES_REQUESTED` review |
68
+ | `approved` | an `APPROVE` review |
69
+ | `fixing` | a fix round starting (the round number is in the thread reply) |
70
+ | `fix rounds exhausted` | fix rounds reaching the cap with changes still requested |
71
+ | `merged ✅` | the pull request merged |
72
+ | `closed` | the pull request closed without merging |
73
+ | `blocked ⛔` | `run_blocked` |
74
+ | `failed ❌` | `run_failed` |
75
+
76
+ A `COMMENT` review and `packages_audited` leave the status as it was. `merged ✅` and `closed` stick:
77
+ a late review, fix round, failure, or repeated close does not change them.
78
+ Only a new start does — the card picked up again, or a new pull request
79
+ opened for it — which sets `picked up` or `PR open` again.
80
+
81
+ Most events only post as a thread reply. A merge, a blocked run, and a top-level run failure
82
+ also post to the channel itself, so they are visible without opening the
83
+ thread.
84
+
85
+ ### What is never sent
86
+
87
+ wardby never posts code, diffs, review bodies, or run output to Slack. Error
88
+ messages shown in Slack are a short first line only (at most 200 characters),
89
+ never a full error or stack trace.
90
+
91
+ ## 1. Create the Slack app
92
+
93
+ Use the manifest in [`deploy/slack/app-manifest.yaml`](../deploy/slack/app-manifest.yaml):
94
+
95
+ 1. Open [api.slack.com/apps](https://api.slack.com/apps), choose **Create New
96
+ App → From a manifest**, pick your workspace, and paste the manifest.
97
+ 2. On **OAuth & Permissions**, click **Install to Workspace** and approve the
98
+ requested scopes.
99
+ 3. Copy the **Bot User OAuth Token** (starts `xoxb-`).
100
+
101
+ See [`deploy/slack/README.md`](../deploy/slack/README.md) for the full
102
+ walkthrough, including the optional per-agent display-name scope.
103
+
104
+ ## 2. Configure wardby
105
+
106
+ | Variable | Value |
107
+ | --------------------------- | ------------------------------------------------------------------------------------------------- |
108
+ | `WARDBY_SLACK_BOT_TOKEN` | The bot token from step 1 (`xoxb-…`). Unset = Slack notifications are disabled. |
109
+ | `WARDBY_SLACK_API_BASE_URL` | Optional. Overrides the Slack Web API base URL (`https://slack.com/api`); must be `https`. |
110
+ | `WARDBY_SLACK_CUSTOMIZE` | Optional, `true` or `false` (default `false`). Needs `chat:write.customize` in the installed app. |
111
+
112
+ Store `WARDBY_SLACK_BOT_TOKEN` in your secrets backend the same way you store
113
+ other provider credentials (`GITHUB_APP_PRIVATE_KEY`, `WARDBY_JIRA_API_TOKEN`)
114
+ — never in a committed file. On the GKE reference deployment, see
115
+ [Getting started on GKE](getting-started-gke.md). Restart wardby after setting
116
+ it. The startup log line `chat notifications acting as` names the Slack team
117
+ and bot user id wardby authenticated as. If that check fails instead, wardby
118
+ only logs an error and still starts: it does not fail to boot, and delivery
119
+ is not paused up front. Delivery pauses when the first actual delivery fails
120
+ authentication (see [Failure modes](#failure-modes)).
121
+
122
+ With `WARDBY_SLACK_CUSTOMIZE=true`, a message about an event that names an
123
+ agent (`issue_picked_up`, `run_failed`, `run_blocked`, `review_posted`, `packages_audited`) is posted under that
124
+ agent's name; every other message, and every message when the option is off,
125
+ posts as `wardby`. A thread's parent message uses the name of the event that
126
+ started the thread. wardby sets no icon.
127
+
128
+ Without `WARDBY_SLACK_BOT_TOKEN`, `link_notification_channel` and
129
+ `test_notification_channel` are refused and the dispatcher does not start;
130
+ `unlink_notification_channel` and `list_notification_channels` still work, so
131
+ you can clean up old links. See
132
+ [`errors/slack-not-configured`](../help/errors/slack-not-configured.md).
133
+
134
+ ## Scopes and why
135
+
136
+ | Scope | Required | Used for |
137
+ | ---------------------- | ----------- | --------------------------------------------------------------------------------------------------------- |
138
+ | `chat:write` | Yes | Posting and updating the bot's own messages, including threaded replies |
139
+ | `chat:write.public` | Recommended | Posting to public channels without inviting the bot first |
140
+ | `channels:read` | Recommended | Validating a channel id and recording its name when linking |
141
+ | `groups:read` | Recommended | The same, for private channels |
142
+ | `chat:write.customize` | Optional | Posting under the name of the agent an event is about instead of `wardby` (`WARDBY_SLACK_CUSTOMIZE=true`) |
143
+
144
+ Without `channels:read`/`groups:read`, linking still accepts a raw channel id
145
+ but skips validating it. Any other authentication error while linking (an
146
+ invalid or revoked token) refuses the link; see
147
+ [`errors/slack-auth-failed`](../help/errors/slack-auth-failed.md). Private channels always need `/invite @wardby` (or
148
+ whatever you named the app) regardless of scopes — Slack never lets a bot see
149
+ or post to a private channel it hasn't been invited to. `chat.postMessage` is
150
+ rate-limited to about one message per second per channel; wardby's dispatcher
151
+ paces its own posts to stay under that.
152
+
153
+ ## Link channels
154
+
155
+ Use the `link_notification_channel` MCP tool. It needs `agents:admin` with
156
+ the admin role, the same trust model as `link_issue_project`: wardby cannot
157
+ verify a caller's own Slack workspace access, so an administrator approves
158
+ every link.
159
+
160
+ Link a channel to a Jira project:
161
+
162
+ ```json
163
+ {
164
+ "channel": "C0123456789",
165
+ "projectKey": "PAY",
166
+ "issueProvider": "jira",
167
+ "events": ["issue_picked_up", "pr_opened", "review_posted", "pr_closed"],
168
+ "includeCost": true
169
+ }
170
+ ```
171
+
172
+ Link a channel to an agent instead (every event for that agent's runs, no
173
+ filter):
174
+
175
+ ```json
176
+ {
177
+ "channel": "C0123456789",
178
+ "agentId": "<agent id>"
179
+ }
180
+ ```
181
+
182
+ - Give exactly one of `projectKey` (with optional `issueProvider`, default
183
+ `jira`) or `agentId`.
184
+ - `channel` is the Slack channel id — `C…` for a public channel, `G…` for a
185
+ private one — never a `#name`. Find it in the channel's details in Slack
186
+ (**View channel details**, near the bottom). Passing a `#name` is refused.
187
+ - `events` narrows which of the six kinds post to this link; omit it (or pass
188
+ an empty list) for all six.
189
+ - `includeCost` appends the run's spend line to messages for this link.
190
+ - Invite the bot to any private channel before linking it:
191
+ `/invite @wardby` in that channel.
192
+ - Re-linking the same channel and subject replaces `events` and
193
+ `includeCost` and clears any previously recorded delivery error — send the
194
+ full desired state each time.
195
+
196
+ Then confirm delivery works before relying on it:
197
+
198
+ ```json
199
+ { "id": "<link id from link_notification_channel>" }
200
+ ```
201
+
202
+ `test_notification_channel` posts "✅ wardby is connected to this channel." —
203
+ if the bot can't write there, you get the error immediately instead of
204
+ finding out when the first real event is dropped. A successful test also
205
+ clears the link's `lastError`.
206
+
207
+ `list_notification_channels` shows every link's `lastError` and its pending
208
+ and failed delivery counts (counted per channel: two links to the same
209
+ channel show the same counts); filter by `projectKey`, `agentId`, or `channel`.
210
+ Listing your own agent's links needs read access to that agent; listing
211
+ everything (or filtering by `projectKey`) needs `agents:admin` with the admin
212
+ role. `unlink_notification_channel` removes a link by `id`.
213
+
214
+ ## Failure modes
215
+
216
+ - **Channel not found, bot not in channel, or channel archived.** That
217
+ channel's pending deliveries fail immediately and are never retried, and
218
+ every link to it shows the error in `lastError`. Invite the bot
219
+ (`/invite @wardby`) or otherwise fix the channel in Slack. New events
220
+ deliver as soon as the bot can post there again; the deliveries that
221
+ already failed are not resent. Re-linking the channel (or a successful
222
+ `test_notification_channel`) clears `lastError`. See
223
+ [`errors/slack-channel-unreachable`](../help/errors/slack-channel-unreachable.md).
224
+ - **Invalid or revoked token.** Delivery pauses for every linked channel (no
225
+ deliveries are lost — they stay pending), and wardby re-checks the token
226
+ every five minutes with Slack's `auth.test`; it resumes automatically once
227
+ the check succeeds. See
228
+ [`errors/slack-auth-failed`](../help/errors/slack-auth-failed.md).
229
+ - **A missing scope.** Delivery pauses the same way, but `auth.test` needs no
230
+ scope, so the five-minute check succeeds, the next delivery fails again,
231
+ and delivery pauses again. It does not fix itself: add the scope to the app
232
+ and reinstall it to the workspace (and if Slack issues a new token, set it
233
+ and restart wardby). Pending deliveries are kept and sent once it works.
234
+ - **Rate limits.** wardby paces its own posts to about one per second per
235
+ channel; if Slack still responds with a rate-limit error, that delivery is
236
+ retried after the delay Slack specifies, with no attempt counted against
237
+ the retry limit below.
238
+ - **Transient errors** (network issues, Slack 5xx responses) are retried with
239
+ increasing back-off, up to 10 attempts, before the delivery is marked
240
+ failed.
241
+ - **Events while Slack isn't configured.** An event recorded before
242
+ `WARDBY_SLACK_BOT_TOKEN` is set is not queued and is not delivered once you
243
+ configure it — only events recorded after Slack notifications are enabled
244
+ reach Slack.
245
+ - **Duplicates.** Delivery is at least once: if wardby crashes or loses its
246
+ database connection right after Slack accepts a message, that message can
247
+ be posted again. A rare duplicate thread reply is possible.
248
+ - **Retention.** Delivery records are kept for 30 days and then pruned.
249
+
250
+ ## Security
251
+
252
+ Phase 1 is outbound only: wardby requests no event subscriptions and no
253
+ interactivity in the manifest, so there is no new inbound endpoint and
254
+ nothing posted in Slack can start or affect a run.
255
+
256
+ What leaves to Slack: issue keys, titles, and their links; pull request
257
+ numbers and links; agent names; review verdicts; fix-round numbers; a failed
258
+ run's reason (its first line, at most 200 characters); and, only when a
259
+ link's `includeCost` is on, the run's spend line. wardby never posts code,
260
+ diffs, review bodies, or run output, and an error message shown in Slack is a
261
+ short first line only, never a full error or stack trace.
262
+
263
+ Issue titles go to the linked channel regardless of Jira issue security: an
264
+ issue restricted by a Jira security level still has its key and title posted.
265
+ Link a project only to a channel whose members may see every issue in it.
266
+
267
+ The bot token stays on the wardby server; agents, sandboxed tools, and
268
+ coding-run workers never see it.