@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
@@ -95,6 +95,10 @@ export interface FetchMetadataOptions {
95
95
  export interface MetadataRoute {
96
96
  kind: "metadata";
97
97
  name: string;
98
+ /** One exact version's document instead of the whole package's
99
+ * (npm's `/<name>/<version>`, which corepack reads); only for adapters
100
+ * with `renderVersion`. */
101
+ version?: string;
98
102
  }
99
103
  export interface DownloadRoute {
100
104
  kind: "download";
@@ -132,6 +136,13 @@ export interface DeclaredDependency {
132
136
  key: string;
133
137
  name: string;
134
138
  range: string;
139
+ /** PyPI only: the extras the declaring line asks of the dependency
140
+ * (`uvicorn[standard]`), normalized. Absent when it asks none. */
141
+ extras?: readonly string[];
142
+ /** PyPI only: the parent's extras the line is gated on (`extra == "test"`);
143
+ * an empty list is a gate that could not be read, never followed. Absent
144
+ * for an ungated line. */
145
+ when?: readonly string[];
135
146
  }
136
147
  /** One installed package a lockfile claims, where it installs it. None of
137
148
  * it is trusted: the plan verifies every registry entry against the
@@ -152,19 +163,37 @@ export interface LockfileEntry {
152
163
  /** Why an `unsupported` entry is refused. */
153
164
  unsupportedReason?: string;
154
165
  }
155
- /** A parsed lockfile: its entries, the projects whose declared
156
- * dependencies are where reachability starts (the root, workspaces), and
157
- * the client's own rule for which entry a declared dependency uses. */
166
+ /** A parsed lockfile: its entries, the projects it declares (the root and
167
+ * workspaces; kept for parsing and diagnostics, no longer where plan
168
+ * reachability starts), and the client's own rule for which entry a
169
+ * declared dependency uses. */
158
170
  export interface ParsedLockfile {
159
171
  entries: readonly LockfileEntry[];
160
172
  projects: readonly {
161
173
  path: string;
162
174
  dependencies: readonly DeclaredDependency[];
163
175
  }[];
176
+ /** What an entry's integrity is checked against. `lockfile` (the
177
+ * default): the entry's own `integrity` must equal the registry's, and
178
+ * one without any is refused. `registry`: the lockfile records no npm
179
+ * integrity at all (yarn Berry's `checksum` is yarn's hash of its own
180
+ * cache archive), so entries are approved as exact name@version pairs
181
+ * and each download is checked against the registry's integrity alone. */
182
+ integrity?: "lockfile" | "registry";
164
183
  /** The entry that `key`, declared by the package at `fromPath`, resolves
165
184
  * to (npm: the nearest ancestor `node_modules/<key>`), or undefined
166
185
  * (not installed, or a local project). */
167
186
  resolve(fromPath: string, key: string): LockfileEntry | undefined;
187
+ /** Every entry `key` may resolve to from `fromPath`, when the lockfile can
188
+ * pin one name at several versions without saying which a parent uses
189
+ * (a requirements file's marker-split pins); the plan keeps those inside
190
+ * the declared range. Omitted when `resolve` is exact. */
191
+ resolveAll?(fromPath: string, key: string): readonly LockfileEntry[];
192
+ /** The dependency keys the lockfile itself lists for the entry at
193
+ * `path`, when `resolve` answers only for those (pnpm, yarn). Such a
194
+ * lockfile can be parsed in a worker thread and shipped back as an edge
195
+ * table; npm's rule (any ancestor folder) cannot. */
196
+ dependencyKeys?(path: string): readonly string[];
168
197
  }
169
198
  /** Immutable facts about one published version, read from the registry
170
199
  * itself (never from a lockfile): stored once, reused forever. */
@@ -184,6 +213,12 @@ export interface VersionFact {
184
213
  * registry reads only. Every decision (integrity, edges, reachability,
185
214
  * release age, advisories) is the registry core's. */
186
215
  export interface LockfilePlanSupport {
216
+ /** What an approval grants. `versions` (the default): exact name@version
217
+ * pairs, each download served directly and checked against the approved
218
+ * integrity (npm: one tarball per version). `names`: an allowance for the
219
+ * name only, so downloads keep every usual per-file check (PyPI: a
220
+ * release has many files, wheels only, each with its own release age). */
221
+ readonly approves?: "versions" | "names";
187
222
  /** Parse a lockfile. Throws a RegistryError for one it cannot verify
188
223
  * (unsupported version: 400 `wardby_lockfile_unsupported`; invalid:
189
224
  * 400 `wardby_bad_request`; more than `maxEntries` entries: 413
@@ -194,8 +229,9 @@ export interface LockfilePlanSupport {
194
229
  maxEntries: number;
195
230
  proxyRegistryUrl: string;
196
231
  }): ParsedLockfile;
197
- /** The registry's own record of one version, without its publish time;
198
- * null when the registry has no such version. */
232
+ /** The registry's own record of one version, with or without its publish
233
+ * time (`publishedAt` null: read with fetchPublishTimes); null when the
234
+ * registry has no such version. */
199
235
  fetchVersionFact(name: string, version: string, upstream: UpstreamFetch, signal?: AbortSignal): Promise<VersionFact | null>;
200
236
  /** Publish times of `versions` of one package, read by streaming the
201
237
  * package's full document without ever holding it. A version the
@@ -207,6 +243,13 @@ export interface LockfilePlanSupport {
207
243
  /** Whether a dependency declared as `range` accepts `version`, as the
208
244
  * client itself decides it when it reuses a locked version. */
209
245
  edgeSatisfies(version: string, range: string): boolean;
246
+ /** The dependencies of a version installed with `extras` (PyPI), from its
247
+ * fact; omitted when every declared dependency is always an edge (npm). */
248
+ dependenciesOf?(fact: VersionFact, extras: readonly string[]): readonly DeclaredDependency[];
249
+ /** Whether `body` should be parsed in a worker thread rather than on the
250
+ * proxy's event loop (a YAML or yarn lockfile, which is far costlier to
251
+ * read than JSON). Its parse must provide `dependencyKeys`. */
252
+ parsesOffThread?(body: string): boolean;
210
253
  }
211
254
  export interface WorkerConfigInput {
212
255
  /** e.g. "http://wardby-proxy:8787/registry/npm/" */
@@ -237,8 +280,9 @@ export interface RegistryAdapter {
237
280
  /** Whether fetchMetadata's VersionInfo.dependencies is complete (npm's
238
281
  * packuments carry every version's dependencies). When true, the core
239
282
  * may resolve a run's approved dependency graph from metadata alone,
240
- * on demand, before refusing a name (a lockfile install requests
241
- * tarballs without first requesting each parent's metadata). False for
283
+ * on demand, before refusing a download (a lockfile install requests
284
+ * tarballs without first requesting each parent's metadata; a metadata
285
+ * request never walks). False for
242
286
  * ecosystems whose indexes omit dependencies (PyPI), where such a walk
243
287
  * would only make upstream calls and find nothing. */
244
288
  readonly dependenciesInMetadata: boolean;
@@ -246,7 +290,8 @@ export interface RegistryAdapter {
246
290
  * public URLs, applied before the workspace is collected (lockfiles.ts). Omitted when the client records none. */
247
291
  readonly lockfiles?: {
248
292
  names: readonly string[];
249
- normalize(content: string, registryUrl: string): string;
293
+ /** `name` is the lockfile's file name (one of `names`). */
294
+ normalize(content: string, registryUrl: string, name: string): string;
250
295
  };
251
296
  /** Lockfile verification (`POST /registry/<id>/-/plan`); omitted when the
252
297
  * ecosystem has none. */
@@ -279,6 +324,11 @@ export interface RegistryAdapter {
279
324
  * core's per-file release-age filter), with every download link
280
325
  * rewritten to a proxy route. */
281
326
  renderMetadata(meta: PackageMetadata, keep: ReadonlySet<string>, keptFiles: ReadonlySet<string>, proxyBase: string): RenderedDocument;
327
+ /** The client-facing document for one kept version (a metadata route
328
+ * with `version`), its download rewritten to a proxy route; null when
329
+ * the version or its file is not kept. Omitted when the ecosystem has
330
+ * no per-version documents. */
331
+ renderVersion?(meta: PackageMetadata, version: string, keptFiles: ReadonlySet<string>, proxyBase: string): RenderedDocument | null;
282
332
  /** Map a download route to a file in metadata the proxy fetched itself.
283
333
  * Returns null if the route names no known file. */
284
334
  resolveDownload(route: DownloadRoute, meta: PackageMetadata): FileRef | null;
@@ -0,0 +1,30 @@
1
+ import { type ParsedLockfile } from "./types.js";
2
+ export declare function parseYarnClassicLockfile(body: string, options: {
3
+ maxEntries: number;
4
+ proxyRegistryUrl: string;
5
+ }): ParsedLockfile;
6
+ export declare function parseYarnBerryLockfile(document: Record<string, unknown>, options: {
7
+ maxEntries: number;
8
+ proxyRegistryUrl: string;
9
+ }): ParsedLockfile;
10
+ /** A `yarn.lock` of either generation: classic when it carries the
11
+ * `# yarn lockfile v1` marker, Berry when it has a `__metadata` section. */
12
+ export declare function parseYarnLockfile(body: string, options: {
13
+ maxEntries: number;
14
+ proxyRegistryUrl: string;
15
+ }): ParsedLockfile;
16
+ /** Whether `body` is a yarn classic lockfile (its marker comment within
17
+ * the first lines). */
18
+ export declare function isYarnClassicLockfile(body: string): boolean;
19
+ /** Whether `body` is a yarn Berry lockfile: a `__metadata:` mapping at the
20
+ * top level. */
21
+ export declare function isYarnBerryLockfile(body: string): boolean;
22
+ /**
23
+ * Rewrites what yarn records of the proxy in a `yarn.lock` to public URLs:
24
+ * a classic lockfile's `resolved` URLs become yarn's default registry URL
25
+ * for the same package and version (keeping the `#sha1` fragment yarn
26
+ * appends), and a Berry lockfile's `__archiveUrl` parameter pointing at the
27
+ * proxy is dropped (Berry records one only for a download URL other than
28
+ * the registry's conventional one). Only matched values change.
29
+ */
30
+ export declare function normalizeYarnLockfile(content: string, registryUrl: string): string;
@@ -0,0 +1,367 @@
1
+ /**
2
+ * yarn lockfiles for npm lockfile plans (`POST /registry/npm/-/plan`) and
3
+ * for the rewrite of proxy URLs before collection:
4
+ *
5
+ * - yarn classic (1.x) `yarn.lock`, "# yarn lockfile v1": yarn's own
6
+ * indentation format, read here by a small line parser (no YAML). Each
7
+ * entry records the `resolved` download URL and npm's `integrity`.
8
+ * - yarn Berry (2+) `yarn.lock`: YAML with a `__metadata` section. Each
9
+ * entry records `resolution: "name@npm:x.y.z"` and a `checksum`, which is
10
+ * yarn's own hash of its cache archive, not npm's integrity: entries are
11
+ * approved as exact name@version pairs, and each download is checked
12
+ * against the registry's own integrity (ParsedLockfile.integrity).
13
+ *
14
+ * yarn resolves a dependency by its descriptor (`name@range`, as the
15
+ * parent's entry lists it), never by folder: `resolve` does the same.
16
+ * Workspaces, `link:`, `portal:`, `file:`, `exec:` and `patch:` entries are
17
+ * local (never fetched from the registry: a patch applies to an npm entry
18
+ * listed in its own right) and skipped; git, URL and other non-registry
19
+ * sources are refused. Nothing here decides anything: plan.ts verifies
20
+ * every claim against the registry.
21
+ *
22
+ * Kept free of imports from npm.ts, which imports this module.
23
+ */
24
+ import { parseProxyPath, publicNpmTarballUrl } from "./npm-lockfile.js";
25
+ import { registryDependencyEdges } from "./npm-plan.js";
26
+ import { YARN_CLASSIC_REGISTRY, badRequest, buildResolve, entryOf, fromRegistry, isLocal, mapOf, parseLockfileYaml, splitDescriptor, stringOf, tooLarge, yamlEntryLines, } from "./lockfile-shared.js";
27
+ import { RegistryError } from "./types.js";
28
+ /** A lockfile's line limit for the classic parser, far above any real one
29
+ * for the entry bound, so a pathological body is refused early. */
30
+ const MAX_LINES_PER_ENTRY = 64;
31
+ // --- yarn classic (v1) ---------------------------------------------------
32
+ /** One `key value`, `key:` or `"quoted key" "quoted value"` line, unquoted. */
33
+ function tokens(line, lineNumber) {
34
+ const out = [];
35
+ let at = 0;
36
+ while (at < line.length) {
37
+ if (line[at] === " ") {
38
+ at += 1;
39
+ continue;
40
+ }
41
+ if (line[at] === '"') {
42
+ let end = at + 1;
43
+ while (end < line.length && line[end] !== '"')
44
+ end += line[end] === "\\" ? 2 : 1;
45
+ if (end >= line.length)
46
+ throw badRequest(`yarn.lock line ${lineNumber} has an unterminated string`);
47
+ try {
48
+ out.push(JSON.parse(line.slice(at, end + 1)));
49
+ }
50
+ catch {
51
+ throw badRequest(`yarn.lock line ${lineNumber} has an invalid string`);
52
+ }
53
+ at = end + 1;
54
+ }
55
+ else {
56
+ let end = at;
57
+ while (end < line.length && line[end] !== " ")
58
+ end += 1;
59
+ out.push(line.slice(at, end));
60
+ at = end;
61
+ }
62
+ }
63
+ return out;
64
+ }
65
+ /** The descriptors a header line (`"a@^1", a@^1.2:`) names. */
66
+ function headerDescriptors(header, lineNumber) {
67
+ if (!header.endsWith(":"))
68
+ throw badRequest(`yarn.lock line ${lineNumber} is not an entry header`);
69
+ return header
70
+ .slice(0, -1)
71
+ .split(/,\s*/)
72
+ .map((part) => {
73
+ const [descriptor, ...rest] = tokens(part.trim(), lineNumber);
74
+ if (!descriptor || rest.length > 0)
75
+ throw badRequest(`yarn.lock line ${lineNumber} has an invalid descriptor`);
76
+ return descriptor;
77
+ });
78
+ }
79
+ function readClassic(body, maxEntries) {
80
+ const lines = body.split(/\r?\n/);
81
+ if (lines.length > (maxEntries + 1) * MAX_LINES_PER_ENTRY)
82
+ throw tooLarge(lines.length, maxEntries);
83
+ const entries = [];
84
+ let current;
85
+ let section;
86
+ lines.forEach((line, index) => {
87
+ const lineNumber = index + 1;
88
+ if (line.trim() === "" || line.startsWith("#"))
89
+ return;
90
+ const indent = line.length - line.trimStart().length;
91
+ const text = line.trim();
92
+ if (indent === 0) {
93
+ current = { descriptors: headerDescriptors(text, lineNumber), fields: new Map(), dependencies: new Map() };
94
+ entries.push(current);
95
+ if (entries.length > maxEntries)
96
+ throw tooLarge(entries.length, maxEntries);
97
+ section = undefined;
98
+ return;
99
+ }
100
+ if (!current)
101
+ throw badRequest(`yarn.lock line ${lineNumber} is outside any entry`);
102
+ if (indent === 2) {
103
+ if (text.endsWith(":")) {
104
+ const [field] = tokens(text.slice(0, -1), lineNumber);
105
+ // Only these two sections name what an entry installs.
106
+ section =
107
+ field === "dependencies" || field === "optionalDependencies"
108
+ ? current.dependencies
109
+ : new Map();
110
+ return;
111
+ }
112
+ const [field, value, ...rest] = tokens(text, lineNumber);
113
+ if (field === undefined || value === undefined || rest.length > 0)
114
+ throw badRequest(`yarn.lock line ${lineNumber} is not a "key value" pair`);
115
+ current.fields.set(field, value);
116
+ section = undefined;
117
+ return;
118
+ }
119
+ if (indent === 4 && section) {
120
+ const [key, value, ...rest] = tokens(text, lineNumber);
121
+ if (key === undefined || value === undefined || rest.length > 0)
122
+ throw badRequest(`yarn.lock line ${lineNumber} is not a "name range" pair`);
123
+ section.set(key, value);
124
+ return;
125
+ }
126
+ throw badRequest(`yarn.lock line ${lineNumber} has unexpected indentation`);
127
+ });
128
+ return entries;
129
+ }
130
+ export function parseYarnClassicLockfile(body, options) {
131
+ const entries = [];
132
+ const byPath = new Map();
133
+ const byDescriptor = new Map();
134
+ const referenced = new Set();
135
+ for (const raw of readClassic(body, options.maxEntries)) {
136
+ for (const [key, range] of raw.dependencies)
137
+ referenced.add(`${key}@${range}`);
138
+ const path = raw.descriptors[0];
139
+ if (byPath.has(path))
140
+ throw badRequest(`yarn.lock lists "${path}" twice`);
141
+ const first = splitDescriptor(path);
142
+ let target = null;
143
+ if (!isLocal(first.range)) {
144
+ // An alias (`x-cjs@npm:x@^4`) installs its target.
145
+ let name = first.name;
146
+ if (first.range.startsWith("npm:"))
147
+ name = splitDescriptor(first.range.slice("npm:".length)).name;
148
+ const resolved = raw.fields.get("resolved");
149
+ target = entryOf(path, name, raw.fields.get("version") ?? "", raw.fields.get("integrity") ?? null, resolved !== undefined && fromRegistry(resolved, options.proxyRegistryUrl) ? "registry" : "elsewhere");
150
+ entries.push(target);
151
+ }
152
+ byPath.set(path, { dependencies: raw.dependencies });
153
+ for (const descriptor of raw.descriptors) {
154
+ if (byDescriptor.has(descriptor))
155
+ throw badRequest(`yarn.lock lists "${descriptor}" twice`);
156
+ byDescriptor.set(descriptor, target);
157
+ }
158
+ }
159
+ return {
160
+ entries,
161
+ projects: classicProjects(byPath, byDescriptor, referenced),
162
+ ...buildResolve(byPath, byDescriptor, (key, range) => [`${key}@${range}`]),
163
+ };
164
+ }
165
+ /**
166
+ * yarn classic records no project section: the root's and workspaces'
167
+ * declarations live only in their package.json files. A descriptor no
168
+ * entry depends on can only come from one of them, so those stand in for
169
+ * the projects (one declaration per key each, so a name declared at two
170
+ * ranges gives a second project). A descriptor a project shares with an
171
+ * entry's dependency is not seen here. The stand-ins are added to `byPath`
172
+ * under paths no entry uses, for `resolve`.
173
+ */
174
+ function classicProjects(byPath, byDescriptor, referenced) {
175
+ const layers = [];
176
+ const seen = new Map();
177
+ for (const descriptor of byDescriptor.keys()) {
178
+ if (referenced.has(descriptor))
179
+ continue;
180
+ const { name: key, range } = splitDescriptor(descriptor);
181
+ const at = seen.get(key) ?? 0;
182
+ seen.set(key, at + 1);
183
+ (layers[at] ??= new Map()).set(key, range);
184
+ }
185
+ const projects = [];
186
+ layers.forEach((dependencies, at) => {
187
+ const path = at === 0 ? "." : `.#${at}`;
188
+ if (byPath.has(path))
189
+ return;
190
+ byPath.set(path, { dependencies });
191
+ projects.push({ path, dependencies: registryDependencyEdges(Object.fromEntries(dependencies)) });
192
+ });
193
+ return projects;
194
+ }
195
+ // --- yarn Berry ----------------------------------------------------------
196
+ /** `name@npm:1.2.3` (with any `::param=value` suffix), or null for another
197
+ * protocol. */
198
+ function npmResolution(resolution) {
199
+ const { name, range } = splitDescriptor(resolution);
200
+ if (!range.startsWith("npm:"))
201
+ return null;
202
+ const [version, ...params] = range.slice("npm:".length).split("::");
203
+ let archiveUrl;
204
+ for (const param of params.join("&").split("&")) {
205
+ if (param.startsWith("__archiveUrl=")) {
206
+ try {
207
+ archiveUrl = decodeURIComponent(param.slice("__archiveUrl=".length));
208
+ }
209
+ catch {
210
+ archiveUrl = "";
211
+ }
212
+ }
213
+ }
214
+ return { name, version, ...(archiveUrl !== undefined ? { archiveUrl } : {}) };
215
+ }
216
+ /** The descriptors a Berry dependency (`key: range`) may be listed under,
217
+ * in order: a patch's own npm descriptor first (the patch entry itself is
218
+ * local), then as written, then with the default `npm:` protocol older
219
+ * lockfiles leave out. */
220
+ function berryCandidates(key, range) {
221
+ if (range.startsWith("patch:")) {
222
+ const inner = range.slice("patch:".length).split("#")[0];
223
+ try {
224
+ return [decodeURIComponent(inner), `${key}@${range}`];
225
+ }
226
+ catch {
227
+ return [`${key}@${range}`];
228
+ }
229
+ }
230
+ return /^[a-z]+:/.test(range) ? [`${key}@${range}`] : [`${key}@${range}`, `${key}@npm:${range}`];
231
+ }
232
+ /** A workspace's declared registry dependencies, Berry's `npm:` protocol
233
+ * read as npm's own spec syntax. */
234
+ function berryDeclared(dependencies) {
235
+ const specs = {};
236
+ for (const [key, value] of Object.entries(dependencies)) {
237
+ const range = stringOf(value);
238
+ if (range === undefined)
239
+ continue;
240
+ if (!range.startsWith("npm:"))
241
+ specs[key] = range;
242
+ else {
243
+ const rest = range.slice("npm:".length);
244
+ specs[key] = rest.indexOf("@", 1) > 0 ? range : rest;
245
+ }
246
+ }
247
+ return registryDependencyEdges(specs);
248
+ }
249
+ export function parseYarnBerryLockfile(document, options) {
250
+ const metadataVersion = Number(stringOf(mapOf(document.__metadata).version));
251
+ if (!Number.isInteger(metadataVersion) || metadataVersion < 4)
252
+ throw new RegistryError(400, "wardby_lockfile_unsupported", "this yarn.lock comes from a yarn release before 2.0's stable format; regenerate it with yarn 2 or later");
253
+ const keys = Object.keys(document).filter((key) => key !== "__metadata");
254
+ if (keys.length > options.maxEntries)
255
+ throw tooLarge(keys.length, options.maxEntries);
256
+ const entries = [];
257
+ const projects = [];
258
+ const byPath = new Map();
259
+ const byDescriptor = new Map();
260
+ for (const path of keys) {
261
+ const value = document[path];
262
+ if (!value || typeof value !== "object" || Array.isArray(value))
263
+ throw badRequest(`yarn.lock entry "${path}" is not a mapping`);
264
+ const entry = value;
265
+ const resolution = stringOf(entry.resolution);
266
+ if (resolution === undefined)
267
+ throw badRequest(`yarn.lock entry "${path}" has no resolution`);
268
+ const declared = mapOf(entry.dependencies);
269
+ const dependencies = new Map();
270
+ for (const [key, range] of Object.entries(declared))
271
+ if (typeof range === "string")
272
+ dependencies.set(key, range);
273
+ const { range: protocol } = splitDescriptor(resolution);
274
+ const npm = npmResolution(resolution);
275
+ let target = null;
276
+ if (npm) {
277
+ const elsewhere = npm.archiveUrl !== undefined && !fromRegistry(npm.archiveUrl, options.proxyRegistryUrl);
278
+ // Berry's checksum is not npm's integrity: none is claimed.
279
+ target = entryOf(path, npm.name, npm.version, null, elsewhere ? "elsewhere" : "registry");
280
+ entries.push(target);
281
+ }
282
+ else if (protocol.startsWith("workspace:")) {
283
+ projects.push({ path, dependencies: berryDeclared(declared) });
284
+ }
285
+ else if (!isLocal(protocol)) {
286
+ target = entryOf(path, splitDescriptor(resolution).name, stringOf(entry.version) ?? "", null, "elsewhere");
287
+ entries.push(target);
288
+ }
289
+ byPath.set(path, { dependencies });
290
+ for (const descriptor of path.split(/,\s*/)) {
291
+ if (byDescriptor.has(descriptor))
292
+ throw badRequest(`yarn.lock lists "${descriptor}" twice`);
293
+ byDescriptor.set(descriptor, target);
294
+ }
295
+ }
296
+ return {
297
+ entries,
298
+ projects,
299
+ integrity: "registry",
300
+ ...buildResolve(byPath, byDescriptor, berryCandidates),
301
+ };
302
+ }
303
+ /** A `yarn.lock` of either generation: classic when it carries the
304
+ * `# yarn lockfile v1` marker, Berry when it has a `__metadata` section. */
305
+ export function parseYarnLockfile(body, options) {
306
+ if (isYarnClassicLockfile(body))
307
+ return parseYarnClassicLockfile(body, options);
308
+ const lines = yamlEntryLines(body);
309
+ if (lines > options.maxEntries * MAX_LINES_PER_ENTRY)
310
+ throw tooLarge(lines, options.maxEntries);
311
+ return parseYarnBerryLockfile(parseLockfileYaml(body), options);
312
+ }
313
+ /** Whether `body` is a yarn classic lockfile (its marker comment within
314
+ * the first lines). */
315
+ export function isYarnClassicLockfile(body) {
316
+ return /^# yarn lockfile v1\s*$/m.test(body.slice(0, 1024));
317
+ }
318
+ /** Whether `body` is a yarn Berry lockfile: a `__metadata:` mapping at the
319
+ * top level. */
320
+ export function isYarnBerryLockfile(body) {
321
+ return /^__metadata:\s*$/m.test(body);
322
+ }
323
+ // --- Rewrite before collection -------------------------------------------
324
+ /** A ` resolved "<url>"` line of a classic lockfile. */
325
+ const CLASSIC_RESOLVED = /^(\s+resolved\s+)"([^"\\]*)"(\s*)$/gm;
326
+ /** A Berry `resolution: "name@npm:x.y.z::params"` line. */
327
+ const BERRY_PARAMETERS = /^(\s+resolution:\s+"[^"\n]*?@npm:[^":\n]*)::([^"\n]*)(".*)$/gm;
328
+ function decode(value) {
329
+ try {
330
+ return decodeURIComponent(value);
331
+ }
332
+ catch {
333
+ return null;
334
+ }
335
+ }
336
+ /**
337
+ * Rewrites what yarn records of the proxy in a `yarn.lock` to public URLs:
338
+ * a classic lockfile's `resolved` URLs become yarn's default registry URL
339
+ * for the same package and version (keeping the `#sha1` fragment yarn
340
+ * appends), and a Berry lockfile's `__archiveUrl` parameter pointing at the
341
+ * proxy is dropped (Berry records one only for a download URL other than
342
+ * the registry's conventional one). Only matched values change.
343
+ */
344
+ export function normalizeYarnLockfile(content, registryUrl) {
345
+ const base = registryUrl.endsWith("/") ? registryUrl : `${registryUrl}/`;
346
+ if (isYarnClassicLockfile(content)) {
347
+ return content.replace(CLASSIC_RESOLVED, (match, open, value, close) => {
348
+ const hash = value.indexOf("#");
349
+ const url = hash < 0 ? value : value.slice(0, hash);
350
+ const target = url.startsWith(base) ? parseProxyPath(url.slice(base.length)) : null;
351
+ if (!target)
352
+ return match;
353
+ const fragment = hash < 0 ? "" : value.slice(hash);
354
+ const publicUrl = publicNpmTarballUrl(target.name, target.version).replace("https://registry.npmjs.org/", YARN_CLASSIC_REGISTRY);
355
+ return `${open}"${publicUrl}${fragment}"${close}`;
356
+ });
357
+ }
358
+ return content.replace(BERRY_PARAMETERS, (match, open, parameters, close) => {
359
+ const kept = parameters.split("&").filter((parameter) => {
360
+ if (!parameter.startsWith("__archiveUrl="))
361
+ return true;
362
+ const url = decode(parameter.slice("__archiveUrl=".length));
363
+ return url === null || !url.startsWith(base);
364
+ });
365
+ return `${open}${kept.length > 0 ? `::${kept.join("&")}` : ""}${close}`;
366
+ });
367
+ }