@modelprofile.com/authswitch 3.3.0 → 5.0.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_ts/00_commitinfo_data.js +3 -3
- package/dist_ts/accounts.d.ts +52 -15
- package/dist_ts/accounts.js +110 -27
- package/dist_ts/classes.accountlist.d.ts +0 -25
- package/dist_ts/classes.accountlist.js +2 -216
- package/dist_ts/classes.claudecodeharness.d.ts +81 -2
- package/dist_ts/classes.claudecodeharness.js +208 -14
- package/dist_ts/classes.claudecodelocks.d.ts +38 -0
- package/dist_ts/classes.claudecodelocks.js +118 -0
- package/dist_ts/classes.claudestatus.d.ts +15 -2
- package/dist_ts/classes.claudestatus.js +100 -83
- package/dist_ts/classes.claudetokenrefresh.d.ts +32 -0
- package/dist_ts/classes.claudetokenrefresh.js +77 -0
- package/dist_ts/classes.cli.d.ts +14 -7
- package/dist_ts/classes.cli.js +126 -66
- package/dist_ts/classes.codexharness.d.ts +4 -0
- package/dist_ts/classes.codexharness.js +5 -1
- package/dist_ts/classes.codexstatus.d.ts +7 -2
- package/dist_ts/classes.codexstatus.js +49 -21
- package/dist_ts/classes.credentialstore.d.ts +43 -2
- package/dist_ts/classes.credentialstore.js +60 -13
- package/dist_ts/classes.fileharness.d.ts +45 -21
- package/dist_ts/classes.fileharness.js +64 -26
- package/dist_ts/classes.limits.d.ts +46 -7
- package/dist_ts/classes.limits.js +94 -36
- package/dist_ts/classes.listrenderer.d.ts +17 -0
- package/dist_ts/classes.listrenderer.js +313 -0
- package/dist_ts/classes.login.d.ts +1 -1
- package/dist_ts/classes.login.js +1 -1
- package/dist_ts/classes.opencodeharness.d.ts +4 -0
- package/dist_ts/classes.opencodeharness.js +8 -4
- package/dist_ts/classes.operations.js +3 -2
- package/dist_ts/classes.tui.js +4 -3
- package/dist_ts/classes.watch.d.ts +108 -0
- package/dist_ts/classes.watch.js +219 -0
- package/dist_ts/classes.watchlock.d.ts +33 -0
- package/dist_ts/classes.watchlock.js +118 -0
- package/dist_ts/claudehttp.d.ts +39 -0
- package/dist_ts/claudehttp.js +83 -0
- package/dist_ts/cliargs.d.ts +36 -0
- package/dist_ts/cliargs.js +60 -0
- package/dist_ts/consoletable.d.ts +21 -0
- package/dist_ts/consoletable.js +63 -0
- package/dist_ts/helpers.d.ts +7 -0
- package/dist_ts/helpers.js +16 -1
- package/dist_ts/index.d.ts +3 -0
- package/dist_ts/index.js +4 -1
- package/dist_ts/interfaces.harness.d.ts +60 -11
- package/dist_ts/interfaces.list.d.ts +3 -1
- package/dist_ts/plugins.d.ts +7 -0
- package/dist_ts/plugins.js +6 -1
- package/dist_ts/ratelimit.d.ts +8 -0
- package/dist_ts/ratelimit.js +13 -0
- package/dist_ts/watchpolicy.d.ts +44 -0
- package/dist_ts/watchpolicy.js +82 -0
- package/package.json +5 -3
- package/readme.md +349 -115
- package/ts/00_commitinfo_data.ts +3 -3
- package/ts/accounts.ts +122 -35
- package/ts/classes.accountlist.ts +2 -219
- package/ts/classes.claudecodeharness.ts +199 -13
- package/ts/classes.claudecodelocks.ts +133 -0
- package/ts/classes.claudestatus.ts +100 -65
- package/ts/classes.claudetokenrefresh.ts +85 -0
- package/ts/classes.cli.ts +114 -54
- package/ts/classes.codexharness.ts +4 -0
- package/ts/classes.codexstatus.ts +40 -18
- package/ts/classes.credentialstore.ts +78 -10
- package/ts/classes.fileharness.ts +76 -34
- package/ts/classes.limits.ts +110 -36
- package/ts/classes.listrenderer.ts +328 -0
- package/ts/classes.login.ts +1 -1
- package/ts/classes.opencodeharness.ts +7 -3
- package/ts/classes.operations.ts +2 -1
- package/ts/classes.tui.ts +3 -2
- package/ts/classes.watch.ts +263 -0
- package/ts/classes.watchlock.ts +100 -0
- package/ts/claudehttp.ts +92 -0
- package/ts/cliargs.ts +71 -0
- package/ts/consoletable.ts +62 -0
- package/ts/helpers.ts +14 -0
- package/ts/index.ts +3 -0
- package/ts/interfaces.harness.ts +60 -5
- package/ts/interfaces.list.ts +3 -1
- package/ts/plugins.ts +9 -0
- package/ts/ratelimit.ts +14 -0
- package/ts/watchpolicy.ts +121 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { credentialRecord, credentialText } from './classes.credentialstore.js';
|
|
1
|
+
import { credentialHash, credentialRecord, credentialText } from './classes.credentialstore.js';
|
|
2
|
+
import { claudeRequest, ClaudeLoginRejectedError, ClaudeRateLimitError, ClaudeRequestError } from './claudehttp.js';
|
|
3
|
+
import { latestRetryAt } from './ratelimit.js';
|
|
2
4
|
import { plainText } from './formatting.js';
|
|
3
|
-
|
|
4
|
-
}
|
|
5
|
+
import { usageWindowPeriod } from './accounts.js';
|
|
5
6
|
/** Reset times are normalised to ISO 8601 UTC; an unparsable one rejects the whole usage response. */
|
|
6
7
|
const resetTimestamp = (value) => value == null ? null : new Date(String(value)).toISOString();
|
|
7
8
|
const SERVER_NAME_LENGTH = 64;
|
|
@@ -12,14 +13,14 @@ const serverName = (value) => {
|
|
|
12
13
|
throw new Error('Unsupported Claude usage name.');
|
|
13
14
|
return name;
|
|
14
15
|
};
|
|
15
|
-
/** Keyed windows, read only from a usage body that carries no limits[] rows. */
|
|
16
|
+
/** Keyed windows, read only from a usage body that carries no limits[] rows: what each meter is about, and how long its window is. */
|
|
16
17
|
const KEYED_WINDOWS = [
|
|
17
|
-
['five_hour', 'Claude
|
|
18
|
-
['seven_day_oauth_apps', 'OAuth apps
|
|
18
|
+
['five_hour', 'Claude', 18000, 'account'], ['seven_day', 'Claude', 604800, 'account'],
|
|
19
|
+
['seven_day_oauth_apps', 'OAuth apps', 604800, 'feature'], ['seven_day_opus', 'Opus', 604800, 'feature'], ['seven_day_sonnet', 'Sonnet', 604800, 'feature'],
|
|
19
20
|
];
|
|
20
21
|
const keyedWindows = (usage) => {
|
|
21
22
|
const windows = [];
|
|
22
|
-
for (const [key,
|
|
23
|
+
for (const [key, subject, durationSeconds, scope] of KEYED_WINDOWS) {
|
|
23
24
|
if (usage[key] == null)
|
|
24
25
|
continue;
|
|
25
26
|
const window = credentialRecord(usage[key]);
|
|
@@ -27,17 +28,17 @@ const keyedWindows = (usage) => {
|
|
|
27
28
|
continue;
|
|
28
29
|
if (typeof window.utilization !== 'number' || !Number.isFinite(window.utilization) || window.utilization < 0)
|
|
29
30
|
throw new Error('Unsupported Claude usage utilization.');
|
|
30
|
-
windows.push({ label
|
|
31
|
+
windows.push({ label: `${subject} ${usageWindowPeriod(durationSeconds)}`, durationSeconds, scope, usedPercent: window.utilization, resetAt: resetTimestamp(window.resets_at) });
|
|
31
32
|
}
|
|
32
33
|
return windows;
|
|
33
34
|
};
|
|
34
35
|
/**
|
|
35
|
-
* The limits[] row groups the window model represents: each group's duration,
|
|
36
|
-
*
|
|
36
|
+
* The limits[] row groups the window model represents: each group's duration, which names its windows,
|
|
37
|
+
* and the kind of the group's unscoped account meter, which keeps the plain label.
|
|
37
38
|
*/
|
|
38
39
|
const LIMIT_GROUPS = new Map([
|
|
39
|
-
['session', { durationSeconds: 18000,
|
|
40
|
-
['weekly', { durationSeconds: 604800,
|
|
40
|
+
['session', { durationSeconds: 18000, accountKind: 'session' }],
|
|
41
|
+
['weekly', { durationSeconds: 604800, accountKind: 'weekly_all' }],
|
|
41
42
|
]);
|
|
42
43
|
const isUsageSeverity = (value) => value === 'normal' || value === 'warning' || value === 'critical';
|
|
43
44
|
/** A scope part is absent (null or omitted) or names the model or surface a row is for. */
|
|
@@ -72,8 +73,9 @@ const limitWindows = (rows) => {
|
|
|
72
73
|
continue;
|
|
73
74
|
}
|
|
74
75
|
const severity = row.severity;
|
|
76
|
+
const period = usageWindowPeriod(meter.durationSeconds);
|
|
75
77
|
windows.push({
|
|
76
|
-
label: subject === undefined ? `Claude ${
|
|
78
|
+
label: subject === undefined ? `Claude ${period}${kind === meter.accountKind ? '' : ` (${kindName})`}` : `${subject} ${period}`,
|
|
77
79
|
durationSeconds: meter.durationSeconds, scope: subject === undefined ? 'account' : 'feature', usedPercent, resetAt,
|
|
78
80
|
...(isUsageSeverity(severity) ? { severity } : {}),
|
|
79
81
|
...(row.is_active === true ? { headline: true } : {}),
|
|
@@ -91,66 +93,82 @@ const claudeUsageWindows = (usage) => {
|
|
|
91
93
|
throw new Error('Unsupported Claude usage limits.');
|
|
92
94
|
return Array.isArray(limits) && limits.length ? limitWindows(limits) : { windows: keyedWindows(usage), unsupported: [] };
|
|
93
95
|
};
|
|
94
|
-
/**
|
|
96
|
+
/**
|
|
97
|
+
* How long a session reuses an account's profile. The watch polls every few minutes, and the profile (plan,
|
|
98
|
+
* organization, billing type) changes far more rarely, so it is read at most hourly there.
|
|
99
|
+
*/
|
|
100
|
+
const PROFILE_REUSE_MS = 3_600_000;
|
|
101
|
+
const REQUEST_TIMEOUT_MS = 10_000;
|
|
102
|
+
const MISMATCH = 'Claude returned a different account or organization; no account data was displayed.';
|
|
103
|
+
/**
|
|
104
|
+
* Claude Code's read-only OAuth account endpoints: the profile and usage of one login, with the access token it
|
|
105
|
+
* carries. It never refreshes that token; `ClaudeCodeHarness` refreshes a saved login first, and leaves the active
|
|
106
|
+
* login's tokens to Claude Code. No inference or browser session is used.
|
|
107
|
+
*/
|
|
95
108
|
export class ClaudeAccountStatus {
|
|
96
109
|
fetcher;
|
|
97
|
-
|
|
110
|
+
now;
|
|
111
|
+
constructor(fetcher = globalThis.fetch, now = Date.now) {
|
|
98
112
|
this.fetcher = fetcher;
|
|
113
|
+
this.now = now;
|
|
114
|
+
}
|
|
115
|
+
async get(route, accessToken, signal) {
|
|
116
|
+
const { status, body } = await claudeRequest(this.fetcher, {
|
|
117
|
+
url: `https://api.anthropic.com/api/oauth/${route}`, method: 'GET', subject: 'Claude account', timeoutMs: REQUEST_TIMEOUT_MS, signal, now: this.now,
|
|
118
|
+
headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json',
|
|
119
|
+
...(route === 'usage' ? { 'anthropic-beta': 'oauth-2025-04-20' } : { 'Cache-Control': 'no-cache' }) },
|
|
120
|
+
});
|
|
121
|
+
if (status === 401)
|
|
122
|
+
throw new ClaudeLoginRejectedError();
|
|
123
|
+
if (status < 200 || status > 299)
|
|
124
|
+
throw new ClaudeRequestError(`Claude account service returned HTTP ${status}.`);
|
|
125
|
+
if (body === null)
|
|
126
|
+
throw new ClaudeRequestError('The Claude account service returned invalid data.');
|
|
127
|
+
return body;
|
|
99
128
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const
|
|
129
|
+
/** The profile, from the session while it is younger than an hour; the session key is a hash of the token, never the token. */
|
|
130
|
+
profile(token, account, optionsArg) {
|
|
131
|
+
const lookup = () => this.lookupProfile(token, account, optionsArg.signal);
|
|
132
|
+
return optionsArg.session ? optionsArg.session.reuse(`claude:profile:${credentialHash(token)}`, PROFILE_REUSE_MS, lookup) : lookup();
|
|
133
|
+
}
|
|
134
|
+
/** A rejected login and an unsupported or foreign profile are answers; a rate limit or a failed request is thrown. */
|
|
135
|
+
async lookupProfile(token, account, signal) {
|
|
136
|
+
let body;
|
|
103
137
|
try {
|
|
104
|
-
|
|
105
|
-
method: 'GET', redirect: 'error', signal,
|
|
106
|
-
headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json',
|
|
107
|
-
...(route === 'usage' ? { 'anthropic-beta': 'oauth-2025-04-20' } : { 'Cache-Control': 'no-cache' }) },
|
|
108
|
-
});
|
|
109
|
-
if (!response.ok) {
|
|
110
|
-
await response.body?.cancel();
|
|
111
|
-
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}.`);
|
|
112
|
-
}
|
|
113
|
-
const reader = response.body?.getReader();
|
|
114
|
-
if (!reader)
|
|
115
|
-
throw new ClaudeStatusError('The Claude account service returned an empty response.');
|
|
116
|
-
const chunks = [];
|
|
117
|
-
let size = 0;
|
|
118
|
-
try {
|
|
119
|
-
while (true) {
|
|
120
|
-
const part = await reader.read();
|
|
121
|
-
if (part.done)
|
|
122
|
-
break;
|
|
123
|
-
size += part.value.byteLength;
|
|
124
|
-
if (size > 1024 * 1024) {
|
|
125
|
-
await reader.cancel();
|
|
126
|
-
throw new ClaudeStatusError('The Claude account response is too large.');
|
|
127
|
-
}
|
|
128
|
-
chunks.push(part.value);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
finally {
|
|
132
|
-
reader.releaseLock();
|
|
133
|
-
}
|
|
134
|
-
try {
|
|
135
|
-
return credentialRecord(JSON.parse(Buffer.concat(chunks).toString('utf8')));
|
|
136
|
-
}
|
|
137
|
-
catch {
|
|
138
|
-
throw new ClaudeStatusError('The Claude account service returned invalid data.');
|
|
139
|
-
}
|
|
138
|
+
body = await this.get('profile', token, signal);
|
|
140
139
|
}
|
|
141
140
|
catch (error) {
|
|
142
|
-
if (
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
141
|
+
if (error instanceof ClaudeLoginRejectedError)
|
|
142
|
+
return { kind: 'unavailable', problem: `Profile: ${error.message}` };
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
const user = credentialRecord(body.account);
|
|
147
|
+
const organization = credentialRecord(body.organization);
|
|
148
|
+
if (user.uuid !== account.accountUuid || organization.uuid !== account.organizationUuid)
|
|
149
|
+
return { kind: 'mismatch' };
|
|
150
|
+
const facts = [];
|
|
151
|
+
for (const [label, value] of [['Email', user.email], ['Organization', organization.name], ['Billing type', organization.billing_type], ['Seat tier', organization.seat_tier]]) {
|
|
152
|
+
if (credentialText(value))
|
|
153
|
+
facts.push({ section: 'Account', label: String(label), value: String(value) });
|
|
154
|
+
}
|
|
155
|
+
return { kind: 'found', plan: credentialText(organization.organization_type)?.replace(/^claude_/, ''), facts };
|
|
147
156
|
}
|
|
157
|
+
catch {
|
|
158
|
+
return { kind: 'unavailable', problem: 'Claude profile response is unsupported; no profile values were inferred.' };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/** The plan the login was saved with, the only one known while the service cannot be asked. */
|
|
162
|
+
storedSummary(oauth) {
|
|
163
|
+
const plan = credentialText(oauth.subscriptionType);
|
|
164
|
+
return plan ? { summary: { subscription: { plan, source: 'stored' } } } : {};
|
|
165
|
+
}
|
|
166
|
+
/** A login that could not be made usable for a lookup: its stored plan and why, with the service's retry time for a rate limit. */
|
|
167
|
+
unavailable(oauth, problem, rateLimit) {
|
|
168
|
+
return { facts: [], problems: [problem], ...this.storedSummary(oauth), ...(rateLimit ? { rateLimit } : {}) };
|
|
148
169
|
}
|
|
149
170
|
async read(oauth, account, optionsArg = {}) {
|
|
150
|
-
const result = { facts: [], problems: [] };
|
|
151
|
-
const storedPlan = credentialText(oauth.subscriptionType);
|
|
152
|
-
if (storedPlan)
|
|
153
|
-
result.summary = { subscription: { plan: storedPlan, source: 'stored' } };
|
|
171
|
+
const result = { facts: [], problems: [], ...this.storedSummary(oauth) };
|
|
154
172
|
if (!Array.isArray(oauth.scopes) || !oauth.scopes.includes('user:profile')) {
|
|
155
173
|
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.' });
|
|
156
174
|
return result;
|
|
@@ -158,27 +176,22 @@ export class ClaudeAccountStatus {
|
|
|
158
176
|
const token = credentialText(oauth.accessToken);
|
|
159
177
|
if (!token)
|
|
160
178
|
return { facts: [], problems: ['No usable Claude Code access token is available.'] };
|
|
161
|
-
const [profile, usage] = await Promise.allSettled([this.
|
|
179
|
+
const [profile, usage] = await Promise.allSettled([this.profile(token, account, optionsArg), this.get('usage', token, optionsArg.signal)]);
|
|
180
|
+
const failure = (reason) => reason instanceof ClaudeRequestError ? reason.message : 'Lookup failed.';
|
|
162
181
|
if (profile.status === 'fulfilled') {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
if (plan)
|
|
170
|
-
result.summary = { ...result.summary, subscription: { plan, source: 'live' } };
|
|
171
|
-
|
|
172
|
-
if (credentialText(value))
|
|
173
|
-
result.facts.push({ section: 'Account', label: String(label), value: String(value) });
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
catch {
|
|
177
|
-
result.problems.push('Claude profile response is unsupported; no profile values were inferred.');
|
|
182
|
+
const found = profile.value;
|
|
183
|
+
if (found.kind === 'mismatch')
|
|
184
|
+
return { facts: [], problems: [MISMATCH] };
|
|
185
|
+
if (found.kind === 'unavailable')
|
|
186
|
+
result.problems.push(found.problem);
|
|
187
|
+
else {
|
|
188
|
+
if (found.plan)
|
|
189
|
+
result.summary = { ...result.summary, subscription: { plan: found.plan, source: 'live' } };
|
|
190
|
+
result.facts.push(...found.facts.map(fact => ({ ...fact })));
|
|
178
191
|
}
|
|
179
192
|
}
|
|
180
193
|
else
|
|
181
|
-
result.problems.push(`Profile: ${profile.reason
|
|
194
|
+
result.problems.push(`Profile: ${failure(profile.reason)}`);
|
|
182
195
|
if (usage.status === 'fulfilled') {
|
|
183
196
|
try {
|
|
184
197
|
const { windows, unsupported } = claudeUsageWindows(usage.value);
|
|
@@ -208,9 +221,13 @@ export class ClaudeAccountStatus {
|
|
|
208
221
|
}
|
|
209
222
|
}
|
|
210
223
|
else
|
|
211
|
-
result.problems.push(`Usage: ${usage.reason
|
|
212
|
-
|
|
224
|
+
result.problems.push(`Usage: ${failure(usage.reason)}`);
|
|
225
|
+
const limited = [profile, usage].flatMap(item => item.status === 'rejected' && item.reason instanceof ClaudeRateLimitError ? [item.reason] : []);
|
|
226
|
+
if (limited.length)
|
|
227
|
+
result.rateLimit = { retryAt: latestRetryAt(limited.map(error => error.retryAt)) };
|
|
228
|
+
// The missing renewal dates are the harness's `renewalUnavailableReason`, stated once by the views that show them.
|
|
229
|
+
result.facts.push({ section: 'Availability', label: 'Earned resets', value: 'authswitch does not read earned reset credits for Claude Code logins.' });
|
|
213
230
|
return result;
|
|
214
231
|
}
|
|
215
232
|
}
|
|
216
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jbGF1ZGVzdGF0dXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmNsYXVkZXN0YXR1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzVDLE1BQU0saUJBQWtCLFNBQVEsS0FBSztDQUFHO0FBUXhDLHNHQUFzRztBQUN0RyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWMsRUFBaUIsRUFBRSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7QUFFdkgsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFFOUIsaUhBQWlIO0FBQ2pILE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBYyxFQUFVLEVBQUU7SUFDNUMsTUFBTSxJQUFJLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsSSxJQUFJLENBQUMsSUFBSTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUM3RCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVGLGdGQUFnRjtBQUNoRixNQUFNLGFBQWEsR0FBRztJQUNwQixDQUFDLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxL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
|
|
233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jbGF1ZGVzdGF0dXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmNsYXVkZXN0YXR1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hHLE9BQU8sRUFBRSxhQUFhLEVBQUUsd0JBQXdCLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVNsRCxzR0FBc0c7QUFDdEcsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFjLEVBQWlCLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBRXZILE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBRTlCLGlIQUFpSDtBQUNqSCxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQWMsRUFBVSxFQUFFO0lBQzVDLE1BQU0sSUFBSSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEksSUFBSSxDQUFDLElBQUk7UUFB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
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Claude Code 2.1.273's public OAuth client (`CLIENT_ID`, @12733057), used when a login does not name its own. */
|
|
2
|
+
export declare const CLAUDE_CODE_CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
|
|
3
|
+
/** The token fields a refresh replaces in a stored `claudeAiOauth`; every other field is kept. */
|
|
4
|
+
export interface IClaudeTokens {
|
|
5
|
+
accessToken: string;
|
|
6
|
+
refreshToken: string;
|
|
7
|
+
/** Milliseconds since the epoch, as Claude Code stores them. */
|
|
8
|
+
expiresAt: number;
|
|
9
|
+
refreshTokenExpiresAt?: number;
|
|
10
|
+
scopes?: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Refreshes a saved Claude Code login with the refresh-token grant Claude Code 2.1.273 uses (`RQ`, @15355055).
|
|
14
|
+
*
|
|
15
|
+
* It only talks to the token endpoint; which login is refreshed, and how the result is stored, belongs to the harness.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ClaudeTokenRefresh {
|
|
18
|
+
private readonly fetcher;
|
|
19
|
+
private readonly now;
|
|
20
|
+
constructor(fetcher?: typeof fetch, now?: () => number);
|
|
21
|
+
/**
|
|
22
|
+
* Whether Claude Code would refresh this login before using it: its access token expires within five minutes. A
|
|
23
|
+
* login without a numeric expiry or without a refresh token is used as it is, exactly as Claude Code does.
|
|
24
|
+
*/
|
|
25
|
+
due(oauthArg: Record<string, unknown>): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* New tokens for the login. A response without a refresh token keeps the one sent, and one without a scope keeps the
|
|
28
|
+
* stored scopes, as Claude Code merges them. Throws `ClaudeRequestError` with a fixed diagnostic; a grant the service
|
|
29
|
+
* rejects is `ClaudeLoginRejectedError`, and a rate limit is `ClaudeRateLimitError`.
|
|
30
|
+
*/
|
|
31
|
+
refresh(oauthArg: Record<string, unknown>): Promise<IClaudeTokens>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { credentialText } from './classes.credentialstore.js';
|
|
2
|
+
import { claudeRequest, ClaudeLoginRejectedError, ClaudeRequestError } from './claudehttp.js';
|
|
3
|
+
/** Claude Code 2.1.273's token endpoint (`TOKEN_URL`, bundle offset @12733057; see hints.md). */
|
|
4
|
+
const TOKEN_URL = 'https://platform.claude.com/v1/oauth/token';
|
|
5
|
+
/** Claude Code 2.1.273's public OAuth client (`CLIENT_ID`, @12733057), used when a login does not name its own. */
|
|
6
|
+
export const CLAUDE_CODE_CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e';
|
|
7
|
+
/** Claude Code 2.1.273 refreshes an access token that expires within five minutes (`cF`, @15359182). */
|
|
8
|
+
const REFRESH_MARGIN_MS = 300_000;
|
|
9
|
+
/**
|
|
10
|
+
* Claude Code 2.1.273 allows a refresh 30 seconds. A refresh is never cut shorter than that, nor cancelled once sent:
|
|
11
|
+
* the service may already have replaced the refresh token the request carries.
|
|
12
|
+
*/
|
|
13
|
+
const REFRESH_TIMEOUT_MS = 30_000;
|
|
14
|
+
const seconds = (valueArg) => typeof valueArg === 'number' && Number.isFinite(valueArg) && valueArg >= 0 ? valueArg : undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Refreshes a saved Claude Code login with the refresh-token grant Claude Code 2.1.273 uses (`RQ`, @15355055).
|
|
17
|
+
*
|
|
18
|
+
* It only talks to the token endpoint; which login is refreshed, and how the result is stored, belongs to the harness.
|
|
19
|
+
*/
|
|
20
|
+
export class ClaudeTokenRefresh {
|
|
21
|
+
fetcher;
|
|
22
|
+
now;
|
|
23
|
+
constructor(fetcher = globalThis.fetch, now = Date.now) {
|
|
24
|
+
this.fetcher = fetcher;
|
|
25
|
+
this.now = now;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Whether Claude Code would refresh this login before using it: its access token expires within five minutes. A
|
|
29
|
+
* login without a numeric expiry or without a refresh token is used as it is, exactly as Claude Code does.
|
|
30
|
+
*/
|
|
31
|
+
due(oauthArg) {
|
|
32
|
+
const expiresAt = oauthArg.expiresAt;
|
|
33
|
+
return typeof expiresAt === 'number' && Number.isFinite(expiresAt) && credentialText(oauthArg.refreshToken) !== undefined
|
|
34
|
+
&& this.now() + REFRESH_MARGIN_MS >= expiresAt;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* New tokens for the login. A response without a refresh token keeps the one sent, and one without a scope keeps the
|
|
38
|
+
* stored scopes, as Claude Code merges them. Throws `ClaudeRequestError` with a fixed diagnostic; a grant the service
|
|
39
|
+
* rejects is `ClaudeLoginRejectedError`, and a rate limit is `ClaudeRateLimitError`.
|
|
40
|
+
*/
|
|
41
|
+
async refresh(oauthArg) {
|
|
42
|
+
const refreshToken = credentialText(oauthArg.refreshToken);
|
|
43
|
+
const scopes = oauthArg.scopes;
|
|
44
|
+
if (!refreshToken || !Array.isArray(scopes) || !scopes.every(scope => typeof scope === 'string')) {
|
|
45
|
+
throw new ClaudeRequestError('This saved login has no refresh token or scopes to refresh with. Log in again with Claude Code and save it.');
|
|
46
|
+
}
|
|
47
|
+
const { status, body } = await claudeRequest(this.fetcher, {
|
|
48
|
+
url: TOKEN_URL, method: 'POST', headers: { 'Content-Type': 'application/json' }, subject: 'Claude sign-in',
|
|
49
|
+
body: JSON.stringify({
|
|
50
|
+
grant_type: 'refresh_token', refresh_token: refreshToken,
|
|
51
|
+
client_id: credentialText(oauthArg.clientId) ?? CLAUDE_CODE_CLIENT_ID, scope: scopes.join(' '),
|
|
52
|
+
}),
|
|
53
|
+
timeoutMs: REFRESH_TIMEOUT_MS, readErrorBody: true, now: this.now,
|
|
54
|
+
});
|
|
55
|
+
if ((status === 400 || status === 401) && body?.error === 'invalid_grant')
|
|
56
|
+
throw new ClaudeLoginRejectedError();
|
|
57
|
+
if (status < 200 || status > 299)
|
|
58
|
+
throw new ClaudeRequestError(`The Claude sign-in service returned HTTP ${status}.`);
|
|
59
|
+
const receivedAt = this.now();
|
|
60
|
+
const accessToken = credentialText(body?.access_token);
|
|
61
|
+
const tokenType = body?.token_type;
|
|
62
|
+
const expiresIn = seconds(body?.expires_in);
|
|
63
|
+
const refreshExpiresIn = body?.refresh_token_expires_in == null ? null : seconds(body.refresh_token_expires_in);
|
|
64
|
+
const rotated = body?.refresh_token == null ? null : credentialText(body.refresh_token);
|
|
65
|
+
const scope = body?.scope == null ? null : typeof body.scope === 'string' ? body.scope.split(/\s+/).filter(Boolean) : undefined;
|
|
66
|
+
if (!accessToken || (tokenType != null && (typeof tokenType !== 'string' || tokenType.toLowerCase() !== 'bearer'))
|
|
67
|
+
|| expiresIn === undefined || refreshExpiresIn === undefined || rotated === undefined || scope === undefined) {
|
|
68
|
+
throw new ClaudeRequestError('The Claude sign-in service returned an unsupported token response; the saved login was not changed.');
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
accessToken, refreshToken: rotated ?? refreshToken, expiresAt: receivedAt + expiresIn * 1000,
|
|
72
|
+
...(refreshExpiresIn === null ? {} : { refreshTokenExpiresAt: receivedAt + refreshExpiresIn * 1000 }),
|
|
73
|
+
...(scope === null || !scope.length ? {} : { scopes: scope }),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jbGF1ZGV0b2tlbnJlZnJlc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmNsYXVkZXRva2VucmVmcmVzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlGLGlHQUFpRztBQUNqRyxNQUFNLFNBQVMsR0FBRyw0Q0FBNEMsQ0FBQztBQUMvRCxtSEFBbUg7QUFDbkgsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsc0NBQXNDLENBQUM7QUFDNUUsd0dBQXdHO0FBQ3hHLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDO0FBQ2xDOzs7R0FHRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDO0FBWWxDLE1BQU0sT0FBTyxHQUFHLENBQUMsUUFBaUIsRUFBc0IsRUFBRSxDQUN4RCxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUVwRzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjtJQUNBO0lBQTJEO0lBQXhGLFlBQTZCLFVBQXdCLFVBQVUsQ0FBQyxLQUFLLEVBQW1CLE1BQW9CLElBQUksQ0FBQyxHQUFHO1FBQXZGLFlBQU8sR0FBUCxPQUFPLENBQWlDO1FBQW1CLFFBQUcsR0FBSCxHQUFHLENBQXlCO0lBQUcsQ0FBQztJQUV4SDs7O09BR0c7SUFDSSxHQUFHLENBQUMsUUFBaUM7UUFDMUMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUNyQyxPQUFPLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssU0FBUztlQUNwSCxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsaUJBQWlCLElBQUksU0FBUyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFpQztRQUNwRCxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNqRyxNQUFNLElBQUksa0JBQWtCLENBQUMsNkdBQTZHLENBQUMsQ0FBQztRQUM5SSxDQUFDO1FBQ0QsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3pELEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCO1lBQzFHLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNuQixVQUFVLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxZQUFZO2dCQUN4RCxTQUFTLEVBQUUsY0FBYyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7YUFDL0YsQ0FBQztZQUNGLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztTQUNsRSxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLEtBQUssS0FBSyxlQUFlO1lBQUUsTUFBTSxJQUFJLHdCQUF3QixFQUFFLENBQUM7UUFDaEgsSUFBSSxNQUFNLEdBQUcsR0FBRyxJQUFJLE1BQU0sR0FBRyxHQUFHO1lBQUUsTUFBTSxJQUFJLGtCQUFrQixDQUFDLDRDQUE0QyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3RILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM5QixNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLElBQUksRUFBRSxVQUFVLENBQUM7UUFDbkMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1QyxNQUFNLGdCQUFnQixHQUFHLElBQUksRUFBRSx3QkFBd0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ2hILE1BQU0sT0FBTyxHQUFHLElBQUksRUFBRSxhQUFhLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEYsTUFBTSxLQUFLLEdBQUcsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEksSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDO2VBQzdHLFNBQVMsS0FBSyxTQUFTLElBQUksZ0JBQWdCLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9HLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxxR0FBcUcsQ0FBQyxDQUFDO1FBQ3RJLENBQUM7UUFDRCxPQUFPO1lBQ0wsV0FBVyxFQUFFLFlBQVksRUFBRSxPQUFPLElBQUksWUFBWSxFQUFFLFNBQVMsRUFBRSxVQUFVLEdBQUcsU0FBUyxHQUFHLElBQUk7WUFDNUYsR0FBRyxDQUFDLGdCQUFnQixLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLFVBQVUsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUNyRyxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDOUQsQ0FBQztJQUNKLENBQUM7Q0FDRiJ9
|
package/dist_ts/classes.cli.d.ts
CHANGED
|
@@ -19,14 +19,21 @@ export declare class AuthSwitchCli {
|
|
|
19
19
|
* Decide what happens to the harness's own running instances before its credential file changes.
|
|
20
20
|
*
|
|
21
21
|
* The switch itself no longer depends on this: it writes atomically and re-saves the outgoing
|
|
22
|
-
* login either way.
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
22
|
+
* login either way. A harness that picks up swaps live needs nothing here, so its instances are
|
|
23
|
+
* only stopped on an explicit --stop or --force-stop. Any other running instance still costs
|
|
24
|
+
* durability -- it holds the previous login in memory and can write it back at its next refresh --
|
|
25
|
+
* so the instances are named and stopping them is offered, never assumed. Without a terminal and
|
|
26
|
+
* without a flag nothing is signalled, and only pids enumerated here for this user are ever
|
|
27
|
+
* signalled at all.
|
|
26
28
|
*/
|
|
27
29
|
private settleRunningInstances;
|
|
28
30
|
private commandLogin;
|
|
29
31
|
private commandPreuse;
|
|
32
|
+
/**
|
|
33
|
+
* Watch usage and switch automatically; see `AuthSwitchWatch`. SIGINT and SIGTERM end it cleanly with status 0.
|
|
34
|
+
* `--once` runs one check and exits 1 when a switch it attempted did not complete.
|
|
35
|
+
*/
|
|
36
|
+
private commandWatch;
|
|
30
37
|
private selectHarness;
|
|
31
38
|
private runInteractive;
|
|
32
39
|
/** Offer a verified save before presenting the switch picker; declining never switches. */
|
|
@@ -36,12 +43,12 @@ export declare class AuthSwitchCli {
|
|
|
36
43
|
private selectActive;
|
|
37
44
|
private reportOutcome;
|
|
38
45
|
/**
|
|
39
|
-
* The condensed views are projections of the same
|
|
40
|
-
* once, per account, with the same bounded timeouts and per-account failure
|
|
46
|
+
* The condensed views are projections of the same account list, which never changes which account is in
|
|
47
|
+
* use, so a provider is queried once, per account, with the same bounded timeouts and per-account failure
|
|
48
|
+
* isolation as `list`.
|
|
41
49
|
*/
|
|
42
50
|
private commandCondensed;
|
|
43
51
|
private commandList;
|
|
44
|
-
private printAccount;
|
|
45
52
|
private resolveAccount;
|
|
46
53
|
/**
|
|
47
54
|
* Activate a saved account and report what is now active with its badge.
|