From 4e0ab6b6346606bc07918c6d10981729994d0cc7 Mon Sep 17 00:00:00 2001
From: Adam <2363879+adamdotdevin@users.noreply.github.com>
Date: Tue, 28 Oct 2025 09:48:54 -0500
Subject: [PATCH] wip: desktop work
---
.../src/components/assistant-message.tsx | 111 +++++++++++++-----
packages/desktop/src/pages/index.tsx | 14 +--
packages/ui/src/styles/tailwind/utilities.css | 8 ++
packages/ui/src/styles/utilities.css | 8 ++
4 files changed, 103 insertions(+), 38 deletions(-)
diff --git a/packages/desktop/src/components/assistant-message.tsx b/packages/desktop/src/components/assistant-message.tsx
index 7b4cfc71d..248af5313 100644
--- a/packages/desktop/src/components/assistant-message.tsx
+++ b/packages/desktop/src/components/assistant-message.tsx
@@ -15,11 +15,13 @@ import type { BashTool } from "opencode/tool/bash"
import type { EditTool } from "opencode/tool/edit"
import type { WriteTool } from "opencode/tool/write"
import { DiffChanges } from "./diff-changes"
+import { TodoWriteTool } from "opencode/tool/todo"
export function AssistantMessage(props: { message: AssistantMessage; parts: Part[] }) {
+ const filteredParts = createMemo(() => props.parts.filter((x) => x.type !== "tool" || x.tool !== "todoread"))
return (
-
+
{(part) => {
const component = createMemo(() => PART_MAPPING[part.type as keyof typeof PART_MAPPING])
return (
@@ -88,8 +90,11 @@ function ToolPart(props: { part: ToolPart; message: AssistantMessage }) {
type TriggerTitle = {
title: string
+ titleClass?: string
subtitle?: string
+ subtitleClass?: string
args?: string[]
+ argsClass?: string
action?: JSX.Element
}
@@ -99,34 +104,58 @@ const isTriggerTitle = (val: any): val is TriggerTitle => {
function BasicTool(props: { icon: IconProps["name"]; trigger: TriggerTitle | JSX.Element; children?: JSX.Element }) {
const resolved = children(() => props.children)
-
return (
-
-
-
-
-
-
- {(props.trigger as TriggerTitle).title}
-
-
- {(props.trigger as TriggerTitle).subtitle}
-
-
-
- {(arg) => {arg}}
-
-
-
-
{(props.trigger as TriggerTitle).action}
-
-
- {props.trigger as JSX.Element}
-
+
+
+
+
+ {(trigger) => (
+
+
+
+ {trigger().title}
+
+
+
+ {trigger().subtitle}
+
+
+
+
+ {(arg) => (
+
+ {arg}
+
+ )}
+
+
+
+
{trigger().action}
+
+ )}
+
+ {props.trigger as JSX.Element}
+
+
@@ -178,7 +207,7 @@ ToolRegistry.register({
return (
)
},
@@ -188,7 +217,7 @@ ToolRegistry.register({
name: "list",
render(props) {
return (
-
+
{props.output}
@@ -204,7 +233,7 @@ ToolRegistry.register({
({
({
({
icon="task"
trigger={{
title: `${props.input.subagent_type || props.tool} Agent`,
+ titleClass: "capitalize",
subtitle: props.input.description,
}}
>
@@ -311,7 +341,7 @@ ToolRegistry.register({
icon="code-lines"
trigger={
-
+
Edit
@@ -340,7 +370,7 @@ ToolRegistry.register({
icon="code-lines"
trigger={
-
+
Write
@@ -360,3 +390,22 @@ ToolRegistry.register({
)
},
})
+
+ToolRegistry.register({
+ name: "todowrite",
+ render(props) {
+ return (
+ t.status === "completed").length}/${props.input.todos?.length}`,
+ }}
+ >
+
+ {props.output}
+
+
+ )
+ },
+})
diff --git a/packages/desktop/src/pages/index.tsx b/packages/desktop/src/pages/index.tsx
index 7da925459..42e96e32e 100644
--- a/packages/desktop/src/pages/index.tsx
+++ b/packages/desktop/src/pages/index.tsx
@@ -696,24 +696,24 @@ export default function Page() {
-
-
+
+
-
+
-
- {getDirectory(diff.file)}
+
+ {getDirectory(diff.file)}
-
+
{getFilename(diff.file)}
-
+
diff --git a/packages/ui/src/styles/tailwind/utilities.css b/packages/ui/src/styles/tailwind/utilities.css
index f3bedca37..fbb407b1d 100644
--- a/packages/ui/src/styles/tailwind/utilities.css
+++ b/packages/ui/src/styles/tailwind/utilities.css
@@ -7,3 +7,11 @@
scrollbar-width: none; /* Firefox */
}
}
+
+@utility truncate-start {
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ direction: rtl;
+ text-align: left;
+}
diff --git a/packages/ui/src/styles/utilities.css b/packages/ui/src/styles/utilities.css
index 7d14b6539..99b7760a0 100644
--- a/packages/ui/src/styles/utilities.css
+++ b/packages/ui/src/styles/utilities.css
@@ -48,6 +48,14 @@
border-width: 0;
}
+.truncate-start {
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ direction: rtl;
+ text-align: left;
+}
+
.text-12-regular {
font-family: var(--font-family-sans);
font-size: var(--font-size-small);