summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorja <[email protected]>2025-12-20 12:39:26 -0500
committerGitHub <[email protected]>2025-12-20 11:39:26 -0600
commit34eb03f5b8d9103b456e004b4b529d7df0cbdd7b (patch)
tree97cdce5d2ebd2a2b56da32ba9058595ad3acf33a
parent2f6d15a51eb59d107f016a4d8a768fd4d1579c69 (diff)
downloadopencode-34eb03f5b8d9103b456e004b4b529d7df0cbdd7b.tar.gz
opencode-34eb03f5b8d9103b456e004b4b529d7df0cbdd7b.zip
fix: prioritize session list loading when resuming with -c (#5816)
Co-authored-by: Aiden Cline <[email protected]>
-rw-r--r--packages/opencode/src/cli/cmd/tui/app.tsx3
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/sync.tsx25
2 files changed, 18 insertions, 10 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx
index 028905fc3..e81de1889 100644
--- a/packages/opencode/src/cli/cmd/tui/app.tsx
+++ b/packages/opencode/src/cli/cmd/tui/app.tsx
@@ -229,7 +229,8 @@ function App() {
let continued = false
createEffect(() => {
- if (continued || sync.status !== "complete" || !args.continue) return
+ // When using -c, session list is loaded in blocking phase, so we can navigate at "partial"
+ if (continued || sync.status === "loading" || !args.continue) return
const match = sync.data.session
.toSorted((a, b) => b.time.updated - a.time.updated)
.find((x) => x.parentID === undefined)?.id
diff --git a/packages/opencode/src/cli/cmd/tui/context/sync.tsx b/packages/opencode/src/cli/cmd/tui/context/sync.tsx
index f74f787db..2528a4998 100644
--- a/packages/opencode/src/cli/cmd/tui/context/sync.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/sync.tsx
@@ -22,6 +22,7 @@ import { Binary } from "@opencode-ai/util/binary"
import { createSimpleContext } from "./helper"
import type { Snapshot } from "@/snapshot"
import { useExit } from "./exit"
+import { useArgs } from "./args"
import { batch, onMount } from "solid-js"
import { Log } from "@/util/log"
import type { Path } from "@opencode-ai/sdk"
@@ -254,10 +255,18 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
})
const exit = useExit()
+ const args = useArgs()
async function bootstrap() {
- // blocking
- await Promise.all([
+ const sessionListPromise = sdk.client.session.list().then((x) =>
+ setStore(
+ "session",
+ (x.data ?? []).toSorted((a, b) => a.id.localeCompare(b.id)),
+ ),
+ )
+
+ // blocking - include session.list when continuing a session
+ const blockingRequests: Promise<unknown>[] = [
sdk.client.config.providers({}, { throwOnError: true }).then((x) => {
batch(() => {
setStore("provider", x.data!.providers)
@@ -271,17 +280,15 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
}),
sdk.client.app.agents({}, { throwOnError: true }).then((x) => setStore("agent", x.data ?? [])),
sdk.client.config.get({}, { throwOnError: true }).then((x) => setStore("config", x.data!)),
- ])
+ ...(args.continue ? [sessionListPromise] : []),
+ ]
+
+ await Promise.all(blockingRequests)
.then(() => {
if (store.status !== "complete") setStore("status", "partial")
// non-blocking
Promise.all([
- sdk.client.session.list().then((x) =>
- setStore(
- "session",
- (x.data ?? []).toSorted((a, b) => a.id.localeCompare(b.id)),
- ),
- ),
+ ...(args.continue ? [] : [sessionListPromise]),
sdk.client.command.list().then((x) => setStore("command", x.data ?? [])),
sdk.client.lsp.status().then((x) => setStore("lsp", x.data!)),
sdk.client.mcp.status().then((x) => setStore("mcp", x.data!)),