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
@@ -1,4 +1,4 @@
1
- import { mkdir, mkdtemp, readFile, rm, stat, unlink, writeFile } from 'node:fs/promises';
1
+ import { mkdir, mkdtemp, readFile, rm, stat, unlink } from 'node:fs/promises';
2
2
  import { tmpdir } from 'node:os';
3
3
  import { dirname, join, relative, resolve } from 'node:path';
4
4
  import { fileURLToPath } from 'node:url';
@@ -289,8 +289,8 @@ export const INSTALL_HOST_DEFINITIONS = {
289
289
  });
290
290
  await collect(checks, 'antigravity_guide', async () => {
291
291
  const content = await readFile(assetPaths.antigravityPlanningGuidePath, 'utf8');
292
- if (!content.includes('--host-models') || !content.includes('next-step')) {
293
- throw new Error('Antigravity guide must embed the canonical loader body (next-step capability handshake including --host-models).');
292
+ if (!content.includes('--auditor') || !content.includes('next-step')) {
293
+ throw new Error('Antigravity guide must embed the canonical loader body (next-step capability handshake including the --auditor descriptor).');
294
294
  }
295
295
  return {
296
296
  summary: 'Antigravity planning guide embeds the canonical loader body with the capability handshake.',
@@ -668,13 +668,9 @@ export async function installBootstrap(argv, options = {}) {
668
668
  );
669
669
  results.push(await writeGeneratedJson(installManifestPath, installManifest));
670
670
 
671
- const sessionConfigPath = join(root, '.audit-tools', 'audit', 'session-config.json');
672
- if (!(await fileExists(sessionConfigPath))) {
673
- const defaultConfig = { provider: 'worker-command' };
674
- await mkdir(dirname(sessionConfigPath), { recursive: true });
675
- await writeFile(sessionConfigPath, JSON.stringify(defaultConfig, null, 2) + '\n', 'utf8');
676
- results.push({ path: sessionConfigPath, mode: 'created' });
677
- }
671
+ // No session-config seeding: `provider` is per-auditor dispatch inventory and
672
+ // cannot be persisted on session-config.json (G2); loadSessionConfig creates
673
+ // the empty default on demand.
678
674
 
679
675
  const payload = {
680
676
  host,
@@ -1,4 +1,4 @@
1
- import { mkdir, mkdtemp, readFile, rm, stat, unlink, writeFile } from 'node:fs/promises';
1
+ import { mkdir, mkdtemp, readFile, rm, stat, unlink } from 'node:fs/promises';
2
2
  import { tmpdir } from 'node:os';
3
3
  import { dirname, join, relative, resolve } from 'node:path';
4
4
  import { fileURLToPath } from 'node:url';
@@ -662,13 +662,9 @@ export async function installBootstrap(argv, options = {}) {
662
662
  );
663
663
  results.push(await writeGeneratedJson(installManifestPath, installManifest));
664
664
 
665
- const sessionConfigPath = join(root, '.audit-tools', 'remediation', 'session-config.json');
666
- if (!(await fileExists(sessionConfigPath))) {
667
- const defaultConfig = { provider: 'worker-command' };
668
- await mkdir(dirname(sessionConfigPath), { recursive: true });
669
- await writeFile(sessionConfigPath, JSON.stringify(defaultConfig, null, 2) + '\n', 'utf8');
670
- results.push({ path: sessionConfigPath, mode: 'created' });
671
- }
665
+ // No session-config seeding: `provider` is per-auditor dispatch inventory and
666
+ // cannot be persisted on session-config.json (G2); the config is created
667
+ // empty on demand.
672
668
 
673
669
  const payload = {
674
670
  host,
@@ -1,84 +0,0 @@
1
- /**
2
- * repair-proxy `/registry` discovery → dispatchable sources.
3
- *
4
- * repair-proxy is an OpenAI-compatible multiplexer fronting many HTTP providers/models
5
- * behind ONE endpoint. This module reads its `GET {base_url}/registry`, selects a
6
- * cost-aware top-K model candidate set per reachable+keyed backend provider, and expands
7
- * each candidate into a {@link DispatchableSource} that dispatches through the UNCHANGED
8
- * `openai-compatible` transport (the proxy routes the namespaced `provider/model`).
9
- *
10
- * Fail-open by contract: the fetch degrades to `null` on ANY failure (network / non-200 /
11
- * malformed body) and `expandRepairProxySources` returns `[]` — a `/registry` outage must
12
- * NEVER throw into the source-gather path.
13
- *
14
- * Per-backend-provider quota accounting: each source's `account` = its backend provider,
15
- * so 429 / cooldown folds PER PROVIDER (via `foldAccountCooldownAcrossPools`), not per
16
- * proxy URL. The pool key stays `(provider, model, account)`.
17
- */
18
- import type { DispatchableSource, RepairProxyConfig } from "../types/sessionConfig.js";
19
- /** A model entry as it appears under a provider in the `/registry` body. */
20
- export interface RegistryModel {
21
- id: string;
22
- capability: {
23
- bfcl_overall?: number | null;
24
- bfcl_multi_turn?: number | null;
25
- bfcl_irrelevance?: number | null;
26
- arena_rating?: number | null;
27
- arena_rank?: number | null;
28
- composite_rank?: number | null;
29
- } | null;
30
- }
31
- /** One backend provider block in the `/registry` body. */
32
- export interface RegistryProvider {
33
- base?: string;
34
- kind?: string;
35
- has_key?: boolean;
36
- reachable?: boolean;
37
- models?: RegistryModel[];
38
- }
39
- /** The parsed `/registry` view we consume (only the fields this path reads). */
40
- export interface RegistryView {
41
- providers: Record<string, RegistryProvider>;
42
- }
43
- /** A selected candidate: a concrete backend `provider/model` with optional cost/quota. */
44
- export interface RepairProxyCandidate {
45
- provider: string;
46
- model: string;
47
- cost_per_mtok?: number;
48
- quota?: DispatchableSource["quota"];
49
- /**
50
- * The model's raw `composite_rank` (LOWER = better), carried onto the source so it
51
- * flows into cost-ranking as a cost-equal tiebreak. Absent when the registry model
52
- * has no `composite_rank` (the null-capability, sorts-last case).
53
- */
54
- capability_rank?: number;
55
- }
56
- /**
57
- * GET `${baseUrl}/registry`, parse, and return a {@link RegistryView}. Returns `null`
58
- * on ANY failure — a thrown fetch, a non-2xx response, or a body that doesn't parse to
59
- * the expected `{providers}` shape. Never throws.
60
- */
61
- export declare function fetchRepairProxyRegistry(baseUrl: string, fetchFn?: typeof fetch): Promise<RegistryView | null>;
62
- /**
63
- * Cost-aware top-K candidate set: for each provider that is `reachable && has_key`
64
- * (and not disabled via `cfg.providers[name].enabled === false`), take the top-K models
65
- * (default {@link DEFAULT_TOP_K}, overridable by `cfg.top_k`) ranked by capability —
66
- * lower `composite_rank` better, null-capability models last. `cost_per_mtok` is attached
67
- * from the operator's `cfg.providers[name].cost_per_mtok` override when declared (else
68
- * left undefined → resolved by models.dev at rank time).
69
- */
70
- export declare function selectRepairProxyCandidates(registry: RegistryView, cfg: RepairProxyConfig): RepairProxyCandidate[];
71
- /**
72
- * Fetch the registry + select candidates + map each to a {@link DispatchableSource}
73
- * dispatched through the `openai-compatible` transport against the proxy root. Returns
74
- * `[]` on a null registry (fail-open) so a `/registry` outage never breaks source-gather.
75
- *
76
- * Each source:
77
- * - `id: "repair-proxy/<provider>/<model>"` — stable, distinct per backend model.
78
- * - `provider: "openai-compatible"` — the unchanged HTTP transport.
79
- * - `endpoint`: the proxy ROOT (`OpenAiCompatibleProvider` appends `/chat/completions`).
80
- * - `model: "<provider>/<model>"` — namespaced; the proxy routes it to the backend.
81
- * - `account: "<provider>"` — so 429 / cooldown folds PER BACKEND PROVIDER.
82
- */
83
- export declare function expandRepairProxySources(cfg: RepairProxyConfig, fetchFn?: typeof fetch): Promise<DispatchableSource[]>;
84
- //# sourceMappingURL=repairProxyRegistry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repairProxyRegistry.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/repairProxyRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEvF,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE;QACV,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAChC,GAAG,IAAI,CAAC;CACV;AAED,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,gFAAgF;AAChF,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC7C;AAED,0FAA0F;AAC1F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACpC;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAaD;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAW9B;AAWD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,YAAY,EACtB,GAAG,EAAE,iBAAiB,GACrB,oBAAoB,EAAE,CA8CxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,iBAAiB,EACtB,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAsB/B"}
@@ -1,144 +0,0 @@
1
- /**
2
- * repair-proxy `/registry` discovery → dispatchable sources.
3
- *
4
- * repair-proxy is an OpenAI-compatible multiplexer fronting many HTTP providers/models
5
- * behind ONE endpoint. This module reads its `GET {base_url}/registry`, selects a
6
- * cost-aware top-K model candidate set per reachable+keyed backend provider, and expands
7
- * each candidate into a {@link DispatchableSource} that dispatches through the UNCHANGED
8
- * `openai-compatible` transport (the proxy routes the namespaced `provider/model`).
9
- *
10
- * Fail-open by contract: the fetch degrades to `null` on ANY failure (network / non-200 /
11
- * malformed body) and `expandRepairProxySources` returns `[]` — a `/registry` outage must
12
- * NEVER throw into the source-gather path.
13
- *
14
- * Per-backend-provider quota accounting: each source's `account` = its backend provider,
15
- * so 429 / cooldown folds PER PROVIDER (via `foldAccountCooldownAcrossPools`), not per
16
- * proxy URL. The pool key stays `(provider, model, account)`.
17
- */
18
- const DEFAULT_TOP_K = 5;
19
- /** Strip a trailing slash so `${base}/registry` never doubles it. */
20
- function trimTrailingSlash(url) {
21
- return url.replace(/\/+$/, "");
22
- }
23
- function isRecord(value) {
24
- return typeof value === "object" && value !== null && !Array.isArray(value);
25
- }
26
- /**
27
- * GET `${baseUrl}/registry`, parse, and return a {@link RegistryView}. Returns `null`
28
- * on ANY failure — a thrown fetch, a non-2xx response, or a body that doesn't parse to
29
- * the expected `{providers}` shape. Never throws.
30
- */
31
- export async function fetchRepairProxyRegistry(baseUrl, fetchFn = fetch) {
32
- const url = `${trimTrailingSlash(baseUrl)}/registry`;
33
- try {
34
- const res = await fetchFn(url);
35
- if (!res || !res.ok)
36
- return null;
37
- const body = await res.json();
38
- if (!isRecord(body) || !isRecord(body.providers))
39
- return null;
40
- return { providers: body.providers };
41
- }
42
- catch {
43
- return null;
44
- }
45
- }
46
- /**
47
- * A model's capability sort key: lower `composite_rank` = better. Models with no
48
- * capability (or no composite_rank) sort LAST via a `+Infinity` sentinel.
49
- */
50
- function capabilityRankOf(model) {
51
- const rank = model.capability?.composite_rank;
52
- return typeof rank === "number" && Number.isFinite(rank) ? rank : Number.POSITIVE_INFINITY;
53
- }
54
- /**
55
- * Cost-aware top-K candidate set: for each provider that is `reachable && has_key`
56
- * (and not disabled via `cfg.providers[name].enabled === false`), take the top-K models
57
- * (default {@link DEFAULT_TOP_K}, overridable by `cfg.top_k`) ranked by capability —
58
- * lower `composite_rank` better, null-capability models last. `cost_per_mtok` is attached
59
- * from the operator's `cfg.providers[name].cost_per_mtok` override when declared (else
60
- * left undefined → resolved by models.dev at rank time).
61
- */
62
- export function selectRepairProxyCandidates(registry, cfg) {
63
- const topK = typeof cfg.top_k === "number" && Number.isInteger(cfg.top_k) && cfg.top_k > 0
64
- ? cfg.top_k
65
- : DEFAULT_TOP_K;
66
- const out = [];
67
- // Stable provider iteration order (registry object order is not guaranteed stable
68
- // across proxy restarts) so the candidate set is content-derived, not map-order.
69
- const providerNames = Object.keys(registry.providers).sort();
70
- for (const name of providerNames) {
71
- const provider = registry.providers[name];
72
- if (!provider || provider.reachable !== true || provider.has_key !== true)
73
- continue;
74
- if (cfg.providers?.[name]?.enabled === false)
75
- continue;
76
- // Fail-open hardening: the registry body is validated only down to `providers`
77
- // being a record (fetchRepairProxyRegistry), so a 200 with malformed model entries
78
- // (missing/ non-string `id`, or a non-object) reaches here. Drop those BEFORE the
79
- // sort — `undefined.localeCompare` would otherwise throw out of the whole
80
- // source-gather path and break Gate-0 / dispatch (the "degrades to [] on ANY
81
- // malformed body" contract). Skip-the-bad-entry, not drop-the-provider.
82
- const models = (Array.isArray(provider.models) ? provider.models : []).filter((m) => isRecord(m) && typeof m.id === "string");
83
- // Rank by capability (lower composite_rank first), tie-break by model id for a
84
- // stable, content-derived order; then take the top-K.
85
- const ranked = [...models].sort((a, b) => {
86
- const byRank = capabilityRankOf(a) - capabilityRankOf(b);
87
- if (byRank !== 0)
88
- return byRank;
89
- return a.id.localeCompare(b.id);
90
- });
91
- const costOverride = cfg.providers?.[name]?.cost_per_mtok;
92
- for (const model of ranked.slice(0, topK)) {
93
- // Carry the raw composite_rank (LOWER = better) onto the candidate — the same
94
- // score used for the top-K ordering above becomes the downstream cost-equal
95
- // tiebreak. Omitted for null-capability models (the +Infinity sentinel).
96
- const rank = model.capability?.composite_rank;
97
- const capabilityRank = typeof rank === "number" && Number.isFinite(rank) ? rank : undefined;
98
- out.push({
99
- provider: name,
100
- model: model.id,
101
- ...(typeof costOverride === "number" ? { cost_per_mtok: costOverride } : {}),
102
- ...(capabilityRank !== undefined ? { capability_rank: capabilityRank } : {}),
103
- });
104
- }
105
- }
106
- return out;
107
- }
108
- /**
109
- * Fetch the registry + select candidates + map each to a {@link DispatchableSource}
110
- * dispatched through the `openai-compatible` transport against the proxy root. Returns
111
- * `[]` on a null registry (fail-open) so a `/registry` outage never breaks source-gather.
112
- *
113
- * Each source:
114
- * - `id: "repair-proxy/<provider>/<model>"` — stable, distinct per backend model.
115
- * - `provider: "openai-compatible"` — the unchanged HTTP transport.
116
- * - `endpoint`: the proxy ROOT (`OpenAiCompatibleProvider` appends `/chat/completions`).
117
- * - `model: "<provider>/<model>"` — namespaced; the proxy routes it to the backend.
118
- * - `account: "<provider>"` — so 429 / cooldown folds PER BACKEND PROVIDER.
119
- */
120
- export async function expandRepairProxySources(cfg, fetchFn = fetch) {
121
- const registry = await fetchRepairProxyRegistry(cfg.base_url, fetchFn);
122
- if (!registry)
123
- return [];
124
- const baseUrl = cfg.base_url;
125
- return selectRepairProxyCandidates(registry, cfg).map((candidate) => {
126
- // 429/cooldown fold axis: provider-wide by DEFAULT (one 429 propagates across all the
127
- // provider's models), or per-model when the operator flags this provider as having
128
- // distinct per-model rate limits. Per-pool token/concurrency limits stay per-model.
129
- const perModel = cfg.providers?.[candidate.provider]?.per_model_limits === true;
130
- const account = perModel ? `${candidate.provider}/${candidate.model}` : candidate.provider;
131
- return {
132
- id: `repair-proxy/${candidate.provider}/${candidate.model}`,
133
- provider: "openai-compatible",
134
- endpoint: baseUrl,
135
- model: `${candidate.provider}/${candidate.model}`,
136
- ...(cfg.api_key_env !== undefined ? { api_key_env: cfg.api_key_env } : {}),
137
- account,
138
- ...(candidate.cost_per_mtok !== undefined ? { cost_per_mtok: candidate.cost_per_mtok } : {}),
139
- ...(candidate.quota !== undefined ? { quota: candidate.quota } : {}),
140
- ...(candidate.capability_rank != null ? { capability_rank: candidate.capability_rank } : {}),
141
- };
142
- });
143
- }
144
- //# sourceMappingURL=repairProxyRegistry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repairProxyRegistry.js","sourceRoot":"","sources":["../../../src/shared/quota/repairProxyRegistry.ts"],"names":[],"mappings":"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"}