claude-flow-novice 2.0.3 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/cli/commands/guidance.js +487 -668
- package/dist/src/cli/commands/index-validate.js +18 -29
- package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
- package/dist/src/cli/commands/neural-goal-init.js +92 -125
- package/dist/src/cli/commands/swarm-exec.js +317 -393
- package/dist/src/cli/commands/swarm.js +1 -1
- package/dist/src/cli/commands/validate-framework.js +983 -1100
- package/dist/src/cli/commands/validate.js +144 -223
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
- package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
- package/dist/src/cli/simple-commands/agent.js +157 -193
- package/dist/src/cli/simple-commands/analysis.js +336 -446
- package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
- package/dist/src/cli/simple-commands/automation.js +481 -469
- package/dist/src/cli/simple-commands/batch-manager.js +261 -313
- package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
- package/dist/src/cli/simple-commands/claude-track.js +68 -90
- package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
- package/dist/src/cli/simple-commands/config.js +245 -290
- package/dist/src/cli/simple-commands/coordination.js +182 -234
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
- package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
- package/dist/src/cli/simple-commands/github/github-api.js +535 -574
- package/dist/src/cli/simple-commands/github/init.js +276 -303
- package/dist/src/cli/simple-commands/github.js +222 -247
- package/dist/src/cli/simple-commands/goal.js +51 -63
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
- package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
- package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
- package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
- package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
- package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
- package/dist/src/cli/simple-commands/hive.js +90 -79
- package/dist/src/cli/simple-commands/hook-safety.js +431 -521
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
- package/dist/src/cli/simple-commands/hooks.js +1064 -1204
- package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
- package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
- package/dist/src/cli/simple-commands/init/help.js +104 -107
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
- package/dist/src/cli/simple-commands/init/index.js +1510 -1759
- package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
- package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
- package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
- package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
- package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
- package/dist/src/cli/simple-commands/init.js +1 -2
- package/dist/src/cli/simple-commands/mcp-health.js +131 -158
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
- package/dist/src/cli/simple-commands/mcp.js +345 -400
- package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
- package/dist/src/cli/simple-commands/memory.js +247 -311
- package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
- package/dist/src/cli/simple-commands/monitor.js +294 -363
- package/dist/src/cli/simple-commands/neural.js +51 -65
- package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
- package/dist/src/cli/simple-commands/pair-basic.js +528 -656
- package/dist/src/cli/simple-commands/pair-old.js +430 -543
- package/dist/src/cli/simple-commands/pair-working.js +615 -751
- package/dist/src/cli/simple-commands/pair.js +615 -751
- package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
- package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
- package/dist/src/cli/simple-commands/process-ui.js +230 -254
- package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
- package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
- package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
- package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
- package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
- package/dist/src/cli/simple-commands/sparc/index.js +241 -298
- package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
- package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
- package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +465 -493
- package/dist/src/cli/simple-commands/start-ui.js +108 -132
- package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +254 -275
- package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
- package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
- package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
- package/dist/src/cli/simple-commands/stream-chain.js +260 -318
- package/dist/src/cli/simple-commands/stream-processor.js +290 -315
- package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
- package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
- package/dist/src/cli/simple-commands/swarm.js +887 -1082
- package/dist/src/cli/simple-commands/task.js +161 -206
- package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
- package/dist/src/cli/simple-commands/token-tracker.js +258 -316
- package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
- package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
- package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
- package/dist/src/cli/simple-commands/training.js +170 -227
- package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
- package/dist/src/cli/simple-commands/verification-integration.js +389 -417
- package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
- package/dist/src/cli/simple-commands/verification.js +493 -513
- package/dist/src/cli/simple-commands/web-server.js +766 -836
- package/dist/src/cli/simple-commands/webui-validator.js +106 -124
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
- package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
- package/dist/src/coordination/iteration-tracker.js +363 -454
- package/dist/src/enterprise/analytics-manager.js +1135 -0
- package/dist/src/enterprise/audit-manager.js +1115 -0
- package/dist/src/enterprise/cloud-manager.js +891 -0
- package/dist/src/enterprise/deployment-manager.js +966 -0
- package/dist/src/enterprise/index.js +6 -0
- package/dist/src/enterprise/project-manager.js +584 -0
- package/dist/src/enterprise/security-manager.js +991 -0
- package/dist/src/index.js +1 -1
- package/dist/src/mcp/DEPRECATED.js +46 -60
- package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
- package/dist/src/mcp/implementations/agent-tracker.js +114 -128
- package/dist/src/mcp/implementations/daa-tools.js +292 -350
- package/dist/src/mcp/implementations/workflow-tools.js +329 -361
- package/dist/src/mcp/mcp-config-manager.js +1183 -1331
- package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
- package/dist/src/mcp/mcp-server-novice.js +11 -17
- package/dist/src/mcp/mcp-server-sdk.js +11 -17
- package/dist/src/mcp/mcp-server.js +1620 -1484
- package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
- package/dist/src/memory/advanced-serializer.js +609 -589
- package/dist/src/memory/enhanced-examples.js +220 -305
- package/dist/src/memory/enhanced-memory.js +295 -336
- package/dist/src/memory/enhanced-session-serializer.js +408 -492
- package/dist/src/memory/fallback-memory-system.js +900 -1021
- package/dist/src/memory/fallback-store.js +93 -131
- package/dist/src/memory/high-performance-serialization.js +592 -730
- package/dist/src/memory/in-memory-store.js +161 -213
- package/dist/src/memory/index.js +123 -157
- package/dist/src/memory/lock-free-structures.js +578 -764
- package/dist/src/memory/memory-mapped-persistence.js +585 -766
- package/dist/src/memory/memory-pressure-manager.js +569 -707
- package/dist/src/memory/migration.js +358 -445
- package/dist/src/memory/shared-memory.js +641 -768
- package/dist/src/memory/sqlite-store.js +245 -325
- package/dist/src/memory/sqlite-wrapper.js +122 -151
- package/dist/src/memory/swarm-memory.js +470 -603
- package/dist/src/memory/test-example.js +126 -134
- package/dist/src/memory/ultra-fast-memory-store.js +622 -821
- package/dist/src/memory/unified-memory-manager.js +356 -437
- package/dist/src/migration/index.js +92 -0
- package/dist/src/migration/logger.js +121 -0
- package/dist/src/migration/migration-analyzer.js +268 -0
- package/dist/src/migration/migration-runner.js +522 -0
- package/dist/src/migration/migration-validator.js +285 -0
- package/dist/src/migration/progress-reporter.js +150 -0
- package/dist/src/migration/rollback-manager.js +321 -0
- package/dist/src/migration/tests/migration-system.test.js +7 -0
- package/dist/src/migration/types.js +3 -0
- package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
- package/dist/src/swarm/__tests__/integration.test.js +227 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
- package/dist/src/swarm/advanced-orchestrator.js +1095 -0
- package/dist/src/swarm/claude-code-interface.js +961 -0
- package/dist/src/swarm/claude-flow-executor.js +229 -0
- package/dist/src/swarm/consensus-coordinator.js +475 -0
- package/dist/src/swarm/coordinator.js +2993 -0
- package/dist/src/swarm/direct-executor.js +1180 -0
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
- package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
- package/dist/src/swarm/executor-v2.js +322 -0
- package/dist/src/swarm/executor.js +815 -0
- package/dist/src/swarm/hive-mind-integration.js +703 -0
- package/dist/src/swarm/index.js +41 -0
- package/dist/src/swarm/json-output-aggregator.js +267 -0
- package/dist/src/swarm/large-scale-coordinator.js +542 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
- package/dist/src/swarm/memory.js +1117 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
- package/dist/src/swarm/optimizations/connection-pool.js +244 -0
- package/dist/src/swarm/optimizations/index.js +28 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
- package/dist/src/swarm/optimizations/ttl-map.js +234 -0
- package/dist/src/swarm/prompt-cli.js +200 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
- package/dist/src/swarm/prompt-copier.js +381 -0
- package/dist/src/swarm/prompt-manager.js +295 -0
- package/dist/src/swarm/prompt-utils.js +310 -0
- package/dist/src/swarm/result-aggregator.js +718 -0
- package/dist/src/swarm/sparc-executor.js +1568 -0
- package/dist/src/swarm/strategies/auto.js +758 -0
- package/dist/src/swarm/strategies/base.js +128 -0
- package/dist/src/swarm/strategies/research.js +914 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
- package/dist/src/swarm/types.js +52 -0
- package/dist/src/swarm/workers/copy-worker.js +56 -0
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
- package/dist/src/utils/github-cli-safe.js +56 -64
- package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
- package/dist/src/utils/npx-isolated-cache.js +104 -119
- package/dist/src/utils/preference-manager.js +622 -652
- package/dist/src/utils/timezone-utils.js +86 -105
- package/dist/src/validators/epic-config-schema.js +214 -0
- package/dist/src/validators/index.js +10 -0
- package/dist/src/validators/swarm-init-validator.js +259 -0
- package/dist/src/validators/todowrite-batching-validator.js +215 -0
- package/dist/src/validators/todowrite-integration.js +187 -0
- package/package.json +2 -2
|
@@ -0,0 +1,914 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optimized Research Strategy Implementation
|
|
3
|
+
* Provides intelligent research capabilities with parallel processing,
|
|
4
|
+
* semantic clustering, caching, and progressive refinement
|
|
5
|
+
*/ function _define_property(obj, key, value) {
|
|
6
|
+
if (key in obj) {
|
|
7
|
+
Object.defineProperty(obj, key, {
|
|
8
|
+
value: value,
|
|
9
|
+
enumerable: true,
|
|
10
|
+
configurable: true,
|
|
11
|
+
writable: true
|
|
12
|
+
});
|
|
13
|
+
} else {
|
|
14
|
+
obj[key] = value;
|
|
15
|
+
}
|
|
16
|
+
return obj;
|
|
17
|
+
}
|
|
18
|
+
import { BaseStrategy } from "./base.js";
|
|
19
|
+
import { Logger } from "../../core/logger.js";
|
|
20
|
+
import { generateId } from "../../utils/helpers.js";
|
|
21
|
+
import { SWARM_CONSTANTS } from "../types.js";
|
|
22
|
+
export class ResearchStrategy extends BaseStrategy {
|
|
23
|
+
async decomposeObjective(objective) {
|
|
24
|
+
this.logger.info('Decomposing research objective', {
|
|
25
|
+
objectiveId: objective.id,
|
|
26
|
+
description: objective.description
|
|
27
|
+
});
|
|
28
|
+
const tasks = [];
|
|
29
|
+
const dependencies = new Map();
|
|
30
|
+
// Extract research parameters from objective
|
|
31
|
+
const researchParams = this.extractResearchParameters(objective.description);
|
|
32
|
+
// Create research query planning task
|
|
33
|
+
const queryPlanningTask = this.createResearchTask('query-planning', 'research', 'Research Query Planning', `Analyze the research objective and create optimized search queries:
|
|
34
|
+
|
|
35
|
+
${objective.description}
|
|
36
|
+
|
|
37
|
+
Create a comprehensive research plan that includes:
|
|
38
|
+
1. Primary and secondary research questions
|
|
39
|
+
2. Key search terms and synonyms
|
|
40
|
+
3. Relevant domains and sources to explore
|
|
41
|
+
4. Research methodology and approach
|
|
42
|
+
5. Quality criteria for evaluating sources
|
|
43
|
+
|
|
44
|
+
Focus on creating queries that will yield high-quality, credible results.`, {
|
|
45
|
+
priority: 'high',
|
|
46
|
+
estimatedDuration: 5 * 60 * 1000,
|
|
47
|
+
requiredCapabilities: [
|
|
48
|
+
'research',
|
|
49
|
+
'analysis'
|
|
50
|
+
],
|
|
51
|
+
researchParams
|
|
52
|
+
});
|
|
53
|
+
tasks.push(queryPlanningTask);
|
|
54
|
+
// Create parallel web search tasks
|
|
55
|
+
const webSearchTask = this.createResearchTask('web-search', 'research', 'Parallel Web Search Execution', `Execute parallel web searches based on the research plan:
|
|
56
|
+
|
|
57
|
+
${objective.description}
|
|
58
|
+
|
|
59
|
+
Perform comprehensive web searches using:
|
|
60
|
+
1. Multiple search engines and sources
|
|
61
|
+
2. Parallel query execution for efficiency
|
|
62
|
+
3. Intelligent source ranking and filtering
|
|
63
|
+
4. Real-time credibility assessment
|
|
64
|
+
5. Deduplication of results
|
|
65
|
+
|
|
66
|
+
Collect diverse, high-quality sources relevant to the research objective.`, {
|
|
67
|
+
priority: 'high',
|
|
68
|
+
estimatedDuration: 10 * 60 * 1000,
|
|
69
|
+
requiredCapabilities: [
|
|
70
|
+
'web-search',
|
|
71
|
+
'research'
|
|
72
|
+
],
|
|
73
|
+
dependencies: [
|
|
74
|
+
queryPlanningTask.id.id
|
|
75
|
+
],
|
|
76
|
+
researchParams
|
|
77
|
+
});
|
|
78
|
+
tasks.push(webSearchTask);
|
|
79
|
+
dependencies.set(webSearchTask.id.id, [
|
|
80
|
+
queryPlanningTask.id.id
|
|
81
|
+
]);
|
|
82
|
+
// Create data extraction and processing task
|
|
83
|
+
const dataExtractionTask = this.createResearchTask('data-extraction', 'analysis', 'Parallel Data Extraction', `Extract and process data from collected sources:
|
|
84
|
+
|
|
85
|
+
${objective.description}
|
|
86
|
+
|
|
87
|
+
Process the collected sources by:
|
|
88
|
+
1. Extracting key information and insights
|
|
89
|
+
2. Performing semantic analysis and clustering
|
|
90
|
+
3. Identifying patterns and relationships
|
|
91
|
+
4. Assessing information quality and reliability
|
|
92
|
+
5. Creating structured summaries
|
|
93
|
+
|
|
94
|
+
Use parallel processing for efficient data extraction.`, {
|
|
95
|
+
priority: 'high',
|
|
96
|
+
estimatedDuration: 8 * 60 * 1000,
|
|
97
|
+
requiredCapabilities: [
|
|
98
|
+
'analysis',
|
|
99
|
+
'research'
|
|
100
|
+
],
|
|
101
|
+
dependencies: [
|
|
102
|
+
webSearchTask.id.id
|
|
103
|
+
],
|
|
104
|
+
researchParams
|
|
105
|
+
});
|
|
106
|
+
tasks.push(dataExtractionTask);
|
|
107
|
+
dependencies.set(dataExtractionTask.id.id, [
|
|
108
|
+
webSearchTask.id.id
|
|
109
|
+
]);
|
|
110
|
+
// Create semantic clustering task
|
|
111
|
+
const clusteringTask = this.createResearchTask('semantic-clustering', 'analysis', 'Semantic Clustering and Analysis', `Perform semantic clustering of research findings:
|
|
112
|
+
|
|
113
|
+
${objective.description}
|
|
114
|
+
|
|
115
|
+
Analyze the extracted data by:
|
|
116
|
+
1. Grouping related information using semantic similarity
|
|
117
|
+
2. Identifying key themes and topics
|
|
118
|
+
3. Creating coherent clusters of information
|
|
119
|
+
4. Generating cluster summaries and insights
|
|
120
|
+
5. Mapping relationships between clusters
|
|
121
|
+
|
|
122
|
+
Provide a structured analysis of the research findings.`, {
|
|
123
|
+
priority: 'medium',
|
|
124
|
+
estimatedDuration: 6 * 60 * 1000,
|
|
125
|
+
requiredCapabilities: [
|
|
126
|
+
'analysis',
|
|
127
|
+
'research'
|
|
128
|
+
],
|
|
129
|
+
dependencies: [
|
|
130
|
+
dataExtractionTask.id.id
|
|
131
|
+
],
|
|
132
|
+
researchParams
|
|
133
|
+
});
|
|
134
|
+
tasks.push(clusteringTask);
|
|
135
|
+
dependencies.set(clusteringTask.id.id, [
|
|
136
|
+
dataExtractionTask.id.id
|
|
137
|
+
]);
|
|
138
|
+
// Create synthesis and reporting task
|
|
139
|
+
const synthesisTask = this.createResearchTask('synthesis-reporting', 'documentation', 'Research Synthesis and Reporting', `Synthesize research findings into comprehensive report:
|
|
140
|
+
|
|
141
|
+
${objective.description}
|
|
142
|
+
|
|
143
|
+
Create a comprehensive research report that includes:
|
|
144
|
+
1. Executive summary of key findings
|
|
145
|
+
2. Detailed analysis of each research cluster
|
|
146
|
+
3. Insights and recommendations
|
|
147
|
+
4. Source credibility assessment
|
|
148
|
+
5. Methodology and limitations
|
|
149
|
+
6. References and citations
|
|
150
|
+
|
|
151
|
+
Ensure the report is well-structured and actionable.`, {
|
|
152
|
+
priority: 'medium',
|
|
153
|
+
estimatedDuration: 7 * 60 * 1000,
|
|
154
|
+
requiredCapabilities: [
|
|
155
|
+
'documentation',
|
|
156
|
+
'analysis'
|
|
157
|
+
],
|
|
158
|
+
dependencies: [
|
|
159
|
+
clusteringTask.id.id
|
|
160
|
+
],
|
|
161
|
+
researchParams
|
|
162
|
+
});
|
|
163
|
+
tasks.push(synthesisTask);
|
|
164
|
+
dependencies.set(synthesisTask.id.id, [
|
|
165
|
+
clusteringTask.id.id
|
|
166
|
+
]);
|
|
167
|
+
const totalDuration = tasks.reduce((sum, task)=>sum + (task.constraints.timeoutAfter || 0), 0);
|
|
168
|
+
this.logger.info('Research objective decomposed', {
|
|
169
|
+
objectiveId: objective.id,
|
|
170
|
+
taskCount: tasks.length,
|
|
171
|
+
estimatedDuration: totalDuration,
|
|
172
|
+
parallelTasks: tasks.filter((t)=>!dependencies.has(t.id.id)).length
|
|
173
|
+
});
|
|
174
|
+
return {
|
|
175
|
+
tasks,
|
|
176
|
+
dependencies,
|
|
177
|
+
estimatedDuration: totalDuration,
|
|
178
|
+
recommendedStrategy: 'research',
|
|
179
|
+
complexity: this.estimateComplexity(objective.description),
|
|
180
|
+
batchGroups: this.createTaskBatches(tasks, dependencies),
|
|
181
|
+
timestamp: new Date(),
|
|
182
|
+
ttl: 3600000,
|
|
183
|
+
accessCount: 0,
|
|
184
|
+
lastAccessed: new Date(),
|
|
185
|
+
data: {
|
|
186
|
+
objectiveId: objective.id,
|
|
187
|
+
description: objective.description
|
|
188
|
+
},
|
|
189
|
+
resourceRequirements: {
|
|
190
|
+
memory: SWARM_CONSTANTS.DEFAULT_MEMORY_LIMIT * 1.5,
|
|
191
|
+
cpu: SWARM_CONSTANTS.DEFAULT_CPU_LIMIT * 1.2,
|
|
192
|
+
network: 'high',
|
|
193
|
+
storage: 'medium'
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
// Research-specific optimizations for task execution
|
|
198
|
+
async optimizeTaskExecution(task, agent) {
|
|
199
|
+
const startTime = Date.now();
|
|
200
|
+
try {
|
|
201
|
+
// Apply research-specific optimizations based on task type
|
|
202
|
+
switch(task.type){
|
|
203
|
+
case 'research':
|
|
204
|
+
return await this.executeOptimizedWebSearch(task, agent);
|
|
205
|
+
case 'analysis':
|
|
206
|
+
return await this.executeOptimizedDataExtraction(task, agent);
|
|
207
|
+
default:
|
|
208
|
+
return await this.executeGenericResearchTask(task, agent);
|
|
209
|
+
}
|
|
210
|
+
} finally{
|
|
211
|
+
const duration = Date.now() - startTime;
|
|
212
|
+
this.updateResearchMetrics(task.type, duration);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
async executeOptimizedWebSearch(task, agent) {
|
|
216
|
+
this.logger.info('Executing optimized web search', {
|
|
217
|
+
taskId: task.id.id
|
|
218
|
+
});
|
|
219
|
+
// Check cache first
|
|
220
|
+
const cacheKey = this.generateCacheKey('web-search', task.description);
|
|
221
|
+
const cached = this.getFromCache(cacheKey);
|
|
222
|
+
if (cached) {
|
|
223
|
+
this.researchMetrics.cacheHits++;
|
|
224
|
+
return cached;
|
|
225
|
+
}
|
|
226
|
+
// Execute parallel web searches with rate limiting
|
|
227
|
+
const queries = this.generateSearchQueries(task.description);
|
|
228
|
+
const searchPromises = queries.map((query)=>this.executeRateLimitedSearch(query, agent));
|
|
229
|
+
const results = await Promise.allSettled(searchPromises);
|
|
230
|
+
const successfulResults = results.filter((r)=>r.status === 'fulfilled').map((r)=>r.value).flat();
|
|
231
|
+
// Rank and filter results by credibility
|
|
232
|
+
const rankedResults = await this.rankResultsByCredibility(successfulResults);
|
|
233
|
+
// Cache results
|
|
234
|
+
this.setCache(cacheKey, rankedResults, 3600000); // 1 hour TTL
|
|
235
|
+
this.researchMetrics.cacheMisses++;
|
|
236
|
+
return {
|
|
237
|
+
results: rankedResults,
|
|
238
|
+
totalFound: successfulResults.length,
|
|
239
|
+
queriesExecuted: queries.length,
|
|
240
|
+
credibilityScores: rankedResults.map((r)=>r.credibilityScore)
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
async executeOptimizedDataExtraction(task, agent) {
|
|
244
|
+
this.logger.info('Executing optimized data extraction', {
|
|
245
|
+
taskId: task.id.id
|
|
246
|
+
});
|
|
247
|
+
// Get connection from pool
|
|
248
|
+
const connection = await this.getPooledConnection();
|
|
249
|
+
try {
|
|
250
|
+
// Parallel data extraction with deduplication
|
|
251
|
+
const extractionPromises = this.createParallelExtractionTasks(task, agent);
|
|
252
|
+
const extractedData = await Promise.all(extractionPromises);
|
|
253
|
+
// Deduplicate results
|
|
254
|
+
const deduplicatedData = this.deduplicateResults(extractedData.flat());
|
|
255
|
+
return {
|
|
256
|
+
extractedData: deduplicatedData,
|
|
257
|
+
totalExtracted: extractedData.flat().length,
|
|
258
|
+
uniqueResults: deduplicatedData.length,
|
|
259
|
+
deduplicationRate: 1 - deduplicatedData.length / extractedData.flat().length
|
|
260
|
+
};
|
|
261
|
+
} finally{
|
|
262
|
+
this.releasePooledConnection(connection);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
async executeOptimizedClustering(task, agent) {
|
|
266
|
+
this.logger.info('Executing optimized semantic clustering', {
|
|
267
|
+
taskId: task.id.id
|
|
268
|
+
});
|
|
269
|
+
// Implement semantic clustering with caching
|
|
270
|
+
const data = task.input?.extractedData || [];
|
|
271
|
+
const cacheKey = this.generateCacheKey('clustering', JSON.stringify(data));
|
|
272
|
+
const cached = this.getFromCache(cacheKey);
|
|
273
|
+
if (cached) {
|
|
274
|
+
return cached;
|
|
275
|
+
}
|
|
276
|
+
// Perform semantic clustering
|
|
277
|
+
const clusters = await this.performSemanticClustering(data);
|
|
278
|
+
// Cache clustering results
|
|
279
|
+
this.setCache(cacheKey, clusters, 7200000); // 2 hours TTL
|
|
280
|
+
return {
|
|
281
|
+
clusters,
|
|
282
|
+
clusterCount: clusters.length,
|
|
283
|
+
averageClusterSize: clusters.reduce((sum, c)=>sum + c.results.length, 0) / clusters.length,
|
|
284
|
+
coherenceScore: clusters.reduce((sum, c)=>sum + c.coherenceScore, 0) / clusters.length
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
async executeGenericResearchTask(task, agent) {
|
|
288
|
+
this.logger.info('Executing generic research task', {
|
|
289
|
+
taskId: task.id.id
|
|
290
|
+
});
|
|
291
|
+
// Apply general research optimizations
|
|
292
|
+
return {
|
|
293
|
+
status: 'completed',
|
|
294
|
+
optimizations: [
|
|
295
|
+
'caching',
|
|
296
|
+
'rate-limiting',
|
|
297
|
+
'connection-pooling'
|
|
298
|
+
],
|
|
299
|
+
executionTime: Date.now()
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
// Helper methods for research optimizations
|
|
303
|
+
extractResearchParameters(description) {
|
|
304
|
+
return {
|
|
305
|
+
domains: this.extractDomains(description),
|
|
306
|
+
keywords: this.extractKeywords(description),
|
|
307
|
+
timeframe: this.extractTimeframe(description),
|
|
308
|
+
sourceTypes: this.extractSourceTypes(description)
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
extractDomains(description) {
|
|
312
|
+
// Extract relevant domains from description
|
|
313
|
+
const domains = [];
|
|
314
|
+
if (description.includes('academic') || description.includes('research')) domains.push('academic');
|
|
315
|
+
if (description.includes('news') || description.includes('current')) domains.push('news');
|
|
316
|
+
if (description.includes('technical') || description.includes('documentation')) domains.push('technical');
|
|
317
|
+
return domains.length > 0 ? domains : [
|
|
318
|
+
'general'
|
|
319
|
+
];
|
|
320
|
+
}
|
|
321
|
+
extractKeywords(description) {
|
|
322
|
+
// Simple keyword extraction - in production, use NLP
|
|
323
|
+
return description.toLowerCase().split(/\s+/).filter((word)=>word.length > 3).slice(0, 10);
|
|
324
|
+
}
|
|
325
|
+
extractTimeframe(description) {
|
|
326
|
+
// Extract time-related constraints
|
|
327
|
+
const now = new Date();
|
|
328
|
+
return {
|
|
329
|
+
start: new Date(now.getTime() - 365 * 24 * 60 * 60 * 1000),
|
|
330
|
+
end: now
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
extractSourceTypes(description) {
|
|
334
|
+
return [
|
|
335
|
+
'academic',
|
|
336
|
+
'news',
|
|
337
|
+
'documentation',
|
|
338
|
+
'blog'
|
|
339
|
+
];
|
|
340
|
+
}
|
|
341
|
+
generateSearchQueries(description) {
|
|
342
|
+
const baseQuery = description.substring(0, 100);
|
|
343
|
+
const keywords = this.extractKeywords(description);
|
|
344
|
+
return [
|
|
345
|
+
{
|
|
346
|
+
id: generateId('query'),
|
|
347
|
+
query: baseQuery,
|
|
348
|
+
keywords: keywords.slice(0, 5),
|
|
349
|
+
domains: [
|
|
350
|
+
'general'
|
|
351
|
+
],
|
|
352
|
+
priority: 1,
|
|
353
|
+
timestamp: new Date()
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
id: generateId('query'),
|
|
357
|
+
query: `${baseQuery} research study`,
|
|
358
|
+
keywords: [
|
|
359
|
+
...keywords.slice(0, 3),
|
|
360
|
+
'research',
|
|
361
|
+
'study'
|
|
362
|
+
],
|
|
363
|
+
domains: [
|
|
364
|
+
'academic'
|
|
365
|
+
],
|
|
366
|
+
priority: 2,
|
|
367
|
+
timestamp: new Date()
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
id: generateId('query'),
|
|
371
|
+
query: `${baseQuery} best practices`,
|
|
372
|
+
keywords: [
|
|
373
|
+
...keywords.slice(0, 3),
|
|
374
|
+
'best',
|
|
375
|
+
'practices'
|
|
376
|
+
],
|
|
377
|
+
domains: [
|
|
378
|
+
'technical'
|
|
379
|
+
],
|
|
380
|
+
priority: 2,
|
|
381
|
+
timestamp: new Date()
|
|
382
|
+
}
|
|
383
|
+
];
|
|
384
|
+
}
|
|
385
|
+
async executeRateLimitedSearch(query, agent) {
|
|
386
|
+
const domain = query.domains[0] || 'general';
|
|
387
|
+
// Check rate limits
|
|
388
|
+
if (!this.checkRateLimit(domain)) {
|
|
389
|
+
await this.waitForRateLimit(domain);
|
|
390
|
+
}
|
|
391
|
+
// Simulate web search with retry logic
|
|
392
|
+
let attempts = 0;
|
|
393
|
+
const maxAttempts = 3;
|
|
394
|
+
while(attempts < maxAttempts){
|
|
395
|
+
try {
|
|
396
|
+
// Simulate search execution
|
|
397
|
+
const results = await this.simulateWebSearch(query);
|
|
398
|
+
this.updateRateLimit(domain);
|
|
399
|
+
return results;
|
|
400
|
+
} catch (error) {
|
|
401
|
+
attempts++;
|
|
402
|
+
if (attempts >= maxAttempts) throw error;
|
|
403
|
+
await this.exponentialBackoff(attempts);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return [];
|
|
407
|
+
}
|
|
408
|
+
async simulateWebSearch(query) {
|
|
409
|
+
// Simulate web search results
|
|
410
|
+
const resultCount = Math.floor(Math.random() * 10) + 5;
|
|
411
|
+
const results = [];
|
|
412
|
+
for(let i = 0; i < resultCount; i++){
|
|
413
|
+
results.push({
|
|
414
|
+
id: generateId('result'),
|
|
415
|
+
queryId: query.id,
|
|
416
|
+
url: `https://example.com/result-${i}`,
|
|
417
|
+
title: `Research Result ${i} for ${query.query}`,
|
|
418
|
+
content: `Content for ${query.query} - result ${i}`,
|
|
419
|
+
summary: `Summary of result ${i}`,
|
|
420
|
+
credibilityScore: Math.random() * 0.4 + 0.6,
|
|
421
|
+
relevanceScore: Math.random() * 0.3 + 0.7,
|
|
422
|
+
sourceType: query.domains[0] || 'general',
|
|
423
|
+
extractedAt: new Date(),
|
|
424
|
+
metadata: {
|
|
425
|
+
queryKeywords: query.keywords
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
return results;
|
|
430
|
+
}
|
|
431
|
+
async rankResultsByCredibility(results) {
|
|
432
|
+
// Sort by combined credibility and relevance score
|
|
433
|
+
return results.sort((a, b)=>{
|
|
434
|
+
const scoreA = a.credibilityScore * 0.6 + a.relevanceScore * 0.4;
|
|
435
|
+
const scoreB = b.credibilityScore * 0.6 + b.relevanceScore * 0.4;
|
|
436
|
+
return scoreB - scoreA;
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
createParallelExtractionTasks(task, agent) {
|
|
440
|
+
// Create parallel extraction tasks
|
|
441
|
+
const results = task.input?.results || [];
|
|
442
|
+
const batchSize = Math.ceil(results.length / this.connectionPool.max);
|
|
443
|
+
const batches = [];
|
|
444
|
+
for(let i = 0; i < results.length; i += batchSize){
|
|
445
|
+
const batch = results.slice(i, i + batchSize);
|
|
446
|
+
batches.push(this.extractDataFromBatch(batch));
|
|
447
|
+
}
|
|
448
|
+
return batches;
|
|
449
|
+
}
|
|
450
|
+
async extractDataFromBatch(batch) {
|
|
451
|
+
// Simulate parallel data extraction
|
|
452
|
+
return batch.map((result)=>({
|
|
453
|
+
id: result.id,
|
|
454
|
+
extractedData: `Extracted data from ${result.title}`,
|
|
455
|
+
insights: [
|
|
456
|
+
`Insight 1 from ${result.title}`,
|
|
457
|
+
`Insight 2 from ${result.title}`
|
|
458
|
+
],
|
|
459
|
+
metadata: result.metadata
|
|
460
|
+
}));
|
|
461
|
+
}
|
|
462
|
+
deduplicateResults(results) {
|
|
463
|
+
const seen = new Set();
|
|
464
|
+
return results.filter((result)=>{
|
|
465
|
+
const key = result.extractedData || result.id;
|
|
466
|
+
if (seen.has(key)) return false;
|
|
467
|
+
seen.add(key);
|
|
468
|
+
return true;
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
async performSemanticClustering(data) {
|
|
472
|
+
// Simulate semantic clustering
|
|
473
|
+
const clusterCount = Math.min(Math.ceil(data.length / 5), 10);
|
|
474
|
+
const clusters = [];
|
|
475
|
+
for(let i = 0; i < clusterCount; i++){
|
|
476
|
+
const clusterData = data.slice(i * 5, (i + 1) * 5);
|
|
477
|
+
clusters.push({
|
|
478
|
+
id: generateId('cluster'),
|
|
479
|
+
topic: `Research Topic ${i + 1}`,
|
|
480
|
+
results: clusterData,
|
|
481
|
+
centroid: Array(10).fill(0).map(()=>Math.random()),
|
|
482
|
+
coherenceScore: Math.random() * 0.3 + 0.7,
|
|
483
|
+
keywords: [
|
|
484
|
+
`keyword${i}1`,
|
|
485
|
+
`keyword${i}2`
|
|
486
|
+
],
|
|
487
|
+
summary: `Summary of cluster ${i + 1}`
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
return clusters;
|
|
491
|
+
}
|
|
492
|
+
// Connection pooling methods
|
|
493
|
+
async getPooledConnection() {
|
|
494
|
+
if (this.connectionPool.active >= this.connectionPool.max) {
|
|
495
|
+
await this.waitForConnection();
|
|
496
|
+
}
|
|
497
|
+
this.connectionPool.active++;
|
|
498
|
+
return {
|
|
499
|
+
id: generateId('connection'),
|
|
500
|
+
timestamp: new Date()
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
releasePooledConnection(connection) {
|
|
504
|
+
this.connectionPool.active--;
|
|
505
|
+
this.connectionPool.idle++;
|
|
506
|
+
}
|
|
507
|
+
async waitForConnection() {
|
|
508
|
+
return new Promise((resolve)=>{
|
|
509
|
+
const checkConnection = ()=>{
|
|
510
|
+
if (this.connectionPool.active < this.connectionPool.max) {
|
|
511
|
+
resolve();
|
|
512
|
+
} else {
|
|
513
|
+
setTimeout(checkConnection, 100);
|
|
514
|
+
}
|
|
515
|
+
};
|
|
516
|
+
checkConnection();
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
// Rate limiting methods
|
|
520
|
+
checkRateLimit(domain) {
|
|
521
|
+
const limiter = this.rateLimiters.get(domain);
|
|
522
|
+
if (!limiter) {
|
|
523
|
+
this.rateLimiters.set(domain, {
|
|
524
|
+
requests: 0,
|
|
525
|
+
windowStart: new Date(),
|
|
526
|
+
windowSize: 60000,
|
|
527
|
+
maxRequests: 10,
|
|
528
|
+
backoffMultiplier: 1
|
|
529
|
+
});
|
|
530
|
+
return true;
|
|
531
|
+
}
|
|
532
|
+
const now = new Date();
|
|
533
|
+
if (now.getTime() - limiter.windowStart.getTime() > limiter.windowSize) {
|
|
534
|
+
limiter.requests = 0;
|
|
535
|
+
limiter.windowStart = now;
|
|
536
|
+
}
|
|
537
|
+
return limiter.requests < limiter.maxRequests;
|
|
538
|
+
}
|
|
539
|
+
updateRateLimit(domain) {
|
|
540
|
+
const limiter = this.rateLimiters.get(domain);
|
|
541
|
+
if (limiter) {
|
|
542
|
+
limiter.requests++;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
async waitForRateLimit(domain) {
|
|
546
|
+
const limiter = this.rateLimiters.get(domain);
|
|
547
|
+
if (!limiter) return;
|
|
548
|
+
const waitTime = limiter.windowSize * limiter.backoffMultiplier;
|
|
549
|
+
await new Promise((resolve)=>setTimeout(resolve, waitTime));
|
|
550
|
+
}
|
|
551
|
+
async exponentialBackoff(attempt) {
|
|
552
|
+
const delay = Math.pow(2, attempt) * 1000;
|
|
553
|
+
await new Promise((resolve)=>setTimeout(resolve, delay));
|
|
554
|
+
}
|
|
555
|
+
// Caching methods
|
|
556
|
+
generateCacheKey(type, data) {
|
|
557
|
+
return `${type}:${Buffer.from(data).toString('base64').substring(0, 32)}`;
|
|
558
|
+
}
|
|
559
|
+
getFromCache(key) {
|
|
560
|
+
const entry = this.researchCache.get(key);
|
|
561
|
+
if (!entry) return null;
|
|
562
|
+
const now = new Date();
|
|
563
|
+
if (now.getTime() - entry.timestamp.getTime() > entry.ttl) {
|
|
564
|
+
this.researchCache.delete(key);
|
|
565
|
+
return null;
|
|
566
|
+
}
|
|
567
|
+
entry.accessCount++;
|
|
568
|
+
entry.lastAccessed = now;
|
|
569
|
+
return entry.data;
|
|
570
|
+
}
|
|
571
|
+
setCache(key, data, ttl) {
|
|
572
|
+
this.researchCache.set(key, {
|
|
573
|
+
key,
|
|
574
|
+
data,
|
|
575
|
+
timestamp: new Date(),
|
|
576
|
+
ttl,
|
|
577
|
+
accessCount: 0,
|
|
578
|
+
lastAccessed: new Date()
|
|
579
|
+
});
|
|
580
|
+
// Cleanup old entries if cache is too large
|
|
581
|
+
if (this.researchCache.size > 1000) {
|
|
582
|
+
this.cleanupCache();
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
cleanupCache() {
|
|
586
|
+
const entries = Array.from(this.researchCache.entries());
|
|
587
|
+
entries.sort((a, b)=>a[1].lastAccessed.getTime() - b[1].lastAccessed.getTime());
|
|
588
|
+
// Remove oldest 20% of entries
|
|
589
|
+
const toRemove = Math.floor(entries.length * 0.2);
|
|
590
|
+
for(let i = 0; i < toRemove; i++){
|
|
591
|
+
this.researchCache.delete(entries[i][0]);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
createResearchTask(id, type, name, instructions, options = {}) {
|
|
595
|
+
const taskId = {
|
|
596
|
+
id: generateId('task'),
|
|
597
|
+
swarmId: 'research-swarm',
|
|
598
|
+
sequence: 1,
|
|
599
|
+
priority: 1
|
|
600
|
+
};
|
|
601
|
+
return {
|
|
602
|
+
id: taskId,
|
|
603
|
+
type,
|
|
604
|
+
name,
|
|
605
|
+
description: instructions,
|
|
606
|
+
instructions,
|
|
607
|
+
requirements: {
|
|
608
|
+
capabilities: options.requiredCapabilities || [
|
|
609
|
+
'research'
|
|
610
|
+
],
|
|
611
|
+
tools: [
|
|
612
|
+
'WebFetchTool',
|
|
613
|
+
'WebSearch'
|
|
614
|
+
],
|
|
615
|
+
permissions: [
|
|
616
|
+
'read',
|
|
617
|
+
'write'
|
|
618
|
+
]
|
|
619
|
+
},
|
|
620
|
+
constraints: {
|
|
621
|
+
dependencies: options.dependencies || [],
|
|
622
|
+
dependents: [],
|
|
623
|
+
conflicts: [],
|
|
624
|
+
maxRetries: 3,
|
|
625
|
+
timeoutAfter: options.estimatedDuration || 300000
|
|
626
|
+
},
|
|
627
|
+
priority: options.priority || 'medium',
|
|
628
|
+
input: options.researchParams || {},
|
|
629
|
+
context: {},
|
|
630
|
+
examples: [],
|
|
631
|
+
status: 'created',
|
|
632
|
+
createdAt: new Date(),
|
|
633
|
+
updatedAt: new Date(),
|
|
634
|
+
attempts: [],
|
|
635
|
+
statusHistory: [
|
|
636
|
+
{
|
|
637
|
+
timestamp: new Date(),
|
|
638
|
+
from: 'created',
|
|
639
|
+
to: 'created',
|
|
640
|
+
reason: 'Task created',
|
|
641
|
+
triggeredBy: 'system'
|
|
642
|
+
}
|
|
643
|
+
]
|
|
644
|
+
};
|
|
645
|
+
}
|
|
646
|
+
updateResearchMetrics(taskType, duration) {
|
|
647
|
+
this.researchMetrics.queriesExecuted++;
|
|
648
|
+
this.researchMetrics.averageResponseTime = (this.researchMetrics.averageResponseTime + duration) / 2;
|
|
649
|
+
}
|
|
650
|
+
createTaskBatches(tasks, dependencies) {
|
|
651
|
+
const batches = [];
|
|
652
|
+
const processed = new Set();
|
|
653
|
+
let batchIndex = 0;
|
|
654
|
+
while(processed.size < tasks.length){
|
|
655
|
+
const batchTasks = tasks.filter((task)=>!processed.has(task.id.id) && task.constraints.dependencies.every((dep)=>processed.has(dep.id)));
|
|
656
|
+
if (batchTasks.length === 0) break; // Prevent infinite loop
|
|
657
|
+
const batch = {
|
|
658
|
+
id: `research-batch-${batchIndex++}`,
|
|
659
|
+
tasks: batchTasks,
|
|
660
|
+
canRunInParallel: batchTasks.length > 1,
|
|
661
|
+
estimatedDuration: Math.max(...batchTasks.map((t)=>t.constraints.timeoutAfter || 0)),
|
|
662
|
+
requiredResources: {
|
|
663
|
+
agents: batchTasks.length,
|
|
664
|
+
memory: batchTasks.length * 512,
|
|
665
|
+
cpu: batchTasks.length * 0.5
|
|
666
|
+
}
|
|
667
|
+
};
|
|
668
|
+
batches.push(batch);
|
|
669
|
+
batchTasks.forEach((task)=>processed.add(task.id.id));
|
|
670
|
+
}
|
|
671
|
+
return batches;
|
|
672
|
+
}
|
|
673
|
+
// Public API for metrics
|
|
674
|
+
getMetrics() {
|
|
675
|
+
const credibilityScoresRecord = {};
|
|
676
|
+
this.researchMetrics.credibilityScores.forEach((score, index)=>{
|
|
677
|
+
credibilityScoresRecord[`result_${index}`] = score;
|
|
678
|
+
});
|
|
679
|
+
return {
|
|
680
|
+
...this.metrics,
|
|
681
|
+
queriesExecuted: this.researchMetrics.queriesExecuted,
|
|
682
|
+
averageResponseTime: this.researchMetrics.averageResponseTime,
|
|
683
|
+
cacheHits: this.researchMetrics.cacheHits,
|
|
684
|
+
cacheMisses: this.researchMetrics.cacheMisses,
|
|
685
|
+
credibilityScores: credibilityScoresRecord,
|
|
686
|
+
cacheHitRate: this.researchMetrics.cacheHits / (this.researchMetrics.cacheHits + this.researchMetrics.cacheMisses || 1),
|
|
687
|
+
averageCredibilityScore: this.researchMetrics.credibilityScores.length > 0 ? this.researchMetrics.credibilityScores.reduce((a, b)=>a + b, 0) / this.researchMetrics.credibilityScores.length : 0,
|
|
688
|
+
connectionPoolUtilization: this.connectionPool.active / this.connectionPool.max,
|
|
689
|
+
cacheSize: this.researchCache.size
|
|
690
|
+
};
|
|
691
|
+
}
|
|
692
|
+
// Progressive refinement methods
|
|
693
|
+
async refineResearchScope(objective, intermediateResults) {
|
|
694
|
+
this.logger.info('Refining research scope based on intermediate results', {
|
|
695
|
+
objectiveId: objective.id,
|
|
696
|
+
resultsCount: intermediateResults.length
|
|
697
|
+
});
|
|
698
|
+
// Analyze intermediate results to refine scope
|
|
699
|
+
const refinedObjective = {
|
|
700
|
+
...objective
|
|
701
|
+
};
|
|
702
|
+
// Update requirements based on findings
|
|
703
|
+
if (intermediateResults.length > 0) {
|
|
704
|
+
const avgCredibility = intermediateResults.map((r)=>r.credibilityScore || 0.5).reduce((a, b)=>a + b, 0) / intermediateResults.length;
|
|
705
|
+
if (avgCredibility < 0.7) {
|
|
706
|
+
refinedObjective.requirements.qualityThreshold = Math.max(refinedObjective.requirements.qualityThreshold, 0.8);
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
return refinedObjective;
|
|
710
|
+
}
|
|
711
|
+
// Implementation of abstract methods from BaseStrategy
|
|
712
|
+
async selectAgentForTask(task, availableAgents) {
|
|
713
|
+
if (availableAgents.length === 0) return null;
|
|
714
|
+
// Research-specific agent selection logic
|
|
715
|
+
let bestAgent = null;
|
|
716
|
+
let bestScore = 0;
|
|
717
|
+
for (const agent of availableAgents){
|
|
718
|
+
let score = 0;
|
|
719
|
+
// Check for research capabilities
|
|
720
|
+
if (agent.capabilities?.research) score += 0.4;
|
|
721
|
+
if (agent.capabilities?.webSearch) score += 0.3;
|
|
722
|
+
if (agent.capabilities?.analysis) score += 0.2;
|
|
723
|
+
// Check for specific research task types
|
|
724
|
+
if (task.type === 'research' && agent.type === 'researcher') score += 0.3;
|
|
725
|
+
if (task.type === 'analysis' && agent.type === 'analyst') score += 0.3;
|
|
726
|
+
if (task.type === 'research' && agent.capabilities?.webSearch) score += 0.4;
|
|
727
|
+
// Consider current workload
|
|
728
|
+
score *= 1 - (agent.workload || 0);
|
|
729
|
+
if (score > bestScore) {
|
|
730
|
+
bestScore = score;
|
|
731
|
+
bestAgent = agent;
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
return bestAgent?.id?.id || null;
|
|
735
|
+
}
|
|
736
|
+
async optimizeTaskSchedule(tasks, agents) {
|
|
737
|
+
const allocations = [];
|
|
738
|
+
// Group tasks by type for optimal allocation
|
|
739
|
+
const researchTasks = tasks.filter((t)=>t.type === 'research');
|
|
740
|
+
const analysisTasks = tasks.filter((t)=>t.type === 'analysis');
|
|
741
|
+
const otherTasks = tasks.filter((t)=>![
|
|
742
|
+
'research',
|
|
743
|
+
'analysis'
|
|
744
|
+
].includes(t.type));
|
|
745
|
+
for (const agent of agents){
|
|
746
|
+
const allocation = {
|
|
747
|
+
agentId: agent.id?.id || agent.id,
|
|
748
|
+
tasks: [],
|
|
749
|
+
estimatedWorkload: 0,
|
|
750
|
+
capabilities: this.getAgentCapabilitiesList(agent)
|
|
751
|
+
};
|
|
752
|
+
// Allocate tasks based on agent capabilities
|
|
753
|
+
if (agent.type === 'researcher' && researchTasks.length > 0) {
|
|
754
|
+
const task = researchTasks.shift();
|
|
755
|
+
if (task) {
|
|
756
|
+
allocation.tasks.push(task.id.id);
|
|
757
|
+
allocation.estimatedWorkload += 0.3;
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
if (agent.type === 'analyst' && analysisTasks.length > 0) {
|
|
761
|
+
const task = analysisTasks.shift();
|
|
762
|
+
if (task) {
|
|
763
|
+
allocation.tasks.push(task.id.id);
|
|
764
|
+
allocation.estimatedWorkload += 0.3;
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
// Web search tasks are handled as research tasks
|
|
768
|
+
// Allocate remaining tasks
|
|
769
|
+
if (allocation.tasks.length === 0 && otherTasks.length > 0) {
|
|
770
|
+
const task = otherTasks.shift();
|
|
771
|
+
if (task) {
|
|
772
|
+
allocation.tasks.push(task.id.id);
|
|
773
|
+
allocation.estimatedWorkload += 0.2;
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
if (allocation.tasks.length > 0) {
|
|
777
|
+
allocations.push(allocation);
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
return allocations;
|
|
781
|
+
}
|
|
782
|
+
getAgentCapabilitiesList(agent) {
|
|
783
|
+
const caps = [];
|
|
784
|
+
if (agent.capabilities) {
|
|
785
|
+
if (agent.capabilities.research) caps.push('research');
|
|
786
|
+
if (agent.capabilities.webSearch) caps.push('web-search');
|
|
787
|
+
if (agent.capabilities.analysis) caps.push('analysis');
|
|
788
|
+
if (agent.capabilities.codeGeneration) caps.push('code-generation');
|
|
789
|
+
if (agent.capabilities.documentation) caps.push('documentation');
|
|
790
|
+
}
|
|
791
|
+
return caps;
|
|
792
|
+
}
|
|
793
|
+
constructor(config = {}){
|
|
794
|
+
const defaultConfig = {
|
|
795
|
+
name: 'research-strategy',
|
|
796
|
+
description: 'Research-focused strategy',
|
|
797
|
+
version: '1.0.0',
|
|
798
|
+
mode: 'mesh',
|
|
799
|
+
strategy: 'research',
|
|
800
|
+
coordinationStrategy: {
|
|
801
|
+
name: 'research-coordination',
|
|
802
|
+
description: 'Research-optimized coordination',
|
|
803
|
+
agentSelection: 'capability-based',
|
|
804
|
+
taskScheduling: 'priority',
|
|
805
|
+
loadBalancing: 'work-sharing',
|
|
806
|
+
faultTolerance: 'retry',
|
|
807
|
+
communication: 'direct'
|
|
808
|
+
},
|
|
809
|
+
maxAgents: 8,
|
|
810
|
+
maxTasks: 50,
|
|
811
|
+
maxDuration: 3600000,
|
|
812
|
+
resourceLimits: {},
|
|
813
|
+
qualityThreshold: 0.8,
|
|
814
|
+
reviewRequired: true,
|
|
815
|
+
testingRequired: false,
|
|
816
|
+
monitoring: {
|
|
817
|
+
metricsEnabled: true,
|
|
818
|
+
loggingEnabled: true,
|
|
819
|
+
tracingEnabled: false,
|
|
820
|
+
metricsInterval: 5000,
|
|
821
|
+
heartbeatInterval: 10000,
|
|
822
|
+
healthCheckInterval: 30000,
|
|
823
|
+
retentionPeriod: 86400000,
|
|
824
|
+
maxLogSize: 1048576,
|
|
825
|
+
maxMetricPoints: 1000,
|
|
826
|
+
alertingEnabled: false,
|
|
827
|
+
alertThresholds: {},
|
|
828
|
+
exportEnabled: false,
|
|
829
|
+
exportFormat: 'json',
|
|
830
|
+
exportDestination: 'file'
|
|
831
|
+
},
|
|
832
|
+
memory: {
|
|
833
|
+
namespace: 'research',
|
|
834
|
+
partitions: [],
|
|
835
|
+
permissions: {
|
|
836
|
+
read: 'swarm',
|
|
837
|
+
write: 'swarm',
|
|
838
|
+
delete: 'team',
|
|
839
|
+
share: 'swarm'
|
|
840
|
+
},
|
|
841
|
+
persistent: true,
|
|
842
|
+
backupEnabled: false,
|
|
843
|
+
distributed: false,
|
|
844
|
+
consistency: 'eventual',
|
|
845
|
+
cacheEnabled: true,
|
|
846
|
+
compressionEnabled: false
|
|
847
|
+
},
|
|
848
|
+
security: {
|
|
849
|
+
authenticationRequired: false,
|
|
850
|
+
authorizationRequired: false,
|
|
851
|
+
encryptionEnabled: false,
|
|
852
|
+
defaultPermissions: [
|
|
853
|
+
'read',
|
|
854
|
+
'write'
|
|
855
|
+
],
|
|
856
|
+
adminRoles: [
|
|
857
|
+
'admin'
|
|
858
|
+
],
|
|
859
|
+
auditEnabled: false,
|
|
860
|
+
auditLevel: 'info',
|
|
861
|
+
inputValidation: true,
|
|
862
|
+
outputSanitization: true
|
|
863
|
+
},
|
|
864
|
+
performance: {
|
|
865
|
+
maxConcurrency: 10,
|
|
866
|
+
defaultTimeout: 300000,
|
|
867
|
+
cacheEnabled: true,
|
|
868
|
+
cacheSize: 100,
|
|
869
|
+
cacheTtl: 3600000,
|
|
870
|
+
optimizationEnabled: true,
|
|
871
|
+
adaptiveScheduling: true,
|
|
872
|
+
predictiveLoading: false,
|
|
873
|
+
resourcePooling: true,
|
|
874
|
+
connectionPooling: true,
|
|
875
|
+
memoryPooling: false
|
|
876
|
+
}
|
|
877
|
+
};
|
|
878
|
+
const mergedConfig = {
|
|
879
|
+
...defaultConfig,
|
|
880
|
+
...config
|
|
881
|
+
};
|
|
882
|
+
super(mergedConfig), _define_property(this, "logger", void 0), _define_property(this, "researchCache", new Map()), _define_property(this, "connectionPool", void 0), _define_property(this, "rateLimiters", new Map()), _define_property(this, "semanticModel", void 0 // Placeholder for semantic analysis
|
|
883
|
+
), _define_property(this, "researchQueries", new Map()), _define_property(this, "researchResults", new Map()), _define_property(this, "researchClusters", new Map()), // Research-specific metrics extending base metrics
|
|
884
|
+
_define_property(this, "researchMetrics", {
|
|
885
|
+
queriesExecuted: 0,
|
|
886
|
+
resultsCollected: 0,
|
|
887
|
+
cacheHits: 0,
|
|
888
|
+
cacheMisses: 0,
|
|
889
|
+
averageResponseTime: 0,
|
|
890
|
+
credibilityScores: [],
|
|
891
|
+
clusteringAccuracy: 0,
|
|
892
|
+
parallelEfficiency: 0
|
|
893
|
+
});
|
|
894
|
+
this.logger = new Logger({
|
|
895
|
+
level: 'info',
|
|
896
|
+
format: 'text',
|
|
897
|
+
destination: 'console'
|
|
898
|
+
}, {
|
|
899
|
+
component: 'ResearchStrategy'
|
|
900
|
+
});
|
|
901
|
+
// Initialize connection pool
|
|
902
|
+
this.connectionPool = {
|
|
903
|
+
active: 0,
|
|
904
|
+
idle: 0,
|
|
905
|
+
max: config.performance?.maxConcurrency || 10,
|
|
906
|
+
timeout: 30000,
|
|
907
|
+
connections: new Map()
|
|
908
|
+
};
|
|
909
|
+
this.logger.info('ResearchStrategy initialized with optimizations', {
|
|
910
|
+
maxConcurrency: this.connectionPool.max,
|
|
911
|
+
cacheEnabled: config.performance?.cacheEnabled !== false
|
|
912
|
+
});
|
|
913
|
+
}
|
|
914
|
+
}
|