From ba1013cd35400e3e62632a8cf251354edd60c5e6 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Tue, 20 Jan 2026 19:20:18 +0000 Subject: [PATCH 1/3] fix(ui): re-link pending question tool parts (#74) --- packages/ui/src/stores/session-events.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/ui/src/stores/session-events.ts b/packages/ui/src/stores/session-events.ts index 13bd3e29..eba4928b 100644 --- a/packages/ui/src/stores/session-events.ts +++ b/packages/ui/src/stores/session-events.ts @@ -39,6 +39,7 @@ import { loadMessages } from "./session-api" import { applyPartUpdateV2, replaceMessageIdV2, + reconcilePendingQuestionsV2, upsertMessageInfoV2, upsertPermissionV2, upsertQuestionV2, @@ -230,6 +231,10 @@ function handleMessageUpdate(instanceId: string, event: MessageUpdateEvent | Mes applyPartUpdateV2(instanceId, { ...part, sessionID: sessionId, messageID: messageId }) + if (part.type === "tool" && part.tool === "question") { + // Questions can arrive before their tool part exists; re-link now. + reconcilePendingQuestionsV2(instanceId, sessionId) + } updateSessionInfo(instanceId, sessionId) } else if (event.type === "message.updated") { From c9b5bb1b7aa991e86b96272fb93f8da6692eb938 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Tue, 20 Jan 2026 19:20:41 +0000 Subject: [PATCH 2/3] Release 0.7.4 --- 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/tauri-app/package.json | 2 +- packages/ui/package.json | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3b2ec34c..0a77ab36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "codenomad-workspace", - "version": "0.7.3", + "version": "0.7.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "codenomad-workspace", - "version": "0.7.3", + "version": "0.7.4", "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.3", + "version": "0.7.4", "dependencies": { "@codenomad/ui": "file:../ui", "@neuralnomads/codenomad": "file:../server" @@ -7423,7 +7423,7 @@ }, "packages/server": { "name": "@neuralnomads/codenomad", - "version": "0.7.3", + "version": "0.7.4", "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.3", + "version": "0.7.4", "devDependencies": { "@tauri-apps/cli": "^2.9.4" } }, "packages/ui": { "name": "@codenomad/ui", - "version": "0.7.3", + "version": "0.7.4", "dependencies": { "@git-diff-view/solid": "^0.0.8", "@kobalte/core": "0.13.11", diff --git a/package.json b/package.json index 399b9a68..d76cbf29 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codenomad-workspace", - "version": "0.7.3", + "version": "0.7.4", "private": true, "description": "CodeNomad monorepo workspace", "workspaces": { diff --git a/packages/electron-app/package.json b/packages/electron-app/package.json index 019b67e4..5a720ac9 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.3", + "version": "0.7.4", "description": "CodeNomad - AI coding assistant", "author": { "name": "Neural Nomads", diff --git a/packages/server/package-lock.json b/packages/server/package-lock.json index a6b44b34..1b1ccfbd 100644 --- a/packages/server/package-lock.json +++ b/packages/server/package-lock.json @@ -1,12 +1,12 @@ { "name": "@neuralnomads/codenomad", - "version": "0.7.3", + "version": "0.7.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@neuralnomads/codenomad", - "version": "0.7.3", + "version": "0.7.4", "dependencies": { "@fastify/cors": "^8.5.0", "commander": "^12.1.0", diff --git a/packages/server/package.json b/packages/server/package.json index de54772c..eb7f904d 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@neuralnomads/codenomad", - "version": "0.7.3", + "version": "0.7.4", "description": "CodeNomad Server", "author": { "name": "Neural Nomads", diff --git a/packages/tauri-app/package.json b/packages/tauri-app/package.json index 25201d3b..81e1bf4e 100644 --- a/packages/tauri-app/package.json +++ b/packages/tauri-app/package.json @@ -1,6 +1,6 @@ { "name": "@codenomad/tauri-app", - "version": "0.7.3", + "version": "0.7.4", "private": true, "scripts": { "dev": "tauri dev", diff --git a/packages/ui/package.json b/packages/ui/package.json index d132ed80..d6f1edd9 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@codenomad/ui", - "version": "0.7.3", + "version": "0.7.4", "private": true, "type": "module", "scripts": { From 05f193df7b6af200f1101af054539be69d031ae0 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Tue, 20 Jan 2026 19:28:56 +0000 Subject: [PATCH 3/3] fix(ui): auto-select first ready instance after refresh --- packages/ui/src/stores/instances.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/stores/instances.ts b/packages/ui/src/stores/instances.ts index 99a55fde..7b768c2b 100644 --- a/packages/ui/src/stores/instances.ts +++ b/packages/ui/src/stores/instances.ts @@ -92,6 +92,19 @@ function workspaceDescriptorToInstance(descriptor: WorkspaceDescriptor): Instanc } } +function ensureActiveInstanceSelected(): void { + const current = activeInstanceId() + const instanceMap = instances() + if (current && instanceMap.has(current)) return + + for (const [id, instance] of instanceMap.entries()) { + if (instance.status === "ready") { + setActiveInstanceId(id) + return + } + } +} + function upsertWorkspace(descriptor: WorkspaceDescriptor) { const mapped = workspaceDescriptorToInstance(descriptor) if (instances().has(descriptor.id)) { @@ -102,6 +115,9 @@ function upsertWorkspace(descriptor: WorkspaceDescriptor) { if (descriptor.status === "ready") { attachClient(descriptor) + // If no tab is currently selected (common after UI refresh), + // auto-select the first ready instance. + ensureActiveInstanceSelected() } } @@ -225,15 +241,18 @@ async function hydrateInstanceData(instanceId: string) { } } -void (async function initializeWorkspaces() { + void (async function initializeWorkspaces() { try { const workspaces = await serverApi.fetchWorkspaces() workspaces.forEach((workspace) => upsertWorkspace(workspace)) + // After a UI refresh, we may have instances but no active selection. + ensureActiveInstanceSelected() } catch (error) { log.error("Failed to load workspaces", error) } })() + serverEvents.on("*", (event) => handleWorkspaceEvent(event)) function handleWorkspaceEvent(event: WorkspaceEventPayload) {