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
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
import { promises as fs } from "node:fs";
|
|
28
28
|
import { basename, dirname, join } from "node:path";
|
|
29
29
|
import { tool } from "@opencode-ai/plugin/tool";
|
|
30
|
-
import {
|
|
30
|
+
import { withAccountStorageTransaction, withStorageLock } from "../storage.js";
|
|
31
31
|
import { deleteFromKeychain, isKeychainOptInEnabled, keychainIsAvailable, readFromKeychain, } from "../storage/keychain.js";
|
|
32
32
|
import { getCurrentProjectStorageKey, getStoragePath } from "../storage/state.js";
|
|
33
33
|
import { normalizeAccountStorage } from "../storage/normalize.js";
|
|
@@ -166,21 +166,28 @@ export function createCodexKeychainTool(ctx) {
|
|
|
166
166
|
if (!optIn) {
|
|
167
167
|
return "codex-keychain migrate: refusing to migrate because CODEX_KEYCHAIN is not set to 1. Enable the opt-in first, then re-run this command.";
|
|
168
168
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
//
|
|
174
|
-
//
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
169
|
+
// Read and re-save under a single storage-lock transaction so a
|
|
170
|
+
// concurrent rotation save landing between the read and the
|
|
171
|
+
// write cannot be clobbered by a stale snapshot (the docstring
|
|
172
|
+
// above claims this already ran under the same lock as
|
|
173
|
+
// saveAccounts/loadAccounts; loadAccounts()+saveAccounts() as
|
|
174
|
+
// two independent calls did not actually guarantee that).
|
|
175
|
+
return withAccountStorageTransaction(async (current, persist) => {
|
|
176
|
+
if (!current) {
|
|
177
|
+
return "codex-keychain migrate: no accounts found to migrate. Nothing to do.";
|
|
178
|
+
}
|
|
179
|
+
// Re-saving under the opt-in path triggers the same keychain
|
|
180
|
+
// write + JSON-backup flow used by every rotation save, so we
|
|
181
|
+
// avoid duplicating the migration logic here.
|
|
182
|
+
await persist(current);
|
|
183
|
+
return [
|
|
184
|
+
...formatUiHeader(ui, "Codex keychain migrate"),
|
|
185
|
+
"",
|
|
186
|
+
formatUiItem(ui, `Migrated ${current.accounts.length} account(s) to the OS keychain.`),
|
|
187
|
+
formatUiKeyValue(ui, "Project scope", projectKey ?? "global"),
|
|
188
|
+
formatUiItem(ui, "On-disk JSON (if any) was renamed with a .migrated-to-keychain.<timestamp> suffix. Use `codex-keychain rollback` to restore it."),
|
|
189
|
+
].join("\n");
|
|
190
|
+
});
|
|
184
191
|
}
|
|
185
192
|
// rollback
|
|
186
193
|
const backups = await findMigrationBackups(storagePath);
|
|
@@ -203,75 +210,141 @@ export function createCodexKeychainTool(ctx) {
|
|
|
203
210
|
catch (err) {
|
|
204
211
|
return `codex-keychain rollback: failed to read backup at ${mostRecent}: ${err.message}`;
|
|
205
212
|
}
|
|
206
|
-
//
|
|
207
|
-
//
|
|
208
|
-
//
|
|
209
|
-
|
|
210
|
-
//
|
|
211
|
-
//
|
|
212
|
-
//
|
|
213
|
-
//
|
|
214
|
-
//
|
|
215
|
-
// would
|
|
216
|
-
//
|
|
217
|
-
//
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
}
|
|
226
|
-
let preRollbackArchive = null;
|
|
227
|
-
if (currentExists) {
|
|
228
|
-
if (!confirm) {
|
|
229
|
-
return [
|
|
230
|
-
`codex-keychain rollback: refusing to overwrite existing accounts file at ${storagePath}.`,
|
|
231
|
-
`Backup at ${mostRecent} was not restored.`,
|
|
232
|
-
"Pass confirm=true to archive the current file as .pre-rollback.<timestamp> and proceed, or move the current file aside and re-run.",
|
|
233
|
-
].join("\n");
|
|
234
|
-
}
|
|
235
|
-
const archiveSuffix = new Date()
|
|
236
|
-
.toISOString()
|
|
237
|
-
.replace(/[:.]/g, "-");
|
|
238
|
-
preRollbackArchive = `${storagePath}.pre-rollback.${archiveSuffix}`;
|
|
213
|
+
// Everything below mutates the canonical storage path (JSON file +
|
|
214
|
+
// keychain entry) and must run as one critical section under the
|
|
215
|
+
// same mutex loadAccounts/saveAccounts use, so a concurrent
|
|
216
|
+
// rotation save cannot land between the existence check and the
|
|
217
|
+
// final rename below (the TOCTOU this file's docstring claimed was
|
|
218
|
+
// already impossible). withStorageLock is NOT re-entrant, so this
|
|
219
|
+
// callback uses raw fs operations + the already-unlocked
|
|
220
|
+
// deleteFromKeychain instead of the locked clearAccounts/
|
|
221
|
+
// loadAccounts/saveAccounts wrappers -- calling any of those in
|
|
222
|
+
// here would deadlock against this very lock acquisition.
|
|
223
|
+
//
|
|
224
|
+
// Silent-clobber guard (F1 post-merge MEDIUM finding) is folded
|
|
225
|
+
// into the same critical section: on POSIX, `fs.rename(backup,
|
|
226
|
+
// storagePath)` silently overwrites an existing destination, so a
|
|
227
|
+
// current file is archived (with explicit confirm=true) or refused
|
|
228
|
+
// rather than deleted outright before the backup takes its place.
|
|
229
|
+
const rollbackResult = await withStorageLock(async () => {
|
|
230
|
+
const warnings = [];
|
|
231
|
+
let currentExists = false;
|
|
239
232
|
try {
|
|
240
|
-
await fs.
|
|
233
|
+
await fs.access(storagePath);
|
|
234
|
+
currentExists = true;
|
|
241
235
|
}
|
|
242
236
|
catch (err) {
|
|
243
|
-
|
|
237
|
+
const code = err.code;
|
|
238
|
+
if (code !== "ENOENT") {
|
|
239
|
+
// Only ENOENT means "nothing at this path". Any other
|
|
240
|
+
// failure (EACCES, a transient FS error, ...) means we
|
|
241
|
+
// genuinely don't know whether a current file exists, so
|
|
242
|
+
// proceeding past the confirm guard could silently
|
|
243
|
+
// clobber live credentials. Abort instead of guessing.
|
|
244
|
+
return {
|
|
245
|
+
ok: false,
|
|
246
|
+
message: `codex-keychain rollback: failed to check for an existing accounts file at ${storagePath}: ${err.message}. Aborted.`,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/* ENOENT: canonical path is clear; safe to rename */
|
|
250
|
+
}
|
|
251
|
+
let preRollbackArchive = null;
|
|
252
|
+
if (currentExists) {
|
|
253
|
+
if (!confirm) {
|
|
254
|
+
return {
|
|
255
|
+
ok: false,
|
|
256
|
+
message: [
|
|
257
|
+
`codex-keychain rollback: refusing to overwrite existing accounts file at ${storagePath}.`,
|
|
258
|
+
`Backup at ${mostRecent} was not restored.`,
|
|
259
|
+
"Pass confirm=true to archive the current file as .pre-rollback.<timestamp> and proceed, or move the current file aside and re-run.",
|
|
260
|
+
].join("\n"),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
const archiveSuffix = new Date()
|
|
264
|
+
.toISOString()
|
|
265
|
+
.replace(/[:.]/g, "-");
|
|
266
|
+
preRollbackArchive = `${storagePath}.pre-rollback.${archiveSuffix}`;
|
|
267
|
+
try {
|
|
268
|
+
await fs.rename(storagePath, preRollbackArchive);
|
|
269
|
+
}
|
|
270
|
+
catch (err) {
|
|
271
|
+
return {
|
|
272
|
+
ok: false,
|
|
273
|
+
message: `codex-keychain rollback: failed to archive current accounts file at ${storagePath} -> ${preRollbackArchive}: ${err.message}. Backup at ${mostRecent} was not restored.`,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Apply 0o600 to the BACKUP file BEFORE promoting it, so the
|
|
278
|
+
// active file can never briefly (or permanently, if the
|
|
279
|
+
// process dies between rename and chmod) end up group/world
|
|
280
|
+
// readable. rename() preserves the source file's mode, so
|
|
281
|
+
// chmodding the backup here has the same effect on the
|
|
282
|
+
// eventual `storagePath` as chmodding it after the rename
|
|
283
|
+
// would have -- without the intermediate window. Windows
|
|
284
|
+
// ignores POSIX mode bits, so skip there. A chmod failure is
|
|
285
|
+
// a hardening nicety, not a reason to abort a recovery tool
|
|
286
|
+
// on a permission-quirky mount -- but it must not be
|
|
287
|
+
// silently swallowed either.
|
|
288
|
+
if (process.platform !== "win32") {
|
|
289
|
+
try {
|
|
290
|
+
await fs.chmod(mostRecent, 0o600);
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
warnings.push(`codex-keychain rollback: could not set restrictive permissions on the backup before restoring it (${err.message}). The restored file's permissions were not hardened; verify them manually.`);
|
|
294
|
+
}
|
|
244
295
|
}
|
|
245
|
-
}
|
|
246
|
-
try {
|
|
247
|
-
await fs.rename(mostRecent, storagePath);
|
|
248
|
-
}
|
|
249
|
-
catch (err) {
|
|
250
|
-
return `codex-keychain rollback: failed to rename ${mostRecent} -> ${storagePath}: ${err.message}`;
|
|
251
|
-
}
|
|
252
|
-
// Re-apply 0o600 after rollback rename (F1 post-merge LOW
|
|
253
|
-
// finding). Mirror the chmod applied on the backup-write path
|
|
254
|
-
// so a restored file can never end up group/world-readable even
|
|
255
|
-
// if the backup's mode drifted between migration and rollback.
|
|
256
|
-
// Windows ignores POSIX mode bits, so skip there.
|
|
257
|
-
if (process.platform !== "win32") {
|
|
258
296
|
try {
|
|
259
|
-
await fs.
|
|
297
|
+
await fs.rename(mostRecent, storagePath);
|
|
260
298
|
}
|
|
261
|
-
catch {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
299
|
+
catch (err) {
|
|
300
|
+
const renameError = err.message;
|
|
301
|
+
if (preRollbackArchive) {
|
|
302
|
+
// The current file was already archived; try to put it
|
|
303
|
+
// back so this failure doesn't leave the canonical path
|
|
304
|
+
// empty.
|
|
305
|
+
try {
|
|
306
|
+
await fs.rename(preRollbackArchive, storagePath);
|
|
307
|
+
return {
|
|
308
|
+
ok: false,
|
|
309
|
+
message: `codex-keychain rollback: failed to promote backup ${mostRecent} -> ${storagePath}: ${renameError}. Recovered by restoring the previously archived file from ${preRollbackArchive}.`,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
catch (recoveryErr) {
|
|
313
|
+
return {
|
|
314
|
+
ok: false,
|
|
315
|
+
message: `codex-keychain rollback: failed to promote backup ${mostRecent} -> ${storagePath}: ${renameError}. Recovery also failed: could not restore the archived file from ${preRollbackArchive} back to ${storagePath}: ${recoveryErr.message}. Manual intervention required -- check both ${preRollbackArchive} and ${mostRecent}.`,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return {
|
|
320
|
+
ok: false,
|
|
321
|
+
message: `codex-keychain rollback: failed to rename ${mostRecent} -> ${storagePath}: ${renameError}`,
|
|
322
|
+
};
|
|
265
323
|
}
|
|
324
|
+
// Best-effort keychain delete now that the backup is active;
|
|
325
|
+
// rollback means "stop trusting the keychain copy", so this
|
|
326
|
+
// runs whenever opt-in is (still) on, mirroring clearAccounts'
|
|
327
|
+
// own opt-in-gated delete. A false/failed delete does not fail
|
|
328
|
+
// the rollback (the JSON file is already authoritative again),
|
|
329
|
+
// but the operator needs to know a stale keychain copy might
|
|
330
|
+
// still be preferred on the next load.
|
|
331
|
+
if (optIn) {
|
|
332
|
+
try {
|
|
333
|
+
const deleted = await deleteFromKeychain(projectKey);
|
|
334
|
+
if (!deleted) {
|
|
335
|
+
warnings.push("codex-keychain rollback: could not confirm the OS-keychain entry was deleted. The keychain copy may still exist and would be preferred over this restored file on the next load -- delete it manually or disable CODEX_KEYCHAIN.");
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
catch (err) {
|
|
339
|
+
warnings.push(`codex-keychain rollback: failed to delete the OS-keychain entry: ${err.message}. The keychain copy may still exist and would be preferred over this restored file on the next load -- delete it manually or disable CODEX_KEYCHAIN.`);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return { ok: true, preRollbackArchive, warnings };
|
|
343
|
+
});
|
|
344
|
+
if (!rollbackResult.ok) {
|
|
345
|
+
return rollbackResult.message;
|
|
266
346
|
}
|
|
267
|
-
|
|
268
|
-
// storage layer will honour that on subsequent saves.
|
|
269
|
-
try {
|
|
270
|
-
await deleteFromKeychain(projectKey);
|
|
271
|
-
}
|
|
272
|
-
catch {
|
|
273
|
-
/* already deleted by clearAccounts */
|
|
274
|
-
}
|
|
347
|
+
const preRollbackArchive = rollbackResult.preRollbackArchive;
|
|
275
348
|
const lines = [
|
|
276
349
|
...formatUiHeader(ui, "Codex keychain rollback"),
|
|
277
350
|
"",
|
|
@@ -281,6 +354,9 @@ export function createCodexKeychainTool(ctx) {
|
|
|
281
354
|
if (preRollbackArchive) {
|
|
282
355
|
lines.push(formatUiKeyValue(ui, "Previous file archived at", preRollbackArchive));
|
|
283
356
|
}
|
|
357
|
+
for (const warning of rollbackResult.warnings) {
|
|
358
|
+
lines.push(formatUiItem(ui, warning, "warning"));
|
|
359
|
+
}
|
|
284
360
|
lines.push(formatUiItem(ui, "To stop using the keychain backend, unset CODEX_KEYCHAIN (or set it to any value other than \"1\") before the next save."));
|
|
285
361
|
return lines.join("\n");
|
|
286
362
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-keychain.js","sourceRoot":"","sources":["../../../lib/tools/codex-keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,IAAI,EAAuB,MAAM,0BAA0B,CAAC;AACrE,OAAO,
|
|
1
|
+
{"version":3,"file":"codex-keychain.js","sourceRoot":"","sources":["../../../lib/tools/codex-keychain.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-label.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-label.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AASrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"codex-label.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-label.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AASrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAyOrE"}
|
|
@@ -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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"}
|
|
@@ -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"}
|