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.
Files changed (141) hide show
  1. package/dist/audit/adapters/astGrep.d.ts +30 -0
  2. package/dist/audit/adapters/astGrep.d.ts.map +1 -0
  3. package/dist/audit/adapters/astGrep.js +46 -0
  4. package/dist/audit/adapters/astGrep.js.map +1 -0
  5. package/dist/audit/adapters/codeql.d.ts +47 -0
  6. package/dist/audit/adapters/codeql.d.ts.map +1 -0
  7. package/dist/audit/adapters/codeql.js +52 -0
  8. package/dist/audit/adapters/codeql.js.map +1 -0
  9. package/dist/audit/adapters/normalizeExternal.d.ts +24 -1
  10. package/dist/audit/adapters/normalizeExternal.d.ts.map +1 -1
  11. package/dist/audit/adapters/normalizeExternal.js +50 -0
  12. package/dist/audit/adapters/normalizeExternal.js.map +1 -1
  13. package/dist/audit/adapters/semgrep.d.ts +34 -15
  14. package/dist/audit/adapters/semgrep.d.ts.map +1 -1
  15. package/dist/audit/adapters/semgrep.js +54 -1
  16. package/dist/audit/adapters/semgrep.js.map +1 -1
  17. package/dist/audit/cli/mergeAndIngestCommand.d.ts +29 -1
  18. package/dist/audit/cli/mergeAndIngestCommand.d.ts.map +1 -1
  19. package/dist/audit/cli/mergeAndIngestCommand.js +71 -5
  20. package/dist/audit/cli/mergeAndIngestCommand.js.map +1 -1
  21. package/dist/audit/cli/nextStepHelpers.d.ts.map +1 -1
  22. package/dist/audit/cli/nextStepHelpers.js +7 -6
  23. package/dist/audit/cli/nextStepHelpers.js.map +1 -1
  24. package/dist/audit/cli/resynthesizeCommand.d.ts.map +1 -1
  25. package/dist/audit/cli/resynthesizeCommand.js +3 -3
  26. package/dist/audit/cli/resynthesizeCommand.js.map +1 -1
  27. package/dist/audit/cli/submitPacketCommand.d.ts.map +1 -1
  28. package/dist/audit/cli/submitPacketCommand.js +6 -1
  29. package/dist/audit/cli/submitPacketCommand.js.map +1 -1
  30. package/dist/audit/contracts/workerSchemas.d.ts +13 -13
  31. package/dist/audit/contracts/workerSchemas.d.ts.map +1 -1
  32. package/dist/audit/contracts/workerSchemas.js +1 -1
  33. package/dist/audit/contracts/workerSchemas.js.map +1 -1
  34. package/dist/audit/contracts/wrapperResponse.d.ts +7 -0
  35. package/dist/audit/contracts/wrapperResponse.d.ts.map +1 -1
  36. package/dist/audit/contracts/wrapperResponse.js +1 -0
  37. package/dist/audit/contracts/wrapperResponse.js.map +1 -1
  38. package/dist/audit/extractors/graph.d.ts.map +1 -1
  39. package/dist/audit/extractors/graph.js +47 -0
  40. package/dist/audit/extractors/graph.js.map +1 -1
  41. package/dist/audit/io/artifacts.d.ts +2 -2
  42. package/dist/audit/io/artifacts.d.ts.map +1 -1
  43. package/dist/audit/io/artifacts.js +14 -11
  44. package/dist/audit/io/artifacts.js.map +1 -1
  45. package/dist/audit/orchestrator/designReviewPrompt.d.ts +17 -0
  46. package/dist/audit/orchestrator/designReviewPrompt.d.ts.map +1 -1
  47. package/dist/audit/orchestrator/designReviewPrompt.js +26 -0
  48. package/dist/audit/orchestrator/designReviewPrompt.js.map +1 -1
  49. package/dist/audit/orchestrator/executorRunners.d.ts.map +1 -1
  50. package/dist/audit/orchestrator/executorRunners.js +20 -0
  51. package/dist/audit/orchestrator/executorRunners.js.map +1 -1
  52. package/dist/audit/orchestrator/executors.d.ts.map +1 -1
  53. package/dist/audit/orchestrator/executors.js +5 -0
  54. package/dist/audit/orchestrator/executors.js.map +1 -1
  55. package/dist/audit/orchestrator/nextStep.d.ts +37 -0
  56. package/dist/audit/orchestrator/nextStep.d.ts.map +1 -1
  57. package/dist/audit/orchestrator/nextStep.js +45 -0
  58. package/dist/audit/orchestrator/nextStep.js.map +1 -1
  59. package/dist/audit/supervisor/operatorHandoff.d.ts +12 -0
  60. package/dist/audit/supervisor/operatorHandoff.d.ts.map +1 -1
  61. package/dist/audit/supervisor/operatorHandoff.js +3 -1
  62. package/dist/audit/supervisor/operatorHandoff.js.map +1 -1
  63. package/dist/audit/types/externalAnalyzer.d.ts +68 -2
  64. package/dist/audit/types/externalAnalyzer.d.ts.map +1 -1
  65. package/dist/audit/types/externalAnalyzer.js +23 -0
  66. package/dist/audit/types/externalAnalyzer.js.map +1 -1
  67. package/dist/audit/types/reviewPlanning.d.ts +14 -14
  68. package/dist/audit/validation/auditResults.d.ts +17 -0
  69. package/dist/audit/validation/auditResults.d.ts.map +1 -1
  70. package/dist/audit/validation/auditResults.js +39 -0
  71. package/dist/audit/validation/auditResults.js.map +1 -1
  72. package/dist/audit/validation/sessionConfig.d.ts.map +1 -1
  73. package/dist/audit/validation/sessionConfig.js +4 -0
  74. package/dist/audit/validation/sessionConfig.js.map +1 -1
  75. package/dist/remediate/review/autonomousGate.d.ts +74 -0
  76. package/dist/remediate/review/autonomousGate.d.ts.map +1 -0
  77. package/dist/remediate/review/autonomousGate.js +179 -0
  78. package/dist/remediate/review/autonomousGate.js.map +1 -0
  79. package/dist/remediate/steps/contractPipeline.d.ts +8 -0
  80. package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
  81. package/dist/remediate/steps/contractPipeline.js +1 -0
  82. package/dist/remediate/steps/contractPipeline.js.map +1 -1
  83. package/dist/remediate/steps/contractPipelinePrompts.d.ts +10 -0
  84. package/dist/remediate/steps/contractPipelinePrompts.d.ts.map +1 -1
  85. package/dist/remediate/steps/contractPipelinePrompts.js +32 -1
  86. package/dist/remediate/steps/contractPipelinePrompts.js.map +1 -1
  87. package/dist/remediate/steps/nextStep.d.ts +34 -0
  88. package/dist/remediate/steps/nextStep.d.ts.map +1 -1
  89. package/dist/remediate/steps/nextStep.js +144 -8
  90. package/dist/remediate/steps/nextStep.js.map +1 -1
  91. package/dist/shared/index.d.ts +11 -2
  92. package/dist/shared/index.d.ts.map +1 -1
  93. package/dist/shared/index.js +6 -2
  94. package/dist/shared/index.js.map +1 -1
  95. package/dist/shared/io/auditToolsPaths.d.ts +35 -0
  96. package/dist/shared/io/auditToolsPaths.d.ts.map +1 -1
  97. package/dist/shared/io/auditToolsPaths.js +46 -1
  98. package/dist/shared/io/auditToolsPaths.js.map +1 -1
  99. package/dist/shared/io/frictionCapture.d.ts +83 -0
  100. package/dist/shared/io/frictionCapture.d.ts.map +1 -0
  101. package/dist/shared/io/frictionCapture.js +79 -0
  102. package/dist/shared/io/frictionCapture.js.map +1 -0
  103. package/dist/shared/io/gitignoreArtifacts.d.ts +94 -0
  104. package/dist/shared/io/gitignoreArtifacts.d.ts.map +1 -0
  105. package/dist/shared/io/gitignoreArtifacts.js +147 -0
  106. package/dist/shared/io/gitignoreArtifacts.js.map +1 -0
  107. package/dist/shared/quota/antigravityQuotaSource.d.ts.map +1 -1
  108. package/dist/shared/quota/antigravityQuotaSource.js +2 -0
  109. package/dist/shared/quota/antigravityQuotaSource.js.map +1 -1
  110. package/dist/shared/quota/claudeOAuthQuotaSource.d.ts +35 -2
  111. package/dist/shared/quota/claudeOAuthQuotaSource.d.ts.map +1 -1
  112. package/dist/shared/quota/claudeOAuthQuotaSource.js +157 -17
  113. package/dist/shared/quota/claudeOAuthQuotaSource.js.map +1 -1
  114. package/dist/shared/quota/codexQuotaSource.d.ts.map +1 -1
  115. package/dist/shared/quota/codexQuotaSource.js +2 -0
  116. package/dist/shared/quota/codexQuotaSource.js.map +1 -1
  117. package/dist/shared/quota/copilotQuotaSource.d.ts.map +1 -1
  118. package/dist/shared/quota/copilotQuotaSource.js +2 -0
  119. package/dist/shared/quota/copilotQuotaSource.js.map +1 -1
  120. package/dist/shared/quota/errorParsing.d.ts +19 -0
  121. package/dist/shared/quota/errorParsing.d.ts.map +1 -1
  122. package/dist/shared/quota/errorParsing.js +14 -1
  123. package/dist/shared/quota/errorParsing.js.map +1 -1
  124. package/dist/shared/quota/hostSessionQuotaSource.d.ts +138 -0
  125. package/dist/shared/quota/hostSessionQuotaSource.d.ts.map +1 -0
  126. package/dist/shared/quota/hostSessionQuotaSource.js +213 -0
  127. package/dist/shared/quota/hostSessionQuotaSource.js.map +1 -0
  128. package/dist/shared/quota/httpQuotaSource.d.ts +7 -3
  129. package/dist/shared/quota/httpQuotaSource.d.ts.map +1 -1
  130. package/dist/shared/quota/httpQuotaSource.js.map +1 -1
  131. package/dist/shared/reporting/auditDeliverable.d.ts +36 -0
  132. package/dist/shared/reporting/auditDeliverable.d.ts.map +1 -0
  133. package/dist/shared/reporting/auditDeliverable.js +85 -0
  134. package/dist/shared/reporting/auditDeliverable.js.map +1 -0
  135. package/dist/shared/types/sessionConfig.d.ts +13 -0
  136. package/dist/shared/types/sessionConfig.d.ts.map +1 -1
  137. package/package.json +1 -1
  138. package/schemas/audit_result.schema.json +2 -2
  139. package/schemas/audit_results.schema.json +2 -2
  140. package/schemas/finding.schema.json +2 -2
  141. 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
- /** Reads a non-expired access token from the local credential file, or null. */
39
- private readAccessToken;
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;AAC3D,OAAO,EACL,mBAAmB,EAGnB,qBAAqB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAgB9B,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;AAKD,MAAM,WAAW,6BAA8B,SAAQ,sBAAsB;IAC3E,iDAAiD;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,mBAAmB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACxC;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;gBAEhC,OAAO,GAAE,6BAAkC;IAOvD,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;IAMrC,gFAAgF;IAChF,OAAO,CAAC,eAAe;CAkBxB;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,CAY3B"}
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 — 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;
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 accessToken = this.readAccessToken(nowMs);
33
- if (!accessToken)
60
+ const resolved = await this.resolveAccessToken(nowMs, false);
61
+ if (!resolved)
34
62
  return null;
35
- return fetchClaudeUsage({ accessToken, model }, this.fetchContext());
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
- /** Reads a non-expired access token from the local credential file, or null. */
38
- readAccessToken(nowMs) {
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
- parsed = JSON.parse(raw);
112
+ return JSON.parse(raw).claudeAiOauth ?? null;
49
113
  }
50
114
  catch {
51
115
  return null;
52
116
  }
53
- const oauth = parsed.claudeAiOauth;
54
- if (!oauth?.accessToken)
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
- if (typeof oauth.expiresAt === "number" && nowMs >= oauth.expiresAt)
182
+ }
183
+ try {
184
+ return JSON.parse(raw);
185
+ }
186
+ catch {
57
187
  return null;
58
- return oauth.accessToken;
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":"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"}
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,CAehG"}
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,CAqB3B"}
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;AAID,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,SAAS,GAAE,MAA4B,EACvC,GAAG,GAAE,MAAmB,GACvB,MAAM,CAGR"}
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