oc-codex-multi-auth 6.8.0 → 6.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/accounts/persistence.d.ts +10 -0
- package/dist/lib/accounts/persistence.d.ts.map +1 -1
- package/dist/lib/accounts/persistence.js +69 -2
- package/dist/lib/accounts/persistence.js.map +1 -1
- package/dist/lib/accounts/state.d.ts +2 -0
- package/dist/lib/accounts/state.d.ts.map +1 -1
- package/dist/lib/accounts/state.js +10 -0
- package/dist/lib/accounts/state.js.map +1 -1
- package/dist/lib/auth/login-runner.d.ts +1 -0
- package/dist/lib/auth/login-runner.d.ts.map +1 -1
- package/dist/lib/auth/login-runner.js +8 -0
- package/dist/lib/auth/login-runner.js.map +1 -1
- package/dist/lib/codex-reset.d.ts +12 -2
- package/dist/lib/codex-reset.d.ts.map +1 -1
- package/dist/lib/codex-reset.js +21 -4
- package/dist/lib/codex-reset.js.map +1 -1
- package/dist/lib/proactive-refresh.d.ts.map +1 -1
- package/dist/lib/proactive-refresh.js +6 -4
- package/dist/lib/proactive-refresh.js.map +1 -1
- package/dist/lib/refresh-queue.d.ts +9 -0
- package/dist/lib/refresh-queue.d.ts.map +1 -1
- package/dist/lib/refresh-queue.js +29 -0
- package/dist/lib/refresh-queue.js.map +1 -1
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
- package/dist/lib/request/fetch-helpers.js +41 -3
- package/dist/lib/request/fetch-helpers.js.map +1 -1
- package/dist/lib/request/helpers/user-agent.d.ts +9 -0
- package/dist/lib/request/helpers/user-agent.d.ts.map +1 -0
- package/dist/lib/request/helpers/user-agent.js +40 -0
- package/dist/lib/request/helpers/user-agent.js.map +1 -0
- package/dist/lib/request/request-transformer.d.ts +10 -0
- package/dist/lib/request/request-transformer.d.ts.map +1 -1
- package/dist/lib/request/request-transformer.js +20 -0
- package/dist/lib/request/request-transformer.js.map +1 -1
- package/dist/lib/request/response-handler.d.ts.map +1 -1
- package/dist/lib/request/response-handler.js +28 -5
- package/dist/lib/request/response-handler.js.map +1 -1
- package/dist/lib/schemas.d.ts +3 -0
- package/dist/lib/schemas.d.ts.map +1 -1
- package/dist/lib/schemas.js +1 -0
- package/dist/lib/schemas.js.map +1 -1
- package/dist/lib/storage/migrations.d.ts +7 -0
- 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 +1 -1
- package/dist/lib/storage.d.ts.map +1 -1
- package/dist/lib/storage.js +10 -1
- package/dist/lib/storage.js.map +1 -1
- package/dist/lib/tools/codex-keychain.d.ts.map +1 -1
- package/dist/lib/tools/codex-keychain.js +153 -77
- package/dist/lib/tools/codex-keychain.js.map +1 -1
- package/dist/lib/tools/codex-label.d.ts.map +1 -1
- package/dist/lib/tools/codex-label.js +60 -34
- package/dist/lib/tools/codex-label.js.map +1 -1
- package/dist/lib/tools/codex-refresh.d.ts.map +1 -1
- package/dist/lib/tools/codex-refresh.js +80 -5
- package/dist/lib/tools/codex-refresh.js.map +1 -1
- package/dist/lib/tools/codex-remove.d.ts.map +1 -1
- package/dist/lib/tools/codex-remove.js +85 -56
- package/dist/lib/tools/codex-remove.js.map +1 -1
- package/dist/lib/tools/codex-reset.d.ts.map +1 -1
- package/dist/lib/tools/codex-reset.js +34 -5
- package/dist/lib/tools/codex-reset.js.map +1 -1
- package/dist/lib/tools/codex-switch.d.ts.map +1 -1
- package/dist/lib/tools/codex-switch.js +57 -35
- package/dist/lib/tools/codex-switch.js.map +1 -1
- package/dist/lib/tui-quota-cache.d.ts +8 -0
- package/dist/lib/tui-quota-cache.d.ts.map +1 -1
- package/dist/lib/tui-quota-cache.js +13 -0
- package/dist/lib/tui-quota-cache.js.map +1 -1
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +17 -5
- package/dist/tui.js.map +1 -1
- package/package.json +153 -153
|
@@ -3,10 +3,38 @@
|
|
|
3
3
|
* Extracted from `index.ts` per RC-1 Phase 2.
|
|
4
4
|
*/
|
|
5
5
|
import { tool } from "@opencode-ai/plugin/tool";
|
|
6
|
-
import { loadAccounts,
|
|
6
|
+
import { loadAccounts, withAccountStorageTransaction } from "../storage.js";
|
|
7
7
|
import { AccountManager } from "../accounts.js";
|
|
8
8
|
import { queuedRefresh } from "../refresh-queue.js";
|
|
9
9
|
import { formatUiHeader, formatUiItem, paintUiText } from "../ui/format.js";
|
|
10
|
+
/**
|
|
11
|
+
* Finds the index of the account matching `identity` in `accounts`, using
|
|
12
|
+
* the same organizationId -> accountId -> refreshToken priority order the
|
|
13
|
+
* storage layer's dedup/identity helpers use elsewhere (see
|
|
14
|
+
* `lib/storage/identity.ts`). Kept local rather than importing the shared
|
|
15
|
+
* helper because the barrel does not currently re-export it.
|
|
16
|
+
*/
|
|
17
|
+
function findAccountIndexByIdentity(accounts, identity) {
|
|
18
|
+
const organizationId = identity.organizationId?.trim();
|
|
19
|
+
if (organizationId) {
|
|
20
|
+
const idx = accounts.findIndex((a) => a.organizationId?.trim() === organizationId);
|
|
21
|
+
if (idx >= 0)
|
|
22
|
+
return idx;
|
|
23
|
+
}
|
|
24
|
+
const accountId = identity.accountId?.trim();
|
|
25
|
+
if (accountId) {
|
|
26
|
+
const idx = accounts.findIndex((a) => a.accountId?.trim() === accountId);
|
|
27
|
+
if (idx >= 0)
|
|
28
|
+
return idx;
|
|
29
|
+
}
|
|
30
|
+
const refreshToken = identity.refreshToken?.trim();
|
|
31
|
+
if (refreshToken) {
|
|
32
|
+
const idx = accounts.findIndex((a) => a.refreshToken?.trim() === refreshToken);
|
|
33
|
+
if (idx >= 0)
|
|
34
|
+
return idx;
|
|
35
|
+
}
|
|
36
|
+
return -1;
|
|
37
|
+
}
|
|
10
38
|
export function createCodexRefreshTool(ctx) {
|
|
11
39
|
const { resolveUiRuntime, formatCommandAccountLabel, resolveMaskEmail, getStatusMarker, cachedAccountManagerRef, accountManagerPromiseRef, } = ctx;
|
|
12
40
|
return tool({
|
|
@@ -32,17 +60,36 @@ export function createCodexRefreshTool(ctx) {
|
|
|
32
60
|
: [`Refreshing ${storage.accounts.length} account(s):`, ""];
|
|
33
61
|
let refreshedCount = 0;
|
|
34
62
|
let failedCount = 0;
|
|
63
|
+
// Collected here, applied to a freshly re-read snapshot in a single
|
|
64
|
+
// transaction after all (network-bound, multi-second) refreshes
|
|
65
|
+
// complete -- see the module doc comment on RefreshOutcome. Holding
|
|
66
|
+
// the storage lock across queuedRefresh calls would block every
|
|
67
|
+
// other tool/rotation for the full duration of this loop, and
|
|
68
|
+
// mutating `storage` in place and saving it at the end (the old
|
|
69
|
+
// behavior) silently clobbered any rate-limit/cooldown/activeIndex
|
|
70
|
+
// state a concurrent rotation persisted while this loop was running.
|
|
71
|
+
const refreshedAccounts = [];
|
|
35
72
|
for (let i = 0; i < storage.accounts.length; i++) {
|
|
36
73
|
const account = storage.accounts[i];
|
|
37
74
|
if (!account)
|
|
38
75
|
continue;
|
|
39
76
|
const label = formatCommandAccountLabel(account, i, { maskEmail });
|
|
77
|
+
const identity = {
|
|
78
|
+
organizationId: account.organizationId,
|
|
79
|
+
accountId: account.accountId,
|
|
80
|
+
refreshToken: account.refreshToken,
|
|
81
|
+
};
|
|
40
82
|
try {
|
|
41
83
|
const refreshResult = await queuedRefresh(account.refreshToken);
|
|
42
84
|
if (refreshResult.type === "success") {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
85
|
+
const rotated = refreshResult.refresh !== account.refreshToken;
|
|
86
|
+
refreshedAccounts.push({
|
|
87
|
+
identity,
|
|
88
|
+
refreshToken: refreshResult.refresh,
|
|
89
|
+
accessToken: refreshResult.access,
|
|
90
|
+
expiresAt: refreshResult.expires,
|
|
91
|
+
rotatedAt: rotated ? Date.now() : undefined,
|
|
92
|
+
});
|
|
46
93
|
results.push(` ${getStatusMarker(ui, "ok")} ${label}: Refreshed`);
|
|
47
94
|
refreshedCount++;
|
|
48
95
|
}
|
|
@@ -57,7 +104,35 @@ export function createCodexRefreshTool(ctx) {
|
|
|
57
104
|
failedCount++;
|
|
58
105
|
}
|
|
59
106
|
}
|
|
60
|
-
|
|
107
|
+
if (refreshedAccounts.length > 0) {
|
|
108
|
+
await withAccountStorageTransaction(async (current, persist) => {
|
|
109
|
+
if (!current)
|
|
110
|
+
return;
|
|
111
|
+
for (const outcome of refreshedAccounts) {
|
|
112
|
+
const idx = findAccountIndexByIdentity(current.accounts, outcome.identity);
|
|
113
|
+
if (idx < 0)
|
|
114
|
+
continue; // Account removed concurrently; nothing to apply.
|
|
115
|
+
const target = current.accounts[idx];
|
|
116
|
+
if (!target)
|
|
117
|
+
continue;
|
|
118
|
+
// The refresh was keyed off `outcome.identity.refreshToken` (the
|
|
119
|
+
// pre-refresh value). If the on-disk refreshToken no longer
|
|
120
|
+
// matches it, another process rotated this account mid-flight
|
|
121
|
+
// while our (network-bound) refresh was in progress -- we
|
|
122
|
+
// cannot know which resulting chain is the live one, so skip
|
|
123
|
+
// rather than clobber whatever that other process wrote.
|
|
124
|
+
if (target.refreshToken !== outcome.identity.refreshToken)
|
|
125
|
+
continue;
|
|
126
|
+
target.refreshToken = outcome.refreshToken;
|
|
127
|
+
target.accessToken = outcome.accessToken;
|
|
128
|
+
target.expiresAt = outcome.expiresAt;
|
|
129
|
+
if (outcome.rotatedAt !== undefined) {
|
|
130
|
+
target.tokenRotatedAt = outcome.rotatedAt;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
await persist(current);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
61
136
|
if (cachedAccountManagerRef.current) {
|
|
62
137
|
const reloadedManager = await AccountManager.loadFromDisk();
|
|
63
138
|
cachedAccountManagerRef.current = reloadedManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-refresh.js","sourceRoot":"","sources":["../../../lib/tools/codex-refresh.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAuB,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"codex-refresh.js","sourceRoot":"","sources":["../../../lib/tools/codex-refresh.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-remove.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-remove.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAWrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"codex-remove.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-remove.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAWrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CA8RtE"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Extracted from `index.ts` per RC-1 Phase 2.
|
|
4
4
|
*/
|
|
5
5
|
import { tool } from "@opencode-ai/plugin/tool";
|
|
6
|
-
import { loadAccounts,
|
|
6
|
+
import { loadAccounts, withAccountStorageTransaction } from "../storage.js";
|
|
7
7
|
import { AccountManager } from "../accounts.js";
|
|
8
8
|
import { resolveDisplayEmail } from "../account-display.js";
|
|
9
9
|
import { logWarn } from "../logger.js";
|
|
@@ -43,8 +43,12 @@ export function createCodexRemoveTool(ctx) {
|
|
|
43
43
|
}
|
|
44
44
|
return guidance;
|
|
45
45
|
}
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
// Read-only snapshot for the "no accounts" / interactive-picker UX.
|
|
47
|
+
// The actual mutate+save runs inside withAccountStorageTransaction
|
|
48
|
+
// below against a freshly re-read snapshot so a concurrent save
|
|
49
|
+
// between this read and the eventual persist can't be clobbered.
|
|
50
|
+
const initialStorage = await loadAccounts();
|
|
51
|
+
if (!initialStorage || initialStorage.accounts.length === 0) {
|
|
48
52
|
if (ui.v2Enabled) {
|
|
49
53
|
return [
|
|
50
54
|
...formatUiHeader(ui, "Remove account"),
|
|
@@ -56,7 +60,7 @@ export function createCodexRemoveTool(ctx) {
|
|
|
56
60
|
}
|
|
57
61
|
let resolvedIndex = index;
|
|
58
62
|
if (resolvedIndex === undefined) {
|
|
59
|
-
const selectedIndex = await promptAccountIndexSelection(ui,
|
|
63
|
+
const selectedIndex = await promptAccountIndexSelection(ui, initialStorage, "Remove account");
|
|
60
64
|
if (selectedIndex === null) {
|
|
61
65
|
if (supportsInteractiveMenus()) {
|
|
62
66
|
if (ui.v2Enabled) {
|
|
@@ -81,81 +85,106 @@ export function createCodexRemoveTool(ctx) {
|
|
|
81
85
|
}
|
|
82
86
|
resolvedIndex = selectedIndex + 1;
|
|
83
87
|
}
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
targetIndex
|
|
88
|
+
const outcome = await withAccountStorageTransaction(async (current, persist) => {
|
|
89
|
+
const storage = current;
|
|
90
|
+
const accounts = storage?.accounts ?? [];
|
|
91
|
+
const targetIndex = (resolvedIndex ?? 0) - 1;
|
|
92
|
+
if (!Number.isInteger(targetIndex) ||
|
|
93
|
+
targetIndex < 0 ||
|
|
94
|
+
targetIndex >= accounts.length) {
|
|
95
|
+
return { kind: "invalid", accountCount: accounts.length };
|
|
96
|
+
}
|
|
97
|
+
const account = accounts[targetIndex];
|
|
98
|
+
if (!account || !storage) {
|
|
99
|
+
return { kind: "not-found" };
|
|
100
|
+
}
|
|
101
|
+
const label = formatCommandAccountLabel(account, targetIndex, {
|
|
102
|
+
maskEmail,
|
|
103
|
+
});
|
|
104
|
+
storage.accounts.splice(targetIndex, 1);
|
|
105
|
+
if (storage.accounts.length === 0) {
|
|
106
|
+
storage.activeIndex = 0;
|
|
107
|
+
storage.activeIndexByFamily = {};
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
if (storage.activeIndex >= storage.accounts.length) {
|
|
111
|
+
storage.activeIndex = 0;
|
|
112
|
+
}
|
|
113
|
+
else if (storage.activeIndex > targetIndex) {
|
|
114
|
+
storage.activeIndex -= 1;
|
|
115
|
+
}
|
|
116
|
+
if (storage.activeIndexByFamily) {
|
|
117
|
+
for (const family of MODEL_FAMILIES) {
|
|
118
|
+
const idx = storage.activeIndexByFamily[family];
|
|
119
|
+
if (typeof idx === "number") {
|
|
120
|
+
if (idx >= storage.accounts.length) {
|
|
121
|
+
storage.activeIndexByFamily[family] = 0;
|
|
122
|
+
}
|
|
123
|
+
else if (idx > targetIndex) {
|
|
124
|
+
storage.activeIndexByFamily[family] = idx - 1;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
await persist(storage);
|
|
132
|
+
}
|
|
133
|
+
catch (saveError) {
|
|
134
|
+
logWarn("Failed to save account removal", {
|
|
135
|
+
error: String(saveError),
|
|
136
|
+
});
|
|
137
|
+
return { kind: "save-failed", label };
|
|
138
|
+
}
|
|
139
|
+
const remaining = storage.accounts.length;
|
|
140
|
+
const matchingEmailRemaining = account.email?.trim()
|
|
141
|
+
? storage.accounts.filter((entry) => entry.email === account.email)
|
|
142
|
+
.length
|
|
143
|
+
: 0;
|
|
144
|
+
return {
|
|
145
|
+
kind: "ok",
|
|
146
|
+
label,
|
|
147
|
+
remaining,
|
|
148
|
+
matchingEmailRemaining,
|
|
149
|
+
removedEmail: account.email,
|
|
150
|
+
};
|
|
151
|
+
});
|
|
152
|
+
if (outcome.kind === "invalid") {
|
|
88
153
|
if (ui.v2Enabled) {
|
|
89
154
|
return [
|
|
90
155
|
...formatUiHeader(ui, "Remove account"),
|
|
91
156
|
"",
|
|
92
157
|
formatUiItem(ui, `Invalid account number: ${resolvedIndex}`, "danger"),
|
|
93
|
-
formatUiKeyValue(ui, "Valid range", `1-${
|
|
158
|
+
formatUiKeyValue(ui, "Valid range", `1-${outcome.accountCount}`, "muted"),
|
|
94
159
|
formatUiItem(ui, "Use codex-list to list all accounts.", "accent"),
|
|
95
160
|
].join("\n");
|
|
96
161
|
}
|
|
97
|
-
return `Invalid account number: ${resolvedIndex}\n\nValid range: 1-${
|
|
162
|
+
return `Invalid account number: ${resolvedIndex}\n\nValid range: 1-${outcome.accountCount}\n\nUse codex-list to list all accounts.`;
|
|
98
163
|
}
|
|
99
|
-
|
|
100
|
-
if (!account) {
|
|
164
|
+
if (outcome.kind === "not-found") {
|
|
101
165
|
return `Account ${resolvedIndex} not found.`;
|
|
102
166
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
if (storage.activeIndex >= storage.accounts.length) {
|
|
111
|
-
storage.activeIndex = 0;
|
|
112
|
-
}
|
|
113
|
-
else if (storage.activeIndex > targetIndex) {
|
|
114
|
-
storage.activeIndex -= 1;
|
|
115
|
-
}
|
|
116
|
-
if (storage.activeIndexByFamily) {
|
|
117
|
-
for (const family of MODEL_FAMILIES) {
|
|
118
|
-
const idx = storage.activeIndexByFamily[family];
|
|
119
|
-
if (typeof idx === "number") {
|
|
120
|
-
if (idx >= storage.accounts.length) {
|
|
121
|
-
storage.activeIndexByFamily[family] = 0;
|
|
122
|
-
}
|
|
123
|
-
else if (idx > targetIndex) {
|
|
124
|
-
storage.activeIndexByFamily[family] = idx - 1;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
try {
|
|
131
|
-
await saveAccounts(storage);
|
|
132
|
-
}
|
|
133
|
-
catch (saveError) {
|
|
134
|
-
logWarn("Failed to save account removal", {
|
|
135
|
-
error: String(saveError),
|
|
136
|
-
});
|
|
167
|
+
if (outcome.kind === "save-failed") {
|
|
168
|
+
// The transaction only mutated its in-memory snapshot; the
|
|
169
|
+
// persist() call that would have made the removal durable
|
|
170
|
+
// threw, so the account was never actually removed. Wording
|
|
171
|
+
// must not imply it was.
|
|
137
172
|
if (ui.v2Enabled) {
|
|
138
173
|
return [
|
|
139
174
|
...formatUiHeader(ui, "Remove account"),
|
|
140
175
|
"",
|
|
141
|
-
formatUiItem(ui, `
|
|
142
|
-
formatUiItem(ui, "Only the selected index was changed.", "muted"),
|
|
143
|
-
formatUiItem(ui, "Failed to persist. Change may be lost on restart.", "danger"),
|
|
176
|
+
formatUiItem(ui, `Failed to remove ${outcome.label}: account storage could not be updated.`, "danger"),
|
|
144
177
|
].join("\n");
|
|
145
178
|
}
|
|
146
|
-
return `
|
|
179
|
+
return `Failed to remove ${outcome.label}: account storage could not be updated.`;
|
|
147
180
|
}
|
|
148
181
|
if (cachedAccountManagerRef.current) {
|
|
149
182
|
const reloadedManager = await AccountManager.loadFromDisk();
|
|
150
183
|
cachedAccountManagerRef.current = reloadedManager;
|
|
151
184
|
accountManagerPromiseRef.current = Promise.resolve(reloadedManager);
|
|
152
185
|
}
|
|
153
|
-
const remaining =
|
|
154
|
-
const
|
|
155
|
-
? storage.accounts.filter((entry) => entry.email === account.email)
|
|
156
|
-
.length
|
|
157
|
-
: 0;
|
|
158
|
-
const displayEmail = resolveDisplayEmail(account.email, maskEmail);
|
|
186
|
+
const { label, remaining, matchingEmailRemaining, removedEmail } = outcome;
|
|
187
|
+
const displayEmail = resolveDisplayEmail(removedEmail, maskEmail);
|
|
159
188
|
if (ui.v2Enabled) {
|
|
160
189
|
const postRemoveHint = matchingEmailRemaining > 0 && displayEmail
|
|
161
190
|
? formatUiItem(ui, `Other entries for ${displayEmail} remain: ${matchingEmailRemaining}`, "muted")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-remove.js","sourceRoot":"","sources":["../../../lib/tools/codex-remove.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAuB,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"codex-remove.js","sourceRoot":"","sources":["../../../lib/tools/codex-remove.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-reset.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-reset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"codex-reset.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-reset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AA8BrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAqE9C,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CA0TrE"}
|
|
@@ -233,11 +233,40 @@ export function createCodexResetTool(ctx) {
|
|
|
233
233
|
: ' not redeemed. Re-run with confirm=true to redeem this credit.',
|
|
234
234
|
].join("\n");
|
|
235
235
|
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
236
|
+
let result;
|
|
237
|
+
try {
|
|
238
|
+
result = await consumeCodexResetCredit({
|
|
239
|
+
...request,
|
|
240
|
+
creditId: credit.id,
|
|
241
|
+
redeemRequestId: createRedeemRequestId(credit.id),
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
// The POST may have reached the backend before the failure
|
|
246
|
+
// (timeout, dropped response), so the redemption outcome is
|
|
247
|
+
// genuinely unknown — reporting `redeemed: false` here could
|
|
248
|
+
// send the user to spend a second credit. The idempotency key
|
|
249
|
+
// is derived from the credit id, so retrying the SAME credit
|
|
250
|
+
// is safe; the guidance below is about picking a different one.
|
|
251
|
+
const consumeError = (error instanceof Error ? error.message : String(error)).slice(0, 160);
|
|
252
|
+
if (outputFormat === "json") {
|
|
253
|
+
return renderJsonOutput({
|
|
254
|
+
...identity,
|
|
255
|
+
action: "consume",
|
|
256
|
+
redeemed: null,
|
|
257
|
+
reason: "consume-failed",
|
|
258
|
+
credit,
|
|
259
|
+
error: consumeError,
|
|
260
|
+
message: `The consume request failed but may have reached the backend. Run codex-reset (status) and check whether ${credit.id} is still available before redeeming another credit.`,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
return [
|
|
264
|
+
`${displayLabel}:`,
|
|
265
|
+
` Error: ${consumeError}`,
|
|
266
|
+
" redemption outcome unknown: the request may have reached the backend.",
|
|
267
|
+
` Run codex-reset (status) and check whether ${credit.id} is still available before redeeming another credit.`,
|
|
268
|
+
].join("\n");
|
|
269
|
+
}
|
|
241
270
|
// Past this point the credit is spent and cannot be recovered. The
|
|
242
271
|
// usage refresh below is a courtesy read, so its failure must never
|
|
243
272
|
// reach the outer catch: reporting `redeemed: false` for a credit the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-reset.js","sourceRoot":"","sources":["../../../lib/tools/codex-reset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,IAAI,EAAuB,MAAM,0BAA0B,CAAC;AAErE,OAAO,EACN,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,6BAA6B,EAC7B,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"codex-reset.js","sourceRoot":"","sources":["../../../lib/tools/codex-reset.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-switch.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-switch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAWrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"codex-switch.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-switch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAWrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAmMtE"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Extracted from `index.ts` per RC-1 Phase 2.
|
|
4
4
|
*/
|
|
5
5
|
import { tool } from "@opencode-ai/plugin/tool";
|
|
6
|
-
import { loadAccounts,
|
|
6
|
+
import { loadAccounts, withAccountStorageTransaction } from "../storage.js";
|
|
7
7
|
import { AccountManager } from "../accounts.js";
|
|
8
8
|
import { logWarn } from "../logger.js";
|
|
9
9
|
import { MODEL_FAMILIES } from "../prompts/codex.js";
|
|
@@ -22,8 +22,14 @@ export function createCodexSwitchTool(ctx) {
|
|
|
22
22
|
async execute({ index } = {}) {
|
|
23
23
|
const ui = resolveUiRuntime();
|
|
24
24
|
const maskEmail = resolveMaskEmail();
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
// This read is only used to render the "no accounts" / interactive
|
|
26
|
+
// picker UX. It is intentionally NOT the snapshot that gets mutated
|
|
27
|
+
// and saved below -- the mutate+save happens inside
|
|
28
|
+
// withAccountStorageTransaction against a freshly re-read snapshot so
|
|
29
|
+
// a concurrent save (e.g. a rotation persisting rate-limit state)
|
|
30
|
+
// between this read and the eventual save can't be clobbered.
|
|
31
|
+
const initialStorage = await loadAccounts();
|
|
32
|
+
if (!initialStorage || initialStorage.accounts.length === 0) {
|
|
27
33
|
if (ui.v2Enabled) {
|
|
28
34
|
return [
|
|
29
35
|
...formatUiHeader(ui, "Switch account"),
|
|
@@ -36,7 +42,7 @@ export function createCodexSwitchTool(ctx) {
|
|
|
36
42
|
}
|
|
37
43
|
let resolvedIndex = index;
|
|
38
44
|
if (resolvedIndex === undefined) {
|
|
39
|
-
const selectedIndex = await promptAccountIndexSelection(ui,
|
|
45
|
+
const selectedIndex = await promptAccountIndexSelection(ui, initialStorage, "Switch account");
|
|
40
46
|
if (selectedIndex === null) {
|
|
41
47
|
if (supportsInteractiveMenus()) {
|
|
42
48
|
if (ui.v2Enabled) {
|
|
@@ -61,48 +67,65 @@ export function createCodexSwitchTool(ctx) {
|
|
|
61
67
|
}
|
|
62
68
|
resolvedIndex = selectedIndex + 1;
|
|
63
69
|
}
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
targetIndex
|
|
67
|
-
|
|
70
|
+
const outcome = await withAccountStorageTransaction(async (current, persist) => {
|
|
71
|
+
const accounts = current?.accounts ?? [];
|
|
72
|
+
const targetIndex = (resolvedIndex ?? 0) - 1;
|
|
73
|
+
if (!current ||
|
|
74
|
+
!Number.isInteger(targetIndex) ||
|
|
75
|
+
targetIndex < 0 ||
|
|
76
|
+
targetIndex >= accounts.length) {
|
|
77
|
+
return { kind: "invalid", accountCount: accounts.length };
|
|
78
|
+
}
|
|
79
|
+
const now = Date.now();
|
|
80
|
+
const account = accounts[targetIndex];
|
|
81
|
+
if (account) {
|
|
82
|
+
account.lastUsed = now;
|
|
83
|
+
account.lastSwitchReason = "rotation";
|
|
84
|
+
}
|
|
85
|
+
const storage = current;
|
|
86
|
+
storage.activeIndex = targetIndex;
|
|
87
|
+
storage.activeIndexByFamily = storage.activeIndexByFamily ?? {};
|
|
88
|
+
for (const family of MODEL_FAMILIES) {
|
|
89
|
+
storage.activeIndexByFamily[family] = targetIndex;
|
|
90
|
+
}
|
|
91
|
+
const label = formatCommandAccountLabel(account, targetIndex, {
|
|
92
|
+
maskEmail,
|
|
93
|
+
});
|
|
94
|
+
try {
|
|
95
|
+
await persist(storage);
|
|
96
|
+
}
|
|
97
|
+
catch (saveError) {
|
|
98
|
+
logWarn("Failed to save account switch", {
|
|
99
|
+
error: String(saveError),
|
|
100
|
+
});
|
|
101
|
+
return { kind: "save-failed", label };
|
|
102
|
+
}
|
|
103
|
+
return { kind: "ok", label };
|
|
104
|
+
});
|
|
105
|
+
if (outcome.kind === "invalid") {
|
|
68
106
|
if (ui.v2Enabled) {
|
|
69
107
|
return [
|
|
70
108
|
...formatUiHeader(ui, "Switch account"),
|
|
71
109
|
"",
|
|
72
110
|
formatUiItem(ui, `Invalid account number: ${resolvedIndex}`, "danger"),
|
|
73
|
-
formatUiKeyValue(ui, "Valid range", `1-${
|
|
111
|
+
formatUiKeyValue(ui, "Valid range", `1-${outcome.accountCount}`, "muted"),
|
|
74
112
|
].join("\n");
|
|
75
113
|
}
|
|
76
|
-
return `Invalid account number: ${resolvedIndex}\n\nValid range: 1-${
|
|
114
|
+
return `Invalid account number: ${resolvedIndex}\n\nValid range: 1-${outcome.accountCount}`;
|
|
77
115
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
storage.activeIndex = targetIndex;
|
|
85
|
-
storage.activeIndexByFamily = storage.activeIndexByFamily ?? {};
|
|
86
|
-
for (const family of MODEL_FAMILIES) {
|
|
87
|
-
storage.activeIndexByFamily[family] = targetIndex;
|
|
88
|
-
}
|
|
89
|
-
try {
|
|
90
|
-
await saveAccounts(storage);
|
|
91
|
-
}
|
|
92
|
-
catch (saveError) {
|
|
93
|
-
logWarn("Failed to save account switch", {
|
|
94
|
-
error: String(saveError),
|
|
95
|
-
});
|
|
96
|
-
const label = formatCommandAccountLabel(account, targetIndex, { maskEmail });
|
|
116
|
+
if (outcome.kind === "save-failed") {
|
|
117
|
+
// The transaction only mutated its in-memory snapshot; the
|
|
118
|
+
// persist() call that would have made it durable threw, so
|
|
119
|
+
// nothing on disk actually changed. Wording must not imply the
|
|
120
|
+
// switch happened -- it didn't.
|
|
97
121
|
if (ui.v2Enabled) {
|
|
98
122
|
return [
|
|
99
123
|
...formatUiHeader(ui, "Switch account"),
|
|
100
124
|
"",
|
|
101
|
-
formatUiItem(ui, `
|
|
102
|
-
formatUiItem(ui, "Failed to persist change. It may be lost on restart.", "danger"),
|
|
125
|
+
formatUiItem(ui, `Failed to switch to ${outcome.label}: account storage could not be updated.`, "danger"),
|
|
103
126
|
].join("\n");
|
|
104
127
|
}
|
|
105
|
-
return `
|
|
128
|
+
return `Failed to switch to ${outcome.label}: account storage could not be updated.`;
|
|
106
129
|
}
|
|
107
130
|
try {
|
|
108
131
|
await clearTuiQuotaSnapshot();
|
|
@@ -117,15 +140,14 @@ export function createCodexSwitchTool(ctx) {
|
|
|
117
140
|
cachedAccountManagerRef.current = reloadedManager;
|
|
118
141
|
accountManagerPromiseRef.current = Promise.resolve(reloadedManager);
|
|
119
142
|
}
|
|
120
|
-
const label = formatCommandAccountLabel(account, targetIndex, { maskEmail });
|
|
121
143
|
if (ui.v2Enabled) {
|
|
122
144
|
return [
|
|
123
145
|
...formatUiHeader(ui, "Switch account"),
|
|
124
146
|
"",
|
|
125
|
-
formatUiItem(ui, `${getStatusMarker(ui, "ok")} Switched to ${label}`, "success"),
|
|
147
|
+
formatUiItem(ui, `${getStatusMarker(ui, "ok")} Switched to ${outcome.label}`, "success"),
|
|
126
148
|
].join("\n");
|
|
127
149
|
}
|
|
128
|
-
return `Switched to account: ${label}`;
|
|
150
|
+
return `Switched to account: ${outcome.label}`;
|
|
129
151
|
},
|
|
130
152
|
});
|
|
131
153
|
}
|