audit-tools 0.30.1 → 0.30.3

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 (62) hide show
  1. package/dist/audit/cli/prompts.d.ts.map +1 -1
  2. package/dist/audit/cli/prompts.js +3 -1
  3. package/dist/audit/cli/prompts.js.map +1 -1
  4. package/dist/audit/quota/index.d.ts +5 -0
  5. package/dist/audit/quota/index.d.ts.map +1 -1
  6. package/dist/remediate/steps/dispatch.d.ts.map +1 -1
  7. package/dist/remediate/steps/dispatch.js +16 -22
  8. package/dist/remediate/steps/dispatch.js.map +1 -1
  9. package/dist/remediate/steps/nextStep.d.ts.map +1 -1
  10. package/dist/remediate/steps/nextStep.js +5 -1
  11. package/dist/remediate/steps/nextStep.js.map +1 -1
  12. package/dist/shared/dispatch/rollingDispatch.d.ts.map +1 -1
  13. package/dist/shared/dispatch/rollingDispatch.js +7 -3
  14. package/dist/shared/dispatch/rollingDispatch.js.map +1 -1
  15. package/dist/shared/index.d.ts +4 -1
  16. package/dist/shared/index.d.ts.map +1 -1
  17. package/dist/shared/index.js +3 -1
  18. package/dist/shared/index.js.map +1 -1
  19. package/dist/shared/quota/apiPool.d.ts +1 -1
  20. package/dist/shared/quota/apiPool.d.ts.map +1 -1
  21. package/dist/shared/quota/apiPool.js +29 -7
  22. package/dist/shared/quota/apiPool.js.map +1 -1
  23. package/dist/shared/quota/capacity.d.ts +15 -0
  24. package/dist/shared/quota/capacity.d.ts.map +1 -1
  25. package/dist/shared/quota/capacity.js +5 -0
  26. package/dist/shared/quota/capacity.js.map +1 -1
  27. package/dist/shared/quota/claudeOAuthQuotaSource.d.ts +43 -2
  28. package/dist/shared/quota/claudeOAuthQuotaSource.d.ts.map +1 -1
  29. package/dist/shared/quota/claudeOAuthQuotaSource.js +168 -17
  30. package/dist/shared/quota/claudeOAuthQuotaSource.js.map +1 -1
  31. package/dist/shared/quota/codexQuotaSource.d.ts +3 -0
  32. package/dist/shared/quota/codexQuotaSource.d.ts.map +1 -1
  33. package/dist/shared/quota/codexQuotaSource.js +8 -0
  34. package/dist/shared/quota/codexQuotaSource.js.map +1 -1
  35. package/dist/shared/quota/compositeQuotaSource.d.ts +22 -0
  36. package/dist/shared/quota/compositeQuotaSource.d.ts.map +1 -1
  37. package/dist/shared/quota/compositeQuotaSource.js +42 -0
  38. package/dist/shared/quota/compositeQuotaSource.js.map +1 -1
  39. package/dist/shared/quota/coverage.d.ts +45 -0
  40. package/dist/shared/quota/coverage.d.ts.map +1 -0
  41. package/dist/shared/quota/coverage.js +77 -0
  42. package/dist/shared/quota/coverage.js.map +1 -0
  43. package/dist/shared/quota/httpQuotaSource.d.ts +31 -4
  44. package/dist/shared/quota/httpQuotaSource.d.ts.map +1 -1
  45. package/dist/shared/quota/httpQuotaSource.js +46 -6
  46. package/dist/shared/quota/httpQuotaSource.js.map +1 -1
  47. package/dist/shared/quota/quotaCoverageNudge.d.ts +26 -0
  48. package/dist/shared/quota/quotaCoverageNudge.d.ts.map +1 -0
  49. package/dist/shared/quota/quotaCoverageNudge.js +82 -0
  50. package/dist/shared/quota/quotaCoverageNudge.js.map +1 -0
  51. package/dist/shared/quota/quotaSource.d.ts +23 -0
  52. package/dist/shared/quota/quotaSource.d.ts.map +1 -1
  53. package/dist/shared/quota/quotaSource.js +15 -0
  54. package/dist/shared/quota/quotaSource.js.map +1 -1
  55. package/dist/shared/quota/scheduler.d.ts +10 -2
  56. package/dist/shared/quota/scheduler.d.ts.map +1 -1
  57. package/dist/shared/quota/scheduler.js +12 -3
  58. package/dist/shared/quota/scheduler.js.map +1 -1
  59. package/dist/shared/types/sessionConfig.d.ts +16 -0
  60. package/dist/shared/types/sessionConfig.d.ts.map +1 -1
  61. package/dist/shared/types/sessionConfig.js.map +1 -1
  62. package/package.json +1 -1
@@ -1,41 +1,121 @@
1
- import { readFileSync } from "node:fs";
1
+ import { readFileSync, writeFileSync, renameSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import path from "node:path";
4
+ import { withFileLock } from "./fileLock.js";
4
5
  import { BaseHttpQuotaSource, fetchJsonOrNull, clampFraction, parseProviderModelKey, } from "./httpQuotaSource.js";
5
6
  /**
6
- * Proactive Claude-subscription quota source — reads the local Claude OAuth
7
- * credential and queries the undocumented `api.anthropic.com/api/oauth/usage`
8
- * endpoint (the only proactive remaining-quota signal Claude Code exposes),
9
- * mapping the most-constraining window to a {@link QuotaUsageSnapshot}. The
10
- * cross-cutting cache/guard/degrade behavior lives in {@link BaseHttpQuotaSource}.
7
+ * Proactive Claude-subscription quota source — resolves a Claude OAuth access
8
+ * token (see {@link resolveAccessToken}) and queries the undocumented
9
+ * `api.anthropic.com/api/oauth/usage` endpoint (the only proactive
10
+ * remaining-quota signal Claude Code exposes), mapping the most-constraining
11
+ * window to a {@link QuotaUsageSnapshot}. The cross-cutting cache/guard/degrade
12
+ * behavior lives in {@link BaseHttpQuotaSource}.
13
+ *
14
+ * Credential resolution (first hit wins; see
15
+ * docs/quota-claude-credential-resolution.md):
16
+ * 1. `CLAUDE_CODE_OAUTH_TOKEN` — the only docs-blessed subprocess handoff
17
+ * (`claude setup-token`). Used as-is, NO file is read or written. This is
18
+ * what lets a non-CLI host (e.g. the Claude Desktop app, whose own token
19
+ * lives in an OS-encrypted store we must not decrypt) still get a proactive
20
+ * account-level reading.
21
+ * 2. `~/.claude/.credentials.json` (the CLI credential) with REFRESH-ON-EXPIRY:
22
+ * when the access token is missing/expired (or `/usage` 401s) but a refresh
23
+ * token is present, the refresh grant is run and the ROTATED credential is
24
+ * persisted atomically under {@link withFileLock} (double-checked: the file
25
+ * is re-read after the lock is acquired, so concurrent probes never
26
+ * double-rotate and invalidate each other's refresh token).
27
+ * 3. Otherwise degrade to null — the {@link CompositeQuotaSource} falls through
28
+ * to the reactive host-session source.
11
29
  */
12
30
  const CLAUDE_PROVIDER_NAMES = new Set(["claude-code", "claude"]);
13
31
  const USAGE_ENDPOINT = "https://api.anthropic.com/api/oauth/usage";
14
32
  const OAUTH_BETA_HEADER = "oauth-2025-04-20";
15
33
  const DEFAULT_USER_AGENT = "claude-cli (external, cli)";
34
+ /** Claude Code's public OAuth client id + token endpoint (refresh grant). */
35
+ const OAUTH_CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
36
+ const OAUTH_TOKEN_ENDPOINT = "https://console.anthropic.com/v1/oauth/token";
16
37
  // Re-exported for back-compat (tests + index import these from here).
17
38
  export { parseProviderModelKey };
18
39
  export class ClaudeOAuthQuotaSource extends BaseHttpQuotaSource {
19
40
  name = "claude-oauth";
20
41
  credentialsPath;
42
+ usingDefaultCredentialsPath;
21
43
  providerNames;
44
+ readEnvToken;
45
+ oauthClientId;
46
+ oauthTokenEndpoint;
22
47
  constructor(options = {}) {
23
48
  super(options, DEFAULT_USER_AGENT);
49
+ this.usingDefaultCredentialsPath = options.credentialsPath === undefined;
24
50
  this.credentialsPath =
25
51
  options.credentialsPath ?? path.join(homedir(), ".claude", ".credentials.json");
26
52
  this.providerNames = new Set(options.claudeProviderNames ?? CLAUDE_PROVIDER_NAMES);
53
+ this.readEnvToken =
54
+ options.readEnvToken ?? (() => process.env.CLAUDE_CODE_OAUTH_TOKEN);
55
+ this.oauthClientId = options.oauthClientId ?? OAUTH_CLIENT_ID;
56
+ this.oauthTokenEndpoint = options.oauthTokenEndpoint ?? OAUTH_TOKEN_ENDPOINT;
27
57
  }
28
58
  handlesProvider(provider) {
29
59
  return this.providerNames.has(provider);
30
60
  }
61
+ /**
62
+ * Account id = the credential's `organizationUuid` (account/org the token is
63
+ * bound to). Read from the creds file; null when only an env token is present
64
+ * (the org isn't carried there) or the file is absent — the pool then stays
65
+ * account-unkeyed, which is correct for a single-account run.
66
+ */
67
+ readAccountId(_provider) {
68
+ if (this.shouldSkipCredentialRead(this.usingDefaultCredentialsPath))
69
+ return null;
70
+ const full = this.readFullCredentials();
71
+ const org = full?.organizationUuid;
72
+ return typeof org === "string" && org !== "" ? org : null;
73
+ }
31
74
  async fetchSnapshot(_provider, model, nowMs) {
32
- const accessToken = this.readAccessToken(nowMs);
33
- if (!accessToken)
75
+ const resolved = await this.resolveAccessToken(nowMs, false);
76
+ if (!resolved)
77
+ return null;
78
+ const snap = await fetchClaudeUsage({ accessToken: resolved.accessToken, model }, this.fetchContext());
79
+ if (snap)
80
+ return snap;
81
+ // A null here means a non-200 (commonly 401: token revoked/expired between
82
+ // resolution and use). For a FILE-origin token we can recover by forcing one
83
+ // refresh and retrying; an env token is operator-owned and not ours to rotate.
84
+ if (resolved.origin !== "file")
85
+ return null;
86
+ const refreshed = await this.resolveAccessToken(nowMs, true);
87
+ if (!refreshed || refreshed.accessToken === resolved.accessToken)
88
+ return null;
89
+ return fetchClaudeUsage({ accessToken: refreshed.accessToken, model }, this.fetchContext());
90
+ }
91
+ /**
92
+ * Resolve an access token via the documented chain (env handoff → CLI file
93
+ * with refresh-on-expiry). `forceRefresh` skips the still-valid fast path and
94
+ * always runs the refresh grant (used to recover from a 401).
95
+ */
96
+ async resolveAccessToken(nowMs, forceRefresh) {
97
+ const envToken = this.readEnvToken();
98
+ if (typeof envToken === "string" && envToken.trim() !== "") {
99
+ return { accessToken: envToken.trim(), origin: "env" };
100
+ }
101
+ const oauth = this.readOAuthBlock();
102
+ if (!oauth)
34
103
  return null;
35
- return fetchClaudeUsage({ accessToken, model }, this.fetchContext());
104
+ const valid = typeof oauth.accessToken === "string" &&
105
+ oauth.accessToken !== "" &&
106
+ !(typeof oauth.expiresAt === "number" && nowMs >= oauth.expiresAt);
107
+ if (valid && !forceRefresh) {
108
+ return { accessToken: oauth.accessToken, origin: "file" };
109
+ }
110
+ // Expired/missing/forced and no refresh token → degrade (nothing to refresh).
111
+ if (typeof oauth.refreshToken !== "string" || oauth.refreshToken === "") {
112
+ return null;
113
+ }
114
+ const refreshed = await this.refreshAndPersist(nowMs, forceRefresh);
115
+ return refreshed ? { accessToken: refreshed, origin: "file" } : null;
36
116
  }
37
- /** Reads a non-expired access token from the local credential file, or null. */
38
- readAccessToken(nowMs) {
117
+ /** Parse the `claudeAiOauth` block from the credential file, or null. */
118
+ readOAuthBlock() {
39
119
  let raw;
40
120
  try {
41
121
  raw = readFileSync(this.credentialsPath, "utf8");
@@ -43,19 +123,90 @@ export class ClaudeOAuthQuotaSource extends BaseHttpQuotaSource {
43
123
  catch {
44
124
  return null; // missing file (e.g. creds in an OS keychain) → degrade
45
125
  }
46
- let parsed;
47
126
  try {
48
- parsed = JSON.parse(raw);
127
+ return JSON.parse(raw).claudeAiOauth ?? null;
49
128
  }
50
129
  catch {
51
130
  return null;
52
131
  }
53
- const oauth = parsed.claudeAiOauth;
54
- if (!oauth?.accessToken)
132
+ }
133
+ /**
134
+ * Run the refresh grant and persist the ROTATED credential under a file lock.
135
+ * Double-checked: after the lock is held the file is re-read, so if a
136
+ * concurrent probe already refreshed (token now valid, and we are not forcing)
137
+ * that fresh token is used instead of rotating again — a second rotation would
138
+ * invalidate the first refresh token and brick the credential.
139
+ */
140
+ async refreshAndPersist(nowMs, forceRefresh) {
141
+ const lockPath = `${this.credentialsPath}.lock`;
142
+ try {
143
+ return await withFileLock(lockPath, async () => {
144
+ const oauth = this.readOAuthBlock();
145
+ if (!oauth)
146
+ return null;
147
+ const stillValid = typeof oauth.accessToken === "string" &&
148
+ oauth.accessToken !== "" &&
149
+ !(typeof oauth.expiresAt === "number" && nowMs >= oauth.expiresAt);
150
+ if (stillValid && !forceRefresh)
151
+ return oauth.accessToken;
152
+ if (typeof oauth.refreshToken !== "string" || oauth.refreshToken === "")
153
+ return null;
154
+ const grant = await this.runRefreshGrant(oauth.refreshToken);
155
+ if (!grant?.access_token || !grant.refresh_token || typeof grant.expires_in !== "number") {
156
+ return null;
157
+ }
158
+ const next = {
159
+ ...(this.readFullCredentials() ?? {}),
160
+ };
161
+ next.claudeAiOauth = {
162
+ ...(next.claudeAiOauth ?? {}),
163
+ accessToken: grant.access_token,
164
+ refreshToken: grant.refresh_token,
165
+ expiresAt: nowMs + grant.expires_in * 1000,
166
+ scopes: grant.scope ? grant.scope.split(" ") : next.claudeAiOauth?.scopes,
167
+ };
168
+ this.writeCredentialsAtomic(next);
169
+ return grant.access_token;
170
+ });
171
+ }
172
+ catch {
173
+ return null; // lock timeout / IO failure → degrade, never throw out of a probe
174
+ }
175
+ }
176
+ /** POST the refresh-token grant; null on any non-200/network/parse failure. */
177
+ async runRefreshGrant(refreshToken) {
178
+ const body = await fetchJsonOrNull(this.fetchImpl, this.oauthTokenEndpoint, {
179
+ method: "POST",
180
+ headers: { "Content-Type": "application/json" },
181
+ body: JSON.stringify({
182
+ grant_type: "refresh_token",
183
+ refresh_token: refreshToken,
184
+ client_id: this.oauthClientId,
185
+ }),
186
+ });
187
+ return body == null ? null : body;
188
+ }
189
+ /** Full credential object (preserves sibling fields like organizationUuid), or null. */
190
+ readFullCredentials() {
191
+ let raw;
192
+ try {
193
+ raw = readFileSync(this.credentialsPath, "utf8");
194
+ }
195
+ catch {
55
196
  return null;
56
- if (typeof oauth.expiresAt === "number" && nowMs >= oauth.expiresAt)
197
+ }
198
+ try {
199
+ return JSON.parse(raw);
200
+ }
201
+ catch {
57
202
  return null;
58
- return oauth.accessToken;
203
+ }
204
+ }
205
+ /** Atomic temp-then-rename write so a crash mid-write never truncates the credential. */
206
+ writeCredentialsAtomic(creds) {
207
+ const tmp = `${this.credentialsPath}.tmp`;
208
+ writeFileSync(tmp, JSON.stringify(creds, null, 2));
209
+ renameSync(tmp, this.credentialsPath);
59
210
  }
60
211
  }
61
212
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"claudeOAuthQuotaSource.js","sourceRoot":"","sources":["../../../src/shared/quota/claudeOAuthQuotaSource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claudeOAuthQuotaSource.js","sourceRoot":"","sources":["../../../src/shared/quota/claudeOAuthQuotaSource.ts"],"names":[],"mappings":"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"}
@@ -24,10 +24,13 @@ export interface CodexQuotaSourceOptions extends HttpQuotaSourceOptions {
24
24
  export declare class CodexQuotaSource extends BaseHttpQuotaSource {
25
25
  readonly name = "codex";
26
26
  private readonly credentialsPath;
27
+ private readonly usingDefaultCredentialsPath;
27
28
  private readonly providerNames;
28
29
  constructor(options?: CodexQuotaSourceOptions);
29
30
  protected handlesProvider(provider: string): boolean;
30
31
  protected fetchSnapshot(): Promise<QuotaUsageSnapshot | null>;
32
+ /** Account id = the ChatGPT `account_id` from `~/.codex/auth.json`. */
33
+ protected readAccountId(_provider: string): string | null;
31
34
  /** Reads `{ access_token, account_id }` from `~/.codex/auth.json`, or null. */
32
35
  private readCredentials;
33
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"codexQuotaSource.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/codexQuotaSource.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EACL,mBAAmB,EAGnB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAe9B,UAAU,WAAW;IACnB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AACD,UAAU,kBAAkB;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE;QACX,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,cAAc,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;QACpC,gBAAgB,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;KACvC,GAAG,IAAI,CAAC;CACV;AAKD,MAAM,WAAW,uBAAwB,SAAQ,sBAAsB;IACrE,wCAAwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,kBAAkB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACvC;AAED,qBAAa,gBAAiB,SAAQ,mBAAmB;IACvD,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAc;gBAEhC,OAAO,GAAE,uBAA4B;IAMjD,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;cAIpC,aAAa,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAMnE,+EAA+E;IAC/E,OAAO,CAAC,eAAe;CAWxB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EACjD,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAapC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAgBhG"}
1
+ {"version":3,"file":"codexQuotaSource.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/codexQuotaSource.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EACL,mBAAmB,EAGnB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAe9B,UAAU,WAAW;IACnB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AACD,UAAU,kBAAkB;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE;QACX,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,cAAc,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;QACpC,gBAAgB,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;KACvC,GAAG,IAAI,CAAC;CACV;AAKD,MAAM,WAAW,uBAAwB,SAAQ,sBAAsB;IACrE,wCAAwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,kBAAkB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACvC;AAED,qBAAa,gBAAiB,SAAQ,mBAAmB;IACvD,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAU;IACtD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAc;gBAEhC,OAAO,GAAE,uBAA4B;IAOjD,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;cAIpC,aAAa,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAMnE,uEAAuE;IACvE,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKzD,+EAA+E;IAC/E,OAAO,CAAC,eAAe;CAWxB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EACjD,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAapC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAgBhG"}
@@ -16,9 +16,11 @@ const DEFAULT_USER_AGENT = "codex_cli_rs (external, cli)";
16
16
  export class CodexQuotaSource extends BaseHttpQuotaSource {
17
17
  name = "codex";
18
18
  credentialsPath;
19
+ usingDefaultCredentialsPath;
19
20
  providerNames;
20
21
  constructor(options = {}) {
21
22
  super(options, DEFAULT_USER_AGENT);
23
+ this.usingDefaultCredentialsPath = options.credentialsPath === undefined;
22
24
  this.credentialsPath = options.credentialsPath ?? path.join(homedir(), ".codex", "auth.json");
23
25
  this.providerNames = new Set(options.codexProviderNames ?? CODEX_PROVIDER_NAMES);
24
26
  }
@@ -31,6 +33,12 @@ export class CodexQuotaSource extends BaseHttpQuotaSource {
31
33
  return null;
32
34
  return fetchCodexUsage(creds, this.fetchContext());
33
35
  }
36
+ /** Account id = the ChatGPT `account_id` from `~/.codex/auth.json`. */
37
+ readAccountId(_provider) {
38
+ if (this.shouldSkipCredentialRead(this.usingDefaultCredentialsPath))
39
+ return null;
40
+ return this.readCredentials()?.accountId ?? null;
41
+ }
34
42
  /** Reads `{ access_token, account_id }` from `~/.codex/auth.json`, or null. */
35
43
  readCredentials() {
36
44
  let parsed;
@@ -1 +1 @@
1
- {"version":3,"file":"codexQuotaSource.js","sourceRoot":"","sources":["../../../src/shared/quota/codexQuotaSource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codexQuotaSource.js","sourceRoot":"","sources":["../../../src/shared/quota/codexQuotaSource.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,15 @@ export declare class CompositeQuotaSource implements QuotaSource {
26
26
  * every empty cascade as "no source configured".
27
27
  */
28
28
  probeUsage(providerModelKey: string): Promise<QuotaProbeResult>;
29
+ /**
30
+ * Resolve the account id from the first source in the cascade that handles this
31
+ * provider and yields one (each source returns null for a provider it doesn't
32
+ * own). Never throws — a failing source is skipped so account resolution degrades
33
+ * to null rather than aborting pool construction.
34
+ */
35
+ resolveAccountId(providerModelKey: string): Promise<string | null>;
36
+ /** Proactive coverage if ANY source in the cascade covers the provider. */
37
+ coversProvider(provider: string): boolean;
29
38
  }
30
39
  /**
31
40
  * Builds the standard runtime quota snapshot cascade.
@@ -35,4 +44,17 @@ export declare class CompositeQuotaSource implements QuotaSource {
35
44
  * CompositeQuotaSource skips throwing sources and returns the first snapshot.
36
45
  */
37
46
  export declare function buildQuotaSource(options?: BuildQuotaSourceOptions): QuotaSource;
47
+ /**
48
+ * A quota source scoped to ONE dispatch source's own credential, for a source that
49
+ * authenticates as a different account than the host (its `credentials_path`). The
50
+ * returned source probes usage + resolves the account id from THAT file, so the
51
+ * source forms a pool keyed on its own `(provider, account)` — a distinct budget
52
+ * from the host's same-provider pool (docs/quota-dispatch-design.md §5b). Falls back
53
+ * to the shared source when no per-source credential is declared, or the provider has
54
+ * no per-account proactive endpoint (only Claude/Codex expose one).
55
+ */
56
+ export declare function buildAccountScopedQuotaSource(source: {
57
+ provider: string;
58
+ credentials_path?: string;
59
+ }, fallback: QuotaSource): QuotaSource;
38
60
  //# sourceMappingURL=compositeQuotaSource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compositeQuotaSource.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/compositeQuotaSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAO1F,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,WAAW,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CACnC;AAED,qBAAa,oBAAqB,YAAW,WAAW;IACtD,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,SAAS,CAAY;gBAEjB,OAAO,EAAE,WAAW,EAAE,EAAE,SAAS,CAAC,EAAE,SAAS;IAKnD,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAIrF;;;;;;;OAOG;IACG,UAAU,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAgCtE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,WAAW,CAmBnF"}
1
+ {"version":3,"file":"compositeQuotaSource.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/compositeQuotaSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAQ1F,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,WAAW,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CACnC;AAED,qBAAa,oBAAqB,YAAW,WAAW;IACtD,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,SAAS,CAAY;gBAEjB,OAAO,EAAE,WAAW,EAAE,EAAE,SAAS,CAAC,EAAE,SAAS;IAKnD,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAIrF;;;;;;;OAOG;IACG,UAAU,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiCrE;;;;;OAKG;IACG,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQxE,2EAA2E;IAC3E,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAG1C;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,WAAW,CAmBnF;AAED;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,EACvD,QAAQ,EAAE,WAAW,GACpB,WAAW,CAYb"}
@@ -1,3 +1,4 @@
1
+ import { resolveAccountIdSafe } from "./quotaSource.js";
1
2
  import { LearnedQuotaSource } from "./learnedQuotaSource.js";
2
3
  import { ClaudeOAuthQuotaSource } from "./claudeOAuthQuotaSource.js";
3
4
  import { CodexQuotaSource } from "./codexQuotaSource.js";
@@ -60,6 +61,24 @@ export class CompositeQuotaSource {
60
61
  }
61
62
  return { snapshot: null, status: sawDegraded ? "degraded" : "not_applicable" };
62
63
  }
64
+ /**
65
+ * Resolve the account id from the first source in the cascade that handles this
66
+ * provider and yields one (each source returns null for a provider it doesn't
67
+ * own). Never throws — a failing source is skipped so account resolution degrades
68
+ * to null rather than aborting pool construction.
69
+ */
70
+ async resolveAccountId(providerModelKey) {
71
+ for (const source of this.sources) {
72
+ const account = await resolveAccountIdSafe(source, providerModelKey);
73
+ if (account)
74
+ return account;
75
+ }
76
+ return null;
77
+ }
78
+ /** Proactive coverage if ANY source in the cascade covers the provider. */
79
+ coversProvider(provider) {
80
+ return this.sources.some((s) => s.coversProvider?.(provider) ?? false);
81
+ }
63
82
  }
64
83
  /**
65
84
  * Builds the standard runtime quota snapshot cascade.
@@ -83,4 +102,27 @@ export function buildQuotaSource(options = {}) {
83
102
  new LearnedQuotaSource(options.halfLifeHours ?? 24),
84
103
  ], options.runLogger);
85
104
  }
105
+ /**
106
+ * A quota source scoped to ONE dispatch source's own credential, for a source that
107
+ * authenticates as a different account than the host (its `credentials_path`). The
108
+ * returned source probes usage + resolves the account id from THAT file, so the
109
+ * source forms a pool keyed on its own `(provider, account)` — a distinct budget
110
+ * from the host's same-provider pool (docs/quota-dispatch-design.md §5b). Falls back
111
+ * to the shared source when no per-source credential is declared, or the provider has
112
+ * no per-account proactive endpoint (only Claude/Codex expose one).
113
+ */
114
+ export function buildAccountScopedQuotaSource(source, fallback) {
115
+ const credentialsPath = source.credentials_path;
116
+ if (!credentialsPath)
117
+ return fallback;
118
+ switch (source.provider) {
119
+ case "claude":
120
+ case "claude-code":
121
+ return new ClaudeOAuthQuotaSource({ credentialsPath });
122
+ case "codex":
123
+ return new CodexQuotaSource({ credentialsPath });
124
+ default:
125
+ return fallback;
126
+ }
127
+ }
86
128
  //# sourceMappingURL=compositeQuotaSource.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compositeQuotaSource.js","sourceRoot":"","sources":["../../../src/shared/quota/compositeQuotaSource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compositeQuotaSource.js","sourceRoot":"","sources":["../../../src/shared/quota/compositeQuotaSource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { z } from "zod";
2
+ import type { QuotaSource } from "./quotaSource.js";
3
+ /**
4
+ * Whether audit-tools has PROACTIVE quota tracking wired for a host provider —
5
+ * the explicit signal that replaces silently falling back to reactive 429 in an
6
+ * as-yet-unsupported environment (docs/quota-dispatch-design.md §4):
7
+ *
8
+ * - `established` — a proactive QuotaSource in code covers this provider. The
9
+ * live-vs-missing-creds split is the orthogonal
10
+ * `quota_signal_degraded` flag.
11
+ * - `reactive_only` — this provider has NO proactive surface BY NATURE (a static
12
+ * API key / local model: NIM, vLLM, local-subprocess). Not a
13
+ * gap — reactive 429 is the correct and only signal.
14
+ * - `unestablished` — NO source in code covers this provider. The environment is
15
+ * not yet supported; the host agent is nudged to self-track or
16
+ * research a source rather than degrading blind.
17
+ */
18
+ export declare const QuotaCoverageStatusSchema: z.ZodEnum<["established", "reactive_only", "unestablished"]>;
19
+ export type QuotaCoverageStatus = z.infer<typeof QuotaCoverageStatusSchema>;
20
+ /**
21
+ * Providers with no proactive quota endpoint by nature — a static API key or a
22
+ * local model. Their absence from the proactive set is intentional, NOT a missing
23
+ * integration, so they classify as `reactive_only` (no nudge). Reactive 429 /
24
+ * local-unbounded is the right model. Keyed by the resolved provider segment of a
25
+ * pool key.
26
+ */
27
+ export declare const REACTIVE_ONLY_PROVIDERS: ReadonlySet<string>;
28
+ /**
29
+ * Classify a host provider's proactive-quota coverage. `covered` is the pure,
30
+ * no-credential capability check ({@link QuotaSource.coversProvider}); `probeStatus`
31
+ * is unused for the coverage axis (it drives the orthogonal degraded flag) and kept
32
+ * for call-site clarity.
33
+ */
34
+ export declare function classifyQuotaCoverage(provider: string, covered: boolean): QuotaCoverageStatus;
35
+ /** True when the source advertises proactive coverage for `provider` (no creds read). */
36
+ export declare function sourceCoversProvider(source: QuotaSource, provider: string): boolean;
37
+ /**
38
+ * The host-facing nudge emitted ONCE per unsupported environment (then a terse
39
+ * status). Two paths, conversation-first: self-report if the host has built-in
40
+ * access to its own usage, else OFFER to research an established source and act
41
+ * only on user consent — the progressive-coverage flywheel (the found endpoint /
42
+ * third-party tool becomes a new QuotaSource).
43
+ */
44
+ export declare function renderUnestablishedQuotaNudge(provider: string): string;
45
+ //# sourceMappingURL=coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/coverage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAoB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEtE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,yBAAyB,8DAIpC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,CAMtD,CAAC;AAEH;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,mBAAmB,CAIrB;AAED,yFAAyF;AACzF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnF;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBtE"}
@@ -0,0 +1,77 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Whether audit-tools has PROACTIVE quota tracking wired for a host provider —
4
+ * the explicit signal that replaces silently falling back to reactive 429 in an
5
+ * as-yet-unsupported environment (docs/quota-dispatch-design.md §4):
6
+ *
7
+ * - `established` — a proactive QuotaSource in code covers this provider. The
8
+ * live-vs-missing-creds split is the orthogonal
9
+ * `quota_signal_degraded` flag.
10
+ * - `reactive_only` — this provider has NO proactive surface BY NATURE (a static
11
+ * API key / local model: NIM, vLLM, local-subprocess). Not a
12
+ * gap — reactive 429 is the correct and only signal.
13
+ * - `unestablished` — NO source in code covers this provider. The environment is
14
+ * not yet supported; the host agent is nudged to self-track or
15
+ * research a source rather than degrading blind.
16
+ */
17
+ export const QuotaCoverageStatusSchema = z.enum([
18
+ "established",
19
+ "reactive_only",
20
+ "unestablished",
21
+ ]);
22
+ /**
23
+ * Providers with no proactive quota endpoint by nature — a static API key or a
24
+ * local model. Their absence from the proactive set is intentional, NOT a missing
25
+ * integration, so they classify as `reactive_only` (no nudge). Reactive 429 /
26
+ * local-unbounded is the right model. Keyed by the resolved provider segment of a
27
+ * pool key.
28
+ */
29
+ export const REACTIVE_ONLY_PROVIDERS = new Set([
30
+ "openai-compatible",
31
+ "nvidia-nim",
32
+ "nvidia-nim-local",
33
+ "local-subprocess",
34
+ "ollama",
35
+ ]);
36
+ /**
37
+ * Classify a host provider's proactive-quota coverage. `covered` is the pure,
38
+ * no-credential capability check ({@link QuotaSource.coversProvider}); `probeStatus`
39
+ * is unused for the coverage axis (it drives the orthogonal degraded flag) and kept
40
+ * for call-site clarity.
41
+ */
42
+ export function classifyQuotaCoverage(provider, covered) {
43
+ if (covered)
44
+ return "established";
45
+ if (REACTIVE_ONLY_PROVIDERS.has(provider))
46
+ return "reactive_only";
47
+ return "unestablished";
48
+ }
49
+ /** True when the source advertises proactive coverage for `provider` (no creds read). */
50
+ export function sourceCoversProvider(source, provider) {
51
+ return source.coversProvider?.(provider) ?? false;
52
+ }
53
+ /**
54
+ * The host-facing nudge emitted ONCE per unsupported environment (then a terse
55
+ * status). Two paths, conversation-first: self-report if the host has built-in
56
+ * access to its own usage, else OFFER to research an established source and act
57
+ * only on user consent — the progressive-coverage flywheel (the found endpoint /
58
+ * third-party tool becomes a new QuotaSource).
59
+ */
60
+ export function renderUnestablishedQuotaNudge(provider) {
61
+ return [
62
+ `⚠️ Quota tracking is NOT established for host provider \`${provider}\`.`,
63
+ `audit-tools has no proactive quota source wired for it, so dispatch would fall`,
64
+ `back to reactive rate-limit (429) handling only — pacing blind until a wall is hit.`,
65
+ ``,
66
+ `To establish proactive quota tracking for \`${provider}\`:`,
67
+ ` 1. If you (the host agent) have BUILT-IN access to your own remaining usage/`,
68
+ ` quota, report it now so the run can pace from it, and note the access method`,
69
+ ` so it can be wired in as a QuotaSource.`,
70
+ ` 2. Otherwise, OFFER to the user: search online for \`${provider}\`'s quota/usage`,
71
+ ` endpoint, or a third-party tool that already tracks it, then — with their`,
72
+ ` consent — report the findings (endpoint, auth/credential location, response`,
73
+ ` shape) so a proactive source can be added (see`,
74
+ ` docs/cross-provider-quota-matrix.md for the established recipes).`,
75
+ ].join("\n");
76
+ }
77
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../../src/shared/quota/coverage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,IAAI,CAAC;IAC9C,aAAa;IACb,eAAe;IACf,eAAe;CAChB,CAAC,CAAC;AAGH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAwB,IAAI,GAAG,CAAC;IAClE,mBAAmB;IACnB,YAAY;IACZ,kBAAkB;IAClB,kBAAkB;IAClB,QAAQ;CACT,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAgB,EAChB,OAAgB;IAEhB,IAAI,OAAO;QAAE,OAAO,aAAa,CAAC;IAClC,IAAI,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,eAAe,CAAC;IAClE,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,oBAAoB,CAAC,MAAmB,EAAE,QAAgB;IACxE,OAAO,MAAM,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;AACpD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAAC,QAAgB;IAC5D,OAAO;QACL,4DAA4D,QAAQ,KAAK;QACzE,gFAAgF;QAChF,qFAAqF;QACrF,EAAE;QACF,+CAA+C,QAAQ,KAAK;QAC5D,gFAAgF;QAChF,mFAAmF;QACnF,8CAA8C;QAC9C,0DAA0D,QAAQ,kBAAkB;QACpF,gFAAgF;QAChF,kFAAkF;QAClF,qDAAqD;QACrD,wEAAwE;KACzE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}