@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
@@ -13,7 +13,7 @@
13
13
  */
14
14
  import { Prisma } from "#prisma";
15
15
  import { isLocalRepository, normalizeGitHubRepository, normalizeLocalRepository } from "../../coding/protocol.js";
16
- import { requireAgentAccess, requireBindingOwner } from "../auth/access.js";
16
+ import { requireAgentAccess, requireBindable, requireBindingOwner, requireNotPublicWritable } from "../auth/access.js";
17
17
  import { authorizeRepositoryForSet, canonicalLocalRepository } from "../auth/repo-authorization.js";
18
18
  import { requireScope } from "../auth/resource-server.js";
19
19
  import { McpError } from "../errors.js";
@@ -68,9 +68,9 @@ export function registerRepositoryTools(mcp) {
68
68
  "pull_request trigger, and is unique per repository. waitForCi (only with the pull_request trigger) holds this agent's " +
69
69
  "review on a pushed head until that head's own CI finishes, instead of racing it; APPROVE is refused while CI on the " +
70
70
  "head is failing or still running. Re-linking an already-linked repository replaces its access, triggers, checkName, " +
71
- "reviewFixMaxRounds, and waitForCi (an omitted field is cleared, not kept) and re-checks access — always send the full " +
72
- "desired state. A local repository (local:/abs/path, inside the server's trusted roots) takes no triggers or checkName: " +
73
- "it supports manual reviews only (trigger_agent with review).",
71
+ "reviewFixMaxRounds, waitForCi, and markReadyWhenPassing (an omitted field is cleared, not kept) and re-checks access " +
72
+ "— always send the full desired state. A local repository (local:/abs/path, inside the server's trusted roots) takes " +
73
+ "no triggers or checkName: it supports manual reviews only (trigger_agent with review).",
74
74
  inputSchema: {
75
75
  type: "object",
76
76
  additionalProperties: false,
@@ -92,6 +92,13 @@ export function registerRepositoryTools(mcp) {
92
92
  description: "Only with the pull_request trigger: hold this agent's review on a pushed head until that head's own CI " +
93
93
  "finishes, instead of racing it (default false).",
94
94
  },
95
+ markReadyWhenPassing: {
96
+ type: "boolean",
97
+ description: "Only on a write link: mark the draft pull requests this agent, or a coding agent it delegated to " +
98
+ "(directly or through sub-agents), opens here ready for review, once, " +
99
+ "after every Wardby review check passed, CI is green and the wardby merge order check (if any) " +
100
+ "is success (default false).",
101
+ },
95
102
  adminOverride: {
96
103
  type: "boolean",
97
104
  description: "Admins only (agents:admin with the admin role): approve this link without checking GitHub access, recorded as an admin approval. Allowed on any agent that has an owner, not only the admin's own.",
@@ -109,10 +116,11 @@ export function registerRepositoryTools(mcp) {
109
116
  agent = await ctx.db.agent.findUnique({ where: { id: args.agentId } });
110
117
  if (!agent)
111
118
  throw new McpError(404, `Agent "${args.agentId}" not found.`);
119
+ await requireNotPublicWritable(agent, ctx.db);
112
120
  }
113
121
  else {
114
122
  agent = (await requireAgentAccess(ctx, args.agentId, "read")).agent;
115
- requireBindingOwner(ctx, agent);
123
+ await requireBindable(ctx, agent);
116
124
  }
117
125
  if (agent.kind !== "native") {
118
126
  throw new McpError(400, "Repository links are for native agents only; coding agents use codingProfile.repository.");
@@ -154,6 +162,10 @@ export function registerRepositoryTools(mcp) {
154
162
  if (waitForCi && !triggers.includes("pull_request")) {
155
163
  throw new McpError(400, "waitForCi needs the pull_request trigger.");
156
164
  }
165
+ const markReadyWhenPassing = args.markReadyWhenPassing ?? false;
166
+ if (markReadyWhenPassing && args.access !== "write") {
167
+ throw new McpError(400, "markReadyWhenPassing needs write access.");
168
+ }
157
169
  // The host call happens before, and outside, the serializable transaction.
158
170
  const authorization = await authorizeRepositoryForSet(ctx, {
159
171
  ownerId: agent.ownerId,
@@ -172,6 +184,7 @@ export function registerRepositoryTools(mcp) {
172
184
  checkName,
173
185
  reviewFixMaxRounds,
174
186
  waitForCi,
187
+ markReadyWhenPassing,
175
188
  ...authorization,
176
189
  };
177
190
  return tx.agentRepository.upsert({
@@ -0,0 +1,16 @@
1
+ import type { PrismaClient, Run } from "#prisma";
2
+ import type { McpRequestContext } from "../context.js";
3
+ import { type GrantDb } from "../../core/grants.js";
4
+ /** Who is asking to read a run: a principal, and whether it is the stdio local operator. */
5
+ export interface RunReader {
6
+ principalId: string;
7
+ operator?: boolean;
8
+ }
9
+ /**
10
+ * Run visibility (resource-sharing grants spec §3.5, A6): a run's triggerer
11
+ * keeps seeing it even after losing access to the agent; otherwise only the
12
+ * agent's owner (or the stdio operator). Read on the agent is not enough.
13
+ */
14
+ export declare function canReadRun(db: GrantDb & Pick<PrismaClient, "agent">, run: Pick<Run, "agentId" | "triggeredById">, reader: RunReader): Promise<boolean>;
15
+ /** The run, when the caller may read it (canReadRun); otherwise the same 404 a missing run gets. */
16
+ export declare function findReadableRun(ctx: McpRequestContext, runId: string): Promise<Run>;
@@ -0,0 +1,25 @@
1
+ import { McpError } from "../errors.js";
2
+ import { effectiveAccess } from "../../core/grants.js";
3
+ /**
4
+ * Run visibility (resource-sharing grants spec §3.5, A6): a run's triggerer
5
+ * keeps seeing it even after losing access to the agent; otherwise only the
6
+ * agent's owner (or the stdio operator). Read on the agent is not enough.
7
+ */
8
+ export async function canReadRun(db, run, reader) {
9
+ if (run.triggeredById !== null && run.triggeredById === reader.principalId)
10
+ return true;
11
+ const agent = await db.agent.findUnique({ where: { id: run.agentId }, select: { id: true, ownerId: true } });
12
+ if (!agent)
13
+ return false;
14
+ return ((await effectiveAccess(db, "agent", agent, reader.principalId, { operator: reader.operator === true })) === "owner");
15
+ }
16
+ /** The run, when the caller may read it (canReadRun); otherwise the same 404 a missing run gets. */
17
+ export async function findReadableRun(ctx, runId) {
18
+ const run = await ctx.db.run.findUnique({ where: { id: runId } });
19
+ const notFound = new McpError(404, `Run "${runId}" not found.`);
20
+ if (!run)
21
+ throw notFound;
22
+ if (!(await canReadRun(ctx.db, run, { principalId: ctx.principal.id, operator: ctx.operator })))
23
+ throw notFound;
24
+ return run;
25
+ }
@@ -0,0 +1,30 @@
1
+ import type { ServerResponse } from "node:http";
2
+ import type { PrismaClient } from "#prisma";
3
+ import type { BlobStore } from "../../providers/storage/types.js";
4
+ import { RUN_TRANSCRIPT_DOWNLOAD_PATH, RUN_TRANSCRIPT_LINK_TTL_MS, TRANSCRIPT_META_HEADER, TRANSCRIPT_SESSION_HEADER, TRANSCRIPT_SHA256_HEADER } from "../../coding/transcript/download-protocol.js";
5
+ export { RUN_TRANSCRIPT_DOWNLOAD_PATH, RUN_TRANSCRIPT_LINK_TTL_MS, TRANSCRIPT_META_HEADER, TRANSCRIPT_SESSION_HEADER, TRANSCRIPT_SHA256_HEADER, };
6
+ /**
7
+ * Which host serves a link. A stdio link (which may carry the operator flag) is never accepted by
8
+ * the HTTP route, even when REQUEST_STATE_KEY is shared and its signature verifies there.
9
+ */
10
+ export type RunTranscriptLinkAudience = "stdio" | "http";
11
+ export interface RunTranscriptLinkPayload {
12
+ kind: "run-transcript";
13
+ runId: string;
14
+ principalId: string;
15
+ /** The host that minted the link, and the only one that serves it. */
16
+ aud: RunTranscriptLinkAudience;
17
+ /** The stdio local operator: owner of every run for access checks. Only ever on a stdio link. */
18
+ operator?: boolean;
19
+ /** Epoch ms after which the link is refused. */
20
+ exp: number;
21
+ }
22
+ export interface RunTranscriptDownloadDeps {
23
+ verify: (token: string) => Promise<unknown>;
24
+ /** The host serving this route: only links minted for it are accepted. */
25
+ audience: RunTranscriptLinkAudience;
26
+ db: Pick<PrismaClient, "run" | "agent" | "resourceGrant" | "codingRun" | "runTranscript">;
27
+ blobs: BlobStore | undefined;
28
+ now?: () => Date;
29
+ }
30
+ export declare function handleRunTranscriptDownload(method: string | undefined, token: string | null, res: ServerResponse, deps: RunTranscriptDownloadDeps): Promise<void>;
@@ -0,0 +1,129 @@
1
+ /**
2
+ * The download behind `get_run_transcript`'s link: a short-lived signed token
3
+ * (the MCP server's requestState codec, so HMAC + expiry) that names one run
4
+ * and the principal it was minted for. Served by both hosts: the HTTP
5
+ * transport's mounted route (streamable-http.ts) and, on stdio, the
6
+ * ephemeral loopback server (stdio-link-host.ts).
7
+ *
8
+ * The token is a bearer capability. It travels only in the `t` query
9
+ * parameter; nothing here logs it, and no response or error echoes it.
10
+ * Every refusal is a fixed code. On download, access is checked again
11
+ * (canReadRun, as get_run) for the principal in the token, so a link stops
12
+ * working when that principal loses access.
13
+ */
14
+ import { createHash } from "node:crypto";
15
+ import { canReadRun } from "./run-access.js";
16
+ import { RUN_TRANSCRIPT_DOWNLOAD_PATH, RUN_TRANSCRIPT_LINK_TTL_MS, TRANSCRIPT_META_HEADER, TRANSCRIPT_SESSION_HEADER, TRANSCRIPT_SHA256_HEADER, } from "../../coding/transcript/download-protocol.js";
17
+ // The route path and headers are shared with `wardby resume` (download-protocol.ts).
18
+ export { RUN_TRANSCRIPT_DOWNLOAD_PATH, RUN_TRANSCRIPT_LINK_TTL_MS, TRANSCRIPT_META_HEADER, TRANSCRIPT_SESSION_HEADER, TRANSCRIPT_SHA256_HEADER, };
19
+ const STATUS = {
20
+ link_invalid: 403,
21
+ not_found: 404,
22
+ transcript_expired: 410,
23
+ transcript_unavailable: 503,
24
+ transcript_corrupt: 500,
25
+ };
26
+ function refuse(res, code) {
27
+ res
28
+ .writeHead(STATUS[code], {
29
+ "content-type": "application/json",
30
+ "cache-control": "no-store",
31
+ "referrer-policy": "no-referrer",
32
+ })
33
+ .end(JSON.stringify({ error: code }));
34
+ }
35
+ function isPayload(value) {
36
+ const v = value;
37
+ return (!!v &&
38
+ v.kind === "run-transcript" &&
39
+ typeof v.runId === "string" &&
40
+ typeof v.principalId === "string" &&
41
+ typeof v.exp === "number" &&
42
+ (v.aud === "stdio" || v.aud === "http") &&
43
+ (v.operator === undefined || typeof v.operator === "boolean") &&
44
+ // The operator flag belongs to stdio only.
45
+ !(v.aud === "http" && v.operator !== undefined));
46
+ }
47
+ export async function handleRunTranscriptDownload(method, token, res, deps) {
48
+ if (method !== "GET") {
49
+ res.writeHead(405, { allow: "GET", "cache-control": "no-store" }).end();
50
+ return;
51
+ }
52
+ const now = (deps.now ?? (() => new Date()))();
53
+ let payload;
54
+ try {
55
+ if (!token)
56
+ throw new Error("missing");
57
+ payload = await deps.verify(token);
58
+ }
59
+ catch {
60
+ refuse(res, "link_invalid");
61
+ return;
62
+ }
63
+ if (!isPayload(payload) || payload.aud !== deps.audience || payload.exp <= now.getTime()) {
64
+ refuse(res, "link_invalid");
65
+ return;
66
+ }
67
+ const run = await deps.db.run.findUnique({
68
+ where: { id: payload.runId },
69
+ select: { id: true, agentId: true, triggeredById: true },
70
+ });
71
+ if (!run || !(await canReadRun(deps.db, run, { principalId: payload.principalId, operator: payload.operator }))) {
72
+ refuse(res, "not_found");
73
+ return;
74
+ }
75
+ const [row, codingRun] = await Promise.all([
76
+ deps.db.runTranscript.findUnique({ where: { runId: run.id } }),
77
+ deps.db.codingRun.findUnique({
78
+ where: { runId: run.id },
79
+ select: { repository: true, headRef: true, resultBranch: true, baseSha: true, provider: true },
80
+ }),
81
+ ]);
82
+ if (!row || !codingRun || row.status !== "stored" || !row.blobKey || !row.sha256 || !row.sessionId) {
83
+ refuse(res, "not_found");
84
+ return;
85
+ }
86
+ if (row.expiresAt.getTime() <= now.getTime()) {
87
+ refuse(res, "transcript_expired");
88
+ return;
89
+ }
90
+ if (!deps.blobs) {
91
+ refuse(res, "transcript_unavailable");
92
+ return;
93
+ }
94
+ let bytes;
95
+ try {
96
+ bytes = await deps.blobs.get(row.blobKey);
97
+ }
98
+ catch {
99
+ refuse(res, "transcript_unavailable");
100
+ return;
101
+ }
102
+ // The stored object must still be what was recorded.
103
+ if (createHash("sha256").update(bytes).digest("hex") !== row.sha256) {
104
+ refuse(res, "transcript_corrupt");
105
+ return;
106
+ }
107
+ const meta = {
108
+ runId: run.id,
109
+ sessionId: row.sessionId,
110
+ provider: row.provider,
111
+ repository: codingRun.repository,
112
+ headRef: codingRun.headRef,
113
+ resultBranch: codingRun.resultBranch,
114
+ baseSha: codingRun.baseSha,
115
+ sha256: row.sha256,
116
+ };
117
+ res
118
+ .writeHead(200, {
119
+ "content-type": "application/gzip",
120
+ "content-length": String(bytes.byteLength),
121
+ "cache-control": "no-store",
122
+ "referrer-policy": "no-referrer",
123
+ "x-content-type-options": "nosniff",
124
+ [TRANSCRIPT_SHA256_HEADER]: row.sha256,
125
+ [TRANSCRIPT_SESSION_HEADER]: row.sessionId,
126
+ [TRANSCRIPT_META_HEADER]: Buffer.from(JSON.stringify(meta)).toString("base64url"),
127
+ })
128
+ .end(bytes);
129
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * get_run_transcript: the way to continue a coding run's session locally.
3
+ * The transcript itself never enters the caller's context: the tool returns
4
+ * a short-lived signed download link and the command that imports it
5
+ * (`npx @wardby/cli@latest resume -`, which reads the link from standard input). Same access as get_run.
6
+ */
7
+ import type { WardbyMcpServer } from "../server.js";
8
+ import { type RunTranscriptLinkAudience } from "./run-transcript-download.js";
9
+ /** Builds the download URL for a minted token (HTTP: the canonical origin; stdio: the loopback server). */
10
+ export type RunTranscriptUrlBuilder = (token: string) => Promise<string>;
11
+ export interface RunTranscriptToolOptions {
12
+ downloadUrl: RunTranscriptUrlBuilder;
13
+ /** Whether the server has a blob store to serve transcripts from. */
14
+ blobStoreConfigured: boolean;
15
+ /** The host that serves the links this server mints (stdio's loopback server, or the HTTP route). */
16
+ audience: RunTranscriptLinkAudience;
17
+ now?: () => Date;
18
+ }
19
+ export declare function registerRunTranscriptTool(mcp: WardbyMcpServer, opts: RunTranscriptToolOptions): void;
@@ -0,0 +1,70 @@
1
+ import { textResult } from "./text-result.js";
2
+ import { findReadableRun } from "./run-access.js";
3
+ import { RUN_TRANSCRIPT_LINK_TTL_MS, } from "./run-transcript-download.js";
4
+ /** What each status other than `stored` means, for the caller. */
5
+ const MEANINGS = {
6
+ none: "No transcript was recorded for this run. Turn on codingProfile.sessionResume for the agent; it applies to runs started after that.",
7
+ too_large: "The run's transcript was larger than RUN_TRANSCRIPT_MAX_BYTES, so it was not stored.",
8
+ not_captured: "No transcript was stored for this run (see reason): for example the server had no blob store, the run was stopped or timed out, or it never finished a turn.",
9
+ failed: "Storing this run's transcript failed (see reason). Nothing was stored.",
10
+ expired: "The transcript was deleted after RUN_TRANSCRIPT_RETENTION_DAYS.",
11
+ unavailable: "The transcript was stored, but this server has no blob store configured to serve it from.",
12
+ unsupported: "Resuming this kind of run locally is not supported yet: only Claude Code coding runs can be resumed.",
13
+ };
14
+ function notStored(runId, status, reason) {
15
+ return textResult({ runId, status, ...(reason ? { reason } : {}), meaning: MEANINGS[status] });
16
+ }
17
+ export function registerRunTranscriptTool(mcp, opts) {
18
+ mcp.registerTool({
19
+ name: "get_run_transcript",
20
+ description: "Get a short-lived download link for a Claude Code coding run's session transcript, and the command that continues the session locally (npx @wardby/cli@latest resume -, which asks for the link). Give the user the command and the link to run in a terminal inside a clone of the run's repository; do not fetch the link yourself. Same access as get_run. The link works for 10 minutes.",
21
+ scope: "agents:read",
22
+ inputSchema: { type: "object", properties: { runId: { type: "string" } }, required: ["runId"] },
23
+ handler: async (args, ctx) => {
24
+ const run = await findReadableRun(ctx, args.runId);
25
+ const codingRun = await ctx.db.codingRun.findUnique({
26
+ where: { runId: run.id },
27
+ select: { provider: true, repository: true, headRef: true, resultBranch: true, baseSha: true },
28
+ });
29
+ if (!codingRun)
30
+ return notStored(run.id, "unsupported", "not_a_coding_run");
31
+ if (codingRun.provider !== "claude-code")
32
+ return notStored(run.id, "unsupported", "provider_unsupported");
33
+ const row = await ctx.db.runTranscript.findUnique({ where: { runId: run.id } });
34
+ if (!row)
35
+ return notStored(run.id, "none");
36
+ if (row.status !== "stored" || !row.sessionId)
37
+ return notStored(run.id, row.status, row.reason);
38
+ const now = (opts.now ?? (() => new Date()))();
39
+ if (row.expiresAt.getTime() <= now.getTime())
40
+ return notStored(run.id, "expired");
41
+ if (!opts.blobStoreConfigured)
42
+ return notStored(run.id, "unavailable", "no_blob_store");
43
+ const exp = now.getTime() + RUN_TRANSCRIPT_LINK_TTL_MS;
44
+ const payload = {
45
+ kind: "run-transcript",
46
+ runId: run.id,
47
+ principalId: ctx.principal.id,
48
+ aud: opts.audience,
49
+ ...(ctx.operator && opts.audience === "stdio" ? { operator: true } : {}),
50
+ exp,
51
+ };
52
+ const url = await opts.downloadUrl(await mcp.mintRequestState(payload));
53
+ const linkExpiresAt = new Date(exp).toISOString();
54
+ return textResult({
55
+ runId: run.id,
56
+ status: "stored",
57
+ sessionId: row.sessionId,
58
+ provider: codingRun.provider,
59
+ repository: codingRun.repository,
60
+ branch: codingRun.resultBranch ?? codingRun.headRef,
61
+ baseSha: codingRun.baseSha,
62
+ sizeBytes: row.sizeBytes,
63
+ expiresAt: row.expiresAt.toISOString(),
64
+ download: { url, expiresAt: linkExpiresAt },
65
+ command: "npx @wardby/cli@latest resume -",
66
+ note: "Run the command in a terminal, inside a clone of the repository (not needed for a local: repository), and paste download.url when it asks. Reading the link this way keeps it out of shell history and the process list. The link is a credential for this transcript until it expires: do not share it.",
67
+ });
68
+ },
69
+ });
70
+ }
@@ -1,8 +1,2 @@
1
1
  import type { WardbyMcpServer } from "../server.js";
2
- /**
3
- * Run visibility (resource-sharing grants spec §3.5, A6): a run's output is
4
- * the triggerer's and the agent owner's, never every reader's. The owner
5
- * (and the stdio operator) sees every run; anyone else only runs with
6
- * Run.triggeredById equal to themselves.
7
- */
8
2
  export declare function registerRunTools(mcp: WardbyMcpServer): void;
@@ -1,15 +1,22 @@
1
- import { McpError } from "../errors.js";
2
- import { agentAccess, requireAgentAccess } from "../auth/access.js";
3
- import { publicCodingRunResult } from "../../coding/protocol.js";
1
+ import { requireAgentAccess } from "../auth/access.js";
2
+ import { findReadableRun } from "./run-access.js";
3
+ import { publicCodingRunResult, sanitizeDependencyCacheReport } from "../../coding/protocol.js";
4
4
  import { countPlanRefusals, summarizeRegistryFetches } from "../../coding/registry/report.js";
5
+ import { summarizePackageAudit } from "../../coding/registry/audit-mode.js";
5
6
  import { storedServiceLabels } from "../../coding/services/catalog.js";
6
7
  import { textResult } from "./text-result.js";
8
+ import { loadBudgetEvents } from "../../core/budget-events.js";
7
9
  /**
8
10
  * Run visibility (resource-sharing grants spec §3.5, A6): a run's output is
9
11
  * the triggerer's and the agent owner's, never every reader's. The owner
10
12
  * (and the stdio operator) sees every run; anyone else only runs with
11
13
  * Run.triggeredById equal to themselves.
12
14
  */
15
+ /** A run row with its execution mode in the operator spelling agent tools use; null for coding runs. */
16
+ function withOperatorMode(run) {
17
+ const mode = run.nativeExecutionMode;
18
+ return { ...run, nativeExecutionMode: mode == null ? null : mode === "sandbox" ? "sandbox" : "control-plane" };
19
+ }
13
20
  export function registerRunTools(mcp) {
14
21
  mcp.registerTool({
15
22
  name: "list_runs",
@@ -42,7 +49,7 @@ export function registerRunTools(mcp) {
42
49
  const queuedAtByRun = new Map(queued.map((row) => [row.runId, row.queuedAt?.toISOString()]));
43
50
  return textResult(runs.map((run) => {
44
51
  const codingQueuedAt = queuedAtByRun.get(run.id);
45
- return codingQueuedAt ? { ...run, codingQueuedAt } : run;
52
+ return codingQueuedAt ? { ...withOperatorMode(run), codingQueuedAt } : withOperatorMode(run);
46
53
  }));
47
54
  },
48
55
  });
@@ -51,17 +58,9 @@ export function registerRunTools(mcp) {
51
58
  scope: "agents:read",
52
59
  inputSchema: { type: "object", properties: { runId: { type: "string" } }, required: ["runId"] },
53
60
  handler: async (args, ctx) => {
54
- const run = await ctx.db.run.findUnique({ where: { id: args.runId } });
55
- const notFound = new McpError(404, `Run "${args.runId}" not found.`);
56
- if (!run)
57
- throw notFound;
58
61
  // Its triggerer keeps seeing it even after losing access to the agent;
59
62
  // otherwise only the agent's owner. read on the agent is not enough.
60
- if (run.triggeredById !== ctx.principal.id) {
61
- const agent = await ctx.db.agent.findUnique({ where: { id: run.agentId } });
62
- if (!agent || (await agentAccess(ctx, agent)) !== "owner")
63
- throw notFound;
64
- }
63
+ const run = await findReadableRun(ctx, args.runId);
65
64
  const codingRun = await ctx.db.codingRun.findUnique({
66
65
  where: { runId: run.id },
67
66
  select: {
@@ -70,9 +69,16 @@ export function registerRunTools(mcp) {
70
69
  failureCategory: true,
71
70
  diagnosticId: true,
72
71
  debugTrace: true,
72
+ debugTraceMaxMb: true,
73
73
  services: true,
74
74
  resultBranch: true,
75
75
  baseSha: true,
76
+ dependencyCacheResult: true,
77
+ prDescriptionOutcome: true,
78
+ packageAuditMode: true,
79
+ budgetBaseUsd: true,
80
+ budgetReservedUsd: true,
81
+ budgetLimitUsd: true,
76
82
  },
77
83
  });
78
84
  const localPr = await ctx.db.localPullRequest.findUnique({
@@ -97,6 +103,12 @@ export function registerRunTools(mcp) {
97
103
  refused: countPlanRefusals(registryFetches),
98
104
  }
99
105
  : undefined;
106
+ // Package audit mode, fixed at dispatch: what the registry served only
107
+ // because of it (empty when nothing was), read only for a run that had it.
108
+ const packageAuditMode = codingRun?.packageAuditMode ?? null;
109
+ const packageAudit = packageAuditMode
110
+ ? summarizePackageAudit(await ctx.db.registryAuditRecord.findMany({ where: { runId: run.id }, orderBy: { createdAt: "asc" } })).entries
111
+ : undefined;
100
112
  // A failed coding run's error is only an opaque id; these two say which
101
113
  // stage failed and are the key an operator searches the control-plane
102
114
  // log for (the real reason is logged there, never persisted). Both are
@@ -105,17 +117,31 @@ export function registerRunTools(mcp) {
105
117
  const diagnosticId = codingRun?.diagnosticId ?? undefined;
106
118
  // Which services the run started with ("postgres 16"); never their images or environments.
107
119
  const services = codingRun ? storedServiceLabels(codingRun.services) : [];
120
+ // The worker's dependency cache report (stable codes, folder names and numbers only), re-bounded on read.
121
+ const dependencyCache = codingRun?.dependencyCacheResult !== null && codingRun?.dependencyCacheResult !== undefined
122
+ ? sanitizeDependencyCacheReport(codingRun.dependencyCacheResult)
123
+ : undefined;
124
+ // Well-formed refusals only, with group, lead and agent budget filled as the run error's are.
125
+ const budgetEvents = await loadBudgetEvents(ctx.db, run.id);
108
126
  return textResult({
109
- ...run,
127
+ ...withOperatorMode(run),
128
+ ...(budgetEvents.length > 0 ? { budgetEvents } : {}),
129
+ ...(codingRun?.budgetReservedUsd != null ? { budgetReservedUsd: Number(codingRun.budgetReservedUsd) } : {}),
130
+ ...(codingRun?.budgetBaseUsd != null ? { budgetBaseUsd: Number(codingRun.budgetBaseUsd) } : {}),
131
+ // The most overrun top-ups may raise budgetReservedUsd to; absent = the reservation is the limit.
132
+ ...(codingRun?.budgetLimitUsd != null ? { budgetLimitUsd: Number(codingRun.budgetLimitUsd) } : {}),
110
133
  ...(codingResult ? { codingResult } : {}),
111
134
  ...(failureCategory ? { failureCategory } : {}),
112
135
  ...(diagnosticId ? { diagnosticId } : {}),
113
136
  ...(codingQueuedAt ? { codingQueuedAt } : {}),
114
137
  // An admin turned on the debug trace: the worker's full trace is in its pod log.
115
138
  ...(codingRun?.debugTrace ? { debugTrace: true } : {}),
139
+ ...(codingRun?.debugTrace && codingRun.debugTraceMaxMb ? { debugTraceMaxMb: codingRun.debugTraceMaxMb } : {}),
116
140
  ...(services.length > 0 ? { services } : {}),
117
141
  ...(codingRun?.resultBranch ? { resultBranch: codingRun.resultBranch } : {}),
118
142
  ...(codingRun?.baseSha ? { baseSha: codingRun.baseSha } : {}),
143
+ ...(dependencyCache ? { dependencyCache } : {}),
144
+ ...(codingRun?.prDescriptionOutcome ? { prDescriptionOutcome: codingRun.prDescriptionOutcome } : {}),
119
145
  ...(localPr
120
146
  ? {
121
147
  review: {
@@ -132,6 +158,7 @@ export function registerRunTools(mcp) {
132
158
  }
133
159
  : {}),
134
160
  ...(codingRun ? { packages, packageRefusals, packagePlan } : {}),
161
+ ...(packageAuditMode ? { packageAuditMode, packageAudit } : {}),
135
162
  });
136
163
  },
137
164
  });
@@ -1,5 +1,6 @@
1
1
  import { Prisma } from "#prisma";
2
2
  import { validateCronExpression } from "../../core/cron.js";
3
+ import { scheduleStartFields } from "../../core/schedule-start.js";
3
4
  import { McpError } from "../errors.js";
4
5
  import { assertAgentAccess, requireAgentAccess } from "../auth/access.js";
5
6
  import { textResult } from "./text-result.js";
@@ -24,9 +25,10 @@ export function registerSchedulingTools(mcp) {
24
25
  if (existing.kind === "coding" && !existing.codingProfile?.defaultTask) {
25
26
  throw new McpError(400, "A default task is required before enabling a coding-agent schedule.");
26
27
  }
28
+ const next = { schedule: args.schedule, timezone: args.timezone, scheduleEnabled: true };
27
29
  return tx.agent.update({
28
30
  where: { id: args.agentId },
29
- data: { schedule: args.schedule, timezone: args.timezone, scheduleEnabled: true },
31
+ data: { ...next, ...(await scheduleStartFields(tx, existing, next)) },
30
32
  });
31
33
  }, { isolationLevel: Prisma.TransactionIsolationLevel.Serializable });
32
34
  return textResult(agent);
@@ -0,0 +1,12 @@
1
+ /**
2
+ * A static, best-effort check: a tool granted a brokered secret that still reads secrets with
3
+ * secrets.get() will fail at run time. Warns; never blocks (the scan can't see dynamic code).
4
+ */
5
+ export declare function toolCallsSecretsGet(code: string): boolean;
6
+ export declare function brokerCompatibilityWarnings(tools: readonly {
7
+ name: string;
8
+ code: string;
9
+ allowedSecrets: readonly string[];
10
+ }[], brokeredNames: ReadonlySet<string>): string[];
11
+ /** An attachment's `allowedSecrets` JSON column as names (anything else is ignored). */
12
+ export declare function allowedSecretNames(json: unknown): string[];
@@ -0,0 +1,23 @@
1
+ /**
2
+ * A static, best-effort check: a tool granted a brokered secret that still reads secrets with
3
+ * secrets.get() will fail at run time. Warns; never blocks (the scan can't see dynamic code).
4
+ */
5
+ export function toolCallsSecretsGet(code) {
6
+ return /\bsecrets\s*\.\s*get\s*\(/.test(code);
7
+ }
8
+ export function brokerCompatibilityWarnings(tools, brokeredNames) {
9
+ const warnings = [];
10
+ for (const tool of tools) {
11
+ const brokered = tool.allowedSecrets.filter((s) => brokeredNames.has(s));
12
+ if (!brokered.length || !toolCallsSecretsGet(tool.code))
13
+ continue;
14
+ const list = brokered.map((s) => `"${s}"`).join(", ");
15
+ const example = JSON.stringify(brokered);
16
+ warnings.push(`Tool "${tool.name}" reads secrets with secrets.get(), but ${list} ${brokered.length > 1 ? "are" : "is"} brokered: that call will fail with secret_brokered. Update the tool to send it with fetch(url, { secrets: ${example} }).`);
17
+ }
18
+ return warnings;
19
+ }
20
+ /** An attachment's `allowedSecrets` JSON column as names (anything else is ignored). */
21
+ export function allowedSecretNames(json) {
22
+ return Array.isArray(json) ? json.filter((s) => typeof s === "string") : [];
23
+ }
@@ -2,15 +2,26 @@
2
2
  * The one-time browser form a secret-elicitation URL points to — shared by
3
3
  * both hosts: stdio's ephemeral loopback server (secret-elicitation-server.ts)
4
4
  * and the HTTP transport's mounted route (wired in streamable-http.ts). No
5
- * JavaScript: a plain HTML form POST is enough for one password field, so
5
+ * JavaScript: a plain HTML form POST is enough for one password field (plus
6
+ * the optional broker fields, shown and hidden by a CSS `:checked` rule), so
6
7
  * CSP can forbid scripts outright rather than needing a nonce.
8
+ *
9
+ * Two pages share the route, chosen by the signed payload's `kind`: "create"
10
+ * (enter a value, optionally brokered) and "unbroker" (a person confirms
11
+ * removing a secret's broker config by typing its name). An unbroker link
12
+ * never shows or accepts a value.
7
13
  */
8
14
  import type { IncomingMessage, ServerResponse } from "node:http";
9
15
  import type { PrismaClient } from "#prisma";
10
16
  import type { SecretCipher } from "../../providers/secrets/types.js";
11
17
  import { type SecretElicitationPayload } from "./secret-elicitation.js";
18
+ import { type SecretBrokerConfig } from "../../core/secret-broker-config.js";
12
19
  /** The HTTP-transport route path this form is mounted at (see streamable-http.ts). */
13
20
  export declare const SECRET_ELICITATION_PATH = "/elicit/secret";
21
+ /** The "Brokered (recommended)" checkbox, warning, compatibility note, and broker fields, pre-filled from `prefill`. */
22
+ export declare function brokerFieldset(prefill?: SecretBrokerConfig): string;
23
+ /** The form's broker config: null when the box is unchecked; throws secret_broker_config_invalid when it doesn't validate. */
24
+ export declare function brokerConfigFromForm(body: URLSearchParams): SecretBrokerConfig | null;
14
25
  export interface SecretFormDeps {
15
26
  verify: (token: string) => Promise<SecretElicitationPayload>;
16
27
  secrets: SecretCipher;
@@ -18,5 +29,14 @@ export interface SecretFormDeps {
18
29
  }
19
30
  /** Handles one GET (render) or POST (submit) for the secret-entry form at the given token. */
20
31
  export declare function handleSecretElicitationForm(method: string | undefined, token: string | null, readFormBody: () => Promise<URLSearchParams>, res: ServerResponse, deps: SecretFormDeps): Promise<void>;
21
- /** Reads a small `application/x-www-form-urlencoded` body (8 KiB cap — a secret value, nothing more). */
32
+ /**
33
+ * The largest form body accepted: room for the largest valid AWS SigV4 value
34
+ * (an 8 KiB session token, up to 3x after URL encoding) plus the broker fields.
35
+ */
36
+ export declare const FORM_BODY_LIMIT: number;
37
+ /**
38
+ * Reads a small `application/x-www-form-urlencoded` body. Over FORM_BODY_LIMIT it
39
+ * rejects with `body_too_large` and discards the rest of the upload, so the
40
+ * handler can still answer 413 on the same connection.
41
+ */
22
42
  export declare function readFormBody(req: IncomingMessage): Promise<URLSearchParams>;