diff --git a/packages/app/src/components/prompt-input/submit.test.ts b/packages/app/src/components/prompt-input/submit.test.ts index 6e940040c71..9a65fa101dd 100644 --- a/packages/app/src/components/prompt-input/submit.test.ts +++ b/packages/app/src/components/prompt-input/submit.test.ts @@ -20,8 +20,10 @@ const storedSessions: Record> = {} const promoted: Array<{ directory: string; sessionID: string }> = [] const sentShell: string[] = [] const syncedDirectories: string[] = [] +const promotedDrafts: Array<{ draftID: string; server: string; sessionId: string }> = [] let params: { id?: string } = {} +let search: { draftId?: string } = {} let selected = "/repo/worktree-a" let variant: string | undefined @@ -79,7 +81,7 @@ beforeAll(async () => { useNavigate: () => () => undefined, useParams: () => params, useLocation: () => ({}), - useSearchParams: () => [{}, () => undefined], + useSearchParams: () => [search, () => undefined], })) mock.module("@opencode-ai/sdk/v2/client", () => ({ @@ -129,7 +131,10 @@ beforeAll(async () => { mock.module("@/context/tabs", () => ({ useTabs: () => ({ - promoteDraft: () => undefined, + draft: () => ({ server: "project-server" }), + promoteDraft: (draftID: string, session: { server: string; sessionId: string }) => { + promotedDrafts.push({ draftID, ...session }) + }, }), })) @@ -234,7 +239,9 @@ beforeEach(() => { optimistic.length = 0 optimisticSeeded.length = 0 promoted.length = 0 + promotedDrafts.length = 0 params = {} + search = {} sentShell.length = 0 syncedDirectories.length = 0 selected = "/repo/worktree-a" @@ -309,6 +316,33 @@ describe("prompt submit worktree selection", () => { expect(enabledAutoAccept).toEqual([{ sessionID: "session-1", directory: "/repo/worktree-a" }]) }) + test("promotes drafts using the selected project's server", async () => { + search = { draftId: "draft-1" } + const submit = createPromptSubmit({ + prompt, + info: () => undefined, + imageAttachments: () => [], + commentCount: () => 0, + autoAccept: () => false, + mode: () => "normal", + working: () => false, + editor: () => undefined, + queueScroll: () => undefined, + promptLength: (value) => value.reduce((sum, part) => sum + ("content" in part ? part.content.length : 0), 0), + addToHistory: () => undefined, + resetHistoryNavigation: () => undefined, + setMode: () => undefined, + setPopover: () => undefined, + newSessionWorktree: () => selected, + onNewSessionWorktreeReset: () => undefined, + onSubmit: () => undefined, + }) + + await submit.handleSubmit({ preventDefault: () => undefined } as unknown as Event) + + expect(promotedDrafts).toEqual([{ draftID: "draft-1", server: "project-server", sessionId: "session-1" }]) + }) + test("includes the selected variant on optimistic prompts", async () => { params = { id: "session-1" } variant = "high" diff --git a/packages/app/src/components/prompt-input/submit.ts b/packages/app/src/components/prompt-input/submit.ts index 2a23a560a0f..05d978a947c 100644 --- a/packages/app/src/components/prompt-input/submit.ts +++ b/packages/app/src/components/prompt-input/submit.ts @@ -4,7 +4,6 @@ import { base64Encode } from "@opencode-ai/core/util/encode" import { Binary } from "@opencode-ai/core/util/binary" import { useNavigate, useParams, useSearchParams } from "@solidjs/router" import { batch, type Accessor } from "solid-js" -import { useServer } from "@/context/server" import { useTabs } from "@/context/tabs" import { useServerSync, type ServerSync } from "@/context/server-sync" import { useLanguage } from "@/context/language" @@ -206,7 +205,6 @@ export function createPromptSubmit(input: PromptSubmitInput) { const language = useLanguage() const params = useParams() const [search] = useSearchParams<{ draftId?: string }>() - const server = useServer() const tabs = useTabs() const pendingKey = (sessionID: string) => ScopedKey.from(sdk().scope, sessionID) @@ -380,7 +378,7 @@ export function createPromptSubmit(input: PromptSubmitInput) { local.session.promote(sessionDirectory, session.id) layout.handoff.setTabs(base64Encode(sessionDirectory), session.id) const draftID = search.draftId - if (draftID) tabs.promoteDraft(draftID, { server: server.key, sessionId: session.id }) + if (draftID) tabs.promoteDraft(draftID, { server: tabs.draft(draftID).server, sessionId: session.id }) else navigate(`/${base64Encode(sessionDirectory)}/session/${session.id}`) submission.retarget(prompt.capture({ dir: base64Encode(sessionDirectory), id: session.id })) }