summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/components/prompt-input
diff options
context:
space:
mode:
authorBrendan Allan <[email protected]>2026-02-18 23:03:24 +0800
committerGitHub <[email protected]>2026-02-18 23:03:24 +0800
commit1bb8574179bbf7c49a34ad0e5df522a752af08c2 (patch)
treed10e2ec54cc027dc8ffd76bb40031300f9eaeef8 /packages/app/src/components/prompt-input
parent2611c35acc3dc64582e15ad1efca36c60a2883a8 (diff)
downloadopencode-1bb8574179bbf7c49a34ad0e5df522a752af08c2.tar.gz
opencode-1bb8574179bbf7c49a34ad0e5df522a752af08c2.zip
app: refactor server management backend (#13813)
Diffstat (limited to 'packages/app/src/components/prompt-input')
-rw-r--r--packages/app/src/components/prompt-input/submit.test.ts51
-rw-r--r--packages/app/src/components/prompt-input/submit.ts29
2 files changed, 44 insertions, 36 deletions
diff --git a/packages/app/src/components/prompt-input/submit.test.ts b/packages/app/src/components/prompt-input/submit.test.ts
index 475a0e20f..c3d6a9281 100644
--- a/packages/app/src/components/prompt-input/submit.test.ts
+++ b/packages/app/src/components/prompt-input/submit.test.ts
@@ -12,24 +12,27 @@ let selected = "/repo/worktree-a"
const promptValue: Prompt = [{ type: "text", content: "ls", start: 0, end: 2 }]
-const clientFor = (directory: string) => ({
- session: {
- create: async () => {
- createdSessions.push(directory)
- return { data: { id: `session-${createdSessions.length}` } }
+const clientFor = (directory: string) => {
+ createdClients.push(directory)
+ return {
+ session: {
+ create: async () => {
+ createdSessions.push(directory)
+ return { data: { id: `session-${createdSessions.length}` } }
+ },
+ shell: async () => {
+ sentShell.push(directory)
+ return { data: undefined }
+ },
+ prompt: async () => ({ data: undefined }),
+ command: async () => ({ data: undefined }),
+ abort: async () => ({ data: undefined }),
},
- shell: async () => {
- sentShell.push(directory)
- return { data: undefined }
+ worktree: {
+ create: async () => ({ data: { directory: `${directory}/new` } }),
},
- prompt: async () => ({ data: undefined }),
- command: async () => ({ data: undefined }),
- abort: async () => ({ data: undefined }),
- },
- worktree: {
- create: async () => ({ data: { directory: `${directory}/new` } }),
- },
-})
+ }
+}
beforeAll(async () => {
const rootClient = clientFor("/repo/main")
@@ -88,11 +91,17 @@ beforeAll(async () => {
}))
mock.module("@/context/sdk", () => ({
- useSDK: () => ({
- directory: "/repo/main",
- client: rootClient,
- url: "http://localhost:4096",
- }),
+ useSDK: () => {
+ const sdk = {
+ directory: "/repo/main",
+ client: rootClient,
+ url: "http://localhost:4096",
+ createClient(opts: any) {
+ return clientFor(opts.directory)
+ },
+ }
+ return sdk
+ },
}))
mock.module("@/context/sync", () => ({
diff --git a/packages/app/src/components/prompt-input/submit.ts b/packages/app/src/components/prompt-input/submit.ts
index 6b6f4a4e0..8a3dfc40d 100644
--- a/packages/app/src/components/prompt-input/submit.ts
+++ b/packages/app/src/components/prompt-input/submit.ts
@@ -1,21 +1,20 @@
-import { Accessor } from "solid-js"
-import { useNavigate, useParams } from "@solidjs/router"
-import { createOpencodeClient, type Message } from "@opencode-ai/sdk/v2/client"
+import type { Message } from "@opencode-ai/sdk/v2/client"
import { showToast } from "@opencode-ai/ui/toast"
import { base64Encode } from "@opencode-ai/util/encode"
-import { useLocal } from "@/context/local"
-import { usePrompt, type ImageAttachmentPart, type Prompt } from "@/context/prompt"
+import { useNavigate, useParams } from "@solidjs/router"
+import type { Accessor } from "solid-js"
+import type { FileSelection } from "@/context/file"
+import { useGlobalSync } from "@/context/global-sync"
+import { useLanguage } from "@/context/language"
import { useLayout } from "@/context/layout"
+import { useLocal } from "@/context/local"
+import { type ImageAttachmentPart, type Prompt, usePrompt } from "@/context/prompt"
import { useSDK } from "@/context/sdk"
import { useSync } from "@/context/sync"
-import { useGlobalSync } from "@/context/global-sync"
-import { usePlatform } from "@/context/platform"
-import { useLanguage } from "@/context/language"
import { Identifier } from "@/utils/id"
import { Worktree as WorktreeState } from "@/utils/worktree"
-import type { FileSelection } from "@/context/file"
-import { setCursorPosition } from "./editor-dom"
import { buildRequestParts } from "./build-request-parts"
+import { setCursorPosition } from "./editor-dom"
type PendingPrompt = {
abort: AbortController
@@ -56,7 +55,6 @@ export function createPromptSubmit(input: PromptSubmitInput) {
const sdk = useSDK()
const sync = useSync()
const globalSync = useGlobalSync()
- const platform = usePlatform()
const local = useLocal()
const prompt = usePrompt()
const layout = useLayout()
@@ -175,9 +173,7 @@ export function createPromptSubmit(input: PromptSubmitInput) {
}
if (sessionDirectory !== projectDirectory) {
- client = createOpencodeClient({
- baseUrl: sdk.url,
- fetch: platform.fetch,
+ client = sdk.createClient({
directory: sessionDirectory,
throwOnError: true,
})
@@ -372,7 +368,10 @@ export function createPromptSubmit(input: PromptSubmitInput) {
const timer = { id: undefined as number | undefined }
const timeout = new Promise<Awaited<ReturnType<typeof WorktreeState.wait>>>((resolve) => {
timer.id = window.setTimeout(() => {
- resolve({ status: "failed", message: language.t("workspace.error.stillPreparing") })
+ resolve({
+ status: "failed",
+ message: language.t("workspace.error.stillPreparing"),
+ })
}, timeoutMs)
})