agentic-flow 2.0.7 → 2.0.9
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/settings.json +133 -9
- package/.claude/skills/agentic-flow-quickstart/skill.md +69 -0
- package/.claude/skills/hooks-automation/skill.md +155 -0
- package/.claude/skills/memory-patterns/skill.md +110 -0
- package/.claude/skills/sparc-methodology/skill.md +137 -0
- package/.claude/skills/swarm-coordination/skill.md +94 -0
- package/.claude/skills/worker-benchmarks/skill.md +135 -0
- package/.claude/skills/worker-integration/skill.md +154 -0
- package/.claude/statusline.mjs +109 -0
- package/.claude/statusline.sh +71 -0
- package/README.md +1797 -624
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentdb/index.d.ts +2 -0
- package/dist/agentdb/index.d.ts.map +1 -1
- package/dist/agentdb/index.js +5 -0
- package/dist/agentdb/index.js.map +1 -1
- package/dist/agentdb/prerequisites.d.ts +25 -0
- package/dist/agentdb/prerequisites.d.ts.map +1 -0
- package/dist/agentdb/prerequisites.js +180 -0
- package/dist/agentdb/prerequisites.js.map +1 -0
- package/dist/benchmarks/embeddings-benchmark.d.ts +38 -0
- package/dist/benchmarks/embeddings-benchmark.d.ts.map +1 -0
- package/dist/benchmarks/embeddings-benchmark.js +282 -0
- package/dist/benchmarks/embeddings-benchmark.js.map +1 -0
- package/dist/billing/mcp/tools.js +1 -0
- package/dist/billing/mcp/tools.js.map +1 -1
- package/dist/cli/commands/embeddings.d.ts +12 -0
- package/dist/cli/commands/embeddings.d.ts.map +1 -0
- package/dist/cli/commands/embeddings.js +386 -0
- package/dist/cli/commands/embeddings.js.map +1 -0
- package/dist/cli/commands/hooks.d.ts.map +1 -1
- package/dist/cli/commands/hooks.js +79 -4
- package/dist/cli/commands/hooks.js.map +1 -1
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +514 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/workers.d.ts +9 -0
- package/dist/cli/commands/workers.d.ts.map +1 -0
- package/dist/cli/commands/workers.js +991 -0
- package/dist/cli/commands/workers.js.map +1 -0
- package/dist/cli/config-wizard.d.ts.map +1 -1
- package/dist/cli/config-wizard.js +47 -25
- package/dist/cli/config-wizard.js.map +1 -1
- package/dist/cli-proxy.js +89 -1
- package/dist/cli-proxy.js.map +1 -1
- package/dist/core/agentdb-fast.js +3 -3
- package/dist/core/agentdb-fast.js.map +1 -1
- package/dist/core/agentdb-wrapper-enhanced.d.ts.map +1 -1
- package/dist/core/agentdb-wrapper-enhanced.js +37 -11
- package/dist/core/agentdb-wrapper-enhanced.js.map +1 -1
- package/dist/core/agentdb-wrapper.d.ts +3 -2
- package/dist/core/agentdb-wrapper.d.ts.map +1 -1
- package/dist/core/agentdb-wrapper.js +15 -1
- package/dist/core/agentdb-wrapper.js.map +1 -1
- package/dist/core/attention-native.d.ts +4 -0
- package/dist/core/attention-native.d.ts.map +1 -1
- package/dist/core/attention-native.js +14 -2
- package/dist/core/attention-native.js.map +1 -1
- package/dist/core/gnn-wrapper.d.ts.map +1 -1
- package/dist/core/gnn-wrapper.js +14 -0
- package/dist/core/gnn-wrapper.js.map +1 -1
- package/dist/embeddings/index.d.ts +17 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +17 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/neural-substrate.d.ts +206 -0
- package/dist/embeddings/neural-substrate.d.ts.map +1 -0
- package/dist/embeddings/neural-substrate.js +629 -0
- package/dist/embeddings/neural-substrate.js.map +1 -0
- package/dist/embeddings/optimized-embedder.d.ts +103 -0
- package/dist/embeddings/optimized-embedder.d.ts.map +1 -0
- package/dist/embeddings/optimized-embedder.js +730 -0
- package/dist/embeddings/optimized-embedder.js.map +1 -0
- package/dist/examples/embedding-geometry.d.ts +105 -0
- package/dist/examples/embedding-geometry.d.ts.map +1 -0
- package/dist/examples/embedding-geometry.js +528 -0
- package/dist/examples/embedding-geometry.js.map +1 -0
- package/dist/federation/SecurityManager.d.ts +11 -2
- package/dist/federation/SecurityManager.d.ts.map +1 -1
- package/dist/federation/SecurityManager.js +50 -17
- package/dist/federation/SecurityManager.js.map +1 -1
- package/dist/federation/integrations/supabase-adapter-debug.js +3 -3
- package/dist/federation/integrations/supabase-adapter-debug.js.map +1 -1
- package/dist/hooks/swarm-learning-optimizer.js +5 -5
- package/dist/hooks/swarm-learning-optimizer.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +89 -51
- package/dist/index.js.map +1 -1
- package/dist/intelligence/IntelligenceStore.d.ts +35 -26
- package/dist/intelligence/IntelligenceStore.d.ts.map +1 -1
- package/dist/intelligence/IntelligenceStore.js +308 -123
- package/dist/intelligence/IntelligenceStore.js.map +1 -1
- package/dist/intelligence/RuVectorIntelligence.d.ts +26 -1
- package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -1
- package/dist/intelligence/RuVectorIntelligence.js +49 -10
- package/dist/intelligence/RuVectorIntelligence.js.map +1 -1
- package/dist/intelligence/agent-booster-enhanced.d.ts +1 -0
- package/dist/intelligence/agent-booster-enhanced.d.ts.map +1 -1
- package/dist/intelligence/agent-booster-enhanced.js +24 -3
- package/dist/intelligence/agent-booster-enhanced.js.map +1 -1
- package/dist/intelligence/index.d.ts +29 -3
- package/dist/intelligence/index.d.ts.map +1 -1
- package/dist/intelligence/index.js +13 -3
- package/dist/intelligence/index.js.map +1 -1
- package/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
- package/dist/mcp/claudeFlowSdkServer.js +162 -115
- package/dist/mcp/claudeFlowSdkServer.js.map +1 -1
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +5 -5
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/init.d.ts.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/init.js +36 -7
- package/dist/mcp/fastmcp/tools/swarm/init.js.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/spawn.d.ts.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/spawn.js +47 -8
- package/dist/mcp/fastmcp/tools/swarm/spawn.js.map +1 -1
- package/dist/mcp/tools/agent-booster-tools.d.ts +15 -1
- package/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -1
- package/dist/mcp/tools/agent-booster-tools.js +79 -63
- package/dist/mcp/tools/agent-booster-tools.js.map +1 -1
- package/dist/mcp/tools/sona-tools.d.ts.map +1 -1
- package/dist/mcp/tools/sona-tools.js +6 -0
- package/dist/mcp/tools/sona-tools.js.map +1 -1
- package/dist/memory/SharedMemoryPool.d.ts +103 -0
- package/dist/memory/SharedMemoryPool.d.ts.map +1 -0
- package/dist/memory/SharedMemoryPool.js +263 -0
- package/dist/memory/SharedMemoryPool.js.map +1 -0
- package/dist/optimizations/agent-booster-migration.d.ts +2 -1
- package/dist/optimizations/agent-booster-migration.d.ts.map +1 -1
- package/dist/optimizations/agent-booster-migration.js +69 -45
- package/dist/optimizations/agent-booster-migration.js.map +1 -1
- package/dist/orchestration/index.d.ts +11 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +10 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/memory-plane-types.d.ts +23 -0
- package/dist/orchestration/memory-plane-types.d.ts.map +1 -0
- package/dist/orchestration/memory-plane-types.js +5 -0
- package/dist/orchestration/memory-plane-types.js.map +1 -0
- package/dist/orchestration/memory-plane.d.ts +41 -0
- package/dist/orchestration/memory-plane.d.ts.map +1 -0
- package/dist/orchestration/memory-plane.js +84 -0
- package/dist/orchestration/memory-plane.js.map +1 -0
- package/dist/orchestration/orchestration-client.d.ts +104 -0
- package/dist/orchestration/orchestration-client.d.ts.map +1 -0
- package/dist/orchestration/orchestration-client.js +94 -0
- package/dist/orchestration/orchestration-client.js.map +1 -0
- package/dist/orchestration/orchestration-runtime.d.ts +26 -0
- package/dist/orchestration/orchestration-runtime.d.ts.map +1 -0
- package/dist/orchestration/orchestration-runtime.js +78 -0
- package/dist/orchestration/orchestration-runtime.js.map +1 -0
- package/dist/orchestration/orchestration-types.d.ts +124 -0
- package/dist/orchestration/orchestration-types.d.ts.map +1 -0
- package/dist/orchestration/orchestration-types.js +7 -0
- package/dist/orchestration/orchestration-types.js.map +1 -0
- package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
- package/dist/proxy/anthropic-to-requesty.js.map +1 -1
- package/dist/proxy/quic-proxy.d.ts +0 -1
- package/dist/proxy/quic-proxy.d.ts.map +1 -1
- package/dist/proxy/quic-proxy.js +2 -2
- package/dist/proxy/quic-proxy.js.map +1 -1
- package/dist/reasoningbank/AdvancedMemory.js +1 -1
- package/dist/reasoningbank/AdvancedMemory.js.map +1 -1
- package/dist/reasoningbank/HybridBackend.d.ts.map +1 -1
- package/dist/reasoningbank/HybridBackend.js +2 -5
- package/dist/reasoningbank/HybridBackend.js.map +1 -1
- package/dist/reasoningbank/backend-selector.d.ts +11 -1
- package/dist/reasoningbank/backend-selector.d.ts.map +1 -1
- package/dist/reasoningbank/backend-selector.js +45 -5
- package/dist/reasoningbank/backend-selector.js.map +1 -1
- package/dist/reasoningbank/core/consolidate.d.ts.map +1 -1
- package/dist/reasoningbank/core/consolidate.js +113 -45
- package/dist/reasoningbank/core/consolidate.js.map +1 -1
- package/dist/reasoningbank/index-new.d.ts +1 -6
- package/dist/reasoningbank/index-new.d.ts.map +1 -1
- package/dist/reasoningbank/index-new.js +1 -6
- package/dist/reasoningbank/index-new.js.map +1 -1
- package/dist/reasoningbank/index.d.ts +6 -0
- package/dist/reasoningbank/index.d.ts.map +1 -1
- package/dist/reasoningbank/index.js +6 -13
- package/dist/reasoningbank/index.js.map +1 -1
- package/dist/reasoningbank/utils/embeddings.d.ts +1 -0
- package/dist/reasoningbank/utils/embeddings.d.ts.map +1 -1
- package/dist/reasoningbank/utils/embeddings.js +53 -26
- package/dist/reasoningbank/utils/embeddings.js.map +1 -1
- package/dist/router/index.d.ts +2 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +1 -0
- package/dist/router/index.js.map +1 -1
- package/dist/router/providers/ollama.d.ts +20 -0
- package/dist/router/providers/ollama.d.ts.map +1 -0
- package/dist/router/providers/ollama.js +242 -0
- package/dist/router/providers/ollama.js.map +1 -0
- package/dist/router/providers/onnx-local-optimized.d.ts +2 -0
- package/dist/router/providers/onnx-local-optimized.d.ts.map +1 -1
- package/dist/router/providers/onnx-local-optimized.js +10 -0
- package/dist/router/providers/onnx-local-optimized.js.map +1 -1
- package/dist/router/providers/onnx-local.d.ts +1 -0
- package/dist/router/providers/onnx-local.d.ts.map +1 -1
- package/dist/router/providers/onnx-local.js +22 -5
- package/dist/router/providers/onnx-local.js.map +1 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +39 -23
- package/dist/router/router.js.map +1 -1
- package/dist/sdk/index.d.ts +2 -1
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +3 -1
- package/dist/sdk/index.js.map +1 -1
- package/dist/services/embedding-service.js.map +1 -1
- package/dist/services/sona-agent-training.d.ts +1 -0
- package/dist/services/sona-agent-training.d.ts.map +1 -1
- package/dist/services/sona-agent-training.js.map +1 -1
- package/dist/services/sona-agentdb-integration.d.ts.map +1 -1
- package/dist/services/sona-agentdb-integration.js +9 -6
- package/dist/services/sona-agentdb-integration.js.map +1 -1
- package/dist/services/sona-service.d.ts.map +1 -1
- package/dist/services/sona-service.js +6 -5
- package/dist/services/sona-service.js.map +1 -1
- package/dist/utils/cli.d.ts +1 -1
- package/dist/utils/cli.d.ts.map +1 -1
- package/dist/utils/cli.js +21 -0
- package/dist/utils/cli.js.map +1 -1
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/model-cache.d.ts +61 -0
- package/dist/utils/model-cache.d.ts.map +1 -0
- package/dist/utils/model-cache.js +176 -0
- package/dist/utils/model-cache.js.map +1 -0
- package/dist/utils/suppress-warnings.d.ts +19 -0
- package/dist/utils/suppress-warnings.d.ts.map +1 -0
- package/dist/utils/suppress-warnings.js +59 -0
- package/dist/utils/suppress-warnings.js.map +1 -0
- package/dist/workers/consolidated-phases.d.ts +40 -0
- package/dist/workers/consolidated-phases.d.ts.map +1 -0
- package/dist/workers/consolidated-phases.js +497 -0
- package/dist/workers/consolidated-phases.js.map +1 -0
- package/dist/workers/custom-worker-config.d.ts +133 -0
- package/dist/workers/custom-worker-config.d.ts.map +1 -0
- package/dist/workers/custom-worker-config.js +215 -0
- package/dist/workers/custom-worker-config.js.map +1 -0
- package/dist/workers/custom-worker-factory.d.ts +89 -0
- package/dist/workers/custom-worker-factory.d.ts.map +1 -0
- package/dist/workers/custom-worker-factory.js +404 -0
- package/dist/workers/custom-worker-factory.js.map +1 -0
- package/dist/workers/dispatch-service.d.ts +123 -0
- package/dist/workers/dispatch-service.d.ts.map +1 -0
- package/dist/workers/dispatch-service.js +1024 -0
- package/dist/workers/dispatch-service.js.map +1 -0
- package/dist/workers/hooks-integration.d.ts +79 -0
- package/dist/workers/hooks-integration.d.ts.map +1 -0
- package/dist/workers/hooks-integration.js +286 -0
- package/dist/workers/hooks-integration.js.map +1 -0
- package/dist/workers/index.d.ts +42 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/workers/index.js +52 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/mcp-tools.d.ts +56 -0
- package/dist/workers/mcp-tools.d.ts.map +1 -0
- package/dist/workers/mcp-tools.js +359 -0
- package/dist/workers/mcp-tools.js.map +1 -0
- package/dist/workers/phase-executors.d.ts +22 -0
- package/dist/workers/phase-executors.d.ts.map +1 -0
- package/dist/workers/phase-executors.js +445 -0
- package/dist/workers/phase-executors.js.map +1 -0
- package/dist/workers/resource-governor.d.ts +75 -0
- package/dist/workers/resource-governor.d.ts.map +1 -0
- package/dist/workers/resource-governor.js +187 -0
- package/dist/workers/resource-governor.js.map +1 -0
- package/dist/workers/ruvector-integration.d.ts +163 -0
- package/dist/workers/ruvector-integration.d.ts.map +1 -0
- package/dist/workers/ruvector-integration.js +543 -0
- package/dist/workers/ruvector-integration.js.map +1 -0
- package/dist/workers/ruvector-native-integration.d.ts +91 -0
- package/dist/workers/ruvector-native-integration.d.ts.map +1 -0
- package/dist/workers/ruvector-native-integration.js +254 -0
- package/dist/workers/ruvector-native-integration.js.map +1 -0
- package/dist/workers/trigger-detector.d.ts +68 -0
- package/dist/workers/trigger-detector.d.ts.map +1 -0
- package/dist/workers/trigger-detector.js +281 -0
- package/dist/workers/trigger-detector.js.map +1 -0
- package/dist/workers/types.d.ts +145 -0
- package/dist/workers/types.d.ts.map +1 -0
- package/dist/workers/types.js +6 -0
- package/dist/workers/types.js.map +1 -0
- package/dist/workers/worker-agent-integration.d.ts +140 -0
- package/dist/workers/worker-agent-integration.d.ts.map +1 -0
- package/dist/workers/worker-agent-integration.js +471 -0
- package/dist/workers/worker-agent-integration.js.map +1 -0
- package/dist/workers/worker-benchmarks.d.ts +88 -0
- package/dist/workers/worker-benchmarks.d.ts.map +1 -0
- package/dist/workers/worker-benchmarks.js +452 -0
- package/dist/workers/worker-benchmarks.js.map +1 -0
- package/dist/workers/worker-registry.d.ts +85 -0
- package/dist/workers/worker-registry.d.ts.map +1 -0
- package/dist/workers/worker-registry.js +547 -0
- package/dist/workers/worker-registry.js.map +1 -0
- package/docs/embeddings/EMBEDDING_GEOMETRY.md +935 -0
- package/package.json +27 -9
- package/scripts/postinstall.js +45 -4
- package/wasm/reasoningbank/reasoningbank_wasm.js +1 -1
- package/wasm/reasoningbank/reasoningbank_wasm_bg.js +54 -54
- package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm +0 -0
- package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm.d.ts +4 -3
- package/.claude/agents/test-neural.md +0 -14
- /package/.claude/agents/analysis/{code-review/analyze-code-quality.md → analyze-code-quality.md} +0 -0
- /package/.claude/agents/architecture/{system-design/arch-system-design.md → arch-system-design.md} +0 -0
- /package/.claude/agents/data/{ml/data-ml-model.md → data-ml-model.md} +0 -0
- /package/.claude/agents/development/{backend/dev-backend-api.md → dev-backend-api.md} +0 -0
- /package/.claude/agents/devops/{ci-cd/ops-cicd-github.md → ops-cicd-github.md} +0 -0
- /package/.claude/agents/documentation/{api-docs/docs-api-openapi.md → docs-api-openapi.md} +0 -0
- /package/.claude/agents/specialized/{mobile/spec-mobile-react-native.md → spec-mobile-react-native.md} +0 -0
- /package/.claude/agents/testing/{validation/production-validator.md → production-validator.md} +0 -0
- /package/.claude/agents/testing/{unit/tdd-london-swarm.md → tdd-london-swarm.md} +0 -0
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Worker Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates worker implementations from CustomWorkerDefinition configs.
|
|
5
|
+
* Handles loading config files, validating definitions, and registering
|
|
6
|
+
* custom workers with the dispatch service.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'fs/promises';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
11
|
+
import { validateWorkerDefinition, WORKER_PRESETS, DEFAULT_CAPABILITIES, DEFAULT_FILE_FILTER, DEFAULT_OUTPUT } from './custom-worker-config.js';
|
|
12
|
+
import { executePhasePipeline } from './phase-executors.js';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Factory Functions
|
|
15
|
+
// ============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Create a worker instance from a definition
|
|
18
|
+
*/
|
|
19
|
+
export function createCustomWorker(definition, globalSettings) {
|
|
20
|
+
// Validate definition
|
|
21
|
+
const validation = validateWorkerDefinition(definition);
|
|
22
|
+
if (!validation.valid) {
|
|
23
|
+
throw new Error(`Invalid worker definition: ${validation.errors.join(', ')}`);
|
|
24
|
+
}
|
|
25
|
+
// Merge capabilities
|
|
26
|
+
const capabilities = {
|
|
27
|
+
...DEFAULT_CAPABILITIES,
|
|
28
|
+
...globalSettings?.defaultCapabilities,
|
|
29
|
+
...definition.capabilities
|
|
30
|
+
};
|
|
31
|
+
// Merge file filter
|
|
32
|
+
const fileFilter = {
|
|
33
|
+
...DEFAULT_FILE_FILTER,
|
|
34
|
+
...globalSettings?.defaultFileFilter,
|
|
35
|
+
...definition.fileFilter
|
|
36
|
+
};
|
|
37
|
+
// Merge output config
|
|
38
|
+
const output = {
|
|
39
|
+
...DEFAULT_OUTPUT,
|
|
40
|
+
...globalSettings?.defaultOutput,
|
|
41
|
+
...definition.output
|
|
42
|
+
};
|
|
43
|
+
// Create executor
|
|
44
|
+
const execute = async (context) => {
|
|
45
|
+
const startTime = Date.now();
|
|
46
|
+
try {
|
|
47
|
+
// Execute phase pipeline
|
|
48
|
+
const result = await executePhasePipeline(context, definition.phases, (phase, progress) => {
|
|
49
|
+
// Progress callback for real-time updates
|
|
50
|
+
if (capabilities.progressEvents) {
|
|
51
|
+
console.log(`[${definition.name}] Phase: ${phase} (${progress}%)`);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
// Build results
|
|
55
|
+
const completedCount = Array.from(result.results.values()).filter(r => r?.success).length;
|
|
56
|
+
const results = {
|
|
57
|
+
status: result.success ? 'complete' : 'failed',
|
|
58
|
+
success: result.success,
|
|
59
|
+
completedPhases: completedCount,
|
|
60
|
+
totalPhases: definition.phases.length,
|
|
61
|
+
memoryKeys: [],
|
|
62
|
+
duration: Date.now() - startTime,
|
|
63
|
+
data: buildResultsData(result.phaseContext, result.results, output)
|
|
64
|
+
};
|
|
65
|
+
// Handle learning capabilities
|
|
66
|
+
if (capabilities.sonaLearning && result.phaseContext.patterns.length > 0) {
|
|
67
|
+
results.data.sonaTrainingTriggered = true;
|
|
68
|
+
}
|
|
69
|
+
if (capabilities.vectorDb && result.phaseContext.patterns.length > 0) {
|
|
70
|
+
results.data.vectorDbUpdated = true;
|
|
71
|
+
}
|
|
72
|
+
// Add timing
|
|
73
|
+
results.data.executionTimeMs = Date.now() - startTime;
|
|
74
|
+
results.data.phasesExecuted = definition.phases.length;
|
|
75
|
+
// Add errors if any
|
|
76
|
+
if (result.errors.length > 0) {
|
|
77
|
+
results.data.errors = result.errors;
|
|
78
|
+
}
|
|
79
|
+
return results;
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
return {
|
|
83
|
+
status: 'failed',
|
|
84
|
+
success: false,
|
|
85
|
+
completedPhases: 0,
|
|
86
|
+
totalPhases: definition.phases.length,
|
|
87
|
+
memoryKeys: [],
|
|
88
|
+
duration: Date.now() - startTime,
|
|
89
|
+
error: error instanceof Error ? error.message : 'Worker execution failed',
|
|
90
|
+
data: {
|
|
91
|
+
error: error instanceof Error ? error.message : 'Worker execution failed',
|
|
92
|
+
executionTimeMs: Date.now() - startTime
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
return {
|
|
98
|
+
definition,
|
|
99
|
+
capabilities,
|
|
100
|
+
fileFilter,
|
|
101
|
+
output,
|
|
102
|
+
execute
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Build results data from phase context
|
|
107
|
+
*/
|
|
108
|
+
function buildResultsData(phaseContext, phaseResults, outputConfig) {
|
|
109
|
+
const data = {
|
|
110
|
+
files_analyzed: phaseContext.files.length,
|
|
111
|
+
patterns_found: phaseContext.patterns.length,
|
|
112
|
+
bytes_processed: phaseContext.bytes
|
|
113
|
+
};
|
|
114
|
+
// Add samples if configured
|
|
115
|
+
if (outputConfig.includeSamples) {
|
|
116
|
+
const maxSamples = outputConfig.maxSamples || 10;
|
|
117
|
+
data.sample_patterns = phaseContext.patterns.slice(0, maxSamples);
|
|
118
|
+
}
|
|
119
|
+
// Add file list if configured
|
|
120
|
+
if (outputConfig.includeFileList) {
|
|
121
|
+
data.files = phaseContext.files;
|
|
122
|
+
}
|
|
123
|
+
// Add metrics if configured
|
|
124
|
+
if (outputConfig.includeMetrics) {
|
|
125
|
+
data.metrics = phaseContext.metrics;
|
|
126
|
+
}
|
|
127
|
+
// Add phase-specific data
|
|
128
|
+
const phaseData = {};
|
|
129
|
+
for (const [phase, result] of phaseResults) {
|
|
130
|
+
if (result?.data) {
|
|
131
|
+
phaseData[phase] = result.data;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
data.phaseResults = phaseData;
|
|
135
|
+
return data;
|
|
136
|
+
}
|
|
137
|
+
// ============================================================================
|
|
138
|
+
// Create from Preset
|
|
139
|
+
// ============================================================================
|
|
140
|
+
/**
|
|
141
|
+
* Create a worker from a preset
|
|
142
|
+
*/
|
|
143
|
+
export function createFromPreset(presetName, overrides) {
|
|
144
|
+
const preset = WORKER_PRESETS[presetName];
|
|
145
|
+
if (!preset) {
|
|
146
|
+
throw new Error(`Unknown preset: ${presetName}. Available: ${Object.keys(WORKER_PRESETS).join(', ')}`);
|
|
147
|
+
}
|
|
148
|
+
const definition = {
|
|
149
|
+
name: overrides?.name || presetName,
|
|
150
|
+
description: preset.description || `Worker from ${presetName} preset`,
|
|
151
|
+
triggers: overrides?.triggers || [presetName],
|
|
152
|
+
priority: preset.priority || 'medium',
|
|
153
|
+
timeout: preset.timeout || 120000,
|
|
154
|
+
phases: overrides?.phases || preset.phases || [],
|
|
155
|
+
capabilities: { ...preset.capabilities, ...overrides?.capabilities },
|
|
156
|
+
fileFilter: { ...preset.fileFilter, ...overrides?.fileFilter },
|
|
157
|
+
output: { ...preset.output, ...overrides?.output },
|
|
158
|
+
...overrides
|
|
159
|
+
};
|
|
160
|
+
return createCustomWorker(definition);
|
|
161
|
+
}
|
|
162
|
+
// ============================================================================
|
|
163
|
+
// Config File Loading
|
|
164
|
+
// ============================================================================
|
|
165
|
+
const CONFIG_FILENAMES = [
|
|
166
|
+
'workers.yaml',
|
|
167
|
+
'workers.yml',
|
|
168
|
+
'workers.json',
|
|
169
|
+
'.agentic-flow/workers.yaml',
|
|
170
|
+
'.agentic-flow/workers.yml',
|
|
171
|
+
'.agentic-flow/workers.json'
|
|
172
|
+
];
|
|
173
|
+
/**
|
|
174
|
+
* Load workers from a config file
|
|
175
|
+
*/
|
|
176
|
+
export async function loadWorkersFromConfig(configPath) {
|
|
177
|
+
let content;
|
|
178
|
+
let actualPath;
|
|
179
|
+
if (configPath) {
|
|
180
|
+
actualPath = path.isAbsolute(configPath) ? configPath : path.join(process.cwd(), configPath);
|
|
181
|
+
try {
|
|
182
|
+
content = await fs.readFile(actualPath, 'utf-8');
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
throw new Error(`Failed to read config file: ${actualPath}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// Search for config file
|
|
190
|
+
for (const filename of CONFIG_FILENAMES) {
|
|
191
|
+
const tryPath = path.join(process.cwd(), filename);
|
|
192
|
+
try {
|
|
193
|
+
content = await fs.readFile(tryPath, 'utf-8');
|
|
194
|
+
actualPath = tryPath;
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (!content) {
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Parse config
|
|
206
|
+
let config;
|
|
207
|
+
if (actualPath.endsWith('.json')) {
|
|
208
|
+
config = JSON.parse(content);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
config = parseYaml(content);
|
|
212
|
+
}
|
|
213
|
+
// Validate version
|
|
214
|
+
if (config.version !== '1.0') {
|
|
215
|
+
console.warn(`Unknown config version: ${config.version}. Expected 1.0`);
|
|
216
|
+
}
|
|
217
|
+
// Create workers
|
|
218
|
+
const workers = [];
|
|
219
|
+
for (const def of config.workers) {
|
|
220
|
+
try {
|
|
221
|
+
const worker = createCustomWorker(def, config.settings);
|
|
222
|
+
workers.push(worker);
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
console.error(`Failed to create worker "${def.name}": ${error}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return workers;
|
|
229
|
+
}
|
|
230
|
+
// ============================================================================
|
|
231
|
+
// Worker Registry Integration
|
|
232
|
+
// ============================================================================
|
|
233
|
+
export class CustomWorkerManager {
|
|
234
|
+
workers = new Map();
|
|
235
|
+
triggerMap = new Map(); // trigger -> worker name
|
|
236
|
+
/**
|
|
237
|
+
* Register a custom worker
|
|
238
|
+
*/
|
|
239
|
+
register(worker) {
|
|
240
|
+
const name = worker.definition.name;
|
|
241
|
+
this.workers.set(name, worker);
|
|
242
|
+
// Register triggers
|
|
243
|
+
this.triggerMap.set(name, name);
|
|
244
|
+
for (const trigger of worker.definition.triggers || []) {
|
|
245
|
+
this.triggerMap.set(trigger.toLowerCase(), name);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Create and register from preset
|
|
250
|
+
*/
|
|
251
|
+
registerPreset(presetName, overrides) {
|
|
252
|
+
const worker = createFromPreset(presetName, overrides);
|
|
253
|
+
this.register(worker);
|
|
254
|
+
return worker;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Create and register from definition
|
|
258
|
+
*/
|
|
259
|
+
registerDefinition(definition) {
|
|
260
|
+
const worker = createCustomWorker(definition);
|
|
261
|
+
this.register(worker);
|
|
262
|
+
return worker;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Load and register from config file
|
|
266
|
+
*/
|
|
267
|
+
async loadFromConfig(configPath) {
|
|
268
|
+
const workers = await loadWorkersFromConfig(configPath);
|
|
269
|
+
workers.forEach(w => this.register(w));
|
|
270
|
+
return workers.length;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Get worker by name or trigger
|
|
274
|
+
*/
|
|
275
|
+
get(nameOrTrigger) {
|
|
276
|
+
const key = nameOrTrigger.toLowerCase();
|
|
277
|
+
const name = this.triggerMap.get(key);
|
|
278
|
+
return name ? this.workers.get(name) : undefined;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Check if a trigger matches a custom worker
|
|
282
|
+
*/
|
|
283
|
+
matchesTrigger(input) {
|
|
284
|
+
const lower = input.toLowerCase();
|
|
285
|
+
for (const [trigger, name] of this.triggerMap) {
|
|
286
|
+
if (lower.includes(trigger)) {
|
|
287
|
+
return name;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return undefined;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* List all registered workers
|
|
294
|
+
*/
|
|
295
|
+
list() {
|
|
296
|
+
return Array.from(this.workers.values());
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* List available presets
|
|
300
|
+
*/
|
|
301
|
+
listPresets() {
|
|
302
|
+
return Object.keys(WORKER_PRESETS);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get preset definition
|
|
306
|
+
*/
|
|
307
|
+
getPreset(name) {
|
|
308
|
+
return WORKER_PRESETS[name];
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Execute a custom worker
|
|
312
|
+
*/
|
|
313
|
+
async execute(nameOrTrigger, context) {
|
|
314
|
+
const worker = this.get(nameOrTrigger);
|
|
315
|
+
if (!worker) {
|
|
316
|
+
return {
|
|
317
|
+
status: 'failed',
|
|
318
|
+
success: false,
|
|
319
|
+
completedPhases: 0,
|
|
320
|
+
totalPhases: 0,
|
|
321
|
+
memoryKeys: [],
|
|
322
|
+
duration: 0,
|
|
323
|
+
error: `Custom worker not found: ${nameOrTrigger}`,
|
|
324
|
+
data: { error: `Custom worker not found: ${nameOrTrigger}` }
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
return worker.execute(context);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Generate example config file
|
|
331
|
+
*/
|
|
332
|
+
generateExampleConfig() {
|
|
333
|
+
const example = {
|
|
334
|
+
version: '1.0',
|
|
335
|
+
workers: [
|
|
336
|
+
{
|
|
337
|
+
name: 'my-scanner',
|
|
338
|
+
description: 'Custom code scanner',
|
|
339
|
+
triggers: ['scan-my'],
|
|
340
|
+
priority: 'medium',
|
|
341
|
+
timeout: 120000,
|
|
342
|
+
phases: [
|
|
343
|
+
{ type: 'file-discovery' },
|
|
344
|
+
{ type: 'pattern-extraction' },
|
|
345
|
+
{ type: 'security-analysis' },
|
|
346
|
+
{ type: 'summarization' }
|
|
347
|
+
],
|
|
348
|
+
capabilities: {
|
|
349
|
+
onnxEmbeddings: true,
|
|
350
|
+
vectorDb: true
|
|
351
|
+
},
|
|
352
|
+
output: {
|
|
353
|
+
format: 'detailed',
|
|
354
|
+
includeSamples: true
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
],
|
|
358
|
+
settings: {
|
|
359
|
+
defaultCapabilities: {
|
|
360
|
+
progressEvents: true
|
|
361
|
+
},
|
|
362
|
+
maxConcurrent: 3,
|
|
363
|
+
debug: false
|
|
364
|
+
}
|
|
365
|
+
};
|
|
366
|
+
return `# Custom Workers Configuration
|
|
367
|
+
# Save as workers.yaml or .agentic-flow/workers.yaml
|
|
368
|
+
|
|
369
|
+
${stringifyYaml(example)}`;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
// Singleton instance
|
|
373
|
+
export const customWorkerManager = new CustomWorkerManager();
|
|
374
|
+
// ============================================================================
|
|
375
|
+
// CLI Helper Functions
|
|
376
|
+
// ============================================================================
|
|
377
|
+
export function formatWorkerInfo(worker) {
|
|
378
|
+
const def = worker.definition;
|
|
379
|
+
const lines = [
|
|
380
|
+
`Name: ${def.name}`,
|
|
381
|
+
`Description: ${def.description}`,
|
|
382
|
+
`Triggers: ${[def.name, ...(def.triggers || [])].join(', ')}`,
|
|
383
|
+
`Priority: ${def.priority || 'medium'}`,
|
|
384
|
+
`Timeout: ${(def.timeout || 120000) / 1000}s`,
|
|
385
|
+
`Phases: ${def.phases.map(p => p.type).join(' → ')}`,
|
|
386
|
+
'',
|
|
387
|
+
'Capabilities:',
|
|
388
|
+
...Object.entries(worker.capabilities)
|
|
389
|
+
.filter(([_, v]) => v)
|
|
390
|
+
.map(([k]) => ` ✓ ${k}`)
|
|
391
|
+
];
|
|
392
|
+
return lines.join('\n');
|
|
393
|
+
}
|
|
394
|
+
export function formatPresetList() {
|
|
395
|
+
const lines = ['Available Presets:', ''];
|
|
396
|
+
for (const [name, preset] of Object.entries(WORKER_PRESETS)) {
|
|
397
|
+
lines.push(` ${name}`);
|
|
398
|
+
lines.push(` ${preset.description}`);
|
|
399
|
+
lines.push(` Phases: ${preset.phases?.map(p => p.type).join(' → ') || 'none'}`);
|
|
400
|
+
lines.push('');
|
|
401
|
+
}
|
|
402
|
+
return lines.join('\n');
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=custom-worker-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-worker-factory.js","sourceRoot":"","sources":["../../src/workers/custom-worker-factory.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Custom Worker Factory\n *\n * Creates worker implementations from CustomWorkerDefinition configs.\n * Handles loading config files, validating definitions, and registering\n * custom workers with the dispatch service.\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport {\n CustomWorkerDefinition,\n WorkerConfigFile,\n validateWorkerDefinition,\n WORKER_PRESETS,\n DEFAULT_CAPABILITIES,\n DEFAULT_FILE_FILTER,\n DEFAULT_OUTPUT,\n CapabilityConfig,\n FileFilterConfig,\n OutputConfig\n} from './custom-worker-config.js';\nimport { WorkerContext, WorkerResults } from './types.js';\nimport { executePhasePipeline, PhaseContext } from './phase-executors.js';\n\n// ============================================================================\n// Custom Worker Instance\n// ============================================================================\n\nexport interface CustomWorkerInstance {\n /** Worker definition */\n definition: CustomWorkerDefinition;\n /** Merged capabilities */\n capabilities: CapabilityConfig;\n /** Merged file filter */\n fileFilter: FileFilterConfig;\n /** Merged output config */\n output: OutputConfig;\n /** Execute the worker */\n execute: (context: WorkerContext) => Promise<WorkerResults>;\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a worker instance from a definition\n */\nexport function createCustomWorker(\n definition: CustomWorkerDefinition,\n globalSettings?: {\n defaultCapabilities?: Partial<CapabilityConfig>;\n defaultFileFilter?: Partial<FileFilterConfig>;\n defaultOutput?: Partial<OutputConfig>;\n }\n): CustomWorkerInstance {\n // Validate definition\n const validation = validateWorkerDefinition(definition);\n if (!validation.valid) {\n throw new Error(`Invalid worker definition: ${validation.errors.join(', ')}`);\n }\n\n // Merge capabilities\n const capabilities: CapabilityConfig = {\n ...DEFAULT_CAPABILITIES,\n ...globalSettings?.defaultCapabilities,\n ...definition.capabilities\n };\n\n // Merge file filter\n const fileFilter: FileFilterConfig = {\n ...DEFAULT_FILE_FILTER,\n ...globalSettings?.defaultFileFilter,\n ...definition.fileFilter\n };\n\n // Merge output config\n const output: OutputConfig = {\n ...DEFAULT_OUTPUT,\n ...globalSettings?.defaultOutput,\n ...definition.output\n };\n\n // Create executor\n const execute = async (context: WorkerContext): Promise<WorkerResults> => {\n const startTime = Date.now();\n\n try {\n // Execute phase pipeline\n const result = await executePhasePipeline(\n context,\n definition.phases,\n (phase, progress) => {\n // Progress callback for real-time updates\n if (capabilities.progressEvents) {\n console.log(`[${definition.name}] Phase: ${phase} (${progress}%)`);\n }\n }\n );\n\n // Build results\n const completedCount = Array.from(result.results.values()).filter(r => r?.success).length;\n const results: WorkerResults = {\n status: result.success ? 'complete' : 'failed',\n success: result.success,\n completedPhases: completedCount,\n totalPhases: definition.phases.length,\n memoryKeys: [],\n duration: Date.now() - startTime,\n data: buildResultsData(result.phaseContext, result.results, output)\n };\n\n // Handle learning capabilities\n if (capabilities.sonaLearning && result.phaseContext.patterns.length > 0) {\n results.data.sonaTrainingTriggered = true;\n }\n\n if (capabilities.vectorDb && result.phaseContext.patterns.length > 0) {\n results.data.vectorDbUpdated = true;\n }\n\n // Add timing\n results.data.executionTimeMs = Date.now() - startTime;\n results.data.phasesExecuted = definition.phases.length;\n\n // Add errors if any\n if (result.errors.length > 0) {\n results.data.errors = result.errors;\n }\n\n return results;\n } catch (error) {\n return {\n status: 'failed' as const,\n success: false,\n completedPhases: 0,\n totalPhases: definition.phases.length,\n memoryKeys: [],\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : 'Worker execution failed',\n data: {\n error: error instanceof Error ? error.message : 'Worker execution failed',\n executionTimeMs: Date.now() - startTime\n }\n };\n }\n };\n\n return {\n definition,\n capabilities,\n fileFilter,\n output,\n execute\n };\n}\n\n/**\n * Build results data from phase context\n */\nfunction buildResultsData(\n phaseContext: PhaseContext,\n phaseResults: Map<string, any>,\n outputConfig: OutputConfig\n): Record<string, unknown> {\n const data: Record<string, unknown> = {\n files_analyzed: phaseContext.files.length,\n patterns_found: phaseContext.patterns.length,\n bytes_processed: phaseContext.bytes\n };\n\n // Add samples if configured\n if (outputConfig.includeSamples) {\n const maxSamples = outputConfig.maxSamples || 10;\n data.sample_patterns = phaseContext.patterns.slice(0, maxSamples);\n }\n\n // Add file list if configured\n if (outputConfig.includeFileList) {\n data.files = phaseContext.files;\n }\n\n // Add metrics if configured\n if (outputConfig.includeMetrics) {\n data.metrics = phaseContext.metrics;\n }\n\n // Add phase-specific data\n const phaseData: Record<string, unknown> = {};\n for (const [phase, result] of phaseResults) {\n if (result?.data) {\n phaseData[phase] = result.data;\n }\n }\n data.phaseResults = phaseData;\n\n return data;\n}\n\n// ============================================================================\n// Create from Preset\n// ============================================================================\n\n/**\n * Create a worker from a preset\n */\nexport function createFromPreset(\n presetName: string,\n overrides?: Partial<CustomWorkerDefinition>\n): CustomWorkerInstance {\n const preset = WORKER_PRESETS[presetName];\n if (!preset) {\n throw new Error(`Unknown preset: ${presetName}. Available: ${Object.keys(WORKER_PRESETS).join(', ')}`);\n }\n\n const definition: CustomWorkerDefinition = {\n name: overrides?.name || presetName,\n description: preset.description || `Worker from ${presetName} preset`,\n triggers: overrides?.triggers || [presetName],\n priority: preset.priority || 'medium',\n timeout: preset.timeout || 120000,\n phases: overrides?.phases || preset.phases || [],\n capabilities: { ...preset.capabilities, ...overrides?.capabilities },\n fileFilter: { ...preset.fileFilter, ...overrides?.fileFilter },\n output: { ...preset.output, ...overrides?.output },\n ...overrides\n };\n\n return createCustomWorker(definition);\n}\n\n// ============================================================================\n// Config File Loading\n// ============================================================================\n\nconst CONFIG_FILENAMES = [\n 'workers.yaml',\n 'workers.yml',\n 'workers.json',\n '.agentic-flow/workers.yaml',\n '.agentic-flow/workers.yml',\n '.agentic-flow/workers.json'\n];\n\n/**\n * Load workers from a config file\n */\nexport async function loadWorkersFromConfig(\n configPath?: string\n): Promise<CustomWorkerInstance[]> {\n let content: string;\n let actualPath: string;\n\n if (configPath) {\n actualPath = path.isAbsolute(configPath) ? configPath : path.join(process.cwd(), configPath);\n try {\n content = await fs.readFile(actualPath, 'utf-8');\n } catch (error) {\n throw new Error(`Failed to read config file: ${actualPath}`);\n }\n } else {\n // Search for config file\n for (const filename of CONFIG_FILENAMES) {\n const tryPath = path.join(process.cwd(), filename);\n try {\n content = await fs.readFile(tryPath, 'utf-8');\n actualPath = tryPath;\n break;\n } catch {\n continue;\n }\n }\n if (!content!) {\n return [];\n }\n }\n\n // Parse config\n let config: WorkerConfigFile;\n if (actualPath!.endsWith('.json')) {\n config = JSON.parse(content);\n } else {\n config = parseYaml(content) as WorkerConfigFile;\n }\n\n // Validate version\n if (config.version !== '1.0') {\n console.warn(`Unknown config version: ${config.version}. Expected 1.0`);\n }\n\n // Create workers\n const workers: CustomWorkerInstance[] = [];\n for (const def of config.workers) {\n try {\n const worker = createCustomWorker(def, config.settings);\n workers.push(worker);\n } catch (error) {\n console.error(`Failed to create worker \"${def.name}\": ${error}`);\n }\n }\n\n return workers;\n}\n\n// ============================================================================\n// Worker Registry Integration\n// ============================================================================\n\nexport class CustomWorkerManager {\n private workers = new Map<string, CustomWorkerInstance>();\n private triggerMap = new Map<string, string>(); // trigger -> worker name\n\n /**\n * Register a custom worker\n */\n register(worker: CustomWorkerInstance): void {\n const name = worker.definition.name;\n this.workers.set(name, worker);\n\n // Register triggers\n this.triggerMap.set(name, name);\n for (const trigger of worker.definition.triggers || []) {\n this.triggerMap.set(trigger.toLowerCase(), name);\n }\n }\n\n /**\n * Create and register from preset\n */\n registerPreset(presetName: string, overrides?: Partial<CustomWorkerDefinition>): CustomWorkerInstance {\n const worker = createFromPreset(presetName, overrides);\n this.register(worker);\n return worker;\n }\n\n /**\n * Create and register from definition\n */\n registerDefinition(definition: CustomWorkerDefinition): CustomWorkerInstance {\n const worker = createCustomWorker(definition);\n this.register(worker);\n return worker;\n }\n\n /**\n * Load and register from config file\n */\n async loadFromConfig(configPath?: string): Promise<number> {\n const workers = await loadWorkersFromConfig(configPath);\n workers.forEach(w => this.register(w));\n return workers.length;\n }\n\n /**\n * Get worker by name or trigger\n */\n get(nameOrTrigger: string): CustomWorkerInstance | undefined {\n const key = nameOrTrigger.toLowerCase();\n const name = this.triggerMap.get(key);\n return name ? this.workers.get(name) : undefined;\n }\n\n /**\n * Check if a trigger matches a custom worker\n */\n matchesTrigger(input: string): string | undefined {\n const lower = input.toLowerCase();\n for (const [trigger, name] of this.triggerMap) {\n if (lower.includes(trigger)) {\n return name;\n }\n }\n return undefined;\n }\n\n /**\n * List all registered workers\n */\n list(): CustomWorkerInstance[] {\n return Array.from(this.workers.values());\n }\n\n /**\n * List available presets\n */\n listPresets(): string[] {\n return Object.keys(WORKER_PRESETS);\n }\n\n /**\n * Get preset definition\n */\n getPreset(name: string): Partial<CustomWorkerDefinition> | undefined {\n return WORKER_PRESETS[name];\n }\n\n /**\n * Execute a custom worker\n */\n async execute(nameOrTrigger: string, context: WorkerContext): Promise<WorkerResults> {\n const worker = this.get(nameOrTrigger);\n if (!worker) {\n return {\n status: 'failed' as const,\n success: false,\n completedPhases: 0,\n totalPhases: 0,\n memoryKeys: [],\n duration: 0,\n error: `Custom worker not found: ${nameOrTrigger}`,\n data: { error: `Custom worker not found: ${nameOrTrigger}` }\n };\n }\n\n return worker.execute(context);\n }\n\n /**\n * Generate example config file\n */\n generateExampleConfig(): string {\n const example: WorkerConfigFile = {\n version: '1.0',\n workers: [\n {\n name: 'my-scanner',\n description: 'Custom code scanner',\n triggers: ['scan-my'],\n priority: 'medium',\n timeout: 120000,\n phases: [\n { type: 'file-discovery' },\n { type: 'pattern-extraction' },\n { type: 'security-analysis' },\n { type: 'summarization' }\n ],\n capabilities: {\n onnxEmbeddings: true,\n vectorDb: true\n },\n output: {\n format: 'detailed',\n includeSamples: true\n }\n }\n ],\n settings: {\n defaultCapabilities: {\n progressEvents: true\n },\n maxConcurrent: 3,\n debug: false\n }\n };\n\n return `# Custom Workers Configuration\n# Save as workers.yaml or .agentic-flow/workers.yaml\n\n${stringifyYaml(example)}`;\n }\n}\n\n// Singleton instance\nexport const customWorkerManager = new CustomWorkerManager();\n\n// ============================================================================\n// CLI Helper Functions\n// ============================================================================\n\nexport function formatWorkerInfo(worker: CustomWorkerInstance): string {\n const def = worker.definition;\n const lines = [\n `Name: ${def.name}`,\n `Description: ${def.description}`,\n `Triggers: ${[def.name, ...(def.triggers || [])].join(', ')}`,\n `Priority: ${def.priority || 'medium'}`,\n `Timeout: ${(def.timeout || 120000) / 1000}s`,\n `Phases: ${def.phases.map(p => p.type).join(' → ')}`,\n '',\n 'Capabilities:',\n ...Object.entries(worker.capabilities)\n .filter(([_, v]) => v)\n .map(([k]) => ` ✓ ${k}`)\n ];\n\n return lines.join('\\n');\n}\n\nexport function formatPresetList(): string {\n const lines = ['Available Presets:', ''];\n\n for (const [name, preset] of Object.entries(WORKER_PRESETS)) {\n lines.push(` ${name}`);\n lines.push(` ${preset.description}`);\n lines.push(` Phases: ${preset.phases?.map(p => p.type).join(' → ') || 'none'}`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n"]}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkerDispatchService - Dispatches and manages background workers
|
|
3
|
+
*
|
|
4
|
+
* Integrates with RuVector ecosystem:
|
|
5
|
+
* - SONA: Self-learning trajectory tracking
|
|
6
|
+
* - ReasoningBank: Pattern storage and memory retrieval
|
|
7
|
+
* - HNSW: Vector indexing for semantic search
|
|
8
|
+
*/
|
|
9
|
+
import { EventEmitter } from 'events';
|
|
10
|
+
import { WorkerId, WorkerTrigger, WorkerInfo, WorkerResults, DetectedTrigger, WorkerContext } from './types.js';
|
|
11
|
+
import { ResourceGovernor } from './resource-governor.js';
|
|
12
|
+
import { RuVectorWorkerIntegration } from './ruvector-integration.js';
|
|
13
|
+
import { CustomWorkerInstance } from './custom-worker-factory.js';
|
|
14
|
+
type WorkerImplementation = (context: WorkerContext) => Promise<WorkerResults>;
|
|
15
|
+
export declare class WorkerDispatchService extends EventEmitter {
|
|
16
|
+
private registry;
|
|
17
|
+
private governor;
|
|
18
|
+
private detector;
|
|
19
|
+
private ruvector;
|
|
20
|
+
private runningWorkers;
|
|
21
|
+
private workerImplementations;
|
|
22
|
+
constructor();
|
|
23
|
+
/**
|
|
24
|
+
* Dispatch a worker based on trigger
|
|
25
|
+
*/
|
|
26
|
+
dispatch(trigger: WorkerTrigger, topic: string | null, sessionId: string): Promise<WorkerId>;
|
|
27
|
+
/**
|
|
28
|
+
* Detect triggers in prompt and dispatch workers
|
|
29
|
+
* @param parallel - Enable parallel dispatch for better batch performance (default: true)
|
|
30
|
+
*/
|
|
31
|
+
dispatchFromPrompt(prompt: string, sessionId: string, options?: {
|
|
32
|
+
parallel?: boolean;
|
|
33
|
+
}): Promise<{
|
|
34
|
+
triggers: DetectedTrigger[];
|
|
35
|
+
workerIds: WorkerId[];
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Execute worker in background with RuVector integration
|
|
39
|
+
*/
|
|
40
|
+
private executeWorker;
|
|
41
|
+
/**
|
|
42
|
+
* Get worker status
|
|
43
|
+
*/
|
|
44
|
+
getStatus(workerId: WorkerId): WorkerInfo | null;
|
|
45
|
+
/**
|
|
46
|
+
* Get all workers
|
|
47
|
+
*/
|
|
48
|
+
getAllWorkers(sessionId?: string): WorkerInfo[];
|
|
49
|
+
/**
|
|
50
|
+
* Get active workers
|
|
51
|
+
*/
|
|
52
|
+
getActiveWorkers(sessionId?: string): WorkerInfo[];
|
|
53
|
+
/**
|
|
54
|
+
* Cancel a running worker
|
|
55
|
+
*/
|
|
56
|
+
cancel(workerId: WorkerId): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Wait for worker completion
|
|
59
|
+
*/
|
|
60
|
+
awaitCompletion(workerId: WorkerId, timeout?: number): Promise<WorkerInfo | null>;
|
|
61
|
+
/**
|
|
62
|
+
* Register a worker implementation
|
|
63
|
+
*/
|
|
64
|
+
registerWorker(trigger: string, implementation: WorkerImplementation): void;
|
|
65
|
+
/**
|
|
66
|
+
* Register a custom worker from definition
|
|
67
|
+
*/
|
|
68
|
+
registerCustomWorker(worker: CustomWorkerInstance): void;
|
|
69
|
+
/**
|
|
70
|
+
* Load and register custom workers from config file
|
|
71
|
+
*/
|
|
72
|
+
loadCustomWorkers(configPath?: string): Promise<number>;
|
|
73
|
+
/**
|
|
74
|
+
* Check if a trigger has a custom worker
|
|
75
|
+
*/
|
|
76
|
+
hasCustomWorker(trigger: string): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Get available custom worker presets
|
|
79
|
+
*/
|
|
80
|
+
getCustomWorkerPresets(): string[];
|
|
81
|
+
/**
|
|
82
|
+
* Register default worker implementations
|
|
83
|
+
*/
|
|
84
|
+
private registerDefaultWorkers;
|
|
85
|
+
private createUltralearnWorker;
|
|
86
|
+
private createOptimizeWorker;
|
|
87
|
+
private createConsolidateWorker;
|
|
88
|
+
private createPredictWorker;
|
|
89
|
+
private createAuditWorker;
|
|
90
|
+
private createMapWorker;
|
|
91
|
+
private createPreloadWorker;
|
|
92
|
+
private createDeepdiveWorker;
|
|
93
|
+
private createDocumentWorker;
|
|
94
|
+
private createRefactorWorker;
|
|
95
|
+
private createBenchmarkWorker;
|
|
96
|
+
private createTestgapsWorker;
|
|
97
|
+
private phaseResults;
|
|
98
|
+
/**
|
|
99
|
+
* Execute a worker phase with REAL file analysis (pure JS, no native bindings)
|
|
100
|
+
*/
|
|
101
|
+
private executePhase;
|
|
102
|
+
/**
|
|
103
|
+
* Extract code patterns related to a topic
|
|
104
|
+
*/
|
|
105
|
+
private extractPatterns;
|
|
106
|
+
/**
|
|
107
|
+
* Get dashboard statistics including RuVector integration
|
|
108
|
+
*/
|
|
109
|
+
getStats(): {
|
|
110
|
+
active: number;
|
|
111
|
+
byStatus: Record<string, number>;
|
|
112
|
+
byTrigger: Record<string, number>;
|
|
113
|
+
availability: ReturnType<ResourceGovernor['getAvailability']>;
|
|
114
|
+
ruvector: ReturnType<RuVectorWorkerIntegration['getStats']>;
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Get RuVector integration instance for advanced operations
|
|
118
|
+
*/
|
|
119
|
+
getRuVectorIntegration(): RuVectorWorkerIntegration;
|
|
120
|
+
}
|
|
121
|
+
export declare function getWorkerDispatchService(): WorkerDispatchService;
|
|
122
|
+
export {};
|
|
123
|
+
//# sourceMappingURL=dispatch-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-service.d.ts","sourceRoot":"","sources":["../../src/workers/dispatch-service.ts"],"names":[],"mappings":"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"}
|