oc-codex-multi-auth 6.7.1 → 6.8.1
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 +1 -0
- 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 +122 -0
- package/dist/lib/codex-reset.d.ts.map +1 -0
- package/dist/lib/codex-reset.js +196 -0
- package/dist/lib/codex-reset.js.map +1 -0
- package/dist/lib/codex-usage.d.ts +15 -0
- package/dist/lib/codex-usage.d.ts.map +1 -1
- package/dist/lib/codex-usage.js +44 -13
- package/dist/lib/codex-usage.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 +21 -2
- package/dist/lib/request/fetch-helpers.js.map +1 -1
- 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-limits.js +10 -4
- package/dist/lib/tools/codex-limits.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 +16 -0
- package/dist/lib/tools/codex-reset.d.ts.map +1 -0
- package/dist/lib/tools/codex-reset.js +332 -0
- package/dist/lib/tools/codex-reset.js.map +1 -0
- 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/tools/index.d.ts.map +1 -1
- package/dist/lib/tools/index.js +2 -0
- package/dist/lib/tools/index.js.map +1 -1
- package/dist/lib/tui-quota-cache.d.ts +25 -0
- package/dist/lib/tui-quota-cache.d.ts.map +1 -1
- package/dist/lib/tui-quota-cache.js +42 -1
- 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,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 { formatUiHeader, formatUiItem, formatUiKeyValue, } from "../ui/format.js";
|
|
@@ -23,8 +23,12 @@ export function createCodexLabelTool(ctx) {
|
|
|
23
23
|
async execute({ index, label }) {
|
|
24
24
|
const ui = resolveUiRuntime();
|
|
25
25
|
const maskEmail = resolveMaskEmail();
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
// Read-only snapshot for the "no accounts" / interactive-picker UX.
|
|
27
|
+
// The actual mutate+save runs inside withAccountStorageTransaction
|
|
28
|
+
// below against a freshly re-read snapshot so a concurrent save
|
|
29
|
+
// between this read and the eventual persist can't be clobbered.
|
|
30
|
+
const initialStorage = await loadAccounts();
|
|
31
|
+
if (!initialStorage || initialStorage.accounts.length === 0) {
|
|
28
32
|
if (ui.v2Enabled) {
|
|
29
33
|
return [
|
|
30
34
|
...formatUiHeader(ui, "Set account label"),
|
|
@@ -37,7 +41,7 @@ export function createCodexLabelTool(ctx) {
|
|
|
37
41
|
}
|
|
38
42
|
let resolvedIndex = index;
|
|
39
43
|
if (resolvedIndex === undefined) {
|
|
40
|
-
const selectedIndex = await promptAccountIndexSelection(ui,
|
|
44
|
+
const selectedIndex = await promptAccountIndexSelection(ui, initialStorage, "Set account label");
|
|
41
45
|
if (selectedIndex === null) {
|
|
42
46
|
if (supportsInteractiveMenus()) {
|
|
43
47
|
if (ui.v2Enabled) {
|
|
@@ -62,64 +66,86 @@ export function createCodexLabelTool(ctx) {
|
|
|
62
66
|
}
|
|
63
67
|
resolvedIndex = selectedIndex + 1;
|
|
64
68
|
}
|
|
65
|
-
const
|
|
66
|
-
if (
|
|
67
|
-
targetIndex < 0 ||
|
|
68
|
-
targetIndex >= storage.accounts.length) {
|
|
69
|
+
const normalizedLabel = (label ?? "").trim().replace(/\s+/g, " ");
|
|
70
|
+
if (normalizedLabel.length > 60) {
|
|
69
71
|
if (ui.v2Enabled) {
|
|
70
72
|
return [
|
|
71
73
|
...formatUiHeader(ui, "Set account label"),
|
|
72
74
|
"",
|
|
73
|
-
formatUiItem(ui,
|
|
74
|
-
formatUiKeyValue(ui, "Valid range", `1-${storage.accounts.length}`, "muted"),
|
|
75
|
+
formatUiItem(ui, "Label is too long (max 60 characters).", "danger"),
|
|
75
76
|
].join("\n");
|
|
76
77
|
}
|
|
77
|
-
return
|
|
78
|
+
return "Label is too long (max 60 characters).";
|
|
78
79
|
}
|
|
79
|
-
const
|
|
80
|
-
|
|
80
|
+
const outcome = await withAccountStorageTransaction(async (current, persist) => {
|
|
81
|
+
const storage = current;
|
|
82
|
+
const accounts = storage?.accounts ?? [];
|
|
83
|
+
const targetIndex = (resolvedIndex ?? 0) - 1;
|
|
84
|
+
if (!Number.isInteger(targetIndex) ||
|
|
85
|
+
targetIndex < 0 ||
|
|
86
|
+
targetIndex >= accounts.length) {
|
|
87
|
+
return { kind: "invalid", accountCount: accounts.length };
|
|
88
|
+
}
|
|
89
|
+
const account = accounts[targetIndex];
|
|
90
|
+
if (!account || !storage) {
|
|
91
|
+
return { kind: "not-found" };
|
|
92
|
+
}
|
|
93
|
+
const previousLabel = account.accountLabel?.trim() ?? "";
|
|
94
|
+
if (normalizedLabel.length === 0) {
|
|
95
|
+
delete account.accountLabel;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
account.accountLabel = normalizedLabel;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
await persist(storage);
|
|
102
|
+
}
|
|
103
|
+
catch (saveError) {
|
|
104
|
+
logWarn("Failed to save account label update", {
|
|
105
|
+
error: String(saveError),
|
|
106
|
+
});
|
|
107
|
+
return { kind: "save-failed" };
|
|
108
|
+
}
|
|
109
|
+
const accountLabel = formatCommandAccountLabel(account, targetIndex, {
|
|
110
|
+
maskEmail,
|
|
111
|
+
});
|
|
112
|
+
return { kind: "ok", accountLabel, previousLabel };
|
|
113
|
+
});
|
|
114
|
+
if (outcome.kind === "invalid") {
|
|
81
115
|
if (ui.v2Enabled) {
|
|
82
116
|
return [
|
|
83
117
|
...formatUiHeader(ui, "Set account label"),
|
|
84
118
|
"",
|
|
85
|
-
formatUiItem(ui,
|
|
119
|
+
formatUiItem(ui, `Invalid account number: ${resolvedIndex}`, "danger"),
|
|
120
|
+
formatUiKeyValue(ui, "Valid range", `1-${outcome.accountCount}`, "muted"),
|
|
86
121
|
].join("\n");
|
|
87
122
|
}
|
|
88
|
-
return
|
|
123
|
+
return `Invalid account number: ${resolvedIndex}\n\nValid range: 1-${outcome.accountCount}`;
|
|
89
124
|
}
|
|
90
|
-
|
|
91
|
-
if (!account) {
|
|
125
|
+
if (outcome.kind === "not-found") {
|
|
92
126
|
return `Account ${resolvedIndex} not found.`;
|
|
93
127
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
try {
|
|
102
|
-
await saveAccounts(storage);
|
|
103
|
-
}
|
|
104
|
-
catch (saveError) {
|
|
105
|
-
logWarn("Failed to save account label update", {
|
|
106
|
-
error: String(saveError),
|
|
107
|
-
});
|
|
128
|
+
if (outcome.kind === "save-failed") {
|
|
129
|
+
// The transaction only mutated its in-memory snapshot; the
|
|
130
|
+
// persist() call that would have made the label change durable
|
|
131
|
+
// threw, so the label was never actually updated. Wording must
|
|
132
|
+
// not imply it was (matches the codex-switch/-remove fix for
|
|
133
|
+
// the same pattern).
|
|
108
134
|
if (ui.v2Enabled) {
|
|
109
135
|
return [
|
|
110
136
|
...formatUiHeader(ui, "Set account label"),
|
|
111
137
|
"",
|
|
112
|
-
formatUiItem(ui,
|
|
138
|
+
formatUiItem(ui, `Failed to set label for account ${resolvedIndex}: account storage could not be updated.`, "danger"),
|
|
113
139
|
].join("\n");
|
|
114
140
|
}
|
|
115
|
-
return
|
|
141
|
+
return `Failed to set label for account ${resolvedIndex}: account storage could not be updated.`;
|
|
116
142
|
}
|
|
117
143
|
if (cachedAccountManagerRef.current) {
|
|
118
144
|
const reloadedManager = await AccountManager.loadFromDisk();
|
|
119
145
|
cachedAccountManagerRef.current = reloadedManager;
|
|
120
146
|
accountManagerPromiseRef.current = Promise.resolve(reloadedManager);
|
|
121
147
|
}
|
|
122
|
-
const accountLabel
|
|
148
|
+
const { accountLabel, previousLabel } = outcome;
|
|
123
149
|
if (ui.v2Enabled) {
|
|
124
150
|
const statusText = normalizedLabel.length === 0
|
|
125
151
|
? `Cleared label for ${accountLabel}`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-label.js","sourceRoot":"","sources":["../../../lib/tools/codex-label.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAuB,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"codex-label.js","sourceRoot":"","sources":["../../../lib/tools/codex-label.ts"],"names":[],"mappings":"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"}
|
|
@@ -162,8 +162,11 @@ export function createCodexLimitsTool(ctx) {
|
|
|
162
162
|
});
|
|
163
163
|
if (ui.v2Enabled) {
|
|
164
164
|
lines.push(formatUiItem(ui, `${displayLabel}${activeSuffix}`));
|
|
165
|
-
|
|
166
|
-
|
|
165
|
+
for (const window of [usage.primary, usage.secondary]) {
|
|
166
|
+
if (!hasUsageWindow(window))
|
|
167
|
+
continue;
|
|
168
|
+
lines.push(` ${formatUiKeyValue(ui, formatUsageLimitTitle(window.windowMinutes), formatUsageLimitSummary(window), "muted")}`);
|
|
169
|
+
}
|
|
167
170
|
if (hasUsageWindow(usage.codeReview)) {
|
|
168
171
|
lines.push(` ${formatUiKeyValue(ui, "Code review", formatUsageLimitSummary(usage.codeReview), "muted")}`);
|
|
169
172
|
}
|
|
@@ -179,8 +182,11 @@ export function createCodexLimitsTool(ctx) {
|
|
|
179
182
|
}
|
|
180
183
|
else {
|
|
181
184
|
lines.push(`${displayLabel}${activeSuffix}:`);
|
|
182
|
-
|
|
183
|
-
|
|
185
|
+
for (const window of [usage.primary, usage.secondary]) {
|
|
186
|
+
if (!hasUsageWindow(window))
|
|
187
|
+
continue;
|
|
188
|
+
lines.push(` ${formatUsageLimitTitle(window.windowMinutes)}: ${formatUsageLimitSummary(window)}`);
|
|
189
|
+
}
|
|
184
190
|
if (hasUsageWindow(usage.codeReview)) {
|
|
185
191
|
lines.push(` Code review: ${formatUsageLimitSummary(usage.codeReview)}`);
|
|
186
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-limits.js","sourceRoot":"","sources":["../../../lib/tools/codex-limits.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"codex-limits.js","sourceRoot":"","sources":["../../../lib/tools/codex-limits.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-refresh.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-refresh.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAKrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"codex-refresh.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-refresh.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAKrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAoE9C,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAoIvE"}
|
|
@@ -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")
|