audit-tools 0.30.0 → 0.30.2
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.
- package/dist/audit/adapters/astGrep.d.ts +30 -0
- package/dist/audit/adapters/astGrep.d.ts.map +1 -0
- package/dist/audit/adapters/astGrep.js +46 -0
- package/dist/audit/adapters/astGrep.js.map +1 -0
- package/dist/audit/adapters/codeql.d.ts +47 -0
- package/dist/audit/adapters/codeql.d.ts.map +1 -0
- package/dist/audit/adapters/codeql.js +52 -0
- package/dist/audit/adapters/codeql.js.map +1 -0
- package/dist/audit/adapters/normalizeExternal.d.ts +24 -1
- package/dist/audit/adapters/normalizeExternal.d.ts.map +1 -1
- package/dist/audit/adapters/normalizeExternal.js +50 -0
- package/dist/audit/adapters/normalizeExternal.js.map +1 -1
- package/dist/audit/adapters/semgrep.d.ts +34 -15
- package/dist/audit/adapters/semgrep.d.ts.map +1 -1
- package/dist/audit/adapters/semgrep.js +54 -1
- package/dist/audit/adapters/semgrep.js.map +1 -1
- package/dist/audit/cli/mergeAndIngestCommand.d.ts +29 -1
- package/dist/audit/cli/mergeAndIngestCommand.d.ts.map +1 -1
- package/dist/audit/cli/mergeAndIngestCommand.js +71 -5
- package/dist/audit/cli/mergeAndIngestCommand.js.map +1 -1
- package/dist/audit/cli/nextStepHelpers.d.ts.map +1 -1
- package/dist/audit/cli/nextStepHelpers.js +7 -6
- package/dist/audit/cli/nextStepHelpers.js.map +1 -1
- package/dist/audit/cli/resynthesizeCommand.d.ts.map +1 -1
- package/dist/audit/cli/resynthesizeCommand.js +3 -3
- package/dist/audit/cli/resynthesizeCommand.js.map +1 -1
- package/dist/audit/cli/submitPacketCommand.d.ts.map +1 -1
- package/dist/audit/cli/submitPacketCommand.js +6 -1
- package/dist/audit/cli/submitPacketCommand.js.map +1 -1
- package/dist/audit/contracts/workerSchemas.d.ts +13 -13
- package/dist/audit/contracts/workerSchemas.d.ts.map +1 -1
- package/dist/audit/contracts/workerSchemas.js +1 -1
- package/dist/audit/contracts/workerSchemas.js.map +1 -1
- package/dist/audit/contracts/wrapperResponse.d.ts +7 -0
- package/dist/audit/contracts/wrapperResponse.d.ts.map +1 -1
- package/dist/audit/contracts/wrapperResponse.js +1 -0
- package/dist/audit/contracts/wrapperResponse.js.map +1 -1
- package/dist/audit/extractors/graph.d.ts.map +1 -1
- package/dist/audit/extractors/graph.js +47 -0
- package/dist/audit/extractors/graph.js.map +1 -1
- package/dist/audit/io/artifacts.d.ts +2 -2
- package/dist/audit/io/artifacts.d.ts.map +1 -1
- package/dist/audit/io/artifacts.js +14 -11
- package/dist/audit/io/artifacts.js.map +1 -1
- package/dist/audit/orchestrator/designReviewPrompt.d.ts +17 -0
- package/dist/audit/orchestrator/designReviewPrompt.d.ts.map +1 -1
- package/dist/audit/orchestrator/designReviewPrompt.js +26 -0
- package/dist/audit/orchestrator/designReviewPrompt.js.map +1 -1
- package/dist/audit/orchestrator/executorRunners.d.ts.map +1 -1
- package/dist/audit/orchestrator/executorRunners.js +20 -0
- package/dist/audit/orchestrator/executorRunners.js.map +1 -1
- package/dist/audit/orchestrator/executors.d.ts.map +1 -1
- package/dist/audit/orchestrator/executors.js +5 -0
- package/dist/audit/orchestrator/executors.js.map +1 -1
- package/dist/audit/orchestrator/nextStep.d.ts +37 -0
- package/dist/audit/orchestrator/nextStep.d.ts.map +1 -1
- package/dist/audit/orchestrator/nextStep.js +45 -0
- package/dist/audit/orchestrator/nextStep.js.map +1 -1
- package/dist/audit/supervisor/operatorHandoff.d.ts +12 -0
- package/dist/audit/supervisor/operatorHandoff.d.ts.map +1 -1
- package/dist/audit/supervisor/operatorHandoff.js +3 -1
- package/dist/audit/supervisor/operatorHandoff.js.map +1 -1
- package/dist/audit/types/externalAnalyzer.d.ts +68 -2
- package/dist/audit/types/externalAnalyzer.d.ts.map +1 -1
- package/dist/audit/types/externalAnalyzer.js +23 -0
- package/dist/audit/types/externalAnalyzer.js.map +1 -1
- package/dist/audit/types/reviewPlanning.d.ts +14 -14
- package/dist/audit/validation/auditResults.d.ts +17 -0
- package/dist/audit/validation/auditResults.d.ts.map +1 -1
- package/dist/audit/validation/auditResults.js +39 -0
- package/dist/audit/validation/auditResults.js.map +1 -1
- package/dist/audit/validation/sessionConfig.d.ts.map +1 -1
- package/dist/audit/validation/sessionConfig.js +4 -0
- package/dist/audit/validation/sessionConfig.js.map +1 -1
- package/dist/remediate/review/autonomousGate.d.ts +74 -0
- package/dist/remediate/review/autonomousGate.d.ts.map +1 -0
- package/dist/remediate/review/autonomousGate.js +179 -0
- package/dist/remediate/review/autonomousGate.js.map +1 -0
- package/dist/remediate/steps/contractPipeline.d.ts +8 -0
- package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
- package/dist/remediate/steps/contractPipeline.js +1 -0
- package/dist/remediate/steps/contractPipeline.js.map +1 -1
- package/dist/remediate/steps/contractPipelinePrompts.d.ts +10 -0
- package/dist/remediate/steps/contractPipelinePrompts.d.ts.map +1 -1
- package/dist/remediate/steps/contractPipelinePrompts.js +32 -1
- package/dist/remediate/steps/contractPipelinePrompts.js.map +1 -1
- package/dist/remediate/steps/nextStep.d.ts +34 -0
- package/dist/remediate/steps/nextStep.d.ts.map +1 -1
- package/dist/remediate/steps/nextStep.js +144 -8
- package/dist/remediate/steps/nextStep.js.map +1 -1
- package/dist/shared/index.d.ts +11 -2
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +6 -2
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/io/auditToolsPaths.d.ts +35 -0
- package/dist/shared/io/auditToolsPaths.d.ts.map +1 -1
- package/dist/shared/io/auditToolsPaths.js +46 -1
- package/dist/shared/io/auditToolsPaths.js.map +1 -1
- package/dist/shared/io/frictionCapture.d.ts +83 -0
- package/dist/shared/io/frictionCapture.d.ts.map +1 -0
- package/dist/shared/io/frictionCapture.js +79 -0
- package/dist/shared/io/frictionCapture.js.map +1 -0
- package/dist/shared/io/gitignoreArtifacts.d.ts +94 -0
- package/dist/shared/io/gitignoreArtifacts.d.ts.map +1 -0
- package/dist/shared/io/gitignoreArtifacts.js +147 -0
- package/dist/shared/io/gitignoreArtifacts.js.map +1 -0
- package/dist/shared/quota/antigravityQuotaSource.d.ts.map +1 -1
- package/dist/shared/quota/antigravityQuotaSource.js +2 -0
- package/dist/shared/quota/antigravityQuotaSource.js.map +1 -1
- package/dist/shared/quota/claudeOAuthQuotaSource.d.ts +35 -2
- package/dist/shared/quota/claudeOAuthQuotaSource.d.ts.map +1 -1
- package/dist/shared/quota/claudeOAuthQuotaSource.js +157 -17
- package/dist/shared/quota/claudeOAuthQuotaSource.js.map +1 -1
- package/dist/shared/quota/codexQuotaSource.d.ts.map +1 -1
- package/dist/shared/quota/codexQuotaSource.js +2 -0
- package/dist/shared/quota/codexQuotaSource.js.map +1 -1
- package/dist/shared/quota/copilotQuotaSource.d.ts.map +1 -1
- package/dist/shared/quota/copilotQuotaSource.js +2 -0
- package/dist/shared/quota/copilotQuotaSource.js.map +1 -1
- package/dist/shared/quota/errorParsing.d.ts +19 -0
- package/dist/shared/quota/errorParsing.d.ts.map +1 -1
- package/dist/shared/quota/errorParsing.js +14 -1
- package/dist/shared/quota/errorParsing.js.map +1 -1
- package/dist/shared/quota/hostSessionQuotaSource.d.ts +138 -0
- package/dist/shared/quota/hostSessionQuotaSource.d.ts.map +1 -0
- package/dist/shared/quota/hostSessionQuotaSource.js +213 -0
- package/dist/shared/quota/hostSessionQuotaSource.js.map +1 -0
- package/dist/shared/quota/httpQuotaSource.d.ts +7 -3
- package/dist/shared/quota/httpQuotaSource.d.ts.map +1 -1
- package/dist/shared/quota/httpQuotaSource.js.map +1 -1
- package/dist/shared/reporting/auditDeliverable.d.ts +36 -0
- package/dist/shared/reporting/auditDeliverable.d.ts.map +1 -0
- package/dist/shared/reporting/auditDeliverable.js +85 -0
- package/dist/shared/reporting/auditDeliverable.js.map +1 -0
- package/dist/shared/types/sessionConfig.d.ts +13 -0
- package/dist/shared/types/sessionConfig.d.ts.map +1 -1
- package/package.json +1 -1
- package/schemas/audit_result.schema.json +2 -2
- package/schemas/audit_results.schema.json +2 -2
- package/schemas/finding.schema.json +2 -2
- package/scripts/postinstall.mjs +64 -0
|
@@ -27,16 +27,49 @@ export interface ClaudeOAuthQuotaSourceOptions extends HttpQuotaSourceOptions {
|
|
|
27
27
|
credentialsPath?: string;
|
|
28
28
|
/** Override the provider-name gate (mainly for tests). */
|
|
29
29
|
claudeProviderNames?: Iterable<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Supplies the docs-blessed `CLAUDE_CODE_OAUTH_TOKEN` handoff. Defaults to
|
|
32
|
+
* reading `process.env.CLAUDE_CODE_OAUTH_TOKEN` at probe time; injectable for
|
|
33
|
+
* tests. A non-empty return short-circuits the credential file entirely.
|
|
34
|
+
*/
|
|
35
|
+
readEnvToken?: () => string | null | undefined;
|
|
36
|
+
/** Override the OAuth client id (refresh grant). Defaults to Claude Code's public client. */
|
|
37
|
+
oauthClientId?: string;
|
|
38
|
+
/** Override the token endpoint (refresh grant). */
|
|
39
|
+
oauthTokenEndpoint?: string;
|
|
30
40
|
}
|
|
31
41
|
export declare class ClaudeOAuthQuotaSource extends BaseHttpQuotaSource {
|
|
32
42
|
readonly name = "claude-oauth";
|
|
33
43
|
private readonly credentialsPath;
|
|
34
44
|
private readonly providerNames;
|
|
45
|
+
private readonly readEnvToken;
|
|
46
|
+
private readonly oauthClientId;
|
|
47
|
+
private readonly oauthTokenEndpoint;
|
|
35
48
|
constructor(options?: ClaudeOAuthQuotaSourceOptions);
|
|
36
49
|
protected handlesProvider(provider: string): boolean;
|
|
37
50
|
protected fetchSnapshot(_provider: string, model: string | null, nowMs: number): Promise<QuotaUsageSnapshot | null>;
|
|
38
|
-
/**
|
|
39
|
-
|
|
51
|
+
/**
|
|
52
|
+
* Resolve an access token via the documented chain (env handoff → CLI file
|
|
53
|
+
* with refresh-on-expiry). `forceRefresh` skips the still-valid fast path and
|
|
54
|
+
* always runs the refresh grant (used to recover from a 401).
|
|
55
|
+
*/
|
|
56
|
+
private resolveAccessToken;
|
|
57
|
+
/** Parse the `claudeAiOauth` block from the credential file, or null. */
|
|
58
|
+
private readOAuthBlock;
|
|
59
|
+
/**
|
|
60
|
+
* Run the refresh grant and persist the ROTATED credential under a file lock.
|
|
61
|
+
* Double-checked: after the lock is held the file is re-read, so if a
|
|
62
|
+
* concurrent probe already refreshed (token now valid, and we are not forcing)
|
|
63
|
+
* that fresh token is used instead of rotating again — a second rotation would
|
|
64
|
+
* invalidate the first refresh token and brick the credential.
|
|
65
|
+
*/
|
|
66
|
+
private refreshAndPersist;
|
|
67
|
+
/** POST the refresh-token grant; null on any non-200/network/parse failure. */
|
|
68
|
+
private runRefreshGrant;
|
|
69
|
+
/** Full credential object (preserves sibling fields like organizationUuid), or null. */
|
|
70
|
+
private readFullCredentials;
|
|
71
|
+
/** Atomic temp-then-rename write so a crash mid-write never truncates the credential. */
|
|
72
|
+
private writeCredentialsAtomic;
|
|
40
73
|
}
|
|
41
74
|
/**
|
|
42
75
|
* Reusable Claude `/usage` probe (no creds-file read, no guard) — used by the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claudeOAuthQuotaSource.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/claudeOAuthQuotaSource.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"claudeOAuthQuotaSource.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/claudeOAuthQuotaSource.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EACL,mBAAmB,EAGnB,qBAAqB,EAErB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAoC9B,OAAO,EAAE,qBAAqB,EAAE,CAAC;AAEjC,yDAAyD;AACzD,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE;YAAE,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CACxF;AACD,iFAAiF;AACjF,UAAU,WAAW;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AACD,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;CACnC;AA0BD,MAAM,WAAW,6BAA8B,SAAQ,sBAAsB;IAC3E,iDAAiD;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,mBAAmB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,6FAA6F;IAC7F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,sBAAuB,SAAQ,mBAAmB;IAC7D,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAc;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAEhC,OAAO,GAAE,6BAAkC;IAWvD,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;cAIpC,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAoBrC;;;;OAIG;YACW,kBAAkB;IA6BhC,yEAAyE;IACzE,OAAO,CAAC,cAAc;IActB;;;;;;OAMG;YACW,iBAAiB;IAmC/B,+EAA+E;YACjE,eAAe;IAa7B,wFAAwF;IACxF,OAAO,CAAC,mBAAmB;IAc3B,yFAAyF;IACzF,OAAO,CAAC,sBAAsB;CAK/B;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACpD,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAYpC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,KAAK,EAAE,MAAM,GACZ,kBAAkB,GAAG,IAAI,CAe3B"}
|
|
@@ -1,41 +1,106 @@
|
|
|
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 —
|
|
7
|
-
*
|
|
8
|
-
* endpoint (the only proactive
|
|
9
|
-
* mapping the most-constraining
|
|
10
|
-
* cross-cutting cache/guard/degrade
|
|
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;
|
|
21
42
|
providerNames;
|
|
43
|
+
readEnvToken;
|
|
44
|
+
oauthClientId;
|
|
45
|
+
oauthTokenEndpoint;
|
|
22
46
|
constructor(options = {}) {
|
|
23
47
|
super(options, DEFAULT_USER_AGENT);
|
|
24
48
|
this.credentialsPath =
|
|
25
49
|
options.credentialsPath ?? path.join(homedir(), ".claude", ".credentials.json");
|
|
26
50
|
this.providerNames = new Set(options.claudeProviderNames ?? CLAUDE_PROVIDER_NAMES);
|
|
51
|
+
this.readEnvToken =
|
|
52
|
+
options.readEnvToken ?? (() => process.env.CLAUDE_CODE_OAUTH_TOKEN);
|
|
53
|
+
this.oauthClientId = options.oauthClientId ?? OAUTH_CLIENT_ID;
|
|
54
|
+
this.oauthTokenEndpoint = options.oauthTokenEndpoint ?? OAUTH_TOKEN_ENDPOINT;
|
|
27
55
|
}
|
|
28
56
|
handlesProvider(provider) {
|
|
29
57
|
return this.providerNames.has(provider);
|
|
30
58
|
}
|
|
31
59
|
async fetchSnapshot(_provider, model, nowMs) {
|
|
32
|
-
const
|
|
33
|
-
if (!
|
|
60
|
+
const resolved = await this.resolveAccessToken(nowMs, false);
|
|
61
|
+
if (!resolved)
|
|
34
62
|
return null;
|
|
35
|
-
|
|
63
|
+
const snap = await fetchClaudeUsage({ accessToken: resolved.accessToken, model }, this.fetchContext());
|
|
64
|
+
if (snap)
|
|
65
|
+
return snap;
|
|
66
|
+
// A null here means a non-200 (commonly 401: token revoked/expired between
|
|
67
|
+
// resolution and use). For a FILE-origin token we can recover by forcing one
|
|
68
|
+
// refresh and retrying; an env token is operator-owned and not ours to rotate.
|
|
69
|
+
if (resolved.origin !== "file")
|
|
70
|
+
return null;
|
|
71
|
+
const refreshed = await this.resolveAccessToken(nowMs, true);
|
|
72
|
+
if (!refreshed || refreshed.accessToken === resolved.accessToken)
|
|
73
|
+
return null;
|
|
74
|
+
return fetchClaudeUsage({ accessToken: refreshed.accessToken, model }, this.fetchContext());
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Resolve an access token via the documented chain (env handoff → CLI file
|
|
78
|
+
* with refresh-on-expiry). `forceRefresh` skips the still-valid fast path and
|
|
79
|
+
* always runs the refresh grant (used to recover from a 401).
|
|
80
|
+
*/
|
|
81
|
+
async resolveAccessToken(nowMs, forceRefresh) {
|
|
82
|
+
const envToken = this.readEnvToken();
|
|
83
|
+
if (typeof envToken === "string" && envToken.trim() !== "") {
|
|
84
|
+
return { accessToken: envToken.trim(), origin: "env" };
|
|
85
|
+
}
|
|
86
|
+
const oauth = this.readOAuthBlock();
|
|
87
|
+
if (!oauth)
|
|
88
|
+
return null;
|
|
89
|
+
const valid = typeof oauth.accessToken === "string" &&
|
|
90
|
+
oauth.accessToken !== "" &&
|
|
91
|
+
!(typeof oauth.expiresAt === "number" && nowMs >= oauth.expiresAt);
|
|
92
|
+
if (valid && !forceRefresh) {
|
|
93
|
+
return { accessToken: oauth.accessToken, origin: "file" };
|
|
94
|
+
}
|
|
95
|
+
// Expired/missing/forced and no refresh token → degrade (nothing to refresh).
|
|
96
|
+
if (typeof oauth.refreshToken !== "string" || oauth.refreshToken === "") {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const refreshed = await this.refreshAndPersist(nowMs, forceRefresh);
|
|
100
|
+
return refreshed ? { accessToken: refreshed, origin: "file" } : null;
|
|
36
101
|
}
|
|
37
|
-
/**
|
|
38
|
-
|
|
102
|
+
/** Parse the `claudeAiOauth` block from the credential file, or null. */
|
|
103
|
+
readOAuthBlock() {
|
|
39
104
|
let raw;
|
|
40
105
|
try {
|
|
41
106
|
raw = readFileSync(this.credentialsPath, "utf8");
|
|
@@ -43,19 +108,90 @@ export class ClaudeOAuthQuotaSource extends BaseHttpQuotaSource {
|
|
|
43
108
|
catch {
|
|
44
109
|
return null; // missing file (e.g. creds in an OS keychain) → degrade
|
|
45
110
|
}
|
|
46
|
-
let parsed;
|
|
47
111
|
try {
|
|
48
|
-
|
|
112
|
+
return JSON.parse(raw).claudeAiOauth ?? null;
|
|
49
113
|
}
|
|
50
114
|
catch {
|
|
51
115
|
return null;
|
|
52
116
|
}
|
|
53
|
-
|
|
54
|
-
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Run the refresh grant and persist the ROTATED credential under a file lock.
|
|
120
|
+
* Double-checked: after the lock is held the file is re-read, so if a
|
|
121
|
+
* concurrent probe already refreshed (token now valid, and we are not forcing)
|
|
122
|
+
* that fresh token is used instead of rotating again — a second rotation would
|
|
123
|
+
* invalidate the first refresh token and brick the credential.
|
|
124
|
+
*/
|
|
125
|
+
async refreshAndPersist(nowMs, forceRefresh) {
|
|
126
|
+
const lockPath = `${this.credentialsPath}.lock`;
|
|
127
|
+
try {
|
|
128
|
+
return await withFileLock(lockPath, async () => {
|
|
129
|
+
const oauth = this.readOAuthBlock();
|
|
130
|
+
if (!oauth)
|
|
131
|
+
return null;
|
|
132
|
+
const stillValid = typeof oauth.accessToken === "string" &&
|
|
133
|
+
oauth.accessToken !== "" &&
|
|
134
|
+
!(typeof oauth.expiresAt === "number" && nowMs >= oauth.expiresAt);
|
|
135
|
+
if (stillValid && !forceRefresh)
|
|
136
|
+
return oauth.accessToken;
|
|
137
|
+
if (typeof oauth.refreshToken !== "string" || oauth.refreshToken === "")
|
|
138
|
+
return null;
|
|
139
|
+
const grant = await this.runRefreshGrant(oauth.refreshToken);
|
|
140
|
+
if (!grant?.access_token || !grant.refresh_token || typeof grant.expires_in !== "number") {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
const next = {
|
|
144
|
+
...(this.readFullCredentials() ?? {}),
|
|
145
|
+
};
|
|
146
|
+
next.claudeAiOauth = {
|
|
147
|
+
...(next.claudeAiOauth ?? {}),
|
|
148
|
+
accessToken: grant.access_token,
|
|
149
|
+
refreshToken: grant.refresh_token,
|
|
150
|
+
expiresAt: nowMs + grant.expires_in * 1000,
|
|
151
|
+
scopes: grant.scope ? grant.scope.split(" ") : next.claudeAiOauth?.scopes,
|
|
152
|
+
};
|
|
153
|
+
this.writeCredentialsAtomic(next);
|
|
154
|
+
return grant.access_token;
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return null; // lock timeout / IO failure → degrade, never throw out of a probe
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/** POST the refresh-token grant; null on any non-200/network/parse failure. */
|
|
162
|
+
async runRefreshGrant(refreshToken) {
|
|
163
|
+
const body = await fetchJsonOrNull(this.fetchImpl, this.oauthTokenEndpoint, {
|
|
164
|
+
method: "POST",
|
|
165
|
+
headers: { "Content-Type": "application/json" },
|
|
166
|
+
body: JSON.stringify({
|
|
167
|
+
grant_type: "refresh_token",
|
|
168
|
+
refresh_token: refreshToken,
|
|
169
|
+
client_id: this.oauthClientId,
|
|
170
|
+
}),
|
|
171
|
+
});
|
|
172
|
+
return body == null ? null : body;
|
|
173
|
+
}
|
|
174
|
+
/** Full credential object (preserves sibling fields like organizationUuid), or null. */
|
|
175
|
+
readFullCredentials() {
|
|
176
|
+
let raw;
|
|
177
|
+
try {
|
|
178
|
+
raw = readFileSync(this.credentialsPath, "utf8");
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
55
181
|
return null;
|
|
56
|
-
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
return JSON.parse(raw);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
57
187
|
return null;
|
|
58
|
-
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/** Atomic temp-then-rename write so a crash mid-write never truncates the credential. */
|
|
191
|
+
writeCredentialsAtomic(creds) {
|
|
192
|
+
const tmp = `${this.credentialsPath}.tmp`;
|
|
193
|
+
writeFileSync(tmp, JSON.stringify(creds, null, 2));
|
|
194
|
+
renameSync(tmp, this.credentialsPath);
|
|
59
195
|
}
|
|
60
196
|
}
|
|
61
197
|
/**
|
|
@@ -83,6 +219,10 @@ export async function fetchClaudeUsage(creds, ctx) {
|
|
|
83
219
|
* `remaining_pct` is a 0–1 FRACTION (scheduler thresholds 0.1/0.3).
|
|
84
220
|
*/
|
|
85
221
|
export function mapUsageToSnapshot(body, model, nowMs) {
|
|
222
|
+
// A malformed / non-object payload degrades to null and never throws (mirrors
|
|
223
|
+
// the codex/copilot/antigravity mappers' null-safety).
|
|
224
|
+
if (body == null || typeof body !== "object")
|
|
225
|
+
return null;
|
|
86
226
|
const binding = pickBindingWindow(body, model);
|
|
87
227
|
if (binding == null)
|
|
88
228
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claudeOAuthQuotaSource.js","sourceRoot":"","sources":["../../../src/shared/quota/claudeOAuthQuotaSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"claudeOAuthQuotaSource.js","sourceRoot":"","sources":["../../../src/shared/quota/claudeOAuthQuotaSource.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
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"}
|
|
@@ -71,6 +71,8 @@ export async function fetchCodexUsage(creds, ctx) {
|
|
|
71
71
|
* a 0–1 fraction; `reset_at` is the absolute reset (unix seconds → ISO).
|
|
72
72
|
*/
|
|
73
73
|
export function mapCodexUsage(body, nowMs) {
|
|
74
|
+
if (body == null || typeof body !== "object")
|
|
75
|
+
return null;
|
|
74
76
|
const rl = body.rate_limit;
|
|
75
77
|
const windows = [rl?.primary_window, rl?.secondary_window].filter((w) => !!w && typeof w.used_percent === "number");
|
|
76
78
|
if (windows.length === 0)
|
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copilotQuotaSource.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/copilotQuotaSource.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;AA6B9B,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC5B;AACD,UAAU,oBAAoB;IAC5B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,eAAe,CAAC,EAAE;QAChB,oBAAoB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;QACjD,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;KAClC,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,yBAA0B,SAAQ,sBAAsB;IACvE,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,0DAA0D;IAC1D,oBAAoB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACzC;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ,EACzB,IAAI,EAAE,MAAM,GACX,MAAM,CAQR;AAED,qBAAa,kBAAmB,SAAQ,mBAAmB;IACzD,QAAQ,CAAC,IAAI,aAAa;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAc;gBAEhC,OAAO,GAAE,yBAA8B;IAUnD,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;cAIpC,aAAa,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAMnE,6EAA6E;IAC7E,OAAO,CAAC,eAAe;CAcxB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EACxB,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAYpC;AAED,oGAAoG;AACpG,wBAAgB,eAAe,CAC7B,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,MAAM,GACZ,kBAAkB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"copilotQuotaSource.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/copilotQuotaSource.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;AA6B9B,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC5B;AACD,UAAU,oBAAoB;IAC5B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,eAAe,CAAC,EAAE;QAChB,oBAAoB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;QACjD,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;KAClC,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,yBAA0B,SAAQ,sBAAsB;IACvE,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,0DAA0D;IAC1D,oBAAoB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACzC;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ,EACzB,IAAI,EAAE,MAAM,GACX,MAAM,CAQR;AAED,qBAAa,kBAAmB,SAAQ,mBAAmB;IACzD,QAAQ,CAAC,IAAI,aAAa;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAc;gBAEhC,OAAO,GAAE,yBAA8B;IAUnD,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;cAIpC,aAAa,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAMnE,6EAA6E;IAC7E,OAAO,CAAC,eAAe;CAcxB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EACxB,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAYpC;AAED,oGAAoG;AACpG,wBAAgB,eAAe,CAC7B,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,MAAM,GACZ,kBAAkB,GAAG,IAAI,CAsB3B"}
|
|
@@ -107,6 +107,8 @@ export async function fetchCopilotUsage(creds, ctx) {
|
|
|
107
107
|
}
|
|
108
108
|
/** Maps a `copilot_internal/user` snapshot (premium-requests preferred) → 0–1 remaining + reset. */
|
|
109
109
|
export function mapCopilotUsage(body, nowMs) {
|
|
110
|
+
if (body == null || typeof body !== "object")
|
|
111
|
+
return null;
|
|
110
112
|
const q = body.quota_snapshots?.premium_interactions ?? body.quota_snapshots?.chat;
|
|
111
113
|
if (!q)
|
|
112
114
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copilotQuotaSource.js","sourceRoot":"","sources":["../../../src/shared/quota/copilotQuotaSource.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"copilotQuotaSource.js","sourceRoot":"","sources":["../../../src/shared/quota/copilotQuotaSource.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,25 @@ export interface RateLimitDetectionResult {
|
|
|
3
3
|
retryAfterMs: number | null;
|
|
4
4
|
rawMatch: string | null;
|
|
5
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* The worker output channel a piece of text came from. Host *session-limit*
|
|
8
|
+
* sentinels are only trustworthy from the ERROR / STATUS channel: the consumed
|
|
9
|
+
* AuditResult finding content is attacker- / model-controlled prose that may
|
|
10
|
+
* legitimately *quote* a limit string (e.g. a finding describing a rate-limit
|
|
11
|
+
* bug). Treating that as a real session cap would let result content pause the
|
|
12
|
+
* run. CE-003 channel isolation: only `error` / `status` may trip a session
|
|
13
|
+
* limit; `result` is parsed for nothing.
|
|
14
|
+
*/
|
|
15
|
+
export type WorkerOutputChannel = "error" | "status" | "result";
|
|
16
|
+
/**
|
|
17
|
+
* Channel-isolated session-limit detection (CE-003). The single entry point a
|
|
18
|
+
* dispatch consumer MUST use when the text originates from worker output: it
|
|
19
|
+
* refuses to inspect the consumed-result channel, so a healthy AuditResult that
|
|
20
|
+
* merely quotes a limit string can never consume a pause. Only `error` /
|
|
21
|
+
* `status` text is forwarded to {@link detectRateLimitError}.
|
|
22
|
+
*/
|
|
23
|
+
export declare function detectRateLimitFromChannel(channel: WorkerOutputChannel, text: string, now?: number): RateLimitDetectionResult;
|
|
6
24
|
export declare function detectRateLimitError(text: string, now?: number): RateLimitDetectionResult;
|
|
25
|
+
export declare const DEFAULT_COOLDOWN_MS = 60000;
|
|
7
26
|
export declare function computeCooldownUntil(retryAfterMs: number | null, defaultMs?: number, now?: number): string;
|
|
8
27
|
//# sourceMappingURL=errorParsing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorParsing.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/errorParsing.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAiHD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAmB,GACvB,wBAAwB,CAgB1B;
|
|
1
|
+
{"version":3,"file":"errorParsing.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/errorParsing.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAiHD;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhE;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAmB,GACvB,wBAAwB,CAK1B;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAmB,GACvB,wBAAwB,CAgB1B;AAED,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAE1C,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,SAAS,GAAE,MAA4B,EACvC,GAAG,GAAE,MAAmB,GACvB,MAAM,CAGR"}
|
|
@@ -105,6 +105,19 @@ function extractResetsAtClockMs(text, now) {
|
|
|
105
105
|
const ms = target.getTime() - now;
|
|
106
106
|
return ms > 0 ? ms + 5000 : null;
|
|
107
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Channel-isolated session-limit detection (CE-003). The single entry point a
|
|
110
|
+
* dispatch consumer MUST use when the text originates from worker output: it
|
|
111
|
+
* refuses to inspect the consumed-result channel, so a healthy AuditResult that
|
|
112
|
+
* merely quotes a limit string can never consume a pause. Only `error` /
|
|
113
|
+
* `status` text is forwarded to {@link detectRateLimitError}.
|
|
114
|
+
*/
|
|
115
|
+
export function detectRateLimitFromChannel(channel, text, now = Date.now()) {
|
|
116
|
+
if (channel === "result") {
|
|
117
|
+
return { isRateLimited: false, retryAfterMs: null, rawMatch: null };
|
|
118
|
+
}
|
|
119
|
+
return detectRateLimitError(text, now);
|
|
120
|
+
}
|
|
108
121
|
export function detectRateLimitError(text, now = Date.now()) {
|
|
109
122
|
const jsonResult = detectFromJson(text);
|
|
110
123
|
if (jsonResult)
|
|
@@ -121,7 +134,7 @@ export function detectRateLimitError(text, now = Date.now()) {
|
|
|
121
134
|
}
|
|
122
135
|
return { isRateLimited: false, retryAfterMs: null, rawMatch: null };
|
|
123
136
|
}
|
|
124
|
-
const DEFAULT_COOLDOWN_MS = 60_000;
|
|
137
|
+
export const DEFAULT_COOLDOWN_MS = 60_000;
|
|
125
138
|
export function computeCooldownUntil(retryAfterMs, defaultMs = DEFAULT_COOLDOWN_MS, now = Date.now()) {
|
|
126
139
|
const ms = retryAfterMs != null && retryAfterMs > 0 ? retryAfterMs : defaultMs;
|
|
127
140
|
return new Date(now + ms).toISOString();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorParsing.js","sourceRoot":"","sources":["../../../src/shared/quota/errorParsing.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"errorParsing.js","sourceRoot":"","sources":["../../../src/shared/quota/errorParsing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-session fixed-window QuotaSource.
|
|
3
|
+
*
|
|
4
|
+
* Models a host *account* usage cap (e.g. Claude Code's "You've hit your session
|
|
5
|
+
* limit · resets 3:30pm") as a fixed window that opens again at a stated reset.
|
|
6
|
+
* Unlike the sliding-window learned source, the host session limit is a hard
|
|
7
|
+
* wall the operator account hits — there is no per-request budget to learn, only
|
|
8
|
+
* a binary "open / paused-until-reset" state plus a throttle band as the window
|
|
9
|
+
* fills.
|
|
10
|
+
*
|
|
11
|
+
* Design contract (CP-BLOCK-IMPL-host-session-quota):
|
|
12
|
+
*
|
|
13
|
+
* - **Channel isolation (CE-003).** A session limit is recorded ONLY from the
|
|
14
|
+
* worker ERROR / STATUS channel via {@link detectRateLimitFromChannel}. The
|
|
15
|
+
* consumed AuditResult content is never inspected, so a healthy result that
|
|
16
|
+
* merely quotes a limit string cannot pause the run.
|
|
17
|
+
* - **Throttle before the wall.** The snapshot exposes `remaining_pct` so the
|
|
18
|
+
* scheduler's existing LOW / CRITICAL bands throttle the wave BEFORE the
|
|
19
|
+
* account is fully exhausted, rather than only reacting after a hard 429.
|
|
20
|
+
* - **Auto-pause / auto-resume.** Recording a limit sets `cooldown_until` to the
|
|
21
|
+
* parsed reset (next-future-occurrence for clock times; DEFAULT_COOLDOWN_MS
|
|
22
|
+
* when unparseable). Once an injected `now` passes the reset the source
|
|
23
|
+
* auto-resumes (snapshot reports the window open again).
|
|
24
|
+
* - **Bounded re-limit escalation (no livelock).** Re-queuing the same packet
|
|
25
|
+
* non-consumingly is fine, but an unresettable / clock-skewed limit that keeps
|
|
26
|
+
* re-tripping for the SAME packet must not loop forever. After
|
|
27
|
+
* `maxConsecutiveReLimits` cycles (or a cumulative wall) the source ESCALATES
|
|
28
|
+
* to a terminal hard failure surfaced to the operator (structured stderr +
|
|
29
|
+
* run-ledger), and the caller stops re-queuing that packet.
|
|
30
|
+
* - **Own-provider self-monitoring only.** The source keys off the
|
|
31
|
+
* provider/model it owns; it never reasons about other providers' quota and
|
|
32
|
+
* never overwrites learned (sliding-window) limits.
|
|
33
|
+
*
|
|
34
|
+
* This module owns only the host-session window + escalation bookkeeping; the
|
|
35
|
+
* non-consuming re-queue itself is performed by the rolling engine
|
|
36
|
+
* ({@link dropProvider}), which moves in-flight packets back to `pending_tokens`
|
|
37
|
+
* without ever marking them consumed.
|
|
38
|
+
*/
|
|
39
|
+
import type { QuotaProbeResult, QuotaSource, QuotaUsageSnapshot } from "./quotaSource.js";
|
|
40
|
+
import { type WorkerOutputChannel } from "./errorParsing.js";
|
|
41
|
+
export declare const HOST_SESSION_QUOTA_SOURCE_NAME = "host_session";
|
|
42
|
+
/** Default number of consecutive non-consuming re-limits of the SAME packet before escalating. */
|
|
43
|
+
export declare const DEFAULT_MAX_CONSECUTIVE_RE_LIMITS = 3;
|
|
44
|
+
/** Injected clock — defaults to the system clock, overridable in tests. */
|
|
45
|
+
export type NowFn = () => number;
|
|
46
|
+
export interface HostSessionEscalation {
|
|
47
|
+
/** Packet whose repeated re-limit tripped the bound. */
|
|
48
|
+
packet_id: string;
|
|
49
|
+
/** How many consecutive non-consuming re-limits were observed for it. */
|
|
50
|
+
consecutive_re_limits: number;
|
|
51
|
+
/** Cumulative wall (ms) spent paused on this packet across those cycles. */
|
|
52
|
+
cumulative_wall_ms: number;
|
|
53
|
+
/** Human-readable reason surfaced to the operator. */
|
|
54
|
+
reason: string;
|
|
55
|
+
/** ISO timestamp of the escalation. */
|
|
56
|
+
escalated_at: string;
|
|
57
|
+
}
|
|
58
|
+
export interface HostSessionLimitEvent {
|
|
59
|
+
/** Whether a session limit was recorded (false → input was not a session limit on this channel). */
|
|
60
|
+
recorded: boolean;
|
|
61
|
+
/** ISO cooldown the window is paused until, when recorded. */
|
|
62
|
+
cooldown_until: string | null;
|
|
63
|
+
/**
|
|
64
|
+
* Set when this re-limit of the same packet crossed the bound. When non-null
|
|
65
|
+
* the caller MUST stop re-queuing the packet and surface the escalation to the
|
|
66
|
+
* operator instead of re-dispatching into the wall.
|
|
67
|
+
*/
|
|
68
|
+
escalation: HostSessionEscalation | null;
|
|
69
|
+
}
|
|
70
|
+
export interface HostSessionQuotaSourceOptions {
|
|
71
|
+
/** Provider/model key this source self-monitors (own-provider only). */
|
|
72
|
+
providerModelKey: string;
|
|
73
|
+
/** Injected clock for deterministic tests. */
|
|
74
|
+
now?: NowFn;
|
|
75
|
+
/** Cycles of consecutive same-packet re-limits tolerated before escalation. */
|
|
76
|
+
maxConsecutiveReLimits?: number;
|
|
77
|
+
/** Cumulative paused wall (ms) tolerated for one packet before escalation. */
|
|
78
|
+
maxCumulativeWallMs?: number;
|
|
79
|
+
/** Fallback cooldown when the reset is unparseable. */
|
|
80
|
+
defaultCooldownMs?: number;
|
|
81
|
+
/**
|
|
82
|
+
* Sink for the structured operator surface (stderr + run-ledger). Defaults to
|
|
83
|
+
* a single JSON line on stderr; tests inject a capture. Never throws — an
|
|
84
|
+
* observability failure must not abort a dispatch run.
|
|
85
|
+
*/
|
|
86
|
+
onEscalation?: (escalation: HostSessionEscalation) => void;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Fixed-window host-session QuotaSource. Stateful: it remembers the active
|
|
90
|
+
* cooldown and the per-packet re-limit count so the bounded-escalation guard can
|
|
91
|
+
* fire. Conforms to the shared {@link QuotaSource} contract.
|
|
92
|
+
*/
|
|
93
|
+
export declare class HostSessionQuotaSource implements QuotaSource {
|
|
94
|
+
readonly name = "host_session";
|
|
95
|
+
private readonly providerModelKey;
|
|
96
|
+
private readonly now;
|
|
97
|
+
private readonly maxConsecutiveReLimits;
|
|
98
|
+
private readonly maxCumulativeWallMs;
|
|
99
|
+
private readonly defaultCooldownMs;
|
|
100
|
+
private readonly onEscalation;
|
|
101
|
+
/** Epoch ms the window is paused until, or null when open. */
|
|
102
|
+
private cooldownUntilMs;
|
|
103
|
+
/** ISO captured-at of the most recent state mutation. */
|
|
104
|
+
private capturedAt;
|
|
105
|
+
/** Per-packet re-limit tracker (only the currently-relimiting packet matters). */
|
|
106
|
+
private tracker;
|
|
107
|
+
/** Packets already escalated — a non-consuming re-queue must never re-arm them. */
|
|
108
|
+
private readonly escalated;
|
|
109
|
+
constructor(options: HostSessionQuotaSourceOptions);
|
|
110
|
+
/**
|
|
111
|
+
* True once an injected `now` has passed the recorded reset: the fixed window
|
|
112
|
+
* has reopened and the source auto-resumes.
|
|
113
|
+
*/
|
|
114
|
+
private isPaused;
|
|
115
|
+
/** ISO cooldown the window is currently paused until, or null when open. */
|
|
116
|
+
cooldownUntil(): string | null;
|
|
117
|
+
/** True when the given packet has already been escalated to a terminal failure. */
|
|
118
|
+
isEscalated(packetId: string): boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Record a worker-output line for a packet. CHANNEL-ISOLATED: a session limit
|
|
121
|
+
* is only ever recorded from the ERROR / STATUS channel; `result` text is
|
|
122
|
+
* ignored entirely (CE-003), so a healthy result quoting a limit string is a
|
|
123
|
+
* no-op (`recorded: false`, no pause).
|
|
124
|
+
*
|
|
125
|
+
* On a real limit it sets `cooldown_until` to the parsed reset and, if this is
|
|
126
|
+
* the same packet re-limiting against an unchanged window, increments the
|
|
127
|
+
* bounded counter — escalating once the bound is crossed.
|
|
128
|
+
*/
|
|
129
|
+
recordLimit(channel: WorkerOutputChannel, text: string, packetId: string): HostSessionLimitEvent;
|
|
130
|
+
queryCurrentUsage(providerModelKey: string): Promise<QuotaUsageSnapshot | null>;
|
|
131
|
+
/**
|
|
132
|
+
* Own-provider self-monitoring: only answers for the key it owns. For any other
|
|
133
|
+
* key it is `not_applicable` (no signal expected → never a degrade), so it
|
|
134
|
+
* composes with the sliding-window / learned sources without overwriting them.
|
|
135
|
+
*/
|
|
136
|
+
probeUsage(providerModelKey: string): Promise<QuotaProbeResult>;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=hostSessionQuotaSource.d.ts.map
|