@modelprofile.com/authswitch 2.1.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/.smartconfig.json +34 -0
- package/cli.js +21 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/accounts.d.ts +31 -0
- package/dist_ts/accounts.js +74 -0
- package/dist_ts/classes.accountlist.d.ts +17 -0
- package/dist_ts/classes.accountlist.js +214 -0
- package/dist_ts/classes.claudecodeharness.d.ts +34 -0
- package/dist_ts/classes.claudecodeharness.js +123 -0
- package/dist_ts/classes.claudestatus.d.ts +8 -0
- package/dist_ts/classes.claudestatus.js +139 -0
- package/dist_ts/classes.cli.d.ts +31 -0
- package/dist_ts/classes.cli.js +584 -0
- package/dist_ts/classes.codexauth.d.ts +35 -0
- package/dist_ts/classes.codexauth.js +184 -0
- package/dist_ts/classes.codexdaemon.d.ts +38 -0
- package/dist_ts/classes.codexdaemon.js +122 -0
- package/dist_ts/classes.codexharness.d.ts +35 -0
- package/dist_ts/classes.codexharness.js +199 -0
- package/dist_ts/classes.codexhome.d.ts +25 -0
- package/dist_ts/classes.codexhome.js +60 -0
- package/dist_ts/classes.codexpreuse.d.ts +8 -0
- package/dist_ts/classes.codexpreuse.js +90 -0
- package/dist_ts/classes.codexstatus.d.ts +20 -0
- package/dist_ts/classes.codexstatus.js +304 -0
- package/dist_ts/classes.codexswitcher.d.ts +61 -0
- package/dist_ts/classes.codexswitcher.js +226 -0
- package/dist_ts/classes.credentialstore.d.ts +32 -0
- package/dist_ts/classes.credentialstore.js +115 -0
- package/dist_ts/classes.fileharness.d.ts +47 -0
- package/dist_ts/classes.fileharness.js +119 -0
- package/dist_ts/classes.login.d.ts +42 -0
- package/dist_ts/classes.login.js +102 -0
- package/dist_ts/classes.opencodeharness.d.ts +34 -0
- package/dist_ts/classes.opencodeharness.js +125 -0
- package/dist_ts/classes.operations.d.ts +44 -0
- package/dist_ts/classes.operations.js +97 -0
- package/dist_ts/classes.remotecontrol.d.ts +46 -0
- package/dist_ts/classes.remotecontrol.js +169 -0
- package/dist_ts/classes.service.d.ts +47 -0
- package/dist_ts/classes.service.js +142 -0
- package/dist_ts/classes.stashstore.d.ts +63 -0
- package/dist_ts/classes.stashstore.js +192 -0
- package/dist_ts/classes.tui.d.ts +11 -0
- package/dist_ts/classes.tui.js +195 -0
- package/dist_ts/formatting.d.ts +8 -0
- package/dist_ts/formatting.js +13 -0
- package/dist_ts/helpers.d.ts +39 -0
- package/dist_ts/helpers.js +92 -0
- package/dist_ts/index.d.ts +22 -0
- package/dist_ts/index.js +27 -0
- package/dist_ts/interfaces.d.ts +145 -0
- package/dist_ts/interfaces.harness.d.ts +130 -0
- package/dist_ts/interfaces.harness.js +2 -0
- package/dist_ts/interfaces.js +2 -0
- package/dist_ts/interfaces.list.d.ts +19 -0
- package/dist_ts/interfaces.list.js +2 -0
- package/dist_ts/plugins.d.ts +14 -0
- package/dist_ts/plugins.js +18 -0
- package/dist_ts/preuse.d.ts +6 -0
- package/dist_ts/preuse.js +13 -0
- package/license.md +21 -0
- package/package.json +53 -0
- package/readme.md +502 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/accounts.ts +78 -0
- package/ts/classes.accountlist.ts +211 -0
- package/ts/classes.claudecodeharness.ts +111 -0
- package/ts/classes.claudestatus.ts +99 -0
- package/ts/classes.cli.ts +479 -0
- package/ts/classes.codexauth.ts +199 -0
- package/ts/classes.codexdaemon.ts +137 -0
- package/ts/classes.codexharness.ts +233 -0
- package/ts/classes.codexhome.ts +68 -0
- package/ts/classes.codexpreuse.ts +76 -0
- package/ts/classes.codexstatus.ts +257 -0
- package/ts/classes.codexswitcher.ts +272 -0
- package/ts/classes.credentialstore.ts +101 -0
- package/ts/classes.fileharness.ts +120 -0
- package/ts/classes.login.ts +103 -0
- package/ts/classes.opencodeharness.ts +114 -0
- package/ts/classes.operations.ts +101 -0
- package/ts/classes.remotecontrol.ts +208 -0
- package/ts/classes.service.ts +152 -0
- package/ts/classes.stashstore.ts +223 -0
- package/ts/classes.tui.ts +138 -0
- package/ts/formatting.ts +14 -0
- package/ts/helpers.ts +109 -0
- package/ts/index.ts +28 -0
- package/ts/interfaces.harness.ts +112 -0
- package/ts/interfaces.list.ts +19 -0
- package/ts/interfaces.ts +158 -0
- package/ts/plugins.ts +20 -0
- package/ts/preuse.ts +15 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { FileHarness } from './classes.fileharness.js';
|
|
3
|
+
import { CredentialStore, credentialRecord, credentialText, readCredentialDocument, requireHarnessStopped } from './classes.credentialstore.js';
|
|
4
|
+
import { ClaudeAccountStatus } from './classes.claudestatus.js';
|
|
5
|
+
import { writeSecretFileAtomically } from './helpers.js';
|
|
6
|
+
const accountCaches = ['additionalModelOptionsCache', 'additionalModelOptionsAnsweredAt', 'additionalModelCostsCache', 'modelAccessCache', 'orgModelDefaultCache', 'lastSeenOrgDefaultUpdatedAt', 'clientDataCache', 'clientDataCacheSlots', 'autoCompactWindowsCache', 'cachedUsageUtilization'];
|
|
7
|
+
/** File-backed Claude Code subscriber login and its matching global oauthAccount metadata. */
|
|
8
|
+
export class ClaudeCodeHarness extends FileHarness {
|
|
9
|
+
id = 'claude';
|
|
10
|
+
label = 'Claude Code';
|
|
11
|
+
loginHint = 'Log in using claude auth login, exit Claude Code, then authswitch claude stash --keep.';
|
|
12
|
+
store;
|
|
13
|
+
file;
|
|
14
|
+
configFile;
|
|
15
|
+
env;
|
|
16
|
+
platform;
|
|
17
|
+
status;
|
|
18
|
+
checkStopped;
|
|
19
|
+
settingsFiles;
|
|
20
|
+
constructor(options = {}) {
|
|
21
|
+
super();
|
|
22
|
+
this.env = options.env ?? process.env;
|
|
23
|
+
const custom = options.configDir ?? this.env.CLAUDE_CONFIG_DIR;
|
|
24
|
+
const dir = custom || plugins.path.join(plugins.os.homedir(), '.claude');
|
|
25
|
+
this.file = plugins.path.join(dir, '.credentials.json');
|
|
26
|
+
this.configFile = options.globalConfigFile ?? plugins.path.join(custom || plugins.os.homedir(), '.claude.json');
|
|
27
|
+
this.store = new CredentialStore(this.id, options.stashRoot);
|
|
28
|
+
this.platform = options.platform ?? process.platform;
|
|
29
|
+
this.status = new ClaudeAccountStatus(options.fetch);
|
|
30
|
+
this.checkStopped = options.checkStopped ?? (() => requireHarnessStopped('claude'));
|
|
31
|
+
this.settingsFiles = options.settingsFiles ?? [plugins.path.join(dir, 'settings.json'),
|
|
32
|
+
plugins.path.join(process.cwd(), '.claude/settings.json'), plugins.path.join(process.cwd(), '.claude/settings.local.json')];
|
|
33
|
+
}
|
|
34
|
+
beforeMutation() { this.checkStopped(); }
|
|
35
|
+
inspect(credential, slotId) {
|
|
36
|
+
if (slotId !== 'anthropic')
|
|
37
|
+
throw new Error('Unsupported Claude Code credential slot.');
|
|
38
|
+
const oauth = credentialRecord(credential.claudeAiOauth);
|
|
39
|
+
const account = credentialRecord(credential.oauthAccount);
|
|
40
|
+
if (!credentialText(oauth.accessToken) || !Array.isArray(oauth.scopes) || !oauth.scopes.every(scope => typeof scope === 'string')
|
|
41
|
+
|| !credentialText(account.accountUuid) || !credentialText(account.organizationUuid) || !credentialText(account.emailAddress))
|
|
42
|
+
throw new Error('Claude Code login or its matching account metadata is incomplete. Log in again with Claude Code before saving.');
|
|
43
|
+
return { slotId, identity: JSON.stringify([account.accountUuid, account.organizationUuid]), label: String(account.emailAddress).toLowerCase(), credential };
|
|
44
|
+
}
|
|
45
|
+
snapshot() {
|
|
46
|
+
if (this.platform === 'darwin')
|
|
47
|
+
return { accounts: [], unavailable: 'Claude Code uses the macOS Keychain. This adapter supports file credentials on Linux and Windows; Keychain switching is unavailable.' };
|
|
48
|
+
const overrides = ['CLAUDE_CODE_OAUTH_TOKEN', 'CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR', 'ANTHROPIC_API_KEY', 'ANTHROPIC_AUTH_TOKEN', 'ANTHROPIC_PROFILE', 'CLAUDE_CODE_USE_BEDROCK', 'CLAUDE_CODE_USE_VERTEX', 'CLAUDE_CODE_USE_FOUNDRY', 'ANTHROPIC_BASE_URL'];
|
|
49
|
+
const settings = {};
|
|
50
|
+
const environment = { ...this.env };
|
|
51
|
+
for (const file of this.settingsFiles) {
|
|
52
|
+
const data = readCredentialDocument(file).data;
|
|
53
|
+
Object.assign(settings, data);
|
|
54
|
+
if (data.env != null)
|
|
55
|
+
Object.assign(environment, credentialRecord(data.env));
|
|
56
|
+
}
|
|
57
|
+
if (overrides.some(key => environment[key]) || credentialText(settings.apiKeyHelper))
|
|
58
|
+
return { accounts: [], unavailable: 'Claude Code has a settings or environment credential/provider override. Remove it before managing subscriber file logins.' };
|
|
59
|
+
const data = readCredentialDocument(this.file).data;
|
|
60
|
+
if (data.claudeAiOauth == null)
|
|
61
|
+
return { accounts: [], unavailable: null };
|
|
62
|
+
const config = readCredentialDocument(this.configFile).data;
|
|
63
|
+
try {
|
|
64
|
+
return { accounts: [this.inspect({ claudeAiOauth: data.claudeAiOauth, oauthAccount: config.oauthAccount }, 'anthropic')], unavailable: null };
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return { accounts: [], unavailable: 'Claude Code login or account metadata is incomplete. Log in again with Claude Code; existing files were preserved.' };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
apply(_slotId, previous, target) {
|
|
71
|
+
const original = readCredentialDocument(this.file);
|
|
72
|
+
const config = readCredentialDocument(this.configFile);
|
|
73
|
+
const oldOauth = previous?.credential.claudeAiOauth;
|
|
74
|
+
const oldAccount = previous?.credential.oauthAccount;
|
|
75
|
+
if (JSON.stringify(original.data.claudeAiOauth) !== JSON.stringify(oldOauth)
|
|
76
|
+
|| (previous && JSON.stringify(config.data.oauthAccount) !== JSON.stringify(oldAccount)))
|
|
77
|
+
throw new Error('Claude Code login changed during the operation; no credential was replaced.');
|
|
78
|
+
const next = { ...original.data };
|
|
79
|
+
const nextConfig = { ...config.data };
|
|
80
|
+
if (target) {
|
|
81
|
+
next.claudeAiOauth = target.credential.claudeAiOauth;
|
|
82
|
+
nextConfig.oauthAccount = target.credential.oauthAccount;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
delete next.claudeAiOauth;
|
|
86
|
+
delete nextConfig.oauthAccount;
|
|
87
|
+
}
|
|
88
|
+
for (const key of accountCaches)
|
|
89
|
+
delete nextConfig[key];
|
|
90
|
+
const raw = JSON.stringify(next, null, 2) + '\n';
|
|
91
|
+
const configRaw = JSON.stringify(nextConfig, null, 2) + '\n';
|
|
92
|
+
if (readCredentialDocument(this.file).raw !== original.raw || readCredentialDocument(this.configFile).raw !== config.raw)
|
|
93
|
+
throw new Error('Claude Code files changed during the operation; try again after Claude Code exits.');
|
|
94
|
+
plugins.fs.mkdirSync(plugins.path.dirname(this.file), { recursive: true, mode: 0o700 });
|
|
95
|
+
plugins.fs.mkdirSync(plugins.path.dirname(this.configFile), { recursive: true, mode: 0o700 });
|
|
96
|
+
try {
|
|
97
|
+
writeSecretFileAtomically(this.file, raw);
|
|
98
|
+
if (readCredentialDocument(this.file).raw !== raw || readCredentialDocument(this.configFile).raw !== config.raw)
|
|
99
|
+
throw new Error();
|
|
100
|
+
writeSecretFileAtomically(this.configFile, configRaw);
|
|
101
|
+
if (readCredentialDocument(this.configFile).raw !== configRaw)
|
|
102
|
+
throw new Error();
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Roll back only our own writes; a concurrent writer's data must never be overwritten.
|
|
106
|
+
try {
|
|
107
|
+
if (readCredentialDocument(this.file).raw === raw)
|
|
108
|
+
writeSecretFileAtomically(this.file, original.raw ?? '{}\n');
|
|
109
|
+
if (readCredentialDocument(this.configFile).raw === configRaw)
|
|
110
|
+
writeSecretFileAtomically(this.configFile, config.raw ?? '{}\n');
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
throw new Error('Claude Code switch and rollback were incomplete. Keep Claude Code stopped and restore a verified saved account.');
|
|
114
|
+
}
|
|
115
|
+
throw new Error('Claude Code switch failed while updating account metadata. The outgoing login remains saved; check doctor before restarting.');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async readAccountStatus(id) {
|
|
119
|
+
const account = this.readCredential(id);
|
|
120
|
+
return this.status.read(credentialRecord(account.credential.claudeAiOauth), credentialRecord(account.credential.oauthAccount));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jbGF1ZGVjb2RlaGFybmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuY2xhdWRlY29kZWhhcm5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBZ0QsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hKLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQWV6RCxNQUFNLGFBQWEsR0FBRyxDQUFDLDZCQUE2QixFQUFFLGtDQUFrQyxFQUFFLDJCQUEyQixFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixFQUFFLDZCQUE2QixFQUFFLGlCQUFpQixFQUFFLHNCQUFzQixFQUFFLHlCQUF5QixFQUFFLHdCQUF3QixDQUFDLENBQUM7QUFFbFMsOEZBQThGO0FBQzlGLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxXQUFXO0lBQ2hDLEVBQUUsR0FBRyxRQUFRLENBQUM7SUFDZCxLQUFLLEdBQUcsYUFBYSxDQUFDO0lBQ3RCLFNBQVMsR0FBRyx3RkFBd0YsQ0FBQztJQUNsRyxLQUFLLENBQWtCO0lBQ3pCLElBQUksQ0FBUztJQUNiLFVBQVUsQ0FBUztJQUNuQixHQUFHLENBQW9CO0lBQ3ZCLFFBQVEsQ0FBa0I7SUFDMUIsTUFBTSxDQUFzQjtJQUM1QixZQUFZLENBQWE7SUFDekIsYUFBYSxDQUFXO0lBRXpDLFlBQVksVUFBcUMsRUFBRTtRQUNqRCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMs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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IHarnessAccountStatus } from './interfaces.harness.js';
|
|
2
|
+
/** Read-only Claude Code OAuth account endpoints. No refresh, inference, or browser session is used. */
|
|
3
|
+
export declare class ClaudeAccountStatus {
|
|
4
|
+
private readonly fetcher;
|
|
5
|
+
constructor(fetcher?: typeof fetch);
|
|
6
|
+
private get;
|
|
7
|
+
read(oauth: Record<string, unknown>, account: Record<string, unknown>): Promise<IHarnessAccountStatus>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { credentialRecord, credentialText } from './classes.credentialstore.js';
|
|
2
|
+
class ClaudeStatusError extends Error {
|
|
3
|
+
}
|
|
4
|
+
/** Read-only Claude Code OAuth account endpoints. No refresh, inference, or browser session is used. */
|
|
5
|
+
export class ClaudeAccountStatus {
|
|
6
|
+
fetcher;
|
|
7
|
+
constructor(fetcher = globalThis.fetch) {
|
|
8
|
+
this.fetcher = fetcher;
|
|
9
|
+
}
|
|
10
|
+
async get(route, accessToken) {
|
|
11
|
+
const signal = AbortSignal.timeout(10_000);
|
|
12
|
+
try {
|
|
13
|
+
const response = await this.fetcher(`https://api.anthropic.com/api/oauth/${route}`, {
|
|
14
|
+
method: 'GET', redirect: 'error', signal,
|
|
15
|
+
headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json',
|
|
16
|
+
...(route === 'usage' ? { 'anthropic-beta': 'oauth-2025-04-20' } : { 'Cache-Control': 'no-cache' }) },
|
|
17
|
+
});
|
|
18
|
+
if (!response.ok) {
|
|
19
|
+
await response.body?.cancel();
|
|
20
|
+
throw new ClaudeStatusError(response.status === 401 ? 'Login expired or was rejected. Log in again with Claude Code and save it.' : `Claude account service returned HTTP ${response.status}.`);
|
|
21
|
+
}
|
|
22
|
+
const reader = response.body?.getReader();
|
|
23
|
+
if (!reader)
|
|
24
|
+
throw new ClaudeStatusError('The Claude account service returned an empty response.');
|
|
25
|
+
const chunks = [];
|
|
26
|
+
let size = 0;
|
|
27
|
+
try {
|
|
28
|
+
while (true) {
|
|
29
|
+
const part = await reader.read();
|
|
30
|
+
if (part.done)
|
|
31
|
+
break;
|
|
32
|
+
size += part.value.byteLength;
|
|
33
|
+
if (size > 1024 * 1024) {
|
|
34
|
+
await reader.cancel();
|
|
35
|
+
throw new ClaudeStatusError('The Claude account response is too large.');
|
|
36
|
+
}
|
|
37
|
+
chunks.push(part.value);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
reader.releaseLock();
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
return credentialRecord(JSON.parse(Buffer.concat(chunks).toString('utf8')));
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
throw new ClaudeStatusError('The Claude account service returned invalid data.');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (signal.aborted)
|
|
52
|
+
throw new ClaudeStatusError('The Claude account request timed out.');
|
|
53
|
+
if (error instanceof ClaudeStatusError)
|
|
54
|
+
throw error;
|
|
55
|
+
throw new ClaudeStatusError('The Claude account service could not be reached.');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async read(oauth, account) {
|
|
59
|
+
const result = { facts: [], problems: [] };
|
|
60
|
+
const storedPlan = credentialText(oauth.subscriptionType);
|
|
61
|
+
if (storedPlan)
|
|
62
|
+
result.summary = { subscription: { plan: storedPlan, source: 'stored' } };
|
|
63
|
+
if (!Array.isArray(oauth.scopes) || !oauth.scopes.includes('user:profile')) {
|
|
64
|
+
result.facts.push({ section: 'Availability', label: 'Live account status', value: 'This login lacks the user:profile scope. Log in through Claude Code to obtain subscriber status.' });
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
const token = credentialText(oauth.accessToken);
|
|
68
|
+
if (!token)
|
|
69
|
+
return { facts: [], problems: ['No usable Claude Code access token is available.'] };
|
|
70
|
+
const [profile, usage] = await Promise.allSettled([this.get('profile', token), this.get('usage', token)]);
|
|
71
|
+
if (profile.status === 'fulfilled') {
|
|
72
|
+
try {
|
|
73
|
+
const user = credentialRecord(profile.value.account);
|
|
74
|
+
const organization = credentialRecord(profile.value.organization);
|
|
75
|
+
if (user.uuid !== account.accountUuid || organization.uuid !== account.organizationUuid)
|
|
76
|
+
return { facts: [], problems: ['Claude returned a different account or organization; no account data was displayed.'] };
|
|
77
|
+
const plan = credentialText(organization.organization_type)?.replace(/^claude_/, '');
|
|
78
|
+
if (plan)
|
|
79
|
+
result.summary = { ...result.summary, subscription: { plan, source: 'live' } };
|
|
80
|
+
for (const [label, value] of [['Email', user.email], ['Organization', organization.name], ['Billing type', organization.billing_type], ['Seat tier', organization.seat_tier]]) {
|
|
81
|
+
if (credentialText(value))
|
|
82
|
+
result.facts.push({ section: 'Account', label: String(label), value: String(value) });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
result.problems.push('Claude profile response is unsupported; no profile values were inferred.');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else
|
|
90
|
+
result.problems.push(`Profile: ${profile.reason instanceof ClaudeStatusError ? profile.reason.message : 'Lookup failed.'}`);
|
|
91
|
+
if (usage.status === 'fulfilled') {
|
|
92
|
+
try {
|
|
93
|
+
const windows = [];
|
|
94
|
+
for (const [key, label, durationSeconds, scope] of [
|
|
95
|
+
['five_hour', 'Claude five-hour', 18000, 'account'], ['seven_day', 'Claude weekly', 604800, 'account'],
|
|
96
|
+
['seven_day_oauth_apps', 'OAuth apps weekly', 604800, 'feature'], ['seven_day_opus', 'Opus weekly', 604800, 'feature'], ['seven_day_sonnet', 'Sonnet weekly', 604800, 'feature'],
|
|
97
|
+
]) {
|
|
98
|
+
if (usage.value[key] == null)
|
|
99
|
+
continue;
|
|
100
|
+
const window = credentialRecord(usage.value[key]);
|
|
101
|
+
if (window.utilization == null)
|
|
102
|
+
continue;
|
|
103
|
+
if (typeof window.utilization !== 'number' || !Number.isFinite(window.utilization) || window.utilization < 0)
|
|
104
|
+
throw new Error();
|
|
105
|
+
const resetAt = window.resets_at == null ? null : new Date(String(window.resets_at)).toISOString();
|
|
106
|
+
windows.push({ label, durationSeconds, scope, usedPercent: window.utilization, resetAt });
|
|
107
|
+
}
|
|
108
|
+
result.summary = { ...result.summary, usageWindows: windows };
|
|
109
|
+
for (const window of windows)
|
|
110
|
+
result.facts.push({ section: 'Usage', summaryKey: 'usageWindows', label: window.label, value: `${window.usedPercent}% used; ${window.resetAt ? 'resets ' + window.resetAt : 'reset not scheduled'}` });
|
|
111
|
+
if (usage.value.extra_usage != null) {
|
|
112
|
+
const extra = credentialRecord(usage.value.extra_usage);
|
|
113
|
+
if (typeof extra.is_enabled === 'boolean')
|
|
114
|
+
result.facts.push({ section: 'Extra usage', label: 'Enabled', value: extra.is_enabled ? 'yes' : 'no' });
|
|
115
|
+
const currency = credentialText(extra.currency);
|
|
116
|
+
const amount = (value) => typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;
|
|
117
|
+
const limit = amount(extra.monthly_limit);
|
|
118
|
+
const used = amount(extra.used_credits);
|
|
119
|
+
for (const [label, value] of [['Monthly limit', limit], ['Spent', used]]) {
|
|
120
|
+
if (value !== undefined)
|
|
121
|
+
result.facts.push({ section: 'Extra usage', label, value: currency ? `${(value / 100).toFixed(2)} ${currency}` : `${value} currency minor units (currency not reported)` });
|
|
122
|
+
}
|
|
123
|
+
if (limit !== undefined && limit > 0 && used !== undefined)
|
|
124
|
+
result.facts.push({ section: 'Extra usage', label: 'Monthly budget used', value: `${Math.round(used / limit * 10000) / 100}%` });
|
|
125
|
+
}
|
|
126
|
+
if (Array.isArray(usage.value.limits) && usage.value.limits.length)
|
|
127
|
+
result.facts.push({ section: 'Availability', label: 'Additional limits', value: 'The service also returned limits without a supported reset-window contract.' });
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
result.problems.push('Claude usage response is unsupported; missing values were not inferred.');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else
|
|
134
|
+
result.problems.push(`Usage: ${usage.reason instanceof ClaudeStatusError ? usage.reason.message : 'Lookup failed.'}`);
|
|
135
|
+
result.facts.push({ section: 'Availability', label: 'Billing dates and earned resets', value: 'Renewal dates, cancellation dates and earned reset credits are not exposed by these Claude Code endpoints.' });
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jbGF1ZGVzdGF0dXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmNsYXVkZXN0YXR1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHaEYsTUFBTSxpQkFBa0IsU0FBUSxLQUFLO0NBQUc7QUFFeEMsd0dBQXdHO0FBQ3hHLE1BQU0sT0FBTyxtQkFBbUI7SUFDRDtJQUE3QixZQUE2QixVQUF3QixVQUFVLENBQUMsS0FBSztRQUF4QyxZQUFPLEdBQVAsT0FBTyxDQUFpQztJQUFHLENBQUM7SUFDakUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUEwQixFQUFFLFdBQW1CO1FBQy9ELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxLQUFLLEVBQUUsRUFBRTtnQkFDbEYsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU07Z0JBQ3hDLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLFdBQVcsRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0I7b0JBQ25GLEdBQUcsQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUU7YUFDeEcsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUM5QixNQUFNLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1B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
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type TAuthSwitchCoordinator } from './classes.operations.js';
|
|
2
|
+
import type { CodexSwitcher } from './classes.codexswitcher.js';
|
|
3
|
+
import type { IAuthHarness } from './interfaces.harness.js';
|
|
4
|
+
/** Harness-independent command routing and interactive account management. */
|
|
5
|
+
export declare class AuthSwitchCli {
|
|
6
|
+
private readonly harnesses;
|
|
7
|
+
private console?;
|
|
8
|
+
private running;
|
|
9
|
+
private readonly operations;
|
|
10
|
+
private get out();
|
|
11
|
+
constructor(harnessesArg?: IAuthHarness[] | CodexSwitcher, coordinatorArg?: TAuthSwitchCoordinator);
|
|
12
|
+
private usage;
|
|
13
|
+
run(argvArg: string[]): Promise<number>;
|
|
14
|
+
private runTui;
|
|
15
|
+
private mutate;
|
|
16
|
+
private commandLogin;
|
|
17
|
+
private commandPreuse;
|
|
18
|
+
private selectHarness;
|
|
19
|
+
private runInteractive;
|
|
20
|
+
/** Offer a verified save before presenting the switch picker; declining never switches. */
|
|
21
|
+
private offerToSave;
|
|
22
|
+
private runHarnessGuide;
|
|
23
|
+
private printCurrent;
|
|
24
|
+
private selectActive;
|
|
25
|
+
private reportOutcome;
|
|
26
|
+
private commandList;
|
|
27
|
+
private printAccount;
|
|
28
|
+
private resolveAccount;
|
|
29
|
+
private commandUse;
|
|
30
|
+
private promptForAccount;
|
|
31
|
+
}
|