From 7aba3c12212a960f6196172a666e0328ad8e703b Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Mon, 8 Dec 2025 18:32:23 +0000 Subject: [PATCH] add timeline tool visibility toggle --- package-lock.json | 12 ++++++------ package.json | 2 +- packages/electron-app/package.json | 2 +- packages/server/package-lock.json | 4 ++-- packages/server/package.json | 2 +- packages/server/src/config/schema.ts | 1 + packages/tauri-app/package.json | 2 +- packages/ui/package.json | 2 +- packages/ui/src/App.tsx | 2 ++ packages/ui/src/components/message-section.tsx | 2 ++ packages/ui/src/components/message-timeline.tsx | 6 +++++- packages/ui/src/lib/hooks/use-commands.ts | 10 ++++++++++ packages/ui/src/stores/preferences.tsx | 11 +++++++++++ .../ui/src/styles/messaging/message-timeline.css | 4 ++++ 14 files changed, 48 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index c6c3ca04..b28f28b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "codenomad-workspace", - "version": "0.2.8", + "version": "0.2.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "codenomad-workspace", - "version": "0.2.8", + "version": "0.2.9", "dependencies": { "7zip-bin": "^5.2.0", "google-auth-library": "^10.5.0" @@ -8815,7 +8815,7 @@ }, "packages/electron-app": { "name": "@neuralnomads/codenomad-electron-app", - "version": "0.2.8", + "version": "0.2.9", "dependencies": { "@codenomad/ui": "file:../ui", "@neuralnomads/codenomad": "file:../server" @@ -8843,7 +8843,7 @@ }, "packages/server": { "name": "@neuralnomads/codenomad", - "version": "0.2.8", + "version": "0.2.9", "dependencies": { "@fastify/cors": "^8.5.0", "@fastify/reply-from": "^9.8.0", @@ -8882,14 +8882,14 @@ }, "packages/tauri-app": { "name": "@codenomad/tauri-app", - "version": "0.2.8", + "version": "0.2.9", "devDependencies": { "@tauri-apps/cli": "^2.9.4" } }, "packages/ui": { "name": "@codenomad/ui", - "version": "0.2.8", + "version": "0.2.9", "dependencies": { "@git-diff-view/solid": "^0.0.8", "@kobalte/core": "0.13.11", diff --git a/package.json b/package.json index cb4f4495..7aecc5aa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codenomad-workspace", - "version": "0.2.8", + "version": "0.2.9", "private": true, "description": "CodeNomad monorepo workspace", "workspaces": { diff --git a/packages/electron-app/package.json b/packages/electron-app/package.json index 0f48c110..00fbc058 100644 --- a/packages/electron-app/package.json +++ b/packages/electron-app/package.json @@ -1,6 +1,6 @@ { "name": "@neuralnomads/codenomad-electron-app", - "version": "0.2.8", + "version": "0.2.9", "description": "CodeNomad - AI coding assistant", "author": { "name": "Neural Nomads", diff --git a/packages/server/package-lock.json b/packages/server/package-lock.json index e5d7a09d..c6c45412 100644 --- a/packages/server/package-lock.json +++ b/packages/server/package-lock.json @@ -1,12 +1,12 @@ { "name": "@neuralnomads/codenomad", - "version": "0.2.8", + "version": "0.2.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@neuralnomads/codenomad", - "version": "0.2.8", + "version": "0.2.9", "dependencies": { "@fastify/cors": "^8.5.0", "commander": "^12.1.0", diff --git a/packages/server/package.json b/packages/server/package.json index b906006c..4cce0075 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@neuralnomads/codenomad", - "version": "0.2.8", + "version": "0.2.9", "description": "CodeNomad Server", "author": { "name": "Neural Nomads", diff --git a/packages/server/src/config/schema.ts b/packages/server/src/config/schema.ts index 28a09b21..09dadf66 100644 --- a/packages/server/src/config/schema.ts +++ b/packages/server/src/config/schema.ts @@ -11,6 +11,7 @@ const AgentModelSelectionsSchema = z.record(z.string(), AgentModelSelectionSchem const PreferencesSchema = z.object({ showThinkingBlocks: z.boolean().default(false), thinkingBlocksExpansion: z.enum(["expanded", "collapsed"]).default("expanded"), + showTimelineTools: z.boolean().default(true), lastUsedBinary: z.string().optional(), environmentVariables: z.record(z.string()).default({}), modelRecents: z.array(ModelPreferenceSchema).default([]), diff --git a/packages/tauri-app/package.json b/packages/tauri-app/package.json index 8598ccdd..7914040a 100644 --- a/packages/tauri-app/package.json +++ b/packages/tauri-app/package.json @@ -1,6 +1,6 @@ { "name": "@codenomad/tauri-app", - "version": "0.2.8", + "version": "0.2.9", "private": true, "scripts": { "dev": "npx --yes @tauri-apps/cli@^2.9.4 dev", diff --git a/packages/ui/package.json b/packages/ui/package.json index e682331d..82945e16 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@codenomad/ui", - "version": "0.2.8", + "version": "0.2.9", "private": true, "type": "module", "scripts": { diff --git a/packages/ui/src/App.tsx b/packages/ui/src/App.tsx index 187bd683..15fe4717 100644 --- a/packages/ui/src/App.tsx +++ b/packages/ui/src/App.tsx @@ -52,6 +52,7 @@ const App: Component = () => { preferences, recordWorkspaceLaunch, toggleShowThinkingBlocks, + toggleShowTimelineTools, toggleAutoCleanupBlankSessions, toggleUsageMetrics, setDiffViewMode, @@ -222,6 +223,7 @@ const App: Component = () => { preferences, toggleAutoCleanupBlankSessions, toggleShowThinkingBlocks, + toggleShowTimelineTools, toggleUsageMetrics, setDiffViewMode, setToolOutputExpansion, diff --git a/packages/ui/src/components/message-section.tsx b/packages/ui/src/components/message-section.tsx index 3dde523c..e1ebbbc3 100644 --- a/packages/ui/src/components/message-section.tsx +++ b/packages/ui/src/components/message-section.tsx @@ -39,6 +39,7 @@ export interface MessageSectionProps { export default function MessageSection(props: MessageSectionProps) { const { preferences } = useConfig() const showUsagePreference = () => preferences().showUsageMetrics ?? true + const showTimelineToolsPreference = () => preferences().showTimelineTools ?? true const store = createMemo(() => messageStoreBus.getOrCreate(props.instanceId)) const messageIds = createMemo(() => store().getSessionMessageIds(props.sessionId)) @@ -639,6 +640,7 @@ export default function MessageSection(props: MessageSectionProps) { activeMessageId={activeMessageId()} instanceId={props.instanceId} sessionId={props.sessionId} + showToolSegments={showTimelineToolsPreference()} /> diff --git a/packages/ui/src/components/message-timeline.tsx b/packages/ui/src/components/message-timeline.tsx index e5e6ade9..23a33d65 100644 --- a/packages/ui/src/components/message-timeline.tsx +++ b/packages/ui/src/components/message-timeline.tsx @@ -24,6 +24,7 @@ interface MessageTimelineProps { activeMessageId?: string | null instanceId: string sessionId: string + showToolSegments?: boolean } const SEGMENT_LABELS: Record = { @@ -239,6 +240,7 @@ const MessageTimeline: Component = (props) => { const [hoveredSegment, setHoveredSegment] = createSignal(null) const [tooltipCoords, setTooltipCoords] = createSignal<{ top: number; left: number }>({ top: 0, left: 0 }) let hoverTimer: number | null = null + const showTools = () => props.showToolSegments ?? true const registerButtonRef = (segmentId: string, element: HTMLButtonElement | null) => { if (element) { @@ -313,6 +315,7 @@ const MessageTimeline: Component = (props) => { {(segment) => { onCleanup(() => buttonRefs.delete(segment.id)) const isActive = () => props.activeMessageId === segment.messageId + const isHidden = () => segment.type === "tool" && !(showTools() || isActive()) const shortLabelContent = () => { if (segment.type === "tool") { return segment.shortLabel ?? getToolIcon("tool") @@ -326,8 +329,9 @@ const MessageTimeline: Component = (props) => {