@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
@@ -2,12 +2,13 @@
2
2
  * npm registry adapter: parses npm allowlist syntax and semver ranges,
3
3
  * routes proxy requests against the npm HTTP protocol (packuments,
4
4
  * `-/tarball/<name>/<version>` downloads, and the standard
5
- * `<name>/-/<unscoped>-<version>.tgz` path lockfiles record), and configures npm/npmrc for
6
- * the sandboxed worker to use the proxy with install-time scripts disabled.
5
+ * `<name>/-/<unscoped>-<version>.tgz` path lockfiles record), and configures npm, pnpm,
6
+ * yarn (classic and Berry) and corepack in the sandboxed worker to use the proxy with
7
+ * install-time scripts disabled.
7
8
  */
8
9
  import semver from "semver";
9
- import { npmLockfiles } from "./npm-lockfile.js";
10
- import { npmLockfilePlan, registryDependencyEdges } from "./npm-plan.js";
10
+ import { npmClientLockfilePlan, npmClientLockfiles } from "./npm-lockfile-formats.js";
11
+ import { registryDependencyEdges } from "./npm-plan.js";
11
12
  import { AllowlistEntryError, RegistryError, } from "./types.js";
12
13
  /** Scoped names are lower case (npm never allowed capitals in them); an
13
14
  * unscoped legacy name may contain capitals, and npm treats it as a
@@ -81,6 +82,19 @@ function standardTarball(name, filename) {
81
82
  return null;
82
83
  return { kind: "download", name, version, filename: `${version}.tgz` };
83
84
  }
85
+ /** The download URL the proxy hands out: the registry's usual tarball path,
86
+ * `<name>/-/<unscoped>-<version>.tgz`, under the proxy's base (routed by
87
+ * `standardTarball`). pnpm and yarn 2+ record a download URL in their
88
+ * lockfile (and yarn in .pnp.cjs and its cache names) only when it isn't
89
+ * that usual one, so they record nothing of the proxy. */
90
+ function proxyTarballUrl(proxyBase, name, version) {
91
+ // The usual path routes only a canonically spelled version (standardTarball);
92
+ // any other kept version (build metadata, `1.0.0+build`) keeps the proxy's
93
+ // own route, which the collection rewrite turns public all the same.
94
+ if (semver.valid(version) !== version)
95
+ return `${proxyBase}-/tarball/${encodeURIComponent(name)}/${encodeURIComponent(version)}`;
96
+ return `${proxyBase}${name}/-/${name.slice(name.indexOf("/") + 1)}-${version}.tgz`;
97
+ }
84
98
  function validName(name) {
85
99
  if (!NAME.test(name))
86
100
  throw new AllowlistEntryError(`"${name}" is not a valid npm package name`);
@@ -138,8 +152,8 @@ export const npmAdapter = {
138
152
  upstreamHosts: ["registry.npmjs.org"],
139
153
  collectExclude: ["node_modules"],
140
154
  dependenciesInMetadata: true,
141
- lockfiles: npmLockfiles,
142
- lockfilePlan: npmLockfilePlan,
155
+ lockfiles: npmClientLockfiles,
156
+ lockfilePlan: npmClientLockfilePlan,
143
157
  parseAllowlistEntry(raw) {
144
158
  const value = raw.trim();
145
159
  // Scopes are always lower case on npm, so folding one cannot select a
@@ -173,6 +187,9 @@ export const npmAdapter = {
173
187
  // one segment (`react`, `@scope%2fpkg`) or a literal scope plus name
174
188
  // (`@scope/pkg`); the filename is one raw segment.
175
189
  const standard = subpath.match(/^((?:@[^/]+\/)?[^/]+)\/-\/([^/]+)$/);
190
+ // One version's document, `<name>/<version>` (corepack reads these to
191
+ // download a pinned pnpm or yarn), for an exact version only.
192
+ const versionDocument = subpath.match(/^((?:@[^/]+\/)?[^/]+)\/([^/]+)$/);
176
193
  try {
177
194
  if (tarball) {
178
195
  const name = decodeURIComponent(tarball[1]);
@@ -183,6 +200,14 @@ export const npmAdapter = {
183
200
  }
184
201
  if (standard)
185
202
  return standardTarball(decodeURIComponent(standard[1]), decodeURIComponent(standard[2]));
203
+ if (versionDocument) {
204
+ // `@scope/pkg` matches too (as name `@scope`, version `pkg`), and
205
+ // falls through: no package name is a scope alone.
206
+ const name = decodeURIComponent(versionDocument[1]);
207
+ const version = decodeURIComponent(versionDocument[2]);
208
+ if (NAME.test(name) && semver.valid(version) === version)
209
+ return { kind: "metadata", name, version };
210
+ }
186
211
  const name = decodeURIComponent(subpath);
187
212
  return NAME.test(name) ? { kind: "metadata", name } : null;
188
213
  }
@@ -214,7 +239,7 @@ export const npmAdapter = {
214
239
  const info = JSON.parse(manifest);
215
240
  versions[version] = {
216
241
  ...info,
217
- dist: { ...info.dist, tarball: `${proxyBase}-/tarball/${encodeURIComponent(meta.name)}/${version}` },
242
+ dist: { ...info.dist, tarball: proxyTarballUrl(proxyBase, meta.name, version) },
218
243
  };
219
244
  const published = raw.times.get(version);
220
245
  if (published !== undefined)
@@ -229,13 +254,37 @@ export const npmAdapter = {
229
254
  body: JSON.stringify({ name: raw.name, "dist-tags": tags, time, versions }),
230
255
  };
231
256
  },
257
+ renderVersion(meta, version, keptFiles, proxyBase) {
258
+ const raw = meta.raw;
259
+ if (!raw)
260
+ throw new Error(`npm metadata for "${meta.name}" was fetched without render data`);
261
+ const manifest = raw.manifests.get(version);
262
+ if (manifest === undefined || !keptFiles.has(`${version}.tgz`))
263
+ return null;
264
+ const info = JSON.parse(manifest);
265
+ return {
266
+ contentType: "application/json",
267
+ body: JSON.stringify({
268
+ ...info,
269
+ dist: { ...info.dist, tarball: proxyTarballUrl(proxyBase, meta.name, version) },
270
+ }),
271
+ };
272
+ },
232
273
  resolveDownload(route, meta) {
233
274
  return meta.versions.get(route.version)?.files.find((file) => file.filename === route.filename) ?? null;
234
275
  },
235
276
  workerConfig({ registryUrl, token, cacheDir }) {
236
277
  const npmrc = `${cacheDir}/npmrc`;
278
+ // yarn Berry and corepack append paths to a registry without a trailing slash.
279
+ const registryServer = registryUrl.replace(/\/+$/, "");
280
+ const proxy = new URL(registryUrl);
237
281
  return {
238
282
  env: {
283
+ // npm, and pnpm (which reads the same npm_config_* settings and
284
+ // npmrc). Only settings npm knows: npm warns about any other on
285
+ // every command, so pnpm's store and cache and yarn classic's cache
286
+ // folder are set by the shim for that tool alone (npm-shim.mjs),
287
+ // under npm_config_cache.
239
288
  npm_config_registry: registryUrl,
240
289
  npm_config_userconfig: npmrc,
241
290
  npm_config_ignore_scripts: "true",
@@ -243,7 +292,28 @@ export const npmAdapter = {
243
292
  npm_config_audit: "false",
244
293
  npm_config_fund: "false",
245
294
  npm_config_update_notifier: "false",
246
- // The only registry the npm shim (npm-shim.mjs) sends a lockfile to.
295
+ // yarn classic (1.x): the registry and token from the npm settings
296
+ // above, and its own switch for install scripts. Nothing here is a
297
+ // YARN_ setting yarn Berry would reject as unknown.
298
+ YARN_IGNORE_SCRIPTS: "true",
299
+ // yarn Berry (2+) ignores npm's settings. Its global folder holds its
300
+ // shared cache; the per-project cacheFolder is left alone, so a
301
+ // repository that commits its cache (zero-install) keeps it.
302
+ YARN_NPM_REGISTRY_SERVER: registryServer,
303
+ YARN_NPM_AUTH_TOKEN: token,
304
+ YARN_NPM_ALWAYS_AUTH: "true",
305
+ ...(proxy.protocol === "http:" ? { YARN_UNSAFE_HTTP_WHITELIST: proxy.hostname } : {}),
306
+ YARN_ENABLE_TELEMETRY: "0",
307
+ YARN_ENABLE_SCRIPTS: "false",
308
+ YARN_GLOBAL_FOLDER: `${cacheDir}/yarn-berry`,
309
+ // corepack, which downloads the pnpm or yarn release a project pins.
310
+ COREPACK_NPM_REGISTRY: registryServer,
311
+ COREPACK_NPM_TOKEN: token,
312
+ COREPACK_HOME: `${cacheDir}/corepack`,
313
+ COREPACK_ENABLE_DOWNLOAD_PROMPT: "0",
314
+ COREPACK_ENABLE_AUTO_PIN: "0",
315
+ COREPACK_DEFAULT_TO_LATEST: "0",
316
+ // The only registry the package-manager shim (npm-shim.mjs) sends a lockfile to.
247
317
  WARDBY_NPM_PLAN_REGISTRY: registryUrl,
248
318
  },
249
319
  files: [{ path: npmrc, content: `${registryUrl.replace(/^https?:/, "")}:_authToken=${token}\n`, mode: 0o600 }],
@@ -0,0 +1,17 @@
1
+ import { type ParsedLockfile } from "./types.js";
2
+ export declare function parsePnpmLockfile(body: string, options: {
3
+ maxEntries: number;
4
+ proxyRegistryUrl: string;
5
+ }): ParsedLockfile;
6
+ /** Whether `body` is a pnpm lockfile: a top-level `lockfileVersion:` key
7
+ * (a Berry yarn.lock has `__metadata:` instead, and npm's is JSON). */
8
+ export declare function isPnpmLockfile(body: string): boolean;
9
+ /**
10
+ * Rewrites what pnpm records of the proxy in a `pnpm-lock.yaml`. pnpm
11
+ * records a package's `tarball` only when the registry's download URL is
12
+ * not the conventional one, which the proxy's own route is not: a proxy
13
+ * `tarball` next to an `integrity` is dropped (exactly what pnpm writes for
14
+ * a package from the public registry), and one without an integrity is
15
+ * rewritten to the public registry URL. Only matched values change.
16
+ */
17
+ export declare function normalizePnpmLockfile(content: string, registryUrl: string): string;
@@ -0,0 +1,189 @@
1
+ /**
2
+ * `pnpm-lock.yaml` for npm lockfile plans (`POST /registry/npm/-/plan`) and
3
+ * for the rewrite of proxy URLs before collection.
4
+ *
5
+ * Supported: lockfileVersion 9 (pnpm 9+: `packages` holds each
6
+ * name@version's resolution and integrity, `snapshots` each installed
7
+ * instance with its resolved dependencies) and 6 (pnpm 8: `packages` keyed
8
+ * `/name@version`, holding both). An entry is one installed instance (a
9
+ * snapshot, or a v6 package key), so the same name@version with different
10
+ * peers is several entries; plans approve per name@version anyway.
11
+ *
12
+ * pnpm resolves a dependency by the reference the parent's entry records
13
+ * (`ms: 2.1.3`, an alias's `string-width@4.2.3`, both possibly with a
14
+ * `(peer@x)` suffix): `resolve` follows exactly that. `link:` and `file:`
15
+ * references and `directory` resolutions are local and skipped; git and
16
+ * non-registry tarballs are refused. Nothing here decides anything: plan.ts
17
+ * verifies every claim against the registry.
18
+ *
19
+ * Kept free of imports from npm.ts, which imports this module.
20
+ */
21
+ import { parseProxyPath, publicNpmTarballUrl } from "./npm-lockfile.js";
22
+ import { registryDependencyEdges } from "./npm-plan.js";
23
+ import { buildResolve, entryOf, fromRegistry, mapOf, parseLockfileYaml, splitDescriptor, stringOf, tooLarge, yamlEntryLines, } from "./lockfile-shared.js";
24
+ import { RegistryError } from "./types.js";
25
+ /** Two-space-indented keys a pnpm lockfile may have per entry (a package
26
+ * and its snapshot, plus slack for importers), for the cheap pre-check. */
27
+ const KEY_LINES_PER_ENTRY = 4;
28
+ /** `name@1.0.0(peer@2.0.0)(other@3)` without its peer suffix. */
29
+ function withoutPeers(reference) {
30
+ const open = reference.indexOf("(");
31
+ return open < 0 ? reference : reference.slice(0, open);
32
+ }
33
+ /** The string-valued dependencies of a snapshot or package entry. */
34
+ function referencesOf(entry) {
35
+ const references = new Map();
36
+ for (const field of ["dependencies", "optionalDependencies"]) {
37
+ for (const [key, value] of Object.entries(mapOf(entry[field]))) {
38
+ const reference = stringOf(value);
39
+ if (reference !== undefined && !references.has(key))
40
+ references.set(key, reference);
41
+ }
42
+ }
43
+ return references;
44
+ }
45
+ const IMPORTER_FIELDS = ["dependencies", "devDependencies", "optionalDependencies"];
46
+ /** An importer's declared dependencies (`{ specifier, version }` per name). */
47
+ function importerDeclarations(importer) {
48
+ const specs = {};
49
+ for (const field of IMPORTER_FIELDS) {
50
+ for (const [key, value] of Object.entries(mapOf(importer[field]))) {
51
+ const specifier = stringOf(mapOf(value).specifier) ?? stringOf(value);
52
+ if (specifier !== undefined && !(key in specs))
53
+ specs[key] = specifier;
54
+ }
55
+ }
56
+ return registryDependencyEdges(specs);
57
+ }
58
+ /** The reference (`version`) an importer records for each dependency it
59
+ * declares, which `resolve` follows like a snapshot's. */
60
+ function importerReferences(importer) {
61
+ const references = new Map();
62
+ for (const field of IMPORTER_FIELDS) {
63
+ for (const [key, value] of Object.entries(mapOf(importer[field]))) {
64
+ const reference = stringOf(mapOf(value).version);
65
+ if (reference !== undefined && !references.has(key))
66
+ references.set(key, reference);
67
+ }
68
+ }
69
+ return references;
70
+ }
71
+ /** The entry for one installed instance: local (null), or registry or
72
+ * refused by its resolution. */
73
+ function classify(path, name, version, resolution, proxyRegistryUrl) {
74
+ if (version.startsWith("link:") || version.startsWith("file:"))
75
+ return null;
76
+ const fields = mapOf(resolution);
77
+ const type = stringOf(fields.type);
78
+ if (type === "directory")
79
+ return null;
80
+ const tarball = stringOf(fields.tarball);
81
+ if (tarball?.startsWith("file:"))
82
+ return null;
83
+ const integrity = stringOf(fields.integrity) ?? null;
84
+ const elsewhere = type !== undefined || (tarball !== undefined && !fromRegistry(tarball, proxyRegistryUrl));
85
+ return entryOf(path, name, version, integrity, elsewhere ? "elsewhere" : "registry");
86
+ }
87
+ export function parsePnpmLockfile(body, options) {
88
+ const lines = yamlEntryLines(body);
89
+ if (lines > (options.maxEntries + 1) * KEY_LINES_PER_ENTRY)
90
+ throw tooLarge(lines, options.maxEntries);
91
+ const document = parseLockfileYaml(body);
92
+ const lockfileVersion = stringOf(document.lockfileVersion) ?? "";
93
+ const major = Number.parseInt(lockfileVersion, 10);
94
+ if (major !== 6 && major !== 9)
95
+ throw new RegistryError(400, "wardby_lockfile_unsupported", `pnpm lockfileVersion ${JSON.stringify(lockfileVersion)} is not supported; regenerate the lockfile with pnpm 8 or later (lockfileVersion 6 or 9)`);
96
+ const packages = mapOf(document.packages);
97
+ const snapshots = mapOf(document.snapshots);
98
+ // v9 lists every installed instance under `snapshots`; v6 has only `packages`.
99
+ const instances = major === 9 && Object.keys(snapshots).length > 0 ? snapshots : packages;
100
+ const count = Object.keys(instances).length;
101
+ if (count > options.maxEntries)
102
+ throw tooLarge(count, options.maxEntries);
103
+ const entries = [];
104
+ const byPath = new Map();
105
+ const byKey = new Map();
106
+ for (const [path, raw] of Object.entries(instances)) {
107
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
108
+ throw new RegistryError(400, "wardby_bad_request", `pnpm-lock.yaml entry "${path}" is not a mapping`);
109
+ const instance = raw;
110
+ let target;
111
+ if (major === 9) {
112
+ const base = withoutPeers(path);
113
+ const { name, range: version } = splitDescriptor(base);
114
+ target = classify(path, name, version, mapOf(packages[base]).resolution, options.proxyRegistryUrl);
115
+ }
116
+ else if (path.startsWith("/")) {
117
+ const { name, range: version } = splitDescriptor(withoutPeers(path.slice(1)));
118
+ target = classify(path, name, version, instance.resolution, options.proxyRegistryUrl);
119
+ }
120
+ else {
121
+ // A v6 key without a leading slash is a package from outside the
122
+ // registry (a git host, a URL, a local path); pnpm records its
123
+ // name and version as fields.
124
+ target = classify(path, stringOf(instance.name) ?? path, stringOf(instance.version) ?? "", { type: "elsewhere", ...mapOf(instance.resolution) }, options.proxyRegistryUrl);
125
+ }
126
+ if (target)
127
+ entries.push(target);
128
+ byPath.set(path, { dependencies: referencesOf(instance) });
129
+ byKey.set(path, target);
130
+ }
131
+ const importers = mapOf(document.importers);
132
+ const importerOf = Object.keys(importers).length > 0
133
+ ? Object.entries(importers).map(([path, importer]) => [path, mapOf(importer)])
134
+ : [[".", document]];
135
+ const projects = importerOf.map(([path, importer]) => ({ path, dependencies: importerDeclarations(importer) }));
136
+ // A project resolves what it declares like an instance does (an importer
137
+ // path that is also an instance key keeps the instance's references).
138
+ for (const [path, importer] of importerOf)
139
+ if (!byPath.has(path))
140
+ byPath.set(path, { dependencies: importerReferences(importer) });
141
+ const candidates = (key, reference) => {
142
+ if (reference.startsWith("link:"))
143
+ return [];
144
+ if (major === 9) {
145
+ // An alias records `name@version`; anything else is this key's version.
146
+ return withoutPeers(reference).indexOf("@", 1) > 0 ? [reference] : [`${key}@${reference}`];
147
+ }
148
+ if (reference.startsWith("/"))
149
+ return [reference];
150
+ return /^\d/.test(reference) ? [`/${key}@${reference}`] : [reference];
151
+ };
152
+ return { entries, projects, ...buildResolve(byPath, byKey, candidates) };
153
+ }
154
+ /** Whether `body` is a pnpm lockfile: a top-level `lockfileVersion:` key
155
+ * (a Berry yarn.lock has `__metadata:` instead, and npm's is JSON). */
156
+ export function isPnpmLockfile(body) {
157
+ return /^lockfileVersion:/m.test(body);
158
+ }
159
+ /** A `resolution: {…}` flow mapping on one line of a pnpm lockfile. */
160
+ const RESOLUTION = /^(\s+resolution:\s*\{)([^}\n]*)(\}\s*)$/gm;
161
+ /**
162
+ * Rewrites what pnpm records of the proxy in a `pnpm-lock.yaml`. pnpm
163
+ * records a package's `tarball` only when the registry's download URL is
164
+ * not the conventional one, which the proxy's own route is not: a proxy
165
+ * `tarball` next to an `integrity` is dropped (exactly what pnpm writes for
166
+ * a package from the public registry), and one without an integrity is
167
+ * rewritten to the public registry URL. Only matched values change.
168
+ */
169
+ export function normalizePnpmLockfile(content, registryUrl) {
170
+ const base = registryUrl.endsWith("/") ? registryUrl : `${registryUrl}/`;
171
+ return content.replace(RESOLUTION, (match, open, inner, close) => {
172
+ const parts = inner.split(",").map((part) => part.trim());
173
+ const tarballAt = parts.findIndex((part) => part.startsWith("tarball:"));
174
+ if (tarballAt < 0)
175
+ return match;
176
+ const url = parts[tarballAt]
177
+ .slice("tarball:".length)
178
+ .trim()
179
+ .replace(/^(['"])(.*)\1$/, "$2");
180
+ const target = url.startsWith(base) ? parseProxyPath(url.slice(base.length)) : null;
181
+ if (!target)
182
+ return match;
183
+ if (parts.some((part) => part.startsWith("integrity:")))
184
+ parts.splice(tarballAt, 1);
185
+ else
186
+ parts[tarballAt] = `tarball: ${publicNpmTarballUrl(target.name, target.version)}`;
187
+ return `${open}${parts.join(", ")}${close}`;
188
+ });
189
+ }
@@ -0,0 +1,50 @@
1
+ import { type DeclaredDependency, type LockfilePlanSupport, type ParsedLockfile, type UpstreamFetch, type VersionFact } from "./types.js";
2
+ /**
3
+ * A pinned requirements file: every `name==version` (or `===`) line is an
4
+ * entry; a direct reference (`name @ url`) is an unsupported one. Options
5
+ * (`-r`, `-c`, `--index-url`, …), editable or local projects and unpinned
6
+ * lines are not entries: pip resolves those the usual way. The file records
7
+ * no dependency graph, so a parent's dependency resolves to every entry of
8
+ * that name (marker-split pins).
9
+ */
10
+ export declare function parseRequirements(body: string, maxEntries: number): ParsedLockfile;
11
+ /**
12
+ * A uv.lock (`version = 1`). A package from PyPI (or the proxy) is an
13
+ * entry; the lock's own projects (editable, virtual and directory sources)
14
+ * are its projects; one from git, a URL, a path or another index is
15
+ * unsupported. A dependency resolves to the version the lock names for it
16
+ * when the lock pins the name at several versions.
17
+ */
18
+ export declare function parseUvLock(body: string, maxEntries: number, proxyRegistryUrl: string): ParsedLockfile;
19
+ /** Which file a plan body is: a uv.lock, a requirements file, or one this registry cannot verify. */
20
+ export declare function parsePypiLockfile(body: string, options: {
21
+ maxEntries: number;
22
+ proxyRegistryUrl: string;
23
+ }): ParsedLockfile;
24
+ /** One release's facts: its dependency lines (with their extras and extra
25
+ * gates), and its earliest wheel's upload time, URL and sha256. A release
26
+ * with no wheel is refused (`wardby_file_not_allowed`): nothing in it may
27
+ * be installed. */
28
+ export declare function fetchPypiVersionFact(name: string, version: string, upstream: UpstreamFetch, signal?: AbortSignal): Promise<VersionFact | null>;
29
+ /** Publish times for releases whose fact carried none (no wheel recorded an upload time). */
30
+ export declare function fetchPypiPublishTimes(name: string, versions: readonly string[], upstream: UpstreamFetch, options: {
31
+ signal: AbortSignal;
32
+ }): Promise<Map<string, Date>>;
33
+ /** Whether a locked version is inside a dependency line's specifier, a
34
+ * pinned pre-release included. */
35
+ export declare function pypiEdgeSatisfies(version: string, range: string): boolean;
36
+ /** The dependencies a release installed with `extras` follows, under the
37
+ * same extras policy as the graph walk (pypi-requirements.ts). */
38
+ export declare function pypiDependenciesOf(fact: VersionFact, extras: readonly string[]): DeclaredDependency[];
39
+ export declare const pypiLockfilePlan: LockfilePlanSupport;
40
+ /** PyPI's own path for a file by project and filename, which redirects to the
41
+ * file (a wheel's python tag, or `source` for an sdist). */
42
+ export declare function publicFileUrl(name: string, filename: string): string | undefined;
43
+ /**
44
+ * A uv.lock with the proxy's URLs (which uv records when it locks through
45
+ * the proxy) put back to PyPI's: its index as `https://pypi.org/simple`, each
46
+ * file as PyPI's redirecting path (publicFileUrl). Credentials are never in
47
+ * them (uv records none), but any userinfo before the proxy host is dropped
48
+ * with the URL anyway. Everything else is left exactly as it was.
49
+ */
50
+ export declare function normalizeUvLock(content: string, registryUrl: string): string;