patchwarden 1.5.1 → 1.6.2

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 (591) hide show
  1. package/PatchWarden.cmd +32 -2
  2. package/README.en.md +158 -26
  3. package/README.md +124 -24
  4. package/dist/assessments/agentAssessor.js +21 -12
  5. package/dist/assessments/assessmentDiagnostics.d.ts +29 -0
  6. package/dist/assessments/assessmentDiagnostics.js +132 -0
  7. package/dist/assessments/assessmentStore.d.ts +39 -0
  8. package/dist/assessments/assessmentStore.js +207 -45
  9. package/dist/assessments/securitySnapshot.d.ts +50 -0
  10. package/dist/assessments/securitySnapshot.js +158 -0
  11. package/dist/config.d.ts +15 -0
  12. package/dist/config.js +66 -13
  13. package/dist/control/fileManager.d.ts +2 -0
  14. package/dist/control/fileManager.js +39 -0
  15. package/dist/control/middleware/auth.d.ts +6 -0
  16. package/dist/control/middleware/auth.js +14 -5
  17. package/dist/control/middleware/static.js +16 -3
  18. package/dist/control/routeTable.d.ts +24 -0
  19. package/dist/control/routeTable.js +263 -0
  20. package/dist/control/routes/audit.js +17 -7
  21. package/dist/control/routes/evidence.js +1 -1
  22. package/dist/control/routes/lineage.js +1 -1
  23. package/dist/control/routes/process.d.ts +7 -0
  24. package/dist/control/routes/process.js +329 -42
  25. package/dist/control/routes/sessions.d.ts +9 -1
  26. package/dist/control/routes/sessions.js +84 -21
  27. package/dist/control/routes/status.d.ts +60 -1
  28. package/dist/control/routes/status.js +94 -15
  29. package/dist/control/routes/taskActions.js +24 -60
  30. package/dist/control/routes/tasks.d.ts +4 -0
  31. package/dist/control/routes/tasks.js +61 -62
  32. package/dist/control/routes/workspace.js +50 -23
  33. package/dist/control/runtime.d.ts +3 -2
  34. package/dist/control/runtime.js +65 -40
  35. package/dist/control/server.js +37 -365
  36. package/dist/control/shared.d.ts +25 -1
  37. package/dist/control/shared.js +64 -11
  38. package/dist/diagnostics/allowedTestCommandSafety.d.ts +1 -0
  39. package/dist/diagnostics/allowedTestCommandSafety.js +11 -0
  40. package/dist/direct/directAudit.js +234 -225
  41. package/dist/direct/directGuards.d.ts +2 -1
  42. package/dist/direct/directGuards.js +42 -29
  43. package/dist/direct/directPatch.d.ts +6 -1
  44. package/dist/direct/directPatch.js +55 -8
  45. package/dist/direct/directSessionStore.d.ts +16 -6
  46. package/dist/direct/directSessionStore.js +128 -35
  47. package/dist/direct/directVerification.js +8 -16
  48. package/dist/doctor.js +65 -57
  49. package/dist/goal/acceptanceEngine.d.ts +1 -1
  50. package/dist/goal/goalProgress.js +75 -69
  51. package/dist/goal/goalReport.js +5 -12
  52. package/dist/goal/goalStatus.d.ts +2 -0
  53. package/dist/goal/goalStatus.js +10 -3
  54. package/dist/goal/goalStore.d.ts +9 -2
  55. package/dist/goal/goalStore.js +152 -45
  56. package/dist/goal/handoffExport.js +6 -6
  57. package/dist/goal/specKitImport.js +97 -96
  58. package/dist/goal/subgoalSync.js +11 -9
  59. package/dist/goal/worktreeManager.d.ts +2 -0
  60. package/dist/goal/worktreeManager.js +209 -136
  61. package/dist/httpServer.js +111 -32
  62. package/dist/logging.js +5 -3
  63. package/dist/policy/projectPolicy.js +5 -2
  64. package/dist/release/releaseGate.d.ts +1 -1
  65. package/dist/release/releaseGate.js +78 -25
  66. package/dist/runner/agentInvocation.d.ts +14 -0
  67. package/dist/runner/agentInvocation.js +96 -4
  68. package/dist/runner/changeCapture.d.ts +13 -5
  69. package/dist/runner/changeCapture.js +243 -61
  70. package/dist/runner/postTaskCleanup.js +48 -19
  71. package/dist/runner/processSecurity.d.ts +56 -0
  72. package/dist/runner/processSecurity.js +373 -0
  73. package/dist/runner/runTask.d.ts +2 -1
  74. package/dist/runner/runTask.js +162 -93
  75. package/dist/runner/simpleProcess.d.ts +3 -0
  76. package/dist/runner/simpleProcess.js +50 -36
  77. package/dist/{taskProgress.d.ts → runner/taskProgress.d.ts} +1 -1
  78. package/dist/{taskProgress.js → runner/taskProgress.js} +2 -2
  79. package/dist/{taskRuntime.d.ts → runner/taskRuntime.d.ts} +3 -1
  80. package/dist/{taskRuntime.js → runner/taskRuntime.js} +3 -2
  81. package/dist/runner/taskStatusStore.d.ts +11 -0
  82. package/dist/runner/taskStatusStore.js +35 -0
  83. package/dist/runner/watch.d.ts +14 -1
  84. package/dist/runner/watch.js +320 -49
  85. package/dist/security/contentRedaction.js +2 -2
  86. package/dist/security/discoveryTokenStore.d.ts +3 -2
  87. package/dist/security/discoveryTokenStore.js +17 -2
  88. package/dist/security/loopbackHost.d.ts +2 -0
  89. package/dist/security/loopbackHost.js +16 -0
  90. package/dist/security/pathGuard.js +32 -17
  91. package/dist/security/planGuard.js +2 -1
  92. package/dist/security/runtimeGuard.js +9 -6
  93. package/dist/security/secretComparison.d.ts +3 -0
  94. package/dist/security/secretComparison.js +11 -0
  95. package/dist/security/sensitiveGuard.d.ts +5 -0
  96. package/dist/security/sensitiveGuard.js +27 -8
  97. package/dist/security/toolInvocationGuard.d.ts +2 -2
  98. package/dist/security/toolInvocationGuard.js +1 -1
  99. package/dist/security/workspaceRootGuard.d.ts +8 -0
  100. package/dist/security/workspaceRootGuard.js +47 -0
  101. package/dist/smoke-test.js +27 -26
  102. package/dist/tools/catalog/index.d.ts +4 -0
  103. package/dist/tools/catalog/index.js +4 -0
  104. package/dist/tools/{toolCatalog.js → catalog/toolCatalog.js} +3 -12
  105. package/dist/tools/{toolRegistry.d.ts → catalog/toolRegistry.d.ts} +3 -3
  106. package/dist/tools/{toolRegistry.js → catalog/toolRegistry.js} +6 -15
  107. package/dist/tools/definitions/toolDefs.d.ts +18 -0
  108. package/dist/tools/definitions/toolDefs.js +1177 -0
  109. package/dist/tools/{auditSession.d.ts → diagnostics/auditSession.d.ts} +1 -1
  110. package/dist/tools/{auditSession.js → diagnostics/auditSession.js} +2 -2
  111. package/dist/tools/{auditTask.d.ts → diagnostics/auditTask.d.ts} +2 -1
  112. package/dist/tools/{auditTask.js → diagnostics/auditTask.js} +134 -36
  113. package/dist/tools/{healthCheck.d.ts → diagnostics/healthCheck.d.ts} +18 -6
  114. package/dist/tools/{healthCheck.js → diagnostics/healthCheck.js} +36 -8
  115. package/dist/tools/diagnostics/index.d.ts +6 -0
  116. package/dist/tools/diagnostics/index.js +6 -0
  117. package/dist/tools/{safeStatus.d.ts → diagnostics/safeStatus.d.ts} +3 -3
  118. package/dist/tools/{safeStatus.js → diagnostics/safeStatus.js} +6 -6
  119. package/dist/tools/{safeViews.d.ts → diagnostics/safeViews.d.ts} +12 -8
  120. package/dist/tools/{safeViews.js → diagnostics/safeViews.js} +23 -13
  121. package/dist/tools/{schemaDriftCheck.d.ts → diagnostics/schemaDriftCheck.d.ts} +1 -1
  122. package/dist/tools/{schemaDriftCheck.js → diagnostics/schemaDriftCheck.js} +2 -2
  123. package/dist/tools/{createDirectSession.js → direct/createDirectSession.js} +6 -6
  124. package/dist/tools/{finalizeDirectSession.d.ts → direct/finalizeDirectSession.d.ts} +1 -1
  125. package/dist/tools/direct/finalizeDirectSession.js +86 -0
  126. package/dist/tools/direct/index.d.ts +3 -0
  127. package/dist/tools/direct/index.js +3 -0
  128. package/dist/tools/{runDirectVerificationBundle.js → direct/runDirectVerificationBundle.js} +2 -2
  129. package/dist/tools/{discoverTools.d.ts → discovery/discoverTools.d.ts} +2 -2
  130. package/dist/tools/{discoverTools.js → discovery/discoverTools.js} +5 -5
  131. package/dist/tools/{explainTool.d.ts → discovery/explainTool.d.ts} +2 -2
  132. package/dist/tools/{explainTool.js → discovery/explainTool.js} +2 -2
  133. package/dist/tools/discovery/index.d.ts +3 -0
  134. package/dist/tools/discovery/index.js +3 -0
  135. package/dist/tools/{invokeDiscoveredTool.d.ts → discovery/invokeDiscoveredTool.d.ts} +2 -2
  136. package/dist/tools/{invokeDiscoveredTool.js → discovery/invokeDiscoveredTool.js} +5 -5
  137. package/dist/tools/dispatch/coreDispatch.js +32 -31
  138. package/dist/tools/dispatch/diagnosticDispatch.d.ts +3 -5
  139. package/dist/tools/dispatch/diagnosticDispatch.js +70 -68
  140. package/dist/tools/dispatch/directDispatch.js +11 -10
  141. package/dist/tools/dispatch/goalDispatch.js +5 -4
  142. package/dist/tools/dispatch/releaseDispatch.js +3 -2
  143. package/dist/tools/dispatch/validation.d.ts +7 -0
  144. package/dist/tools/dispatch/validation.js +71 -0
  145. package/dist/tools/{getPlan.js → goals/getPlan.js} +4 -4
  146. package/dist/tools/{goalSubgoalTask.d.ts → goals/goalSubgoalTask.d.ts} +1 -1
  147. package/dist/tools/goals/goalSubgoalTask.js +118 -0
  148. package/dist/tools/goals/index.d.ts +3 -0
  149. package/dist/tools/goals/index.js +3 -0
  150. package/dist/tools/{savePlan.js → goals/savePlan.js} +28 -8
  151. package/dist/tools/registry.d.ts +7 -11
  152. package/dist/tools/registry.js +17 -1178
  153. package/dist/tools/{checkReleaseGate.d.ts → release/checkReleaseGate.d.ts} +1 -1
  154. package/dist/tools/{checkReleaseGate.js → release/checkReleaseGate.js} +3 -3
  155. package/dist/tools/release/index.d.ts +2 -0
  156. package/dist/tools/release/index.js +2 -0
  157. package/dist/tools/{releaseMode.d.ts → release/releaseMode.d.ts} +2 -2
  158. package/dist/tools/{releaseMode.js → release/releaseMode.js} +46 -26
  159. package/dist/tools/tasks/cancelTask.d.ts +11 -0
  160. package/dist/tools/tasks/cancelTask.js +86 -0
  161. package/dist/tools/{createTask.d.ts → tasks/createTask.d.ts} +12 -4
  162. package/dist/tools/{createTask.js → tasks/createTask.js} +110 -34
  163. package/dist/tools/{diagnoseTask.d.ts → tasks/diagnoseTask.d.ts} +1 -1
  164. package/dist/tools/{diagnoseTask.js → tasks/diagnoseTask.js} +12 -16
  165. package/dist/tools/{evidencePack.js → tasks/evidencePack.js} +34 -22
  166. package/dist/tools/{getTaskFile.js → tasks/getTaskFile.js} +4 -4
  167. package/dist/tools/{getTaskStatus.d.ts → tasks/getTaskStatus.d.ts} +6 -1
  168. package/dist/tools/{getTaskStatus.js → tasks/getTaskStatus.js} +11 -6
  169. package/dist/tools/{getTaskStdoutTail.js → tasks/getTaskStdoutTail.js} +13 -11
  170. package/dist/tools/{getTaskSummary.js → tasks/getTaskSummary.js} +35 -36
  171. package/dist/tools/tasks/index.d.ts +18 -0
  172. package/dist/tools/tasks/index.js +18 -0
  173. package/dist/tools/tasks/killTask.d.ts +1 -0
  174. package/dist/tools/{listTasks.d.ts → tasks/listTasks.d.ts} +1 -1
  175. package/dist/tools/{listTasks.js → tasks/listTasks.js} +5 -4
  176. package/dist/tools/{reconcileTasks.d.ts → tasks/reconcileTasks.d.ts} +3 -2
  177. package/dist/tools/tasks/reconcileTasks.js +496 -0
  178. package/dist/tools/tasks/retryTask.js +60 -0
  179. package/dist/tools/{runTaskLoop.d.ts → tasks/runTaskLoop.d.ts} +6 -6
  180. package/dist/tools/{runTaskLoop.js → tasks/runTaskLoop.js} +63 -41
  181. package/dist/tools/tasks/runVerification.js +38 -0
  182. package/dist/tools/{taskLineage.js → tasks/taskLineage.js} +8 -7
  183. package/dist/tools/{taskOutputs.d.ts → tasks/taskOutputs.d.ts} +2 -2
  184. package/dist/tools/{taskOutputs.js → tasks/taskOutputs.js} +17 -16
  185. package/dist/tools/tasks/taskStates.d.ts +6 -0
  186. package/dist/tools/tasks/taskStates.js +52 -0
  187. package/dist/tools/{waitForTask.js → tasks/waitForTask.js} +3 -11
  188. package/dist/tools/{androidDoctor.js → workspace/androidDoctor.js} +16 -10
  189. package/dist/tools/{applyPatch.d.ts → workspace/applyPatch.d.ts} +1 -1
  190. package/dist/tools/workspace/applyPatch.js +53 -0
  191. package/dist/tools/{discardWorktree.js → workspace/discardWorktree.js} +3 -3
  192. package/dist/tools/workspace/index.d.ts +10 -0
  193. package/dist/tools/workspace/index.js +10 -0
  194. package/dist/tools/workspace/listAgents.d.ts +23 -0
  195. package/dist/tools/workspace/listAgents.js +56 -0
  196. package/dist/tools/{listWorkspace.js → workspace/listWorkspace.js} +3 -3
  197. package/dist/tools/{mergeWorktree.js → workspace/mergeWorktree.js} +3 -3
  198. package/dist/tools/{readWorkspaceFile.js → workspace/readWorkspaceFile.js} +8 -8
  199. package/dist/tools/{recommendAgentForTask.js → workspace/recommendAgentForTask.js} +3 -3
  200. package/dist/tools/{searchWorkspace.js → workspace/searchWorkspace.js} +5 -5
  201. package/dist/tools/{syncFile.d.ts → workspace/syncFile.d.ts} +1 -1
  202. package/dist/tools/workspace/syncFile.js +134 -0
  203. package/dist/utils/atomicFile.d.ts +7 -0
  204. package/dist/utils/atomicFile.js +67 -0
  205. package/dist/utils/boundedFile.d.ts +8 -0
  206. package/dist/utils/boundedFile.js +93 -0
  207. package/dist/utils/lockedJsonFile.d.ts +15 -0
  208. package/dist/utils/lockedJsonFile.js +224 -0
  209. package/dist/utils/platform.d.ts +11 -0
  210. package/dist/utils/platform.js +26 -0
  211. package/dist/utils/stableJson.d.ts +2 -0
  212. package/dist/utils/stableJson.js +12 -0
  213. package/dist/version.d.ts +3 -2
  214. package/dist/version.js +3 -2
  215. package/dist/watcherStatus.d.ts +2 -2
  216. package/dist/watcherStatus.js +18 -0
  217. package/docs/CODE_WIKI.md +808 -143
  218. package/docs/architecture.md +15 -55
  219. package/docs/assets/patchwarden-desktop-onboarding.png +0 -0
  220. package/docs/control-center/README.md +4 -4
  221. package/docs/dashboard-overview.md +4 -4
  222. package/docs/desktop-app.md +175 -0
  223. package/docs/evidence-pack-schema.md +3 -3
  224. package/docs/open-source-application.md +16 -11
  225. package/docs/release-checklist.md +1 -1
  226. package/docs/release-evidence.md +35 -39
  227. package/docs/task-safe-review-workflow.md +5 -5
  228. package/docs/threat-model.md +19 -1
  229. package/examples/config.example.json +4 -2
  230. package/package.json +27 -10
  231. package/scripts/README.md +15 -6
  232. package/scripts/build.js +11 -0
  233. package/scripts/checks/brand-check.js +3 -0
  234. package/scripts/checks/build-output-check.js +37 -0
  235. package/scripts/checks/control-center-smoke.js +102 -10
  236. package/scripts/checks/control-smoke.js +19 -8
  237. package/scripts/checks/http-mcp-smoke.js +82 -4
  238. package/scripts/checks/lifecycle-smoke.js +15 -12
  239. package/scripts/checks/mcp-manifest-check.js +1 -1
  240. package/scripts/checks/mcp-smoke.js +58 -4
  241. package/scripts/checks/package-manifest-check.js +20 -7
  242. package/scripts/checks/unit-tests.js +3 -5
  243. package/scripts/checks/watcher-supervisor-smoke.js +38 -1
  244. package/scripts/control/get-patchwarden-health.ps1 +1 -1
  245. package/scripts/control/manage-patchwarden.ps1 +69 -4
  246. package/scripts/control/provision-patchwarden-tunnel.ps1 +127 -0
  247. package/scripts/control/run-background-supervisor.ps1 +41 -0
  248. package/scripts/control/start-patchwarden-tunnel.ps1 +191 -33
  249. package/scripts/e2e/demo-runtime.mjs +153 -0
  250. package/{PatchWarden-Control-Tray.cmd → scripts/launchers/PatchWarden-Control-Tray.cmd} +3 -3
  251. package/scripts/launchers/PatchWarden-Control.cmd +6 -0
  252. package/{PatchWarden-Desktop.cmd → scripts/launchers/PatchWarden-Desktop.cmd} +2 -2
  253. package/scripts/launchers/Restart-PatchWarden-Control.cmd +6 -0
  254. package/{Stop-PatchWarden.cmd → scripts/launchers/Stop-PatchWarden.cmd} +2 -2
  255. package/scripts/lib/clean-generated-output.js +11 -0
  256. package/scripts/lib/file-discovery.js +12 -0
  257. package/scripts/release/desktop-preflight.js +211 -0
  258. package/scripts/release/pack-clean.js +59 -14
  259. package/src/assessments/agentAssessor.ts +26 -12
  260. package/src/assessments/assessmentDiagnostics.ts +172 -0
  261. package/src/assessments/assessmentStore.ts +288 -51
  262. package/src/assessments/securitySnapshot.ts +231 -0
  263. package/src/config.ts +70 -13
  264. package/src/control/fileManager.ts +40 -0
  265. package/src/control/middleware/auth.ts +22 -4
  266. package/src/control/middleware/static.ts +16 -3
  267. package/src/control/routeTable.ts +301 -0
  268. package/src/control/routes/audit.ts +14 -6
  269. package/src/control/routes/evidence.ts +1 -1
  270. package/src/control/routes/lineage.ts +1 -1
  271. package/src/control/routes/process.ts +341 -40
  272. package/src/control/routes/sessions.ts +88 -25
  273. package/src/control/routes/status.ts +134 -17
  274. package/src/control/routes/taskActions.ts +24 -58
  275. package/src/control/routes/tasks.ts +66 -58
  276. package/src/control/routes/workspace.ts +56 -25
  277. package/src/control/runtime.ts +71 -43
  278. package/src/control/server.ts +37 -342
  279. package/src/control/shared.ts +77 -11
  280. package/src/diagnostics/allowedTestCommandSafety.ts +12 -0
  281. package/src/direct/directAudit.ts +17 -9
  282. package/src/direct/directGuards.ts +72 -44
  283. package/src/direct/directPatch.ts +95 -8
  284. package/src/direct/directSessionStore.ts +213 -55
  285. package/src/direct/directVerification.ts +9 -23
  286. package/src/doctor.ts +76 -64
  287. package/src/goal/acceptanceEngine.ts +1 -1
  288. package/src/goal/goalProgress.ts +17 -13
  289. package/src/goal/goalReport.ts +5 -13
  290. package/src/goal/goalStatus.ts +19 -3
  291. package/src/goal/goalStore.ts +241 -54
  292. package/src/goal/handoffExport.ts +6 -6
  293. package/src/goal/specKitImport.ts +12 -12
  294. package/src/goal/subgoalSync.ts +11 -8
  295. package/src/goal/worktreeManager.ts +139 -22
  296. package/src/httpServer.ts +113 -30
  297. package/src/logging.ts +10 -3
  298. package/src/policy/projectPolicy.ts +5 -2
  299. package/src/release/releaseGate.ts +74 -27
  300. package/src/runner/agentInvocation.ts +126 -4
  301. package/src/runner/changeCapture.ts +291 -57
  302. package/src/runner/postTaskCleanup.ts +41 -17
  303. package/src/runner/processSecurity.ts +433 -0
  304. package/src/runner/runTask.ts +197 -97
  305. package/src/runner/simpleProcess.ts +66 -31
  306. package/src/{taskProgress.ts → runner/taskProgress.ts} +3 -3
  307. package/src/{taskRuntime.ts → runner/taskRuntime.ts} +6 -3
  308. package/src/runner/taskStatusStore.ts +69 -0
  309. package/src/runner/watch.ts +348 -52
  310. package/src/security/contentRedaction.ts +2 -2
  311. package/src/security/discoveryTokenStore.ts +18 -4
  312. package/src/security/loopbackHost.ts +19 -0
  313. package/src/security/pathGuard.ts +35 -16
  314. package/src/security/planGuard.ts +2 -1
  315. package/src/security/runtimeGuard.ts +9 -6
  316. package/src/security/secretComparison.ts +13 -0
  317. package/src/security/sensitiveGuard.ts +27 -8
  318. package/src/security/toolInvocationGuard.ts +2 -2
  319. package/src/security/workspaceRootGuard.ts +53 -0
  320. package/src/smoke-test.ts +27 -26
  321. package/src/tools/catalog/index.ts +4 -0
  322. package/src/tools/{toolCatalog.ts → catalog/toolCatalog.ts} +3 -12
  323. package/src/tools/{toolRegistry.ts → catalog/toolRegistry.ts} +7 -16
  324. package/src/tools/definitions/toolDefs.ts +1264 -0
  325. package/src/tools/{auditSession.ts → diagnostics/auditSession.ts} +2 -2
  326. package/src/tools/{auditTask.ts → diagnostics/auditTask.ts} +136 -39
  327. package/src/tools/{healthCheck.ts → diagnostics/healthCheck.ts} +37 -9
  328. package/src/tools/diagnostics/index.ts +6 -0
  329. package/src/tools/{safeStatus.ts → diagnostics/safeStatus.ts} +7 -7
  330. package/src/tools/{safeViews.ts → diagnostics/safeViews.ts} +27 -17
  331. package/src/tools/{schemaDriftCheck.ts → diagnostics/schemaDriftCheck.ts} +3 -3
  332. package/src/tools/{createDirectSession.ts → direct/createDirectSession.ts} +6 -6
  333. package/src/tools/{finalizeDirectSession.ts → direct/finalizeDirectSession.ts} +7 -5
  334. package/src/tools/direct/index.ts +3 -0
  335. package/src/tools/{runDirectVerificationBundle.ts → direct/runDirectVerificationBundle.ts} +2 -2
  336. package/src/tools/{discoverTools.ts → discovery/discoverTools.ts} +6 -6
  337. package/src/tools/{explainTool.ts → discovery/explainTool.ts} +3 -3
  338. package/src/tools/discovery/index.ts +3 -0
  339. package/src/tools/{invokeDiscoveredTool.ts → discovery/invokeDiscoveredTool.ts} +7 -7
  340. package/src/tools/dispatch/coreDispatch.ts +36 -31
  341. package/src/tools/dispatch/diagnosticDispatch.ts +26 -21
  342. package/src/tools/dispatch/directDispatch.ts +11 -10
  343. package/src/tools/dispatch/goalDispatch.ts +5 -4
  344. package/src/tools/dispatch/releaseDispatch.ts +3 -2
  345. package/src/tools/dispatch/validation.ts +78 -0
  346. package/src/tools/{getPlan.ts → goals/getPlan.ts} +4 -4
  347. package/src/tools/{goalSubgoalTask.ts → goals/goalSubgoalTask.ts} +41 -26
  348. package/src/tools/goals/index.ts +3 -0
  349. package/src/tools/{savePlan.ts → goals/savePlan.ts} +38 -8
  350. package/src/tools/registry.ts +17 -1261
  351. package/src/tools/{checkReleaseGate.ts → release/checkReleaseGate.ts} +3 -3
  352. package/src/tools/release/index.ts +2 -0
  353. package/src/tools/{releaseMode.ts → release/releaseMode.ts} +42 -24
  354. package/src/tools/tasks/cancelTask.ts +110 -0
  355. package/src/tools/{createTask.ts → tasks/createTask.ts} +161 -33
  356. package/src/tools/{diagnoseTask.ts → tasks/diagnoseTask.ts} +12 -16
  357. package/src/tools/{evidencePack.ts → tasks/evidencePack.ts} +36 -22
  358. package/src/tools/{getTaskFile.ts → tasks/getTaskFile.ts} +4 -4
  359. package/src/tools/{getTaskStatus.ts → tasks/getTaskStatus.ts} +13 -6
  360. package/src/tools/{getTaskStdoutTail.ts → tasks/getTaskStdoutTail.ts} +13 -11
  361. package/src/tools/{getTaskSummary.ts → tasks/getTaskSummary.ts} +46 -44
  362. package/src/tools/tasks/index.ts +18 -0
  363. package/src/tools/{listTasks.ts → tasks/listTasks.ts} +6 -5
  364. package/src/tools/{reconcileTasks.ts → tasks/reconcileTasks.ts} +228 -77
  365. package/src/tools/tasks/retryTask.ts +69 -0
  366. package/src/tools/{runTaskLoop.ts → tasks/runTaskLoop.ts} +73 -46
  367. package/src/tools/{runVerification.ts → tasks/runVerification.ts} +6 -3
  368. package/src/tools/{taskLineage.ts → tasks/taskLineage.ts} +8 -7
  369. package/src/tools/{taskOutputs.ts → tasks/taskOutputs.ts} +27 -20
  370. package/src/tools/tasks/taskStates.ts +54 -0
  371. package/src/tools/{waitForTask.ts → tasks/waitForTask.ts} +3 -12
  372. package/src/tools/{androidDoctor.ts → workspace/androidDoctor.ts} +15 -10
  373. package/src/tools/{applyPatch.ts → workspace/applyPatch.ts} +38 -16
  374. package/src/tools/{discardWorktree.ts → workspace/discardWorktree.ts} +3 -3
  375. package/src/tools/workspace/index.ts +10 -0
  376. package/src/tools/workspace/listAgents.ts +75 -0
  377. package/src/tools/{listWorkspace.ts → workspace/listWorkspace.ts} +3 -3
  378. package/src/tools/{mergeWorktree.ts → workspace/mergeWorktree.ts} +3 -3
  379. package/src/tools/{readWorkspaceFile.ts → workspace/readWorkspaceFile.ts} +8 -8
  380. package/src/tools/{recommendAgentForTask.ts → workspace/recommendAgentForTask.ts} +3 -3
  381. package/src/tools/{searchWorkspace.ts → workspace/searchWorkspace.ts} +5 -5
  382. package/src/tools/workspace/syncFile.ts +292 -0
  383. package/src/utils/atomicFile.ts +74 -0
  384. package/src/utils/boundedFile.ts +116 -0
  385. package/src/utils/lockedJsonFile.ts +251 -0
  386. package/src/utils/platform.ts +31 -0
  387. package/src/utils/stableJson.ts +12 -0
  388. package/src/version.ts +3 -2
  389. package/src/watcherStatus.ts +19 -1
  390. package/ui/desktop-bootstrap.js +11 -0
  391. package/ui/desktop-bridge.js +36 -0
  392. package/ui/desktop.css +160 -0
  393. package/ui/getting-started.js +93 -0
  394. package/ui/i18n.js +484 -0
  395. package/ui/log-parser.js +30 -0
  396. package/ui/pages/audit.html +12 -0
  397. package/ui/pages/dashboard.html +94 -147
  398. package/ui/pages/direct-sessions.html +123 -26
  399. package/ui/pages/getting-started.html +43 -0
  400. package/ui/pages/logs.html +134 -22
  401. package/ui/pages/settings.html +101 -0
  402. package/ui/pages/task-detail.html +12 -0
  403. package/ui/pages/tasks.html +54 -8
  404. package/ui/pages/workspace.html +38 -1
  405. package/ui/settings.js +254 -0
  406. package/PatchWarden-Control.cmd +0 -6
  407. package/Restart-PatchWarden-Control.cmd +0 -6
  408. package/dist/test/unit/acceptance-engine.test.d.ts +0 -1
  409. package/dist/test/unit/acceptance-engine.test.js +0 -228
  410. package/dist/test/unit/agent-router.test.d.ts +0 -1
  411. package/dist/test/unit/agent-router.test.js +0 -287
  412. package/dist/test/unit/android-doctor.test.d.ts +0 -1
  413. package/dist/test/unit/android-doctor.test.js +0 -118
  414. package/dist/test/unit/apply-patch.test.d.ts +0 -1
  415. package/dist/test/unit/apply-patch.test.js +0 -225
  416. package/dist/test/unit/audit-checks.test.d.ts +0 -1
  417. package/dist/test/unit/audit-checks.test.js +0 -350
  418. package/dist/test/unit/chinese-path.test.d.ts +0 -1
  419. package/dist/test/unit/chinese-path.test.js +0 -91
  420. package/dist/test/unit/command-guard.test.d.ts +0 -1
  421. package/dist/test/unit/command-guard.test.js +0 -160
  422. package/dist/test/unit/create-task.test.d.ts +0 -1
  423. package/dist/test/unit/create-task.test.js +0 -197
  424. package/dist/test/unit/diagnose-task.test.d.ts +0 -1
  425. package/dist/test/unit/diagnose-task.test.js +0 -457
  426. package/dist/test/unit/direct-guards.test.d.ts +0 -1
  427. package/dist/test/unit/direct-guards.test.js +0 -328
  428. package/dist/test/unit/discovery-token-store.test.d.ts +0 -1
  429. package/dist/test/unit/discovery-token-store.test.js +0 -139
  430. package/dist/test/unit/evidence-pack.test.d.ts +0 -1
  431. package/dist/test/unit/evidence-pack.test.js +0 -224
  432. package/dist/test/unit/get-task-status.test.d.ts +0 -1
  433. package/dist/test/unit/get-task-status.test.js +0 -174
  434. package/dist/test/unit/get-task-summary.test.d.ts +0 -1
  435. package/dist/test/unit/get-task-summary.test.js +0 -146
  436. package/dist/test/unit/goal-graph.test.d.ts +0 -1
  437. package/dist/test/unit/goal-graph.test.js +0 -298
  438. package/dist/test/unit/goal-progress.test.d.ts +0 -1
  439. package/dist/test/unit/goal-progress.test.js +0 -381
  440. package/dist/test/unit/goal-report.test.d.ts +0 -1
  441. package/dist/test/unit/goal-report.test.js +0 -159
  442. package/dist/test/unit/goal-status.test.d.ts +0 -1
  443. package/dist/test/unit/goal-status.test.js +0 -215
  444. package/dist/test/unit/goal-store.test.d.ts +0 -1
  445. package/dist/test/unit/goal-store.test.js +0 -253
  446. package/dist/test/unit/goal-subgoal-task.test.d.ts +0 -1
  447. package/dist/test/unit/goal-subgoal-task.test.js +0 -55
  448. package/dist/test/unit/goal-tools-registry.test.d.ts +0 -1
  449. package/dist/test/unit/goal-tools-registry.test.js +0 -192
  450. package/dist/test/unit/handoff-export.test.d.ts +0 -1
  451. package/dist/test/unit/handoff-export.test.js +0 -263
  452. package/dist/test/unit/invoke-discovered-tool.test.d.ts +0 -1
  453. package/dist/test/unit/invoke-discovered-tool.test.js +0 -167
  454. package/dist/test/unit/logging.test.d.ts +0 -1
  455. package/dist/test/unit/logging.test.js +0 -397
  456. package/dist/test/unit/path-guard.test.d.ts +0 -1
  457. package/dist/test/unit/path-guard.test.js +0 -133
  458. package/dist/test/unit/post-task-cleanup.test.d.ts +0 -1
  459. package/dist/test/unit/post-task-cleanup.test.js +0 -48
  460. package/dist/test/unit/project-policy-release-mode.test.d.ts +0 -1
  461. package/dist/test/unit/project-policy-release-mode.test.js +0 -125
  462. package/dist/test/unit/reconcile-tasks.test.d.ts +0 -1
  463. package/dist/test/unit/reconcile-tasks.test.js +0 -456
  464. package/dist/test/unit/release-gate.test.d.ts +0 -1
  465. package/dist/test/unit/release-gate.test.js +0 -242
  466. package/dist/test/unit/run-task-loop.test.d.ts +0 -1
  467. package/dist/test/unit/run-task-loop.test.js +0 -380
  468. package/dist/test/unit/safe-status.test.d.ts +0 -1
  469. package/dist/test/unit/safe-status.test.js +0 -165
  470. package/dist/test/unit/safe-views.test.d.ts +0 -1
  471. package/dist/test/unit/safe-views.test.js +0 -171
  472. package/dist/test/unit/schema-drift-check.test.d.ts +0 -1
  473. package/dist/test/unit/schema-drift-check.test.js +0 -176
  474. package/dist/test/unit/sensitive-guard.test.d.ts +0 -1
  475. package/dist/test/unit/sensitive-guard.test.js +0 -104
  476. package/dist/test/unit/spec-kit-import.test.d.ts +0 -1
  477. package/dist/test/unit/spec-kit-import.test.js +0 -341
  478. package/dist/test/unit/subgoal-sync.test.d.ts +0 -1
  479. package/dist/test/unit/subgoal-sync.test.js +0 -183
  480. package/dist/test/unit/sync-file.test.d.ts +0 -1
  481. package/dist/test/unit/sync-file.test.js +0 -154
  482. package/dist/test/unit/tool-invocation-guard.test.d.ts +0 -1
  483. package/dist/test/unit/tool-invocation-guard.test.js +0 -432
  484. package/dist/test/unit/tool-usage-stats.test.d.ts +0 -1
  485. package/dist/test/unit/tool-usage-stats.test.js +0 -300
  486. package/dist/test/unit/toolSearch.test.d.ts +0 -1
  487. package/dist/test/unit/toolSearch.test.js +0 -571
  488. package/dist/test/unit/wait-for-task.test.d.ts +0 -1
  489. package/dist/test/unit/wait-for-task.test.js +0 -144
  490. package/dist/test/unit/watcher-status.test.d.ts +0 -1
  491. package/dist/test/unit/watcher-status.test.js +0 -169
  492. package/dist/test/unit/worktree-manager.test.d.ts +0 -1
  493. package/dist/test/unit/worktree-manager.test.js +0 -176
  494. package/dist/tools/applyPatch.js +0 -41
  495. package/dist/tools/cancelTask.d.ts +0 -30
  496. package/dist/tools/cancelTask.js +0 -64
  497. package/dist/tools/finalizeDirectSession.js +0 -84
  498. package/dist/tools/goalSubgoalTask.js +0 -110
  499. package/dist/tools/killTask.d.ts +0 -15
  500. package/dist/tools/listAgents.d.ts +0 -12
  501. package/dist/tools/listAgents.js +0 -42
  502. package/dist/tools/reconcileTasks.js +0 -352
  503. package/dist/tools/retryTask.js +0 -45
  504. package/dist/tools/runVerification.js +0 -36
  505. package/dist/tools/syncFile.js +0 -65
  506. package/docs/control-center/control-center-daily-driver.md +0 -211
  507. package/docs/control-center/control-center-mvp.md +0 -205
  508. package/docs/control-center/control-center-phase2.md +0 -159
  509. package/docs/execution-plan-2026-07-09.md +0 -315
  510. package/docs/release-v0.6.0.md +0 -71
  511. package/docs/release-v0.6.1.md +0 -75
  512. package/docs/release-v0.6.4.md +0 -45
  513. package/docs/roadmap-execution-and-acceptance.md +0 -365
  514. package/src/test/unit/acceptance-engine.test.ts +0 -261
  515. package/src/test/unit/agent-router.test.ts +0 -342
  516. package/src/test/unit/android-doctor.test.ts +0 -158
  517. package/src/test/unit/apply-patch.test.ts +0 -293
  518. package/src/test/unit/audit-checks.test.ts +0 -567
  519. package/src/test/unit/chinese-path.test.ts +0 -106
  520. package/src/test/unit/command-guard.test.ts +0 -221
  521. package/src/test/unit/create-task.test.ts +0 -255
  522. package/src/test/unit/diagnose-task.test.ts +0 -544
  523. package/src/test/unit/direct-guards.test.ts +0 -467
  524. package/src/test/unit/discovery-token-store.test.ts +0 -181
  525. package/src/test/unit/evidence-pack.test.ts +0 -251
  526. package/src/test/unit/get-task-status.test.ts +0 -203
  527. package/src/test/unit/get-task-summary.test.ts +0 -173
  528. package/src/test/unit/goal-graph.test.ts +0 -347
  529. package/src/test/unit/goal-progress.test.ts +0 -538
  530. package/src/test/unit/goal-report.test.ts +0 -189
  531. package/src/test/unit/goal-status.test.ts +0 -270
  532. package/src/test/unit/goal-store.test.ts +0 -318
  533. package/src/test/unit/goal-subgoal-task.test.ts +0 -72
  534. package/src/test/unit/goal-tools-registry.test.ts +0 -245
  535. package/src/test/unit/handoff-export.test.ts +0 -295
  536. package/src/test/unit/invoke-discovered-tool.test.ts +0 -216
  537. package/src/test/unit/logging.test.ts +0 -497
  538. package/src/test/unit/path-guard.test.ts +0 -180
  539. package/src/test/unit/post-task-cleanup.test.ts +0 -53
  540. package/src/test/unit/project-policy-release-mode.test.ts +0 -156
  541. package/src/test/unit/reconcile-tasks.test.ts +0 -551
  542. package/src/test/unit/release-gate.test.ts +0 -314
  543. package/src/test/unit/run-task-loop.test.ts +0 -425
  544. package/src/test/unit/safe-status.test.ts +0 -187
  545. package/src/test/unit/safe-views.test.ts +0 -184
  546. package/src/test/unit/schema-drift-check.test.ts +0 -260
  547. package/src/test/unit/sensitive-guard.test.ts +0 -124
  548. package/src/test/unit/spec-kit-import.test.ts +0 -429
  549. package/src/test/unit/subgoal-sync.test.ts +0 -236
  550. package/src/test/unit/sync-file.test.ts +0 -231
  551. package/src/test/unit/tool-invocation-guard.test.ts +0 -542
  552. package/src/test/unit/tool-usage-stats.test.ts +0 -384
  553. package/src/test/unit/toolSearch.test.ts +0 -756
  554. package/src/test/unit/wait-for-task.test.ts +0 -176
  555. package/src/test/unit/watcher-status.test.ts +0 -190
  556. package/src/test/unit/worktree-manager.test.ts +0 -247
  557. package/src/tools/cancelTask.ts +0 -70
  558. package/src/tools/listAgents.ts +0 -54
  559. package/src/tools/retryTask.ts +0 -53
  560. package/src/tools/syncFile.ts +0 -122
  561. /package/dist/tools/{toolCatalog.d.ts → catalog/toolCatalog.d.ts} +0 -0
  562. /package/dist/tools/{toolSearch.d.ts → catalog/toolSearch.d.ts} +0 -0
  563. /package/dist/tools/{toolSearch.js → catalog/toolSearch.js} +0 -0
  564. /package/dist/tools/{toolUsageStats.d.ts → catalog/toolUsageStats.d.ts} +0 -0
  565. /package/dist/tools/{toolUsageStats.js → catalog/toolUsageStats.js} +0 -0
  566. /package/dist/tools/{createDirectSession.d.ts → direct/createDirectSession.d.ts} +0 -0
  567. /package/dist/tools/{runDirectVerificationBundle.d.ts → direct/runDirectVerificationBundle.d.ts} +0 -0
  568. /package/dist/tools/{getPlan.d.ts → goals/getPlan.d.ts} +0 -0
  569. /package/dist/tools/{savePlan.d.ts → goals/savePlan.d.ts} +0 -0
  570. /package/dist/tools/{evidencePack.d.ts → tasks/evidencePack.d.ts} +0 -0
  571. /package/dist/tools/{getTaskFile.d.ts → tasks/getTaskFile.d.ts} +0 -0
  572. /package/dist/tools/{getTaskProgress.d.ts → tasks/getTaskProgress.d.ts} +0 -0
  573. /package/dist/tools/{getTaskProgress.js → tasks/getTaskProgress.js} +0 -0
  574. /package/dist/tools/{getTaskStdoutTail.d.ts → tasks/getTaskStdoutTail.d.ts} +0 -0
  575. /package/dist/tools/{getTaskSummary.d.ts → tasks/getTaskSummary.d.ts} +0 -0
  576. /package/dist/tools/{killTask.js → tasks/killTask.js} +0 -0
  577. /package/dist/tools/{retryTask.d.ts → tasks/retryTask.d.ts} +0 -0
  578. /package/dist/tools/{runVerification.d.ts → tasks/runVerification.d.ts} +0 -0
  579. /package/dist/tools/{taskLineage.d.ts → tasks/taskLineage.d.ts} +0 -0
  580. /package/dist/tools/{waitForTask.d.ts → tasks/waitForTask.d.ts} +0 -0
  581. /package/dist/tools/{androidDoctor.d.ts → workspace/androidDoctor.d.ts} +0 -0
  582. /package/dist/tools/{discardWorktree.d.ts → workspace/discardWorktree.d.ts} +0 -0
  583. /package/dist/tools/{listWorkspace.d.ts → workspace/listWorkspace.d.ts} +0 -0
  584. /package/dist/tools/{mergeWorktree.d.ts → workspace/mergeWorktree.d.ts} +0 -0
  585. /package/dist/tools/{readWorkspaceFile.d.ts → workspace/readWorkspaceFile.d.ts} +0 -0
  586. /package/dist/tools/{recommendAgentForTask.d.ts → workspace/recommendAgentForTask.d.ts} +0 -0
  587. /package/dist/tools/{searchWorkspace.d.ts → workspace/searchWorkspace.d.ts} +0 -0
  588. /package/src/tools/{toolSearch.ts → catalog/toolSearch.ts} +0 -0
  589. /package/src/tools/{toolUsageStats.ts → catalog/toolUsageStats.ts} +0 -0
  590. /package/src/tools/{getTaskProgress.ts → tasks/getTaskProgress.ts} +0 -0
  591. /package/src/tools/{killTask.ts → tasks/killTask.ts} +0 -0
@@ -1,36 +0,0 @@
1
- import { readDirectSession, appendDirectSessionVerificationRun, } from "../direct/directSessionStore.js";
2
- import { guardDirectSessionActive } from "../direct/directGuards.js";
3
- import { runDirectVerification } from "../direct/directVerification.js";
4
- export async function runVerification(input) {
5
- // 1. Read session and guard active
6
- const session = readDirectSession(input.session_id);
7
- guardDirectSessionActive(session);
8
- // 2. Call runDirectVerification with command, resolvedRepoPath,
9
- // sessionId, and timeoutSeconds
10
- const timeoutSeconds = input.timeout_seconds ?? 120;
11
- const result = await runDirectVerification({
12
- command: input.command,
13
- resolvedRepoPath: session.resolved_repo_path,
14
- sessionId: input.session_id,
15
- timeoutSeconds,
16
- });
17
- // 3. Append verification run to session
18
- appendDirectSessionVerificationRun(input.session_id, result.run);
19
- // 4. Return result
20
- return {
21
- command: result.run.command,
22
- exit_code: result.run.exit_code,
23
- passed: result.run.passed,
24
- timed_out: result.run.timed_out,
25
- redacted: Boolean(result.run.redacted),
26
- redaction_categories: result.run.redaction_categories || [],
27
- started_at: result.run.started_at,
28
- finished_at: result.run.finished_at,
29
- stdout_tail: result.run.stdout_tail,
30
- stderr_tail: result.run.stderr_tail,
31
- log_path: result.run.log_path,
32
- next_action: result.run.passed
33
- ? "Call finalize_direct_session to complete the session."
34
- : "Review the verification output and apply_patch to fix issues.",
35
- };
36
- }
@@ -1,65 +0,0 @@
1
- import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
2
- import { dirname, resolve } from "node:path";
3
- import { PatchWardenError } from "../errors.js";
4
- import { getConfig } from "../config.js";
5
- import { guardDirectPath, guardDirectWritePath } from "../direct/directGuards.js";
6
- import { guardSensitivePath } from "../security/sensitiveGuard.js";
7
- import { computeFileSha256 } from "../direct/directPatch.js";
8
- /**
9
- * Copy a file from source to target within the same session repo.
10
- * Both source and target must be inside the session's repo_path.
11
- */
12
- export function syncFile(sessionId, sourcePath, targetPath, options, config) {
13
- const cfg = config || getConfig();
14
- const sessionsDir = resolve(cfg.workspaceRoot, cfg.directSessionsDir);
15
- // Load session to get repo_path
16
- const sessionFile = resolve(sessionsDir, sessionId, "session.json");
17
- if (!existsSync(sessionFile)) {
18
- throw new PatchWardenError("direct_session_not_found", `Direct session "${sessionId}" not found.`, "Create a direct session first using direct_start_session.", true, { session_id: sessionId });
19
- }
20
- const session = JSON.parse(readFileSync(sessionFile, "utf-8"));
21
- const repoPath = resolve(session.repo_path);
22
- const workspaceRoot = cfg.workspaceRoot;
23
- // Guard source path — must be inside repo
24
- const resolvedSource = guardDirectPath(sourcePath, repoPath, workspaceRoot);
25
- guardSensitivePath(resolvedSource);
26
- if (!existsSync(resolvedSource)) {
27
- throw new PatchWardenError("source_file_not_found", `Source file does not exist: "${sourcePath}".`, "Ensure the source path is correct.", true, { source_path: sourcePath });
28
- }
29
- // Guard target path — must be inside repo, not in blocked dirs
30
- const resolvedTarget = guardDirectWritePath(targetPath, repoPath, workspaceRoot);
31
- guardSensitivePath(resolvedTarget);
32
- // Verify source sha256 if provided
33
- const sourceSha256 = computeFileSha256(resolvedSource);
34
- if (options?.expected_source_sha256 && options.expected_source_sha256 !== sourceSha256) {
35
- throw new PatchWardenError("source_hash_mismatch", `Source file hash mismatch. Expected "${options.expected_source_sha256}" but got "${sourceSha256}".`, "Re-read the source file to get the current sha256.", true, { expected_sha256: options.expected_source_sha256, actual_sha256: sourceSha256 });
36
- }
37
- // Get target sha256 before copy
38
- let beforeTargetSha256 = null;
39
- if (existsSync(resolvedTarget)) {
40
- beforeTargetSha256 = computeFileSha256(resolvedTarget);
41
- // Verify target sha256 if provided
42
- if (options?.expected_target_sha256 && options.expected_target_sha256 !== beforeTargetSha256) {
43
- throw new PatchWardenError("target_hash_mismatch", `Target file hash mismatch. Expected "${options.expected_target_sha256}" but got "${beforeTargetSha256}".`, "Re-read the target file to get the current sha256.", true, { expected_sha256: options.expected_target_sha256, actual_sha256: beforeTargetSha256 });
44
- }
45
- }
46
- // Read source content
47
- const sourceContent = readFileSync(resolvedSource);
48
- const copiedBytes = sourceContent.length;
49
- // Create target directory if needed
50
- mkdirSync(dirname(resolvedTarget), { recursive: true });
51
- // Write to target
52
- writeFileSync(resolvedTarget, sourceContent, "utf-8");
53
- // Compute after hash
54
- const afterTargetSha256 = computeFileSha256(resolvedTarget);
55
- const changed = beforeTargetSha256 !== afterTargetSha256;
56
- return {
57
- source_path: sourcePath,
58
- target_path: targetPath,
59
- before_target_sha256: beforeTargetSha256,
60
- after_target_sha256: afterTargetSha256,
61
- source_sha256: sourceSha256,
62
- copied_bytes: copiedBytes,
63
- changed,
64
- };
65
- }
@@ -1,211 +0,0 @@
1
- # PatchWarden Control Center Daily Driver
2
-
3
- > v0.6.4 在 v0.6.2 MVP 与 v0.6.3 Phase 2 基础上,把 Control Center 从「启动页面脚本」
4
- > 升级为日常入口:单实例启动、后台运行、托盘入口、健康修复建议、页面通知和活动时间线。
5
- > 不重构架构,不合并 Core/Direct MCP,不改现有 MCP 工具注册逻辑。
6
- > 不发布 npm,不打 git tag。
7
-
8
- ## 概述
9
-
10
- Daily Driver 完全在 Control Center HTTP 层与启动脚本层增强,未触动 MCP 工具注册、
11
- watcher 核心循环或 Direct session 写入逻辑。新增的 API 沿用既有 token 校验、路径围栏
12
- 和脱敏机制;托盘与后台模式仅调用现有 Control Center API,不引入新的进程管理路径。
13
-
14
- - **单实例启动**:status 文件 + 端口探测,重复运行只开浏览器,不启第二个服务
15
- - **后台运行**:`-Background`(默认)/ `-Foreground` / `-NoBrowser`,日志写入
16
- `%LOCALAPPDATA%\patchwarden\control-center\control-center.{stdout,stderr}.log`
17
- - **托盘入口**:基于 .NET NotifyIcon 的轻量 PowerShell 托盘,无需 Electron
18
- - **健康修复建议**:`/api/status` 新增 `suggestions` 字段,dashboard 显示建议卡片
19
- - **页面通知**:dashboard 轮询状态变化时弹出 toast,同一事件只提示一次
20
- - **Activity Timeline**:`runtime/control-center-events.jsonl` 记录关键事件,
21
- `GET /api/events` 返回最近事件,dashboard 显示时间线区块
22
-
23
- ## 启动方式
24
-
25
- ### 1. 日常入口(推荐)
26
-
27
- ```powershell
28
- .\PatchWarden-Control.cmd
29
- ```
30
-
31
- 默认后台启动 Control Center 并打开浏览器。再次运行时:
32
-
33
- - 如果 127.0.0.1:8090 已经是当前 Control Center —— 直接打开浏览器页面,不重复启动
34
- - 如果端口被其他程序占用 —— 给出明确错误提示并退出
35
- - 如果 status 文件指向已死的 PID —— 清理孤儿进程后启动新实例
36
-
37
- ### 2. 启动参数
38
-
39
- ```powershell
40
- .\PatchWarden-Control.cmd -NoBrowser # 启动但不打开浏览器
41
- .\PatchWarden-Control.cmd -Foreground # 前台运行,日志直接输出到控制台
42
- .\PatchWarden-Control.cmd -Background # 后台运行(默认),脚本启动后即退出
43
- ```
44
-
45
- `-Foreground` 与 `-Background` 互斥;都不传时默认 `-Background`。
46
-
47
- ### 3. 托盘入口
48
-
49
- ```powershell
50
- .\PatchWarden-Control-Tray.cmd
51
- ```
52
-
53
- 启动 Windows 系统托盘图标(基于 .NET NotifyIcon,无需额外依赖)。如果 Control Center
54
- 未运行,托盘脚本会先在后台启动它。托盘菜单:
55
-
56
- | 菜单项 | 行为 |
57
- | --- | --- |
58
- | Open Control Center | 在默认浏览器打开 dashboard |
59
- | Start All | `POST /api/start-all`(带 token) |
60
- | Stop All | `POST /api/stop-all`(带 token) |
61
- | Restart All | `POST /api/restart-all`(带 token) |
62
- | Open Workspace | 通过 `GET /api/workspace` 获取 workspaceRoot 后用 explorer 打开 |
63
- | Open Logs Folder | `POST /api/open-logs-folder`(带 token) |
64
- | Exit | 关闭托盘(不停止 Control Center 后台进程) |
65
-
66
- 双击托盘图标打开 dashboard。所有 API 调用通过 `/control-token.json` 获取 token 后
67
- 带 `X-PatchWarden-Control-Token` 头发起请求。
68
-
69
- ## 改动文件
70
-
71
- | 文件 | 改动 |
72
- | --- | --- |
73
- | `src/version.ts` | `PATCHWARDEN_VERSION` 0.6.3 → 0.6.4 |
74
- | `package.json` | `version` 0.6.3 → 0.6.4 |
75
- | `src/controlCenter.ts` | 新增 status 文件、events JSONL、suggestions 引擎、`/api/events`、`/api/control-center-status`;`getControlCenterLogDir` 支持 `PATCHWARDEN_CONTROL_LOG_DIR` 覆盖 |
76
- | `scripts/control/start-control-center.ps1` | 重写:单实例检测、`-NoBrowser`/`-Foreground`/`-Background`、孤儿清理、端口冲突检测 |
77
- | `scripts/control/control-center-tray.ps1` | 新文件:.NET NotifyIcon 托盘,菜单驱动 Control Center API |
78
- | `PatchWarden-Control-Tray.cmd` | 新文件:托盘启动入口 |
79
- | `ui/pages/dashboard.html` | 新增 Health Suggestions 卡片、toast 通知、Activity Timeline 区块 |
80
- | `scripts/checks/control-center-smoke.js` | 新增 Test 16–20 覆盖 Daily Driver API;`PATCHWARDEN_CONTROL_LOG_DIR` 重定向到项目内临时目录 |
81
- | `scripts/release/pack-clean.js` | forbidden 列表新增 `.tmp/` |
82
- | `.gitignore` | 新增 `.tmp/` |
83
- | `docs/control-center/control-center-daily-driver.md` | 本文档 |
84
-
85
- ## 新增 API
86
-
87
- ### GET 接口(免 token)
88
-
89
- | 路径 | 说明 |
90
- | --- | --- |
91
- | `GET /api/events?limit=<N>` | 返回最近 N 条活动事件(最大 1000),结构 `{events, total, limit}` |
92
- | `GET /api/control-center-status` | 读取 status 文件,返回 `{running, pid, port, started_at, url, version}` 或 `{running: false}` |
93
-
94
- ### /api/status 增强字段
95
-
96
- `GET /api/status` 响应新增 `suggestions` 数组,每条建议包含:
97
-
98
- ```json
99
- {
100
- "code": "core_stopped",
101
- "severity": "warning",
102
- "message": "Core 未运行,建议启动 Core profile",
103
- "action": "/api/core/start",
104
- "link": null
105
- }
106
- ```
107
-
108
- | code | severity | 触发条件 | action |
109
- | --- | --- | --- | --- |
110
- | `core_stopped` | warning | Core 探测不可用 | `/api/core/start` |
111
- | `direct_stopped` | warning | Direct 探测不可用 | `/api/direct/start` |
112
- | `watcher_stale` | error | watcher 状态为 stale/unreadable | `/api/restart-all` |
113
- | `stale_task` | warning | 存在 stale 任务 | 无 action,`link` 指向 tasks 页面 |
114
- | `tunnel_not_ready` | warning | Core 或 Direct tunnel 未就绪 | `/api/restart-all` |
115
- | `agent_missing` | info | 配置的 agent 不可用 | 无 action,提示检查路径 |
116
-
117
- ## 活动事件
118
-
119
- 事件写入 `%LOCALAPPDATA%\patchwarden\control-center\control-center-events.jsonl`,
120
- 每行一个 JSON 对象 `{timestamp, type, payload?}`。文件超过 512KB 时惰性裁剪到
121
- 2000 行。
122
-
123
- ### 事件类型
124
-
125
- | type | 触发时机 |
126
- | --- | --- |
127
- | `control_center.started` | 服务 listen 成功 |
128
- | `control_center.stopped` | 服务收到 SIGTERM/SIGINT 关闭 |
129
- | `manage.start.all` / `manage.stop.all` / `manage.restart.all` | 用户请求 start/stop/restart all |
130
- | `manage.<mode>.<action>.failed` | manage-patchwarden.ps1 执行失败 |
131
- | `core.status_changed` | Core 可用性发生变化(diff 自上次 /api/status 轮询) |
132
- | `direct.status_changed` | Direct 可用性发生变化 |
133
- | `watcher.status_changed` | watcher 状态发生变化 |
134
- | `task.status_changed` | 任务状态从 running → done/failed 等 |
135
- | `task.reconciled` | 用户对 stale 任务执行 reconcile |
136
- | `task.audited` | 用户对任务执行 audit |
137
-
138
- > Control Center 是无状态、拉取驱动的服务。`core/direct/watcher/task.status_changed`
139
- > 事件在 `/api/status` 轮询时通过 digest diff 检测,因此事件时间戳反映的是「被观察到」
140
- > 的时间,不保证是状态变化的精确时刻。
141
-
142
- ## 页面通知(toast)
143
-
144
- dashboard.html 轮询 `/api/status`(30s)和 `/api/audit`(90s)时检测以下状态变化并
145
- 弹出 toast 通知:
146
-
147
- - core/direct: available → unavailable(error)/ unavailable → available(success)
148
- - watcher: healthy → stale/unreadable(error)/ stale → healthy(success)
149
- - task: running → done(success)/ running → failed*(error)
150
- - audit: 新出现的 pass(success)/ warn(warning)/ fail(error)
151
-
152
- 同一事件通过 dedup key 只提示一次;toast 8 秒后自动消失,也可手动关闭。首次加载时
153
- audit 列表会 seed 到 `seenAuditKeys`,不会对已有审计记录弹通知。
154
-
155
- ## 运行时文件
156
-
157
- | 文件 | 路径 | 说明 |
158
- | --- | --- | --- |
159
- | status 文件 | `%LOCALAPPDATA%\patchwarden\control-center\control-center-status.json` | pid/port/started_at/url/version,服务启动时写入,关闭时删除 |
160
- | events 文件 | `%LOCALAPPDATA%\patchwarden\control-center\control-center-events.jsonl` | 活动事件 JSONL |
161
- | stdout 日志 | `%LOCALAPPDATA%\patchwarden\control-center\control-center.stdout.log` | 后台模式 stdout |
162
- | stderr 日志 | `%LOCALAPPDATA%\patchwarden\control-center\control-center.stderr.log` | 后台模式 stderr |
163
-
164
- > `PATCHWARDEN_CONTROL_LOG_DIR` 环境变量可覆盖上述目录(必须为绝对路径),
165
- > 主要用于 smoke test 将其重定向到项目内临时目录。
166
-
167
- ## 测试
168
-
169
- ```powershell
170
- npm.cmd test
171
- ```
172
-
173
- ### control-center-smoke.js(21 项)
174
-
175
- | # | 测试 | 覆盖 |
176
- | --- | --- | --- |
177
- | 1–1b | 静态文件 + 页面路由 | 基础服务 |
178
- | 2 | `/api/status` JSON + 容错 | 结构校验 |
179
- | 3–4 | tasks JSON + control-token | token 机制 |
180
- | 5–7 | POST 无 token / 错 token → 403 | 安全门 |
181
- | 8–9 | token 不污染 git + 无 CDN | 发布卫生 |
182
- | 10 | 其他 GET API 可达 | workspace/audit/logs/tunnel |
183
- | 11–15 | Phase 2 API | stale/reconcile/workspace/direct-sessions/logs |
184
- | **16** | `/api/status` 包含 `suggestions` 数组 | Daily Driver |
185
- | **17** | `/api/events` 返回 JSON | Daily Driver |
186
- | **18** | `/api/logs/control-center` 返回 JSON | Daily Driver |
187
- | **19** | POST `/api/restart-all` 无 token → 403 | Daily Driver |
188
- | **20** | `/api/control-center-status` 报告 running 实例 | Daily Driver(单实例检测) |
189
-
190
- ### 全量测试结果
191
-
192
- ```
193
- security tests: 139 passed, 0 failed
194
- unit tests: 136 passed, 0 failed (1 skipped: Windows symlink)
195
- lifecycle tests: 22 passed, 0 failed
196
- control-center: 21 passed, 0 failed
197
- ```
198
-
199
- ## 已知限制
200
-
201
- 1. **托盘为 PowerShell 实现**:基于 .NET NotifyIcon,不提供跨平台支持;在非 Windows
202
- 环境下不可用。如需跨平台托盘,需引入 Electron 或类似框架(本阶段刻意避免)。
203
- 2. **事件时间为观测时间**:Control Center 无状态,`status_changed` 事件在轮询时通过
204
- diff 检测,时间戳是「被观察到」的时间,不保证是状态变化的精确时刻。
205
- 3. **status 文件依赖可写目录**:如果 `%LOCALAPPDATA%` 不可写(如沙箱环境),
206
- status 文件不会生成,单实例检测会退化为端口探测模式。可通过
207
- `PATCHWARDEN_CONTROL_LOG_DIR` 覆盖到可写目录。
208
- 4. **toast 为页面内通知**:不要求系统级通知;仅当 dashboard 页面打开时才会弹出。
209
- 5. **托盘 Exit 不停止后台进程**:Exit 仅关闭托盘,Control Center 后台 node 进程继续
210
- 运行。需通过 Stop All 或 `Stop-Process -Id <pid>` 停止。
211
- 6. **事件文件不轮转**:超过 512KB 时惰性裁剪到 2000 行,不按日期轮转。
@@ -1,205 +0,0 @@
1
- # PatchWarden Control Center MVP
2
-
3
- > 本地 Web 控制中心,统一管理 PatchWarden Core 与 PatchWarden Direct 两个 MCP profile。
4
- > 不合并工具,不发布到 npm,不打 git tag。
5
-
6
- ## 概述
7
-
8
- Control Center 是一个绑定 `127.0.0.1:8090` 的本地 HTTP 服务,提供静态 UI 页面和一组容错 JSON API。
9
- 所有进程生命周期操作(start/stop/restart)均委托 `scripts/control/manage-patchwarden.ps1` 执行,
10
- Control Center 自身不直接 kill 进程,也不读取任意 PID 文件。
11
-
12
- - **Core profile**: `chatgpt_core`,17 个工具,HTTP 端口 8080
13
- - **Direct profile**: `chatgpt_direct`,10 个工具,HTTP 端口 8081
14
-
15
- ## 新增文件
16
-
17
- | 文件 | 说明 |
18
- | --- | --- |
19
- | `src/controlCenter.ts` | Control Center HTTP 服务主程序(TypeScript 源) |
20
- | `scripts/checks/control-center-smoke.js` | 测试模式冒烟测试(ESM,仅用 Node 内置模块) |
21
- | `scripts/control/start-control-center.ps1` | PowerShell 启动脚本(含构建检查、端口轮询、浏览器自动打开;支持 `-NoBrowser`) |
22
- | `PatchWarden-Control.cmd` | 根目录 CMD 入口,调用上述 PowerShell 脚本 |
23
- | `ui/pages/dashboard.html` | 总控首页(真实状态,7 个工具栏按钮,两张服务卡) |
24
- | `ui/pages/tasks.html` | 任务列表页(接 `/api/tasks`) |
25
- | `ui/pages/task-detail.html` | 任务详情页(接 `/api/tasks/:taskId`) |
26
- | `ui/pages/workspace.html` | 工作区页(接轻量 `/api/workspace`) |
27
- | `ui/pages/audit.html` | 审计历史页(接 `/api/audit`) |
28
- | `ui/partials/project-shell.html` | 页面外壳(CDN 引用已替换为本地 `/vendor/`) |
29
- | `ui/colors_and_type.css` | 颜色与字体样式 |
30
- | `ui/vendor/tailwindcss-browser.js` | Tailwind v4.3.1 browser build(本地副本,离线可用) |
31
- | `ui/vendor/lucide.js` | Lucide v1.8.0 UMD(本地副本,离线可用) |
32
- | `docs/control-center/control-center-mvp.md` | 本文档 |
33
-
34
- ## 改动文件
35
-
36
- | 文件 | 改动 |
37
- | --- | --- |
38
- | `package.json` | 新增 `start:control` 脚本(`node dist/controlCenter.js`);`files` 数组新增 `ui/`;`test` 脚本末尾追加 `&& node scripts/checks/control-center-smoke.js` |
39
- | `.gitignore` | 新增 `/CODE_WIKI.md`、`/PatchWarden-UI.zip`、`/patchwarden-v0.6.1-SHA256SUMS.txt`(避免 brand-check 误报) |
40
-
41
- ## 启动方式
42
-
43
- ### 方式一:CMD 入口(推荐用户使用)
44
-
45
- ```powershell
46
- .\PatchWarden-Control.cmd
47
- ```
48
-
49
- ### 方式二:PowerShell 脚本
50
-
51
- ```powershell
52
- # 正常启动(构建检查 + 打开浏览器)
53
- powershell -ExecutionPolicy Bypass -File scripts\control\start-control-center.ps1
54
-
55
- # 测试模式(不打开浏览器)
56
- powershell -ExecutionPolicy Bypass -File scripts\control\start-control-center.ps1 -NoBrowser
57
- ```
58
-
59
- ### 方式三:npm 脚本(需先 `npm run build`)
60
-
61
- ```powershell
62
- npm.cmd run build
63
- npm.cmd run start:control
64
- ```
65
-
66
- 启动后自动打开 `http://127.0.0.1:8090`。
67
-
68
- 端口可通过环境变量覆盖(仅用于测试):
69
-
70
- ```powershell
71
- $env:PATCHWARDEN_CONTROL_PORT=18090; node dist/controlCenter.js
72
- ```
73
-
74
- ## 控制 Token 校验
75
-
76
- - 服务启动时通过 `crypto.randomUUID()` 生成 token,**仅保存在内存中**,不写入任何文件。
77
- - 前端通过 `GET /control-token.json` 从内存获取 token,响应头 `Cache-Control: no-store`。
78
- - **所有 POST 接口**(含 `/api/start-all`、`/api/stop-all`、`/api/restart-all`、`/api/core/*`、`/api/direct/*`、`/api/open-logs-folder`)必须携带 `X-PatchWarden-Control-Token` 请求头。
79
- - token 缺失或错误时返回 `403`,不执行任何进程控制或本地系统动作。
80
- - GET 接口(status、tasks、logs 等)不需要 token。
81
- - `git status --porcelain` 不会出现 `ui/control-token.json`。
82
-
83
- ## API 清单
84
-
85
- ### GET 接口(免 token)
86
-
87
- | 路径 | 说明 |
88
- | --- | --- |
89
- | `GET /` | 返回 `ui/pages/dashboard.html` |
90
- | `GET /control-token.json` | 从内存返回控制 token,`Cache-Control: no-store` |
91
- | `GET /colors_and_type.css` | 静态 CSS |
92
- | `GET /pages/*` | 静态 HTML 页面 |
93
- | `GET /partials/*` | 静态 HTML 片段 |
94
- | `GET /vendor/*` | 本地化的 Tailwind / Lucide |
95
- | `GET /api/status` | 聚合状态(容错,永不 500) |
96
- | `GET /api/tasks` | 任务列表(复用 `listTasks`) |
97
- | `GET /api/tasks/:taskId` | 任务详情(status/runtime/result/audit/diff_patch/test_log) |
98
- | `GET /api/logs/core` | Core runtime 日志尾部 100 行(脱敏) |
99
- | `GET /api/logs/direct` | Direct runtime 日志尾部 100 行(脱敏) |
100
- | `GET /api/logs/watcher` | Watcher 日志尾部 100 行(脱敏) |
101
- | `GET /api/workspace` | 轻量工作区信息(workspace_root、directories、agents、config 摘要;**不做 git 扫描**) |
102
- | `GET /api/audit` | 审计历史(扫描 tasks 目录下含 audit.json 的任务,最多 50 条) |
103
- | `GET /api/tunnel-ui-url` | 读取 Core/Direct 的 tunnel-health-url.txt |
104
-
105
- ### POST 接口(必须校验 token)
106
-
107
- | 路径 | 委托命令 | 说明 |
108
- | --- | --- | --- |
109
- | `POST /api/start-all` | `manage-patchwarden.ps1 start all` | 启动全部 |
110
- | `POST /api/stop-all` | `manage-patchwarden.ps1 stop all` | 停止全部 |
111
- | `POST /api/restart-all` | `manage-patchwarden.ps1 restart all` | 重启全部 |
112
- | `POST /api/core/start` | `manage-patchwarden.ps1 start core` | 启动 Core |
113
- | `POST /api/core/stop` | `manage-patchwarden.ps1 stop core` | 停止 Core |
114
- | `POST /api/direct/start` | `manage-patchwarden.ps1 start direct` | 启动 Direct |
115
- | `POST /api/direct/stop` | `manage-patchwarden.ps1 stop direct` | 停止 Direct |
116
- | `POST /api/open-logs-folder` | 系统命令打开 runtime 目录 | 打开日志文件夹 |
117
-
118
- ### `/api/status` 返回结构(容错)
119
-
120
- ```json
121
- {
122
- "core": { "available": false, "reason": "...", "healthz": null, "readyz": null },
123
- "direct": { "available": false, "reason": "...", "healthz": null, "readyz": null },
124
- "watcher": { "status": "missing|healthy|stale|unreadable", "available": false, "reason": "..." },
125
- "tunnel": { "core": { "observed": false }, "direct": { "observed": false } },
126
- "tools": {
127
- "core": { "tool_profile": null, "tool_count": null, "schema_epoch": null, "tool_manifest_sha256": null, "tool_names": null },
128
- "direct": { "tool_profile": null, "tool_count": null, "schema_epoch": null, "tool_manifest_sha256": null, "tool_names": null }
129
- },
130
- "agents": [],
131
- "workspace_root": "string | null",
132
- "tasks": { "tasks": [], "total": 0, "active": 0, "stale": 0, "reason": null }
133
- }
134
- ```
135
-
136
- 容错保证:
137
- - core/direct health 探测失败 → `{ available: false, reason: "..." }`,接口仍 200
138
- - runtime 文件(tunnel-status.json、tool-manifest.json)缺失 → 返回 null 或 `{ observed: false }`,接口仍 200
139
- - 日志文件缺失 → `{ stdout: "", stderr: "", reason: "..." }`,接口仍 200
140
- - tasks 目录缺失 → `{ tasks: [], total: 0, reason: "..." }`,接口仍 200
141
- - Core/Direct 未启动时 `/api/status` 仍返回 200 JSON,不报 500
142
-
143
- ## 进程安全
144
-
145
- - Control Center **不直接 kill 进程**,所有 start/stop/restart 均委托 `scripts/control/manage-patchwarden.ps1`。
146
- - `manage-patchwarden.ps1` 的 `Test-TunnelProcessForMode` 在 stop/restart 前校验进程命令行属于 `tunnel-client.exe --profile` 模式,仅停止匹配的进程。
147
- - **不根据任意 PID 文件 kill 进程**。
148
- - Control Center 仅在自身服务关闭时退出自己启动的 HTTP server。
149
-
150
- ## CDN 本地化
151
-
152
- - 所有 HTML 无 `https://cdn` 或 `https://unpkg` 引用。
153
- - `ui/vendor/tailwindcss-browser.js`(Tailwind v4.3.1)和 `ui/vendor/lucide.js`(Lucide v1.8.0)为本地副本。
154
- - 断网后页面样式和图标正常渲染。
155
-
156
- ## 冒烟测试(测试模式)
157
-
158
- `scripts/checks/control-center-smoke.js` 严格遵循测试模式:
159
-
160
- - 不打开浏览器
161
- - 不真正 start/stop Core 或 Direct
162
- - 不 kill 任何进程(仅关闭自己 spawn 的 controlCenter 子进程)
163
- - 使用测试端口 `18090`(通过 `PATCHWARDEN_CONTROL_PORT`),避免 8090 冲突
164
- - 测试结束关闭 server,释放端口
165
-
166
- 测试覆盖(10 项):
167
-
168
- 1. 静态文件服务(`/`、`/vendor/*`、`/colors_and_type.css` 返回 200 + 正确 Content-Type)
169
- 2. `/api/status` 返回有效 JSON 且容错(core/direct 未启动时仍 200)
170
- 3. `/api/tasks` 返回有效 JSON
171
- 4. `/control-token.json` 返回 token + `Cache-Control: no-store`
172
- 5. POST `/api/start-all` 不带 token → 403
173
- 6. POST `/api/start-all` 带错误 token → 403
174
- 7. POST `/api/open-logs-folder` 不带 token → 403
175
- 8. token 不污染 Git(`git status --porcelain` 不含 `ui/control-token.json`)
176
- 9. 无 CDN 引用(HTML 文件无 `https://cdn` / `https://unpkg`)
177
- 10. 其他 GET API 可达(`/api/workspace`、`/api/audit`、`/api/logs/core`、`/api/tunnel-ui-url`)
178
-
179
- ## 测试结果
180
-
181
- `npm test` 全量通过(`FINAL_EXIT_CODE: 0`):
182
-
183
- | 测试链 | 结果 |
184
- | --- | --- |
185
- | smoke-test | OK |
186
- | unit-tests | 139 total(136 pass,0 fail,1 skipped) |
187
- | lifecycle-smoke | 22 passed, 0 failed |
188
- | doctor-smoke | OK |
189
- | tunnel-supervisor-smoke | OK |
190
- | watcher-supervisor-smoke | OK |
191
- | control-smoke | OK |
192
- | mcp-manifest-check | 17 tools, chatgpt_core profile |
193
- | brand-check | OK: 144 tracked files checked |
194
- | control-center-smoke | 10 passed, 0 failed |
195
-
196
- 未发布 npm、未打 git tag、未上传 npm。
197
-
198
- ## 已知限制
199
-
200
- 1. **`/api/workspace` 轻量版**:第一版只返回 workspace_root、项目列表(一级子目录)、agents、config 摘要。不做 git 扫描,不返回 repo clean 状态。workspace.html 中 "Repo Clean 状态" 显示为"按需接口待实现"占位。
201
- 2. **task-detail / workspace / audit 为基础接入**:能加载数据并渲染,但未实现全部高级功能(如 diff 高亮、审计证据深度展示)。diff/test-log 仅做文本预览。
202
- 3. **进程控制仅支持 Windows**:`manage-patchwarden.ps1` 为 PowerShell 脚本,POST 控制接口在非 Windows 环境下不可用。`/api/open-logs-folder` 在 macOS/Linux 下会尝试 `open`/`xdg-open`。
203
- 4. **Health 探测端口固定**:Core 探测 `127.0.0.1:8080`,Direct 探测 `127.0.0.1:8081`,暂不支持配置覆盖。
204
- 5. **Control token 生命周期**:token 在服务进程内存中,服务重启后 token 会变化(前端通过 `/control-token.json` 重新获取)。
205
- 6. **日志读取**:仅返回各日志文件尾部 100 行,并对敏感内容脱敏(复用 `redactSensitiveContent`)。