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
@@ -1,4 +1,4 @@
1
- import { type DirectSessionAuditOutput } from "../direct/directAudit.js";
1
+ import { type DirectSessionAuditOutput } from "../../direct/directAudit.js";
2
2
  export interface AuditSessionInput {
3
3
  session_id: string;
4
4
  }
@@ -1,5 +1,5 @@
1
- import { auditDirectSession, } from "../direct/directAudit.js";
2
- import { updateDirectSession } from "../direct/directSessionStore.js";
1
+ import { auditDirectSession, } from "../../direct/directAudit.js";
2
+ import { updateDirectSession } from "../../direct/directSessionStore.js";
3
3
  // ── Main function ──────────────────────────────────────────────────
4
4
  export function auditSession(input) {
5
5
  const { session_id } = input;
@@ -32,97 +32,42 @@ export interface AuditTaskOutput {
32
32
  manual_verification_items: string[];
33
33
  recommended_next_actions: string[];
34
34
  }
35
+ import type { ChangedFile } from "../../runner/changeCapture.js";
35
36
  /**
36
37
  * Check 1: forbidden_scope_violation (fail level).
37
38
  * Returns null when no forbidden patterns are configured (skip).
38
39
  * Returns pass when changed files do not match any forbidden pattern.
39
40
  * Returns fail when any changed file path (or old_path) matches a forbidden glob.
40
41
  */
41
- export declare function checkForbiddenScope(changedFiles: any, forbidden: any): {
42
- name: string;
43
- result: string;
44
- detail: string;
45
- } | null;
42
+ export declare function checkForbiddenScope(changedFiles: ChangedFile[], forbidden: string[] | null): AuditCheck | null;
46
43
  /**
47
44
  * Check 2: done_evidence_missing (warn level).
48
45
  * Returns null when no done_evidence list is configured (skip).
49
46
  * Returns pass when all listed files exist in the task directory.
50
47
  * Returns warn when any listed file is missing.
51
48
  */
52
- export declare function checkDoneEvidenceMissing(taskDir: any, doneEvidence: any): {
53
- name: string;
54
- result: string;
55
- detail: string;
56
- } | null;
49
+ export declare function checkDoneEvidenceMissing(taskDir: string, doneEvidence: string[] | null): AuditCheck | null;
57
50
  /**
58
51
  * Check 3: readme_changelog_sync (warn level).
59
52
  * Returns null when no code files (by extension) were changed (skip).
60
53
  * Returns pass when README.md or CHANGELOG.md (basename, case-insensitive) is also changed.
61
54
  * Returns warn when code changed but neither documentation file was updated.
62
55
  */
63
- export declare function checkReadmeChangelogSync(changedFiles: any): {
64
- name: string;
65
- result: string;
66
- detail: string;
67
- } | null;
56
+ export declare function checkReadmeChangelogSync(changedFiles: ChangedFile[]): AuditCheck | null;
68
57
  /**
69
58
  * Check 4: package_manifest_consistency (warn level).
70
59
  * Returns null when package.json is not among changed files (skip).
71
60
  * Returns pass when package.json parses as JSON and has non-empty name and version strings.
72
61
  * Returns warn otherwise.
73
62
  */
74
- export declare function checkPackageManifestConsistency(changedFiles: any, repoPathSafe: any): {
75
- name: string;
76
- result: string;
77
- detail: string;
78
- } | null;
63
+ export declare function checkPackageManifestConsistency(changedFiles: ChangedFile[], repoPathSafe: string): AuditCheck | null;
79
64
  /**
80
65
  * Check 5: sensitive_path_access (fail level).
81
66
  * Returns null when there are no changed files (skip).
82
67
  * Returns pass when no changed file path (or old_path) is sensitive.
83
68
  * Returns fail when any changed file path is flagged by isSensitivePath.
84
69
  */
85
- export declare function checkSensitivePathAccess(changedFiles: any): {
86
- name: string;
87
- result: string;
88
- detail: string;
89
- } | null;
90
- export declare function checkUnrecordedCommandExecution(testLogContent: string | null, resultMdContent: string | null, verifyCommands: string[], testCommand: string | null, repoPath?: string | null): {
91
- name: string;
92
- result: string;
93
- detail: string;
94
- } | null;
95
- export declare function auditTask(taskId: any): {
96
- task_id: any;
97
- verdict: string;
98
- acceptance: {
99
- verdict: import("../goal/acceptanceEngine.js").AcceptanceVerdict;
100
- status: string;
101
- reason: string;
102
- reasons: string[];
103
- required_evidence: string[];
104
- next_suggested_task: string;
105
- fail_checks: import("../goal/acceptanceEngine.js").AcceptanceCheck[];
106
- warn_checks: import("../goal/acceptanceEngine.js").AcceptanceCheck[];
107
- };
108
- summary: string;
109
- checks: {
110
- name: string;
111
- result: string;
112
- detail: string;
113
- }[];
114
- risks: {
115
- severity: string;
116
- description: string;
117
- }[];
118
- confirmed_failures: {
119
- name: string;
120
- result: string;
121
- detail: string;
122
- }[];
123
- possible_false_positives: any[];
124
- manual_verification_required: boolean;
125
- manual_verification_items: any[];
126
- recommended_next_actions: string[];
127
- };
70
+ export declare function checkSensitivePathAccess(changedFiles: ChangedFile[]): AuditCheck | null;
71
+ export declare function checkUnrecordedCommandExecution(testLogContent: string | null, resultMdContent: string | null, verifyCommands: string[], testCommand: string | null, repoPath?: string | null): AuditCheck | null;
72
+ export declare function auditTask(taskId: string): AuditTaskOutput;
128
73
  export {};
@@ -1,11 +1,13 @@
1
- // @ts-nocheck
2
- import { readFileSync, existsSync, writeFileSync, readdirSync, statSync } from "node:fs";
1
+ import { readFileSync, existsSync, opendirSync, statSync } from "node:fs";
3
2
  import { join, resolve, relative, basename, sep, isAbsolute } from "node:path";
4
- import { getTasksDir, getConfig } from "../config.js";
5
- import { guardReadPath, guardWorkspacePath } from "../security/pathGuard.js";
6
- import { guardSensitivePath, isSensitivePath } from "../security/sensitiveGuard.js";
7
- import { evaluateAcceptance } from "../goal/acceptanceEngine.js";
8
- import { renderAcceptanceMarkdown } from "../goal/acceptanceTemplate.js";
3
+ import { getTasksDir, getConfig } from "../../config.js";
4
+ import { guardReadPath, guardWorkspacePath } from "../../security/pathGuard.js";
5
+ import { guardSensitivePath, isSensitivePath } from "../../security/sensitiveGuard.js";
6
+ import { evaluateAcceptance } from "../../goal/acceptanceEngine.js";
7
+ import { renderAcceptanceMarkdown } from "../../goal/acceptanceTemplate.js";
8
+ import { atomicWriteFileSync } from "../../utils/atomicFile.js";
9
+ import { mutateTaskStatus } from "../../runner/taskStatusStore.js";
10
+ import { readTextFilePrefixSync, readTextFileTailLinesSync, } from "../../utils/boundedFile.js";
9
11
  // Release claim patterns — anything that claims remote publish/release/deploy
10
12
  const RELEASE_PATTERNS = [
11
13
  /npm\s+package\s+version\s+published/i,
@@ -17,6 +19,10 @@ const RELEASE_PATTERNS = [
17
19
  /npm\s+publish\s+completed/i,
18
20
  /deploy(ed|ment)?\s+(to|on)\s+(npm|registry|github)/i,
19
21
  ];
22
+ const MAX_AUDIT_DOC_FILES = 200;
23
+ const MAX_AUDIT_DOC_FILE_BYTES = 512 * 1024;
24
+ const MAX_AUDIT_DOC_TOTAL_BYTES = 4 * 1024 * 1024;
25
+ const MAX_AUDIT_EVIDENCE_BYTES = 1024 * 1024;
20
26
  function scanForReleaseClaims(text) {
21
27
  const found = [];
22
28
  for (const pattern of RELEASE_PATTERNS) {
@@ -26,24 +32,57 @@ function scanForReleaseClaims(text) {
26
32
  }
27
33
  return found;
28
34
  }
29
- function findMdFiles(dir, maxDepth = 3) {
35
+ function findMdFiles(dir, maxDepth = 3, maxFiles = MAX_AUDIT_DOC_FILES) {
30
36
  const results = [];
31
- if (!existsSync(dir) || maxDepth <= 0)
32
- return results;
33
- try {
34
- const entries = readdirSync(dir, { withFileTypes: true });
35
- for (const e of entries) {
36
- const full = join(dir, e.name);
37
- if (e.isDirectory() && !e.name.startsWith(".") && e.name !== "node_modules") {
38
- results.push(...findMdFiles(full, maxDepth - 1));
37
+ const pending = [{ path: dir, depth: maxDepth }];
38
+ const maxDirectories = maxFiles * 4;
39
+ let visitedDirectories = 0;
40
+ let truncated = false;
41
+ while (pending.length > 0 && results.length < maxFiles && visitedDirectories < maxDirectories) {
42
+ const current = pending.pop();
43
+ if (!existsSync(current.path) || current.depth <= 0)
44
+ continue;
45
+ visitedDirectories += 1;
46
+ let handle;
47
+ try {
48
+ handle = opendirSync(current.path);
49
+ while (results.length < maxFiles) {
50
+ const entry = handle.readSync();
51
+ if (!entry)
52
+ break;
53
+ const full = join(current.path, entry.name);
54
+ if (entry.isDirectory() && !entry.name.startsWith(".") && entry.name !== "node_modules") {
55
+ if (pending.length < maxDirectories)
56
+ pending.push({ path: full, depth: current.depth - 1 });
57
+ else
58
+ truncated = true;
59
+ }
60
+ else if (entry.isFile() && entry.name.toLowerCase().endsWith(".md")) {
61
+ results.push(full);
62
+ }
39
63
  }
40
- else if (e.isFile() && e.name.endsWith(".md")) {
41
- results.push(full);
64
+ }
65
+ catch { /* skip unreadable dirs */ }
66
+ finally {
67
+ try {
68
+ handle?.closeSync();
42
69
  }
70
+ catch { /* best effort */ }
43
71
  }
44
72
  }
45
- catch { /* skip unreadable dirs */ }
46
- return results;
73
+ truncated ||= pending.length > 0 || results.length >= maxFiles || visitedDirectories >= maxDirectories;
74
+ return { files: results, truncated };
75
+ }
76
+ function readAuditEvidence(path) {
77
+ const half = Math.floor(MAX_AUDIT_EVIDENCE_BYTES / 2);
78
+ const prefix = readTextFilePrefixSync(path, half);
79
+ if (!prefix.truncated)
80
+ return { content: prefix.content, truncated: false };
81
+ const tail = readTextFileTailLinesSync(path, 1000, half);
82
+ return {
83
+ content: `${prefix.content}\n[...audit evidence truncated...]\n${tail}`,
84
+ truncated: true,
85
+ };
47
86
  }
48
87
  // ── v0.7.2: New audit checks (exported for testing) ────────────────
49
88
  /**
@@ -288,9 +327,10 @@ function readPackageScripts(repoPath) {
288
327
  try {
289
328
  guardSensitivePath(pkgJsonPath);
290
329
  const parsed = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
291
- if (!parsed.scripts || typeof parsed.scripts !== "object" || Array.isArray(parsed.scripts))
330
+ const scripts = parsed.scripts;
331
+ if (!scripts || typeof scripts !== "object" || Array.isArray(scripts))
292
332
  return {};
293
- return Object.fromEntries(Object.entries(parsed.scripts).filter(([, value]) => typeof value === "string"));
333
+ return Object.fromEntries(Object.entries(scripts).filter(([, value]) => typeof value === "string"));
294
334
  }
295
335
  catch {
296
336
  return {};
@@ -370,8 +410,8 @@ function findHighRiskCommandEvidence(text) {
370
410
  return [...new Set(found)];
371
411
  }
372
412
  export function checkUnrecordedCommandExecution(testLogContent, resultMdContent, verifyCommands, testCommand, repoPath = null) {
373
- const hasLog = testLogContent && testLogContent.length > 0;
374
- const hasResult = resultMdContent && resultMdContent.length > 0;
413
+ const hasLog = !!testLogContent && testLogContent.length > 0;
414
+ const hasResult = !!resultMdContent && resultMdContent.length > 0;
375
415
  if (!hasLog && !hasResult)
376
416
  return null;
377
417
  const combined = `${testLogContent || ""}\n${resultMdContent || ""}`;
@@ -381,9 +421,9 @@ export function checkUnrecordedCommandExecution(testLogContent, resultMdContent,
381
421
  }
382
422
  const whitelist = buildCommandWhitelist(verifyCommands, testCommand, repoPath);
383
423
  const discovered = [];
384
- if (hasLog)
424
+ if (hasLog && testLogContent)
385
425
  discovered.push(...extractCommands(testLogContent));
386
- if (hasResult)
426
+ if (hasResult && resultMdContent)
387
427
  discovered.push(...extractCommands(resultMdContent));
388
428
  const unrecorded = new Set();
389
429
  for (const cmd of discovered) {
@@ -606,20 +646,32 @@ export function auditTask(taskId) {
606
646
  if (existsSync(readmePath))
607
647
  docsToScan.push(readmePath);
608
648
  const docsDir = join(repoPathSafe, "docs");
649
+ let markdownEnumerationTruncated = false;
609
650
  if (existsSync(docsDir)) {
610
- docsToScan.push(...findMdFiles(docsDir));
651
+ const markdown = findMdFiles(docsDir);
652
+ docsToScan.push(...markdown.files);
653
+ markdownEnumerationTruncated = markdown.truncated;
611
654
  }
612
655
  // Collect all npm run references from all docs
613
656
  const allNpmRunRefs = new Set();
614
657
  const allReleaseClaims = [];
658
+ let remainingDocBytes = MAX_AUDIT_DOC_TOTAL_BYTES;
659
+ let documentScanTruncated = markdownEnumerationTruncated || docsToScan.length > MAX_AUDIT_DOC_FILES;
615
660
  for (const docPath of docsToScan) {
661
+ if (remainingDocBytes <= 0) {
662
+ documentScanTruncated = true;
663
+ break;
664
+ }
616
665
  let content;
617
666
  try {
618
667
  if (docPath !== resultFile) {
619
668
  guardReadPath(docPath, config.workspaceRoot);
620
669
  guardSensitivePath(docPath);
621
670
  }
622
- content = readFileSync(docPath, "utf-8");
671
+ const bounded = readTextFilePrefixSync(docPath, Math.min(MAX_AUDIT_DOC_FILE_BYTES, remainingDocBytes));
672
+ content = bounded.content;
673
+ remainingDocBytes -= Buffer.byteLength(content, "utf-8");
674
+ documentScanTruncated ||= bounded.truncated;
623
675
  }
624
676
  catch {
625
677
  continue;
@@ -636,6 +688,14 @@ export function auditTask(taskId) {
636
688
  for (const c of claims)
637
689
  allReleaseClaims.push(`[${relative(repoPathSafe, docPath) || docPath}] ${c}`);
638
690
  }
691
+ if (documentScanTruncated) {
692
+ checks.push({
693
+ name: "documentation_scan_bounded",
694
+ result: "warn",
695
+ detail: `Documentation scan reached its ${MAX_AUDIT_DOC_FILES}-file or ${MAX_AUDIT_DOC_TOTAL_BYTES}-byte safety budget.`,
696
+ });
697
+ addManualVerification("Review documentation omitted by the bounded audit scan.");
698
+ }
639
699
  // Cross-check npm run refs against package.json scripts
640
700
  for (const scriptName of allNpmRunRefs) {
641
701
  if (pkgScripts.length > 0 && !pkgScripts.includes(scriptName)) {
@@ -682,7 +742,10 @@ export function auditTask(taskId) {
682
742
  if (hasTestLog) {
683
743
  let logContent;
684
744
  try {
685
- logContent = readFileSync(testLogFile, "utf-8");
745
+ const evidence = readAuditEvidence(testLogFile);
746
+ logContent = evidence.content;
747
+ if (evidence.truncated)
748
+ addManualVerification("test.log exceeded the audit read budget; inspect the complete local artifact.");
686
749
  }
687
750
  catch {
688
751
  logContent = "";
@@ -720,7 +783,10 @@ export function auditTask(taskId) {
720
783
  let resultMdContent = null;
721
784
  if (hasResult) {
722
785
  try {
723
- resultMdContent = readFileSync(resultFile, "utf-8");
786
+ const evidence = readAuditEvidence(resultFile);
787
+ resultMdContent = evidence.content;
788
+ if (evidence.truncated)
789
+ addManualVerification("result.md exceeded the audit read budget; inspect the complete local artifact.");
724
790
  }
725
791
  catch {
726
792
  resultMdContent = null;
@@ -788,7 +854,7 @@ export function auditTask(taskId) {
788
854
  "## Recommended Actions",
789
855
  ...actions.map((a) => `- ${a}`),
790
856
  ].join("\n");
791
- writeFileSync(join(taskDir, "independent-review.md"), reviewMd, "utf-8");
857
+ atomicWriteFileSync(join(taskDir, "independent-review.md"), reviewMd);
792
858
  // ── v0.7.2: 集成 acceptanceEngine ──
793
859
  const releaseClaimsUnverified = allReleaseClaims.length > 0;
794
860
  const acceptanceEvidence = {
@@ -804,7 +870,11 @@ export function auditTask(taskId) {
804
870
  return null;
805
871
  try {
806
872
  const v = JSON.parse(readFileSync(verifyJsonFile, "utf-8"));
807
- return v.status === "passed" ? "passed" : v.status === "failed" ? "failed" : "skipped";
873
+ if (v.status === "passed")
874
+ return "passed";
875
+ if (v.status === "failed")
876
+ return "failed";
877
+ return "skipped";
808
878
  }
809
879
  catch {
810
880
  return null;
@@ -823,16 +893,20 @@ export function auditTask(taskId) {
823
893
  const acceptanceResult = evaluateAcceptance(acceptanceEvidence);
824
894
  // 回写 status.json 的 acceptance_status(仅对 done_by_agent 有意义)
825
895
  if (taskStatus === "done_by_agent") {
826
- const updatedStatus = {
827
- ...statusData,
896
+ const statusPatch = {
828
897
  acceptance_status: acceptanceResult.acceptance_status,
829
- updated_at: new Date().toISOString(),
830
898
  };
831
- writeFileSync(statusFile, JSON.stringify(updatedStatus, null, 2), "utf-8");
899
+ mutateTaskStatus(statusFile, (current) => {
900
+ if (current.status !== "done_by_agent") {
901
+ return { result: current };
902
+ }
903
+ const next = { ...current, ...statusPatch, updated_at: new Date().toISOString() };
904
+ return { next, result: next };
905
+ });
832
906
  }
833
907
  // 导出 ACCEPTANCE.md
834
908
  const acceptanceMd = renderAcceptanceMarkdown(taskId, acceptanceResult, acceptanceEvidence);
835
- writeFileSync(join(taskDir, "ACCEPTANCE.md"), acceptanceMd, "utf-8");
909
+ atomicWriteFileSync(join(taskDir, "ACCEPTANCE.md"), acceptanceMd);
836
910
  return {
837
911
  task_id: taskId,
838
912
  verdict,
@@ -1,4 +1,4 @@
1
- import type { ToolCatalogSnapshot } from "./toolCatalog.js";
1
+ import type { ToolCatalogSnapshot } from "../catalog/toolCatalog.js";
2
2
  export interface HealthCheckInput {
3
3
  detail?: "standard" | "self_diagnostic";
4
4
  }
@@ -14,9 +14,9 @@ export declare function healthCheck(catalog?: ToolCatalogSnapshot, input?: Healt
14
14
  recent_tasks_returned: number;
15
15
  recent_failures: {
16
16
  task_id: string;
17
- status: import("./createTask.js").TaskStatus;
18
- phase: import("./createTask.js").TaskPhase;
19
- pending_reason: import("../watcherStatus.js").PendingReason;
17
+ status: import("../tasks/createTask.js").TaskStatus;
18
+ phase: import("../tasks/createTask.js").TaskPhase;
19
+ pending_reason: import("../../watcherStatus.js").PendingReason;
20
20
  error: string | null;
21
21
  }[];
22
22
  } | undefined;
@@ -37,7 +37,7 @@ export declare function healthCheck(catalog?: ToolCatalogSnapshot, input?: Healt
37
37
  };
38
38
  watcher: {
39
39
  supervisor: Record<string, unknown>;
40
- status: import("../watcherStatus.js").WatcherState;
40
+ status: import("../../watcherStatus.js").WatcherState;
41
41
  available: boolean;
42
42
  stale_after_seconds: number;
43
43
  last_heartbeat_at: string | null;
@@ -65,7 +65,7 @@ export declare function healthCheck(catalog?: ToolCatalogSnapshot, input?: Healt
65
65
  tunnel: Record<string, unknown> & {
66
66
  last_error: string | null;
67
67
  };
68
- agents: import("./listAgents.js").AgentAvailability[];
68
+ agents: import("../workspace/listAgents.js").AgentAvailability[];
69
69
  agent_status: {
70
70
  [k: string]: string;
71
71
  };
@@ -1,13 +1,13 @@
1
1
  import { accessSync, constants, existsSync, readFileSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { dirname, join } from "node:path";
4
- import { getConfig, getTasksDir, getDirectSessionsDir, resolveWorkspaceRoot } from "../config.js";
5
- import { listAgents } from "./listAgents.js";
6
- import { redactSensitiveContent, redactSensitiveValue } from "../security/contentRedaction.js";
7
- import { PATCHWARDEN_VERSION, TOOL_SCHEMA_EPOCH } from "../version.js";
8
- import { CHATGPT_CORE_TOOL_NAMES, CHATGPT_DIRECT_TOOL_NAMES, CHATGPT_SEARCH_TOOL_NAMES, resolveToolProfile } from "./toolCatalog.js";
9
- import { readWatcherStatus } from "../watcherStatus.js";
10
- import { listTasks } from "./listTasks.js";
4
+ import { getConfig, getTasksDir, getDirectSessionsDir, resolveWorkspaceRoot } from "../../config.js";
5
+ import { listAgents } from "../workspace/listAgents.js";
6
+ import { redactSensitiveContent, redactSensitiveValue } from "../../security/contentRedaction.js";
7
+ import { PATCHWARDEN_VERSION, TOOL_SCHEMA_EPOCH } from "../../version.js";
8
+ import { CHATGPT_CORE_TOOL_NAMES, CHATGPT_DIRECT_TOOL_NAMES, CHATGPT_SEARCH_TOOL_NAMES, resolveToolProfile } from "../catalog/toolCatalog.js";
9
+ import { readWatcherStatus } from "../../watcherStatus.js";
10
+ import { listTasks } from "../tasks/listTasks.js";
11
11
  const SERVER_STARTED_AT = Date.now();
12
12
  export function healthCheck(catalog, input = {}) {
13
13
  const config = getConfig();
@@ -185,7 +185,7 @@ function directoryStatus(path, allowCreatable, createRoot) {
185
185
  accessSync(parent, constants.R_OK | constants.W_OK);
186
186
  return { available: true, path, readable: false, writable: true, reason: "Directory will be created on first use." };
187
187
  }
188
- catch { }
188
+ catch { } // probe failure handled by return value
189
189
  }
190
190
  return { available: false, path, readable: false, writable: false, reason: "Directory does not exist." };
191
191
  }
@@ -195,12 +195,12 @@ function directoryStatus(path, allowCreatable, createRoot) {
195
195
  accessSync(path, constants.R_OK);
196
196
  readable = true;
197
197
  }
198
- catch { }
198
+ catch { } // probe failure handled by return value
199
199
  try {
200
200
  accessSync(path, constants.W_OK);
201
201
  writable = true;
202
202
  }
203
- catch { }
203
+ catch { } // probe failure handled by return value
204
204
  return {
205
205
  available: readable && writable,
206
206
  path,
@@ -0,0 +1,6 @@
1
+ export * from "./auditSession.js";
2
+ export * from "./auditTask.js";
3
+ export * from "./healthCheck.js";
4
+ export * from "./safeStatus.js";
5
+ export * from "./safeViews.js";
6
+ export * from "./schemaDriftCheck.js";
@@ -0,0 +1,6 @@
1
+ export * from "./auditSession.js";
2
+ export * from "./auditTask.js";
3
+ export * from "./healthCheck.js";
4
+ export * from "./safeStatus.js";
5
+ export * from "./safeViews.js";
6
+ export * from "./schemaDriftCheck.js";
@@ -1,6 +1,6 @@
1
- import { type PatchWardenConfig } from "../config.js";
2
- import type { TaskStatus, TaskPhase, AcceptanceStatus } from "./createTask.js";
3
- import { type DiagnosisType, type DiagnosisConfidence } from "./diagnoseTask.js";
1
+ import { type PatchWardenConfig } from "../../config.js";
2
+ import type { TaskStatus, TaskPhase, AcceptanceStatus } from "../tasks/createTask.js";
3
+ import { type DiagnosisType, type DiagnosisConfidence } from "../tasks/diagnoseTask.js";
4
4
  export interface SafeStatusOutput {
5
5
  task_id: string;
6
6
  status: TaskStatus | "not_found";
@@ -1,11 +1,11 @@
1
1
  import { readFileSync, existsSync } from "node:fs";
2
2
  import { resolve, join } from "node:path";
3
- import { getTasksDir, getConfig } from "../config.js";
4
- import { guardReadPath } from "../security/pathGuard.js";
5
- import { guardSensitivePath } from "../security/sensitiveGuard.js";
6
- import { readTaskRuntime } from "../taskRuntime.js";
7
- import { readWatcherStatus } from "../watcherStatus.js";
8
- import { diagnoseTask } from "./diagnoseTask.js";
3
+ import { getTasksDir, getConfig } from "../../config.js";
4
+ import { guardReadPath } from "../../security/pathGuard.js";
5
+ import { guardSensitivePath } from "../../security/sensitiveGuard.js";
6
+ import { readTaskRuntime } from "../../runner/taskRuntime.js";
7
+ import { readWatcherStatus } from "../../watcherStatus.js";
8
+ import { diagnoseTask } from "../tasks/diagnoseTask.js";
9
9
  export function safeStatus(taskId, config) {
10
10
  const cfg = config || getConfig();
11
11
  const tasksDir = getTasksDir(cfg);
@@ -2,6 +2,7 @@ export interface SafeViewOptions {
2
2
  max_items?: number;
3
3
  }
4
4
  export declare function safeResult(taskId: string, options?: SafeViewOptions): {
5
+ schema_version: string;
5
6
  task_id: string;
6
7
  status: string;
7
8
  terminal: boolean;
@@ -32,6 +33,7 @@ export declare function safeResult(taskId: string, options?: SafeViewOptions): {
32
33
  redaction_categories: string[];
33
34
  };
34
35
  export declare function safeTestSummary(taskId: string): {
36
+ schema_version: string;
35
37
  task_id: string;
36
38
  status: string;
37
39
  command_count: number;
@@ -41,19 +43,20 @@ export declare function safeTestSummary(taskId: string): {
41
43
  commands: {
42
44
  command: string;
43
45
  status: string;
44
- exit_code: any;
46
+ exit_code: {} | null;
45
47
  duration_ms: number;
46
48
  }[];
47
49
  headline: string;
48
50
  };
49
51
  export declare function safeDiffSummary(taskId: string, options?: SafeViewOptions): {
52
+ schema_version: string;
50
53
  task_id: string;
51
54
  changed_files_total: number;
52
55
  additions: number;
53
56
  deletions: number;
54
57
  diff_available: boolean;
55
58
  diff_truncated: boolean;
56
- patch_mode: any;
59
+ patch_mode: {} | null;
57
60
  files: {
58
61
  path: string;
59
62
  old_path: string | null;
@@ -62,13 +65,14 @@ export declare function safeDiffSummary(taskId: string, options?: SafeViewOption
62
65
  tracked: boolean;
63
66
  ignored: boolean;
64
67
  }[];
65
- artifact_hygiene_counts: Record<string, any>;
68
+ artifact_hygiene_counts: Record<string, unknown>;
66
69
  large_diff_omitted: boolean;
67
70
  truncated: boolean;
68
71
  };
69
72
  export declare function safeAudit(taskId: string, options?: SafeViewOptions): {
73
+ schema_version: string;
70
74
  task_id: string;
71
- verdict: "pass" | "warn" | "fail";
75
+ verdict: "warn" | "pass" | "fail";
72
76
  acceptance: {
73
77
  verdict: string;
74
78
  status: string;
@@ -84,17 +88,17 @@ export declare function safeAudit(taskId: string, options?: SafeViewOptions): {
84
88
  };
85
89
  checks: {
86
90
  name: string;
87
- result: "pass" | "warn" | "fail";
91
+ result: "warn" | "pass" | "fail";
88
92
  detail: string;
89
93
  }[];
90
94
  fail_checks: {
91
95
  name: string;
92
- result: "pass" | "warn" | "fail";
96
+ result: "warn" | "pass" | "fail";
93
97
  detail: string;
94
98
  }[];
95
99
  warn_checks: {
96
100
  name: string;
97
- result: "pass" | "warn" | "fail";
101
+ result: "warn" | "pass" | "fail";
98
102
  detail: string;
99
103
  }[];
100
104
  possible_false_positives: {
@@ -170,7 +174,7 @@ export declare function safeDirectSummary(sessionId: string, options?: SafeViewO
170
174
  large_diff_omitted: boolean;
171
175
  truncated: boolean;
172
176
  };
173
- export declare function safeFinalizeDirectSession(sessionId: string, options?: SafeViewOptions): {
177
+ export declare function safeFinalizeDirectSession(sessionId: string, options?: SafeViewOptions): Promise<{
174
178
  finalized: boolean;
175
179
  next_action: string;
176
180
  view: "summary" | "finalize";
@@ -235,10 +239,10 @@ export declare function safeFinalizeDirectSession(sessionId: string, options?: S
235
239
  }[];
236
240
  large_diff_omitted: boolean;
237
241
  truncated: boolean;
238
- };
242
+ }>;
239
243
  export declare function safeAuditDirectSession(sessionId: string, options?: SafeViewOptions): {
240
244
  session_id: string;
241
- decision: "pass" | "warn" | "fail";
245
+ decision: "warn" | "pass" | "fail";
242
246
  reason_codes: string[];
243
247
  blocking_findings: string[];
244
248
  warnings: string[];