@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
@@ -0,0 +1,86 @@
1
+ /**
2
+ * A model request's hold: what the proxy reserves against the run's budget before forwarding it.
3
+ * After a mostly cached reply in the same conversation, the part of the prompt the previous reply
4
+ * read from (or wrote to) the cache is priced at the cache-read rate; everything else, including
5
+ * what the body grew by (one token per byte), at the input + cache-write rates. Capped at the
6
+ * ceiling, today's worst case (the whole body as uncached input), which a reply may never exceed.
7
+ */
8
+ import { createHash } from "node:crypto";
9
+ import { estimateReservationUsd } from "./metering.js";
10
+ /**
11
+ * Anthropic's prompt cache lives 5 minutes from when a request is processed, not from when its reply
12
+ * finishes: a previous request sent longer ago than this says nothing about the cache.
13
+ */
14
+ export const CACHE_WINDOW_MS = 5 * 60_000;
15
+ export const MIN_CACHED_SHARE = 0.5;
16
+ function withoutCacheControl(value) {
17
+ if (Array.isArray(value))
18
+ return value.map(withoutCacheControl);
19
+ if (!value || typeof value !== "object")
20
+ return value;
21
+ return Object.fromEntries(Object.entries(value)
22
+ .filter(([key]) => key !== "cache_control")
23
+ .map(([key, inner]) => [key, withoutCacheControl(inner)]));
24
+ }
25
+ /**
26
+ * What identifies one conversation within a run (Claude Code runs several: the main one and its
27
+ * sub-agents). Anthropic: the first message without cache markers (the system prompt carries a
28
+ * per-version billing line). OpenAI: prompt_cache_key, else instructions + the first input item.
29
+ */
30
+ export function conversationKey(protocol, body) {
31
+ let basis;
32
+ if (protocol === "anthropic-messages") {
33
+ const messages = body.messages;
34
+ if (!Array.isArray(messages) || messages.length === 0)
35
+ return null;
36
+ // Claude Code's first message can carry the date, so a conversation crossing midnight starts a
37
+ // new key (its next request falls back to the worst case once).
38
+ basis = ["anthropic", withoutCacheControl(messages[0])];
39
+ }
40
+ else if (typeof body.prompt_cache_key === "string" && body.prompt_cache_key) {
41
+ basis = ["openai-key", body.prompt_cache_key];
42
+ }
43
+ else {
44
+ const input = body.input;
45
+ const first = typeof input === "string" ? input : Array.isArray(input) ? input[0] : undefined;
46
+ if (first === undefined)
47
+ return null;
48
+ basis = ["openai-first", body.instructions ?? null, first];
49
+ }
50
+ return createHash("sha256").update(JSON.stringify(basis)).digest("base64url");
51
+ }
52
+ export function estimateHold(input) {
53
+ const ceilingUsd = estimateReservationUsd(input.bodyBytes, input.maxOutputTokens, input.pricing);
54
+ const full = (fallback) => ({ holdUsd: ceilingUsd, ceilingUsd, basis: "full", fallback });
55
+ const previous = input.previous;
56
+ if (!previous)
57
+ return full("no_previous");
58
+ if (previous.model !== input.model)
59
+ return full("model_changed");
60
+ if (previous.costEstimated)
61
+ return full("previous_estimated");
62
+ if (previous.status !== "completed" || !previous.usage)
63
+ return full("previous_not_completed");
64
+ if (previous.requestBytes === null)
65
+ return full("no_request_bytes");
66
+ if (input.now.getTime() - previous.startedAt.getTime() > CACHE_WINDOW_MS)
67
+ return full("cache_expired");
68
+ if (input.bodyBytes < previous.requestBytes)
69
+ return full("body_shrank");
70
+ const usage = previous.usage;
71
+ const prevPrompt = usage.inputTokens + usage.cacheWriteTokens;
72
+ const cachedTokens = input.protocol === "anthropic-messages"
73
+ ? usage.cachedInputTokens + usage.cacheWriteTokens
74
+ : usage.cachedInputTokens;
75
+ if (prevPrompt <= 0 || cachedTokens < prevPrompt * MIN_CACHED_SHARE)
76
+ return full("low_cache_share");
77
+ const uncachedTokens = prevPrompt + (input.bodyBytes - previous.requestBytes) - cachedTokens;
78
+ const { pricing } = input;
79
+ const cacheReadRate = pricing.cachedInputPerMTok ?? pricing.inputPerMTok;
80
+ const cacheWriteRate = pricing.cacheWritePerMTok ?? pricing.inputPerMTok;
81
+ const holdUsd = (cachedTokens * cacheReadRate +
82
+ uncachedTokens * (pricing.inputPerMTok + cacheWriteRate) +
83
+ input.maxOutputTokens * pricing.outputPerMTok) /
84
+ 1_000_000;
85
+ return { holdUsd: Math.min(holdUsd, ceilingUsd), ceilingUsd, basis: "cached", cachedTokens, uncachedTokens };
86
+ }
@@ -0,0 +1,70 @@
1
+ import { type ModelPricing } from "../llm/pricing-core.js";
2
+ import type { PreviousReply, ProxyUsage } from "./types.js";
3
+ export interface InterruptedFacts {
4
+ /** Anthropic message_start usage already read (inputTokens includes cache reads, not writes). */
5
+ readUsage?: {
6
+ inputTokens: number;
7
+ cachedInputTokens: number;
8
+ cacheWriteTokens: number;
9
+ };
10
+ /** Output tokens the upstream reported so far (Anthropic message_delta), if any. */
11
+ reportedOutputTokens?: number;
12
+ /** message_start's output count: a placeholder (usually 1), so only a floor, never the count. */
13
+ outputFloorTokens?: number;
14
+ /** A stream that failed before its response started: the provider generated no output. */
15
+ beforeResponse?: boolean;
16
+ /** UTF-8 bytes of output relayed to the client before the break: text, tool input, thinking. */
17
+ relayedOutputBytes: number;
18
+ /** The input of the request's own prompt, from its conversation's previous reply (previousInput). */
19
+ previous?: ProxyUsage;
20
+ /** UTF-8 bytes of the request body the proxy forwarded, when known. */
21
+ bodyBytes?: number;
22
+ /** Median outputTokens of the session's completed replies for the same model, if any. */
23
+ medianOutputTokens?: number;
24
+ /** The request's hold and the output tokens it reserved for. */
25
+ reservationUsd: number;
26
+ maxOutputTokens: number;
27
+ /** The request's worst case (its ceiling); the estimate never exceeds it. Defaults to the hold. */
28
+ ceilingUsd?: number;
29
+ }
30
+ export interface InterruptedEstimate {
31
+ usage: ProxyUsage;
32
+ costUsd: number;
33
+ }
34
+ /** Output tokens for relayed text: ceil(bytes / 3), a deliberately high count. */
35
+ export declare function relayedOutputTokens(bytes: number): number;
36
+ /**
37
+ * Prompt tokens for request-body bytes in a settled estimate: ceil(bytes / 3), the same high count
38
+ * as the native gateway's byte estimate. Coding-agent bodies are mostly code, JSON and English,
39
+ * which tokenize at about 3.5 to 4.5 bytes a token, so a token per 3 bytes stays above the real
40
+ * count. Text that tokenizes tighter is mostly multi-byte UTF-8 (3 bytes a character, rarely more
41
+ * than a token each), and base64 images are billed by size, not bytes, so both still lean high.
42
+ * The hold itself still counts a token per byte (hold.ts): this is only the settled estimate.
43
+ */
44
+ export declare function bodyInputTokens(bytes: number): number;
45
+ /**
46
+ * The input of a cut request from its conversation's previous reply: that reply's prompt and cache
47
+ * split, plus the body's growth since (bodyInputTokens) as uncached input (uncachedInput).
48
+ * Undefined when that reply can't stand for this prompt, as for the hold (hold.ts): another model,
49
+ * estimated or unfinished, an unknown or larger body, or a cache that had expired by the time the
50
+ * request was reserved. The estimate then prices the whole body as uncached input.
51
+ */
52
+ export declare function previousInput(input: {
53
+ model: string;
54
+ bodyBytes: number | undefined;
55
+ previous: PreviousReply | null;
56
+ pricing: ModelPricing;
57
+ /** When the request was reserved: the hold's own clock. */
58
+ now: Date;
59
+ }): ProxyUsage | undefined;
60
+ /**
61
+ * The best known cost of a reply that broke before its final usage (spec PR 1
62
+ * › 1b): usage already read, else the input from its conversation's previous
63
+ * reply (previousInput), else the whole body as uncached input
64
+ * (bodyInputTokens), else (body size unknown) the input part of the hold; plus
65
+ * the output seen so far. With no output seen, the model's median completed
66
+ * reply, or none while there is no completed reply (a deliberate rule: one cut
67
+ * must not book a whole reserved reply). A stream that failed before its
68
+ * response started generated none. Never more than the request's worst case.
69
+ */
70
+ export declare function estimateInterrupted(facts: InterruptedFacts, pricing: ModelPricing): InterruptedEstimate;
@@ -0,0 +1,104 @@
1
+ import { computeCost } from "../llm/pricing-core.js";
2
+ import { CACHE_WINDOW_MS } from "./hold.js";
3
+ /** Output tokens for relayed text: ceil(bytes / 3), a deliberately high count. */
4
+ export function relayedOutputTokens(bytes) {
5
+ return bytes > 0 ? Math.ceil(bytes / 3) : 0;
6
+ }
7
+ /**
8
+ * Prompt tokens for request-body bytes in a settled estimate: ceil(bytes / 3), the same high count
9
+ * as the native gateway's byte estimate. Coding-agent bodies are mostly code, JSON and English,
10
+ * which tokenize at about 3.5 to 4.5 bytes a token, so a token per 3 bytes stays above the real
11
+ * count. Text that tokenizes tighter is mostly multi-byte UTF-8 (3 bytes a character, rarely more
12
+ * than a token each), and base64 images are billed by size, not bytes, so both still lean high.
13
+ * The hold itself still counts a token per byte (hold.ts): this is only the settled estimate.
14
+ */
15
+ export function bodyInputTokens(bytes) {
16
+ return bytes > 0 ? Math.ceil(bytes / 3) : 0;
17
+ }
18
+ /**
19
+ * New prompt tokens as usage, at the higher of the model's fresh-input and cache-write rates: the
20
+ * provider may write them to its cache (Claude Code marks the latest message; OpenAI GPT-5.6 and
21
+ * later bill cache writes above input), or bill them as input.
22
+ */
23
+ function uncachedInput(tokens, pricing) {
24
+ const written = (pricing.cacheWritePerMTok ?? pricing.inputPerMTok) > pricing.inputPerMTok;
25
+ return { inputTokens: written ? 0 : tokens, cacheWriteTokens: written ? tokens : 0 };
26
+ }
27
+ /**
28
+ * The input of a cut request from its conversation's previous reply: that reply's prompt and cache
29
+ * split, plus the body's growth since (bodyInputTokens) as uncached input (uncachedInput).
30
+ * Undefined when that reply can't stand for this prompt, as for the hold (hold.ts): another model,
31
+ * estimated or unfinished, an unknown or larger body, or a cache that had expired by the time the
32
+ * request was reserved. The estimate then prices the whole body as uncached input.
33
+ */
34
+ export function previousInput(input) {
35
+ const { previous, bodyBytes } = input;
36
+ if (!previous || previous.model !== input.model || previous.costEstimated)
37
+ return undefined;
38
+ if (previous.status !== "completed" || !previous.usage)
39
+ return undefined;
40
+ if (bodyBytes === undefined || previous.requestBytes === null || bodyBytes < previous.requestBytes)
41
+ return undefined;
42
+ if (input.now.getTime() - previous.startedAt.getTime() > CACHE_WINDOW_MS)
43
+ return undefined;
44
+ const growth = uncachedInput(bodyInputTokens(bodyBytes - previous.requestBytes), input.pricing);
45
+ const usage = previous.usage;
46
+ return {
47
+ inputTokens: usage.inputTokens + growth.inputTokens,
48
+ cachedInputTokens: usage.cachedInputTokens,
49
+ cacheWriteTokens: usage.cacheWriteTokens + growth.cacheWriteTokens,
50
+ outputTokens: 0,
51
+ reasoningTokens: 0,
52
+ };
53
+ }
54
+ /**
55
+ * The best known cost of a reply that broke before its final usage (spec PR 1
56
+ * › 1b): usage already read, else the input from its conversation's previous
57
+ * reply (previousInput), else the whole body as uncached input
58
+ * (bodyInputTokens), else (body size unknown) the input part of the hold; plus
59
+ * the output seen so far. With no output seen, the model's median completed
60
+ * reply, or none while there is no completed reply (a deliberate rule: one cut
61
+ * must not book a whole reserved reply). A stream that failed before its
62
+ * response started generated none. Never more than the request's worst case.
63
+ */
64
+ export function estimateInterrupted(facts, pricing) {
65
+ const relayed = relayedOutputTokens(facts.relayedOutputBytes);
66
+ const output = relayed > 0 || facts.beforeResponse ? relayed : (facts.medianOutputTokens ?? 0);
67
+ const clamp = (cost) => Math.max(0, Math.min(cost, facts.ceilingUsd ?? facts.reservationUsd));
68
+ if (facts.readUsage) {
69
+ const usage = {
70
+ ...facts.readUsage,
71
+ outputTokens: facts.reportedOutputTokens ?? Math.max(facts.outputFloorTokens ?? 0, output),
72
+ reasoningTokens: 0,
73
+ };
74
+ return { usage, costUsd: clamp(computeCost(pricing, usage)) };
75
+ }
76
+ if (facts.previous) {
77
+ const usage = {
78
+ inputTokens: facts.previous.inputTokens,
79
+ cachedInputTokens: facts.previous.cachedInputTokens,
80
+ cacheWriteTokens: facts.previous.cacheWriteTokens,
81
+ outputTokens: output,
82
+ reasoningTokens: 0,
83
+ };
84
+ return { usage, costUsd: clamp(computeCost(pricing, usage)) };
85
+ }
86
+ if (facts.bodyBytes !== undefined) {
87
+ const usage = {
88
+ ...uncachedInput(bodyInputTokens(facts.bodyBytes), pricing),
89
+ cachedInputTokens: 0,
90
+ outputTokens: output,
91
+ reasoningTokens: 0,
92
+ };
93
+ return { usage, costUsd: clamp(computeCost(pricing, usage)) };
94
+ }
95
+ const usage = {
96
+ inputTokens: 0,
97
+ cachedInputTokens: 0,
98
+ cacheWriteTokens: 0,
99
+ outputTokens: output,
100
+ reasoningTokens: 0,
101
+ };
102
+ const inputPart = facts.reservationUsd - (facts.maxOutputTokens * pricing.outputPerMTok) / 1_000_000;
103
+ return { usage, costUsd: clamp(inputPart + (usage.outputTokens * pricing.outputPerMTok) / 1_000_000) };
104
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The coding proxy's /mcp route (remote MCP servers, phase 2): the worker's MCP server URL. It
3
+ * checks the run's MCP token (`rmt_…`, WARDBY_MCP_TOKEN in the worker) against the proxy session,
4
+ * then forwards the JSON-RPC body unchanged, with the same Authorization, to the native gateway's
5
+ * /coding-mcp route (WARDBY_MCP_GATEWAY_URL), which checks the token again and runs the call. The
6
+ * proxy never sees an MCP server URL or secret; the gateway redacts results before they get here.
7
+ *
8
+ * Secrets: the token is only hashed and forwarded, never logged or echoed. The route's log line
9
+ * carries the session id, a sanitized JSON-RPC method, the status and a fixed reason code only:
10
+ * never the body, the token or an error's text. Every body this route writes is fixed text or the
11
+ * gateway's answer, unchanged.
12
+ */
13
+ import type { IncomingMessage, ServerResponse } from "node:http";
14
+ import type { ProxyLedger } from "./types.js";
15
+ export declare const MCP_ROUTE_PATH = "/mcp";
16
+ /** The longest a forwarded call may take, when the session's deadline is later. */
17
+ export declare const MCP_FORWARD_MAX_MS: number;
18
+ export declare const MCP_UNAVAILABLE_MESSAGE = "MCP tools aren't available on this server.";
19
+ /**
20
+ * A JSON-RPC method as the log may carry it: its first 64 characters when they are letters, `/`
21
+ * and `_` only, else "other". Anything that starts like an MCP token is "other" too.
22
+ */
23
+ export declare function mcpLogMethod(value: unknown): string;
24
+ export interface McpRouteOptions {
25
+ ledger: Pick<ProxyLedger, "findSessionByMcpTokenHash">;
26
+ /** The native gateway's base URL; without one, /mcp answers 503 mcp_unavailable. */
27
+ gatewayUrl: string | undefined;
28
+ fetchImpl?: typeof fetch;
29
+ now?: () => Date;
30
+ log?: {
31
+ info(fields: Record<string, unknown>, message: string): void;
32
+ };
33
+ }
34
+ export declare function createMcpRoute(options: McpRouteOptions): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
@@ -0,0 +1,166 @@
1
+ import { isMcpToken, mcpTokenHash, MCP_TOKEN_REQUIRED_MESSAGE } from "../../coding/mcp-token.js";
2
+ import { logger } from "../../core/logger.js";
3
+ import { HTTP_LIMITS, HttpBoundaryError, readBodyBytes } from "../../mcp/transport/http-limits.js";
4
+ export const MCP_ROUTE_PATH = "/mcp";
5
+ /** The gateway's route this one forwards to. */
6
+ const GATEWAY_PATH = "/coding-mcp";
7
+ /** The longest a forwarded call may take, when the session's deadline is later. */
8
+ export const MCP_FORWARD_MAX_MS = 5 * 60_000;
9
+ /** The largest gateway answer relayed (a tool result is text the model reads; same as a model request). */
10
+ const MAX_GATEWAY_RESPONSE_BYTES = 8 * 1024 * 1024;
11
+ export const MCP_UNAVAILABLE_MESSAGE = "MCP tools aren't available on this server.";
12
+ const MCP_UNREACHABLE_MESSAGE = "MCP tools can't be reached right now.";
13
+ const LOG_METHOD = /^[A-Za-z/_]+$/;
14
+ /**
15
+ * A JSON-RPC method as the log may carry it: its first 64 characters when they are letters, `/`
16
+ * and `_` only, else "other". Anything that starts like an MCP token is "other" too.
17
+ */
18
+ export function mcpLogMethod(value) {
19
+ if (typeof value !== "string")
20
+ return "other";
21
+ const method = value.slice(0, 64);
22
+ return LOG_METHOD.test(method) && !method.includes("rmt_") ? method : "other";
23
+ }
24
+ function methodOf(body) {
25
+ try {
26
+ const message = JSON.parse(body.toString("utf8"));
27
+ return mcpLogMethod(message?.method);
28
+ }
29
+ catch {
30
+ return "other";
31
+ }
32
+ }
33
+ class GatewayError extends Error {
34
+ reason;
35
+ constructor(reason) {
36
+ super(reason);
37
+ this.reason = reason;
38
+ }
39
+ }
40
+ const JSON_HEADERS = { "content-type": "application/json", "cache-control": "no-store" };
41
+ const rpcError = (code, message) => JSON.stringify({ jsonrpc: "2.0", id: null, error: { code, message } });
42
+ async function readGatewayBody(response) {
43
+ const chunks = [];
44
+ let size = 0;
45
+ if (!response.body)
46
+ return Buffer.alloc(0);
47
+ for await (const chunk of response.body) {
48
+ size += chunk.byteLength;
49
+ if (size > MAX_GATEWAY_RESPONSE_BYTES) {
50
+ void response.body.cancel().catch(() => undefined);
51
+ throw new GatewayError("gateway_response_too_large");
52
+ }
53
+ chunks.push(Buffer.from(chunk));
54
+ }
55
+ return Buffer.concat(chunks, size);
56
+ }
57
+ export function createMcpRoute(options) {
58
+ const fetchImpl = options.fetchImpl ?? fetch;
59
+ const now = options.now ?? (() => new Date());
60
+ const log = options.log ?? logger.child({ module: "coding-proxy" });
61
+ const gatewayUrl = options.gatewayUrl?.replace(/\/+$/, "");
62
+ return async (req, res) => {
63
+ const startedAt = performance.now();
64
+ const seen = {};
65
+ /** Refused before the body was read: close the connection rather than read what is still coming. */
66
+ const closeIfBodyUnread = () => {
67
+ if (!req.complete && !res.headersSent)
68
+ res.setHeader("connection", "close");
69
+ };
70
+ const send = (status, body, headers = JSON_HEADERS) => {
71
+ res.writeHead(status, headers).end(body);
72
+ };
73
+ try {
74
+ if (req.method !== "POST") {
75
+ closeIfBodyUnread();
76
+ res.setHeader("allow", "POST");
77
+ if (req.method === "HEAD")
78
+ res.writeHead(405, JSON_HEADERS).end();
79
+ else
80
+ send(405, rpcError(-32600, "Use POST."));
81
+ return;
82
+ }
83
+ if (!gatewayUrl) {
84
+ closeIfBodyUnread();
85
+ send(503, JSON.stringify({ error: "mcp_unavailable", message: MCP_UNAVAILABLE_MESSAGE }));
86
+ return;
87
+ }
88
+ const token = /^Bearer (\S+)$/.exec(req.headers.authorization ?? "")?.[1];
89
+ const session = isMcpToken(token)
90
+ ? await options.ledger.findSessionByMcpTokenHash(mcpTokenHash(token))
91
+ : undefined;
92
+ const at = now().getTime();
93
+ if (!session || session.status !== "active" || at >= session.deadlineAt.getTime()) {
94
+ // No WWW-Authenticate: a client must not start OAuth discovery against this route.
95
+ closeIfBodyUnread();
96
+ send(401, rpcError(-32001, MCP_TOKEN_REQUIRED_MESSAGE));
97
+ return;
98
+ }
99
+ seen.sessionId = session.id;
100
+ if (req.headers["content-type"]?.split(";", 1)[0].trim().toLowerCase() !== "application/json") {
101
+ closeIfBodyUnread();
102
+ send(415, rpcError(-32600, "Send one JSON-RPC message as application/json."));
103
+ return;
104
+ }
105
+ let body;
106
+ try {
107
+ body = await readBodyBytes(req, HTTP_LIMITS.json, AbortSignal.timeout(HTTP_LIMITS.requestMs));
108
+ }
109
+ catch (error) {
110
+ closeIfBodyUnread();
111
+ send(error instanceof HttpBoundaryError ? error.status : 400, rpcError(-32600, "The request body could not be read."));
112
+ return;
113
+ }
114
+ seen.method = methodOf(body);
115
+ // The call may take as long as it needs, up to the run's deadline or MCP_FORWARD_MAX_MS. The
116
+ // server's requestTimeout covers receiving the request only, which is over by now.
117
+ const controller = new AbortController();
118
+ const timer = setTimeout(() => controller.abort(new GatewayError("gateway_timeout")), Math.min(MCP_FORWARD_MAX_MS, session.deadlineAt.getTime() - at));
119
+ const clientGone = () => {
120
+ if (!res.writableFinished)
121
+ controller.abort(new GatewayError("client_disconnected"));
122
+ };
123
+ res.once("close", clientGone);
124
+ try {
125
+ const upstream = await fetchImpl(`${gatewayUrl}${GATEWAY_PATH}`, {
126
+ method: "POST",
127
+ headers: { authorization: req.headers.authorization, "content-type": "application/json" },
128
+ body: new Uint8Array(body),
129
+ redirect: "error",
130
+ signal: controller.signal,
131
+ });
132
+ const answer = await readGatewayBody(upstream);
133
+ send(upstream.status, answer, {
134
+ "content-type": upstream.headers.get("content-type") ?? "application/json",
135
+ "cache-control": "no-store",
136
+ });
137
+ }
138
+ catch (error) {
139
+ const reason = controller.signal.reason instanceof GatewayError ? controller.signal.reason.reason : undefined;
140
+ throw error instanceof GatewayError ? error : new GatewayError(reason ?? "gateway_unreachable");
141
+ }
142
+ finally {
143
+ clearTimeout(timer);
144
+ res.off("close", clientGone);
145
+ }
146
+ }
147
+ catch (error) {
148
+ // Nothing of the error's text leaves or is logged: only a fixed reason code.
149
+ seen.reason = error instanceof GatewayError ? error.reason : "gateway_unreachable";
150
+ if (!res.headersSent)
151
+ send(502, JSON.stringify({ error: "mcp_unavailable", message: MCP_UNREACHABLE_MESSAGE }));
152
+ else
153
+ res.destroy();
154
+ }
155
+ finally {
156
+ log.info({
157
+ event: "mcp.request",
158
+ ...(seen.sessionId ? { sessionId: seen.sessionId } : {}),
159
+ ...(seen.method ? { method: seen.method } : {}),
160
+ status: res.statusCode,
161
+ ...(seen.reason ? { reason: seen.reason } : {}),
162
+ durationMs: Math.round(performance.now() - startedAt),
163
+ }, "coding proxy mcp request");
164
+ }
165
+ };
166
+ }
@@ -1,18 +1,33 @@
1
- import { type CreateProxySessionInput, type ProxyLedger, type ProxyRequest, type ProxySession, type ProxyUsage, type ReserveProxyRequestInput, type ReserveProxyRequestResult } from "./types.js";
1
+ import { type PreviousReply, type CreateProxySessionInput, type ProxyLedger, type ProxyRefusalRecord, type ProxyRequest, type ProxySession, type ProxyUsage, type ReserveProxyRequestInput, type ReserveProxyRequestResult } from "./types.js";
2
2
  /** Deterministic contract adapter. Sharing one instance simulates a proxy restart. */
3
3
  export declare class MemoryProxyLedger implements ProxyLedger {
4
+ private readonly options;
4
5
  private readonly sessions;
5
6
  private readonly sessionByCapability;
7
+ private readonly sessionByMcpToken;
6
8
  private readonly requests;
7
9
  private readonly requestBySessionKey;
10
+ private readonly startedAt;
11
+ constructor(options?: {
12
+ now?: () => Date;
13
+ });
8
14
  createSession(input: CreateProxySessionInput): Promise<void>;
15
+ findSessionByMcpTokenHash(mcpTokenHash: string): Promise<ProxySession | undefined>;
9
16
  findSessionByCapabilityHash(capabilityHash: string): Promise<ProxySession | null>;
10
17
  reserve(input: ReserveProxyRequestInput): Promise<ReserveProxyRequestResult>;
11
18
  complete(requestId: string, usage: ProxyUsage, actualCostUsd: number, upstreamStatus: number): Promise<ProxyRequest>;
12
19
  release(requestId: string, upstreamStatus: number): Promise<void>;
13
- markUncertain(requestId: string, upstreamStatus?: number): Promise<void>;
20
+ markUncertain(requestId: string, upstreamStatus?: number, estimate?: {
21
+ usage: ProxyUsage;
22
+ costUsd: number;
23
+ }): Promise<void>;
24
+ settlementHints(sessionId: string, model: string): Promise<{
25
+ medianOutputTokens?: number;
26
+ }>;
27
+ previousReply(sessionId: string, conversationKey: string): Promise<PreviousReply | null>;
14
28
  cancelSession(sessionId: string): Promise<void>;
15
29
  budgetExhausted(sessionId: string): Promise<boolean>;
30
+ budgetRefusal(sessionId: string): Promise<ProxyRefusalRecord | null>;
16
31
  recordUpstreamFailure(sessionId: string, code: string): Promise<void>;
17
32
  upstreamFailure(sessionId: string): Promise<string | null>;
18
33
  getRequest(requestId: string): Promise<ProxyRequest | null>;