@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
@@ -0,0 +1,12 @@
1
+ import type { PrismaClient } from "#prisma";
2
+ import { type ScheduleState } from "./cron.js";
3
+ /**
4
+ * The `lastScheduledAt` to write with a schedule change: the database's
5
+ * clock when the change starts the schedule (see startsSchedule), nothing
6
+ * otherwise. The database's clock, not this process's, because the CLI and
7
+ * import can run on an operator's machine: a clock running ahead there would
8
+ * record a start after a window the scheduler has yet to fire, and skip it.
9
+ */
10
+ export declare function scheduleStartFields(db: Pick<PrismaClient, "$queryRaw">, before: ScheduleState | null, after: ScheduleState): Promise<{
11
+ lastScheduledAt: Date;
12
+ } | Record<string, never>>;
@@ -0,0 +1,14 @@
1
+ import { startsSchedule } from "./cron.js";
2
+ /**
3
+ * The `lastScheduledAt` to write with a schedule change: the database's
4
+ * clock when the change starts the schedule (see startsSchedule), nothing
5
+ * otherwise. The database's clock, not this process's, because the CLI and
6
+ * import can run on an operator's machine: a clock running ahead there would
7
+ * record a start after a window the scheduler has yet to fire, and skip it.
8
+ */
9
+ export async function scheduleStartFields(db, before, after) {
10
+ if (!startsSchedule(before, after))
11
+ return {};
12
+ const [{ now }] = await db.$queryRaw `SELECT now() AS now`;
13
+ return { lastScheduledAt: now };
14
+ }
@@ -0,0 +1,39 @@
1
+ import { z } from "zod";
2
+ export declare const MIN_BROKERED_VALUE_LENGTH = 6;
3
+ export declare const SecretBrokerConfigSchema: z.ZodObject<{
4
+ hosts: z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
5
+ pathPrefixes: z.ZodOptional<z.ZodArray<z.ZodString>>;
6
+ placement: z.ZodDiscriminatedUnion<[z.ZodObject<{
7
+ kind: z.ZodLiteral<"header">;
8
+ name: z.ZodString;
9
+ format: z.ZodString;
10
+ }, z.core.$strict>, z.ZodObject<{
11
+ kind: z.ZodLiteral<"query">;
12
+ name: z.ZodString;
13
+ }, z.core.$strict>, z.ZodObject<{
14
+ kind: z.ZodLiteral<"body">;
15
+ field: z.ZodString;
16
+ }, z.core.$strict>, z.ZodObject<{
17
+ kind: z.ZodLiteral<"aws-sigv4">;
18
+ region: z.ZodString;
19
+ service: z.ZodString;
20
+ }, z.core.$strict>], "kind">;
21
+ }, z.core.$strict>;
22
+ export type SecretBrokerConfig = z.infer<typeof SecretBrokerConfigSchema>;
23
+ export type SecretBrokerPlacement = SecretBrokerConfig["placement"];
24
+ export declare function parseSecretBrokerConfig(input: unknown): SecretBrokerConfig;
25
+ /**
26
+ * A fingerprint of one broker config (sha256 hex of its parsed JSON): an unbroker
27
+ * link carries the hash of the config it was minted for, so it can't remove a
28
+ * config that has changed since.
29
+ */
30
+ export declare function brokerConfigHash(config: SecretBrokerConfig): string;
31
+ export declare const SECRET_BROKER_CHANGED = "secret_broker_changed: brokering changed since this link was created; request a new link";
32
+ export type SigV4Credentials = {
33
+ accessKeyId: string;
34
+ secretAccessKey: string;
35
+ sessionToken?: string;
36
+ };
37
+ export declare function parseSigV4Value(value: string): SigV4Credentials;
38
+ /** Throws unless `value` can be brokered under `config` (and later scrubbed from responses). */
39
+ export declare function assertBrokerableValue(config: SecretBrokerConfig, value: string): void;
@@ -0,0 +1,112 @@
1
+ /**
2
+ * A brokered secret's owner-set config: where its value may be sent and how it is
3
+ * placed. Validated on every write; the privileged host (sandbox/secret-broker.ts)
4
+ * trusts it at request time.
5
+ */
6
+ import { createHash } from "node:crypto";
7
+ import { z } from "zod";
8
+ export const MIN_BROKERED_VALUE_LENGTH = 6;
9
+ const FORBIDDEN_HEADERS = ["host", "connection", "transfer-encoding", "content-length", "upgrade", "proxy-connection"];
10
+ const TOKEN = /^[!#$%&'*+.^_`|~0-9A-Za-z-]{1,128}$/;
11
+ const HOSTNAME = /^(?=.{1,253}$)(?!-)[a-z0-9-]{1,63}(?:\.(?!-)[a-z0-9-]{1,63})+$/;
12
+ const IPV4 = /^\d{1,3}(?:\.\d{1,3}){3}$/;
13
+ /** False for a name a resolver could read as an IPv4 address ("127.1", "0x7f.0.0.1") or with a label ending in "-". */
14
+ function isExactHostname(h) {
15
+ if (!HOSTNAME.test(h) || IPV4.test(h))
16
+ return false;
17
+ const labels = h.split(".");
18
+ const last = labels[labels.length - 1];
19
+ return !/^\d+$/.test(last) && !last.startsWith("0x") && !labels.some((l) => l.endsWith("-"));
20
+ }
21
+ const host = z
22
+ .string()
23
+ .transform((h) => h.toLowerCase())
24
+ .refine(isExactHostname, "hosts must be exact hostnames (no scheme, port, wildcard, or IP)");
25
+ const pathPrefix = z
26
+ .string()
27
+ .max(512)
28
+ .startsWith("/")
29
+ .refine(
30
+ // eslint-disable-next-line no-control-regex
31
+ (p) => !/[?#\\\x00-\x1f\x7f]/.test(p) && !/%2f|%5c/i.test(p), "path prefixes must not contain ?, #, a backslash, control characters, or an encoded / or \\");
32
+ const placement = z.discriminatedUnion("kind", [
33
+ z
34
+ .object({
35
+ kind: z.literal("header"),
36
+ name: z
37
+ .string()
38
+ .regex(TOKEN, "header name must be an HTTP token")
39
+ .refine((n) => !FORBIDDEN_HEADERS.includes(n.toLowerCase()), "that header cannot be set"),
40
+ format: z
41
+ .string()
42
+ .max(256)
43
+ .refine((f) => f.split("{value}").length === 2, 'format must contain "{value}" exactly once')
44
+ .refine((f) => !/[\r\n]/.test(f), "format must not contain line breaks"),
45
+ })
46
+ .strict(),
47
+ z.object({ kind: z.literal("query"), name: z.string().min(1).max(128) }).strict(),
48
+ z.object({ kind: z.literal("body"), field: z.string().min(1).max(128) }).strict(),
49
+ z
50
+ .object({
51
+ kind: z.literal("aws-sigv4"),
52
+ region: z.string().regex(/^[a-z0-9-]{1,32}$/),
53
+ service: z.string().regex(/^[a-z0-9-]{1,64}$/),
54
+ })
55
+ .strict(),
56
+ ]);
57
+ export const SecretBrokerConfigSchema = z
58
+ .object({
59
+ hosts: z.array(host).min(1).max(20),
60
+ pathPrefixes: z.array(pathPrefix).max(20).optional(),
61
+ placement,
62
+ })
63
+ .strict();
64
+ export function parseSecretBrokerConfig(input) {
65
+ const parsed = SecretBrokerConfigSchema.safeParse(input);
66
+ if (!parsed.success) {
67
+ throw new Error(`secret_broker_config_invalid: ${parsed.error.issues.map((i) => i.message).join("; ")}`);
68
+ }
69
+ return parsed.data;
70
+ }
71
+ /**
72
+ * A fingerprint of one broker config (sha256 hex of its parsed JSON): an unbroker
73
+ * link carries the hash of the config it was minted for, so it can't remove a
74
+ * config that has changed since.
75
+ */
76
+ export function brokerConfigHash(config) {
77
+ return createHash("sha256")
78
+ .update(JSON.stringify(parseSecretBrokerConfig(config)))
79
+ .digest("hex");
80
+ }
81
+ export const SECRET_BROKER_CHANGED = "secret_broker_changed: brokering changed since this link was created; request a new link";
82
+ const SigV4ValueSchema = z
83
+ .object({
84
+ accessKeyId: z.string().min(1).max(256),
85
+ secretAccessKey: z.string().min(MIN_BROKERED_VALUE_LENGTH).max(1024),
86
+ sessionToken: z.string().min(MIN_BROKERED_VALUE_LENGTH).max(8192).optional(),
87
+ })
88
+ .strict();
89
+ export function parseSigV4Value(value) {
90
+ let json;
91
+ try {
92
+ json = JSON.parse(value);
93
+ }
94
+ catch {
95
+ throw new Error("secret_broker_value_invalid: an AWS SigV4 secret's value must be JSON {accessKeyId, secretAccessKey, sessionToken?}");
96
+ }
97
+ const parsed = SigV4ValueSchema.safeParse(json);
98
+ if (!parsed.success) {
99
+ throw new Error("secret_broker_value_invalid: an AWS SigV4 secret's value must be JSON {accessKeyId, secretAccessKey, sessionToken?}");
100
+ }
101
+ return parsed.data;
102
+ }
103
+ /** Throws unless `value` can be brokered under `config` (and later scrubbed from responses). */
104
+ export function assertBrokerableValue(config, value) {
105
+ if (config.placement.kind === "aws-sigv4") {
106
+ parseSigV4Value(value);
107
+ return;
108
+ }
109
+ if (value.length < MIN_BROKERED_VALUE_LENGTH) {
110
+ throw new Error(`secret_broker_value_invalid: a brokered value must be at least ${MIN_BROKERED_VALUE_LENGTH} characters`);
111
+ }
112
+ }
@@ -0,0 +1,46 @@
1
+ import type { PrismaClient } from "#prisma";
2
+ import { buildSecretsAccessor } from "./secrets.js";
3
+ export interface NamedSecretValues {
4
+ name: string;
5
+ values: string[];
6
+ }
7
+ type SecretGuardCipher = Parameters<typeof buildSecretsAccessor>[1];
8
+ type SecretGuardDb = Parameters<typeof buildSecretsAccessor>[2] & Pick<PrismaClient, "agentSecret">;
9
+ /** Every secret attached to the agent (readable and brokered), with every form to look for. Rejects if any read fails. */
10
+ export declare function loadAgentSecretValues(db: SecretGuardDb, cipher: SecretGuardCipher, agentId: string): Promise<NamedSecretValues[]>;
11
+ /** The sorted, unique names of the secrets whose value occurs anywhere in `value`. */
12
+ export declare function secretNamesIn(value: unknown, named: readonly NamedSecretValues[]): string[];
13
+ /** The agent-visible refusal: names the secrets, never a value. At most 1000 characters. */
14
+ export declare function secretInValueMessage(names: readonly string[]): string;
15
+ export declare const SECRET_CHECK_UNAVAILABLE_MESSAGE = "secret_check_unavailable: not stored. The agent's secrets could not be read to check this value; try again.";
16
+ export declare const WITHHELD_TEXT_NOTICE = "[withheld: this text could not be checked for secret values]";
17
+ export declare class SecretInValueError extends Error {
18
+ readonly code = "secret_in_value";
19
+ readonly secretNames: string[];
20
+ constructor(names: readonly string[]);
21
+ }
22
+ export declare class SecretCheckUnavailableError extends Error {
23
+ readonly code = "secret_check_unavailable";
24
+ constructor();
25
+ }
26
+ /** `text` with every value of every named secret masked. */
27
+ export declare function maskNamedSecrets(text: string, named: readonly NamedSecretValues[]): string;
28
+ export interface SecretWriteGuard {
29
+ assertNoSecrets(agentId: string, value: unknown): Promise<void>;
30
+ }
31
+ /** Refuses a value holding an attached secret's value; fails closed when the secrets cannot be read. */
32
+ export declare function createSecretWriteGuard(source: {
33
+ load(agentId: string): Promise<NamedSecretValues[]>;
34
+ }): SecretWriteGuard;
35
+ export declare function createDbSecretWriteGuard(db: SecretGuardDb, cipher: SecretGuardCipher): SecretWriteGuard;
36
+ /**
37
+ * Built-in tools whose arguments become text on a host, so their arguments are masked before
38
+ * the call. Review host: repo_publish_review (summary, body, inline comment bodies), repo_comment
39
+ * (body). Jira: jira_comment and jira_edit_own_comment (body), jira_update_fields (labels,
40
+ * components, priority, custom fields), jira_create_issue (summary, description, labels,
41
+ * components, custom fields, fingerprint), jira_set_property (a stored value), jira_transition
42
+ * (toStatus, which Jira may echo in an error). Read tools and jira_link_issues (a link type name
43
+ * checked against an allowlist) are left out.
44
+ */
45
+ export declare const POSTING_TOOL_NAMES: ReadonlySet<string>;
46
+ export {};
@@ -0,0 +1,104 @@
1
+ import { MIN_REDACTABLE_SECRET_LENGTH, redactExactSecretValues, withEscapedForms } from "./secret-spans.js";
2
+ import { buildSecretsAccessor } from "./secrets.js";
3
+ import { consoleRedactionValues } from "../sandbox/secret-broker.js";
4
+ /** Every secret attached to the agent (readable and brokered), with every form to look for. Rejects if any read fails. */
5
+ export async function loadAgentSecretValues(db, cipher, agentId) {
6
+ const rows = await db.agentSecret.findMany({ where: { agentId }, select: { boundName: true } });
7
+ if (rows.length === 0)
8
+ return [];
9
+ const accessor = buildSecretsAccessor(agentId, cipher, db);
10
+ return Promise.all(rows.map(async ({ boundName }) => {
11
+ const entry = await accessor.resolve(boundName);
12
+ return { name: boundName, values: entry ? withEscapedForms(consoleRedactionValues(entry)) : [] };
13
+ }));
14
+ }
15
+ function textOf(value) {
16
+ return typeof value === "string" ? value : (JSON.stringify(value) ?? "");
17
+ }
18
+ /** The sorted, unique names of the secrets whose value occurs anywhere in `value`. */
19
+ export function secretNamesIn(value, named) {
20
+ const text = textOf(value);
21
+ const hits = new Set();
22
+ for (const { name, values } of named) {
23
+ if (values.some((v) => v.length >= MIN_REDACTABLE_SECRET_LENGTH && text.includes(v)))
24
+ hits.add(name);
25
+ }
26
+ return [...hits].sort();
27
+ }
28
+ const MAX_MESSAGE_LENGTH = 1000;
29
+ function refusal(names, listed) {
30
+ const shown = names.slice(0, listed).map((n) => JSON.stringify(n));
31
+ const more = names.length - listed;
32
+ const list = shown.join(", ") + (more > 0 ? `, and ${more} more` : "");
33
+ const noun = names.length > 1 ? "secrets" : "secret";
34
+ const first = JSON.stringify(names[0]);
35
+ return `secret_in_value: not stored. The value contains the value of ${noun} ${list} attached to this agent, and secret values are never stored. Store the secret's name instead and read it when you need it: secrets.get(${first}), or fetch(url, { secrets: [${first}] }) if it is brokered.`;
36
+ }
37
+ /** The agent-visible refusal: names the secrets, never a value. At most 1000 characters. */
38
+ export function secretInValueMessage(names) {
39
+ let listed = names.length;
40
+ while (listed > 1 && refusal(names, listed).length > MAX_MESSAGE_LENGTH)
41
+ listed--;
42
+ return refusal(names, listed);
43
+ }
44
+ export const SECRET_CHECK_UNAVAILABLE_MESSAGE = "secret_check_unavailable: not stored. The agent's secrets could not be read to check this value; try again.";
45
+ export const WITHHELD_TEXT_NOTICE = "[withheld: this text could not be checked for secret values]";
46
+ export class SecretInValueError extends Error {
47
+ code = "secret_in_value";
48
+ secretNames;
49
+ constructor(names) {
50
+ super(secretInValueMessage(names));
51
+ this.name = "SecretInValueError";
52
+ this.secretNames = [...names];
53
+ }
54
+ }
55
+ export class SecretCheckUnavailableError extends Error {
56
+ code = "secret_check_unavailable";
57
+ constructor() {
58
+ super(SECRET_CHECK_UNAVAILABLE_MESSAGE);
59
+ this.name = "SecretCheckUnavailableError";
60
+ }
61
+ }
62
+ /** `text` with every value of every named secret masked. */
63
+ export function maskNamedSecrets(text, named) {
64
+ return redactExactSecretValues(text, named.flatMap((n) => n.values));
65
+ }
66
+ /** Refuses a value holding an attached secret's value; fails closed when the secrets cannot be read. */
67
+ export function createSecretWriteGuard(source) {
68
+ return {
69
+ async assertNoSecrets(agentId, value) {
70
+ let named;
71
+ try {
72
+ named = await source.load(agentId);
73
+ }
74
+ catch {
75
+ throw new SecretCheckUnavailableError();
76
+ }
77
+ const names = secretNamesIn(value, named);
78
+ if (names.length > 0)
79
+ throw new SecretInValueError(names);
80
+ },
81
+ };
82
+ }
83
+ export function createDbSecretWriteGuard(db, cipher) {
84
+ return createSecretWriteGuard({ load: (id) => loadAgentSecretValues(db, cipher, id) });
85
+ }
86
+ /**
87
+ * Built-in tools whose arguments become text on a host, so their arguments are masked before
88
+ * the call. Review host: repo_publish_review (summary, body, inline comment bodies), repo_comment
89
+ * (body). Jira: jira_comment and jira_edit_own_comment (body), jira_update_fields (labels,
90
+ * components, priority, custom fields), jira_create_issue (summary, description, labels,
91
+ * components, custom fields, fingerprint), jira_set_property (a stored value), jira_transition
92
+ * (toStatus, which Jira may echo in an error). Read tools and jira_link_issues (a link type name
93
+ * checked against an allowlist) are left out.
94
+ */
95
+ export const POSTING_TOOL_NAMES = new Set([
96
+ "repo_publish_review",
97
+ "repo_comment",
98
+ "jira_comment",
99
+ "jira_edit_own_comment",
100
+ "jira_update_fields",
101
+ "jira_create_issue",
102
+ "jira_set_property",
103
+ "jira_transition",
104
+ ]);
@@ -0,0 +1,12 @@
1
+ import type { Datastore } from "../providers/datastore/types.js";
2
+ import type { AgentMemoryStore } from "../providers/memory/types.js";
3
+ import { type SecretWriteGuard } from "./secret-guard.js";
4
+ /**
5
+ * Datastore that refuses a key or value holding an attached secret's value. Shared
6
+ * writes are checked against `opts.writerAgentId`; without it the writer is
7
+ * unknown, so the write is refused (fail closed). `writerAgentId` is stripped
8
+ * before the inner store sees it.
9
+ */
10
+ export declare function guardDatastore(inner: Datastore, guard: SecretWriteGuard): Datastore;
11
+ /** Agent memory that refuses a key or content holding an attached secret's value. */
12
+ export declare function guardAgentMemory(inner: AgentMemoryStore, guard: SecretWriteGuard): AgentMemoryStore;
@@ -0,0 +1,41 @@
1
+ import { SecretCheckUnavailableError } from "./secret-guard.js";
2
+ /**
3
+ * Datastore that refuses a key or value holding an attached secret's value. Shared
4
+ * writes are checked against `opts.writerAgentId`; without it the writer is
5
+ * unknown, so the write is refused (fail closed). `writerAgentId` is stripped
6
+ * before the inner store sees it.
7
+ */
8
+ export function guardDatastore(inner, guard) {
9
+ return {
10
+ get: (agentId, key) => inner.get(agentId, key),
11
+ async set(agentId, key, value, opts) {
12
+ await guard.assertNoSecrets(agentId, [key, value]);
13
+ return inner.set(agentId, key, value, opts);
14
+ },
15
+ delete: (agentId, key) => inner.delete(agentId, key),
16
+ list: (agentId, prefix) => inner.list(agentId, prefix),
17
+ getShared: (datastoreId, key) => inner.getShared(datastoreId, key),
18
+ async setShared(datastoreId, key, value, opts) {
19
+ const { writerAgentId, ...rest } = opts ?? {};
20
+ if (!writerAgentId)
21
+ throw new SecretCheckUnavailableError();
22
+ await guard.assertNoSecrets(writerAgentId, [key, value]);
23
+ return inner.setShared(datastoreId, key, value, rest);
24
+ },
25
+ deleteShared: (datastoreId, key) => inner.deleteShared(datastoreId, key),
26
+ listShared: (datastoreId, prefix) => inner.listShared(datastoreId, prefix),
27
+ };
28
+ }
29
+ /** Agent memory that refuses a key or content holding an attached secret's value. */
30
+ export function guardAgentMemory(inner, guard) {
31
+ return {
32
+ get: (agentId, key) => inner.get(agentId, key),
33
+ async set(agentId, key, content) {
34
+ await guard.assertNoSecrets(agentId, [key, content]);
35
+ return inner.set(agentId, key, content);
36
+ },
37
+ list: (agentId) => inner.list(agentId),
38
+ search: (agentId, query, limit) => inner.search(agentId, query, limit),
39
+ delete: (agentId, key) => inner.delete(agentId, key),
40
+ };
41
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The one redactor for exact secret values: every site that masks values it knows (the sandbox
3
+ * console bridge, the native gateway's log, the native worker's stderr, a brokered response, a
4
+ * coding worker's debug trace, git output) goes through these functions. It masks the union of
5
+ * every occurrence of every value, overlapping occurrences included, so no character of any
6
+ * occurrence survives however occurrences overlap (a value such as `abcabcabc` in `abc` x 5).
7
+ *
8
+ * No imports: every worker image (native sandbox, coding driver, Claude coding worker) ships this
9
+ * file next to its callers.
10
+ */
11
+ /** Below this length a "secret" is too likely to coincidentally match ordinary log text — not worth the false-positive risk of redacting it. */
12
+ export declare const MIN_REDACTABLE_SECRET_LENGTH = 6;
13
+ /** The marker that stands in for each masked span, unless a site passes its own. */
14
+ export declare const REDACTED_MARKER = "[REDACTED]";
15
+ export interface RedactOptions {
16
+ /** Replaces each merged span (default REDACTED_MARKER). */
17
+ marker?: string;
18
+ /** Values shorter than this are left alone (default MIN_REDACTABLE_SECRET_LENGTH; an empty value never matches). */
19
+ minLength?: number;
20
+ }
21
+ /**
22
+ * Each value plus its JSON-escaped forms, deduplicated: escaped once (`JSON.stringify(v).slice(1, -1)`)
23
+ * and twice. A value holding a quote, a backslash, a newline or a control character appears escaped
24
+ * once inside JSON text (a console line, a log line), and twice when that JSON text is itself
25
+ * logged as a string (`console.log(JSON.stringify({ key: value }))` through the console bridge, or
26
+ * a logger field that already holds JSON). The one expansion every redaction list goes through.
27
+ */
28
+ export declare function withEscapedForms(values: Iterable<string>): string[];
29
+ /**
30
+ * The merged, sorted [start, end) spans of `text` covered by any occurrence of any value, overlapping
31
+ * occurrences included (the search advances by one character, not by the value's length), so a
32
+ * self-overlapping value is covered wherever any occurrence of it lies. Values shorter than
33
+ * `minLength` are ignored. Overlapping or adjacent spans merge.
34
+ */
35
+ export declare function secretSpans(text: string, values: Iterable<string>, minLength?: number): Array<[number, number]>;
36
+ /** `spans` sorted and merged, overlapping or adjacent ones joined. */
37
+ export declare function mergeSpans(spans: ReadonlyArray<readonly [number, number]>): Array<[number, number]>;
38
+ /** `text` with each of the merged, sorted `spans` replaced by one `marker`. */
39
+ export declare function maskSpans(text: string, spans: ReadonlyArray<readonly [number, number]>, marker?: string): string;
40
+ /**
41
+ * `text` with the union of every occurrence of each value (secretSpans) replaced by the marker;
42
+ * values shorter than the minimum length are left alone.
43
+ */
44
+ export declare function redactExactSecretValues(text: string, values: Iterable<string>, options?: RedactOptions): string;
45
+ /**
46
+ * Whether `text` equals, contains, or is contained in any of `values`, under the same minimum
47
+ * length as redactExactSecretValues. For a short field that is sent whole or not at all (a native
48
+ * gateway error's cause code), where redacting part of it would still leave part of a value.
49
+ */
50
+ export declare function overlapsSecretValue(text: string, values: Iterable<string>): boolean;
@@ -0,0 +1,94 @@
1
+ /**
2
+ * The one redactor for exact secret values: every site that masks values it knows (the sandbox
3
+ * console bridge, the native gateway's log, the native worker's stderr, a brokered response, a
4
+ * coding worker's debug trace, git output) goes through these functions. It masks the union of
5
+ * every occurrence of every value, overlapping occurrences included, so no character of any
6
+ * occurrence survives however occurrences overlap (a value such as `abcabcabc` in `abc` x 5).
7
+ *
8
+ * No imports: every worker image (native sandbox, coding driver, Claude coding worker) ships this
9
+ * file next to its callers.
10
+ */
11
+ /** Below this length a "secret" is too likely to coincidentally match ordinary log text — not worth the false-positive risk of redacting it. */
12
+ export const MIN_REDACTABLE_SECRET_LENGTH = 6;
13
+ /** The marker that stands in for each masked span, unless a site passes its own. */
14
+ export const REDACTED_MARKER = "[REDACTED]";
15
+ /** `text` as it appears inside a JSON string literal (JSON.stringify without the quotes). */
16
+ const jsonEscaped = (text) => JSON.stringify(text).slice(1, -1);
17
+ /**
18
+ * Each value plus its JSON-escaped forms, deduplicated: escaped once (`JSON.stringify(v).slice(1, -1)`)
19
+ * and twice. A value holding a quote, a backslash, a newline or a control character appears escaped
20
+ * once inside JSON text (a console line, a log line), and twice when that JSON text is itself
21
+ * logged as a string (`console.log(JSON.stringify({ key: value }))` through the console bridge, or
22
+ * a logger field that already holds JSON). The one expansion every redaction list goes through.
23
+ */
24
+ export function withEscapedForms(values) {
25
+ const out = new Set();
26
+ for (const value of values) {
27
+ const once = jsonEscaped(value);
28
+ out.add(value);
29
+ out.add(once);
30
+ out.add(jsonEscaped(once));
31
+ }
32
+ return [...out];
33
+ }
34
+ /**
35
+ * The merged, sorted [start, end) spans of `text` covered by any occurrence of any value, overlapping
36
+ * occurrences included (the search advances by one character, not by the value's length), so a
37
+ * self-overlapping value is covered wherever any occurrence of it lies. Values shorter than
38
+ * `minLength` are ignored. Overlapping or adjacent spans merge.
39
+ */
40
+ export function secretSpans(text, values, minLength = MIN_REDACTABLE_SECRET_LENGTH) {
41
+ const spans = [];
42
+ const shortest = Math.max(1, minLength);
43
+ for (const value of new Set(values)) {
44
+ if (value.length < shortest)
45
+ continue;
46
+ for (let at = text.indexOf(value); at >= 0; at = text.indexOf(value, at + 1))
47
+ spans.push([at, at + value.length]);
48
+ }
49
+ return mergeSpans(spans);
50
+ }
51
+ /** `spans` sorted and merged, overlapping or adjacent ones joined. */
52
+ export function mergeSpans(spans) {
53
+ const sorted = spans.filter(([start, end]) => end > start).sort((a, b) => a[0] - b[0] || a[1] - b[1]);
54
+ const merged = [];
55
+ for (const [start, end] of sorted) {
56
+ const last = merged[merged.length - 1];
57
+ if (last && start <= last[1])
58
+ last[1] = Math.max(last[1], end);
59
+ else
60
+ merged.push([start, end]);
61
+ }
62
+ return merged;
63
+ }
64
+ /** `text` with each of the merged, sorted `spans` replaced by one `marker`. */
65
+ export function maskSpans(text, spans, marker = REDACTED_MARKER) {
66
+ let out = "";
67
+ let from = 0;
68
+ for (const [start, end] of spans) {
69
+ out += `${text.slice(from, start)}${marker}`;
70
+ from = end;
71
+ }
72
+ return out + text.slice(from);
73
+ }
74
+ /**
75
+ * `text` with the union of every occurrence of each value (secretSpans) replaced by the marker;
76
+ * values shorter than the minimum length are left alone.
77
+ */
78
+ export function redactExactSecretValues(text, values, options = {}) {
79
+ return maskSpans(text, secretSpans(text, values, options.minLength), options.marker);
80
+ }
81
+ /**
82
+ * Whether `text` equals, contains, or is contained in any of `values`, under the same minimum
83
+ * length as redactExactSecretValues. For a short field that is sent whole or not at all (a native
84
+ * gateway error's cause code), where redacting part of it would still leave part of a value.
85
+ */
86
+ export function overlapsSecretValue(text, values) {
87
+ for (const value of values) {
88
+ if (value.length < MIN_REDACTABLE_SECRET_LENGTH)
89
+ continue;
90
+ if (text.includes(value) || value.includes(text))
91
+ return true;
92
+ }
93
+ return false;
94
+ }
@@ -6,19 +6,52 @@
6
6
  * always resolve a name within one owner's (or, at get-time, one agent's)
7
7
  * scope, never globally.
8
8
  */
9
- import type { PrismaClient, Secret } from "#prisma";
9
+ import { type PrismaClient, type Secret } from "#prisma";
10
10
  import type { SecretCipher } from "../providers/secrets/types.js";
11
- export type SecretMetadata = Pick<Secret, "id" | "name" | "keyId" | "ownerId" | "createdAt" | "updatedAt">;
11
+ import { type SecretBrokerConfig } from "./secret-broker-config.js";
12
+ export type BrokerChangeVia = "mcp" | "browser";
13
+ export type SecretMetadata = Pick<Secret, "id" | "name" | "keyId" | "ownerId" | "createdAt" | "updatedAt"> & {
14
+ broker: SecretBrokerConfig | null;
15
+ };
16
+ export interface SecretEntry {
17
+ value: string;
18
+ broker: SecretBrokerConfig | null;
19
+ }
12
20
  export interface SecretsAccessor {
21
+ /** Readable secrets only: a brokered secret throws `secret_brokered`. */
13
22
  get(name: string): Promise<string | undefined>;
23
+ /** Host-internal: value and broker config, brokered or not. Never exposed to tool code. */
24
+ resolve?(name: string): Promise<SecretEntry | undefined>;
14
25
  }
15
26
  /**
16
27
  * Encrypts and stores a secret value. Upserts on (ownerId, name) — calling
17
28
  * this again for a name the owner already has rotates its value in place
18
29
  * (same id) rather than failing on the unique constraint. The plaintext is
19
- * never logged or returned.
30
+ * never logged or returned. With `options.broker`, the config is validated
31
+ * against the value, saved, and audited in the same transaction.
32
+ */
33
+ export declare function createSecret(name: string, value: string, ownerId: string, cipher: SecretCipher, db: PrismaClient, options?: {
34
+ broker?: SecretBrokerConfig;
35
+ via?: BrokerChangeVia;
36
+ }): Promise<Secret>;
37
+ /**
38
+ * Sets, changes, or (broker: null) removes a secret's broker config, with one audit
39
+ * row per actual change. `expectedBrokerHash` (brokerConfigHash of the config the
40
+ * caller confirmed) makes the change conditional, checked inside the transaction:
41
+ * if the secret is no longer brokered with exactly that config, it throws
42
+ * secret_broker_changed and changes nothing.
20
43
  */
21
- export declare function createSecret(name: string, value: string, ownerId: string, cipher: SecretCipher, db: PrismaClient): Promise<Secret>;
44
+ export declare function setSecretBroker(db: PrismaClient, cipher: SecretCipher, input: {
45
+ ownerId: string;
46
+ name: string;
47
+ broker: SecretBrokerConfig | null;
48
+ actorId: string;
49
+ via: BrokerChangeVia;
50
+ expectedBrokerHash?: string;
51
+ }): Promise<{
52
+ before: SecretBrokerConfig | null;
53
+ after: SecretBrokerConfig | null;
54
+ }>;
22
55
  /** Names/metadata only — never a value or ciphertext. */
23
56
  export declare function listSecrets(ownerId: string, db: PrismaClient): Promise<SecretMetadata[]>;
24
57
  /** Attaches one of the owner's own secrets (by canonical name) to an agent,
@@ -43,6 +76,8 @@ export declare function deleteSecret(secretId: string, db: PrismaClient): Promis
43
76
  * binding written before that rule, left behind by make_owner, or on an
44
77
  * owner-less agent behaves exactly like an unattached name, so one owner's
45
78
  * secret never reaches another owner's agent (A2/S2-2, R2-1).
79
+ *
80
+ * A brokered secret's `get` throws `secret_brokered`; only the privileged host's `resolve` sees its value.
46
81
  */
47
82
  export declare function buildSecretsAccessor(agentId: string, cipher: SecretCipher, db: Pick<PrismaClient, "agentSecret"> & Partial<Pick<PrismaClient, "$queryRaw">>): SecretsAccessor;
48
83
  /**