patchwarden 1.5.0 → 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 +194 -26
- package/README.md +160 -22
- package/dist/assessments/agentAssessor.d.ts +1 -1
- package/dist/assessments/agentAssessor.js +24 -15
- package/dist/assessments/assessmentStore.d.ts +1 -1
- package/dist/assessments/assessmentStore.js +44 -36
- package/dist/assessments/confirmCli.js +5 -4
- package/dist/config.d.ts +22 -0
- package/dist/config.js +98 -11
- package/dist/control/fileManager.d.ts +2 -0
- package/dist/control/fileManager.js +39 -0
- package/dist/control/middleware/auth.d.ts +16 -0
- package/dist/control/middleware/auth.js +17 -0
- package/dist/control/middleware/static.d.ts +3 -0
- package/dist/control/middleware/static.js +78 -0
- package/dist/control/routeTable.d.ts +24 -0
- package/dist/control/routeTable.js +263 -0
- package/dist/control/routes/audit.d.ts +15 -0
- package/dist/control/routes/audit.js +287 -0
- package/dist/control/routes/evidence.d.ts +4 -0
- package/dist/control/routes/evidence.js +96 -0
- package/dist/control/routes/lineage.d.ts +3 -0
- package/dist/control/routes/lineage.js +71 -0
- package/dist/control/routes/policy.d.ts +3 -0
- package/dist/control/routes/policy.js +81 -0
- package/dist/control/routes/process.d.ts +12 -0
- package/dist/control/routes/process.js +487 -0
- package/dist/control/routes/sessions.d.ts +30 -0
- package/dist/control/routes/sessions.js +287 -0
- package/dist/control/routes/status.d.ts +51 -0
- package/dist/control/routes/status.js +307 -0
- package/dist/control/routes/taskActions.d.ts +21 -0
- package/dist/control/routes/taskActions.js +197 -0
- package/dist/control/routes/tasks.d.ts +24 -0
- package/dist/control/routes/tasks.js +309 -0
- package/dist/control/routes/workspace.d.ts +15 -0
- package/dist/control/routes/workspace.js +220 -0
- package/dist/control/runtime.d.ts +92 -0
- package/dist/control/runtime.js +425 -0
- package/dist/control/server.d.ts +13 -0
- package/dist/control/server.js +150 -0
- package/dist/control/shared.d.ts +59 -0
- package/dist/control/shared.js +341 -0
- package/dist/controlCenter.d.ts +6 -0
- package/dist/controlCenter.js +7 -2197
- package/dist/direct/directAudit.js +234 -225
- package/dist/direct/directGuards.d.ts +2 -1
- package/dist/direct/directGuards.js +72 -37
- 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.d.ts +18 -1
- package/dist/doctor.js +614 -373
- package/dist/goal/acceptanceEngine.d.ts +1 -1
- package/dist/goal/goalProgress.js +75 -69
- package/dist/goal/goalReport.d.ts +54 -0
- package/dist/goal/goalReport.js +197 -0
- package/dist/goal/goalStatus.d.ts +8 -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.d.ts +63 -0
- package/dist/goal/specKitImport.js +221 -0
- package/dist/goal/subgoalSync.js +13 -10
- package/dist/goal/worktreeManager.d.ts +2 -0
- package/dist/goal/worktreeManager.js +209 -136
- package/dist/httpServer.js +126 -44
- package/dist/index.js +7 -4
- package/dist/logging.d.ts +7 -1
- package/dist/logging.js +13 -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 +14 -6
- package/dist/runner/changeCapture.js +287 -81
- package/dist/runner/cli.js +7 -6
- package/dist/runner/postTaskCleanup.js +60 -7
- 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 +339 -287
- package/dist/runner/simpleProcess.d.ts +3 -0
- package/dist/runner/simpleProcess.js +52 -38
- 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 +265 -54
- package/dist/security/contentRedaction.d.ts +6 -0
- package/dist/security/contentRedaction.js +24 -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 +280 -273
- 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} +28 -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} +8 -63
- package/dist/tools/{auditTask.js → diagnostics/auditTask.js} +111 -37
- package/dist/tools/{healthCheck.d.ts → diagnostics/healthCheck.d.ts} +6 -6
- package/dist/tools/{healthCheck.js → diagnostics/healthCheck.js} +10 -10
- 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} +14 -10
- package/dist/tools/{safeViews.js → diagnostics/safeViews.js} +25 -15
- 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.d.ts → direct/createDirectSession.d.ts} +1 -1
- package/dist/tools/{createDirectSession.js → direct/createDirectSession.js} +8 -8
- package/dist/tools/{finalizeDirectSession.d.ts → direct/finalizeDirectSession.d.ts} +2 -2
- 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.d.ts +9 -0
- package/dist/tools/dispatch/coreDispatch.js +283 -0
- package/dist/tools/dispatch/diagnosticDispatch.d.ts +12 -0
- package/dist/tools/dispatch/diagnosticDispatch.js +80 -0
- package/dist/tools/dispatch/directDispatch.d.ts +8 -0
- package/dist/tools/dispatch/directDispatch.js +116 -0
- package/dist/tools/dispatch/goalDispatch.d.ts +8 -0
- package/dist/tools/dispatch/goalDispatch.js +92 -0
- package/dist/tools/dispatch/releaseDispatch.d.ts +8 -0
- package/dist/tools/dispatch/releaseDispatch.js +46 -0
- package/dist/tools/dispatch/types.d.ts +23 -0
- package/dist/tools/dispatch/types.js +15 -0
- 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} +2 -2
- 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 +10 -14
- package/dist/tools/registry.js +47 -1651
- 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} +12 -4
- package/dist/tools/{createTask.js → tasks/createTask.js} +46 -31
- 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.d.ts → tasks/evidencePack.d.ts} +6 -0
- package/dist/tools/tasks/evidencePack.js +387 -0
- 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/{retryTask.d.ts → tasks/retryTask.d.ts} +2 -2
- 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} +59 -31
- 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 +1648 -0
- package/docs/agentseal-integration.md +150 -0
- package/docs/architecture.md +23 -0
- package/docs/assets/patchwarden-desktop-onboarding.png +0 -0
- package/docs/assets/patchwarden-oss-demo.gif +0 -0
- package/docs/control-center/README.md +4 -4
- package/docs/dashboard-overview.md +86 -0
- package/docs/demo.md +8 -0
- package/docs/desktop-app.md +175 -0
- package/docs/direct-session-workflow.md +98 -0
- package/docs/evidence-pack-schema.md +215 -0
- package/docs/lineage-evidence-pack-workflow.md +127 -0
- package/docs/mcp-inspector-testing.md +200 -0
- package/docs/open-source-application.md +168 -0
- package/docs/opencode-worker.md +151 -0
- package/docs/openhands-worker.md +181 -0
- package/docs/release-checklist.md +1 -1
- package/docs/release-evidence.md +82 -0
- package/docs/spec-kit-integration.md +131 -0
- package/docs/task-safe-review-workflow.md +98 -0
- package/docs/threat-model.md +97 -0
- package/docs/user-feedback.md +40 -0
- package/docs/why-patchwarden.md +110 -0
- package/examples/config.example.json +4 -2
- package/package.json +28 -11
- 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 +447 -6
- package/scripts/checks/control-smoke.js +19 -8
- package/scripts/checks/http-mcp-smoke.js +82 -4
- package/scripts/checks/lifecycle-smoke.js +39 -33
- package/scripts/checks/mcp-manifest-check.js +1 -1
- package/scripts/checks/mcp-smoke.js +30 -4
- 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/scripts/generate-demo-gif.py +320 -0
- 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 +29 -15
- package/src/assessments/assessmentStore.ts +55 -43
- package/src/assessments/confirmCli.ts +5 -4
- package/src/config.ts +105 -11
- package/src/control/fileManager.ts +40 -0
- package/src/control/middleware/auth.ts +35 -0
- package/src/control/middleware/static.ts +84 -0
- package/src/control/routeTable.ts +301 -0
- package/src/control/routes/audit.ts +329 -0
- package/src/control/routes/evidence.ts +107 -0
- package/src/control/routes/lineage.ts +92 -0
- package/src/control/routes/policy.ts +81 -0
- package/src/control/routes/process.ts +505 -0
- package/src/control/routes/sessions.ts +314 -0
- package/src/control/routes/status.ts +405 -0
- package/src/control/routes/taskActions.ts +214 -0
- package/src/control/routes/tasks.ts +331 -0
- package/src/control/routes/workspace.ts +234 -0
- package/src/control/runtime.ts +508 -0
- package/src/control/server.ts +165 -0
- package/src/control/shared.ts +360 -0
- package/src/controlCenter.ts +7 -2347
- package/src/direct/directAudit.ts +17 -9
- package/src/direct/directGuards.ts +100 -51
- 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 +766 -492
- package/src/goal/acceptanceEngine.ts +1 -1
- package/src/goal/goalProgress.ts +17 -13
- package/src/goal/goalReport.ts +263 -0
- package/src/goal/goalStatus.ts +25 -3
- package/src/goal/goalStore.ts +241 -54
- package/src/goal/handoffExport.ts +6 -6
- package/src/goal/specKitImport.ts +355 -0
- package/src/goal/subgoalSync.ts +15 -10
- package/src/goal/worktreeManager.ts +139 -22
- package/src/httpServer.ts +130 -44
- package/src/index.ts +7 -4
- package/src/logging.ts +20 -4
- 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 +342 -80
- package/src/runner/cli.ts +7 -6
- package/src/runner/postTaskCleanup.ts +55 -7
- package/src/runner/processSecurity.ts +433 -0
- package/src/runner/runTask.ts +441 -292
- package/src/runner/simpleProcess.ts +68 -33
- 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 +290 -57
- package/src/security/contentRedaction.ts +31 -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 +276 -273
- 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} +29 -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} +196 -89
- package/src/tools/{healthCheck.ts → diagnostics/healthCheck.ts} +11 -11
- 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} +29 -19
- package/src/tools/{schemaDriftCheck.ts → diagnostics/schemaDriftCheck.ts} +3 -3
- package/src/tools/{createDirectSession.ts → direct/createDirectSession.ts} +9 -9
- package/src/tools/{finalizeDirectSession.ts → direct/finalizeDirectSession.ts} +11 -9
- 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 +379 -0
- package/src/tools/dispatch/diagnosticDispatch.ts +106 -0
- package/src/tools/dispatch/directDispatch.ts +168 -0
- package/src/tools/dispatch/goalDispatch.ts +128 -0
- package/src/tools/dispatch/releaseDispatch.ts +66 -0
- package/src/tools/dispatch/types.ts +24 -0
- 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} +43 -28
- package/src/tools/goals/index.ts +3 -0
- package/src/tools/{savePlan.ts → goals/savePlan.ts} +38 -8
- package/src/tools/registry.ts +54 -1858
- 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} +56 -33
- package/src/tools/{diagnoseTask.ts → tasks/diagnoseTask.ts} +8 -8
- package/src/tools/tasks/evidencePack.ts +504 -0
- 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} +70 -35
- 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 +204 -3
- package/ui/pages/dashboard.html +937 -79
- package/ui/pages/direct-sessions.html +609 -60
- 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 +468 -438
- package/ui/pages/tasks.html +648 -65
- 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/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/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 -213
- 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 -130
- 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-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 -190
- 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 -109
- 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/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/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/evidencePack.js +0 -168
- 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/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/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/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/diagnose-task.test.ts +0 -544
- package/src/test/unit/direct-guards.test.ts +0 -297
- package/src/test/unit/discovery-token-store.test.ts +0 -181
- package/src/test/unit/evidence-pack.test.ts +0 -142
- 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-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 -243
- 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 -150
- 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/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/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/evidencePack.ts +0 -205
- 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/{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/{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/{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
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# AgentSeal 集成模式
|
|
2
|
+
|
|
3
|
+
> 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。
|
|
4
|
+
> 说明:本文描述的是 PatchWarden 与 AgentSeal 的集成模式建议,**不是** AgentSeal 的官方功能。
|
|
5
|
+
> AgentSeal 是独立的 agent 安全检测项目,本文不声称任何官方集成关系。
|
|
6
|
+
|
|
7
|
+
## AgentSeal 是什么
|
|
8
|
+
|
|
9
|
+
AgentSeal 是面向 AI 编程 Agent 的安全检测工具,主要职能包括:
|
|
10
|
+
|
|
11
|
+
- 识别项目级安全策略(哪些文件可改、哪些命令可执行、哪些路径禁止访问)。
|
|
12
|
+
- 对 Agent 的执行行为进行策略比对与违规告警。
|
|
13
|
+
- 为 Agent 工作流提供可配置的策略层。
|
|
14
|
+
|
|
15
|
+
AgentSeal 侧重于“策略声明与检测”,本身不强制执行;
|
|
16
|
+
PatchWarden 侧重于“强制执行与证据收集”。两者互补。
|
|
17
|
+
|
|
18
|
+
## 集成定位
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
AgentSeal: 声明策略 → 检测违规 → 告警
|
|
22
|
+
↓ 策略对齐
|
|
23
|
+
PatchWarden: 接收任务 → 强制执行 → 证据收集
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
- AgentSeal 负责**策略侧**:识别并校验项目安全策略。
|
|
27
|
+
- PatchWarden 负责**执行侧**:在执行任务时强制遵守策略,并产出可审计证据。
|
|
28
|
+
|
|
29
|
+
## 配置文件关系
|
|
30
|
+
|
|
31
|
+
PatchWarden 与 AgentSeal 共享两个关键配置文件,但职责不同:
|
|
32
|
+
|
|
33
|
+
| 文件 | AgentSeal 角色 | PatchWarden 角色 |
|
|
34
|
+
| --- | --- | --- |
|
|
35
|
+
| `.patchwarden/config.json` | 读取并识别 PatchWarden 运行配置 | 运行时核心配置入口 |
|
|
36
|
+
| `project-policy.json` | 校验项目策略合规性 | 执行时强制遵守的 allowed paths / commands |
|
|
37
|
+
|
|
38
|
+
### `.patchwarden/config.json`
|
|
39
|
+
|
|
40
|
+
PatchWarden 的运行配置,典型字段包括:
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"workspaceRoot": "D:\\repos\\my-project",
|
|
45
|
+
"agents": ["opencode", "codex"],
|
|
46
|
+
"evidencePackVersion": 2,
|
|
47
|
+
"safeResult": { "maxBytes": 4096 }
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
AgentSeal 可读取此文件以了解 PatchWarden 的 workspace 边界与 agent 注册情况,
|
|
52
|
+
用于检测配置是否与项目策略一致。
|
|
53
|
+
|
|
54
|
+
### `project-policy.json`
|
|
55
|
+
|
|
56
|
+
项目级安全策略,声明允许的路径与命令:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"allowedPaths": ["src/**", "test/**"],
|
|
61
|
+
"allowedCommands": ["npm.cmd test", "npm.cmd run build", "git status"],
|
|
62
|
+
"blockedFiles": [".env", ".env.*", "id_rsa", "cookies.db"],
|
|
63
|
+
"scopeRules": { "enforceDeclaredFiles": true }
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
- AgentSeal 将此文件作为策略基准进行检测。
|
|
68
|
+
- PatchWarden 将此文件作为执行时的强制约束。
|
|
69
|
+
- 两者读取同一份文件,保证“检测基准”与“执行约束”一致。
|
|
70
|
+
|
|
71
|
+
## 集成流程示例
|
|
72
|
+
|
|
73
|
+
### 1. 编写项目安全策略
|
|
74
|
+
|
|
75
|
+
在仓库根目录放置 `project-policy.json`(与 `.patchwarden/config.json` 配合):
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"allowedPaths": ["src/**", "docs/**"],
|
|
80
|
+
"allowedCommands": ["npm.cmd run build", "npm.cmd test"],
|
|
81
|
+
"blockedFiles": [".env", "*.key", "*.pem"],
|
|
82
|
+
"scopeRules": { "enforceDeclaredFiles": true }
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 2. AgentSeal 识别并校验策略
|
|
87
|
+
|
|
88
|
+
```powershell
|
|
89
|
+
# AgentSeal 扫描项目,识别 .patchwarden/config.json 与 project-policy.json
|
|
90
|
+
# 输出策略合规报告
|
|
91
|
+
agentseal scan --project D:\repos\my-project
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
AgentSeal 输出策略快照,作为后续违规比对的基准。
|
|
95
|
+
|
|
96
|
+
### 3. PatchWarden 执行任务时强制遵守
|
|
97
|
+
|
|
98
|
+
当 MCP 客户端通过 PatchWarden 执行任务时:
|
|
99
|
+
|
|
100
|
+
```powershell
|
|
101
|
+
# PatchWarden 启动时加载 project-policy.json
|
|
102
|
+
# 执行任务时对每条命令与文件改动进行策略校验
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
PatchWarden 的强制行为:
|
|
106
|
+
|
|
107
|
+
- 命令必须在 `allowedCommands` 列表中(精确匹配)。
|
|
108
|
+
- 文件改动必须在 `allowedPaths` 范围内。
|
|
109
|
+
- 命中 `blockedFiles` 的访问被立即阻断。
|
|
110
|
+
- `enforceDeclaredFiles` 为 true 时,未声明文件的改动触发范围违规检测。
|
|
111
|
+
|
|
112
|
+
### 4. 证据对齐与回溯
|
|
113
|
+
|
|
114
|
+
任务完成后,PatchWarden 导出 Evidence Pack v2:
|
|
115
|
+
|
|
116
|
+
```powershell
|
|
117
|
+
# 产物位于 .patchwarden/evidence-packs/<lineage_id>/
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
其中:
|
|
121
|
+
|
|
122
|
+
- `verify.json` 记录每轮迭代的策略校验结果,可与 AgentSeal 的策略快照对齐。
|
|
123
|
+
- `risk.json` 聚合执行中识别的风险项。
|
|
124
|
+
- `redactions.json` 记录已脱敏内容,证明未泄露敏感信息。
|
|
125
|
+
|
|
126
|
+
AgentSeal 可读取这些文件,作为策略执行情况的回溯证据。
|
|
127
|
+
|
|
128
|
+
## 安全边界
|
|
129
|
+
|
|
130
|
+
- PatchWarden 不依赖 AgentSeal 运行。即使 AgentSeal 未启动,
|
|
131
|
+
PatchWarden 仍会按 `project-policy.json` 强制执行策略。
|
|
132
|
+
- AgentSeal 不修改 PatchWarden 的运行时行为,仅提供策略检测与告警。
|
|
133
|
+
- 两者共享 `project-policy.json` 作为单一策略真源,避免策略漂移。
|
|
134
|
+
- 若 AgentSeal 检测到策略与 PatchWarden 配置不一致,
|
|
135
|
+
应由人工修正配置,不应自动放宽 PatchWarden 的约束。
|
|
136
|
+
|
|
137
|
+
## 注意事项
|
|
138
|
+
|
|
139
|
+
- 本集成模式不修改 AgentSeal 的任何行为,仅在配置与流程上配合。
|
|
140
|
+
- `project-policy.json` 的字段定义以 PatchWarden 实际加载逻辑为准,
|
|
141
|
+
AgentSeal 侧应按相同 schema 解析。
|
|
142
|
+
- 如策略允许读取 `.env` 等敏感文件,PatchWarden 仍会按安全契约阻断,
|
|
143
|
+
此时需要重新设计策略以避免触碰敏感资源。
|
|
144
|
+
|
|
145
|
+
## 相关文档
|
|
146
|
+
|
|
147
|
+
- `docs/threat-model.md`:PatchWarden 安全契约与敏感文件清单。
|
|
148
|
+
- `docs/evidence-pack-schema.md`:Evidence Pack v2 文件结构。
|
|
149
|
+
- `docs/why-patchwarden.md`:PatchWarden 定位与动机。
|
|
150
|
+
- 上游草稿 PR:https://github.com/getagentseal/agentseal/pull/35
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# PatchWarden Architecture
|
|
2
|
+
|
|
3
|
+
PatchWarden 是一个本地优先的 MCP(Model Context Protocol)安全桥接器,通过 5 种运行角色(MCP Server / Watcher / Agent / Control Center / Desktop App)协同,为 AI agent 提供任务编排、安全守卫、变更证据收集与审计能力。
|
|
4
|
+
|
|
5
|
+
## 详细文档
|
|
6
|
+
|
|
7
|
+
- [Code Wiki](./CODE_WIKI.md) —— 完整项目架构、模块职责、关键类与函数说明、依赖关系、运行方式、现有缺陷
|
|
8
|
+
- [Threat Model](./threat-model.md) —— 安全威胁模型与防护设计
|
|
9
|
+
- [Control Center](./control-center/README.md) —— Control Center HTTP 管理界面文档
|
|
10
|
+
- [Desktop App](./desktop-app.md) —— Electron 桌面应用文档
|
|
11
|
+
- [Direct Session Workflow](./direct-session-workflow.md) —— Direct 模式会话工作流
|
|
12
|
+
- [Task Safe Review Workflow](./task-safe-review-workflow.md) —— 任务安全审查工作流
|
|
13
|
+
|
|
14
|
+
## 一致性与资源边界
|
|
15
|
+
|
|
16
|
+
- `.patchwarden/` 只是证据存储位置,不是敏感路径豁免区;敏感文件名在任意目录深度都阻断。
|
|
17
|
+
- Goal 状态变更由跨进程 mutation lock 串行化并原子落盘;非空 Goal 的子目标全部 accepted 后自动转为 `completed`。
|
|
18
|
+
- 子目标任务以 Goal 保存的 `repo_path` 为权威并拒绝 mismatch;worktree create/merge/discard 共享该仓库的 lifecycle lock。
|
|
19
|
+
- task diff/summary/log tail 采用有界读取,`audit_task` 对文档数量和总字节设置预算,持续 invocation/reconcile 日志采用锁内有界追加并明确标记截断。
|
|
20
|
+
|
|
21
|
+
## 历史版本
|
|
22
|
+
|
|
23
|
+
历史架构文档与阶段性设计已归档至 [archive/](./archive/)。
|
|
Binary file
|
|
Binary file
|
|
@@ -15,13 +15,13 @@ PatchWarden has three control layers:
|
|
|
15
15
|
From the repository root:
|
|
16
16
|
|
|
17
17
|
```powershell
|
|
18
|
-
.\PatchWarden-Desktop.cmd
|
|
19
|
-
.\PatchWarden-Control.cmd
|
|
20
|
-
.\PatchWarden-Control-Tray.cmd --foreground
|
|
18
|
+
.\scripts\launchers\PatchWarden-Desktop.cmd
|
|
19
|
+
.\scripts\launchers\PatchWarden-Control.cmd
|
|
20
|
+
.\scripts\launchers\PatchWarden-Control-Tray.cmd --foreground
|
|
21
21
|
.\PatchWarden.cmd status all
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
Use `PatchWarden-Control.cmd` for normal desktop use. Use the tray when you only
|
|
24
|
+
Use `scripts\launchers\PatchWarden-Control.cmd` for normal desktop use. Use the tray when you only
|
|
25
25
|
need quick controls. Use `PatchWarden.cmd` when you need explicit CLI output or
|
|
26
26
|
automation-friendly commands.
|
|
27
27
|
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Dashboard 概览
|
|
2
|
+
|
|
3
|
+
> 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。
|
|
4
|
+
> 入口:`scripts\launchers\PatchWarden-Control.cmd` 或托盘菜单中的 "Open Control Center"。
|
|
5
|
+
|
|
6
|
+
## 目的
|
|
7
|
+
|
|
8
|
+
PatchWarden Dashboard(Control Center)把本地 Agent 工作流从“只能看的状态面板”
|
|
9
|
+
升级为“可操作的工作流控制中心”。所有操作默认走 safe 摘要接口,有界日志、diff、
|
|
10
|
+
test log 仅在折叠的“高级区”按需加载,不改变 PatchWarden 的安全边界。
|
|
11
|
+
|
|
12
|
+
## 核心概念
|
|
13
|
+
|
|
14
|
+
- **Safe-first**:默认展示 `safe_result` / `safe_audit` / `safe_test_summary` /
|
|
15
|
+
`safe_diff_summary` / `safe_direct_summary` 等有界摘要,避免直接渲染完整产物。
|
|
16
|
+
- **Repo selector**:顶部下拉列出 workspace 根目录及其一级项目目录(带 package.json
|
|
17
|
+
版本标记)。切换 repo 会刷新 Project Policy、Release、Recent Tasks、Lineage、
|
|
18
|
+
Evidence Pack、Direct Sessions。
|
|
19
|
+
- **Health Score**:综合 watcher / tunnel / agents / stale 任务 / 失败任务 /
|
|
20
|
+
policy 有效性 / release readiness / direct profile 状态计算出的健康分,
|
|
21
|
+
状态为 `healthy` / `warning` / `degraded` / `blocked`。
|
|
22
|
+
- **Bound to lineage**:Evidence Pack 与 Lineage 绑定,只有 `run_task_loop` 产生
|
|
23
|
+
lineage 后才能导出证据包。
|
|
24
|
+
|
|
25
|
+
## 主要页面
|
|
26
|
+
|
|
27
|
+
| 页面 | 主要内容 |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| Dashboard | Repo selector、Health Score、服务状态、Release 卡片、Project Policy、Lineage、Evidence Pack、Stale 任务提示、最近任务列表、系统状态(含 Copy diagnostics) |
|
|
30
|
+
| Tasks | 任务列表,支持按 repo_path / status / acceptance_status / warning_type / agent / date range 过滤 |
|
|
31
|
+
| Task Detail | safe 摘要默认视图 + 折叠的高级区(配置上限内的 result / diff / test_log) |
|
|
32
|
+
| Direct Sessions | 按 active / finalized / audited / expired 分组的 Direct 会话 |
|
|
33
|
+
| Audit / Warnings | 按 warning 类型聚合的诊断页 |
|
|
34
|
+
| Workspace | workspace 一级目录与项目列表 |
|
|
35
|
+
| Logs | Core / Direct / Watcher / Control Center 日志尾部 |
|
|
36
|
+
|
|
37
|
+
## 推荐工作流
|
|
38
|
+
|
|
39
|
+
1. 在 Dashboard 顶部选择目标 repo。
|
|
40
|
+
2. 查看 Health Score,确认系统健康(`healthy` 或 `warning`)。
|
|
41
|
+
3. 在 Release 卡片确认发布就绪状态;若 `blocked`,按 `blocked_reason` 修复。
|
|
42
|
+
4. 在最近任务列表点击 `safe_result` 快捷查看任务摘要。
|
|
43
|
+
5. 打开 Task Detail 进行 safe-first 验收(详见
|
|
44
|
+
[task-safe-review-workflow.md](task-safe-review-workflow.md))。
|
|
45
|
+
6. 使用 Lineage Detail 查看 `run_task_loop` 成功/失败原因(详见
|
|
46
|
+
[lineage-evidence-pack-workflow.md](lineage-evidence-pack-workflow.md))。
|
|
47
|
+
7. 验收完成后导出 Evidence Pack。
|
|
48
|
+
8. Direct 会话用于独立验证,完成后 finalize + audit(详见
|
|
49
|
+
[direct-session-workflow.md](direct-session-workflow.md))。
|
|
50
|
+
9. 遇到问题时点击 **Copy diagnostics** 复制诊断信息,发给 ChatGPT / Codex / opencode 排查。
|
|
51
|
+
|
|
52
|
+
## 卡片速查
|
|
53
|
+
|
|
54
|
+
### Release 卡片
|
|
55
|
+
|
|
56
|
+
显示 package name、version_source、version、version_consistent、required_commands
|
|
57
|
+
(每条命令的 allowed + blocked_reason)、commands_blocked_count、
|
|
58
|
+
ready/unknown/blocked 状态及 blocked 原因。`next_action` 会引导使用
|
|
59
|
+
`release_check` 模板。
|
|
60
|
+
|
|
61
|
+
### Stale 任务卡片
|
|
62
|
+
|
|
63
|
+
不再是简单的“过期任务列表”,而是可解释、可操作的健康建议卡片,包含 task_id、
|
|
64
|
+
repo_path、status、error、人类可读的 explanation、next_action,以及快捷操作
|
|
65
|
+
(查看详情、复制 task_id、隐藏、重建任务)。
|
|
66
|
+
|
|
67
|
+
### Project Policy 卡片
|
|
68
|
+
|
|
69
|
+
只读展示 auto_cleanup、protected_paths 数量、high_risk_commands 数量、
|
|
70
|
+
release_mode 摘要。
|
|
71
|
+
|
|
72
|
+
## 安全边界
|
|
73
|
+
|
|
74
|
+
- 所有 safe 接口返回有界摘要,不包含完整日志、stdout/stderr tail、diff、密钥内容。
|
|
75
|
+
- 有界 result / diff / test_log 只在折叠的高级区按需加载,永不自动加载。
|
|
76
|
+
- Project Policy 卡片只读,不能从 UI 修改策略。
|
|
77
|
+
- 不执行远程写操作(npm publish / git push / git tag / gh release)。
|
|
78
|
+
- Diagnostics 输出经过 `redactSensitiveContent` 脱敏。
|
|
79
|
+
|
|
80
|
+
## 相关 API 端点
|
|
81
|
+
|
|
82
|
+
- `GET /api/workspace/repos` — Repo selector 数据源
|
|
83
|
+
- `GET /api/diagnostics` — Copy diagnostics 数据源
|
|
84
|
+
- `GET /api/warnings` — Warnings 页数据源
|
|
85
|
+
- `GET /api/release/status` — Release 卡片数据源
|
|
86
|
+
- `GET /api/tasks/stale` — Stale 任务卡片数据源(含 explanation / next_action)
|
package/docs/demo.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
This is a privacy-safe demo flow for GitHub. It uses placeholder workspace
|
|
4
4
|
names and avoids real tunnel IDs, account names, API keys, or local user paths.
|
|
5
5
|
|
|
6
|
+
## Animated OSS Demo
|
|
7
|
+
|
|
8
|
+
This scripted GIF summarizes the public maintainer workflow without showing
|
|
9
|
+
private accounts, real API keys, real task history, or local user paths. It is a
|
|
10
|
+
demo asset, not third-party adoption evidence.
|
|
11
|
+
|
|
12
|
+

|
|
13
|
+
|
|
6
14
|
## Demo: ChatGPT Lists A Workspace
|
|
7
15
|
|
|
8
16
|
Prompt in ChatGPT with the PatchWarden connector selected:
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# PatchWarden Windows Desktop
|
|
2
|
+
|
|
3
|
+
PatchWarden Desktop is the installable Windows shell for the existing local
|
|
4
|
+
Control Center. It does not add a remote shell or replace the MCP server. The
|
|
5
|
+
desktop process starts the same loopback-only Control Center, displays it in an
|
|
6
|
+
isolated Electron window, and keeps quick controls in the system tray.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
1. Download `PatchWarden-Setup-<version>-x64.exe` (installed) or
|
|
11
|
+
`PatchWarden-Portable-<version>-x64.zip` (no install), plus
|
|
12
|
+
`PatchWarden-Desktop-SHA256SUMS.txt` from the matching GitHub Release.
|
|
13
|
+
2. Verify the SHA256 value before running the installer.
|
|
14
|
+
3. Install for the current Windows user. Administrator access is not required.
|
|
15
|
+
4. Select a dedicated workspace, review detected local CLIs and models, and let
|
|
16
|
+
the read-only doctor finish.
|
|
17
|
+
|
|
18
|
+
## First-run routes
|
|
19
|
+
|
|
20
|
+
The first screen asks whether PatchWarden will be used through **ChatGPT
|
|
21
|
+
Tunnel** or **Local MCP**. Local MCP can skip Platform Tunnel configuration.
|
|
22
|
+
For ChatGPT, use the same eight steps shown in both READMEs:
|
|
23
|
+
|
|
24
|
+
1. Confirm Platform Tunnel access and enable developer mode for the target ChatGPT workspace.
|
|
25
|
+
2. Create a Tunnel in [Platform Tunnel settings](https://platform.openai.com/settings/organization/tunnels) and associate that workspace.
|
|
26
|
+
3. Detect or choose an existing `tunnel-client.exe` in Desktop Settings.
|
|
27
|
+
4. Enter the Core Tunnel ID and dedicated Tunnel runtime API key used as `CONTROL_PLANE_API_KEY`. It is not an application `OPENAI_API_KEY`.
|
|
28
|
+
5. Configure and test the environment, direct, or credential-free HTTP/HTTPS/SOCKS5 (Mixed) proxy.
|
|
29
|
+
6. Configure the Core profile, run `tunnel-client doctor --explain --json`, and start Core. The runtime key travels from the isolated renderer to the main process over bounded IPC, then to a one-time PowerShell process over stdin. It is DPAPI-encrypted only after doctor succeeds and is never placed in repository config, HTTP APIs, command arguments, logs, or returned objects.
|
|
30
|
+
7. Confirm Tunnel ready, Watcher healthy, and the fixed 26-tool `chatgpt_core` catalog on Getting Started.
|
|
31
|
+
8. In ChatGPT **Settings → Plugins**, create a developer-mode app, choose the Tunnel, reconnect, open a new chat, and call `health_check`.
|
|
32
|
+
|
|
33
|
+
The current term is **developer-mode app / Plugins**; older releases called it
|
|
34
|
+
a Connector. Direct remains optional and must be enabled explicitly. Start All
|
|
35
|
+
starts Core and reports Direct as skipped while Direct is disabled; Stop All
|
|
36
|
+
still covers both profiles.
|
|
37
|
+
|
|
38
|
+
The setup flow searches `PATH`, current-user application directories, and a
|
|
39
|
+
bounded area next to the selected workspace for `tunnel-client.exe`. If it is
|
|
40
|
+
not found, continue into the read-only console and open **Settings > MCP and
|
|
41
|
+
tunnel**. Use **Detect** or the dedicated file picker; it accepts only an
|
|
42
|
+
existing file named `tunnel-client.exe`. PatchWarden never downloads or runs
|
|
43
|
+
new software automatically. Download the Windows x64 build only from the
|
|
44
|
+
trusted release source named by your tunnel provider and compare its SHA256
|
|
45
|
+
with that release before selecting it.
|
|
46
|
+
|
|
47
|
+
Prerequisites are Windows x64, Node.js 18 or newer, and the configured
|
|
48
|
+
tunnel-client used by the existing Core/Direct launcher chain. Electron runs
|
|
49
|
+
the desktop window and Control Center child, but does not replace those runtime
|
|
50
|
+
requirements.
|
|
51
|
+
|
|
52
|
+
The first unsigned desktop release may show Windows SmartScreen. Verify the
|
|
53
|
+
checksum and GitHub Release source before choosing to continue. No updater or
|
|
54
|
+
login startup entry is installed in v1.
|
|
55
|
+
|
|
56
|
+
## Local agents and models
|
|
57
|
+
|
|
58
|
+
Desktop supports Codex, OpenCode, Claude Code, Gemini CLI, GitHub Copilot CLI,
|
|
59
|
+
Qwen Code, Kimi Code, and Aider. Settings detects only verified native
|
|
60
|
+
executables or known npm package entry points and never launches Windows shell
|
|
61
|
+
shims through a command shell.
|
|
62
|
+
|
|
63
|
+
Model discovery reads only allowlisted model fields from each agent's normal
|
|
64
|
+
JSON/JSONC, TOML, or YAML settings. It does not read `.env`, API keys, browser
|
|
65
|
+
state, provider secrets, or session history. Online model listing is never run
|
|
66
|
+
automatically; the user must select the refresh control for an agent that
|
|
67
|
+
supports a bounded model-list command. Choosing **Follow agent default** omits
|
|
68
|
+
the model argument so the agent retains its own precedence rules.
|
|
69
|
+
|
|
70
|
+
## Local state
|
|
71
|
+
|
|
72
|
+
- Desktop config: `%LOCALAPPDATA%\PatchWarden\patchwarden.config.json`
|
|
73
|
+
- Desktop preferences: `%LOCALAPPDATA%\PatchWarden\desktop-preferences.json`
|
|
74
|
+
- Desktop startup log: `%LOCALAPPDATA%\PatchWarden\desktop.log`
|
|
75
|
+
- Control Center logs: `%LOCALAPPDATA%\patchwarden\control-center`
|
|
76
|
+
- Tasks and evidence remain below the selected workspace.
|
|
77
|
+
|
|
78
|
+
If `PATCHWARDEN_CONFIG` points to a valid config, the desktop app uses that path
|
|
79
|
+
instead of creating the LocalAppData config. Config changes are written
|
|
80
|
+
atomically and the previous file is retained as a timestamped `.bak-*` copy.
|
|
81
|
+
Uninstalling the app does not remove config, tasks, evidence, or workspace data.
|
|
82
|
+
|
|
83
|
+
## Runtime behavior
|
|
84
|
+
|
|
85
|
+
- The app binds only to `127.0.0.1:8090` and reuses an existing verified
|
|
86
|
+
PatchWarden Control Center on that address.
|
|
87
|
+
- A foreign listener on port 8090 is reported; the app never kills it or takes
|
|
88
|
+
the port.
|
|
89
|
+
- Closing the window hides it to the tray by default. `Exit desktop app` stops
|
|
90
|
+
only the Control Center child owned by that app process.
|
|
91
|
+
- Desktop-owned utility and PowerShell children receive a minimal runtime and
|
|
92
|
+
proxy environment. Provider variables require an explicit Agent allow-list,
|
|
93
|
+
while Control/Tunnel owner credentials are always removed. Windows
|
|
94
|
+
PowerShell and `where.exe` are resolved from the system directory rather than
|
|
95
|
+
the selected workspace or its current directory.
|
|
96
|
+
- Backend restarts are serialized. A restart waits for the exact owned child to
|
|
97
|
+
emit `exit` (or reach a bounded timeout), and a configuration change received
|
|
98
|
+
during an active restart schedules one further restart instead of racing it.
|
|
99
|
+
- `Stop all and exit` explicitly requests the existing bounded stop action for
|
|
100
|
+
Core/Direct before closing.
|
|
101
|
+
- Start/restart succeeds only after the selected tunnel health endpoint is
|
|
102
|
+
ready and the Core watcher heartbeat is healthy. Early supervisor exits and
|
|
103
|
+
timeouts are reported with a reason and next steps.
|
|
104
|
+
- Background start uses `run-background-supervisor.ps1` so the lifecycle API
|
|
105
|
+
returns without holding the long-running supervisor's output handles. The
|
|
106
|
+
wrapper writes bounded `supervisor.stdout.log` and `supervisor.stderr.log`
|
|
107
|
+
files while `supervisor-status.json` records only PID, state, timestamps, and
|
|
108
|
+
log paths.
|
|
109
|
+
- The legacy CMD, PowerShell tray, and browser Dashboard remain supported.
|
|
110
|
+
|
|
111
|
+
## MCP and proxy settings
|
|
112
|
+
|
|
113
|
+
The desktop settings page can enable the Direct profile and configure tunnel
|
|
114
|
+
proxy behavior. Direct remains disabled until the user explicitly enables it.
|
|
115
|
+
|
|
116
|
+
- **Use environment proxy** inherits `HTTPS_PROXY` when it is present.
|
|
117
|
+
- **No proxy** removes proxy variables for the launcher-owned tunnel process.
|
|
118
|
+
- **Manual proxy** accepts only `http`, `https`, or `socks5` URLs without an
|
|
119
|
+
embedded username or password.
|
|
120
|
+
|
|
121
|
+
Core and Direct can share one proxy definition or use separate definitions.
|
|
122
|
+
PatchWarden does not store proxy credentials in URLs or logs.
|
|
123
|
+
|
|
124
|
+
## Build from source
|
|
125
|
+
|
|
126
|
+
Run from the repository in Windows PowerShell:
|
|
127
|
+
|
|
128
|
+
```powershell
|
|
129
|
+
npm.cmd ci
|
|
130
|
+
npm.cmd run build
|
|
131
|
+
npm.cmd install --prefix desktop --cache .\.npm-cache
|
|
132
|
+
npm.cmd run desktop:test
|
|
133
|
+
npm.cmd run desktop:preflight
|
|
134
|
+
npm.cmd run desktop:package
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Artifacts are written below `release\desktop`. Desktop dependencies remain in
|
|
138
|
+
the private `desktop` package and are not included in the `patchwarden` npm
|
|
139
|
+
package.
|
|
140
|
+
|
|
141
|
+
Desktop staging must include `scripts/checks/mcp-manifest-check.js` and the
|
|
142
|
+
root package-lock production dependency closure below `resources/core/node_modules`.
|
|
143
|
+
Validate the unpacked runtime from a directory outside the repository so it
|
|
144
|
+
cannot accidentally resolve dependencies from the developer checkout.
|
|
145
|
+
|
|
146
|
+
`npm.cmd run desktop:preflight` automates that isolated validation and writes a
|
|
147
|
+
privacy-bounded receipt in a unique `release/desktop-preflight-*` directory.
|
|
148
|
+
The receipt records the branch, commit, dirty-state hashes, toolchain versions,
|
|
149
|
+
check durations, package file count, runtime manifest digest, unpacked
|
|
150
|
+
executable digest, and UI smoke result. It stores no diff content, credentials,
|
|
151
|
+
configuration values, or browser state. The smoke process uses temporary
|
|
152
|
+
`LOCALAPPDATA` / `APPDATA`, a nonexistent isolated config, and launcher-owned
|
|
153
|
+
processes only.
|
|
154
|
+
|
|
155
|
+
Viewport DOM metrics, page readiness, and the single-instance result are hard
|
|
156
|
+
smoke gates. Electron screenshots are best-effort evidence because Windows
|
|
157
|
+
graphics capture can be unavailable in CI sessions; capture failures are
|
|
158
|
+
counted in the receipt without crashing Desktop. Local visual acceptance can
|
|
159
|
+
pass `--require-screenshots` to `desktop/scripts/smoke-unpacked.mjs`, or use
|
|
160
|
+
`--no-capture` while an external UI automation tool owns Windows Graphics
|
|
161
|
+
Capture.
|
|
162
|
+
|
|
163
|
+
For a release candidate, run `npm.cmd run desktop:preflight:release`. It rejects
|
|
164
|
+
dirty worktrees. The regular preflight remains available for validating an
|
|
165
|
+
intentional local working-tree baseline before it is committed.
|
|
166
|
+
|
|
167
|
+
## Release checklist
|
|
168
|
+
|
|
169
|
+
1. From a clean checkout, run `npm.cmd run desktop:preflight:release`, then the
|
|
170
|
+
full core validation chain and `npm.cmd run desktop:package`.
|
|
171
|
+
2. Install and uninstall on a clean Windows x64 environment without elevation.
|
|
172
|
+
3. Verify first-run setup, tray behavior, restart, explicit exit, and retained
|
|
173
|
+
user data after uninstall.
|
|
174
|
+
4. Compare the installer SHA256 with the generated checksum file.
|
|
175
|
+
5. Publish GitHub assets manually. npm publication remains a separate action.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Direct 会话工作流
|
|
2
|
+
|
|
3
|
+
> 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。
|
|
4
|
+
> 相关页面:Direct Sessions
|
|
5
|
+
|
|
6
|
+
## 目的
|
|
7
|
+
|
|
8
|
+
Direct 会话(Direct Session)是 PatchWarden 提供给 ChatGPT 等 Direct agent 的
|
|
9
|
+
独立验证通道:在 watcher 守护的任务流程之外,对一个 repo 做独立的文件查看、
|
|
10
|
+
命令执行和验证。Direct 不会自动 patch 文件、不会绕过命令守卫,所有操作仍受
|
|
11
|
+
workspace 隔离、敏感路径拦截和审计约束。
|
|
12
|
+
|
|
13
|
+
## 核心概念
|
|
14
|
+
|
|
15
|
+
- **Direct session**:绑定到某个 repo_path 的一次独立会话,有 session_id、
|
|
16
|
+
title、created_at、expires_at。
|
|
17
|
+
- **会话状态分组**:`active` / `finalized` / `audited` / `expired`。
|
|
18
|
+
expired 默认折叠。
|
|
19
|
+
- **safe_direct_summary**:Direct 会话的有界摘要,包含 changed_files_total、
|
|
20
|
+
verification status,不含完整 diff 或 stdout。
|
|
21
|
+
- **finalize**:把 active 会话标记为已完成(finalized),冻结变更记录。
|
|
22
|
+
- **audit**:对 finalized 会话做审计,生成审计摘要(audited 状态)。
|
|
23
|
+
- **verification bundle**:`run_direct_verification_bundle` 一次性跑测试 + diff +
|
|
24
|
+
验收检查的成组操作。
|
|
25
|
+
|
|
26
|
+
## 生命周期
|
|
27
|
+
|
|
28
|
+
### 1. 创建 Direct 会话
|
|
29
|
+
|
|
30
|
+
通过 Direct profile 的 MCP 工具创建会话(如 `start_direct_session`),指定
|
|
31
|
+
repo_path 和 title。会话会进入 `active` 状态,并记录 created_at 与 expires_at。
|
|
32
|
+
|
|
33
|
+
### 2. 在 Direct Sessions 页查看
|
|
34
|
+
|
|
35
|
+
Direct Sessions 页按状态分组展示所有会话:
|
|
36
|
+
|
|
37
|
+
- **active** — 进行中
|
|
38
|
+
- **finalized** — 已 finalize,待 audit
|
|
39
|
+
- **audited** — 已完成审计
|
|
40
|
+
- **expired** — 已过期(默认折叠)
|
|
41
|
+
|
|
42
|
+
每个会话显示 session_id、repo_path、title、created_at、expires_at、finalized、
|
|
43
|
+
audited、changed_files_total、verification status。
|
|
44
|
+
|
|
45
|
+
### 3. 执行独立验证
|
|
46
|
+
|
|
47
|
+
在 active 会话中,使用 Direct 工具进行独立验证:
|
|
48
|
+
|
|
49
|
+
- 查看文件(受敏感路径拦截)
|
|
50
|
+
- 执行允许的命令(受白名单约束)
|
|
51
|
+
- 调用 `run_direct_verification_bundle` 一次跑完测试 + diff + 验收检查
|
|
52
|
+
|
|
53
|
+
或直接在 Direct Sessions 页点击 **run_direct_verification_bundle** 快捷操作。
|
|
54
|
+
|
|
55
|
+
### 4. 查看 safe 摘要
|
|
56
|
+
|
|
57
|
+
点击 **safe_direct_summary** 查看会话的有界摘要:
|
|
58
|
+
|
|
59
|
+
- changed_files_total
|
|
60
|
+
- verification status
|
|
61
|
+
- 是否命中受保护路径
|
|
62
|
+
|
|
63
|
+
> 完整 diff 与 stdout 不会自动加载,仅在高级区按需查看。
|
|
64
|
+
|
|
65
|
+
### 5. Finalize 会话
|
|
66
|
+
|
|
67
|
+
验证完成后点击 **safe_finalize_direct_session**(或调用
|
|
68
|
+
`POST /api/direct-sessions/:sessionId/finalize`),把会话标记为 `finalized`,
|
|
69
|
+
冻结变更记录,准备进入审计。
|
|
70
|
+
|
|
71
|
+
### 6. Audit 会话
|
|
72
|
+
|
|
73
|
+
对 finalized 会话点击 **safe_audit_direct_session**(或调用
|
|
74
|
+
`POST /api/direct-sessions/:sessionId/audit`),生成审计摘要,会话进入
|
|
75
|
+
`audited` 状态。审计摘要可用于归档或与 lineage 的 direct_verification 对照。
|
|
76
|
+
|
|
77
|
+
### 7. 处理过期会话
|
|
78
|
+
|
|
79
|
+
超过 expires_at 的会话进入 `expired` 状态,默认折叠。可执行:
|
|
80
|
+
|
|
81
|
+
- **copy session_id** — 复制 id 用于追溯
|
|
82
|
+
- **hide expired** — 调用 `POST /api/direct-sessions/:sessionId/hide` 隐藏
|
|
83
|
+
|
|
84
|
+
## 安全边界
|
|
85
|
+
|
|
86
|
+
- Direct 会话仍受 workspace 隔离、命令白名单、敏感路径拦截约束。
|
|
87
|
+
- Direct 不会自动 patch 文件,所有写操作都需要显式确认。
|
|
88
|
+
- safe 摘要不含完整 diff / stdout / 密钥内容。
|
|
89
|
+
- finalize 与 audit 只修改本地会话状态,不触发远程写。
|
|
90
|
+
- Direct 不执行 `npm publish` / `git push` / `git tag` / `gh release`。
|
|
91
|
+
|
|
92
|
+
## 相关 API 端点
|
|
93
|
+
|
|
94
|
+
- `GET /api/direct-sessions` — 会话列表(按状态分组)
|
|
95
|
+
- `GET /api/direct-sessions/:sessionId` — 单个会话详情
|
|
96
|
+
- `POST /api/direct-sessions/:sessionId/finalize` — finalize 会话
|
|
97
|
+
- `POST /api/direct-sessions/:sessionId/audit` — audit 会话
|
|
98
|
+
- `POST /api/direct-sessions/:sessionId/hide` — 隐藏过期会话
|