From df7ee51b5917ef15b3b013d40f9ce6f6f1ff57d5 Mon Sep 17 00:00:00 2001 From: Victor Navarro Date: Fri, 10 Jul 2026 16:05:50 +0000 Subject: [PATCH] fix(cli): switch org after console logout --- packages/opencode/src/account/account.ts | 14 +++++- .../opencode/test/account/service.test.ts | 47 +++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/account/account.ts b/packages/opencode/src/account/account.ts index af8ef761eb2c..4b49d2a74890 100644 --- a/packages/opencode/src/account/account.ts +++ b/packages/opencode/src/account/account.ts @@ -348,6 +348,18 @@ const layer: Layer.Layer + group.orgs.map((org) => ({ accountID: group.account.id, orgID: org.id })), + )[0] + if (!next) return + yield* repo.use(next.accountID, Option.some(next.orgID)) + }) + const config = Effect.fn("Account.config")(function* (accountID: AccountID, orgID: OrgID) { const resolved = yield* resolveAccess(accountID) if (Option.isNone(resolved)) return Option.none() @@ -445,7 +457,7 @@ const layer: Layer.Layer }), ) +it.live("remove switches to another org when the active account is removed", () => + Effect.gen(function* () { + const first = AccountID.make("user-1") + const second = AccountID.make("user-2") + + yield* AccountRepo.Service.use((r) => + r.persistAccount({ + id: first, + email: "one@example.com", + url: "https://one.example.com", + accessToken: AccessToken.make("at_1"), + refreshToken: RefreshToken.make("rt_1"), + expiry: Date.now() + outsideEagerRefreshWindow, + orgID: Option.some(OrgID.make("org-1")), + }), + ) + + yield* AccountRepo.Service.use((r) => + r.persistAccount({ + id: second, + email: "two@example.com", + url: "https://two.example.com", + accessToken: AccessToken.make("at_2"), + refreshToken: RefreshToken.make("rt_2"), + expiry: Date.now() + outsideEagerRefreshWindow, + orgID: Option.some(OrgID.make("org-2")), + }), + ) + + const client = HttpClient.make((req) => + Effect.succeed( + req.url === "https://one.example.com/api/orgs" ? json(req, [org("org-1", "One")]) : json(req, [], 404), + ), + ) + + yield* Account.use.remove(second).pipe(Effect.provide(live(client))) + + const active = yield* AccountRepo.use.active() + expect(Option.getOrThrow(active)).toEqual( + expect.objectContaining({ + id: first, + active_org_id: OrgID.make("org-1"), + }), + ) + }), +) + it.live("token refresh persists the new token", () => Effect.gen(function* () { const id = AccountID.make("user-1")