diff --git a/src/renderer/src/components/settings/HiddenExperimentalGroup.test.tsx b/src/renderer/src/components/settings/HiddenExperimentalGroup.test.tsx new file mode 100644 index 00000000000..18109fbdb52 --- /dev/null +++ b/src/renderer/src/components/settings/HiddenExperimentalGroup.test.tsx @@ -0,0 +1,46 @@ +// @vitest-environment happy-dom + +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { cleanup, fireEvent, render, screen } from '@testing-library/react' +import { HiddenExperimentalGroup } from './HiddenExperimentalGroup' + +const isArmed = vi.fn() +const setArmed = vi.fn() +vi.mock('../terminal-pane/terminal-render-desync-trigger', () => ({ + isTerminalRenderDesyncSentinelArmed: (...args: unknown[]) => isArmed(...args), + setTerminalRenderDesyncSentinelArmed: (...args: unknown[]) => setArmed(...args) +})) + +describe('HiddenExperimentalGroup', () => { + beforeEach(() => { + vi.clearAllMocks() + isArmed.mockReturnValue(false) + }) + afterEach(() => { + cleanup() + }) + + function renderDiagnosticsSwitch(): HTMLElement { + return screen.getByRole('switch', { name: 'Terminal render diagnostics' }) + } + + it('initializes the render-diagnostics switch from the armed state', () => { + isArmed.mockReturnValue(true) + render() + + expect(renderDiagnosticsSwitch().getAttribute('data-state')).toBe('checked') + }) + + it('arms and disarms the capture sentinel through the switch', () => { + render() + expect(renderDiagnosticsSwitch().getAttribute('data-state')).toBe('unchecked') + + fireEvent.click(renderDiagnosticsSwitch()) + expect(setArmed).toHaveBeenCalledWith(true) + expect(renderDiagnosticsSwitch().getAttribute('data-state')).toBe('checked') + + fireEvent.click(renderDiagnosticsSwitch()) + expect(setArmed).toHaveBeenCalledWith(false) + expect(renderDiagnosticsSwitch().getAttribute('data-state')).toBe('unchecked') + }) +}) diff --git a/src/renderer/src/components/settings/HiddenExperimentalGroup.tsx b/src/renderer/src/components/settings/HiddenExperimentalGroup.tsx index 25541870376..8ab946d186b 100644 --- a/src/renderer/src/components/settings/HiddenExperimentalGroup.tsx +++ b/src/renderer/src/components/settings/HiddenExperimentalGroup.tsx @@ -1,5 +1,10 @@ +import { useState } from 'react' import { Label } from '../ui/label' import { Switch } from '../ui/switch' +import { + isTerminalRenderDesyncSentinelArmed, + setTerminalRenderDesyncSentinelArmed +} from '../terminal-pane/terminal-render-desync-trigger' import { translate } from '@/i18n/i18n' // Why: anything in this group is deliberately unfinished or staff-only. The @@ -7,6 +12,13 @@ import { translate } from '@/i18n/i18n' // for hidden-experimental items so future entries inherit the same // affordance without another round of styling decisions. export function HiddenExperimentalGroup(): React.JSX.Element { + const [renderDiagnosticsArmed, setRenderDiagnosticsArmed] = useState( + isTerminalRenderDesyncSentinelArmed + ) + const onRenderDiagnosticsChange = (armed: boolean): void => { + setTerminalRenderDesyncSentinelArmed(armed) + setRenderDiagnosticsArmed(armed) + } return (
@@ -28,25 +40,25 @@ export function HiddenExperimentalGroup(): React.JSX.Element {

{translate( - 'auto.components.settings.HiddenExperimentalGroup.1014ddbfaf', - 'Does nothing today. Reserved as the first slot for hidden experimental options.' + 'auto.components.settings.HiddenExperimentalGroup.7c4e18d2f6', + 'Arms the bold-glitch capture gestures on this machine: Cmd/Ctrl-click a terminal starts a sampling burst; add Shift to capture pane evidence to disk.' )}

diff --git a/src/renderer/src/components/terminal-pane/terminal-render-desync-sentinel.test.ts b/src/renderer/src/components/terminal-pane/terminal-render-desync-sentinel.test.ts index d88279dcd39..a064608ab58 100644 --- a/src/renderer/src/components/terminal-pane/terminal-render-desync-sentinel.test.ts +++ b/src/renderer/src/components/terminal-pane/terminal-render-desync-sentinel.test.ts @@ -275,3 +275,32 @@ describe('terminal-render-desync-sentinel', () => { expect(resetAndRefreshAllTerminalWebglAtlases).not.toHaveBeenCalled() }) }) + +describe('sentinel arming surface', () => { + it('arms live on enable and removes the listener on disable', async () => { + const storage = new Map() + vi.stubGlobal('localStorage', { + getItem: (k: string) => storage.get(k) ?? null, + setItem: (k: string, v: string) => storage.set(k, v), + removeItem: (k: string) => storage.delete(k) + }) + vi.stubGlobal('document', { + addEventListener: documentAddEventListener, + removeEventListener: documentRemoveEventListener + }) + vi.stubGlobal('navigator', { userAgent: 'Mac' }) + const { isTerminalRenderDesyncSentinelArmed, setTerminalRenderDesyncSentinelArmed } = + await import('./terminal-render-desync-trigger') + + expect(isTerminalRenderDesyncSentinelArmed()).toBe(false) + setTerminalRenderDesyncSentinelArmed(true) + expect(isTerminalRenderDesyncSentinelArmed()).toBe(true) + // Live arm: the mouseup listener is registered without a reload. + expect(documentAddEventListener).toHaveBeenCalledWith('mouseup', expect.any(Function), true) + + setTerminalRenderDesyncSentinelArmed(false) + expect(isTerminalRenderDesyncSentinelArmed()).toBe(false) + expect(documentRemoveEventListener).toHaveBeenCalledWith('mouseup', expect.any(Function), true) + vi.unstubAllGlobals() + }) +}) diff --git a/src/renderer/src/components/terminal-pane/terminal-render-desync-trigger.ts b/src/renderer/src/components/terminal-pane/terminal-render-desync-trigger.ts index f7d2bad4be7..d71f9e61b12 100644 --- a/src/renderer/src/components/terminal-pane/terminal-render-desync-trigger.ts +++ b/src/renderer/src/components/terminal-pane/terminal-render-desync-trigger.ts @@ -68,7 +68,42 @@ export function maybeStartTerminalRenderDesyncSentinel(): void { console.warn('[terminal] render-desync sentinel armed (10s post-link bursts + ⇧-capture)') } +export function isTerminalRenderDesyncSentinelArmed(): boolean { + try { + return globalThis.localStorage?.getItem(RENDER_DESYNC_SENTINEL_FLAG) === '1' + } catch { + return false + } +} + +/** + * Staff arming surface (hidden-experimental toggle): persists the flag and + * arms/disarms the capture gestures live, so no reload is needed. The passive + * probes (weight-change crumbs, reveal parity audit) are deliberately not + * governed by this — they are content-free and always on. + */ +export function setTerminalRenderDesyncSentinelArmed(armed: boolean): void { + try { + if (armed) { + globalThis.localStorage?.setItem(RENDER_DESYNC_SENTINEL_FLAG, '1') + } else { + globalThis.localStorage?.removeItem(RENDER_DESYNC_SENTINEL_FLAG) + } + } catch { + // Why: storage failure still allows a session-scoped arm/disarm below. + } + if (armed) { + maybeStartTerminalRenderDesyncSentinel() + } else { + removeClickListener() + } +} + export function stopTerminalRenderDesyncTriggerForTesting(): void { + removeClickListener() +} + +function removeClickListener(): void { if (clickListener != null) { document.removeEventListener('mouseup', clickListener, true) clickListener = null diff --git a/src/renderer/src/i18n/locales/en.json b/src/renderer/src/i18n/locales/en.json index bbffbf8a974..2b543c86aee 100644 --- a/src/renderer/src/i18n/locales/en.json +++ b/src/renderer/src/i18n/locales/en.json @@ -7124,10 +7124,10 @@ "compareBaseBranchUpstream": "Branch upstream" }, "HiddenExperimentalGroup": { - "d0f914a528": "Placeholder toggle", - "1014ddbfaf": "Does nothing today. Reserved as the first slot for hidden experimental options.", "232cf83de8": "Unlisted toggles for internal testing. Nothing here is supported.", - "3e9e827ca5": "Hidden experimental" + "3e9e827ca5": "Hidden experimental", + "7c4e18d2f6": "Arms the bold-glitch capture gestures on this machine: Cmd/Ctrl-click a terminal starts a sampling burst; add Shift to capture pane evidence to disk.", + "b09f24a51d": "Terminal render diagnostics" }, "InputPane": { "db15068196": "Enabled by default on Linux and macOS. Linux uses the system selection clipboard; other platforms use a private buffer.", diff --git a/src/renderer/src/i18n/locales/es.json b/src/renderer/src/i18n/locales/es.json index 5142116a66b..e5568fa281d 100644 --- a/src/renderer/src/i18n/locales/es.json +++ b/src/renderer/src/i18n/locales/es.json @@ -3915,13 +3915,17 @@ "viewDetails": "Ver detalles", "deleteSkill": "Eliminar…" }, - "SkillsList": { "listLabel": "Skills" }, + "SkillsList": { + "listLabel": "Skills" + }, "sourceStatus": { "missing": "Carpeta no encontrada", "remoteRepo": "Repositorio remoto — sin analizar", "unavailable": "Sin analizar" }, - "sources": { "heading": "Carpetas de skills" }, + "sources": { + "heading": "Carpetas de skills" + }, "sourceKind": { "home": "Inicio", "workspace": "Espacio de trabajo", @@ -6167,10 +6171,10 @@ "compareBaseBranchUpstream": "Upstream de la rama" }, "HiddenExperimentalGroup": { - "d0f914a528": "Alternar marcador de posición", - "1014ddbfaf": "No hace nada hoy. Reservado como primer espacio para opciones experimentales ocultas.", "232cf83de8": "Alternadores no listados para pruebas internas. Aquí no se admite nada.", - "3e9e827ca5": "experimental oculto" + "3e9e827ca5": "experimental oculto", + "7c4e18d2f6": "Activa los gestos de captura del fallo de negrita en esta máquina: Cmd/Ctrl-clic en un terminal inicia una ráfaga de muestreo; añade Mayús para capturar evidencia del panel en disco.", + "b09f24a51d": "Diagnósticos de renderizado del terminal" }, "InputPane": { "db15068196": "Habilitado de forma predeterminada en Linux y macOS. Linux usa el portapapeles de selección del sistema; otras plataformas utilizan un búfer privado.", diff --git a/src/renderer/src/i18n/locales/ja.json b/src/renderer/src/i18n/locales/ja.json index 1c72acfa367..9e427da8b63 100644 --- a/src/renderer/src/i18n/locales/ja.json +++ b/src/renderer/src/i18n/locales/ja.json @@ -3903,7 +3903,9 @@ "searchLinks": "リンクを検索", "deleteSkills": "スキルを削除…" }, - "SkillShareSelectionControls": { "01c5a15e02": "スキルを共有" }, + "SkillShareSelectionControls": { + "01c5a15e02": "スキルを共有" + }, "SkillRow": { "updatedUnknown": "日付なし", "pathCopied": "パスをコピーしました", @@ -3913,13 +3915,17 @@ "viewDetails": "詳細を表示", "deleteSkill": "削除…" }, - "SkillsList": { "listLabel": "スキル" }, + "SkillsList": { + "listLabel": "スキル" + }, "sourceStatus": { "missing": "フォルダーが見つかりません", "remoteRepo": "リモートリポジトリ — 未スキャン", "unavailable": "未スキャン" }, - "sources": { "heading": "スキルフォルダー" }, + "sources": { + "heading": "スキルフォルダー" + }, "sourceKind": { "home": "ホーム", "workspace": "ワークスペース", @@ -3941,7 +3947,10 @@ "linkOne": "{{count}} 件のリンク", "linkOther": "{{count}} 件のリンク" }, - "filter": { "allAgents": "すべての Agent", "sharedAgent": "共有 (.agents)" }, + "filter": { + "allAgents": "すべての Agent", + "sharedAgent": "共有 (.agents)" + }, "SkillsSelectionHeader": { "exit": "選択を終了", "exitTooltip": "選択を終了 · Esc", @@ -3950,7 +3959,11 @@ "clear": "クリア", "deleteTitle": "削除するスキルを選択" }, - "SkillDetailDialog": { "agents": "Agent", "updated": "更新日", "copy": "コピー" }, + "SkillDetailDialog": { + "agents": "Agent", + "updated": "更新日", + "copy": "コピー" + }, "SkillFreshnessNudge": { "titleOne": "インストール済みの Orca スキルが古くなっています", "titleMany": "インストール済みの Orca スキル {{value0}} 件が古くなっています", @@ -6180,10 +6193,10 @@ "compareBaseBranchUpstream": "ブランチの upstream" }, "HiddenExperimentalGroup": { - "d0f914a528": "プレースホルダーの切り替え", - "1014ddbfaf": "今日は何もしません。隠された実験的機能オプションの最初のスロットとして予約されています。", "232cf83de8": "内部テスト用の非公開トグル。ここでは何もサポートされていません。", - "3e9e827ca5": "隠された実験的機能" + "3e9e827ca5": "隠された実験的機能", + "7c4e18d2f6": "このマシンで太字グリッチのキャプチャジェスチャーを有効にします。ターミナルを Cmd/Ctrl クリックするとサンプリングバーストを開始し、Shift を加えるとペインの証拠をディスクに保存します。", + "b09f24a51d": "ターミナル描画診断" }, "InputPane": { "db15068196": "Linux および macOS ではデフォルトで有効になっています。 Linux はシステム選択クリップボードを使用します。他のプラットフォームはプライベートバッファを使用します。", diff --git a/src/renderer/src/i18n/locales/ko.json b/src/renderer/src/i18n/locales/ko.json index e5aefb9291a..5ee17e3aa0f 100644 --- a/src/renderer/src/i18n/locales/ko.json +++ b/src/renderer/src/i18n/locales/ko.json @@ -3879,18 +3879,96 @@ }, "skills": { "SkillsPage": { - "cb142070b4": "새로 고침", "a68dee6a32": "스킬 검색", "f43ad6edf3": "스킬", "ea72d6185b": "스킬을 검색하지 못했습니다", "dc4c3328ee": "파일 표시", "9963dff6d3": "설명을 찾을 수 없습니다.", "995fde8337": "스킬 파일을 표시하지 못했습니다", "4acd6d68ec": "스킬을 찾을 수 없습니다", "6a62a0168c": "일치하는 항목 없음", "08a321a984": "현재 검색 및 필터와 일치하는 스킬이 없습니다.", "cd7893fbc1": "스킬 검색 중", "35b9a724a0": "사용 가능", "c13b82793c": "설치 관리", "aee7b99cc6": "링크에서 설치", "filterProvider": "에이전트별 필터", "filterSource": "소스별 필터", "allSources": "전체", "clearFilters": "필터 지우기", "closeSkills": "스킬 닫기", "closeTooltip": "닫기 · Esc", "moreActions": "추가 작업", "sharedLinks": "공유 링크", "emptyCopy": "검색한 스킬 폴더가 비어 있습니다. 공유 번들을 설치하거나 스킬을 추가한 후 새로 고치세요.", "retry": "다시 시도", "remoteShareNotice": "이 스킬은 {{host}}에 있습니다. 공유하려면 해당 머신에서 스킬을 여세요.", "viewSwitch": "표시", "searchLinks": "링크 검색", "deleteSkills": "스킬 삭제…" + "cb142070b4": "새로 고침", + "a68dee6a32": "스킬 검색", + "f43ad6edf3": "스킬", + "ea72d6185b": "스킬을 검색하지 못했습니다", + "dc4c3328ee": "파일 표시", + "9963dff6d3": "설명을 찾을 수 없습니다.", + "995fde8337": "스킬 파일을 표시하지 못했습니다", + "4acd6d68ec": "스킬을 찾을 수 없습니다", + "6a62a0168c": "일치하는 항목 없음", + "08a321a984": "현재 검색 및 필터와 일치하는 스킬이 없습니다.", + "cd7893fbc1": "스킬 검색 중", + "35b9a724a0": "사용 가능", + "c13b82793c": "설치 관리", + "aee7b99cc6": "링크에서 설치", + "filterProvider": "에이전트별 필터", + "filterSource": "소스별 필터", + "allSources": "전체", + "clearFilters": "필터 지우기", + "closeSkills": "스킬 닫기", + "closeTooltip": "닫기 · Esc", + "moreActions": "추가 작업", + "sharedLinks": "공유 링크", + "emptyCopy": "검색한 스킬 폴더가 비어 있습니다. 공유 번들을 설치하거나 스킬을 추가한 후 새로 고치세요.", + "retry": "다시 시도", + "remoteShareNotice": "이 스킬은 {{host}}에 있습니다. 공유하려면 해당 머신에서 스킬을 여세요.", + "viewSwitch": "표시", + "searchLinks": "링크 검색", + "deleteSkills": "스킬 삭제…" + }, + "SkillShareSelectionControls": { + "01c5a15e02": "스킬 공유" + }, + "SkillRow": { + "updatedUnknown": "날짜 없음", + "pathCopied": "경로 복사됨", + "copyPath": "경로 복사", + "detailPath": "경로", + "skillActions": "{{value0}} 작업", + "viewDetails": "세부 정보 보기", + "deleteSkill": "삭제…" + }, + "SkillsList": { + "listLabel": "스킬" + }, + "sourceStatus": { + "missing": "폴더를 찾을 수 없음", + "remoteRepo": "원격 리포지토리 — 검색 안 됨", + "unavailable": "검색 안 됨" + }, + "sources": { + "heading": "스킬 폴더" + }, + "sourceKind": { + "home": "홈", + "workspace": "워크스페이스", + "bundled": "번들", + "plugin": "플러그인" + }, + "count": { + "skillOne": "스킬 {{count}}개", + "skillOther": "스킬 {{count}}개", + "sourceOne": "소스 {{count}}개", + "sourceOther": "소스 {{count}}개", + "fileOne": "파일 {{count}}개", + "fileOther": "파일 {{count}}개", + "resultOne": "결과 {{count}}개", + "resultOther": "결과 {{count}}개", + "selected": "{{count}}개 선택됨", + "shareOne": "스킬 {{count}}개 공유", + "shareOther": "스킬 {{count}}개 공유", + "linkOne": "링크 {{count}}개", + "linkOther": "링크 {{count}}개" + }, + "filter": { + "allAgents": "모든 에이전트", + "sharedAgent": "공유됨 (.agents)" + }, + "SkillsSelectionHeader": { + "exit": "선택 나가기", + "exitTooltip": "선택 나가기 · Esc", + "title": "공유할 스킬 선택", + "selectAll": "가능한 {{count}}개 모두 선택", + "clear": "지우기", + "deleteTitle": "삭제할 스킬 선택" + }, + "SkillDetailDialog": { + "agents": "에이전트", + "updated": "업데이트됨", + "copy": "복사" }, - "SkillShareSelectionControls": { "01c5a15e02": "스킬 공유" }, - "SkillRow": { "updatedUnknown": "날짜 없음", "pathCopied": "경로 복사됨", "copyPath": "경로 복사", "detailPath": "경로", "skillActions": "{{value0}} 작업", "viewDetails": "세부 정보 보기", "deleteSkill": "삭제…" }, - "SkillsList": { "listLabel": "스킬" }, - "sourceStatus": { "missing": "폴더를 찾을 수 없음", "remoteRepo": "원격 리포지토리 — 검색 안 됨", "unavailable": "검색 안 됨" }, - "sources": { "heading": "스킬 폴더" }, - "sourceKind": { "home": "홈", "workspace": "워크스페이스", "bundled": "번들", "plugin": "플러그인" }, - "count": { "skillOne": "스킬 {{count}}개", "skillOther": "스킬 {{count}}개", "sourceOne": "소스 {{count}}개", "sourceOther": "소스 {{count}}개", "fileOne": "파일 {{count}}개", "fileOther": "파일 {{count}}개", "resultOne": "결과 {{count}}개", "resultOther": "결과 {{count}}개", "selected": "{{count}}개 선택됨", "shareOne": "스킬 {{count}}개 공유", "shareOther": "스킬 {{count}}개 공유", "linkOne": "링크 {{count}}개", "linkOther": "링크 {{count}}개" }, - "filter": { "allAgents": "모든 에이전트", "sharedAgent": "공유됨 (.agents)" }, - "SkillsSelectionHeader": { "exit": "선택 나가기", "exitTooltip": "선택 나가기 · Esc", "title": "공유할 스킬 선택", "selectAll": "가능한 {{count}}개 모두 선택", "clear": "지우기", "deleteTitle": "삭제할 스킬 선택" }, - "SkillDetailDialog": { "agents": "에이전트", "updated": "업데이트됨", "copy": "복사" }, "SkillFreshnessNudge": { "titleOne": "설치된 Orca 스킬이 오래되었습니다", "titleMany": "설치된 Orca 스킬 {{value0}}개가 오래되었습니다", @@ -6083,10 +6161,10 @@ "compareBaseBranchUpstream": "브랜치 업스트림" }, "HiddenExperimentalGroup": { - "d0f914a528": "자리 표시자 토글", - "1014ddbfaf": "오늘은 아무것도 하지 않습니다. 숨겨진 실험 옵션을 위한 첫 번째 슬롯으로 예약되어 있습니다.", "232cf83de8": "내부 테스트를 위한 비공개 토글입니다. 여기에는 아무것도 지원되지 않습니다.", - "3e9e827ca5": "숨겨진 실험" + "3e9e827ca5": "숨겨진 실험", + "7c4e18d2f6": "이 컴퓨터에서 굵게 표시 결함 캡처 제스처를 활성화합니다. 터미널을 Cmd/Ctrl 클릭하면 샘플링 버스트가 시작되고, Shift를 추가하면 창 증거를 디스크에 캡처합니다.", + "b09f24a51d": "터미널 렌더링 진단" }, "InputPane": { "db15068196": "Linux 및 macOS에서는 기본적으로 활성화되어 있습니다. Linux는 시스템 선택 클립보드를 사용합니다. 다른 플랫폼은 개인 버퍼를 사용합니다.", @@ -14588,23 +14666,6 @@ }, "workspace": { "cleanup": { - "browse": { - "selectionWithheldOne": "선택한 워크스페이스 1개가 현재 필터에 의해 숨겨져 선택이 해제되었습니다.", - "selectionWithheld": "선택한 워크스페이스 {{value0}}개가 현재 필터에 의해 숨겨져 선택이 해제되었습니다.", - "selectAllCountOne": "안전 검사를 통과한 워크스페이스 1개 선택", - "selectAllCount": "안전 검사를 통과한 워크스페이스 {{value0}}개 모두 선택" - }, - "scan": { - "readyOne": "워크스페이스 1개를 찾았습니다.", - "readyMany": "워크스페이스 {{value0}}개를 찾았습니다." - }, - "presentationFixtures": { - "reviewAlphaCleanup": "알파 정리 검토" - }, - "presentation": { - "gitlabMergeRequestNumber": "MR #{{value0}}", - "githubPullRequestNumber": "PR #{{value0}}" - }, "browse": { "gitStatusCheckFailed": "Git 상태 확인 실패", "gitStatusUnverified": "Git 상태를 확인할 수 없음", @@ -14657,6 +14718,17 @@ "retainedAgents": "완료된 에이전트" } } + }, + "scan": { + "readyOne": "워크스페이스 1개를 찾았습니다.", + "readyMany": "워크스페이스 {{value0}}개를 찾았습니다." + }, + "presentationFixtures": { + "reviewAlphaCleanup": "알파 정리 검토" + }, + "presentation": { + "gitlabMergeRequestNumber": "MR #{{value0}}", + "githubPullRequestNumber": "PR #{{value0}}" } } }, diff --git a/src/renderer/src/i18n/locales/zh.json b/src/renderer/src/i18n/locales/zh.json index 6b5cae8fc24..24dadde2c06 100644 --- a/src/renderer/src/i18n/locales/zh.json +++ b/src/renderer/src/i18n/locales/zh.json @@ -3889,18 +3889,104 @@ }, "skills": { "SkillsPage": { - "cb142070b4": "刷新", "a68dee6a32": "搜索技能", "f43ad6edf3": "技能", "ea72d6185b": "无法扫描技能", "dc4c3328ee": "显示文件", "9963dff6d3": "未找到说明。", "995fde8337": "无法显示技能文件", "4acd6d68ec": "未找到技能", "6a62a0168c": "无匹配项", "08a321a984": "没有技能匹配当前搜索和筛选条件。", "cd7893fbc1": "正在扫描技能", "35b9a724a0": "可用", "c13b82793c": "管理安装", "aee7b99cc6": "从链接安装", "filterProvider": "按 Agent 筛选", "filterSource": "按来源筛选", "allSources": "全部", "clearFilters": "清除筛选", "closeSkills": "关闭技能", "closeTooltip": "关闭 · Esc", "moreActions": "更多操作", "sharedLinks": "共享链接", "emptyCopy": "扫描的技能文件夹为空。请安装共享包,或添加技能后刷新。", "retry": "重试", "remoteShareNotice": "这些技能位于 {{host}}。请在该机器上打开“技能”以进行共享。", "viewSwitch": "显示", "searchLinks": "搜索链接", "deleteSkills": "删除技能…" + "cb142070b4": "刷新", + "a68dee6a32": "搜索技能", + "f43ad6edf3": "技能", + "ea72d6185b": "无法扫描技能", + "dc4c3328ee": "显示文件", + "9963dff6d3": "未找到说明。", + "995fde8337": "无法显示技能文件", + "4acd6d68ec": "未找到技能", + "6a62a0168c": "无匹配项", + "08a321a984": "没有技能匹配当前搜索和筛选条件。", + "cd7893fbc1": "正在扫描技能", + "35b9a724a0": "可用", + "c13b82793c": "管理安装", + "aee7b99cc6": "从链接安装", + "filterProvider": "按 Agent 筛选", + "filterSource": "按来源筛选", + "allSources": "全部", + "clearFilters": "清除筛选", + "closeSkills": "关闭技能", + "closeTooltip": "关闭 · Esc", + "moreActions": "更多操作", + "sharedLinks": "共享链接", + "emptyCopy": "扫描的技能文件夹为空。请安装共享包,或添加技能后刷新。", + "retry": "重试", + "remoteShareNotice": "这些技能位于 {{host}}。请在该机器上打开“技能”以进行共享。", + "viewSwitch": "显示", + "searchLinks": "搜索链接", + "deleteSkills": "删除技能…" + }, + "SkillShareSelectionControls": { + "01c5a15e02": "共享技能" + }, + "SkillRow": { + "updatedUnknown": "无日期", + "pathCopied": "路径已复制", + "copyPath": "复制路径", + "detailPath": "路径", + "skillActions": "{{value0}} 的操作", + "viewDetails": "查看详情", + "deleteSkill": "删除…" + }, + "SkillsList": { + "listLabel": "技能" + }, + "sourceStatus": { + "missing": "未找到文件夹", + "remoteRepo": "远程仓库 — 未扫描", + "unavailable": "未扫描" + }, + "sources": { + "heading": "技能文件夹" + }, + "sourceKind": { + "home": "主目录", + "workspace": "工作区", + "bundled": "内置", + "plugin": "插件" + }, + "count": { + "skillOne": "{{count}} 个技能", + "skillOther": "{{count}} 个技能", + "sourceOne": "{{count}} 个来源", + "sourceOther": "{{count}} 个来源", + "fileOne": "{{count}} 个文件", + "fileOther": "{{count}} 个文件", + "resultOne": "{{count}} 个结果", + "resultOther": "{{count}} 个结果", + "selected": "已选择 {{count}} 个", + "shareOne": "共享 {{count}} 个技能", + "shareOther": "共享 {{count}} 个技能", + "linkOne": "{{count}} 个链接", + "linkOther": "{{count}} 个链接", + "deleteOne": "删除 {{count}} 个技能", + "deleteOther": "删除 {{count}} 个技能", + "deletedOne": "已删除 {{count}} 个技能", + "deletedOther": "已删除 {{count}} 个技能", + "deleteFolderOne": "{{count}} 个文件夹", + "deleteFolderOther": "{{count}} 个文件夹", + "deleteLinkOne": "{{count}} 个链接", + "deleteLinkOther": "{{count}} 个链接" + }, + "filter": { + "allAgents": "所有 Agent", + "sharedAgent": "共享 (.agents)" + }, + "SkillsSelectionHeader": { + "exit": "退出选择", + "exitTooltip": "退出选择 · Esc", + "title": "选择要共享的技能", + "selectAll": "选择全部 {{count}} 个符合条件的项目", + "clear": "清除", + "deleteTitle": "选择要删除的技能" + }, + "SkillDetailDialog": { + "agents": "Agent", + "updated": "已更新", + "copy": "复制" }, - "SkillShareSelectionControls": { "01c5a15e02": "共享技能" }, - "SkillRow": { "updatedUnknown": "无日期", "pathCopied": "路径已复制", "copyPath": "复制路径", "detailPath": "路径", "skillActions": "{{value0}} 的操作", "viewDetails": "查看详情", "deleteSkill": "删除…" }, - "SkillsList": { "listLabel": "技能" }, - "sourceStatus": { "missing": "未找到文件夹", "remoteRepo": "远程仓库 — 未扫描", "unavailable": "未扫描" }, - "sources": { "heading": "技能文件夹" }, - "sourceKind": { "home": "主目录", "workspace": "工作区", "bundled": "内置", "plugin": "插件" }, - "count": { "skillOne": "{{count}} 个技能", "skillOther": "{{count}} 个技能", "sourceOne": "{{count}} 个来源", "sourceOther": "{{count}} 个来源", "fileOne": "{{count}} 个文件", "fileOther": "{{count}} 个文件", "resultOne": "{{count}} 个结果", "resultOther": "{{count}} 个结果", "selected": "已选择 {{count}} 个", "shareOne": "共享 {{count}} 个技能", "shareOther": "共享 {{count}} 个技能", "linkOne": "{{count}} 个链接", "linkOther": "{{count}} 个链接", "deleteOne": "删除 {{count}} 个技能", "deleteOther": "删除 {{count}} 个技能", "deletedOne": "已删除 {{count}} 个技能", "deletedOther": "已删除 {{count}} 个技能", "deleteFolderOne": "{{count}} 个文件夹", "deleteFolderOther": "{{count}} 个文件夹", "deleteLinkOne": "{{count}} 个链接", "deleteLinkOther": "{{count}} 个链接" }, - "filter": { "allAgents": "所有 Agent", "sharedAgent": "共享 (.agents)" }, - "SkillsSelectionHeader": { "exit": "退出选择", "exitTooltip": "退出选择 · Esc", "title": "选择要共享的技能", "selectAll": "选择全部 {{count}} 个符合条件的项目", "clear": "清除", "deleteTitle": "选择要删除的技能" }, - "SkillDetailDialog": { "agents": "Agent", "updated": "已更新", "copy": "复制" }, "SkillFreshnessNudge": { "titleOne": "已安装的 Orca 技能已过期", "titleMany": "{{value0}} 个已安装的 Orca 技能已过期", @@ -6118,10 +6204,10 @@ "compareBaseBranchUpstream": "分支上游" }, "HiddenExperimentalGroup": { - "d0f914a528": "占位符切换", - "1014ddbfaf": "今天什么也不做。保留作为隐藏实验选项的第一个插槽。", "232cf83de8": "用于内部测试的未列出的切换。这里什么都不支持。", - "3e9e827ca5": "隐藏实验" + "3e9e827ca5": "隐藏实验", + "7c4e18d2f6": "在本机启用粗体故障捕获手势:Cmd/Ctrl 点击终端开始采样突发;加上 Shift 可将窗格证据捕获到磁盘。", + "b09f24a51d": "终端渲染诊断" }, "InputPane": { "db15068196": "在 Linux 和 macOS 上默认启用。 Linux使用系统选择剪贴板;其他平台使用私有缓冲区。", @@ -14604,23 +14690,6 @@ }, "workspace": { "cleanup": { - "browse": { - "selectionWithheldOne": "当前筛选条件隐藏了 1 个已选工作区,已取消选择。", - "selectionWithheld": "当前筛选条件隐藏了 {{value0}} 个已选工作区,已取消选择。", - "selectAllCountOne": "选择 1 个通过安全检查的工作区", - "selectAllCount": "选择全部 {{value0}} 个通过安全检查的工作区" - }, - "scan": { - "readyOne": "找到 1 个工作区。", - "readyMany": "找到 {{value0}} 个工作区。" - }, - "presentationFixtures": { - "reviewAlphaCleanup": "评审 Alpha 清理" - }, - "presentation": { - "gitlabMergeRequestNumber": "MR #{{value0}}", - "githubPullRequestNumber": "PR #{{value0}}" - }, "browse": { "gitStatusCheckFailed": "Git 状态检查失败", "gitStatusUnverified": "无法验证 Git 状态", @@ -14673,6 +14742,17 @@ "retainedAgents": "已完成的代理" } } + }, + "scan": { + "readyOne": "找到 1 个工作区。", + "readyMany": "找到 {{value0}} 个工作区。" + }, + "presentationFixtures": { + "reviewAlphaCleanup": "评审 Alpha 清理" + }, + "presentation": { + "gitlabMergeRequestNumber": "MR #{{value0}}", + "githubPullRequestNumber": "PR #{{value0}}" } } },