From ae322c53cc7f5a209206692a2d7e6e94a0911076 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Thu, 15 Jan 2026 08:26:49 +0000 Subject: [PATCH 1/3] fix(ui): correct Go to Session navigation across instances --- packages/ui/src/components/message-block.tsx | 16 ++++++++++++++-- .../src/components/permission-approval-modal.tsx | 11 +++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/components/message-block.tsx b/packages/ui/src/components/message-block.tsx index eace1a0e..650df4ac 100644 --- a/packages/ui/src/components/message-block.tsx +++ b/packages/ui/src/components/message-block.tsx @@ -82,8 +82,20 @@ interface TaskSessionLocation { parentId: string | null } -function findTaskSessionLocation(sessionId: string): TaskSessionLocation | null { +function findTaskSessionLocation(sessionId: string, preferredInstanceId?: string): TaskSessionLocation | null { if (!sessionId) return null + + if (preferredInstanceId) { + const session = sessions().get(preferredInstanceId)?.get(sessionId) + if (session) { + return { + sessionId: session.id, + instanceId: preferredInstanceId, + parentId: session.parentId ?? null, + } + } + } + const allSessions = sessions() for (const [instanceId, sessionMap] of allSessions) { const session = sessionMap?.get(sessionId) @@ -440,7 +452,7 @@ export default function MessageBlock(props: MessageBlockProps) { const hasToolState = Boolean(toolState) && (isToolStateRunning(toolState) || isToolStateCompleted(toolState) || isToolStateError(toolState)) const taskSessionId = hasToolState ? extractTaskSessionId(toolState) : "" - const taskLocation = taskSessionId ? findTaskSessionLocation(taskSessionId) : null + const taskLocation = taskSessionId ? findTaskSessionLocation(taskSessionId, props.instanceId) : null const handleGoToTaskSession = (event: MouseEvent) => { event.preventDefault() event.stopPropagation() diff --git a/packages/ui/src/components/permission-approval-modal.tsx b/packages/ui/src/components/permission-approval-modal.tsx index 66e79be8..3a010503 100644 --- a/packages/ui/src/components/permission-approval-modal.tsx +++ b/packages/ui/src/components/permission-approval-modal.tsx @@ -10,7 +10,7 @@ import { setActivePermissionIdForInstance, setActiveQuestionIdForInstance, } from "../stores/instances" -import { loadMessages, setActiveSession } from "../stores/sessions" +import { ensureSessionParentExpanded, loadMessages, sessions as sessionStateSessions, setActiveSessionFromList } from "../stores/sessions" import { messageStoreBus } from "../stores/message-v2/bus" import ToolCall from "./tool-call" @@ -201,7 +201,14 @@ const PermissionApprovalModal: Component = (props) function handleGoToSession(sessionId: string) { if (!sessionId) return - setActiveSession(props.instanceId, sessionId) + + const session = sessionStateSessions().get(props.instanceId)?.get(sessionId) + const parentId = session?.parentId ?? session?.id + if (parentId) { + ensureSessionParentExpanded(props.instanceId, parentId) + } + + setActiveSessionFromList(props.instanceId, sessionId) props.onClose() } From 7749225f717672de6439e969c4d7f748a2abb5f5 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Thu, 15 Jan 2026 08:36:56 +0000 Subject: [PATCH 2/3] fix(ui): restore pasted text expand controls\n\nFixes #67 --- .../src/components/session/session-view.tsx | 86 +++++++++++++++++-- 1 file changed, 78 insertions(+), 8 deletions(-) diff --git a/packages/ui/src/components/session/session-view.tsx b/packages/ui/src/components/session/session-view.tsx index 1efcda6b..7de204b3 100644 --- a/packages/ui/src/components/session/session-view.tsx +++ b/packages/ui/src/components/session/session-view.tsx @@ -1,11 +1,12 @@ import { Show, For, createMemo, createEffect, type Component } from "solid-js" +import { Expand } from "lucide-solid" import type { Session } from "../../types/session" import type { Attachment } from "../../types/attachment" import type { ClientPart } from "../../types/message" import MessageSection from "../message-section" import { messageStoreBus } from "../../stores/message-v2/bus" import PromptInput from "../prompt-input" -import AttachmentChip from "../attachment-chip" +import type { Attachment as PromptAttachment } from "../../types/attachment" import { getAttachments, removeAttachment } from "../../stores/attachments" import { instances } from "../../stores/instances" import { loadMessages, sendMessage, forkSession, isSessionMessagesLoading, setActiveParentSession, setActiveSession, runShellCommand, abortSession } from "../../stores/sessions" @@ -49,6 +50,54 @@ export const SessionView: Component = (props) => { }) const attachments = createMemo(() => getAttachments(props.instanceId, props.sessionId)) + + function handleExpandTextAttachment(attachment: PromptAttachment) { + if (attachment.source.type !== "text") return + + const textarea = rootRef?.querySelector(".prompt-input") as HTMLTextAreaElement | null + const value = attachment.source.value + const match = attachment.display.match(/pasted #(\d+)/) + const placeholder = match ? `[pasted #${match[1]}]` : null + + const currentText = textarea?.value ?? "" + + let nextText = currentText + let selectionTarget: number | null = null + + if (placeholder) { + const placeholderIndex = currentText.indexOf(placeholder) + if (placeholderIndex !== -1) { + nextText = + currentText.substring(0, placeholderIndex) + + value + + currentText.substring(placeholderIndex + placeholder.length) + selectionTarget = placeholderIndex + value.length + } + } + + if (nextText === currentText) { + if (textarea) { + const start = textarea.selectionStart + const end = textarea.selectionEnd + nextText = currentText.substring(0, start) + value + currentText.substring(end) + selectionTarget = start + value.length + } else { + nextText = currentText + value + } + } + + if (textarea) { + textarea.value = nextText + textarea.dispatchEvent(new Event("input", { bubbles: true })) + textarea.focus() + if (selectionTarget !== null) { + textarea.setSelectionRange(selectionTarget, selectionTarget) + } + } + + removeAttachment(props.instanceId, props.sessionId, attachment.id) + } + let scrollToBottomHandle: (() => void) | undefined let rootRef: HTMLDivElement | undefined function scheduleScrollToBottom() { @@ -235,14 +284,35 @@ export const SessionView: Component = (props) => { 0}> -
+
- {(attachment) => ( - removeAttachment(props.instanceId, props.sessionId, attachment.id)} - /> - )} + {(attachment) => { + const isText = attachment.source.type === "text" + return ( +
+ {attachment.display} + + + + +
+ ) + }}
From 69f221942ca42e4dc8459d2fea489f95695b43cd Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Thu, 15 Jan 2026 08:39:06 +0000 Subject: [PATCH 3/3] Bump version to 0.7.1 --- package-lock.json | 12 ++++++------ package.json | 2 +- packages/electron-app/package.json | 2 +- packages/opencode-config/package.json | 2 +- packages/server/package-lock.json | 4 ++-- packages/server/package.json | 2 +- packages/tauri-app/package.json | 2 +- packages/ui/package.json | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7639b7fe..b20438c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "codenomad-workspace", - "version": "0.7.0", + "version": "0.7.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "codenomad-workspace", - "version": "0.7.0", + "version": "0.7.1", "dependencies": { "7zip-bin": "^5.2.0", "google-auth-library": "^10.5.0" @@ -7389,7 +7389,7 @@ }, "packages/electron-app": { "name": "@neuralnomads/codenomad-electron-app", - "version": "0.7.0", + "version": "0.7.1", "dependencies": { "@codenomad/ui": "file:../ui", "@neuralnomads/codenomad": "file:../server" @@ -7423,7 +7423,7 @@ }, "packages/server": { "name": "@neuralnomads/codenomad", - "version": "0.7.0", + "version": "0.7.1", "dependencies": { "@fastify/cors": "^8.5.0", "@fastify/reply-from": "^9.8.0", @@ -7458,14 +7458,14 @@ }, "packages/tauri-app": { "name": "@codenomad/tauri-app", - "version": "0.7.0", + "version": "0.7.1", "devDependencies": { "@tauri-apps/cli": "^2.9.4" } }, "packages/ui": { "name": "@codenomad/ui", - "version": "0.7.0", + "version": "0.7.1", "dependencies": { "@git-diff-view/solid": "^0.0.8", "@kobalte/core": "0.13.11", diff --git a/package.json b/package.json index 725c8ea8..342ccae9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codenomad-workspace", - "version": "0.7.0", + "version": "0.7.1", "private": true, "description": "CodeNomad monorepo workspace", "workspaces": { diff --git a/packages/electron-app/package.json b/packages/electron-app/package.json index 0be202c2..0942fca2 100644 --- a/packages/electron-app/package.json +++ b/packages/electron-app/package.json @@ -1,6 +1,6 @@ { "name": "@neuralnomads/codenomad-electron-app", - "version": "0.7.0", + "version": "0.7.1", "description": "CodeNomad - AI coding assistant", "author": { "name": "Neural Nomads", diff --git a/packages/opencode-config/package.json b/packages/opencode-config/package.json index 4feb72e9..b89efcc0 100644 --- a/packages/opencode-config/package.json +++ b/packages/opencode-config/package.json @@ -3,6 +3,6 @@ "version": "0.5.0", "private": true, "dependencies": { - "@opencode-ai/plugin": "1.1.12" + "@opencode-ai/plugin": "1.1.16" } } diff --git a/packages/server/package-lock.json b/packages/server/package-lock.json index 09780fad..e764af11 100644 --- a/packages/server/package-lock.json +++ b/packages/server/package-lock.json @@ -1,12 +1,12 @@ { "name": "@neuralnomads/codenomad", - "version": "0.7.0", + "version": "0.7.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@neuralnomads/codenomad", - "version": "0.7.0", + "version": "0.7.1", "dependencies": { "@fastify/cors": "^8.5.0", "commander": "^12.1.0", diff --git a/packages/server/package.json b/packages/server/package.json index 49f51c03..eb70730a 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@neuralnomads/codenomad", - "version": "0.7.0", + "version": "0.7.1", "description": "CodeNomad Server", "author": { "name": "Neural Nomads", diff --git a/packages/tauri-app/package.json b/packages/tauri-app/package.json index 7e479cda..27cc54df 100644 --- a/packages/tauri-app/package.json +++ b/packages/tauri-app/package.json @@ -1,6 +1,6 @@ { "name": "@codenomad/tauri-app", - "version": "0.7.0", + "version": "0.7.1", "private": true, "scripts": { "dev": "tauri dev", diff --git a/packages/ui/package.json b/packages/ui/package.json index babad80b..f7fd71ae 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@codenomad/ui", - "version": "0.7.0", + "version": "0.7.1", "private": true, "type": "module", "scripts": {