kynjal-cli 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/appliance/gguf-engine.d.ts +91 -0
- package/dist/src/appliance/gguf-engine.d.ts.map +1 -0
- package/dist/src/appliance/gguf-engine.js +286 -525
- package/dist/src/appliance/gguf-engine.js.map +1 -1
- package/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
- package/dist/src/appliance/ruvllm-bridge.d.ts.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.js +203 -403
- package/dist/src/appliance/ruvllm-bridge.js.map +1 -1
- package/dist/src/appliance/rvfa-builder.d.ts +44 -0
- package/dist/src/appliance/rvfa-builder.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-builder.js +154 -208
- package/dist/src/appliance/rvfa-builder.js.map +1 -1
- package/dist/src/appliance/rvfa-distribution.d.ts +97 -0
- package/dist/src/appliance/rvfa-distribution.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-distribution.js +260 -423
- package/dist/src/appliance/rvfa-distribution.js.map +1 -1
- package/dist/src/appliance/rvfa-format.d.ts +111 -0
- package/dist/src/appliance/rvfa-format.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-format.js +128 -200
- package/dist/src/appliance/rvfa-format.js.map +1 -1
- package/dist/src/appliance/rvfa-runner.d.ts +69 -0
- package/dist/src/appliance/rvfa-runner.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-runner.js +168 -304
- package/dist/src/appliance/rvfa-runner.js.map +1 -1
- package/dist/src/appliance/rvfa-signing.d.ts +123 -0
- package/dist/src/appliance/rvfa-signing.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-signing.js +173 -295
- package/dist/src/appliance/rvfa-signing.js.map +1 -1
- package/dist/src/benchmarks/pretrain/index.d.ts +58 -0
- package/dist/src/benchmarks/pretrain/index.d.ts.map +1 -0
- package/dist/src/benchmarks/pretrain/index.js +331 -542
- package/dist/src/benchmarks/pretrain/index.js.map +1 -1
- package/dist/src/commands/agent.js +574 -697
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/analyze.js +1218 -1548
- package/dist/src/commands/analyze.js.map +1 -1
- package/dist/src/commands/appliance-advanced.js +158 -267
- package/dist/src/commands/appliance-advanced.js.map +1 -1
- package/dist/src/commands/appliance.js +318 -493
- package/dist/src/commands/appliance.js.map +1 -1
- package/dist/src/commands/benchmark.js +372 -523
- package/dist/src/commands/benchmark.js.map +1 -1
- package/dist/src/commands/claims.js +274 -364
- package/dist/src/commands/claims.js.map +1 -1
- package/dist/src/commands/cleanup.js +113 -157
- package/dist/src/commands/cleanup.js.map +1 -1
- package/dist/src/commands/completions.js +477 -118
- package/dist/src/commands/completions.js.map +1 -1
- package/dist/src/commands/config.js +237 -303
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/daemon.js +487 -596
- package/dist/src/commands/daemon.js.map +1 -1
- package/dist/src/commands/deployment.js +194 -275
- package/dist/src/commands/deployment.js.map +1 -1
- package/dist/src/commands/doctor.js +504 -686
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/embeddings.js +1293 -1543
- package/dist/src/commands/embeddings.js.map +1 -1
- package/dist/src/commands/guidance.js +449 -596
- package/dist/src/commands/guidance.js.map +1 -1
- package/dist/src/commands/hive-mind.js +854 -938
- package/dist/src/commands/hive-mind.js.map +1 -1
- package/dist/src/commands/hooks.js +3112 -3519
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts +115 -0
- package/dist/src/commands/index.d.ts.map +1 -0
- package/dist/src/commands/index.js +126 -308
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.js +788 -940
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/issues.js +383 -558
- package/dist/src/commands/issues.js.map +1 -1
- package/dist/src/commands/mcp.js +493 -605
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/memory.js +833 -1026
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/migrate.js +282 -347
- package/dist/src/commands/migrate.js.map +1 -1
- package/dist/src/commands/neural.js +1289 -1563
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/performance.js +497 -643
- package/dist/src/commands/performance.js.map +1 -1
- package/dist/src/commands/plugins.js +668 -841
- package/dist/src/commands/plugins.js.map +1 -1
- package/dist/src/commands/process.js +392 -447
- package/dist/src/commands/process.js.map +1 -1
- package/dist/src/commands/progress.js +162 -256
- package/dist/src/commands/progress.js.map +1 -1
- package/dist/src/commands/providers.js +150 -220
- package/dist/src/commands/providers.js.map +1 -1
- package/dist/src/commands/route.js +520 -665
- package/dist/src/commands/route.js.map +1 -1
- package/dist/src/commands/ruvector/backup.js +505 -651
- package/dist/src/commands/ruvector/backup.js.map +1 -1
- package/dist/src/commands/ruvector/benchmark.js +349 -401
- package/dist/src/commands/ruvector/benchmark.js.map +1 -1
- package/dist/src/commands/ruvector/import.js +224 -266
- package/dist/src/commands/ruvector/import.js.map +1 -1
- package/dist/src/commands/ruvector/index.js +37 -75
- package/dist/src/commands/ruvector/index.js.map +1 -1
- package/dist/src/commands/ruvector/init.js +336 -359
- package/dist/src/commands/ruvector/init.js.map +1 -1
- package/dist/src/commands/ruvector/migrate.js +335 -322
- package/dist/src/commands/ruvector/migrate.js.map +1 -1
- package/dist/src/commands/ruvector/optimize.js +375 -431
- package/dist/src/commands/ruvector/optimize.js.map +1 -1
- package/dist/src/commands/ruvector/setup.js +703 -117
- package/dist/src/commands/ruvector/setup.js.map +1 -1
- package/dist/src/commands/ruvector/status.js +364 -419
- package/dist/src/commands/ruvector/status.js.map +1 -1
- package/dist/src/commands/security.js +485 -608
- package/dist/src/commands/security.js.map +1 -1
- package/dist/src/commands/session.js +504 -626
- package/dist/src/commands/session.js.map +1 -1
- package/dist/src/commands/start.js +267 -364
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/status.js +380 -486
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/commands/swarm.js +408 -488
- package/dist/src/commands/swarm.js.map +1 -1
- package/dist/src/commands/task.js +423 -538
- package/dist/src/commands/task.js.map +1 -1
- package/dist/src/commands/transfer-store.js +322 -412
- package/dist/src/commands/transfer-store.js.map +1 -1
- package/dist/src/commands/update.js +196 -291
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/workflow.js +386 -486
- package/dist/src/commands/workflow.js.map +1 -1
- package/dist/src/config-adapter.d.ts +15 -0
- package/dist/src/config-adapter.d.ts.map +1 -0
- package/dist/src/config-adapter.js +38 -39
- package/dist/src/config-adapter.js.map +1 -1
- package/dist/src/index.d.ts +77 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +309 -411
- package/dist/src/index.js.map +1 -1
- package/dist/src/infrastructure/in-memory-repositories.d.ts +68 -0
- package/dist/src/infrastructure/in-memory-repositories.d.ts.map +1 -0
- package/dist/src/infrastructure/in-memory-repositories.js +246 -507
- package/dist/src/infrastructure/in-memory-repositories.js.map +1 -1
- package/dist/src/init/claudemd-generator.d.ts +25 -0
- package/dist/src/init/claudemd-generator.d.ts.map +1 -0
- package/dist/src/init/claudemd-generator.js +368 -78
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/executor.d.ts +41 -0
- package/dist/src/init/executor.d.ts.map +1 -0
- package/dist/src/init/executor.js +1307 -996
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/helpers-generator.d.ts +60 -0
- package/dist/src/init/helpers-generator.d.ts.map +1 -0
- package/dist/src/init/helpers-generator.js +657 -12
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/index.d.ts +1 -1
- package/dist/src/init/index.d.ts.map +1 -1
- package/dist/src/init/index.js +1 -1
- package/dist/src/init/index.js.map +1 -1
- package/dist/src/init/mcp-generator.js +33 -37
- package/dist/src/init/mcp-generator.js.map +1 -1
- package/dist/src/init/settings-generator.js +76 -77
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.js +801 -3
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/init/types.d.ts +1 -1
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/types.js +76 -59
- package/dist/src/init/types.js.map +1 -1
- package/dist/src/mcp-client.d.ts +92 -0
- package/dist/src/mcp-client.d.ts.map +1 -0
- package/dist/src/mcp-client.js +81 -125
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-server.d.ts +161 -0
- package/dist/src/mcp-server.d.ts.map +1 -0
- package/dist/src/mcp-server.js +470 -757
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/src/mcp-tools/agent-tools.js +391 -492
- package/dist/src/mcp-tools/agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.js +332 -533
- package/dist/src/mcp-tools/agentdb-tools.js.map +1 -1
- package/dist/src/mcp-tools/analyze-tools.js +172 -236
- package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
- package/dist/src/mcp-tools/auto-install.d.ts +83 -0
- package/dist/src/mcp-tools/auto-install.d.ts.map +1 -0
- package/dist/src/mcp-tools/auto-install.js +80 -142
- package/dist/src/mcp-tools/auto-install.js.map +1 -1
- package/dist/src/mcp-tools/browser-tools.js +252 -375
- package/dist/src/mcp-tools/browser-tools.js.map +1 -1
- package/dist/src/mcp-tools/claims-tools.js +473 -565
- package/dist/src/mcp-tools/claims-tools.js.map +1 -1
- package/dist/src/mcp-tools/config-tools.js +197 -272
- package/dist/src/mcp-tools/config-tools.js.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.js +500 -572
- package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
- package/dist/src/mcp-tools/daa-tools.js +286 -364
- package/dist/src/mcp-tools/daa-tools.js.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.js +582 -693
- package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
- package/dist/src/mcp-tools/github-tools.js +260 -311
- package/dist/src/mcp-tools/github-tools.js.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.js +573 -640
- package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +2215 -2648
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +350 -505
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/src/mcp-tools/neural-tools.js +315 -412
- package/dist/src/mcp-tools/neural-tools.js.map +1 -1
- package/dist/src/mcp-tools/performance-tools.js +420 -480
- package/dist/src/mcp-tools/performance-tools.js.map +1 -1
- package/dist/src/mcp-tools/progress-tools.js +204 -278
- package/dist/src/mcp-tools/progress-tools.js.map +1 -1
- package/dist/src/mcp-tools/ruvllm-tools.js +163 -279
- package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -1
- package/dist/src/mcp-tools/security-tools.js +297 -429
- package/dist/src/mcp-tools/security-tools.js.map +1 -1
- package/dist/src/mcp-tools/session-tools.js +185 -234
- package/dist/src/mcp-tools/session-tools.js.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.js +207 -260
- package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
- package/dist/src/mcp-tools/system-tools.js +276 -325
- package/dist/src/mcp-tools/system-tools.js.map +1 -1
- package/dist/src/mcp-tools/task-tools.js +270 -336
- package/dist/src/mcp-tools/task-tools.js.map +1 -1
- package/dist/src/mcp-tools/terminal-tools.js +148 -196
- package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
- package/dist/src/mcp-tools/transfer-tools.js +186 -333
- package/dist/src/mcp-tools/transfer-tools.js.map +1 -1
- package/dist/src/mcp-tools/types.d.ts +31 -0
- package/dist/src/mcp-tools/types.d.ts.map +1 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js +133 -280
- package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/workflow-tools.js +405 -450
- package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
- package/dist/src/memory/ewc-consolidation.d.ts +295 -0
- package/dist/src/memory/ewc-consolidation.d.ts.map +1 -0
- package/dist/src/memory/ewc-consolidation.js +190 -303
- package/dist/src/memory/ewc-consolidation.js.map +1 -1
- package/dist/src/memory/intelligence.d.ts +338 -0
- package/dist/src/memory/intelligence.d.ts.map +1 -0
- package/dist/src/memory/intelligence.js +569 -794
- package/dist/src/memory/intelligence.js.map +1 -1
- package/dist/src/memory/memory-bridge.d.ts +407 -0
- package/dist/src/memory/memory-bridge.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge.js +1170 -1640
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/src/memory/memory-initializer.d.ts +412 -0
- package/dist/src/memory/memory-initializer.d.ts.map +1 -0
- package/dist/src/memory/memory-initializer.js +1836 -1851
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/memory/sona-optimizer.d.ts +227 -0
- package/dist/src/memory/sona-optimizer.d.ts.map +1 -0
- package/dist/src/memory/sona-optimizer.js +199 -329
- package/dist/src/memory/sona-optimizer.js.map +1 -1
- package/dist/src/output.d.ts +2 -2
- package/dist/src/output.d.ts.map +1 -1
- package/dist/src/output.js +242 -272
- package/dist/src/output.js.map +1 -1
- package/dist/src/parser.d.ts +51 -0
- package/dist/src/parser.d.ts.map +1 -0
- package/dist/src/parser.js +140 -187
- package/dist/src/parser.js.map +1 -1
- package/dist/src/plugins/manager.d.ts +133 -0
- package/dist/src/plugins/manager.d.ts.map +1 -0
- package/dist/src/plugins/manager.js +285 -521
- package/dist/src/plugins/manager.js.map +1 -1
- package/dist/src/plugins/store/discovery.d.ts +88 -0
- package/dist/src/plugins/store/discovery.d.ts.map +1 -0
- package/dist/src/plugins/store/discovery.js +271 -358
- package/dist/src/plugins/store/discovery.js.map +1 -1
- package/dist/src/plugins/store/index.d.ts +76 -0
- package/dist/src/plugins/store/index.d.ts.map +1 -0
- package/dist/src/plugins/store/index.js +48 -105
- package/dist/src/plugins/store/index.js.map +1 -1
- package/dist/src/plugins/store/search.d.ts +46 -0
- package/dist/src/plugins/store/search.d.ts.map +1 -0
- package/dist/src/plugins/store/search.js +69 -107
- package/dist/src/plugins/store/search.js.map +1 -1
- package/dist/src/plugins/store/types.d.ts +274 -0
- package/dist/src/plugins/store/types.d.ts.map +1 -0
- package/dist/src/plugins/tests/demo-plugin-store.js +113 -160
- package/dist/src/plugins/tests/demo-plugin-store.js.map +1 -1
- package/dist/src/plugins/tests/standalone-test.js +172 -223
- package/dist/src/plugins/tests/standalone-test.js.map +1 -1
- package/dist/src/plugins/tests/test-plugin-store.js +190 -228
- package/dist/src/plugins/tests/test-plugin-store.js.map +1 -1
- package/dist/src/production/circuit-breaker.d.ts +101 -0
- package/dist/src/production/circuit-breaker.d.ts.map +1 -0
- package/dist/src/production/circuit-breaker.js +62 -126
- package/dist/src/production/circuit-breaker.js.map +1 -1
- package/dist/src/production/error-handler.d.ts +92 -0
- package/dist/src/production/error-handler.d.ts.map +1 -0
- package/dist/src/production/error-handler.js +86 -156
- package/dist/src/production/error-handler.js.map +1 -1
- package/dist/src/production/monitoring.d.ts +161 -0
- package/dist/src/production/monitoring.d.ts.map +1 -0
- package/dist/src/production/monitoring.js +139 -220
- package/dist/src/production/monitoring.js.map +1 -1
- package/dist/src/production/rate-limiter.d.ts +80 -0
- package/dist/src/production/rate-limiter.d.ts.map +1 -0
- package/dist/src/production/rate-limiter.js +74 -93
- package/dist/src/production/rate-limiter.js.map +1 -1
- package/dist/src/production/retry.d.ts +48 -0
- package/dist/src/production/retry.d.ts.map +1 -0
- package/dist/src/production/retry.js +75 -167
- package/dist/src/production/retry.js.map +1 -1
- package/dist/src/prompt.d.ts +44 -0
- package/dist/src/prompt.d.ts.map +1 -0
- package/dist/src/prompt.js +436 -560
- package/dist/src/prompt.js.map +1 -1
- package/dist/src/runtime/headless.d.ts +60 -0
- package/dist/src/runtime/headless.d.ts.map +1 -0
- package/dist/src/runtime/headless.js +197 -286
- package/dist/src/runtime/headless.js.map +1 -1
- package/dist/src/ruvector/agent-wasm.d.ts +182 -0
- package/dist/src/ruvector/agent-wasm.d.ts.map +1 -0
- package/dist/src/ruvector/agent-wasm.js +156 -351
- package/dist/src/ruvector/agent-wasm.js.map +1 -1
- package/dist/src/ruvector/ast-analyzer.d.ts +67 -0
- package/dist/src/ruvector/ast-analyzer.d.ts.map +1 -0
- package/dist/src/ruvector/ast-analyzer.js +145 -232
- package/dist/src/ruvector/ast-analyzer.js.map +1 -1
- package/dist/src/ruvector/coverage-router.d.ts +160 -0
- package/dist/src/ruvector/coverage-router.d.ts.map +1 -0
- package/dist/src/ruvector/coverage-router.js +287 -419
- package/dist/src/ruvector/coverage-router.js.map +1 -1
- package/dist/src/ruvector/coverage-tools.js +56 -101
- package/dist/src/ruvector/coverage-tools.js.map +1 -1
- package/dist/src/ruvector/diff-classifier.d.ts +175 -0
- package/dist/src/ruvector/diff-classifier.d.ts.map +1 -0
- package/dist/src/ruvector/diff-classifier.js +324 -451
- package/dist/src/ruvector/diff-classifier.js.map +1 -1
- package/dist/src/ruvector/enhanced-model-router.d.ts +146 -0
- package/dist/src/ruvector/enhanced-model-router.d.ts.map +1 -0
- package/dist/src/ruvector/enhanced-model-router.js +260 -336
- package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
- package/dist/src/ruvector/flash-attention.d.ts +195 -0
- package/dist/src/ruvector/flash-attention.d.ts.map +1 -0
- package/dist/src/ruvector/flash-attention.js +223 -254
- package/dist/src/ruvector/flash-attention.js.map +1 -1
- package/dist/src/ruvector/graph-analyzer.d.ts +187 -0
- package/dist/src/ruvector/graph-analyzer.d.ts.map +1 -0
- package/dist/src/ruvector/graph-analyzer.js +486 -680
- package/dist/src/ruvector/graph-analyzer.js.map +1 -1
- package/dist/src/ruvector/index.d.ts +40 -0
- package/dist/src/ruvector/index.d.ts.map +1 -0
- package/dist/src/ruvector/index.js +36 -106
- package/dist/src/ruvector/index.js.map +1 -1
- package/dist/src/ruvector/lora-adapter.d.ts +218 -0
- package/dist/src/ruvector/lora-adapter.d.ts.map +1 -0
- package/dist/src/ruvector/lora-adapter.js +155 -248
- package/dist/src/ruvector/lora-adapter.js.map +1 -1
- package/dist/src/ruvector/model-router.d.ts +220 -0
- package/dist/src/ruvector/model-router.d.ts.map +1 -0
- package/dist/src/ruvector/model-router.js +175 -248
- package/dist/src/ruvector/model-router.js.map +1 -1
- package/dist/src/ruvector/moe-router.d.ts +206 -0
- package/dist/src/ruvector/moe-router.d.ts.map +1 -0
- package/dist/src/ruvector/moe-router.js +228 -286
- package/dist/src/ruvector/moe-router.js.map +1 -1
- package/dist/src/ruvector/q-learning-router.d.ts +211 -0
- package/dist/src/ruvector/q-learning-router.d.ts.map +1 -0
- package/dist/src/ruvector/q-learning-router.js +257 -338
- package/dist/src/ruvector/q-learning-router.js.map +1 -1
- package/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
- package/dist/src/ruvector/ruvllm-wasm.d.ts.map +1 -0
- package/dist/src/ruvector/ruvllm-wasm.js +270 -434
- package/dist/src/ruvector/ruvllm-wasm.js.map +1 -1
- package/dist/src/ruvector/semantic-router.d.ts +77 -0
- package/dist/src/ruvector/semantic-router.d.ts.map +1 -0
- package/dist/src/ruvector/semantic-router.js +60 -67
- package/dist/src/ruvector/semantic-router.js.map +1 -1
- package/dist/src/ruvector/vector-db.d.ts +69 -0
- package/dist/src/ruvector/vector-db.d.ts.map +1 -0
- package/dist/src/ruvector/vector-db.js +119 -205
- package/dist/src/ruvector/vector-db.js.map +1 -1
- package/dist/src/services/agentic-flow-bridge.d.ts +50 -0
- package/dist/src/services/agentic-flow-bridge.d.ts.map +1 -0
- package/dist/src/services/agentic-flow-bridge.js +32 -105
- package/dist/src/services/agentic-flow-bridge.js.map +1 -1
- package/dist/src/services/claim-service.d.ts +204 -0
- package/dist/src/services/claim-service.d.ts.map +1 -0
- package/dist/src/services/claim-service.js +615 -940
- package/dist/src/services/claim-service.js.map +1 -1
- package/dist/src/services/container-worker-pool.d.ts +197 -0
- package/dist/src/services/container-worker-pool.d.ts.map +1 -0
- package/dist/src/services/container-worker-pool.js +398 -666
- package/dist/src/services/container-worker-pool.js.map +1 -1
- package/dist/src/services/headless-worker-executor.d.ts +304 -0
- package/dist/src/services/headless-worker-executor.d.ts.map +1 -0
- package/dist/src/services/headless-worker-executor.js +441 -467
- package/dist/src/services/headless-worker-executor.js.map +1 -1
- package/dist/src/services/index.d.ts +4 -4
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/index.js +4 -4
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/services/registry-api.d.ts +58 -0
- package/dist/src/services/registry-api.d.ts.map +1 -0
- package/dist/src/services/registry-api.js +92 -200
- package/dist/src/services/registry-api.js.map +1 -1
- package/dist/src/services/ruvector-training.d.ts +222 -0
- package/dist/src/services/ruvector-training.d.ts.map +1 -0
- package/dist/src/services/ruvector-training.js +257 -337
- package/dist/src/services/ruvector-training.js.map +1 -1
- package/dist/src/services/worker-daemon.d.ts +228 -0
- package/dist/src/services/worker-daemon.d.ts.map +1 -0
- package/dist/src/services/worker-daemon.js +591 -849
- package/dist/src/services/worker-daemon.js.map +1 -1
- package/dist/src/services/worker-queue.d.ts +194 -0
- package/dist/src/services/worker-queue.d.ts.map +1 -0
- package/dist/src/services/worker-queue.js +331 -548
- package/dist/src/services/worker-queue.js.map +1 -1
- package/dist/src/suggest.d.ts +53 -0
- package/dist/src/suggest.d.ts.map +1 -0
- package/dist/src/suggest.js +45 -55
- package/dist/src/suggest.js.map +1 -1
- package/dist/src/transfer/anonymization/index.js +29 -37
- package/dist/src/transfer/anonymization/index.js.map +1 -1
- package/dist/src/transfer/deploy-seraphine.js +128 -155
- package/dist/src/transfer/deploy-seraphine.js.map +1 -1
- package/dist/src/transfer/export.d.ts +25 -0
- package/dist/src/transfer/export.d.ts.map +1 -0
- package/dist/src/transfer/export.js +84 -142
- package/dist/src/transfer/export.js.map +1 -1
- package/dist/src/transfer/index.d.ts +1 -1
- package/dist/src/transfer/index.d.ts.map +1 -1
- package/dist/src/transfer/index.js +0 -2
- package/dist/src/transfer/index.js.map +1 -1
- package/dist/src/transfer/ipfs/client.d.ts +109 -0
- package/dist/src/transfer/ipfs/client.d.ts.map +1 -0
- package/dist/src/transfer/ipfs/client.js +187 -337
- package/dist/src/transfer/ipfs/client.js.map +1 -1
- package/dist/src/transfer/ipfs/upload.d.ts +95 -0
- package/dist/src/transfer/ipfs/upload.d.ts.map +1 -0
- package/dist/src/transfer/ipfs/upload.js +288 -434
- package/dist/src/transfer/ipfs/upload.js.map +1 -1
- package/dist/src/transfer/models/seraphine.d.ts +72 -0
- package/dist/src/transfer/models/seraphine.d.ts.map +1 -0
- package/dist/src/transfer/models/seraphine.js +55 -55
- package/dist/src/transfer/models/seraphine.js.map +1 -1
- package/dist/src/transfer/serialization/cfp.d.ts +49 -0
- package/dist/src/transfer/serialization/cfp.d.ts.map +1 -0
- package/dist/src/transfer/serialization/cfp.js +30 -31
- package/dist/src/transfer/serialization/cfp.js.map +1 -1
- package/dist/src/transfer/storage/gcs.d.ts +82 -0
- package/dist/src/transfer/storage/gcs.d.ts.map +1 -0
- package/dist/src/transfer/storage/gcs.js +165 -232
- package/dist/src/transfer/storage/gcs.js.map +1 -1
- package/dist/src/transfer/store/discovery.d.ts +84 -0
- package/dist/src/transfer/store/discovery.d.ts.map +1 -0
- package/dist/src/transfer/store/discovery.js +239 -349
- package/dist/src/transfer/store/discovery.js.map +1 -1
- package/dist/src/transfer/store/download.d.ts +70 -0
- package/dist/src/transfer/store/download.d.ts.map +1 -0
- package/dist/src/transfer/store/download.js +243 -365
- package/dist/src/transfer/store/download.js.map +1 -1
- package/dist/src/transfer/store/index.d.ts +84 -0
- package/dist/src/transfer/store/index.d.ts.map +1 -0
- package/dist/src/transfer/store/index.js +63 -130
- package/dist/src/transfer/store/index.js.map +1 -1
- package/dist/src/transfer/store/publish.d.ts +76 -0
- package/dist/src/transfer/store/publish.d.ts.map +1 -0
- package/dist/src/transfer/store/publish.js +184 -258
- package/dist/src/transfer/store/publish.js.map +1 -1
- package/dist/src/transfer/store/registry.js +50 -72
- package/dist/src/transfer/store/registry.js.map +1 -1
- package/dist/src/transfer/store/search.d.ts +54 -0
- package/dist/src/transfer/store/search.d.ts.map +1 -0
- package/dist/src/transfer/store/search.js +64 -96
- package/dist/src/transfer/store/search.js.map +1 -1
- package/dist/src/transfer/store/tests/standalone-test.js +174 -231
- package/dist/src/transfer/store/tests/standalone-test.js.map +1 -1
- package/dist/src/transfer/test-seraphine.js +95 -130
- package/dist/src/transfer/test-seraphine.js.map +1 -1
- package/dist/src/transfer/tests/test-store.js +194 -239
- package/dist/src/transfer/tests/test-store.js.map +1 -1
- package/dist/src/transfer/types.d.ts +245 -0
- package/dist/src/transfer/types.d.ts.map +1 -0
- package/dist/src/types.d.ts +198 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +26 -55
- package/dist/src/types.js.map +1 -1
- package/dist/src/update/checker.d.ts +34 -0
- package/dist/src/update/checker.d.ts.map +1 -0
- package/dist/src/update/checker.js +106 -183
- package/dist/src/update/checker.js.map +1 -1
- package/dist/src/update/executor.d.ts +32 -0
- package/dist/src/update/executor.d.ts.map +1 -0
- package/dist/src/update/executor.js +135 -198
- package/dist/src/update/executor.js.map +1 -1
- package/dist/src/update/index.d.ts +33 -0
- package/dist/src/update/index.d.ts.map +1 -0
- package/dist/src/update/index.js +38 -85
- package/dist/src/update/index.js.map +1 -1
- package/dist/src/update/rate-limiter.d.ts +20 -0
- package/dist/src/update/rate-limiter.d.ts.map +1 -0
- package/dist/src/update/rate-limiter.js +19 -31
- package/dist/src/update/rate-limiter.js.map +1 -1
- package/dist/src/update/validator.d.ts +17 -0
- package/dist/src/update/validator.d.ts.map +1 -0
- package/dist/src/update/validator.js +38 -64
- package/dist/src/update/validator.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -9,75 +9,13 @@
|
|
|
9
9
|
* - consolidate: Memory consolidation (30 min interval)
|
|
10
10
|
* - testgaps: Test coverage analysis (20 min interval)
|
|
11
11
|
*/
|
|
12
|
-
var __extends = (this && this.__extends) || (function () {
|
|
13
|
-
var extendStatics = function (d, b) {
|
|
14
|
-
extendStatics = Object.setPrototypeOf ||
|
|
15
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
16
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
17
|
-
return extendStatics(d, b);
|
|
18
|
-
};
|
|
19
|
-
return function (d, b) {
|
|
20
|
-
if (typeof b !== "function" && b !== null)
|
|
21
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
22
|
-
extendStatics(d, b);
|
|
23
|
-
function __() { this.constructor = d; }
|
|
24
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
25
|
-
};
|
|
26
|
-
})();
|
|
27
|
-
var __assign = (this && this.__assign) || function () {
|
|
28
|
-
__assign = Object.assign || function(t) {
|
|
29
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
30
|
-
s = arguments[i];
|
|
31
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
32
|
-
t[p] = s[p];
|
|
33
|
-
}
|
|
34
|
-
return t;
|
|
35
|
-
};
|
|
36
|
-
return __assign.apply(this, arguments);
|
|
37
|
-
};
|
|
38
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
39
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
40
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
41
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
42
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
43
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
44
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
45
|
-
});
|
|
46
|
-
};
|
|
47
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
48
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
49
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
50
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
51
|
-
function step(op) {
|
|
52
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
53
|
-
while (_) try {
|
|
54
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
55
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
56
|
-
switch (op[0]) {
|
|
57
|
-
case 0: case 1: t = op; break;
|
|
58
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
59
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
60
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
61
|
-
default:
|
|
62
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
63
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
64
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
65
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
66
|
-
if (t[2]) _.ops.pop();
|
|
67
|
-
_.trys.pop(); continue;
|
|
68
|
-
}
|
|
69
|
-
op = body.call(thisArg, _);
|
|
70
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
71
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
12
|
import { EventEmitter } from 'events';
|
|
75
13
|
import { existsSync, mkdirSync, writeFileSync, readFileSync, appendFileSync } from 'fs';
|
|
76
14
|
import { cpus } from 'os';
|
|
77
15
|
import { join } from 'path';
|
|
78
16
|
import { HeadlessWorkerExecutor, isHeadlessWorker, } from './headless-worker-executor.js';
|
|
79
17
|
// Default worker configurations with improved intervals (P0 fix: map 5min -> 15min)
|
|
80
|
-
|
|
18
|
+
const DEFAULT_WORKERS = [
|
|
81
19
|
{ type: 'map', intervalMs: 15 * 60 * 1000, offsetMs: 0, priority: 'normal', description: 'Codebase mapping', enabled: true },
|
|
82
20
|
{ type: 'audit', intervalMs: 10 * 60 * 1000, offsetMs: 2 * 60 * 1000, priority: 'critical', description: 'Security analysis', enabled: true },
|
|
83
21
|
{ type: 'optimize', intervalMs: 15 * 60 * 1000, offsetMs: 4 * 60 * 1000, priority: 'high', description: 'Performance optimization', enabled: true },
|
|
@@ -87,127 +25,116 @@ var DEFAULT_WORKERS = [
|
|
|
87
25
|
{ type: 'document', intervalMs: 60 * 60 * 1000, offsetMs: 0, priority: 'low', description: 'Auto-documentation', enabled: false },
|
|
88
26
|
];
|
|
89
27
|
// Worker timeout (5 minutes max per worker)
|
|
90
|
-
|
|
28
|
+
const DEFAULT_WORKER_TIMEOUT_MS = 5 * 60 * 1000;
|
|
91
29
|
/**
|
|
92
30
|
* Worker Daemon - Manages background workers with Node.js
|
|
93
31
|
*/
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
32
|
+
export class WorkerDaemon extends EventEmitter {
|
|
33
|
+
config;
|
|
34
|
+
workers = new Map();
|
|
35
|
+
timers = new Map();
|
|
36
|
+
running = false;
|
|
37
|
+
startedAt;
|
|
38
|
+
projectRoot;
|
|
39
|
+
runningWorkers = new Set(); // Track concurrent workers
|
|
40
|
+
pendingWorkers = []; // Queue for deferred workers
|
|
41
|
+
// Headless execution support
|
|
42
|
+
headlessExecutor = null;
|
|
43
|
+
headlessAvailable = false;
|
|
44
|
+
// Preserve the original constructor config so we can detect explicit overrides
|
|
45
|
+
// during state restoration (R1: constructor config takes priority over stale state)
|
|
46
|
+
originalConfig;
|
|
47
|
+
constructor(projectRoot, config) {
|
|
48
|
+
super();
|
|
49
|
+
this.projectRoot = projectRoot;
|
|
50
|
+
this.originalConfig = config;
|
|
51
|
+
const claudeFlowDir = join(projectRoot, '.claude-flow');
|
|
110
52
|
// Read daemon config from .claude-flow/config.json (Layer B)
|
|
111
|
-
|
|
53
|
+
const fileConfig = this.readDaemonConfigFromFile(claudeFlowDir);
|
|
112
54
|
// CPU-proportional smart default instead of hardcoded 2.0
|
|
113
|
-
|
|
114
|
-
|
|
55
|
+
const cpuCount = WorkerDaemon.getEffectiveCpuCount();
|
|
56
|
+
const smartMaxCpuLoad = Math.max(cpuCount * 0.8, 2.0); // Floor of 2.0 for single-CPU machines
|
|
115
57
|
// Platform-aware default: macOS os.freemem() excludes reclaimable file cache,
|
|
116
58
|
// so reported "free" is much lower than actually available memory.
|
|
117
59
|
// Linux reports available memory (including reclaimable cache) more accurately.
|
|
118
|
-
|
|
60
|
+
const defaultMinFreeMemory = process.platform === 'darwin' ? 5 : 10;
|
|
119
61
|
// Priority: constructor arg > config.json > smart default
|
|
120
62
|
// For resourceThresholds, merge field-by-field so partial overrides
|
|
121
63
|
// (e.g. only --max-cpu-load) still pick up defaults for other fields.
|
|
122
|
-
|
|
123
|
-
autoStart:
|
|
124
|
-
logDir:
|
|
125
|
-
stateFile:
|
|
126
|
-
maxConcurrent:
|
|
127
|
-
workerTimeoutMs:
|
|
64
|
+
this.config = {
|
|
65
|
+
autoStart: config?.autoStart ?? fileConfig.autoStart ?? false,
|
|
66
|
+
logDir: config?.logDir ?? join(claudeFlowDir, 'logs'),
|
|
67
|
+
stateFile: config?.stateFile ?? join(claudeFlowDir, 'daemon-state.json'),
|
|
68
|
+
maxConcurrent: config?.maxConcurrent ?? fileConfig.maxConcurrent ?? 2,
|
|
69
|
+
workerTimeoutMs: config?.workerTimeoutMs ?? fileConfig.workerTimeoutMs ?? DEFAULT_WORKER_TIMEOUT_MS,
|
|
128
70
|
resourceThresholds: {
|
|
129
|
-
maxCpuLoad:
|
|
130
|
-
minFreeMemoryPercent:
|
|
71
|
+
maxCpuLoad: config?.resourceThresholds?.maxCpuLoad ?? fileConfig.maxCpuLoad ?? smartMaxCpuLoad,
|
|
72
|
+
minFreeMemoryPercent: config?.resourceThresholds?.minFreeMemoryPercent ?? fileConfig.minFreeMemoryPercent ?? defaultMinFreeMemory,
|
|
131
73
|
},
|
|
132
|
-
workers:
|
|
74
|
+
workers: config?.workers ?? DEFAULT_WORKERS,
|
|
133
75
|
};
|
|
134
76
|
// Setup graceful shutdown handlers
|
|
135
|
-
|
|
77
|
+
this.setupShutdownHandlers();
|
|
136
78
|
// Ensure directories exist
|
|
137
79
|
if (!existsSync(claudeFlowDir)) {
|
|
138
80
|
mkdirSync(claudeFlowDir, { recursive: true });
|
|
139
81
|
}
|
|
140
|
-
if (!existsSync(
|
|
141
|
-
mkdirSync(
|
|
82
|
+
if (!existsSync(this.config.logDir)) {
|
|
83
|
+
mkdirSync(this.config.logDir, { recursive: true });
|
|
142
84
|
}
|
|
143
85
|
// Initialize worker states
|
|
144
|
-
|
|
86
|
+
this.initializeWorkerStates();
|
|
145
87
|
// Initialize headless executor (async, non-blocking)
|
|
146
|
-
|
|
147
|
-
|
|
88
|
+
this.initHeadlessExecutor().catch((err) => {
|
|
89
|
+
this.log('warn', `Headless executor init failed: ${err}`);
|
|
148
90
|
});
|
|
149
|
-
return _this;
|
|
150
91
|
}
|
|
151
92
|
/**
|
|
152
93
|
* Initialize headless executor if Claude Code is available
|
|
153
94
|
*/
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
return __generator(this, function (_b) {
|
|
159
|
-
switch (_b.label) {
|
|
160
|
-
case 0:
|
|
161
|
-
_b.trys.push([0, 2, , 3]);
|
|
162
|
-
this.headlessExecutor = new HeadlessWorkerExecutor(this.projectRoot, {
|
|
163
|
-
maxConcurrent: this.config.maxConcurrent
|
|
164
|
-
});
|
|
165
|
-
_a = this;
|
|
166
|
-
return [4 /*yield*/, this.headlessExecutor.isAvailable()];
|
|
167
|
-
case 1:
|
|
168
|
-
_a.headlessAvailable = _b.sent();
|
|
169
|
-
if (this.headlessAvailable) {
|
|
170
|
-
this.log('info', 'Claude Code headless mode available - AI workers enabled');
|
|
171
|
-
// Forward headless executor events
|
|
172
|
-
this.headlessExecutor.on('execution:start', function (data) {
|
|
173
|
-
_this.emit('headless:start', data);
|
|
174
|
-
});
|
|
175
|
-
this.headlessExecutor.on('execution:complete', function (data) {
|
|
176
|
-
_this.emit('headless:complete', data);
|
|
177
|
-
});
|
|
178
|
-
this.headlessExecutor.on('execution:error', function (data) {
|
|
179
|
-
_this.emit('headless:error', data);
|
|
180
|
-
});
|
|
181
|
-
this.headlessExecutor.on('output', function (data) {
|
|
182
|
-
_this.emit('headless:output', data);
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
this.log('info', 'Claude Code not found - AI workers will run in local fallback mode');
|
|
187
|
-
}
|
|
188
|
-
return [3 /*break*/, 3];
|
|
189
|
-
case 2:
|
|
190
|
-
error_1 = _b.sent();
|
|
191
|
-
this.log('warn', "Failed to initialize headless executor: " + error_1);
|
|
192
|
-
this.headlessAvailable = false;
|
|
193
|
-
return [3 /*break*/, 3];
|
|
194
|
-
case 3: return [2 /*return*/];
|
|
195
|
-
}
|
|
95
|
+
async initHeadlessExecutor() {
|
|
96
|
+
try {
|
|
97
|
+
this.headlessExecutor = new HeadlessWorkerExecutor(this.projectRoot, {
|
|
98
|
+
maxConcurrent: this.config.maxConcurrent,
|
|
196
99
|
});
|
|
197
|
-
|
|
198
|
-
|
|
100
|
+
this.headlessAvailable = await this.headlessExecutor.isAvailable();
|
|
101
|
+
if (this.headlessAvailable) {
|
|
102
|
+
this.log('info', 'Claude Code headless mode available - AI workers enabled');
|
|
103
|
+
// Forward headless executor events
|
|
104
|
+
this.headlessExecutor.on('execution:start', (data) => {
|
|
105
|
+
this.emit('headless:start', data);
|
|
106
|
+
});
|
|
107
|
+
this.headlessExecutor.on('execution:complete', (data) => {
|
|
108
|
+
this.emit('headless:complete', data);
|
|
109
|
+
});
|
|
110
|
+
this.headlessExecutor.on('execution:error', (data) => {
|
|
111
|
+
this.emit('headless:error', data);
|
|
112
|
+
});
|
|
113
|
+
this.headlessExecutor.on('output', (data) => {
|
|
114
|
+
this.emit('headless:output', data);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
this.log('info', 'Claude Code not found - AI workers will run in local fallback mode');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
this.log('warn', `Failed to initialize headless executor: ${error}`);
|
|
123
|
+
this.headlessAvailable = false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
199
126
|
/**
|
|
200
127
|
* Check if headless execution is available
|
|
201
128
|
*/
|
|
202
|
-
|
|
129
|
+
isHeadlessAvailable() {
|
|
203
130
|
return this.headlessAvailable;
|
|
204
|
-
}
|
|
131
|
+
}
|
|
205
132
|
/**
|
|
206
133
|
* Get headless executor instance
|
|
207
134
|
*/
|
|
208
|
-
|
|
135
|
+
getHeadlessExecutor() {
|
|
209
136
|
return this.headlessExecutor;
|
|
210
|
-
}
|
|
137
|
+
}
|
|
211
138
|
/**
|
|
212
139
|
* Detect effective CPU count for the current environment.
|
|
213
140
|
*
|
|
@@ -216,107 +143,88 @@ var WorkerDaemon = /** @class */ (function (_super) {
|
|
|
216
143
|
* cgroup v2 / v1 quota files first so the maxCpuLoad threshold stays
|
|
217
144
|
* meaningful under resource-limited containers.
|
|
218
145
|
*/
|
|
219
|
-
|
|
146
|
+
static getEffectiveCpuCount() {
|
|
220
147
|
// 1. Try cgroup v2: /sys/fs/cgroup/cpu.max
|
|
221
148
|
try {
|
|
222
|
-
|
|
223
|
-
|
|
149
|
+
const cpuMax = readFileSync('/sys/fs/cgroup/cpu.max', 'utf8').trim();
|
|
150
|
+
const [quotaStr, periodStr] = cpuMax.split(' ');
|
|
224
151
|
if (quotaStr !== 'max') {
|
|
225
|
-
|
|
226
|
-
|
|
152
|
+
const quota = parseInt(quotaStr, 10);
|
|
153
|
+
const period = parseInt(periodStr, 10);
|
|
227
154
|
if (quota > 0 && period > 0)
|
|
228
155
|
return Math.ceil(quota / period);
|
|
229
156
|
}
|
|
230
157
|
}
|
|
231
|
-
catch
|
|
158
|
+
catch { /* not in cgroup v2 */ }
|
|
232
159
|
// 2. Try cgroup v1: /sys/fs/cgroup/cpu/cpu.cfs_quota_us
|
|
233
160
|
try {
|
|
234
|
-
|
|
235
|
-
|
|
161
|
+
const quota = parseInt(readFileSync('/sys/fs/cgroup/cpu/cpu.cfs_quota_us', 'utf8').trim(), 10);
|
|
162
|
+
const period = parseInt(readFileSync('/sys/fs/cgroup/cpu/cpu.cfs_period_us', 'utf8').trim(), 10);
|
|
236
163
|
if (quota > 0 && period > 0)
|
|
237
164
|
return Math.ceil(quota / period);
|
|
238
165
|
}
|
|
239
|
-
catch
|
|
166
|
+
catch { /* not in cgroup v1 */ }
|
|
240
167
|
// 3. Fallback to os.cpus().length
|
|
241
168
|
return cpus().length || 1;
|
|
242
|
-
}
|
|
169
|
+
}
|
|
243
170
|
/**
|
|
244
171
|
* Read daemon-specific config from .claude-flow/config.json
|
|
245
172
|
* Supports dot-notation keys like 'daemon.resourceThresholds.maxCpuLoad'
|
|
246
173
|
*/
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
var configPath = join(claudeFlowDir, 'config.json');
|
|
174
|
+
readDaemonConfigFromFile(claudeFlowDir) {
|
|
175
|
+
const configPath = join(claudeFlowDir, 'config.json');
|
|
250
176
|
if (!existsSync(configPath))
|
|
251
177
|
return {};
|
|
252
178
|
try {
|
|
253
|
-
|
|
179
|
+
const raw = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
254
180
|
// Support both flat keys at root and nested under scopes.project
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
181
|
+
const cfg = raw?.scopes?.project ?? raw;
|
|
182
|
+
const rawCpuLoad = cfg['daemon.resourceThresholds.maxCpuLoad'] ?? raw['daemon.resourceThresholds.maxCpuLoad'];
|
|
183
|
+
const rawMinMem = cfg['daemon.resourceThresholds.minFreeMemoryPercent'] ?? raw['daemon.resourceThresholds.minFreeMemoryPercent'];
|
|
184
|
+
const rawMaxConcurrent = cfg['daemon.maxConcurrent'] ?? raw['daemon.maxConcurrent'];
|
|
185
|
+
const rawTimeout = cfg['daemon.workerTimeoutMs'] ?? raw['daemon.workerTimeoutMs'];
|
|
260
186
|
return {
|
|
261
187
|
autoStart: typeof raw['daemon.autoStart'] === 'boolean' ? raw['daemon.autoStart'] : undefined,
|
|
262
188
|
maxConcurrent: (typeof rawMaxConcurrent === 'number' && rawMaxConcurrent > 0) ? rawMaxConcurrent : undefined,
|
|
263
189
|
workerTimeoutMs: (typeof rawTimeout === 'number' && rawTimeout > 0) ? rawTimeout : undefined,
|
|
264
190
|
maxCpuLoad: (typeof rawCpuLoad === 'number' && rawCpuLoad > 0 && rawCpuLoad < 1000) ? rawCpuLoad : undefined,
|
|
265
|
-
minFreeMemoryPercent: (typeof rawMinMem === 'number' && rawMinMem >= 0 && rawMinMem <= 100) ? rawMinMem : undefined
|
|
191
|
+
minFreeMemoryPercent: (typeof rawMinMem === 'number' && rawMinMem >= 0 && rawMinMem <= 100) ? rawMinMem : undefined,
|
|
266
192
|
};
|
|
267
193
|
}
|
|
268
|
-
catch
|
|
194
|
+
catch {
|
|
269
195
|
return {};
|
|
270
196
|
}
|
|
271
|
-
}
|
|
197
|
+
}
|
|
272
198
|
/**
|
|
273
199
|
* Setup graceful shutdown handlers
|
|
274
200
|
*/
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
this.log('info', 'Received shutdown signal, stopping daemon...');
|
|
282
|
-
return [4 /*yield*/, this.stop()];
|
|
283
|
-
case 1:
|
|
284
|
-
_a.sent();
|
|
285
|
-
process.exit(0);
|
|
286
|
-
return [2 /*return*/];
|
|
287
|
-
}
|
|
288
|
-
});
|
|
289
|
-
}); };
|
|
201
|
+
setupShutdownHandlers() {
|
|
202
|
+
const shutdown = async () => {
|
|
203
|
+
this.log('info', 'Received shutdown signal, stopping daemon...');
|
|
204
|
+
await this.stop();
|
|
205
|
+
process.exit(0);
|
|
206
|
+
};
|
|
290
207
|
process.on('SIGTERM', shutdown);
|
|
291
208
|
process.on('SIGINT', shutdown);
|
|
292
209
|
process.on('SIGHUP', shutdown);
|
|
293
|
-
}
|
|
210
|
+
}
|
|
294
211
|
/**
|
|
295
212
|
* Check if system resources allow worker execution
|
|
296
213
|
*/
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
}
|
|
312
|
-
if (freePercent < this.config.resourceThresholds.minFreeMemoryPercent) {
|
|
313
|
-
return [2 /*return*/, { allowed: false, reason: "Memory too low: " + freePercent.toFixed(1) + "% free" }];
|
|
314
|
-
}
|
|
315
|
-
return [2 /*return*/, { allowed: true }];
|
|
316
|
-
}
|
|
317
|
-
});
|
|
318
|
-
});
|
|
319
|
-
};
|
|
214
|
+
async canRunWorker() {
|
|
215
|
+
const os = await import('os');
|
|
216
|
+
const cpuLoad = os.loadavg()[0];
|
|
217
|
+
const totalMem = os.totalmem();
|
|
218
|
+
const freeMem = os.freemem();
|
|
219
|
+
const freePercent = (freeMem / totalMem) * 100;
|
|
220
|
+
if (cpuLoad > this.config.resourceThresholds.maxCpuLoad) {
|
|
221
|
+
return { allowed: false, reason: `CPU load too high: ${cpuLoad.toFixed(2)}` };
|
|
222
|
+
}
|
|
223
|
+
if (freePercent < this.config.resourceThresholds.minFreeMemoryPercent) {
|
|
224
|
+
return { allowed: false, reason: `Memory too low: ${freePercent.toFixed(1)}% free` };
|
|
225
|
+
}
|
|
226
|
+
return { allowed: true };
|
|
227
|
+
}
|
|
320
228
|
/**
|
|
321
229
|
* Process pending workers queue
|
|
322
230
|
*
|
|
@@ -326,80 +234,45 @@ var WorkerDaemon = /** @class */ (function (_super) {
|
|
|
326
234
|
* currently running when we break, we schedule a backoff retry so the queue
|
|
327
235
|
* does not get permanently stuck.
|
|
328
236
|
*/
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
case 1:
|
|
346
|
-
result = _b.sent();
|
|
347
|
-
if (result === null) {
|
|
348
|
-
// Worker was deferred (resource pressure or concurrency limit).
|
|
349
|
-
// Break to avoid tight-looping — the next executeWorker() completion
|
|
350
|
-
// will call processPendingWorkers() again via the finally block.
|
|
351
|
-
if (this_1.runningWorkers.size === 0) {
|
|
352
|
-
// No workers running means nobody will trigger the finally-block
|
|
353
|
-
// callback, so schedule a backoff retry to avoid a stuck queue.
|
|
354
|
-
setTimeout(function () { return _this.processPendingWorkers(); }, 30000).unref();
|
|
355
|
-
}
|
|
356
|
-
return [2 /*return*/, "break"];
|
|
357
|
-
}
|
|
358
|
-
_b.label = 2;
|
|
359
|
-
case 2: return [2 /*return*/];
|
|
360
|
-
}
|
|
361
|
-
});
|
|
362
|
-
};
|
|
363
|
-
this_1 = this;
|
|
364
|
-
_a.label = 1;
|
|
365
|
-
case 1:
|
|
366
|
-
if (!(this.pendingWorkers.length > 0 && this.runningWorkers.size < this.config.maxConcurrent)) return [3 /*break*/, 3];
|
|
367
|
-
return [5 /*yield**/, _loop_1()];
|
|
368
|
-
case 2:
|
|
369
|
-
state_1 = _a.sent();
|
|
370
|
-
if (state_1 === "break")
|
|
371
|
-
return [3 /*break*/, 3];
|
|
372
|
-
return [3 /*break*/, 1];
|
|
373
|
-
case 3: return [2 /*return*/];
|
|
237
|
+
async processPendingWorkers() {
|
|
238
|
+
while (this.pendingWorkers.length > 0 && this.runningWorkers.size < this.config.maxConcurrent) {
|
|
239
|
+
const workerType = this.pendingWorkers.shift();
|
|
240
|
+
const workerConfig = this.config.workers.find(w => w.type === workerType);
|
|
241
|
+
if (workerConfig) {
|
|
242
|
+
const result = await this.executeWorkerWithConcurrencyControl(workerConfig);
|
|
243
|
+
if (result === null) {
|
|
244
|
+
// Worker was deferred (resource pressure or concurrency limit).
|
|
245
|
+
// Break to avoid tight-looping — the next executeWorker() completion
|
|
246
|
+
// will call processPendingWorkers() again via the finally block.
|
|
247
|
+
if (this.runningWorkers.size === 0) {
|
|
248
|
+
// No workers running means nobody will trigger the finally-block
|
|
249
|
+
// callback, so schedule a backoff retry to avoid a stuck queue.
|
|
250
|
+
setTimeout(() => this.processPendingWorkers(), 30_000).unref();
|
|
251
|
+
}
|
|
252
|
+
break;
|
|
374
253
|
}
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
var _a, _b, _c, _d, _e;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
initializeWorkerStates() {
|
|
380
258
|
// Try to restore state from file
|
|
381
259
|
if (existsSync(this.config.stateFile)) {
|
|
382
260
|
try {
|
|
383
|
-
|
|
261
|
+
const saved = JSON.parse(readFileSync(this.config.stateFile, 'utf-8'));
|
|
384
262
|
// CRITICAL: Restore worker config (including enabled flag) from saved state
|
|
385
263
|
// This fixes #950: daemon enable command not persisting worker state
|
|
386
|
-
if (
|
|
387
|
-
|
|
388
|
-
|
|
264
|
+
if (saved.config?.workers && Array.isArray(saved.config.workers)) {
|
|
265
|
+
for (const savedWorker of saved.config.workers) {
|
|
266
|
+
const workerConfig = this.config.workers.find(w => w.type === savedWorker.type);
|
|
389
267
|
if (workerConfig && typeof savedWorker.enabled === 'boolean') {
|
|
390
268
|
workerConfig.enabled = savedWorker.enabled;
|
|
391
269
|
}
|
|
392
|
-
};
|
|
393
|
-
var this_2 = this;
|
|
394
|
-
for (var _i = 0, _f = saved.config.workers; _i < _f.length; _i++) {
|
|
395
|
-
var savedWorker = _f[_i];
|
|
396
|
-
_loop_2(savedWorker);
|
|
397
270
|
}
|
|
398
271
|
}
|
|
399
272
|
// Restore resourceThresholds, maxConcurrent, workerTimeoutMs from saved state
|
|
400
273
|
// Only restore if valid numeric values within sane ranges
|
|
401
|
-
if (
|
|
402
|
-
|
|
274
|
+
if (saved.config?.resourceThresholds && !this.originalConfig?.resourceThresholds) {
|
|
275
|
+
const rt = saved.config.resourceThresholds;
|
|
403
276
|
if (typeof rt.maxCpuLoad === 'number' && rt.maxCpuLoad > 0 && rt.maxCpuLoad < 1000) {
|
|
404
277
|
this.config.resourceThresholds.maxCpuLoad = rt.maxCpuLoad;
|
|
405
278
|
}
|
|
@@ -407,263 +280,217 @@ var WorkerDaemon = /** @class */ (function (_super) {
|
|
|
407
280
|
this.config.resourceThresholds.minFreeMemoryPercent = rt.minFreeMemoryPercent;
|
|
408
281
|
}
|
|
409
282
|
}
|
|
410
|
-
if (typeof
|
|
283
|
+
if (typeof saved.config?.maxConcurrent === 'number' && saved.config.maxConcurrent > 0) {
|
|
411
284
|
this.config.maxConcurrent = saved.config.maxConcurrent;
|
|
412
285
|
}
|
|
413
|
-
if (typeof
|
|
286
|
+
if (typeof saved.config?.workerTimeoutMs === 'number' && saved.config.workerTimeoutMs > 0) {
|
|
414
287
|
this.config.workerTimeoutMs = saved.config.workerTimeoutMs;
|
|
415
288
|
}
|
|
416
289
|
// Restore worker runtime states (runCount, successCount, etc.)
|
|
417
290
|
if (saved.workers) {
|
|
418
|
-
for (
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
this.workers.set(type_1, {
|
|
291
|
+
for (const [type, state] of Object.entries(saved.workers)) {
|
|
292
|
+
const savedState = state;
|
|
293
|
+
const lastRunValue = savedState.lastRun;
|
|
294
|
+
this.workers.set(type, {
|
|
423
295
|
runCount: savedState.runCount || 0,
|
|
424
296
|
successCount: savedState.successCount || 0,
|
|
425
297
|
failureCount: savedState.failureCount || 0,
|
|
426
298
|
averageDurationMs: savedState.averageDurationMs || 0,
|
|
427
299
|
lastRun: lastRunValue ? new Date(lastRunValue) : undefined,
|
|
428
300
|
nextRun: undefined,
|
|
429
|
-
isRunning: false
|
|
301
|
+
isRunning: false,
|
|
430
302
|
});
|
|
431
303
|
}
|
|
432
304
|
}
|
|
433
305
|
}
|
|
434
|
-
catch
|
|
306
|
+
catch {
|
|
435
307
|
// Ignore parse errors, start fresh
|
|
436
308
|
}
|
|
437
309
|
}
|
|
438
310
|
// Initialize any missing workers
|
|
439
|
-
for (
|
|
440
|
-
var workerConfig = _m[_l];
|
|
311
|
+
for (const workerConfig of this.config.workers) {
|
|
441
312
|
if (!this.workers.has(workerConfig.type)) {
|
|
442
313
|
this.workers.set(workerConfig.type, {
|
|
443
314
|
runCount: 0,
|
|
444
315
|
successCount: 0,
|
|
445
316
|
failureCount: 0,
|
|
446
317
|
averageDurationMs: 0,
|
|
447
|
-
isRunning: false
|
|
318
|
+
isRunning: false,
|
|
448
319
|
});
|
|
449
320
|
}
|
|
450
321
|
}
|
|
451
|
-
}
|
|
322
|
+
}
|
|
452
323
|
/**
|
|
453
324
|
* Start the daemon and all enabled workers
|
|
454
325
|
*/
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
return
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
// Save state
|
|
474
|
-
this.saveState();
|
|
475
|
-
this.log('info', "Daemon started (PID: " + process.pid + ", CPUs: " + cpus().length + ", workers: " + this.config.workers.filter(function (w) { return w.enabled; }).length + ", maxCpuLoad: " + this.config.resourceThresholds.maxCpuLoad + ", minFreeMemoryPercent: " + this.config.resourceThresholds.minFreeMemoryPercent + "%)");
|
|
476
|
-
return [2 /*return*/];
|
|
477
|
-
});
|
|
478
|
-
});
|
|
479
|
-
};
|
|
326
|
+
async start() {
|
|
327
|
+
if (this.running) {
|
|
328
|
+
this.emit('warning', 'Daemon already running');
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
this.running = true;
|
|
332
|
+
this.startedAt = new Date();
|
|
333
|
+
this.emit('started', { pid: process.pid, startedAt: this.startedAt });
|
|
334
|
+
// Schedule all enabled workers
|
|
335
|
+
for (const workerConfig of this.config.workers) {
|
|
336
|
+
if (workerConfig.enabled) {
|
|
337
|
+
this.scheduleWorker(workerConfig);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
// Save state
|
|
341
|
+
this.saveState();
|
|
342
|
+
this.log('info', `Daemon started (PID: ${process.pid}, CPUs: ${cpus().length}, workers: ${this.config.workers.filter(w => w.enabled).length}, maxCpuLoad: ${this.config.resourceThresholds.maxCpuLoad}, minFreeMemoryPercent: ${this.config.resourceThresholds.minFreeMemoryPercent}%)`);
|
|
343
|
+
}
|
|
480
344
|
/**
|
|
481
345
|
* Stop the daemon and all workers
|
|
482
346
|
*/
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
return
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
this.emit('stopped', { stoppedAt: new Date() });
|
|
501
|
-
this.log('info', 'Daemon stopped');
|
|
502
|
-
return [2 /*return*/];
|
|
503
|
-
});
|
|
504
|
-
});
|
|
505
|
-
};
|
|
347
|
+
async stop() {
|
|
348
|
+
if (!this.running) {
|
|
349
|
+
this.emit('warning', 'Daemon not running');
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
// Clear all timers (convert to array to avoid iterator issues)
|
|
353
|
+
const timerEntries = Array.from(this.timers.entries());
|
|
354
|
+
for (const [type, timer] of timerEntries) {
|
|
355
|
+
clearTimeout(timer);
|
|
356
|
+
this.log('info', `Stopped worker: ${type}`);
|
|
357
|
+
}
|
|
358
|
+
this.timers.clear();
|
|
359
|
+
this.running = false;
|
|
360
|
+
this.saveState();
|
|
361
|
+
this.emit('stopped', { stoppedAt: new Date() });
|
|
362
|
+
this.log('info', 'Daemon stopped');
|
|
363
|
+
}
|
|
506
364
|
/**
|
|
507
365
|
* Get daemon status
|
|
508
366
|
*/
|
|
509
|
-
|
|
367
|
+
getStatus() {
|
|
510
368
|
return {
|
|
511
369
|
running: this.running,
|
|
512
370
|
pid: process.pid,
|
|
513
371
|
startedAt: this.startedAt,
|
|
514
372
|
workers: new Map(this.workers),
|
|
515
|
-
config: this.config
|
|
373
|
+
config: this.config,
|
|
516
374
|
};
|
|
517
|
-
}
|
|
375
|
+
}
|
|
518
376
|
/**
|
|
519
377
|
* Schedule a worker to run at intervals with staggered start
|
|
520
378
|
*/
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
var staggerOffset = internalConfig.offsetMs || 0;
|
|
379
|
+
scheduleWorker(workerConfig) {
|
|
380
|
+
const state = this.workers.get(workerConfig.type);
|
|
381
|
+
const internalConfig = workerConfig;
|
|
382
|
+
const staggerOffset = internalConfig.offsetMs || 0;
|
|
526
383
|
// Calculate initial delay with stagger offset
|
|
527
|
-
|
|
384
|
+
let initialDelay = staggerOffset;
|
|
528
385
|
if (state.lastRun) {
|
|
529
|
-
|
|
386
|
+
const timeSinceLastRun = Date.now() - state.lastRun.getTime();
|
|
530
387
|
initialDelay = Math.max(staggerOffset, workerConfig.intervalMs - timeSinceLastRun);
|
|
531
388
|
}
|
|
532
389
|
state.nextRun = new Date(Date.now() + initialDelay);
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
// Reschedule
|
|
546
|
-
if (this.running) {
|
|
547
|
-
timer_1 = setTimeout(runAndReschedule, workerConfig.intervalMs);
|
|
548
|
-
this.timers.set(workerConfig.type, timer_1);
|
|
549
|
-
state.nextRun = new Date(Date.now() + workerConfig.intervalMs);
|
|
550
|
-
}
|
|
551
|
-
return [2 /*return*/];
|
|
552
|
-
}
|
|
553
|
-
});
|
|
554
|
-
}); };
|
|
390
|
+
const runAndReschedule = async () => {
|
|
391
|
+
if (!this.running)
|
|
392
|
+
return;
|
|
393
|
+
// Use concurrency-controlled execution (P0 fix)
|
|
394
|
+
await this.executeWorkerWithConcurrencyControl(workerConfig);
|
|
395
|
+
// Reschedule
|
|
396
|
+
if (this.running) {
|
|
397
|
+
const timer = setTimeout(runAndReschedule, workerConfig.intervalMs);
|
|
398
|
+
this.timers.set(workerConfig.type, timer);
|
|
399
|
+
state.nextRun = new Date(Date.now() + workerConfig.intervalMs);
|
|
400
|
+
}
|
|
401
|
+
};
|
|
555
402
|
// Schedule first run with stagger offset
|
|
556
|
-
|
|
403
|
+
const timer = setTimeout(runAndReschedule, initialDelay);
|
|
557
404
|
this.timers.set(workerConfig.type, timer);
|
|
558
|
-
this.log('info',
|
|
559
|
-
}
|
|
405
|
+
this.log('info', `Scheduled ${workerConfig.type} (interval: ${workerConfig.intervalMs / 1000}s, first run in ${initialDelay / 1000}s)`);
|
|
406
|
+
}
|
|
560
407
|
/**
|
|
561
408
|
* Execute a worker with concurrency control (P0 fix)
|
|
562
409
|
*/
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
this.pendingWorkers.push(workerConfig.type);
|
|
582
|
-
this.emit('worker:deferred', { type: workerConfig.type, reason: resourceCheck.reason });
|
|
583
|
-
return [2 /*return*/, null];
|
|
584
|
-
}
|
|
585
|
-
return [2 /*return*/, this.executeWorker(workerConfig)];
|
|
586
|
-
}
|
|
587
|
-
});
|
|
588
|
-
});
|
|
589
|
-
};
|
|
410
|
+
async executeWorkerWithConcurrencyControl(workerConfig) {
|
|
411
|
+
// Check concurrency limit
|
|
412
|
+
if (this.runningWorkers.size >= this.config.maxConcurrent) {
|
|
413
|
+
this.log('info', `Worker ${workerConfig.type} deferred: max concurrent (${this.config.maxConcurrent}) reached`);
|
|
414
|
+
this.pendingWorkers.push(workerConfig.type);
|
|
415
|
+
this.emit('worker:deferred', { type: workerConfig.type, reason: 'max_concurrent' });
|
|
416
|
+
return null;
|
|
417
|
+
}
|
|
418
|
+
// Check resource availability
|
|
419
|
+
const resourceCheck = await this.canRunWorker();
|
|
420
|
+
if (!resourceCheck.allowed) {
|
|
421
|
+
this.log('info', `Worker ${workerConfig.type} deferred: ${resourceCheck.reason}`);
|
|
422
|
+
this.pendingWorkers.push(workerConfig.type);
|
|
423
|
+
this.emit('worker:deferred', { type: workerConfig.type, reason: resourceCheck.reason });
|
|
424
|
+
return null;
|
|
425
|
+
}
|
|
426
|
+
return this.executeWorker(workerConfig);
|
|
427
|
+
}
|
|
590
428
|
/**
|
|
591
429
|
* Execute a worker with timeout protection
|
|
592
430
|
*/
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
case 1:
|
|
610
|
-
_a.trys.push([1, 3, 4, 5]);
|
|
611
|
-
return [4 /*yield*/, this.runWithTimeout(function () { return _this.runWorkerLogic(workerConfig); }, this.config.workerTimeoutMs, "Worker " + workerConfig.type + " timed out after " + this.config.workerTimeoutMs / 1000 + "s", function () {
|
|
612
|
-
// On timeout, cancel any headless execution to prevent orphan processes
|
|
613
|
-
if (_this.headlessExecutor) {
|
|
614
|
-
_this.headlessExecutor.cancelAll();
|
|
615
|
-
}
|
|
616
|
-
})];
|
|
617
|
-
case 2:
|
|
618
|
-
output = _a.sent();
|
|
619
|
-
durationMs = Date.now() - startTime;
|
|
620
|
-
// Update state
|
|
621
|
-
state.runCount++;
|
|
622
|
-
state.successCount++;
|
|
623
|
-
state.lastRun = new Date();
|
|
624
|
-
state.averageDurationMs = (state.averageDurationMs * (state.runCount - 1) + durationMs) / state.runCount;
|
|
625
|
-
state.isRunning = false;
|
|
626
|
-
result = {
|
|
627
|
-
workerId: workerId,
|
|
628
|
-
type: workerConfig.type,
|
|
629
|
-
success: true,
|
|
630
|
-
durationMs: durationMs,
|
|
631
|
-
output: output,
|
|
632
|
-
timestamp: new Date()
|
|
633
|
-
};
|
|
634
|
-
this.emit('worker:complete', result);
|
|
635
|
-
this.log('info', "Worker " + workerConfig.type + " completed in " + durationMs + "ms");
|
|
636
|
-
this.saveState();
|
|
637
|
-
return [2 /*return*/, result];
|
|
638
|
-
case 3:
|
|
639
|
-
error_2 = _a.sent();
|
|
640
|
-
durationMs = Date.now() - startTime;
|
|
641
|
-
state.runCount++;
|
|
642
|
-
state.failureCount++;
|
|
643
|
-
state.lastRun = new Date();
|
|
644
|
-
state.isRunning = false;
|
|
645
|
-
result = {
|
|
646
|
-
workerId: workerId,
|
|
647
|
-
type: workerConfig.type,
|
|
648
|
-
success: false,
|
|
649
|
-
durationMs: durationMs,
|
|
650
|
-
error: error_2 instanceof Error ? error_2.message : String(error_2),
|
|
651
|
-
timestamp: new Date()
|
|
652
|
-
};
|
|
653
|
-
this.emit('worker:error', result);
|
|
654
|
-
this.log('error', "Worker " + workerConfig.type + " failed: " + result.error);
|
|
655
|
-
this.saveState();
|
|
656
|
-
return [2 /*return*/, result];
|
|
657
|
-
case 4:
|
|
658
|
-
// Remove from running set and process queue
|
|
659
|
-
this.runningWorkers["delete"](workerConfig.type);
|
|
660
|
-
this.processPendingWorkers();
|
|
661
|
-
return [7 /*endfinally*/];
|
|
662
|
-
case 5: return [2 /*return*/];
|
|
431
|
+
async executeWorker(workerConfig) {
|
|
432
|
+
const state = this.workers.get(workerConfig.type);
|
|
433
|
+
const workerId = `${workerConfig.type}_${Date.now()}`;
|
|
434
|
+
const startTime = Date.now();
|
|
435
|
+
// Track running worker
|
|
436
|
+
this.runningWorkers.add(workerConfig.type);
|
|
437
|
+
state.isRunning = true;
|
|
438
|
+
this.emit('worker:start', { workerId, type: workerConfig.type });
|
|
439
|
+
this.log('info', `Starting worker: ${workerConfig.type} (${this.runningWorkers.size}/${this.config.maxConcurrent} concurrent)`);
|
|
440
|
+
try {
|
|
441
|
+
// Execute worker logic with timeout (P1 fix)
|
|
442
|
+
// Pass cleanup callback to kill orphan child processes on timeout (#1117)
|
|
443
|
+
const output = await this.runWithTimeout(() => this.runWorkerLogic(workerConfig), this.config.workerTimeoutMs, `Worker ${workerConfig.type} timed out after ${this.config.workerTimeoutMs / 1000}s`, () => {
|
|
444
|
+
// On timeout, cancel any headless execution to prevent orphan processes
|
|
445
|
+
if (this.headlessExecutor) {
|
|
446
|
+
this.headlessExecutor.cancelAll();
|
|
663
447
|
}
|
|
664
448
|
});
|
|
665
|
-
|
|
666
|
-
|
|
449
|
+
const durationMs = Date.now() - startTime;
|
|
450
|
+
// Update state
|
|
451
|
+
state.runCount++;
|
|
452
|
+
state.successCount++;
|
|
453
|
+
state.lastRun = new Date();
|
|
454
|
+
state.averageDurationMs = (state.averageDurationMs * (state.runCount - 1) + durationMs) / state.runCount;
|
|
455
|
+
state.isRunning = false;
|
|
456
|
+
const result = {
|
|
457
|
+
workerId,
|
|
458
|
+
type: workerConfig.type,
|
|
459
|
+
success: true,
|
|
460
|
+
durationMs,
|
|
461
|
+
output,
|
|
462
|
+
timestamp: new Date(),
|
|
463
|
+
};
|
|
464
|
+
this.emit('worker:complete', result);
|
|
465
|
+
this.log('info', `Worker ${workerConfig.type} completed in ${durationMs}ms`);
|
|
466
|
+
this.saveState();
|
|
467
|
+
return result;
|
|
468
|
+
}
|
|
469
|
+
catch (error) {
|
|
470
|
+
const durationMs = Date.now() - startTime;
|
|
471
|
+
state.runCount++;
|
|
472
|
+
state.failureCount++;
|
|
473
|
+
state.lastRun = new Date();
|
|
474
|
+
state.isRunning = false;
|
|
475
|
+
const result = {
|
|
476
|
+
workerId,
|
|
477
|
+
type: workerConfig.type,
|
|
478
|
+
success: false,
|
|
479
|
+
durationMs,
|
|
480
|
+
error: error instanceof Error ? error.message : String(error),
|
|
481
|
+
timestamp: new Date(),
|
|
482
|
+
};
|
|
483
|
+
this.emit('worker:error', result);
|
|
484
|
+
this.log('error', `Worker ${workerConfig.type} failed: ${result.error}`);
|
|
485
|
+
this.saveState();
|
|
486
|
+
return result;
|
|
487
|
+
}
|
|
488
|
+
finally {
|
|
489
|
+
// Remove from running set and process queue
|
|
490
|
+
this.runningWorkers.delete(workerConfig.type);
|
|
491
|
+
this.processPendingWorkers();
|
|
492
|
+
}
|
|
493
|
+
}
|
|
667
494
|
/**
|
|
668
495
|
* Run a function with timeout (P1 fix)
|
|
669
496
|
* @param fn - The async function to execute
|
|
@@ -671,436 +498,371 @@ var WorkerDaemon = /** @class */ (function (_super) {
|
|
|
671
498
|
* @param timeoutMessage - Error message on timeout
|
|
672
499
|
* @param onTimeout - Optional cleanup callback invoked when timeout fires (#1117: kills orphan processes)
|
|
673
500
|
*/
|
|
674
|
-
|
|
675
|
-
return
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
reject(error);
|
|
707
|
-
});
|
|
708
|
-
})];
|
|
501
|
+
async runWithTimeout(fn, timeoutMs, timeoutMessage, onTimeout) {
|
|
502
|
+
return new Promise((resolve, reject) => {
|
|
503
|
+
let settled = false;
|
|
504
|
+
const timer = setTimeout(() => {
|
|
505
|
+
if (settled)
|
|
506
|
+
return;
|
|
507
|
+
settled = true;
|
|
508
|
+
// Kill orphan child processes before rejecting (#1117)
|
|
509
|
+
if (onTimeout) {
|
|
510
|
+
try {
|
|
511
|
+
onTimeout();
|
|
512
|
+
}
|
|
513
|
+
catch {
|
|
514
|
+
// Ignore cleanup errors
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
reject(new Error(timeoutMessage));
|
|
518
|
+
}, timeoutMs);
|
|
519
|
+
fn()
|
|
520
|
+
.then((result) => {
|
|
521
|
+
if (settled)
|
|
522
|
+
return;
|
|
523
|
+
settled = true;
|
|
524
|
+
clearTimeout(timer);
|
|
525
|
+
resolve(result);
|
|
526
|
+
})
|
|
527
|
+
.catch((error) => {
|
|
528
|
+
if (settled)
|
|
529
|
+
return;
|
|
530
|
+
settled = true;
|
|
531
|
+
clearTimeout(timer);
|
|
532
|
+
reject(error);
|
|
709
533
|
});
|
|
710
534
|
});
|
|
711
|
-
}
|
|
535
|
+
}
|
|
712
536
|
/**
|
|
713
537
|
* Run the actual worker logic
|
|
714
538
|
*/
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
_a.trys.push([1, 3, , 4]);
|
|
725
|
-
this.log('info', "Running " + workerConfig.type + " in headless mode (Claude Code AI)");
|
|
726
|
-
return [4 /*yield*/, this.headlessExecutor.execute(workerConfig.type)];
|
|
727
|
-
case 2:
|
|
728
|
-
result = _a.sent();
|
|
729
|
-
return [2 /*return*/, __assign({ mode: 'headless' }, result)];
|
|
730
|
-
case 3:
|
|
731
|
-
error_3 = _a.sent();
|
|
732
|
-
this.log('warn', "Headless execution failed for " + workerConfig.type + ", falling back to local mode");
|
|
733
|
-
this.emit('headless:fallback', {
|
|
734
|
-
type: workerConfig.type,
|
|
735
|
-
error: error_3 instanceof Error ? error_3.message : String(error_3)
|
|
736
|
-
});
|
|
737
|
-
return [3 /*break*/, 4];
|
|
738
|
-
case 4:
|
|
739
|
-
// Local execution (fallback or for non-headless workers)
|
|
740
|
-
switch (workerConfig.type) {
|
|
741
|
-
case 'map':
|
|
742
|
-
return [2 /*return*/, this.runMapWorker()];
|
|
743
|
-
case 'audit':
|
|
744
|
-
return [2 /*return*/, this.runAuditWorkerLocal()];
|
|
745
|
-
case 'optimize':
|
|
746
|
-
return [2 /*return*/, this.runOptimizeWorkerLocal()];
|
|
747
|
-
case 'consolidate':
|
|
748
|
-
return [2 /*return*/, this.runConsolidateWorker()];
|
|
749
|
-
case 'testgaps':
|
|
750
|
-
return [2 /*return*/, this.runTestGapsWorkerLocal()];
|
|
751
|
-
case 'predict':
|
|
752
|
-
return [2 /*return*/, this.runPredictWorkerLocal()];
|
|
753
|
-
case 'document':
|
|
754
|
-
return [2 /*return*/, this.runDocumentWorkerLocal()];
|
|
755
|
-
case 'ultralearn':
|
|
756
|
-
return [2 /*return*/, this.runUltralearnWorkerLocal()];
|
|
757
|
-
case 'refactor':
|
|
758
|
-
return [2 /*return*/, this.runRefactorWorkerLocal()];
|
|
759
|
-
case 'deepdive':
|
|
760
|
-
return [2 /*return*/, this.runDeepdiveWorkerLocal()];
|
|
761
|
-
case 'benchmark':
|
|
762
|
-
return [2 /*return*/, this.runBenchmarkWorkerLocal()];
|
|
763
|
-
case 'preload':
|
|
764
|
-
return [2 /*return*/, this.runPreloadWorkerLocal()];
|
|
765
|
-
default:
|
|
766
|
-
return [2 /*return*/, { status: 'unknown worker type', mode: 'local' }];
|
|
767
|
-
}
|
|
768
|
-
return [2 /*return*/];
|
|
769
|
-
}
|
|
770
|
-
});
|
|
771
|
-
});
|
|
772
|
-
};
|
|
773
|
-
// Worker implementations
|
|
774
|
-
WorkerDaemon.prototype.runMapWorker = function () {
|
|
775
|
-
return __awaiter(this, void 0, Promise, function () {
|
|
776
|
-
var metricsFile, metricsDir, map;
|
|
777
|
-
return __generator(this, function (_a) {
|
|
778
|
-
metricsFile = join(this.projectRoot, '.claude-flow', 'metrics', 'codebase-map.json');
|
|
779
|
-
metricsDir = join(this.projectRoot, '.claude-flow', 'metrics');
|
|
780
|
-
if (!existsSync(metricsDir)) {
|
|
781
|
-
mkdirSync(metricsDir, { recursive: true });
|
|
782
|
-
}
|
|
783
|
-
map = {
|
|
784
|
-
timestamp: new Date().toISOString(),
|
|
785
|
-
projectRoot: this.projectRoot,
|
|
786
|
-
structure: {
|
|
787
|
-
hasPackageJson: existsSync(join(this.projectRoot, 'package.json')),
|
|
788
|
-
hasTsConfig: existsSync(join(this.projectRoot, 'tsconfig.json')),
|
|
789
|
-
hasClaudeConfig: existsSync(join(this.projectRoot, '.claude')),
|
|
790
|
-
hasClaudeFlow: existsSync(join(this.projectRoot, '.claude-flow'))
|
|
791
|
-
},
|
|
792
|
-
scannedAt: Date.now()
|
|
539
|
+
async runWorkerLogic(workerConfig) {
|
|
540
|
+
// Check if this is a headless worker type and headless execution is available
|
|
541
|
+
if (isHeadlessWorker(workerConfig.type) && this.headlessAvailable && this.headlessExecutor) {
|
|
542
|
+
try {
|
|
543
|
+
this.log('info', `Running ${workerConfig.type} in headless mode (Claude Code AI)`);
|
|
544
|
+
const result = await this.headlessExecutor.execute(workerConfig.type);
|
|
545
|
+
return {
|
|
546
|
+
mode: 'headless',
|
|
547
|
+
...result,
|
|
793
548
|
};
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
549
|
+
}
|
|
550
|
+
catch (error) {
|
|
551
|
+
this.log('warn', `Headless execution failed for ${workerConfig.type}, falling back to local mode`);
|
|
552
|
+
this.emit('headless:fallback', {
|
|
553
|
+
type: workerConfig.type,
|
|
554
|
+
error: error instanceof Error ? error.message : String(error),
|
|
555
|
+
});
|
|
556
|
+
// Fall through to local execution
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
// Local execution (fallback or for non-headless workers)
|
|
560
|
+
switch (workerConfig.type) {
|
|
561
|
+
case 'map':
|
|
562
|
+
return this.runMapWorker();
|
|
563
|
+
case 'audit':
|
|
564
|
+
return this.runAuditWorkerLocal();
|
|
565
|
+
case 'optimize':
|
|
566
|
+
return this.runOptimizeWorkerLocal();
|
|
567
|
+
case 'consolidate':
|
|
568
|
+
return this.runConsolidateWorker();
|
|
569
|
+
case 'testgaps':
|
|
570
|
+
return this.runTestGapsWorkerLocal();
|
|
571
|
+
case 'predict':
|
|
572
|
+
return this.runPredictWorkerLocal();
|
|
573
|
+
case 'document':
|
|
574
|
+
return this.runDocumentWorkerLocal();
|
|
575
|
+
case 'ultralearn':
|
|
576
|
+
return this.runUltralearnWorkerLocal();
|
|
577
|
+
case 'refactor':
|
|
578
|
+
return this.runRefactorWorkerLocal();
|
|
579
|
+
case 'deepdive':
|
|
580
|
+
return this.runDeepdiveWorkerLocal();
|
|
581
|
+
case 'benchmark':
|
|
582
|
+
return this.runBenchmarkWorkerLocal();
|
|
583
|
+
case 'preload':
|
|
584
|
+
return this.runPreloadWorkerLocal();
|
|
585
|
+
default:
|
|
586
|
+
return { status: 'unknown worker type', mode: 'local' };
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
// Worker implementations
|
|
590
|
+
async runMapWorker() {
|
|
591
|
+
// Scan project structure and update metrics
|
|
592
|
+
const metricsFile = join(this.projectRoot, '.claude-flow', 'metrics', 'codebase-map.json');
|
|
593
|
+
const metricsDir = join(this.projectRoot, '.claude-flow', 'metrics');
|
|
594
|
+
if (!existsSync(metricsDir)) {
|
|
595
|
+
mkdirSync(metricsDir, { recursive: true });
|
|
596
|
+
}
|
|
597
|
+
const map = {
|
|
598
|
+
timestamp: new Date().toISOString(),
|
|
599
|
+
projectRoot: this.projectRoot,
|
|
600
|
+
structure: {
|
|
601
|
+
hasPackageJson: existsSync(join(this.projectRoot, 'package.json')),
|
|
602
|
+
hasTsConfig: existsSync(join(this.projectRoot, 'tsconfig.json')),
|
|
603
|
+
hasClaudeConfig: existsSync(join(this.projectRoot, '.claude')),
|
|
604
|
+
hasClaudeFlow: existsSync(join(this.projectRoot, '.claude-flow')),
|
|
605
|
+
},
|
|
606
|
+
scannedAt: Date.now(),
|
|
607
|
+
};
|
|
608
|
+
writeFileSync(metricsFile, JSON.stringify(map, null, 2));
|
|
609
|
+
return map;
|
|
610
|
+
}
|
|
799
611
|
/**
|
|
800
612
|
* Local audit worker (fallback when headless unavailable)
|
|
801
613
|
*/
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
return [2 /*return*/, audit];
|
|
825
|
-
});
|
|
826
|
-
});
|
|
827
|
-
};
|
|
614
|
+
async runAuditWorkerLocal() {
|
|
615
|
+
// Basic security checks
|
|
616
|
+
const auditFile = join(this.projectRoot, '.claude-flow', 'metrics', 'security-audit.json');
|
|
617
|
+
const metricsDir = join(this.projectRoot, '.claude-flow', 'metrics');
|
|
618
|
+
if (!existsSync(metricsDir)) {
|
|
619
|
+
mkdirSync(metricsDir, { recursive: true });
|
|
620
|
+
}
|
|
621
|
+
const audit = {
|
|
622
|
+
timestamp: new Date().toISOString(),
|
|
623
|
+
mode: 'local',
|
|
624
|
+
checks: {
|
|
625
|
+
envFilesProtected: !existsSync(join(this.projectRoot, '.env.local')),
|
|
626
|
+
gitIgnoreExists: existsSync(join(this.projectRoot, '.gitignore')),
|
|
627
|
+
noHardcodedSecrets: true, // Would need actual scanning
|
|
628
|
+
},
|
|
629
|
+
riskLevel: 'low',
|
|
630
|
+
recommendations: [],
|
|
631
|
+
note: 'Install Claude Code CLI for AI-powered security analysis',
|
|
632
|
+
};
|
|
633
|
+
writeFileSync(auditFile, JSON.stringify(audit, null, 2));
|
|
634
|
+
return audit;
|
|
635
|
+
}
|
|
828
636
|
/**
|
|
829
637
|
* Local optimize worker (fallback when headless unavailable)
|
|
830
638
|
*/
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
memoryCleaned: 0,
|
|
869
|
-
duplicatesRemoved: 0
|
|
870
|
-
};
|
|
871
|
-
writeFileSync(consolidateFile, JSON.stringify(result, null, 2));
|
|
872
|
-
return [2 /*return*/, result];
|
|
873
|
-
});
|
|
874
|
-
});
|
|
875
|
-
};
|
|
639
|
+
async runOptimizeWorkerLocal() {
|
|
640
|
+
// Update performance metrics
|
|
641
|
+
const optimizeFile = join(this.projectRoot, '.claude-flow', 'metrics', 'performance.json');
|
|
642
|
+
const metricsDir = join(this.projectRoot, '.claude-flow', 'metrics');
|
|
643
|
+
if (!existsSync(metricsDir)) {
|
|
644
|
+
mkdirSync(metricsDir, { recursive: true });
|
|
645
|
+
}
|
|
646
|
+
const perf = {
|
|
647
|
+
timestamp: new Date().toISOString(),
|
|
648
|
+
mode: 'local',
|
|
649
|
+
memoryUsage: process.memoryUsage(),
|
|
650
|
+
uptime: process.uptime(),
|
|
651
|
+
optimizations: {
|
|
652
|
+
cacheHitRate: 0.78,
|
|
653
|
+
avgResponseTime: 45,
|
|
654
|
+
},
|
|
655
|
+
note: 'Install Claude Code CLI for AI-powered optimization suggestions',
|
|
656
|
+
};
|
|
657
|
+
writeFileSync(optimizeFile, JSON.stringify(perf, null, 2));
|
|
658
|
+
return perf;
|
|
659
|
+
}
|
|
660
|
+
async runConsolidateWorker() {
|
|
661
|
+
// Memory consolidation - clean up old patterns
|
|
662
|
+
const consolidateFile = join(this.projectRoot, '.claude-flow', 'metrics', 'consolidation.json');
|
|
663
|
+
const metricsDir = join(this.projectRoot, '.claude-flow', 'metrics');
|
|
664
|
+
if (!existsSync(metricsDir)) {
|
|
665
|
+
mkdirSync(metricsDir, { recursive: true });
|
|
666
|
+
}
|
|
667
|
+
const result = {
|
|
668
|
+
timestamp: new Date().toISOString(),
|
|
669
|
+
patternsConsolidated: 0,
|
|
670
|
+
memoryCleaned: 0,
|
|
671
|
+
duplicatesRemoved: 0,
|
|
672
|
+
};
|
|
673
|
+
writeFileSync(consolidateFile, JSON.stringify(result, null, 2));
|
|
674
|
+
return result;
|
|
675
|
+
}
|
|
876
676
|
/**
|
|
877
677
|
* Local testgaps worker (fallback when headless unavailable)
|
|
878
678
|
*/
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
return [2 /*return*/, result];
|
|
898
|
-
});
|
|
899
|
-
});
|
|
900
|
-
};
|
|
679
|
+
async runTestGapsWorkerLocal() {
|
|
680
|
+
// Check for test coverage gaps
|
|
681
|
+
const testGapsFile = join(this.projectRoot, '.claude-flow', 'metrics', 'test-gaps.json');
|
|
682
|
+
const metricsDir = join(this.projectRoot, '.claude-flow', 'metrics');
|
|
683
|
+
if (!existsSync(metricsDir)) {
|
|
684
|
+
mkdirSync(metricsDir, { recursive: true });
|
|
685
|
+
}
|
|
686
|
+
const result = {
|
|
687
|
+
timestamp: new Date().toISOString(),
|
|
688
|
+
mode: 'local',
|
|
689
|
+
hasTestDir: existsSync(join(this.projectRoot, 'tests')) || existsSync(join(this.projectRoot, '__tests__')),
|
|
690
|
+
estimatedCoverage: 'unknown',
|
|
691
|
+
gaps: [],
|
|
692
|
+
note: 'Install Claude Code CLI for AI-powered test gap analysis',
|
|
693
|
+
};
|
|
694
|
+
writeFileSync(testGapsFile, JSON.stringify(result, null, 2));
|
|
695
|
+
return result;
|
|
696
|
+
}
|
|
901
697
|
/**
|
|
902
698
|
* Local predict worker (fallback when headless unavailable)
|
|
903
699
|
*/
|
|
904
|
-
|
|
905
|
-
return
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
}];
|
|
914
|
-
});
|
|
915
|
-
});
|
|
916
|
-
};
|
|
700
|
+
async runPredictWorkerLocal() {
|
|
701
|
+
return {
|
|
702
|
+
timestamp: new Date().toISOString(),
|
|
703
|
+
mode: 'local',
|
|
704
|
+
predictions: [],
|
|
705
|
+
preloaded: [],
|
|
706
|
+
note: 'Install Claude Code CLI for AI-powered predictions',
|
|
707
|
+
};
|
|
708
|
+
}
|
|
917
709
|
/**
|
|
918
710
|
* Local document worker (fallback when headless unavailable)
|
|
919
711
|
*/
|
|
920
|
-
|
|
921
|
-
return
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
}];
|
|
930
|
-
});
|
|
931
|
-
});
|
|
932
|
-
};
|
|
712
|
+
async runDocumentWorkerLocal() {
|
|
713
|
+
return {
|
|
714
|
+
timestamp: new Date().toISOString(),
|
|
715
|
+
mode: 'local',
|
|
716
|
+
filesDocumented: 0,
|
|
717
|
+
suggestedDocs: [],
|
|
718
|
+
note: 'Install Claude Code CLI for AI-powered documentation generation',
|
|
719
|
+
};
|
|
720
|
+
}
|
|
933
721
|
/**
|
|
934
722
|
* Local ultralearn worker (fallback when headless unavailable)
|
|
935
723
|
*/
|
|
936
|
-
|
|
937
|
-
return
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
}];
|
|
946
|
-
});
|
|
947
|
-
});
|
|
948
|
-
};
|
|
724
|
+
async runUltralearnWorkerLocal() {
|
|
725
|
+
return {
|
|
726
|
+
timestamp: new Date().toISOString(),
|
|
727
|
+
mode: 'local',
|
|
728
|
+
patternsLearned: 0,
|
|
729
|
+
insightsGained: [],
|
|
730
|
+
note: 'Install Claude Code CLI for AI-powered deep learning',
|
|
731
|
+
};
|
|
732
|
+
}
|
|
949
733
|
/**
|
|
950
734
|
* Local refactor worker (fallback when headless unavailable)
|
|
951
735
|
*/
|
|
952
|
-
|
|
953
|
-
return
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
}];
|
|
962
|
-
});
|
|
963
|
-
});
|
|
964
|
-
};
|
|
736
|
+
async runRefactorWorkerLocal() {
|
|
737
|
+
return {
|
|
738
|
+
timestamp: new Date().toISOString(),
|
|
739
|
+
mode: 'local',
|
|
740
|
+
suggestions: [],
|
|
741
|
+
duplicatesFound: 0,
|
|
742
|
+
note: 'Install Claude Code CLI for AI-powered refactoring suggestions',
|
|
743
|
+
};
|
|
744
|
+
}
|
|
965
745
|
/**
|
|
966
746
|
* Local deepdive worker (fallback when headless unavailable)
|
|
967
747
|
*/
|
|
968
|
-
|
|
969
|
-
return
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
}];
|
|
978
|
-
});
|
|
979
|
-
});
|
|
980
|
-
};
|
|
748
|
+
async runDeepdiveWorkerLocal() {
|
|
749
|
+
return {
|
|
750
|
+
timestamp: new Date().toISOString(),
|
|
751
|
+
mode: 'local',
|
|
752
|
+
analysisDepth: 'shallow',
|
|
753
|
+
findings: [],
|
|
754
|
+
note: 'Install Claude Code CLI for AI-powered deep code analysis',
|
|
755
|
+
};
|
|
756
|
+
}
|
|
981
757
|
/**
|
|
982
758
|
* Local benchmark worker
|
|
983
759
|
*/
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
writeFileSync(benchmarkFile, JSON.stringify(result, null, 2));
|
|
1003
|
-
return [2 /*return*/, result];
|
|
1004
|
-
});
|
|
1005
|
-
});
|
|
1006
|
-
};
|
|
760
|
+
async runBenchmarkWorkerLocal() {
|
|
761
|
+
const benchmarkFile = join(this.projectRoot, '.claude-flow', 'metrics', 'benchmark.json');
|
|
762
|
+
const metricsDir = join(this.projectRoot, '.claude-flow', 'metrics');
|
|
763
|
+
if (!existsSync(metricsDir)) {
|
|
764
|
+
mkdirSync(metricsDir, { recursive: true });
|
|
765
|
+
}
|
|
766
|
+
const result = {
|
|
767
|
+
timestamp: new Date().toISOString(),
|
|
768
|
+
mode: 'local',
|
|
769
|
+
benchmarks: {
|
|
770
|
+
memoryUsage: process.memoryUsage(),
|
|
771
|
+
cpuUsage: process.cpuUsage(),
|
|
772
|
+
uptime: process.uptime(),
|
|
773
|
+
},
|
|
774
|
+
};
|
|
775
|
+
writeFileSync(benchmarkFile, JSON.stringify(result, null, 2));
|
|
776
|
+
return result;
|
|
777
|
+
}
|
|
1007
778
|
/**
|
|
1008
779
|
* Local preload worker
|
|
1009
780
|
*/
|
|
1010
|
-
|
|
1011
|
-
return
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
}];
|
|
1019
|
-
});
|
|
1020
|
-
});
|
|
1021
|
-
};
|
|
781
|
+
async runPreloadWorkerLocal() {
|
|
782
|
+
return {
|
|
783
|
+
timestamp: new Date().toISOString(),
|
|
784
|
+
mode: 'local',
|
|
785
|
+
resourcesPreloaded: 0,
|
|
786
|
+
cacheStatus: 'active',
|
|
787
|
+
};
|
|
788
|
+
}
|
|
1022
789
|
/**
|
|
1023
790
|
* Manually trigger a worker
|
|
1024
791
|
*/
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
}
|
|
1033
|
-
return [2 /*return*/, this.executeWorker(workerConfig)];
|
|
1034
|
-
});
|
|
1035
|
-
});
|
|
1036
|
-
};
|
|
792
|
+
async triggerWorker(type) {
|
|
793
|
+
const workerConfig = this.config.workers.find(w => w.type === type);
|
|
794
|
+
if (!workerConfig) {
|
|
795
|
+
throw new Error(`Unknown worker type: ${type}`);
|
|
796
|
+
}
|
|
797
|
+
return this.executeWorker(workerConfig);
|
|
798
|
+
}
|
|
1037
799
|
/**
|
|
1038
800
|
* Enable/disable a worker
|
|
1039
801
|
*/
|
|
1040
|
-
|
|
1041
|
-
|
|
802
|
+
setWorkerEnabled(type, enabled) {
|
|
803
|
+
const workerConfig = this.config.workers.find(w => w.type === type);
|
|
1042
804
|
if (workerConfig) {
|
|
1043
805
|
workerConfig.enabled = enabled;
|
|
1044
806
|
if (enabled && this.running) {
|
|
1045
807
|
this.scheduleWorker(workerConfig);
|
|
1046
808
|
}
|
|
1047
809
|
else if (!enabled) {
|
|
1048
|
-
|
|
810
|
+
const timer = this.timers.get(type);
|
|
1049
811
|
if (timer) {
|
|
1050
812
|
clearTimeout(timer);
|
|
1051
|
-
this.timers
|
|
813
|
+
this.timers.delete(type);
|
|
1052
814
|
}
|
|
1053
815
|
}
|
|
1054
816
|
this.saveState();
|
|
1055
817
|
}
|
|
1056
|
-
}
|
|
818
|
+
}
|
|
1057
819
|
/**
|
|
1058
820
|
* Save daemon state to file
|
|
1059
821
|
*/
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
var state = {
|
|
822
|
+
saveState() {
|
|
823
|
+
const state = {
|
|
1063
824
|
running: this.running,
|
|
1064
|
-
startedAt:
|
|
1065
|
-
workers: Object.fromEntries(Array.from(this.workers.entries()).map(
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
config:
|
|
1074
|
-
|
|
825
|
+
startedAt: this.startedAt?.toISOString(),
|
|
826
|
+
workers: Object.fromEntries(Array.from(this.workers.entries()).map(([type, state]) => [
|
|
827
|
+
type,
|
|
828
|
+
{
|
|
829
|
+
...state,
|
|
830
|
+
lastRun: state.lastRun?.toISOString(),
|
|
831
|
+
nextRun: state.nextRun?.toISOString(),
|
|
832
|
+
}
|
|
833
|
+
])),
|
|
834
|
+
config: {
|
|
835
|
+
...this.config,
|
|
836
|
+
workers: this.config.workers.map(w => ({ ...w })),
|
|
837
|
+
},
|
|
838
|
+
savedAt: new Date().toISOString(),
|
|
1075
839
|
};
|
|
1076
840
|
try {
|
|
1077
841
|
writeFileSync(this.config.stateFile, JSON.stringify(state, null, 2));
|
|
1078
842
|
}
|
|
1079
843
|
catch (error) {
|
|
1080
|
-
this.log('error',
|
|
844
|
+
this.log('error', `Failed to save state: ${error}`);
|
|
1081
845
|
}
|
|
1082
|
-
}
|
|
846
|
+
}
|
|
1083
847
|
/**
|
|
1084
848
|
* Log message
|
|
1085
849
|
*/
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
this.emit('log', { level
|
|
850
|
+
log(level, message) {
|
|
851
|
+
const timestamp = new Date().toISOString();
|
|
852
|
+
const logMessage = `[${timestamp}] [${level.toUpperCase()}] ${message}`;
|
|
853
|
+
this.emit('log', { level, message, timestamp });
|
|
1090
854
|
// Also write to log file
|
|
1091
855
|
try {
|
|
1092
|
-
|
|
856
|
+
const logFile = join(this.config.logDir, 'daemon.log');
|
|
1093
857
|
appendFileSync(logFile, logMessage + '\n');
|
|
1094
858
|
}
|
|
1095
|
-
catch
|
|
859
|
+
catch {
|
|
1096
860
|
// Ignore log write errors
|
|
1097
861
|
}
|
|
1098
|
-
}
|
|
1099
|
-
|
|
1100
|
-
}(EventEmitter));
|
|
1101
|
-
export { WorkerDaemon };
|
|
862
|
+
}
|
|
863
|
+
}
|
|
1102
864
|
// Singleton instance for global access
|
|
1103
|
-
|
|
865
|
+
let daemonInstance = null;
|
|
1104
866
|
/**
|
|
1105
867
|
* Get or create daemon instance
|
|
1106
868
|
*/
|
|
@@ -1116,38 +878,18 @@ export function getDaemon(projectRoot, config) {
|
|
|
1116
878
|
/**
|
|
1117
879
|
* Start daemon (for use in session-start hook)
|
|
1118
880
|
*/
|
|
1119
|
-
export function startDaemon(projectRoot, config) {
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
switch (_a.label) {
|
|
1124
|
-
case 0:
|
|
1125
|
-
daemon = getDaemon(projectRoot, config);
|
|
1126
|
-
return [4 /*yield*/, daemon.start()];
|
|
1127
|
-
case 1:
|
|
1128
|
-
_a.sent();
|
|
1129
|
-
return [2 /*return*/, daemon];
|
|
1130
|
-
}
|
|
1131
|
-
});
|
|
1132
|
-
});
|
|
881
|
+
export async function startDaemon(projectRoot, config) {
|
|
882
|
+
const daemon = getDaemon(projectRoot, config);
|
|
883
|
+
await daemon.start();
|
|
884
|
+
return daemon;
|
|
1133
885
|
}
|
|
1134
886
|
/**
|
|
1135
887
|
* Stop daemon
|
|
1136
888
|
*/
|
|
1137
|
-
export function stopDaemon() {
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
case 0:
|
|
1142
|
-
if (!daemonInstance) return [3 /*break*/, 2];
|
|
1143
|
-
return [4 /*yield*/, daemonInstance.stop()];
|
|
1144
|
-
case 1:
|
|
1145
|
-
_a.sent();
|
|
1146
|
-
_a.label = 2;
|
|
1147
|
-
case 2: return [2 /*return*/];
|
|
1148
|
-
}
|
|
1149
|
-
});
|
|
1150
|
-
});
|
|
889
|
+
export async function stopDaemon() {
|
|
890
|
+
if (daemonInstance) {
|
|
891
|
+
await daemonInstance.stop();
|
|
892
|
+
}
|
|
1151
893
|
}
|
|
1152
894
|
export default WorkerDaemon;
|
|
1153
895
|
//# sourceMappingURL=worker-daemon.js.map
|