@modelprofile.com/authswitch 3.3.0 → 4.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 +42 -15
- package/dist_ts/accounts.js +98 -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 +59 -1
- package/dist_ts/classes.claudecodeharness.js +130 -14
- package/dist_ts/classes.claudecodelocks.d.ts +35 -0
- package/dist_ts/classes.claudecodelocks.js +117 -0
- package/dist_ts/classes.claudestatus.d.ts +15 -2
- package/dist_ts/classes.claudestatus.js +88 -73
- 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 +125 -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 +2 -1
- package/dist_ts/classes.codexstatus.js +25 -9
- package/dist_ts/classes.credentialstore.d.ts +28 -2
- package/dist_ts/classes.credentialstore.js +41 -12
- package/dist_ts/classes.fileharness.d.ts +37 -17
- package/dist_ts/classes.fileharness.js +58 -24
- 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 +7 -3
- 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 +315 -110
- package/ts/00_commitinfo_data.ts +3 -3
- package/ts/accounts.ts +109 -34
- package/ts/classes.accountlist.ts +2 -219
- package/ts/classes.claudecodeharness.ts +125 -12
- package/ts/classes.claudecodelocks.ts +132 -0
- package/ts/classes.claudestatus.ts +87 -54
- package/ts/classes.claudetokenrefresh.ts +85 -0
- package/ts/classes.cli.ts +112 -53
- package/ts/classes.codexharness.ts +4 -0
- package/ts/classes.codexstatus.ts +17 -7
- package/ts/classes.credentialstore.ts +53 -9
- package/ts/classes.fileharness.ts +67 -29
- 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 +6 -2
- 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
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { IHarnessUsageWindow } from './interfaces.harness.js';
|
|
2
|
+
/** What a watch knows about one account of a harness when it decides. */
|
|
3
|
+
export interface IWatchReading {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
/** Only a saved account can be switched to. */
|
|
7
|
+
isSaved: boolean;
|
|
8
|
+
/** The provider's usage windows from a reading recent enough to act on; null while the usage is unknown. */
|
|
9
|
+
windows: readonly IHarnessUsageWindow[] | null;
|
|
10
|
+
/** Why the usage is unknown, for a decision that depends on it. */
|
|
11
|
+
unknownReason?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface IWatchPolicyInput {
|
|
14
|
+
activeId: string | null;
|
|
15
|
+
readings: readonly IWatchReading[];
|
|
16
|
+
/** The used percentage at which a window counts as used up. */
|
|
17
|
+
threshold: number;
|
|
18
|
+
/** A used-up account is traded for another used-up one only when that one is usable again more than this much sooner. */
|
|
19
|
+
intervalMs: number;
|
|
20
|
+
now: number;
|
|
21
|
+
}
|
|
22
|
+
/** `ok` says whether the active account is fine; a stay that is not ok still has nothing better to switch to. */
|
|
23
|
+
export type TWatchDecision = {
|
|
24
|
+
action: 'stay';
|
|
25
|
+
ok: boolean;
|
|
26
|
+
reason: string;
|
|
27
|
+
} | {
|
|
28
|
+
action: 'switch';
|
|
29
|
+
target: string;
|
|
30
|
+
reason: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Which account a harness should use, from one set of readings. Pure: the same input always decides the same.
|
|
34
|
+
*
|
|
35
|
+
* - The active account is used up when any of its account windows is at or above the threshold. The watch then
|
|
36
|
+
* switches to the saved account whose account windows are all at least `WATCH_HYSTERESIS` points below it,
|
|
37
|
+
* preferring the one whose longest window resets soonest, then the least used, then by label.
|
|
38
|
+
* - When no account qualifies and every other saved account with a known reading is used up too, it switches to the
|
|
39
|
+
* one that is usable again first, and only when that is more than one interval sooner than the active account.
|
|
40
|
+
* - An active account limited only on a feature window (one model) switches to an account that is below the margin on
|
|
41
|
+
* every window; without one it stays, because the active account still serves everything else.
|
|
42
|
+
* - A reading that is unknown, whatever the cause, never counts as used up and never makes an account a target.
|
|
43
|
+
*/
|
|
44
|
+
export declare const decideWatchAction: (inputArg: IWatchPolicyInput) => TWatchDecision;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { compactUntil, usagePercentText } from './accounts.js';
|
|
2
|
+
import { plainText } from './formatting.js';
|
|
3
|
+
/**
|
|
4
|
+
* How far below the threshold a switch target must be on every limit, so that a switch never lands on an account that
|
|
5
|
+
* is about to reach it and the watch never flips back and forth.
|
|
6
|
+
*/
|
|
7
|
+
const WATCH_HYSTERESIS = 10;
|
|
8
|
+
const accountWindows = (readingArg) => (readingArg.windows ?? []).filter(window => window.scope !== 'feature');
|
|
9
|
+
const featureWindows = (readingArg) => (readingArg.windows ?? []).filter(window => window.scope === 'feature');
|
|
10
|
+
/** The fullest of the windows at or above the threshold (the longer one on a tie), which names why an account is limited. */
|
|
11
|
+
const fullest = (windowsArg, thresholdArg) => windowsArg.filter(window => window.usedPercent >= thresholdArg)
|
|
12
|
+
.sort((left, right) => right.usedPercent - left.usedPercent || right.durationSeconds - left.durationSeconds)[0];
|
|
13
|
+
const limitText = (windowArg, thresholdArg) => `${plainText(windowArg.label)} ${usagePercentText(windowArg.usedPercent)} ≥ ${thresholdArg}%`;
|
|
14
|
+
/** When a window resets; one without a known reset never does. */
|
|
15
|
+
const resetTime = (windowArg) => {
|
|
16
|
+
const time = windowArg.resetAt === null ? Number.NaN : Date.parse(windowArg.resetAt);
|
|
17
|
+
return Number.isFinite(time) ? time : Number.POSITIVE_INFINITY;
|
|
18
|
+
};
|
|
19
|
+
/** When every one of the account's used-up windows has reset. */
|
|
20
|
+
const usableAt = (readingArg, thresholdArg) => Math.max(...accountWindows(readingArg).filter(window => window.usedPercent >= thresholdArg).map(resetTime));
|
|
21
|
+
/** The reset of the account's longest window: capacity that expires first is used first. */
|
|
22
|
+
const longestWindowReset = (readingArg) => {
|
|
23
|
+
const windows = accountWindows(readingArg);
|
|
24
|
+
const longest = Math.max(...windows.map(window => window.durationSeconds));
|
|
25
|
+
return Math.min(...windows.filter(window => window.durationSeconds === longest).map(resetTime));
|
|
26
|
+
};
|
|
27
|
+
const peakUsage = (readingArg) => Math.max(...accountWindows(readingArg).map(window => window.usedPercent));
|
|
28
|
+
/** Numbers that are both unbounded compare as equal, so the next key decides. */
|
|
29
|
+
const ascending = (leftArg, rightArg) => leftArg === rightArg ? 0 : leftArg < rightArg ? -1 : 1;
|
|
30
|
+
const byLabel = (leftArg, rightArg) => leftArg.label.localeCompare(rightArg.label) || leftArg.id.localeCompare(rightArg.id);
|
|
31
|
+
const byPreference = (leftArg, rightArg) => ascending(longestWindowReset(leftArg), longestWindowReset(rightArg)) || ascending(peakUsage(leftArg), peakUsage(rightArg)) || byLabel(leftArg, rightArg);
|
|
32
|
+
/**
|
|
33
|
+
* Which account a harness should use, from one set of readings. Pure: the same input always decides the same.
|
|
34
|
+
*
|
|
35
|
+
* - The active account is used up when any of its account windows is at or above the threshold. The watch then
|
|
36
|
+
* switches to the saved account whose account windows are all at least `WATCH_HYSTERESIS` points below it,
|
|
37
|
+
* preferring the one whose longest window resets soonest, then the least used, then by label.
|
|
38
|
+
* - When no account qualifies and every other saved account with a known reading is used up too, it switches to the
|
|
39
|
+
* one that is usable again first, and only when that is more than one interval sooner than the active account.
|
|
40
|
+
* - An active account limited only on a feature window (one model) switches to an account that is below the margin on
|
|
41
|
+
* every window; without one it stays, because the active account still serves everything else.
|
|
42
|
+
* - A reading that is unknown, whatever the cause, never counts as used up and never makes an account a target.
|
|
43
|
+
*/
|
|
44
|
+
export const decideWatchAction = (inputArg) => {
|
|
45
|
+
const { threshold } = inputArg;
|
|
46
|
+
const stay = (okArg, reasonArg) => ({ action: 'stay', ok: okArg, reason: reasonArg });
|
|
47
|
+
const active = inputArg.readings.find(reading => reading.id === inputArg.activeId);
|
|
48
|
+
if (!active)
|
|
49
|
+
return stay(false, 'no active login');
|
|
50
|
+
if (active.windows === null)
|
|
51
|
+
return stay(false, `usage unknown${active.unknownReason ? ` (${active.unknownReason})` : ''}`);
|
|
52
|
+
const margin = threshold - WATCH_HYSTERESIS;
|
|
53
|
+
const known = inputArg.readings.filter(reading => reading.id !== active.id && reading.isSaved && reading.windows !== null);
|
|
54
|
+
const below = (windowsArg) => windowsArg.every(window => window.usedPercent < margin);
|
|
55
|
+
const best = (candidatesArg) => candidatesArg.sort(byPreference)[0];
|
|
56
|
+
const usedUp = fullest(accountWindows(active), threshold);
|
|
57
|
+
if (usedUp) {
|
|
58
|
+
const limit = limitText(usedUp, threshold);
|
|
59
|
+
const target = best(known.filter(reading => accountWindows(reading).length > 0 && below(accountWindows(reading))));
|
|
60
|
+
if (target)
|
|
61
|
+
return { action: 'switch', target: target.id, reason: limit };
|
|
62
|
+
const exhausted = known.filter(reading => fullest(accountWindows(reading), threshold) !== undefined);
|
|
63
|
+
if (!exhausted.length || exhausted.length < known.length)
|
|
64
|
+
return stay(false, `${limit}; no other saved account is known to be below ${margin}%`);
|
|
65
|
+
const soonest = exhausted.map(reading => ({ reading, at: usableAt(reading, threshold) }))
|
|
66
|
+
.sort((left, right) => ascending(left.at, right.at) || byLabel(left.reading, right.reading))[0];
|
|
67
|
+
if (soonest.at < usableAt(active, threshold) - inputArg.intervalMs) {
|
|
68
|
+
return { action: 'switch', target: soonest.reading.id, reason: `${limit}; every saved account is used up, and ${plainText(soonest.reading.label)} is usable again first (in ${compactUntil(new Date(soonest.at).toISOString(), inputArg.now)})` };
|
|
69
|
+
}
|
|
70
|
+
return stay(false, `${limit}; every saved account is used up, and none is usable again sooner`);
|
|
71
|
+
}
|
|
72
|
+
const featureLimit = fullest(featureWindows(active), threshold);
|
|
73
|
+
if (featureLimit) {
|
|
74
|
+
const limit = limitText(featureLimit, threshold);
|
|
75
|
+
const target = best(known.filter(reading => accountWindows(reading).length > 0 && below(reading.windows)));
|
|
76
|
+
if (target)
|
|
77
|
+
return { action: 'switch', target: target.id, reason: limit };
|
|
78
|
+
return stay(false, `${limit}; no other saved account is known to be below ${margin}% on every limit`);
|
|
79
|
+
}
|
|
80
|
+
return stay(true, `every limit below ${threshold}%`);
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hwb2xpY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy93YXRjaHBvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQThCNUM7OztHQUdHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFFNUIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxVQUF5QixFQUF5QixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUM7QUFDckosTUFBTSxjQUFjLEdBQUcsQ0FBQyxVQUF5QixFQUF5QixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUM7QUFFckosNkhBQTZIO0FBQzdILE1BQU0sT0FBTyxHQUFHLENBQUMsVUFBMEMsRUFBRSxZQUFvQixFQUFtQyxFQUFFLENBQ3BILFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLFlBQVksQ0FBQztLQUM1RCxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFcEgsTUFBTSxTQUFTLEdBQUcsQ0FBQyxTQUE4QixFQUFFLFlBQW9CLEVBQVUs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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@modelprofile.com/authswitch",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.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",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"authswitch": "./cli.js"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@git.zone/tsbuild": "^4.
|
|
26
|
+
"@git.zone/tsbuild": "^4.5.0",
|
|
27
27
|
"@git.zone/tsrun": "^2.0.6",
|
|
28
28
|
"@git.zone/tstest": "^6.1.1",
|
|
29
29
|
"@types/node": "26.5.1"
|
|
@@ -31,7 +31,9 @@
|
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@modelprofile.com/flexharness-models": "^7.0.1",
|
|
33
33
|
"@modelprofile.com/flexharness-providers": "^7.0.1",
|
|
34
|
-
"@push.rocks/smartconsole": "^1.3.0"
|
|
34
|
+
"@push.rocks/smartconsole": "^1.3.0",
|
|
35
|
+
"@types/proper-lockfile": "^4.1.4",
|
|
36
|
+
"proper-lockfile": "^4.1.2"
|
|
35
37
|
},
|
|
36
38
|
"files": [
|
|
37
39
|
"ts/**/*",
|