@claudexor/cli 3.19.0 → 3.22.0
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/account-catalog.d.ts +5 -6
- package/dist/account-catalog.d.ts.map +1 -1
- package/dist/account-catalog.js +24 -9
- package/dist/account-catalog.js.map +1 -1
- package/dist/account-observations.d.ts +31 -0
- package/dist/account-observations.d.ts.map +1 -0
- package/dist/account-observations.js +135 -0
- package/dist/account-observations.js.map +1 -0
- package/dist/accounts-projection.d.ts +5 -9
- package/dist/accounts-projection.d.ts.map +1 -1
- package/dist/accounts-projection.js +22 -41
- package/dist/accounts-projection.js.map +1 -1
- package/dist/accounts-services.d.ts +10 -1
- package/dist/accounts-services.d.ts.map +1 -1
- package/dist/accounts-services.js +50 -34
- package/dist/accounts-services.js.map +1 -1
- package/dist/acp-surface-runner.d.ts.map +1 -1
- package/dist/acp-surface-runner.js +2 -0
- package/dist/acp-surface-runner.js.map +1 -1
- package/dist/agy-quota-source.d.ts.map +1 -1
- package/dist/agy-quota-source.js +19 -33
- package/dist/agy-quota-source.js.map +1 -1
- package/dist/claude-oauth-credential.d.ts +16 -0
- package/dist/claude-oauth-credential.d.ts.map +1 -0
- package/dist/claude-oauth-credential.js +82 -0
- package/dist/claude-oauth-credential.js.map +1 -0
- package/dist/claude-oauth-fetch.d.ts +9 -0
- package/dist/claude-oauth-fetch.d.ts.map +1 -0
- package/dist/claude-oauth-fetch.js +67 -0
- package/dist/claude-oauth-fetch.js.map +1 -0
- package/dist/claude-oauth-usage.d.ts +7 -38
- package/dist/claude-oauth-usage.d.ts.map +1 -1
- package/dist/claude-oauth-usage.js +166 -180
- package/dist/claude-oauth-usage.js.map +1 -1
- package/dist/claudexord.d.ts.map +1 -1
- package/dist/claudexord.js +2 -2
- package/dist/claudexord.js.map +1 -1
- package/dist/cli-io.d.ts +2 -0
- package/dist/cli-io.d.ts.map +1 -1
- package/dist/cli-io.js +6 -5
- package/dist/cli-io.js.map +1 -1
- package/dist/codex-quota-source.d.ts +6 -2
- package/dist/codex-quota-source.d.ts.map +1 -1
- package/dist/codex-quota-source.js +62 -95
- package/dist/codex-quota-source.js.map +1 -1
- package/dist/continue-from-run.d.ts +27 -0
- package/dist/continue-from-run.d.ts.map +1 -0
- package/dist/continue-from-run.js +77 -0
- package/dist/continue-from-run.js.map +1 -0
- package/dist/control-services.d.ts +36 -3
- package/dist/control-services.d.ts.map +1 -1
- package/dist/control-services.js +15 -20
- package/dist/control-services.js.map +1 -1
- package/dist/credential-commands.d.ts.map +1 -1
- package/dist/credential-commands.js +12 -6
- package/dist/credential-commands.js.map +1 -1
- package/dist/daemon-agent-runner.d.ts.map +1 -1
- package/dist/daemon-agent-runner.js +4 -6
- package/dist/daemon-agent-runner.js.map +1 -1
- package/dist/gc-receipt-notes.d.ts +14 -0
- package/dist/gc-receipt-notes.d.ts.map +1 -0
- package/dist/gc-receipt-notes.js +28 -0
- package/dist/gc-receipt-notes.js.map +1 -0
- package/dist/harness-command-specs.d.ts +1 -1
- package/dist/harness-command-specs.d.ts.map +1 -1
- package/dist/harness-command-specs.js +8 -1
- package/dist/harness-command-specs.js.map +1 -1
- package/dist/harness-install-proof.d.ts.map +1 -1
- package/dist/harness-install-proof.js +14 -18
- package/dist/harness-install-proof.js.map +1 -1
- package/dist/harness-install-recipes.d.ts +2 -1
- package/dist/harness-install-recipes.d.ts.map +1 -1
- package/dist/harness-install-recipes.js +12 -9
- package/dist/harness-install-recipes.js.map +1 -1
- package/dist/harness-installer.d.ts +1 -1
- package/dist/harness-installer.d.ts.map +1 -1
- package/dist/harness-installer.js +8 -9
- package/dist/harness-installer.js.map +1 -1
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +8 -7
- package/dist/live.js.map +1 -1
- package/dist/mcp-catalog-query.js +3 -3
- package/dist/mcp-catalog-query.js.map +1 -1
- package/dist/mcp-run-projections.d.ts +17 -1
- package/dist/mcp-run-projections.d.ts.map +1 -1
- package/dist/mcp-run-projections.js +27 -1
- package/dist/mcp-run-projections.js.map +1 -1
- package/dist/model-account-evidence.d.ts +18 -0
- package/dist/model-account-evidence.d.ts.map +1 -0
- package/dist/model-account-evidence.js +71 -0
- package/dist/model-account-evidence.js.map +1 -0
- package/dist/model-services.d.ts.map +1 -1
- package/dist/model-services.js +78 -83
- package/dist/model-services.js.map +1 -1
- package/dist/native-login.d.ts +5 -0
- package/dist/native-login.d.ts.map +1 -1
- package/dist/native-login.js +18 -2
- package/dist/native-login.js.map +1 -1
- package/dist/ops-commands.d.ts.map +1 -1
- package/dist/ops-commands.js +22 -25
- package/dist/ops-commands.js.map +1 -1
- package/dist/orphan-sweeper.d.ts.map +1 -1
- package/dist/orphan-sweeper.js +11 -1
- package/dist/orphan-sweeper.js.map +1 -1
- package/dist/plugins.js +1 -1
- package/dist/plugins.js.map +1 -1
- package/dist/quota-command.js +3 -4
- package/dist/quota-command.js.map +1 -1
- package/dist/quota-refresh-diagnostics.d.ts +33 -0
- package/dist/quota-refresh-diagnostics.d.ts.map +1 -0
- package/dist/quota-refresh-diagnostics.js +9 -0
- package/dist/quota-refresh-diagnostics.js.map +1 -0
- package/dist/quota-refreshers.d.ts +5 -4
- package/dist/quota-refreshers.d.ts.map +1 -1
- package/dist/quota-refreshers.js +11 -4
- package/dist/quota-refreshers.js.map +1 -1
- package/dist/quota-services.d.ts +20 -2
- package/dist/quota-services.d.ts.map +1 -1
- package/dist/registry.d.ts +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +6 -2
- package/dist/registry.js.map +1 -1
- package/dist/retention-service.d.ts +7 -1
- package/dist/retention-service.d.ts.map +1 -1
- package/dist/retention-service.js +84 -5
- package/dist/retention-service.js.map +1 -1
- package/dist/run-orchestrator.d.ts +0 -6
- package/dist/run-orchestrator.d.ts.map +1 -1
- package/dist/run-orchestrator.js +41 -10
- package/dist/run-orchestrator.js.map +1 -1
- package/dist/settings-service.d.ts +14 -6
- package/dist/settings-service.d.ts.map +1 -1
- package/dist/settings-service.js +11 -5
- package/dist/settings-service.js.map +1 -1
- package/dist/setup-jobs.js +6 -6
- package/dist/setup-jobs.js.map +1 -1
- package/dist/setup-login-capability.d.ts.map +1 -1
- package/dist/setup-login-capability.js +6 -2
- package/dist/setup-login-capability.js.map +1 -1
- package/dist/setup-login-child-lifecycle.d.ts.map +1 -1
- package/dist/setup-login-child-lifecycle.js +16 -4
- package/dist/setup-login-child-lifecycle.js.map +1 -1
- package/dist/setup-login-fallback.d.ts +54 -0
- package/dist/setup-login-fallback.d.ts.map +1 -0
- package/dist/setup-login-fallback.js +95 -0
- package/dist/setup-login-fallback.js.map +1 -0
- package/dist/setup-login-inline.d.ts +8 -46
- package/dist/setup-login-inline.d.ts.map +1 -1
- package/dist/setup-login-inline.js +79 -104
- package/dist/setup-login-inline.js.map +1 -1
- package/dist/setup-login-input-prompt.d.ts +7 -0
- package/dist/setup-login-input-prompt.d.ts.map +1 -0
- package/dist/setup-login-input-prompt.js +27 -0
- package/dist/setup-login-input-prompt.js.map +1 -0
- package/dist/setup-login-runner.d.ts.map +1 -1
- package/dist/setup-login-runner.js +15 -11
- package/dist/setup-login-runner.js.map +1 -1
- package/dist/status-projection-cache.d.ts +3 -0
- package/dist/status-projection-cache.d.ts.map +1 -1
- package/dist/status-projection-cache.js +4 -1
- package/dist/status-projection-cache.js.map +1 -1
- package/dist/thread-delivery.d.ts.map +1 -1
- package/dist/thread-delivery.js +14 -13
- package/dist/thread-delivery.js.map +1 -1
- package/dist/thread-purge.d.ts +52 -0
- package/dist/thread-purge.d.ts.map +1 -0
- package/dist/thread-purge.js +27 -0
- package/dist/thread-purge.js.map +1 -0
- package/package.json +25 -24
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-oauth-fetch.js","sourceRoot":"","sources":["../src/claude-oauth-fetch.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,2CAA2C,CAAC;AAC9D,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AAC7C,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC;;;;uDAIuD;AACvD,MAAM,yBAAyB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;AAEvD;;;;;0BAK0B;AAC1B,MAAM,UAAU,uBAAuB,CACrC,MAAqB,EACrB,KAAK,GAAW,IAAI,CAAC,GAAG,EAAE;IAE1B,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QACnC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI;QACxB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK;YAC7B,CAAC,CAAC,IAAI,CAAC;IACX,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,yBAAyB,CAAC;IAChE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,WAAmB,EACnB,MAA+B;IAE/B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;QACjC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,WAAW,EAAE;YACtC,gBAAgB,EAAE,iBAAiB;YACnC,MAAM,EAAE,kBAAkB;SAC3B;QACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC;KAC9C,CAAC,CAAC;IACH,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,sEAAsE;IACtE,uEAAuE;IACvE,4EAA4E;IAC5E,oDAAoD;IACpD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;YACpE,kBAAkB,EAAE,cAAwC;SAC7D,CAAC,CAAC;IACL,CAAC;IACD,4EAA4E;IAC5E,2EAA2E;IAC3E,yEAAyE;IACzE,gEAAgE;IAChE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,EAAE;YAC1D,kBAAkB,EAAE,cAAwC;YAC5D,YAAY,EAAE,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;SACtE,CAAC,CAAC;IACL,CAAC;IACD,yEAAyE;IACzE,2EAA2E;IAC3E,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -1,39 +1,13 @@
|
|
|
1
|
+
import { readClaudeOauthCredential, type ClaudeOauthCredential } from "./claude-oauth-credential.js";
|
|
1
2
|
import type { QuotaRefreshCycle, QuotaRefreshResult } from "@claudexor/daemon";
|
|
3
|
+
import { refreshClaudeNativeAuth } from "@claudexor/harness-claude";
|
|
2
4
|
import { type QuotaSnapshot } from "@claudexor/schema";
|
|
3
|
-
|
|
4
|
-
* The PRIMARY subscription-quota source (W5.3, live-proven 2026-07-17):
|
|
5
|
-
* `GET api.anthropic.com/api/oauth/usage` with a profile's OAuth access token
|
|
6
|
-
* returns proactive five_hour/seven_day utilization — the stream's rate-limit
|
|
7
|
-
* signals arrive only reactively, AFTER a limit bites.
|
|
8
|
-
*
|
|
9
|
-
* Security (INV-062 class): the access token is read from the profile's OWN
|
|
10
|
-
* vendor store — the keychain item on macOS, the vendor's
|
|
11
|
-
* `<configDir>/.credentials.json` (documented 0600 file store) elsewhere —
|
|
12
|
-
* held transiently for at most one usage request, and never persisted,
|
|
13
|
-
* logged, or included in errors. Before probing a known-expired or near-expiry
|
|
14
|
-
* refreshable credential, Claudexor wakes Claude Code's prompt-free MCP server
|
|
15
|
-
* and lets the vendor refresh its own store; a known-fresh 401/403 remains the
|
|
16
|
-
* vendor's explicit rejection evidence.
|
|
17
|
-
*/
|
|
18
|
-
/** Vendor formula, live-verified: `Claude Code-credentials-<sha256(configDir)[:8]>`. */
|
|
19
|
-
export declare function claudeOauthKeychainItem(configDir: string): string;
|
|
20
|
-
export interface ClaudeOauthCredential {
|
|
21
|
-
accessToken: string;
|
|
22
|
-
subscriptionType: string | null;
|
|
23
|
-
expiresAtMs: number | null;
|
|
24
|
-
hasRefreshToken: boolean;
|
|
25
|
-
}
|
|
26
|
-
/** Read the profile's OAuth credential from the vendor's own store: the
|
|
27
|
-
* profile-keyed keychain item on macOS (`security`), or the vendor's
|
|
28
|
-
* `<configDir>/.credentials.json` everywhere else — Linux has no keychain. */
|
|
29
|
-
export declare function readClaudeOauthCredential(configDir: string, platform?: NodeJS.Platform): Promise<ClaudeOauthCredential | null>;
|
|
30
|
-
/** Accepts both credential shapes seen in the wild: flat and `{claudeAiOauth}`. */
|
|
31
|
-
export declare function parseClaudeOauthCredential(raw: string): ClaudeOauthCredential | null;
|
|
5
|
+
import { type QuotaDiagnosticSink } from "./quota-refresh-diagnostics.js";
|
|
32
6
|
/** Daemon-side credential change (login/logout/profile mutation): every
|
|
33
7
|
* remembered rejection is re-verified on the next cycle. Fail-open by
|
|
34
8
|
* contract — over-clearing costs at most one probe. */
|
|
35
9
|
export declare function forgetClaudeOauthRejections(): void;
|
|
36
|
-
export type ClaudeOauthCredentialRefresher = (configDir: string, platform: NodeJS.Platform, readCredential: typeof readClaudeOauthCredential) => Promise<ClaudeOauthCredential | null>;
|
|
10
|
+
export type ClaudeOauthCredentialRefresher = (configDir: string, platform: NodeJS.Platform, readCredential: typeof readClaudeOauthCredential, diagnostic?: NonNullable<Parameters<typeof refreshClaudeNativeAuth>[2]>["diagnostic"]) => Promise<ClaudeOauthCredential | null>;
|
|
37
11
|
/** Pure mapping of the oauth/usage response onto QuotaSnapshot (testable). */
|
|
38
12
|
export declare function parseClaudeOauthUsage(value: unknown, subjectId: string | null, planLabel: string | null, observedAt?: Date): QuotaSnapshot | null;
|
|
39
13
|
export interface ClaudeOauthUsageDeps {
|
|
@@ -42,14 +16,8 @@ export interface ClaudeOauthUsageDeps {
|
|
|
42
16
|
fetchUsage: (accessToken: string) => Promise<unknown>;
|
|
43
17
|
now: () => Date;
|
|
44
18
|
platform: NodeJS.Platform;
|
|
19
|
+
diagnostic: QuotaDiagnosticSink;
|
|
45
20
|
}
|
|
46
|
-
/** RFC 9110 Retry-After → milliseconds from `now`: delta-seconds or an
|
|
47
|
-
* HTTP-date, clamped to [0, MAX_RETRY_AFTER_HEADER_MS] (a non-finite or
|
|
48
|
-
* oversized value clamps to the ceiling — the vendor DID ask for a long
|
|
49
|
-
* pause; the observation is kept, bounded). Null only for a missing or
|
|
50
|
-
* unparseable header — the floor is then unknown and pacing falls back to
|
|
51
|
-
* exponential backoff. */
|
|
52
|
-
export declare function parseRetryAfterHeaderMs(header: string | null, nowMs?: number): number | null;
|
|
53
21
|
/** One subject per logged-in config dir: the default native dir (subject null)
|
|
54
22
|
* plus every enabled claude config_dir_login profile (subject = profile_id).
|
|
55
23
|
* The PRIMARY claude source (release cut V11a) — it owns the claude subject
|
|
@@ -61,7 +29,8 @@ export declare function parseRetryAfterHeaderMs(header: string | null, nowMs?: n
|
|
|
61
29
|
* automatically refreshed by Claude Code without inference, and a fetch
|
|
62
30
|
* refusal is refresh_failed unless a known-fresh credential is explicitly rejected.
|
|
63
31
|
* A remembered rejection is re-stated without re-presenting the token on
|
|
64
|
-
* background cycles (see `rejectedTokens`); a foreground cycle
|
|
32
|
+
* background cycles (see `rejectedTokens`); a foreground cycle re-asks unless
|
|
33
|
+
* its poll floor remains active.
|
|
65
34
|
* Absence is stated, never inferred. */
|
|
66
35
|
export declare function refreshClaudeOauthUsageQuota(deps?: Partial<ClaudeOauthUsageDeps>, cycle?: QuotaRefreshCycle): Promise<QuotaRefreshResult>;
|
|
67
36
|
//# sourceMappingURL=claude-oauth-usage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-oauth-usage.d.ts","sourceRoot":"","sources":["../src/claude-oauth-usage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude-oauth-usage.d.ts","sourceRoot":"","sources":["../src/claude-oauth-usage.ts"],"names":[],"mappings":"AACA,OAAO,EACL,yBAAyB,EAEzB,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAOL,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,gCAAgC,CAAC;AAkCxC;;uDAEuD;AACvD,wBAAgB,2BAA2B,IAAI,IAAI,CAGlD;AA8BD,MAAM,MAAM,8BAA8B,GAAG,CAC3C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,EACzB,cAAc,EAAE,OAAO,yBAAyB,EAChD,UAAU,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAClF,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;AAwB3C,8EAA8E;AAC9E,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,UAAU,OAAa,GACtB,aAAa,GAAG,IAAI,CAqBtB;AAgDD,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,OAAO,yBAAyB,CAAC;IACjD,iBAAiB,EAAE,8BAA8B,CAAC;IAClD,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,GAAG,EAAE,MAAM,IAAI,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,UAAU,EAAE,mBAAmB,CAAC;CACjC;AAqBD;;;;;;;;;;;;;wCAawC;AACxC,wBAAsB,4BAA4B,CAChD,IAAI,GAAE,OAAO,CAAC,oBAAoB,CAAM,EACxC,KAAK,CAAC,EAAE,iBAAiB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAyV7B"}
|
|
@@ -1,113 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { userInfo } from "node:os";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import { promisify } from "node:util";
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { readClaudeOauthCredential, taggedRefreshFailure, } from "./claude-oauth-credential.js";
|
|
6
3
|
import { loadConfig } from "@claudexor/config";
|
|
7
4
|
import { canonicalProfileConfigDir, CLAUDE_AUTH_REFRESH_TERMINATION_UNCONFIRMED, claudeNativeEnv, claudeOauthAccessTokenIsFresh, claudeQuotaModelAliases, defaultNativeClaudeConfigDir, refreshClaudeNativeAuth, } from "@claudexor/harness-claude";
|
|
8
5
|
import { QuotaSnapshot as QuotaSnapshotSchema, } from "@claudexor/schema";
|
|
9
6
|
import { noProjectRepoRoot, sha256 } from "@claudexor/util";
|
|
7
|
+
import { fetchClaudeOauthUsage } from "./claude-oauth-fetch.js";
|
|
10
8
|
import { readAccountsMigrationFile } from "./accounts-unified-migration.js";
|
|
9
|
+
import { emitQuotaDiagnostic, } from "./quota-refresh-diagnostics.js";
|
|
11
10
|
const SOURCE = "claude_oauth_usage";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
* The PRIMARY subscription-quota source (W5.3, live-proven 2026-07-17):
|
|
17
|
-
* `GET api.anthropic.com/api/oauth/usage` with a profile's OAuth access token
|
|
18
|
-
* returns proactive five_hour/seven_day utilization — the stream's rate-limit
|
|
19
|
-
* signals arrive only reactively, AFTER a limit bites.
|
|
20
|
-
*
|
|
21
|
-
* Security (INV-062 class): the access token is read from the profile's OWN
|
|
22
|
-
* vendor store — the keychain item on macOS, the vendor's
|
|
23
|
-
* `<configDir>/.credentials.json` (documented 0600 file store) elsewhere —
|
|
24
|
-
* held transiently for at most one usage request, and never persisted,
|
|
25
|
-
* logged, or included in errors. Before probing a known-expired or near-expiry
|
|
26
|
-
* refreshable credential, Claudexor wakes Claude Code's prompt-free MCP server
|
|
27
|
-
* and lets the vendor refresh its own store; a known-fresh 401/403 remains the
|
|
28
|
-
* vendor's explicit rejection evidence.
|
|
29
|
-
*/
|
|
30
|
-
/** Vendor formula, live-verified: `Claude Code-credentials-<sha256(configDir)[:8]>`. */
|
|
31
|
-
export function claudeOauthKeychainItem(configDir) {
|
|
32
|
-
return `Claude Code-credentials-${sha256(configDir).replace("sha256:", "").slice(0, 8)}`;
|
|
33
|
-
}
|
|
34
|
-
const execFileAsync = promisify(execFile);
|
|
35
|
-
/** Read the profile's OAuth credential from the vendor's own store: the
|
|
36
|
-
* profile-keyed keychain item on macOS (`security`), or the vendor's
|
|
37
|
-
* `<configDir>/.credentials.json` everywhere else — Linux has no keychain. */
|
|
38
|
-
export async function readClaudeOauthCredential(configDir, platform = process.platform) {
|
|
39
|
-
if (platform !== "darwin")
|
|
40
|
-
return readClaudeOauthCredentialFile(configDir);
|
|
41
|
-
try {
|
|
42
|
-
const { stdout } = await execFileAsync("security", [
|
|
43
|
-
"find-generic-password",
|
|
44
|
-
"-s",
|
|
45
|
-
claudeOauthKeychainItem(configDir),
|
|
46
|
-
"-a",
|
|
47
|
-
userInfo().username,
|
|
48
|
-
"-w",
|
|
49
|
-
], { timeout: 5_000, maxBuffer: 1024 * 1024 });
|
|
50
|
-
return parseClaudeOauthCredential(stdout);
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
return null; // no item / locked keychain — honest absence
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/** The non-macOS vendor store (`.credentials.json`, documented mode 0600).
|
|
57
|
-
* A missing file is the honest logged-out null; a present-but-unreadable or
|
|
58
|
-
* unparseable file throws a reason-tagged error carrying only the error
|
|
59
|
-
* class — never file bytes or a token (INV-062). */
|
|
60
|
-
async function readClaudeOauthCredentialFile(configDir) {
|
|
61
|
-
let raw;
|
|
62
|
-
try {
|
|
63
|
-
raw = await readFile(join(configDir, ".credentials.json"), "utf8");
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
const code = error.code;
|
|
67
|
-
if (code === "ENOENT" || code === "ENOTDIR")
|
|
68
|
-
return null;
|
|
69
|
-
throw taggedRefreshFailure(`credential file unreadable (${code ?? "io_error"})`);
|
|
70
|
-
}
|
|
71
|
-
const credential = parseClaudeOauthCredential(raw);
|
|
72
|
-
if (credential === null) {
|
|
73
|
-
throw taggedRefreshFailure("credential file did not parse as a vendor credential");
|
|
74
|
-
}
|
|
75
|
-
return credential;
|
|
76
|
-
}
|
|
77
|
-
function taggedRefreshFailure(detail) {
|
|
78
|
-
return Object.assign(new Error(detail), {
|
|
79
|
-
quotaAbsenceReason: "refresh_failed",
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
/** Accepts both credential shapes seen in the wild: flat and `{claudeAiOauth}`. */
|
|
83
|
-
export function parseClaudeOauthCredential(raw) {
|
|
84
|
-
try {
|
|
85
|
-
const parsed = JSON.parse(raw.trim());
|
|
86
|
-
const body = (parsed["claudeAiOauth"] && typeof parsed["claudeAiOauth"] === "object"
|
|
87
|
-
? parsed["claudeAiOauth"]
|
|
88
|
-
: parsed);
|
|
89
|
-
const token = body["accessToken"];
|
|
90
|
-
if (typeof token !== "string" || token.length === 0)
|
|
91
|
-
return null;
|
|
92
|
-
return {
|
|
93
|
-
accessToken: token,
|
|
94
|
-
subscriptionType: typeof body["subscriptionType"] === "string" ? body["subscriptionType"] : null,
|
|
95
|
-
expiresAtMs: typeof body["expiresAt"] === "number" && Number.isFinite(body["expiresAt"])
|
|
96
|
-
? body["expiresAt"]
|
|
97
|
-
: null,
|
|
98
|
-
hasRefreshToken: typeof body["refreshToken"] === "string" && body["refreshToken"].length > 0,
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
catch {
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
11
|
+
/** Full subscription inventory from oauth/usage, independent of passive stream
|
|
12
|
+
* windows. Access material from claude-oauth-credential stays transient for one
|
|
13
|
+
* serial refresh cycle. Claude Code owns renewal and persistence; diagnostics contain only
|
|
14
|
+
* expiry/presence and physical operation receipts, never credentials. */
|
|
105
15
|
/** A vendor rejection remembered per PRESENTED token (INV-062: the token's
|
|
106
16
|
* hash, never the token; process memory only; never persisted or logged).
|
|
107
|
-
* Re-presenting a
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
17
|
+
* Re-presenting a proven rejection needlessly uses endpoint capacity. Usage
|
|
18
|
+
* reads have returned one-hour Retry-After pauses, whose vendor-lane floor
|
|
19
|
+
* also delays healthy siblings; that is not a measured global request budget.
|
|
20
|
+
* So a
|
|
111
21
|
* background cycle re-states the typed `auth_revoked` absence for a
|
|
112
22
|
* remembered token WITHOUT an HTTP request — the same doctrine as the codex
|
|
113
23
|
* source's logged-out precheck — until the token bytes change (any re-login,
|
|
@@ -160,8 +70,8 @@ function needsVendorRefresh(credential, observedAt) {
|
|
|
160
70
|
/** Keep refresh-token custody and store writes inside Claude Code. Claudexor
|
|
161
71
|
* wakes the vendor's prompt-free MCP server, observes expiry metadata, then
|
|
162
72
|
* re-reads the access token only after the vendor has published fresh state. */
|
|
163
|
-
async function refreshCredentialDefault(configDir, platform, readCredential) {
|
|
164
|
-
const refreshed = await refreshClaudeNativeAuth(claudeNativeEnv(undefined, configDir), async () => (await readCredential(configDir, platform))?.expiresAtMs ?? null);
|
|
73
|
+
async function refreshCredentialDefault(configDir, platform, readCredential, diagnostic) {
|
|
74
|
+
const refreshed = await refreshClaudeNativeAuth(claudeNativeEnv(undefined, configDir), async () => (await readCredential(configDir, platform))?.expiresAtMs ?? null, { diagnostic });
|
|
165
75
|
if (!refreshed)
|
|
166
76
|
throw taggedRefreshFailure(VENDOR_REFRESH_FAILED_DETAIL);
|
|
167
77
|
const credential = await readCredential(configDir, platform);
|
|
@@ -238,67 +148,6 @@ function scopedConstraints(value) {
|
|
|
238
148
|
};
|
|
239
149
|
});
|
|
240
150
|
}
|
|
241
|
-
/** Ceiling on a vendor-supplied Retry-After (7 days, aligned with the
|
|
242
|
-
* pacer's floor ceiling): an absurd or overflowing header must clamp here at
|
|
243
|
-
* the PARSER — an unrepresentable number reaching the schema would invalidate
|
|
244
|
-
* the whole typed rate_limited observation and drop the batch, so the floor
|
|
245
|
-
* would never arm at exactly the moment it matters. */
|
|
246
|
-
const MAX_RETRY_AFTER_HEADER_MS = 7 * 24 * 60 * 60_000;
|
|
247
|
-
/** RFC 9110 Retry-After → milliseconds from `now`: delta-seconds or an
|
|
248
|
-
* HTTP-date, clamped to [0, MAX_RETRY_AFTER_HEADER_MS] (a non-finite or
|
|
249
|
-
* oversized value clamps to the ceiling — the vendor DID ask for a long
|
|
250
|
-
* pause; the observation is kept, bounded). Null only for a missing or
|
|
251
|
-
* unparseable header — the floor is then unknown and pacing falls back to
|
|
252
|
-
* exponential backoff. */
|
|
253
|
-
export function parseRetryAfterHeaderMs(header, nowMs = Date.now()) {
|
|
254
|
-
if (header === null)
|
|
255
|
-
return null;
|
|
256
|
-
const trimmed = header.trim();
|
|
257
|
-
const deltaMs = /^\d+$/.test(trimmed)
|
|
258
|
-
? Number(trimmed) * 1000
|
|
259
|
-
: Number.isFinite(Date.parse(trimmed))
|
|
260
|
-
? Date.parse(trimmed) - nowMs
|
|
261
|
-
: null;
|
|
262
|
-
if (deltaMs === null)
|
|
263
|
-
return null;
|
|
264
|
-
if (!Number.isFinite(deltaMs))
|
|
265
|
-
return MAX_RETRY_AFTER_HEADER_MS;
|
|
266
|
-
return Math.min(Math.max(0, Math.round(deltaMs)), MAX_RETRY_AFTER_HEADER_MS);
|
|
267
|
-
}
|
|
268
|
-
async function fetchUsageDefault(accessToken) {
|
|
269
|
-
const res = await fetch(USAGE_URL, {
|
|
270
|
-
method: "GET",
|
|
271
|
-
headers: {
|
|
272
|
-
authorization: `Bearer ${accessToken}`,
|
|
273
|
-
"anthropic-beta": OAUTH_BETA_HEADER,
|
|
274
|
-
accept: "application/json",
|
|
275
|
-
},
|
|
276
|
-
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
277
|
-
});
|
|
278
|
-
// A 401/403 is tagged as the vendor rejecting the presented access token.
|
|
279
|
-
// The caller owns the credential-expiry context: a token known to have
|
|
280
|
-
// expired while refreshable is awaiting Claude Code's vendor-owned refresh,
|
|
281
|
-
// not evidence that the account itself was revoked.
|
|
282
|
-
if (res.status === 401 || res.status === 403) {
|
|
283
|
-
throw Object.assign(new Error(`oauth/usage responded ${res.status}`), {
|
|
284
|
-
quotaAbsenceReason: "auth_revoked",
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
// A 429 throttles the POLL, not the plan: typed `rate_limited` so the pacer
|
|
288
|
-
// can honor the vendor's Retry-After floor (owner decision 7=A: this stays
|
|
289
|
-
// pacing evidence and is never journaled as a quota cooldown). Anthropic
|
|
290
|
-
// does not always send Retry-After — retryAfterMs is then null.
|
|
291
|
-
if (res.status === 429) {
|
|
292
|
-
throw Object.assign(new Error("oauth/usage responded 429"), {
|
|
293
|
-
quotaAbsenceReason: "rate_limited",
|
|
294
|
-
retryAfterMs: parseRetryAfterHeaderMs(res.headers.get("retry-after")),
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
// Everything else stays an undiagnosed refresh failure.
|
|
298
|
-
if (!res.ok)
|
|
299
|
-
throw new Error(`oauth/usage responded ${res.status}`);
|
|
300
|
-
return res.json();
|
|
301
|
-
}
|
|
302
151
|
function claudeOauthAbsence(subjectId, reason, detail, observedAt) {
|
|
303
152
|
return {
|
|
304
153
|
subject: {
|
|
@@ -323,17 +172,32 @@ function claudeOauthAbsence(subjectId, reason, detail, observedAt) {
|
|
|
323
172
|
* automatically refreshed by Claude Code without inference, and a fetch
|
|
324
173
|
* refusal is refresh_failed unless a known-fresh credential is explicitly rejected.
|
|
325
174
|
* A remembered rejection is re-stated without re-presenting the token on
|
|
326
|
-
* background cycles (see `rejectedTokens`); a foreground cycle
|
|
175
|
+
* background cycles (see `rejectedTokens`); a foreground cycle re-asks unless
|
|
176
|
+
* its poll floor remains active.
|
|
327
177
|
* Absence is stated, never inferred. */
|
|
328
178
|
export async function refreshClaudeOauthUsageQuota(deps = {}, cycle) {
|
|
329
179
|
const readCredential = deps.readCredential ?? readClaudeOauthCredential;
|
|
330
180
|
const refreshCredential = deps.refreshCredential ?? refreshCredentialDefault;
|
|
331
|
-
const fetchUsage = deps.fetchUsage ?? fetchUsageDefault;
|
|
332
181
|
const now = deps.now ?? (() => new Date());
|
|
333
182
|
const platform = deps.platform ?? process.platform;
|
|
334
183
|
// Rejections observed by THIS cycle count only if no credential change
|
|
335
184
|
// intervened; one expired memory is released for re-verification per cycle.
|
|
336
185
|
const epoch = rejectionEpoch;
|
|
186
|
+
const operationId = randomUUID();
|
|
187
|
+
const report = (profileId, record) => {
|
|
188
|
+
if (!deps.diagnostic)
|
|
189
|
+
return;
|
|
190
|
+
emitQuotaDiagnostic(deps.diagnostic, {
|
|
191
|
+
...record,
|
|
192
|
+
operationId,
|
|
193
|
+
source: SOURCE,
|
|
194
|
+
profileId,
|
|
195
|
+
at: now().toISOString(),
|
|
196
|
+
foreground: cycle?.foreground === true,
|
|
197
|
+
credentialEpoch: epoch,
|
|
198
|
+
current: epoch === rejectionEpoch,
|
|
199
|
+
});
|
|
200
|
+
};
|
|
337
201
|
releaseExpiredRejection(now().getTime());
|
|
338
202
|
const notLoggedInDetail = platform === "darwin"
|
|
339
203
|
? "no OAuth credential in the keychain item (no login, or the keychain tool is unavailable)"
|
|
@@ -363,34 +227,131 @@ export async function refreshClaudeOauthUsageQuota(deps = {}, cycle) {
|
|
|
363
227
|
}
|
|
364
228
|
const snapshots = [];
|
|
365
229
|
const absences = [];
|
|
366
|
-
|
|
367
|
-
|
|
230
|
+
// Read all current identities before the serial HTTP pass so token-identical
|
|
231
|
+
// aliases inherit a saved floor regardless of profile order after restart.
|
|
232
|
+
const prepared = [];
|
|
233
|
+
for (const candidate of candidates) {
|
|
368
234
|
let credential;
|
|
369
235
|
try {
|
|
370
236
|
credential = await readCredential(candidate.configDir, platform);
|
|
371
237
|
}
|
|
372
238
|
catch (error) {
|
|
373
239
|
const tagged = error?.quotaAbsenceReason;
|
|
240
|
+
report(candidate.subjectId, {
|
|
241
|
+
stage: "credential_read",
|
|
242
|
+
outcome: "failed",
|
|
243
|
+
reason: tagged ?? "refresh_failed",
|
|
244
|
+
});
|
|
374
245
|
absences.push(claudeOauthAbsence(candidate.subjectId, tagged ?? "refresh_failed", error instanceof Error ? error.message : String(error), now()));
|
|
375
246
|
continue;
|
|
376
247
|
}
|
|
377
248
|
if (!credential) {
|
|
249
|
+
report(candidate.subjectId, {
|
|
250
|
+
stage: "credential_read",
|
|
251
|
+
outcome: "skipped",
|
|
252
|
+
reason: "credential_absent_or_unreadable",
|
|
253
|
+
});
|
|
378
254
|
absences.push(claudeOauthAbsence(candidate.subjectId, "not_logged_in", notLoggedInDetail, now()));
|
|
379
255
|
continue;
|
|
380
256
|
}
|
|
257
|
+
prepared.push({ candidate, credential });
|
|
258
|
+
}
|
|
259
|
+
const subjectOf = (subjectId) => ({
|
|
260
|
+
harness: "claude",
|
|
261
|
+
credential_route: "vendor_native",
|
|
262
|
+
subject_id: subjectId,
|
|
263
|
+
plan_label: null,
|
|
264
|
+
});
|
|
265
|
+
const bindCredentials = () => cycle?.pacing?.bindCredentials(prepared.map(({ candidate, credential }) => ({
|
|
266
|
+
subject: subjectOf(candidate.subjectId),
|
|
267
|
+
credentialHash: sha256(credential.accessToken),
|
|
268
|
+
})));
|
|
269
|
+
bindCredentials();
|
|
270
|
+
const throttledTokens = new Set();
|
|
271
|
+
const skipPacedCredential = (subject, credential) => {
|
|
272
|
+
const pacedUntil = cycle?.pacing?.cooldownUntil(subject, now().getTime());
|
|
273
|
+
if (pacedUntil !== null && pacedUntil !== undefined) {
|
|
274
|
+
report(subject.subject_id, {
|
|
275
|
+
stage: "poll",
|
|
276
|
+
outcome: "skipped",
|
|
277
|
+
reason: "subject_rate_limited",
|
|
278
|
+
});
|
|
279
|
+
absences.push(claudeOauthAbsence(subject.subject_id, "poll_paced", `quota poll paused by rate-limit cooldown until ${new Date(pacedUntil).toISOString()}`, now()));
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
282
|
+
if (throttledTokens.has(sha256(credential.accessToken))) {
|
|
283
|
+
report(subject.subject_id, {
|
|
284
|
+
stage: "poll",
|
|
285
|
+
outcome: "skipped",
|
|
286
|
+
reason: "same_token_rate_limited",
|
|
287
|
+
});
|
|
288
|
+
absences.push(claudeOauthAbsence(subject.subject_id, "probe_skipped_rate_limited", "this token's oauth/usage probe hit the rate limit earlier in this cycle", now()));
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
return false;
|
|
292
|
+
};
|
|
293
|
+
for (const item of prepared) {
|
|
294
|
+
const { candidate } = item;
|
|
295
|
+
let { credential } = item;
|
|
296
|
+
const subject = subjectOf(candidate.subjectId);
|
|
297
|
+
if (skipPacedCredential(subject, credential))
|
|
298
|
+
continue;
|
|
299
|
+
// Retain the existing snapshot and its observation time when another
|
|
300
|
+
// account's retry caused this background lane cycle. All current aliases
|
|
301
|
+
// were bound above, and poll floors have already been honored.
|
|
302
|
+
if (cycle?.shouldRefresh?.(subject) === false) {
|
|
303
|
+
report(candidate.subjectId, {
|
|
304
|
+
stage: "poll",
|
|
305
|
+
outcome: "skipped",
|
|
306
|
+
reason: "primary_evidence_not_due",
|
|
307
|
+
});
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
381
310
|
let beforeRequest = now();
|
|
382
311
|
if (needsVendorRefresh(credential, beforeRequest)) {
|
|
312
|
+
const previousExpiresAtMs = credential.expiresAtMs;
|
|
313
|
+
let nativeResult;
|
|
314
|
+
report(candidate.subjectId, {
|
|
315
|
+
stage: "native_refresh",
|
|
316
|
+
outcome: "started",
|
|
317
|
+
previousExpiresAtMs,
|
|
318
|
+
hasRefreshToken: credential.hasRefreshToken,
|
|
319
|
+
});
|
|
383
320
|
const originalCredentialStillValid = credential.expiresAtMs !== null && credential.expiresAtMs > beforeRequest.getTime();
|
|
384
321
|
try {
|
|
385
|
-
const refreshed = await refreshCredential(candidate.configDir, platform, readCredential)
|
|
322
|
+
const refreshed = await refreshCredential(candidate.configDir, platform, readCredential, (native) => {
|
|
323
|
+
nativeResult = native;
|
|
324
|
+
});
|
|
386
325
|
if (refreshed === null ||
|
|
387
326
|
!claudeOauthAccessTokenIsFresh(refreshed.expiresAtMs, now().getTime())) {
|
|
388
327
|
throw taggedRefreshFailure(VENDOR_REFRESH_FAILED_DETAIL);
|
|
389
328
|
}
|
|
390
329
|
credential = refreshed;
|
|
330
|
+
item.credential = refreshed;
|
|
331
|
+
bindCredentials();
|
|
332
|
+
report(candidate.subjectId, {
|
|
333
|
+
stage: "native_refresh",
|
|
334
|
+
outcome: "succeeded",
|
|
335
|
+
reason: "fresh_expiry_observed_writer_unknown",
|
|
336
|
+
previousExpiresAtMs,
|
|
337
|
+
expiresAtMs: credential.expiresAtMs,
|
|
338
|
+
native: nativeResult,
|
|
339
|
+
});
|
|
391
340
|
beforeRequest = now();
|
|
341
|
+
// Refresh may have joined a token alias whose poll floor is already active.
|
|
342
|
+
if (skipPacedCredential(subject, credential))
|
|
343
|
+
continue;
|
|
392
344
|
}
|
|
393
345
|
catch (error) {
|
|
346
|
+
report(candidate.subjectId, {
|
|
347
|
+
stage: "native_refresh",
|
|
348
|
+
outcome: "failed",
|
|
349
|
+
reason: error?.code === CLAUDE_AUTH_REFRESH_TERMINATION_UNCONFIRMED
|
|
350
|
+
? "termination_unconfirmed"
|
|
351
|
+
: "fresh_expiry_not_observed",
|
|
352
|
+
previousExpiresAtMs,
|
|
353
|
+
native: nativeResult,
|
|
354
|
+
});
|
|
394
355
|
// The five-minute wake is proactive. If Claude Code cannot refresh yet
|
|
395
356
|
// but the presented access token is still unexpired, use that proven
|
|
396
357
|
// token for this bounded request rather than hiding an available quota.
|
|
@@ -407,16 +368,39 @@ export async function refreshClaudeOauthUsageQuota(deps = {}, cycle) {
|
|
|
407
368
|
const tokenKey = sha256(credential.accessToken);
|
|
408
369
|
const rejectedAt = rejectedTokens.get(tokenKey);
|
|
409
370
|
if (rejectedAt !== undefined && !cycle?.foreground) {
|
|
371
|
+
report(candidate.subjectId, {
|
|
372
|
+
stage: "poll",
|
|
373
|
+
outcome: "skipped",
|
|
374
|
+
reason: "presented_token_already_rejected",
|
|
375
|
+
});
|
|
410
376
|
// The SAME observation re-stated: its instant is the vendor's real
|
|
411
377
|
// rejection time, not this cycle's clock (stable projection signature,
|
|
412
378
|
// honest "revoked at" for downstream readers).
|
|
413
379
|
absences.push(claudeOauthAbsence(candidate.subjectId, "auth_revoked", `oauth/usage rejected this token at ${new Date(rejectedAt).toISOString()}; not re-asked until the token changes, a login or profile change, an explicit refresh, or ${REVOKED_TOKEN_REPROBE_MS / 3_600_000} h elapse (then one remembered token is re-verified per cycle)`, new Date(rejectedAt)));
|
|
414
380
|
continue;
|
|
415
381
|
}
|
|
382
|
+
let httpStatus;
|
|
383
|
+
const fetchUsage = deps.fetchUsage ??
|
|
384
|
+
((token) => fetchClaudeOauthUsage(token, (status) => {
|
|
385
|
+
httpStatus = status;
|
|
386
|
+
}));
|
|
416
387
|
try {
|
|
388
|
+
report(candidate.subjectId, {
|
|
389
|
+
stage: "usage_http",
|
|
390
|
+
outcome: "started",
|
|
391
|
+
expiresAtMs: credential.expiresAtMs,
|
|
392
|
+
hasRefreshToken: credential.hasRefreshToken,
|
|
393
|
+
});
|
|
394
|
+
const requestStartedAt = now();
|
|
417
395
|
const usage = await fetchUsage(credential.accessToken);
|
|
418
396
|
rejectedTokens.delete(tokenKey);
|
|
419
|
-
const snapshot = parseClaudeOauthUsage(usage, candidate.subjectId, credential.subscriptionType,
|
|
397
|
+
const snapshot = parseClaudeOauthUsage(usage, candidate.subjectId, credential.subscriptionType, requestStartedAt);
|
|
398
|
+
report(candidate.subjectId, {
|
|
399
|
+
stage: "usage_http",
|
|
400
|
+
outcome: snapshot ? "succeeded" : "failed",
|
|
401
|
+
httpStatus,
|
|
402
|
+
reason: snapshot ? "windows_observed" : "no_parseable_windows",
|
|
403
|
+
});
|
|
420
404
|
if (snapshot)
|
|
421
405
|
snapshots.push(snapshot);
|
|
422
406
|
else
|
|
@@ -435,6 +419,13 @@ export async function refreshClaudeOauthUsageQuota(deps = {}, cycle) {
|
|
|
435
419
|
const tagged = error?.quotaAbsenceReason;
|
|
436
420
|
const retryAfterMs = error?.retryAfterMs;
|
|
437
421
|
const observedAt = now();
|
|
422
|
+
report(candidate.subjectId, {
|
|
423
|
+
stage: "usage_http",
|
|
424
|
+
outcome: "failed",
|
|
425
|
+
httpStatus,
|
|
426
|
+
reason: tagged ?? "refresh_failed",
|
|
427
|
+
retryAfterMs,
|
|
428
|
+
});
|
|
438
429
|
const rejectedWithoutFreshnessProof = tagged === "auth_revoked" &&
|
|
439
430
|
credential.hasRefreshToken &&
|
|
440
431
|
(credential.expiresAtMs === null || needsVendorRefresh(credential, observedAt));
|
|
@@ -453,16 +444,11 @@ export async function refreshClaudeOauthUsageQuota(deps = {}, cycle) {
|
|
|
453
444
|
? { retry_after_ms: Math.round(retryAfterMs) }
|
|
454
445
|
: {}),
|
|
455
446
|
});
|
|
456
|
-
//
|
|
457
|
-
//
|
|
458
|
-
// said stop. The unprobed siblings get the HONEST distinct reason —
|
|
459
|
-
// their own state is unknown; a sibling's 429 is never fabricated onto
|
|
460
|
-
// them as rate_limited (INV-093).
|
|
447
|
+
// A 429 establishes only this credential's poll floor. Continue the
|
|
448
|
+
// existing serial sweep for unrelated accounts; identical tokens share it.
|
|
461
449
|
if (tagged === "rate_limited") {
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
}
|
|
465
|
-
break;
|
|
450
|
+
throttledTokens.add(tokenKey);
|
|
451
|
+
cycle?.pacing?.noteRateLimited(subject, observedAt.getTime(), retryAfterMs ?? null);
|
|
466
452
|
}
|
|
467
453
|
}
|
|
468
454
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-oauth-usage.js","sourceRoot":"","sources":["../src/claude-oauth-usage.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"claude-oauth-usage.js","sourceRoot":"","sources":["../src/claude-oauth-usage.ts"],"names":[],"mappings":"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"}
|
package/dist/claudexord.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claudexord.d.ts","sourceRoot":"","sources":["../src/claudexord.ts"],"names":[],"mappings":";AAyEA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"claudexord.d.ts","sourceRoot":"","sources":["../src/claudexord.ts"],"names":[],"mappings":";AAyEA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAuV1C;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
|
package/dist/claudexord.js
CHANGED
|
@@ -68,8 +68,8 @@ export async function main() {
|
|
|
68
68
|
const operatorDecisionStoreSlot = journalManager.registerProjection(operatorDecisionProjection());
|
|
69
69
|
const runEventStoreSlot = journalManager.registerProjection(runEventProjection());
|
|
70
70
|
const projectStoreSlot = journalManager.registerProjection(projectProjection());
|
|
71
|
-
const quotaStoreSlot = journalManager.registerProjection(quotaProjection(quotaRefreshers(), quotaSubjectUniverseFromConfig, undefined,
|
|
72
|
-
// Daemon-private
|
|
71
|
+
const quotaStoreSlot = journalManager.registerProjection(quotaProjection(quotaRefreshers((record) => logLine(logPath(), `quota.observation ${JSON.stringify(record)}`)), quotaSubjectUniverseFromConfig, undefined,
|
|
72
|
+
// Daemon-private subject and legacy vendor floors (never in the journal).
|
|
73
73
|
quotaPacerFileStore(daemonDir())));
|
|
74
74
|
// Sidebar invalidation ping (W12): a GLOBAL-partition emitter every
|
|
75
75
|
// ThreadStore (global + per-project) writes through, so any thread
|