@claude-flow/cli 3.28.0 → 3.30.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/analysis/analyze-code-quality.md +178 -178
- package/.claude/agents/analysis/code-analyzer.md +209 -209
- package/.claude/agents/analysis/code-review/analyze-code-quality.md +178 -178
- package/.claude/agents/architecture/arch-system-design.md +156 -156
- package/.claude/agents/architecture/system-design/arch-system-design.md +154 -154
- package/.claude/agents/browser/browser-agent.yaml +182 -182
- package/.claude/agents/consensus/byzantine-coordinator.md +62 -62
- package/.claude/agents/consensus/crdt-synchronizer.md +996 -996
- package/.claude/agents/consensus/gossip-coordinator.md +62 -62
- package/.claude/agents/consensus/performance-benchmarker.md +850 -850
- package/.claude/agents/consensus/quorum-manager.md +822 -822
- package/.claude/agents/consensus/raft-manager.md +62 -62
- package/.claude/agents/consensus/security-manager.md +621 -621
- package/.claude/agents/core/planner.md +374 -374
- package/.claude/agents/custom/test-long-runner.md +44 -44
- package/.claude/agents/data/data-ml-model.md +444 -444
- package/.claude/agents/data/ml/data-ml-model.md +192 -192
- package/.claude/agents/development/backend/dev-backend-api.md +141 -141
- package/.claude/agents/development/dev-backend-api.md +344 -344
- package/.claude/agents/devops/ci-cd/ops-cicd-github.md +163 -163
- package/.claude/agents/devops/ops-cicd-github.md +164 -164
- package/.claude/agents/documentation/api-docs/docs-api-openapi.md +173 -173
- package/.claude/agents/documentation/docs-api-openapi.md +354 -354
- package/.claude/agents/flow-nexus/app-store.md +87 -87
- package/.claude/agents/flow-nexus/authentication.md +68 -68
- package/.claude/agents/flow-nexus/challenges.md +80 -80
- package/.claude/agents/flow-nexus/neural-network.md +87 -87
- package/.claude/agents/flow-nexus/payments.md +82 -82
- package/.claude/agents/flow-nexus/sandbox.md +75 -75
- package/.claude/agents/flow-nexus/swarm.md +75 -75
- package/.claude/agents/flow-nexus/user-tools.md +95 -95
- package/.claude/agents/flow-nexus/workflow.md +83 -83
- package/.claude/agents/github/code-review-swarm.md +377 -377
- package/.claude/agents/github/github-modes.md +172 -172
- package/.claude/agents/github/issue-tracker.md +575 -575
- package/.claude/agents/github/multi-repo-swarm.md +552 -552
- package/.claude/agents/github/pr-manager.md +437 -437
- package/.claude/agents/github/project-board-sync.md +508 -508
- package/.claude/agents/github/release-manager.md +604 -604
- package/.claude/agents/github/release-swarm.md +582 -582
- package/.claude/agents/github/repo-architect.md +397 -397
- package/.claude/agents/github/swarm-issue.md +572 -572
- package/.claude/agents/github/swarm-pr.md +427 -427
- package/.claude/agents/github/sync-coordinator.md +451 -451
- package/.claude/agents/github/workflow-automation.md +902 -902
- package/.claude/agents/goal/agent.md +815 -815
- package/.claude/agents/optimization/benchmark-suite.md +664 -664
- package/.claude/agents/optimization/load-balancer.md +430 -430
- package/.claude/agents/optimization/performance-monitor.md +671 -671
- package/.claude/agents/optimization/resource-allocator.md +673 -673
- package/.claude/agents/optimization/topology-optimizer.md +807 -807
- package/.claude/agents/payments/agentic-payments.md +126 -126
- package/.claude/agents/sona/sona-learning-optimizer.md +74 -74
- package/.claude/agents/sparc/architecture.md +698 -698
- package/.claude/agents/sparc/pseudocode.md +519 -519
- package/.claude/agents/sparc/refinement.md +801 -801
- package/.claude/agents/sparc/specification.md +477 -477
- package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +224 -224
- package/.claude/agents/specialized/spec-mobile-react-native.md +226 -226
- package/.claude/agents/sublinear/consensus-coordinator.md +337 -337
- package/.claude/agents/sublinear/matrix-optimizer.md +184 -184
- package/.claude/agents/sublinear/pagerank-analyzer.md +298 -298
- package/.claude/agents/sublinear/performance-optimizer.md +367 -367
- package/.claude/agents/sublinear/trading-predictor.md +245 -245
- package/.claude/agents/swarm/adaptive-coordinator.md +1126 -1126
- package/.claude/agents/swarm/hierarchical-coordinator.md +709 -709
- package/.claude/agents/swarm/mesh-coordinator.md +962 -962
- package/.claude/agents/templates/automation-smart-agent.md +204 -204
- package/.claude/agents/templates/base-template-generator.md +289 -289
- package/.claude/agents/templates/coordinator-swarm-init.md +89 -89
- package/.claude/agents/templates/github-pr-manager.md +176 -176
- package/.claude/agents/templates/implementer-sparc-coder.md +258 -258
- package/.claude/agents/templates/memory-coordinator.md +186 -186
- package/.claude/agents/templates/orchestrator-task.md +138 -138
- package/.claude/agents/templates/performance-analyzer.md +198 -198
- package/.claude/agents/templates/sparc-coordinator.md +513 -513
- package/.claude/agents/testing/production-validator.md +394 -394
- package/.claude/agents/testing/tdd-london-swarm.md +243 -243
- package/.claude/agents/v3/aidefence-guardian.md +282 -282
- package/.claude/agents/v3/claims-authorizer.md +208 -208
- package/.claude/agents/v3/collective-intelligence-coordinator.md +993 -993
- package/.claude/agents/v3/ddd-domain-expert.md +220 -220
- package/.claude/agents/v3/injection-analyst.md +236 -236
- package/.claude/agents/v3/performance-engineer.md +1233 -1233
- package/.claude/agents/v3/pii-detector.md +151 -151
- package/.claude/agents/v3/reasoningbank-learner.md +213 -213
- package/.claude/agents/v3/security-architect-aidefence.md +410 -410
- package/.claude/agents/v3/security-architect.md +867 -867
- package/.claude/agents/v3/swarm-memory-manager.md +157 -157
- package/.claude/agents/v3/v3-integration-architect.md +205 -205
- package/.claude/commands/agents/README.md +50 -50
- package/.claude/commands/agents/agent-capabilities.md +140 -140
- package/.claude/commands/agents/agent-coordination.md +28 -28
- package/.claude/commands/agents/agent-spawning.md +28 -28
- package/.claude/commands/agents/agent-types.md +216 -216
- package/.claude/commands/agents/health.md +139 -139
- package/.claude/commands/agents/list.md +100 -100
- package/.claude/commands/agents/logs.md +130 -130
- package/.claude/commands/agents/metrics.md +122 -122
- package/.claude/commands/agents/pool.md +127 -127
- package/.claude/commands/agents/spawn.md +140 -140
- package/.claude/commands/agents/status.md +115 -115
- package/.claude/commands/agents/stop.md +102 -102
- package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +53 -53
- package/.claude/commands/analysis/README.md +9 -9
- package/.claude/commands/analysis/bottleneck-detect.md +162 -162
- package/.claude/commands/analysis/performance-bottlenecks.md +58 -58
- package/.claude/commands/analysis/performance-report.md +25 -25
- package/.claude/commands/analysis/token-efficiency.md +44 -44
- package/.claude/commands/analysis/token-usage.md +25 -25
- package/.claude/commands/automation/README.md +9 -9
- package/.claude/commands/automation/auto-agent.md +122 -122
- package/.claude/commands/automation/self-healing.md +105 -105
- package/.claude/commands/automation/session-memory.md +89 -89
- package/.claude/commands/automation/smart-agents.md +72 -72
- package/.claude/commands/automation/smart-spawn.md +25 -25
- package/.claude/commands/automation/workflow-select.md +25 -25
- package/.claude/commands/claude-flow-help.md +103 -103
- package/.claude/commands/claude-flow-memory.md +107 -107
- package/.claude/commands/claude-flow-swarm.md +205 -205
- package/.claude/commands/coordination/README.md +9 -9
- package/.claude/commands/coordination/agent-spawn.md +25 -25
- package/.claude/commands/coordination/init.md +44 -44
- package/.claude/commands/coordination/orchestrate.md +43 -43
- package/.claude/commands/coordination/spawn.md +45 -45
- package/.claude/commands/coordination/swarm-init.md +85 -85
- package/.claude/commands/coordination/task-orchestrate.md +25 -25
- package/.claude/commands/github/README.md +11 -11
- package/.claude/commands/github/code-review-swarm.md +513 -513
- package/.claude/commands/github/code-review.md +25 -25
- package/.claude/commands/github/github-modes.md +146 -146
- package/.claude/commands/github/github-swarm.md +121 -121
- package/.claude/commands/github/issue-tracker.md +291 -291
- package/.claude/commands/github/issue-triage.md +25 -25
- package/.claude/commands/github/multi-repo-swarm.md +518 -518
- package/.claude/commands/github/pr-enhance.md +26 -26
- package/.claude/commands/github/pr-manager.md +169 -169
- package/.claude/commands/github/project-board-sync.md +470 -470
- package/.claude/commands/github/release-manager.md +339 -339
- package/.claude/commands/github/release-swarm.md +543 -543
- package/.claude/commands/github/repo-analyze.md +25 -25
- package/.claude/commands/github/repo-architect.md +366 -366
- package/.claude/commands/github/swarm-issue.md +484 -484
- package/.claude/commands/github/swarm-pr.md +287 -287
- package/.claude/commands/github/sync-coordinator.md +302 -302
- package/.claude/commands/github/workflow-automation.md +441 -441
- package/.claude/commands/hive-mind/README.md +17 -17
- package/.claude/commands/hive-mind/hive-mind-consensus.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-init.md +18 -18
- package/.claude/commands/hive-mind/hive-mind-memory.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-metrics.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-resume.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-sessions.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-spawn.md +21 -21
- package/.claude/commands/hive-mind/hive-mind-status.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-stop.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-wizard.md +8 -8
- package/.claude/commands/hive-mind/hive-mind.md +27 -27
- package/.claude/commands/hooks/README.md +11 -11
- package/.claude/commands/hooks/overview.md +57 -57
- package/.claude/commands/hooks/post-edit.md +117 -117
- package/.claude/commands/hooks/post-task.md +112 -112
- package/.claude/commands/hooks/pre-edit.md +113 -113
- package/.claude/commands/hooks/pre-task.md +111 -111
- package/.claude/commands/hooks/session-end.md +118 -118
- package/.claude/commands/hooks/setup.md +102 -102
- package/.claude/commands/memory/README.md +9 -9
- package/.claude/commands/memory/memory-persist.md +25 -25
- package/.claude/commands/memory/memory-search.md +25 -25
- package/.claude/commands/memory/memory-usage.md +25 -25
- package/.claude/commands/memory/neural.md +47 -47
- package/.claude/commands/monitoring/README.md +9 -9
- package/.claude/commands/monitoring/agent-metrics.md +25 -25
- package/.claude/commands/monitoring/agents.md +44 -44
- package/.claude/commands/monitoring/real-time-view.md +25 -25
- package/.claude/commands/monitoring/status.md +46 -46
- package/.claude/commands/monitoring/swarm-monitor.md +25 -25
- package/.claude/commands/optimization/README.md +9 -9
- package/.claude/commands/optimization/auto-topology.md +61 -61
- package/.claude/commands/optimization/cache-manage.md +25 -25
- package/.claude/commands/optimization/parallel-execute.md +25 -25
- package/.claude/commands/optimization/parallel-execution.md +49 -49
- package/.claude/commands/optimization/topology-optimize.md +25 -25
- package/.claude/commands/pair/README.md +260 -260
- package/.claude/commands/pair/commands.md +545 -545
- package/.claude/commands/pair/config.md +509 -509
- package/.claude/commands/pair/examples.md +511 -511
- package/.claude/commands/pair/modes.md +347 -347
- package/.claude/commands/pair/session.md +406 -406
- package/.claude/commands/pair/start.md +208 -208
- package/.claude/commands/sparc/analyzer.md +51 -51
- package/.claude/commands/sparc/architect.md +53 -53
- package/.claude/commands/sparc/ask.md +97 -97
- package/.claude/commands/sparc/batch-executor.md +54 -54
- package/.claude/commands/sparc/code.md +89 -89
- package/.claude/commands/sparc/coder.md +54 -54
- package/.claude/commands/sparc/debug.md +83 -83
- package/.claude/commands/sparc/debugger.md +54 -54
- package/.claude/commands/sparc/designer.md +53 -53
- package/.claude/commands/sparc/devops.md +109 -109
- package/.claude/commands/sparc/docs-writer.md +80 -80
- package/.claude/commands/sparc/documenter.md +54 -54
- package/.claude/commands/sparc/innovator.md +54 -54
- package/.claude/commands/sparc/integration.md +83 -83
- package/.claude/commands/sparc/mcp.md +117 -117
- package/.claude/commands/sparc/memory-manager.md +54 -54
- package/.claude/commands/sparc/optimizer.md +54 -54
- package/.claude/commands/sparc/orchestrator.md +131 -131
- package/.claude/commands/sparc/post-deployment-monitoring-mode.md +83 -83
- package/.claude/commands/sparc/refinement-optimization-mode.md +83 -83
- package/.claude/commands/sparc/researcher.md +54 -54
- package/.claude/commands/sparc/reviewer.md +54 -54
- package/.claude/commands/sparc/security-review.md +80 -80
- package/.claude/commands/sparc/sparc-modes.md +174 -174
- package/.claude/commands/sparc/sparc.md +111 -111
- package/.claude/commands/sparc/spec-pseudocode.md +80 -80
- package/.claude/commands/sparc/supabase-admin.md +348 -348
- package/.claude/commands/sparc/swarm-coordinator.md +54 -54
- package/.claude/commands/sparc/tdd.md +54 -54
- package/.claude/commands/sparc/tester.md +54 -54
- package/.claude/commands/sparc/tutorial.md +79 -79
- package/.claude/commands/sparc/workflow-manager.md +54 -54
- package/.claude/commands/sparc.md +166 -166
- package/.claude/commands/stream-chain/pipeline.md +120 -120
- package/.claude/commands/stream-chain/run.md +69 -69
- package/.claude/commands/swarm/README.md +15 -15
- package/.claude/commands/swarm/analysis.md +95 -95
- package/.claude/commands/swarm/development.md +96 -96
- package/.claude/commands/swarm/examples.md +168 -168
- package/.claude/commands/swarm/maintenance.md +102 -102
- package/.claude/commands/swarm/optimization.md +117 -117
- package/.claude/commands/swarm/research.md +136 -136
- package/.claude/commands/swarm/swarm-analysis.md +8 -8
- package/.claude/commands/swarm/swarm-background.md +8 -8
- package/.claude/commands/swarm/swarm-init.md +19 -19
- package/.claude/commands/swarm/swarm-modes.md +8 -8
- package/.claude/commands/swarm/swarm-monitor.md +8 -8
- package/.claude/commands/swarm/swarm-spawn.md +19 -19
- package/.claude/commands/swarm/swarm-status.md +8 -8
- package/.claude/commands/swarm/swarm-strategies.md +8 -8
- package/.claude/commands/swarm/swarm.md +87 -87
- package/.claude/commands/swarm/testing.md +131 -131
- package/.claude/commands/training/README.md +9 -9
- package/.claude/commands/training/model-update.md +25 -25
- package/.claude/commands/training/neural-patterns.md +107 -107
- package/.claude/commands/training/neural-train.md +75 -75
- package/.claude/commands/training/pattern-learn.md +25 -25
- package/.claude/commands/training/specialization.md +62 -62
- package/.claude/commands/truth/start.md +142 -142
- package/.claude/commands/verify/check.md +49 -49
- package/.claude/commands/verify/start.md +127 -127
- package/.claude/commands/workflows/README.md +9 -9
- package/.claude/commands/workflows/development.md +77 -77
- package/.claude/commands/workflows/research.md +62 -62
- package/.claude/commands/workflows/workflow-create.md +25 -25
- package/.claude/commands/workflows/workflow-execute.md +25 -25
- package/.claude/commands/workflows/workflow-export.md +25 -25
- package/.claude/eval/human-relevance-frozen-v1.json +17 -17
- package/.claude/evolve-proof/generation-0.json +211 -211
- package/.claude/evolve-proof/real-generation-0.json +406 -406
- package/.claude/evolve-proof/real-generation-1.json +406 -406
- package/.claude/helpers/.helpers-version +1 -1
- package/.claude/helpers/README.md +96 -96
- package/.claude/helpers/adr-compliance.sh +186 -186
- package/.claude/helpers/auto-commit.sh +178 -178
- package/.claude/helpers/auto-memory-hook.mjs +430 -430
- package/.claude/helpers/checkpoint-manager.sh +251 -251
- package/.claude/helpers/daemon-manager.sh +252 -252
- package/.claude/helpers/ddd-tracker.sh +144 -144
- package/.claude/helpers/github-safe.js +156 -156
- package/.claude/helpers/github-setup.sh +45 -45
- package/.claude/helpers/guidance-hook.sh +13 -13
- package/.claude/helpers/guidance-hooks.sh +102 -102
- package/.claude/helpers/health-monitor.sh +108 -108
- package/.claude/helpers/helpers.manifest.json +6 -6
- package/.claude/helpers/hook-handler.cjs +564 -460
- package/.claude/helpers/intelligence.cjs +1058 -1058
- package/.claude/helpers/learning-hooks.sh +329 -329
- package/.claude/helpers/learning-optimizer.sh +127 -127
- package/.claude/helpers/learning-service.mjs +1144 -1144
- package/.claude/helpers/memory.js +83 -83
- package/.claude/helpers/metrics-db.mjs +503 -503
- package/.claude/helpers/pattern-consolidator.sh +86 -86
- package/.claude/helpers/perf-worker.sh +160 -160
- package/.claude/helpers/post-commit +16 -16
- package/.claude/helpers/pre-commit +26 -26
- package/.claude/helpers/quick-start.sh +19 -19
- package/.claude/helpers/router.js +105 -105
- package/.claude/helpers/security-scanner.sh +127 -127
- package/.claude/helpers/session.js +157 -157
- package/.claude/helpers/setup-mcp.sh +18 -18
- package/.claude/helpers/standard-checkpoint-hooks.sh +189 -189
- package/.claude/helpers/statusline-hook.sh +21 -21
- package/.claude/helpers/statusline.cjs +925 -925
- package/.claude/helpers/statusline.js +352 -352
- package/.claude/helpers/swarm-comms.sh +353 -353
- package/.claude/helpers/swarm-hooks.sh +761 -761
- package/.claude/helpers/swarm-monitor.sh +210 -210
- package/.claude/helpers/sync-v3-metrics.sh +245 -245
- package/.claude/helpers/update-v3-progress.sh +165 -165
- package/.claude/helpers/v3-quick-status.sh +57 -57
- package/.claude/helpers/v3.sh +110 -110
- package/.claude/helpers/validate-v3-config.sh +215 -215
- package/.claude/helpers/worker-manager.sh +170 -170
- package/.claude/proven-config.json +1 -1
- package/.claude/proven-config.manifest.json +37 -37
- package/.claude/proven-config.signed.json +41 -41
- package/.claude/settings.json +182 -182
- package/.claude/skills/agentdb-advanced/SKILL.md +550 -550
- package/.claude/skills/agentdb-learning/SKILL.md +545 -545
- package/.claude/skills/agentdb-memory-patterns/SKILL.md +339 -339
- package/.claude/skills/agentdb-optimization/SKILL.md +509 -509
- package/.claude/skills/agentdb-vector-search/SKILL.md +339 -339
- package/.claude/skills/browser/SKILL.md +204 -204
- package/.claude/skills/dual-mode/README.md +71 -71
- package/.claude/skills/dual-mode/dual-collect.md +103 -103
- package/.claude/skills/dual-mode/dual-coordinate.md +85 -85
- package/.claude/skills/dual-mode/dual-spawn.md +81 -81
- package/.claude/skills/flow-nexus-neural/SKILL.md +727 -727
- package/.claude/skills/flow-nexus-platform/SKILL.md +1154 -1154
- package/.claude/skills/flow-nexus-swarm/SKILL.md +604 -604
- package/.claude/skills/github-code-review/SKILL.md +1125 -1125
- package/.claude/skills/github-multi-repo/SKILL.md +862 -862
- package/.claude/skills/github-project-management/SKILL.md +1262 -1262
- package/.claude/skills/github-release-management/SKILL.md +1064 -1064
- package/.claude/skills/github-workflow-automation/SKILL.md +1047 -1047
- package/.claude/skills/hooks-automation/SKILL.md +1201 -1201
- package/.claude/skills/pair-programming/SKILL.md +1202 -1202
- package/.claude/skills/reasoningbank-agentdb/SKILL.md +446 -446
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +201 -201
- package/.claude/skills/skill-builder/SKILL.md +910 -910
- package/.claude/skills/sparc-methodology/SKILL.md +1106 -1106
- package/.claude/skills/stream-chain/SKILL.md +560 -560
- package/.claude/skills/swarm-advanced/SKILL.md +970 -970
- package/.claude/skills/swarm-orchestration/SKILL.md +179 -179
- package/.claude/skills/v3-cli-modernization/SKILL.md +871 -871
- package/.claude/skills/v3-core-implementation/SKILL.md +796 -796
- package/.claude/skills/v3-ddd-architecture/SKILL.md +441 -441
- package/.claude/skills/v3-integration-deep/SKILL.md +240 -240
- package/.claude/skills/v3-mcp-optimization/SKILL.md +776 -776
- package/.claude/skills/v3-memory-unification/SKILL.md +173 -173
- package/.claude/skills/v3-performance-optimization/SKILL.md +389 -389
- package/.claude/skills/v3-security-overhaul/SKILL.md +81 -81
- package/.claude/skills/v3-swarm-coordination/SKILL.md +339 -339
- package/.claude/skills/verification-quality/SKILL.md +691 -691
- package/README.md +419 -419
- package/bin/cli.js +314 -314
- package/bin/mcp-server.js +224 -224
- package/bin/preinstall.cjs +2 -2
- package/catalog-manifest.json +2 -2
- package/dist/src/benchmarks/gaia-critic.js +24 -24
- package/dist/src/business-pods/bbs-budget-tracker.js +53 -53
- package/dist/src/commands/announcements.d.ts +17 -0
- package/dist/src/commands/announcements.js +0 -0
- package/dist/src/commands/completions.js +409 -409
- package/dist/src/commands/daemon.js +44 -44
- package/dist/src/commands/embeddings.js +26 -26
- package/dist/src/commands/funnel.d.ts +10 -5
- package/dist/src/commands/funnel.js +206 -7
- package/dist/src/commands/hive-mind.js +97 -97
- package/dist/src/commands/hooks.js +9 -9
- package/dist/src/commands/index.js +4 -0
- package/dist/src/commands/init.js +94 -38
- package/dist/src/commands/memory.js +85 -1
- package/dist/src/commands/ruvector/backup.js +23 -23
- package/dist/src/commands/ruvector/benchmark.js +31 -31
- package/dist/src/commands/ruvector/import.js +14 -14
- package/dist/src/commands/ruvector/init.js +115 -115
- package/dist/src/commands/ruvector/migrate.js +99 -99
- package/dist/src/commands/ruvector/optimize.js +51 -51
- package/dist/src/commands/ruvector/setup.js +624 -624
- package/dist/src/commands/ruvector/status.js +38 -38
- package/dist/src/commands/spinner.d.ts +16 -0
- package/dist/src/commands/spinner.js +329 -0
- package/dist/src/config/proven-config.js +2 -2
- package/dist/src/funnel/consent.js +3 -0
- package/dist/src/funnel/disclosure.d.ts +1 -0
- package/dist/src/funnel/disclosure.js +12 -0
- package/dist/src/funnel/index.d.ts +2 -1
- package/dist/src/funnel/index.js +2 -1
- package/dist/src/funnel/payout.d.ts +40 -0
- package/dist/src/funnel/payout.js +60 -0
- package/dist/src/funnel/types.d.ts +13 -1
- package/dist/src/init/claudemd-generator.js +231 -231
- package/dist/src/init/executor.js +453 -453
- package/dist/src/init/helper-refresh.js +17 -0
- package/dist/src/init/helper-signing.d.ts +8 -1
- package/dist/src/init/helper-signing.js +9 -2
- package/dist/src/init/helpers-generator.js +751 -751
- package/dist/src/init/statusline-generator.js +955 -949
- package/dist/src/mcp-tools/agentdb-tools.js +15 -15
- package/dist/src/mcp-tools/browser-intent-tools.js +19 -19
- package/dist/src/memory/graph-edge-writer.js +22 -22
- package/dist/src/memory/memory-bridge.d.ts +10 -0
- package/dist/src/memory/memory-bridge.js +139 -88
- package/dist/src/memory/memory-initializer.d.ts +18 -0
- package/dist/src/memory/memory-initializer.js +539 -407
- package/dist/src/memory/rabitq-index.js +5 -5
- package/dist/src/runtime/headless.js +28 -28
- package/dist/src/ruvector/flash-attention.d.ts +195 -0
- package/dist/src/ruvector/flash-attention.js +643 -0
- package/dist/src/ruvector/moe-router.d.ts +206 -0
- package/dist/src/ruvector/moe-router.js +626 -0
- package/dist/src/services/distill-tuning.js +7 -7
- package/dist/src/services/event-stream.d.ts +25 -0
- package/dist/src/services/event-stream.js +27 -0
- package/dist/src/services/headless-worker-executor.js +84 -84
- package/dist/src/services/loop-worker-runner.d.ts +16 -0
- package/dist/src/services/loop-worker-runner.js +34 -0
- package/dist/src/services/memory-distillation.js +4 -4
- package/dist/src/services/runtime-capabilities.d.ts +22 -0
- package/dist/src/services/runtime-capabilities.js +45 -0
- package/dist/src/transfer/deploy-seraphine.js +23 -23
- package/package.json +134 -133
- package/plugins/ruflo-metaharness/.claude-plugin/plugin.json +32 -32
- package/plugins/ruflo-metaharness/README.md +72 -72
- package/plugins/ruflo-metaharness/agents/metaharness-architect.md +58 -58
- package/plugins/ruflo-metaharness/commands/ruflo-metaharness.md +48 -48
- package/plugins/ruflo-metaharness/scripts/_darwin.mjs +210 -210
- package/plugins/ruflo-metaharness/scripts/_harness.mjs +330 -330
- package/plugins/ruflo-metaharness/scripts/_invoke.mjs +231 -231
- package/plugins/ruflo-metaharness/scripts/_redblue.mjs +143 -143
- package/plugins/ruflo-metaharness/scripts/_similarity.mjs +161 -161
- package/plugins/ruflo-metaharness/scripts/_spike-similarity.mjs +223 -223
- package/plugins/ruflo-metaharness/scripts/audit-list.mjs +158 -158
- package/plugins/ruflo-metaharness/scripts/audit-trend.mjs +272 -272
- package/plugins/ruflo-metaharness/scripts/bench-parse-mcp-scan.mjs +146 -146
- package/plugins/ruflo-metaharness/scripts/bench-recordpair-overhead.mjs +186 -186
- package/plugins/ruflo-metaharness/scripts/bench-similarity.mjs +177 -177
- package/plugins/ruflo-metaharness/scripts/bench.mjs +95 -95
- package/plugins/ruflo-metaharness/scripts/drift-from-history.mjs +363 -363
- package/plugins/ruflo-metaharness/scripts/evolve.mjs +404 -404
- package/plugins/ruflo-metaharness/scripts/genome.mjs +80 -80
- package/plugins/ruflo-metaharness/scripts/gepa.mjs +153 -153
- package/plugins/ruflo-metaharness/scripts/learn.mjs +127 -127
- package/plugins/ruflo-metaharness/scripts/mcp-scan.mjs +111 -111
- package/plugins/ruflo-metaharness/scripts/mint.mjs +126 -126
- package/plugins/ruflo-metaharness/scripts/oia-audit.mjs +228 -228
- package/plugins/ruflo-metaharness/scripts/redblue.mjs +286 -286
- package/plugins/ruflo-metaharness/scripts/router-parallel-analyze.mjs +250 -250
- package/plugins/ruflo-metaharness/scripts/score.mjs +92 -92
- package/plugins/ruflo-metaharness/scripts/security-bench.mjs +174 -174
- package/plugins/ruflo-metaharness/scripts/similarity.mjs +158 -158
- package/plugins/ruflo-metaharness/scripts/smoke.sh +2353 -2353
- package/plugins/ruflo-metaharness/scripts/test-graceful-degradation.mjs +165 -165
- package/plugins/ruflo-metaharness/scripts/test-mcp-tools.mjs +472 -472
- package/plugins/ruflo-metaharness/scripts/test-parallel-pipeline.mjs +204 -204
- package/plugins/ruflo-metaharness/scripts/test-pipeline-roundtrip.mjs +586 -586
- package/plugins/ruflo-metaharness/scripts/test-similarity.mjs +334 -334
- package/plugins/ruflo-metaharness/scripts/test-with-openrouter.mjs +229 -229
- package/plugins/ruflo-metaharness/scripts/threat-model.mjs +59 -59
- package/plugins/ruflo-metaharness/skills/harness-bench/SKILL.md +64 -64
- package/plugins/ruflo-metaharness/skills/harness-drift-from-history/SKILL.md +65 -65
- package/plugins/ruflo-metaharness/skills/harness-evolve/SKILL.md +131 -131
- package/plugins/ruflo-metaharness/skills/harness-genome/SKILL.md +54 -54
- package/plugins/ruflo-metaharness/skills/harness-gepa/SKILL.md +65 -65
- package/plugins/ruflo-metaharness/skills/harness-learn/SKILL.md +65 -65
- package/plugins/ruflo-metaharness/skills/harness-mcp-scan/SKILL.md +49 -49
- package/plugins/ruflo-metaharness/skills/harness-mint/SKILL.md +72 -72
- package/plugins/ruflo-metaharness/skills/harness-oia-audit/SKILL.md +79 -79
- package/plugins/ruflo-metaharness/skills/harness-score/SKILL.md +66 -66
- package/plugins/ruflo-metaharness/skills/harness-security-bench/SKILL.md +101 -101
- package/plugins/ruflo-metaharness/skills/harness-similarity/SKILL.md +67 -67
- package/plugins/ruflo-metaharness/skills/harness-threat-model/SKILL.md +41 -41
- package/scripts/postinstall.cjs +153 -153
|
@@ -1431,33 +1431,33 @@ const installSupervisorCommand = {
|
|
|
1431
1431
|
const plistDir = join(home, 'Library', 'LaunchAgents');
|
|
1432
1432
|
const plistPath = join(plistDir, 'io.ruv.ruflo.daemon.plist');
|
|
1433
1433
|
const logDir = join(projectRoot, '.claude-flow', 'logs');
|
|
1434
|
-
const plist = `<?xml version="1.0" encoding="UTF-8"?>
|
|
1435
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
1436
|
-
<plist version="1.0">
|
|
1437
|
-
<dict>
|
|
1438
|
-
<key>Label</key><string>io.ruv.ruflo.daemon</string>
|
|
1439
|
-
<key>ProgramArguments</key>
|
|
1440
|
-
<array>
|
|
1441
|
-
<string>${nodeBin}</string>
|
|
1442
|
-
<string>${cliJs}</string>
|
|
1443
|
-
<string>daemon</string><string>start</string><string>--foreground</string><string>--quiet</string>
|
|
1444
|
-
</array>
|
|
1445
|
-
<key>WorkingDirectory</key><string>${projectRoot}</string>
|
|
1446
|
-
<key>RunAtLoad</key><true/>
|
|
1447
|
-
<key>KeepAlive</key>
|
|
1448
|
-
<dict>
|
|
1449
|
-
<key>SuccessfulExit</key><false/>
|
|
1450
|
-
<key>Crashed</key><true/>
|
|
1451
|
-
</dict>
|
|
1452
|
-
<key>ThrottleInterval</key><integer>10</integer>
|
|
1453
|
-
<key>StandardOutPath</key><string>${logDir}/supervisor.out.log</string>
|
|
1454
|
-
<key>StandardErrorPath</key><string>${logDir}/supervisor.err.log</string>
|
|
1455
|
-
<key>EnvironmentVariables</key>
|
|
1456
|
-
<dict>
|
|
1457
|
-
<key>CLAUDE_FLOW_DAEMON</key><string>1</string>
|
|
1458
|
-
</dict>
|
|
1459
|
-
</dict>
|
|
1460
|
-
</plist>
|
|
1434
|
+
const plist = `<?xml version="1.0" encoding="UTF-8"?>
|
|
1435
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
1436
|
+
<plist version="1.0">
|
|
1437
|
+
<dict>
|
|
1438
|
+
<key>Label</key><string>io.ruv.ruflo.daemon</string>
|
|
1439
|
+
<key>ProgramArguments</key>
|
|
1440
|
+
<array>
|
|
1441
|
+
<string>${nodeBin}</string>
|
|
1442
|
+
<string>${cliJs}</string>
|
|
1443
|
+
<string>daemon</string><string>start</string><string>--foreground</string><string>--quiet</string>
|
|
1444
|
+
</array>
|
|
1445
|
+
<key>WorkingDirectory</key><string>${projectRoot}</string>
|
|
1446
|
+
<key>RunAtLoad</key><true/>
|
|
1447
|
+
<key>KeepAlive</key>
|
|
1448
|
+
<dict>
|
|
1449
|
+
<key>SuccessfulExit</key><false/>
|
|
1450
|
+
<key>Crashed</key><true/>
|
|
1451
|
+
</dict>
|
|
1452
|
+
<key>ThrottleInterval</key><integer>10</integer>
|
|
1453
|
+
<key>StandardOutPath</key><string>${logDir}/supervisor.out.log</string>
|
|
1454
|
+
<key>StandardErrorPath</key><string>${logDir}/supervisor.err.log</string>
|
|
1455
|
+
<key>EnvironmentVariables</key>
|
|
1456
|
+
<dict>
|
|
1457
|
+
<key>CLAUDE_FLOW_DAEMON</key><string>1</string>
|
|
1458
|
+
</dict>
|
|
1459
|
+
</dict>
|
|
1460
|
+
</plist>
|
|
1461
1461
|
`;
|
|
1462
1462
|
if (dryRun) {
|
|
1463
1463
|
output.writeln(plist);
|
|
@@ -1498,23 +1498,23 @@ const installSupervisorCommand = {
|
|
|
1498
1498
|
// Linux: systemd-user
|
|
1499
1499
|
const unitDir = join(home, '.config', 'systemd', 'user');
|
|
1500
1500
|
const unitPath = join(unitDir, 'ruflo-daemon.service');
|
|
1501
|
-
const unit = `[Unit]
|
|
1502
|
-
Description=RuFlo background worker daemon
|
|
1503
|
-
After=default.target
|
|
1504
|
-
|
|
1505
|
-
[Service]
|
|
1506
|
-
Type=simple
|
|
1507
|
-
WorkingDirectory=${projectRoot}
|
|
1508
|
-
Environment=CLAUDE_FLOW_DAEMON=1
|
|
1509
|
-
ExecStart=${nodeBin} ${cliJs} daemon start --foreground --quiet
|
|
1510
|
-
Restart=on-failure
|
|
1511
|
-
RestartSec=10
|
|
1512
|
-
# Restart on Crashed (signal) too
|
|
1513
|
-
StartLimitIntervalSec=300
|
|
1514
|
-
StartLimitBurst=5
|
|
1515
|
-
|
|
1516
|
-
[Install]
|
|
1517
|
-
WantedBy=default.target
|
|
1501
|
+
const unit = `[Unit]
|
|
1502
|
+
Description=RuFlo background worker daemon
|
|
1503
|
+
After=default.target
|
|
1504
|
+
|
|
1505
|
+
[Service]
|
|
1506
|
+
Type=simple
|
|
1507
|
+
WorkingDirectory=${projectRoot}
|
|
1508
|
+
Environment=CLAUDE_FLOW_DAEMON=1
|
|
1509
|
+
ExecStart=${nodeBin} ${cliJs} daemon start --foreground --quiet
|
|
1510
|
+
Restart=on-failure
|
|
1511
|
+
RestartSec=10
|
|
1512
|
+
# Restart on Crashed (signal) too
|
|
1513
|
+
StartLimitIntervalSec=300
|
|
1514
|
+
StartLimitBurst=5
|
|
1515
|
+
|
|
1516
|
+
[Install]
|
|
1517
|
+
WantedBy=default.target
|
|
1518
1518
|
`;
|
|
1519
1519
|
if (dryRun) {
|
|
1520
1520
|
output.writeln(unit);
|
|
@@ -147,13 +147,13 @@ const searchCommand = {
|
|
|
147
147
|
// Get all entries with embeddings from database
|
|
148
148
|
// Parameterized query to prevent SQL injection (CRIT-01)
|
|
149
149
|
const embeddingSql = namespace !== 'all'
|
|
150
|
-
? `SELECT id, key, namespace, content, embedding, embedding_dimensions
|
|
151
|
-
FROM memory_entries
|
|
152
|
-
WHERE status = 'active' AND embedding IS NOT NULL AND namespace = ?
|
|
150
|
+
? `SELECT id, key, namespace, content, embedding, embedding_dimensions
|
|
151
|
+
FROM memory_entries
|
|
152
|
+
WHERE status = 'active' AND embedding IS NOT NULL AND namespace = ?
|
|
153
153
|
LIMIT 1000`
|
|
154
|
-
: `SELECT id, key, namespace, content, embedding, embedding_dimensions
|
|
155
|
-
FROM memory_entries
|
|
156
|
-
WHERE status = 'active' AND embedding IS NOT NULL
|
|
154
|
+
: `SELECT id, key, namespace, content, embedding, embedding_dimensions
|
|
155
|
+
FROM memory_entries
|
|
156
|
+
WHERE status = 'active' AND embedding IS NOT NULL
|
|
157
157
|
LIMIT 1000`;
|
|
158
158
|
const embeddingStmt = db.prepare(embeddingSql);
|
|
159
159
|
if (namespace !== 'all') {
|
|
@@ -192,16 +192,16 @@ const searchCommand = {
|
|
|
192
192
|
const likePattern = `%${query}%`;
|
|
193
193
|
const remainingLimit = Math.max(0, limit - results.length);
|
|
194
194
|
const keywordSql = namespace !== 'all'
|
|
195
|
-
? `SELECT id, key, namespace, content
|
|
196
|
-
FROM memory_entries
|
|
197
|
-
WHERE status = 'active'
|
|
198
|
-
AND (content LIKE ? OR key LIKE ?)
|
|
199
|
-
AND namespace = ?
|
|
195
|
+
? `SELECT id, key, namespace, content
|
|
196
|
+
FROM memory_entries
|
|
197
|
+
WHERE status = 'active'
|
|
198
|
+
AND (content LIKE ? OR key LIKE ?)
|
|
199
|
+
AND namespace = ?
|
|
200
200
|
LIMIT ?`
|
|
201
|
-
: `SELECT id, key, namespace, content
|
|
202
|
-
FROM memory_entries
|
|
203
|
-
WHERE status = 'active'
|
|
204
|
-
AND (content LIKE ? OR key LIKE ?)
|
|
201
|
+
: `SELECT id, key, namespace, content
|
|
202
|
+
FROM memory_entries
|
|
203
|
+
WHERE status = 'active'
|
|
204
|
+
AND (content LIKE ? OR key LIKE ?)
|
|
205
205
|
LIMIT ?`;
|
|
206
206
|
const keywordStmt = db.prepare(keywordSql);
|
|
207
207
|
if (namespace !== 'all') {
|
|
@@ -408,17 +408,17 @@ const collectionsCommand = {
|
|
|
408
408
|
const fileBuffer = fs.readFileSync(fullDbPath);
|
|
409
409
|
const db = new SQL.Database(fileBuffer);
|
|
410
410
|
// Get collection stats from database
|
|
411
|
-
const statsQuery = db.exec(`
|
|
412
|
-
SELECT
|
|
413
|
-
namespace,
|
|
414
|
-
COUNT(*) as total_entries,
|
|
415
|
-
SUM(CASE WHEN embedding IS NOT NULL THEN 1 ELSE 0 END) as with_embeddings,
|
|
416
|
-
AVG(embedding_dimensions) as avg_dimensions,
|
|
417
|
-
SUM(LENGTH(content)) as total_content_size
|
|
418
|
-
FROM memory_entries
|
|
419
|
-
WHERE status = 'active'
|
|
420
|
-
GROUP BY namespace
|
|
421
|
-
ORDER BY total_entries DESC
|
|
411
|
+
const statsQuery = db.exec(`
|
|
412
|
+
SELECT
|
|
413
|
+
namespace,
|
|
414
|
+
COUNT(*) as total_entries,
|
|
415
|
+
SUM(CASE WHEN embedding IS NOT NULL THEN 1 ELSE 0 END) as with_embeddings,
|
|
416
|
+
AVG(embedding_dimensions) as avg_dimensions,
|
|
417
|
+
SUM(LENGTH(content)) as total_content_size
|
|
418
|
+
FROM memory_entries
|
|
419
|
+
WHERE status = 'active'
|
|
420
|
+
GROUP BY namespace
|
|
421
|
+
ORDER BY total_entries DESC
|
|
422
422
|
`);
|
|
423
423
|
// Get vector index info
|
|
424
424
|
const indexQuery = db.exec(`SELECT name, dimensions, hnsw_m FROM vector_indexes`);
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `ruflo funnel` — user control surface for the Cognitum lifecycle funnel
|
|
3
|
-
* (ADR-301/305/309).
|
|
3
|
+
* (ADR-301/305/309/317).
|
|
4
4
|
*
|
|
5
|
-
* funnel status
|
|
6
|
-
* funnel disable
|
|
7
|
-
* funnel enable
|
|
8
|
-
* funnel
|
|
5
|
+
* funnel status effective state and which precedence source decided it
|
|
6
|
+
* funnel disable user-level opt-out (all surfaces) + delete funnel data
|
|
7
|
+
* funnel enable re-enable at the user tier (cannot override env/enterprise)
|
|
8
|
+
* funnel accept acknowledge the disclosure so rotation starts immediately
|
|
9
|
+
* funnel open open the currently-shown promo URL in the default browser
|
|
10
|
+
* funnel enroll opt in to the 50/50 revenue share on Cognitum sponsor spend (ADR-317)
|
|
11
|
+
* funnel earnings show accrued and paid revenue-share balance
|
|
12
|
+
* funnel unenroll revoke local enrollment (funnel itself stays enabled)
|
|
13
|
+
* funnel id print the pseudonymous funnel ID, if one exists
|
|
9
14
|
*/
|
|
10
15
|
import type { Command } from '../types.js';
|
|
11
16
|
export declare const funnelCommand: Command;
|
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `ruflo funnel` — user control surface for the Cognitum lifecycle funnel
|
|
3
|
-
* (ADR-301/305/309).
|
|
3
|
+
* (ADR-301/305/309/317).
|
|
4
4
|
*
|
|
5
|
-
* funnel status
|
|
6
|
-
* funnel disable
|
|
7
|
-
* funnel enable
|
|
8
|
-
* funnel
|
|
5
|
+
* funnel status effective state and which precedence source decided it
|
|
6
|
+
* funnel disable user-level opt-out (all surfaces) + delete funnel data
|
|
7
|
+
* funnel enable re-enable at the user tier (cannot override env/enterprise)
|
|
8
|
+
* funnel accept acknowledge the disclosure so rotation starts immediately
|
|
9
|
+
* funnel open open the currently-shown promo URL in the default browser
|
|
10
|
+
* funnel enroll opt in to the 50/50 revenue share on Cognitum sponsor spend (ADR-317)
|
|
11
|
+
* funnel earnings show accrued and paid revenue-share balance
|
|
12
|
+
* funnel unenroll revoke local enrollment (funnel itself stays enabled)
|
|
13
|
+
* funnel id print the pseudonymous funnel ID, if one exists
|
|
9
14
|
*/
|
|
15
|
+
import { execFile } from 'node:child_process';
|
|
16
|
+
import * as fs from 'node:fs';
|
|
17
|
+
import * as os from 'node:os';
|
|
18
|
+
import * as path from 'node:path';
|
|
10
19
|
import { output } from '../output.js';
|
|
11
|
-
import { deleteFunnelData, funnelStateDir, getDisclosure, getFunnelId, readConsents, recordDisclosureDeclined, recordDisclosureReenabled, resolveFunnelEnabled, } from '../funnel/index.js';
|
|
20
|
+
import { deleteEnrollment, deleteFunnelData, funnelStateDir, getDisclosure, getEnrollment, getFunnelId, isEarningEligible, promoEligible, readConsents, recordDisclosureAccepted, recordDisclosureDeclined, recordDisclosureReenabled, resolveFunnelEnabled, } from '../funnel/index.js';
|
|
21
|
+
import { hasConsent, recordConsent } from '../funnel/consent.js';
|
|
12
22
|
import { readStateJson, writeStateJson } from '../funnel/state.js';
|
|
13
23
|
function setUserConfigEnabled(enabled) {
|
|
14
24
|
const cfg = readStateJson('funnel.json') ?? {};
|
|
@@ -75,6 +85,191 @@ const enableSub = {
|
|
|
75
85
|
return { success: true, data: decision };
|
|
76
86
|
},
|
|
77
87
|
};
|
|
88
|
+
const acceptSub = {
|
|
89
|
+
name: 'accept',
|
|
90
|
+
description: 'Acknowledge the disclosure so rotation starts immediately (skips the 24h grace window)',
|
|
91
|
+
action: async () => {
|
|
92
|
+
const decision = resolveFunnelEnabled();
|
|
93
|
+
if (!decision.enabled) {
|
|
94
|
+
output.printWarning(`Funnel is currently disabled by: ${decision.decidedBy}. Run 'ruflo funnel enable' first, then re-run accept.`);
|
|
95
|
+
return { success: false, data: decision };
|
|
96
|
+
}
|
|
97
|
+
const current = getDisclosure();
|
|
98
|
+
if (current.state === 'disclosed_disabled') {
|
|
99
|
+
output.printWarning("Disclosure is in a declined state. Run 'ruflo funnel enable' first, then re-run accept.");
|
|
100
|
+
return { success: false, data: current };
|
|
101
|
+
}
|
|
102
|
+
const rec = recordDisclosureAccepted();
|
|
103
|
+
const eligible = promoEligible();
|
|
104
|
+
output.printSuccess(`Disclosure accepted (firstShownAt backdated to ${rec.firstShownAt}). Promo rotation eligible: ${eligible}.`);
|
|
105
|
+
return { success: true, data: { record: rec, eligible } };
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
// Reads the memoized promo written by the statusline renderer. Same file
|
|
109
|
+
// path as .claude/helpers/statusline.cjs's PROMO_MEMO_FILE — kept in sync
|
|
110
|
+
// by convention. Returns null on any error so a broken memo can't crash
|
|
111
|
+
// the subcommand.
|
|
112
|
+
function readCurrentPromo() {
|
|
113
|
+
try {
|
|
114
|
+
const memoPath = path.join(os.homedir(), '.ruflo', 'statusline-promo.json');
|
|
115
|
+
const raw = JSON.parse(fs.readFileSync(memoPath, 'utf-8'));
|
|
116
|
+
if (raw && raw.promo && typeof raw.promo === 'object')
|
|
117
|
+
return raw.promo;
|
|
118
|
+
}
|
|
119
|
+
catch { /* memo absent or corrupt — treat as "nothing shown yet" */ }
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
// Allowlist mirrors the OSC 8 hyperlink allowlist in the statusline renderer.
|
|
123
|
+
// Never open a URL whose host isn't on this list, even if a corrupted memo
|
|
124
|
+
// somehow lands one there — the memo is user-writable so we must not treat
|
|
125
|
+
// it as trusted. Kept in sync with .claude/helpers/statusline.cjs's
|
|
126
|
+
// PROMO_LINK_HOSTS.
|
|
127
|
+
const OPEN_ALLOWED_HOSTS = new Set([
|
|
128
|
+
'cognitum.one', 'www.cognitum.one', 'docs.cognitum.one',
|
|
129
|
+
'agentics.org', 'www.agentics.org',
|
|
130
|
+
'funnel.ruv.io',
|
|
131
|
+
'cognitum-analytics-63rzcdswba-uc.a.run.app',
|
|
132
|
+
]);
|
|
133
|
+
// Open a URL using the platform's default browser handler. execFile (not
|
|
134
|
+
// exec) — no shell involved, so nothing in the URL can be interpreted as a
|
|
135
|
+
// shell command even in the pathological case where allowlisting is
|
|
136
|
+
// bypassed. Runs detached + hidden so no cmd window flashes on Windows.
|
|
137
|
+
function openInBrowser(url) {
|
|
138
|
+
return new Promise((resolve, reject) => {
|
|
139
|
+
const platform = process.platform;
|
|
140
|
+
const [cmd, args] = platform === 'win32'
|
|
141
|
+
// "start" needs an empty title argument first, else the first quoted
|
|
142
|
+
// arg becomes the title and the URL is ignored. cmd /c is required to
|
|
143
|
+
// invoke the built-in start command.
|
|
144
|
+
? ['cmd', ['/c', 'start', '""', url]]
|
|
145
|
+
: platform === 'darwin'
|
|
146
|
+
? ['open', [url]]
|
|
147
|
+
: ['xdg-open', [url]];
|
|
148
|
+
execFile(cmd, args, { windowsHide: true }, (err) => (err ? reject(err) : resolve()));
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
const openSub = {
|
|
152
|
+
name: 'open',
|
|
153
|
+
description: 'Open the currently-shown statusline promo URL in the default browser',
|
|
154
|
+
action: async () => {
|
|
155
|
+
const promo = readCurrentPromo();
|
|
156
|
+
if (!promo) {
|
|
157
|
+
output.printWarning("No promo has been shown yet. Wait for the statusline to render one, then re-run 'ruflo funnel open'.");
|
|
158
|
+
return { success: false };
|
|
159
|
+
}
|
|
160
|
+
if (!promo.url) {
|
|
161
|
+
output.printWarning(`Current promo (kind=${promo.kind ?? 'unknown'}) has no URL. Nothing to open: "${promo.text}"`);
|
|
162
|
+
return { success: false, data: promo };
|
|
163
|
+
}
|
|
164
|
+
let parsed;
|
|
165
|
+
try {
|
|
166
|
+
parsed = new URL(promo.url);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
output.printError(`Promo URL is malformed: ${promo.url}`);
|
|
170
|
+
return { success: false, data: promo };
|
|
171
|
+
}
|
|
172
|
+
if (parsed.protocol !== 'https:' || !OPEN_ALLOWED_HOSTS.has(parsed.hostname)) {
|
|
173
|
+
output.printError(`Refusing to open URL — not on the allowlist: ${parsed.protocol}//${parsed.hostname}`);
|
|
174
|
+
return { success: false, data: { url: promo.url } };
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
await openInBrowser(parsed.href);
|
|
178
|
+
output.printSuccess(`Opened: ${parsed.href}`);
|
|
179
|
+
return { success: true, data: { url: parsed.href } };
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
output.printError(`Failed to open URL: ${err instanceof Error ? err.message : String(err)}`);
|
|
183
|
+
output.writeln(`URL for manual copy: ${parsed.href}`);
|
|
184
|
+
return { success: false, data: { url: parsed.href } };
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
// ─── ADR-317: developer revenue-share subcommands ─────────────────────────
|
|
189
|
+
const ENROLL_URL = 'https://funnel.ruv.io/enroll';
|
|
190
|
+
const enrollSub = {
|
|
191
|
+
name: 'enroll',
|
|
192
|
+
description: 'Opt in to the 50/50 revenue share on Cognitum sponsor spend (ADR-317, Phase 0)',
|
|
193
|
+
action: async () => {
|
|
194
|
+
const decision = resolveFunnelEnabled();
|
|
195
|
+
if (!decision.enabled) {
|
|
196
|
+
output.printWarning(`Funnel is currently disabled by: ${decision.decidedBy}. Enable it (ruflo funnel enable) before enrolling — there's nothing to earn from until the funnel is on.`);
|
|
197
|
+
return { success: false, data: decision };
|
|
198
|
+
}
|
|
199
|
+
const disclosure = getDisclosure();
|
|
200
|
+
if (disclosure.state !== 'disclosed_enabled') {
|
|
201
|
+
output.printWarning("The Cognitum disclosure hasn't been shown/accepted yet. Run 'ruflo funnel accept' first, then re-run enroll.");
|
|
202
|
+
return { success: false, data: disclosure };
|
|
203
|
+
}
|
|
204
|
+
// Phase 0: record local consent so downstream attribution knows the user
|
|
205
|
+
// WANTS to enroll, but the backend endpoint that returns a real token is
|
|
206
|
+
// not live yet — this ADR ships in a version before the payout backend.
|
|
207
|
+
recordConsent('rev-share-payout', true, 'cli-funnel-enroll');
|
|
208
|
+
output.writeln('Consent recorded for rev-share-payout.');
|
|
209
|
+
output.writeln('');
|
|
210
|
+
output.writeln('The backend enrollment endpoint (Stripe Connect + KYC) is not yet live.');
|
|
211
|
+
output.writeln('When it ships, this command will open your browser to:');
|
|
212
|
+
output.writeln('');
|
|
213
|
+
output.writeln(` ${ENROLL_URL}`);
|
|
214
|
+
output.writeln('');
|
|
215
|
+
output.writeln("Meanwhile, your consent is on file. Track the rollout at ADR-317 (v3/docs/adr/).");
|
|
216
|
+
return { success: true, data: { consent: 'granted', enrollment: 'pending-backend' } };
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
const earningsSub = {
|
|
220
|
+
name: 'earnings',
|
|
221
|
+
description: 'Show accrued and paid revenue-share balance (ADR-317)',
|
|
222
|
+
options: [
|
|
223
|
+
{ name: 'json', description: 'Output as JSON', type: 'boolean', default: false },
|
|
224
|
+
],
|
|
225
|
+
action: async (ctx) => {
|
|
226
|
+
const consented = hasConsent('rev-share-payout');
|
|
227
|
+
const rec = getEnrollment();
|
|
228
|
+
const eligible = isEarningEligible();
|
|
229
|
+
const summary = {
|
|
230
|
+
consent: consented ? 'granted' : 'not-granted',
|
|
231
|
+
enrollment: rec ? { kyc_status: rec.kyc_status, enrolled_at: rec.enrolled_at, payout_account_last4: rec.payout_account_last4 } : null,
|
|
232
|
+
earning_eligible: eligible,
|
|
233
|
+
note: rec
|
|
234
|
+
? 'Earnings endpoint (funnel.ruv.io/v1/earnings) is not yet live — see ADR-317 Phase 1.'
|
|
235
|
+
: 'Not enrolled. Run `ruflo funnel enroll` to opt in.',
|
|
236
|
+
};
|
|
237
|
+
if (ctx.flags.json) {
|
|
238
|
+
output.printJson(summary);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
output.writeln(`Consent: ${summary.consent}`);
|
|
242
|
+
output.writeln(`Enrolled: ${rec ? 'yes' : 'no'}`);
|
|
243
|
+
if (rec) {
|
|
244
|
+
output.writeln(` KYC: ${rec.kyc_status}`);
|
|
245
|
+
output.writeln(` Payout account: ****${rec.payout_account_last4}`);
|
|
246
|
+
output.writeln(` Since: ${rec.enrolled_at}`);
|
|
247
|
+
}
|
|
248
|
+
output.writeln(`Earning: ${eligible ? 'yes' : 'no'}`);
|
|
249
|
+
output.writeln('');
|
|
250
|
+
output.writeln(summary.note);
|
|
251
|
+
}
|
|
252
|
+
return { success: true, data: summary };
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
const unenrollSub = {
|
|
256
|
+
name: 'unenroll',
|
|
257
|
+
description: 'Revoke rev-share enrollment locally (funnel itself stays enabled)',
|
|
258
|
+
action: async () => {
|
|
259
|
+
const hadEnrollment = !!getEnrollment();
|
|
260
|
+
const hadConsent = hasConsent('rev-share-payout');
|
|
261
|
+
recordConsent('rev-share-payout', false, 'cli-funnel-unenroll');
|
|
262
|
+
deleteEnrollment();
|
|
263
|
+
if (hadEnrollment || hadConsent) {
|
|
264
|
+
output.printSuccess('Unenrolled locally. Funnel messages still render; your install just no longer earns.');
|
|
265
|
+
output.writeln('Note: server-side revocation happens on next contact with funnel.ruv.io — the backend endpoint is not yet live (ADR-317 Phase 1).');
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
output.writeln('Nothing to unenroll — no local enrollment record and no rev-share consent was set.');
|
|
269
|
+
}
|
|
270
|
+
return { success: true, data: { previouslyEnrolled: hadEnrollment, previouslyConsented: hadConsent } };
|
|
271
|
+
},
|
|
272
|
+
};
|
|
78
273
|
const idSub = {
|
|
79
274
|
name: 'id',
|
|
80
275
|
description: 'Print the pseudonymous funnel ID (exists only with telemetry consent)',
|
|
@@ -92,9 +287,13 @@ const idSub = {
|
|
|
92
287
|
export const funnelCommand = {
|
|
93
288
|
name: 'funnel',
|
|
94
289
|
description: 'Control the Cognitum lifecycle funnel surfaces (tips, enrollment, notices)',
|
|
95
|
-
subcommands: [statusSub, disableSub, enableSub, idSub],
|
|
290
|
+
subcommands: [statusSub, disableSub, enableSub, acceptSub, openSub, enrollSub, earningsSub, unenrollSub, idSub],
|
|
96
291
|
examples: [
|
|
97
292
|
{ command: 'ruflo funnel status', description: 'Effective state + deciding source' },
|
|
293
|
+
{ command: 'ruflo funnel accept', description: 'Skip the 24h grace so rotation starts now' },
|
|
294
|
+
{ command: 'ruflo funnel open', description: 'Open the current promo URL in the browser' },
|
|
295
|
+
{ command: 'ruflo funnel enroll', description: 'Opt in to 50/50 rev share (ADR-317)' },
|
|
296
|
+
{ command: 'ruflo funnel earnings', description: 'Show accrued and paid balance' },
|
|
98
297
|
{ command: 'ruflo funnel disable', description: 'Turn off every funnel surface' },
|
|
99
298
|
],
|
|
100
299
|
action: statusSub.action,
|
|
@@ -51,103 +51,103 @@ function generateHiveMindPrompt(swarmId, swarmName, objective, workers, workerGr
|
|
|
51
51
|
const queenType = flags.queenType || 'strategic';
|
|
52
52
|
const consensusAlgorithm = flags.consensus || 'byzantine';
|
|
53
53
|
const topology = flags.topology || 'hierarchical-mesh';
|
|
54
|
-
return `🧠 HIVE MIND COLLECTIVE INTELLIGENCE SYSTEM
|
|
55
|
-
═══════════════════════════════════════════════
|
|
56
|
-
|
|
57
|
-
You are the Queen coordinator of a Hive Mind swarm with collective intelligence capabilities.
|
|
58
|
-
|
|
59
|
-
HIVE MIND CONFIGURATION:
|
|
60
|
-
📌 Swarm ID: ${swarmId}
|
|
61
|
-
📌 Swarm Name: ${swarmName}
|
|
62
|
-
🎯 Objective: ${objective}
|
|
63
|
-
👑 Queen Type: ${queenType}
|
|
64
|
-
🐝 Worker Count: ${workers.length}
|
|
65
|
-
🔗 Topology: ${topology}
|
|
66
|
-
🤝 Consensus Algorithm: ${consensusAlgorithm}
|
|
67
|
-
⏰ Initialized: ${currentTime}
|
|
68
|
-
|
|
69
|
-
WORKER DISTRIBUTION:
|
|
70
|
-
${workerTypes.map(type => `• ${type}: ${workerGroups[type].length} agents`).join('\n')}
|
|
71
|
-
|
|
72
|
-
🔧 AVAILABLE MCP TOOLS FOR HIVE MIND COORDINATION:
|
|
73
|
-
|
|
74
|
-
1️⃣ **COLLECTIVE INTELLIGENCE**
|
|
75
|
-
mcp__ruflo__hive-mind_consensus - Democratic decision making
|
|
76
|
-
mcp__ruflo__hive-mind_memory - Share knowledge across the hive
|
|
77
|
-
mcp__ruflo__hive-mind_broadcast - Broadcast to all workers
|
|
78
|
-
mcp__ruflo__neural_patterns - Neural pattern recognition
|
|
79
|
-
|
|
80
|
-
2️⃣ **QUEEN COORDINATION**
|
|
81
|
-
mcp__ruflo__hive-mind_status - Monitor swarm health
|
|
82
|
-
mcp__ruflo__task_create - Create and delegate tasks
|
|
83
|
-
mcp__ruflo__coordination_orchestrate - Orchestrate task distribution
|
|
84
|
-
mcp__ruflo__agent_spawn - Spawn additional workers
|
|
85
|
-
|
|
86
|
-
3️⃣ **WORKER MANAGEMENT**
|
|
87
|
-
mcp__ruflo__agent_list - List all active agents
|
|
88
|
-
mcp__ruflo__agent_status - Check agent status
|
|
89
|
-
mcp__ruflo__agent_health - Check worker health
|
|
90
|
-
mcp__ruflo__hive-mind_join - Add agent to hive
|
|
91
|
-
mcp__ruflo__hive-mind_leave - Remove agent from hive
|
|
92
|
-
|
|
93
|
-
4️⃣ **TASK ORCHESTRATION**
|
|
94
|
-
mcp__ruflo__task_assign - Assign tasks to workers
|
|
95
|
-
mcp__ruflo__task_status - Track task progress
|
|
96
|
-
mcp__ruflo__task_complete - Mark tasks complete
|
|
97
|
-
mcp__ruflo__workflow_create - Create workflows
|
|
98
|
-
|
|
99
|
-
5️⃣ **MEMORY & LEARNING**
|
|
100
|
-
mcp__ruflo__memory_store - Store collective knowledge
|
|
101
|
-
mcp__ruflo__memory_retrieve - Access shared memory
|
|
102
|
-
mcp__ruflo__memory_search - Search memory patterns
|
|
103
|
-
mcp__ruflo__neural_train - Learn from experiences
|
|
104
|
-
mcp__ruflo__hooks_intelligence_pattern-store - Store patterns
|
|
105
|
-
|
|
106
|
-
📋 HIVE MIND EXECUTION PROTOCOL:
|
|
107
|
-
|
|
108
|
-
1. **INITIALIZATION PHASE**
|
|
109
|
-
- Verify all workers are online and responsive
|
|
110
|
-
- Establish communication channels
|
|
111
|
-
- Load previous session state if available
|
|
112
|
-
- Initialize shared memory space
|
|
113
|
-
|
|
114
|
-
2. **TASK DISTRIBUTION PHASE**
|
|
115
|
-
- Analyze the objective and decompose into subtasks
|
|
116
|
-
- Assign tasks based on worker specializations
|
|
117
|
-
- Set up task dependencies and ordering
|
|
118
|
-
- Monitor parallel execution
|
|
119
|
-
|
|
120
|
-
3. **COORDINATION PHASE**
|
|
121
|
-
- Use consensus for critical decisions
|
|
122
|
-
- Aggregate results from workers
|
|
123
|
-
- Resolve conflicts using ${consensusAlgorithm} consensus
|
|
124
|
-
- Share learnings across the hive
|
|
125
|
-
|
|
126
|
-
4. **COMPLETION PHASE**
|
|
127
|
-
- Verify all subtasks are complete
|
|
128
|
-
- Consolidate results
|
|
129
|
-
- Store learnings in collective memory
|
|
130
|
-
- Report final status
|
|
131
|
-
|
|
132
|
-
🎯 YOUR OBJECTIVE:
|
|
133
|
-
${objective}
|
|
134
|
-
|
|
135
|
-
⚠️ CRITICAL — TOOL PREFERENCE RULES (#1422):
|
|
136
|
-
• You MUST use Ruflo MCP tools (mcp__ruflo__*) for ALL orchestration tasks
|
|
137
|
-
• Do NOT use Claude native Task/Agent tools for swarm coordination — use mcp__ruflo__agent_spawn, mcp__ruflo__task_assign, etc.
|
|
138
|
-
• Native Claude tools (Read, Write, Edit, Bash, Grep, Glob) should ONLY be used for file operations and shell commands
|
|
139
|
-
• All agent spawning, task assignment, memory, and coordination MUST go through mcp__ruflo__* tools
|
|
140
|
-
• If a Ruflo MCP tool exists for an operation, always prefer it over any native equivalent
|
|
141
|
-
|
|
142
|
-
💡 COORDINATION TIPS:
|
|
143
|
-
• Use mcp__ruflo__hive-mind_broadcast for swarm-wide announcements
|
|
144
|
-
• Check worker status regularly with mcp__ruflo__hive-mind_status
|
|
145
|
-
• Store important decisions in shared memory for persistence
|
|
146
|
-
• Use consensus for any decisions affecting multiple workers
|
|
147
|
-
• Use mcp__ruflo__task_assign to assign tasks to workers, then mcp__ruflo__task_complete when done
|
|
148
|
-
|
|
149
|
-
🚀 BEGIN HIVE MIND COORDINATION NOW!
|
|
150
|
-
Start by checking the current hive status and then proceed with the objective.
|
|
54
|
+
return `🧠 HIVE MIND COLLECTIVE INTELLIGENCE SYSTEM
|
|
55
|
+
═══════════════════════════════════════════════
|
|
56
|
+
|
|
57
|
+
You are the Queen coordinator of a Hive Mind swarm with collective intelligence capabilities.
|
|
58
|
+
|
|
59
|
+
HIVE MIND CONFIGURATION:
|
|
60
|
+
📌 Swarm ID: ${swarmId}
|
|
61
|
+
📌 Swarm Name: ${swarmName}
|
|
62
|
+
🎯 Objective: ${objective}
|
|
63
|
+
👑 Queen Type: ${queenType}
|
|
64
|
+
🐝 Worker Count: ${workers.length}
|
|
65
|
+
🔗 Topology: ${topology}
|
|
66
|
+
🤝 Consensus Algorithm: ${consensusAlgorithm}
|
|
67
|
+
⏰ Initialized: ${currentTime}
|
|
68
|
+
|
|
69
|
+
WORKER DISTRIBUTION:
|
|
70
|
+
${workerTypes.map(type => `• ${type}: ${workerGroups[type].length} agents`).join('\n')}
|
|
71
|
+
|
|
72
|
+
🔧 AVAILABLE MCP TOOLS FOR HIVE MIND COORDINATION:
|
|
73
|
+
|
|
74
|
+
1️⃣ **COLLECTIVE INTELLIGENCE**
|
|
75
|
+
mcp__ruflo__hive-mind_consensus - Democratic decision making
|
|
76
|
+
mcp__ruflo__hive-mind_memory - Share knowledge across the hive
|
|
77
|
+
mcp__ruflo__hive-mind_broadcast - Broadcast to all workers
|
|
78
|
+
mcp__ruflo__neural_patterns - Neural pattern recognition
|
|
79
|
+
|
|
80
|
+
2️⃣ **QUEEN COORDINATION**
|
|
81
|
+
mcp__ruflo__hive-mind_status - Monitor swarm health
|
|
82
|
+
mcp__ruflo__task_create - Create and delegate tasks
|
|
83
|
+
mcp__ruflo__coordination_orchestrate - Orchestrate task distribution
|
|
84
|
+
mcp__ruflo__agent_spawn - Spawn additional workers
|
|
85
|
+
|
|
86
|
+
3️⃣ **WORKER MANAGEMENT**
|
|
87
|
+
mcp__ruflo__agent_list - List all active agents
|
|
88
|
+
mcp__ruflo__agent_status - Check agent status
|
|
89
|
+
mcp__ruflo__agent_health - Check worker health
|
|
90
|
+
mcp__ruflo__hive-mind_join - Add agent to hive
|
|
91
|
+
mcp__ruflo__hive-mind_leave - Remove agent from hive
|
|
92
|
+
|
|
93
|
+
4️⃣ **TASK ORCHESTRATION**
|
|
94
|
+
mcp__ruflo__task_assign - Assign tasks to workers
|
|
95
|
+
mcp__ruflo__task_status - Track task progress
|
|
96
|
+
mcp__ruflo__task_complete - Mark tasks complete
|
|
97
|
+
mcp__ruflo__workflow_create - Create workflows
|
|
98
|
+
|
|
99
|
+
5️⃣ **MEMORY & LEARNING**
|
|
100
|
+
mcp__ruflo__memory_store - Store collective knowledge
|
|
101
|
+
mcp__ruflo__memory_retrieve - Access shared memory
|
|
102
|
+
mcp__ruflo__memory_search - Search memory patterns
|
|
103
|
+
mcp__ruflo__neural_train - Learn from experiences
|
|
104
|
+
mcp__ruflo__hooks_intelligence_pattern-store - Store patterns
|
|
105
|
+
|
|
106
|
+
📋 HIVE MIND EXECUTION PROTOCOL:
|
|
107
|
+
|
|
108
|
+
1. **INITIALIZATION PHASE**
|
|
109
|
+
- Verify all workers are online and responsive
|
|
110
|
+
- Establish communication channels
|
|
111
|
+
- Load previous session state if available
|
|
112
|
+
- Initialize shared memory space
|
|
113
|
+
|
|
114
|
+
2. **TASK DISTRIBUTION PHASE**
|
|
115
|
+
- Analyze the objective and decompose into subtasks
|
|
116
|
+
- Assign tasks based on worker specializations
|
|
117
|
+
- Set up task dependencies and ordering
|
|
118
|
+
- Monitor parallel execution
|
|
119
|
+
|
|
120
|
+
3. **COORDINATION PHASE**
|
|
121
|
+
- Use consensus for critical decisions
|
|
122
|
+
- Aggregate results from workers
|
|
123
|
+
- Resolve conflicts using ${consensusAlgorithm} consensus
|
|
124
|
+
- Share learnings across the hive
|
|
125
|
+
|
|
126
|
+
4. **COMPLETION PHASE**
|
|
127
|
+
- Verify all subtasks are complete
|
|
128
|
+
- Consolidate results
|
|
129
|
+
- Store learnings in collective memory
|
|
130
|
+
- Report final status
|
|
131
|
+
|
|
132
|
+
🎯 YOUR OBJECTIVE:
|
|
133
|
+
${objective}
|
|
134
|
+
|
|
135
|
+
⚠️ CRITICAL — TOOL PREFERENCE RULES (#1422):
|
|
136
|
+
• You MUST use Ruflo MCP tools (mcp__ruflo__*) for ALL orchestration tasks
|
|
137
|
+
• Do NOT use Claude native Task/Agent tools for swarm coordination — use mcp__ruflo__agent_spawn, mcp__ruflo__task_assign, etc.
|
|
138
|
+
• Native Claude tools (Read, Write, Edit, Bash, Grep, Glob) should ONLY be used for file operations and shell commands
|
|
139
|
+
• All agent spawning, task assignment, memory, and coordination MUST go through mcp__ruflo__* tools
|
|
140
|
+
• If a Ruflo MCP tool exists for an operation, always prefer it over any native equivalent
|
|
141
|
+
|
|
142
|
+
💡 COORDINATION TIPS:
|
|
143
|
+
• Use mcp__ruflo__hive-mind_broadcast for swarm-wide announcements
|
|
144
|
+
• Check worker status regularly with mcp__ruflo__hive-mind_status
|
|
145
|
+
• Store important decisions in shared memory for persistence
|
|
146
|
+
• Use consensus for any decisions affecting multiple workers
|
|
147
|
+
• Use mcp__ruflo__task_assign to assign tasks to workers, then mcp__ruflo__task_complete when done
|
|
148
|
+
|
|
149
|
+
🚀 BEGIN HIVE MIND COORDINATION NOW!
|
|
150
|
+
Start by checking the current hive status and then proceed with the objective.
|
|
151
151
|
`;
|
|
152
152
|
}
|
|
153
153
|
/**
|