Skip to content

Commit 704af0a

Browse files
committed
fix(auth): clarify OpenCode import limit failures
1 parent ea79ade commit 704af0a

2 files changed

Lines changed: 24 additions & 9 deletions

File tree

lib/codex-manager.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4363,17 +4363,19 @@ async function runAuthLogin(): Promise<number> {
43634363
console.log("No OpenCode account pool was detected.");
43644364
continue;
43654365
}
4366-
if (
4367-
!assessment.backup.valid ||
4368-
!assessment.eligibleForRestore ||
4369-
assessment.wouldExceedLimit
4370-
) {
4366+
if (!assessment.backup.valid || !assessment.eligibleForRestore) {
43714367
const assessmentErrorLabel = assessment.error
43724368
? formatRedactedFilesystemError(assessment.error)
43734369
: "OpenCode account pool is not importable.";
43744370
console.log(assessmentErrorLabel);
43754371
continue;
43764372
}
4373+
if (assessment.wouldExceedLimit) {
4374+
console.log(
4375+
`Import would exceed the account limit (${assessment.currentAccountCount ?? "?"} current, ${assessment.mergedAccountCount ?? "?"} after import). Remove accounts first.`,
4376+
);
4377+
continue;
4378+
}
43774379
const backupLabel = basename(assessment.backup.path);
43784380
const confirmed = await confirm(
43794381
`Import OpenCode accounts from ${backupLabel}?`,

test/codex-manager-cli.test.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,7 +1122,11 @@ describe("codex manager cli commands", () => {
11221122
error: "",
11231123
};
11241124
assessOpencodeAccountPoolMock.mockResolvedValue(assessment);
1125-
importAccountsMock.mockRejectedValueOnce(new Error("import locked"));
1125+
const importError = makeErrnoError(
1126+
"operation not permitted, open 'C:\\Users\\alice\\AppData\\Local\\OpenCode\\openai-codex-accounts.json'",
1127+
"EPERM",
1128+
);
1129+
importAccountsMock.mockRejectedValueOnce(importError);
11261130
confirmMock.mockResolvedValueOnce(true);
11271131
promptLoginModeMock
11281132
.mockResolvedValueOnce({ mode: "import-opencode" })
@@ -1137,11 +1141,14 @@ describe("codex manager cli commands", () => {
11371141
"/mock/.opencode/openai-codex-accounts.json",
11381142
);
11391143
expect(promptLoginModeMock).toHaveBeenCalledTimes(2);
1144+
expect(errorSpy).toHaveBeenCalledWith(
1145+
"Import failed: EPERM: operation not permitted, open 'openai-codex-accounts.json'",
1146+
);
11401147
expect(
11411148
errorSpy.mock.calls.some(([message]) =>
1142-
String(message).includes("Import failed:")
1149+
String(message).includes("C:\\Users\\alice\\AppData\\Local\\OpenCode"),
11431150
),
1144-
).toBe(true);
1151+
).toBe(false);
11451152
errorSpy.mockRestore();
11461153
});
11471154

@@ -1178,6 +1185,8 @@ describe("codex manager cli commands", () => {
11781185
it.each([
11791186
{
11801187
label: "would exceed the account limit",
1188+
expectedLog:
1189+
"Import would exceed the account limit (2 current, 5 after import). Remove accounts first.",
11811190
assessment: {
11821191
backup: {
11831192
name: "openai-codex-accounts.json",
@@ -1206,6 +1215,7 @@ describe("codex manager cli commands", () => {
12061215
},
12071216
{
12081217
label: "is not eligible for restore",
1218+
expectedLog: "OpenCode account pool is not importable.",
12091219
assessment: {
12101220
backup: {
12111221
name: "openai-codex-accounts.json",
@@ -1234,7 +1244,7 @@ describe("codex manager cli commands", () => {
12341244
},
12351245
])(
12361246
"skips confirmation and import when the OpenCode assessment $label",
1237-
async ({ assessment }) => {
1247+
async ({ assessment, expectedLog }) => {
12381248
setInteractiveTTY(true);
12391249
loadAccountsMock.mockResolvedValue({
12401250
version: 3,
@@ -1253,6 +1263,7 @@ describe("codex manager cli commands", () => {
12531263
promptLoginModeMock
12541264
.mockResolvedValueOnce({ mode: "import-opencode" })
12551265
.mockResolvedValueOnce({ mode: "cancel" });
1266+
const logSpy = vi.spyOn(console, "log").mockImplementation(() => {});
12561267
const { runCodexMultiAuthCli } = await import("../lib/codex-manager.js");
12571268

12581269
const exitCode = await runCodexMultiAuthCli(["auth", "login"]);
@@ -1262,6 +1273,8 @@ describe("codex manager cli commands", () => {
12621273
expect(confirmMock).not.toHaveBeenCalled();
12631274
expect(importAccountsMock).not.toHaveBeenCalled();
12641275
expect(promptLoginModeMock).toHaveBeenCalledTimes(2);
1276+
expect(logSpy).toHaveBeenCalledWith(expectedLog);
1277+
logSpy.mockRestore();
12651278
},
12661279
);
12671280

0 commit comments

Comments
 (0)