diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 7678ea6a8d..5164f01acd 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -86,6 +86,21 @@ const setSessionHandoff = (key: string, patch: Partial) => { touch(handoff.session, key, { ...prev, ...patch }) } +const readPromptParam = () => { + if (typeof window === "undefined") return + const value = new URLSearchParams(window.location.search).get("prompt")?.trim() + if (!value) return + return value +} + +const clearPromptParam = () => { + if (typeof window === "undefined") return + const url = new URL(window.location.href) + if (!url.searchParams.has("prompt")) return + url.searchParams.delete("prompt") + window.history.replaceState({}, "", url) +} + export default function Page() { const layout = useLayout() const local = useLocal() @@ -1491,6 +1506,20 @@ export default function Page() { setSessionHandoff(sessionKey(), { prompt: previewPrompt() }) }) + createEffect( + on( + () => [params.dir, params.id, prompt.ready()] as const, + () => { + if (!prompt.ready()) return + const value = readPromptParam() + if (!value) return + clearPromptParam() + if (prompt.dirty()) return + prompt.set([{ type: "text", content: value, start: 0, end: value.length }], value.length) + }, + ), + ) + createEffect(() => { if (!terminal.ready()) return language.locale() diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 0d5aefe7bc..405f8bbe3c 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -691,7 +691,6 @@ function App() { { if (Flag.OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT) { renderer.clearSelection() diff --git a/packages/opencode/src/cli/cmd/tui/component/border.tsx b/packages/opencode/src/cli/cmd/tui/component/border.tsx index 333071020c..f4402f27f6 100644 --- a/packages/opencode/src/cli/cmd/tui/component/border.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/border.tsx @@ -19,3 +19,17 @@ export const SplitBorder = { vertical: "┃", }, } + +export const RoundedBorder = { + topLeft: "╭", + topRight: "╮", + bottomLeft: "╰", + bottomRight: "╯", + horizontal: "─", + vertical: "│", + bottomT: "┴", + topT: "┬", + cross: "┼", + leftT: "├", + rightT: "┤", +} diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx index 8576dd5763..d244ad6460 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx @@ -3,7 +3,7 @@ import { createEffect, createMemo, type JSX, onMount, createSignal, onCleanup, S import "opentui-spinner/solid" import { useLocal } from "@tui/context/local" import { useTheme } from "@tui/context/theme" -import { EmptyBorder } from "@tui/component/border" + import { useSDK } from "@tui/context/sdk" import { useRoute } from "@tui/context/route" import { useSync } from "@tui/context/sync" @@ -779,23 +779,11 @@ export function Prompt(props: PromptProps) { promptPartTypeId={() => promptPartTypeId} /> (anchor = r)} visible={props.visible !== false}> - - + + + {store.mode === "shell" ? "! " : "❯ "} + +