diff --git a/packages/app/src/context/prompt.tsx b/packages/app/src/context/prompt.tsx index b0dbca221eed..59174eea3959 100644 --- a/packages/app/src/context/prompt.tsx +++ b/packages/app/src/context/prompt.tsx @@ -1,6 +1,6 @@ import { createSimpleContext } from "@opencode-ai/ui/context" import { checksum } from "@opencode-ai/core/util/encode" -import { useParams } from "@solidjs/router" +import { useParams, useSearchParams } from "@solidjs/router" import { batch, createMemo, createRoot, getOwner, onCleanup } from "solid-js" import { createStore, type SetStoreFunction } from "solid-js/store" import type { FileSelection } from "@/context/file" @@ -153,9 +153,11 @@ const MAX_PROMPT_SESSIONS = 20 type PromptSession = ReturnType -type Scope = { - dir: string - id?: string +type Scope = { draftID: string } | { dir: string; id?: string } + +function scopeKey(scope: Scope) { + if ("draftID" in scope) return `draft:${scope.draftID}` + return `${scope.dir}:${scope.id ?? WORKSPACE_KEY}` } type PromptCacheEntry = { @@ -163,11 +165,15 @@ type PromptCacheEntry = { dispose: VoidFunction } -function createPromptSession(scope: ServerScope, dir: string, id: string | undefined) { - const legacy = `${dir}/prompt${id ? "/" + id : ""}.v2` +function promptTarget(serverScope: ServerScope, scope: Scope) { + if ("draftID" in scope) return Persist.draft(scope.draftID, "prompt") + const legacy = `${scope.dir}/prompt${scope.id ? "/" + scope.id : ""}.v2` + return Persist.serverScoped(serverScope, scope.dir, scope.id, "prompt", [legacy]) +} +function createPromptSession(serverScope: ServerScope, scope: Scope) { const [store, setStore, _, ready] = persisted( - Persist.serverScoped(scope, dir, id, "prompt", [legacy]), + promptTarget(serverScope, scope), createStore<{ prompt: Prompt cursor?: number @@ -231,6 +237,7 @@ export const { use: usePrompt, provider: PromptProvider } = createSimpleContext( gate: false, init: () => { const params = useParams() + const [search] = useSearchParams<{ draftId?: string }>() const serverSDK = useServerSDK() const cache = new Map() @@ -254,8 +261,8 @@ export const { use: usePrompt, provider: PromptProvider } = createSimpleContext( } const owner = getOwner() - const load = (dir: string, id: string | undefined) => { - const key = `${dir}:${id ?? WORKSPACE_KEY}` + const load = (scope: Scope) => { + const key = scopeKey(scope) const existing = cache.get(key) if (existing) { cache.delete(key) @@ -265,7 +272,7 @@ export const { use: usePrompt, provider: PromptProvider } = createSimpleContext( const entry = createRoot( (dispose) => ({ - value: createPromptSession(serverSDK.scope, dir, id), + value: createPromptSession(serverSDK.scope, scope), dispose, }), owner, @@ -276,8 +283,8 @@ export const { use: usePrompt, provider: PromptProvider } = createSimpleContext( return entry.value } - const session = createMemo(() => load(params.dir!, params.id)) - const pick = (scope?: Scope) => (scope ? load(scope.dir, scope.id) : session()) + const session = createMemo(() => load(search.draftId ? { draftID: search.draftId } : { dir: params.dir!, id: params.id })) + const pick = (scope?: Scope) => (scope ? load(scope) : session()) return { ready: () => session().ready,