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.
Files changed (597) hide show
  1. package/PatchWarden.cmd +32 -2
  2. package/README.en.md +194 -26
  3. package/README.md +160 -22
  4. package/dist/assessments/agentAssessor.d.ts +1 -1
  5. package/dist/assessments/agentAssessor.js +24 -15
  6. package/dist/assessments/assessmentStore.d.ts +1 -1
  7. package/dist/assessments/assessmentStore.js +44 -36
  8. package/dist/assessments/confirmCli.js +5 -4
  9. package/dist/config.d.ts +22 -0
  10. package/dist/config.js +98 -11
  11. package/dist/control/fileManager.d.ts +2 -0
  12. package/dist/control/fileManager.js +39 -0
  13. package/dist/control/middleware/auth.d.ts +16 -0
  14. package/dist/control/middleware/auth.js +17 -0
  15. package/dist/control/middleware/static.d.ts +3 -0
  16. package/dist/control/middleware/static.js +78 -0
  17. package/dist/control/routeTable.d.ts +24 -0
  18. package/dist/control/routeTable.js +263 -0
  19. package/dist/control/routes/audit.d.ts +15 -0
  20. package/dist/control/routes/audit.js +287 -0
  21. package/dist/control/routes/evidence.d.ts +4 -0
  22. package/dist/control/routes/evidence.js +96 -0
  23. package/dist/control/routes/lineage.d.ts +3 -0
  24. package/dist/control/routes/lineage.js +71 -0
  25. package/dist/control/routes/policy.d.ts +3 -0
  26. package/dist/control/routes/policy.js +81 -0
  27. package/dist/control/routes/process.d.ts +12 -0
  28. package/dist/control/routes/process.js +487 -0
  29. package/dist/control/routes/sessions.d.ts +30 -0
  30. package/dist/control/routes/sessions.js +287 -0
  31. package/dist/control/routes/status.d.ts +51 -0
  32. package/dist/control/routes/status.js +307 -0
  33. package/dist/control/routes/taskActions.d.ts +21 -0
  34. package/dist/control/routes/taskActions.js +197 -0
  35. package/dist/control/routes/tasks.d.ts +24 -0
  36. package/dist/control/routes/tasks.js +309 -0
  37. package/dist/control/routes/workspace.d.ts +15 -0
  38. package/dist/control/routes/workspace.js +220 -0
  39. package/dist/control/runtime.d.ts +92 -0
  40. package/dist/control/runtime.js +425 -0
  41. package/dist/control/server.d.ts +13 -0
  42. package/dist/control/server.js +150 -0
  43. package/dist/control/shared.d.ts +59 -0
  44. package/dist/control/shared.js +341 -0
  45. package/dist/controlCenter.d.ts +6 -0
  46. package/dist/controlCenter.js +7 -2197
  47. package/dist/direct/directAudit.js +234 -225
  48. package/dist/direct/directGuards.d.ts +2 -1
  49. package/dist/direct/directGuards.js +72 -37
  50. package/dist/direct/directPatch.d.ts +6 -1
  51. package/dist/direct/directPatch.js +55 -8
  52. package/dist/direct/directSessionStore.d.ts +16 -6
  53. package/dist/direct/directSessionStore.js +127 -35
  54. package/dist/direct/directVerification.js +8 -16
  55. package/dist/doctor.d.ts +18 -1
  56. package/dist/doctor.js +614 -373
  57. package/dist/goal/acceptanceEngine.d.ts +1 -1
  58. package/dist/goal/goalProgress.js +75 -69
  59. package/dist/goal/goalReport.d.ts +54 -0
  60. package/dist/goal/goalReport.js +197 -0
  61. package/dist/goal/goalStatus.d.ts +8 -0
  62. package/dist/goal/goalStatus.js +10 -3
  63. package/dist/goal/goalStore.d.ts +9 -2
  64. package/dist/goal/goalStore.js +152 -45
  65. package/dist/goal/handoffExport.js +6 -6
  66. package/dist/goal/specKitImport.d.ts +63 -0
  67. package/dist/goal/specKitImport.js +221 -0
  68. package/dist/goal/subgoalSync.js +13 -10
  69. package/dist/goal/worktreeManager.d.ts +2 -0
  70. package/dist/goal/worktreeManager.js +209 -136
  71. package/dist/httpServer.js +126 -44
  72. package/dist/index.js +7 -4
  73. package/dist/logging.d.ts +7 -1
  74. package/dist/logging.js +13 -3
  75. package/dist/policy/projectPolicy.js +5 -2
  76. package/dist/release/releaseGate.d.ts +1 -1
  77. package/dist/release/releaseGate.js +78 -25
  78. package/dist/runner/agentInvocation.d.ts +14 -0
  79. package/dist/runner/agentInvocation.js +96 -4
  80. package/dist/runner/changeCapture.d.ts +14 -6
  81. package/dist/runner/changeCapture.js +287 -81
  82. package/dist/runner/cli.js +7 -6
  83. package/dist/runner/postTaskCleanup.js +60 -7
  84. package/dist/runner/processSecurity.d.ts +56 -0
  85. package/dist/runner/processSecurity.js +373 -0
  86. package/dist/runner/runTask.d.ts +1 -1
  87. package/dist/runner/runTask.js +339 -287
  88. package/dist/runner/simpleProcess.d.ts +3 -0
  89. package/dist/runner/simpleProcess.js +52 -38
  90. package/dist/{taskProgress.d.ts → runner/taskProgress.d.ts} +1 -1
  91. package/dist/{taskProgress.js → runner/taskProgress.js} +2 -2
  92. package/dist/{taskRuntime.d.ts → runner/taskRuntime.d.ts} +1 -1
  93. package/dist/{taskRuntime.js → runner/taskRuntime.js} +3 -2
  94. package/dist/runner/taskStatusStore.d.ts +11 -0
  95. package/dist/runner/taskStatusStore.js +24 -0
  96. package/dist/runner/watch.d.ts +14 -1
  97. package/dist/runner/watch.js +265 -54
  98. package/dist/security/contentRedaction.d.ts +6 -0
  99. package/dist/security/contentRedaction.js +24 -2
  100. package/dist/security/discoveryTokenStore.d.ts +3 -2
  101. package/dist/security/discoveryTokenStore.js +17 -2
  102. package/dist/security/loopbackHost.d.ts +2 -0
  103. package/dist/security/loopbackHost.js +16 -0
  104. package/dist/security/pathGuard.js +32 -17
  105. package/dist/security/planGuard.js +2 -1
  106. package/dist/security/runtimeGuard.js +9 -6
  107. package/dist/security/secretComparison.d.ts +3 -0
  108. package/dist/security/secretComparison.js +11 -0
  109. package/dist/security/sensitiveGuard.d.ts +5 -0
  110. package/dist/security/sensitiveGuard.js +27 -8
  111. package/dist/security/toolInvocationGuard.d.ts +2 -2
  112. package/dist/security/toolInvocationGuard.js +1 -1
  113. package/dist/security/workspaceRootGuard.d.ts +8 -0
  114. package/dist/security/workspaceRootGuard.js +47 -0
  115. package/dist/smoke-test.js +280 -273
  116. package/dist/tools/catalog/index.d.ts +4 -0
  117. package/dist/tools/catalog/index.js +4 -0
  118. package/dist/tools/{toolCatalog.js → catalog/toolCatalog.js} +3 -12
  119. package/dist/tools/{toolRegistry.d.ts → catalog/toolRegistry.d.ts} +3 -3
  120. package/dist/tools/{toolRegistry.js → catalog/toolRegistry.js} +28 -15
  121. package/dist/tools/definitions/toolDefs.d.ts +18 -0
  122. package/dist/tools/definitions/toolDefs.js +1177 -0
  123. package/dist/tools/{auditSession.d.ts → diagnostics/auditSession.d.ts} +1 -1
  124. package/dist/tools/{auditSession.js → diagnostics/auditSession.js} +2 -2
  125. package/dist/tools/{auditTask.d.ts → diagnostics/auditTask.d.ts} +8 -63
  126. package/dist/tools/{auditTask.js → diagnostics/auditTask.js} +111 -37
  127. package/dist/tools/{healthCheck.d.ts → diagnostics/healthCheck.d.ts} +6 -6
  128. package/dist/tools/{healthCheck.js → diagnostics/healthCheck.js} +10 -10
  129. package/dist/tools/diagnostics/index.d.ts +6 -0
  130. package/dist/tools/diagnostics/index.js +6 -0
  131. package/dist/tools/{safeStatus.d.ts → diagnostics/safeStatus.d.ts} +3 -3
  132. package/dist/tools/{safeStatus.js → diagnostics/safeStatus.js} +6 -6
  133. package/dist/tools/{safeViews.d.ts → diagnostics/safeViews.d.ts} +14 -10
  134. package/dist/tools/{safeViews.js → diagnostics/safeViews.js} +25 -15
  135. package/dist/tools/{schemaDriftCheck.d.ts → diagnostics/schemaDriftCheck.d.ts} +1 -1
  136. package/dist/tools/{schemaDriftCheck.js → diagnostics/schemaDriftCheck.js} +2 -2
  137. package/dist/tools/{createDirectSession.d.ts → direct/createDirectSession.d.ts} +1 -1
  138. package/dist/tools/{createDirectSession.js → direct/createDirectSession.js} +8 -8
  139. package/dist/tools/{finalizeDirectSession.d.ts → direct/finalizeDirectSession.d.ts} +2 -2
  140. package/dist/tools/direct/finalizeDirectSession.js +86 -0
  141. package/dist/tools/direct/index.d.ts +3 -0
  142. package/dist/tools/direct/index.js +3 -0
  143. package/dist/tools/{runDirectVerificationBundle.js → direct/runDirectVerificationBundle.js} +2 -2
  144. package/dist/tools/{discoverTools.d.ts → discovery/discoverTools.d.ts} +2 -2
  145. package/dist/tools/{discoverTools.js → discovery/discoverTools.js} +5 -5
  146. package/dist/tools/{explainTool.d.ts → discovery/explainTool.d.ts} +2 -2
  147. package/dist/tools/{explainTool.js → discovery/explainTool.js} +2 -2
  148. package/dist/tools/discovery/index.d.ts +3 -0
  149. package/dist/tools/discovery/index.js +3 -0
  150. package/dist/tools/{invokeDiscoveredTool.d.ts → discovery/invokeDiscoveredTool.d.ts} +2 -2
  151. package/dist/tools/{invokeDiscoveredTool.js → discovery/invokeDiscoveredTool.js} +5 -5
  152. package/dist/tools/dispatch/coreDispatch.d.ts +9 -0
  153. package/dist/tools/dispatch/coreDispatch.js +283 -0
  154. package/dist/tools/dispatch/diagnosticDispatch.d.ts +12 -0
  155. package/dist/tools/dispatch/diagnosticDispatch.js +80 -0
  156. package/dist/tools/dispatch/directDispatch.d.ts +8 -0
  157. package/dist/tools/dispatch/directDispatch.js +116 -0
  158. package/dist/tools/dispatch/goalDispatch.d.ts +8 -0
  159. package/dist/tools/dispatch/goalDispatch.js +92 -0
  160. package/dist/tools/dispatch/releaseDispatch.d.ts +8 -0
  161. package/dist/tools/dispatch/releaseDispatch.js +46 -0
  162. package/dist/tools/dispatch/types.d.ts +23 -0
  163. package/dist/tools/dispatch/types.js +15 -0
  164. package/dist/tools/dispatch/validation.d.ts +7 -0
  165. package/dist/tools/dispatch/validation.js +71 -0
  166. package/dist/tools/{getPlan.js → goals/getPlan.js} +4 -4
  167. package/dist/tools/{goalSubgoalTask.d.ts → goals/goalSubgoalTask.d.ts} +2 -2
  168. package/dist/tools/goals/goalSubgoalTask.js +118 -0
  169. package/dist/tools/goals/index.d.ts +3 -0
  170. package/dist/tools/goals/index.js +3 -0
  171. package/dist/tools/{savePlan.js → goals/savePlan.js} +28 -8
  172. package/dist/tools/registry.d.ts +10 -14
  173. package/dist/tools/registry.js +47 -1651
  174. package/dist/tools/{checkReleaseGate.d.ts → release/checkReleaseGate.d.ts} +1 -1
  175. package/dist/tools/{checkReleaseGate.js → release/checkReleaseGate.js} +3 -3
  176. package/dist/tools/release/index.d.ts +2 -0
  177. package/dist/tools/release/index.js +2 -0
  178. package/dist/tools/{releaseMode.d.ts → release/releaseMode.d.ts} +2 -2
  179. package/dist/tools/{releaseMode.js → release/releaseMode.js} +46 -26
  180. package/dist/tools/tasks/cancelTask.d.ts +11 -0
  181. package/dist/tools/tasks/cancelTask.js +85 -0
  182. package/dist/tools/{createTask.d.ts → tasks/createTask.d.ts} +12 -4
  183. package/dist/tools/{createTask.js → tasks/createTask.js} +46 -31
  184. package/dist/tools/{diagnoseTask.d.ts → tasks/diagnoseTask.d.ts} +1 -1
  185. package/dist/tools/{diagnoseTask.js → tasks/diagnoseTask.js} +8 -8
  186. package/dist/tools/{evidencePack.d.ts → tasks/evidencePack.d.ts} +6 -0
  187. package/dist/tools/tasks/evidencePack.js +387 -0
  188. package/dist/tools/{getTaskFile.js → tasks/getTaskFile.js} +4 -4
  189. package/dist/tools/{getTaskStatus.d.ts → tasks/getTaskStatus.d.ts} +6 -1
  190. package/dist/tools/{getTaskStatus.js → tasks/getTaskStatus.js} +5 -5
  191. package/dist/tools/{getTaskStdoutTail.js → tasks/getTaskStdoutTail.js} +13 -11
  192. package/dist/tools/{getTaskSummary.js → tasks/getTaskSummary.js} +33 -26
  193. package/dist/tools/tasks/index.d.ts +18 -0
  194. package/dist/tools/tasks/index.js +18 -0
  195. package/dist/tools/tasks/killTask.d.ts +1 -0
  196. package/dist/tools/{listTasks.d.ts → tasks/listTasks.d.ts} +1 -1
  197. package/dist/tools/{listTasks.js → tasks/listTasks.js} +3 -3
  198. package/dist/tools/{reconcileTasks.d.ts → tasks/reconcileTasks.d.ts} +1 -1
  199. package/dist/tools/{reconcileTasks.js → tasks/reconcileTasks.js} +64 -66
  200. package/dist/tools/{retryTask.d.ts → tasks/retryTask.d.ts} +2 -2
  201. package/dist/tools/tasks/retryTask.js +60 -0
  202. package/dist/tools/{runTaskLoop.d.ts → tasks/runTaskLoop.d.ts} +6 -6
  203. package/dist/tools/{runTaskLoop.js → tasks/runTaskLoop.js} +59 -31
  204. package/dist/tools/tasks/runVerification.js +38 -0
  205. package/dist/tools/{taskLineage.js → tasks/taskLineage.js} +8 -7
  206. package/dist/tools/{taskOutputs.js → tasks/taskOutputs.js} +17 -16
  207. package/dist/tools/{androidDoctor.js → workspace/androidDoctor.js} +16 -10
  208. package/dist/tools/{applyPatch.d.ts → workspace/applyPatch.d.ts} +1 -1
  209. package/dist/tools/workspace/applyPatch.js +53 -0
  210. package/dist/tools/{discardWorktree.js → workspace/discardWorktree.js} +3 -3
  211. package/dist/tools/workspace/index.d.ts +10 -0
  212. package/dist/tools/workspace/index.js +10 -0
  213. package/dist/tools/{listAgents.d.ts → workspace/listAgents.d.ts} +5 -0
  214. package/dist/tools/{listAgents.js → workspace/listAgents.js} +8 -4
  215. package/dist/tools/{listWorkspace.js → workspace/listWorkspace.js} +3 -3
  216. package/dist/tools/{mergeWorktree.js → workspace/mergeWorktree.js} +3 -3
  217. package/dist/tools/{readWorkspaceFile.js → workspace/readWorkspaceFile.js} +8 -8
  218. package/dist/tools/{recommendAgentForTask.js → workspace/recommendAgentForTask.js} +3 -3
  219. package/dist/tools/{searchWorkspace.js → workspace/searchWorkspace.js} +5 -5
  220. package/dist/tools/{syncFile.d.ts → workspace/syncFile.d.ts} +1 -1
  221. package/dist/tools/workspace/syncFile.js +134 -0
  222. package/dist/utils/atomicFile.d.ts +7 -0
  223. package/dist/utils/atomicFile.js +48 -0
  224. package/dist/utils/boundedFile.d.ts +8 -0
  225. package/dist/utils/boundedFile.js +93 -0
  226. package/dist/utils/lockedJsonFile.d.ts +15 -0
  227. package/dist/utils/lockedJsonFile.js +224 -0
  228. package/dist/utils/platform.d.ts +11 -0
  229. package/dist/utils/platform.js +26 -0
  230. package/dist/utils/stableJson.d.ts +2 -0
  231. package/dist/utils/stableJson.js +12 -0
  232. package/dist/version.d.ts +3 -2
  233. package/dist/version.js +3 -2
  234. package/dist/watcherStatus.d.ts +2 -2
  235. package/dist/watcherStatus.js +18 -0
  236. package/docs/CODE_WIKI.md +1648 -0
  237. package/docs/agentseal-integration.md +150 -0
  238. package/docs/architecture.md +23 -0
  239. package/docs/assets/patchwarden-desktop-onboarding.png +0 -0
  240. package/docs/assets/patchwarden-oss-demo.gif +0 -0
  241. package/docs/control-center/README.md +4 -4
  242. package/docs/dashboard-overview.md +86 -0
  243. package/docs/demo.md +8 -0
  244. package/docs/desktop-app.md +175 -0
  245. package/docs/direct-session-workflow.md +98 -0
  246. package/docs/evidence-pack-schema.md +215 -0
  247. package/docs/lineage-evidence-pack-workflow.md +127 -0
  248. package/docs/mcp-inspector-testing.md +200 -0
  249. package/docs/open-source-application.md +168 -0
  250. package/docs/opencode-worker.md +151 -0
  251. package/docs/openhands-worker.md +181 -0
  252. package/docs/release-checklist.md +1 -1
  253. package/docs/release-evidence.md +82 -0
  254. package/docs/spec-kit-integration.md +131 -0
  255. package/docs/task-safe-review-workflow.md +98 -0
  256. package/docs/threat-model.md +97 -0
  257. package/docs/user-feedback.md +40 -0
  258. package/docs/why-patchwarden.md +110 -0
  259. package/examples/config.example.json +4 -2
  260. package/package.json +28 -11
  261. package/scripts/README.md +15 -6
  262. package/scripts/build.js +11 -0
  263. package/scripts/checks/brand-check.js +3 -0
  264. package/scripts/checks/build-output-check.js +37 -0
  265. package/scripts/checks/control-center-smoke.js +447 -6
  266. package/scripts/checks/control-smoke.js +19 -8
  267. package/scripts/checks/http-mcp-smoke.js +82 -4
  268. package/scripts/checks/lifecycle-smoke.js +39 -33
  269. package/scripts/checks/mcp-manifest-check.js +1 -1
  270. package/scripts/checks/mcp-smoke.js +30 -4
  271. package/scripts/checks/package-manifest-check.js +20 -7
  272. package/scripts/checks/unit-tests.js +3 -5
  273. package/scripts/checks/watcher-supervisor-smoke.js +9 -0
  274. package/scripts/control/get-patchwarden-health.ps1 +1 -1
  275. package/scripts/control/manage-patchwarden.ps1 +69 -4
  276. package/scripts/control/provision-patchwarden-tunnel.ps1 +127 -0
  277. package/scripts/control/run-background-supervisor.ps1 +41 -0
  278. package/scripts/control/start-patchwarden-tunnel.ps1 +126 -32
  279. package/scripts/generate-demo-gif.py +320 -0
  280. package/{PatchWarden-Control-Tray.cmd → scripts/launchers/PatchWarden-Control-Tray.cmd} +3 -3
  281. package/scripts/launchers/PatchWarden-Control.cmd +6 -0
  282. package/{PatchWarden-Desktop.cmd → scripts/launchers/PatchWarden-Desktop.cmd} +2 -2
  283. package/scripts/launchers/Restart-PatchWarden-Control.cmd +6 -0
  284. package/{Stop-PatchWarden.cmd → scripts/launchers/Stop-PatchWarden.cmd} +2 -2
  285. package/scripts/lib/clean-generated-output.js +11 -0
  286. package/scripts/lib/file-discovery.js +12 -0
  287. package/scripts/release/desktop-preflight.js +211 -0
  288. package/scripts/release/pack-clean.js +59 -14
  289. package/src/assessments/agentAssessor.ts +29 -15
  290. package/src/assessments/assessmentStore.ts +55 -43
  291. package/src/assessments/confirmCli.ts +5 -4
  292. package/src/config.ts +105 -11
  293. package/src/control/fileManager.ts +40 -0
  294. package/src/control/middleware/auth.ts +35 -0
  295. package/src/control/middleware/static.ts +84 -0
  296. package/src/control/routeTable.ts +301 -0
  297. package/src/control/routes/audit.ts +329 -0
  298. package/src/control/routes/evidence.ts +107 -0
  299. package/src/control/routes/lineage.ts +92 -0
  300. package/src/control/routes/policy.ts +81 -0
  301. package/src/control/routes/process.ts +505 -0
  302. package/src/control/routes/sessions.ts +314 -0
  303. package/src/control/routes/status.ts +405 -0
  304. package/src/control/routes/taskActions.ts +214 -0
  305. package/src/control/routes/tasks.ts +331 -0
  306. package/src/control/routes/workspace.ts +234 -0
  307. package/src/control/runtime.ts +508 -0
  308. package/src/control/server.ts +165 -0
  309. package/src/control/shared.ts +360 -0
  310. package/src/controlCenter.ts +7 -2347
  311. package/src/direct/directAudit.ts +17 -9
  312. package/src/direct/directGuards.ts +100 -51
  313. package/src/direct/directPatch.ts +95 -8
  314. package/src/direct/directSessionStore.ts +211 -55
  315. package/src/direct/directVerification.ts +9 -23
  316. package/src/doctor.ts +766 -492
  317. package/src/goal/acceptanceEngine.ts +1 -1
  318. package/src/goal/goalProgress.ts +17 -13
  319. package/src/goal/goalReport.ts +263 -0
  320. package/src/goal/goalStatus.ts +25 -3
  321. package/src/goal/goalStore.ts +241 -54
  322. package/src/goal/handoffExport.ts +6 -6
  323. package/src/goal/specKitImport.ts +355 -0
  324. package/src/goal/subgoalSync.ts +15 -10
  325. package/src/goal/worktreeManager.ts +139 -22
  326. package/src/httpServer.ts +130 -44
  327. package/src/index.ts +7 -4
  328. package/src/logging.ts +20 -4
  329. package/src/policy/projectPolicy.ts +5 -2
  330. package/src/release/releaseGate.ts +74 -27
  331. package/src/runner/agentInvocation.ts +126 -4
  332. package/src/runner/changeCapture.ts +342 -80
  333. package/src/runner/cli.ts +7 -6
  334. package/src/runner/postTaskCleanup.ts +55 -7
  335. package/src/runner/processSecurity.ts +433 -0
  336. package/src/runner/runTask.ts +441 -292
  337. package/src/runner/simpleProcess.ts +68 -33
  338. package/src/{taskProgress.ts → runner/taskProgress.ts} +3 -3
  339. package/src/{taskRuntime.ts → runner/taskRuntime.ts} +4 -3
  340. package/src/runner/taskStatusStore.ts +54 -0
  341. package/src/runner/watch.ts +290 -57
  342. package/src/security/contentRedaction.ts +31 -2
  343. package/src/security/discoveryTokenStore.ts +18 -4
  344. package/src/security/loopbackHost.ts +19 -0
  345. package/src/security/pathGuard.ts +35 -16
  346. package/src/security/planGuard.ts +2 -1
  347. package/src/security/runtimeGuard.ts +9 -6
  348. package/src/security/secretComparison.ts +13 -0
  349. package/src/security/sensitiveGuard.ts +27 -8
  350. package/src/security/toolInvocationGuard.ts +2 -2
  351. package/src/security/workspaceRootGuard.ts +53 -0
  352. package/src/smoke-test.ts +276 -273
  353. package/src/tools/catalog/index.ts +4 -0
  354. package/src/tools/{toolCatalog.ts → catalog/toolCatalog.ts} +3 -12
  355. package/src/tools/{toolRegistry.ts → catalog/toolRegistry.ts} +29 -16
  356. package/src/tools/definitions/toolDefs.ts +1264 -0
  357. package/src/tools/{auditSession.ts → diagnostics/auditSession.ts} +2 -2
  358. package/src/tools/{auditTask.ts → diagnostics/auditTask.ts} +196 -89
  359. package/src/tools/{healthCheck.ts → diagnostics/healthCheck.ts} +11 -11
  360. package/src/tools/diagnostics/index.ts +6 -0
  361. package/src/tools/{safeStatus.ts → diagnostics/safeStatus.ts} +7 -7
  362. package/src/tools/{safeViews.ts → diagnostics/safeViews.ts} +29 -19
  363. package/src/tools/{schemaDriftCheck.ts → diagnostics/schemaDriftCheck.ts} +3 -3
  364. package/src/tools/{createDirectSession.ts → direct/createDirectSession.ts} +9 -9
  365. package/src/tools/{finalizeDirectSession.ts → direct/finalizeDirectSession.ts} +11 -9
  366. package/src/tools/direct/index.ts +3 -0
  367. package/src/tools/{runDirectVerificationBundle.ts → direct/runDirectVerificationBundle.ts} +2 -2
  368. package/src/tools/{discoverTools.ts → discovery/discoverTools.ts} +6 -6
  369. package/src/tools/{explainTool.ts → discovery/explainTool.ts} +3 -3
  370. package/src/tools/discovery/index.ts +3 -0
  371. package/src/tools/{invokeDiscoveredTool.ts → discovery/invokeDiscoveredTool.ts} +7 -7
  372. package/src/tools/dispatch/coreDispatch.ts +379 -0
  373. package/src/tools/dispatch/diagnosticDispatch.ts +106 -0
  374. package/src/tools/dispatch/directDispatch.ts +168 -0
  375. package/src/tools/dispatch/goalDispatch.ts +128 -0
  376. package/src/tools/dispatch/releaseDispatch.ts +66 -0
  377. package/src/tools/dispatch/types.ts +24 -0
  378. package/src/tools/dispatch/validation.ts +78 -0
  379. package/src/tools/{getPlan.ts → goals/getPlan.ts} +4 -4
  380. package/src/tools/{goalSubgoalTask.ts → goals/goalSubgoalTask.ts} +43 -28
  381. package/src/tools/goals/index.ts +3 -0
  382. package/src/tools/{savePlan.ts → goals/savePlan.ts} +38 -8
  383. package/src/tools/registry.ts +54 -1858
  384. package/src/tools/{checkReleaseGate.ts → release/checkReleaseGate.ts} +3 -3
  385. package/src/tools/release/index.ts +2 -0
  386. package/src/tools/{releaseMode.ts → release/releaseMode.ts} +42 -24
  387. package/src/tools/tasks/cancelTask.ts +109 -0
  388. package/src/tools/{createTask.ts → tasks/createTask.ts} +56 -33
  389. package/src/tools/{diagnoseTask.ts → tasks/diagnoseTask.ts} +8 -8
  390. package/src/tools/tasks/evidencePack.ts +504 -0
  391. package/src/tools/{getTaskFile.ts → tasks/getTaskFile.ts} +4 -4
  392. package/src/tools/{getTaskStatus.ts → tasks/getTaskStatus.ts} +7 -5
  393. package/src/tools/{getTaskStdoutTail.ts → tasks/getTaskStdoutTail.ts} +13 -11
  394. package/src/tools/{getTaskSummary.ts → tasks/getTaskSummary.ts} +44 -33
  395. package/src/tools/tasks/index.ts +18 -0
  396. package/src/tools/{listTasks.ts → tasks/listTasks.ts} +4 -4
  397. package/src/tools/{reconcileTasks.ts → tasks/reconcileTasks.ts} +68 -66
  398. package/src/tools/tasks/retryTask.ts +69 -0
  399. package/src/tools/{runTaskLoop.ts → tasks/runTaskLoop.ts} +70 -35
  400. package/src/tools/{runVerification.ts → tasks/runVerification.ts} +6 -3
  401. package/src/tools/{taskLineage.ts → tasks/taskLineage.ts} +8 -7
  402. package/src/tools/{taskOutputs.ts → tasks/taskOutputs.ts} +27 -20
  403. package/src/tools/{androidDoctor.ts → workspace/androidDoctor.ts} +15 -10
  404. package/src/tools/{applyPatch.ts → workspace/applyPatch.ts} +38 -16
  405. package/src/tools/{discardWorktree.ts → workspace/discardWorktree.ts} +3 -3
  406. package/src/tools/workspace/index.ts +10 -0
  407. package/src/tools/{listAgents.ts → workspace/listAgents.ts} +11 -4
  408. package/src/tools/{listWorkspace.ts → workspace/listWorkspace.ts} +3 -3
  409. package/src/tools/{mergeWorktree.ts → workspace/mergeWorktree.ts} +3 -3
  410. package/src/tools/{readWorkspaceFile.ts → workspace/readWorkspaceFile.ts} +8 -8
  411. package/src/tools/{recommendAgentForTask.ts → workspace/recommendAgentForTask.ts} +3 -3
  412. package/src/tools/{searchWorkspace.ts → workspace/searchWorkspace.ts} +5 -5
  413. package/src/tools/workspace/syncFile.ts +292 -0
  414. package/src/utils/atomicFile.ts +58 -0
  415. package/src/utils/boundedFile.ts +116 -0
  416. package/src/utils/lockedJsonFile.ts +251 -0
  417. package/src/utils/platform.ts +31 -0
  418. package/src/utils/stableJson.ts +12 -0
  419. package/src/version.ts +3 -2
  420. package/src/watcherStatus.ts +19 -1
  421. package/ui/desktop-bootstrap.js +11 -0
  422. package/ui/desktop-bridge.js +36 -0
  423. package/ui/desktop.css +160 -0
  424. package/ui/getting-started.js +93 -0
  425. package/ui/i18n.js +484 -0
  426. package/ui/log-parser.js +30 -0
  427. package/ui/pages/audit.html +204 -3
  428. package/ui/pages/dashboard.html +937 -79
  429. package/ui/pages/direct-sessions.html +609 -60
  430. package/ui/pages/getting-started.html +43 -0
  431. package/ui/pages/logs.html +105 -22
  432. package/ui/pages/settings.html +101 -0
  433. package/ui/pages/task-detail.html +468 -438
  434. package/ui/pages/tasks.html +648 -65
  435. package/ui/pages/workspace.html +38 -1
  436. package/ui/settings.js +245 -0
  437. package/PatchWarden-Control.cmd +0 -6
  438. package/Restart-PatchWarden-Control.cmd +0 -6
  439. package/dist/test/unit/acceptance-engine.test.d.ts +0 -1
  440. package/dist/test/unit/acceptance-engine.test.js +0 -228
  441. package/dist/test/unit/agent-router.test.d.ts +0 -1
  442. package/dist/test/unit/agent-router.test.js +0 -287
  443. package/dist/test/unit/android-doctor.test.d.ts +0 -1
  444. package/dist/test/unit/android-doctor.test.js +0 -118
  445. package/dist/test/unit/audit-checks.test.d.ts +0 -1
  446. package/dist/test/unit/audit-checks.test.js +0 -350
  447. package/dist/test/unit/chinese-path.test.d.ts +0 -1
  448. package/dist/test/unit/chinese-path.test.js +0 -91
  449. package/dist/test/unit/command-guard.test.d.ts +0 -1
  450. package/dist/test/unit/command-guard.test.js +0 -160
  451. package/dist/test/unit/diagnose-task.test.d.ts +0 -1
  452. package/dist/test/unit/diagnose-task.test.js +0 -457
  453. package/dist/test/unit/direct-guards.test.d.ts +0 -1
  454. package/dist/test/unit/direct-guards.test.js +0 -213
  455. package/dist/test/unit/discovery-token-store.test.d.ts +0 -1
  456. package/dist/test/unit/discovery-token-store.test.js +0 -139
  457. package/dist/test/unit/evidence-pack.test.d.ts +0 -1
  458. package/dist/test/unit/evidence-pack.test.js +0 -130
  459. package/dist/test/unit/goal-graph.test.d.ts +0 -1
  460. package/dist/test/unit/goal-graph.test.js +0 -298
  461. package/dist/test/unit/goal-progress.test.d.ts +0 -1
  462. package/dist/test/unit/goal-progress.test.js +0 -381
  463. package/dist/test/unit/goal-status.test.d.ts +0 -1
  464. package/dist/test/unit/goal-status.test.js +0 -215
  465. package/dist/test/unit/goal-store.test.d.ts +0 -1
  466. package/dist/test/unit/goal-store.test.js +0 -253
  467. package/dist/test/unit/goal-subgoal-task.test.d.ts +0 -1
  468. package/dist/test/unit/goal-subgoal-task.test.js +0 -55
  469. package/dist/test/unit/goal-tools-registry.test.d.ts +0 -1
  470. package/dist/test/unit/goal-tools-registry.test.js +0 -190
  471. package/dist/test/unit/handoff-export.test.d.ts +0 -1
  472. package/dist/test/unit/handoff-export.test.js +0 -263
  473. package/dist/test/unit/invoke-discovered-tool.test.d.ts +0 -1
  474. package/dist/test/unit/invoke-discovered-tool.test.js +0 -167
  475. package/dist/test/unit/logging.test.d.ts +0 -1
  476. package/dist/test/unit/logging.test.js +0 -397
  477. package/dist/test/unit/path-guard.test.d.ts +0 -1
  478. package/dist/test/unit/path-guard.test.js +0 -109
  479. package/dist/test/unit/post-task-cleanup.test.d.ts +0 -1
  480. package/dist/test/unit/post-task-cleanup.test.js +0 -48
  481. package/dist/test/unit/project-policy-release-mode.test.d.ts +0 -1
  482. package/dist/test/unit/project-policy-release-mode.test.js +0 -125
  483. package/dist/test/unit/reconcile-tasks.test.d.ts +0 -1
  484. package/dist/test/unit/reconcile-tasks.test.js +0 -456
  485. package/dist/test/unit/release-gate.test.d.ts +0 -1
  486. package/dist/test/unit/release-gate.test.js +0 -242
  487. package/dist/test/unit/run-task-loop.test.d.ts +0 -1
  488. package/dist/test/unit/run-task-loop.test.js +0 -380
  489. package/dist/test/unit/safe-status.test.d.ts +0 -1
  490. package/dist/test/unit/safe-status.test.js +0 -165
  491. package/dist/test/unit/safe-views.test.d.ts +0 -1
  492. package/dist/test/unit/safe-views.test.js +0 -171
  493. package/dist/test/unit/schema-drift-check.test.d.ts +0 -1
  494. package/dist/test/unit/schema-drift-check.test.js +0 -176
  495. package/dist/test/unit/sensitive-guard.test.d.ts +0 -1
  496. package/dist/test/unit/sensitive-guard.test.js +0 -104
  497. package/dist/test/unit/subgoal-sync.test.d.ts +0 -1
  498. package/dist/test/unit/subgoal-sync.test.js +0 -183
  499. package/dist/test/unit/sync-file.test.d.ts +0 -1
  500. package/dist/test/unit/sync-file.test.js +0 -154
  501. package/dist/test/unit/tool-invocation-guard.test.d.ts +0 -1
  502. package/dist/test/unit/tool-invocation-guard.test.js +0 -432
  503. package/dist/test/unit/tool-usage-stats.test.d.ts +0 -1
  504. package/dist/test/unit/tool-usage-stats.test.js +0 -300
  505. package/dist/test/unit/toolSearch.test.d.ts +0 -1
  506. package/dist/test/unit/toolSearch.test.js +0 -571
  507. package/dist/test/unit/watcher-status.test.d.ts +0 -1
  508. package/dist/test/unit/watcher-status.test.js +0 -169
  509. package/dist/test/unit/worktree-manager.test.d.ts +0 -1
  510. package/dist/test/unit/worktree-manager.test.js +0 -176
  511. package/dist/tools/applyPatch.js +0 -41
  512. package/dist/tools/cancelTask.d.ts +0 -30
  513. package/dist/tools/cancelTask.js +0 -64
  514. package/dist/tools/evidencePack.js +0 -168
  515. package/dist/tools/finalizeDirectSession.js +0 -84
  516. package/dist/tools/goalSubgoalTask.js +0 -110
  517. package/dist/tools/killTask.d.ts +0 -15
  518. package/dist/tools/retryTask.js +0 -45
  519. package/dist/tools/runVerification.js +0 -36
  520. package/dist/tools/syncFile.js +0 -65
  521. package/docs/control-center/control-center-daily-driver.md +0 -211
  522. package/docs/control-center/control-center-mvp.md +0 -205
  523. package/docs/control-center/control-center-phase2.md +0 -159
  524. package/docs/release-v0.6.0.md +0 -71
  525. package/docs/release-v0.6.1.md +0 -75
  526. package/docs/release-v0.6.4.md +0 -45
  527. package/src/test/unit/acceptance-engine.test.ts +0 -261
  528. package/src/test/unit/agent-router.test.ts +0 -342
  529. package/src/test/unit/android-doctor.test.ts +0 -158
  530. package/src/test/unit/audit-checks.test.ts +0 -567
  531. package/src/test/unit/chinese-path.test.ts +0 -106
  532. package/src/test/unit/command-guard.test.ts +0 -221
  533. package/src/test/unit/diagnose-task.test.ts +0 -544
  534. package/src/test/unit/direct-guards.test.ts +0 -297
  535. package/src/test/unit/discovery-token-store.test.ts +0 -181
  536. package/src/test/unit/evidence-pack.test.ts +0 -142
  537. package/src/test/unit/goal-graph.test.ts +0 -347
  538. package/src/test/unit/goal-progress.test.ts +0 -538
  539. package/src/test/unit/goal-status.test.ts +0 -270
  540. package/src/test/unit/goal-store.test.ts +0 -318
  541. package/src/test/unit/goal-subgoal-task.test.ts +0 -72
  542. package/src/test/unit/goal-tools-registry.test.ts +0 -243
  543. package/src/test/unit/handoff-export.test.ts +0 -295
  544. package/src/test/unit/invoke-discovered-tool.test.ts +0 -216
  545. package/src/test/unit/logging.test.ts +0 -497
  546. package/src/test/unit/path-guard.test.ts +0 -150
  547. package/src/test/unit/post-task-cleanup.test.ts +0 -53
  548. package/src/test/unit/project-policy-release-mode.test.ts +0 -156
  549. package/src/test/unit/reconcile-tasks.test.ts +0 -551
  550. package/src/test/unit/release-gate.test.ts +0 -314
  551. package/src/test/unit/run-task-loop.test.ts +0 -425
  552. package/src/test/unit/safe-status.test.ts +0 -187
  553. package/src/test/unit/safe-views.test.ts +0 -184
  554. package/src/test/unit/schema-drift-check.test.ts +0 -260
  555. package/src/test/unit/sensitive-guard.test.ts +0 -124
  556. package/src/test/unit/subgoal-sync.test.ts +0 -236
  557. package/src/test/unit/sync-file.test.ts +0 -231
  558. package/src/test/unit/tool-invocation-guard.test.ts +0 -542
  559. package/src/test/unit/tool-usage-stats.test.ts +0 -384
  560. package/src/test/unit/toolSearch.test.ts +0 -756
  561. package/src/test/unit/watcher-status.test.ts +0 -190
  562. package/src/test/unit/worktree-manager.test.ts +0 -247
  563. package/src/tools/cancelTask.ts +0 -70
  564. package/src/tools/evidencePack.ts +0 -205
  565. package/src/tools/retryTask.ts +0 -53
  566. package/src/tools/syncFile.ts +0 -122
  567. /package/dist/tools/{toolCatalog.d.ts → catalog/toolCatalog.d.ts} +0 -0
  568. /package/dist/tools/{toolSearch.d.ts → catalog/toolSearch.d.ts} +0 -0
  569. /package/dist/tools/{toolSearch.js → catalog/toolSearch.js} +0 -0
  570. /package/dist/tools/{toolUsageStats.d.ts → catalog/toolUsageStats.d.ts} +0 -0
  571. /package/dist/tools/{toolUsageStats.js → catalog/toolUsageStats.js} +0 -0
  572. /package/dist/tools/{runDirectVerificationBundle.d.ts → direct/runDirectVerificationBundle.d.ts} +0 -0
  573. /package/dist/tools/{getPlan.d.ts → goals/getPlan.d.ts} +0 -0
  574. /package/dist/tools/{savePlan.d.ts → goals/savePlan.d.ts} +0 -0
  575. /package/dist/tools/{getTaskFile.d.ts → tasks/getTaskFile.d.ts} +0 -0
  576. /package/dist/tools/{getTaskProgress.d.ts → tasks/getTaskProgress.d.ts} +0 -0
  577. /package/dist/tools/{getTaskProgress.js → tasks/getTaskProgress.js} +0 -0
  578. /package/dist/tools/{getTaskStdoutTail.d.ts → tasks/getTaskStdoutTail.d.ts} +0 -0
  579. /package/dist/tools/{getTaskSummary.d.ts → tasks/getTaskSummary.d.ts} +0 -0
  580. /package/dist/tools/{killTask.js → tasks/killTask.js} +0 -0
  581. /package/dist/tools/{runVerification.d.ts → tasks/runVerification.d.ts} +0 -0
  582. /package/dist/tools/{taskLineage.d.ts → tasks/taskLineage.d.ts} +0 -0
  583. /package/dist/tools/{taskOutputs.d.ts → tasks/taskOutputs.d.ts} +0 -0
  584. /package/dist/tools/{waitForTask.d.ts → tasks/waitForTask.d.ts} +0 -0
  585. /package/dist/tools/{waitForTask.js → tasks/waitForTask.js} +0 -0
  586. /package/dist/tools/{androidDoctor.d.ts → workspace/androidDoctor.d.ts} +0 -0
  587. /package/dist/tools/{discardWorktree.d.ts → workspace/discardWorktree.d.ts} +0 -0
  588. /package/dist/tools/{listWorkspace.d.ts → workspace/listWorkspace.d.ts} +0 -0
  589. /package/dist/tools/{mergeWorktree.d.ts → workspace/mergeWorktree.d.ts} +0 -0
  590. /package/dist/tools/{readWorkspaceFile.d.ts → workspace/readWorkspaceFile.d.ts} +0 -0
  591. /package/dist/tools/{recommendAgentForTask.d.ts → workspace/recommendAgentForTask.d.ts} +0 -0
  592. /package/dist/tools/{searchWorkspace.d.ts → workspace/searchWorkspace.d.ts} +0 -0
  593. /package/src/tools/{toolSearch.ts → catalog/toolSearch.ts} +0 -0
  594. /package/src/tools/{toolUsageStats.ts → catalog/toolUsageStats.ts} +0 -0
  595. /package/src/tools/{getTaskProgress.ts → tasks/getTaskProgress.ts} +0 -0
  596. /package/src/tools/{killTask.ts → tasks/killTask.ts} +0 -0
  597. /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/)。
@@ -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
+ ![PatchWarden OSS demo](assets/patchwarden-oss-demo.gif)
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` — 隐藏过期会话