codex-multi-auth 2.1.7 → 2.1.8
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/README.md +3 -2
- package/dist/lib/accounts.d.ts +17 -3
- package/dist/lib/accounts.d.ts.map +1 -1
- package/dist/lib/accounts.js +76 -2
- package/dist/lib/accounts.js.map +1 -1
- package/dist/lib/codex-manager/commands/best.d.ts +3 -0
- package/dist/lib/codex-manager/commands/best.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/best.js +6 -1
- package/dist/lib/codex-manager/commands/best.js.map +1 -1
- package/dist/lib/codex-manager/commands/status.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/status.js +14 -0
- package/dist/lib/codex-manager/commands/status.js.map +1 -1
- package/dist/lib/codex-manager/commands/switch.d.ts +5 -1
- package/dist/lib/codex-manager/commands/switch.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/switch.js +4 -2
- package/dist/lib/codex-manager/commands/switch.js.map +1 -1
- package/dist/lib/codex-manager/commands/unpin.d.ts +13 -0
- package/dist/lib/codex-manager/commands/unpin.d.ts.map +1 -0
- package/dist/lib/codex-manager/commands/unpin.js +35 -0
- package/dist/lib/codex-manager/commands/unpin.js.map +1 -0
- package/dist/lib/codex-manager/help.d.ts.map +1 -1
- package/dist/lib/codex-manager/help.js +3 -2
- package/dist/lib/codex-manager/help.js.map +1 -1
- package/dist/lib/codex-manager.d.ts.map +1 -1
- package/dist/lib/codex-manager.js +31 -2
- package/dist/lib/codex-manager.js.map +1 -1
- package/dist/lib/routing-mutex.d.ts +1 -1
- package/dist/lib/routing-mutex.d.ts.map +1 -1
- package/dist/lib/runtime-rotation-proxy.d.ts +49 -1
- package/dist/lib/runtime-rotation-proxy.d.ts.map +1 -1
- package/dist/lib/runtime-rotation-proxy.js +169 -5
- package/dist/lib/runtime-rotation-proxy.js.map +1 -1
- package/dist/lib/schemas.d.ts +25 -0
- package/dist/lib/schemas.d.ts.map +1 -1
- package/dist/lib/schemas.js +14 -0
- package/dist/lib/schemas.js.map +1 -1
- package/dist/lib/session-affinity.d.ts +7 -0
- package/dist/lib/session-affinity.d.ts.map +1 -1
- package/dist/lib/session-affinity.js +11 -0
- package/dist/lib/session-affinity.js.map +1 -1
- package/dist/lib/storage/migrations.d.ts +18 -2
- package/dist/lib/storage/migrations.d.ts.map +1 -1
- package/dist/lib/storage/migrations.js.map +1 -1
- package/dist/lib/storage.d.ts +25 -0
- package/dist/lib/storage.d.ts.map +1 -1
- package/dist/lib/storage.js +106 -2
- package/dist/lib/storage.js.map +1 -1
- package/package.json +1 -1
|
@@ -30,12 +30,14 @@ export async function runSwitchCommand(args, deps) {
|
|
|
30
30
|
storage,
|
|
31
31
|
targetIndex,
|
|
32
32
|
parsed,
|
|
33
|
-
switchReason: "
|
|
33
|
+
switchReason: "manual",
|
|
34
|
+
setPin: true,
|
|
35
|
+
bumpAffinityGeneration: true,
|
|
34
36
|
});
|
|
35
37
|
if (!synced) {
|
|
36
38
|
(deps.logWarn ?? console.warn)(`Switched account ${parsed} locally, but Codex auth sync did not complete. Multi-auth routing will still use this account.`);
|
|
37
39
|
}
|
|
38
|
-
(deps.logInfo ?? console.log)(`Switched to account ${parsed}: ${formatAccountLabel(account, targetIndex)}${wasDisabled ? " (re-enabled)" : ""}`);
|
|
40
|
+
(deps.logInfo ?? console.log)(`Switched to account ${parsed}: ${formatAccountLabel(account, targetIndex)}${wasDisabled ? " (re-enabled)" : ""} (pinned for runtime routing)`);
|
|
39
41
|
return 0;
|
|
40
42
|
}
|
|
41
43
|
//# sourceMappingURL=switch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch.js","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/switch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"switch.js","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/switch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAyBvD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,IAAc,EACd,IAAuB;IAEvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAC/B,uDAAuD,CACvD,CAAC;QACF,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC1C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,yBAAyB,CAAC,CAAC;QAC5D,OAAO,CAAC,CAAC;IACV,CAAC;IAED,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC/D,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAC/B,sCAAsC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAC/D,CAAC;QACF,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,MAAM,aAAa,CAAC,CAAC;QACjE,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAAC;QACxE,OAAO;QACP,WAAW;QACX,MAAM;QACN,YAAY,EAAE,QAAQ;QACtB,MAAM,EAAE,IAAI;QACZ,sBAAsB,EAAE,IAAI;KAC5B,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAC7B,oBAAoB,MAAM,iGAAiG,CAC3H,CAAC;IACH,CAAC;IAED,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAC5B,uBAAuB,MAAM,KAAK,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,+BAA+B,CAC9I,CAAC;IACF,OAAO,CAAC,CAAC;AACV,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type AccountStorageV3 } from "../../storage.js";
|
|
2
|
+
type LoadedStorage = AccountStorageV3 | null;
|
|
3
|
+
export interface UnpinCommandDeps {
|
|
4
|
+
setStoragePath: (path: string | null) => void;
|
|
5
|
+
loadAccounts: () => Promise<LoadedStorage>;
|
|
6
|
+
saveAccounts: (storage: AccountStorageV3) => Promise<void>;
|
|
7
|
+
getStoragePath?: () => string;
|
|
8
|
+
logError?: (message: string) => void;
|
|
9
|
+
logInfo?: (message: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function runUnpinCommand(deps: UnpinCommandDeps): Promise<number>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=unpin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unpin.d.ts","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/unpin.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,gBAAgB,EACrB,MAAM,kBAAkB,CAAC;AAG1B,KAAK,aAAa,GAAG,gBAAgB,GAAG,IAAI,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAChC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,YAAY,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3C,YAAY,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,cAAc,CAAC,EAAE,MAAM,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,wBAAsB,eAAe,CACpC,IAAI,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CAqCjB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { readAffinityGenerationFromDisk, } from "../../storage.js";
|
|
2
|
+
import { saveAccountsWithRetry } from "../forecast-report-shared.js";
|
|
3
|
+
export async function runUnpinCommand(deps) {
|
|
4
|
+
deps.setStoragePath(null);
|
|
5
|
+
const logError = deps.logError ?? console.error;
|
|
6
|
+
const logInfo = deps.logInfo ?? console.log;
|
|
7
|
+
const storage = await deps.loadAccounts();
|
|
8
|
+
if (!storage || storage.accounts.length === 0) {
|
|
9
|
+
logError("No accounts configured.");
|
|
10
|
+
return 1;
|
|
11
|
+
}
|
|
12
|
+
if (storage.pinnedAccountIndex === undefined) {
|
|
13
|
+
logInfo("No pin to clear.");
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
const previousPin = storage.pinnedAccountIndex;
|
|
17
|
+
delete storage.pinnedAccountIndex;
|
|
18
|
+
// Re-read the on-disk affinityGeneration just before saving so concurrent
|
|
19
|
+
// CLI processes don't lose increments via lost-update on the load+mutate
|
|
20
|
+
// pair. The save itself is serialized by withStorageLock, but the load
|
|
21
|
+
// happens earlier and another process may have bumped the counter in the
|
|
22
|
+
// meantime. Math.max keeps the counter monotonically increasing — extra
|
|
23
|
+
// bumps are harmless (just an additional affinity invalidation), but a
|
|
24
|
+
// missed bump can let the proxy cling to the wrong account.
|
|
25
|
+
const diskGeneration = deps.getStoragePath
|
|
26
|
+
? readAffinityGenerationFromDisk(deps.getStoragePath())
|
|
27
|
+
: 0;
|
|
28
|
+
const inMemoryGeneration = storage.affinityGeneration ?? 0;
|
|
29
|
+
storage.affinityGeneration =
|
|
30
|
+
Math.max(inMemoryGeneration, diskGeneration) + 1;
|
|
31
|
+
await saveAccountsWithRetry(storage, deps.saveAccounts);
|
|
32
|
+
logInfo(`Cleared manual pin (was account ${previousPin + 1}). Runtime routing will resume hybrid rotation.`);
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=unpin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unpin.js","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/unpin.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,8BAA8B,GAE9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAarE,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,IAAsB;IAEtB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC;IAE5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC1C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,QAAQ,CAAC,yBAAyB,CAAC,CAAC;QACpC,OAAO,CAAC,CAAC;IACV,CAAC;IAED,IAAI,OAAO,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC5B,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAC/C,OAAO,OAAO,CAAC,kBAAkB,CAAC;IAClC,0EAA0E;IAC1E,yEAAyE;IACzE,uEAAuE;IACvE,yEAAyE;IACzE,wEAAwE;IACxE,uEAAuE;IACvE,4DAA4D;IAC5D,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc;QACzC,CAAC,CAAC,8BAA8B,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACvD,CAAC,CAAC,CAAC,CAAC;IACL,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,CAAC,CAAC;IAC3D,OAAO,CAAC,kBAAkB;QACzB,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAExD,OAAO,CACN,mCAAmC,WAAW,GAAG,CAAC,iDAAiD,CACnG,CAAC;IACF,OAAO,CAAC,CAAC;AACV,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,IAAI,IAAI,
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,IAAI,IAAI,CAgDjC;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAwCtE;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,cAAc,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,wBAAgB,cAAc,IAAI,IAAI,CAgBrC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CAyD5D"}
|
|
@@ -9,8 +9,9 @@ export function printUsage() {
|
|
|
9
9
|
"",
|
|
10
10
|
"Daily use:",
|
|
11
11
|
" codex-multi-auth list",
|
|
12
|
-
" codex-multi-auth switch <index>",
|
|
13
|
-
" codex-multi-auth
|
|
12
|
+
" codex-multi-auth switch <index> (pins the account for runtime routing)",
|
|
13
|
+
" codex-multi-auth unpin (clears the manual pin set by switch)",
|
|
14
|
+
" codex-multi-auth best [--live] [--json] [--model <model>] (clears any manual pin set by switch)",
|
|
14
15
|
" codex-multi-auth forecast [--live] [--json] [--model <model>]",
|
|
15
16
|
" codex-multi-auth account tag|untag|weight|pause|unpause|drain|undrain|note ...",
|
|
16
17
|
"",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU;IACzB,OAAO,CAAC,GAAG,CACV;QACC,sBAAsB;QACtB,EAAE;QACF,aAAa;QACb,gEAAgE;QAChE,2BAA2B;QAC3B,0BAA0B;QAC1B,EAAE;QACF,YAAY;QACZ,yBAAyB;QACzB,
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-manager.d.ts","sourceRoot":"","sources":["../../lib/codex-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"codex-manager.d.ts","sourceRoot":"","sources":["../../lib/codex-manager.ts"],"names":[],"mappings":"AA+8CA,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ3D;AA+xDD,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC,CAuGrE;AAuCD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsO7E"}
|
|
@@ -32,6 +32,7 @@ import { runRotationCommand } from "./codex-manager/commands/rotation.js";
|
|
|
32
32
|
import { runFeaturesCommand, runStatusCommand, } from "./codex-manager/commands/status.js";
|
|
33
33
|
import { loadPersistedRuntimeObservabilitySnapshot } from "./runtime/runtime-observability.js";
|
|
34
34
|
import { runSwitchCommand } from "./codex-manager/commands/switch.js";
|
|
35
|
+
import { runUnpinCommand } from "./codex-manager/commands/unpin.js";
|
|
35
36
|
import { runUsageCommand } from "./codex-manager/commands/usage.js";
|
|
36
37
|
import { parseAuthLoginArgs, printUsage } from "./codex-manager/help.js";
|
|
37
38
|
import { applyUiThemeFromDashboardSettings, configureUnifiedSettings, resolveMenuLayoutMode, } from "./codex-manager/settings-hub.js";
|
|
@@ -49,7 +50,7 @@ import { loadQuotaCache, saveQuotaCache, } from "./quota-cache.js";
|
|
|
49
50
|
import { isDisplayCurrentAccount, readAppRuntimeHelperAccountSignal, resolveAccountCurrentMarkers, resolveRuntimeCurrentAccount, } from "./runtime/runtime-current-account.js";
|
|
50
51
|
import { fetchCodexQuotaSnapshot, formatQuotaSnapshotLine, } from "./quota-probe.js";
|
|
51
52
|
import { queuedRefresh } from "./refresh-queue.js";
|
|
52
|
-
import { clearAccounts, findMatchingAccountIndex, formatStorageErrorHint, inspectStorageHealth, getLastAccountsSaveTimestamp, getNamedBackups, getStoragePath, loadAccounts, loadFlaggedAccounts, restoreAccountsFromBackup, StorageError, saveAccounts, setStoragePath, withAccountStorageTransaction, } from "./storage.js";
|
|
53
|
+
import { clearAccounts, findMatchingAccountIndex, formatStorageErrorHint, inspectStorageHealth, getLastAccountsSaveTimestamp, getNamedBackups, getStoragePath, loadAccounts, loadFlaggedAccounts, readAffinityGenerationFromDisk, restoreAccountsFromBackup, StorageError, saveAccounts, setStoragePath, withAccountStorageTransaction, } from "./storage.js";
|
|
53
54
|
import { ANSI } from "./ui/ansi.js";
|
|
54
55
|
import { confirm } from "./ui/confirm.js";
|
|
55
56
|
import { UI_COPY } from "./ui/copy.js";
|
|
@@ -62,6 +63,7 @@ const ACCOUNT_MANAGER_COMMANDS = new Set([
|
|
|
62
63
|
"list",
|
|
63
64
|
"status",
|
|
64
65
|
"switch",
|
|
66
|
+
"unpin",
|
|
65
67
|
"best",
|
|
66
68
|
"check",
|
|
67
69
|
"features",
|
|
@@ -2344,7 +2346,7 @@ async function runAuthLogin(args) {
|
|
|
2344
2346
|
}
|
|
2345
2347
|
}
|
|
2346
2348
|
}
|
|
2347
|
-
async function persistAndSyncSelectedAccount({ storage, targetIndex, parsed, switchReason, initialSyncIdToken, preserveActiveIndexByFamily = false, }) {
|
|
2349
|
+
async function persistAndSyncSelectedAccount({ storage, targetIndex, parsed, switchReason, initialSyncIdToken, preserveActiveIndexByFamily = false, setPin = false, clearPin = false, bumpAffinityGeneration = false, }) {
|
|
2348
2350
|
const account = storage.accounts[targetIndex];
|
|
2349
2351
|
if (!account) {
|
|
2350
2352
|
throw new Error(`Account ${parsed} not found.`);
|
|
@@ -2406,6 +2408,25 @@ async function persistAndSyncSelectedAccount({ storage, targetIndex, parsed, swi
|
|
|
2406
2408
|
}
|
|
2407
2409
|
account.lastUsed = switchNow;
|
|
2408
2410
|
account.lastSwitchReason = switchReason;
|
|
2411
|
+
if (setPin) {
|
|
2412
|
+
storage.pinnedAccountIndex = targetIndex;
|
|
2413
|
+
}
|
|
2414
|
+
else if (clearPin) {
|
|
2415
|
+
delete storage.pinnedAccountIndex;
|
|
2416
|
+
}
|
|
2417
|
+
if (bumpAffinityGeneration) {
|
|
2418
|
+
// Re-read the on-disk generation right before saving so concurrent CLI
|
|
2419
|
+
// processes don't lose increments via lost-update on the load+mutate
|
|
2420
|
+
// pair. Math.max keeps the counter monotonically increasing — extra
|
|
2421
|
+
// bumps are harmless (just an additional affinity invalidation), but a
|
|
2422
|
+
// missed bump can let the proxy cling to the wrong account. The save
|
|
2423
|
+
// itself is serialized by withStorageLock; this only narrows the
|
|
2424
|
+
// lost-update window. See issue #474.
|
|
2425
|
+
const diskGeneration = readAffinityGenerationFromDisk(getStoragePath());
|
|
2426
|
+
const inMemoryGeneration = storage.affinityGeneration ?? 0;
|
|
2427
|
+
storage.affinityGeneration =
|
|
2428
|
+
Math.max(inMemoryGeneration, diskGeneration) + 1;
|
|
2429
|
+
}
|
|
2409
2430
|
await saveAccountsWithRetry(storage, saveAccounts);
|
|
2410
2431
|
const synced = await setCodexCliActiveSelection({
|
|
2411
2432
|
accountId: account.accountId,
|
|
@@ -2616,6 +2637,14 @@ export async function runCodexMultiAuthCli(rawArgs) {
|
|
|
2616
2637
|
persistAndSyncSelectedAccount,
|
|
2617
2638
|
});
|
|
2618
2639
|
}
|
|
2640
|
+
if (command === "unpin") {
|
|
2641
|
+
return runUnpinCommand({
|
|
2642
|
+
setStoragePath,
|
|
2643
|
+
loadAccounts,
|
|
2644
|
+
saveAccounts,
|
|
2645
|
+
getStoragePath,
|
|
2646
|
+
});
|
|
2647
|
+
}
|
|
2619
2648
|
if (command === "check") {
|
|
2620
2649
|
return runCheckCommand({ runHealthCheck });
|
|
2621
2650
|
}
|