summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-17 15:04:13 -0600
committerAdam <[email protected]>2025-12-17 15:42:55 -0600
commitb4209582fb7d696e28b499b2b254ef4f853e0a13 (patch)
tree688da3912bd0f5a1e7e94ffe4fb675a2d9a57bb7
parentdbdea2f65958b088bda2998f0f225eafa1b95b43 (diff)
downloadopencode-b4209582fb7d696e28b499b2b254ef4f853e0a13.tar.gz
opencode-b4209582fb7d696e28b499b2b254ef4f853e0a13.zip
feat(desktop): optimistic prompt submit
-rw-r--r--packages/desktop/src/components/prompt-input.tsx25
-rw-r--r--packages/desktop/src/context/sync.tsx35
2 files changed, 55 insertions, 5 deletions
diff --git a/packages/desktop/src/components/prompt-input.tsx b/packages/desktop/src/components/prompt-input.tsx
index a8f0736f8..1a6e233e3 100644
--- a/packages/desktop/src/components/prompt-input.tsx
+++ b/packages/desktop/src/components/prompt-input.tsx
@@ -709,13 +709,28 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
}
}
+ const model = {
+ modelID: local.model.current()!.id,
+ providerID: local.model.current()!.provider.id,
+ }
+ const agent = local.agent.current()!.name
+
+ sync.session.addOptimisticMessage({
+ sessionID: existing.id,
+ text,
+ parts: [
+ { type: "text", text } as import("@opencode-ai/sdk/v2/client").Part,
+ ...(fileAttachmentParts as import("@opencode-ai/sdk/v2/client").Part[]),
+ ...(imageAttachmentParts as import("@opencode-ai/sdk/v2/client").Part[]),
+ ],
+ agent,
+ model,
+ })
+
sdk.client.session.prompt({
sessionID: existing.id,
- agent: local.agent.current()!.name,
- model: {
- modelID: local.model.current()!.id,
- providerID: local.model.current()!.provider.id,
- },
+ agent,
+ model,
parts: [
{
type: "text",
diff --git a/packages/desktop/src/context/sync.tsx b/packages/desktop/src/context/sync.tsx
index 2ab54b3ae..cb782c24b 100644
--- a/packages/desktop/src/context/sync.tsx
+++ b/packages/desktop/src/context/sync.tsx
@@ -4,6 +4,7 @@ import { Binary } from "@opencode-ai/util/binary"
import { createSimpleContext } from "@opencode-ai/ui/context"
import { useGlobalSync } from "./global-sync"
import { useSDK } from "./sdk"
+import type { Message, Part } from "@opencode-ai/sdk/v2/client"
export const { use: useSync, provider: SyncProvider } = createSimpleContext({
name: "Sync",
@@ -30,6 +31,40 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
if (match.found) return store.session[match.index]
return undefined
},
+ addOptimisticMessage(input: {
+ sessionID: string
+ text: string
+ parts: Part[]
+ agent: string
+ model: { providerID: string; modelID: string }
+ }) {
+ const messageID = crypto.randomUUID()
+ const message: Message = {
+ id: messageID,
+ sessionID: input.sessionID,
+ role: "user",
+ time: { created: Date.now() },
+ agent: input.agent,
+ model: input.model,
+ }
+ setStore(
+ produce((draft) => {
+ const messages = draft.message[input.sessionID]
+ if (!messages) {
+ draft.message[input.sessionID] = [message]
+ } else {
+ const result = Binary.search(messages, messageID, (m) => m.id)
+ messages.splice(result.index, 0, message)
+ }
+ draft.part[messageID] = input.parts.map((part, i) => ({
+ ...part,
+ id: `${messageID}-${i}`,
+ sessionID: input.sessionID,
+ messageID,
+ }))
+ }),
+ )
+ },
async sync(sessionID: string, _isRetry = false) {
const [session, messages, todo, diff] = await Promise.all([
sdk.client.session.get({ sessionID }, { throwOnError: true }),