mirror of
https://github.com/stablyai/orca.git
synced 2026-11-01 09:37:33 +00:00
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.
This commit is contained in:
@@ -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')
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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 })
|
||||
|
||||
@@ -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<string[]> {
|
||||
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<string[]> {
|
||||
if (
|
||||
|
||||
@@ -24,7 +24,7 @@ const mocks = vi.hoisted(() => ({
|
||||
): Promise<OpenCodeTranscriptSignal | null> => 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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<object>()),
|
||||
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<T>(platform: NodeJS.Platform, run: () => Promise<T>): Promise<T> {
|
||||
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')
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -87,6 +87,8 @@ const COPY: Record<AiVaultScanIssueCode, (values: Values) => string | null> = {
|
||||
: translate('aiVault.scanIssues.wslDistroUnverifiable', EN.wslDistroUnverifiable, {
|
||||
distro
|
||||
}),
|
||||
wslSessionsFromLastScan: () =>
|
||||
translate('aiVault.scanIssues.wslSessionsFromLastScan', EN.wslSessionsFromLastScan),
|
||||
scopePathsTruncated: ({ limit }) =>
|
||||
limit === null
|
||||
? null
|
||||
|
||||
+1
@@ -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."
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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}} 秒後にタイムアウトしました。更新して再試行してください。",
|
||||
|
||||
@@ -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}}초 후 시간 초과되었습니다. 새로고침하여 다시 시도하세요.",
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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}} некорректной записи в результатах истории сессий агентов.",
|
||||
|
||||
@@ -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ı.",
|
||||
|
||||
@@ -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}} 秒後逾時。請重新整理以重試。",
|
||||
|
||||
@@ -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}} 秒后超时。请刷新以重试。",
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user