fix(app): route new sessions through tabs (#33582)

This commit is contained in:
Brendan Allan 2026-06-24 11:48:33 +08:00 committed by GitHub
parent 51eb87b256
commit 5303ab09f8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 37 additions and 20 deletions

View File

@ -10,7 +10,7 @@ import { Splash } from "@opencode-ai/ui/logo"
import { ThemeProvider } from "@opencode-ai/ui/theme/context" import { ThemeProvider } from "@opencode-ai/ui/theme/context"
import { MetaProvider } from "@solidjs/meta" import { MetaProvider } from "@solidjs/meta"
import { type BaseRouterProps, Navigate, Route, Router, useParams, useSearchParams } from "@solidjs/router" import { type BaseRouterProps, Navigate, Route, Router, useParams, useSearchParams } from "@solidjs/router"
import { keepPreviousData, QueryClient, QueryClientProvider, useQuery } from "@tanstack/solid-query" import { QueryClient, QueryClientProvider, useQuery } from "@tanstack/solid-query"
import { Effect } from "effect" import { Effect } from "effect"
import { import {
type Component, type Component,
@ -166,20 +166,22 @@ function TargetDirectoryLayout(props: ParentProps) {
return tabs.store.find((tab): tab is DraftTab => tab.type === "draft" && tab.draftID === search.draftId)?.server return tabs.store.find((tab): tab is DraftTab => tab.type === "draft" && tab.draftID === search.draftId)?.server
}) })
const resolved = useQuery(() => ({ const resolved = useQuery(() => {
queryKey: [serverSDK().scope, "session-route", params.id] as const, const id = params.id
enabled: !!params.serverKey && !!params.id, return {
placeholderData: keepPreviousData, queryKey: [serverSDK().scope, "session-route", id] as const,
queryFn: async () => { enabled: !!params.serverKey && !!params.id,
const session = (await serverSDK().client.session.get({ sessionID: params.id! })).data! queryFn: async () => {
const root = await rootSession(session, (sessionID) => const session = (await serverSDK().client.session.get({ sessionID: params.id! })).data!
serverSDK() const root = await rootSession(session, (sessionID) =>
.client.session.get({ sessionID }) serverSDK()
.then((result) => result.data!), .client.session.get({ sessionID })
) .then((result) => result.data!),
return { session, rootID: root.id } )
}, return { session, rootID: root.id }
})) },
}
})
const resolvedDirectory = createMemo(() => { const resolvedDirectory = createMemo(() => {
if (params.serverKey) return resolved.data?.session.directory if (params.serverKey) return resolved.data?.session.directory
if (!search.draftId) return undefined if (!search.draftId) return undefined

View File

@ -115,13 +115,15 @@ export const { use: useTabs, provider: TabsProvider } = createSimpleContext({
const actions = { const actions = {
addSessionTab: (tab: Omit<SessionTab, "type">) => { addSessionTab: (tab: Omit<SessionTab, "type">) => {
const next = { type: "session" as const, ...tab } const next = { type: "session" as const, ...tab }
if (closing.has(tabKey(next))) return const existing = store.find((item) => tabKey(item) === tabKey(next))
if (existing) return existing
setStore( setStore(
produce((tabs) => { produce((tabs) => {
if (tabs.some((item) => tabKey(item) === tabKey(next))) return if (tabs.some((item) => tabKey(item) === tabKey(next))) return
tabs.push(next) tabs.push(next)
}), }),
) )
return next
}, },
draft(draftID: string) { draft(draftID: string) {
const tab = store.find((item) => item.type === "draft" && item.draftID === draftID) const tab = store.find((item) => item.type === "draft" && item.draftID === draftID)

View File

@ -1,5 +1,17 @@
import type { Session } from "@opencode-ai/sdk/v2/client" import type { Session } from "@opencode-ai/sdk/v2/client"
import { batch, createEffect, createMemo, For, Match, on, onCleanup, onMount, Show, Switch } from "solid-js" import {
batch,
createEffect,
createMemo,
For,
Match,
on,
onCleanup,
onMount,
Show,
startTransition,
Switch,
} from "solid-js"
import { makeEventListener } from "@solid-primitives/event-listener" import { makeEventListener } from "@solid-primitives/event-listener"
import { createStore } from "solid-js/store" import { createStore } from "solid-js/store"
import { useQuery } from "@tanstack/solid-query" import { useQuery } from "@tanstack/solid-query"
@ -294,7 +306,10 @@ export function NewHome() {
const ctx = global.createServerCtx(conn) const ctx = global.createServerCtx(conn)
ctx.projects.open(directory) ctx.projects.open(directory)
ctx.projects.touch(directory) ctx.projects.touch(directory)
navigate(`/server/${base64Encode(ServerConnection.key(conn))}/session/${session.id}`) startTransition(() => {
const tab = tabs.addSessionTab({ server: ServerConnection.key(conn), sessionId: session.id })
tabs.select(tab)
})
} }
function chooseProject(conn: ServerConnection.Any) { function chooseProject(conn: ServerConnection.Any) {
@ -302,8 +317,6 @@ export function NewHome() {
addProjects(conn, homeProjectDirectories(result)) addProjects(conn, homeProjectDirectories(result))
} }
const server = global.createServerCtx(conn)
pickDirectory({ pickDirectory({
server: conn, server: conn,
title: language.t("command.project.open"), title: language.t("command.project.open"),