diff options
| author | Adam <[email protected]> | 2025-12-12 13:55:46 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2025-12-12 15:24:41 -0600 |
| commit | bf420e7df6c9c01e445bcd262fbc6b4480a9c312 (patch) | |
| tree | 1a4fb2ad5f5f4b8e2699e1a2897f4890b8a6291b /packages/ui | |
| parent | 78484f545cd6a0a1d326079907d51bee4e871936 (diff) | |
| download | opencode-bf420e7df6c9c01e445bcd262fbc6b4480a9c312.tar.gz opencode-bf420e7df6c9c01e445bcd262fbc6b4480a9c312.zip | |
chore: cleanup
Diffstat (limited to 'packages/ui')
| -rw-r--r-- | packages/ui/src/components/message-part.tsx | 41 | ||||
| -rw-r--r-- | packages/ui/src/components/session-turn.tsx | 6 |
2 files changed, 25 insertions, 22 deletions
diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx index 1a33d15c5..d69432caa 100644 --- a/packages/ui/src/components/message-part.tsx +++ b/packages/ui/src/components/message-part.tsx @@ -8,6 +8,7 @@ import { ToolPart, UserMessage, } from "@opencode-ai/sdk/v2" +import { useData } from "../context" import { useDiffComponent } from "../context/diff" import { BasicTool } from "./basic-tool" import { GenericTool } from "./basic-tool" @@ -16,26 +17,34 @@ import { Icon } from "./icon" import { Checkbox } from "./checkbox" import { DiffChanges } from "./diff-changes" import { Markdown } from "./markdown" -import { getDirectory, getFilename } from "@opencode-ai/util/path" -import { sanitizePart } from "@opencode-ai/util/sanitize" +import { getDirectory as _getDirectory, getFilename } from "@opencode-ai/util/path" export interface MessageProps { message: MessageType parts: PartType[] - sanitize?: RegExp } export interface MessagePartProps { part: PartType message: MessageType hideDetails?: boolean - sanitize?: RegExp } export type PartComponent = Component<MessagePartProps> export const PART_MAPPING: Record<string, PartComponent | undefined> = {} +function relativizeProjectPaths(text: string, directory?: string) { + if (!text) return "" + if (!directory) return text + return text.split(directory).join("") +} + +function getDirectory(path: string | undefined) { + const data = useData() + return relativizeProjectPaths(_getDirectory(path), data.directory) +} + export function registerPartComponent(type: string, component: PartComponent) { PART_MAPPING[type] = component } @@ -48,26 +57,20 @@ export function Message(props: MessageProps) { </Match> <Match when={props.message.role === "assistant" && props.message}> {(assistantMessage) => ( - <AssistantMessageDisplay - message={assistantMessage() as AssistantMessage} - parts={props.parts} - sanitize={props.sanitize} - /> + <AssistantMessageDisplay message={assistantMessage() as AssistantMessage} parts={props.parts} /> )} </Match> </Switch> ) } -export function AssistantMessageDisplay(props: { message: AssistantMessage; parts: PartType[]; sanitize?: RegExp }) { +export function AssistantMessageDisplay(props: { message: AssistantMessage; parts: PartType[] }) { const filteredParts = createMemo(() => { return props.parts?.filter((x) => { return x.type !== "tool" || (x as ToolPart).tool !== "todoread" }) }) - return ( - <For each={filteredParts()}>{(part) => <Part part={part} message={props.message} sanitize={props.sanitize} />}</For> - ) + return <For each={filteredParts()}>{(part) => <Part part={part} message={props.message} />}</For> } export function UserMessageDisplay(props: { message: UserMessage; parts: PartType[] }) { @@ -82,10 +85,9 @@ export function UserMessageDisplay(props: { message: UserMessage; parts: PartTyp export function Part(props: MessagePartProps) { const component = createMemo(() => PART_MAPPING[props.part.type]) - const part = createMemo(() => sanitizePart(props.part, props.sanitize)) return ( <Show when={component()}> - <Dynamic component={component()} part={part()} message={props.message} hideDetails={props.hideDetails} /> + <Dynamic component={component()} part={props.part} message={props.message} hideDetails={props.hideDetails} /> </Show> ) } @@ -173,12 +175,15 @@ PART_MAPPING["tool"] = function ToolPartDisplay(props) { } PART_MAPPING["text"] = function TextPartDisplay(props) { + const data = useData() const part = props.part as TextPart - const sanitized = createMemo(() => (props.sanitize ? (sanitizePart(part, props.sanitize) as TextPart) : part)) + const content = createMemo(() => (part.text ?? "").trim()) + const displayText = createMemo(() => relativizeProjectPaths(content(), data.directory)) + return ( - <Show when={part.text.trim()}> + <Show when={displayText()}> <div data-component="text-part"> - <Markdown text={sanitized().text.trim()} /> + <Markdown text={displayText()} /> </div> </Show> ) diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx index 0043719e0..d038ef142 100644 --- a/packages/ui/src/components/session-turn.tsx +++ b/packages/ui/src/components/session-turn.tsx @@ -33,7 +33,6 @@ export function SessionTurn( ) { const data = useData() const diffComponent = useDiffComponent() - const sanitizer = createMemo(() => (data.directory ? new RegExp(`${data.directory}/`, "g") : undefined)) const messages = createMemo(() => (props.sessionID ? (data.store.message[props.sessionID] ?? []) : [])) const userMessages = createMemo(() => messages() @@ -208,7 +207,7 @@ export function SessionTurn( </div> </div> <div data-slot="session-turn-message-content"> - <Message message={message()} parts={parts()} sanitize={sanitizer()} /> + <Message message={message()} parts={parts()} /> </div> {/* Response */} <div data-slot="session-turn-response-section"> @@ -252,11 +251,10 @@ export function SessionTurn( <Message message={assistantMessage} parts={parts().filter((p) => p?.id !== last()?.id)} - sanitize={sanitizer()} /> </Match> <Match when={true}> - <Message message={assistantMessage} parts={parts()} sanitize={sanitizer()} /> + <Message message={assistantMessage} parts={parts()} /> </Match> </Switch> ) |
