From ab0e87c6a76e7f6cbb414499ff735ae466cecdc3 Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Thu, 29 Oct 2026 00:56:33 -0700 Subject: [PATCH] fix(wsl): scanner follow-ups: confirmed homes for transcript lookups, delete as user act, localized carryover notice (#35810) OpenCode/ZCode transcript database lookups read inside the WSL homes they get, so they take only confirmed homes. A WSL session delete runs as a user act on its distro, so background readers stop trusting an older stopped read. The carryover notice gets a stable code and catalog copy in every locale. --- .../ai-vault-wsl-session-carryover.ts | 3 ++- src/main/ai-vault/cached-session-list.test.ts | 14 +++++++++- src/main/ai-vault/cached-session-list.ts | 9 +++++-- .../transcript-opencode-database.test.ts | 2 +- .../transcript-opencode-database.ts | 11 ++++---- src/main/wsl-unc-delete.test.ts | 27 ++++++++++++++++++- src/main/wsl-unc-delete.ts | 4 ++- .../ai-vault-scan-issue-copy.test.ts | 7 +++++ .../right-sidebar/ai-vault-scan-issue-copy.ts | 2 ++ .../src/i18n/en-runtime-required.json | 1 + src/renderer/src/i18n/locales/de.json | 1 + src/renderer/src/i18n/locales/en.json | 1 + src/renderer/src/i18n/locales/es.json | 1 + src/renderer/src/i18n/locales/fr.json | 1 + src/renderer/src/i18n/locales/ja.json | 1 + src/renderer/src/i18n/locales/ko.json | 1 + src/renderer/src/i18n/locales/pt.json | 1 + src/renderer/src/i18n/locales/ru.json | 1 + src/renderer/src/i18n/locales/tr.json | 1 + src/renderer/src/i18n/locales/zh-Hant.json | 1 + src/renderer/src/i18n/locales/zh.json | 1 + src/shared/ai-vault-scan-issue-copy.ts | 1 + 22 files changed, 79 insertions(+), 13 deletions(-) diff --git a/src/main/ai-vault/ai-vault-wsl-session-carryover.ts b/src/main/ai-vault/ai-vault-wsl-session-carryover.ts index 75592fb5f82..d578426fb55 100644 --- a/src/main/ai-vault/ai-vault-wsl-session-carryover.ts +++ b/src/main/ai-vault/ai-vault-wsl-session-carryover.ts @@ -1,4 +1,5 @@ import type { AiVaultListResult, AiVaultSession } from '../../shared/ai-vault-types' +import { aiVaultScanIssueText } from '../../shared/ai-vault-scan-issue-copy' import { isWslUncPath } from '../../shared/wsl-paths' // The WSL rows of the last scan whose WSL roots a confirmed running list named, per scope key. @@ -37,7 +38,7 @@ export function carryOverUnconfirmedWslSessions( agent: carried[0]?.agent ?? 'codex', kind: 'notice', path: '', - message: 'WSL could not be checked; its sessions are from the last scan.' + ...aiVaultScanIssueText('wslSessionsFromLastScan') } ] } diff --git a/src/main/ai-vault/cached-session-list.test.ts b/src/main/ai-vault/cached-session-list.test.ts index b165941a7ac..d0b9464c13b 100644 --- a/src/main/ai-vault/cached-session-list.test.ts +++ b/src/main/ai-vault/cached-session-list.test.ts @@ -44,6 +44,7 @@ vi.mock('../wsl-running-path-filter', () => ({ filterPathsToRunningWslDistrosAsy import { getAiVaultWslHomeDirs, + getAiVaultWslScanHomeDirs, invalidateAiVaultSessionListCache, listAiVaultSessions, resetAiVaultSessionListCacheForTests @@ -255,11 +256,22 @@ describe('WSL sessions while the running list cannot be confirmed', () => { expect(scanAiVaultSessionsInService.mock.calls[1]?.[0]).toMatchObject({ wslHomeDirs: [] }) expect(unconfirmed.sessions.map((row) => row.id)).toEqual(['wsl', 'native']) - expect(unconfirmed.issues).toEqual([expect.objectContaining({ kind: 'notice' })]) + expect(unconfirmed.issues).toEqual([ + expect.objectContaining({ kind: 'notice', messageCode: 'wslSessionsFromLastScan' }) + ]) // Checking a delete or subagent path against a root reads nothing, so it keeps last-known-good. await expect(getAiVaultWslHomeDirs()).resolves.toEqual([WSL_HOME]) }) + // Transcript database lookups read inside the homes they get; a stopped distro's home is absent. + it('gives work that reads inside WSL homes only confirmed homes', async () => { + readRunningWslHomeDirsUnlessStopped.mockResolvedValue({ homes: [], confirmed: false }) + listLastKnownRunningWslHomeDirs.mockResolvedValue([WSL_HOME]) + + await expect(getAiVaultWslScanHomeDirs()).resolves.toEqual([]) + await expect(getAiVaultWslHomeDirs()).resolves.toEqual([WSL_HOME]) + }) + it('never carries a WSL row back after a delete invalidated the list', async () => { const wsl = session('wsl', `${WSL_HOME}\\.claude\\projects\\p\\wsl.jsonl`, '2026-01-03') readRunningWslHomeDirsUnlessStopped.mockResolvedValue({ homes: [WSL_HOME], confirmed: true }) diff --git a/src/main/ai-vault/cached-session-list.ts b/src/main/ai-vault/cached-session-list.ts index 33bf7798355..fad78f249ab 100644 --- a/src/main/ai-vault/cached-session-list.ts +++ b/src/main/ai-vault/cached-session-list.ts @@ -215,9 +215,14 @@ async function scanWslHomeDirs(): Promise<{ homes: string[]; confirmed: boolean return readRunningWslHomeDirsUnlessStopped() } +/** WSL homes for work that reads inside them: a stopped distro's home is absent, not refused. */ +export async function getAiVaultWslScanHomeDirs(): Promise { + return (await scanWslHomeDirs()).homes +} + /** - * WSL roots for checking a path a user act names (delete, subagents, transcript lookup). Checking - * reads nothing, so a failed probe must not narrow them: it keeps the last-known-good list. + * WSL roots for checking a path a user act names (delete, subagent listing): a containment check + * reads nothing, so a failed probe must not narrow them and keeps the last-known-good list. */ export async function getAiVaultWslHomeDirs(): Promise { if ( diff --git a/src/main/native-chat/transcript-opencode-database.test.ts b/src/main/native-chat/transcript-opencode-database.test.ts index 165d3ac20e4..92fddb0d694 100644 --- a/src/main/native-chat/transcript-opencode-database.test.ts +++ b/src/main/native-chat/transcript-opencode-database.test.ts @@ -24,7 +24,7 @@ const mocks = vi.hoisted(() => ({ ): Promise => null ) })) -vi.mock('../ai-vault/cached-session-list', () => ({ getAiVaultWslHomeDirs: mocks.homes })) +vi.mock('../ai-vault/cached-session-list', () => ({ getAiVaultWslScanHomeDirs: mocks.homes })) vi.mock('./wsl-transcript-fs-access', () => ({ wslGatedAccess: mocks.access })) vi.mock('../opencode-usage/opencode-database-discovery', () => ({ listOpenCodeDatabases: mocks.native, diff --git a/src/main/native-chat/transcript-opencode-database.ts b/src/main/native-chat/transcript-opencode-database.ts index 2a9ad947b14..c6e672c56f4 100644 --- a/src/main/native-chat/transcript-opencode-database.ts +++ b/src/main/native-chat/transcript-opencode-database.ts @@ -2,7 +2,7 @@ import { homedir } from 'node:os' import { wslGatedAccess } from './wsl-transcript-fs-access' import { join } from 'node:path' import { waitForPromiseWithSignal } from '../../shared/abort-signal-reason' -import { getAiVaultWslHomeDirs } from '../ai-vault/cached-session-list' +import { getAiVaultWslScanHomeDirs } from '../ai-vault/cached-session-list' import { prepareOpenCodeWslReaders } from '../ai-vault/opencode-wsl-runtime-preparation' import { configureOpenCodeWslReaders, @@ -94,10 +94,9 @@ export async function discoverOpenCodeTranscriptDatabase( if (native) { return native } - const homes = (await waitForPromiseWithSignal(getAiVaultWslHomeDirs(), boundedSignal)).slice( - 0, - 32 - ) + const homes = ( + await waitForPromiseWithSignal(getAiVaultWslScanHomeDirs(), boundedSignal) + ).slice(0, 32) if (homes.length > 0) { const readers = await waitForPromiseWithSignal( prepareOpenCodeWslReaders(homes), @@ -124,7 +123,7 @@ export async function discoverOpenCodeTranscriptDatabase( if (native) { return native } - const homes = await waitForPromiseWithSignal(getAiVaultWslHomeDirs(), boundedSignal) + const homes = await waitForPromiseWithSignal(getAiVaultWslScanHomeDirs(), boundedSignal) const sources = await waitForPromiseWithSignal( Promise.all( homes diff --git a/src/main/wsl-unc-delete.test.ts b/src/main/wsl-unc-delete.test.ts index 1e5e6b76077..f7d77fb2b65 100644 --- a/src/main/wsl-unc-delete.test.ts +++ b/src/main/wsl-unc-delete.test.ts @@ -1,9 +1,16 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import type { ProcessResult } from '@orca/process-host/process-spec' -const { runProcessMock } = vi.hoisted(() => ({ runProcessMock: vi.fn() })) +const { runProcessMock, wokenMock } = vi.hoisted(() => ({ + runProcessMock: vi.fn(), + wokenMock: vi.fn((_distro: string) => {}) +})) vi.mock('@orca/process-host', () => ({ runProcess: runProcessMock })) +vi.mock('./wsl-background-distro-gate', async (importOriginal) => ({ + ...(await importOriginal()), + noteWslDistroWoken: wokenMock +})) vi.mock('./wsl-interop-spawn-directory', () => ({ resolveWslInteropSpawnCwd: () => 'C:\\Windows' })) @@ -13,6 +20,7 @@ function exited(code: number, stderr = ''): ProcessResult { } import { tryDeleteWslUncPath } from './wsl-unc-delete' +import { isWslUserActFor } from './wsl/wsl-user-act-scope' async function withPlatform(platform: NodeJS.Platform, run: () => Promise): Promise { const original = Object.getOwnPropertyDescriptor(process, 'platform') @@ -147,4 +155,21 @@ describe('tryDeleteWslUncPath', () => { ).rejects.toThrow('Failed to delete WSL path: rm: cannot remove: Permission denied') }) }) + + // A user's delete may start a stopped distro; background readers must then stop trusting "stopped". + it('runs the delete as a user act on its distro and notes it woken', async () => { + let insideAct = false + runProcessMock.mockImplementation(async () => { + insideAct = isWslUserActFor('Ubuntu') + return exited(0) + }) + wokenMock.mockClear() + await withPlatform('win32', async () => { + await expect( + tryDeleteWslUncPath('\\\\wsl.localhost\\Ubuntu\\home\\me\\old.jsonl') + ).resolves.toBe(true) + }) + expect(insideAct).toBe(true) + expect(wokenMock).toHaveBeenCalledWith('Ubuntu') + }) }) diff --git a/src/main/wsl-unc-delete.ts b/src/main/wsl-unc-delete.ts index b119339c44f..c39d3fea346 100644 --- a/src/main/wsl-unc-delete.ts +++ b/src/main/wsl-unc-delete.ts @@ -2,6 +2,7 @@ import { runProcess } from '@orca/process-host' import { buildWslExecArgs } from '../shared/wsl-login-shell-command' import { parseWslPath } from './wsl' import { wslExeFailure, wslExeProcessSpec } from './wsl-exe-process' +import { runAsWslUserAct } from './wsl/wsl-unc-access-gate' import { containedDeleteCommand, rejectionFromWslDeleteStderr, @@ -47,7 +48,8 @@ export async function tryDeleteWslUncPath( const flags = options.recursive ? '-rf' : '-f' command = ['rm', flags, '--', info.linuxPath] } - await runWslDelete(info.distro, command) + // A user's delete may start a stopped distro; as a user act, background reads stop trusting "stopped". + await runAsWslUserAct(info.distro, () => runWslDelete(info.distro, command)) return true } diff --git a/src/renderer/src/components/right-sidebar/ai-vault-scan-issue-copy.test.ts b/src/renderer/src/components/right-sidebar/ai-vault-scan-issue-copy.test.ts index fe5e8c6fcc0..bc227b43c4c 100644 --- a/src/renderer/src/components/right-sidebar/ai-vault-scan-issue-copy.test.ts +++ b/src/renderer/src/components/right-sidebar/ai-vault-scan-issue-copy.test.ts @@ -37,6 +37,13 @@ describe('aiVaultScanIssueDisplayText', () => { ) }) + it('localizes the notice for WSL rows carried over from the last confirmed scan', async () => { + await useSpanish() + const carried = aiVaultScanIssueText('wslSessionsFromLastScan') + expect(carried.message).toBe('WSL could not be checked; its sessions are from the last scan.') + expect(aiVaultScanIssueDisplayText(carried)).toBe(es.aiVault.scanIssues.wslSessionsFromLastScan) + }) + it('shows the English message for uncoded, unknown, or incomplete issues', async () => { await useSpanish() expect(aiVaultScanIssueDisplayText({ message: 'Old host text' })).toBe('Old host text') diff --git a/src/renderer/src/components/right-sidebar/ai-vault-scan-issue-copy.ts b/src/renderer/src/components/right-sidebar/ai-vault-scan-issue-copy.ts index 6ee9746079d..1f855cbcebd 100644 --- a/src/renderer/src/components/right-sidebar/ai-vault-scan-issue-copy.ts +++ b/src/renderer/src/components/right-sidebar/ai-vault-scan-issue-copy.ts @@ -87,6 +87,8 @@ const COPY: Record string | null> = { : translate('aiVault.scanIssues.wslDistroUnverifiable', EN.wslDistroUnverifiable, { distro }), + wslSessionsFromLastScan: () => + translate('aiVault.scanIssues.wslSessionsFromLastScan', EN.wslSessionsFromLastScan), scopePathsTruncated: ({ limit }) => limit === null ? null diff --git a/src/renderer/src/i18n/en-runtime-required.json b/src/renderer/src/i18n/en-runtime-required.json index 066d17661f8..d8e644df931 100644 --- a/src/renderer/src/i18n/en-runtime-required.json +++ b/src/renderer/src/i18n/en-runtime-required.json @@ -41,6 +41,7 @@ "sessionMetadataUnreadable": "Session metadata could not be read this scan.", "wslDistroNotRunning": "WSL transcript files are unavailable because WSL distro '{{distro}}' is not running. Open a terminal in it to start it.", "wslDistroUnverifiable": "WSL transcript files are unavailable because WSL didn't answer whether '{{distro}}' is running. Try again shortly.", + "wslSessionsFromLastScan": "WSL could not be checked; its sessions are from the last scan.", "wslTranscriptFsCapacity": "WSL transcript discovery is temporarily unavailable because too many filesystem requests are already waiting. Try again shortly or restart Orca if the issue continues.", "wslTranscriptFsProcessFailed": "WSL transcript files are temporarily unavailable because the filesystem helper process failed ({{detail}}). Try again shortly or restart Orca if the issue continues.", "wslTranscriptFsSlow": "WSL transcript files are temporarily unavailable because filesystem access is taking too long. Try again shortly or restart Orca if the issue continues." diff --git a/src/renderer/src/i18n/locales/de.json b/src/renderer/src/i18n/locales/de.json index 36f1f33414f..636f7cd5776 100644 --- a/src/renderer/src/i18n/locales/de.json +++ b/src/renderer/src/i18n/locales/de.json @@ -20452,6 +20452,7 @@ "wslTranscriptFsProcessFailed": "WSL-Protokolldateien sind vorübergehend nicht verfügbar, weil der Dateisystem-Hilfsprozess fehlgeschlagen ist ({{detail}}). In Kürze erneut versuchen oder Orca neu starten, falls das Problem anhält.", "wslDistroNotRunning": "WSL-Protokolldateien sind nicht verfügbar, weil die WSL-Distribution „{{distro}}“ nicht läuft. Zum Starten ein Terminal darin öffnen.", "wslDistroUnverifiable": "WSL-Protokolldateien sind nicht verfügbar, weil WSL nicht geantwortet hat, ob „{{distro}}“ läuft. In Kürze erneut versuchen.", + "wslSessionsFromLastScan": "WSL konnte nicht geprüft werden; die Sitzungen stammen aus dem letzten Scan.", "scopePathsTruncated": "Nur die ersten {{limit}} Projektpfade wurden gescannt.", "invalidResultsSkipped_one": "{{count}} ungültiger Ergebniseintrag aus dem Verlauf der Agentensitzungen wurde übersprungen.", "invalidResultsSkipped_other": "{{count}} ungültige Ergebniseinträge aus dem Verlauf der Agentensitzungen wurden übersprungen.", diff --git a/src/renderer/src/i18n/locales/en.json b/src/renderer/src/i18n/locales/en.json index 63594446984..88ce603874a 100644 --- a/src/renderer/src/i18n/locales/en.json +++ b/src/renderer/src/i18n/locales/en.json @@ -20869,6 +20869,7 @@ "wslTranscriptFsProcessFailed": "WSL transcript files are temporarily unavailable because the filesystem helper process failed ({{detail}}). Try again shortly or restart Orca if the issue continues.", "wslDistroNotRunning": "WSL transcript files are unavailable because WSL distro '{{distro}}' is not running. Open a terminal in it to start it.", "wslDistroUnverifiable": "WSL transcript files are unavailable because WSL didn't answer whether '{{distro}}' is running. Try again shortly.", + "wslSessionsFromLastScan": "WSL could not be checked; its sessions are from the last scan.", "scopePathsTruncated": "Only the first {{limit}} project paths were scanned.", "invalidResultsSkipped_one": "Skipped {{count}} invalid Agent Session History result entry.", "invalidResultsSkipped_other": "Skipped {{count}} invalid Agent Session History result entries.", diff --git a/src/renderer/src/i18n/locales/es.json b/src/renderer/src/i18n/locales/es.json index 47269eb9dc9..e77511f4550 100644 --- a/src/renderer/src/i18n/locales/es.json +++ b/src/renderer/src/i18n/locales/es.json @@ -21304,6 +21304,7 @@ "wslTranscriptFsProcessFailed": "Los archivos de transcripción de WSL no están disponibles temporalmente porque falló el proceso auxiliar del sistema de archivos ({{detail}}). Inténtalo de nuevo en breve o reinicia Orca si el problema persiste.", "wslDistroNotRunning": "Los archivos de transcripción de WSL no están disponibles porque la distro WSL «{{distro}}» no está en ejecución. Abre un terminal en ella para iniciarla.", "wslDistroUnverifiable": "Los archivos de transcripción de WSL no están disponibles porque WSL no respondió si «{{distro}}» está en ejecución. Inténtalo de nuevo en breve.", + "wslSessionsFromLastScan": "No se pudo comprobar WSL; sus sesiones son del último análisis.", "scopePathsTruncated": "Solo se escanearon las primeras {{limit}} rutas de proyectos.", "invalidResultsSkipped_one": "Se omitió {{count}} entrada de resultado no válida del historial de sesiones de agentes.", "invalidResultsSkipped_other": "Se omitieron {{count}} entradas de resultado no válidas del historial de sesiones de agentes.", diff --git a/src/renderer/src/i18n/locales/fr.json b/src/renderer/src/i18n/locales/fr.json index ce3ffe43bf9..3560313e5c8 100644 --- a/src/renderer/src/i18n/locales/fr.json +++ b/src/renderer/src/i18n/locales/fr.json @@ -20983,6 +20983,7 @@ "wslTranscriptFsProcessFailed": "Les fichiers de transcription WSL sont temporairement indisponibles, car le processus auxiliaire du système de fichiers a échoué ({{detail}}). Réessayez dans un instant ou redémarrez Orca si le problème persiste.", "wslDistroNotRunning": "Les fichiers de transcription WSL sont indisponibles, car la distro WSL « {{distro}} » n’est pas en cours d’exécution. Ouvrez-y un terminal pour la démarrer.", "wslDistroUnverifiable": "Les fichiers de transcription WSL sont indisponibles, car WSL n’a pas indiqué si « {{distro}} » est en cours d’exécution. Réessayez dans un instant.", + "wslSessionsFromLastScan": "Impossible de vérifier WSL ; ses sessions proviennent de la dernière analyse.", "scopePathsTruncated": "Seuls les {{limit}} premiers chemins de projet ont été analysés.", "invalidResultsSkipped_one": "{{count}} entrée de résultat invalide de l’historique des sessions d’agent ignorée.", "invalidResultsSkipped_other": "{{count}} entrées de résultat invalides de l’historique des sessions d’agent ignorées.", diff --git a/src/renderer/src/i18n/locales/ja.json b/src/renderer/src/i18n/locales/ja.json index e728d2f3a8a..7207e5b85d8 100644 --- a/src/renderer/src/i18n/locales/ja.json +++ b/src/renderer/src/i18n/locales/ja.json @@ -20402,6 +20402,7 @@ "wslTranscriptFsProcessFailed": "ファイルシステムの補助プロセスで障害が発生したため、WSL のセッション記録ファイルを一時的に利用できません({{detail}})。少し待ってから再試行するか、問題が続く場合は Orca を再起動してください。", "wslDistroNotRunning": "WSL ディストリビューション「{{distro}}」が実行されていないため、WSL のセッション記録ファイルを利用できません。起動するには、そのディストリビューションでターミナルを開いてください。", "wslDistroUnverifiable": "「{{distro}}」が実行中かどうか WSL から応答がなかったため、WSL のセッション記録ファイルを利用できません。少し待ってから再試行してください。", + "wslSessionsFromLastScan": "WSL を確認できませんでした。セッションは前回のスキャン時のものです。", "scopePathsTruncated": "最初の {{limit}} 件のプロジェクトパスのみをスキャンしました。", "invalidResultsSkipped_other": "Agent セッション履歴の無効な結果項目 {{count}} 件をスキップしました。", "scanTimedOutOnSshHost": "この SSH ホストでセッションスキャンが {{seconds}} 秒後にタイムアウトしました。更新して再試行してください。", diff --git a/src/renderer/src/i18n/locales/ko.json b/src/renderer/src/i18n/locales/ko.json index d012ea0c3da..3cd3e11e511 100644 --- a/src/renderer/src/i18n/locales/ko.json +++ b/src/renderer/src/i18n/locales/ko.json @@ -20402,6 +20402,7 @@ "wslTranscriptFsProcessFailed": "파일 시스템 보조 프로세스에 오류가 발생하여 WSL 세션 기록 파일을 일시적으로 사용할 수 없습니다({{detail}}). 잠시 후 다시 시도하거나 문제가 계속되면 Orca를 다시 시작하세요.", "wslDistroNotRunning": "WSL 배포판({{distro}})이 실행 중이 아니므로 WSL 세션 기록 파일을 사용할 수 없습니다. 해당 배포판에서 터미널을 열어 시작하세요.", "wslDistroUnverifiable": "WSL에서 '{{distro}}'의 실행 여부에 응답하지 않아 WSL 세션 기록 파일을 사용할 수 없습니다. 잠시 후 다시 시도하세요.", + "wslSessionsFromLastScan": "WSL을 확인할 수 없습니다. 세션은 마지막 검사 결과입니다.", "scopePathsTruncated": "처음 {{limit}}개의 프로젝트 경로만 스캔했습니다.", "invalidResultsSkipped_other": "Agent 세션 기록의 잘못된 결과 항목 {{count}}개를 건너뛰었습니다.", "scanTimedOutOnSshHost": "이 SSH 호스트에서 세션 스캔이 {{seconds}}초 후 시간 초과되었습니다. 새로고침하여 다시 시도하세요.", diff --git a/src/renderer/src/i18n/locales/pt.json b/src/renderer/src/i18n/locales/pt.json index a6b0b1a9b80..fb197dc4f30 100644 --- a/src/renderer/src/i18n/locales/pt.json +++ b/src/renderer/src/i18n/locales/pt.json @@ -208,6 +208,7 @@ "wslTranscriptFsProcessFailed": "Os arquivos de transcrição do WSL estão temporariamente indisponíveis porque o processo auxiliar do sistema de arquivos falhou ({{detail}}). Tente novamente em instantes ou reinicie o Orca se o problema persistir.", "wslDistroNotRunning": "Os arquivos de transcrição do WSL estão indisponíveis porque a distribuição WSL '{{distro}}' não está em execução. Abra um terminal nela para iniciá-la.", "wslDistroUnverifiable": "Os arquivos de transcrição do WSL estão indisponíveis porque o WSL não respondeu se '{{distro}}' está em execução. Tente novamente em instantes.", + "wslSessionsFromLastScan": "Não foi possível verificar o WSL; as sessões são da última verificação.", "scopePathsTruncated": "Apenas os primeiros {{limit}} caminhos de projetos foram verificados.", "invalidResultsSkipped_one": "{{count}} entrada de resultado inválida do Histórico de Sessões de Agente foi ignorada.", "invalidResultsSkipped_other": "{{count}} entradas de resultado inválidas do Histórico de Sessões de Agente foram ignoradas.", diff --git a/src/renderer/src/i18n/locales/ru.json b/src/renderer/src/i18n/locales/ru.json index 79ba7dd53f7..80499f566e0 100644 --- a/src/renderer/src/i18n/locales/ru.json +++ b/src/renderer/src/i18n/locales/ru.json @@ -21077,6 +21077,7 @@ "wslTranscriptFsProcessFailed": "Файлы истории WSL временно недоступны из-за сбоя вспомогательного процесса файловой системы ({{detail}}). Повторите попытку чуть позже или перезапустите Orca, если проблема сохраняется.", "wslDistroNotRunning": "Файлы истории WSL недоступны, так как дистрибутив WSL «{{distro}}» не запущен. Откройте в нём терминал, чтобы запустить его.", "wslDistroUnverifiable": "Файлы истории WSL недоступны, так как WSL не ответила, запущен ли «{{distro}}». Повторите попытку чуть позже.", + "wslSessionsFromLastScan": "Не удалось проверить WSL; сеансы взяты из последнего сканирования.", "scopePathsTruncated": "Сканирование выполнено только для первых {{limit}} путей к проектам.", "invalidResultsSkipped_one": "Пропущена {{count}} некорректная запись в результатах истории сессий агентов.", "invalidResultsSkipped_other": "Пропущено {{count}} некорректной записи в результатах истории сессий агентов.", diff --git a/src/renderer/src/i18n/locales/tr.json b/src/renderer/src/i18n/locales/tr.json index 4a39018151b..eb1efb50b49 100644 --- a/src/renderer/src/i18n/locales/tr.json +++ b/src/renderer/src/i18n/locales/tr.json @@ -20433,6 +20433,7 @@ "wslTranscriptFsProcessFailed": "Dosya sistemi yardımcı işlemi hata verdiği için WSL oturum dökümü dosyaları geçici olarak kullanılamıyor ({{detail}}). Kısa süre sonra yeniden deneyin veya sorun devam ederse Orca'yı yeniden başlatın.", "wslDistroNotRunning": "'{{distro}}' WSL dağıtımı çalışmadığı için WSL oturum dökümü dosyaları kullanılamıyor. Dağıtımı başlatmak için içinde bir terminal açın.", "wslDistroUnverifiable": "WSL, '{{distro}}' dağıtımının çalışıp çalışmadığına yanıt vermediği için WSL oturum dökümü dosyaları kullanılamıyor. Kısa süre sonra yeniden deneyin.", + "wslSessionsFromLastScan": "WSL denetlenemedi; oturumlar son taramadan alındı.", "scopePathsTruncated": "Yalnızca ilk {{limit}} proje yolu tarandı.", "invalidResultsSkipped_one": "Ajan Oturum Geçmişi sonuçlarındaki {{count}} geçersiz girdi atlandı.", "invalidResultsSkipped_other": "Ajan Oturum Geçmişi sonuçlarındaki {{count}} geçersiz girdi atlandı.", diff --git a/src/renderer/src/i18n/locales/zh-Hant.json b/src/renderer/src/i18n/locales/zh-Hant.json index ef0ddc3f615..9a8eb884c42 100644 --- a/src/renderer/src/i18n/locales/zh-Hant.json +++ b/src/renderer/src/i18n/locales/zh-Hant.json @@ -20165,6 +20165,7 @@ "wslTranscriptFsProcessFailed": "由於檔案系統輔助行程失敗({{detail}}),暫時無法使用 WSL 工作階段記錄檔。請稍後再試,若問題持續,請重新啟動 Orca。", "wslDistroNotRunning": "由於 WSL 發行版「{{distro}}」目前未執行,無法使用 WSL 工作階段記錄檔。請在該發行版中開啟終端機以啟動它。", "wslDistroUnverifiable": "WSL 未回覆「{{distro}}」是否正在執行,因此無法使用 WSL 工作階段記錄檔。請稍後再試。", + "wslSessionsFromLastScan": "無法檢查 WSL;其工作階段來自上次掃描。", "scopePathsTruncated": "僅掃描了前 {{limit}} 個專案路徑。", "invalidResultsSkipped_other": "已跳過代理程式工作階段歷史中的 {{count}} 筆無效結果項目。", "scanTimedOutOnSshHost": "工作階段掃描在此 SSH 主機上執行 {{seconds}} 秒後逾時。請重新整理以重試。", diff --git a/src/renderer/src/i18n/locales/zh.json b/src/renderer/src/i18n/locales/zh.json index 5cde47e0d77..83ff49703d6 100644 --- a/src/renderer/src/i18n/locales/zh.json +++ b/src/renderer/src/i18n/locales/zh.json @@ -20403,6 +20403,7 @@ "wslTranscriptFsProcessFailed": "由于文件系统辅助进程失败({{detail}}),WSL 会话记录文件暂时不可用。请稍后重试;如果问题持续,请重启 Orca。", "wslDistroNotRunning": "由于 WSL 发行版“{{distro}}”未运行,WSL 会话记录文件不可用。请在该发行版中打开终端以启动它。", "wslDistroUnverifiable": "WSL 未回应“{{distro}}”是否正在运行,因此无法使用 WSL 会话记录文件。请稍后重试。", + "wslSessionsFromLastScan": "无法检查 WSL;其会话来自上次扫描。", "scopePathsTruncated": "仅扫描了前 {{limit}} 个项目路径。", "invalidResultsSkipped_other": "已跳过智能体会话历史中 {{count}} 条无效的结果条目。", "scanTimedOutOnSshHost": "此 SSH 主机上的会话扫描在 {{seconds}} 秒后超时。请刷新以重试。", diff --git a/src/shared/ai-vault-scan-issue-copy.ts b/src/shared/ai-vault-scan-issue-copy.ts index 4d88cf9ea8a..a9af433cbf0 100644 --- a/src/shared/ai-vault-scan-issue-copy.ts +++ b/src/shared/ai-vault-scan-issue-copy.ts @@ -25,6 +25,7 @@ export const AI_VAULT_SCAN_ISSUE_COPY = { "WSL transcript files are unavailable because WSL distro '{{distro}}' is not running. Open a terminal in it to start it.", wslDistroUnverifiable: "WSL transcript files are unavailable because WSL didn't answer whether '{{distro}}' is running. Try again shortly.", + wslSessionsFromLastScan: 'WSL could not be checked; its sessions are from the last scan.', scopePathsTruncated: 'Only the first {{limit}} project paths were scanned.', invalidResultsSkipped: 'Skipped {{count}} invalid Agent Session History result entries.', scanTimedOutOnSshHost: