@wardby/cli 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (576) hide show
  1. package/deploy/local/docker-compose.quickstart-coding.yml +13 -0
  2. package/dist/claude-coding-worker/driver.d.ts +21 -3
  3. package/dist/claude-coding-worker/driver.js +125 -17
  4. package/dist/claude-coding-worker/main.js +34 -6
  5. package/dist/claude-coding-worker/sdk.js +12 -1
  6. package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
  7. package/dist/claude-coding-worker/tool-socket.js +111 -0
  8. package/dist/claude-coding-worker/transcript.d.ts +18 -0
  9. package/dist/claude-coding-worker/transcript.js +77 -0
  10. package/dist/cli-help.d.ts +1 -1
  11. package/dist/cli-help.js +1 -0
  12. package/dist/cli.js +24 -10
  13. package/dist/coding/continuation-wording.d.ts +35 -0
  14. package/dist/coding/continuation-wording.js +73 -0
  15. package/dist/coding/linked-issue-note.d.ts +23 -0
  16. package/dist/coding/linked-issue-note.js +47 -0
  17. package/dist/coding/merge-wording.d.ts +28 -0
  18. package/dist/coding/merge-wording.js +78 -0
  19. package/dist/coding/pr-description-note.d.ts +9 -0
  20. package/dist/coding/pr-description-note.js +32 -0
  21. package/dist/coding/profile.d.ts +46 -126
  22. package/dist/coding/profile.js +45 -4
  23. package/dist/coding/protected-path-wording.d.ts +8 -0
  24. package/dist/coding/protected-path-wording.js +1 -1
  25. package/dist/coding/protocol.d.ts +264 -346
  26. package/dist/coding/protocol.js +235 -12
  27. package/dist/coding/redact.d.ts +3 -0
  28. package/dist/coding/redact.js +12 -0
  29. package/dist/coding/registry/allowlist.d.ts +12 -0
  30. package/dist/coding/registry/allowlist.js +14 -1
  31. package/dist/coding/registry/audit-mode.d.ts +153 -0
  32. package/dist/coding/registry/audit-mode.js +304 -0
  33. package/dist/coding/registry/lockfile-shared.d.ts +36 -0
  34. package/dist/coding/registry/lockfile-shared.js +128 -0
  35. package/dist/coding/registry/lockfiles.js +1 -1
  36. package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
  37. package/dist/coding/registry/npm-lockfile-formats.js +41 -0
  38. package/dist/coding/registry/npm-lockfile.d.ts +8 -4
  39. package/dist/coding/registry/npm-lockfile.js +4 -6
  40. package/dist/coding/registry/npm.js +78 -8
  41. package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
  42. package/dist/coding/registry/pnpm-lockfile.js +189 -0
  43. package/dist/coding/registry/pypi-plan.d.ts +50 -0
  44. package/dist/coding/registry/pypi-plan.js +406 -0
  45. package/dist/coding/registry/pypi-requirements.d.ts +58 -0
  46. package/dist/coding/registry/pypi-requirements.js +155 -0
  47. package/dist/coding/registry/pypi.d.ts +3 -27
  48. package/dist/coding/registry/pypi.js +40 -154
  49. package/dist/coding/registry/refusal-hints.d.ts +20 -0
  50. package/dist/coding/registry/refusal-hints.js +61 -0
  51. package/dist/coding/registry/refusal-wording.d.ts +11 -0
  52. package/dist/coding/registry/refusal-wording.js +56 -0
  53. package/dist/coding/registry/report.d.ts +70 -8
  54. package/dist/coding/registry/report.js +112 -5
  55. package/dist/coding/registry/types.d.ts +58 -8
  56. package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
  57. package/dist/coding/registry/yarn-lockfile.js +367 -0
  58. package/dist/coding/services/catalog.d.ts +37 -351
  59. package/dist/coding/transcript/claude-code.d.ts +13 -0
  60. package/dist/coding/transcript/claude-code.js +273 -0
  61. package/dist/coding/transcript/download-protocol.d.ts +30 -0
  62. package/dist/coding/transcript/download-protocol.js +18 -0
  63. package/dist/coding/transcript/format.d.ts +20 -0
  64. package/dist/coding/transcript/format.js +32 -0
  65. package/dist/coding/transcript/recorder.d.ts +51 -0
  66. package/dist/coding/transcript/recorder.js +225 -0
  67. package/dist/coding/transcript/resume/checkout.d.ts +31 -0
  68. package/dist/coding/transcript/resume/checkout.js +203 -0
  69. package/dist/coding/transcript/resume/command.d.ts +17 -0
  70. package/dist/coding/transcript/resume/command.js +176 -0
  71. package/dist/coding/transcript/resume/download.d.ts +20 -0
  72. package/dist/coding/transcript/resume/download.js +153 -0
  73. package/dist/coding/transcript/resume/launch.d.ts +38 -0
  74. package/dist/coding/transcript/resume/launch.js +128 -0
  75. package/dist/coding/transcript/resume/session-file.d.ts +13 -0
  76. package/dist/coding/transcript/resume/session-file.js +79 -0
  77. package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
  78. package/dist/coding/transcript/resume/stand-in.js +49 -0
  79. package/dist/coding-worker/artifact.d.ts +8 -3
  80. package/dist/coding-worker/artifact.js +3 -1
  81. package/dist/coding-worker/debug-trace.d.ts +6 -5
  82. package/dist/coding-worker/debug-trace.js +13 -18
  83. package/dist/coding-worker/dependency-cache.d.mts +229 -0
  84. package/dist/coding-worker/dependency-cache.mjs +2123 -0
  85. package/dist/coding-worker/driver.d.ts +4 -3
  86. package/dist/coding-worker/driver.js +116 -38
  87. package/dist/coding-worker/errors.d.ts +1 -0
  88. package/dist/coding-worker/errors.js +32 -0
  89. package/dist/coding-worker/task-note.d.ts +11 -0
  90. package/dist/coding-worker/task-note.js +13 -0
  91. package/dist/coding-worker/types.d.ts +11 -0
  92. package/dist/config/dependency-cache.d.ts +23 -0
  93. package/dist/config/dependency-cache.js +32 -0
  94. package/dist/config/providers.d.ts +12 -3
  95. package/dist/config/providers.js +55 -5
  96. package/dist/config/test-simulators.d.ts +82 -0
  97. package/dist/config/test-simulators.js +305 -0
  98. package/dist/core/async-context.d.ts +2 -0
  99. package/dist/core/async-context.js +12 -0
  100. package/dist/core/budget-events.d.ts +108 -0
  101. package/dist/core/budget-events.js +346 -0
  102. package/dist/core/budget-groups.d.ts +50 -1
  103. package/dist/core/budget-groups.js +236 -27
  104. package/dist/core/budget-stopped-head.d.ts +46 -0
  105. package/dist/core/budget-stopped-head.js +81 -0
  106. package/dist/core/budget-topup.d.ts +51 -0
  107. package/dist/core/budget-topup.js +156 -0
  108. package/dist/core/budget-wording.d.ts +16 -2
  109. package/dist/core/budget-wording.js +40 -2
  110. package/dist/core/coding-queue.d.ts +2 -1
  111. package/dist/core/coding-queue.js +7 -0
  112. package/dist/core/cron.d.ts +19 -1
  113. package/dist/core/cron.js +17 -0
  114. package/dist/core/datastores.js +1 -1
  115. package/dist/core/deferred-coding.d.ts +14 -0
  116. package/dist/core/deferred-coding.js +62 -0
  117. package/dist/core/delegation-child.d.ts +25 -0
  118. package/dist/core/delegation-child.js +37 -0
  119. package/dist/core/dispatch.d.ts +42 -0
  120. package/dist/core/dispatch.js +131 -56
  121. package/dist/core/engine-native.js +1 -1
  122. package/dist/core/error-code.d.ts +38 -0
  123. package/dist/core/error-code.js +168 -0
  124. package/dist/core/grants.d.ts +19 -6
  125. package/dist/core/grants.js +55 -6
  126. package/dist/core/host-events.d.ts +18 -2
  127. package/dist/core/host-events.js +284 -24
  128. package/dist/core/host-status.d.ts +85 -3
  129. package/dist/core/host-status.js +298 -20
  130. package/dist/core/issue-bridge.d.ts +50 -6
  131. package/dist/core/issue-bridge.js +124 -33
  132. package/dist/core/issue-events.d.ts +1 -1
  133. package/dist/core/issue-events.js +4 -10
  134. package/dist/core/issue-status.d.ts +1 -1
  135. package/dist/core/issue-status.js +54 -26
  136. package/dist/core/logger.d.ts +5 -0
  137. package/dist/core/logger.js +14 -1
  138. package/dist/core/lost-run-children.d.ts +6 -0
  139. package/dist/core/lost-run-children.js +32 -0
  140. package/dist/core/mark-ready.d.ts +34 -0
  141. package/dist/core/mark-ready.js +152 -0
  142. package/dist/core/markdown-code.d.ts +8 -0
  143. package/dist/core/markdown-code.js +107 -0
  144. package/dist/core/memory-tools.js +7 -0
  145. package/dist/core/merge-order-check.d.ts +2 -1
  146. package/dist/core/merge-order-check.js +8 -1
  147. package/dist/core/notification-templates.d.ts +1 -7
  148. package/dist/core/notification-templates.js +36 -2
  149. package/dist/core/pull-request-state-sync.js +2 -2
  150. package/dist/core/reconciler.d.ts +4 -3
  151. package/dist/core/reconciler.js +8 -1
  152. package/dist/core/related-pull-requests.d.ts +11 -3
  153. package/dist/core/related-pull-requests.js +27 -14
  154. package/dist/core/reply-parts.d.ts +21 -0
  155. package/dist/core/reply-parts.js +73 -0
  156. package/dist/core/review-fix.d.ts +1 -1
  157. package/dist/core/review-fix.js +2 -1
  158. package/dist/core/review-host-checks.d.ts +1 -1
  159. package/dist/core/review-host-tools.d.ts +3 -0
  160. package/dist/core/review-host-tools.js +99 -13
  161. package/dist/core/review-reads.d.ts +55 -0
  162. package/dist/core/review-reads.js +233 -0
  163. package/dist/core/run-status.d.ts +12 -0
  164. package/dist/core/run-status.js +12 -0
  165. package/dist/core/runner.d.ts +80 -34
  166. package/dist/core/runner.js +439 -144
  167. package/dist/core/schedule-start.d.ts +12 -0
  168. package/dist/core/schedule-start.js +14 -0
  169. package/dist/core/secret-broker-config.d.ts +10 -74
  170. package/dist/core/secret-guard.d.ts +46 -0
  171. package/dist/core/secret-guard.js +104 -0
  172. package/dist/core/secret-guarded-stores.d.ts +12 -0
  173. package/dist/core/secret-guarded-stores.js +41 -0
  174. package/dist/core/secret-spans.d.ts +50 -0
  175. package/dist/core/secret-spans.js +94 -0
  176. package/dist/core/stop-run.d.ts +46 -0
  177. package/dist/core/stop-run.js +61 -0
  178. package/dist/core/workflow-events.d.ts +14 -2
  179. package/dist/core/workflow-events.js +4 -0
  180. package/dist/core/workflow-run-events.d.ts +5 -3
  181. package/dist/core/workflow-run-events.js +43 -8
  182. package/dist/core/zod-json-schema.d.ts +4 -0
  183. package/dist/core/zod-json-schema.js +39 -0
  184. package/dist/core/zod3-window.d.ts +35 -0
  185. package/dist/core/zod3-window.js +124 -0
  186. package/dist/generated/prisma/browser.d.ts +34 -3
  187. package/dist/generated/prisma/client.d.ts +34 -3
  188. package/dist/generated/prisma/commonInputTypes.d.ts +220 -60
  189. package/dist/generated/prisma/enums.d.ts +10 -0
  190. package/dist/generated/prisma/enums.js +8 -0
  191. package/dist/generated/prisma/internal/class.d.ts +44 -0
  192. package/dist/generated/prisma/internal/class.js +4 -4
  193. package/dist/generated/prisma/internal/prismaNamespace.d.ts +428 -9
  194. package/dist/generated/prisma/internal/prismaNamespace.js +92 -1
  195. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +95 -0
  196. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +92 -1
  197. package/dist/generated/prisma/models/Agent.d.ts +106 -8
  198. package/dist/generated/prisma/models/AgentRepository.d.ts +42 -1
  199. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +229 -1
  200. package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
  201. package/dist/generated/prisma/models/CodingProxySession.d.ts +114 -1
  202. package/dist/generated/prisma/models/CodingRun.d.ts +1637 -1
  203. package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
  204. package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
  205. package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
  206. package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
  207. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +39 -1
  208. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
  209. package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
  210. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
  211. package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
  212. package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
  213. package/dist/generated/prisma/models/Run.d.ts +738 -2
  214. package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
  215. package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
  216. package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
  217. package/dist/generated/prisma/models/RunTranscript.js +1 -0
  218. package/dist/generated/prisma/models.d.ts +4 -0
  219. package/dist/help-index.json +1320 -69
  220. package/dist/import/create.js +32 -3
  221. package/dist/import/neutral-schema.d.ts +50 -281
  222. package/dist/import/neutral-schema.js +5 -4
  223. package/dist/knowledge/check.d.ts +1 -1
  224. package/dist/knowledge/cli.d.ts +11 -1
  225. package/dist/knowledge/cli.js +37 -4
  226. package/dist/knowledge/concept.d.ts +3 -19
  227. package/dist/knowledge/location.d.ts +31 -0
  228. package/dist/knowledge/location.js +78 -0
  229. package/dist/mcp/auth/access.d.ts +10 -2
  230. package/dist/mcp/auth/access.js +15 -1
  231. package/dist/mcp/auth/ownership.d.ts +7 -7
  232. package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
  233. package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
  234. package/dist/mcp/host-events/github-ingress.d.ts +2 -0
  235. package/dist/mcp/host-events/github-ingress.js +2 -1
  236. package/dist/mcp/index.d.ts +6 -0
  237. package/dist/mcp/index.js +58 -10
  238. package/dist/mcp/server.d.ts +13 -0
  239. package/dist/mcp/server.js +33 -14
  240. package/dist/mcp/tools/agents.d.ts +4 -0
  241. package/dist/mcp/tools/agents.js +198 -16
  242. package/dist/mcp/tools/datastore.js +17 -8
  243. package/dist/mcp/tools/grants.js +9 -3
  244. package/dist/mcp/tools/memory.js +11 -1
  245. package/dist/mcp/tools/notification-channels.js +2 -2
  246. package/dist/mcp/tools/packages.d.ts +2 -0
  247. package/dist/mcp/tools/packages.js +195 -0
  248. package/dist/mcp/tools/repositories.js +18 -5
  249. package/dist/mcp/tools/run-access.d.ts +16 -0
  250. package/dist/mcp/tools/run-access.js +25 -0
  251. package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
  252. package/dist/mcp/tools/run-transcript-download.js +129 -0
  253. package/dist/mcp/tools/run-transcript.d.ts +19 -0
  254. package/dist/mcp/tools/run-transcript.js +70 -0
  255. package/dist/mcp/tools/runs.js +34 -12
  256. package/dist/mcp/tools/scheduling.js +3 -1
  257. package/dist/mcp/tools/secret-elicitation-form.js +5 -0
  258. package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
  259. package/dist/mcp/tools/secret-elicitation-server.js +10 -61
  260. package/dist/mcp/tools/secrets.js +2 -2
  261. package/dist/mcp/tools/stop-run.d.ts +2 -0
  262. package/dist/mcp/tools/stop-run.js +82 -0
  263. package/dist/mcp/tools/subagents.js +2 -2
  264. package/dist/mcp/tools/tools.d.ts +1 -1
  265. package/dist/mcp/tools/tools.js +25 -9
  266. package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
  267. package/dist/mcp/transport/stdio-link-host.js +67 -0
  268. package/dist/mcp/transport/streamable-http.d.ts +13 -0
  269. package/dist/mcp/transport/streamable-http.js +41 -1
  270. package/dist/native-worker/docker-launcher.d.ts +38 -2
  271. package/dist/native-worker/docker-launcher.js +65 -5
  272. package/dist/native-worker/gateway-server.d.ts +41 -3
  273. package/dist/native-worker/gateway-server.js +124 -27
  274. package/dist/native-worker/gateway.d.ts +27 -1
  275. package/dist/native-worker/gateway.js +70 -4
  276. package/dist/native-worker/http-server.d.ts +3 -1
  277. package/dist/native-worker/http-server.js +11 -7
  278. package/dist/native-worker/http-transport.js +1 -1
  279. package/dist/native-worker/kubernetes-launcher.d.ts +7 -3
  280. package/dist/native-worker/kubernetes-launcher.js +43 -3
  281. package/dist/native-worker/launch.d.ts +18 -1
  282. package/dist/native-worker/launch.js +6 -1
  283. package/dist/native-worker/ledger.d.ts +18 -2
  284. package/dist/native-worker/ledger.js +57 -4
  285. package/dist/native-worker/loopback.js +3 -8
  286. package/dist/native-worker/main.d.ts +2 -1
  287. package/dist/native-worker/main.js +14 -3
  288. package/dist/native-worker/protocol.d.ts +129 -577
  289. package/dist/native-worker/protocol.js +47 -1
  290. package/dist/native-worker/sandbox-executor.d.ts +17 -2
  291. package/dist/native-worker/sandbox-executor.js +78 -4
  292. package/dist/native-worker/stderr-redaction.d.ts +77 -0
  293. package/dist/native-worker/stderr-redaction.js +237 -0
  294. package/dist/native-worker/stdio.d.ts +1 -1
  295. package/dist/native-worker/stdio.js +6 -5
  296. package/dist/native-worker/warm-pool.d.ts +2 -2
  297. package/dist/native-worker/warm-pool.js +4 -4
  298. package/dist/native-worker/worker.js +28 -2
  299. package/dist/observability/metrics.js +6 -1
  300. package/dist/providers/auth/self-hosted.d.ts +1 -1
  301. package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
  302. package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
  303. package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
  304. package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
  305. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
  306. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
  307. package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
  308. package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
  309. package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
  310. package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
  311. package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
  312. package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
  313. package/dist/providers/coding-proxy/hold.d.ts +32 -0
  314. package/dist/providers/coding-proxy/hold.js +86 -0
  315. package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
  316. package/dist/providers/coding-proxy/interrupted.js +104 -0
  317. package/dist/providers/coding-proxy/memory-ledger.d.ts +15 -2
  318. package/dist/providers/coding-proxy/memory-ledger.js +84 -8
  319. package/dist/providers/coding-proxy/metering.d.ts +16 -0
  320. package/dist/providers/coding-proxy/metering.js +27 -4
  321. package/dist/providers/coding-proxy/prisma-ledger.d.ts +15 -2
  322. package/dist/providers/coding-proxy/prisma-ledger.js +179 -67
  323. package/dist/providers/coding-proxy/proxy.d.ts +14 -1
  324. package/dist/providers/coding-proxy/proxy.js +166 -14
  325. package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
  326. package/dist/providers/coding-proxy/registry/audit.js +94 -17
  327. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
  328. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
  329. package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
  330. package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
  331. package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
  332. package/dist/providers/coding-proxy/registry/plan.js +201 -48
  333. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
  334. package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
  335. package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
  336. package/dist/providers/coding-proxy/registry/service.js +579 -112
  337. package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
  338. package/dist/providers/coding-proxy/registry/store.js +54 -1
  339. package/dist/providers/coding-proxy/runtime.d.ts +4 -0
  340. package/dist/providers/coding-proxy/runtime.js +78 -16
  341. package/dist/providers/coding-proxy/server.d.ts +6 -1
  342. package/dist/providers/coding-proxy/server.js +45 -1
  343. package/dist/providers/coding-proxy/types.d.ts +65 -1
  344. package/dist/providers/datastore/types.d.ts +5 -0
  345. package/dist/providers/engine/types.d.ts +17 -2
  346. package/dist/providers/engine/types.js +17 -0
  347. package/dist/providers/executor/composition.d.ts +10 -3
  348. package/dist/providers/executor/composition.js +47 -7
  349. package/dist/providers/executor/container.d.ts +361 -8
  350. package/dist/providers/executor/container.js +1136 -91
  351. package/dist/providers/executor/dbos-status.d.ts +31 -0
  352. package/dist/providers/executor/dbos-status.js +64 -0
  353. package/dist/providers/executor/dbos.d.ts +50 -1
  354. package/dist/providers/executor/dbos.js +207 -20
  355. package/dist/providers/executor/deferred.d.ts +12 -24
  356. package/dist/providers/executor/deferred.js +10 -29
  357. package/dist/providers/executor/in-process.d.ts +9 -1
  358. package/dist/providers/executor/in-process.js +14 -4
  359. package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
  360. package/dist/providers/executor/linked-issue-reader.js +30 -0
  361. package/dist/providers/executor/routing.d.ts +2 -0
  362. package/dist/providers/executor/routing.js +4 -0
  363. package/dist/providers/executor/types.d.ts +13 -0
  364. package/dist/providers/index.d.ts +2 -1
  365. package/dist/providers/issue-tracker/types.d.ts +17 -0
  366. package/dist/providers/issue-tracker/types.js +39 -1
  367. package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
  368. package/dist/providers/jobs/claude-tool-setup.js +5 -2
  369. package/dist/providers/jobs/docker-isolation.d.ts +8 -0
  370. package/dist/providers/jobs/docker-isolation.js +17 -0
  371. package/dist/providers/jobs/docker.d.ts +1 -0
  372. package/dist/providers/jobs/docker.js +27 -2
  373. package/dist/providers/jobs/fake-kubernetes-api.d.ts +2 -0
  374. package/dist/providers/jobs/fake-kubernetes-api.js +3 -0
  375. package/dist/providers/jobs/kubernetes-api.d.ts +8 -0
  376. package/dist/providers/jobs/kubernetes-api.js +10 -0
  377. package/dist/providers/jobs/kubernetes-client.js +10 -1
  378. package/dist/providers/jobs/kubernetes-isolation.d.ts +2 -0
  379. package/dist/providers/jobs/kubernetes-isolation.js +17 -1
  380. package/dist/providers/jobs/kubernetes.d.ts +6 -1
  381. package/dist/providers/jobs/kubernetes.js +105 -16
  382. package/dist/providers/jobs/types.d.ts +33 -0
  383. package/dist/providers/jobs/types.js +13 -1
  384. package/dist/providers/llm/anthropic.js +5 -1
  385. package/dist/providers/llm/bedrock.d.ts +0 -12
  386. package/dist/providers/llm/bedrock.js +4 -0
  387. package/dist/providers/llm/claude-messages.d.ts +3 -1
  388. package/dist/providers/llm/claude-messages.js +4 -1
  389. package/dist/providers/llm/claude-provider.d.ts +2 -2
  390. package/dist/providers/llm/claude-provider.js +2 -2
  391. package/dist/providers/llm/openai.d.ts +2 -2
  392. package/dist/providers/llm/openai.js +6 -2
  393. package/dist/providers/llm/routing.d.ts +2 -2
  394. package/dist/providers/llm/routing.js +2 -2
  395. package/dist/providers/llm/types.d.ts +12 -2
  396. package/dist/providers/review-host/github-events.d.ts +9 -1
  397. package/dist/providers/review-host/github-events.js +34 -12
  398. package/dist/providers/review-host/github.d.ts +29 -2
  399. package/dist/providers/review-host/github.js +224 -29
  400. package/dist/providers/review-host/local.d.ts +8 -4
  401. package/dist/providers/review-host/local.js +49 -31
  402. package/dist/providers/review-host/patch-pages.d.ts +41 -0
  403. package/dist/providers/review-host/patch-pages.js +176 -0
  404. package/dist/providers/review-host/review-format.d.ts +19 -1
  405. package/dist/providers/review-host/review-format.js +38 -7
  406. package/dist/providers/review-host/types.d.ts +134 -2
  407. package/dist/providers/review-host/types.js +8 -0
  408. package/dist/providers/storage/gcs.d.ts +63 -0
  409. package/dist/providers/storage/gcs.js +69 -0
  410. package/dist/providers/storage/index.d.ts +15 -0
  411. package/dist/providers/storage/index.js +14 -0
  412. package/dist/providers/storage/local.d.ts +24 -0
  413. package/dist/providers/storage/local.js +92 -0
  414. package/dist/providers/storage/meter.d.ts +14 -0
  415. package/dist/providers/storage/meter.js +34 -0
  416. package/dist/providers/storage/s3.d.ts +41 -0
  417. package/dist/providers/storage/s3.js +107 -0
  418. package/dist/providers/storage/types.d.ts +37 -3
  419. package/dist/providers/storage/types.js +21 -4
  420. package/dist/providers/vcs/git.d.ts +33 -2
  421. package/dist/providers/vcs/git.js +324 -22
  422. package/dist/providers/vcs/github-remote.d.ts +26 -3
  423. package/dist/providers/vcs/github-remote.js +124 -14
  424. package/dist/providers/vcs/github.d.ts +214 -6
  425. package/dist/providers/vcs/github.js +447 -45
  426. package/dist/providers/vcs/index.js +8 -1
  427. package/dist/providers/vcs/pr-description.d.ts +127 -0
  428. package/dist/providers/vcs/pr-description.js +270 -0
  429. package/dist/providers/vcs/remote.d.ts +33 -1
  430. package/dist/providers/vcs/routing.d.ts +4 -2
  431. package/dist/providers/vcs/routing.js +6 -0
  432. package/dist/providers/vcs/types.d.ts +80 -3
  433. package/dist/quickstart/coding-seed.d.ts +14 -3
  434. package/dist/quickstart/coding-seed.js +213 -4
  435. package/dist/quickstart/reviewer-prompt.d.ts +1 -1
  436. package/dist/quickstart/reviewer-prompt.js +6 -6
  437. package/dist/quickstart-images.json +1 -1
  438. package/dist/sandbox/generated/zod.bundle.js +62 -1
  439. package/dist/sandbox/generated/zod3.bundle.js +5 -0
  440. package/dist/sandbox/host-functions.d.ts +1 -0
  441. package/dist/sandbox/host-functions.js +6 -11
  442. package/dist/sandbox/secret-broker.js +3 -4
  443. package/dist/sandbox/tool-capabilities.d.ts +10 -30
  444. package/dist/sandbox/zod-params.d.ts +37 -5
  445. package/dist/sandbox/zod-params.js +181 -26
  446. package/dist/serve.js +8 -1
  447. package/dist/viewer/api-schema.d.ts +349 -2627
  448. package/dist/viewer/api-schema.js +7 -0
  449. package/dist/viewer/build-schemas.js +6 -2
  450. package/dist/viewer/openapi.js +2 -4
  451. package/dist/wardby-bin.js +10 -0
  452. package/docs/agent-recipes.md +58 -20
  453. package/docs/code-review-agents.md +551 -41
  454. package/docs/coding-agent-setup.md +489 -7
  455. package/docs/coding-packages.md +1033 -90
  456. package/docs/coding-services.md +27 -12
  457. package/docs/coding-worker-byo-images.md +20 -0
  458. package/docs/coding-worker-isolation.md +105 -30
  459. package/docs/getting-started-gke.md +124 -137
  460. package/docs/getting-started-identity-provider.md +10 -1
  461. package/docs/getting-started.md +9 -0
  462. package/docs/jira-agents.md +17 -8
  463. package/docs/knowledge/blob-not-found-semantics.md +41 -0
  464. package/docs/knowledge/bounded-file-descriptor.md +52 -0
  465. package/docs/knowledge/delegation-admission-slots.md +52 -0
  466. package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
  467. package/docs/knowledge/import-rename-target.md +52 -0
  468. package/docs/knowledge/index.md +57 -0
  469. package/docs/knowledge/log.md +9 -0
  470. package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
  471. package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
  472. package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
  473. package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
  474. package/docs/knowledge/overview-cli.md +74 -0
  475. package/docs/knowledge/overview-coding-proxy.md +72 -0
  476. package/docs/knowledge/overview-coding.md +72 -0
  477. package/docs/knowledge/overview-config.md +60 -0
  478. package/docs/knowledge/overview-core.md +72 -0
  479. package/docs/knowledge/overview-deploy.md +83 -0
  480. package/docs/knowledge/overview-mcp.md +61 -0
  481. package/docs/knowledge/overview-prisma.md +72 -0
  482. package/docs/knowledge/overview-providers.md +89 -0
  483. package/docs/knowledge/overview-sandbox.md +83 -0
  484. package/docs/knowledge/overview-surfaces.md +83 -0
  485. package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
  486. package/docs/knowledge/proxy-settlement-projections.md +41 -0
  487. package/docs/knowledge/run-pricing-first-writer.md +43 -0
  488. package/docs/knowledge/schedule-claim-transaction.md +41 -0
  489. package/docs/knowledge/secret-entry-replica-contract.md +52 -0
  490. package/docs/knowledge/terminal-run-first-writer.md +41 -0
  491. package/docs/knowledge/transactional-agent-authorization.md +52 -0
  492. package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
  493. package/docs/knowledge/warm-input-publication.md +30 -0
  494. package/docs/knowledge/workspace-staging-failure.md +54 -0
  495. package/docs/knowledge.md +54 -14
  496. package/docs/native-sandbox.md +119 -23
  497. package/docs/observability.md +4 -0
  498. package/docs/security-deployment.md +33 -2
  499. package/docs/slack-notifications.md +35 -19
  500. package/docs/tool-secrets.md +42 -10
  501. package/docs/viewer-api.openapi.yml +1 -1
  502. package/help/admin-viewer.md +24 -2
  503. package/help/architecture-agent.md +11 -6
  504. package/help/build-worker-image.md +3 -1
  505. package/help/builder-agent.md +19 -6
  506. package/help/code-review-agents.md +177 -6
  507. package/help/coding-packages.md +156 -6
  508. package/help/cost-attribution.md +9 -5
  509. package/help/creating-agents.md +14 -1
  510. package/help/dependency-cache.md +143 -0
  511. package/help/deploy-gke.md +15 -8
  512. package/help/errors/budget-exhausted.md +187 -0
  513. package/help/errors/budget-group-exhausted.md +5 -1
  514. package/help/errors/coding-stream-quota-exceeded.md +33 -0
  515. package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
  516. package/help/errors/continuation-closed.md +9 -12
  517. package/help/errors/delegation-conflict.md +24 -0
  518. package/help/errors/file-list-truncated.md +45 -0
  519. package/help/errors/full-read-required.md +49 -0
  520. package/help/errors/github-account-not-allowed.md +4 -0
  521. package/help/errors/graph-incomplete.md +43 -0
  522. package/help/errors/graph-limit.md +43 -0
  523. package/help/errors/merge-conflict.md +49 -0
  524. package/help/errors/native-sandbox-gateway-error.md +20 -0
  525. package/help/errors/native-sandbox-launch-abandoned.md +21 -0
  526. package/help/errors/native-sandbox-worker-exited.md +3 -2
  527. package/help/errors/package-not-allowed-pending.md +52 -0
  528. package/help/errors/package-not-allowed.md +51 -0
  529. package/help/errors/package-refusals.md +43 -0
  530. package/help/errors/patch-cursor-malformed.md +31 -0
  531. package/help/errors/run-lost.md +39 -0
  532. package/help/errors/run-transcript-download.md +44 -0
  533. package/help/errors/secret-in-value.md +69 -0
  534. package/help/errors/target-merge.md +40 -0
  535. package/help/fix-merge-conflicts.md +73 -0
  536. package/help/github-app-setup.md +132 -0
  537. package/help/github.md +22 -0
  538. package/help/identity-and-access.md +2 -0
  539. package/help/jira.md +23 -6
  540. package/help/knowledge.md +16 -7
  541. package/help/local-repositories.md +1 -1
  542. package/help/low-power-mode.md +7 -1
  543. package/help/merge-order-check.md +5 -0
  544. package/help/native-capabilities.md +29 -1
  545. package/help/native-sandbox.md +15 -1
  546. package/help/operating-agents.md +5 -0
  547. package/help/package-audit-mode.md +91 -0
  548. package/help/related-pull-requests.md +10 -7
  549. package/help/resume-runs-locally.md +131 -0
  550. package/help/review-fix-rounds.md +33 -1
  551. package/help/sharing-agents.md +59 -0
  552. package/help/slack-notifications.md +19 -5
  553. package/help/status-comments.md +31 -0
  554. package/help/stop-run.md +58 -0
  555. package/help/troubleshooting/budgets.md +28 -0
  556. package/help/troubleshooting/coding-workers.md +78 -7
  557. package/package.json +17 -10
  558. package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
  559. package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
  560. package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
  561. package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
  562. package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
  563. package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
  564. package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
  565. package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
  566. package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
  567. package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
  568. package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
  569. package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
  570. package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
  571. package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
  572. package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
  573. package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
  574. package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
  575. package/prisma/schema.prisma +311 -97
  576. package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
@@ -11,9 +11,18 @@ import { handleHostUserCallback } from "../host-events/github-user-callback.js";
11
11
  import { canonicalUrl, HTTP_LIMITS, HttpBoundaryError, parseBody, readBody } from "./http-limits.js";
12
12
  import { browserHandler } from "../auth/self-hosted/browser.js";
13
13
  import { handleSecretElicitationForm, SECRET_ELICITATION_PATH } from "../tools/secret-elicitation-form.js";
14
+ import { handleRunTranscriptDownload, RUN_TRANSCRIPT_DOWNLOAD_PATH } from "../tools/run-transcript-download.js";
14
15
  import { logger } from "../../core/logger.js";
15
16
  import { VIEWER_API_PREFIX } from "../../viewer/http.js";
16
17
  const httpLog = logger.child({ module: "streamable-http" });
18
+ /**
19
+ * close() waits this long for open requests to finish, then cuts them. A
20
+ * connected MCP client's event stream never ends on its own, so without a
21
+ * limit close() would hold shutdown until the pod is killed. On Kubernetes
22
+ * the load balancer has already moved traffic away by then (preStop), and
23
+ * clients reconnect to another instance.
24
+ */
25
+ export const CLOSE_GRACE_MS = 10_000;
17
26
  export function sendJson(res, status, body, headers = {}) {
18
27
  res
19
28
  .writeHead(status, { "content-type": "application/json", "cache-control": "no-store", ...headers })
@@ -35,7 +44,11 @@ export async function startHttpServer(opts) {
35
44
  ]);
36
45
  const validateHost = hostHeaderValidation([canonical.hostname]);
37
46
  const nodeHandler = toNodeHandler(createMcpHandler(opts.mcp.factory, { responseMode: opts.config.responseMode }));
47
+ // Requests still being answered, so a close that has to cut them can say which they were.
48
+ const open = new Map();
38
49
  const server = createServer({ maxHeaderSize: 16 * 1024, requireHostHeader: false }, (req, res) => {
50
+ open.set(res, { method: req.method ?? "", path: (req.url ?? "").split("?")[0], startedAt: Date.now() });
51
+ res.once("close", () => open.delete(res));
39
52
  void route(req, res).catch((err) => {
40
53
  if (res.headersSent) {
41
54
  res.destroy();
@@ -114,6 +127,17 @@ export async function startHttpServer(opts) {
114
127
  });
115
128
  return;
116
129
  }
130
+ if (url.pathname === RUN_TRANSCRIPT_DOWNLOAD_PATH) {
131
+ // The signed link is the credential (no Authorization header); the
132
+ // token is never logged (open-request tracking keeps the path only).
133
+ await handleRunTranscriptDownload(req.method, url.searchParams.get("t"), res, {
134
+ verify: (token) => opts.mcp.verifyRequestState(token),
135
+ audience: "http",
136
+ db: opts.auth.db,
137
+ blobs: opts.blobs,
138
+ });
139
+ return;
140
+ }
117
141
  if (oauth && (await oauth(req, res, url, body)))
118
142
  return;
119
143
  const webhook = /^\/webhooks\/([^/]+)$/.exec(url.pathname);
@@ -203,7 +227,23 @@ export async function startHttpServer(opts) {
203
227
  port: typeof address === "object" && address ? address.port : opts.config.httpBind.port,
204
228
  close: () => new Promise((resolve, reject) => {
205
229
  opts.viewer?.closeStreams();
206
- server.close((err) => (err ? reject(err) : resolve()));
230
+ const cut = setTimeout(() => {
231
+ const now = Date.now();
232
+ const requests = [...open.values()].map((r) => ({
233
+ method: r.method,
234
+ path: r.path,
235
+ openSeconds: Math.round((now - r.startedAt) / 1000),
236
+ }));
237
+ httpLog.info({ requests }, "HTTP connections still open after the close grace; closing them");
238
+ server.closeAllConnections();
239
+ }, opts.closeGraceMs ?? CLOSE_GRACE_MS);
240
+ server.close((err) => {
241
+ clearTimeout(cut);
242
+ if (err)
243
+ reject(err);
244
+ else
245
+ resolve();
246
+ });
207
247
  server.closeIdleConnections();
208
248
  }),
209
249
  };
@@ -6,9 +6,45 @@
6
6
  * twice, and a restarted server re-finds a running worker by name.
7
7
  */
8
8
  import { type NativeWorkerLimits } from "./docker-isolation.js";
9
- import type { DetachedWorkerLauncher, WorkerHandle } from "./launch.js";
9
+ import type { DetachedWorkerLauncher, WorkerHandle, WorkerLaunchOptions } from "./launch.js";
10
10
  import type { WorkerInput } from "./protocol.js";
11
11
  import { type WarmWorkerLauncher } from "./warm-pool.js";
12
+ /**
13
+ * Bounded, so a noisy worker cannot flood the log. The worker holds no long-lived credentials (only
14
+ * its run's gateway capability), and it redacts the secret values it received (every `secrets.get`
15
+ * result, and the capability) from everything it writes to stderr, its failure line and logger lines
16
+ * included (stderr-redaction.ts), with the console bridge's redactor and its minimum length. The
17
+ * worker is untrusted, so the launcher masks the tail again itself (workerTailFields).
18
+ */
19
+ export declare const WORKER_STDERR_TAIL_CHARS = 2000;
20
+ /** How long a failed worker's diagnostic (its log read and its secret values read) may take in all. */
21
+ export declare const WORKER_TAIL_TIMEOUT_MS = 10000;
22
+ /**
23
+ * Log fields for a failed worker's output. `stderrTailOmitted` says why there is no tail although
24
+ * there may be output: its secret values could not be read (so it could not be redacted), or its
25
+ * log could not be read (Kubernetes).
26
+ */
27
+ export interface WorkerTailFields {
28
+ stderrTail?: string;
29
+ stderrTailOmitted?: "secrets_unavailable" | "log_read_failed";
30
+ }
31
+ /** `promise`, or a rejection once `ms` pass first. */
32
+ export declare function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T>;
33
+ /**
34
+ * A failed worker's output tail as log fields: `stderrTail`, masked by exact value through the
35
+ * shared redactor against every secret value delivered to that worker (its gateway capability,
36
+ * from its input, and each value its tools may read, from `secretValues`, with their JSON-escaped
37
+ * forms). When those values are not given, cannot be read, or are not read within `timeoutMs`, no
38
+ * tail: `stderrTailOmitted: "secrets_unavailable"` (fail closed). No fields when the output is empty.
39
+ *
40
+ * `cut`: `output` is a slice of a longer output (a log read bounded by lines or bytes), so it may
41
+ * begin (`start`) or end (`end`) inside a value, which no exact match finds; as many characters as
42
+ * the longest value less one are masked at each cut end too.
43
+ */
44
+ export declare function workerTailFields(output: string, input: WorkerInput, secretValues: (() => Promise<readonly string[]>) | undefined, cut?: {
45
+ start?: boolean;
46
+ end?: boolean;
47
+ }, timeoutMs?: number): Promise<WorkerTailFields>;
12
48
  export interface DockerResult {
13
49
  code: number | null;
14
50
  stdout: string;
@@ -44,7 +80,7 @@ export declare class DockerNativeWorkerLauncher implements DetachedWorkerLaunche
44
80
  private must;
45
81
  /** The image must be present and pinned; a digest is pulled once, a local id must already exist. */
46
82
  private ensureImage;
47
- launch(input: WorkerInput): Promise<WorkerHandle>;
83
+ launch(input: WorkerInput, launchOptions?: WorkerLaunchOptions): Promise<WorkerHandle>;
48
84
  /** Waits for (and reports) the worker's exit; usable after a server restart. */
49
85
  handle(runId: string): WorkerHandle;
50
86
  private handleByName;
@@ -8,10 +8,65 @@
8
8
  import { spawn } from "node:child_process";
9
9
  import { createHash } from "node:crypto";
10
10
  import { logger } from "../core/logger.js";
11
+ import { maskSpans, mergeSpans, secretSpans, withEscapedForms } from "../core/secret-spans.js";
11
12
  import { buildGatewayConnectArgs, buildGatewayDisconnectArgs, buildNativeNetworkCreateArgs, buildNativeWarmNetworkCreateArgs, buildNativeWarmWorkerRunArgs, buildNativeWorkerRunArgs, gatewayConnectArgs, gatewayDisconnectArgs, nativeIsolationNames, nativeWarmIsolationNames, NATIVE_WARM_LABEL_FILTER, NATIVE_WARM_TOKEN_LABEL, NATIVE_WORKER_LABEL_FILTER, } from "./docker-isolation.js";
12
13
  import { warmDeliveryCommand } from "./warm-delivery.js";
13
14
  import { NATIVE_SANDBOX_WARM_DELIVERY_FAILED } from "./warm-pool.js";
14
15
  const launcherLog = logger.child({ module: "native-docker-launcher" });
16
+ /**
17
+ * Bounded, so a noisy worker cannot flood the log. The worker holds no long-lived credentials (only
18
+ * its run's gateway capability), and it redacts the secret values it received (every `secrets.get`
19
+ * result, and the capability) from everything it writes to stderr, its failure line and logger lines
20
+ * included (stderr-redaction.ts), with the console bridge's redactor and its minimum length. The
21
+ * worker is untrusted, so the launcher masks the tail again itself (workerTailFields).
22
+ */
23
+ export const WORKER_STDERR_TAIL_CHARS = 2000;
24
+ /** How long a failed worker's diagnostic (its log read and its secret values read) may take in all. */
25
+ export const WORKER_TAIL_TIMEOUT_MS = 10_000;
26
+ /** `promise`, or a rejection once `ms` pass first. */
27
+ export function withTimeout(promise, ms) {
28
+ let timer;
29
+ const timeout = new Promise((_, reject) => {
30
+ timer = setTimeout(() => reject(new Error("worker_diagnostic_timeout")), Math.max(0, ms));
31
+ });
32
+ return Promise.race([promise, timeout]).finally(() => clearTimeout(timer));
33
+ }
34
+ /**
35
+ * A failed worker's output tail as log fields: `stderrTail`, masked by exact value through the
36
+ * shared redactor against every secret value delivered to that worker (its gateway capability,
37
+ * from its input, and each value its tools may read, from `secretValues`, with their JSON-escaped
38
+ * forms). When those values are not given, cannot be read, or are not read within `timeoutMs`, no
39
+ * tail: `stderrTailOmitted: "secrets_unavailable"` (fail closed). No fields when the output is empty.
40
+ *
41
+ * `cut`: `output` is a slice of a longer output (a log read bounded by lines or bytes), so it may
42
+ * begin (`start`) or end (`end`) inside a value, which no exact match finds; as many characters as
43
+ * the longest value less one are masked at each cut end too.
44
+ */
45
+ export async function workerTailFields(output, input, secretValues, cut = {}, timeoutMs = WORKER_TAIL_TIMEOUT_MS) {
46
+ if (!output.trim())
47
+ return {};
48
+ let delivered;
49
+ try {
50
+ if (!secretValues)
51
+ return { stderrTailOmitted: "secrets_unavailable" };
52
+ delivered = await withTimeout(secretValues(), timeoutMs);
53
+ }
54
+ catch {
55
+ return { stderrTailOmitted: "secrets_unavailable" };
56
+ }
57
+ const values = withEscapedForms([...(input.gateway ? [input.gateway.capability] : []), ...delivered]);
58
+ const spans = secretSpans(output, values);
59
+ const longest = Math.max(0, ...values.map((value) => value.length));
60
+ if (longest > 1) {
61
+ if (cut.start)
62
+ spans.push([0, Math.min(output.length, longest - 1)]);
63
+ if (cut.end)
64
+ spans.push([Math.max(0, output.length - (longest - 1)), output.length]);
65
+ }
66
+ // Masked whole, then cut: a cut can then split only a marker or plain text, never a value.
67
+ const stderrTail = maskSpans(output, mergeSpans(spans)).trim().slice(-WORKER_STDERR_TAIL_CHARS);
68
+ return stderrTail ? { stderrTail } : {};
69
+ }
15
70
  export function processDockerCli(binary = "docker") {
16
71
  return {
17
72
  run(args, options = {}) {
@@ -20,8 +75,12 @@ export function processDockerCli(binary = "docker") {
20
75
  let stdout = "";
21
76
  let stderr = "";
22
77
  const timer = options.timeoutMs ? setTimeout(() => child.kill("SIGKILL"), options.timeoutMs) : undefined;
23
- child.stdout.on("data", (chunk) => (stdout += chunk.toString()));
24
- child.stderr.on("data", (chunk) => (stderr += chunk.toString()));
78
+ // One decoder per stream, so a multi-byte character split across chunks still decodes (and a
79
+ // secret holding it still matches the redactor exactly).
80
+ child.stdout.setEncoding("utf8");
81
+ child.stderr.setEncoding("utf8");
82
+ child.stdout.on("data", (chunk) => (stdout += chunk));
83
+ child.stderr.on("data", (chunk) => (stderr += chunk));
25
84
  child.on("error", (err) => resolve({ code: null, stdout, stderr: err.message }));
26
85
  child.on("close", (code) => {
27
86
  if (timer)
@@ -55,7 +114,7 @@ export class DockerNativeWorkerLauncher {
55
114
  return;
56
115
  await this.must(["image", "pull", "--quiet", this.options.image], "pull the worker image");
57
116
  }
58
- async launch(input) {
117
+ async launch(input, launchOptions = {}) {
59
118
  const runId = input.runId;
60
119
  const names = nativeIsolationNames(runId);
61
120
  const existing = await this.inspect(runId);
@@ -66,9 +125,10 @@ export class DockerNativeWorkerLauncher {
66
125
  const args = buildNativeWorkerRunArgs({ runId, image: this.options.image, limits: this.options.limits });
67
126
  // Attached so the input (capability included) goes in on stdin; the exit is read with
68
127
  // `docker wait`, which a restarted server can call again.
69
- void this.docker.run(args, { input: `${JSON.stringify(input)}\n` }).then((result) => {
128
+ void this.docker.run(args, { input: `${JSON.stringify(input)}\n` }).then(async (result) => {
70
129
  if (result.code !== 0 && result.code !== null && !/Conflict/.test(result.stderr)) {
71
- launcherLog.warn({ container: names.worker, code: result.code }, "native worker exited non-zero");
130
+ const tail = await workerTailFields(result.stderr, input, launchOptions.secretValues);
131
+ launcherLog.warn({ container: names.worker, code: result.code, ...tail }, "native worker exited non-zero");
72
132
  }
73
133
  });
74
134
  }
@@ -10,9 +10,11 @@
10
10
  * session budget before the provider is called and settles at the provider's
11
11
  * reported usage; the worker's own usage numbers are never read.
12
12
  */
13
- import { type NativeRunProviders, type RunnerDb } from "../core/runner.js";
14
- import type { LlmStreamEvent } from "../providers/llm/types.js";
15
- import { PrismaGatewayLedger } from "./ledger.js";
13
+ import { createNativeRunTools, durableDelegate, type NativeRunFinishContext, type NativeRunProviders, type RunnerDb, type SandboxSessionSnapshot } from "../core/runner.js";
14
+ import { ReviewReadLedger } from "../core/review-reads.js";
15
+ import type { LlmProvider, LlmStreamEvent } from "../providers/llm/types.js";
16
+ import { PrismaGatewayLedger, type GatewaySessionRecord } from "./ledger.js";
17
+ import { type GatewayParams } from "./protocol.js";
16
18
  /** Output tokens reserved for a model call that names no maxTokens (as the coding proxy does). */
17
19
  export declare const GATEWAY_DEFAULT_RESERVE_OUTPUT_TOKENS = 4096;
18
20
  /** The most output tokens one call may reserve for. */
@@ -37,3 +39,39 @@ export type GatewayResponse = {
37
39
  };
38
40
  /** Serves one gateway request. Never throws: every failure is a response. */
39
41
  export declare function serveGatewayRequest(deps: GatewayServerDeps, authorization: string | undefined, body: unknown): Promise<GatewayResponse>;
42
+ /**
43
+ * Every secret value the rebuilt run can read (each user tool's readable or brokered values), and
44
+ * the request's own capability: what a cause code is checked against before it leaves the gateway.
45
+ */
46
+ export declare function runSecretValues(ctx: Pick<RebuiltRun, "snapshot" | "tools">, capability: string): () => Promise<string[]>;
47
+ /**
48
+ * A failure as its response. Only a checked cause code leaves the gateway (workerGatewayError),
49
+ * never the rest of an unexpected error's message; the server's own log line is redacted by the
50
+ * same values.
51
+ */
52
+ export declare function failureResponse(err: unknown, secretValues: (() => Promise<string[]>) | undefined): Promise<GatewayResponse>;
53
+ /** A model stream whose failure reaches the worker as the same checked error a JSON response carries. */
54
+ export declare function checkedEvents(events: AsyncIterable<LlmStreamEvent>, secretValues: (() => Promise<string[]>) | undefined): AsyncIterable<LlmStreamEvent>;
55
+ interface RebuiltRun {
56
+ session: GatewaySessionRecord;
57
+ snapshot: SandboxSessionSnapshot;
58
+ llm: LlmProvider;
59
+ tools: ReturnType<typeof createNativeRunTools>;
60
+ /** The run's review reads, restored from the session; saved back after each read (see builtin). */
61
+ reviewReads: ReviewReadLedger;
62
+ finishContext: NativeRunFinishContext;
63
+ delegation: Omit<Parameters<typeof durableDelegate>[0], "ledger" | "sessionId">;
64
+ }
65
+ /** Exported for its unit test; the HTTP handler is its only production caller. */
66
+ export declare function streamModel(ctx: RebuiltRun, ledger: PrismaGatewayLedger, callId: string, params: GatewayParams<"llm.stream">): AsyncIterable<LlmStreamEvent>;
67
+ /**
68
+ * Logged (at warn) in place of a user tool's console line when that tool's redaction list cannot
69
+ * be read: without the complete list the line cannot be shown to be free of its secret values, so
70
+ * none of it is logged. The tool's call still succeeds, as a console write does in-process.
71
+ */
72
+ export declare const CONSOLE_WITHHELD_MESSAGE = "sandbox tool console line withheld: the tool's secret values could not be read";
73
+ /** Serves one privileged bridge call for a worker (exported for tests). */
74
+ export declare function hostCall(ctx: RebuiltRun, ledger: PrismaGatewayLedger, callId: string, params: GatewayParams<"host.call">): Promise<unknown>;
75
+ /** The worker's terminal call: the run's one terminal write (masked by finishNativeRun), then the session ends. */
76
+ export declare function finish(ctx: RebuiltRun, ledger: PrismaGatewayLedger, callId: string, params: GatewayParams<"finish">): Promise<null>;
77
+ export {};
@@ -10,14 +10,15 @@
10
10
  * session budget before the provider is called and settles at the provider's
11
11
  * reported usage; the worker's own usage numbers are never read.
12
12
  */
13
- import { logger } from "../core/logger.js";
14
- import { createNativeRunTools, durableDelegate, failNativeRun, finishNativeRun, nativeRunIntegrations, recordNativeRunProgress, runDrivability, sandboxCapabilityHash, } from "../core/runner.js";
13
+ import { createNativeRunTools, durableDelegate, failNativeRun, finishNativeRun, nativeRunIntegrations, recordNativeRunProgress, runDrivability, sandboxCapabilityHash, userToolSecretValues, } from "../core/runner.js";
14
+ import { ReviewReadLedger } from "../core/review-reads.js";
15
15
  import { DELEGATE_TOOL_PREFIX } from "../core/tool-names.js";
16
+ import { relayedOutputTokens } from "../providers/coding-proxy/interrupted.js";
16
17
  import { RoutingLlmProvider } from "../providers/llm/routing.js";
17
18
  import { isPrivilegedBridgeName } from "../sandbox/host-functions.js";
19
+ import { forWorker, gatewayLog } from "./gateway.js";
18
20
  import { PrismaGatewayLedger } from "./ledger.js";
19
21
  import { GatewayError, GatewayRequestSchema, parseParams, } from "./protocol.js";
20
- const serverLog = logger.child({ module: "native-gateway-server" });
21
22
  /** Output tokens reserved for a model call that names no maxTokens (as the coding proxy does). */
22
23
  export const GATEWAY_DEFAULT_RESERVE_OUTPUT_TOKENS = 4_096;
23
24
  /** The most output tokens one call may reserve for. */
@@ -29,10 +30,10 @@ const ok = (result) => ({
29
30
  status: 200,
30
31
  body: { ok: true, result: result ?? null },
31
32
  });
32
- const fail = (status, code, message) => ({
33
+ const fail = (status, code, message, causeCode) => ({
33
34
  kind: "json",
34
35
  status,
35
- body: { ok: false, error: { code, message } },
36
+ body: { ok: false, error: { code, message, ...(causeCode ? { causeCode } : {}) } },
36
37
  });
37
38
  const STATUS_FOR = {
38
39
  invalid_request: 400,
@@ -46,22 +47,52 @@ const STATUS_FOR = {
46
47
  };
47
48
  /** Serves one gateway request. Never throws: every failure is a response. */
48
49
  export async function serveGatewayRequest(deps, authorization, body) {
50
+ // The capability once parsed, then every secret value of the rebuilt run: what a cause code and
51
+ // the log line are checked against. Unset (no bearer), no cause code is sent.
52
+ const scope = {};
49
53
  try {
50
- return await handle(deps, authorization, body);
54
+ return await handle(deps, authorization, body, scope);
51
55
  }
52
56
  catch (err) {
53
- if (err instanceof GatewayError)
54
- return fail(STATUS_FOR[err.code] ?? 500, err.code, err.message);
55
- serverLog.error({ err }, "native gateway request failed");
56
- return fail(500, "internal", "The gateway could not serve this call.");
57
+ return failureResponse(err, scope.secretValues);
57
58
  }
58
59
  }
59
- async function handle(deps, authorization, body) {
60
+ /**
61
+ * Every secret value the rebuilt run can read (each user tool's readable or brokered values), and
62
+ * the request's own capability: what a cause code is checked against before it leaves the gateway.
63
+ */
64
+ export function runSecretValues(ctx, capability) {
65
+ return async () => [
66
+ capability,
67
+ ...(await userToolSecretValues(ctx.tools, Object.keys(ctx.snapshot.input.userTools))),
68
+ ];
69
+ }
70
+ /**
71
+ * A failure as its response. Only a checked cause code leaves the gateway (workerGatewayError),
72
+ * never the rest of an unexpected error's message; the server's own log line is redacted by the
73
+ * same values.
74
+ */
75
+ export async function failureResponse(err, secretValues) {
76
+ const sent = await forWorker(err, secretValues, "native gateway request failed");
77
+ return fail(STATUS_FOR[sent.code] ?? 500, sent.code, sent.message, sent.causeCode);
78
+ }
79
+ /** A model stream whose failure reaches the worker as the same checked error a JSON response carries. */
80
+ export async function* checkedEvents(events, secretValues) {
81
+ try {
82
+ yield* events;
83
+ }
84
+ catch (err) {
85
+ throw await forWorker(err, secretValues, "native gateway model stream failed");
86
+ }
87
+ }
88
+ async function handle(deps, authorization, body, scope) {
60
89
  const { db } = deps;
61
90
  const ledger = new PrismaGatewayLedger(db);
62
91
  const token = /^Bearer (\S+)$/.exec(authorization ?? "")?.[1];
63
92
  if (!token)
64
93
  return fail(401, "unauthorized", "A gateway capability is required.");
94
+ // Until the run's tools are rebuilt, the capability is the secret value an error is checked against.
95
+ scope.secretValues = async () => [token];
65
96
  const session = await ledger.findSessionByCapabilityHash(sandboxCapabilityHash(token));
66
97
  if (!session)
67
98
  return fail(401, "unauthorized", "Unknown gateway capability.");
@@ -90,19 +121,20 @@ async function handle(deps, authorization, body) {
90
121
  throw new GatewayError("run_not_drivable", "This run is no longer running.");
91
122
  }
92
123
  const ctx = await rebuild(deps, session);
124
+ scope.secretValues = runSecretValues(ctx, token);
93
125
  switch (request.method) {
94
126
  case "llm.stream":
95
127
  return {
96
128
  kind: "stream",
97
129
  status: 200,
98
- events: streamModel(ctx, ledger, request.callId, params),
130
+ events: checkedEvents(streamModel(ctx, ledger, request.callId, params), scope.secretValues),
99
131
  };
100
132
  case "llm.countTokens": {
101
133
  const p = params;
102
134
  return ok(await ctx.llm.countTokens(p.model, p.messages, p.tools));
103
135
  }
104
136
  case "builtin.call":
105
- return ok(await builtin(ctx, ledger, request.callId, params, deps.pollWindowMs));
137
+ return ok(await builtin(ctx, ledger, request.callId, params, deps.pollWindowMs, scope.secretValues));
106
138
  case "host.call":
107
139
  return ok(await hostCall(ctx, ledger, request.callId, params));
108
140
  case "progress": {
@@ -130,10 +162,12 @@ async function rebuild(deps, session) {
130
162
  const llm = loaded.pricing && providers.llm instanceof RoutingLlmProvider
131
163
  ? providers.llm.forRun(loaded.pricing.entry)
132
164
  : providers.llm;
165
+ const reviewReads = ReviewReadLedger.fromJSON(session.reviewReads);
133
166
  return {
134
167
  session,
135
168
  snapshot,
136
169
  llm,
170
+ reviewReads,
137
171
  tools: createNativeRunTools({
138
172
  runId: session.runId,
139
173
  existingRun,
@@ -143,6 +177,7 @@ async function rebuild(deps, session) {
143
177
  reviewHosts,
144
178
  repoAccess,
145
179
  issueTrackers,
180
+ reviewReads,
146
181
  }),
147
182
  finishContext: { runId: session.runId, db, providers, reviewHosts, repoAccess, issueTrackers },
148
183
  delegation: {
@@ -156,7 +191,8 @@ async function rebuild(deps, session) {
156
191
  },
157
192
  };
158
193
  }
159
- async function* streamModel(ctx, ledger, callId, params) {
194
+ /** Exported for its unit test; the HTTP handler is its only production caller. */
195
+ export async function* streamModel(ctx, ledger, callId, params) {
160
196
  const req = params.request;
161
197
  if (req.model !== ctx.snapshot.input.agent.model)
162
198
  throw new GatewayError("not_allowed", "A run may only call its own model.");
@@ -173,12 +209,22 @@ async function* streamModel(ctx, ledger, callId, params) {
173
209
  }
174
210
  let settled = false;
175
211
  let sawEvent = false;
212
+ // Set once the provider's response starts: it may bill hidden thinking or reasoning before any event.
213
+ let responseStarted = false;
214
+ // Generated output seen so far (text and tool calls), for an estimate if the stream is cut.
176
215
  let streamedText = "";
177
216
  try {
178
- for await (const event of ctx.llm.stream(req)) {
217
+ const hooks = {
218
+ onResponseStarted: () => {
219
+ responseStarted = true;
220
+ },
221
+ };
222
+ for await (const event of ctx.llm.stream(req, undefined, hooks)) {
179
223
  sawEvent = true;
180
224
  if (event.type === "text")
181
225
  streamedText += event.delta;
226
+ if (event.type === "tool_call")
227
+ streamedText += event.name + event.argsJson;
182
228
  if (event.type === "done") {
183
229
  settled = true;
184
230
  await ledger.complete(ctx.session.id, callId, {
@@ -194,9 +240,29 @@ async function* streamModel(ctx, ledger, callId, params) {
194
240
  }
195
241
  catch (err) {
196
242
  if (!settled) {
197
- // Refused before anything streamed: the provider billed nothing. Mid-stream: unknown, keep the hold.
198
- if (sawEvent)
199
- await ledger.markUncertain(ctx.session.id, callId);
243
+ // Failed before the response started: the provider billed nothing. Once started: settle at an estimate.
244
+ if (sawEvent || responseStarted) {
245
+ // Bill the input and the output seen so far, never more than the hold. With no output seen
246
+ // (cut while thinking or reasoning), the run's median completed call, or none before the
247
+ // first one: as the coding proxy does. Estimating must never mask the stream error: on any
248
+ // failure, keep the full hold and rethrow the original.
249
+ try {
250
+ const output = streamedText
251
+ ? await streamedOutputTokens(ctx.llm, req.model, streamedText)
252
+ : ((await ledger.medianOutputTokens(ctx.session.id)) ?? 0);
253
+ const costUsd = Math.min(reservationUsd, ctx.llm.priceUsd(req.model, { inputTokens, outputTokens: output }));
254
+ await ledger.markUncertain(ctx.session.id, callId, {
255
+ inputTokens,
256
+ outputTokens: output,
257
+ cachedInputTokens: 0,
258
+ cacheWriteTokens: 0,
259
+ costUsd,
260
+ });
261
+ }
262
+ catch {
263
+ await ledger.markUncertain(ctx.session.id, callId).catch(() => undefined);
264
+ }
265
+ }
200
266
  else
201
267
  await ledger.release(ctx.session.id, callId);
202
268
  settled = true;
@@ -206,9 +272,7 @@ async function* streamModel(ctx, ledger, callId, params) {
206
272
  finally {
207
273
  if (!settled) {
208
274
  // The worker stopped reading (its own budget cutoff) before usage arrived: bill an estimate.
209
- const output = streamedText
210
- ? await ctx.llm.countTokens(req.model, [{ role: "assistant", content: streamedText }]).catch(() => 0)
211
- : 0;
275
+ const output = await streamedOutputTokens(ctx.llm, req.model, streamedText);
212
276
  await ledger.complete(ctx.session.id, callId, {
213
277
  inputTokens,
214
278
  outputTokens: output,
@@ -219,26 +283,58 @@ async function* streamModel(ctx, ledger, callId, params) {
219
283
  }
220
284
  }
221
285
  }
222
- async function builtin(ctx, ledger, callId, params, pollWindowMs) {
286
+ /** Output tokens of a cut stream's output: counted, else the deliberately high bytes / 3 estimate. */
287
+ async function streamedOutputTokens(llm, model, streamed) {
288
+ if (!streamed)
289
+ return 0;
290
+ return llm
291
+ .countTokens(model, [{ role: "assistant", content: streamed }])
292
+ .catch(() => relayedOutputTokens(Buffer.byteLength(streamed)));
293
+ }
294
+ /** The review tools that record reads (repo_publish_review checks them). */
295
+ const REVIEW_READ_TOOLS = new Set(["repo_pr_read", "repo_read_file"]);
296
+ async function builtin(ctx, ledger, callId, params, pollWindowMs, secretValues) {
223
297
  if (!ctx.snapshot.input.builtinTools.includes(params.name)) {
224
298
  throw new GatewayError("not_allowed", `"${params.name}" is not a built-in tool of this run.`);
225
299
  }
226
300
  if (params.name.startsWith(DELEGATE_TOOL_PREFIX)) {
227
- const outcome = await durableDelegate({ ...ctx.delegation, pollWindowMs, ledger, sessionId: ctx.session.id }, callId, params.name, params.argsJson);
301
+ const outcome = await durableDelegate({ ...ctx.delegation, pollWindowMs, ledger, sessionId: ctx.session.id, secretValues }, callId, params.name, params.argsJson);
228
302
  return "pending" in outcome ? { pending: true } : outcome.result;
229
303
  }
230
304
  const handler = ctx.tools.builtinHandler(params.name);
231
305
  if (!handler)
232
306
  throw new GatewayError("not_allowed", `"${params.name}" is not a built-in tool of this run.`);
233
- return replayable(ledger, ctx.session.id, callId, "builtin.call", () => handler(params.argsJson));
307
+ return replayable(ledger, ctx.session.id, callId, "builtin.call", async () => {
308
+ const result = await handler(params.argsJson);
309
+ // Each request rebuilds the tools, so what a read recorded is saved for the publish request's check.
310
+ if (REVIEW_READ_TOOLS.has(params.name))
311
+ await ledger.mergeReviewReads(ctx.session.id, ctx.reviewReads);
312
+ return result;
313
+ });
234
314
  }
235
- async function hostCall(ctx, ledger, callId, params) {
315
+ /**
316
+ * Logged (at warn) in place of a user tool's console line when that tool's redaction list cannot
317
+ * be read: without the complete list the line cannot be shown to be free of its secret values, so
318
+ * none of it is logged. The tool's call still succeeds, as a console write does in-process.
319
+ */
320
+ export const CONSOLE_WITHHELD_MESSAGE = "sandbox tool console line withheld: the tool's secret values could not be read";
321
+ /** Serves one privileged bridge call for a worker (exported for tests). */
322
+ export async function hostCall(ctx, ledger, callId, params) {
236
323
  if (!isPrivilegedBridgeName(params.bridge))
237
324
  throw new GatewayError("not_allowed", "unknown bridge");
238
325
  if (!ctx.snapshot.input.userTools[params.tool]) {
239
326
  throw new GatewayError("not_allowed", `"${params.tool}" is not a user tool of this run.`);
240
327
  }
241
- const redact = params.bridge === "__bridge_console" ? await ctx.tools.readableSecretValues(params.tool) : undefined;
328
+ let redact;
329
+ if (params.bridge === "__bridge_console") {
330
+ // Fail closed: a console line is redacted by the tool's complete list or not logged at all.
331
+ const values = await ctx.tools.readableSecretValues(params.tool).then((v) => v, () => undefined);
332
+ if (!values) {
333
+ gatewayLog.warn({ tool: params.tool }, CONSOLE_WITHHELD_MESSAGE);
334
+ return null;
335
+ }
336
+ redact = values;
337
+ }
242
338
  const host = ctx.tools.privilegedHostFor(params.tool, AbortSignal.timeout(30_000), redact);
243
339
  if (!host)
244
340
  throw new GatewayError("not_allowed", `"${params.tool}" is not a user tool of this run.`);
@@ -284,7 +380,8 @@ async function replayable(ledger, sessionId, callId, method, run) {
284
380
  throw err;
285
381
  }
286
382
  }
287
- async function finish(ctx, ledger, callId, params) {
383
+ /** The worker's terminal call: the run's one terminal write (masked by finishNativeRun), then the session ends. */
384
+ export async function finish(ctx, ledger, callId, params) {
288
385
  const claimed = await ledger.claim(ctx.session.id, callId, "finish");
289
386
  if (claimed.outcome !== "claimed")
290
387
  return null;
@@ -12,8 +12,29 @@
12
12
  */
13
13
  import type { EngineResult, EngineRunContext } from "../providers/engine/types.js";
14
14
  import type { LlmStreamEvent } from "../providers/llm/types.js";
15
+ import pino from "pino";
15
16
  import { type PrivilegedHost } from "../sandbox/host-functions.js";
16
- import { type WorkerInput } from "./protocol.js";
17
+ import { logger } from "../core/logger.js";
18
+ import { GatewayError, type WorkerInput } from "./protocol.js";
19
+ /**
20
+ * The gateways' log. Both (in-process and HTTP) log an unexpected error here, as `native gateway
21
+ * request failed` (or `native gateway model stream failed`). Exported so tests can watch it.
22
+ */
23
+ export declare const gatewayLog: pino.Logger<never, boolean>;
24
+ /**
25
+ * Logs an unexpected error for the operator, redacted by exact value. A successfully read list is
26
+ * complete (its reader rejects when any secret's read fails), so an empty one means the run has no
27
+ * secret values and the message is logged as is. Fail closed: a thrown value that is not an Error
28
+ * (a string, an object: its text cannot be redacted reliably), or no list (unavailable or
29
+ * unreadable), logs only the error's name and declared code, never its message, stack or content.
30
+ */
31
+ export declare function logUnexpectedError(log: Pick<typeof logger, "error">, err: unknown, values: readonly string[] | undefined, logMessage: string, fields?: Record<string, unknown>): void;
32
+ /**
33
+ * The one way either gateway turns a failure into what the worker sees: an unexpected error is
34
+ * logged for the operator (redacted by the run's secret values) and becomes the checked
35
+ * GatewayError (workerGatewayError); the values are read once and serve both.
36
+ */
37
+ export declare function forWorker(err: unknown, secretValues: (() => Promise<Iterable<string>>) | undefined, logMessage: string): Promise<GatewayError>;
17
38
  /** The trusted gateway as a transport sees it: untrusted requests in, results or GatewayErrors out. */
18
39
  export interface NativeGateway {
19
40
  call(request: unknown): Promise<unknown>;
@@ -37,6 +58,11 @@ export interface SandboxedEngineOptions {
37
58
  ctx: Pick<EngineRunContext, "providers" | "onText" | "onProgress">;
38
59
  builtinHandler: (name: string) => ((argsJson: string) => Promise<string>) | undefined;
39
60
  privilegedHostFor: (tool: string, signal: AbortSignal) => PrivilegedHost | undefined;
61
+ /**
62
+ * Every secret value the user tool `tool` may read. A failure's cause code that overlaps any of
63
+ * the run's values is not sent to the worker; without this, no cause code is sent.
64
+ */
65
+ readableSecretValues?: (tool: string) => Promise<string[]>;
40
66
  drivability: () => Promise<RunDrivability>;
41
67
  launcher: WorkerLauncher;
42
68
  }