claude-flow-novice 2.15.3 → 2.15.5

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 (473) hide show
  1. package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  2. package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  3. package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  4. package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  5. package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  6. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  7. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  8. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  9. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  10. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  11. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  12. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  13. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  14. package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  15. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  16. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  17. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  18. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  19. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  20. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  21. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  22. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  23. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  24. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  25. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  26. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  27. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  28. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  29. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  30. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  31. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  32. package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  33. package/.claude/commands/cfn-loop-cli.md +29 -6
  34. package/.claude/commands/switch-api.md +31 -10
  35. package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
  36. package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
  37. package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
  38. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  39. package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  40. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  41. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  42. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  43. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  44. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +238 -29
  45. package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  46. package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  47. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  48. package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
  49. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  50. package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
  51. package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  52. package/.claude/skills/cfn-redis-coordination/get-context.sh +33 -0
  53. package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  54. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +6 -2
  55. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  56. package/.claude/skills/cfn-redis-coordination/redis-functions.sh +34 -0
  57. package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
  58. package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
  59. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  60. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  61. package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  62. package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  63. package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
  64. package/README.md +116 -475
  65. package/claude-assets/agents/cfn-dev-team/README.md +103 -0
  66. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
  67. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
  68. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
  69. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
  70. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
  71. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
  72. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
  73. package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
  74. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
  75. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
  76. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
  77. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
  78. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
  79. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
  80. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
  81. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
  82. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
  83. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
  84. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
  85. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
  86. package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
  87. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
  88. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
  89. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
  90. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
  91. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
  92. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
  93. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
  94. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  95. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
  96. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
  97. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
  98. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
  99. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
  100. package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
  101. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
  102. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
  103. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
  104. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
  105. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
  106. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
  107. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
  108. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  109. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  110. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  111. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  112. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  113. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  114. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  115. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  116. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  117. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  118. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  119. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  120. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  121. package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  122. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  123. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  124. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  125. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  126. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  127. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  128. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  129. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  130. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  131. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  132. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  133. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  134. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  135. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  136. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  137. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  138. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  139. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  140. package/claude-assets/commands/cfn-loop-cli.md +29 -6
  141. package/claude-assets/commands/switch-api.md +31 -10
  142. package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
  143. package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
  144. package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
  145. package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
  146. package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
  147. package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +84 -113
  148. package/claude-assets/skills/agent-lifecycle/simple-audit.sh +33 -6
  149. package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
  150. package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
  151. package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
  152. package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
  153. package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
  154. package/claude-assets/skills/bootstrap/database-connection.md +464 -0
  155. package/claude-assets/skills/bootstrap/error-handling.md +580 -0
  156. package/claude-assets/skills/bootstrap/file-operations.md +699 -0
  157. package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
  158. package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
  159. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  160. package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
  161. package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
  162. package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
  163. package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  164. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  165. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  166. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
  167. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
  168. package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
  169. package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
  170. package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
  171. package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
  172. package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
  173. package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
  174. package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
  175. package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
  176. package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
  177. package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
  178. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  179. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  180. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +238 -29
  181. package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  182. package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  183. package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
  184. package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
  185. package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
  186. package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
  187. package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
  188. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  189. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
  190. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  191. package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
  192. package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  193. package/claude-assets/skills/cfn-redis-coordination/get-context.sh +33 -0
  194. package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  195. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +6 -2
  196. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  197. package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +34 -0
  198. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
  199. package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
  200. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  201. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  202. package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
  203. package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
  204. package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  205. package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
  206. package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
  207. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
  208. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
  209. package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
  210. package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  211. package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
  212. package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
  213. package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
  214. package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
  215. package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
  216. package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
  217. package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
  218. package/claude-assets/skills/cfn-utilities/test.sh +317 -0
  219. package/claude-assets/skills/integration/agent-handoff.sh +62 -64
  220. package/claude-assets/skills/json-validation/SKILL.md +431 -0
  221. package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
  222. package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
  223. package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
  224. package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
  225. package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
  226. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
  227. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
  228. package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
  229. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
  230. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
  231. package/claude-assets/skills/workflow-codification/test-integration.sh +15 -0
  232. package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
  233. package/claude-assets/skills/workflow-codification/track-cost-savings.sh +55 -14
  234. package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
  235. package/claude-assets/skills/workflow-codification/track-edge-case.sh +27 -60
  236. package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
  237. package/dist/ace/ace-curator.js +10 -2
  238. package/dist/ace/ace-curator.js.map +1 -1
  239. package/dist/ace/ace-generator.js +4 -0
  240. package/dist/ace/ace-generator.js.map +1 -1
  241. package/dist/ace/ace-reflector.js +1 -1
  242. package/dist/ace/ace-reflector.js.map +1 -1
  243. package/dist/ace/context-injection.js +24 -2
  244. package/dist/ace/context-injection.js.map +1 -1
  245. package/dist/agents/task-agent-integration.js +1 -1
  246. package/dist/agents/task-agent-integration.js.map +1 -1
  247. package/dist/api/health-endpoints.js +390 -0
  248. package/dist/api/health-endpoints.js.map +1 -0
  249. package/dist/cli/agent-executor.js +4 -1
  250. package/dist/cli/agent-executor.js.map +1 -1
  251. package/dist/cli/agent-prompt-builder.js +89 -1
  252. package/dist/cli/agent-prompt-builder.js.map +1 -1
  253. package/dist/cli/agent-spawn.js +130 -37
  254. package/dist/cli/agent-spawn.js.map +1 -1
  255. package/dist/cli/config-manager.js +109 -91
  256. package/dist/cli/config-manager.js.map +1 -1
  257. package/dist/cli/conversation-fork-cleanup.js +201 -0
  258. package/dist/cli/conversation-fork-cleanup.js.map +1 -0
  259. package/dist/cli/conversation-fork.js +16 -3
  260. package/dist/cli/conversation-fork.js.map +1 -1
  261. package/dist/cli/skill-cache-validator.js +412 -0
  262. package/dist/cli/skill-cache-validator.js.map +1 -0
  263. package/dist/cli/skill-cli.js +991 -0
  264. package/dist/cli/skill-cli.js.map +1 -0
  265. package/dist/cli/skill-execution-logger.js +284 -0
  266. package/dist/cli/skill-execution-logger.js.map +1 -0
  267. package/dist/cli/skill-loader.js +457 -0
  268. package/dist/cli/skill-loader.js.map +1 -0
  269. package/dist/coordination/event-bus.js +2 -2
  270. package/dist/coordination/event-bus.js.map +1 -1
  271. package/dist/coordination/fleet-manager.js +1 -1
  272. package/dist/coordination/fleet-manager.js.map +1 -1
  273. package/dist/coordination/index.js +23 -9
  274. package/dist/coordination/index.js.map +1 -1
  275. package/dist/coordination/types/fleet-manager.types.js.map +1 -1
  276. package/dist/db/migration-manager.js +483 -0
  277. package/dist/db/migration-manager.js.map +1 -0
  278. package/dist/db/skills-query.js +535 -0
  279. package/dist/db/skills-query.js.map +1 -0
  280. package/dist/integration/DatabaseHandoff.js +1 -1
  281. package/dist/integration/DatabaseHandoff.js.map +1 -1
  282. package/dist/jobs/edge-case-analyzer.js +367 -0
  283. package/dist/jobs/edge-case-analyzer.js.map +1 -0
  284. package/dist/jobs/promotion-sla-enforcer.js +288 -0
  285. package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
  286. package/dist/lib/agent-output-parser.js.map +1 -1
  287. package/dist/lib/agent-output-validator.js.map +1 -1
  288. package/dist/lib/agent-workspace.js +281 -0
  289. package/dist/lib/agent-workspace.js.map +1 -0
  290. package/dist/lib/atomic-file-writer.js +377 -0
  291. package/dist/lib/atomic-file-writer.js.map +1 -0
  292. package/dist/lib/backup-manager.js +779 -0
  293. package/dist/lib/backup-manager.js.map +1 -0
  294. package/dist/lib/checkpoint-manager.js +837 -0
  295. package/dist/lib/checkpoint-manager.js.map +1 -0
  296. package/dist/lib/circuit-breaker.js +340 -0
  297. package/dist/lib/circuit-breaker.js.map +1 -0
  298. package/dist/lib/completion-signal-handler.js +243 -0
  299. package/dist/lib/completion-signal-handler.js.map +1 -0
  300. package/dist/lib/config-manager.js +312 -0
  301. package/dist/lib/config-manager.js.map +1 -0
  302. package/dist/lib/config-migrator.js +386 -0
  303. package/dist/lib/config-migrator.js.map +1 -0
  304. package/dist/lib/config-validator.js.map +1 -1
  305. package/dist/lib/correlation-cache.js +311 -0
  306. package/dist/lib/correlation-cache.js.map +1 -0
  307. package/dist/lib/correlation.js +263 -0
  308. package/dist/lib/correlation.js.map +1 -0
  309. package/dist/lib/database-service/connection-pool-manager.js +520 -0
  310. package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
  311. package/dist/lib/database-service/correlation.js +329 -0
  312. package/dist/lib/database-service/correlation.js.map +1 -0
  313. package/dist/lib/database-service/errors.js +120 -0
  314. package/dist/lib/database-service/errors.js.map +1 -0
  315. package/dist/lib/database-service/index.js +168 -0
  316. package/dist/lib/database-service/index.js.map +1 -0
  317. package/dist/lib/database-service/postgres-adapter.js +526 -0
  318. package/dist/lib/database-service/postgres-adapter.js.map +1 -0
  319. package/dist/lib/database-service/redis-adapter.js +360 -0
  320. package/dist/lib/database-service/redis-adapter.js.map +1 -0
  321. package/dist/lib/database-service/sqlite-adapter.js +544 -0
  322. package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
  323. package/dist/lib/database-service/transaction-manager.js +773 -0
  324. package/dist/lib/database-service/transaction-manager.js.map +1 -0
  325. package/dist/lib/database-service/types.js +23 -0
  326. package/dist/lib/database-service/types.js.map +1 -0
  327. package/dist/lib/deadlock-resolver.js +292 -0
  328. package/dist/lib/deadlock-resolver.js.map +1 -0
  329. package/dist/lib/distributed-lock.js +451 -0
  330. package/dist/lib/distributed-lock.js.map +1 -0
  331. package/dist/lib/edge-case-deduplicator.js +227 -0
  332. package/dist/lib/edge-case-deduplicator.js.map +1 -0
  333. package/dist/lib/encryption-manager.js +322 -0
  334. package/dist/lib/encryption-manager.js.map +1 -0
  335. package/dist/lib/error-aggregator.js +234 -0
  336. package/dist/lib/error-aggregator.js.map +1 -0
  337. package/dist/lib/errors.js +287 -0
  338. package/dist/lib/errors.js.map +1 -0
  339. package/dist/lib/file-lock-manager.js +578 -0
  340. package/dist/lib/file-lock-manager.js.map +1 -0
  341. package/dist/lib/file-operations.js +367 -0
  342. package/dist/lib/file-operations.js.map +1 -0
  343. package/dist/lib/idempotent-write.js +237 -0
  344. package/dist/lib/idempotent-write.js.map +1 -0
  345. package/dist/lib/integration-schema-validator.js +522 -0
  346. package/dist/lib/integration-schema-validator.js.map +1 -0
  347. package/dist/lib/lock-health-monitor.js +298 -0
  348. package/dist/lib/lock-health-monitor.js.map +1 -0
  349. package/dist/lib/log-shipper.js +422 -0
  350. package/dist/lib/log-shipper.js.map +1 -0
  351. package/dist/lib/logging.js +146 -0
  352. package/dist/lib/logging.js.map +1 -0
  353. package/dist/lib/message-deduplicator.js +439 -0
  354. package/dist/lib/message-deduplicator.js.map +1 -0
  355. package/dist/lib/multi-system-query.js +604 -0
  356. package/dist/lib/multi-system-query.js.map +1 -0
  357. package/dist/lib/orphan-detector.js +332 -0
  358. package/dist/lib/orphan-detector.js.map +1 -0
  359. package/dist/lib/password-generator.js +166 -0
  360. package/dist/lib/password-generator.js.map +1 -0
  361. package/dist/lib/path-validator.js +429 -0
  362. package/dist/lib/path-validator.js.map +1 -0
  363. package/dist/lib/query-translator.js +905 -0
  364. package/dist/lib/query-translator.js.map +1 -0
  365. package/dist/lib/queue-recovery.js +469 -0
  366. package/dist/lib/queue-recovery.js.map +1 -0
  367. package/dist/lib/redis-queue-manager.js +512 -0
  368. package/dist/lib/redis-queue-manager.js.map +1 -0
  369. package/dist/lib/reflection-archiver.js +272 -0
  370. package/dist/lib/reflection-archiver.js.map +1 -0
  371. package/dist/lib/retry-manager.js +453 -0
  372. package/dist/lib/retry-manager.js.map +1 -0
  373. package/dist/lib/retry.js +262 -0
  374. package/dist/lib/retry.js.map +1 -0
  375. package/dist/lib/schema-transform.js +695 -0
  376. package/dist/lib/schema-transform.js.map +1 -0
  377. package/dist/lib/schema-validator.js +491 -0
  378. package/dist/lib/schema-validator.js.map +1 -0
  379. package/dist/lib/skill-cache.js +297 -0
  380. package/dist/lib/skill-cache.js.map +1 -0
  381. package/dist/lib/skill-content-manager.js +337 -0
  382. package/dist/lib/skill-content-manager.js.map +1 -0
  383. package/dist/lib/skill-frontmatter-parser.js +237 -0
  384. package/dist/lib/skill-frontmatter-parser.js.map +1 -0
  385. package/dist/lib/skill-git-integration.js +275 -0
  386. package/dist/lib/skill-git-integration.js.map +1 -0
  387. package/dist/lib/skill-markdown-validator.js +396 -0
  388. package/dist/lib/skill-markdown-validator.js.map +1 -0
  389. package/dist/lib/skill-output-parser.js +312 -0
  390. package/dist/lib/skill-output-parser.js.map +1 -0
  391. package/dist/lib/unified-query-api.js +467 -0
  392. package/dist/lib/unified-query-api.js.map +1 -0
  393. package/dist/middleware/auth-middleware.js +350 -0
  394. package/dist/middleware/auth-middleware.js.map +1 -0
  395. package/dist/middleware/schema-validation.js +347 -0
  396. package/dist/middleware/schema-validation.js.map +1 -0
  397. package/dist/providers/anthropic-provider.js +1 -1
  398. package/dist/providers/anthropic-provider.js.map +1 -1
  399. package/dist/providers/provider-factory.js +2 -2
  400. package/dist/providers/provider-factory.js.map +1 -1
  401. package/dist/services/edge-case-analyzer.js +321 -0
  402. package/dist/services/edge-case-analyzer.js.map +1 -0
  403. package/dist/services/edge-case-deduplicator.js +266 -0
  404. package/dist/services/edge-case-deduplicator.js.map +1 -0
  405. package/dist/services/edge-case-detector.js +337 -0
  406. package/dist/services/edge-case-detector.js.map +1 -0
  407. package/dist/services/edge-case-tracker.js +547 -0
  408. package/dist/services/edge-case-tracker.js.map +1 -0
  409. package/dist/services/health-check-system.js +586 -0
  410. package/dist/services/health-check-system.js.map +1 -0
  411. package/dist/services/metrics-logger.js +412 -0
  412. package/dist/services/metrics-logger.js.map +1 -0
  413. package/dist/services/patch-generator.js +378 -0
  414. package/dist/services/patch-generator.js.map +1 -0
  415. package/dist/services/patch-validator.js +337 -0
  416. package/dist/services/patch-validator.js.map +1 -0
  417. package/dist/services/performance-monitor.js +811 -0
  418. package/dist/services/performance-monitor.js.map +1 -0
  419. package/dist/services/promotion-pipeline.js +918 -0
  420. package/dist/services/promotion-pipeline.js.map +1 -0
  421. package/dist/services/promotion-validator.js +394 -0
  422. package/dist/services/promotion-validator.js.map +1 -0
  423. package/dist/services/reflection-logger.js +388 -0
  424. package/dist/services/reflection-logger.js.map +1 -0
  425. package/dist/services/skill-deployment.js +472 -0
  426. package/dist/services/skill-deployment.js.map +1 -0
  427. package/dist/services/skill-loader.js +427 -0
  428. package/dist/services/skill-loader.js.map +1 -0
  429. package/dist/services/skill-promotion.js +372 -0
  430. package/dist/services/skill-promotion.js.map +1 -0
  431. package/dist/services/skill-validator.js +454 -0
  432. package/dist/services/skill-validator.js.map +1 -0
  433. package/dist/services/skill-versioning.js +244 -0
  434. package/dist/services/skill-versioning.js.map +1 -0
  435. package/dist/services/workspace-supervisor.js +597 -0
  436. package/dist/services/workspace-supervisor.js.map +1 -0
  437. package/dist/types/edge-case.js +45 -0
  438. package/dist/types/edge-case.js.map +1 -0
  439. package/docs/BUG_19_MEMORY_LEAK_TASK_MODE.md +405 -0
  440. package/docs/MEMORY_CLEANUP_GUIDE.md +358 -0
  441. package/docs/MEMORY_LEAK_FIX_SUMMARY.md +322 -0
  442. package/docs/REDIS_CLEANUP_EXECUTIVE_SUMMARY.md +319 -0
  443. package/docs/REDIS_CLEANUP_VERIFICATION_REPORT.md +574 -0
  444. package/package.json +35 -4
  445. package/readme/README.md +53 -5
  446. package/scripts/backup-cleanup.sh +627 -0
  447. package/scripts/cleanup-workspaces.sh +412 -0
  448. package/scripts/cleanup-yaml-configs.sh +141 -0
  449. package/scripts/deploy-approved-skills.sh +263 -0
  450. package/scripts/health-check.sh +447 -0
  451. package/scripts/log-aggregator.sh +554 -0
  452. package/scripts/log-monitor.sh +629 -0
  453. package/scripts/manage-agent-workspaces.sh +434 -0
  454. package/scripts/migrate-schema.sh +533 -0
  455. package/scripts/promote-staged-skills.sh +423 -0
  456. package/scripts/verify-no-secrets.sh +88 -35
  457. package/scripts/verify-redis-cleanup.sh +173 -0
  458. package/tests/README.md +84 -0
  459. package/tests/test-memory-leak-task-mode.sh +435 -0
  460. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  461. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  462. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  463. package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
  464. package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
  465. package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
  466. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  467. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
  468. package/README.md.backup_before_replace +0 -781
  469. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  470. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  471. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  472. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  473. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
@@ -0,0 +1,597 @@
1
+ /**
2
+ * Workspace Supervisor Service
3
+ *
4
+ * Manages isolated workspaces for agents with automatic cleanup on completion/crash
5
+ * and TTL-based retention. Provides comprehensive workspace lifecycle management.
6
+ *
7
+ * Part of Task P2-1.3: Supervised Workspace Cleanup (Phase 2)
8
+ *
9
+ * Features:
10
+ * - Isolated workspace per agent (directory-based)
11
+ * - Auto-cleanup on agent completion (success or failure)
12
+ * - Auto-cleanup on agent crash (orphan detection)
13
+ * - TTL-based cleanup (24h default, configurable)
14
+ * - Zero orphaned files after 24h
15
+ * - Workspace size limits (max 1GB per agent, configurable)
16
+ * - Audit trail (what was cleaned, when, why)
17
+ * - Manual cleanup command support
18
+ * - Workspace metadata tracking
19
+ * - Concurrent workspace management
20
+ *
21
+ * Usage:
22
+ * const supervisor = new WorkspaceSupervisor({
23
+ * workspaceRoot: '/tmp/cfn-workspaces',
24
+ * maxWorkspaceSizeBytes: 1024 * 1024 * 1024,
25
+ * defaultTtlHours: 24
26
+ * });
27
+ * await supervisor.initialize();
28
+ *
29
+ * const workspace = await supervisor.createWorkspace({
30
+ * agentId: 'backend-dev-001',
31
+ * taskId: 'task-123',
32
+ * maxSizeBytes: 1024 * 1024 * 1024,
33
+ * ttlHours: 24
34
+ * });
35
+ *
36
+ * // Use workspace...
37
+ * await fs.writeFile(path.join(workspace.path, 'output.txt'), 'result');
38
+ *
39
+ * // Cleanup when done
40
+ * await supervisor.cleanupWorkspace(workspace.id, {
41
+ * reason: 'agent_completed',
42
+ * preserveArtifacts: ['report.md']
43
+ * });
44
+ */ import * as fs from 'fs/promises';
45
+ import * as path from 'path';
46
+ import { randomUUID } from 'crypto';
47
+ import Database from 'better-sqlite3';
48
+ import { createLogger } from '../lib/logging.js';
49
+ import { createError, ErrorCode } from '../lib/errors.js';
50
+ const logger = createLogger('workspace-supervisor');
51
+ /**
52
+ * WorkspaceSupervisor: Manages isolated workspaces for agents
53
+ */ export class WorkspaceSupervisor {
54
+ config;
55
+ db = null;
56
+ cleanupInterval = null;
57
+ workspaces = new Map();
58
+ constructor(config){
59
+ this.config = {
60
+ maxWorkspaceSizeBytes: 1024 * 1024 * 1024,
61
+ defaultTtlHours: 24,
62
+ cleanupIntervalMinutes: 60,
63
+ ...config
64
+ };
65
+ }
66
+ /**
67
+ * Initialize workspace supervisor
68
+ */ async initialize() {
69
+ try {
70
+ // Create workspace root directory
71
+ await fs.mkdir(this.config.workspaceRoot, {
72
+ recursive: true
73
+ });
74
+ // Initialize database
75
+ const dbPath = this.config.databasePath || path.join(this.config.workspaceRoot, 'metadata.db');
76
+ this.db = new Database(dbPath);
77
+ // Create schema
78
+ this.createSchema();
79
+ // Load existing workspaces
80
+ await this.loadExistingWorkspaces();
81
+ // Start background TTL cleanup
82
+ this.startCleanupScheduler();
83
+ logger.info('WorkspaceSupervisor initialized', {
84
+ workspaceRoot: this.config.workspaceRoot,
85
+ maxSize: this.config.maxWorkspaceSizeBytes,
86
+ defaultTtl: this.config.defaultTtlHours
87
+ });
88
+ } catch (error) {
89
+ logger.error('Failed to initialize WorkspaceSupervisor', {
90
+ error: String(error)
91
+ });
92
+ throw createError(ErrorCode.CONFIGURATION_ERROR, 'Failed to initialize workspace supervisor', {
93
+ cause: String(error)
94
+ });
95
+ }
96
+ }
97
+ /**
98
+ * Shutdown supervisor and stop background tasks
99
+ */ async shutdown() {
100
+ try {
101
+ if (this.cleanupInterval) {
102
+ clearInterval(this.cleanupInterval);
103
+ this.cleanupInterval = null;
104
+ }
105
+ if (this.db) {
106
+ this.db.close();
107
+ this.db = null;
108
+ }
109
+ logger.info('WorkspaceSupervisor shutdown complete');
110
+ } catch (error) {
111
+ logger.error('Error during shutdown', {
112
+ error: String(error)
113
+ });
114
+ }
115
+ }
116
+ /**
117
+ * Create isolated workspace for agent
118
+ */ async createWorkspace(config) {
119
+ const workspaceId = randomUUID();
120
+ // Sanitize paths to prevent traversal attacks
121
+ const sanitizedAgentId = this.sanitizePath(config.agentId);
122
+ const sanitizedTaskId = this.sanitizePath(config.taskId);
123
+ const workspacePath = path.normalize(path.join(this.config.workspaceRoot, `${sanitizedAgentId}-${sanitizedTaskId}-${workspaceId}`));
124
+ // Verify path is within workspace root
125
+ const relPath = path.relative(this.config.workspaceRoot, workspacePath);
126
+ if (relPath.startsWith('..')) {
127
+ throw createError(ErrorCode.VALIDATION_FAILED, 'Invalid workspace path', {
128
+ path: workspacePath
129
+ });
130
+ }
131
+ try {
132
+ // Create workspace directory
133
+ await fs.mkdir(workspacePath, {
134
+ recursive: true
135
+ });
136
+ const workspace = {
137
+ id: workspaceId,
138
+ agentId: config.agentId,
139
+ taskId: config.taskId,
140
+ path: workspacePath,
141
+ createdAt: new Date(),
142
+ ttlHours: config.ttlHours,
143
+ maxSizeBytes: config.maxSizeBytes,
144
+ sizeBytes: 0,
145
+ fileCount: 0,
146
+ exceedsLimit: false
147
+ };
148
+ // Store in database
149
+ this.insertWorkspace(workspace);
150
+ this.workspaces.set(workspaceId, workspace);
151
+ logger.info('Workspace created', {
152
+ workspaceId,
153
+ agentId: config.agentId,
154
+ taskId: config.taskId,
155
+ path: workspacePath
156
+ });
157
+ return workspace;
158
+ } catch (error) {
159
+ logger.error('Failed to create workspace', {
160
+ error: String(error)
161
+ });
162
+ throw createError(ErrorCode.FILE_WRITE_FAILED, 'Failed to create workspace', {
163
+ cause: String(error)
164
+ });
165
+ }
166
+ }
167
+ /**
168
+ * Cleanup workspace on completion
169
+ */ async cleanupWorkspace(workspaceId, options) {
170
+ const workspace = this.workspaces.get(workspaceId);
171
+ if (!workspace) {
172
+ logger.warn('Attempt to cleanup non-existent workspace', {
173
+ workspaceId
174
+ });
175
+ return {
176
+ cleanedCount: 0,
177
+ totalSizeFreed: 0,
178
+ filesRemoved: 0
179
+ };
180
+ }
181
+ try {
182
+ let sizeFreed = 0;
183
+ let filesRemoved = 0;
184
+ // Get current stats before cleanup
185
+ const currentSize = await this.getDirectorySize(workspace.path).catch(()=>0);
186
+ const currentFileCount = await this.countFiles(workspace.path).catch(()=>0);
187
+ // Preserve artifacts if specified
188
+ if (options.preserveArtifacts && options.preserveArtifacts.length > 0) {
189
+ await this.preserveArtifacts(workspace.path, options.preserveArtifacts, options.artifactDestination);
190
+ }
191
+ // Remove workspace directory
192
+ await fs.rm(workspace.path, {
193
+ recursive: true,
194
+ force: true
195
+ });
196
+ sizeFreed = currentSize;
197
+ filesRemoved = currentFileCount;
198
+ // Record cleanup in database
199
+ this.recordCleanup(workspaceId, options, sizeFreed, filesRemoved);
200
+ // Remove from memory cache
201
+ this.workspaces.delete(workspaceId);
202
+ logger.info('Workspace cleaned up', {
203
+ workspaceId,
204
+ reason: options.reason,
205
+ sizeFreed,
206
+ filesRemoved
207
+ });
208
+ return {
209
+ cleanedCount: 1,
210
+ totalSizeFreed: sizeFreed,
211
+ filesRemoved
212
+ };
213
+ } catch (error) {
214
+ logger.error('Error cleaning up workspace', {
215
+ workspaceId,
216
+ error: String(error)
217
+ });
218
+ throw createError(ErrorCode.FILE_WRITE_FAILED, 'Failed to cleanup workspace', {
219
+ cause: String(error)
220
+ });
221
+ }
222
+ }
223
+ /**
224
+ * Get stale workspaces (past TTL)
225
+ */ async getStaleWorkspaces() {
226
+ const stale = [];
227
+ const now = Date.now();
228
+ for (const workspace of this.workspaces.values()){
229
+ const ageMs = now - workspace.createdAt.getTime();
230
+ const ttlMs = workspace.ttlHours * 60 * 60 * 1000;
231
+ if (ageMs > ttlMs) {
232
+ stale.push(workspace);
233
+ }
234
+ }
235
+ return stale;
236
+ }
237
+ /**
238
+ * Enforce retention policy (TTL-based cleanup)
239
+ */ async enforceRetentionPolicy(options) {
240
+ const staleWorkspaces = await this.getStaleWorkspaces();
241
+ let totalCleaned = 0;
242
+ let totalFreed = 0;
243
+ let totalFilesRemoved = 0;
244
+ for (const workspace of staleWorkspaces){
245
+ const stats = await this.cleanupWorkspace(workspace.id, {
246
+ reason: 'ttl_expired',
247
+ preserveArtifacts: options?.preservePatterns
248
+ });
249
+ totalCleaned += stats.cleanedCount;
250
+ totalFreed += stats.totalSizeFreed;
251
+ totalFilesRemoved += stats.filesRemoved;
252
+ }
253
+ return {
254
+ cleanedCount: totalCleaned,
255
+ totalSizeFreed: totalFreed,
256
+ filesRemoved: totalFilesRemoved
257
+ };
258
+ }
259
+ /**
260
+ * Update workspace metadata (e.g., process ID, last accessed time)
261
+ */ async updateWorkspaceMetadata(workspaceId, metadata) {
262
+ const workspace = this.workspaces.get(workspaceId);
263
+ if (!workspace) {
264
+ return;
265
+ }
266
+ try {
267
+ if (!this.db) return;
268
+ const stmt = this.db.prepare(`
269
+ UPDATE workspaces
270
+ SET metadata = json_patch(COALESCE(metadata, '{}'), ?)
271
+ WHERE id = ?
272
+ `);
273
+ stmt.run(JSON.stringify(metadata), workspaceId);
274
+ } catch (error) {
275
+ logger.error('Error updating workspace metadata', {
276
+ workspaceId,
277
+ error: String(error)
278
+ });
279
+ }
280
+ }
281
+ /**
282
+ * Get workspace info (with current size/stats)
283
+ */ async getWorkspaceInfo(workspaceId) {
284
+ const workspace = this.workspaces.get(workspaceId);
285
+ if (!workspace) return undefined;
286
+ // Update size and file count if workspace still exists
287
+ if (await fs.stat(workspace.path).catch(()=>null)) {
288
+ const sizeBytes = await this.getDirectorySize(workspace.path);
289
+ const fileCount = await this.countFiles(workspace.path);
290
+ const exceedsLimit = sizeBytes > workspace.maxSizeBytes;
291
+ // Update in memory
292
+ workspace.sizeBytes = sizeBytes;
293
+ workspace.fileCount = fileCount;
294
+ workspace.exceedsLimit = exceedsLimit;
295
+ }
296
+ return workspace;
297
+ }
298
+ /**
299
+ * Get cleanup history for workspace
300
+ */ async getCleanupHistory(workspaceId) {
301
+ try {
302
+ if (!this.db) return [];
303
+ const stmt = this.db.prepare(`
304
+ SELECT cleaned_at, reason, size_freed, files_removed, metadata
305
+ FROM cleanup_history
306
+ WHERE workspace_id = ?
307
+ ORDER BY cleaned_at DESC
308
+ `);
309
+ const rows = stmt.all(workspaceId);
310
+ return rows.map((row)=>({
311
+ cleanedAt: new Date(row.cleaned_at),
312
+ reason: row.reason,
313
+ sizeFreed: row.size_freed,
314
+ filesRemoved: row.files_removed,
315
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined
316
+ }));
317
+ } catch (error) {
318
+ logger.error('Error fetching cleanup history', {
319
+ error: String(error)
320
+ });
321
+ return [];
322
+ }
323
+ }
324
+ /**
325
+ * Get workspace statistics
326
+ */ async getStatistics() {
327
+ let totalDiskUsage = 0;
328
+ let staleCount = 0;
329
+ for (const workspace of this.workspaces.values()){
330
+ // Update size for current calculation
331
+ try {
332
+ if (await fs.stat(workspace.path).catch(()=>null)) {
333
+ const size = await this.getDirectorySize(workspace.path);
334
+ totalDiskUsage += size;
335
+ }
336
+ } catch (e) {
337
+ // Ignore
338
+ }
339
+ const ageMs = Date.now() - workspace.createdAt.getTime();
340
+ const ttlMs = workspace.ttlHours * 60 * 60 * 1000;
341
+ if (ageMs > ttlMs) {
342
+ staleCount++;
343
+ }
344
+ }
345
+ return {
346
+ totalWorkspaces: this.workspaces.size,
347
+ activeWorkspaces: this.workspaces.size - staleCount,
348
+ totalDiskUsage,
349
+ staleWorkspaces: staleCount
350
+ };
351
+ }
352
+ // ============================================================================
353
+ // Private Helper Methods
354
+ // ============================================================================
355
+ /**
356
+ * Create database schema
357
+ */ createSchema() {
358
+ if (!this.db) return;
359
+ // Workspaces table
360
+ this.db.exec(`
361
+ CREATE TABLE IF NOT EXISTS workspaces (
362
+ id TEXT PRIMARY KEY,
363
+ agent_id TEXT NOT NULL,
364
+ task_id TEXT NOT NULL,
365
+ path TEXT NOT NULL,
366
+ created_at TEXT NOT NULL,
367
+ ttl_hours INTEGER NOT NULL,
368
+ max_size_bytes INTEGER NOT NULL,
369
+ metadata TEXT
370
+ );
371
+
372
+ CREATE INDEX IF NOT EXISTS idx_workspaces_agent ON workspaces(agent_id);
373
+ CREATE INDEX IF NOT EXISTS idx_workspaces_task ON workspaces(task_id);
374
+ CREATE INDEX IF NOT EXISTS idx_workspaces_created ON workspaces(created_at);
375
+ `);
376
+ // Cleanup history table
377
+ this.db.exec(`
378
+ CREATE TABLE IF NOT EXISTS cleanup_history (
379
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
380
+ workspace_id TEXT NOT NULL,
381
+ cleaned_at TEXT NOT NULL,
382
+ reason TEXT NOT NULL,
383
+ size_freed INTEGER,
384
+ files_removed INTEGER,
385
+ metadata TEXT,
386
+ FOREIGN KEY(workspace_id) REFERENCES workspaces(id)
387
+ );
388
+
389
+ CREATE INDEX IF NOT EXISTS idx_cleanup_workspace ON cleanup_history(workspace_id);
390
+ CREATE INDEX IF NOT EXISTS idx_cleanup_date ON cleanup_history(cleaned_at);
391
+ `);
392
+ }
393
+ /**
394
+ * Insert workspace into database
395
+ */ insertWorkspace(workspace) {
396
+ if (!this.db) return;
397
+ try {
398
+ const stmt = this.db.prepare(`
399
+ INSERT OR REPLACE INTO workspaces
400
+ (id, agent_id, task_id, path, created_at, ttl_hours, max_size_bytes, metadata)
401
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
402
+ `);
403
+ stmt.run(workspace.id, workspace.agentId, workspace.taskId, workspace.path, workspace.createdAt.toISOString(), workspace.ttlHours, workspace.maxSizeBytes, '{}');
404
+ } catch (error) {
405
+ logger.error('Error inserting workspace', {
406
+ error: String(error)
407
+ });
408
+ }
409
+ }
410
+ /**
411
+ * Record cleanup operation
412
+ */ recordCleanup(workspaceId, options, sizeFreed, filesRemoved) {
413
+ if (!this.db) return;
414
+ try {
415
+ const stmt = this.db.prepare(`
416
+ INSERT INTO cleanup_history
417
+ (workspace_id, cleaned_at, reason, size_freed, files_removed, metadata)
418
+ VALUES (?, ?, ?, ?, ?, ?)
419
+ `);
420
+ stmt.run(workspaceId, new Date().toISOString(), options.reason, sizeFreed, filesRemoved, options.metadata ? JSON.stringify(options.metadata) : null);
421
+ } catch (error) {
422
+ logger.error('Error recording cleanup', {
423
+ error: String(error)
424
+ });
425
+ }
426
+ }
427
+ /**
428
+ * Load existing workspaces from filesystem
429
+ */ async loadExistingWorkspaces() {
430
+ try {
431
+ const entries = await fs.readdir(this.config.workspaceRoot, {
432
+ withFileTypes: true
433
+ });
434
+ for (const entry of entries){
435
+ if (!entry.isDirectory()) continue;
436
+ try {
437
+ const stats = await fs.stat(entry.path);
438
+ const size = await this.getDirectorySize(entry.path);
439
+ const workspace = {
440
+ id: randomUUID(),
441
+ agentId: entry.name.split('-')[0],
442
+ taskId: entry.name.split('-')[1],
443
+ path: entry.path,
444
+ createdAt: stats.birthtime || stats.mtime,
445
+ ttlHours: this.config.defaultTtlHours || 24,
446
+ maxSizeBytes: this.config.maxWorkspaceSizeBytes || 1024 * 1024 * 1024,
447
+ sizeBytes: size,
448
+ fileCount: await this.countFiles(entry.path),
449
+ exceedsLimit: size > (this.config.maxWorkspaceSizeBytes || 1024 * 1024 * 1024)
450
+ };
451
+ this.workspaces.set(workspace.id, workspace);
452
+ } catch (error) {
453
+ logger.warn('Error loading workspace', {
454
+ path: entry.path,
455
+ error: String(error)
456
+ });
457
+ }
458
+ }
459
+ logger.info('Loaded existing workspaces', {
460
+ count: this.workspaces.size
461
+ });
462
+ } catch (error) {
463
+ logger.warn('Error loading workspaces', {
464
+ error: String(error)
465
+ });
466
+ }
467
+ }
468
+ /**
469
+ * Get directory size in bytes
470
+ */ async getDirectorySize(dir) {
471
+ try {
472
+ const entries = await fs.readdir(dir, {
473
+ recursive: true,
474
+ withFileTypes: false
475
+ });
476
+ let totalSize = 0;
477
+ for (const file of entries){
478
+ try {
479
+ const filePath = path.join(dir, file);
480
+ const stats = await fs.stat(filePath).catch(()=>null);
481
+ if (stats?.isFile()) {
482
+ totalSize += stats.size;
483
+ }
484
+ } catch (e) {
485
+ // Ignore inaccessible files
486
+ }
487
+ }
488
+ return totalSize;
489
+ } catch (error) {
490
+ return 0;
491
+ }
492
+ }
493
+ /**
494
+ * Count files in directory
495
+ */ async countFiles(dir) {
496
+ try {
497
+ const entries = await fs.readdir(dir, {
498
+ recursive: true,
499
+ withFileTypes: false
500
+ });
501
+ return Array.isArray(entries) ? entries.length : 0;
502
+ } catch (error) {
503
+ return 0;
504
+ }
505
+ }
506
+ /**
507
+ * Preserve artifacts during cleanup
508
+ */ async preserveArtifacts(workspacePath, preservePatterns, destination) {
509
+ if (!destination) {
510
+ return 0;
511
+ }
512
+ try {
513
+ const destDir = path.resolve(destination);
514
+ await fs.mkdir(destDir, {
515
+ recursive: true
516
+ });
517
+ let sizeFreed = 0;
518
+ for (const pattern of preservePatterns){
519
+ const files = await this.globFiles(workspacePath, pattern);
520
+ for (const file of files){
521
+ const relativePath = path.relative(workspacePath, file);
522
+ const destPath = path.join(destDir, relativePath);
523
+ await fs.mkdir(path.dirname(destPath), {
524
+ recursive: true
525
+ });
526
+ await fs.copyFile(file, destPath);
527
+ const stats = await fs.stat(file);
528
+ sizeFreed += stats.size;
529
+ }
530
+ }
531
+ return sizeFreed;
532
+ } catch (error) {
533
+ logger.warn('Error preserving artifacts', {
534
+ error: String(error)
535
+ });
536
+ return 0;
537
+ }
538
+ }
539
+ /**
540
+ * Simple glob file matching
541
+ */ async globFiles(dir, pattern) {
542
+ try {
543
+ const entries = await fs.readdir(dir, {
544
+ recursive: true,
545
+ withFileTypes: true
546
+ });
547
+ const files = [];
548
+ for (const entry of entries){
549
+ if (entry.isFile && this.matchesPattern(entry.name, pattern)) {
550
+ files.push(path.join(dir, entry.name));
551
+ }
552
+ }
553
+ return files;
554
+ } catch (error) {
555
+ return [];
556
+ }
557
+ }
558
+ /**
559
+ * Match filename against glob pattern
560
+ */ matchesPattern(filename, pattern) {
561
+ // Simple glob matching (* and ?)
562
+ const regex = pattern.replace(/\./g, '\\.').replace(/\*/g, '.*').replace(/\?/g, '.');
563
+ return new RegExp(`^${regex}$`).test(filename);
564
+ }
565
+ /**
566
+ * Sanitize path component to prevent traversal attacks
567
+ */ sanitizePath(pathComponent) {
568
+ // Remove any path separators and traversal sequences
569
+ return pathComponent.replace(/[\/\\]/g, '_') // Replace path separators
570
+ .replace(/\.\./g, '__') // Replace .. sequences
571
+ .replace(/\./g, '_') // Replace dots
572
+ .substring(0, 100); // Limit length
573
+ }
574
+ /**
575
+ * Start background TTL cleanup scheduler
576
+ */ startCleanupScheduler() {
577
+ const intervalMs = (this.config.cleanupIntervalMinutes || 60) * 60 * 1000;
578
+ this.cleanupInterval = setInterval(async ()=>{
579
+ try {
580
+ const stats = await this.enforceRetentionPolicy();
581
+ if (stats.cleanedCount > 0) {
582
+ logger.info('Background TTL cleanup completed', {
583
+ cleanedCount: stats.cleanedCount,
584
+ totalFreed: stats.totalSizeFreed
585
+ });
586
+ }
587
+ } catch (error) {
588
+ logger.error('Error in TTL cleanup scheduler', {
589
+ error: String(error)
590
+ });
591
+ }
592
+ }, intervalMs);
593
+ }
594
+ }
595
+ export default WorkspaceSupervisor;
596
+
597
+ //# sourceMappingURL=workspace-supervisor.js.map