@modelprofile.com/authswitch 6.1.0 → 6.3.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.
@@ -1,8 +1,13 @@
1
1
  import * as plugins from './plugins.js';
2
2
  import { accountBadge, accountDetails, accountPlan, accountQuotaSummary, accountResets, accountState, accountUsageWindows, usageWindowName, until, readAccountRows } from './accounts.js';
3
+ import { defaultPreusePrompt, preuseAccounts, preuseCountsText, preuseTargets } from './preuse.js';
3
4
  import { plainText } from './formatting.js';
4
5
  import { AuthSwitchOperations, authSwitchMutationReplacesLogin } from './classes.operations.js';
5
6
  import { describeHarnessProcesses, describeStopOutcome } from './classes.harnessprocesses.js';
7
+ /** One account's preuse result, as the dashboard's activity log and footer report it. */
8
+ const preuseResultLine = (resultArg) => resultArg.outcome === 'completed'
9
+ ? `${plainText(resultArg.account.label)}: completed with ${plainText(resultArg.result.model)}, ${resultArg.result.totalTokens ?? 'unreported'} tokens.`
10
+ : `${plainText(resultArg.account.label)}: ${resultArg.reason}`;
6
11
  /** Owns account-management actions; terminal rendering and interaction belong to smartconsole. */
7
12
  export class AuthSwitchTui {
8
13
  harnesses;
@@ -189,6 +194,43 @@ export class AuthSwitchTui {
189
194
  if (showOutcome(outcome))
190
195
  ui.logs.append(`Now active: ${plainText(target.label)}${badge}`);
191
196
  };
197
+ /**
198
+ * Send one preuse prompt through each of these accounts, after one confirmation that names the cost.
199
+ *
200
+ * The prompt consumes the account's own quota, so nothing is sent before consent, the accounts run
201
+ * one at a time through the shared runner, and the footer follows the run account by account. Closing
202
+ * the dashboard aborts it before the next account starts. Nothing is switched, saved or written.
203
+ */
204
+ const preuse = async (screen, accountsArg) => {
205
+ if (!harness.preuseAccount) {
206
+ footer.setText(`${plainText(harness.label)} does not support preuse.`);
207
+ return;
208
+ }
209
+ if (!accountsArg.length) {
210
+ footer.setText('Select an account to preuse.');
211
+ return;
212
+ }
213
+ const message = accountsArg.length === 1
214
+ ? `Send one preuse prompt through ${plainText(accountsArg[0].label)}? This consumes its quota.`
215
+ : `Send one preuse prompt through each of these ${accountsArg.length} ${plainText(harness.label)} accounts? This consumes quota on every one of them.`;
216
+ if (!await screen.confirm(message, { confirmLabel: 'Preuse' }))
217
+ return;
218
+ if (screen.signal.aborted)
219
+ return;
220
+ const summary = await preuseAccounts(harness, accountsArg, { prompt: defaultPreusePrompt, signal: screen.signal }, event => {
221
+ if (event.kind === 'started')
222
+ footer.setText(`Preusing ${plainText(event.account.label)} (${event.index + 1}/${event.total})…`);
223
+ else {
224
+ const line = preuseResultLine(event.result);
225
+ ui.logs.append(line);
226
+ footer.setText(line);
227
+ }
228
+ void screen.invalidate();
229
+ });
230
+ // The prompts moved usage and reset deadlines, so the table is read again before the counts are shown.
231
+ await refresh(screen);
232
+ footer.setText(`Preuse: ${preuseCountsText(summary)}.`);
233
+ };
192
234
  const remove = async (screen) => {
193
235
  const selected = table.selected;
194
236
  if (!selected || (!selected.account.isStashed && selected.account.savedAt === null)) {
@@ -226,7 +268,7 @@ export class AuthSwitchTui {
226
268
  return ui.column([
227
269
  ui.text('authswitch · account management', { height: 1 }),
228
270
  this.harnesses.length > 1 ? ui.row([ui.panel('Harnesses', harnessTable, { width: 23 }), accountView]) : accountView,
229
- ui.text('Enter switch · a save · c save+clear · d remove · r refresh · g diagnose · Tab focus · q quit', { height: 2 }),
271
+ ui.text(`Enter switch · a save · c save+clear · d remove${harness.preuseAccount ? ' · p preuse · P preuse all' : ''} · r refresh · g diagnose · Tab focus · q quit`, { height: 2 }),
230
272
  footer,
231
273
  ]);
232
274
  },
@@ -237,10 +279,17 @@ export class AuthSwitchTui {
237
279
  a: screen => perform(screen, () => save(screen, true)),
238
280
  c: screen => perform(screen, () => save(screen, false)),
239
281
  d: screen => perform(screen, () => remove(screen)),
282
+ // The key map is fixed for the session while the harness selector can change the harness, so both
283
+ // preuse keys are always bound and the action itself reports a harness that does not support it.
284
+ p: screen => perform(screen, async () => {
285
+ const selected = table.selected?.account.id;
286
+ await preuse(screen, preuseTargets((await harness.readState()).accounts).filter(account => account.id === selected));
287
+ }),
288
+ P: screen => perform(screen, async () => { await preuse(screen, preuseTargets((await harness.readState()).accounts)); }),
240
289
  g: screen => perform(screen, async () => { showOutcome(await harness.diagnose()); }),
241
290
  },
242
291
  });
243
292
  return 0;
244
293
  }
245
294
  }
246
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50dWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLnR1aS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDNU0sT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSwrQkFBK0IsRUFBNEIsTUFBTSx5QkFBeUIsQ0FBQztBQUMxSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU5RixrR0FBa0c7QUFDbEcsTUFBTSxPQUFPLGFBQWE7SUFDSztJQUFxRDtJQUF5RDtJQUEzSSxZQUE2QixTQUFrQyxFQUFtQixHQUFzQyxFQUFtQixhQUFhLElBQUksb0JBQW9CLEVBQUU7UUFBckosY0FBUyxHQUFULFNBQVMsQ0FBeUI7UUFBbUIsUUFBRyxHQUFILEdBQUcsQ0FBbUM7UUFBbUIsZUFBVSxHQUFWLFVBQVUsQ0FBNkI7SUFBRyxDQUFDO0lBRS9LLEtBQUssQ0FBQyxHQUFHLENBQUMsWUFBMkI7UUFDMUMsSUFBSSxPQUFPLEdBQUcsWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQUMsT0FBTyxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQzVFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FB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
295
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50dWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLnR1aS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDNU0sT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQTZCLE1BQU0sYUFBYSxDQUFDO0FBQzlILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsK0JBQStCLEVBQTRCLE1BQU0seUJBQXlCLENBQUM7QUFDMUgsT0FBTyxFQUFFLHdCQUF3QixFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUYseUZBQXlGO0FBQ3pGLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxTQUErQixFQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxLQUFLLFdBQVc7SUFDckcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxZQUFZLFVBQVU7SUFDdkosQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBRWpFLGtHQUFrRztBQUNsRyxNQUFNLE9BQU8sYUFBYTtJQUNLO0lBQXFEO0lBQXlEO0lB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LENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDdkgsQ0FBQyxDQUFDO2dCQUNGLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUMsTUFBTSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4SCxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDLE1BQU0sT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckY7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7Q0FDRiJ9
@@ -1,6 +1,93 @@
1
- import type { IHarnessPreuseOptions } from './interfaces.harness.js';
1
+ import type { IAuthHarness, IHarnessAccount, IHarnessPreuseOptions, IHarnessPreuseResult, IHarnessUsageWindow } from './interfaces.harness.js';
2
2
  export declare const defaultPreusePrompt = "Write 2000 words about strawberries.";
3
- /** Only fixed local messages may cross the inference error boundary. */
3
+ /**
4
+ * Only fixed local messages may cross the inference error boundary.
5
+ *
6
+ * `requestStarted` says whether the prompt may already have reached the provider. False is a refusal that
7
+ * sent nothing -- an unsupported login, a missing credential, a model catalog that could not be read before
8
+ * the prompt -- so the account's quota is untouched. True, and any error that is not a `PreuseError` at all,
9
+ * means tokens may have been consumed, and such a request is never repeated automatically.
10
+ */
4
11
  export declare class PreuseError extends Error {
12
+ readonly requestStarted: boolean;
13
+ constructor(messageArg: string, requestStarted?: boolean);
5
14
  }
6
15
  export declare const validatePreuseOptions: (optionsArg: IHarnessPreuseOptions) => void;
16
+ /**
17
+ * What one account's turn in a run did.
18
+ *
19
+ * `skipped` is a refusal that sent nothing and consumed nothing, with the reason the adapter stated.
20
+ * `failed` and `interrupted` may both have consumed tokens, so neither is ever retried by the runner.
21
+ */
22
+ export type TPreuseOutcome = 'completed' | 'skipped' | 'failed' | 'interrupted';
23
+ /**
24
+ * The reset schedule read after a prompt completed.
25
+ *
26
+ * `reported` carries what the provider answered, which may be no window at all; `unavailable` is a lookup
27
+ * that failed, and `notRead` is a run the user interrupted before it asked. None of them says anything
28
+ * about the completed prompt, which is never repeated because its schedule could not be confirmed.
29
+ */
30
+ export type TPreuseSchedule = {
31
+ kind: 'reported';
32
+ windows: readonly IHarnessUsageWindow[];
33
+ } | {
34
+ kind: 'unavailable';
35
+ } | {
36
+ kind: 'notRead';
37
+ };
38
+ export type TPreuseAccountResult = {
39
+ account: IHarnessAccount;
40
+ outcome: 'completed';
41
+ result: IHarnessPreuseResult;
42
+ schedule: TPreuseSchedule;
43
+ } | {
44
+ account: IHarnessAccount;
45
+ outcome: Exclude<TPreuseOutcome, 'completed'>;
46
+ reason: string;
47
+ };
48
+ /** One account starting, and that account's result. A run reports nothing else, and never the generated prose. */
49
+ export type TPreuseRunEvent = {
50
+ kind: 'started';
51
+ index: number;
52
+ total: number;
53
+ account: IHarnessAccount;
54
+ } | {
55
+ kind: 'finished';
56
+ index: number;
57
+ total: number;
58
+ result: TPreuseAccountResult;
59
+ };
60
+ export interface IPreuseRunSummary {
61
+ results: readonly TPreuseAccountResult[];
62
+ counts: Readonly<Record<TPreuseOutcome, number>>;
63
+ /** Accounts an abort kept the run from reaching. Nothing was sent for them. */
64
+ notRun: readonly IHarnessAccount[];
65
+ }
66
+ /**
67
+ * Every account a run may preuse, in the order the harness lists them, each at most once.
68
+ *
69
+ * A harness reports an active login and that login's saved record as one account -- Codex keys both by
70
+ * email, the file harness merges the active login into its saved record by account id -- so the walk is
71
+ * the account list itself. The seen set keeps a repeated id from being charged twice regardless.
72
+ */
73
+ export declare const preuseTargets: (accountsArg: readonly IHarnessAccount[]) => IHarnessAccount[];
74
+ /**
75
+ * A run's counts in one line, for a command's closing line and for the dashboard footer.
76
+ *
77
+ * Completed accounts are always named, including none of them; every other count appears only when it
78
+ * happened, so a clean run reads as one fact rather than as four.
79
+ */
80
+ export declare const preuseCountsText: (summaryArg: IPreuseRunSummary) => string;
81
+ /**
82
+ * Send one preuse prompt through each account in turn, and report what each one did.
83
+ *
84
+ * Accounts run strictly one after another, each with exactly one inference request and no retry, because
85
+ * every request costs the account's own quota. An aborted signal stops the run before the next account
86
+ * starts, and an account already in flight is reported as interrupted: its tokens may be gone either way,
87
+ * which is why nothing is repeated. Nothing is switched, refreshed, stopped or written anywhere.
88
+ */
89
+ export declare const preuseAccounts: (harnessArg: IAuthHarness, accountsArg: readonly IHarnessAccount[], optionsArg: {
90
+ prompt: string;
91
+ model?: string;
92
+ signal: AbortSignal;
93
+ }, reportArg: (eventArg: TPreuseRunEvent) => void) => Promise<IPreuseRunSummary>;
package/dist_ts/preuse.js CHANGED
@@ -1,6 +1,19 @@
1
+ import { orderedUsageWindows } from './accounts.js';
1
2
  export const defaultPreusePrompt = 'Write 2000 words about strawberries.';
2
- /** Only fixed local messages may cross the inference error boundary. */
3
+ /**
4
+ * Only fixed local messages may cross the inference error boundary.
5
+ *
6
+ * `requestStarted` says whether the prompt may already have reached the provider. False is a refusal that
7
+ * sent nothing -- an unsupported login, a missing credential, a model catalog that could not be read before
8
+ * the prompt -- so the account's quota is untouched. True, and any error that is not a `PreuseError` at all,
9
+ * means tokens may have been consumed, and such a request is never repeated automatically.
10
+ */
3
11
  export class PreuseError extends Error {
12
+ requestStarted;
13
+ constructor(messageArg, requestStarted = false) {
14
+ super(messageArg);
15
+ this.requestStarted = requestStarted;
16
+ }
4
17
  }
5
18
  export const validatePreuseOptions = (optionsArg) => {
6
19
  if (typeof optionsArg.prompt !== 'string' || !optionsArg.prompt.trim() || Buffer.byteLength(optionsArg.prompt, 'utf8') > 16_384) {
@@ -10,4 +23,96 @@ export const validatePreuseOptions = (optionsArg) => {
10
23
  throw new PreuseError('The preuse model must be a valid model identifier of at most 128 characters.');
11
24
  }
12
25
  };
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJldXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLHNDQUFzQyxDQUFDO0FBRTFFLHdFQUF3RTtBQUN4RSxNQUFNLE9BQU8sV0FBWSxTQUFRLEtBQUs7Q0FBRztBQUV6QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFVBQWlDLEVBQVEsRUFBRTtJQUMvRSxJQUFJLE9BQU8sVUFBVSxDQUFDLE1BQU0sS0FBSyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUNoSSxNQUFNLElBQUksV0FBVyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsc0NBQXNDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0ksTUFBTSxJQUFJLFdBQVcsQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7QUFDSCxDQUFDLENBQUMifQ==
26
+ /**
27
+ * Every account a run may preuse, in the order the harness lists them, each at most once.
28
+ *
29
+ * A harness reports an active login and that login's saved record as one account -- Codex keys both by
30
+ * email, the file harness merges the active login into its saved record by account id -- so the walk is
31
+ * the account list itself. The seen set keeps a repeated id from being charged twice regardless.
32
+ */
33
+ export const preuseTargets = (accountsArg) => {
34
+ const seen = new Set();
35
+ const targets = [];
36
+ for (const account of accountsArg) {
37
+ if (seen.has(account.id))
38
+ continue;
39
+ seen.add(account.id);
40
+ targets.push(account);
41
+ }
42
+ return targets;
43
+ };
44
+ /**
45
+ * A run's counts in one line, for a command's closing line and for the dashboard footer.
46
+ *
47
+ * Completed accounts are always named, including none of them; every other count appears only when it
48
+ * happened, so a clean run reads as one fact rather than as four.
49
+ */
50
+ export const preuseCountsText = (summaryArg) => [
51
+ `${summaryArg.counts.completed} completed`,
52
+ ...(summaryArg.counts.skipped ? [`${summaryArg.counts.skipped} skipped`] : []),
53
+ ...(summaryArg.counts.failed ? [`${summaryArg.counts.failed} failed`] : []),
54
+ ...(summaryArg.counts.interrupted ? [`${summaryArg.counts.interrupted} interrupted`] : []),
55
+ ...(summaryArg.notRun.length ? [`${summaryArg.notRun.length} not run`] : []),
56
+ ].join(', ');
57
+ /** An adapter's own fixed message, or the fixed local text for an error that crossed the boundary unnamed. */
58
+ const preuseReason = (errorArg) => errorArg instanceof PreuseError
59
+ ? errorArg.message
60
+ : 'Preuse failed. Tokens may already have been consumed; check account status before trying again.';
61
+ /**
62
+ * The account's reset schedule, read after its prompt completed, exactly as the single-account command reads it.
63
+ *
64
+ * The read never activates or writes a login, and its failure never turns a completed prompt into a failed
65
+ * one: there is nothing to undo and nothing worth repeating. An interrupted run does not ask at all.
66
+ */
67
+ const readPreuseSchedule = async (harnessArg, accountArg, signalArg) => {
68
+ if (signalArg.aborted)
69
+ return { kind: 'notRead' };
70
+ try {
71
+ const status = await harnessArg.readAccountStatus(accountArg.id, { signal: signalArg });
72
+ return { kind: 'reported', windows: orderedUsageWindows(status.summary?.usageWindows) };
73
+ }
74
+ catch {
75
+ return { kind: 'unavailable' };
76
+ }
77
+ };
78
+ /**
79
+ * Send one preuse prompt through each account in turn, and report what each one did.
80
+ *
81
+ * Accounts run strictly one after another, each with exactly one inference request and no retry, because
82
+ * every request costs the account's own quota. An aborted signal stops the run before the next account
83
+ * starts, and an account already in flight is reported as interrupted: its tokens may be gone either way,
84
+ * which is why nothing is repeated. Nothing is switched, refreshed, stopped or written anywhere.
85
+ */
86
+ export const preuseAccounts = async (harnessArg, accountsArg, optionsArg, reportArg) => {
87
+ const preuseAccount = harnessArg.preuseAccount?.bind(harnessArg);
88
+ if (!preuseAccount)
89
+ throw new PreuseError('This harness does not support preuse.');
90
+ validatePreuseOptions(optionsArg);
91
+ const results = [];
92
+ const counts = { completed: 0, skipped: 0, failed: 0, interrupted: 0 };
93
+ const notRun = [];
94
+ const total = accountsArg.length;
95
+ for (const [index, account] of accountsArg.entries()) {
96
+ if (optionsArg.signal.aborted) {
97
+ notRun.push(account);
98
+ continue;
99
+ }
100
+ reportArg({ kind: 'started', index, total, account });
101
+ let result;
102
+ try {
103
+ const completed = await preuseAccount(account.id, { prompt: optionsArg.prompt, model: optionsArg.model, signal: optionsArg.signal });
104
+ result = { account, outcome: 'completed', result: completed, schedule: await readPreuseSchedule(harnessArg, account, optionsArg.signal) };
105
+ }
106
+ catch (error) {
107
+ // A cancelled account is interrupted whether or not its prompt went out; its reason says which.
108
+ const outcome = optionsArg.signal.aborted ? 'interrupted'
109
+ : error instanceof PreuseError && !error.requestStarted ? 'skipped' : 'failed';
110
+ result = { account, outcome, reason: preuseReason(error) };
111
+ }
112
+ results.push(result);
113
+ counts[result.outcome]++;
114
+ reportArg({ kind: 'finished', index, total, result });
115
+ }
116
+ return { results, counts, notRun };
117
+ };
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJldXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUdwRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxzQ0FBc0MsQ0FBQztBQUUxRTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLFdBQVksU0FBUSxLQUFLO0lBQ1k7SUFBaEQsWUFBWSxVQUFrQixFQUFrQixpQkFBaUIsS0FBSztRQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUE1QyxtQkFBYyxHQUFkLGNBQWMsQ0FBUTtJQUF1QixDQUFDO0NBQy9GO0FBRUQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxVQUFpQyxFQUFRLEVBQUU7SUFDL0UsSUFBSSxPQUFPLFVBQVUsQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDaEksTUFBTSxJQUFJLFdBQVcsQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsT0FBTyxVQUFVLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9JLE1BQU0sSUFBSSxXQUFXLENBQUMsOEVBQThFLENBQUMsQ0FBQztJQUN4RyxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBc0NGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLFdBQXVDLEVBQXFCLEVBQUU7SUFDMUYsTUFB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@modelprofile.com/authswitch",
3
- "version": "6.1.0",
3
+ "version": "6.3.0",
4
4
  "private": false,
5
5
  "description": "Manage Codex, OpenCode and Claude Code accounts with guided switching and live usage status",
6
6
  "main": "dist_ts/index.js",
package/readme.md CHANGED
@@ -28,14 +28,16 @@ Node.js 24 or newer is required.
28
28
 
29
29
  Run `authswitch`, `authswitch -i`, or `authswitch --interactive` for an interactive guide. Use the arrow keys and
30
30
  Enter to switch accounts, save the current login, list accounts and live status, check remote
31
- control, or remove a saved account. The guide shows the current account and returns
32
- to the menu after each successful action; choose **Back** in a submenu or **Exit** to finish.
31
+ control, preuse one or all accounts, or remove a saved account. The guide shows the current
32
+ account and returns to the menu after each successful action; choose **Back** in a submenu or
33
+ **Exit** to finish.
33
34
 
34
35
  Before showing the actions, the guide checks whether the current credential has a
35
- matching, readable saved copy. A new or refreshed login gets an offer to save it
36
- while keeping it active. The switch action checks again before offering targets;
37
- declining that save cancels the switch. Scripts still preserve the outgoing login
38
- automatically through the harness adapter.
36
+ readable saved copy of its own account. A login without one gets an offer to save it
37
+ while keeping it active; a login its harness merely refreshed is already saved. The
38
+ switch action checks again before offering targets; declining that save cancels the
39
+ switch. Scripts still preserve the outgoing login automatically through the harness
40
+ adapter.
39
41
 
40
42
  When saving, choose whether to keep the account active or clear the active login so
41
43
  you can run `codex login` for another account. Removing a saved account requires
@@ -61,6 +63,7 @@ authswitch codex use [email] # activate one; prompts when no email is given
61
63
  authswitch opencode use [email] --stop # stop running OpenCode instances first
62
64
  authswitch opencode use [email] --keep-running # switch without stopping anything
63
65
  authswitch codex preuse <email> # send the default prompt without activating the account
66
+ authswitch codex preuse --all # the same for every Codex account, one account at a time
64
67
  authswitch watch # check usage every 2 minutes and switch when an account runs out
65
68
  authswitch claude watch --threshold 90 --dry-run # report what it would switch, for one harness
66
69
  authswitch codex current # print the account currently in use
@@ -302,6 +305,19 @@ saved implicitly; `stash` is what saves a login. An installation whose native lo
302
305
  authswitch cannot read mirrors nothing, and a read waits at most a second for a lock a
303
306
  switch or Claude Code holds before leaving the saved copy to the next read.
304
307
 
308
+ Codex is mirrored the same way, for the same reason: its app-server refreshes the login it
309
+ runs on its own schedule, so the saved copy of that login held older tokens between
310
+ switches -- and, because a saved login used to mean the *exact* credential in
311
+ `~/.codex/auth.json`, an account read as unsaved from its first refresh on and the guide
312
+ offered to save what was already saved. A saved Codex login is now one whose stored
313
+ credential belongs to the account its record names, and reading the accounts writes the
314
+ refreshed credential into that record. Only the saved copy is written: `~/.codex/auth.json`
315
+ is read, no app-server is stopped or signalled for it, and the record keeps its account,
316
+ its remote-control enrollments and its save time. A login with no saved record of its own,
317
+ a record whose credential is missing, and a record that belongs to another Codex account
318
+ with the same email are all left alone; `stash` is what saves or repairs those. A copy that
319
+ could not be written says so beside the account and is tried again on the next read.
320
+
305
321
  An account the service has put **on hold** is not a dead login: the hold refuses the grant
306
322
  while it lasts and the same login works again once it is lifted, so such an account keeps
307
323
  its stored plan, says that it is on hold and where to appeal, and is asked again on the
@@ -367,12 +383,58 @@ to make the first token-consuming request for the next usage window:
367
383
  authswitch codex preuse alice@example.com
368
384
  authswitch codex preuse alice@example.com --prompt "Write 2000 words about strawberries."
369
385
  authswitch codex preuse alice@example.com --model gpt-5.5 --prompt "Describe a strawberry in one sentence."
386
+ authswitch codex preuse --all
387
+ authswitch codex preuse --all --model gpt-5.5
370
388
  ```
371
389
 
372
390
  The default prompt is `Write 2000 words about strawberries.` Without an account,
373
- an interactive terminal shows an account picker. Scripts must specify an account
374
- and, when multiple harnesses are registered, the harness. Active and saved
375
- accounts are supported, including an active login that has not been stashed.
391
+ an interactive terminal shows a picker of the harness's accounts, plus **All
392
+ accounts** when it has more than one and **Back**. Choosing one account runs it
393
+ exactly as naming it would; choosing **All accounts** confirms once and then runs
394
+ as `--all` does, table and exit status included. Scripts must specify an account
395
+ or `--all` and, when multiple harnesses are registered, the harness. Active and
396
+ saved accounts are supported, including an active login that has not been stashed.
397
+
398
+ `--all` preuses every account the harness lists, active and saved, each exactly
399
+ once -- an active login and its own saved record are one account -- and it cannot
400
+ be combined with an account reference. The accounts run strictly one after
401
+ another, never in parallel, each with one request and no retry, and each one is
402
+ reported as it goes. The run ends with a table and a counts line:
403
+
404
+ ```
405
+ [1/3] Preusing alice@example.com (Codex)…
406
+ Prompt completed with gpt-5.5. Tokens: 19 input, 2711 output, 2730 total.
407
+ [2/3] Preusing bob@example.com (Codex)…
408
+ Prompt completed with gpt-5.5. Tokens: 19 input, 2711 output, 2730 total.
409
+ [3/3] Preusing apikey:9f2 (Codex)…
410
+ Codex preuse requires a ChatGPT subscription login; API-key logins have no subscription reset window.
411
+
412
+ Preuse results
413
+ ┌────────────────────┬───────────┬─────────┬─────────────────────┬──────────────┐
414
+ │ Account │ Outcome │ Model │ Tokens in/out/total │ Next reset │
415
+ ├────────────────────┼───────────┼─────────┼─────────────────────┼──────────────┤
416
+ │ alice@example.com │ Completed │ gpt-5.5 │ 19/2711/2730 │ 5d 18h 53min │
417
+ │ bob@example.com │ Completed │ gpt-5.5 │ 19/2711/2730 │ 5d 18h 53min │
418
+ │ apikey:9f2 │ Skipped │ - │ - │ - │
419
+ └────────────────────┴───────────┴─────────┴─────────────────────┴──────────────┘
420
+ 2 completed, 1 skipped.
421
+ ```
422
+
423
+ `Next reset` is the lead window of the reset schedule read after that account's
424
+ prompt, the same window the single-account reset table lists first. An account
425
+ that sent no prompt has no model, token count or deadline of its own, and says so
426
+ rather than showing a zero. `Skipped` is a refusal the adapter stated before any
427
+ request -- an API-key login, a missing or expired credential, a model catalog
428
+ that could not be read -- so nothing was consumed for it. `Failed` and
429
+ `Interrupted` may both have consumed tokens and are never retried; `Not run` is
430
+ an account the interruption never reached.
431
+
432
+ The guide (`authswitch`, `authswitch -i`) offers **Preuse an account or all
433
+ accounts (consumes quota)** for a harness that supports it. It asks which account
434
+ or **All accounts**, confirms once and names what the prompt will be sent to, then
435
+ reports exactly as the command line does: one account's reset schedule, or the
436
+ results table for all of them. **Back** or a declined confirmation sends nothing,
437
+ and an account the adapter refuses returns to the menu rather than ending the guide.
376
438
 
377
439
  Codex inference uses the published FlexHarness models/providers packages and the
378
440
  selected ChatGPT login's access token and account ID. It selects the account's
@@ -381,21 +443,25 @@ low reasoning setting when the catalog provides one. API-key logins are rejected
381
443
  because they do not have ChatGPT subscription reset windows. Expired credentials
382
444
  must be renewed through Codex and saved again.
383
445
 
384
- Each invocation consumes quota and sends at most one inference request. It does
385
- not watch for resets or schedule future requests. No active login is switched,
446
+ Each invocation consumes quota and sends one inference request per account. It
447
+ does not watch for resets or schedule future requests. No active login is switched,
386
448
  credential refreshed or written, app-server restarted, or earned reset consumed.
387
449
  The prompt has no tools, files or conversation history. The generated prose is
388
450
  drained without being printed or stored; the command reports provider token
389
451
  counts and then reads the account's reset schedule. It does not infer that a
390
452
  timer started merely from a zero-percent usage reading or a successful response.
391
453
 
392
- Ctrl-C cancels the request. Codex preuse has a three-minute deadline, with a
393
- ten-second model-catalog limit. Failed or interrupted requests can have consumed
394
- tokens and are never retried automatically. A completed prompt exits with 0 even
395
- if the subsequent reset lookup fails, reporting that uncertainty separately;
396
- inference failure exits with 1, invalid arguments or unsupported harnesses with
397
- 2, and an interrupted prompt with 130. Check `authswitch list` before repeating
398
- an uncertain request. `--json` remains a list-only option.
454
+ Ctrl-C cancels the request, and in a `--all` run it stops the run before the next
455
+ account starts. Codex preuse has a three-minute deadline, with a ten-second
456
+ model-catalog limit. Failed or interrupted requests can have consumed tokens and
457
+ are never retried automatically. A completed prompt exits with 0 even if the
458
+ subsequent reset lookup fails, reporting that uncertainty separately; inference
459
+ failure exits with 1, invalid arguments or unsupported harnesses with 2, and an
460
+ interrupted prompt with 130. A named single account also exits 1 when it was
461
+ refused, because it is the account the command was asked to preuse; `--all` exits
462
+ 0 when every account either completed or was skipped for a stated reason. Check
463
+ `authswitch list` before repeating an uncertain request. `--json` remains a
464
+ list-only option.
399
465
 
400
466
  ### Watching usage and switching automatically
401
467
 
@@ -478,10 +544,18 @@ incrementally through each account's status API, without activating it.
478
544
  | `/`, `s`, `S` | Filter the table, cycle its sort column, reverse sorting |
479
545
  | `a` / `c` | Save the current login and keep it active / save and clear it |
480
546
  | `d` | Remove the selected saved copy, preserving the active login |
547
+ | `p` / `P` | Preuse the selected account / every account of this harness (consumes quota) |
481
548
  | `r` / `g` | Refresh status / run harness diagnostics |
482
549
  | `q` / Ctrl-C | Close and restore the terminal |
483
550
 
484
- Save, switch and removal actions require confirmation. Confirmations start on
551
+ The preuse keys appear in the key line only for a harness that supports preuse,
552
+ and each run states how many accounts it will consume quota on before it starts.
553
+ The footer follows the run account by account, the activity log keeps each
554
+ account's result, and the table is read again afterwards because the prompts
555
+ moved the usage it shows. Closing the dashboard stops the run before its next
556
+ account.
557
+
558
+ Save, switch, preuse and removal actions require confirmation. Confirmations start on
485
559
  Cancel; use Left/Right or Tab to select the action, then Enter. Switching first
486
560
  checks the current credential and offers to save an unsaved login. A declined,
487
561
  failed or unverified save prevents switching. Plain character shortcuts remain
@@ -820,9 +894,10 @@ unsaved current login adds how to keep it (`authswitch <harness> stash --keep sa
820
894
  it`).
821
895
 
822
896
  `authswitch <harness> current` prints the same sentence. The same account with a
823
- rotated token is that account refreshing itself and is not reported; for Claude Code the
824
- rotation is copied into that account's saved record, and re-running the switch re-arms the
825
- check against the file's current contents.
897
+ rotated token is that account refreshing itself and is not reported; for Claude Code and
898
+ Codex the rotation is copied into that account's saved record. Re-running the switch
899
+ re-arms the Claude Code and OpenCode check against the file's current contents; Codex has
900
+ no such check.
826
901
 
827
902
  Both commands accept a harness qualifier (`authswitch claude limits`) and `--json`.
828
903
  Neither changes which account is in use: they never activate, switch or clear a login and
@@ -895,7 +970,9 @@ another workspace's default entry cannot supply its billing information.
895
970
  Each request uses that account's access token and account ID. For the active
896
971
  account it reads the current credential, which may be newer than the stash.
897
972
  Listing never switches accounts, starts or stops an app-server, refreshes tokens,
898
- writes credentials, stores status results, or consumes an earned reset.
973
+ writes `~/.codex/auth.json`, stores status results, or consumes an earned reset. The one
974
+ write it makes is the saved copy of the active login, brought onto the credential Codex is
975
+ running on as described above.
899
976
 
900
977
  These backend contracts come from Codex's source and can change. Missing fields,
901
978
  expired logins, denied requests, timeouts, and unsupported responses are shown
@@ -940,6 +1017,9 @@ process.exitCode = await cli.run(process.argv.slice(2));
940
1017
  Each adapter owns discovery, identity matching, save verification, credential
941
1018
  storage, switching and process lifecycle, live status APIs, and diagnostics.
942
1019
  `readState()` and `readAccountStatus()` must never activate, switch or clear a login.
1020
+ `readState()` may bring the saved copy of the active login onto the credential that login's
1021
+ harness last wrote -- the Claude Code and Codex adapters do, because both harnesses rotate
1022
+ the login they run -- and must write nothing else.
943
1023
  `readAccountStatus()` may renew the tokens of the saved copy it is reading, when the provider
944
1024
  gives it no other way to answer (the Claude Code adapter does, under the store's lock, for
945
1025
  saved and inactive logins only); it must never touch the active login's credential. `readAccountStatus(accountId,
@@ -973,7 +1053,15 @@ model identifier and cancellation signal; `IHarnessPreuseResult` returns the
973
1053
  selected model and optional input/output/total token counts. The adapter owns
974
1054
  credential selection and inference and must leave the active login unchanged.
975
1055
  Unsupported adapters reject the command before account selection. Prompt results
976
- never contain credentials or raw provider responses.
1056
+ never contain credentials or raw provider responses. A refusal that sent no
1057
+ request must be a `PreuseError` with `requestStarted` false, which is what a run
1058
+ over several accounts reports as skipped rather than failed; every other error,
1059
+ `PreuseError` or not, is treated as a request that may have consumed tokens.
1060
+ `preuseAccounts(harness, accounts, options, report)` is that run: it sends one
1061
+ prompt per account in turn, reports a `started` and a `finished` event for each,
1062
+ reads the account's reset schedule after a completed prompt, stops before the
1063
+ next account once the signal aborts, and returns the per-account results with
1064
+ their counts.
977
1065
 
978
1066
  Adapters can also return an optional `IHarnessAccountStatus.summary` with a
979
1067
  subscription plan and its live/stored provenance, labelled usage windows with
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@modelprofile.com/authswitch',
6
- version: '6.1.0',
6
+ version: '6.3.0',
7
7
  description: 'Manage Codex, OpenCode and Claude Code accounts with guided switching and live usage status'
8
8
  }