@wardby/cli 0.6.0 → 0.8.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 (740) hide show
  1. package/.env.example +5 -5
  2. package/README.md +6 -1
  3. package/deploy/local/docker-compose.quickstart-coding.yml +19 -0
  4. package/dist/claude-coding-worker/driver.d.ts +33 -3
  5. package/dist/claude-coding-worker/driver.js +151 -21
  6. package/dist/claude-coding-worker/main.js +38 -6
  7. package/dist/claude-coding-worker/sdk.js +29 -2
  8. package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
  9. package/dist/claude-coding-worker/tool-socket.js +111 -0
  10. package/dist/claude-coding-worker/transcript.d.ts +18 -0
  11. package/dist/claude-coding-worker/transcript.js +77 -0
  12. package/dist/claude-plugin/command.d.ts +61 -0
  13. package/dist/claude-plugin/command.js +376 -0
  14. package/dist/cli-help.d.ts +1 -1
  15. package/dist/cli-help.js +3 -1
  16. package/dist/cli.js +71 -13
  17. package/dist/coding/code-host.d.ts +16 -0
  18. package/dist/coding/code-host.js +60 -0
  19. package/dist/coding/continuation-wording.d.ts +35 -0
  20. package/dist/coding/continuation-wording.js +73 -0
  21. package/dist/coding/linked-issue-note.d.ts +23 -0
  22. package/dist/coding/linked-issue-note.js +47 -0
  23. package/dist/coding/mcp-token.d.ts +12 -0
  24. package/dist/coding/mcp-token.js +26 -0
  25. package/dist/coding/merge-wording.d.ts +28 -0
  26. package/dist/coding/merge-wording.js +78 -0
  27. package/dist/coding/pr-description-note.d.ts +9 -0
  28. package/dist/coding/pr-description-note.js +32 -0
  29. package/dist/coding/profile.d.ts +46 -126
  30. package/dist/coding/profile.js +45 -4
  31. package/dist/coding/protected-path-wording.d.ts +8 -0
  32. package/dist/coding/protected-path-wording.js +1 -1
  33. package/dist/coding/protocol.d.ts +264 -346
  34. package/dist/coding/protocol.js +237 -12
  35. package/dist/coding/redact.d.ts +3 -0
  36. package/dist/coding/redact.js +17 -0
  37. package/dist/coding/registry/allowlist.d.ts +12 -0
  38. package/dist/coding/registry/allowlist.js +14 -1
  39. package/dist/coding/registry/audit-mode.d.ts +153 -0
  40. package/dist/coding/registry/audit-mode.js +304 -0
  41. package/dist/coding/registry/lockfile-shared.d.ts +36 -0
  42. package/dist/coding/registry/lockfile-shared.js +128 -0
  43. package/dist/coding/registry/lockfiles.js +1 -1
  44. package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
  45. package/dist/coding/registry/npm-lockfile-formats.js +41 -0
  46. package/dist/coding/registry/npm-lockfile.d.ts +8 -4
  47. package/dist/coding/registry/npm-lockfile.js +4 -6
  48. package/dist/coding/registry/npm.js +78 -8
  49. package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
  50. package/dist/coding/registry/pnpm-lockfile.js +189 -0
  51. package/dist/coding/registry/pypi-plan.d.ts +50 -0
  52. package/dist/coding/registry/pypi-plan.js +406 -0
  53. package/dist/coding/registry/pypi-requirements.d.ts +58 -0
  54. package/dist/coding/registry/pypi-requirements.js +155 -0
  55. package/dist/coding/registry/pypi.d.ts +3 -27
  56. package/dist/coding/registry/pypi.js +40 -154
  57. package/dist/coding/registry/refusal-hints.d.ts +20 -0
  58. package/dist/coding/registry/refusal-hints.js +61 -0
  59. package/dist/coding/registry/refusal-wording.d.ts +11 -0
  60. package/dist/coding/registry/refusal-wording.js +56 -0
  61. package/dist/coding/registry/report.d.ts +70 -8
  62. package/dist/coding/registry/report.js +112 -5
  63. package/dist/coding/registry/types.d.ts +58 -8
  64. package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
  65. package/dist/coding/registry/yarn-lockfile.js +367 -0
  66. package/dist/coding/services/catalog.d.ts +37 -351
  67. package/dist/coding/transcript/claude-code.d.ts +13 -0
  68. package/dist/coding/transcript/claude-code.js +273 -0
  69. package/dist/coding/transcript/download-protocol.d.ts +30 -0
  70. package/dist/coding/transcript/download-protocol.js +18 -0
  71. package/dist/coding/transcript/format.d.ts +20 -0
  72. package/dist/coding/transcript/format.js +32 -0
  73. package/dist/coding/transcript/recorder.d.ts +52 -0
  74. package/dist/coding/transcript/recorder.js +225 -0
  75. package/dist/coding/transcript/resume/checkout.d.ts +31 -0
  76. package/dist/coding/transcript/resume/checkout.js +203 -0
  77. package/dist/coding/transcript/resume/command.d.ts +17 -0
  78. package/dist/coding/transcript/resume/command.js +176 -0
  79. package/dist/coding/transcript/resume/download.d.ts +20 -0
  80. package/dist/coding/transcript/resume/download.js +153 -0
  81. package/dist/coding/transcript/resume/launch.d.ts +38 -0
  82. package/dist/coding/transcript/resume/launch.js +128 -0
  83. package/dist/coding/transcript/resume/session-file.d.ts +13 -0
  84. package/dist/coding/transcript/resume/session-file.js +79 -0
  85. package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
  86. package/dist/coding/transcript/resume/stand-in.js +49 -0
  87. package/dist/coding-worker/artifact.d.ts +8 -3
  88. package/dist/coding-worker/artifact.js +3 -1
  89. package/dist/coding-worker/debug-trace.d.ts +9 -6
  90. package/dist/coding-worker/debug-trace.js +16 -19
  91. package/dist/coding-worker/dependency-cache.d.mts +229 -0
  92. package/dist/coding-worker/dependency-cache.mjs +2123 -0
  93. package/dist/coding-worker/driver.d.ts +4 -3
  94. package/dist/coding-worker/driver.js +124 -39
  95. package/dist/coding-worker/errors.d.ts +1 -0
  96. package/dist/coding-worker/errors.js +32 -0
  97. package/dist/coding-worker/main.js +5 -1
  98. package/dist/coding-worker/mcp-config.d.ts +27 -0
  99. package/dist/coding-worker/mcp-config.js +32 -0
  100. package/dist/coding-worker/sdk.d.ts +36 -0
  101. package/dist/coding-worker/sdk.js +28 -1
  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 +15 -0
  105. package/dist/config/dependency-cache.d.ts +23 -0
  106. package/dist/config/dependency-cache.js +32 -0
  107. package/dist/config/mcp-call-limit.d.ts +8 -0
  108. package/dist/config/mcp-call-limit.js +18 -0
  109. package/dist/config/mcp-servers.d.ts +8 -0
  110. package/dist/config/mcp-servers.js +12 -0
  111. package/dist/config/providers.d.ts +12 -3
  112. package/dist/config/providers.js +55 -5
  113. package/dist/config/test-simulators.d.ts +92 -0
  114. package/dist/config/test-simulators.js +333 -0
  115. package/dist/config/tool-timeout.d.ts +1 -0
  116. package/dist/config/tool-timeout.js +18 -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-mcp.d.ts +36 -0
  130. package/dist/core/coding-mcp.js +253 -0
  131. package/dist/core/coding-queue.d.ts +2 -1
  132. package/dist/core/coding-queue.js +7 -0
  133. package/dist/core/coding-repository.d.ts +46 -0
  134. package/dist/core/coding-repository.js +92 -0
  135. package/dist/core/cron.d.ts +19 -1
  136. package/dist/core/cron.js +17 -0
  137. package/dist/core/datastores.js +1 -1
  138. package/dist/core/deferred-coding.d.ts +14 -0
  139. package/dist/core/deferred-coding.js +62 -0
  140. package/dist/core/delegation-child.d.ts +25 -0
  141. package/dist/core/delegation-child.js +37 -0
  142. package/dist/core/delegation-slots.d.ts +27 -0
  143. package/dist/core/delegation-slots.js +44 -0
  144. package/dist/core/dispatch.d.ts +48 -2
  145. package/dist/core/dispatch.js +166 -66
  146. package/dist/core/engine-native.js +1 -1
  147. package/dist/core/error-code.d.ts +38 -0
  148. package/dist/core/error-code.js +169 -0
  149. package/dist/core/grants.d.ts +46 -8
  150. package/dist/core/grants.js +99 -8
  151. package/dist/core/host-events.d.ts +18 -2
  152. package/dist/core/host-events.js +291 -27
  153. package/dist/core/host-status.d.ts +85 -3
  154. package/dist/core/host-status.js +300 -22
  155. package/dist/core/issue-bridge.d.ts +50 -6
  156. package/dist/core/issue-bridge.js +124 -33
  157. package/dist/core/issue-events.d.ts +1 -1
  158. package/dist/core/issue-events.js +4 -10
  159. package/dist/core/issue-status.d.ts +1 -1
  160. package/dist/core/issue-status.js +58 -29
  161. package/dist/core/logger.d.ts +5 -0
  162. package/dist/core/logger.js +14 -1
  163. package/dist/core/lost-run-children.d.ts +6 -0
  164. package/dist/core/lost-run-children.js +32 -0
  165. package/dist/core/mark-ready.d.ts +34 -0
  166. package/dist/core/mark-ready.js +152 -0
  167. package/dist/core/markdown-code.d.ts +8 -0
  168. package/dist/core/markdown-code.js +107 -0
  169. package/dist/core/mcp-client/client.d.ts +47 -0
  170. package/dist/core/mcp-client/client.js +141 -0
  171. package/dist/core/mcp-client/jsonrpc.d.ts +15 -0
  172. package/dist/core/mcp-client/jsonrpc.js +54 -0
  173. package/dist/core/mcp-client/results.d.ts +13 -0
  174. package/dist/core/mcp-client/results.js +42 -0
  175. package/dist/core/mcp-servers.d.ts +90 -0
  176. package/dist/core/mcp-servers.js +230 -0
  177. package/dist/core/mcp-tools.d.ts +108 -0
  178. package/dist/core/mcp-tools.js +287 -0
  179. package/dist/core/memory-tools.js +7 -0
  180. package/dist/core/merge-order-check.d.ts +2 -1
  181. package/dist/core/merge-order-check.js +44 -18
  182. package/dist/core/notification-dispatcher.js +2 -1
  183. package/dist/core/notification-templates.d.ts +1 -7
  184. package/dist/core/notification-templates.js +36 -2
  185. package/dist/core/pull-request-state-sync.js +2 -2
  186. package/dist/core/reconciler.d.ts +4 -3
  187. package/dist/core/reconciler.js +8 -1
  188. package/dist/core/related-pull-requests.d.ts +11 -3
  189. package/dist/core/related-pull-requests.js +49 -20
  190. package/dist/core/reply-parts.d.ts +21 -0
  191. package/dist/core/reply-parts.js +73 -0
  192. package/dist/core/review-fix.d.ts +1 -1
  193. package/dist/core/review-fix.js +4 -3
  194. package/dist/core/review-host-checks.d.ts +1 -1
  195. package/dist/core/review-host-tools.d.ts +3 -0
  196. package/dist/core/review-host-tools.js +102 -14
  197. package/dist/core/review-reads.d.ts +55 -0
  198. package/dist/core/review-reads.js +233 -0
  199. package/dist/core/run-status.d.ts +12 -0
  200. package/dist/core/run-status.js +12 -0
  201. package/dist/core/runner.d.ts +145 -49
  202. package/dist/core/runner.js +719 -216
  203. package/dist/core/schedule-start.d.ts +12 -0
  204. package/dist/core/schedule-start.js +14 -0
  205. package/dist/core/secret-broker-config.d.ts +12 -74
  206. package/dist/core/secret-broker-config.js +1 -1
  207. package/dist/core/secret-guard.d.ts +49 -0
  208. package/dist/core/secret-guard.js +119 -0
  209. package/dist/core/secret-guarded-stores.d.ts +12 -0
  210. package/dist/core/secret-guarded-stores.js +41 -0
  211. package/dist/core/secret-spans.d.ts +50 -0
  212. package/dist/core/secret-spans.js +94 -0
  213. package/dist/core/secrets.d.ts +11 -1
  214. package/dist/core/secrets.js +27 -1
  215. package/dist/core/serializable-retry.d.ts +18 -0
  216. package/dist/core/serializable-retry.js +43 -0
  217. package/dist/core/stop-run.d.ts +46 -0
  218. package/dist/core/stop-run.js +61 -0
  219. package/dist/core/tool-admin.d.ts +5 -1
  220. package/dist/core/tool-admin.js +7 -2
  221. package/dist/core/tool-names.d.ts +13 -0
  222. package/dist/core/tool-names.js +20 -0
  223. package/dist/core/webhooks.d.ts +4 -0
  224. package/dist/core/webhooks.js +68 -49
  225. package/dist/core/workflow-events.d.ts +14 -2
  226. package/dist/core/workflow-events.js +4 -0
  227. package/dist/core/workflow-run-events.d.ts +5 -3
  228. package/dist/core/workflow-run-events.js +45 -9
  229. package/dist/core/zod-json-schema.d.ts +4 -0
  230. package/dist/core/zod-json-schema.js +39 -0
  231. package/dist/core/zod3-window.d.ts +35 -0
  232. package/dist/core/zod3-window.js +124 -0
  233. package/dist/generated/prisma/browser.d.ts +65 -3
  234. package/dist/generated/prisma/client.d.ts +65 -3
  235. package/dist/generated/prisma/commonInputTypes.d.ts +266 -106
  236. package/dist/generated/prisma/enums.d.ts +10 -0
  237. package/dist/generated/prisma/enums.js +8 -0
  238. package/dist/generated/prisma/internal/class.d.ts +110 -0
  239. package/dist/generated/prisma/internal/class.js +4 -4
  240. package/dist/generated/prisma/internal/prismaNamespace.d.ts +957 -9
  241. package/dist/generated/prisma/internal/prismaNamespace.js +166 -2
  242. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +174 -0
  243. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +166 -2
  244. package/dist/generated/prisma/models/Agent.d.ts +377 -8
  245. package/dist/generated/prisma/models/AgentMcpServer.d.ts +1412 -0
  246. package/dist/generated/prisma/models/AgentMcpServer.js +1 -0
  247. package/dist/generated/prisma/models/AgentRepository.d.ts +81 -1
  248. package/dist/generated/prisma/models/AuthUser.d.ts +1 -1
  249. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +228 -7
  250. package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
  251. package/dist/generated/prisma/models/CodingProxySession.d.ts +232 -2
  252. package/dist/generated/prisma/models/CodingRun.d.ts +1712 -1
  253. package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
  254. package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
  255. package/dist/generated/prisma/models/HostProvider.d.ts +2176 -0
  256. package/dist/generated/prisma/models/HostProvider.js +1 -0
  257. package/dist/generated/prisma/models/HostProviderCredential.d.ts +1285 -0
  258. package/dist/generated/prisma/models/HostProviderCredential.js +1 -0
  259. package/dist/generated/prisma/models/HostProviderOperation.d.ts +1470 -0
  260. package/dist/generated/prisma/models/HostProviderOperation.js +1 -0
  261. package/dist/generated/prisma/models/HostProviderTrustedAccount.d.ts +1145 -0
  262. package/dist/generated/prisma/models/HostProviderTrustedAccount.js +1 -0
  263. package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
  264. package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
  265. package/dist/generated/prisma/models/McpServer.d.ts +1500 -0
  266. package/dist/generated/prisma/models/McpServer.js +1 -0
  267. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +77 -1
  268. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
  269. package/dist/generated/prisma/models/Principal.d.ts +167 -0
  270. package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
  271. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
  272. package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
  273. package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
  274. package/dist/generated/prisma/models/ResourceGrant.d.ts +1 -1
  275. package/dist/generated/prisma/models/Run.d.ts +738 -2
  276. package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
  277. package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
  278. package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
  279. package/dist/generated/prisma/models/RunTranscript.js +1 -0
  280. package/dist/generated/prisma/models/Secret.d.ts +387 -0
  281. package/dist/generated/prisma/models/Tool.d.ts +223 -1
  282. package/dist/generated/prisma/models.d.ts +10 -0
  283. package/dist/help/search.js +12 -3
  284. package/dist/help-index.json +2033 -110
  285. package/dist/import/create.js +48 -4
  286. package/dist/import/neutral-schema.d.ts +51 -281
  287. package/dist/import/neutral-schema.js +7 -4
  288. package/dist/knowledge/check.d.ts +1 -1
  289. package/dist/knowledge/cli.d.ts +11 -1
  290. package/dist/knowledge/cli.js +37 -4
  291. package/dist/knowledge/concept.d.ts +3 -19
  292. package/dist/knowledge/location.d.ts +31 -0
  293. package/dist/knowledge/location.js +78 -0
  294. package/dist/mcp/auth/access.d.ts +10 -2
  295. package/dist/mcp/auth/access.js +15 -1
  296. package/dist/mcp/auth/grants-cli.d.ts +6 -4
  297. package/dist/mcp/auth/grants-cli.js +42 -3
  298. package/dist/mcp/auth/ownership.d.ts +7 -7
  299. package/dist/mcp/auth/resource-server.d.ts +3 -1
  300. package/dist/mcp/auth/resource-server.js +17 -2
  301. package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
  302. package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
  303. package/dist/mcp/context.d.ts +3 -0
  304. package/dist/mcp/host-events/github-ingress.d.ts +2 -0
  305. package/dist/mcp/host-events/github-ingress.js +2 -1
  306. package/dist/mcp/index.d.ts +6 -0
  307. package/dist/mcp/index.js +69 -10
  308. package/dist/mcp/server.d.ts +13 -0
  309. package/dist/mcp/server.js +33 -14
  310. package/dist/mcp/tools/agents.d.ts +4 -0
  311. package/dist/mcp/tools/agents.js +295 -28
  312. package/dist/mcp/tools/datastore.js +17 -8
  313. package/dist/mcp/tools/grants.js +73 -29
  314. package/dist/mcp/tools/host-providers.d.ts +2 -0
  315. package/dist/mcp/tools/host-providers.js +215 -0
  316. package/dist/mcp/tools/mcp-servers.d.ts +26 -0
  317. package/dist/mcp/tools/mcp-servers.js +481 -0
  318. package/dist/mcp/tools/memory.js +11 -1
  319. package/dist/mcp/tools/notification-channels.js +2 -2
  320. package/dist/mcp/tools/packages.d.ts +2 -0
  321. package/dist/mcp/tools/packages.js +195 -0
  322. package/dist/mcp/tools/repositories.js +65 -12
  323. package/dist/mcp/tools/run-access.d.ts +16 -0
  324. package/dist/mcp/tools/run-access.js +25 -0
  325. package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
  326. package/dist/mcp/tools/run-transcript-download.js +129 -0
  327. package/dist/mcp/tools/run-transcript.d.ts +19 -0
  328. package/dist/mcp/tools/run-transcript.js +70 -0
  329. package/dist/mcp/tools/runs.js +209 -27
  330. package/dist/mcp/tools/scheduling.js +3 -1
  331. package/dist/mcp/tools/secret-elicitation-form.js +5 -0
  332. package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
  333. package/dist/mcp/tools/secret-elicitation-server.js +10 -61
  334. package/dist/mcp/tools/secret-elicitation.d.ts +2 -0
  335. package/dist/mcp/tools/secret-elicitation.js +25 -2
  336. package/dist/mcp/tools/secrets.js +40 -6
  337. package/dist/mcp/tools/stop-run.d.ts +2 -0
  338. package/dist/mcp/tools/stop-run.js +82 -0
  339. package/dist/mcp/tools/subagents.js +2 -2
  340. package/dist/mcp/tools/tools.d.ts +7 -5
  341. package/dist/mcp/tools/tools.js +64 -16
  342. package/dist/mcp/tools/trigger.js +28 -6
  343. package/dist/mcp/transport/http-limits.d.ts +2 -0
  344. package/dist/mcp/transport/http-limits.js +6 -2
  345. package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
  346. package/dist/mcp/transport/stdio-link-host.js +67 -0
  347. package/dist/mcp/transport/streamable-http.d.ts +13 -0
  348. package/dist/mcp/transport/streamable-http.js +41 -1
  349. package/dist/mcp/webhooks/ingress.js +10 -0
  350. package/dist/native-worker/docker-launcher.d.ts +38 -2
  351. package/dist/native-worker/docker-launcher.js +65 -5
  352. package/dist/native-worker/gateway-server.d.ts +55 -3
  353. package/dist/native-worker/gateway-server.js +152 -34
  354. package/dist/native-worker/gateway.d.ts +29 -1
  355. package/dist/native-worker/gateway.js +74 -4
  356. package/dist/native-worker/http-server.d.ts +7 -1
  357. package/dist/native-worker/http-server.js +62 -7
  358. package/dist/native-worker/http-transport.js +1 -1
  359. package/dist/native-worker/kubernetes-launcher.d.ts +7 -3
  360. package/dist/native-worker/kubernetes-launcher.js +43 -3
  361. package/dist/native-worker/launch.d.ts +18 -1
  362. package/dist/native-worker/launch.js +6 -1
  363. package/dist/native-worker/ledger.d.ts +24 -4
  364. package/dist/native-worker/ledger.js +62 -8
  365. package/dist/native-worker/loopback.js +3 -8
  366. package/dist/native-worker/main.d.ts +2 -1
  367. package/dist/native-worker/main.js +14 -3
  368. package/dist/native-worker/protocol.d.ts +130 -577
  369. package/dist/native-worker/protocol.js +51 -2
  370. package/dist/native-worker/sandbox-executor.d.ts +17 -2
  371. package/dist/native-worker/sandbox-executor.js +78 -4
  372. package/dist/native-worker/stderr-redaction.d.ts +77 -0
  373. package/dist/native-worker/stderr-redaction.js +237 -0
  374. package/dist/native-worker/stdio.d.ts +1 -1
  375. package/dist/native-worker/stdio.js +6 -5
  376. package/dist/native-worker/warm-pool.d.ts +2 -2
  377. package/dist/native-worker/warm-pool.js +4 -4
  378. package/dist/native-worker/worker.js +28 -2
  379. package/dist/observability/metrics.js +6 -1
  380. package/dist/providers/auth/self-hosted.d.ts +1 -1
  381. package/dist/providers/coding-proxy/capability-hash.d.ts +2 -0
  382. package/dist/providers/coding-proxy/capability-hash.js +5 -0
  383. package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
  384. package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
  385. package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
  386. package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
  387. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
  388. package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
  389. package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
  390. package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
  391. package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
  392. package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
  393. package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
  394. package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
  395. package/dist/providers/coding-proxy/hold.d.ts +32 -0
  396. package/dist/providers/coding-proxy/hold.js +86 -0
  397. package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
  398. package/dist/providers/coding-proxy/interrupted.js +104 -0
  399. package/dist/providers/coding-proxy/mcp-route.d.ts +34 -0
  400. package/dist/providers/coding-proxy/mcp-route.js +166 -0
  401. package/dist/providers/coding-proxy/memory-ledger.d.ts +17 -2
  402. package/dist/providers/coding-proxy/memory-ledger.js +99 -8
  403. package/dist/providers/coding-proxy/metering.d.ts +16 -0
  404. package/dist/providers/coding-proxy/metering.js +27 -4
  405. package/dist/providers/coding-proxy/prisma-ledger.d.ts +16 -2
  406. package/dist/providers/coding-proxy/prisma-ledger.js +209 -69
  407. package/dist/providers/coding-proxy/proxy.d.ts +21 -2
  408. package/dist/providers/coding-proxy/proxy.js +300 -48
  409. package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
  410. package/dist/providers/coding-proxy/registry/audit.js +94 -17
  411. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
  412. package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
  413. package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
  414. package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
  415. package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
  416. package/dist/providers/coding-proxy/registry/plan.js +201 -48
  417. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
  418. package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
  419. package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
  420. package/dist/providers/coding-proxy/registry/service.js +579 -112
  421. package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
  422. package/dist/providers/coding-proxy/registry/store.js +54 -1
  423. package/dist/providers/coding-proxy/runtime.d.ts +10 -0
  424. package/dist/providers/coding-proxy/runtime.js +109 -16
  425. package/dist/providers/coding-proxy/server.d.ts +9 -1
  426. package/dist/providers/coding-proxy/server.js +55 -1
  427. package/dist/providers/coding-proxy/types.d.ts +78 -1
  428. package/dist/providers/datastore/types.d.ts +5 -0
  429. package/dist/providers/engine/types.d.ts +17 -2
  430. package/dist/providers/engine/types.js +17 -0
  431. package/dist/providers/executor/composition.d.ts +10 -3
  432. package/dist/providers/executor/composition.js +52 -7
  433. package/dist/providers/executor/container.d.ts +394 -9
  434. package/dist/providers/executor/container.js +1210 -96
  435. package/dist/providers/executor/dbos-status.d.ts +31 -0
  436. package/dist/providers/executor/dbos-status.js +64 -0
  437. package/dist/providers/executor/dbos.d.ts +50 -1
  438. package/dist/providers/executor/dbos.js +207 -20
  439. package/dist/providers/executor/deferred.d.ts +12 -24
  440. package/dist/providers/executor/deferred.js +10 -29
  441. package/dist/providers/executor/in-process.d.ts +9 -1
  442. package/dist/providers/executor/in-process.js +14 -4
  443. package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
  444. package/dist/providers/executor/linked-issue-reader.js +30 -0
  445. package/dist/providers/executor/routing.d.ts +2 -0
  446. package/dist/providers/executor/routing.js +4 -0
  447. package/dist/providers/executor/types.d.ts +13 -0
  448. package/dist/providers/host-tools/invoke.d.ts +37 -0
  449. package/dist/providers/host-tools/invoke.js +117 -0
  450. package/dist/providers/host-tools/operations.d.ts +65 -0
  451. package/dist/providers/host-tools/operations.js +149 -0
  452. package/dist/providers/host-tools/registry.d.ts +79 -0
  453. package/dist/providers/host-tools/registry.js +362 -0
  454. package/dist/providers/host-tools/request-guard.d.ts +17 -0
  455. package/dist/providers/host-tools/request-guard.js +99 -0
  456. package/dist/providers/host-tools/self-test.d.ts +64 -0
  457. package/dist/providers/host-tools/self-test.js +142 -0
  458. package/dist/providers/index.d.ts +2 -1
  459. package/dist/providers/issue-tracker/types.d.ts +17 -0
  460. package/dist/providers/issue-tracker/types.js +39 -1
  461. package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
  462. package/dist/providers/jobs/claude-tool-setup.js +5 -2
  463. package/dist/providers/jobs/docker-isolation.d.ts +10 -2
  464. package/dist/providers/jobs/docker-isolation.js +47 -8
  465. package/dist/providers/jobs/docker.d.ts +9 -0
  466. package/dist/providers/jobs/docker.js +60 -11
  467. package/dist/providers/jobs/fake-kubernetes-api.d.ts +2 -0
  468. package/dist/providers/jobs/fake-kubernetes-api.js +3 -0
  469. package/dist/providers/jobs/kubernetes-api.d.ts +8 -0
  470. package/dist/providers/jobs/kubernetes-api.js +10 -0
  471. package/dist/providers/jobs/kubernetes-client.js +10 -1
  472. package/dist/providers/jobs/kubernetes-isolation.d.ts +5 -1
  473. package/dist/providers/jobs/kubernetes-isolation.js +32 -3
  474. package/dist/providers/jobs/kubernetes.d.ts +11 -1
  475. package/dist/providers/jobs/kubernetes.js +111 -17
  476. package/dist/providers/jobs/types.d.ts +39 -0
  477. package/dist/providers/jobs/types.js +13 -1
  478. package/dist/providers/llm/anthropic.js +5 -1
  479. package/dist/providers/llm/bedrock.d.ts +0 -12
  480. package/dist/providers/llm/bedrock.js +4 -0
  481. package/dist/providers/llm/claude-messages.d.ts +3 -1
  482. package/dist/providers/llm/claude-messages.js +4 -1
  483. package/dist/providers/llm/claude-provider.d.ts +2 -2
  484. package/dist/providers/llm/claude-provider.js +2 -2
  485. package/dist/providers/llm/openai.d.ts +2 -2
  486. package/dist/providers/llm/openai.js +6 -2
  487. package/dist/providers/llm/routing.d.ts +2 -2
  488. package/dist/providers/llm/routing.js +2 -2
  489. package/dist/providers/llm/types.d.ts +12 -2
  490. package/dist/providers/review-host/github-events.d.ts +9 -1
  491. package/dist/providers/review-host/github-events.js +34 -12
  492. package/dist/providers/review-host/github.d.ts +29 -2
  493. package/dist/providers/review-host/github.js +224 -29
  494. package/dist/providers/review-host/local.d.ts +8 -4
  495. package/dist/providers/review-host/local.js +49 -31
  496. package/dist/providers/review-host/patch-pages.d.ts +41 -0
  497. package/dist/providers/review-host/patch-pages.js +176 -0
  498. package/dist/providers/review-host/review-format.d.ts +19 -1
  499. package/dist/providers/review-host/review-format.js +38 -7
  500. package/dist/providers/review-host/types.d.ts +140 -6
  501. package/dist/providers/review-host/types.js +9 -1
  502. package/dist/providers/storage/gcs.d.ts +63 -0
  503. package/dist/providers/storage/gcs.js +69 -0
  504. package/dist/providers/storage/index.d.ts +15 -0
  505. package/dist/providers/storage/index.js +14 -0
  506. package/dist/providers/storage/local.d.ts +24 -0
  507. package/dist/providers/storage/local.js +92 -0
  508. package/dist/providers/storage/meter.d.ts +14 -0
  509. package/dist/providers/storage/meter.js +34 -0
  510. package/dist/providers/storage/s3.d.ts +41 -0
  511. package/dist/providers/storage/s3.js +107 -0
  512. package/dist/providers/storage/types.d.ts +37 -3
  513. package/dist/providers/storage/types.js +21 -4
  514. package/dist/providers/vcs/git.d.ts +39 -4
  515. package/dist/providers/vcs/git.js +339 -26
  516. package/dist/providers/vcs/github-remote.d.ts +26 -3
  517. package/dist/providers/vcs/github-remote.js +124 -14
  518. package/dist/providers/vcs/github.d.ts +183 -44
  519. package/dist/providers/vcs/github.js +455 -56
  520. package/dist/providers/vcs/index.d.ts +1 -1
  521. package/dist/providers/vcs/index.js +9 -2
  522. package/dist/providers/vcs/pr-description.d.ts +127 -0
  523. package/dist/providers/vcs/pr-description.js +270 -0
  524. package/dist/providers/vcs/remote.d.ts +37 -1
  525. package/dist/providers/vcs/remote.js +7 -1
  526. package/dist/providers/vcs/routing.d.ts +16 -8
  527. package/dist/providers/vcs/routing.js +27 -6
  528. package/dist/providers/vcs/types.d.ts +150 -5
  529. package/dist/quickstart/coding-seed.d.ts +14 -3
  530. package/dist/quickstart/coding-seed.js +213 -4
  531. package/dist/quickstart/index.d.ts +5 -0
  532. package/dist/quickstart/index.js +21 -0
  533. package/dist/quickstart/reviewer-prompt.d.ts +1 -1
  534. package/dist/quickstart/reviewer-prompt.js +6 -6
  535. package/dist/quickstart-images.json +1 -1
  536. package/dist/sandbox/eval-core.d.ts +12 -2
  537. package/dist/sandbox/eval-core.js +20 -4
  538. package/dist/sandbox/generated/zod.bundle.js +62 -1
  539. package/dist/sandbox/generated/zod3.bundle.js +5 -0
  540. package/dist/sandbox/host-functions.d.ts +5 -0
  541. package/dist/sandbox/host-functions.js +13 -13
  542. package/dist/sandbox/limits.d.ts +4 -1
  543. package/dist/sandbox/limits.js +4 -1
  544. package/dist/sandbox/run-in-sandbox.d.ts +6 -0
  545. package/dist/sandbox/run-in-sandbox.js +14 -2
  546. package/dist/sandbox/safe-fetch.d.ts +2 -0
  547. package/dist/sandbox/safe-fetch.js +1 -1
  548. package/dist/sandbox/secret-broker.d.ts +1 -0
  549. package/dist/sandbox/secret-broker.js +4 -5
  550. package/dist/sandbox/tool-capabilities.d.ts +10 -30
  551. package/dist/sandbox/tool-timeout.d.ts +32 -0
  552. package/dist/sandbox/tool-timeout.js +52 -0
  553. package/dist/sandbox/user-tool.d.ts +8 -1
  554. package/dist/sandbox/user-tool.js +9 -3
  555. package/dist/sandbox/zod-params.d.ts +37 -5
  556. package/dist/sandbox/zod-params.js +181 -26
  557. package/dist/serve.js +8 -1
  558. package/dist/viewer/api-schema.d.ts +349 -2627
  559. package/dist/viewer/api-schema.js +7 -0
  560. package/dist/viewer/build-schemas.js +6 -2
  561. package/dist/viewer/graph.js +2 -1
  562. package/dist/viewer/openapi.js +2 -4
  563. package/dist/wardby-bin.js +15 -0
  564. package/docs/README.md +11 -1
  565. package/docs/agent-recipes.md +95 -24
  566. package/docs/architecture-runtime.md +1 -1
  567. package/docs/claude-code-plugin.md +164 -0
  568. package/docs/code-review-agents.md +557 -41
  569. package/docs/coding-agent-setup.md +566 -8
  570. package/docs/coding-packages.md +1033 -90
  571. package/docs/coding-services.md +27 -12
  572. package/docs/coding-worker-byo-images.md +24 -2
  573. package/docs/coding-worker-isolation.md +183 -37
  574. package/docs/debugging-agent-runs.md +242 -0
  575. package/docs/getting-started-gke.md +129 -141
  576. package/docs/getting-started-identity-provider.md +53 -38
  577. package/docs/getting-started.md +17 -0
  578. package/docs/host-providers.md +294 -0
  579. package/docs/jira-agents.md +17 -8
  580. package/docs/knowledge/blob-not-found-semantics.md +41 -0
  581. package/docs/knowledge/bounded-file-descriptor.md +52 -0
  582. package/docs/knowledge/delegation-admission-slots.md +52 -0
  583. package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
  584. package/docs/knowledge/import-rename-target.md +52 -0
  585. package/docs/knowledge/index.md +57 -0
  586. package/docs/knowledge/log.md +9 -0
  587. package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
  588. package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
  589. package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
  590. package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
  591. package/docs/knowledge/overview-cli.md +74 -0
  592. package/docs/knowledge/overview-coding-proxy.md +72 -0
  593. package/docs/knowledge/overview-coding.md +72 -0
  594. package/docs/knowledge/overview-config.md +60 -0
  595. package/docs/knowledge/overview-core.md +72 -0
  596. package/docs/knowledge/overview-deploy.md +83 -0
  597. package/docs/knowledge/overview-mcp.md +61 -0
  598. package/docs/knowledge/overview-prisma.md +72 -0
  599. package/docs/knowledge/overview-providers.md +89 -0
  600. package/docs/knowledge/overview-sandbox.md +83 -0
  601. package/docs/knowledge/overview-surfaces.md +83 -0
  602. package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
  603. package/docs/knowledge/proxy-settlement-projections.md +41 -0
  604. package/docs/knowledge/run-pricing-first-writer.md +43 -0
  605. package/docs/knowledge/schedule-claim-transaction.md +41 -0
  606. package/docs/knowledge/secret-entry-replica-contract.md +52 -0
  607. package/docs/knowledge/terminal-run-first-writer.md +41 -0
  608. package/docs/knowledge/transactional-agent-authorization.md +52 -0
  609. package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
  610. package/docs/knowledge/warm-input-publication.md +30 -0
  611. package/docs/knowledge/workspace-staging-failure.md +54 -0
  612. package/docs/knowledge.md +54 -14
  613. package/docs/mcp-servers.md +254 -0
  614. package/docs/native-sandbox.md +143 -31
  615. package/docs/observability.md +4 -0
  616. package/docs/security-deployment.md +139 -29
  617. package/docs/slack-notifications.md +35 -19
  618. package/docs/tool-secrets.md +45 -10
  619. package/docs/viewer-api.md +6 -0
  620. package/docs/viewer-api.openapi.yml +1 -1
  621. package/help/admin-viewer.md +28 -2
  622. package/help/agent-recipes.md +33 -2
  623. package/help/architecture-agent.md +11 -6
  624. package/help/brokered-secrets.md +3 -0
  625. package/help/build-claude-code-image.md +1 -1
  626. package/help/build-worker-image.md +3 -1
  627. package/help/builder-agent.md +19 -6
  628. package/help/claude-code-run-pane.md +40 -0
  629. package/help/code-review-agents.md +177 -6
  630. package/help/coding-packages.md +156 -6
  631. package/help/cost-attribution.md +9 -5
  632. package/help/creating-agents.md +14 -1
  633. package/help/dependency-cache.md +143 -0
  634. package/help/deploy-gke.md +15 -8
  635. package/help/errors/budget-exhausted.md +187 -0
  636. package/help/errors/budget-group-exhausted.md +5 -1
  637. package/help/errors/coding-mcp-pins-unavailable.md +35 -0
  638. package/help/errors/coding-stream-quota-exceeded.md +33 -0
  639. package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
  640. package/help/errors/continuation-closed.md +9 -12
  641. package/help/errors/database-auth-invalid.md +1 -1
  642. package/help/errors/delegation-conflict.md +24 -0
  643. package/help/errors/file-list-truncated.md +45 -0
  644. package/help/errors/full-read-required.md +49 -0
  645. package/help/errors/github-account-not-allowed.md +4 -0
  646. package/help/errors/graph-incomplete.md +43 -0
  647. package/help/errors/graph-limit.md +43 -0
  648. package/help/errors/host-provider-error.md +40 -0
  649. package/help/errors/host-tool-failed.md +36 -0
  650. package/help/errors/mcp-call-limit.md +22 -0
  651. package/help/errors/mcp-call-timeout.md +22 -0
  652. package/help/errors/mcp-server-auth-failed.md +22 -0
  653. package/help/errors/mcp-server-credentials-unavailable.md +45 -0
  654. package/help/errors/mcp-server-error.md +28 -0
  655. package/help/errors/mcp-server-unreachable.md +22 -0
  656. package/help/errors/mcp-servers-off.md +21 -0
  657. package/help/errors/mcp-tool-not-allowed.md +26 -0
  658. package/help/errors/mcp-tool-removed.md +22 -0
  659. package/help/errors/mcp-unavailable.md +25 -0
  660. package/help/errors/merge-conflict.md +49 -0
  661. package/help/errors/native-sandbox-capacity.md +1 -1
  662. package/help/errors/native-sandbox-deadline-exceeded.md +1 -1
  663. package/help/errors/native-sandbox-docker-failed.md +1 -1
  664. package/help/errors/native-sandbox-gateway-error.md +20 -0
  665. package/help/errors/native-sandbox-gateway-unavailable.md +1 -1
  666. package/help/errors/native-sandbox-image-not-pinned.md +1 -1
  667. package/help/errors/native-sandbox-isolation-mismatch.md +1 -1
  668. package/help/errors/native-sandbox-launch-abandoned.md +21 -0
  669. package/help/errors/native-sandbox-network-unenforced.md +1 -1
  670. package/help/errors/native-sandbox-requires-catalog.md +1 -1
  671. package/help/errors/native-sandbox-unavailable.md +1 -1
  672. package/help/errors/native-sandbox-warm-delivery-failed.md +1 -1
  673. package/help/errors/native-sandbox-worker-exited.md +4 -3
  674. package/help/errors/native-sandbox-worker-lost.md +1 -1
  675. package/help/errors/native-sandbox-worker-unready.md +1 -1
  676. package/help/errors/package-not-allowed-pending.md +52 -0
  677. package/help/errors/package-not-allowed.md +51 -0
  678. package/help/errors/package-refusals.md +43 -0
  679. package/help/errors/patch-cursor-malformed.md +31 -0
  680. package/help/errors/repository-not-listed.md +36 -0
  681. package/help/errors/repository-required.md +36 -0
  682. package/help/errors/run-lost.md +39 -0
  683. package/help/errors/run-transcript-download.md +44 -0
  684. package/help/errors/secret-in-value.md +69 -0
  685. package/help/errors/target-merge.md +40 -0
  686. package/help/errors/tool-timeout.md +38 -0
  687. package/help/fix-merge-conflicts.md +73 -0
  688. package/help/github-app-setup.md +132 -0
  689. package/help/github.md +22 -0
  690. package/help/host-providers.md +40 -0
  691. package/help/identity-and-access.md +6 -1
  692. package/help/jira.md +23 -6
  693. package/help/knowledge.md +16 -7
  694. package/help/local-repositories.md +1 -1
  695. package/help/low-power-mode.md +7 -1
  696. package/help/mcp-servers.md +73 -0
  697. package/help/mcp.md +7 -2
  698. package/help/merge-order-check.md +5 -0
  699. package/help/native-capabilities.md +55 -1
  700. package/help/native-sandbox.md +16 -2
  701. package/help/operating-agents.md +21 -0
  702. package/help/package-audit-mode.md +91 -0
  703. package/help/related-pull-requests.md +17 -10
  704. package/help/repo-instructions-and-skills.md +3 -1
  705. package/help/resume-runs-locally.md +134 -0
  706. package/help/review-fix-rounds.md +33 -1
  707. package/help/sharing-agents.md +59 -0
  708. package/help/slack-notifications.md +19 -5
  709. package/help/status-comments.md +31 -0
  710. package/help/stop-run.md +58 -0
  711. package/help/troubleshooting/budgets.md +28 -0
  712. package/help/troubleshooting/coding-workers.md +86 -7
  713. package/help/troubleshooting/debugging-agent-runs.md +29 -0
  714. package/package.json +18 -10
  715. package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
  716. package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
  717. package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
  718. package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
  719. package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
  720. package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
  721. package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
  722. package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
  723. package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
  724. package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
  725. package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
  726. package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
  727. package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
  728. package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
  729. package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
  730. package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
  731. package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
  732. package/prisma/migrations/20261102000000_host_providers/migration.sql +56 -0
  733. package/prisma/migrations/20261104000000_coding_agent_repository_list/migration.sql +5 -0
  734. package/prisma/migrations/20261106000000_tool_timeout/migration.sql +4 -0
  735. package/prisma/migrations/20261107000000_mcp_servers/migration.sql +33 -0
  736. package/prisma/migrations/20261108000000_coding_mcp/migration.sql +5 -0
  737. package/prisma/migrations/20261109000000_task_run_index/migration.sql +3 -0
  738. package/prisma/schema.prisma +468 -109
  739. package/scripts/git-askpass.sh +1 -1
  740. package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
@@ -7,12 +7,13 @@
7
7
  * adapters) is added once the adapters exist.
8
8
  */
9
9
  import { type KubernetesPlatform } from "../providers/jobs/kubernetes-platform.js";
10
+ import type { BlobStoreConfig } from "../providers/storage/index.js";
10
11
  import { type MobileConfig } from "./mobile.js";
11
12
  export type JobLauncherKind = "local" | "docker" | "kubernetes";
12
13
  export type EmailProviderKind = "smtp" | "ses";
13
14
  export type SecretCipherKind = "app-key" | "kms";
14
15
  export type AuthProviderKind = "delegating" | "self-hosted";
15
- export type BlobStoreKind = "local" | "s3";
16
+ export type BlobStoreKind = "local" | "gcs" | "s3";
16
17
  export type ExecutorKind = "in-process" | "dbos";
17
18
  export type DatastoreKind = "postgres";
18
19
  export type EngineKind = "native" | "langgraph";
@@ -22,12 +23,15 @@ export interface ProviderConfig {
22
23
  email: EmailProviderKind;
23
24
  secrets: SecretCipherKind;
24
25
  auth: AuthProviderKind;
25
- storage: BlobStoreKind;
26
+ /** Unset BLOB_STORE means no blob store is configured. */
27
+ storage: BlobStoreKind | undefined;
26
28
  executor: ExecutorKind;
27
29
  datastore: DatastoreKind;
28
30
  engine: EngineKind;
29
31
  vcs: VcsProviderKind;
30
32
  }
33
+ /** Blob store settings from the environment; undefined when BLOB_STORE is unset (no blob store). */
34
+ export declare function loadBlobStoreConfig(env?: NodeJS.ProcessEnv): BlobStoreConfig | undefined;
31
35
  /** Read provider selection from environment variables, defaulting to portable. */
32
36
  export declare function loadProviderConfig(env?: NodeJS.ProcessEnv): ProviderConfig;
33
37
  export interface GitHubVcsConfig {
@@ -41,9 +45,14 @@ export interface GitHubVcsConfig {
41
45
  /** Trusted roots for `local:` repositories (LOCAL_REPO_ROOTS, path-delimiter separated); unset = local repositories disabled. */
42
46
  export { loadLocalRepoRoots } from "../coding/local-repo.js";
43
47
  export declare function loadGitHubVcsConfig(env?: NodeJS.ProcessEnv): GitHubVcsConfig;
44
- /** GitHub App webhook settings for the code-review host ingress; unset = ingress disabled. */
48
+ /**
49
+ * GitHub App webhook settings for the code-review host ingress; unset = ingress disabled.
50
+ * `mentionExplanations` (WARDBY_MENTION_EXPLANATIONS, default true): false = a mention that
51
+ * starts nothing gets no reply saying why.
52
+ */
45
53
  export declare function loadGitHubEventConfig(env?: NodeJS.ProcessEnv): {
46
54
  webhookSecret?: string;
55
+ mentionExplanations: boolean;
47
56
  };
48
57
  /**
49
58
  * The GitHub App's OAuth client credentials, for linking a principal's GitHub
@@ -8,6 +8,43 @@
8
8
  */
9
9
  import { GVISOR_RUNTIME_CLASS, KUBERNETES_PLATFORMS, platformProfile, } from "../providers/jobs/kubernetes-platform.js";
10
10
  import { loadMobileConfig } from "./mobile.js";
11
+ import { testSimulatorBase } from "./test-simulators.js";
12
+ const BLOB_STORE_KINDS = ["local", "gcs", "s3"];
13
+ function loadBlobStoreKind(env) {
14
+ const value = env.BLOB_STORE?.trim();
15
+ if (value === undefined || value === "")
16
+ return undefined;
17
+ if (!BLOB_STORE_KINDS.includes(value)) {
18
+ throw new Error(`BLOB_STORE must be one of ${BLOB_STORE_KINDS.join(", ")} (got "${value}").`);
19
+ }
20
+ return value;
21
+ }
22
+ /** Blob store settings from the environment; undefined when BLOB_STORE is unset (no blob store). */
23
+ export function loadBlobStoreConfig(env = process.env) {
24
+ const kind = loadBlobStoreKind(env);
25
+ if (kind === undefined)
26
+ return undefined;
27
+ if (kind === "local") {
28
+ const localDir = env.BLOB_STORE_LOCAL_DIR?.trim();
29
+ if (!localDir)
30
+ throw new Error("BLOB_STORE_LOCAL_DIR is required when BLOB_STORE=local.");
31
+ return { kind, localDir };
32
+ }
33
+ if (kind === "gcs") {
34
+ const bucket = env.BLOB_STORE_GCS_BUCKET?.trim();
35
+ if (!bucket)
36
+ throw new Error("BLOB_STORE_GCS_BUCKET is required when BLOB_STORE=gcs.");
37
+ return { kind, bucket };
38
+ }
39
+ const bucket = env.BLOB_STORE_S3_BUCKET?.trim();
40
+ if (!bucket)
41
+ throw new Error("BLOB_STORE_S3_BUCKET is required when BLOB_STORE=s3.");
42
+ const region = env.BLOB_STORE_S3_REGION?.trim();
43
+ if (!region)
44
+ throw new Error("BLOB_STORE_S3_REGION is required when BLOB_STORE=s3.");
45
+ const endpoint = env.BLOB_STORE_S3_ENDPOINT?.trim();
46
+ return { kind, bucket, region, ...(endpoint ? { endpoint } : {}) };
47
+ }
11
48
  /** Read provider selection from environment variables, defaulting to portable. */
12
49
  export function loadProviderConfig(env = process.env) {
13
50
  return {
@@ -15,7 +52,7 @@ export function loadProviderConfig(env = process.env) {
15
52
  email: env.EMAIL_PROVIDER ?? "smtp",
16
53
  secrets: env.SECRET_CIPHER ?? "app-key",
17
54
  auth: env.AUTH_PROVIDER ?? "delegating",
18
- storage: env.BLOB_STORE ?? "local",
55
+ storage: loadBlobStoreKind(env),
19
56
  executor: env.EXECUTOR ?? "in-process",
20
57
  datastore: env.DATASTORE ?? "postgres",
21
58
  engine: env.ENGINE ?? "native",
@@ -42,13 +79,21 @@ export function loadGitHubVcsConfig(env = process.env) {
42
79
  maxDiffBytes: optionalPositiveInteger(env.VCS_MAX_DIFF_BYTES, "VCS_MAX_DIFF_BYTES"),
43
80
  };
44
81
  }
45
- /** GitHub App webhook settings for the code-review host ingress; unset = ingress disabled. */
82
+ /**
83
+ * GitHub App webhook settings for the code-review host ingress; unset = ingress disabled.
84
+ * `mentionExplanations` (WARDBY_MENTION_EXPLANATIONS, default true): false = a mention that
85
+ * starts nothing gets no reply saying why.
86
+ */
46
87
  export function loadGitHubEventConfig(env = process.env) {
47
88
  const secret = env.GITHUB_APP_WEBHOOK_SECRET?.trim();
48
89
  if (secret !== undefined && secret !== "" && secret.length < 20) {
49
90
  throw new Error("GITHUB_APP_WEBHOOK_SECRET must be at least 20 characters.");
50
91
  }
51
- return { webhookSecret: secret || undefined };
92
+ const explanations = env.WARDBY_MENTION_EXPLANATIONS?.trim() ?? "";
93
+ if (explanations !== "" && explanations !== "true" && explanations !== "false") {
94
+ throw new Error("WARDBY_MENTION_EXPLANATIONS must be true or false.");
95
+ }
96
+ return { webhookSecret: secret || undefined, mentionExplanations: explanations !== "false" };
52
97
  }
53
98
  /**
54
99
  * The GitHub App's OAuth client credentials, for linking a principal's GitHub
@@ -114,8 +159,11 @@ export function loadJiraConfig(env = process.env) {
114
159
  siteParsed.password) {
115
160
  throw new Error("WARDBY_JIRA_SITE_URL must be a bare https origin such as https://your-site.atlassian.net.");
116
161
  }
117
- const apiBaseUrl = httpsOrigin(base, "WARDBY_JIRA_API_BASE_URL");
118
- if (!JIRA_GATEWAY.test(apiBaseUrl)) {
162
+ // WARDBY_TEST_SIMULATORS (test only): the simulator stands in for the gateway; it refuses
163
+ // to start over plain http while Jira is configured, so Jira stays https-only.
164
+ const simulatorJira = testSimulatorBase("jira", env);
165
+ const apiBaseUrl = simulatorJira ?? httpsOrigin(base, "WARDBY_JIRA_API_BASE_URL");
166
+ if (!simulatorJira && !JIRA_GATEWAY.test(apiBaseUrl)) {
119
167
  throw new Error("WARDBY_JIRA_API_BASE_URL must be https://api.atlassian.com/ex/jira/<cloudId>, the only base a service " +
120
168
  "account's API token works against.");
121
169
  }
@@ -160,6 +208,8 @@ export function loadSlackConfig(env = process.env) {
160
208
  if (customizeRaw && customizeRaw !== "true" && customizeRaw !== "false") {
161
209
  throw new Error("WARDBY_SLACK_CUSTOMIZE must be true or false.");
162
210
  }
211
+ // WARDBY_TEST_SIMULATORS (test only): the simulator's Slack Web API, whatever the override says.
212
+ apiBaseUrl = testSimulatorBase("slack", env) ?? apiBaseUrl;
163
213
  return { botToken: token, apiBaseUrl, customize: customizeRaw === "true" };
164
214
  }
165
215
  function optionalPositiveNumber(value, name, fallback) {
@@ -0,0 +1,92 @@
1
+ import type { safeFetch } from "../sandbox/safe-fetch.js";
2
+ /** SHA-256 (hex) of the SPKI DER of the simulator's test GitHub App key (tools/wardby-sim/fixtures). */
3
+ export declare const SIMULATOR_GITHUB_APP_KEY_FINGERPRINT = "dac6c80f55da011bbd2ed5868c61972f778853069f125946964e093e51a7d141";
4
+ /** Where each simulated service is mounted under WARDBY_SIM_BASE_URL. */
5
+ export declare const SIMULATOR_PREFIXES: {
6
+ readonly "github-api": "/github/api";
7
+ readonly "github-git": "/github/git";
8
+ readonly slack: "/slack/api";
9
+ readonly jira: "/jira";
10
+ readonly "bitbucket-api": "/bitbucket/api";
11
+ readonly npm: "/npm";
12
+ readonly pypi: "/pypi";
13
+ readonly "pypi-files": "/pypi-files";
14
+ readonly osv: "/osv";
15
+ /** The scripted model (tools/wardby-sim/src/model): /model/anthropic and /model/openai. */
16
+ readonly model: "/model";
17
+ };
18
+ export type SimulatedService = keyof typeof SIMULATOR_PREFIXES;
19
+ /** The real upstream host each registry simulator stands in for. */
20
+ export declare const SIMULATED_REGISTRY_HOSTS: Readonly<Record<string, SimulatedService>>;
21
+ /** The real API host each host-provider simulator stands in for. */
22
+ export declare const SIMULATED_HOST_PROVIDER_HOSTS: Readonly<Record<string, SimulatedService>>;
23
+ /**
24
+ * A bound tool's fetch under the switch: its API host is rewritten to the simulator, whose local
25
+ * address the policy opens for this call alone. The request has already passed the host-tool guard
26
+ * and broker checks against the real host. Every other host is refused.
27
+ */
28
+ export declare function simulatorHostFetch(simulators: TestSimulators, fetchImpl: typeof safeFetch): typeof safeFetch;
29
+ export type TestSimulatorsRefusal = "partial" | "flag_value" | "release_image" | "base_url_invalid" | "base_url_credentials" | "base_url_form" | "base_host_not_local" | "node_env_production" | "github_app_key_not_simulator" | "github_oauth_not_simulator" | "slack_token_not_simulator" | "jira_token_not_simulator" | "jira_needs_https" | "public_hostname" | "model_mock_conflict" | "ca_file_invalid" | "bedrock_not_simulated";
30
+ export declare class TestSimulatorsRefused extends Error {
31
+ readonly reason: TestSimulatorsRefusal;
32
+ constructor(reason: TestSimulatorsRefusal);
33
+ }
34
+ export interface TestSimulators {
35
+ /**
36
+ * WARDBY_SIM_CA_FILE: the simulator's throwaway CA (deploy/kind-coding/sim-ca.sh), trusted by the
37
+ * git commands wardby runs (GIT_SSL_CAINFO) so its https-only git can reach the simulator's
38
+ * git server. Node itself trusts it through NODE_EXTRA_CA_CERTS, set by the test harness.
39
+ */
40
+ caFile?: string;
41
+ /** The simulator's origin, without a trailing slash ("http://wardby-sim.wardby-sim.svc:8080"). */
42
+ origin: string;
43
+ /** The host, for the startup warning (never carries credentials: those are refused). */
44
+ host: string;
45
+ base(service: SimulatedService): string;
46
+ }
47
+ /** Loopback or cluster-local: the only hosts the simulator may live on. */
48
+ export declare function isLocalSimulatorHost(hostname: string): boolean;
49
+ /**
50
+ * The simulators, or null when the switch is off. Throws TestSimulatorsRefused on any
51
+ * refusal; with the switch off nothing here reads or changes any other setting.
52
+ */
53
+ export declare function loadTestSimulators(env?: NodeJS.ProcessEnv): TestSimulators | null;
54
+ /** Extra environment for the git commands wardby runs: the simulator's CA, under the switch only. */
55
+ export declare function simulatorGitEnvironment(env?: NodeJS.ProcessEnv): Record<string, string>;
56
+ /** The simulator's base for one service, or null when the switch is off (throws on a refusal). */
57
+ export declare function testSimulatorBase(service: SimulatedService, env?: NodeJS.ProcessEnv): string | null;
58
+ /**
59
+ * The registry upstream fetch under the switch: each real registry host (npm, PyPI, its file
60
+ * host, OSV) is rewritten to its simulator, with the same request; every other host is
61
+ * refused like the pinned fetch refuses it (`blocked`). Only https upstream URLs are taken,
62
+ * as the pinned fetch takes them.
63
+ */
64
+ export declare function createSimulatorRegistryFetch(simulators: TestSimulators, blocked: () => Error, fetchImpl?: typeof globalThis.fetch): typeof globalThis.fetch;
65
+ /**
66
+ * Process start-up: refuses (throws) on any refusal, and with the switch on logs one loud
67
+ * warning naming the simulator's host only.
68
+ */
69
+ export declare function startupTestSimulators(component: string, env?: NodeJS.ProcessEnv): TestSimulators | null;
70
+ /** A placeholder the provider SDKs require; createCredentialFreeFetch drops it before sending. */
71
+ export declare const SIMULATOR_PLACEHOLDER_API_KEY = "sim-placeholder-not-a-credential";
72
+ /**
73
+ * A fetch to the simulator only: drops every header that can carry a credential, and refuses
74
+ * any URL outside the simulator's origin (`blocked`).
75
+ */
76
+ export declare function createCredentialFreeFetch(simulators: TestSimulators, blocked: () => Error, fetchImpl?: typeof globalThis.fetch): typeof globalThis.fetch;
77
+ /**
78
+ * The coding proxy's model upstream under the switch: the OpenAI Responses and Anthropic
79
+ * Messages endpoints go to the scripted model, with no credential; every other URL is refused.
80
+ */
81
+ export declare function createSimulatorModelFetch(simulators: TestSimulators, blocked: () => Error, fetchImpl?: typeof globalThis.fetch): typeof globalThis.fetch;
82
+ /**
83
+ * Client options for a native provider SDK under the switch (null when off): the scripted
84
+ * model's base for that provider, a placeholder key, and the credential-free fetch.
85
+ */
86
+ export declare function simulatorModelClientOptions(provider: "anthropic" | "openai", env?: NodeJS.ProcessEnv): {
87
+ baseURL: string;
88
+ apiKey: string;
89
+ fetch: typeof globalThis.fetch;
90
+ } | null;
91
+ /** Bedrock signs with AWS credentials and cannot be pointed at the simulator: refused under the switch. */
92
+ export declare function refuseBedrockUnderTestSimulators(env?: NodeJS.ProcessEnv): void;
@@ -0,0 +1,333 @@
1
+ /**
2
+ * WARDBY_TEST_SIMULATORS: the release regression suite's switch that points wardby's
3
+ * GitHub API base, GitHub clone URLs, the Slack and Jira API bases and the package
4
+ * registry upstreams (npm, PyPI, OSV) and the model upstreams (the coding proxy's, and the
5
+ * native Anthropic and OpenAI clients') at one simulator (tools/wardby-sim). Test only.
6
+ *
7
+ * Model requests never carry a credential to the simulator: the provider clients are built with
8
+ * a placeholder key, and every model request goes through a fetch that drops each credential
9
+ * header (createCredentialFreeFetch). Bedrock is refused under the switch (AWS-signed requests
10
+ * cannot be pointed at the simulator).
11
+ *
12
+ * It is a token-exfiltration path by design: with it on, the GitHub App JWT and
13
+ * installation tokens, the Slack bot token and the Jira token all go to whatever host
14
+ * WARDBY_SIM_BASE_URL names. So it is all-or-nothing and refuses to start, with
15
+ * `test_simulators_refused:<reason>` (the reason only, never a URL or a credential), when:
16
+ *
17
+ * - only one of WARDBY_TEST_SIMULATORS=1 and WARDBY_SIM_BASE_URL is set, or the flag is not "1";
18
+ * - the image was built for release (WARDBY_TEST_SIMULATORS_ALLOWED=0, baked at build time);
19
+ * - the base URL is not a bare http(s) origin, carries credentials, or names a host that is
20
+ * neither loopback (127.0.0.0/8, ::1, localhost) nor cluster-local (*.svc,
21
+ * *.svc.cluster.local, a single-label name);
22
+ * - production configuration is present: NODE_ENV=production; a GitHub App key that is not
23
+ * the simulator's published test key (by public-key fingerprint); a public WARDBY_HOSTNAME
24
+ * or MCP_CANONICAL_URI; a Slack bot token, Jira token or GitHub App client secret that is
25
+ * not a simulator token (xoxb-sim-…, sim-…, sim-…);
26
+ * - Jira is configured but the simulator is plain http (Jira's https-only rule stays);
27
+ * - the load-test mock upstream (WARDBY_LOAD_TEST / WARDBY_CODING_PROXY_MOCK_UPSTREAM) is also set.
28
+ *
29
+ * Under the switch, a host provider's tokens go to the simulator too, and only `sim-` tokens are sent
30
+ * (providers/host-tools).
31
+ */
32
+ import { createHash, createPrivateKey, createPublicKey } from "node:crypto";
33
+ import { readFileSync } from "node:fs";
34
+ import { isIP } from "node:net";
35
+ import { isAbsolute } from "node:path";
36
+ import { logger } from "../core/logger.js";
37
+ /** SHA-256 (hex) of the SPKI DER of the simulator's test GitHub App key (tools/wardby-sim/fixtures). */
38
+ export const SIMULATOR_GITHUB_APP_KEY_FINGERPRINT = "dac6c80f55da011bbd2ed5868c61972f778853069f125946964e093e51a7d141";
39
+ /** Where each simulated service is mounted under WARDBY_SIM_BASE_URL. */
40
+ export const SIMULATOR_PREFIXES = {
41
+ "github-api": "/github/api",
42
+ "github-git": "/github/git",
43
+ slack: "/slack/api",
44
+ jira: "/jira",
45
+ "bitbucket-api": "/bitbucket/api",
46
+ npm: "/npm",
47
+ pypi: "/pypi",
48
+ "pypi-files": "/pypi-files",
49
+ osv: "/osv",
50
+ /** The scripted model (tools/wardby-sim/src/model): /model/anthropic and /model/openai. */
51
+ model: "/model",
52
+ };
53
+ /** The real upstream host each registry simulator stands in for. */
54
+ export const SIMULATED_REGISTRY_HOSTS = {
55
+ "registry.npmjs.org": "npm",
56
+ "pypi.org": "pypi",
57
+ "files.pythonhosted.org": "pypi-files",
58
+ "api.osv.dev": "osv",
59
+ };
60
+ /** The real API host each host-provider simulator stands in for. */
61
+ export const SIMULATED_HOST_PROVIDER_HOSTS = {
62
+ "api.bitbucket.org": "bitbucket-api",
63
+ };
64
+ /**
65
+ * A bound tool's fetch under the switch: its API host is rewritten to the simulator, whose local
66
+ * address the policy opens for this call alone. The request has already passed the host-tool guard
67
+ * and broker checks against the real host. Every other host is refused.
68
+ */
69
+ export function simulatorHostFetch(simulators, fetchImpl) {
70
+ return async (input, init, options) => {
71
+ const parsed = new URL(input);
72
+ const service = SIMULATED_HOST_PROVIDER_HOSTS[parsed.hostname.toLowerCase()];
73
+ if (!service)
74
+ throw new Error("fetch_destination_blocked");
75
+ const host = new URL(simulators.origin).hostname.replace(/^\[|\]$/g, "");
76
+ return fetchImpl(`${simulators.base(service)}${parsed.pathname}${parsed.search}`, init, {
77
+ ...options,
78
+ allowedHosts: [host],
79
+ restrictToAllowedHosts: true,
80
+ privateHostAllowlist: [host],
81
+ });
82
+ };
83
+ }
84
+ export class TestSimulatorsRefused extends Error {
85
+ reason;
86
+ constructor(reason) {
87
+ super(`test_simulators_refused:${reason}`);
88
+ this.reason = reason;
89
+ this.name = "TestSimulatorsRefused";
90
+ }
91
+ }
92
+ /** Loopback or cluster-local: the only hosts the simulator may live on. */
93
+ export function isLocalSimulatorHost(hostname) {
94
+ const host = hostname
95
+ .toLowerCase()
96
+ .replace(/^\[|\]$/g, "")
97
+ .replace(/\.$/, "");
98
+ if (host === "")
99
+ return false;
100
+ if (host === "localhost" || host === "::1")
101
+ return true;
102
+ const ipVersion = isIP(host);
103
+ if (ipVersion === 4)
104
+ return host.split(".")[0] === "127";
105
+ if (ipVersion === 6)
106
+ return false;
107
+ if (!/^[a-z0-9.-]+$/.test(host) || host.split(".").some((label) => label === ""))
108
+ return false;
109
+ if (!host.includes("."))
110
+ return true;
111
+ return host.endsWith(".svc") || host.endsWith(".svc.cluster.local");
112
+ }
113
+ function localUrlOrUnset(value) {
114
+ const trimmed = value?.trim();
115
+ if (!trimmed)
116
+ return true;
117
+ try {
118
+ const url = new URL(trimmed.includes("://") ? trimmed : `http://${trimmed}`);
119
+ return isLocalSimulatorHost(url.hostname);
120
+ }
121
+ catch {
122
+ return false;
123
+ }
124
+ }
125
+ function keyFingerprint(pem) {
126
+ try {
127
+ const normalized = pem.includes("\\n") && !pem.includes("\n") ? pem.replaceAll("\\n", "\n") : pem;
128
+ const der = createPublicKey(createPrivateKey(normalized)).export({ type: "spki", format: "der" });
129
+ return createHash("sha256").update(der).digest("hex");
130
+ }
131
+ catch {
132
+ return null;
133
+ }
134
+ }
135
+ /**
136
+ * The simulators, or null when the switch is off. Throws TestSimulatorsRefused on any
137
+ * refusal; with the switch off nothing here reads or changes any other setting.
138
+ */
139
+ export function loadTestSimulators(env = process.env) {
140
+ const flag = env.WARDBY_TEST_SIMULATORS;
141
+ const rawBase = env.WARDBY_SIM_BASE_URL;
142
+ if (flag === undefined && rawBase === undefined)
143
+ return null;
144
+ if (flag === undefined || rawBase === undefined)
145
+ throw new TestSimulatorsRefused("partial");
146
+ if (flag !== "1")
147
+ throw new TestSimulatorsRefused("flag_value");
148
+ if (env.WARDBY_TEST_SIMULATORS_ALLOWED === "0")
149
+ throw new TestSimulatorsRefused("release_image");
150
+ let url;
151
+ try {
152
+ url = new URL(rawBase.trim());
153
+ }
154
+ catch {
155
+ throw new TestSimulatorsRefused("base_url_invalid");
156
+ }
157
+ if (url.username || url.password)
158
+ throw new TestSimulatorsRefused("base_url_credentials");
159
+ if ((url.protocol !== "http:" && url.protocol !== "https:") || url.pathname !== "/" || url.search || url.hash) {
160
+ throw new TestSimulatorsRefused("base_url_form");
161
+ }
162
+ if (!isLocalSimulatorHost(url.hostname))
163
+ throw new TestSimulatorsRefused("base_host_not_local");
164
+ if (env.NODE_ENV === "production")
165
+ throw new TestSimulatorsRefused("node_env_production");
166
+ const key = env.GITHUB_APP_PRIVATE_KEY?.trim();
167
+ if (key && keyFingerprint(key) !== SIMULATOR_GITHUB_APP_KEY_FINGERPRINT) {
168
+ throw new TestSimulatorsRefused("github_app_key_not_simulator");
169
+ }
170
+ const oauthSecret = env.GITHUB_APP_CLIENT_SECRET?.trim();
171
+ if (oauthSecret && !oauthSecret.startsWith("sim-"))
172
+ throw new TestSimulatorsRefused("github_oauth_not_simulator");
173
+ const slackToken = env.WARDBY_SLACK_BOT_TOKEN?.trim();
174
+ if (slackToken && !slackToken.startsWith("xoxb-sim-"))
175
+ throw new TestSimulatorsRefused("slack_token_not_simulator");
176
+ const jiraToken = env.WARDBY_JIRA_API_TOKEN?.trim();
177
+ if (jiraToken && !jiraToken.startsWith("sim-"))
178
+ throw new TestSimulatorsRefused("jira_token_not_simulator");
179
+ if (jiraToken && url.protocol !== "https:")
180
+ throw new TestSimulatorsRefused("jira_needs_https");
181
+ // The load-test mock upstream answers model requests itself: one model seam at a time.
182
+ if (env.WARDBY_LOAD_TEST !== undefined || env.WARDBY_CODING_PROXY_MOCK_UPSTREAM !== undefined) {
183
+ throw new TestSimulatorsRefused("model_mock_conflict");
184
+ }
185
+ if (!localUrlOrUnset(env.WARDBY_HOSTNAME) || !localUrlOrUnset(env.MCP_CANONICAL_URI)) {
186
+ throw new TestSimulatorsRefused("public_hostname");
187
+ }
188
+ const caFile = env.WARDBY_SIM_CA_FILE?.trim();
189
+ if (caFile !== undefined && !validCaFile(caFile))
190
+ throw new TestSimulatorsRefused("ca_file_invalid");
191
+ const origin = url.origin;
192
+ return {
193
+ origin,
194
+ host: url.host,
195
+ ...(caFile ? { caFile } : {}),
196
+ base: (service) => `${origin}${SIMULATOR_PREFIXES[service]}`,
197
+ };
198
+ }
199
+ function validCaFile(path) {
200
+ if (!isAbsolute(path))
201
+ return false;
202
+ try {
203
+ return readFileSync(path, "utf8").includes("-----BEGIN CERTIFICATE-----");
204
+ }
205
+ catch {
206
+ return false;
207
+ }
208
+ }
209
+ /** Extra environment for the git commands wardby runs: the simulator's CA, under the switch only. */
210
+ export function simulatorGitEnvironment(env = process.env) {
211
+ const caFile = loadTestSimulators(env)?.caFile;
212
+ return caFile ? { GIT_SSL_CAINFO: caFile } : {};
213
+ }
214
+ /** The simulator's base for one service, or null when the switch is off (throws on a refusal). */
215
+ export function testSimulatorBase(service, env = process.env) {
216
+ return loadTestSimulators(env)?.base(service) ?? null;
217
+ }
218
+ /**
219
+ * The registry upstream fetch under the switch: each real registry host (npm, PyPI, its file
220
+ * host, OSV) is rewritten to its simulator, with the same request; every other host is
221
+ * refused like the pinned fetch refuses it (`blocked`). Only https upstream URLs are taken,
222
+ * as the pinned fetch takes them.
223
+ */
224
+ export function createSimulatorRegistryFetch(simulators, blocked, fetchImpl = globalThis.fetch) {
225
+ return async (input, init = {}) => {
226
+ if (typeof input !== "string" && !(input instanceof URL))
227
+ throw blocked();
228
+ let parsed;
229
+ try {
230
+ parsed = new URL(input.toString());
231
+ }
232
+ catch {
233
+ throw blocked();
234
+ }
235
+ const service = SIMULATED_REGISTRY_HOSTS[parsed.hostname.toLowerCase()];
236
+ if (parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !service)
237
+ throw blocked();
238
+ if (init.redirect && init.redirect !== "error")
239
+ throw blocked();
240
+ return fetchImpl(`${simulators.base(service)}${parsed.pathname}${parsed.search}`, { ...init, redirect: "error" });
241
+ };
242
+ }
243
+ /**
244
+ * Process start-up: refuses (throws) on any refusal, and with the switch on logs one loud
245
+ * warning naming the simulator's host only.
246
+ */
247
+ export function startupTestSimulators(component, env = process.env) {
248
+ const simulators = loadTestSimulators(env);
249
+ if (simulators) {
250
+ logger.warn({ module: "test-simulators", event: "test_simulators.enabled", component, host: simulators.host }, "TEST SIMULATORS ENABLED: GitHub, Slack, Jira and package-registry traffic goes to the simulator. Never use this on a real deployment.");
251
+ }
252
+ return simulators;
253
+ }
254
+ /** Header names that can carry a credential; none of them reaches the simulator's model endpoints. */
255
+ const CREDENTIAL_HEADER = /authorization|api[-_]?key|token|secret|cookie|organization|project|credential|signature|session/i;
256
+ /** A placeholder the provider SDKs require; createCredentialFreeFetch drops it before sending. */
257
+ export const SIMULATOR_PLACEHOLDER_API_KEY = "sim-placeholder-not-a-credential";
258
+ /**
259
+ * A fetch to the simulator only: drops every header that can carry a credential, and refuses
260
+ * any URL outside the simulator's origin (`blocked`).
261
+ */
262
+ export function createCredentialFreeFetch(simulators, blocked, fetchImpl = globalThis.fetch) {
263
+ return async (input, init = {}) => {
264
+ const url = input instanceof Request ? input.url : input.toString();
265
+ let parsed;
266
+ try {
267
+ parsed = new URL(url);
268
+ }
269
+ catch {
270
+ throw blocked();
271
+ }
272
+ if (parsed.origin !== simulators.origin || parsed.username || parsed.password)
273
+ throw blocked();
274
+ const headers = new Headers(input instanceof Request ? input.headers : undefined);
275
+ new Headers(init.headers).forEach((value, name) => headers.set(name, value));
276
+ for (const name of [...headers.keys()])
277
+ if (CREDENTIAL_HEADER.test(name))
278
+ headers.delete(name);
279
+ const body = init.body ?? (input instanceof Request ? await input.text() : undefined);
280
+ return fetchImpl(parsed.toString(), {
281
+ ...init,
282
+ headers,
283
+ ...(body !== undefined ? { body } : {}),
284
+ redirect: "error",
285
+ });
286
+ };
287
+ }
288
+ /** The real model upstream each scripted model path stands in for (the coding proxy's two). */
289
+ const SIMULATED_MODEL_URLS = [
290
+ ["https://api.openai.com/v1/responses", "/openai/v1/responses"],
291
+ ["https://api.anthropic.com/v1/messages", "/anthropic/v1/messages"],
292
+ ];
293
+ /**
294
+ * The coding proxy's model upstream under the switch: the OpenAI Responses and Anthropic
295
+ * Messages endpoints go to the scripted model, with no credential; every other URL is refused.
296
+ */
297
+ export function createSimulatorModelFetch(simulators, blocked, fetchImpl = globalThis.fetch) {
298
+ const send = createCredentialFreeFetch(simulators, blocked, fetchImpl);
299
+ return async (input, init = {}) => {
300
+ if (typeof input !== "string" && !(input instanceof URL))
301
+ throw blocked();
302
+ let parsed;
303
+ try {
304
+ parsed = new URL(input.toString());
305
+ }
306
+ catch {
307
+ throw blocked();
308
+ }
309
+ const match = SIMULATED_MODEL_URLS.find(([real]) => `${parsed.origin}${parsed.pathname}` === real);
310
+ if (!match || parsed.username || parsed.password)
311
+ throw blocked();
312
+ return send(`${simulators.base("model")}${match[1]}${parsed.search}`, init);
313
+ };
314
+ }
315
+ /**
316
+ * Client options for a native provider SDK under the switch (null when off): the scripted
317
+ * model's base for that provider, a placeholder key, and the credential-free fetch.
318
+ */
319
+ export function simulatorModelClientOptions(provider, env = process.env) {
320
+ const simulators = loadTestSimulators(env);
321
+ if (!simulators)
322
+ return null;
323
+ return {
324
+ baseURL: `${simulators.base("model")}${provider === "anthropic" ? "/anthropic" : "/openai/v1"}`,
325
+ apiKey: SIMULATOR_PLACEHOLDER_API_KEY,
326
+ fetch: createCredentialFreeFetch(simulators, () => new Error("test_simulators_model_egress_blocked")),
327
+ };
328
+ }
329
+ /** Bedrock signs with AWS credentials and cannot be pointed at the simulator: refused under the switch. */
330
+ export function refuseBedrockUnderTestSimulators(env = process.env) {
331
+ if (loadTestSimulators(env))
332
+ throw new TestSimulatorsRefused("bedrock_not_simulated");
333
+ }
@@ -0,0 +1 @@
1
+ export declare function loadToolMaxTimeoutMs(env?: NodeJS.ProcessEnv): number;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * WARDBY_TOOL_MAX_TIMEOUT_MS: the longest time limit a sandboxed tool may ask for with its own
3
+ * `timeoutMs`. Default 300000 (five minutes); at least the default tool limit (10000), so a tool
4
+ * that sets no `timeoutMs` always keeps its 10 seconds.
5
+ */
6
+ import { DEFAULT_TOOL_MAX_TIMEOUT_MS, DEFAULT_TOOL_TIMEOUT_MS } from "../sandbox/tool-timeout.js";
7
+ /** Above this a setTimeout no longer waits (it fires at once). */
8
+ const MAX_TIMER_MS = 2_147_483_647;
9
+ export function loadToolMaxTimeoutMs(env = process.env) {
10
+ const raw = env.WARDBY_TOOL_MAX_TIMEOUT_MS?.trim();
11
+ if (raw === undefined || raw === "")
12
+ return DEFAULT_TOOL_MAX_TIMEOUT_MS;
13
+ const value = /^\d+$/.test(raw) ? Number(raw) : NaN;
14
+ if (!Number.isSafeInteger(value) || value < DEFAULT_TOOL_TIMEOUT_MS || value > MAX_TIMER_MS) {
15
+ throw new Error(`WARDBY_TOOL_MAX_TIMEOUT_MS must be a whole number of milliseconds from ${DEFAULT_TOOL_TIMEOUT_MS} to ${MAX_TIMER_MS}.`);
16
+ }
17
+ return value;
18
+ }
@@ -0,0 +1,2 @@
1
+ /** Calls `fn` outside every async context, as if from the top level: what it starts is not part of the caller's run. */
2
+ export declare function outsideRunContext<T>(fn: () => T): T;
@@ -0,0 +1,12 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ /**
3
+ * Captured when this module loads, outside any run: the empty async context.
4
+ * Work a run's code sets off in the background otherwise inherits that run's
5
+ * context, including a DBOS workflow step's, and DBOS refuses to start a
6
+ * workflow (a new run) from inside a step.
7
+ */
8
+ const atLoad = AsyncLocalStorage.snapshot();
9
+ /** Calls `fn` outside every async context, as if from the top level: what it starts is not part of the caller's run. */
10
+ export function outsideRunContext(fn) {
11
+ return atLoad(fn);
12
+ }