agentic-flow 2.0.1-alpha.2 → 2.0.1-alpha.20
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/CHANGELOG.md +352 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentdb/controllers/EmbeddingService.d.ts +37 -0
- package/dist/agentdb/controllers/EmbeddingService.d.ts.map +1 -0
- package/dist/agentdb/controllers/EmbeddingService.js +1 -0
- package/dist/agentdb/controllers/EmbeddingService.js.map +1 -0
- package/dist/billing/mcp/tools.d.ts.map +1 -1
- package/dist/billing/mcp/tools.js +2 -0
- package/dist/billing/mcp/tools.js.map +1 -1
- package/dist/cli/commands/hooks.d.ts +18 -0
- package/dist/cli/commands/hooks.d.ts.map +1 -0
- package/dist/cli/commands/hooks.js +755 -0
- package/dist/cli/commands/hooks.js.map +1 -0
- package/dist/cli-proxy.d.ts +1 -1
- package/dist/cli-proxy.d.ts.map +1 -1
- package/dist/cli-proxy.js +28 -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 +32 -17
- package/dist/core/agentdb-wrapper-enhanced.js.map +1 -1
- package/dist/core/attention-native.d.ts +1 -0
- package/dist/core/attention-native.d.ts.map +1 -1
- package/dist/core/attention-native.js +6 -1
- package/dist/core/attention-native.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/intelligence/EmbeddingCache.d.ts +112 -0
- package/dist/intelligence/EmbeddingCache.d.ts.map +1 -0
- package/dist/intelligence/EmbeddingCache.js +624 -0
- package/dist/intelligence/EmbeddingCache.js.map +1 -0
- package/dist/intelligence/EmbeddingService.d.ts +380 -0
- package/dist/intelligence/EmbeddingService.d.ts.map +1 -0
- package/dist/intelligence/EmbeddingService.js +1484 -0
- package/dist/intelligence/EmbeddingService.js.map +1 -0
- package/dist/intelligence/IntelligenceStore.d.ts +168 -0
- package/dist/intelligence/IntelligenceStore.d.ts.map +1 -0
- package/dist/intelligence/IntelligenceStore.js +364 -0
- package/dist/intelligence/IntelligenceStore.js.map +1 -0
- package/dist/intelligence/RuVectorIntelligence.d.ts +362 -0
- package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -0
- package/dist/intelligence/RuVectorIntelligence.js +853 -0
- package/dist/intelligence/RuVectorIntelligence.js.map +1 -0
- package/dist/intelligence/embedding-benchmark.d.ts +7 -0
- package/dist/intelligence/embedding-benchmark.d.ts.map +1 -0
- package/dist/intelligence/embedding-benchmark.js +155 -0
- package/dist/intelligence/embedding-benchmark.js.map +1 -0
- package/dist/intelligence/index.d.ts +14 -0
- package/dist/intelligence/index.d.ts.map +1 -0
- package/dist/intelligence/index.js +14 -0
- package/dist/intelligence/index.js.map +1 -0
- package/dist/llm/RuvLLMOrchestrator.d.ts +184 -0
- package/dist/llm/RuvLLMOrchestrator.d.ts.map +1 -0
- package/dist/llm/RuvLLMOrchestrator.js +442 -0
- package/dist/llm/RuvLLMOrchestrator.js.map +1 -0
- package/dist/llm/index.d.ts +9 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +8 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
- package/dist/mcp/claudeFlowSdkServer.js +86 -21
- package/dist/mcp/claudeFlowSdkServer.js.map +1 -1
- package/dist/mcp/fastmcp/servers/hooks-server.d.ts +15 -0
- package/dist/mcp/fastmcp/servers/hooks-server.d.ts.map +1 -0
- package/dist/mcp/fastmcp/servers/hooks-server.js +63 -0
- package/dist/mcp/fastmcp/servers/hooks-server.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.d.ts +20 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.js +110 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.js +276 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.d.ts +6 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.js +164 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/index.d.ts +28 -0
- package/dist/mcp/fastmcp/tools/hooks/index.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/index.js +59 -0
- package/dist/mcp/fastmcp/tools/hooks/index.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts +307 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +714 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts +58 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js +425 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.d.ts +6 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.js +137 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.js +91 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.d.ts +12 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.js +146 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.js +70 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.d.ts +14 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.js +121 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.js +171 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/route.d.ts +12 -0
- package/dist/mcp/fastmcp/tools/hooks/route.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/route.js +267 -0
- package/dist/mcp/fastmcp/tools/hooks/route.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.d.ts +46 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.js +159 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.js +151 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.js.map +1 -0
- package/dist/mcp/tools/agent-booster-tools.d.ts +10 -1
- package/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -1
- 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 +15 -3
- package/dist/mcp/tools/sona-tools.js.map +1 -1
- package/dist/memory/SharedMemoryPool.d.ts +16 -3
- package/dist/memory/SharedMemoryPool.d.ts.map +1 -1
- package/dist/memory/SharedMemoryPool.js +33 -1
- package/dist/memory/SharedMemoryPool.js.map +1 -1
- package/dist/middleware/auth.middleware.d.ts +114 -0
- package/dist/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/middleware/auth.middleware.js +222 -0
- package/dist/middleware/auth.middleware.js.map +1 -0
- package/dist/optimizations/agent-booster-migration.d.ts.map +1 -1
- package/dist/optimizations/agent-booster-migration.js.map +1 -1
- package/dist/proxy/anthropic-to-gemini.d.ts.map +1 -1
- package/dist/proxy/anthropic-to-gemini.js.map +1 -1
- package/dist/proxy/anthropic-to-openrouter.d.ts.map +1 -1
- package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
- package/dist/proxy/anthropic-to-requesty.d.ts.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 -1
- package/dist/proxy/quic-proxy.js.map +1 -1
- package/dist/reasoningbank/AdvancedMemory.d.ts.map +1 -1
- package/dist/reasoningbank/AdvancedMemory.js +12 -1
- package/dist/reasoningbank/AdvancedMemory.js.map +1 -1
- package/dist/reasoningbank/HybridBackend.d.ts +9 -0
- package/dist/reasoningbank/HybridBackend.d.ts.map +1 -1
- package/dist/reasoningbank/HybridBackend.js +48 -4
- package/dist/reasoningbank/HybridBackend.js.map +1 -1
- package/dist/reasoningbank/backend-selector.d.ts +1 -1
- package/dist/reasoningbank/backend-selector.d.ts.map +1 -1
- package/dist/reasoningbank/backend-selector.js.map +1 -1
- package/dist/reasoningbank/index-new.d.ts +0 -6
- package/dist/reasoningbank/index-new.d.ts.map +1 -1
- package/dist/reasoningbank/index-new.js +9 -7
- package/dist/reasoningbank/index-new.js.map +1 -1
- package/dist/reasoningbank/index.d.ts +1 -6
- package/dist/reasoningbank/index.d.ts.map +1 -1
- package/dist/reasoningbank/index.js +10 -7
- package/dist/reasoningbank/index.js.map +1 -1
- package/dist/router/providers/onnx-local.d.ts.map +1 -1
- package/dist/router/providers/onnx-local.js +3 -1
- package/dist/router/providers/onnx-local.js.map +1 -1
- package/dist/routing/CircuitBreakerRouter.d.ts +187 -0
- package/dist/routing/CircuitBreakerRouter.d.ts.map +1 -0
- package/dist/routing/CircuitBreakerRouter.js +460 -0
- package/dist/routing/CircuitBreakerRouter.js.map +1 -0
- package/dist/routing/SemanticRouter.d.ts +164 -0
- package/dist/routing/SemanticRouter.d.ts.map +1 -0
- package/dist/routing/SemanticRouter.js +291 -0
- package/dist/routing/SemanticRouter.js.map +1 -0
- package/dist/routing/index.d.ts +12 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +10 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/services/embedding-service.d.ts.map +1 -1
- package/dist/services/embedding-service.js +5 -2
- package/dist/services/embedding-service.js.map +1 -1
- package/dist/services/sona-agent-training.js +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 +10 -5
- package/dist/services/sona-agentdb-integration.js.map +1 -1
- package/dist/services/sona-service.d.ts +6 -6
- package/dist/services/sona-service.d.ts.map +1 -1
- package/dist/services/sona-service.js +3 -1
- package/dist/services/sona-service.js.map +1 -1
- package/dist/utils/agentdb-runtime-patch.d.ts +1 -0
- package/dist/utils/agentdb-runtime-patch.d.ts.map +1 -1
- package/dist/utils/agentdb-runtime-patch.js +97 -2
- package/dist/utils/agentdb-runtime-patch.js.map +1 -1
- package/dist/utils/audit-logger.d.ts +115 -0
- package/dist/utils/audit-logger.d.ts.map +1 -0
- package/dist/utils/audit-logger.js +228 -0
- package/dist/utils/audit-logger.js.map +1 -0
- package/dist/utils/cli.d.ts +1 -1
- package/dist/utils/cli.d.ts.map +1 -1
- package/dist/utils/cli.js +5 -0
- package/dist/utils/cli.js.map +1 -1
- package/dist/utils/input-validator.d.ts +116 -0
- package/dist/utils/input-validator.d.ts.map +1 -0
- package/dist/utils/input-validator.js +299 -0
- package/dist/utils/input-validator.js.map +1 -0
- package/dist/utils/rate-limiter.js +2 -2
- package/dist/utils/rate-limiter.js.map +1 -1
- package/package.json +14 -3
- package/scripts/postinstall.js +72 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route Hook - Intelligent agent selection with SONA-style routing
|
|
3
|
+
* Uses learned patterns, context, and exploration/exploitation balance
|
|
4
|
+
*
|
|
5
|
+
* NOW WITH FULL RUVECTOR INTELLIGENCE:
|
|
6
|
+
* - @ruvector/sona: Micro-LoRA (~0.05ms), trajectories
|
|
7
|
+
* - @ruvector/attention: MoE attention-based ranking
|
|
8
|
+
* - ruvector: HNSW indexing (150x faster search)
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
import { loadIntelligence, getAgentForFile, simpleEmbed, cosineSimilarity } from './shared.js';
|
|
13
|
+
import { routeTaskIntelligent, findSimilarPatterns, getIntelligenceStats } from './intelligence-bridge.js';
|
|
14
|
+
// Exploration rate for epsilon-greedy selection
|
|
15
|
+
const EXPLORATION_RATE = 0.1;
|
|
16
|
+
// Flag to use RuVector intelligence (can be toggled)
|
|
17
|
+
const USE_RUVECTOR_INTELLIGENCE = process.env.RUVECTOR_INTELLIGENCE_ENABLED !== 'false';
|
|
18
|
+
// Available agent types
|
|
19
|
+
const availableAgents = [
|
|
20
|
+
'coder',
|
|
21
|
+
'researcher',
|
|
22
|
+
'analyst',
|
|
23
|
+
'optimizer',
|
|
24
|
+
'coordinator',
|
|
25
|
+
'typescript-developer',
|
|
26
|
+
'rust-developer',
|
|
27
|
+
'python-developer',
|
|
28
|
+
'go-developer',
|
|
29
|
+
'react-developer',
|
|
30
|
+
'test-engineer',
|
|
31
|
+
'documentation-specialist',
|
|
32
|
+
'database-specialist',
|
|
33
|
+
'devops-engineer',
|
|
34
|
+
'cicd-engineer',
|
|
35
|
+
'security-specialist',
|
|
36
|
+
'frontend-developer',
|
|
37
|
+
'backend-developer'
|
|
38
|
+
];
|
|
39
|
+
export const hookRouteTool = {
|
|
40
|
+
name: 'hook_route',
|
|
41
|
+
description: 'Route task to optimal agent using learned patterns and context',
|
|
42
|
+
parameters: z.object({
|
|
43
|
+
task: z.string().describe('Task description'),
|
|
44
|
+
context: z.object({
|
|
45
|
+
file: z.string().optional(),
|
|
46
|
+
recentFiles: z.array(z.string()).optional(),
|
|
47
|
+
errorContext: z.string().optional()
|
|
48
|
+
}).optional().describe('Optional context'),
|
|
49
|
+
explore: z.boolean().optional().default(false).describe('Force exploration')
|
|
50
|
+
}),
|
|
51
|
+
execute: async ({ task, context, explore }, { onProgress }) => {
|
|
52
|
+
const startTime = Date.now();
|
|
53
|
+
// TRY RUVECTOR INTELLIGENCE FIRST (Micro-LoRA + HNSW + MoE)
|
|
54
|
+
if (USE_RUVECTOR_INTELLIGENCE && !explore) {
|
|
55
|
+
try {
|
|
56
|
+
const intelligentResult = await routeTaskIntelligent(task, context);
|
|
57
|
+
// Also check for similar patterns from ReasoningBank
|
|
58
|
+
const similarPatterns = await findSimilarPatterns(task, 3);
|
|
59
|
+
// Get stats for monitoring
|
|
60
|
+
const stats = await getIntelligenceStats();
|
|
61
|
+
return {
|
|
62
|
+
success: true,
|
|
63
|
+
agent: intelligentResult.agent,
|
|
64
|
+
confidence: intelligentResult.confidence,
|
|
65
|
+
score: intelligentResult.routingResults[0]?.confidence || 0,
|
|
66
|
+
factors: [
|
|
67
|
+
{
|
|
68
|
+
name: 'ruvector_intelligence',
|
|
69
|
+
weight: 3.0,
|
|
70
|
+
agent: intelligentResult.agent,
|
|
71
|
+
evidence: `SONA + MoE routing in ${intelligentResult.latencyMs.toFixed(2)}ms`
|
|
72
|
+
},
|
|
73
|
+
...intelligentResult.usedFeatures.map(f => ({
|
|
74
|
+
name: f,
|
|
75
|
+
weight: 1.0,
|
|
76
|
+
agent: intelligentResult.agent,
|
|
77
|
+
evidence: `Used ${f} for routing`
|
|
78
|
+
}))
|
|
79
|
+
],
|
|
80
|
+
alternatives: intelligentResult.routingResults.slice(1, 4).map(r => ({
|
|
81
|
+
agent: r.agentId,
|
|
82
|
+
score: r.confidence,
|
|
83
|
+
whyNot: `Score ${r.confidence.toFixed(2)} < best`
|
|
84
|
+
})),
|
|
85
|
+
similarPatterns: similarPatterns.slice(0, 2),
|
|
86
|
+
explored: false,
|
|
87
|
+
latencyMs: Date.now() - startTime,
|
|
88
|
+
timestamp: new Date().toISOString(),
|
|
89
|
+
intelligenceStats: stats,
|
|
90
|
+
engine: 'ruvector' // Mark that we used RuVector
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
// Fall back to simple routing if intelligence fails
|
|
95
|
+
console.warn('[Route] RuVector intelligence failed, using fallback:', error);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// FALLBACK: Simple Q-learning routing (original implementation)
|
|
99
|
+
const intel = loadIntelligence();
|
|
100
|
+
// Track scoring factors
|
|
101
|
+
const factors = [];
|
|
102
|
+
// Agent scores
|
|
103
|
+
const scores = {};
|
|
104
|
+
for (const agent of availableAgents) {
|
|
105
|
+
scores[agent] = 0;
|
|
106
|
+
}
|
|
107
|
+
// 1. Score based on file context
|
|
108
|
+
if (context?.file) {
|
|
109
|
+
const ext = path.extname(context.file);
|
|
110
|
+
const fileAgent = getAgentForFile(context.file);
|
|
111
|
+
scores[fileAgent] = (scores[fileAgent] || 0) + 2.0;
|
|
112
|
+
factors.push({
|
|
113
|
+
name: 'file_pattern',
|
|
114
|
+
weight: 2.0,
|
|
115
|
+
agent: fileAgent,
|
|
116
|
+
evidence: `File ${context.file} matches ${fileAgent}`
|
|
117
|
+
});
|
|
118
|
+
// Check learned patterns for this extension
|
|
119
|
+
const state = `edit:${ext}`;
|
|
120
|
+
if (intel.patterns[state]) {
|
|
121
|
+
for (const [agent, value] of Object.entries(intel.patterns[state])) {
|
|
122
|
+
if (typeof value === 'number') {
|
|
123
|
+
scores[agent] = (scores[agent] || 0) + value;
|
|
124
|
+
if (value > 0.5) {
|
|
125
|
+
factors.push({
|
|
126
|
+
name: 'learned_pattern',
|
|
127
|
+
weight: value,
|
|
128
|
+
agent,
|
|
129
|
+
evidence: `Q-value ${value.toFixed(2)} for ${ext} edits`
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// 2. Score based on task keywords
|
|
137
|
+
const taskLower = task.toLowerCase();
|
|
138
|
+
const keywordScores = {
|
|
139
|
+
'test-engineer': ['test', 'spec', 'coverage', 'mock', 'assert'],
|
|
140
|
+
'documentation-specialist': ['document', 'readme', 'docs', 'explain', 'comment'],
|
|
141
|
+
'security-specialist': ['security', 'auth', 'encrypt', 'vulnerability', 'owasp'],
|
|
142
|
+
'database-specialist': ['database', 'sql', 'query', 'migration', 'schema'],
|
|
143
|
+
'devops-engineer': ['docker', 'deploy', 'ci', 'cd', 'kubernetes', 'container'],
|
|
144
|
+
'frontend-developer': ['ui', 'component', 'style', 'css', 'layout'],
|
|
145
|
+
'backend-developer': ['api', 'endpoint', 'server', 'route', 'middleware'],
|
|
146
|
+
'optimizer': ['optimize', 'performance', 'speed', 'cache', 'memory'],
|
|
147
|
+
'researcher': ['research', 'find', 'search', 'explore', 'understand'],
|
|
148
|
+
'analyst': ['analyze', 'review', 'audit', 'check', 'evaluate']
|
|
149
|
+
};
|
|
150
|
+
for (const [agent, keywords] of Object.entries(keywordScores)) {
|
|
151
|
+
for (const keyword of keywords) {
|
|
152
|
+
if (taskLower.includes(keyword)) {
|
|
153
|
+
scores[agent] = (scores[agent] || 0) + 1.5;
|
|
154
|
+
factors.push({
|
|
155
|
+
name: 'keyword_match',
|
|
156
|
+
weight: 1.5,
|
|
157
|
+
agent,
|
|
158
|
+
evidence: `Task contains "${keyword}"`
|
|
159
|
+
});
|
|
160
|
+
break; // Only count once per agent
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// 3. Score based on memory similarity
|
|
165
|
+
if (intel.memories.length > 0) {
|
|
166
|
+
const taskEmbed = simpleEmbed(task);
|
|
167
|
+
for (const mem of intel.memories) {
|
|
168
|
+
if (mem.embedding && mem.type === 'success') {
|
|
169
|
+
const similarity = cosineSimilarity(taskEmbed, mem.embedding);
|
|
170
|
+
if (similarity > 0.4) {
|
|
171
|
+
// Extract agent from memory content
|
|
172
|
+
const agentMatch = mem.content.match(/by (\S+)/);
|
|
173
|
+
if (agentMatch && scores[agentMatch[1]] !== undefined) {
|
|
174
|
+
scores[agentMatch[1]] += similarity;
|
|
175
|
+
factors.push({
|
|
176
|
+
name: 'memory_match',
|
|
177
|
+
weight: similarity,
|
|
178
|
+
agent: agentMatch[1],
|
|
179
|
+
evidence: `Similar to: ${mem.content.slice(0, 50)}...`
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// 4. Check for error context
|
|
187
|
+
if (context?.errorContext) {
|
|
188
|
+
for (const ep of intel.errorPatterns) {
|
|
189
|
+
if (context.errorContext.includes(ep.errorType)) {
|
|
190
|
+
// Find agent with best success rate for this error
|
|
191
|
+
let bestAgent = 'coder';
|
|
192
|
+
let bestScore = 0;
|
|
193
|
+
for (const [agent, score] of Object.entries(ep.agentSuccess)) {
|
|
194
|
+
if (score > bestScore) {
|
|
195
|
+
bestScore = score;
|
|
196
|
+
bestAgent = agent;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (bestScore > 0) {
|
|
200
|
+
scores[bestAgent] = (scores[bestAgent] || 0) + 2.0;
|
|
201
|
+
factors.push({
|
|
202
|
+
name: 'error_specialist',
|
|
203
|
+
weight: 2.0,
|
|
204
|
+
agent: bestAgent,
|
|
205
|
+
evidence: `Best at fixing ${ep.errorType}`
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// 5. Select best agent (with exploration)
|
|
212
|
+
let selectedAgent = 'coder';
|
|
213
|
+
let maxScore = 0;
|
|
214
|
+
// Epsilon-greedy: explore with probability EXPLORATION_RATE
|
|
215
|
+
if (explore || Math.random() < EXPLORATION_RATE) {
|
|
216
|
+
// Random selection for exploration
|
|
217
|
+
const agentsWithScores = Object.keys(scores).filter(a => scores[a] > 0);
|
|
218
|
+
if (agentsWithScores.length > 0) {
|
|
219
|
+
selectedAgent = agentsWithScores[Math.floor(Math.random() * agentsWithScores.length)];
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
selectedAgent = availableAgents[Math.floor(Math.random() * availableAgents.length)];
|
|
223
|
+
}
|
|
224
|
+
factors.push({
|
|
225
|
+
name: 'exploration',
|
|
226
|
+
weight: 0,
|
|
227
|
+
agent: selectedAgent,
|
|
228
|
+
evidence: 'Random exploration for learning'
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
// Exploitation: select best
|
|
233
|
+
for (const [agent, score] of Object.entries(scores)) {
|
|
234
|
+
if (score > maxScore) {
|
|
235
|
+
maxScore = score;
|
|
236
|
+
selectedAgent = agent;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Calculate confidence
|
|
241
|
+
const totalScore = Object.values(scores).reduce((a, b) => a + b, 0);
|
|
242
|
+
const confidence = totalScore > 0 ? maxScore / totalScore : 0.5;
|
|
243
|
+
// Get alternatives
|
|
244
|
+
const alternatives = Object.entries(scores)
|
|
245
|
+
.filter(([agent]) => agent !== selectedAgent)
|
|
246
|
+
.sort((a, b) => b[1] - a[1])
|
|
247
|
+
.slice(0, 3)
|
|
248
|
+
.map(([agent, score]) => ({
|
|
249
|
+
agent,
|
|
250
|
+
score,
|
|
251
|
+
whyNot: score < maxScore ? `Score ${score.toFixed(2)} < ${maxScore.toFixed(2)}` : 'Not selected'
|
|
252
|
+
}));
|
|
253
|
+
const latency = Date.now() - startTime;
|
|
254
|
+
return {
|
|
255
|
+
success: true,
|
|
256
|
+
agent: selectedAgent,
|
|
257
|
+
confidence: Math.min(0.95, confidence),
|
|
258
|
+
score: maxScore,
|
|
259
|
+
factors: factors.slice(0, 5),
|
|
260
|
+
alternatives,
|
|
261
|
+
explored: explore || Math.random() < EXPLORATION_RATE,
|
|
262
|
+
latencyMs: latency,
|
|
263
|
+
timestamp: new Date().toISOString()
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/route.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Route Hook - Intelligent agent selection with SONA-style routing\n * Uses learned patterns, context, and exploration/exploitation balance\n *\n * NOW WITH FULL RUVECTOR INTELLIGENCE:\n * - @ruvector/sona: Micro-LoRA (~0.05ms), trajectories\n * - @ruvector/attention: MoE attention-based ranking\n * - ruvector: HNSW indexing (150x faster search)\n */\n\nimport { z } from 'zod';\nimport * as path from 'path';\nimport type { ToolDefinition } from '../../types/index.js';\nimport {\n loadIntelligence,\n getAgentForFile,\n simpleEmbed,\n cosineSimilarity,\n agentMapping\n} from './shared.js';\nimport {\n routeTaskIntelligent,\n findSimilarPatterns,\n getIntelligenceStats\n} from './intelligence-bridge.js';\n\n// Exploration rate for epsilon-greedy selection\nconst EXPLORATION_RATE = 0.1;\n\n// Flag to use RuVector intelligence (can be toggled)\nconst USE_RUVECTOR_INTELLIGENCE = process.env.RUVECTOR_INTELLIGENCE_ENABLED !== 'false';\n\n// Available agent types\nconst availableAgents = [\n 'coder',\n 'researcher',\n 'analyst',\n 'optimizer',\n 'coordinator',\n 'typescript-developer',\n 'rust-developer',\n 'python-developer',\n 'go-developer',\n 'react-developer',\n 'test-engineer',\n 'documentation-specialist',\n 'database-specialist',\n 'devops-engineer',\n 'cicd-engineer',\n 'security-specialist',\n 'frontend-developer',\n 'backend-developer'\n];\n\nexport const hookRouteTool: ToolDefinition = {\n name: 'hook_route',\n description: 'Route task to optimal agent using learned patterns and context',\n parameters: z.object({\n task: z.string().describe('Task description'),\n context: z.object({\n file: z.string().optional(),\n recentFiles: z.array(z.string()).optional(),\n errorContext: z.string().optional()\n }).optional().describe('Optional context'),\n explore: z.boolean().optional().default(false).describe('Force exploration')\n }),\n execute: async ({ task, context, explore }, { onProgress }) => {\n const startTime = Date.now();\n\n // TRY RUVECTOR INTELLIGENCE FIRST (Micro-LoRA + HNSW + MoE)\n if (USE_RUVECTOR_INTELLIGENCE && !explore) {\n try {\n const intelligentResult = await routeTaskIntelligent(task, context);\n\n // Also check for similar patterns from ReasoningBank\n const similarPatterns = await findSimilarPatterns(task, 3);\n\n // Get stats for monitoring\n const stats = await getIntelligenceStats();\n\n return {\n success: true,\n agent: intelligentResult.agent,\n confidence: intelligentResult.confidence,\n score: intelligentResult.routingResults[0]?.confidence || 0,\n factors: [\n {\n name: 'ruvector_intelligence',\n weight: 3.0,\n agent: intelligentResult.agent,\n evidence: `SONA + MoE routing in ${intelligentResult.latencyMs.toFixed(2)}ms`\n },\n ...intelligentResult.usedFeatures.map(f => ({\n name: f,\n weight: 1.0,\n agent: intelligentResult.agent,\n evidence: `Used ${f} for routing`\n }))\n ],\n alternatives: intelligentResult.routingResults.slice(1, 4).map(r => ({\n agent: r.agentId,\n score: r.confidence,\n whyNot: `Score ${r.confidence.toFixed(2)} < best`\n })),\n similarPatterns: similarPatterns.slice(0, 2),\n explored: false,\n latencyMs: Date.now() - startTime,\n timestamp: new Date().toISOString(),\n intelligenceStats: stats,\n engine: 'ruvector' // Mark that we used RuVector\n };\n } catch (error) {\n // Fall back to simple routing if intelligence fails\n console.warn('[Route] RuVector intelligence failed, using fallback:', error);\n }\n }\n\n // FALLBACK: Simple Q-learning routing (original implementation)\n const intel = loadIntelligence();\n\n // Track scoring factors\n const factors: Array<{\n name: string;\n weight: number;\n agent: string;\n evidence: string;\n }> = [];\n\n // Agent scores\n const scores: Record<string, number> = {};\n for (const agent of availableAgents) {\n scores[agent] = 0;\n }\n\n // 1. Score based on file context\n if (context?.file) {\n const ext = path.extname(context.file);\n const fileAgent = getAgentForFile(context.file);\n scores[fileAgent] = (scores[fileAgent] || 0) + 2.0;\n\n factors.push({\n name: 'file_pattern',\n weight: 2.0,\n agent: fileAgent,\n evidence: `File ${context.file} matches ${fileAgent}`\n });\n\n // Check learned patterns for this extension\n const state = `edit:${ext}`;\n if (intel.patterns[state]) {\n for (const [agent, value] of Object.entries(intel.patterns[state])) {\n if (typeof value === 'number') {\n scores[agent] = (scores[agent] || 0) + value;\n if (value > 0.5) {\n factors.push({\n name: 'learned_pattern',\n weight: value,\n agent,\n evidence: `Q-value ${value.toFixed(2)} for ${ext} edits`\n });\n }\n }\n }\n }\n }\n\n // 2. Score based on task keywords\n const taskLower = task.toLowerCase();\n const keywordScores: Record<string, string[]> = {\n 'test-engineer': ['test', 'spec', 'coverage', 'mock', 'assert'],\n 'documentation-specialist': ['document', 'readme', 'docs', 'explain', 'comment'],\n 'security-specialist': ['security', 'auth', 'encrypt', 'vulnerability', 'owasp'],\n 'database-specialist': ['database', 'sql', 'query', 'migration', 'schema'],\n 'devops-engineer': ['docker', 'deploy', 'ci', 'cd', 'kubernetes', 'container'],\n 'frontend-developer': ['ui', 'component', 'style', 'css', 'layout'],\n 'backend-developer': ['api', 'endpoint', 'server', 'route', 'middleware'],\n 'optimizer': ['optimize', 'performance', 'speed', 'cache', 'memory'],\n 'researcher': ['research', 'find', 'search', 'explore', 'understand'],\n 'analyst': ['analyze', 'review', 'audit', 'check', 'evaluate']\n };\n\n for (const [agent, keywords] of Object.entries(keywordScores)) {\n for (const keyword of keywords) {\n if (taskLower.includes(keyword)) {\n scores[agent] = (scores[agent] || 0) + 1.5;\n factors.push({\n name: 'keyword_match',\n weight: 1.5,\n agent,\n evidence: `Task contains \"${keyword}\"`\n });\n break; // Only count once per agent\n }\n }\n }\n\n // 3. Score based on memory similarity\n if (intel.memories.length > 0) {\n const taskEmbed = simpleEmbed(task);\n\n for (const mem of intel.memories) {\n if (mem.embedding && mem.type === 'success') {\n const similarity = cosineSimilarity(taskEmbed, mem.embedding);\n if (similarity > 0.4) {\n // Extract agent from memory content\n const agentMatch = mem.content.match(/by (\\S+)/);\n if (agentMatch && scores[agentMatch[1]] !== undefined) {\n scores[agentMatch[1]] += similarity;\n factors.push({\n name: 'memory_match',\n weight: similarity,\n agent: agentMatch[1],\n evidence: `Similar to: ${mem.content.slice(0, 50)}...`\n });\n }\n }\n }\n }\n }\n\n // 4. Check for error context\n if (context?.errorContext) {\n for (const ep of intel.errorPatterns) {\n if (context.errorContext.includes(ep.errorType)) {\n // Find agent with best success rate for this error\n let bestAgent = 'coder';\n let bestScore = 0;\n\n for (const [agent, score] of Object.entries(ep.agentSuccess)) {\n if (score > bestScore) {\n bestScore = score;\n bestAgent = agent;\n }\n }\n\n if (bestScore > 0) {\n scores[bestAgent] = (scores[bestAgent] || 0) + 2.0;\n factors.push({\n name: 'error_specialist',\n weight: 2.0,\n agent: bestAgent,\n evidence: `Best at fixing ${ep.errorType}`\n });\n }\n }\n }\n }\n\n // 5. Select best agent (with exploration)\n let selectedAgent = 'coder';\n let maxScore = 0;\n\n // Epsilon-greedy: explore with probability EXPLORATION_RATE\n if (explore || Math.random() < EXPLORATION_RATE) {\n // Random selection for exploration\n const agentsWithScores = Object.keys(scores).filter(a => scores[a] > 0);\n if (agentsWithScores.length > 0) {\n selectedAgent = agentsWithScores[Math.floor(Math.random() * agentsWithScores.length)];\n } else {\n selectedAgent = availableAgents[Math.floor(Math.random() * availableAgents.length)];\n }\n factors.push({\n name: 'exploration',\n weight: 0,\n agent: selectedAgent,\n evidence: 'Random exploration for learning'\n });\n } else {\n // Exploitation: select best\n for (const [agent, score] of Object.entries(scores)) {\n if (score > maxScore) {\n maxScore = score;\n selectedAgent = agent;\n }\n }\n }\n\n // Calculate confidence\n const totalScore = Object.values(scores).reduce((a, b) => a + b, 0);\n const confidence = totalScore > 0 ? maxScore / totalScore : 0.5;\n\n // Get alternatives\n const alternatives = Object.entries(scores)\n .filter(([agent]) => agent !== selectedAgent)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3)\n .map(([agent, score]) => ({\n agent,\n score,\n whyNot: score < maxScore ? `Score ${score.toFixed(2)} < ${maxScore.toFixed(2)}` : 'Not selected'\n }));\n\n const latency = Date.now() - startTime;\n\n return {\n success: true,\n agent: selectedAgent,\n confidence: Math.min(0.95, confidence),\n score: maxScore,\n factors: factors.slice(0, 5),\n alternatives,\n explored: explore || Math.random() < EXPLORATION_RATE,\n latencyMs: latency,\n timestamp: new Date().toISOString()\n };\n }\n};\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for hook tools
|
|
3
|
+
*/
|
|
4
|
+
export interface IntelligenceData {
|
|
5
|
+
patterns: Record<string, Record<string, number>>;
|
|
6
|
+
sequences: Record<string, Array<{
|
|
7
|
+
file: string;
|
|
8
|
+
score: number;
|
|
9
|
+
}>>;
|
|
10
|
+
memories: Array<{
|
|
11
|
+
content: string;
|
|
12
|
+
type: string;
|
|
13
|
+
created: string;
|
|
14
|
+
embedding?: number[];
|
|
15
|
+
}>;
|
|
16
|
+
dirPatterns: Record<string, string>;
|
|
17
|
+
errorPatterns: Array<{
|
|
18
|
+
errorType: string;
|
|
19
|
+
context: string;
|
|
20
|
+
resolution: string;
|
|
21
|
+
agentSuccess: Record<string, number>;
|
|
22
|
+
}>;
|
|
23
|
+
metrics: {
|
|
24
|
+
totalRoutes: number;
|
|
25
|
+
successfulRoutes: number;
|
|
26
|
+
routingHistory: Array<{
|
|
27
|
+
timestamp: string;
|
|
28
|
+
task: string;
|
|
29
|
+
agent: string;
|
|
30
|
+
success: boolean;
|
|
31
|
+
}>;
|
|
32
|
+
};
|
|
33
|
+
pretrained?: {
|
|
34
|
+
date: string;
|
|
35
|
+
stats: Record<string, number>;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export declare function loadIntelligence(): IntelligenceData;
|
|
39
|
+
export declare function saveIntelligence(data: IntelligenceData): void;
|
|
40
|
+
export declare const agentMapping: Record<string, string>;
|
|
41
|
+
export declare function getAgentForFile(filePath: string): string;
|
|
42
|
+
export declare function simpleEmbed(text: string): number[];
|
|
43
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
44
|
+
export declare const dangerousPatterns: RegExp[];
|
|
45
|
+
export declare function assessCommandRisk(command: string): number;
|
|
46
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/shared.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAClE,QAAQ,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC,CAAC;IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,aAAa,EAAE,KAAK,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACtC,CAAC,CAAC;IACH,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,KAAK,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,EAAE,OAAO,CAAC;SAClB,CAAC,CAAC;KACJ,CAAC;IACF,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACH;AAiBD,wBAAgB,gBAAgB,IAAI,gBAAgB,CAWnD;AAGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAW7D;AAGD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoB/C,CAAC;AAGF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAyBxD;AAGD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBlD;AAGD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAejE;AAGD,eAAO,MAAM,iBAAiB,UAW7B,CAAC;AAGF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAgBzD"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for hook tools
|
|
3
|
+
*/
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
// Intelligence data storage
|
|
7
|
+
const INTELLIGENCE_PATH = '.agentic-flow/intelligence.json';
|
|
8
|
+
// Default intelligence data
|
|
9
|
+
const defaultIntelligence = {
|
|
10
|
+
patterns: {},
|
|
11
|
+
sequences: {},
|
|
12
|
+
memories: [],
|
|
13
|
+
dirPatterns: {},
|
|
14
|
+
errorPatterns: [],
|
|
15
|
+
metrics: {
|
|
16
|
+
totalRoutes: 0,
|
|
17
|
+
successfulRoutes: 0,
|
|
18
|
+
routingHistory: []
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
// Load intelligence data
|
|
22
|
+
export function loadIntelligence() {
|
|
23
|
+
try {
|
|
24
|
+
const fullPath = path.join(process.cwd(), INTELLIGENCE_PATH);
|
|
25
|
+
if (fs.existsSync(fullPath)) {
|
|
26
|
+
const data = fs.readFileSync(fullPath, 'utf-8');
|
|
27
|
+
return { ...defaultIntelligence, ...JSON.parse(data) };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
// Return default on error
|
|
32
|
+
}
|
|
33
|
+
return { ...defaultIntelligence };
|
|
34
|
+
}
|
|
35
|
+
// Save intelligence data
|
|
36
|
+
export function saveIntelligence(data) {
|
|
37
|
+
try {
|
|
38
|
+
const fullPath = path.join(process.cwd(), INTELLIGENCE_PATH);
|
|
39
|
+
const dir = path.dirname(fullPath);
|
|
40
|
+
if (!fs.existsSync(dir)) {
|
|
41
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
fs.writeFileSync(fullPath, JSON.stringify(data, null, 2));
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
console.error('[Hook] Failed to save intelligence:', e);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Agent mapping by file extension
|
|
50
|
+
export const agentMapping = {
|
|
51
|
+
'.rs': 'rust-developer',
|
|
52
|
+
'.ts': 'typescript-developer',
|
|
53
|
+
'.tsx': 'react-developer',
|
|
54
|
+
'.js': 'javascript-developer',
|
|
55
|
+
'.jsx': 'react-developer',
|
|
56
|
+
'.py': 'python-developer',
|
|
57
|
+
'.go': 'go-developer',
|
|
58
|
+
'.sql': 'database-specialist',
|
|
59
|
+
'.md': 'documentation-specialist',
|
|
60
|
+
'.json': 'config-specialist',
|
|
61
|
+
'.yaml': 'config-specialist',
|
|
62
|
+
'.yml': 'config-specialist',
|
|
63
|
+
'.html': 'frontend-developer',
|
|
64
|
+
'.css': 'frontend-developer',
|
|
65
|
+
'.scss': 'frontend-developer',
|
|
66
|
+
'.vue': 'vue-developer',
|
|
67
|
+
'.svelte': 'svelte-developer',
|
|
68
|
+
'Dockerfile': 'devops-engineer',
|
|
69
|
+
'Makefile': 'devops-engineer'
|
|
70
|
+
};
|
|
71
|
+
// Get agent for file
|
|
72
|
+
export function getAgentForFile(filePath) {
|
|
73
|
+
const ext = path.extname(filePath);
|
|
74
|
+
const basename = path.basename(filePath);
|
|
75
|
+
// Check for test files FIRST (higher priority)
|
|
76
|
+
if (filePath.includes('.test.') || filePath.includes('.spec.') || filePath.includes('_test.')) {
|
|
77
|
+
return 'test-engineer';
|
|
78
|
+
}
|
|
79
|
+
// Check for CI/CD
|
|
80
|
+
if (filePath.includes('.github/workflows')) {
|
|
81
|
+
return 'cicd-engineer';
|
|
82
|
+
}
|
|
83
|
+
// Check basename (for Dockerfile, Makefile, etc.)
|
|
84
|
+
if (agentMapping[basename]) {
|
|
85
|
+
return agentMapping[basename];
|
|
86
|
+
}
|
|
87
|
+
// Check extension
|
|
88
|
+
if (agentMapping[ext]) {
|
|
89
|
+
return agentMapping[ext];
|
|
90
|
+
}
|
|
91
|
+
return 'coder'; // Default
|
|
92
|
+
}
|
|
93
|
+
// Compute simple embedding (hash-based for speed)
|
|
94
|
+
export function simpleEmbed(text) {
|
|
95
|
+
const embedding = new Array(64).fill(0);
|
|
96
|
+
const words = text.toLowerCase().split(/\s+/);
|
|
97
|
+
for (const word of words) {
|
|
98
|
+
for (let i = 0; i < word.length; i++) {
|
|
99
|
+
const idx = (word.charCodeAt(i) * (i + 1)) % 64;
|
|
100
|
+
embedding[idx] += 1;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Normalize
|
|
104
|
+
const magnitude = Math.sqrt(embedding.reduce((sum, val) => sum + val * val, 0));
|
|
105
|
+
if (magnitude > 0) {
|
|
106
|
+
for (let i = 0; i < embedding.length; i++) {
|
|
107
|
+
embedding[i] /= magnitude;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return embedding;
|
|
111
|
+
}
|
|
112
|
+
// Cosine similarity
|
|
113
|
+
export function cosineSimilarity(a, b) {
|
|
114
|
+
if (a.length !== b.length)
|
|
115
|
+
return 0;
|
|
116
|
+
let dotProduct = 0;
|
|
117
|
+
let normA = 0;
|
|
118
|
+
let normB = 0;
|
|
119
|
+
for (let i = 0; i < a.length; i++) {
|
|
120
|
+
dotProduct += a[i] * b[i];
|
|
121
|
+
normA += a[i] * a[i];
|
|
122
|
+
normB += b[i] * b[i];
|
|
123
|
+
}
|
|
124
|
+
const magnitude = Math.sqrt(normA) * Math.sqrt(normB);
|
|
125
|
+
return magnitude > 0 ? dotProduct / magnitude : 0;
|
|
126
|
+
}
|
|
127
|
+
// Dangerous command patterns
|
|
128
|
+
export const dangerousPatterns = [
|
|
129
|
+
/rm\s+-rf\s+\//,
|
|
130
|
+
/rm\s+-rf\s+\*/,
|
|
131
|
+
/sudo\s+rm/,
|
|
132
|
+
/chmod\s+777/,
|
|
133
|
+
/>\s*\/dev\/sd/,
|
|
134
|
+
/mkfs\./,
|
|
135
|
+
/dd\s+if=/,
|
|
136
|
+
/:(){.*};:/, // Fork bomb
|
|
137
|
+
/curl.*\|\s*(ba)?sh/,
|
|
138
|
+
/wget.*\|\s*(ba)?sh/
|
|
139
|
+
];
|
|
140
|
+
// Assess command risk
|
|
141
|
+
export function assessCommandRisk(command) {
|
|
142
|
+
let risk = 0;
|
|
143
|
+
for (const pattern of dangerousPatterns) {
|
|
144
|
+
if (pattern.test(command)) {
|
|
145
|
+
risk = Math.max(risk, 0.9);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Medium risk patterns
|
|
149
|
+
if (/sudo/.test(command))
|
|
150
|
+
risk = Math.max(risk, 0.5);
|
|
151
|
+
if (/rm\s+-/.test(command))
|
|
152
|
+
risk = Math.max(risk, 0.4);
|
|
153
|
+
if (/chmod/.test(command))
|
|
154
|
+
risk = Math.max(risk, 0.3);
|
|
155
|
+
if (/chown/.test(command))
|
|
156
|
+
risk = Math.max(risk, 0.3);
|
|
157
|
+
return risk;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/shared.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared utilities for hook tools\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\n\n// Intelligence data storage\nconst INTELLIGENCE_PATH = '.agentic-flow/intelligence.json';\n\nexport interface IntelligenceData {\n patterns: Record<string, Record<string, number>>;\n sequences: Record<string, Array<{ file: string; score: number }>>;\n memories: Array<{\n content: string;\n type: string;\n created: string;\n embedding?: number[];\n }>;\n dirPatterns: Record<string, string>;\n errorPatterns: Array<{\n errorType: string;\n context: string;\n resolution: string;\n agentSuccess: Record<string, number>;\n }>;\n metrics: {\n totalRoutes: number;\n successfulRoutes: number;\n routingHistory: Array<{\n timestamp: string;\n task: string;\n agent: string;\n success: boolean;\n }>;\n };\n pretrained?: {\n date: string;\n stats: Record<string, number>;\n };\n}\n\n// Default intelligence data\nconst defaultIntelligence: IntelligenceData = {\n patterns: {},\n sequences: {},\n memories: [],\n dirPatterns: {},\n errorPatterns: [],\n metrics: {\n totalRoutes: 0,\n successfulRoutes: 0,\n routingHistory: []\n }\n};\n\n// Load intelligence data\nexport function loadIntelligence(): IntelligenceData {\n try {\n const fullPath = path.join(process.cwd(), INTELLIGENCE_PATH);\n if (fs.existsSync(fullPath)) {\n const data = fs.readFileSync(fullPath, 'utf-8');\n return { ...defaultIntelligence, ...JSON.parse(data) };\n }\n } catch (e) {\n // Return default on error\n }\n return { ...defaultIntelligence };\n}\n\n// Save intelligence data\nexport function saveIntelligence(data: IntelligenceData): void {\n try {\n const fullPath = path.join(process.cwd(), INTELLIGENCE_PATH);\n const dir = path.dirname(fullPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(fullPath, JSON.stringify(data, null, 2));\n } catch (e) {\n console.error('[Hook] Failed to save intelligence:', e);\n }\n}\n\n// Agent mapping by file extension\nexport const agentMapping: Record<string, string> = {\n '.rs': 'rust-developer',\n '.ts': 'typescript-developer',\n '.tsx': 'react-developer',\n '.js': 'javascript-developer',\n '.jsx': 'react-developer',\n '.py': 'python-developer',\n '.go': 'go-developer',\n '.sql': 'database-specialist',\n '.md': 'documentation-specialist',\n '.json': 'config-specialist',\n '.yaml': 'config-specialist',\n '.yml': 'config-specialist',\n '.html': 'frontend-developer',\n '.css': 'frontend-developer',\n '.scss': 'frontend-developer',\n '.vue': 'vue-developer',\n '.svelte': 'svelte-developer',\n 'Dockerfile': 'devops-engineer',\n 'Makefile': 'devops-engineer'\n};\n\n// Get agent for file\nexport function getAgentForFile(filePath: string): string {\n const ext = path.extname(filePath);\n const basename = path.basename(filePath);\n\n // Check for test files FIRST (higher priority)\n if (filePath.includes('.test.') || filePath.includes('.spec.') || filePath.includes('_test.')) {\n return 'test-engineer';\n }\n\n // Check for CI/CD\n if (filePath.includes('.github/workflows')) {\n return 'cicd-engineer';\n }\n\n // Check basename (for Dockerfile, Makefile, etc.)\n if (agentMapping[basename]) {\n return agentMapping[basename];\n }\n\n // Check extension\n if (agentMapping[ext]) {\n return agentMapping[ext];\n }\n\n return 'coder'; // Default\n}\n\n// Compute simple embedding (hash-based for speed)\nexport function simpleEmbed(text: string): number[] {\n const embedding = new Array(64).fill(0);\n const words = text.toLowerCase().split(/\\s+/);\n\n for (const word of words) {\n for (let i = 0; i < word.length; i++) {\n const idx = (word.charCodeAt(i) * (i + 1)) % 64;\n embedding[idx] += 1;\n }\n }\n\n // Normalize\n const magnitude = Math.sqrt(embedding.reduce((sum, val) => sum + val * val, 0));\n if (magnitude > 0) {\n for (let i = 0; i < embedding.length; i++) {\n embedding[i] /= magnitude;\n }\n }\n\n return embedding;\n}\n\n// Cosine similarity\nexport function cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) return 0;\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const magnitude = Math.sqrt(normA) * Math.sqrt(normB);\n return magnitude > 0 ? dotProduct / magnitude : 0;\n}\n\n// Dangerous command patterns\nexport const dangerousPatterns = [\n /rm\\s+-rf\\s+\\//,\n /rm\\s+-rf\\s+\\*/,\n /sudo\\s+rm/,\n /chmod\\s+777/,\n />\\s*\\/dev\\/sd/,\n /mkfs\\./,\n /dd\\s+if=/,\n /:(){.*};:/, // Fork bomb\n /curl.*\\|\\s*(ba)?sh/,\n /wget.*\\|\\s*(ba)?sh/\n];\n\n// Assess command risk\nexport function assessCommandRisk(command: string): number {\n let risk = 0;\n\n for (const pattern of dangerousPatterns) {\n if (pattern.test(command)) {\n risk = Math.max(risk, 0.9);\n }\n }\n\n // Medium risk patterns\n if (/sudo/.test(command)) risk = Math.max(risk, 0.5);\n if (/rm\\s+-/.test(command)) risk = Math.max(risk, 0.4);\n if (/chmod/.test(command)) risk = Math.max(risk, 0.3);\n if (/chown/.test(command)) risk = Math.max(risk, 0.3);\n\n return risk;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/transfer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAW3D,eAAO,MAAM,gBAAgB,EAAE,cAwK9B,CAAC"}
|