patchwarden 1.5.1 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PatchWarden.cmd +32 -2
- package/README.en.md +152 -25
- package/README.md +120 -23
- package/dist/assessments/agentAssessor.js +21 -12
- package/dist/assessments/assessmentStore.js +42 -34
- package/dist/config.d.ts +15 -0
- package/dist/config.js +66 -13
- package/dist/control/fileManager.d.ts +2 -0
- package/dist/control/fileManager.js +39 -0
- package/dist/control/middleware/auth.d.ts +6 -0
- package/dist/control/middleware/auth.js +14 -5
- package/dist/control/middleware/static.js +16 -3
- package/dist/control/routeTable.d.ts +24 -0
- package/dist/control/routeTable.js +263 -0
- package/dist/control/routes/audit.js +17 -7
- package/dist/control/routes/evidence.js +1 -1
- package/dist/control/routes/lineage.js +1 -1
- package/dist/control/routes/process.d.ts +7 -0
- package/dist/control/routes/process.js +329 -42
- package/dist/control/routes/sessions.d.ts +9 -1
- package/dist/control/routes/sessions.js +84 -21
- package/dist/control/routes/status.d.ts +46 -1
- package/dist/control/routes/status.js +72 -15
- package/dist/control/routes/taskActions.js +24 -60
- package/dist/control/routes/tasks.d.ts +4 -0
- package/dist/control/routes/tasks.js +61 -62
- package/dist/control/routes/workspace.js +50 -23
- package/dist/control/runtime.d.ts +3 -2
- package/dist/control/runtime.js +63 -30
- package/dist/control/server.js +36 -365
- package/dist/control/shared.d.ts +25 -1
- package/dist/control/shared.js +64 -11
- package/dist/direct/directAudit.js +234 -225
- package/dist/direct/directGuards.d.ts +2 -1
- package/dist/direct/directGuards.js +42 -29
- package/dist/direct/directPatch.d.ts +6 -1
- package/dist/direct/directPatch.js +55 -8
- package/dist/direct/directSessionStore.d.ts +16 -6
- package/dist/direct/directSessionStore.js +127 -35
- package/dist/direct/directVerification.js +8 -16
- package/dist/doctor.js +62 -52
- package/dist/goal/acceptanceEngine.d.ts +1 -1
- package/dist/goal/goalProgress.js +75 -69
- package/dist/goal/goalReport.js +5 -12
- package/dist/goal/goalStatus.d.ts +2 -0
- package/dist/goal/goalStatus.js +10 -3
- package/dist/goal/goalStore.d.ts +9 -2
- package/dist/goal/goalStore.js +152 -45
- package/dist/goal/handoffExport.js +6 -6
- package/dist/goal/specKitImport.js +97 -96
- package/dist/goal/subgoalSync.js +11 -9
- package/dist/goal/worktreeManager.d.ts +2 -0
- package/dist/goal/worktreeManager.js +209 -136
- package/dist/httpServer.js +111 -32
- package/dist/logging.js +5 -3
- package/dist/policy/projectPolicy.js +5 -2
- package/dist/release/releaseGate.d.ts +1 -1
- package/dist/release/releaseGate.js +78 -25
- package/dist/runner/agentInvocation.d.ts +14 -0
- package/dist/runner/agentInvocation.js +96 -4
- package/dist/runner/changeCapture.d.ts +13 -5
- package/dist/runner/changeCapture.js +243 -61
- package/dist/runner/postTaskCleanup.js +48 -19
- package/dist/runner/processSecurity.d.ts +56 -0
- package/dist/runner/processSecurity.js +373 -0
- package/dist/runner/runTask.d.ts +1 -1
- package/dist/runner/runTask.js +115 -87
- package/dist/runner/simpleProcess.d.ts +3 -0
- package/dist/runner/simpleProcess.js +50 -36
- package/dist/{taskProgress.d.ts → runner/taskProgress.d.ts} +1 -1
- package/dist/{taskProgress.js → runner/taskProgress.js} +2 -2
- package/dist/{taskRuntime.d.ts → runner/taskRuntime.d.ts} +1 -1
- package/dist/{taskRuntime.js → runner/taskRuntime.js} +3 -2
- package/dist/runner/taskStatusStore.d.ts +11 -0
- package/dist/runner/taskStatusStore.js +24 -0
- package/dist/runner/watch.d.ts +14 -1
- package/dist/runner/watch.js +256 -48
- package/dist/security/contentRedaction.js +2 -2
- package/dist/security/discoveryTokenStore.d.ts +3 -2
- package/dist/security/discoveryTokenStore.js +17 -2
- package/dist/security/loopbackHost.d.ts +2 -0
- package/dist/security/loopbackHost.js +16 -0
- package/dist/security/pathGuard.js +32 -17
- package/dist/security/planGuard.js +2 -1
- package/dist/security/runtimeGuard.js +9 -6
- package/dist/security/secretComparison.d.ts +3 -0
- package/dist/security/secretComparison.js +11 -0
- package/dist/security/sensitiveGuard.d.ts +5 -0
- package/dist/security/sensitiveGuard.js +27 -8
- package/dist/security/toolInvocationGuard.d.ts +2 -2
- package/dist/security/toolInvocationGuard.js +1 -1
- package/dist/security/workspaceRootGuard.d.ts +8 -0
- package/dist/security/workspaceRootGuard.js +47 -0
- package/dist/smoke-test.js +24 -23
- package/dist/tools/catalog/index.d.ts +4 -0
- package/dist/tools/catalog/index.js +4 -0
- package/dist/tools/{toolCatalog.js → catalog/toolCatalog.js} +3 -12
- package/dist/tools/{toolRegistry.d.ts → catalog/toolRegistry.d.ts} +3 -3
- package/dist/tools/{toolRegistry.js → catalog/toolRegistry.js} +6 -15
- package/dist/tools/definitions/toolDefs.d.ts +18 -0
- package/dist/tools/definitions/toolDefs.js +1177 -0
- package/dist/tools/{auditSession.d.ts → diagnostics/auditSession.d.ts} +1 -1
- package/dist/tools/{auditSession.js → diagnostics/auditSession.js} +2 -2
- package/dist/tools/{auditTask.d.ts → diagnostics/auditTask.d.ts} +1 -1
- package/dist/tools/{auditTask.js → diagnostics/auditTask.js} +99 -29
- package/dist/tools/{healthCheck.d.ts → diagnostics/healthCheck.d.ts} +6 -6
- package/dist/tools/{healthCheck.js → diagnostics/healthCheck.js} +7 -7
- package/dist/tools/diagnostics/index.d.ts +6 -0
- package/dist/tools/diagnostics/index.js +6 -0
- package/dist/tools/{safeStatus.d.ts → diagnostics/safeStatus.d.ts} +3 -3
- package/dist/tools/{safeStatus.js → diagnostics/safeStatus.js} +6 -6
- package/dist/tools/{safeViews.d.ts → diagnostics/safeViews.d.ts} +12 -8
- package/dist/tools/{safeViews.js → diagnostics/safeViews.js} +23 -13
- package/dist/tools/{schemaDriftCheck.d.ts → diagnostics/schemaDriftCheck.d.ts} +1 -1
- package/dist/tools/{schemaDriftCheck.js → diagnostics/schemaDriftCheck.js} +2 -2
- package/dist/tools/{createDirectSession.js → direct/createDirectSession.js} +6 -6
- package/dist/tools/{finalizeDirectSession.d.ts → direct/finalizeDirectSession.d.ts} +1 -1
- package/dist/tools/direct/finalizeDirectSession.js +86 -0
- package/dist/tools/direct/index.d.ts +3 -0
- package/dist/tools/direct/index.js +3 -0
- package/dist/tools/{runDirectVerificationBundle.js → direct/runDirectVerificationBundle.js} +2 -2
- package/dist/tools/{discoverTools.d.ts → discovery/discoverTools.d.ts} +2 -2
- package/dist/tools/{discoverTools.js → discovery/discoverTools.js} +5 -5
- package/dist/tools/{explainTool.d.ts → discovery/explainTool.d.ts} +2 -2
- package/dist/tools/{explainTool.js → discovery/explainTool.js} +2 -2
- package/dist/tools/discovery/index.d.ts +3 -0
- package/dist/tools/discovery/index.js +3 -0
- package/dist/tools/{invokeDiscoveredTool.d.ts → discovery/invokeDiscoveredTool.d.ts} +2 -2
- package/dist/tools/{invokeDiscoveredTool.js → discovery/invokeDiscoveredTool.js} +5 -5
- package/dist/tools/dispatch/coreDispatch.js +32 -31
- package/dist/tools/dispatch/diagnosticDispatch.d.ts +3 -5
- package/dist/tools/dispatch/diagnosticDispatch.js +70 -68
- package/dist/tools/dispatch/directDispatch.js +11 -10
- package/dist/tools/dispatch/goalDispatch.js +5 -4
- package/dist/tools/dispatch/releaseDispatch.js +3 -2
- package/dist/tools/dispatch/validation.d.ts +7 -0
- package/dist/tools/dispatch/validation.js +71 -0
- package/dist/tools/{getPlan.js → goals/getPlan.js} +4 -4
- package/dist/tools/{goalSubgoalTask.d.ts → goals/goalSubgoalTask.d.ts} +1 -1
- package/dist/tools/goals/goalSubgoalTask.js +118 -0
- package/dist/tools/goals/index.d.ts +3 -0
- package/dist/tools/goals/index.js +3 -0
- package/dist/tools/{savePlan.js → goals/savePlan.js} +28 -8
- package/dist/tools/registry.d.ts +7 -11
- package/dist/tools/registry.js +17 -1178
- package/dist/tools/{checkReleaseGate.d.ts → release/checkReleaseGate.d.ts} +1 -1
- package/dist/tools/{checkReleaseGate.js → release/checkReleaseGate.js} +3 -3
- package/dist/tools/release/index.d.ts +2 -0
- package/dist/tools/release/index.js +2 -0
- package/dist/tools/{releaseMode.d.ts → release/releaseMode.d.ts} +2 -2
- package/dist/tools/{releaseMode.js → release/releaseMode.js} +46 -26
- package/dist/tools/tasks/cancelTask.d.ts +11 -0
- package/dist/tools/tasks/cancelTask.js +85 -0
- package/dist/tools/{createTask.d.ts → tasks/createTask.d.ts} +10 -2
- package/dist/tools/{createTask.js → tasks/createTask.js} +42 -27
- package/dist/tools/{diagnoseTask.d.ts → tasks/diagnoseTask.d.ts} +1 -1
- package/dist/tools/{diagnoseTask.js → tasks/diagnoseTask.js} +8 -8
- package/dist/tools/{evidencePack.js → tasks/evidencePack.js} +34 -22
- package/dist/tools/{getTaskFile.js → tasks/getTaskFile.js} +4 -4
- package/dist/tools/{getTaskStatus.d.ts → tasks/getTaskStatus.d.ts} +6 -1
- package/dist/tools/{getTaskStatus.js → tasks/getTaskStatus.js} +5 -5
- package/dist/tools/{getTaskStdoutTail.js → tasks/getTaskStdoutTail.js} +13 -11
- package/dist/tools/{getTaskSummary.js → tasks/getTaskSummary.js} +33 -26
- package/dist/tools/tasks/index.d.ts +18 -0
- package/dist/tools/tasks/index.js +18 -0
- package/dist/tools/tasks/killTask.d.ts +1 -0
- package/dist/tools/{listTasks.d.ts → tasks/listTasks.d.ts} +1 -1
- package/dist/tools/{listTasks.js → tasks/listTasks.js} +3 -3
- package/dist/tools/{reconcileTasks.d.ts → tasks/reconcileTasks.d.ts} +1 -1
- package/dist/tools/{reconcileTasks.js → tasks/reconcileTasks.js} +64 -66
- package/dist/tools/tasks/retryTask.js +60 -0
- package/dist/tools/{runTaskLoop.d.ts → tasks/runTaskLoop.d.ts} +6 -6
- package/dist/tools/{runTaskLoop.js → tasks/runTaskLoop.js} +58 -30
- package/dist/tools/tasks/runVerification.js +38 -0
- package/dist/tools/{taskLineage.js → tasks/taskLineage.js} +8 -7
- package/dist/tools/{taskOutputs.js → tasks/taskOutputs.js} +17 -16
- package/dist/tools/{androidDoctor.js → workspace/androidDoctor.js} +16 -10
- package/dist/tools/{applyPatch.d.ts → workspace/applyPatch.d.ts} +1 -1
- package/dist/tools/workspace/applyPatch.js +53 -0
- package/dist/tools/{discardWorktree.js → workspace/discardWorktree.js} +3 -3
- package/dist/tools/workspace/index.d.ts +10 -0
- package/dist/tools/workspace/index.js +10 -0
- package/dist/tools/{listAgents.d.ts → workspace/listAgents.d.ts} +5 -0
- package/dist/tools/{listAgents.js → workspace/listAgents.js} +8 -4
- package/dist/tools/{listWorkspace.js → workspace/listWorkspace.js} +3 -3
- package/dist/tools/{mergeWorktree.js → workspace/mergeWorktree.js} +3 -3
- package/dist/tools/{readWorkspaceFile.js → workspace/readWorkspaceFile.js} +8 -8
- package/dist/tools/{recommendAgentForTask.js → workspace/recommendAgentForTask.js} +3 -3
- package/dist/tools/{searchWorkspace.js → workspace/searchWorkspace.js} +5 -5
- package/dist/tools/{syncFile.d.ts → workspace/syncFile.d.ts} +1 -1
- package/dist/tools/workspace/syncFile.js +134 -0
- package/dist/utils/atomicFile.d.ts +7 -0
- package/dist/utils/atomicFile.js +48 -0
- package/dist/utils/boundedFile.d.ts +8 -0
- package/dist/utils/boundedFile.js +93 -0
- package/dist/utils/lockedJsonFile.d.ts +15 -0
- package/dist/utils/lockedJsonFile.js +224 -0
- package/dist/utils/platform.d.ts +11 -0
- package/dist/utils/platform.js +26 -0
- package/dist/utils/stableJson.d.ts +2 -0
- package/dist/utils/stableJson.js +12 -0
- package/dist/version.d.ts +3 -2
- package/dist/version.js +3 -2
- package/dist/watcherStatus.d.ts +2 -2
- package/dist/watcherStatus.js +18 -0
- package/docs/CODE_WIKI.md +808 -143
- package/docs/architecture.md +15 -55
- package/docs/assets/patchwarden-desktop-onboarding.png +0 -0
- package/docs/control-center/README.md +4 -4
- package/docs/dashboard-overview.md +4 -4
- package/docs/desktop-app.md +175 -0
- package/docs/evidence-pack-schema.md +3 -3
- package/docs/open-source-application.md +17 -11
- package/docs/release-checklist.md +1 -1
- package/docs/release-evidence.md +39 -29
- package/docs/task-safe-review-workflow.md +5 -5
- package/docs/threat-model.md +19 -1
- package/examples/config.example.json +4 -2
- package/package.json +27 -10
- package/scripts/README.md +15 -6
- package/scripts/build.js +11 -0
- package/scripts/checks/brand-check.js +3 -0
- package/scripts/checks/build-output-check.js +37 -0
- package/scripts/checks/control-center-smoke.js +91 -6
- package/scripts/checks/control-smoke.js +19 -8
- package/scripts/checks/http-mcp-smoke.js +82 -4
- package/scripts/checks/lifecycle-smoke.js +10 -10
- package/scripts/checks/mcp-manifest-check.js +1 -1
- package/scripts/checks/mcp-smoke.js +27 -3
- package/scripts/checks/package-manifest-check.js +20 -7
- package/scripts/checks/unit-tests.js +3 -5
- package/scripts/checks/watcher-supervisor-smoke.js +9 -0
- package/scripts/control/get-patchwarden-health.ps1 +1 -1
- package/scripts/control/manage-patchwarden.ps1 +69 -4
- package/scripts/control/provision-patchwarden-tunnel.ps1 +127 -0
- package/scripts/control/run-background-supervisor.ps1 +41 -0
- package/scripts/control/start-patchwarden-tunnel.ps1 +126 -32
- package/{PatchWarden-Control-Tray.cmd → scripts/launchers/PatchWarden-Control-Tray.cmd} +3 -3
- package/scripts/launchers/PatchWarden-Control.cmd +6 -0
- package/{PatchWarden-Desktop.cmd → scripts/launchers/PatchWarden-Desktop.cmd} +2 -2
- package/scripts/launchers/Restart-PatchWarden-Control.cmd +6 -0
- package/{Stop-PatchWarden.cmd → scripts/launchers/Stop-PatchWarden.cmd} +2 -2
- package/scripts/lib/clean-generated-output.js +11 -0
- package/scripts/lib/file-discovery.js +12 -0
- package/scripts/release/desktop-preflight.js +211 -0
- package/scripts/release/pack-clean.js +59 -14
- package/src/assessments/agentAssessor.ts +26 -12
- package/src/assessments/assessmentStore.ts +52 -40
- package/src/config.ts +70 -13
- package/src/control/fileManager.ts +40 -0
- package/src/control/middleware/auth.ts +22 -4
- package/src/control/middleware/static.ts +16 -3
- package/src/control/routeTable.ts +301 -0
- package/src/control/routes/audit.ts +14 -6
- package/src/control/routes/evidence.ts +1 -1
- package/src/control/routes/lineage.ts +1 -1
- package/src/control/routes/process.ts +341 -40
- package/src/control/routes/sessions.ts +88 -25
- package/src/control/routes/status.ts +97 -17
- package/src/control/routes/taskActions.ts +24 -58
- package/src/control/routes/tasks.ts +66 -58
- package/src/control/routes/workspace.ts +56 -25
- package/src/control/runtime.ts +69 -33
- package/src/control/server.ts +36 -342
- package/src/control/shared.ts +77 -11
- package/src/direct/directAudit.ts +17 -9
- package/src/direct/directGuards.ts +72 -44
- package/src/direct/directPatch.ts +95 -8
- package/src/direct/directSessionStore.ts +211 -55
- package/src/direct/directVerification.ts +9 -23
- package/src/doctor.ts +73 -59
- package/src/goal/acceptanceEngine.ts +1 -1
- package/src/goal/goalProgress.ts +17 -13
- package/src/goal/goalReport.ts +5 -13
- package/src/goal/goalStatus.ts +19 -3
- package/src/goal/goalStore.ts +241 -54
- package/src/goal/handoffExport.ts +6 -6
- package/src/goal/specKitImport.ts +12 -12
- package/src/goal/subgoalSync.ts +11 -8
- package/src/goal/worktreeManager.ts +139 -22
- package/src/httpServer.ts +113 -30
- package/src/logging.ts +10 -3
- package/src/policy/projectPolicy.ts +5 -2
- package/src/release/releaseGate.ts +74 -27
- package/src/runner/agentInvocation.ts +126 -4
- package/src/runner/changeCapture.ts +291 -57
- package/src/runner/postTaskCleanup.ts +41 -17
- package/src/runner/processSecurity.ts +433 -0
- package/src/runner/runTask.ts +138 -91
- package/src/runner/simpleProcess.ts +66 -31
- package/src/{taskProgress.ts → runner/taskProgress.ts} +3 -3
- package/src/{taskRuntime.ts → runner/taskRuntime.ts} +4 -3
- package/src/runner/taskStatusStore.ts +54 -0
- package/src/runner/watch.ts +281 -51
- package/src/security/contentRedaction.ts +2 -2
- package/src/security/discoveryTokenStore.ts +18 -4
- package/src/security/loopbackHost.ts +19 -0
- package/src/security/pathGuard.ts +35 -16
- package/src/security/planGuard.ts +2 -1
- package/src/security/runtimeGuard.ts +9 -6
- package/src/security/secretComparison.ts +13 -0
- package/src/security/sensitiveGuard.ts +27 -8
- package/src/security/toolInvocationGuard.ts +2 -2
- package/src/security/workspaceRootGuard.ts +53 -0
- package/src/smoke-test.ts +25 -24
- package/src/tools/catalog/index.ts +4 -0
- package/src/tools/{toolCatalog.ts → catalog/toolCatalog.ts} +3 -12
- package/src/tools/{toolRegistry.ts → catalog/toolRegistry.ts} +7 -16
- package/src/tools/definitions/toolDefs.ts +1264 -0
- package/src/tools/{auditSession.ts → diagnostics/auditSession.ts} +2 -2
- package/src/tools/{auditTask.ts → diagnostics/auditTask.ts} +99 -32
- package/src/tools/{healthCheck.ts → diagnostics/healthCheck.ts} +8 -8
- package/src/tools/diagnostics/index.ts +6 -0
- package/src/tools/{safeStatus.ts → diagnostics/safeStatus.ts} +7 -7
- package/src/tools/{safeViews.ts → diagnostics/safeViews.ts} +27 -17
- package/src/tools/{schemaDriftCheck.ts → diagnostics/schemaDriftCheck.ts} +3 -3
- package/src/tools/{createDirectSession.ts → direct/createDirectSession.ts} +6 -6
- package/src/tools/{finalizeDirectSession.ts → direct/finalizeDirectSession.ts} +7 -5
- package/src/tools/direct/index.ts +3 -0
- package/src/tools/{runDirectVerificationBundle.ts → direct/runDirectVerificationBundle.ts} +2 -2
- package/src/tools/{discoverTools.ts → discovery/discoverTools.ts} +6 -6
- package/src/tools/{explainTool.ts → discovery/explainTool.ts} +3 -3
- package/src/tools/discovery/index.ts +3 -0
- package/src/tools/{invokeDiscoveredTool.ts → discovery/invokeDiscoveredTool.ts} +7 -7
- package/src/tools/dispatch/coreDispatch.ts +36 -31
- package/src/tools/dispatch/diagnosticDispatch.ts +26 -21
- package/src/tools/dispatch/directDispatch.ts +11 -10
- package/src/tools/dispatch/goalDispatch.ts +5 -4
- package/src/tools/dispatch/releaseDispatch.ts +3 -2
- package/src/tools/dispatch/validation.ts +78 -0
- package/src/tools/{getPlan.ts → goals/getPlan.ts} +4 -4
- package/src/tools/{goalSubgoalTask.ts → goals/goalSubgoalTask.ts} +41 -26
- package/src/tools/goals/index.ts +3 -0
- package/src/tools/{savePlan.ts → goals/savePlan.ts} +38 -8
- package/src/tools/registry.ts +17 -1261
- package/src/tools/{checkReleaseGate.ts → release/checkReleaseGate.ts} +3 -3
- package/src/tools/release/index.ts +2 -0
- package/src/tools/{releaseMode.ts → release/releaseMode.ts} +42 -24
- package/src/tools/tasks/cancelTask.ts +109 -0
- package/src/tools/{createTask.ts → tasks/createTask.ts} +49 -26
- package/src/tools/{diagnoseTask.ts → tasks/diagnoseTask.ts} +8 -8
- package/src/tools/{evidencePack.ts → tasks/evidencePack.ts} +36 -22
- package/src/tools/{getTaskFile.ts → tasks/getTaskFile.ts} +4 -4
- package/src/tools/{getTaskStatus.ts → tasks/getTaskStatus.ts} +7 -5
- package/src/tools/{getTaskStdoutTail.ts → tasks/getTaskStdoutTail.ts} +13 -11
- package/src/tools/{getTaskSummary.ts → tasks/getTaskSummary.ts} +44 -33
- package/src/tools/tasks/index.ts +18 -0
- package/src/tools/{listTasks.ts → tasks/listTasks.ts} +4 -4
- package/src/tools/{reconcileTasks.ts → tasks/reconcileTasks.ts} +68 -66
- package/src/tools/tasks/retryTask.ts +69 -0
- package/src/tools/{runTaskLoop.ts → tasks/runTaskLoop.ts} +69 -34
- package/src/tools/{runVerification.ts → tasks/runVerification.ts} +6 -3
- package/src/tools/{taskLineage.ts → tasks/taskLineage.ts} +8 -7
- package/src/tools/{taskOutputs.ts → tasks/taskOutputs.ts} +27 -20
- package/src/tools/{androidDoctor.ts → workspace/androidDoctor.ts} +15 -10
- package/src/tools/{applyPatch.ts → workspace/applyPatch.ts} +38 -16
- package/src/tools/{discardWorktree.ts → workspace/discardWorktree.ts} +3 -3
- package/src/tools/workspace/index.ts +10 -0
- package/src/tools/{listAgents.ts → workspace/listAgents.ts} +11 -4
- package/src/tools/{listWorkspace.ts → workspace/listWorkspace.ts} +3 -3
- package/src/tools/{mergeWorktree.ts → workspace/mergeWorktree.ts} +3 -3
- package/src/tools/{readWorkspaceFile.ts → workspace/readWorkspaceFile.ts} +8 -8
- package/src/tools/{recommendAgentForTask.ts → workspace/recommendAgentForTask.ts} +3 -3
- package/src/tools/{searchWorkspace.ts → workspace/searchWorkspace.ts} +5 -5
- package/src/tools/workspace/syncFile.ts +292 -0
- package/src/utils/atomicFile.ts +58 -0
- package/src/utils/boundedFile.ts +116 -0
- package/src/utils/lockedJsonFile.ts +251 -0
- package/src/utils/platform.ts +31 -0
- package/src/utils/stableJson.ts +12 -0
- package/src/version.ts +3 -2
- package/src/watcherStatus.ts +19 -1
- package/ui/desktop-bootstrap.js +11 -0
- package/ui/desktop-bridge.js +36 -0
- package/ui/desktop.css +160 -0
- package/ui/getting-started.js +93 -0
- package/ui/i18n.js +484 -0
- package/ui/log-parser.js +30 -0
- package/ui/pages/audit.html +12 -0
- package/ui/pages/dashboard.html +90 -147
- package/ui/pages/direct-sessions.html +123 -26
- package/ui/pages/getting-started.html +43 -0
- package/ui/pages/logs.html +105 -22
- package/ui/pages/settings.html +101 -0
- package/ui/pages/task-detail.html +12 -0
- package/ui/pages/tasks.html +54 -8
- package/ui/pages/workspace.html +38 -1
- package/ui/settings.js +245 -0
- package/PatchWarden-Control.cmd +0 -6
- package/Restart-PatchWarden-Control.cmd +0 -6
- package/dist/test/unit/acceptance-engine.test.d.ts +0 -1
- package/dist/test/unit/acceptance-engine.test.js +0 -228
- package/dist/test/unit/agent-router.test.d.ts +0 -1
- package/dist/test/unit/agent-router.test.js +0 -287
- package/dist/test/unit/android-doctor.test.d.ts +0 -1
- package/dist/test/unit/android-doctor.test.js +0 -118
- package/dist/test/unit/apply-patch.test.d.ts +0 -1
- package/dist/test/unit/apply-patch.test.js +0 -225
- package/dist/test/unit/audit-checks.test.d.ts +0 -1
- package/dist/test/unit/audit-checks.test.js +0 -350
- package/dist/test/unit/chinese-path.test.d.ts +0 -1
- package/dist/test/unit/chinese-path.test.js +0 -91
- package/dist/test/unit/command-guard.test.d.ts +0 -1
- package/dist/test/unit/command-guard.test.js +0 -160
- package/dist/test/unit/create-task.test.d.ts +0 -1
- package/dist/test/unit/create-task.test.js +0 -197
- package/dist/test/unit/diagnose-task.test.d.ts +0 -1
- package/dist/test/unit/diagnose-task.test.js +0 -457
- package/dist/test/unit/direct-guards.test.d.ts +0 -1
- package/dist/test/unit/direct-guards.test.js +0 -328
- package/dist/test/unit/discovery-token-store.test.d.ts +0 -1
- package/dist/test/unit/discovery-token-store.test.js +0 -139
- package/dist/test/unit/evidence-pack.test.d.ts +0 -1
- package/dist/test/unit/evidence-pack.test.js +0 -224
- package/dist/test/unit/get-task-status.test.d.ts +0 -1
- package/dist/test/unit/get-task-status.test.js +0 -174
- package/dist/test/unit/get-task-summary.test.d.ts +0 -1
- package/dist/test/unit/get-task-summary.test.js +0 -146
- package/dist/test/unit/goal-graph.test.d.ts +0 -1
- package/dist/test/unit/goal-graph.test.js +0 -298
- package/dist/test/unit/goal-progress.test.d.ts +0 -1
- package/dist/test/unit/goal-progress.test.js +0 -381
- package/dist/test/unit/goal-report.test.d.ts +0 -1
- package/dist/test/unit/goal-report.test.js +0 -159
- package/dist/test/unit/goal-status.test.d.ts +0 -1
- package/dist/test/unit/goal-status.test.js +0 -215
- package/dist/test/unit/goal-store.test.d.ts +0 -1
- package/dist/test/unit/goal-store.test.js +0 -253
- package/dist/test/unit/goal-subgoal-task.test.d.ts +0 -1
- package/dist/test/unit/goal-subgoal-task.test.js +0 -55
- package/dist/test/unit/goal-tools-registry.test.d.ts +0 -1
- package/dist/test/unit/goal-tools-registry.test.js +0 -192
- package/dist/test/unit/handoff-export.test.d.ts +0 -1
- package/dist/test/unit/handoff-export.test.js +0 -263
- package/dist/test/unit/invoke-discovered-tool.test.d.ts +0 -1
- package/dist/test/unit/invoke-discovered-tool.test.js +0 -167
- package/dist/test/unit/logging.test.d.ts +0 -1
- package/dist/test/unit/logging.test.js +0 -397
- package/dist/test/unit/path-guard.test.d.ts +0 -1
- package/dist/test/unit/path-guard.test.js +0 -133
- package/dist/test/unit/post-task-cleanup.test.d.ts +0 -1
- package/dist/test/unit/post-task-cleanup.test.js +0 -48
- package/dist/test/unit/project-policy-release-mode.test.d.ts +0 -1
- package/dist/test/unit/project-policy-release-mode.test.js +0 -125
- package/dist/test/unit/reconcile-tasks.test.d.ts +0 -1
- package/dist/test/unit/reconcile-tasks.test.js +0 -456
- package/dist/test/unit/release-gate.test.d.ts +0 -1
- package/dist/test/unit/release-gate.test.js +0 -242
- package/dist/test/unit/run-task-loop.test.d.ts +0 -1
- package/dist/test/unit/run-task-loop.test.js +0 -380
- package/dist/test/unit/safe-status.test.d.ts +0 -1
- package/dist/test/unit/safe-status.test.js +0 -165
- package/dist/test/unit/safe-views.test.d.ts +0 -1
- package/dist/test/unit/safe-views.test.js +0 -171
- package/dist/test/unit/schema-drift-check.test.d.ts +0 -1
- package/dist/test/unit/schema-drift-check.test.js +0 -176
- package/dist/test/unit/sensitive-guard.test.d.ts +0 -1
- package/dist/test/unit/sensitive-guard.test.js +0 -104
- package/dist/test/unit/spec-kit-import.test.d.ts +0 -1
- package/dist/test/unit/spec-kit-import.test.js +0 -341
- package/dist/test/unit/subgoal-sync.test.d.ts +0 -1
- package/dist/test/unit/subgoal-sync.test.js +0 -183
- package/dist/test/unit/sync-file.test.d.ts +0 -1
- package/dist/test/unit/sync-file.test.js +0 -154
- package/dist/test/unit/tool-invocation-guard.test.d.ts +0 -1
- package/dist/test/unit/tool-invocation-guard.test.js +0 -432
- package/dist/test/unit/tool-usage-stats.test.d.ts +0 -1
- package/dist/test/unit/tool-usage-stats.test.js +0 -300
- package/dist/test/unit/toolSearch.test.d.ts +0 -1
- package/dist/test/unit/toolSearch.test.js +0 -571
- package/dist/test/unit/wait-for-task.test.d.ts +0 -1
- package/dist/test/unit/wait-for-task.test.js +0 -144
- package/dist/test/unit/watcher-status.test.d.ts +0 -1
- package/dist/test/unit/watcher-status.test.js +0 -169
- package/dist/test/unit/worktree-manager.test.d.ts +0 -1
- package/dist/test/unit/worktree-manager.test.js +0 -176
- package/dist/tools/applyPatch.js +0 -41
- package/dist/tools/cancelTask.d.ts +0 -30
- package/dist/tools/cancelTask.js +0 -64
- package/dist/tools/finalizeDirectSession.js +0 -84
- package/dist/tools/goalSubgoalTask.js +0 -110
- package/dist/tools/killTask.d.ts +0 -15
- package/dist/tools/retryTask.js +0 -45
- package/dist/tools/runVerification.js +0 -36
- package/dist/tools/syncFile.js +0 -65
- package/docs/control-center/control-center-daily-driver.md +0 -211
- package/docs/control-center/control-center-mvp.md +0 -205
- package/docs/control-center/control-center-phase2.md +0 -159
- package/docs/execution-plan-2026-07-09.md +0 -315
- package/docs/release-v0.6.0.md +0 -71
- package/docs/release-v0.6.1.md +0 -75
- package/docs/release-v0.6.4.md +0 -45
- package/docs/roadmap-execution-and-acceptance.md +0 -365
- package/src/test/unit/acceptance-engine.test.ts +0 -261
- package/src/test/unit/agent-router.test.ts +0 -342
- package/src/test/unit/android-doctor.test.ts +0 -158
- package/src/test/unit/apply-patch.test.ts +0 -293
- package/src/test/unit/audit-checks.test.ts +0 -567
- package/src/test/unit/chinese-path.test.ts +0 -106
- package/src/test/unit/command-guard.test.ts +0 -221
- package/src/test/unit/create-task.test.ts +0 -255
- package/src/test/unit/diagnose-task.test.ts +0 -544
- package/src/test/unit/direct-guards.test.ts +0 -467
- package/src/test/unit/discovery-token-store.test.ts +0 -181
- package/src/test/unit/evidence-pack.test.ts +0 -251
- package/src/test/unit/get-task-status.test.ts +0 -203
- package/src/test/unit/get-task-summary.test.ts +0 -173
- package/src/test/unit/goal-graph.test.ts +0 -347
- package/src/test/unit/goal-progress.test.ts +0 -538
- package/src/test/unit/goal-report.test.ts +0 -189
- package/src/test/unit/goal-status.test.ts +0 -270
- package/src/test/unit/goal-store.test.ts +0 -318
- package/src/test/unit/goal-subgoal-task.test.ts +0 -72
- package/src/test/unit/goal-tools-registry.test.ts +0 -245
- package/src/test/unit/handoff-export.test.ts +0 -295
- package/src/test/unit/invoke-discovered-tool.test.ts +0 -216
- package/src/test/unit/logging.test.ts +0 -497
- package/src/test/unit/path-guard.test.ts +0 -180
- package/src/test/unit/post-task-cleanup.test.ts +0 -53
- package/src/test/unit/project-policy-release-mode.test.ts +0 -156
- package/src/test/unit/reconcile-tasks.test.ts +0 -551
- package/src/test/unit/release-gate.test.ts +0 -314
- package/src/test/unit/run-task-loop.test.ts +0 -425
- package/src/test/unit/safe-status.test.ts +0 -187
- package/src/test/unit/safe-views.test.ts +0 -184
- package/src/test/unit/schema-drift-check.test.ts +0 -260
- package/src/test/unit/sensitive-guard.test.ts +0 -124
- package/src/test/unit/spec-kit-import.test.ts +0 -429
- package/src/test/unit/subgoal-sync.test.ts +0 -236
- package/src/test/unit/sync-file.test.ts +0 -231
- package/src/test/unit/tool-invocation-guard.test.ts +0 -542
- package/src/test/unit/tool-usage-stats.test.ts +0 -384
- package/src/test/unit/toolSearch.test.ts +0 -756
- package/src/test/unit/wait-for-task.test.ts +0 -176
- package/src/test/unit/watcher-status.test.ts +0 -190
- package/src/test/unit/worktree-manager.test.ts +0 -247
- package/src/tools/cancelTask.ts +0 -70
- package/src/tools/retryTask.ts +0 -53
- package/src/tools/syncFile.ts +0 -122
- /package/dist/tools/{toolCatalog.d.ts → catalog/toolCatalog.d.ts} +0 -0
- /package/dist/tools/{toolSearch.d.ts → catalog/toolSearch.d.ts} +0 -0
- /package/dist/tools/{toolSearch.js → catalog/toolSearch.js} +0 -0
- /package/dist/tools/{toolUsageStats.d.ts → catalog/toolUsageStats.d.ts} +0 -0
- /package/dist/tools/{toolUsageStats.js → catalog/toolUsageStats.js} +0 -0
- /package/dist/tools/{createDirectSession.d.ts → direct/createDirectSession.d.ts} +0 -0
- /package/dist/tools/{runDirectVerificationBundle.d.ts → direct/runDirectVerificationBundle.d.ts} +0 -0
- /package/dist/tools/{getPlan.d.ts → goals/getPlan.d.ts} +0 -0
- /package/dist/tools/{savePlan.d.ts → goals/savePlan.d.ts} +0 -0
- /package/dist/tools/{evidencePack.d.ts → tasks/evidencePack.d.ts} +0 -0
- /package/dist/tools/{getTaskFile.d.ts → tasks/getTaskFile.d.ts} +0 -0
- /package/dist/tools/{getTaskProgress.d.ts → tasks/getTaskProgress.d.ts} +0 -0
- /package/dist/tools/{getTaskProgress.js → tasks/getTaskProgress.js} +0 -0
- /package/dist/tools/{getTaskStdoutTail.d.ts → tasks/getTaskStdoutTail.d.ts} +0 -0
- /package/dist/tools/{getTaskSummary.d.ts → tasks/getTaskSummary.d.ts} +0 -0
- /package/dist/tools/{killTask.js → tasks/killTask.js} +0 -0
- /package/dist/tools/{retryTask.d.ts → tasks/retryTask.d.ts} +0 -0
- /package/dist/tools/{runVerification.d.ts → tasks/runVerification.d.ts} +0 -0
- /package/dist/tools/{taskLineage.d.ts → tasks/taskLineage.d.ts} +0 -0
- /package/dist/tools/{taskOutputs.d.ts → tasks/taskOutputs.d.ts} +0 -0
- /package/dist/tools/{waitForTask.d.ts → tasks/waitForTask.d.ts} +0 -0
- /package/dist/tools/{waitForTask.js → tasks/waitForTask.js} +0 -0
- /package/dist/tools/{androidDoctor.d.ts → workspace/androidDoctor.d.ts} +0 -0
- /package/dist/tools/{discardWorktree.d.ts → workspace/discardWorktree.d.ts} +0 -0
- /package/dist/tools/{listWorkspace.d.ts → workspace/listWorkspace.d.ts} +0 -0
- /package/dist/tools/{mergeWorktree.d.ts → workspace/mergeWorktree.d.ts} +0 -0
- /package/dist/tools/{readWorkspaceFile.d.ts → workspace/readWorkspaceFile.d.ts} +0 -0
- /package/dist/tools/{recommendAgentForTask.d.ts → workspace/recommendAgentForTask.d.ts} +0 -0
- /package/dist/tools/{searchWorkspace.d.ts → workspace/searchWorkspace.d.ts} +0 -0
- /package/src/tools/{toolSearch.ts → catalog/toolSearch.ts} +0 -0
- /package/src/tools/{toolUsageStats.ts → catalog/toolUsageStats.ts} +0 -0
- /package/src/tools/{getTaskProgress.ts → tasks/getTaskProgress.ts} +0 -0
- /package/src/tools/{killTask.ts → tasks/killTask.ts} +0 -0
- /package/src/tools/{waitForTask.ts → tasks/waitForTask.ts} +0 -0
package/ui/i18n.js
ADDED
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
"use strict";
|
|
3
|
+
var STORAGE_KEY = "patchwarden.language";
|
|
4
|
+
var dictionaries = {
|
|
5
|
+
"zh-CN": {
|
|
6
|
+
"app.title": "PatchWarden",
|
|
7
|
+
"nav.gettingStarted": "开始使用",
|
|
8
|
+
"nav.dashboard": "高级控制台",
|
|
9
|
+
"nav.tasks": "任务面板",
|
|
10
|
+
"nav.workspace": "工作区",
|
|
11
|
+
"nav.audit": "审计日志",
|
|
12
|
+
"nav.direct": "Direct 会话",
|
|
13
|
+
"nav.logs": "日志",
|
|
14
|
+
"nav.settings": "设置",
|
|
15
|
+
"language.label": "语言",
|
|
16
|
+
"language.system": "跟随 Windows",
|
|
17
|
+
"language.zh": "简体中文",
|
|
18
|
+
"language.en": "English",
|
|
19
|
+
"home.title": "开始使用 PatchWarden",
|
|
20
|
+
"home.subtitle": "按顺序完成四项检查。Direct 是可选高级能力,不会阻止 Core 启动。",
|
|
21
|
+
"home.workspace": "工作区与 Agent",
|
|
22
|
+
"home.platform": "Platform / Tunnel",
|
|
23
|
+
"home.core": "Core 服务",
|
|
24
|
+
"home.chatgpt": "ChatGPT App",
|
|
25
|
+
"home.checking": "正在检查…",
|
|
26
|
+
"home.ready": "已就绪",
|
|
27
|
+
"home.needsAction": "需要操作",
|
|
28
|
+
"home.manual": "需要人工验证",
|
|
29
|
+
"home.workspaceReady": "工作区有效,至少一个本地 Agent 可用。",
|
|
30
|
+
"home.workspaceMissing": "请先选择安全工作区并注册可用 Agent。",
|
|
31
|
+
"home.tunnelReady": "程序、Core profile 与 DPAPI 凭据均已配置。",
|
|
32
|
+
"home.tunnelMissing": "请配置 tunnel-client、Tunnel ID 和专用 runtime API key。",
|
|
33
|
+
"home.localRoute": "本地 MCP 路线无需配置 Platform Tunnel。",
|
|
34
|
+
"home.coreReady": "Core、Tunnel 与 Watcher 均已就绪。",
|
|
35
|
+
"home.coreMissing": "Core 尚未完全就绪。请启动并查看具体失败原因。",
|
|
36
|
+
"home.chatgptManual": "在 ChatGPT Settings → Plugins 创建 developer-mode app,选择 Tunnel,并在新对话调用 health_check。",
|
|
37
|
+
"home.openSettings": "打开设置",
|
|
38
|
+
"home.openPlatform": "打开 Platform Tunnel",
|
|
39
|
+
"home.startCore": "启动 Core",
|
|
40
|
+
"home.coreRunning": "Core 已启动",
|
|
41
|
+
"home.startingCore": "正在启动…",
|
|
42
|
+
"home.coreStarting": "启动命令已提交,正在等待 Tunnel 和 Watcher 通过就绪检查。",
|
|
43
|
+
"home.startFailed": "Core 启动失败,请按下方原因处理后重试。",
|
|
44
|
+
"home.copyPrompt": "复制测试提示",
|
|
45
|
+
"home.copied": "已复制 health_check 测试提示",
|
|
46
|
+
"home.docs": "官方与项目指南",
|
|
47
|
+
"home.secureGuide": "Secure MCP Tunnel 官方指南",
|
|
48
|
+
"home.pluginsGuide": "ChatGPT Plugins",
|
|
49
|
+
"home.readmeZh": "中文 README",
|
|
50
|
+
"home.readmeEn": "English README",
|
|
51
|
+
"settings.title": "设置",
|
|
52
|
+
"settings.pageTitle": "设置 — PatchWarden",
|
|
53
|
+
"settings.appearance": "外观与窗口",
|
|
54
|
+
"settings.localAgents": "本地 Agent 与模型",
|
|
55
|
+
"settings.localAgentsHelp": "只注册检测到的受支持 CLI;模型来自本地安全配置字段,联网刷新需手动触发。",
|
|
56
|
+
"settings.detectAgents": "重新检测",
|
|
57
|
+
"settings.loadingAgents": "正在读取本地 Agent…",
|
|
58
|
+
"settings.detectingAgents": "正在重新检测本地 Agent…",
|
|
59
|
+
"settings.saveAgents": "保存 Agent 设置",
|
|
60
|
+
"settings.savingAgents": "正在保存 Agent 设置…",
|
|
61
|
+
"settings.agentAvailable": "CLI 可用",
|
|
62
|
+
"settings.agentMissing": "未找到 CLI",
|
|
63
|
+
"settings.followAgentDefault": "跟随 Agent 默认",
|
|
64
|
+
"settings.customModel": "自定义模型 ID",
|
|
65
|
+
"settings.modelIdPlaceholder": "provider/model",
|
|
66
|
+
"settings.refreshModels": "刷新模型列表",
|
|
67
|
+
"settings.refreshingModels": "正在刷新 {agent} 模型…",
|
|
68
|
+
"settings.modelsRefreshed": "已发现 {count} 个模型",
|
|
69
|
+
"settings.theme": "主题",
|
|
70
|
+
"settings.themeHelp": "跟随 Windows,或固定使用浅色、深色。",
|
|
71
|
+
"settings.themeSystem": "跟随系统",
|
|
72
|
+
"settings.themeLight": "浅色",
|
|
73
|
+
"settings.themeDark": "深色",
|
|
74
|
+
"settings.languageHelp": "首次跟随 Windows;手动选择后跨页面和重启保留。",
|
|
75
|
+
"settings.closeWindow": "关闭窗口",
|
|
76
|
+
"settings.closeWindowHelp": "默认隐藏到系统托盘,后台服务保持可用。",
|
|
77
|
+
"settings.closeToTray": "最小化到托盘",
|
|
78
|
+
"settings.closeQuit": "退出桌面应用",
|
|
79
|
+
"settings.mcpTunnel": "MCP 与隧道",
|
|
80
|
+
"settings.tunnelUndetected": "尚未检测",
|
|
81
|
+
"settings.detect": "检测",
|
|
82
|
+
"settings.choose": "选择",
|
|
83
|
+
"settings.directHelp": "启用后才会暴露 Direct 编辑工具并允许启动 Direct 隧道。",
|
|
84
|
+
"settings.enable": "启用",
|
|
85
|
+
"settings.proxy": "代理配置",
|
|
86
|
+
"settings.proxyHelp": "使用环境代理、不使用代理,或填写不含凭据的代理 URL。",
|
|
87
|
+
"settings.proxyShared": "Core / Direct 共用",
|
|
88
|
+
"settings.proxySeparate": "分别配置",
|
|
89
|
+
"settings.proxyEnvironment": "使用环境代理",
|
|
90
|
+
"settings.proxyNone": "不使用代理",
|
|
91
|
+
"settings.proxyManual": "手动代理",
|
|
92
|
+
"settings.saveRuntime": "保存运行设置",
|
|
93
|
+
"settings.installSummary": "没有 tunnel-client.exe?查看安装步骤",
|
|
94
|
+
"settings.installStep1": "从项目文档标明的可信发布页下载 Windows x64 版本。",
|
|
95
|
+
"settings.installStep2": "核对发布页提供的 SHA256,再解压到仅当前用户可写的目录。",
|
|
96
|
+
"settings.installStep3": "点击上方“选择”,定位到文件名严格为 tunnel-client.exe 的程序。",
|
|
97
|
+
"settings.installStep4": "保存后运行健康检查;本应用不会自动下载或运行新软件。",
|
|
98
|
+
"settings.workspaceDiagnostics": "工作区与诊断",
|
|
99
|
+
"settings.currentConfig": "当前配置",
|
|
100
|
+
"settings.loading": "加载中…",
|
|
101
|
+
"settings.openConfig": "打开配置文件",
|
|
102
|
+
"settings.workspace": "工作区",
|
|
103
|
+
"settings.workspaceHelp": "通过安全目录选择器更新。",
|
|
104
|
+
"settings.change": "更改",
|
|
105
|
+
"settings.openLogs": "打开日志",
|
|
106
|
+
"settings.runDoctor": "运行健康检查",
|
|
107
|
+
"settings.notConfigured": "未配置",
|
|
108
|
+
"settings.tunnelNotConfigured": "未配置,请自动检测或选择文件",
|
|
109
|
+
"settings.autoDetecting": "正在自动检测 tunnel-client.exe…",
|
|
110
|
+
"settings.autoDetectedPath": "{path}({source},保存后固定使用)",
|
|
111
|
+
"settings.autoDetected": "已自动找到,点击保存运行设置即可持久化",
|
|
112
|
+
"settings.tunnelNotFound": "未找到,请选择文件或查看安装步骤",
|
|
113
|
+
"settings.doctorChecking": "正在检查…",
|
|
114
|
+
"settings.doctorDone": "检查完成。",
|
|
115
|
+
"settings.doctorFailed": "健康检查失败:{error}",
|
|
116
|
+
"settings.detecting": "正在检测…",
|
|
117
|
+
"settings.detectedPath": "{path}({source})",
|
|
118
|
+
"settings.tunnelFound": "已找到 tunnel-client.exe",
|
|
119
|
+
"settings.tunnelSelected": "已选择,保存后生效",
|
|
120
|
+
"settings.saving": "正在保存…",
|
|
121
|
+
"settings.savedRestart": "设置已保存;当前外部 Control Center 需手动重启后生效",
|
|
122
|
+
"settings.savedReload": "设置已保存,Control Center 正在重新载入",
|
|
123
|
+
"settings.saveFailed": "保存失败:{error}",
|
|
124
|
+
"settings.tunnelCredentials": "Core Tunnel 凭据",
|
|
125
|
+
"settings.tunnelId": "Tunnel ID",
|
|
126
|
+
"settings.runtimeKey": "Tunnel runtime API key",
|
|
127
|
+
"settings.runtimeKeyHelp": "这是 CONTROL_PLANE_API_KEY 对应的专用 Tunnel runtime key,不是 OPENAI_API_KEY。仅经 stdin 交给一次性 provisioning 进程。",
|
|
128
|
+
"settings.configureCore": "配置并验证 Core",
|
|
129
|
+
"settings.configureDirect": "配置并验证 Direct",
|
|
130
|
+
"settings.forgetCredential": "忘记已保存凭据",
|
|
131
|
+
"settings.revalidate": "重新验证",
|
|
132
|
+
"settings.revalidating": "正在使用已保存凭据运行 Tunnel doctor…",
|
|
133
|
+
"settings.revalidated": "重新验证成功,已保存凭据保持不变。",
|
|
134
|
+
"settings.credentialConfigured": "已配置",
|
|
135
|
+
"settings.credentialMissing": "未配置",
|
|
136
|
+
"settings.provisioning": "正在初始化 profile 并运行 tunnel-client doctor --explain…",
|
|
137
|
+
"settings.provisioned": "验证成功,凭据已用 Windows DPAPI 保存。",
|
|
138
|
+
"settings.confirmForget": "确定忘记已保存的 Tunnel runtime API key?Core 和 Direct 将无法启动,直到重新配置。",
|
|
139
|
+
"settings.forgotten": "已忘记保存的 Tunnel 凭据。",
|
|
140
|
+
"reason.tunnel_client_missing": "缺少 tunnel-client.exe。请先检测或选择程序。",
|
|
141
|
+
"reason.tunnel_profile_missing": "缺少 Tunnel profile。请在设置中输入 Tunnel ID 和 runtime key。",
|
|
142
|
+
"reason.tunnel_credential_missing": "缺少已验证的 Tunnel runtime 凭据。",
|
|
143
|
+
"reason.authentication_failed": "认证失败。请核对专用 Tunnel runtime key。",
|
|
144
|
+
"reason.auth_failed": "认证失败。请核对专用 Tunnel runtime key。",
|
|
145
|
+
"reason.proxy_unreachable": "代理或网络不可达。请检查 HTTP/Mixed 代理。",
|
|
146
|
+
"reason.region_unsupported": "当前区域不支持 Secure MCP Tunnel。",
|
|
147
|
+
"reason.unsupported_region": "当前区域不支持 Secure MCP Tunnel。",
|
|
148
|
+
"reason.doctor_failed": "Tunnel doctor 验证失败,请查看设置和网络。",
|
|
149
|
+
"reason.tunnel_not_ready": "Tunnel 尚未 ready。",
|
|
150
|
+
"reason.watcher_unhealthy": "Watcher 不健康,请运行诊断并查看日志。",
|
|
151
|
+
"reason.chatgpt_reconnect": "请在 ChatGPT 重新连接 app,或新建对话后再试。"
|
|
152
|
+
,"reason.credential_forget_failed": "无法删除已保存凭据,请关闭正在使用它的进程后重试。"
|
|
153
|
+
,"reason.startup_timeout": "启动命令已执行,但 Core 未在等待时间内就绪。请检查代理、Tunnel doctor 和日志。"
|
|
154
|
+
,"reason.supervisor_exited": "Tunnel supervisor 在 Core 就绪前退出。请检查代理、凭据和 Tunnel 日志。"
|
|
155
|
+
,"reason.manager_failed": "本地启动管理器执行失败,请运行诊断并查看 Control Center 日志。"
|
|
156
|
+
,"reason.start_failed": "Core 启动失败,请运行诊断并查看具体原因。"
|
|
157
|
+
,"reason.revalidation_failed": "使用已保存凭据重新验证失败,请检查代理和 Tunnel 状态。"
|
|
158
|
+
,"reason.tool_manifest_check_failed": "Core 工具目录校验失败。请运行诊断并查看 supervisor 日志。"
|
|
159
|
+
,"reason.tool_manifest_invalid": "Core 工具目录返回了无效结果。请重新构建后再试。"
|
|
160
|
+
,"reason.supervisor_permission_denied": "系统阻止了 Core 子进程启动。请从正常桌面会话运行 PatchWarden。"
|
|
161
|
+
,"reason.supervisor_launch_failed": "无法启动 Tunnel supervisor。请检查本地 PowerShell 权限。"
|
|
162
|
+
,"reason.config_error": "Tunnel profile、配置或启动器无效。请在设置中重新验证。"
|
|
163
|
+
},
|
|
164
|
+
en: {
|
|
165
|
+
"app.title": "PatchWarden",
|
|
166
|
+
"nav.gettingStarted": "Getting Started",
|
|
167
|
+
"nav.dashboard": "Advanced Console",
|
|
168
|
+
"nav.tasks": "Tasks",
|
|
169
|
+
"nav.workspace": "Workspace",
|
|
170
|
+
"nav.audit": "Audit Log",
|
|
171
|
+
"nav.direct": "Direct Sessions",
|
|
172
|
+
"nav.logs": "Logs",
|
|
173
|
+
"nav.settings": "Settings",
|
|
174
|
+
"language.label": "Language",
|
|
175
|
+
"language.system": "Use Windows language",
|
|
176
|
+
"language.zh": "简体中文",
|
|
177
|
+
"language.en": "English",
|
|
178
|
+
"home.title": "Get Started with PatchWarden",
|
|
179
|
+
"home.subtitle": "Complete these four checks in order. Direct is optional and never blocks Core startup.",
|
|
180
|
+
"home.workspace": "Workspace and Agent",
|
|
181
|
+
"home.platform": "Platform / Tunnel",
|
|
182
|
+
"home.core": "Core service",
|
|
183
|
+
"home.chatgpt": "ChatGPT App",
|
|
184
|
+
"home.checking": "Checking…",
|
|
185
|
+
"home.ready": "Ready",
|
|
186
|
+
"home.needsAction": "Action required",
|
|
187
|
+
"home.manual": "Manual verification",
|
|
188
|
+
"home.workspaceReady": "The workspace is valid and at least one local Agent is available.",
|
|
189
|
+
"home.workspaceMissing": "Choose a safe workspace and register an available Agent.",
|
|
190
|
+
"home.tunnelReady": "The executable, Core profile, and DPAPI credential are configured.",
|
|
191
|
+
"home.tunnelMissing": "Configure tunnel-client, the Tunnel ID, and the dedicated runtime API key.",
|
|
192
|
+
"home.localRoute": "The local MCP route does not require a Platform Tunnel.",
|
|
193
|
+
"home.coreReady": "Core, Tunnel, and Watcher are ready.",
|
|
194
|
+
"home.coreMissing": "Core is not fully ready. Start it and review the specific failure.",
|
|
195
|
+
"home.chatgptManual": "In ChatGPT Settings → Plugins, create a developer-mode app, choose the Tunnel, then call health_check in a new chat.",
|
|
196
|
+
"home.openSettings": "Open Settings",
|
|
197
|
+
"home.openPlatform": "Open Platform Tunnel",
|
|
198
|
+
"home.startCore": "Start Core",
|
|
199
|
+
"home.coreRunning": "Core is running",
|
|
200
|
+
"home.startingCore": "Starting…",
|
|
201
|
+
"home.coreStarting": "The start command was submitted. Waiting for Tunnel and Watcher readiness checks.",
|
|
202
|
+
"home.startFailed": "Core failed to start. Address the reason below and retry.",
|
|
203
|
+
"home.copyPrompt": "Copy test prompt",
|
|
204
|
+
"home.copied": "Copied the health_check test prompt",
|
|
205
|
+
"home.docs": "Official and project guides",
|
|
206
|
+
"home.secureGuide": "Official Secure MCP Tunnel guide",
|
|
207
|
+
"home.pluginsGuide": "ChatGPT Plugins",
|
|
208
|
+
"home.readmeZh": "中文 README",
|
|
209
|
+
"home.readmeEn": "English README",
|
|
210
|
+
"settings.title": "Settings",
|
|
211
|
+
"settings.pageTitle": "Settings — PatchWarden",
|
|
212
|
+
"settings.appearance": "Appearance and window",
|
|
213
|
+
"settings.localAgents": "Local agents and models",
|
|
214
|
+
"settings.localAgentsHelp": "Only detected supported CLIs are registered. Models come from safe local config fields; online refresh is always manual.",
|
|
215
|
+
"settings.detectAgents": "Detect again",
|
|
216
|
+
"settings.loadingAgents": "Loading local agents…",
|
|
217
|
+
"settings.detectingAgents": "Detecting local agents…",
|
|
218
|
+
"settings.saveAgents": "Save agent settings",
|
|
219
|
+
"settings.savingAgents": "Saving agent settings…",
|
|
220
|
+
"settings.agentAvailable": "CLI available",
|
|
221
|
+
"settings.agentMissing": "CLI not found",
|
|
222
|
+
"settings.followAgentDefault": "Follow agent default",
|
|
223
|
+
"settings.customModel": "Custom model ID",
|
|
224
|
+
"settings.modelIdPlaceholder": "provider/model",
|
|
225
|
+
"settings.refreshModels": "Refresh model list",
|
|
226
|
+
"settings.refreshingModels": "Refreshing {agent} models…",
|
|
227
|
+
"settings.modelsRefreshed": "Found {count} models",
|
|
228
|
+
"settings.theme": "Theme",
|
|
229
|
+
"settings.themeHelp": "Follow Windows or always use the light or dark theme.",
|
|
230
|
+
"settings.themeSystem": "Use system theme",
|
|
231
|
+
"settings.themeLight": "Light",
|
|
232
|
+
"settings.themeDark": "Dark",
|
|
233
|
+
"settings.languageHelp": "Initially follows Windows; a manual choice persists across pages and restarts.",
|
|
234
|
+
"settings.closeWindow": "Close window",
|
|
235
|
+
"settings.closeWindowHelp": "By default the window hides to the system tray while background services remain available.",
|
|
236
|
+
"settings.closeToTray": "Minimize to tray",
|
|
237
|
+
"settings.closeQuit": "Quit desktop app",
|
|
238
|
+
"settings.mcpTunnel": "MCP and Tunnel",
|
|
239
|
+
"settings.tunnelUndetected": "Not detected yet",
|
|
240
|
+
"settings.detect": "Detect",
|
|
241
|
+
"settings.choose": "Choose",
|
|
242
|
+
"settings.directHelp": "Direct editing tools and the Direct Tunnel are available only when this profile is enabled.",
|
|
243
|
+
"settings.enable": "Enable",
|
|
244
|
+
"settings.proxy": "Proxy configuration",
|
|
245
|
+
"settings.proxyHelp": "Use the environment proxy, no proxy, or a credential-free proxy URL.",
|
|
246
|
+
"settings.proxyShared": "Shared by Core / Direct",
|
|
247
|
+
"settings.proxySeparate": "Configure separately",
|
|
248
|
+
"settings.proxyEnvironment": "Use environment proxy",
|
|
249
|
+
"settings.proxyNone": "No proxy",
|
|
250
|
+
"settings.proxyManual": "Manual proxy",
|
|
251
|
+
"settings.saveRuntime": "Save runtime settings",
|
|
252
|
+
"settings.installSummary": "Missing tunnel-client.exe? View installation steps",
|
|
253
|
+
"settings.installStep1": "Download the Windows x64 build from the trusted release page linked by the project documentation.",
|
|
254
|
+
"settings.installStep2": "Verify the SHA256 from the release page, then extract it to a directory writable only by the current user.",
|
|
255
|
+
"settings.installStep3": "Choose the file whose exact name is tunnel-client.exe.",
|
|
256
|
+
"settings.installStep4": "Save and run the health check. This app never downloads or runs new software automatically.",
|
|
257
|
+
"settings.workspaceDiagnostics": "Workspace and diagnostics",
|
|
258
|
+
"settings.currentConfig": "Current configuration",
|
|
259
|
+
"settings.loading": "Loading…",
|
|
260
|
+
"settings.openConfig": "Open configuration file",
|
|
261
|
+
"settings.workspace": "Workspace",
|
|
262
|
+
"settings.workspaceHelp": "Update it through the secure directory picker.",
|
|
263
|
+
"settings.change": "Change",
|
|
264
|
+
"settings.openLogs": "Open logs",
|
|
265
|
+
"settings.runDoctor": "Run health check",
|
|
266
|
+
"settings.notConfigured": "Not configured",
|
|
267
|
+
"settings.tunnelNotConfigured": "Not configured. Detect or choose a file.",
|
|
268
|
+
"settings.autoDetecting": "Automatically detecting tunnel-client.exe…",
|
|
269
|
+
"settings.autoDetectedPath": "{path} ({source}; save to keep using it)",
|
|
270
|
+
"settings.autoDetected": "Found automatically. Save runtime settings to persist it.",
|
|
271
|
+
"settings.tunnelNotFound": "Not found. Choose a file or view the installation steps.",
|
|
272
|
+
"settings.doctorChecking": "Checking…",
|
|
273
|
+
"settings.doctorDone": "Check complete.",
|
|
274
|
+
"settings.doctorFailed": "Health check failed: {error}",
|
|
275
|
+
"settings.detecting": "Detecting…",
|
|
276
|
+
"settings.detectedPath": "{path} ({source})",
|
|
277
|
+
"settings.tunnelFound": "Found tunnel-client.exe",
|
|
278
|
+
"settings.tunnelSelected": "Selected. Save to apply.",
|
|
279
|
+
"settings.saving": "Saving…",
|
|
280
|
+
"settings.savedRestart": "Settings saved. The external Control Center must be restarted manually.",
|
|
281
|
+
"settings.savedReload": "Settings saved. Control Center is reloading.",
|
|
282
|
+
"settings.saveFailed": "Save failed: {error}",
|
|
283
|
+
"settings.tunnelCredentials": "Core Tunnel credentials",
|
|
284
|
+
"settings.tunnelId": "Tunnel ID",
|
|
285
|
+
"settings.runtimeKey": "Tunnel runtime API key",
|
|
286
|
+
"settings.runtimeKeyHelp": "This is the dedicated Tunnel runtime key used as CONTROL_PLANE_API_KEY, not OPENAI_API_KEY. It is sent only over stdin to a one-time provisioning process.",
|
|
287
|
+
"settings.configureCore": "Configure and verify Core",
|
|
288
|
+
"settings.configureDirect": "Configure and verify Direct",
|
|
289
|
+
"settings.forgetCredential": "Forget saved credential",
|
|
290
|
+
"settings.revalidate": "Revalidate",
|
|
291
|
+
"settings.revalidating": "Running Tunnel doctor with the saved credential…",
|
|
292
|
+
"settings.revalidated": "Revalidation passed. The saved credential was not changed.",
|
|
293
|
+
"settings.credentialConfigured": "Configured",
|
|
294
|
+
"settings.credentialMissing": "Not configured",
|
|
295
|
+
"settings.provisioning": "Initializing the profile and running tunnel-client doctor --explain…",
|
|
296
|
+
"settings.provisioned": "Verification passed. The credential is saved with Windows DPAPI.",
|
|
297
|
+
"settings.confirmForget": "Forget the saved Tunnel runtime API key? Core and Direct cannot start until it is configured again.",
|
|
298
|
+
"settings.forgotten": "The saved Tunnel credential was forgotten.",
|
|
299
|
+
"reason.tunnel_client_missing": "tunnel-client.exe is missing. Detect or choose it first.",
|
|
300
|
+
"reason.tunnel_profile_missing": "The Tunnel profile is missing. Enter a Tunnel ID and runtime key in Settings.",
|
|
301
|
+
"reason.tunnel_credential_missing": "A verified Tunnel runtime credential is missing.",
|
|
302
|
+
"reason.authentication_failed": "Authentication failed. Check the dedicated Tunnel runtime key.",
|
|
303
|
+
"reason.auth_failed": "Authentication failed. Check the dedicated Tunnel runtime key.",
|
|
304
|
+
"reason.proxy_unreachable": "The proxy or network is unreachable. Check the HTTP/Mixed proxy.",
|
|
305
|
+
"reason.region_unsupported": "Secure MCP Tunnel is not supported in the current region.",
|
|
306
|
+
"reason.unsupported_region": "Secure MCP Tunnel is not supported in the current region.",
|
|
307
|
+
"reason.doctor_failed": "Tunnel doctor failed. Review the settings and network.",
|
|
308
|
+
"reason.tunnel_not_ready": "The Tunnel is not ready yet.",
|
|
309
|
+
"reason.watcher_unhealthy": "The Watcher is unhealthy. Run diagnostics and review the logs.",
|
|
310
|
+
"reason.chatgpt_reconnect": "Reconnect the app in ChatGPT, or start a new chat and try again."
|
|
311
|
+
,"reason.credential_forget_failed": "The saved credential could not be removed. Close any process using it and retry."
|
|
312
|
+
,"reason.startup_timeout": "The start command ran, but Core did not become ready in time. Check the proxy, Tunnel doctor, and logs."
|
|
313
|
+
,"reason.supervisor_exited": "The Tunnel supervisor exited before Core was ready. Check the proxy, credential, and Tunnel logs."
|
|
314
|
+
,"reason.manager_failed": "The local start manager failed. Run diagnostics and review the Control Center logs."
|
|
315
|
+
,"reason.start_failed": "Core failed to start. Run diagnostics and review the specific cause."
|
|
316
|
+
,"reason.revalidation_failed": "Revalidation with the saved credential failed. Check the proxy and Tunnel status."
|
|
317
|
+
,"reason.tool_manifest_check_failed": "Core tool catalog validation failed. Run diagnostics and review the supervisor log."
|
|
318
|
+
,"reason.tool_manifest_invalid": "Core tool catalog validation returned an invalid result. Rebuild and retry."
|
|
319
|
+
,"reason.supervisor_permission_denied": "Windows blocked the Core child process. Run PatchWarden from a normal desktop session."
|
|
320
|
+
,"reason.supervisor_launch_failed": "The Tunnel supervisor could not start. Check local PowerShell permissions."
|
|
321
|
+
,"reason.config_error": "The Tunnel profile, configuration, or launcher is invalid. Revalidate it in Settings."
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
var sourceKeys = {
|
|
325
|
+
"控制台": "nav.dashboard", "Dashboard": "nav.dashboard", "任务面板": "nav.tasks", "Tasks": "nav.tasks",
|
|
326
|
+
"工作区": "nav.workspace", "Workspace": "nav.workspace", "审计日志": "nav.audit", "Audit Log": "nav.audit",
|
|
327
|
+
"Direct 会话": "nav.direct", "Direct Sessions": "nav.direct", "日志": "nav.logs", "Logs": "nav.logs",
|
|
328
|
+
"设置": "nav.settings", "Settings": "nav.settings", "开始使用": "nav.gettingStarted", "Getting Started": "nav.gettingStarted"
|
|
329
|
+
};
|
|
330
|
+
var literalEnglish = {
|
|
331
|
+
"全部启动": "Start all", "全部停止": "Stop all", "全部重启": "Restart all", "刷新": "Refresh",
|
|
332
|
+
"工作区根目录": "Workspace root", "Core 隧道": "Core Tunnel", "Direct 隧道": "Direct Tunnel", "日志目录": "Logs folder",
|
|
333
|
+
"健康评分": "Health score", "任务监视器": "Task monitor", "隧道就绪": "Tunnel readiness", "本地 Agent": "Local Agents",
|
|
334
|
+
"过期任务": "Stale tasks", "失败任务": "Failed tasks", "安全策略": "Security policy", "发布检查": "Release check",
|
|
335
|
+
"Direct 配置": "Direct configuration", "启动准备": "Startup readiness", "健康建议": "Health suggestions",
|
|
336
|
+
"任务链路": "Task lineages", "项目策略": "Project policy", "证据包": "Evidence packs", "最近任务": "Recent tasks",
|
|
337
|
+
"系统状态": "System status", "活动日志": "Activity log", "活动时间线": "Activity timeline",
|
|
338
|
+
"Core + Direct 输出摘要": "Core + Direct output summary", "复制诊断": "Copy diagnostics", "查看详情": "View details",
|
|
339
|
+
"查看": "View", "隐藏": "Hide", "执行": "Run", "处理": "Resolve", "正常": "Ready", "有效": "Valid", "已启用": "Enabled",
|
|
340
|
+
"暂无任务": "No tasks", "暂无任务链路": "No task lineages", "创建受控任务链": "Create controlled task lineage", "查看最近运行": "View recent runs",
|
|
341
|
+
"选择具体 repo 以读取 version": "Select a repository to read its version",
|
|
342
|
+
"已可供桌面启动和重启使用。": "Available for desktop start and restart.",
|
|
343
|
+
"PatchWarden 任务仅在此工作区内运行。": "PatchWarden tasks run only inside this workspace.",
|
|
344
|
+
"Core 未运行,建议启动 Core profile": "Core is stopped. Start the Core profile.",
|
|
345
|
+
"Direct 未运行,建议启动 Direct profile": "Direct is stopped. Start the Direct profile if needed.",
|
|
346
|
+
"Tunnel 未就绪,建议重启 profile 或检查代理": "Tunnel is not ready. Restart the profile or check the proxy.",
|
|
347
|
+
"任务心跳已过期,watcher 可能未运行或任务已僵死,建议 reconcile 或 kill。": "The task heartbeat is stale. The Watcher may be stopped or the task may be stuck; reconcile or kill it.",
|
|
348
|
+
"查看 Core / Direct 本次日志尾部": "Show Core / Direct log tails", "重建任务": "Rebuild task", "正在加载…": "Loading…",
|
|
349
|
+
"仓库": "Repository", "全部仓库": "All repositories", "状态": "Status", "全部状态": "All statuses", "验收": "Acceptance", "全部验收": "All acceptance states",
|
|
350
|
+
"警告类型": "Warning type", "全部警告": "All warnings", "全部 Agent": "All Agents", "更新从": "Updated from", "更新至": "Updated to",
|
|
351
|
+
"应用筛选": "Apply filters", "清空筛选": "Clear filters", "无筛选": "No filters", "加载中...": "Loading...", "加载失败": "Load failed", "重试": "Retry",
|
|
352
|
+
"任务ID": "Task ID", "标题": "Title", "验证": "Verification", "阶段": "Phase", "创建时间": "Created", "更新时间": "Updated", "下一步": "Next step", "操作": "Actions",
|
|
353
|
+
"排队中": "Queued", "已完成": "Completed", "收集产物": "Collecting artifacts",
|
|
354
|
+
"工作区路径": "Workspace path", "项目列表": "Projects", "暂无项目": "No projects", "检查": "Check", "配置预览": "Configuration preview",
|
|
355
|
+
"Agent 注册": "Agent registration", "未注册任何 Agent": "No Agents registered", "可用": "Available", "安全边界": "Security boundaries",
|
|
356
|
+
"工作区隔离": "Workspace confinement", "workspaceRoot 路径限制": "workspaceRoot path restrictions", "命令白名单": "Command allow-list",
|
|
357
|
+
"精确匹配 allowedTestCommands": "Exact allowedTestCommands matching", "敏感文件": "Sensitive files", ".env / credentials 已屏蔽": ".env / credentials are blocked",
|
|
358
|
+
"Repo Clean 状态": "Repository clean status", "按需 git status(点击检查)": "On-demand git status (click Check)",
|
|
359
|
+
"总审计": "Total audits", "通过": "Passed", "失败": "Failed", "警告聚合": "Warning summary", "加载警告中...": "Loading warnings...",
|
|
360
|
+
"警告加载失败": "Warning load failed", "暂无警告": "No warnings", "暂无审计记录": "No audit records", "裁定": "Verdict", "范围变更": "Scope changes", "审计时间": "Audit time", "审计证据": "Audit evidence",
|
|
361
|
+
"暂无 Direct 会话": "No Direct sessions", "已过期": "Expired", "点击展开 / 折叠": "Click to expand / collapse", "自动刷新": "Auto refresh",
|
|
362
|
+
"任务详情": "Task details", "复制 ID": "Copy ID", "打开目录": "Open folder", "运行审计": "Run audit", "返回任务列表": "Back to tasks",
|
|
363
|
+
"任务不存在": "Task not found", "任务疑似僵死": "Task may be stuck", "测试命令": "Test command", "超时(秒)": "Timeout (seconds)", "安全摘要": "Safe summary",
|
|
364
|
+
"默认仅展示脱敏后的安全摘要。完整结果、diff、测试日志请见下方「高级」区域。": "Only redacted safe summaries are shown by default. Full results, diffs, and test logs are available under Advanced.",
|
|
365
|
+
"结果概览 (safe_result)": "Result overview (safe_result)", "测试摘要 (safe_test_summary)": "Test summary (safe_test_summary)", "变更摘要 (safe_diff_summary)": "Diff summary (safe_diff_summary)", "审计结论 (safe_audit)": "Audit result (safe_audit)",
|
|
366
|
+
"高级": "Advanced", "以下内容仅在点击时按需加载,可能包含完整 stdout/stderr/diff 等较大输出。": "The following content loads only when requested and may include large stdout, stderr, or diff output.",
|
|
367
|
+
"加载完整结果 (get_result)": "Load full result (get_result)", "加载完整测试日志 (get_test_log)": "Load full test log (get_test_log)", "加载完整 diff (get_diff)": "Load full diff (get_diff)", "运行 audit_task 完整审计": "Run full audit_task audit"
|
|
368
|
+
};
|
|
369
|
+
var literalChinese = Object.fromEntries(Object.entries(literalEnglish).map(function (entry) { return [entry[1], entry[0]]; }));
|
|
370
|
+
Object.assign(literalChinese, {
|
|
371
|
+
blocked: "已阻止", missing: "缺失", unavailable: "不可用", unknown: "未知", healthy: "健康", stale: "已过期",
|
|
372
|
+
"Watcher heartbeat has not been observed. Start or restart the PatchWarden watcher.": "尚未检测到 Watcher 心跳。请启动或重启 PatchWarden Watcher。"
|
|
373
|
+
});
|
|
374
|
+
var selected = "system";
|
|
375
|
+
var language = /^zh(?:-|$)/i.test(navigator.language || "") ? "zh-CN" : "en";
|
|
376
|
+
|
|
377
|
+
function resolve(value, fallback) {
|
|
378
|
+
if (value === "zh-CN" || value === "en") return value;
|
|
379
|
+
return fallback || (/^zh(?:-|$)/i.test(navigator.language || "") ? "zh-CN" : "en");
|
|
380
|
+
}
|
|
381
|
+
function t(key, params) {
|
|
382
|
+
var value = dictionaries[language][key] || dictionaries.en[key] || key;
|
|
383
|
+
Object.keys(params || {}).forEach(function (name) { value = value.replace(new RegExp("\\{" + name + "\\}", "g"), String(params[name])); });
|
|
384
|
+
return value;
|
|
385
|
+
}
|
|
386
|
+
function translateLiteral(text) {
|
|
387
|
+
if (language === "en") {
|
|
388
|
+
if (literalEnglish[text]) return literalEnglish[text];
|
|
389
|
+
var match = text.match(/^(\d+) 个可用$/); if (match) return match[1] + " available";
|
|
390
|
+
match = text.match(/^(\d+) 项需要处理$/); if (match) return match[1] + " item(s) need attention";
|
|
391
|
+
match = text.match(/^共 (\d+) 条 · 显示 (\d+)$/); if (match) return match[1] + " total · showing " + match[2];
|
|
392
|
+
match = text.match(/^共 (\d+) 条$/); if (match) return match[1] + " total";
|
|
393
|
+
match = text.match(/^存在 (\d+) 个 stale 任务,建议查看并 reconcile$/); if (match) return match[1] + " stale task(s); review and reconcile";
|
|
394
|
+
match = text.match(/^Core (未就绪|就绪) \/ Direct (未就绪|就绪)$/); if (match) return "Core " + (match[1] === "就绪" ? "ready" : "not ready") + " / Direct " + (match[2] === "就绪" ? "ready" : "not ready");
|
|
395
|
+
match = text.match(/^更新于 (.+)$/); if (match) return "Updated " + match[1];
|
|
396
|
+
match = text.match(/^(\d+) 个目录$/); if (match) return match[1] + " folders";
|
|
397
|
+
match = text.match(/^(\d+) 个 Agent$/); if (match) return match[1] + " Agents";
|
|
398
|
+
} else {
|
|
399
|
+
if (literalChinese[text]) return literalChinese[text];
|
|
400
|
+
var zhMatch = text.match(/^(\d+) available$/); if (zhMatch) return zhMatch[1] + " 个可用";
|
|
401
|
+
zhMatch = text.match(/^(\d+) item\(s\) need attention$/); if (zhMatch) return zhMatch[1] + " 项需要处理";
|
|
402
|
+
zhMatch = text.match(/^(\d+) total · showing (\d+)$/); if (zhMatch) return "共 " + zhMatch[1] + " 条 · 显示 " + zhMatch[2];
|
|
403
|
+
zhMatch = text.match(/^(\d+) total$/); if (zhMatch) return "共 " + zhMatch[1] + " 条";
|
|
404
|
+
zhMatch = text.match(/^Updated (.+)$/); if (zhMatch) return "更新于 " + zhMatch[1];
|
|
405
|
+
zhMatch = text.match(/^(\d+) folders$/); if (zhMatch) return zhMatch[1] + " 个目录";
|
|
406
|
+
zhMatch = text.match(/^(\d+) Agents$/); if (zhMatch) return zhMatch[1] + " 个 Agent";
|
|
407
|
+
}
|
|
408
|
+
return text;
|
|
409
|
+
}
|
|
410
|
+
function applyTranslations(root) {
|
|
411
|
+
var scope = root && root.querySelectorAll ? root : document;
|
|
412
|
+
var keyed = Array.from(scope.querySelectorAll("[data-i18n]")); if (scope.matches && scope.matches("[data-i18n]")) keyed.unshift(scope);
|
|
413
|
+
keyed.forEach(function (node) { var value = t(node.dataset.i18n); if (node.textContent !== value) node.textContent = value; });
|
|
414
|
+
scope.querySelectorAll("[data-i18n-title]").forEach(function (node) { var value = t(node.dataset.i18nTitle); if (node.title !== value) node.title = value; });
|
|
415
|
+
scope.querySelectorAll("[data-i18n-placeholder]").forEach(function (node) { var value = t(node.dataset.i18nPlaceholder); if (node.placeholder !== value) node.placeholder = value; });
|
|
416
|
+
var walker = document.createTreeWalker(scope === document ? document.body : scope, NodeFilter.SHOW_TEXT);
|
|
417
|
+
var node;
|
|
418
|
+
while ((node = walker.nextNode())) {
|
|
419
|
+
var text = node.nodeValue.trim(); var key = sourceKeys[text]; var translated = key ? t(key) : translateLiteral(text);
|
|
420
|
+
if (translated !== text) node.nodeValue = node.nodeValue.replace(text, translated);
|
|
421
|
+
}
|
|
422
|
+
document.documentElement.lang = language;
|
|
423
|
+
}
|
|
424
|
+
async function setLanguage(value) {
|
|
425
|
+
selected = value === "zh-CN" || value === "en" ? value : "system";
|
|
426
|
+
localStorage.setItem(STORAGE_KEY, selected);
|
|
427
|
+
if (window.patchwardenDesktop) {
|
|
428
|
+
var prefs = await window.patchwardenDesktop.setPreferences({ language: selected });
|
|
429
|
+
var state = await window.patchwardenDesktop.getState();
|
|
430
|
+
language = resolve(prefs.language, state.resolvedLanguage);
|
|
431
|
+
} else {
|
|
432
|
+
localStorage.setItem(STORAGE_KEY, selected);
|
|
433
|
+
language = resolve(selected);
|
|
434
|
+
}
|
|
435
|
+
applyTranslations(document);
|
|
436
|
+
window.dispatchEvent(new CustomEvent("patchwarden:languagechange", { detail: { language: language, selected: selected } }));
|
|
437
|
+
return language;
|
|
438
|
+
}
|
|
439
|
+
async function initialize() {
|
|
440
|
+
if (window.patchwardenDesktop) {
|
|
441
|
+
selected = localStorage.getItem(STORAGE_KEY) || "system";
|
|
442
|
+
language = resolve(selected);
|
|
443
|
+
addLanguageSwitcher();
|
|
444
|
+
applyTranslations(document);
|
|
445
|
+
var state = await window.patchwardenDesktop.getState();
|
|
446
|
+
selected = state.preferences.language || "system";
|
|
447
|
+
language = resolve(selected, state.resolvedLanguage);
|
|
448
|
+
localStorage.setItem(STORAGE_KEY, selected);
|
|
449
|
+
} else {
|
|
450
|
+
selected = localStorage.getItem(STORAGE_KEY) || "system";
|
|
451
|
+
language = resolve(selected);
|
|
452
|
+
}
|
|
453
|
+
addLanguageSwitcher();
|
|
454
|
+
applyTranslations(document);
|
|
455
|
+
var observer = new MutationObserver(function (mutations) {
|
|
456
|
+
mutations.forEach(function (mutation) {
|
|
457
|
+
mutation.addedNodes.forEach(function (node) {
|
|
458
|
+
if (node.nodeType === Node.ELEMENT_NODE) applyTranslations(node);
|
|
459
|
+
else if (node.nodeType === Node.TEXT_NODE) {
|
|
460
|
+
var source = node.nodeValue.trim(); var key = sourceKeys[source]; var translated = key ? t(key) : translateLiteral(source);
|
|
461
|
+
if (translated !== source) node.nodeValue = node.nodeValue.replace(source, translated);
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
observer.observe(document.body, { childList: true, subtree: true });
|
|
467
|
+
window.dispatchEvent(new CustomEvent("patchwarden:i18nready", { detail: { language: language, selected: selected } }));
|
|
468
|
+
}
|
|
469
|
+
function addLanguageSwitcher() {
|
|
470
|
+
if (document.getElementById("language") || document.getElementById("pw-language-switcher")) return;
|
|
471
|
+
var header = document.querySelector("header"); if (!header) return;
|
|
472
|
+
var select = document.createElement("select"); select.id = "pw-language-switcher"; select.className = "pw-language-switcher"; select.setAttribute("aria-label", "Language");
|
|
473
|
+
[["system", "language.system"], ["zh-CN", "language.zh"], ["en", "language.en"]].forEach(function (entry) { var option = document.createElement("option"); option.value = entry[0]; option.dataset.i18n = entry[1]; option.textContent = t(entry[1]); select.appendChild(option); });
|
|
474
|
+
select.value = selected;
|
|
475
|
+
select.addEventListener("change", function () { void setLanguage(select.value); });
|
|
476
|
+
var target = document.querySelector("aside") || header;
|
|
477
|
+
target.appendChild(select);
|
|
478
|
+
}
|
|
479
|
+
window.PatchWardenI18n = Object.freeze({ t: t, applyTranslations: applyTranslations, setLanguage: setLanguage, getLanguage: function () { return language; }, getSelectedLanguage: function () { return selected; }, dictionaries: dictionaries });
|
|
480
|
+
window.t = t;
|
|
481
|
+
window.applyTranslations = applyTranslations;
|
|
482
|
+
if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", function () { void initialize(); });
|
|
483
|
+
else void initialize();
|
|
484
|
+
})();
|
package/ui/log-parser.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
(function (root) {
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
function parseLine(rawLine, stream) {
|
|
5
|
+
var line = String(rawLine || "");
|
|
6
|
+
var source = String(stream || "log");
|
|
7
|
+
var entry = null;
|
|
8
|
+
try {
|
|
9
|
+
var parsed = JSON.parse(line);
|
|
10
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) entry = parsed;
|
|
11
|
+
} catch (_) {}
|
|
12
|
+
|
|
13
|
+
var level = entry ? String(entry.level || entry.severity || "").toLowerCase() : "";
|
|
14
|
+
if (level === "warning") level = "warn";
|
|
15
|
+
var time = entry ? String(entry.time || entry.timestamp || "") : "";
|
|
16
|
+
var component = entry ? String(entry.component || entry.scope || entry.source || source) : source;
|
|
17
|
+
var summary = entry ? String(entry.summary || entry.msg || entry.message || line) : line;
|
|
18
|
+
return {
|
|
19
|
+
raw: line,
|
|
20
|
+
time: time,
|
|
21
|
+
level: level,
|
|
22
|
+
component: component,
|
|
23
|
+
summary: summary,
|
|
24
|
+
detail: entry ? JSON.stringify(entry, null, 2) : line,
|
|
25
|
+
structured: entry !== null,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
root.PatchWardenLogParser = { parseLine: parseLine };
|
|
30
|
+
})(typeof window !== "undefined" ? window : globalThis);
|
package/ui/pages/audit.html
CHANGED
|
@@ -143,6 +143,8 @@ html.dark {
|
|
|
143
143
|
background-color: var(--pw-bg-active) !important;
|
|
144
144
|
}
|
|
145
145
|
</style>
|
|
146
|
+
<script src="/desktop-bootstrap.js"></script>
|
|
147
|
+
<link rel="stylesheet" href="/desktop.css">
|
|
146
148
|
</head>
|
|
147
149
|
|
|
148
150
|
<body class="flex h-screen overflow-hidden">
|
|
@@ -161,6 +163,10 @@ html.dark {
|
|
|
161
163
|
|
|
162
164
|
<!-- Navigation -->
|
|
163
165
|
<nav class="flex-1 flex flex-col gap-1 px-3 pt-4 overflow-y-auto">
|
|
166
|
+
<a href="/pages/getting-started.html" data-nav-key="getting-started" class="desktop-only-nav flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition-colors truncate" style="color: var(--pw-text-secondary); font-family: var(--pw-font-sans);">
|
|
167
|
+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="shrink-0"><path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z"/><path d="m12 15-3-3a22 22 0 0 1 2-3.95A12.87 12.87 0 0 1 22 2c0 2.72-.78 7.5-6.05 11a22.35 22.35 0 0 1-3.95 2z"/></svg>
|
|
168
|
+
<span class="truncate" data-i18n="nav.gettingStarted">开始使用</span>
|
|
169
|
+
</a>
|
|
164
170
|
|
|
165
171
|
<a href="/pages/dashboard.html" data-nav-key="dashboard" data-dom-id="nav-dashboard" class="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition-colors truncate" style="color: var(--pw-text-secondary); font-family: var(--pw-font-sans);">
|
|
166
172
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="shrink-0">
|
|
@@ -216,6 +222,10 @@ html.dark {
|
|
|
216
222
|
<span class="truncate" data-zh="日志" data-en="Logs">日志</span>
|
|
217
223
|
</a>
|
|
218
224
|
|
|
225
|
+
<a href="/pages/settings.html" data-nav-key="settings" class="desktop-only-nav flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition-colors truncate" style="color: var(--pw-text-secondary); font-family: var(--pw-font-sans);">
|
|
226
|
+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="shrink-0"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.9l.1.1-2.8 2.8-.1-.1a1.7 1.7 0 0 0-1.9-.3 1.7 1.7 0 0 0-1 1.6v.2h-4V21a1.7 1.7 0 0 0-1-1.6 1.7 1.7 0 0 0-1.9.3l-.1.1L4.2 17l.1-.1a1.7 1.7 0 0 0 .3-1.9A1.7 1.7 0 0 0 3 14H2.8v-4H3a1.7 1.7 0 0 0 1.6-1 1.7 1.7 0 0 0-.3-1.9L4.2 7 7 4.2l.1.1A1.7 1.7 0 0 0 9 4.6 1.7 1.7 0 0 0 10 3V2.8h4V3a1.7 1.7 0 0 0 1 1.6 1.7 1.7 0 0 0 1.9-.3l.1-.1L19.8 7l-.1.1a1.7 1.7 0 0 0-.3 1.9A1.7 1.7 0 0 0 21 10h.2v4H21a1.7 1.7 0 0 0-1.6 1z"/></svg>
|
|
227
|
+
<span class="truncate" data-i18n="nav.settings">设置</span>
|
|
228
|
+
</a>
|
|
219
229
|
</nav>
|
|
220
230
|
|
|
221
231
|
<!-- Bottom Section -->
|
|
@@ -928,5 +938,7 @@ html.dark {
|
|
|
928
938
|
|
|
929
939
|
<!-- Lucide init -->
|
|
930
940
|
<script>lucide.createIcons();</script>
|
|
941
|
+
<script src="/i18n.js"></script>
|
|
942
|
+
<script src="/desktop-bridge.js"></script>
|
|
931
943
|
</body>
|
|
932
944
|
</html>
|