audit-tools 0.32.68 → 0.33.1

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 (238) hide show
  1. package/README.md +7 -0
  2. package/dist/audit/cli/advanceAuditCommand.d.ts.map +1 -1
  3. package/dist/audit/cli/advanceAuditCommand.js +8 -3
  4. package/dist/audit/cli/advanceAuditCommand.js.map +1 -1
  5. package/dist/audit/cli/args.d.ts +9 -27
  6. package/dist/audit/cli/args.d.ts.map +1 -1
  7. package/dist/audit/cli/args.js +119 -50
  8. package/dist/audit/cli/args.js.map +1 -1
  9. package/dist/audit/cli/auditStep.d.ts +15 -1
  10. package/dist/audit/cli/auditStep.d.ts.map +1 -1
  11. package/dist/audit/cli/auditStep.js +2 -0
  12. package/dist/audit/cli/auditStep.js.map +1 -1
  13. package/dist/audit/cli/dispatch/quotaPool.d.ts +2 -1
  14. package/dist/audit/cli/dispatch/quotaPool.d.ts.map +1 -1
  15. package/dist/audit/cli/dispatch/quotaPool.js +43 -77
  16. package/dist/audit/cli/dispatch/quotaPool.js.map +1 -1
  17. package/dist/audit/cli/dispatch.d.ts.map +1 -1
  18. package/dist/audit/cli/dispatch.js +14 -6
  19. package/dist/audit/cli/dispatch.js.map +1 -1
  20. package/dist/audit/cli/hybridDispatch.d.ts +3 -1
  21. package/dist/audit/cli/hybridDispatch.d.ts.map +1 -1
  22. package/dist/audit/cli/hybridDispatch.js +6 -0
  23. package/dist/audit/cli/hybridDispatch.js.map +1 -1
  24. package/dist/audit/cli/nextStepCommand.d.ts +0 -9
  25. package/dist/audit/cli/nextStepCommand.d.ts.map +1 -1
  26. package/dist/audit/cli/nextStepCommand.js +173 -92
  27. package/dist/audit/cli/nextStepCommand.js.map +1 -1
  28. package/dist/audit/cli/nextStepHelpers.d.ts +11 -2
  29. package/dist/audit/cli/nextStepHelpers.d.ts.map +1 -1
  30. package/dist/audit/cli/nextStepHelpers.js +56 -8
  31. package/dist/audit/cli/nextStepHelpers.js.map +1 -1
  32. package/dist/audit/cli/prepareDispatchCommand.d.ts.map +1 -1
  33. package/dist/audit/cli/prepareDispatchCommand.js +15 -9
  34. package/dist/audit/cli/prepareDispatchCommand.js.map +1 -1
  35. package/dist/audit/cli/prompts.d.ts +12 -32
  36. package/dist/audit/cli/prompts.d.ts.map +1 -1
  37. package/dist/audit/cli/prompts.js +19 -33
  38. package/dist/audit/cli/prompts.js.map +1 -1
  39. package/dist/audit/cli/providerConfirmationStep.d.ts +13 -5
  40. package/dist/audit/cli/providerConfirmationStep.d.ts.map +1 -1
  41. package/dist/audit/cli/providerConfirmationStep.js +47 -8
  42. package/dist/audit/cli/providerConfirmationStep.js.map +1 -1
  43. package/dist/audit/cli/quotaCommand.d.ts.map +1 -1
  44. package/dist/audit/cli/quotaCommand.js +16 -10
  45. package/dist/audit/cli/quotaCommand.js.map +1 -1
  46. package/dist/audit/cli/rollingAuditDispatch.d.ts.map +1 -1
  47. package/dist/audit/cli/rollingAuditDispatch.js +14 -1
  48. package/dist/audit/cli/rollingAuditDispatch.js.map +1 -1
  49. package/dist/audit/cli/semanticReviewStep.d.ts +11 -1
  50. package/dist/audit/cli/semanticReviewStep.d.ts.map +1 -1
  51. package/dist/audit/cli/semanticReviewStep.js +11 -15
  52. package/dist/audit/cli/semanticReviewStep.js.map +1 -1
  53. package/dist/audit/cli/validateCommand.d.ts.map +1 -1
  54. package/dist/audit/cli/validateCommand.js +3 -3
  55. package/dist/audit/cli/validateCommand.js.map +1 -1
  56. package/dist/audit/cli.js +3 -3
  57. package/dist/audit/cli.js.map +1 -1
  58. package/dist/audit/contracts/wrapperResponse.d.ts +6 -6
  59. package/dist/audit/orchestrator/advance.d.ts.map +1 -1
  60. package/dist/audit/orchestrator/advance.js +39 -7
  61. package/dist/audit/orchestrator/advance.js.map +1 -1
  62. package/dist/audit/orchestrator/advanceTypes.d.ts +52 -1
  63. package/dist/audit/orchestrator/advanceTypes.d.ts.map +1 -1
  64. package/dist/audit/orchestrator/executorRunners.d.ts.map +1 -1
  65. package/dist/audit/orchestrator/executorRunners.js +9 -1
  66. package/dist/audit/orchestrator/executorRunners.js.map +1 -1
  67. package/dist/audit/orchestrator/intakeExecutors.d.ts +27 -3
  68. package/dist/audit/orchestrator/intakeExecutors.d.ts.map +1 -1
  69. package/dist/audit/orchestrator/intakeExecutors.js +119 -19
  70. package/dist/audit/orchestrator/intakeExecutors.js.map +1 -1
  71. package/dist/audit/orchestrator/nextStep.d.ts +7 -0
  72. package/dist/audit/orchestrator/nextStep.d.ts.map +1 -1
  73. package/dist/audit/orchestrator/nextStep.js +3 -0
  74. package/dist/audit/orchestrator/nextStep.js.map +1 -1
  75. package/dist/audit/orchestrator/providerConfirmation.d.ts.map +1 -1
  76. package/dist/audit/orchestrator/providerConfirmation.js +0 -2
  77. package/dist/audit/orchestrator/providerConfirmation.js.map +1 -1
  78. package/dist/audit/orchestrator/rollingDispatch.d.ts.map +1 -1
  79. package/dist/audit/orchestrator/rollingDispatch.js +2 -0
  80. package/dist/audit/orchestrator/rollingDispatch.js.map +1 -1
  81. package/dist/audit/orchestrator/state.d.ts +17 -0
  82. package/dist/audit/orchestrator/state.d.ts.map +1 -1
  83. package/dist/audit/orchestrator/state.js +13 -1
  84. package/dist/audit/orchestrator/state.js.map +1 -1
  85. package/dist/audit/providers/claudeWorkerProvider.d.ts +10 -0
  86. package/dist/audit/providers/claudeWorkerProvider.d.ts.map +1 -0
  87. package/dist/audit/providers/claudeWorkerProvider.js +15 -0
  88. package/dist/audit/providers/claudeWorkerProvider.js.map +1 -0
  89. package/dist/audit/providers/index.d.ts.map +1 -1
  90. package/dist/audit/providers/index.js +2 -0
  91. package/dist/audit/providers/index.js.map +1 -1
  92. package/dist/audit/quota/index.d.ts +133 -128
  93. package/dist/audit/quota/index.d.ts.map +1 -1
  94. package/dist/audit/supervisor/sessionConfig.d.ts +3 -11
  95. package/dist/audit/supervisor/sessionConfig.d.ts.map +1 -1
  96. package/dist/audit/supervisor/sessionConfig.js +3 -25
  97. package/dist/audit/supervisor/sessionConfig.js.map +1 -1
  98. package/dist/audit/types/analyzerCapability.d.ts +6 -6
  99. package/dist/audit/types/externalAnalyzer.d.ts +10 -10
  100. package/dist/remediate/index.d.ts.map +1 -1
  101. package/dist/remediate/index.js +2 -2
  102. package/dist/remediate/index.js.map +1 -1
  103. package/dist/remediate/phases/plan.d.ts.map +1 -1
  104. package/dist/remediate/phases/plan.js +5 -4
  105. package/dist/remediate/phases/plan.js.map +1 -1
  106. package/dist/remediate/providers/claudeWorkerProvider.d.ts +11 -0
  107. package/dist/remediate/providers/claudeWorkerProvider.d.ts.map +1 -0
  108. package/dist/remediate/providers/claudeWorkerProvider.js +16 -0
  109. package/dist/remediate/providers/claudeWorkerProvider.js.map +1 -0
  110. package/dist/remediate/providers/index.d.ts.map +1 -1
  111. package/dist/remediate/providers/index.js +2 -0
  112. package/dist/remediate/providers/index.js.map +1 -1
  113. package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
  114. package/dist/remediate/steps/contractPipeline.js +9 -3
  115. package/dist/remediate/steps/contractPipeline.js.map +1 -1
  116. package/dist/remediate/steps/dispatch/acceptNode.d.ts +1 -1
  117. package/dist/remediate/steps/dispatch/acceptNode.d.ts.map +1 -1
  118. package/dist/remediate/steps/dispatch/acceptNode.js.map +1 -1
  119. package/dist/remediate/steps/dispatch/marshal.d.ts.map +1 -1
  120. package/dist/remediate/steps/dispatch/marshal.js +5 -4
  121. package/dist/remediate/steps/dispatch/marshal.js.map +1 -1
  122. package/dist/remediate/steps/dispatch/waveScheduling.d.ts +4 -2
  123. package/dist/remediate/steps/dispatch/waveScheduling.d.ts.map +1 -1
  124. package/dist/remediate/steps/dispatch/waveScheduling.js +33 -85
  125. package/dist/remediate/steps/dispatch/waveScheduling.js.map +1 -1
  126. package/dist/remediate/steps/nextStep.d.ts +21 -10
  127. package/dist/remediate/steps/nextStep.d.ts.map +1 -1
  128. package/dist/remediate/steps/nextStep.js +45 -25
  129. package/dist/remediate/steps/nextStep.js.map +1 -1
  130. package/dist/remediate/steps/sessionConfigLoad.d.ts +46 -0
  131. package/dist/remediate/steps/sessionConfigLoad.d.ts.map +1 -0
  132. package/dist/remediate/steps/sessionConfigLoad.js +39 -0
  133. package/dist/remediate/steps/sessionConfigLoad.js.map +1 -0
  134. package/dist/shared/config/resolveSessionConfig.d.ts +75 -0
  135. package/dist/shared/config/resolveSessionConfig.d.ts.map +1 -0
  136. package/dist/shared/config/resolveSessionConfig.js +125 -0
  137. package/dist/shared/config/resolveSessionConfig.js.map +1 -0
  138. package/dist/shared/dispatch/admissionLoop.d.ts +12 -12
  139. package/dist/shared/dispatch/coordinator.d.ts.map +1 -1
  140. package/dist/shared/dispatch/coordinator.js +52 -6
  141. package/dist/shared/dispatch/coordinator.js.map +1 -1
  142. package/dist/shared/dispatch/hybridDispatch.d.ts +6 -0
  143. package/dist/shared/dispatch/hybridDispatch.d.ts.map +1 -1
  144. package/dist/shared/dispatch/hybridDispatch.js +6 -0
  145. package/dist/shared/dispatch/hybridDispatch.js.map +1 -1
  146. package/dist/shared/dispatch/providerLaunchFinalize.d.ts +2 -1
  147. package/dist/shared/dispatch/providerLaunchFinalize.d.ts.map +1 -1
  148. package/dist/shared/dispatch/providerLaunchFinalize.js +123 -68
  149. package/dist/shared/dispatch/providerLaunchFinalize.js.map +1 -1
  150. package/dist/shared/dispatch/rollingDispatch.d.ts +69 -2
  151. package/dist/shared/dispatch/rollingDispatch.d.ts.map +1 -1
  152. package/dist/shared/dispatch/rollingDispatch.js +177 -7
  153. package/dist/shared/dispatch/rollingDispatch.js.map +1 -1
  154. package/dist/shared/dispatch/unifiedRolling.d.ts +23 -0
  155. package/dist/shared/dispatch/unifiedRolling.d.ts.map +1 -1
  156. package/dist/shared/dispatch/unifiedRolling.js +2 -0
  157. package/dist/shared/dispatch/unifiedRolling.js.map +1 -1
  158. package/dist/shared/friction/stepBoundaryCapture.d.ts +52 -1
  159. package/dist/shared/friction/stepBoundaryCapture.d.ts.map +1 -1
  160. package/dist/shared/friction/stepBoundaryCapture.js +87 -0
  161. package/dist/shared/friction/stepBoundaryCapture.js.map +1 -1
  162. package/dist/shared/index.d.ts +20 -10
  163. package/dist/shared/index.d.ts.map +1 -1
  164. package/dist/shared/index.js +20 -6
  165. package/dist/shared/index.js.map +1 -1
  166. package/dist/shared/io/stateDir.d.ts +27 -0
  167. package/dist/shared/io/stateDir.d.ts.map +1 -0
  168. package/dist/shared/io/stateDir.js +40 -0
  169. package/dist/shared/io/stateDir.js.map +1 -0
  170. package/dist/shared/providers/auditorSources.d.ts +169 -0
  171. package/dist/shared/providers/auditorSources.d.ts.map +1 -0
  172. package/dist/shared/providers/auditorSources.js +453 -0
  173. package/dist/shared/providers/auditorSources.js.map +1 -0
  174. package/dist/shared/providers/claudeWorkerProvider.d.ts +71 -0
  175. package/dist/shared/providers/claudeWorkerProvider.d.ts.map +1 -0
  176. package/dist/shared/providers/claudeWorkerProvider.js +133 -0
  177. package/dist/shared/providers/claudeWorkerProvider.js.map +1 -0
  178. package/dist/shared/providers/providerConfirmation.d.ts +3 -20
  179. package/dist/shared/providers/providerConfirmation.d.ts.map +1 -1
  180. package/dist/shared/providers/providerConfirmation.js +27 -40
  181. package/dist/shared/providers/providerConfirmation.js.map +1 -1
  182. package/dist/shared/providers/providerFactory.d.ts +13 -1
  183. package/dist/shared/providers/providerFactory.d.ts.map +1 -1
  184. package/dist/shared/providers/providerFactory.js +12 -0
  185. package/dist/shared/providers/providerFactory.js.map +1 -1
  186. package/dist/shared/providers/proxyCatalog.d.ts +95 -0
  187. package/dist/shared/providers/proxyCatalog.d.ts.map +1 -0
  188. package/dist/shared/providers/proxyCatalog.js +426 -0
  189. package/dist/shared/providers/proxyCatalog.js.map +1 -0
  190. package/dist/shared/providers/sharedProviderConfirmation.d.ts +264 -75
  191. package/dist/shared/providers/sharedProviderConfirmation.d.ts.map +1 -1
  192. package/dist/shared/providers/sharedProviderConfirmation.js +534 -113
  193. package/dist/shared/providers/sharedProviderConfirmation.js.map +1 -1
  194. package/dist/shared/quota/apiPool.d.ts +34 -11
  195. package/dist/shared/quota/apiPool.d.ts.map +1 -1
  196. package/dist/shared/quota/apiPool.js +52 -23
  197. package/dist/shared/quota/apiPool.js.map +1 -1
  198. package/dist/shared/quota/capacity.d.ts +79 -50
  199. package/dist/shared/quota/capacity.d.ts.map +1 -1
  200. package/dist/shared/quota/capacity.js +40 -5
  201. package/dist/shared/quota/capacity.js.map +1 -1
  202. package/dist/shared/quota/errorParsing.d.ts +39 -0
  203. package/dist/shared/quota/errorParsing.d.ts.map +1 -1
  204. package/dist/shared/quota/errorParsing.js +76 -0
  205. package/dist/shared/quota/errorParsing.js.map +1 -1
  206. package/dist/shared/quota/hostPool.d.ts +107 -0
  207. package/dist/shared/quota/hostPool.d.ts.map +1 -0
  208. package/dist/shared/quota/hostPool.js +103 -0
  209. package/dist/shared/quota/hostPool.js.map +1 -0
  210. package/dist/shared/quota/quotaSource.d.ts +2 -2
  211. package/dist/shared/types/auditorDescriptor.d.ts +120 -0
  212. package/dist/shared/types/auditorDescriptor.d.ts.map +1 -0
  213. package/dist/shared/types/auditorDescriptor.js +28 -0
  214. package/dist/shared/types/auditorDescriptor.js.map +1 -0
  215. package/dist/shared/types/providerConfirmation.d.ts +64 -6
  216. package/dist/shared/types/providerConfirmation.d.ts.map +1 -1
  217. package/dist/shared/types/providerConfirmation.js +1 -1
  218. package/dist/shared/types/rollingDispatch.d.ts +45 -1
  219. package/dist/shared/types/rollingDispatch.d.ts.map +1 -1
  220. package/dist/shared/types/sessionConfig.d.ts +149 -67
  221. package/dist/shared/types/sessionConfig.d.ts.map +1 -1
  222. package/dist/shared/types/sessionConfig.js +87 -2
  223. package/dist/shared/types/sessionConfig.js.map +1 -1
  224. package/dist/shared/validation/sessionConfig.d.ts +26 -14
  225. package/dist/shared/validation/sessionConfig.d.ts.map +1 -1
  226. package/dist/shared/validation/sessionConfig.js +95 -69
  227. package/dist/shared/validation/sessionConfig.js.map +1 -1
  228. package/docs/audit-pkg/contracts.md +4 -4
  229. package/docs/audit-pkg/operator-guide.md +43 -24
  230. package/package.json +1 -1
  231. package/skills/audit-code/SKILL.md +17 -14
  232. package/skills/audit-code/audit-code.prompt.md +17 -16
  233. package/wrapper/audit-code-wrapper-install-hosts.mjs +6 -10
  234. package/wrapper/remediate-code-wrapper-install-hosts.mjs +4 -8
  235. package/dist/shared/quota/repairProxyRegistry.d.ts +0 -84
  236. package/dist/shared/quota/repairProxyRegistry.d.ts.map +0 -1
  237. package/dist/shared/quota/repairProxyRegistry.js +0 -144
  238. package/dist/shared/quota/repairProxyRegistry.js.map +0 -1
@@ -0,0 +1,426 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { mkdir } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { writeJsonFile } from "../io/json.js";
5
+ import { resolveAuditCodeStateDir } from "../io/stateDir.js";
6
+ import { validateSessionConfig } from "../validation/sessionConfig.js";
7
+ /**
8
+ * The POPULATE cache for the repair-proxy lane: `GET <proxy>/registry` expanded into
9
+ * ready-to-fold `claude-worker` {@link DispatchableSource}s, written once per populate
10
+ * (Gate-0 build / explicit refresh) and READ by resolve — never fetched mid-resolve
11
+ * (`docs/reviews/commit3-proxy-kind1-transport-plan-2026-07-16.md` §populate/resolve).
12
+ *
13
+ * Named `catalog-cache.json`, NOT the `catalog-<auditor-id>.json` the reserved-name
14
+ * comment at `auditorSources.ts` anticipates: populate/resolve run on the AMBIENT
15
+ * path, where no auditor id exists to key on. The cache is machine-level like the
16
+ * declaration beside it — and it is a CACHE of live registry state, not resolved
17
+ * per-auditor capability, so an auditor-id key would assert an isolation the data
18
+ * doesn't have. Per-auditor never-inherit still holds: every resolve re-proves proxy
19
+ * REACH itself; the cache only supplies the expansion.
20
+ */
21
+ export const PROXY_CATALOG_FILENAME = "catalog-cache.json";
22
+ /** Top-K models expanded per backend provider when the operator declares no `top_k`. */
23
+ export const DEFAULT_PROXY_TOP_K = 3;
24
+ /** Timeout (ms) for populate-time model verification probes. */
25
+ export const POPULATE_PROBE_TIMEOUT_MS = 3000;
26
+ /** Concurrency limit for populate-time model verification probes. */
27
+ export const POPULATE_PROBE_CONCURRENCY = 4;
28
+ /**
29
+ * A same-endpoint cache younger than this skips the registry fetch + probes
30
+ * entirely (see the freshness short-circuit in {@link populateProxyCatalog}).
31
+ * Refresh throttle only — read-side staleness policy is a separate concern.
32
+ */
33
+ export const POPULATE_CACHE_FRESH_TTL_MS = 10 * 60_000;
34
+ /** Resolve the populate-cache path for this machine (state dir via `io/stateDir.ts`). */
35
+ export function resolveProxyCatalogPath(homeDir) {
36
+ return join(resolveAuditCodeStateDir(homeDir), PROXY_CATALOG_FILENAME);
37
+ }
38
+ function finiteNonNegative(value) {
39
+ return typeof value === "number" && Number.isFinite(value) && value >= 0
40
+ ? value
41
+ : undefined;
42
+ }
43
+ /**
44
+ * Best-effort "higher = better" score for ranking. A flat `score` wins; otherwise
45
+ * the live repair-proxy's `capability` block supplies someone-else-maintained
46
+ * relative-capability RANKS (`composite_rank`, then `arena_rank`; lower = better,
47
+ * so negated). A model with none stays unscored and ranks last — capability-less
48
+ * registry rows are frequently non-chat models (TTS, embeddings) that cannot serve
49
+ * as agentic workers.
50
+ */
51
+ function deriveScore(entry) {
52
+ if (typeof entry.score === "number" && Number.isFinite(entry.score)) {
53
+ return entry.score;
54
+ }
55
+ const capability = entry.capability;
56
+ if (capability === null || typeof capability !== "object")
57
+ return null;
58
+ const rank = finiteNonNegative(capability.composite_rank) ??
59
+ finiteNonNegative(capability.arena_rank);
60
+ return rank === undefined ? null : -rank;
61
+ }
62
+ /**
63
+ * Tolerantly extract context-window field from a registry entry or its nested
64
+ * `capability` block. Checks for `context_length`, `context_tokens`, `max_context`,
65
+ * `context_window` (first finite positive number wins).
66
+ */
67
+ function deriveContextTokens(entry) {
68
+ for (const key of ["context_length", "context_tokens", "max_context", "context_window"]) {
69
+ const value = finiteNonNegative(entry[key]);
70
+ if (value !== undefined)
71
+ return value;
72
+ }
73
+ const capability = entry.capability;
74
+ if (capability !== null && typeof capability === "object") {
75
+ for (const key of ["context_length", "context_tokens", "max_context", "context_window"]) {
76
+ const value = finiteNonNegative(capability[key]);
77
+ if (value !== undefined)
78
+ return value;
79
+ }
80
+ }
81
+ return undefined;
82
+ }
83
+ /**
84
+ * Tolerantly extract `{provider, model, score, price}` rows from a registry payload,
85
+ * keeping only entries this process could actually dispatch through: `reachable` AND
86
+ * `has_key` must be literally `true` (the proxy's own liveness/credential verdicts).
87
+ * Anything malformed — wrong types, missing provider/model — is FILTERED, never thrown:
88
+ * a half-broken registry degrades to a smaller expansion, not a failed populate.
89
+ */
90
+ function extractRegistryModels(payload) {
91
+ // The registry is providers × live models; tolerate a flat entry array, a
92
+ // `{providers|models|entries: [...]}` wrapper, or the live repair-proxy's
93
+ // provider-MAP form (`providers: {<name>: {has_key, reachable, models: [...]}}`
94
+ // — the name is the key, so it is folded into each entry as `name`), plus
95
+ // per-provider nested `models` in every form.
96
+ let container;
97
+ if (Array.isArray(payload)) {
98
+ container = payload;
99
+ }
100
+ else if (payload !== null && typeof payload === "object") {
101
+ for (const key of ["providers", "models", "entries"]) {
102
+ const wrapped = payload[key];
103
+ if (Array.isArray(wrapped)) {
104
+ container = wrapped;
105
+ break;
106
+ }
107
+ if (wrapped !== null && typeof wrapped === "object") {
108
+ container = Object.entries(wrapped).map(([name, entry]) => entry !== null && typeof entry === "object"
109
+ ? { name, ...entry }
110
+ : entry);
111
+ break;
112
+ }
113
+ }
114
+ }
115
+ if (!Array.isArray(container))
116
+ return [];
117
+ const models = [];
118
+ const push = (entry, provider, model) => {
119
+ if (typeof provider !== "string" || provider.trim().length === 0)
120
+ return;
121
+ if (typeof model !== "string" || model.trim().length === 0)
122
+ return;
123
+ if (entry.reachable !== true || entry.has_key !== true)
124
+ return;
125
+ models.push({
126
+ provider: provider.trim(),
127
+ model: model.trim(),
128
+ score: deriveScore(entry),
129
+ costPerMtok: finiteNonNegative(entry.cost_per_mtok) ??
130
+ finiteNonNegative(entry.price_per_mtok) ??
131
+ finiteNonNegative(entry.price),
132
+ contextTokens: deriveContextTokens(entry),
133
+ });
134
+ };
135
+ for (const raw of container) {
136
+ if (raw === null || typeof raw !== "object")
137
+ continue;
138
+ const entry = raw;
139
+ const provider = entry.provider ?? entry.name;
140
+ if (Array.isArray(entry.models)) {
141
+ // Provider-grouped form: reachable/has_key live on the provider row; each
142
+ // model row contributes id + score/price (and may override the flags).
143
+ for (const rawModel of entry.models) {
144
+ if (rawModel === null || typeof rawModel === "string") {
145
+ if (typeof rawModel === "string")
146
+ push(entry, provider, rawModel);
147
+ continue;
148
+ }
149
+ if (typeof rawModel !== "object")
150
+ continue;
151
+ const model = rawModel;
152
+ push({ ...entry, ...model, models: undefined }, provider, model.id ?? model.model);
153
+ }
154
+ continue;
155
+ }
156
+ push(entry, provider, entry.model ?? entry.id);
157
+ }
158
+ return models;
159
+ }
160
+ /**
161
+ * Expand registry models into `claude-worker` sources: per reachable+keyed backend
162
+ * provider, the top-K models by best-effort score (higher = better; unscored last).
163
+ * Shape per the plan's identity section: the transport never enters the identity —
164
+ * `backend_provider` + `model` key quota; `endpoint` is the proxy url the launch
165
+ * transport (3b) fronts the spawn with; `worker_kind` is `agentic` by definition
166
+ * (the whole point of the proxied lane is tool-call repair for a harness worker).
167
+ */
168
+ function expandSources(models, options) {
169
+ const byProvider = new Map();
170
+ // Dedup by (provider, model): live registries list some models twice, and one
171
+ // pool identity must expand to exactly one source (first row wins).
172
+ const seen = new Set();
173
+ for (const model of models) {
174
+ const identity = `${model.provider}/${model.model}`;
175
+ if (seen.has(identity))
176
+ continue;
177
+ seen.add(identity);
178
+ const bucket = byProvider.get(model.provider) ?? [];
179
+ bucket.push(model);
180
+ byProvider.set(model.provider, bucket);
181
+ }
182
+ const sources = [];
183
+ // Stable, content-derived order (provider, then score desc, then model id) so a
184
+ // re-populate over identical registry state emits byte-identical sources.
185
+ for (const provider of [...byProvider.keys()].sort()) {
186
+ const ranked = byProvider
187
+ .get(provider)
188
+ .sort((a, b) => (b.score ?? Number.NEGATIVE_INFINITY) - (a.score ?? Number.NEGATIVE_INFINITY) ||
189
+ a.model.localeCompare(b.model))
190
+ .slice(0, options.topK);
191
+ for (const model of ranked) {
192
+ // Cost precedence: operator-declared (free-to-operator axis) > registry list
193
+ // price > absent (falls through to the models.dev catalog / tier downstream).
194
+ const cost = options.costPerMtok ?? model.costPerMtok;
195
+ sources.push({
196
+ id: `claude-worker:${provider}/${model.model}`,
197
+ provider: "claude-worker",
198
+ endpoint: options.endpoint,
199
+ backend_provider: provider,
200
+ model: model.model,
201
+ worker_kind: "agentic",
202
+ ...(cost !== undefined ? { cost_per_mtok: cost } : {}),
203
+ ...(model.contextTokens !== undefined
204
+ ? { quota: { context_tokens: model.contextTokens } }
205
+ : {}),
206
+ });
207
+ }
208
+ }
209
+ return sources;
210
+ }
211
+ /**
212
+ * Probe a single source to verify the model is actually reachable.
213
+ * Returns { dropped: true, reason } if the model should be excluded (404/unavailable),
214
+ * or { dropped: false } to keep the source.
215
+ */
216
+ async function probeSource(source, endpoint, fetchImpl, timeoutMs) {
217
+ const controller = new AbortController();
218
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
219
+ try {
220
+ const response = await fetchImpl(`${endpoint}/v1/messages`, {
221
+ method: "POST",
222
+ headers: {
223
+ "x-api-key": "audit-tools-populate-probe",
224
+ "anthropic-version": "2023-06-01",
225
+ "content-type": "application/json",
226
+ },
227
+ body: JSON.stringify({
228
+ model: `${source.backend_provider}/${source.model}`,
229
+ max_tokens: 1,
230
+ messages: [{ role: "user", content: "hi" }],
231
+ }),
232
+ signal: controller.signal,
233
+ });
234
+ // Check for 404 or model-not-found patterns
235
+ if (response.status === 404) {
236
+ return { dropped: true, reason: "HTTP 404" };
237
+ }
238
+ if (response.status >= 400) {
239
+ let bodyText = "";
240
+ try {
241
+ bodyText = await response.text();
242
+ }
243
+ catch {
244
+ // If body read fails, just use status code
245
+ }
246
+ const patterns = [/model_not_found/i, /\bmay not exist\b/i, /no such model/i];
247
+ if (patterns.some((p) => p.test(bodyText))) {
248
+ return { dropped: true, reason: `HTTP ${response.status} (model unavailable)` };
249
+ }
250
+ }
251
+ // 200, 401, 429, 5xx, etc. → keep the source
252
+ return { dropped: false };
253
+ }
254
+ catch (error) {
255
+ // Transport failure (timeout, network error) → fail-open, keep the source
256
+ return { dropped: false };
257
+ }
258
+ finally {
259
+ clearTimeout(timeoutId);
260
+ }
261
+ }
262
+ /**
263
+ * Run probes with bounded concurrency using a simple worker pool.
264
+ */
265
+ async function probeSourcesWithConcurrency(sources, endpoint, fetchImpl, timeoutMs, concurrency) {
266
+ const results = [];
267
+ let index = 0;
268
+ const worker = async () => {
269
+ while (index < sources.length) {
270
+ const currentIndex = index++;
271
+ const source = sources[currentIndex];
272
+ const probeResult = await probeSource(source, endpoint, fetchImpl, timeoutMs);
273
+ results[currentIndex] = {
274
+ source,
275
+ dropped: probeResult.dropped,
276
+ reason: probeResult.reason,
277
+ };
278
+ }
279
+ };
280
+ const workers = Array(Math.min(concurrency, sources.length))
281
+ .fill(null)
282
+ .map(() => worker());
283
+ await Promise.all(workers);
284
+ // results is index-assigned (results[currentIndex] = ...), so it is already in
285
+ // the sources' order regardless of probe completion order.
286
+ return results;
287
+ }
288
+ /**
289
+ * POPULATE: fetch `GET <endpoint>/registry` and write the expanded `claude-worker`
290
+ * sources to the machine-level cache. Network-bound and cacheable — runs at Gate-0
291
+ * build / explicit refresh, NEVER inside `resolveAmbientSources` (which only READS
292
+ * via {@link readProxyCatalog}). Never throws: a failed fetch returns
293
+ * `{written:false, reason}` and leaves any prior cache untouched; an empty/zero-match
294
+ * registry WRITES an empty expansion (fresh knowledge — resolve reports the lane
295
+ * unexpanded with a reason).
296
+ */
297
+ export async function populateProxyCatalog(options) {
298
+ const endpoint = options.endpoint.replace(/\/+$/u, "");
299
+ const doFetch = options.fetchImpl ?? fetch;
300
+ // Freshness short-circuit: the populate trigger fires on EVERY
301
+ // confirmation-absent next-step (nextStepCommand.ts), and populate now carries
302
+ // live per-model probes — real `/v1/messages` POSTs through the proxy that cost
303
+ // seconds of wall AND burn free-tier rate quota. A same-endpoint cache younger
304
+ // than the TTL answers instead (measured 2026-07-17: per-invocation populate
305
+ // was ~5.6s live, which alone pushed the e2e wrapper tests past their
306
+ // timeouts). This is a REFRESH throttle, not staleness acceptance — the
307
+ // no-TTL-on-READ residual (backlog: catalog accepted arbitrarily stale by
308
+ // resolve) is unchanged.
309
+ const cached = readProxyCatalog({ homeDir: options.homeDir });
310
+ if (cached && cached.endpoint === endpoint) {
311
+ const nowMs = (options.now?.() ?? new Date()).getTime();
312
+ const fetchedMs = Date.parse(cached.fetched_at);
313
+ if (Number.isFinite(fetchedMs) &&
314
+ nowMs - fetchedMs >= 0 &&
315
+ nowMs - fetchedMs < POPULATE_CACHE_FRESH_TTL_MS) {
316
+ return {
317
+ sources: cached.sources,
318
+ written: false,
319
+ reason: `cache is fresh (fetched ${Math.round((nowMs - fetchedMs) / 1000)}s ago); refresh skipped.`,
320
+ dropped: [],
321
+ };
322
+ }
323
+ }
324
+ let payload;
325
+ try {
326
+ const response = await doFetch(`${endpoint}/registry`);
327
+ if (!response.ok) {
328
+ return {
329
+ sources: [],
330
+ written: false,
331
+ reason: `GET ${endpoint}/registry returned HTTP ${response.status}.`,
332
+ dropped: [],
333
+ };
334
+ }
335
+ payload = await response.json();
336
+ }
337
+ catch (error) {
338
+ return {
339
+ sources: [],
340
+ written: false,
341
+ reason: `GET ${endpoint}/registry failed: ${error instanceof Error ? error.message : String(error)}.`,
342
+ dropped: [],
343
+ };
344
+ }
345
+ let sources = expandSources(extractRegistryModels(payload), {
346
+ endpoint,
347
+ topK: options.topK ?? DEFAULT_PROXY_TOP_K,
348
+ costPerMtok: options.costPerMtok,
349
+ });
350
+ // Probe each source to verify reachability
351
+ const probeResults = await probeSourcesWithConcurrency(sources, endpoint, doFetch, POPULATE_PROBE_TIMEOUT_MS, POPULATE_PROBE_CONCURRENCY);
352
+ const dropped = [];
353
+ sources = probeResults
354
+ .filter((result) => {
355
+ if (result.dropped) {
356
+ dropped.push({
357
+ id: result.source.id ?? `claude-worker:${result.source.backend_provider}/${result.source.model}`,
358
+ reason: result.reason ?? "model unavailable",
359
+ });
360
+ return false;
361
+ }
362
+ return true;
363
+ })
364
+ .map((result) => result.source);
365
+ const catalog = {
366
+ fetched_at: (options.now?.() ?? new Date()).toISOString(),
367
+ endpoint,
368
+ sources,
369
+ };
370
+ const path = resolveProxyCatalogPath(options.homeDir);
371
+ try {
372
+ await mkdir(dirname(path), { recursive: true });
373
+ await writeJsonFile(path, catalog);
374
+ }
375
+ catch (error) {
376
+ return {
377
+ sources,
378
+ written: false,
379
+ reason: `could not write ${path}: ${error instanceof Error ? error.message : String(error)}.`,
380
+ dropped,
381
+ };
382
+ }
383
+ return { sources, written: true, dropped };
384
+ }
385
+ function defaultReadCatalogFile(path) {
386
+ try {
387
+ return readFileSync(path, "utf8");
388
+ }
389
+ catch {
390
+ return null;
391
+ }
392
+ }
393
+ /**
394
+ * READ the populate cache. Returns the entries + `fetched_at` (NO TTL enforcement —
395
+ * staleness policy is a later commit; the caller decides). Degrades to `null` on
396
+ * absent / unparseable / structurally-invalid content — never throws (same bar as
397
+ * `readSourceDeclaration`: the resolve path must not be failable by a bad file).
398
+ * Cached sources are held to the shared source validator, so a hand-edited or
399
+ * version-skewed cache degrades to "no cache" rather than admitting a half-checked pool.
400
+ */
401
+ export function readProxyCatalog(deps = {}) {
402
+ const path = resolveProxyCatalogPath(deps.homeDir);
403
+ const raw = (deps.readCatalogFile ?? defaultReadCatalogFile)(path);
404
+ if (raw === null)
405
+ return null;
406
+ let parsed;
407
+ try {
408
+ parsed = JSON.parse(raw);
409
+ }
410
+ catch {
411
+ return null;
412
+ }
413
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
414
+ return null;
415
+ }
416
+ const { fetched_at, endpoint, sources } = parsed;
417
+ if (typeof fetched_at !== "string" || typeof endpoint !== "string")
418
+ return null;
419
+ if (!Array.isArray(sources))
420
+ return null;
421
+ const issues = validateSessionConfig({ sources });
422
+ if (issues.some((issue) => issue.severity === "error"))
423
+ return null;
424
+ return { fetched_at, endpoint, sources: sources };
425
+ }
426
+ //# sourceMappingURL=proxyCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxyCatalog.js","sourceRoot":"","sources":["../../../src/shared/providers/proxyCatalog.ts"],"names":[],"mappings":"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"}