From a12ca8eed373ef56cd37fbdd097845eaab34dee9 Mon Sep 17 00:00:00 2001 From: Karel Bourgois Date: Thu, 18 Jun 2026 14:37:37 +0200 Subject: [PATCH 1/2] fix(claude-sync): skip subagent transcripts to prevent main session corruption (#854) The session indexer scans ~/.claude/projects recursively via findFilesRecursivelyCreatedAfter, which descends into per-session subagents/ directories. Claude writes subagent transcripts at: ~/.claude/projects///subagents/agent-.jsonl These files repeat the parent session's sessionId. When indexed as standalone sessions they upsert over the parent row and overwrite its jsonl_path with the subagent path, corrupting the main session record (the sidebar then points at, and renders, the subagent transcript). Add a single isSubagentTranscript() guard (path segment named "subagents") and apply it in both the recursive scan and the single-file watcher path. Co-authored-by: Haile <118998054+blackmammoth@users.noreply.github.com> --- .../claude-session-synchronizer.provider.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts b/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts index 530e4328..9320a2fe 100644 --- a/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +++ b/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts @@ -25,6 +25,21 @@ export class ClaudeSessionSynchronizer implements IProviderSessionSynchronizer { private readonly provider = 'claude' as const; private readonly claudeHome = path.join(os.homedir(), '.claude'); + /** + * Returns true when a JSONL file is a subagent transcript rather than a + * top-level session. + * + * Claude stores subagent transcripts under a `subagents/` directory, e.g. + * `~/.claude/projects///subagents/agent-.jsonl`. + * Those files repeat the parent session's `sessionId`, so indexing them as + * standalone sessions overwrites the parent row's `jsonl_path` and corrupts + * the main session record. The recursive scan in `synchronize()` reaches + * them, so both entry points must skip them. + */ + private isSubagentTranscript(filePath: string): boolean { + return path.normalize(filePath).split(path.sep).includes('subagents'); + } + /** * Scans ~/.claude/projects and upserts discovered sessions into DB. */ @@ -38,6 +53,10 @@ export class ClaudeSessionSynchronizer implements IProviderSessionSynchronizer { let processed = 0; for (const filePath of files) { + if (this.isSubagentTranscript(filePath)) { + continue; + } + const parsed = await this.processSessionFile(filePath, nameMap); if (!parsed) { continue; @@ -66,6 +85,9 @@ export class ClaudeSessionSynchronizer implements IProviderSessionSynchronizer { if (!filePath.endsWith('.jsonl')) { return null; } + if (this.isSubagentTranscript(filePath)) { + return null; + } const nameMap = await buildLookupMap(path.join(this.claudeHome, 'history.jsonl'), 'sessionId', 'display'); const parsed = await this.processSessionFile(filePath, nameMap); From 7ca355651f0a805965bc27af3d75def626c5fb96 Mon Sep 17 00:00:00 2001 From: Koya Kikuchi Date: Fri, 19 Jun 2026 04:12:38 +0900 Subject: [PATCH 2/2] fix(i18n): add missing sidebar message keys to all locales (#896) The sidebar `messages` namespace was missing six keys that are referenced in `useSidebarController.ts`: - messages.updateProjectError (rename / star-toggle failure) - messages.refreshError (project list refresh failure) - messages.restoreProjectFailed / restoreProjectError - messages.restoreSessionFailed / restoreSessionError `updateProjectError` and `refreshError` are called via `t()` without an inline default, so on failure users see the raw key string "messages.updateProjectError" / "messages.refreshError" instead of a message. The four restore.* keys have inline English defaults in the code, so they previously fell back to English even in non-English UIs. Adds all six keys to every locale (de, en, fr, it, ja, ko, ru, tr, zh-CN, zh-TW), matching the existing wording/style of the neighbouring delete/create messages in each file. Co-authored-by: Claude Opus 4.8 (1M context) --- src/i18n/locales/de/sidebar.json | 8 +++++++- src/i18n/locales/en/sidebar.json | 8 +++++++- src/i18n/locales/fr/sidebar.json | 8 +++++++- src/i18n/locales/it/sidebar.json | 8 +++++++- src/i18n/locales/ja/sidebar.json | 8 +++++++- src/i18n/locales/ko/sidebar.json | 8 +++++++- src/i18n/locales/ru/sidebar.json | 8 +++++++- src/i18n/locales/tr/sidebar.json | 8 +++++++- src/i18n/locales/zh-CN/sidebar.json | 8 +++++++- src/i18n/locales/zh-TW/sidebar.json | 8 +++++++- 10 files changed, 70 insertions(+), 10 deletions(-) diff --git a/src/i18n/locales/de/sidebar.json b/src/i18n/locales/de/sidebar.json index 48070815..6542c02a 100644 --- a/src/i18n/locales/de/sidebar.json +++ b/src/i18n/locales/de/sidebar.json @@ -106,7 +106,13 @@ "deleteProjectFailed": "Projekt konnte nicht entfernt werden. Bitte erneut versuchen.", "deleteProjectError": "Fehler beim Entfernen des Projekts. Bitte erneut versuchen.", "createProjectFailed": "Projekt konnte nicht erstellt werden. Bitte erneut versuchen.", - "createProjectError": "Fehler beim Erstellen des Projekts. Bitte erneut versuchen." + "createProjectError": "Fehler beim Erstellen des Projekts. Bitte erneut versuchen.", + "updateProjectError": "Fehler beim Aktualisieren des Projekts. Bitte erneut versuchen.", + "refreshError": "Aktualisierung fehlgeschlagen. Bitte erneut versuchen.", + "restoreProjectFailed": "Projekt konnte nicht wiederhergestellt werden. Bitte erneut versuchen.", + "restoreProjectError": "Fehler beim Wiederherstellen des Projekts. Bitte erneut versuchen.", + "restoreSessionFailed": "Sitzung konnte nicht wiederhergestellt werden. Bitte erneut versuchen.", + "restoreSessionError": "Fehler beim Wiederherstellen der Sitzung. Bitte erneut versuchen." }, "version": { "updateAvailable": "Update verfügbar" diff --git a/src/i18n/locales/en/sidebar.json b/src/i18n/locales/en/sidebar.json index 755729a7..e96c44e9 100644 --- a/src/i18n/locales/en/sidebar.json +++ b/src/i18n/locales/en/sidebar.json @@ -106,7 +106,13 @@ "deleteProjectFailed": "Failed to remove project. Please try again.", "deleteProjectError": "Error removing project. Please try again.", "createProjectFailed": "Failed to create project. Please try again.", - "createProjectError": "Error creating project. Please try again." + "createProjectError": "Error creating project. Please try again.", + "updateProjectError": "Error updating project. Please try again.", + "refreshError": "Failed to refresh. Please try again.", + "restoreProjectFailed": "Failed to restore project. Please try again.", + "restoreProjectError": "Error restoring project. Please try again.", + "restoreSessionFailed": "Failed to restore session. Please try again.", + "restoreSessionError": "Error restoring session. Please try again." }, "version": { "updateAvailable": "Update available" diff --git a/src/i18n/locales/fr/sidebar.json b/src/i18n/locales/fr/sidebar.json index ff155c28..8f5ab901 100644 --- a/src/i18n/locales/fr/sidebar.json +++ b/src/i18n/locales/fr/sidebar.json @@ -106,7 +106,13 @@ "deleteProjectFailed": "Échec de la suppression du projet. Veuillez réessayer.", "deleteProjectError": "Erreur lors de la suppression du projet. Veuillez réessayer.", "createProjectFailed": "Échec de la création du projet. Veuillez réessayer.", - "createProjectError": "Erreur lors de la création du projet. Veuillez réessayer." + "createProjectError": "Erreur lors de la création du projet. Veuillez réessayer.", + "updateProjectError": "Erreur lors de la mise à jour du projet. Veuillez réessayer.", + "refreshError": "Échec de l'actualisation. Veuillez réessayer.", + "restoreProjectFailed": "Échec de la restauration du projet. Veuillez réessayer.", + "restoreProjectError": "Erreur lors de la restauration du projet. Veuillez réessayer.", + "restoreSessionFailed": "Échec de la restauration de la session. Veuillez réessayer.", + "restoreSessionError": "Erreur lors de la restauration de la session. Veuillez réessayer." }, "version": { "updateAvailable": "Mise à jour disponible" diff --git a/src/i18n/locales/it/sidebar.json b/src/i18n/locales/it/sidebar.json index dfad2684..a09ab87a 100644 --- a/src/i18n/locales/it/sidebar.json +++ b/src/i18n/locales/it/sidebar.json @@ -106,7 +106,13 @@ "deleteProjectFailed": "Impossibile rimuovere il progetto. Riprova.", "deleteProjectError": "Errore durante la rimozione del progetto. Riprova.", "createProjectFailed": "Impossibile creare il progetto. Riprova.", - "createProjectError": "Errore durante la creazione del progetto. Riprova." + "createProjectError": "Errore durante la creazione del progetto. Riprova.", + "updateProjectError": "Errore durante l'aggiornamento del progetto. Riprova.", + "refreshError": "Aggiornamento non riuscito. Riprova.", + "restoreProjectFailed": "Impossibile ripristinare il progetto. Riprova.", + "restoreProjectError": "Errore durante il ripristino del progetto. Riprova.", + "restoreSessionFailed": "Impossibile ripristinare la sessione. Riprova.", + "restoreSessionError": "Errore durante il ripristino della sessione. Riprova." }, "version": { "updateAvailable": "Aggiornamento disponibile" diff --git a/src/i18n/locales/ja/sidebar.json b/src/i18n/locales/ja/sidebar.json index 4116178a..dc9d0534 100644 --- a/src/i18n/locales/ja/sidebar.json +++ b/src/i18n/locales/ja/sidebar.json @@ -105,7 +105,13 @@ "deleteProjectFailed": "プロジェクトの除去に失敗しました。もう一度お試しください。", "deleteProjectError": "プロジェクトの除去でエラーが発生しました。もう一度お試しください。", "createProjectFailed": "プロジェクトの作成に失敗しました。もう一度お試しください。", - "createProjectError": "プロジェクトの作成でエラーが発生しました。もう一度お試しください。" + "createProjectError": "プロジェクトの作成でエラーが発生しました。もう一度お試しください。", + "updateProjectError": "プロジェクトの更新でエラーが発生しました。もう一度お試しください。", + "refreshError": "更新に失敗しました。もう一度お試しください。", + "restoreProjectFailed": "プロジェクトの復元に失敗しました。もう一度お試しください。", + "restoreProjectError": "プロジェクトの復元でエラーが発生しました。もう一度お試しください。", + "restoreSessionFailed": "セッションの復元に失敗しました。もう一度お試しください。", + "restoreSessionError": "セッションの復元でエラーが発生しました。もう一度お試しください。" }, "version": { "updateAvailable": "アップデートあり" diff --git a/src/i18n/locales/ko/sidebar.json b/src/i18n/locales/ko/sidebar.json index 360da6f8..41b29378 100644 --- a/src/i18n/locales/ko/sidebar.json +++ b/src/i18n/locales/ko/sidebar.json @@ -105,7 +105,13 @@ "deleteProjectFailed": "프로젝트 제거 실패. 다시 시도해주세요.", "deleteProjectError": "프로젝트 제거 오류. 다시 시도해주세요.", "createProjectFailed": "프로젝트 생성 실패. 다시 시도해주세요.", - "createProjectError": "프로젝트 생성 오류. 다시 시도해주세요." + "createProjectError": "프로젝트 생성 오류. 다시 시도해주세요.", + "updateProjectError": "프로젝트 업데이트 오류. 다시 시도해주세요.", + "refreshError": "새로고침 실패. 다시 시도해주세요.", + "restoreProjectFailed": "프로젝트 복원 실패. 다시 시도해주세요.", + "restoreProjectError": "프로젝트 복원 오류. 다시 시도해주세요.", + "restoreSessionFailed": "세션 복원 실패. 다시 시도해주세요.", + "restoreSessionError": "세션 복원 오류. 다시 시도해주세요." }, "version": { "updateAvailable": "업데이트 가능" diff --git a/src/i18n/locales/ru/sidebar.json b/src/i18n/locales/ru/sidebar.json index f34cd3df..3798151b 100644 --- a/src/i18n/locales/ru/sidebar.json +++ b/src/i18n/locales/ru/sidebar.json @@ -106,7 +106,13 @@ "deleteProjectFailed": "Не удалось убрать проект. Попробуйте снова.", "deleteProjectError": "Ошибка при удалении проекта из списка. Попробуйте снова.", "createProjectFailed": "Не удалось создать проект. Попробуйте снова.", - "createProjectError": "Ошибка при создании проекта. Попробуйте снова." + "createProjectError": "Ошибка при создании проекта. Попробуйте снова.", + "updateProjectError": "Ошибка при обновлении проекта. Попробуйте снова.", + "refreshError": "Не удалось обновить. Попробуйте снова.", + "restoreProjectFailed": "Не удалось восстановить проект. Попробуйте снова.", + "restoreProjectError": "Ошибка при восстановлении проекта. Попробуйте снова.", + "restoreSessionFailed": "Не удалось восстановить сеанс. Попробуйте снова.", + "restoreSessionError": "Ошибка при восстановлении сеанса. Попробуйте снова." }, "version": { "updateAvailable": "Доступно обновление" diff --git a/src/i18n/locales/tr/sidebar.json b/src/i18n/locales/tr/sidebar.json index bc872311..fefcfed6 100644 --- a/src/i18n/locales/tr/sidebar.json +++ b/src/i18n/locales/tr/sidebar.json @@ -106,7 +106,13 @@ "deleteProjectFailed": "Proje kaldırılamadı. Lütfen tekrar dene.", "deleteProjectError": "Proje kaldırılırken hata oluştu. Lütfen tekrar dene.", "createProjectFailed": "Proje oluşturulamadı. Lütfen tekrar dene.", - "createProjectError": "Proje oluşturulurken hata oluştu. Lütfen tekrar dene." + "createProjectError": "Proje oluşturulurken hata oluştu. Lütfen tekrar dene.", + "updateProjectError": "Proje güncellenirken hata oluştu. Lütfen tekrar dene.", + "refreshError": "Yenileme başarısız. Lütfen tekrar dene.", + "restoreProjectFailed": "Proje geri yüklenemedi. Lütfen tekrar dene.", + "restoreProjectError": "Proje geri yüklenirken hata oluştu. Lütfen tekrar dene.", + "restoreSessionFailed": "Oturum geri yüklenemedi. Lütfen tekrar dene.", + "restoreSessionError": "Oturum geri yüklenirken hata oluştu. Lütfen tekrar dene." }, "version": { "updateAvailable": "Güncelleme mevcut" diff --git a/src/i18n/locales/zh-CN/sidebar.json b/src/i18n/locales/zh-CN/sidebar.json index be5da16b..a04b5f06 100644 --- a/src/i18n/locales/zh-CN/sidebar.json +++ b/src/i18n/locales/zh-CN/sidebar.json @@ -106,7 +106,13 @@ "deleteProjectFailed": "移除项目失败,请重试。", "deleteProjectError": "移除项目时出错,请重试。", "createProjectFailed": "创建项目失败,请重试。", - "createProjectError": "创建项目时出错,请重试。" + "createProjectError": "创建项目时出错,请重试。", + "updateProjectError": "更新项目时出错,请重试。", + "refreshError": "刷新失败,请重试。", + "restoreProjectFailed": "恢复项目失败,请重试。", + "restoreProjectError": "恢复项目时出错,请重试。", + "restoreSessionFailed": "恢复会话失败,请重试。", + "restoreSessionError": "恢复会话时出错,请重试。" }, "version": { "updateAvailable": "有可用更新" diff --git a/src/i18n/locales/zh-TW/sidebar.json b/src/i18n/locales/zh-TW/sidebar.json index c147a0ab..ea392402 100644 --- a/src/i18n/locales/zh-TW/sidebar.json +++ b/src/i18n/locales/zh-TW/sidebar.json @@ -105,7 +105,13 @@ "deleteProjectFailed": "移除專案失敗,請重試。", "deleteProjectError": "移除專案時出錯,請重試。", "createProjectFailed": "建立專案失敗,請重試。", - "createProjectError": "建立專案時出錯,請重試。" + "createProjectError": "建立專案時出錯,請重試。", + "updateProjectError": "更新專案時出錯,請重試。", + "refreshError": "重新整理失敗,請重試。", + "restoreProjectFailed": "還原專案失敗,請重試。", + "restoreProjectError": "還原專案時出錯,請重試。", + "restoreSessionFailed": "還原工作階段失敗,請重試。", + "restoreSessionError": "還原工作階段時出錯,請重試。" }, "version": { "updateAvailable": "有可用更新"