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