@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
@@ -25,6 +25,8 @@ model Agent {
25
25
  systemPrompt String
26
26
  model String
27
27
  budgetUsd Decimal @db.Decimal(10, 4)
28
+ /// Percent above budgetUsd a run may spend: each coding run's limit, or (on a lead agent) its run tree's ceiling for coding sub-agents; native model calls are unaffected; group caps still apply.
29
+ allowedOverrunPercent Int @default(0)
28
30
  createdAt DateTime @default(now())
29
31
  updatedAt DateTime @updatedAt
30
32
  runs Run[]
@@ -39,25 +41,26 @@ model Agent {
39
41
  lastScheduledAt DateTime?
40
42
 
41
43
  // Phase 3: tools + multi-turn loop.
42
- tools AgentTool[]
43
- maxTurns Int @default(10)
44
+ tools AgentTool[]
45
+ maxTurns Int @default(10)
44
46
  /// Sub-agent delegations one run may make (delegate_to_*), each to a different sub-agent. 1 = route to exactly one.
45
- maxDelegationsPerRun Int @default(1)
47
+ maxDelegationsPerRun Int @default(1)
46
48
  /// Native leads: the delegate_to_* calls of one model turn run at the same time. False = one after another.
47
- parallelDelegations Boolean @default(false)
49
+ parallelDelegations Boolean @default(false)
48
50
 
49
51
  // Phase 4: ownership. Null = owner-less, a transition state only: access
50
52
  // then comes from ResourceGrant rows alone (the migration gives everyone
51
53
  // execute), and `wardby grants adopt-public` assigns an owner. See
52
54
  // ResourceGrant.
53
- ownerId String?
54
- owner Principal? @relation(fields: [ownerId], references: [id])
55
- secrets AgentSecret[]
56
- datastores AgentDatastore[]
57
- webhooks Webhook[]
58
- repositories AgentRepository[]
59
- deferredReviews DeferredReview[]
60
- issueProjects AgentIssueProject[]
55
+ ownerId String?
56
+ owner Principal? @relation(fields: [ownerId], references: [id])
57
+ secrets AgentSecret[]
58
+ datastores AgentDatastore[]
59
+ webhooks Webhook[]
60
+ repositories AgentRepository[]
61
+ deferredReviews DeferredReview[]
62
+ issueProjects AgentIssueProject[]
63
+ notificationChannels NotificationChannel[]
61
64
 
62
65
  /// Self-defects opt-in: the Jira project and issue type wardby files the agent's own failures into. Both or neither.
63
66
  defectProjectKey String?
@@ -78,6 +81,12 @@ model Agent {
78
81
  /// Null = the provider's default.
79
82
  effort String?
80
83
 
84
+ /// Native agents only: where their runs execute. control-plane (default) =
85
+ /// in this server process (in-process or DBOS); sandbox = an isolated,
86
+ /// single-use worker container/pod. Each Run snapshots this at creation
87
+ /// (Run.nativeExecutionMode), so a change reaches only later runs.
88
+ nativeExecutionMode NativeExecutionMode @default(control_plane)
89
+
81
90
  /// Un-phased: sub-agent composition edges (see AgentSubAgent below). An
82
91
  /// agent can be a parent (has children it can delegate to) and/or a
83
92
  /// child (is delegated to by others) independently.
@@ -134,6 +143,12 @@ enum AgentKind {
134
143
  coding
135
144
  }
136
145
 
146
+ /// Where a native agent's runs execute (Agent.nativeExecutionMode).
147
+ enum NativeExecutionMode {
148
+ control_plane @map("control-plane")
149
+ sandbox
150
+ }
151
+
137
152
  enum RunStatus {
138
153
  pending
139
154
  running
@@ -312,51 +327,72 @@ enum RunTrigger {
312
327
  }
313
328
 
314
329
  model Run {
315
- id String @id @default(cuid())
316
- agent Agent @relation(fields: [agentId], references: [id])
317
- agentId String
318
- status RunStatus @default(pending)
319
- trigger RunTrigger @default(manual)
320
- tokensIn Int @default(0)
321
- tokensOut Int @default(0)
322
- costUsd Decimal @default(0) @db.Decimal(10, 6)
323
- error String?
324
- startedAt DateTime @default(now())
325
- finishedAt DateTime?
330
+ id String @id @default(cuid())
331
+ agent Agent @relation(fields: [agentId], references: [id])
332
+ agentId String
333
+ status RunStatus @default(pending)
334
+ trigger RunTrigger @default(manual)
335
+ tokensIn Int @default(0)
336
+ tokensOut Int @default(0)
337
+ costUsd Decimal @default(0) @db.Decimal(10, 6)
338
+ error String?
339
+ startedAt DateTime @default(now())
340
+ finishedAt DateTime?
326
341
  /// Phase 2: beaten by the executor while running; a stale value past
327
342
  /// HEARTBEAT_TIMEOUT is how the reconciler finds an orphaned run.
328
- heartbeatAt DateTime?
343
+ heartbeatAt DateTime?
329
344
  /// Phase 4: EngineResult.finalText, persisted so a Task (MCP) or later
330
345
  /// inspection can read a completed run's answer. Previously only ever
331
346
  /// streamed live via onText and dropped — no durable place to read it
332
347
  /// from until this field existed.
333
- finalText String?
348
+ finalText String?
334
349
  /// Phase 4: EngineResult.turns, persisted for the same reason as
335
350
  /// finalText — MCP's list_runs/get_run need it and it was previously
336
351
  /// dropped after the engine returned.
337
- turns Int @default(0)
352
+ turns Int @default(0)
338
353
  /// The run's model catalog entry, recorded when it started (native: the
339
354
  /// runner's load step; coding: dispatch). The run is billed at these rates
340
355
  /// for its whole life, resumes included. Null on runs from before the
341
356
  /// model catalog.
342
- pricingVersion String?
343
- pricingSnapshot Json?
357
+ pricingVersion String?
358
+ pricingSnapshot Json?
344
359
  /// Detached executors are recovered by handle rather than inferred from trigger.
345
- executionManaged Boolean @default(false)
360
+ executionManaged Boolean @default(false)
346
361
  /// Phase 6: which durable executor backend holds this run, if any
347
362
  /// ("dbos" = a DBOS workflow whose id equals this run's id). Null for
348
363
  /// in-process runs. The reconciler consults the backend before declaring a
349
364
  /// stale run lost, and can adopt one orphaned by a dead instance.
350
- executionBackend String?
351
- codingRun CodingRun?
352
- hostCheck RunHostCheck?
353
- hostStatus RunHostStatus?
354
- issueStatus RunIssueStatus?
355
- attribution RunAttribution?
356
- modelUsage RunModelUsage[]
357
- serviceStatuses CodingRunServiceStatus[]
365
+ executionBackend String?
366
+ /// The DBOS workflow that currently holds this run, when it is not the run id: set when
367
+ /// recover() forks the run's workflow under a new application version. Null = the run id.
368
+ executionWorkflowId String?
369
+ /// The agent's nativeExecutionMode when this run was created, fixed for the
370
+ /// run's life and what the executor routes on. Null for coding runs and for
371
+ /// native runs from before the field existed, which run in the control plane.
372
+ nativeExecutionMode NativeExecutionMode?
373
+ codingRun CodingRun?
374
+ transcript RunTranscript?
375
+ hostCheck RunHostCheck?
376
+ hostStatus RunHostStatus?
377
+ issueStatus RunIssueStatus?
378
+ attribution RunAttribution?
379
+ modelUsage RunModelUsage[]
380
+ serviceStatuses CodingRunServiceStatus[]
381
+ budgetEvents RunBudgetEvent[]
358
382
  /// A manual review of a local branch: this run is the review run dispatched for it.
359
- localPullRequest LocalPullRequest?
383
+ localPullRequest LocalPullRequest?
384
+ /// A sandbox-mode native run's gateway session (native sandbox phase 3).
385
+ nativeGatewaySession NativeGatewaySession?
386
+ /// The warm pool worker this sandbox-mode run claimed (native sandbox phase 6).
387
+ nativeWarmWorker NativeWarmWorker?
388
+ /// Set when a process that may not start runs itself (the native sandbox
389
+ /// gateway, which holds no executor) dispatched this run: the scheduler
390
+ /// leader starts it through the server's executor and clears this.
391
+ startDeferredAt DateTime?
392
+ /// Likewise a stop that process asked for: the scheduler leader stops the
393
+ /// run through the server's executor and clears this.
394
+ stopRequestedAt DateTime?
395
+ stopRequestReason String?
360
396
 
361
397
  /// Un-phased: sub-agent dispatch (see AgentSubAgent). Null for a
362
398
  /// top-level run; set when this run was created by a parent run's
@@ -367,6 +403,9 @@ model Run {
367
403
  parentRunId String?
368
404
  parentRun Run? @relation("RunTree", fields: [parentRunId], references: [id])
369
405
  childRuns Run[] @relation("RunTree")
406
+ /// The parent's delegation call (the model's tool-call id) that created this child, so a
407
+ /// re-executed delegate step finds the same child instead of starting another.
408
+ parentCallId String?
370
409
  /// Ephemeral, per-dispatch grant: exactly the parent-memory keys this
371
410
  /// one child run was handed permission to read via parent_memory_get.
372
411
  /// Never a standing allowlist — re-granted on every dispatch call.
@@ -392,39 +431,62 @@ model Run {
392
431
  @@index([startedAt])
393
432
  @@index([status])
394
433
  @@index([parentRunId])
434
+ @@index([startDeferredAt])
435
+ @@index([stopRequestedAt])
436
+ @@unique([parentRunId, parentCallId])
395
437
  }
396
438
 
397
439
  /// Phase 5: owner-configured coding behavior. Runtime credentials and opaque
398
440
  /// launcher handles never live on the reusable profile.
399
441
  model CodingAgentProfile {
400
- agentId String @id
401
- agent Agent @relation(fields: [agentId], references: [id], onDelete: Cascade)
402
- provider String @default("codex")
442
+ agentId String @id
443
+ agent Agent @relation(fields: [agentId], references: [id], onDelete: Cascade)
444
+ provider String @default("codex")
403
445
  repository String
404
- baseRef String @default("main")
446
+ baseRef String @default("main")
405
447
  defaultTask String?
406
- allowWebhookTaskOverride Boolean @default(false)
407
- timeoutSec Int @default(1800)
448
+ allowWebhookTaskOverride Boolean @default(false)
449
+ timeoutSec Int @default(1800)
408
450
  /// Claude Code runs only: the most agent turns a run may take. Null = the worker default (200).
409
451
  maxTurns Int?
452
+ /// Claude Code runs only: the most output tokens per model reply (1024-128000). Null = the worker default (32000).
453
+ maxOutputTokens Int?
410
454
  /// Unused; dropped after rollout (see the package-registry plan, Task 14).
411
- allowedEgress Json @default("[]")
455
+ allowedEgress Json @default("[]")
412
456
  protectedPaths Json
413
- collectExclude Json @default("[]")
414
- toolchain String @default("node")
457
+ collectExclude Json @default("[]")
458
+ toolchain String @default("node")
415
459
  toolchainVersion String?
416
460
  workerImageRef String?
417
461
  /// Per-agent workspace size in MiB; null = CODING_DISK_MB.
418
462
  workspaceDiskMb Int?
419
- packageAllowlist Json @default("{}")
420
- packagePolicy Json @default("{}")
463
+ packageAllowlist Json @default("{}")
464
+ packagePolicy Json @default("{}")
421
465
  /// Admin-requested debug trace: while now < debugTraceUntil, every coding
422
466
  /// run of this agent is dispatched with CodingRun.debugTrace set. Null = off.
423
467
  debugTraceUntil DateTime?
468
+ /// Admin-set cap on one traced run's trace output, in MiB; null = the worker default (2).
469
+ debugTraceMaxMb Int?
424
470
  /// Coding-run services (docs/coding-services.md): the catalog names
425
471
  /// (CodingService.name) this agent's runs may start, any version the catalog
426
472
  /// has. Empty = none. Owner-set through update_agent.
427
- services Json @default("[]")
473
+ services Json @default("[]")
474
+ /// Load the repository's agent skills into coding runs (Codex: .agents/skills, .codex/skills;
475
+ /// Claude Code: .claude/skills). Repo instructions (AGENTS.md / CLAUDE.md) load regardless.
476
+ repoSkills Boolean @default(true)
477
+ /// Claude Code runs only: keep Claude Code's bare mode (CLAUDE_CODE_SIMPLE=1); wardby injects
478
+ /// repo instructions and the skill list into the system prompt. False = Claude Code's native loading.
479
+ claudeBareMode Boolean @default(true)
480
+ /// Restore node_modules from a cached snapshot (written only by trusted wardby code before the
481
+ /// agent starts) instead of a full install. Owner-set; off by default.
482
+ dependencyCache Boolean @default(false)
483
+ /// Keep each Claude Code run's session transcript so it can be resumed in a local CLI
484
+ /// (docs/coding-agent-setup.md#resume-a-run-locally). Owner-set; off by default.
485
+ sessionResume Boolean @default(false)
486
+ /// Owner-set package audit mode (docs/coding-packages.md#package-audit-mode); active while now < packageAuditUntil.
487
+ packageAuditMode PackageAuditMode?
488
+ /// End of the audit window; null = off.
489
+ packageAuditUntil DateTime?
428
490
 
429
491
  /// How `repository` was authorized for this agent (see AgentRepository.authorizedVia):
430
492
  /// "host_permission", "admin", or "grandfathered". Null = never authorized; runs are refused.
@@ -437,58 +499,103 @@ model CodingAgentProfile {
437
499
  /// Phase 5: immutable dispatch inputs plus opaque execution/result state for
438
500
  /// one coding run. Policy is copied from the profile before work starts.
439
501
  model CodingRun {
440
- runId String @id
441
- run Run @relation(fields: [runId], references: [id], onDelete: Cascade)
442
- task String
443
- repository String
444
- baseRef String
445
- headRef String
446
- provider String
447
- model String
448
- timeoutSec Int
502
+ runId String @id
503
+ run Run @relation(fields: [runId], references: [id], onDelete: Cascade)
504
+ task String
505
+ /// The run's own request (the trigger's task or the agent's default task), without the agent's standing instructions. Null on older runs.
506
+ request String? @db.Text
507
+ repository String
508
+ baseRef String
509
+ headRef String
510
+ provider String
511
+ model String
512
+ timeoutSec Int
449
513
  /// Unused; dropped after rollout (see the package-registry plan, Task 14).
450
- allowedEgress Json @default("[]")
451
- protectedPaths Json
452
- collectExclude Json @default("[]")
453
- jobBackend String?
454
- jobHandle String?
455
- result Json?
456
- resultSchema Int @default(1)
514
+ allowedEgress Json @default("[]")
515
+ protectedPaths Json
516
+ collectExclude Json @default("[]")
517
+ jobBackend String?
518
+ jobHandle String?
519
+ result Json?
520
+ resultSchema Int @default(1)
457
521
  /// Sanitized terminal classification and an opaque log correlation reference.
458
522
  /// Neither field may contain task, repository, environment, or credential data.
459
- failureCategory String?
460
- diagnosticId String?
461
- workerImage String?
523
+ failureCategory String?
524
+ diagnosticId String?
525
+ workerImage String?
462
526
  /// Claude Code's tool-runner image, resolved from the agent's toolchain at dispatch; null for Codex runs.
463
- toolImage String?
464
- budgetReservedUsd Decimal @db.Decimal(10, 6)
527
+ toolImage String?
528
+ /// What the run may spend now: its base, plus every overrun top-up granted so
529
+ /// far (on runs with budgetLimitUsd). Budget groups and run trees hold it.
530
+ budgetReservedUsd Decimal @db.Decimal(10, 6)
531
+ /// The budget before the agent's allowed overrun. Null on older runs.
532
+ budgetBaseUsd Decimal? @db.Decimal(10, 6)
533
+ /// The most the run may spend: its base budget raised by the agent's allowed
534
+ /// overrun, never reserved up front; top-ups raise budgetReservedUsd toward it
535
+ /// only from room its group and run tree have left. Null = no top-ups (older
536
+ /// runs, or no allowed overrun): budgetReservedUsd is the limit.
537
+ budgetLimitUsd Decimal? @db.Decimal(10, 6)
538
+ /// What set budgetReservedUsd below the agent's own budget at dispatch:
539
+ /// run-tree, day, week or month. Null = the agent's own budget.
540
+ budgetLimitedBy String?
465
541
  /// Phase 12 concurrency queue: set when start() found every coding slot
466
542
  /// taken (CODING_MAX_CONCURRENT), cleared when the run claims a slot. A
467
543
  /// pending run with queuedAt set is waiting, not orphaned.
468
- queuedAt DateTime?
544
+ queuedAt DateTime?
469
545
  /// Per-agent workspace size in MiB; null = CODING_DISK_MB.
470
- workspaceDiskMb Int?
471
- packageAllowlist Json @default("{}")
472
- packagePolicy Json @default("{}")
546
+ workspaceDiskMb Int?
547
+ packageAllowlist Json @default("{}")
548
+ packagePolicy Json @default("{}")
473
549
  /// Fixed at dispatch from the profile's debugTraceUntil: the worker writes a
474
550
  /// full stream trace to its own pod log (never to the database).
475
- debugTrace Boolean @default(false)
551
+ debugTrace Boolean @default(false)
552
+ /// Fixed at dispatch from the profile's debugTraceMaxMb, only on a traced run. Null = the worker default.
553
+ debugTraceMaxMb Int?
476
554
  /// Fixed at dispatch from the profile's maxTurns: the Claude Code worker's turn limit. Null = the worker default.
477
- maxTurns Int?
555
+ maxTurns Int?
556
+ /// Fixed at dispatch from the profile's maxOutputTokens: Claude Code's output tokens per reply. Null = the worker default.
557
+ maxOutputTokens Int?
558
+ /// Fixed at dispatch from the profile's repoSkills.
559
+ repoSkills Boolean @default(true)
560
+ /// Fixed at dispatch from the profile's claudeBareMode.
561
+ claudeBareMode Boolean @default(true)
478
562
  /// Coding-run services resolved at dispatch from the base branch's
479
563
  /// .wardby/services.yaml: one snapshot per service (the catalog entry minus
480
564
  /// kind), fixed for the run's lifetime. Empty = none.
481
- services Json @default("[]")
565
+ services Json @default("[]")
482
566
  /// The originating tracker issue ("jira" + key), set by the control plane from the run tree, never from model output.
483
- issueProvider String?
484
- issueKey String?
567
+ issueProvider String?
568
+ issueKey String?
485
569
  /// The branch a run pushed to a local repository (no pull request exists); null otherwise.
486
- resultBranch String?
570
+ resultBranch String?
487
571
  /// The commit the run started from (the base ref's tip when the workspace was prepared).
488
- baseSha String?
489
- createdAt DateTime @default(now())
490
- updatedAt DateTime @updatedAt
491
- proxySession CodingProxySession?
572
+ baseSha String?
573
+ /// Step in the request's merge order set by the delegating agent (1 = first); null = no order.
574
+ mergeOrder Int?
575
+ /// When Wardby marked this run's pull request ready for review (at most once;
576
+ /// a person moving it back to draft is final). Only set on a root coding run.
577
+ markedReadyAt DateTime?
578
+ /// Root coding run only: SHA-256 (hex) of the pull request description Wardby last wrote,
579
+ /// normalized (CRLF→LF, Related pull requests section removed, blank lines collapsed, trimmed).
580
+ /// Null = never recorded (pull requests opened before this column, or a lost first write).
581
+ prDescriptionSha256 String?
582
+ /// Root coding run only: the coding run whose final message is that description's agent-written part.
583
+ prDescriptionRunId String?
584
+ /// This run's description update: written | replaced | refreshed:<reason> | unchanged |
585
+ /// edited_by_hand | skipped:<reason>. Null = not attempted.
586
+ prDescriptionOutcome String?
587
+ /// Fixed at dispatch from the profile's dependencyCache.
588
+ dependencyCache Boolean @default(false)
589
+ /// Fixed at dispatch from the profile's sessionResume.
590
+ sessionResume Boolean @default(false)
591
+ /// What the run's dependency cache did, written by the control plane when it collects the run:
592
+ /// { result, key?, sizeBytes?, restoreMs?, installMs?, reason? }. Null = not used or not reported.
593
+ dependencyCacheResult Json?
594
+ /// Fixed at dispatch: the profile's packageAuditMode when its window was open, else null.
595
+ packageAuditMode PackageAuditMode?
596
+ createdAt DateTime @default(now())
597
+ updatedAt DateTime @updatedAt
598
+ proxySession CodingProxySession?
492
599
 
493
600
  /// Revision-in-place for continuing an existing coding pull request.
494
601
  /// Points directly at the ROOT CodingRun that actually owns the branch/PR
@@ -504,11 +611,35 @@ model CodingRun {
504
611
  registryFetches RegistryFetch[]
505
612
  registryApprovedVersions RegistryApprovedVersion[]
506
613
  registryPlanRefusals RegistryPlanRefusal[]
614
+ registryAuditRecords RegistryAuditRecord[]
615
+ dependencySnapshots DependencySnapshot[]
507
616
 
508
617
  @@index([jobBackend, jobHandle])
509
618
  @@index([failureCategory])
510
619
  @@index([queuedAt])
511
620
  @@index([rootCodingRunId])
621
+ @@index([mergeOrder])
622
+ }
623
+
624
+ /// A coding run's session transcript for local resume: metadata only. The redacted content lives in
625
+ /// the blob store under blobKey; the unredacted transcript is never stored.
626
+ model RunTranscript {
627
+ runId String @id
628
+ run Run @relation(fields: [runId], references: [id], onDelete: Cascade)
629
+ /// "claude-code" (Codex later).
630
+ provider String
631
+ /// stored | too_large | not_captured | failed
632
+ status String
633
+ /// Fixed code for a status other than stored (e.g. missing, no_blob_store, secrets_unavailable); never content.
634
+ reason String?
635
+ sessionId String?
636
+ blobKey String?
637
+ sizeBytes Int?
638
+ sha256 String?
639
+ createdAt DateTime @default(now())
640
+ expiresAt DateTime
641
+
642
+ @@index([expiresAt])
512
643
  }
513
644
 
514
645
  /// Coding-run services (docs/coding-services.md): the catalog a repository's
@@ -590,44 +721,185 @@ enum CodingProxyRequestStatus {
590
721
  uncertain
591
722
  }
592
723
 
724
+ enum RunBudgetEventKind {
725
+ refused
726
+ /// A coding run's overrun top-up found no room in its budget group or run tree.
727
+ overrun_unavailable
728
+ }
729
+
730
+ /// One budget decision about a run: a refusal by the coding proxy or at
731
+ /// dispatch, or an overrun top-up with no room, with the numbers behind it.
732
+ /// `limit` names what refused it: run, run-tree, day, week or month. `details`
733
+ /// holds amounts, the model and the turn; never secrets or message text.
734
+ model RunBudgetEvent {
735
+ id String @id @default(cuid())
736
+ runId String
737
+ run Run @relation(fields: [runId], references: [id], onDelete: Cascade)
738
+ kind RunBudgetEventKind
739
+ limit String
740
+ at DateTime @default(now())
741
+ details Json
742
+
743
+ @@index([runId, at])
744
+ }
745
+
746
+ enum NativeGatewaySessionStatus {
747
+ active
748
+ finished
749
+ cancelled
750
+ }
751
+
752
+ enum NativeWarmWorkerStatus {
753
+ warming
754
+ idle
755
+ claimed
756
+ retiring
757
+ }
758
+
759
+ enum NativeGatewayCallStatus {
760
+ reserved
761
+ completed
762
+ released
763
+ uncertain
764
+ pending
765
+ waiting_budget
766
+ }
767
+
768
+ /// The trusted gateway's record of one sandbox-mode native run (native
769
+ /// sandbox phase 3): the worker authenticates with a capability whose hash is
770
+ /// stored here (the raw token is never persisted), and any control-plane
771
+ /// replica can serve it from this row. `snapshot` is what the run loaded --
772
+ /// the worker's input plus trusted-only capabilities and links -- and never
773
+ /// holds a secret value.
774
+ model NativeGatewaySession {
775
+ id String @id @default(cuid())
776
+ runId String @unique
777
+ run Run @relation(fields: [runId], references: [id], onDelete: Cascade)
778
+ capabilityHash String @unique
779
+ status NativeGatewaySessionStatus @default(active)
780
+ deadlineAt DateTime
781
+ budgetUsd Decimal @db.Decimal(18, 10)
782
+ snapshot Json
783
+ /// Set the first time the gateway refuses a model call for budget.
784
+ budgetExhaustedAt DateTime?
785
+ /// When the worker's network isolation was proven (a Kubernetes run's in-pod
786
+ /// probe; a Docker run's network exists before its container). The gateway
787
+ /// serves nothing before this is set.
788
+ networkReadyAt DateTime?
789
+ /// What the run's review tools have read (ReviewReadsState), saved between gateway requests
790
+ /// for repo_publish_review's unread_files check. Null until the run reads a pull request.
791
+ reviewReads Json?
792
+ createdAt DateTime @default(now())
793
+ updatedAt DateTime @updatedAt
794
+ calls NativeGatewayCall[]
795
+
796
+ /// NATIVE_SANDBOX_MAX_CONCURRENT counts the active sessions on every start.
797
+ @@index([status])
798
+ }
799
+
800
+ /// One worker of the native sandbox warm pool (native sandbox phase 6): an
801
+ /// isolated worker started before any run exists, holding no run data or
802
+ /// capability. A run claims an idle one with a compare-and-swap on this row
803
+ /// (`runId` is set at the claim), its input is delivered only after, and the
804
+ /// worker is destroyed after that one run. The row is inserted before the
805
+ /// worker is created, so a worker with no row is an orphan.
806
+ model NativeWarmWorker {
807
+ /// The worker's random token; its container or pod name carries it.
808
+ id String @id
809
+ name String @unique
810
+ status NativeWarmWorkerStatus @default(warming)
811
+ /// What the worker was built from (image, limits, isolation settings): a
812
+ /// claim only takes a worker of the current spec.
813
+ specHash String
814
+ runId String? @unique
815
+ run Run? @relation(fields: [runId], references: [id], onDelete: SetNull)
816
+ /// When its isolation was proven and it became claimable.
817
+ readyAt DateTime?
818
+ claimedAt DateTime?
819
+ createdAt DateTime @default(now())
820
+ updatedAt DateTime @updatedAt
821
+
822
+ @@index([status, specHash])
823
+ }
824
+
825
+ /// One worker call through the gateway, keyed by its callId: model calls are
826
+ /// reserved before the provider is called and settled after; side-effecting
827
+ /// built-in and bridge calls keep their result so a retried callId replays it;
828
+ /// a delegation records the child run it started.
829
+ model NativeGatewayCall {
830
+ id String @id @default(cuid())
831
+ sessionId String
832
+ session NativeGatewaySession @relation(fields: [sessionId], references: [id], onDelete: Cascade)
833
+ callId String
834
+ method String
835
+ status NativeGatewayCallStatus
836
+ reservationUsd Decimal? @db.Decimal(18, 10)
837
+ actualCostUsd Decimal? @db.Decimal(18, 10)
838
+ /// actualCostUsd is an estimate for an interrupted call, not provider usage.
839
+ costEstimated Boolean @default(false)
840
+ inputTokens Int?
841
+ outputTokens Int?
842
+ cachedInputTokens Int?
843
+ cacheWriteTokens Int?
844
+ /// A replayable result. Never a secret value.
845
+ result Json?
846
+ childRunId String?
847
+ /// A delegation's sub-agent, recorded at admission (it holds a place while waiting for budget).
848
+ childAgentId String?
849
+ createdAt DateTime @default(now())
850
+ updatedAt DateTime @updatedAt
851
+ completedAt DateTime?
852
+
853
+ @@unique([sessionId, callId])
854
+ @@index([sessionId, status])
855
+ }
856
+
593
857
  /// Trusted-boundary state for one coding run. Only a capability digest and an
594
858
  /// upstream credential reference are persisted; neither secret value enters the DB.
595
859
  model CodingProxySession {
596
- id String @id @default(cuid())
597
- runId String @unique
598
- run CodingRun @relation(fields: [runId], references: [runId], onDelete: Cascade)
599
- capabilityHash String @unique
600
- credentialRef String
601
- protocol String @default("openai-responses")
602
- allowedModels Json
603
- deadlineAt DateTime
604
- budgetUsd Decimal @db.Decimal(18, 10)
605
- status CodingProxySessionStatus @default(active)
606
- createdAt DateTime @default(now())
607
- updatedAt DateTime @updatedAt
608
- requests CodingProxyRequest[]
860
+ id String @id @default(cuid())
861
+ runId String @unique
862
+ run CodingRun @relation(fields: [runId], references: [runId], onDelete: Cascade)
863
+ capabilityHash String @unique
864
+ credentialRef String
865
+ protocol String @default("openai-responses")
866
+ allowedModels Json
867
+ deadlineAt DateTime
868
+ budgetUsd Decimal @db.Decimal(18, 10)
869
+ status CodingProxySessionStatus @default(active)
870
+ createdAt DateTime @default(now())
871
+ updatedAt DateTime @updatedAt
872
+ requests CodingProxyRequest[]
609
873
  /// Hash of the derived registry-only token (see deriveRegistryToken); the
610
874
  /// token itself is never persisted.
611
- registryTokenHash String? @unique
875
+ registryTokenHash String? @unique
612
876
  /// Set the first time the proxy refuses a request of this session for
613
877
  /// budget; lets the executor report the run as out of budget.
614
- budgetExhaustedAt DateTime?
878
+ budgetExhaustedAt DateTime?
879
+ /// The numbers behind the first budget refusal of this session (budget, spent, holds, refused hold, model, turn); the control plane copies them into RunBudgetEvent. Never secrets.
880
+ budgetRefusal Json?
615
881
  /// The upstream error code (a fixed identifier, never a message) of the
616
882
  /// first provider failure the proxy relayed for this session; lets the
617
883
  /// executor say the model provider refused the run.
618
- upstreamFailure String?
884
+ upstreamFailure String?
619
885
  /// The run's catalog entry, copied from Run.pricingSnapshot when the session
620
886
  /// is created; the proxy prices and shapes requests from it. Null on
621
887
  /// sessions from before the model catalog (the proxy falls back to the
622
888
  /// shipped catalog).
623
- pricingVersion String?
624
- catalogEntry Json?
889
+ pricingVersion String?
890
+ catalogEntry Json?
891
+ /// Dependency cache: every lockfile hash this session's plans approved (with
892
+ /// no refusals) while unsealed, at most 8. Only these may be restored or uploaded.
893
+ dependencyCacheLockHashes String[] @default([])
894
+ /// Set when the run's dependency step is over; after it the cache refuses this session.
895
+ dependencyCacheSealedAt DateTime?
625
896
 
626
897
  @@index([deadlineAt])
627
898
  }
628
899
 
629
- /// Monotonic per-upstream-call ledger. Uncertain reservations remain held so a
630
- /// crash or truncated provider stream can never create new spendable budget.
900
+ /// Monotonic per-upstream-call ledger. An uncertain request without an
901
+ /// estimate stays held in full; one the proxy estimated (costEstimated) counts
902
+ /// at that estimate.
631
903
  model CodingProxyRequest {
632
904
  id String @id @default(cuid())
633
905
  sessionId String
@@ -638,6 +910,17 @@ model CodingProxyRequest {
638
910
  status CodingProxyRequestStatus @default(reserved)
639
911
  reservationUsd Decimal @db.Decimal(18, 10)
640
912
  actualCostUsd Decimal? @db.Decimal(18, 10)
913
+ /// actualCostUsd is the proxy's estimate for an interrupted (uncertain)
914
+ /// reply, not provider-reported usage.
915
+ costEstimated Boolean @default(false)
916
+ /// UTF-8 bytes of the forwarded request body; the next request's hold compares against it.
917
+ requestBytes Int?
918
+ /// The worst-case hold (whole body as uncached input); a reply costing more cancels the session.
919
+ ceilingUsd Decimal? @db.Decimal(18, 10)
920
+ /// "cached" (priced from the conversation's previous reply) or "full" (= ceilingUsd).
921
+ reservationBasis String?
922
+ /// sha256 of what identifies the conversation (first message, or OpenAI prompt_cache_key).
923
+ conversationKey String?
641
924
  pricingVersion String
642
925
  pricingSnapshot Json
643
926
  inputTokens Int?
@@ -652,6 +935,33 @@ model CodingProxyRequest {
652
935
 
653
936
  @@unique([sessionId, requestKey])
654
937
  @@index([sessionId, status])
938
+ @@index([sessionId, conversationKey])
939
+ }
940
+
941
+ /// Package audit mode (docs/coding-packages.md#package-audit-mode).
942
+ enum PackageAuditMode {
943
+ audit
944
+ full
945
+ }
946
+
947
+ /// One package version a run's registry served only because of package audit mode (or, in full mode,
948
+ /// served despite blocking advisories). Insert-only for the proxy.
949
+ model RegistryAuditRecord {
950
+ runId String
951
+ ecosystem String
952
+ name String
953
+ version String
954
+ /// "top-level" | "transitive" | "unknown" | "allowed" (allowed = on the allowlist graph, recorded only for advisories)
955
+ relation String
956
+ /// The top-level audited package that pulled it in (transitive only).
957
+ via String?
958
+ sizeBytes Int?
959
+ /// Full mode: [{ id, severity, summary }] served past; [] otherwise.
960
+ advisories Json @default("[]")
961
+ createdAt DateTime @default(now())
962
+ run CodingRun @relation(fields: [runId], references: [runId], onDelete: Cascade)
963
+
964
+ @@id([runId, ecosystem, name, version])
655
965
  }
656
966
 
657
967
  enum RegistryFetchOutcome {
@@ -663,11 +973,15 @@ enum RegistryFetchOutcome {
663
973
  /// once at dispatch (see CodingRun.packageAllowlist) and used to gate every
664
974
  /// proxy fetch for the run's lifetime.
665
975
  model RegistryAllowance {
666
- runId String
667
- ecosystem String
668
- name String
669
- createdAt DateTime @default(now())
670
- run CodingRun @relation(fields: [runId], references: [runId], onDelete: Cascade)
976
+ runId String
977
+ ecosystem String
978
+ name String
979
+ /// Set only in an audit-mode run: the top-level audited package whose metadata or file declared this
980
+ /// name (its own name for a top-level audited package; empty when a lockfile plan could not tell). Null = a
981
+ /// normal allowance.
982
+ auditedVia String?
983
+ createdAt DateTime @default(now())
984
+ run CodingRun @relation(fields: [runId], references: [runId], onDelete: Cascade)
671
985
 
672
986
  @@id([runId, ecosystem, name])
673
987
  }
@@ -713,13 +1027,20 @@ model RegistryVersionFact {
713
1027
  /// /registry/<ecosystem>/-/plan) verified and approved: a download of it is
714
1028
  /// served directly, integrity-checked against this value.
715
1029
  model RegistryApprovedVersion {
716
- runId String
717
- ecosystem String
718
- name String
719
- version String
720
- integrity String
721
- createdAt DateTime @default(now())
722
- run CodingRun @relation(fields: [runId], references: [runId], onDelete: Cascade)
1030
+ runId String
1031
+ ecosystem String
1032
+ name String
1033
+ version String
1034
+ integrity String
1035
+ /// Blocking advisories this run's packagePolicy.acceptedAdvisories waived
1036
+ /// for this version: empty unless the plan kept it only by that waiver. A
1037
+ /// download of it records them on its served RegistryFetch row.
1038
+ acceptedAdvisories String[] @default([])
1039
+ /// Audit-mode plans only: { relation, via?, advisories? } for an approval outside the allowlist, or
1040
+ /// one kept past advisories in full mode. Null = a normal approval.
1041
+ audit Json?
1042
+ createdAt DateTime @default(now())
1043
+ run CodingRun @relation(fields: [runId], references: [runId], onDelete: Cascade)
723
1044
 
724
1045
  @@id([runId, ecosystem, name, version])
725
1046
  }
@@ -729,10 +1050,10 @@ model RegistryApprovedVersion {
729
1050
  /// published, no integrity, hosted elsewhere): a download of it is answered
730
1051
  /// from here with the same code and reason, without a graph walk.
731
1052
  model RegistryPlanRefusal {
732
- runId String
733
- ecosystem String
734
- name String
735
- version String
1053
+ runId String
1054
+ ecosystem String
1055
+ name String
1056
+ version String
736
1057
  code String
737
1058
  reason String
738
1059
  /// Set for a too-new refusal: the answer re-checks the version's age
@@ -744,6 +1065,39 @@ model RegistryPlanRefusal {
744
1065
  @@id([runId, ecosystem, name, version])
745
1066
  }
746
1067
 
1068
+ /// A cached node_modules snapshot for one npm project of a repository, keyed
1069
+ /// server-side by the coding proxy. The archive lives in the blob store under
1070
+ /// blobKey; only trusted wardby code writes it, before a run's agent starts.
1071
+ /// Outlives the run that created it (createdByRunId is cleared when that run is
1072
+ /// deleted); evicted least-recently-used.
1073
+ model DependencySnapshot {
1074
+ id String @id @default(cuid())
1075
+ ecosystem String
1076
+ repository String
1077
+ /// The project's folder relative to the repository root; "." = the root.
1078
+ projectPath String @default(".")
1079
+ lockHash String
1080
+ workerImage String
1081
+ policyHash String
1082
+ blobKey String @unique
1083
+ sha256 String
1084
+ sizeBytes BigInt
1085
+ /// The format/version and bounds trusted worker code verified before upload.
1086
+ /// Null on snapshots made before validation metadata was introduced.
1087
+ archiveScanVersion Int?
1088
+ archiveEntries Int?
1089
+ unpackedBytes BigInt?
1090
+ createdAt DateTime @default(now())
1091
+ lastUsedAt DateTime @default(now())
1092
+ createdByRunId String?
1093
+ createdByRun CodingRun? @relation(fields: [createdByRunId], references: [runId], onDelete: SetNull)
1094
+
1095
+ @@unique([ecosystem, repository, projectPath, lockHash, workerImage, policyHash])
1096
+ @@index([ecosystem, repository, projectPath, workerImage, policyHash, createdAt])
1097
+ @@index([lastUsedAt])
1098
+ @@index([createdByRunId, projectPath])
1099
+ }
1100
+
747
1101
  /// Phase 2: single-row-per-scope lease so exactly one scheduler process
748
1102
  /// ticks at a time. `holder` is a process instance id (crypto.randomUUID()).
749
1103
  model SchedulerLease {
@@ -849,6 +1203,8 @@ model Secret {
849
1203
  name String
850
1204
  ciphertext String
851
1205
  keyId String
1206
+ /// Brokered-secret config (core/secret-broker-config.ts). Null = readable by attached tools.
1207
+ broker Json?
852
1208
  ownerId String?
853
1209
  owner Principal? @relation(fields: [ownerId], references: [id])
854
1210
  createdAt DateTime @default(now())
@@ -858,6 +1214,24 @@ model Secret {
858
1214
  @@unique([ownerId, name])
859
1215
  }
860
1216
 
1217
+ /// Audit trail of every change to a secret's broker config. No FK to Secret,
1218
+ /// so the history survives deleting the secret. Never holds a value.
1219
+ model SecretBrokerChange {
1220
+ id String @id @default(cuid())
1221
+ secretId String
1222
+ ownerId String
1223
+ secretName String
1224
+ actorId String
1225
+ before Json?
1226
+ after Json?
1227
+ /// "mcp" or "browser"
1228
+ via String
1229
+ createdAt DateTime @default(now())
1230
+
1231
+ @@index([secretId, createdAt])
1232
+ @@index([ownerId, createdAt])
1233
+ }
1234
+
861
1235
  /// Phase 4: attaches a secret to an agent, addressed at sandbox point-of-use
862
1236
  /// by `boundName` (secrets.get(boundName)). `boundName` defaults to the
863
1237
  /// secret's canonical name; it differs only when the agent binds the secret
@@ -1065,29 +1439,34 @@ model AuthRateLimit {
1065
1439
  /// and which host events trigger it. See
1066
1440
  /// docs/private/2026-09-25-code-review-host-design.md §4.1.
1067
1441
  model AgentRepository {
1068
- id String @id @default(cuid())
1069
- agentId String
1070
- agent Agent @relation(fields: [agentId], references: [id], onDelete: Cascade)
1442
+ id String @id @default(cuid())
1443
+ agentId String
1444
+ agent Agent @relation(fields: [agentId], references: [id], onDelete: Cascade)
1071
1445
  /// "github" today; validated in code so adding a host needs no enum migration.
1072
- provider String
1446
+ provider String
1073
1447
  /// Canonical lower-case owner/name for the provider.
1074
- repository String
1448
+ repository String
1075
1449
  /// "read" or "write".
1076
- access String
1450
+ access String
1077
1451
  /// Subset of "pull_request", "mention", "push", "review_fix".
1078
- triggers String[] @default([])
1452
+ triggers String[] @default([])
1079
1453
  /// Only with the "pull_request" trigger (required there); names the agent's
1080
1454
  /// check. Unique per repository across all links (NULLs are distinct).
1081
- checkName String?
1455
+ checkName String?
1082
1456
  /// Only with the "review_fix" trigger: how many automatic fix rounds a
1083
1457
  /// pull request gets before wardby stops. Null = the default (2).
1084
- reviewFixMaxRounds Int?
1458
+ reviewFixMaxRounds Int?
1085
1459
  /// Only with the "pull_request" trigger: holds this agent's review on a
1086
1460
  /// pushed head until that head's own CI finishes (see DeferredReview),
1087
1461
  /// instead of racing it. Default off: existing links review immediately,
1088
1462
  /// exactly as today.
1089
- waitForCi Boolean @default(false)
1090
- createdAt DateTime @default(now())
1463
+ waitForCi Boolean @default(false)
1464
+ /// Only on a write (builder) link: Wardby marks the draft pull requests this
1465
+ /// agent opened in the repository ready for review, once, after every Wardby
1466
+ /// review check passed, CI is green and the merge order check (if any) is
1467
+ /// success. Default off.
1468
+ markReadyWhenPassing Boolean @default(false)
1469
+ createdAt DateTime @default(now())
1091
1470
 
1092
1471
  /// How this link was authorized: "host_permission" (the agent owner's
1093
1472
  /// verified host identity had enough access), "admin" (a wardby admin
@@ -1122,38 +1501,46 @@ model DeferredReview {
1122
1501
  /// against the same check even if the link's checkName changes later.
1123
1502
  checkName String
1124
1503
  createdAt DateTime @default(now())
1504
+ /// Why the review waits: "ci" (until CI finishes) or "request" (until the
1505
+ /// delegating lead run finishes, then CI if the link waits for it).
1506
+ reason String @default("ci")
1507
+ /// The run-tree root a "request" row waits for.
1508
+ leadRunId String?
1125
1509
 
1126
1510
  @@unique([provider, repository, prNumber, headSha, agentId])
1127
1511
  @@index([provider, repository, headSha])
1128
1512
  @@index([createdAt])
1513
+ @@index([leadRunId])
1129
1514
  }
1130
1515
 
1131
1516
  /// The host check a run owns, so the review tool can complete it and the
1132
1517
  /// run finalizer can close it if the run ends without publishing.
1133
1518
  model RunHostCheck {
1134
- runId String @id
1135
- run Run @relation(fields: [runId], references: [id], onDelete: Cascade)
1136
- provider String
1137
- repository String
1138
- checkId String
1139
- headSha String
1519
+ runId String @id
1520
+ run Run @relation(fields: [runId], references: [id], onDelete: Cascade)
1521
+ provider String
1522
+ repository String
1523
+ checkId String
1524
+ headSha String
1140
1525
  /// The pull request the run was dispatched for. The review tool only
1141
1526
  /// completes or creates a check for this PR. Null on rows written before it
1142
1527
  /// existed: such a run publishes without a check.
1143
- prNumber Int?
1144
- completedAt DateTime?
1528
+ prNumber Int?
1529
+ completedAt DateTime?
1145
1530
  /// The verdict the run published on its own check ("APPROVE",
1146
1531
  /// "CHANGES_REQUESTED", "COMMENT"); null until then, or when the check was
1147
1532
  /// closed without one (superseded, or by the finalizer).
1148
- verdict String?
1533
+ verdict String?
1149
1534
  /// The published review's summary and body (capped), kept for an automatic
1150
1535
  /// fix round started when the run finishes.
1151
- reviewBody String?
1536
+ reviewBody String?
1152
1537
  /// The run published COMMENT while CI on its head was still running or had
1153
1538
  /// not reported yet. CI finishing on that head later re-runs the review.
1154
- ciPendingAtReview Boolean?
1539
+ ciPendingAtReview Boolean?
1155
1540
  /// When CI finishing on this head re-ran the review: at most once per head.
1156
- ciRereviewAt DateTime?
1541
+ ciRereviewAt DateTime?
1542
+ /// When a no-change review-fix round re-reviewed this CHANGES_REQUESTED review: at most once.
1543
+ noChangeRereviewAt DateTime?
1157
1544
  }
1158
1545
 
1159
1546
  /// De-duplicates host webhook redeliveries; pruned after 7 days.
@@ -1303,12 +1690,14 @@ model IssueFingerprint {
1303
1690
  @@index([createdByRunId])
1304
1691
  }
1305
1692
 
1306
- /// A pull request wardby opened for a tracker issue (the Jira -> code bridge). Provider-neutral on both sides.
1693
+ /// A pull request wardby opened for an issue (a Jira issue, a GitHub issue): one shape for every issue
1694
+ /// provider. Provider-neutral on both sides.
1307
1695
  /// Deliberately no foreign keys to Agent or Run: audit-style rows that survive agent/run deletion.
1308
1696
  model IssuePullRequest {
1309
1697
  id String @id @default(cuid())
1310
- /// "jira"
1698
+ /// "jira" or "github" (an issue on a repository).
1311
1699
  issueProvider String
1700
+ /// A Jira key ("PROJ-7"), or a GitHub issue's "<owner>/<repo>#<number>" (githubIssueKey).
1312
1701
  issueKey String
1313
1702
  /// "github" today; "bitbucket" next.
1314
1703
  codeProvider String
@@ -1458,6 +1847,9 @@ model LocalReview {
1458
1847
  pullRequest LocalPullRequest @relation(fields: [pullRequestId], references: [id], onDelete: Cascade)
1459
1848
  agentId String
1460
1849
  headSha String
1850
+ /// headSha when this review read every file of it (null otherwise): the head a later
1851
+ /// re-review may compare from and still APPROVE (repo_pr_read's lastCoveredSha).
1852
+ coveredSha String?
1461
1853
  /// APPROVE | CHANGES_REQUESTED | COMMENT
1462
1854
  verdict String
1463
1855
  summary String
@@ -1468,3 +1860,96 @@ model LocalReview {
1468
1860
 
1469
1861
  @@index([pullRequestId, createdAt])
1470
1862
  }
1863
+
1864
+ /// A Slack (chat) channel that receives workflow notifications for a Jira
1865
+ /// project or for one agent. Exactly one subject: (issueProvider, projectKey)
1866
+ /// or agentId (enforced in code and by a CHECK constraint). Admin-approved.
1867
+ /// See docs/slack-notifications.md.
1868
+ model NotificationChannel {
1869
+ id String @id @default(cuid())
1870
+ /// "slack" today; validated in code.
1871
+ provider String
1872
+ /// Slack channel id (C…/G…), upper-case.
1873
+ channelId String
1874
+ /// Last known channel name, display only.
1875
+ channelName String?
1876
+ issueProvider String?
1877
+ projectKey String?
1878
+ agentId String?
1879
+ agent Agent? @relation(fields: [agentId], references: [id], onDelete: Cascade)
1880
+ /// Subset of the workflow event kinds; empty = all.
1881
+ events String[] @default([])
1882
+ /// Append the run's spend line to messages.
1883
+ includeCost Boolean @default(false)
1884
+ /// Set by the dispatcher on a permanent channel error; cleared by re-linking.
1885
+ lastError String?
1886
+ lastErrorAt DateTime?
1887
+ authorizedById String
1888
+ authorizedAt DateTime @default(now())
1889
+ createdAt DateTime @default(now())
1890
+
1891
+ @@unique([provider, channelId, issueProvider, projectKey])
1892
+ @@unique([provider, channelId, agentId])
1893
+ @@index([issueProvider, projectKey])
1894
+ @@index([agentId])
1895
+ }
1896
+
1897
+ /// One workflow fact (a card picked up, a PR opened, ...). Written only when
1898
+ /// at least one channel matches. No FKs to Run/Agent: audit-style rows.
1899
+ model WorkflowEvent {
1900
+ id String @id @default(cuid())
1901
+ kind String
1902
+ /// Idempotency key: repeated recordings of the same fact are no-ops.
1903
+ dedupeKey String @unique
1904
+ runId String?
1905
+ agentId String?
1906
+ workItemProvider String?
1907
+ workItemKey String?
1908
+ codeProvider String?
1909
+ repository String?
1910
+ prNumber Int?
1911
+ /// Template inputs only: never secrets, code, review bodies or run output.
1912
+ payload Json
1913
+ createdAt DateTime @default(now())
1914
+ deliveries NotificationDelivery[]
1915
+
1916
+ @@index([createdAt])
1917
+ }
1918
+
1919
+ /// One event's delivery to one channel (the outbox row the dispatcher works).
1920
+ model NotificationDelivery {
1921
+ id String @id @default(cuid())
1922
+ eventId String
1923
+ event WorkflowEvent @relation(fields: [eventId], references: [id], onDelete: Cascade)
1924
+ provider String
1925
+ channelId String
1926
+ threadKey String
1927
+ includeCost Boolean @default(false)
1928
+ /// "pending" | "delivered" | "failed"
1929
+ state String @default("pending")
1930
+ attempts Int @default(0)
1931
+ nextAttemptAt DateTime @default(now())
1932
+ lastError String?
1933
+ messageTs String?
1934
+ deliveredAt DateTime?
1935
+ createdAt DateTime @default(now())
1936
+
1937
+ @@unique([eventId, provider, channelId])
1938
+ @@index([state, nextAttemptAt])
1939
+ @@index([provider, channelId, threadKey, createdAt])
1940
+ }
1941
+
1942
+ /// The parent message of a work item's (or PR's) thread in one channel.
1943
+ model NotificationThread {
1944
+ id String @id @default(cuid())
1945
+ provider String
1946
+ channelId String
1947
+ threadKey String
1948
+ parentTs String
1949
+ /// Current status line shown on the parent message.
1950
+ status String
1951
+ createdAt DateTime @default(now())
1952
+ updatedAt DateTime @updatedAt
1953
+
1954
+ @@unique([provider, channelId, threadKey])
1955
+ }