@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
@@ -0,0 +1,305 @@
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
+ import { createHash, createPrivateKey, createPublicKey } from "node:crypto";
30
+ import { readFileSync } from "node:fs";
31
+ import { isIP } from "node:net";
32
+ import { isAbsolute } from "node:path";
33
+ import { logger } from "../core/logger.js";
34
+ /** SHA-256 (hex) of the SPKI DER of the simulator's test GitHub App key (tools/wardby-sim/fixtures). */
35
+ export const SIMULATOR_GITHUB_APP_KEY_FINGERPRINT = "dac6c80f55da011bbd2ed5868c61972f778853069f125946964e093e51a7d141";
36
+ /** Where each simulated service is mounted under WARDBY_SIM_BASE_URL. */
37
+ export const SIMULATOR_PREFIXES = {
38
+ "github-api": "/github/api",
39
+ "github-git": "/github/git",
40
+ slack: "/slack/api",
41
+ jira: "/jira",
42
+ npm: "/npm",
43
+ pypi: "/pypi",
44
+ "pypi-files": "/pypi-files",
45
+ osv: "/osv",
46
+ /** The scripted model (tools/wardby-sim/src/model): /model/anthropic and /model/openai. */
47
+ model: "/model",
48
+ };
49
+ /** The real upstream host each registry simulator stands in for. */
50
+ export const SIMULATED_REGISTRY_HOSTS = {
51
+ "registry.npmjs.org": "npm",
52
+ "pypi.org": "pypi",
53
+ "files.pythonhosted.org": "pypi-files",
54
+ "api.osv.dev": "osv",
55
+ };
56
+ export class TestSimulatorsRefused extends Error {
57
+ reason;
58
+ constructor(reason) {
59
+ super(`test_simulators_refused:${reason}`);
60
+ this.reason = reason;
61
+ this.name = "TestSimulatorsRefused";
62
+ }
63
+ }
64
+ /** Loopback or cluster-local: the only hosts the simulator may live on. */
65
+ export function isLocalSimulatorHost(hostname) {
66
+ const host = hostname
67
+ .toLowerCase()
68
+ .replace(/^\[|\]$/g, "")
69
+ .replace(/\.$/, "");
70
+ if (host === "")
71
+ return false;
72
+ if (host === "localhost" || host === "::1")
73
+ return true;
74
+ const ipVersion = isIP(host);
75
+ if (ipVersion === 4)
76
+ return host.split(".")[0] === "127";
77
+ if (ipVersion === 6)
78
+ return false;
79
+ if (!/^[a-z0-9.-]+$/.test(host) || host.split(".").some((label) => label === ""))
80
+ return false;
81
+ if (!host.includes("."))
82
+ return true;
83
+ return host.endsWith(".svc") || host.endsWith(".svc.cluster.local");
84
+ }
85
+ function localUrlOrUnset(value) {
86
+ const trimmed = value?.trim();
87
+ if (!trimmed)
88
+ return true;
89
+ try {
90
+ const url = new URL(trimmed.includes("://") ? trimmed : `http://${trimmed}`);
91
+ return isLocalSimulatorHost(url.hostname);
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ }
97
+ function keyFingerprint(pem) {
98
+ try {
99
+ const normalized = pem.includes("\\n") && !pem.includes("\n") ? pem.replaceAll("\\n", "\n") : pem;
100
+ const der = createPublicKey(createPrivateKey(normalized)).export({ type: "spki", format: "der" });
101
+ return createHash("sha256").update(der).digest("hex");
102
+ }
103
+ catch {
104
+ return null;
105
+ }
106
+ }
107
+ /**
108
+ * The simulators, or null when the switch is off. Throws TestSimulatorsRefused on any
109
+ * refusal; with the switch off nothing here reads or changes any other setting.
110
+ */
111
+ export function loadTestSimulators(env = process.env) {
112
+ const flag = env.WARDBY_TEST_SIMULATORS;
113
+ const rawBase = env.WARDBY_SIM_BASE_URL;
114
+ if (flag === undefined && rawBase === undefined)
115
+ return null;
116
+ if (flag === undefined || rawBase === undefined)
117
+ throw new TestSimulatorsRefused("partial");
118
+ if (flag !== "1")
119
+ throw new TestSimulatorsRefused("flag_value");
120
+ if (env.WARDBY_TEST_SIMULATORS_ALLOWED === "0")
121
+ throw new TestSimulatorsRefused("release_image");
122
+ let url;
123
+ try {
124
+ url = new URL(rawBase.trim());
125
+ }
126
+ catch {
127
+ throw new TestSimulatorsRefused("base_url_invalid");
128
+ }
129
+ if (url.username || url.password)
130
+ throw new TestSimulatorsRefused("base_url_credentials");
131
+ if ((url.protocol !== "http:" && url.protocol !== "https:") || url.pathname !== "/" || url.search || url.hash) {
132
+ throw new TestSimulatorsRefused("base_url_form");
133
+ }
134
+ if (!isLocalSimulatorHost(url.hostname))
135
+ throw new TestSimulatorsRefused("base_host_not_local");
136
+ if (env.NODE_ENV === "production")
137
+ throw new TestSimulatorsRefused("node_env_production");
138
+ const key = env.GITHUB_APP_PRIVATE_KEY?.trim();
139
+ if (key && keyFingerprint(key) !== SIMULATOR_GITHUB_APP_KEY_FINGERPRINT) {
140
+ throw new TestSimulatorsRefused("github_app_key_not_simulator");
141
+ }
142
+ const oauthSecret = env.GITHUB_APP_CLIENT_SECRET?.trim();
143
+ if (oauthSecret && !oauthSecret.startsWith("sim-"))
144
+ throw new TestSimulatorsRefused("github_oauth_not_simulator");
145
+ const slackToken = env.WARDBY_SLACK_BOT_TOKEN?.trim();
146
+ if (slackToken && !slackToken.startsWith("xoxb-sim-"))
147
+ throw new TestSimulatorsRefused("slack_token_not_simulator");
148
+ const jiraToken = env.WARDBY_JIRA_API_TOKEN?.trim();
149
+ if (jiraToken && !jiraToken.startsWith("sim-"))
150
+ throw new TestSimulatorsRefused("jira_token_not_simulator");
151
+ if (jiraToken && url.protocol !== "https:")
152
+ throw new TestSimulatorsRefused("jira_needs_https");
153
+ // The load-test mock upstream answers model requests itself: one model seam at a time.
154
+ if (env.WARDBY_LOAD_TEST !== undefined || env.WARDBY_CODING_PROXY_MOCK_UPSTREAM !== undefined) {
155
+ throw new TestSimulatorsRefused("model_mock_conflict");
156
+ }
157
+ if (!localUrlOrUnset(env.WARDBY_HOSTNAME) || !localUrlOrUnset(env.MCP_CANONICAL_URI)) {
158
+ throw new TestSimulatorsRefused("public_hostname");
159
+ }
160
+ const caFile = env.WARDBY_SIM_CA_FILE?.trim();
161
+ if (caFile !== undefined && !validCaFile(caFile))
162
+ throw new TestSimulatorsRefused("ca_file_invalid");
163
+ const origin = url.origin;
164
+ return {
165
+ origin,
166
+ host: url.host,
167
+ ...(caFile ? { caFile } : {}),
168
+ base: (service) => `${origin}${SIMULATOR_PREFIXES[service]}`,
169
+ };
170
+ }
171
+ function validCaFile(path) {
172
+ if (!isAbsolute(path))
173
+ return false;
174
+ try {
175
+ return readFileSync(path, "utf8").includes("-----BEGIN CERTIFICATE-----");
176
+ }
177
+ catch {
178
+ return false;
179
+ }
180
+ }
181
+ /** Extra environment for the git commands wardby runs: the simulator's CA, under the switch only. */
182
+ export function simulatorGitEnvironment(env = process.env) {
183
+ const caFile = loadTestSimulators(env)?.caFile;
184
+ return caFile ? { GIT_SSL_CAINFO: caFile } : {};
185
+ }
186
+ /** The simulator's base for one service, or null when the switch is off (throws on a refusal). */
187
+ export function testSimulatorBase(service, env = process.env) {
188
+ return loadTestSimulators(env)?.base(service) ?? null;
189
+ }
190
+ /**
191
+ * The registry upstream fetch under the switch: each real registry host (npm, PyPI, its file
192
+ * host, OSV) is rewritten to its simulator, with the same request; every other host is
193
+ * refused like the pinned fetch refuses it (`blocked`). Only https upstream URLs are taken,
194
+ * as the pinned fetch takes them.
195
+ */
196
+ export function createSimulatorRegistryFetch(simulators, blocked, fetchImpl = globalThis.fetch) {
197
+ return async (input, init = {}) => {
198
+ if (typeof input !== "string" && !(input instanceof URL))
199
+ throw blocked();
200
+ let parsed;
201
+ try {
202
+ parsed = new URL(input.toString());
203
+ }
204
+ catch {
205
+ throw blocked();
206
+ }
207
+ const service = SIMULATED_REGISTRY_HOSTS[parsed.hostname.toLowerCase()];
208
+ if (parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !service)
209
+ throw blocked();
210
+ if (init.redirect && init.redirect !== "error")
211
+ throw blocked();
212
+ return fetchImpl(`${simulators.base(service)}${parsed.pathname}${parsed.search}`, { ...init, redirect: "error" });
213
+ };
214
+ }
215
+ /**
216
+ * Process start-up: refuses (throws) on any refusal, and with the switch on logs one loud
217
+ * warning naming the simulator's host only.
218
+ */
219
+ export function startupTestSimulators(component, env = process.env) {
220
+ const simulators = loadTestSimulators(env);
221
+ if (simulators) {
222
+ 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.");
223
+ }
224
+ return simulators;
225
+ }
226
+ /** Header names that can carry a credential; none of them reaches the simulator's model endpoints. */
227
+ const CREDENTIAL_HEADER = /authorization|api[-_]?key|token|secret|cookie|organization|project|credential|signature|session/i;
228
+ /** A placeholder the provider SDKs require; createCredentialFreeFetch drops it before sending. */
229
+ export const SIMULATOR_PLACEHOLDER_API_KEY = "sim-placeholder-not-a-credential";
230
+ /**
231
+ * A fetch to the simulator only: drops every header that can carry a credential, and refuses
232
+ * any URL outside the simulator's origin (`blocked`).
233
+ */
234
+ export function createCredentialFreeFetch(simulators, blocked, fetchImpl = globalThis.fetch) {
235
+ return async (input, init = {}) => {
236
+ const url = input instanceof Request ? input.url : input.toString();
237
+ let parsed;
238
+ try {
239
+ parsed = new URL(url);
240
+ }
241
+ catch {
242
+ throw blocked();
243
+ }
244
+ if (parsed.origin !== simulators.origin || parsed.username || parsed.password)
245
+ throw blocked();
246
+ const headers = new Headers(input instanceof Request ? input.headers : undefined);
247
+ new Headers(init.headers).forEach((value, name) => headers.set(name, value));
248
+ for (const name of [...headers.keys()])
249
+ if (CREDENTIAL_HEADER.test(name))
250
+ headers.delete(name);
251
+ const body = init.body ?? (input instanceof Request ? await input.text() : undefined);
252
+ return fetchImpl(parsed.toString(), {
253
+ ...init,
254
+ headers,
255
+ ...(body !== undefined ? { body } : {}),
256
+ redirect: "error",
257
+ });
258
+ };
259
+ }
260
+ /** The real model upstream each scripted model path stands in for (the coding proxy's two). */
261
+ const SIMULATED_MODEL_URLS = [
262
+ ["https://api.openai.com/v1/responses", "/openai/v1/responses"],
263
+ ["https://api.anthropic.com/v1/messages", "/anthropic/v1/messages"],
264
+ ];
265
+ /**
266
+ * The coding proxy's model upstream under the switch: the OpenAI Responses and Anthropic
267
+ * Messages endpoints go to the scripted model, with no credential; every other URL is refused.
268
+ */
269
+ export function createSimulatorModelFetch(simulators, blocked, fetchImpl = globalThis.fetch) {
270
+ const send = createCredentialFreeFetch(simulators, blocked, fetchImpl);
271
+ return async (input, init = {}) => {
272
+ if (typeof input !== "string" && !(input instanceof URL))
273
+ throw blocked();
274
+ let parsed;
275
+ try {
276
+ parsed = new URL(input.toString());
277
+ }
278
+ catch {
279
+ throw blocked();
280
+ }
281
+ const match = SIMULATED_MODEL_URLS.find(([real]) => `${parsed.origin}${parsed.pathname}` === real);
282
+ if (!match || parsed.username || parsed.password)
283
+ throw blocked();
284
+ return send(`${simulators.base("model")}${match[1]}${parsed.search}`, init);
285
+ };
286
+ }
287
+ /**
288
+ * Client options for a native provider SDK under the switch (null when off): the scripted
289
+ * model's base for that provider, a placeholder key, and the credential-free fetch.
290
+ */
291
+ export function simulatorModelClientOptions(provider, env = process.env) {
292
+ const simulators = loadTestSimulators(env);
293
+ if (!simulators)
294
+ return null;
295
+ return {
296
+ baseURL: `${simulators.base("model")}${provider === "anthropic" ? "/anthropic" : "/openai/v1"}`,
297
+ apiKey: SIMULATOR_PLACEHOLDER_API_KEY,
298
+ fetch: createCredentialFreeFetch(simulators, () => new Error("test_simulators_model_egress_blocked")),
299
+ };
300
+ }
301
+ /** Bedrock signs with AWS credentials and cannot be pointed at the simulator: refused under the switch. */
302
+ export function refuseBedrockUnderTestSimulators(env = process.env) {
303
+ if (loadTestSimulators(env))
304
+ throw new TestSimulatorsRefused("bedrock_not_simulated");
305
+ }
@@ -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
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * The record of a budget refusal (by the coding proxy, or at dispatch), or of
3
+ * an overrun top-up a coding run's group or run tree had no room for, with its
4
+ * numbers and the limit that bound it, and the sentences later surfaces build
5
+ * from it. Details hold amounts, the model, the turn and names; never secrets
6
+ * or message text.
7
+ */
8
+ import type { PrismaClient } from "#prisma";
9
+ export type BudgetLimit = "run" | "run-tree" | "day" | "week" | "month";
10
+ /** A proxy refusal: the next model request's hold did not fit. */
11
+ export interface ProxyRefusalDetails {
12
+ source: "proxy";
13
+ budgetUsd: number;
14
+ spentUsd: number;
15
+ heldReservedUsd: number;
16
+ heldUncertainUsd: number;
17
+ refusedHoldUsd: number;
18
+ /** How the refused hold was priced, and its worst case; absent on records from before cache-aware holds. */
19
+ refusedHoldBasis?: "cached" | "full";
20
+ refusedHoldCeilingUsd?: number;
21
+ model: string;
22
+ /** Completed (incl. estimated) requests + 1. */
23
+ turn: number;
24
+ /** Filled at read time (budget event names); never stored, and dropped if a stored row has them. */
25
+ agentBudgetUsd?: number;
26
+ /** Filled at read time: the run's budget before its allowed overrun, when the agent had one. */
27
+ baseBudgetUsd?: number;
28
+ /** Filled at read time: the most the run could have been topped up to (CodingRun.budgetLimitUsd). */
29
+ limitUsd?: number;
30
+ groupName?: string;
31
+ leadAgentName?: string;
32
+ }
33
+ /** A dispatch refusal: the group or run tree had nothing left. */
34
+ export interface DispatchRefusalDetails {
35
+ source: "dispatch";
36
+ capUsd: number;
37
+ spentUsd: number;
38
+ heldUsd: number;
39
+ heldRuns: number;
40
+ groupName?: string;
41
+ leadAgentName?: string;
42
+ }
43
+ /**
44
+ * A coding run's overrun top-up its budget group or run tree had no room for
45
+ * (budget-topup.ts). Written by the control plane; the numbers are those of
46
+ * the limiting cap or tree, and the run's base, grant and limit.
47
+ */
48
+ export interface TopUpRefusalDetails {
49
+ source: "top-up";
50
+ capUsd: number;
51
+ spentUsd: number;
52
+ heldUsd: number;
53
+ /** What the group or tree had left. */
54
+ leftUsd: number;
55
+ baseBudgetUsd: number;
56
+ /** What the run had been granted: its base plus the top-ups so far. */
57
+ grantedUsd: number;
58
+ limitUsd: number;
59
+ /** The group whose cap was full, for a period limit (it can be the lead's group, not the run's). */
60
+ groupName?: string;
61
+ /** Filled at read time, for a run-tree limit. */
62
+ leadAgentName?: string;
63
+ }
64
+ export type BudgetEventDetails = ProxyRefusalDetails | DispatchRefusalDetails | TopUpRefusalDetails;
65
+ /** An overrun_unavailable event, as a refusal that followed it carries it. */
66
+ export interface OverrunUnavailableView {
67
+ limit: BudgetLimit;
68
+ details: TopUpRefusalDetails;
69
+ }
70
+ export interface BudgetEventView {
71
+ kind: "refused" | "overrun_unavailable";
72
+ limit: BudgetLimit;
73
+ at: string;
74
+ details: BudgetEventDetails;
75
+ /** On a proxy refusal (loadBudgetEvent): the run's overrun top-up that found no room before it. */
76
+ overrun?: OverrunUnavailableView;
77
+ }
78
+ /** Sentence for the run owner (run error, lead's sub-agent result, get_run consumers). */
79
+ export declare function ownerBudgetSentence(event: BudgetEventView, agentName: string): string;
80
+ /** Sentence for a host comment: amounts and group name only. */
81
+ export declare function hostBudgetSentence(event: BudgetEventView): string;
82
+ /** Records a refusal; best effort, never throws (a record must not change the refusal). */
83
+ export declare function recordBudgetEvent(db: Pick<PrismaClient, "runBudgetEvent">, runId: string, limit: BudgetLimit, details: BudgetEventDetails): Promise<void>;
84
+ /**
85
+ * A proxy refusal rebuilt from only its stored amounts, model and turn, or
86
+ * null when any is missing or malformed. The proxy (a less-trusted role)
87
+ * writes the source record, so nothing else it wrote is kept: names are
88
+ * filled at read time from the database.
89
+ */
90
+ export declare function proxyRefusalDetails(raw: unknown): ProxyRefusalDetails | null;
91
+ /** The run's latest well-formed budget refusal, or null. Never throws. */
92
+ export declare function latestBudgetEvent(db: Pick<PrismaClient, "runBudgetEvent">, runId: string): Promise<BudgetEventView | null>;
93
+ /**
94
+ * The run's latest budget refusal with names filled in from its agent, budget
95
+ * group and (for a run-tree limit) the tree root. A proxy refusal carries the
96
+ * run's overrun_unavailable event, when its overrun top-up found no room.
97
+ * Never throws; null when there is none.
98
+ */
99
+ export declare function loadBudgetEvent(db: Pick<PrismaClient, "run" | "runBudgetEvent">, runId: string): Promise<{
100
+ event: BudgetEventView;
101
+ agentName: string;
102
+ } | null>;
103
+ /**
104
+ * Every well-formed budget event of the run, oldest first, with names filled
105
+ * in as loadBudgetEvent does (the run and tree are read once for all of
106
+ * them). If the names cannot be read the events are returned without them.
107
+ */
108
+ export declare function loadBudgetEvents(db: Pick<PrismaClient, "run" | "runBudgetEvent">, runId: string): Promise<BudgetEventView[]>;