summaryrefslogtreecommitdiffhomepage
path: root/packages/desktop
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-15 06:52:54 -0600
committerAdam <[email protected]>2025-12-15 10:20:19 -0600
commitdf2ebfac7d3dca6c2262258e6ee85a3c22cc53c3 (patch)
tree674699ff283eb8af9ddd087cbca81407020cc06d /packages/desktop
parent5fbcb203f5a2cab13c2f7468430b25be4989063b (diff)
downloadopencode-df2ebfac7d3dca6c2262258e6ee85a3c22cc53c3.tar.gz
opencode-df2ebfac7d3dca6c2262258e6ee85a3c22cc53c3.zip
wip(desktop): progress
Diffstat (limited to 'packages/desktop')
-rw-r--r--packages/desktop/src/context/layout.tsx15
-rw-r--r--packages/desktop/src/pages/layout.tsx6
-rw-r--r--packages/desktop/src/pages/session.tsx69
3 files changed, 89 insertions, 1 deletions
diff --git a/packages/desktop/src/context/layout.tsx b/packages/desktop/src/context/layout.tsx
index af71c6a00..604f7c5d1 100644
--- a/packages/desktop/src/context/layout.tsx
+++ b/packages/desktop/src/context/layout.tsx
@@ -46,6 +46,9 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
review: {
state: "pane" as "pane" | "tab",
},
+ steps: {
+ expanded: false,
+ },
sessionTabs: {} as Record<string, SessionTabs>,
}),
{
@@ -161,6 +164,18 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
setStore("review", "state", "tab")
},
},
+ steps: {
+ expanded: createMemo(() => store.steps?.expanded ?? false),
+ toggle() {
+ setStore("steps", "expanded", (x) => !x)
+ },
+ expand() {
+ setStore("steps", "expanded", true)
+ },
+ collapse() {
+ setStore("steps", "expanded", false)
+ },
+ },
tabs(sessionKey: string) {
const tabs = createMemo(() => store.sessionTabs[sessionKey] ?? { all: [] })
return {
diff --git a/packages/desktop/src/pages/layout.tsx b/packages/desktop/src/pages/layout.tsx
index bb2302503..53078e01b 100644
--- a/packages/desktop/src/pages/layout.tsx
+++ b/packages/desktop/src/pages/layout.tsx
@@ -157,6 +157,12 @@ export default function Layout(props: ParentProps) {
]
: []),
{
+ id: "provider.connect",
+ title: "Connect provider",
+ category: "Provider",
+ onSelect: () => connectProvider(),
+ },
+ {
id: "session.previous",
title: "Previous session",
category: "Session",
diff --git a/packages/desktop/src/pages/session.tsx b/packages/desktop/src/pages/session.tsx
index 5c74f2d2e..d0c3bf7de 100644
--- a/packages/desktop/src/pages/session.tsx
+++ b/packages/desktop/src/pages/session.tsx
@@ -34,6 +34,7 @@ import { Terminal } from "@/components/terminal"
import { checksum } from "@opencode-ai/util/encode"
import { useDialog } from "@opencode-ai/ui/context/dialog"
import { DialogSelectFile } from "@/components/dialog-select-file"
+import { DialogSelectModel } from "@/components/dialog-select-model"
import { useCommand } from "@/context/command"
import { useNavigate, useParams } from "@solidjs/router"
import { AssistantMessage, UserMessage } from "@opencode-ai/sdk/v2"
@@ -70,6 +71,25 @@ export default function Page() {
setMessageStore("messageId", message?.id)
}
+ function navigateMessageByOffset(offset: number) {
+ const messages = userMessages()
+ if (messages.length === 0) return
+
+ const current = activeMessage()
+ const currentIndex = current ? messages.findIndex((m) => m.id === current.id) : -1
+
+ let targetIndex: number
+ if (currentIndex === -1) {
+ targetIndex = offset > 0 ? 0 : messages.length - 1
+ } else {
+ targetIndex = currentIndex + offset
+ }
+
+ if (targetIndex < 0 || targetIndex >= messages.length) return
+
+ setActiveMessage(messages[targetIndex])
+ }
+
const last = createMemo(
() => messages().findLast((x) => x.role === "assistant" && x.tokens.output > 0) as AssistantMessage,
)
@@ -118,7 +138,7 @@ export default function Page() {
title: "New session",
description: "Create a new session",
category: "Session",
- keybind: "mod+n",
+ keybind: "mod+shift+s",
slash: "new",
onSelect: () => navigate(`/${params.dir}/session`),
},
@@ -163,6 +183,49 @@ export default function Page() {
keybind: "ctrl+shift+`",
onSelect: () => terminal.new(),
},
+ {
+ id: "steps.toggle",
+ title: "Toggle steps",
+ description: "Show or hide the steps",
+ category: "View",
+ keybind: "mod+e",
+ slash: "steps",
+ onSelect: () => layout.steps.toggle(),
+ },
+ {
+ id: "message.previous",
+ title: "Previous message",
+ description: "Go to the previous user message",
+ category: "Session",
+ keybind: "mod+arrowup",
+ disabled: !params.id,
+ onSelect: () => navigateMessageByOffset(-1),
+ },
+ {
+ id: "message.next",
+ title: "Next message",
+ description: "Go to the next user message",
+ category: "Session",
+ keybind: "mod+arrowdown",
+ disabled: !params.id,
+ onSelect: () => navigateMessageByOffset(1),
+ },
+ {
+ id: "model.choose",
+ title: "Choose model",
+ description: "Select a different model",
+ category: "Model",
+ slash: "model",
+ onSelect: () => dialog.replace(() => <DialogSelectModel />),
+ },
+ {
+ id: "agent.cycle",
+ title: "Cycle agent",
+ description: "Switch to the next agent",
+ category: "Agent",
+ slash: "agent",
+ onSelect: () => local.agent.move(1),
+ },
])
// Handle keyboard events that aren't commands
@@ -492,6 +555,10 @@ export default function Page() {
<SessionTurn
sessionID={params.id!}
messageID={activeMessage()?.id!}
+ stepsExpanded={layout.steps.expanded()}
+ onStepsExpandedChange={(expanded) =>
+ expanded ? layout.steps.expand() : layout.steps.collapse()
+ }
classes={{
root: "pb-20 flex-1 min-w-0",
content: "pb-20",