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.
Files changed (218) hide show
  1. package/CHANGELOG.md +352 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentdb/controllers/EmbeddingService.d.ts +37 -0
  4. package/dist/agentdb/controllers/EmbeddingService.d.ts.map +1 -0
  5. package/dist/agentdb/controllers/EmbeddingService.js +1 -0
  6. package/dist/agentdb/controllers/EmbeddingService.js.map +1 -0
  7. package/dist/billing/mcp/tools.d.ts.map +1 -1
  8. package/dist/billing/mcp/tools.js +2 -0
  9. package/dist/billing/mcp/tools.js.map +1 -1
  10. package/dist/cli/commands/hooks.d.ts +18 -0
  11. package/dist/cli/commands/hooks.d.ts.map +1 -0
  12. package/dist/cli/commands/hooks.js +755 -0
  13. package/dist/cli/commands/hooks.js.map +1 -0
  14. package/dist/cli-proxy.d.ts +1 -1
  15. package/dist/cli-proxy.d.ts.map +1 -1
  16. package/dist/cli-proxy.js +28 -1
  17. package/dist/cli-proxy.js.map +1 -1
  18. package/dist/core/agentdb-fast.js +3 -3
  19. package/dist/core/agentdb-fast.js.map +1 -1
  20. package/dist/core/agentdb-wrapper-enhanced.d.ts.map +1 -1
  21. package/dist/core/agentdb-wrapper-enhanced.js +32 -17
  22. package/dist/core/agentdb-wrapper-enhanced.js.map +1 -1
  23. package/dist/core/attention-native.d.ts +1 -0
  24. package/dist/core/attention-native.d.ts.map +1 -1
  25. package/dist/core/attention-native.js +6 -1
  26. package/dist/core/attention-native.js.map +1 -1
  27. package/dist/federation/integrations/supabase-adapter-debug.js +3 -3
  28. package/dist/federation/integrations/supabase-adapter-debug.js.map +1 -1
  29. package/dist/intelligence/EmbeddingCache.d.ts +112 -0
  30. package/dist/intelligence/EmbeddingCache.d.ts.map +1 -0
  31. package/dist/intelligence/EmbeddingCache.js +624 -0
  32. package/dist/intelligence/EmbeddingCache.js.map +1 -0
  33. package/dist/intelligence/EmbeddingService.d.ts +380 -0
  34. package/dist/intelligence/EmbeddingService.d.ts.map +1 -0
  35. package/dist/intelligence/EmbeddingService.js +1484 -0
  36. package/dist/intelligence/EmbeddingService.js.map +1 -0
  37. package/dist/intelligence/IntelligenceStore.d.ts +168 -0
  38. package/dist/intelligence/IntelligenceStore.d.ts.map +1 -0
  39. package/dist/intelligence/IntelligenceStore.js +364 -0
  40. package/dist/intelligence/IntelligenceStore.js.map +1 -0
  41. package/dist/intelligence/RuVectorIntelligence.d.ts +362 -0
  42. package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -0
  43. package/dist/intelligence/RuVectorIntelligence.js +853 -0
  44. package/dist/intelligence/RuVectorIntelligence.js.map +1 -0
  45. package/dist/intelligence/embedding-benchmark.d.ts +7 -0
  46. package/dist/intelligence/embedding-benchmark.d.ts.map +1 -0
  47. package/dist/intelligence/embedding-benchmark.js +155 -0
  48. package/dist/intelligence/embedding-benchmark.js.map +1 -0
  49. package/dist/intelligence/index.d.ts +14 -0
  50. package/dist/intelligence/index.d.ts.map +1 -0
  51. package/dist/intelligence/index.js +14 -0
  52. package/dist/intelligence/index.js.map +1 -0
  53. package/dist/llm/RuvLLMOrchestrator.d.ts +184 -0
  54. package/dist/llm/RuvLLMOrchestrator.d.ts.map +1 -0
  55. package/dist/llm/RuvLLMOrchestrator.js +442 -0
  56. package/dist/llm/RuvLLMOrchestrator.js.map +1 -0
  57. package/dist/llm/index.d.ts +9 -0
  58. package/dist/llm/index.d.ts.map +1 -0
  59. package/dist/llm/index.js +8 -0
  60. package/dist/llm/index.js.map +1 -0
  61. package/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
  62. package/dist/mcp/claudeFlowSdkServer.js +86 -21
  63. package/dist/mcp/claudeFlowSdkServer.js.map +1 -1
  64. package/dist/mcp/fastmcp/servers/hooks-server.d.ts +15 -0
  65. package/dist/mcp/fastmcp/servers/hooks-server.d.ts.map +1 -0
  66. package/dist/mcp/fastmcp/servers/hooks-server.js +63 -0
  67. package/dist/mcp/fastmcp/servers/hooks-server.js.map +1 -0
  68. package/dist/mcp/fastmcp/tools/hooks/benchmark.d.ts +20 -0
  69. package/dist/mcp/fastmcp/tools/hooks/benchmark.d.ts.map +1 -0
  70. package/dist/mcp/fastmcp/tools/hooks/benchmark.js +110 -0
  71. package/dist/mcp/fastmcp/tools/hooks/benchmark.js.map +1 -0
  72. package/dist/mcp/fastmcp/tools/hooks/build-agents.d.ts +7 -0
  73. package/dist/mcp/fastmcp/tools/hooks/build-agents.d.ts.map +1 -0
  74. package/dist/mcp/fastmcp/tools/hooks/build-agents.js +276 -0
  75. package/dist/mcp/fastmcp/tools/hooks/build-agents.js.map +1 -0
  76. package/dist/mcp/fastmcp/tools/hooks/explain.d.ts +6 -0
  77. package/dist/mcp/fastmcp/tools/hooks/explain.d.ts.map +1 -0
  78. package/dist/mcp/fastmcp/tools/hooks/explain.js +164 -0
  79. package/dist/mcp/fastmcp/tools/hooks/explain.js.map +1 -0
  80. package/dist/mcp/fastmcp/tools/hooks/index.d.ts +28 -0
  81. package/dist/mcp/fastmcp/tools/hooks/index.d.ts.map +1 -0
  82. package/dist/mcp/fastmcp/tools/hooks/index.js +59 -0
  83. package/dist/mcp/fastmcp/tools/hooks/index.js.map +1 -0
  84. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts +307 -0
  85. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts.map +1 -0
  86. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +714 -0
  87. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -0
  88. package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts +58 -0
  89. package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts.map +1 -0
  90. package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js +425 -0
  91. package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js.map +1 -0
  92. package/dist/mcp/fastmcp/tools/hooks/metrics.d.ts +6 -0
  93. package/dist/mcp/fastmcp/tools/hooks/metrics.d.ts.map +1 -0
  94. package/dist/mcp/fastmcp/tools/hooks/metrics.js +137 -0
  95. package/dist/mcp/fastmcp/tools/hooks/metrics.js.map +1 -0
  96. package/dist/mcp/fastmcp/tools/hooks/post-command.d.ts +7 -0
  97. package/dist/mcp/fastmcp/tools/hooks/post-command.d.ts.map +1 -0
  98. package/dist/mcp/fastmcp/tools/hooks/post-command.js +91 -0
  99. package/dist/mcp/fastmcp/tools/hooks/post-command.js.map +1 -0
  100. package/dist/mcp/fastmcp/tools/hooks/post-edit.d.ts +12 -0
  101. package/dist/mcp/fastmcp/tools/hooks/post-edit.d.ts.map +1 -0
  102. package/dist/mcp/fastmcp/tools/hooks/post-edit.js +146 -0
  103. package/dist/mcp/fastmcp/tools/hooks/post-edit.js.map +1 -0
  104. package/dist/mcp/fastmcp/tools/hooks/pre-command.d.ts +7 -0
  105. package/dist/mcp/fastmcp/tools/hooks/pre-command.d.ts.map +1 -0
  106. package/dist/mcp/fastmcp/tools/hooks/pre-command.js +70 -0
  107. package/dist/mcp/fastmcp/tools/hooks/pre-command.js.map +1 -0
  108. package/dist/mcp/fastmcp/tools/hooks/pre-edit.d.ts +14 -0
  109. package/dist/mcp/fastmcp/tools/hooks/pre-edit.d.ts.map +1 -0
  110. package/dist/mcp/fastmcp/tools/hooks/pre-edit.js +121 -0
  111. package/dist/mcp/fastmcp/tools/hooks/pre-edit.js.map +1 -0
  112. package/dist/mcp/fastmcp/tools/hooks/pretrain.d.ts +7 -0
  113. package/dist/mcp/fastmcp/tools/hooks/pretrain.d.ts.map +1 -0
  114. package/dist/mcp/fastmcp/tools/hooks/pretrain.js +171 -0
  115. package/dist/mcp/fastmcp/tools/hooks/pretrain.js.map +1 -0
  116. package/dist/mcp/fastmcp/tools/hooks/route.d.ts +12 -0
  117. package/dist/mcp/fastmcp/tools/hooks/route.d.ts.map +1 -0
  118. package/dist/mcp/fastmcp/tools/hooks/route.js +267 -0
  119. package/dist/mcp/fastmcp/tools/hooks/route.js.map +1 -0
  120. package/dist/mcp/fastmcp/tools/hooks/shared.d.ts +46 -0
  121. package/dist/mcp/fastmcp/tools/hooks/shared.d.ts.map +1 -0
  122. package/dist/mcp/fastmcp/tools/hooks/shared.js +159 -0
  123. package/dist/mcp/fastmcp/tools/hooks/shared.js.map +1 -0
  124. package/dist/mcp/fastmcp/tools/hooks/transfer.d.ts +7 -0
  125. package/dist/mcp/fastmcp/tools/hooks/transfer.d.ts.map +1 -0
  126. package/dist/mcp/fastmcp/tools/hooks/transfer.js +151 -0
  127. package/dist/mcp/fastmcp/tools/hooks/transfer.js.map +1 -0
  128. package/dist/mcp/tools/agent-booster-tools.d.ts +10 -1
  129. package/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -1
  130. package/dist/mcp/tools/agent-booster-tools.js.map +1 -1
  131. package/dist/mcp/tools/sona-tools.d.ts.map +1 -1
  132. package/dist/mcp/tools/sona-tools.js +15 -3
  133. package/dist/mcp/tools/sona-tools.js.map +1 -1
  134. package/dist/memory/SharedMemoryPool.d.ts +16 -3
  135. package/dist/memory/SharedMemoryPool.d.ts.map +1 -1
  136. package/dist/memory/SharedMemoryPool.js +33 -1
  137. package/dist/memory/SharedMemoryPool.js.map +1 -1
  138. package/dist/middleware/auth.middleware.d.ts +114 -0
  139. package/dist/middleware/auth.middleware.d.ts.map +1 -0
  140. package/dist/middleware/auth.middleware.js +222 -0
  141. package/dist/middleware/auth.middleware.js.map +1 -0
  142. package/dist/optimizations/agent-booster-migration.d.ts.map +1 -1
  143. package/dist/optimizations/agent-booster-migration.js.map +1 -1
  144. package/dist/proxy/anthropic-to-gemini.d.ts.map +1 -1
  145. package/dist/proxy/anthropic-to-gemini.js.map +1 -1
  146. package/dist/proxy/anthropic-to-openrouter.d.ts.map +1 -1
  147. package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
  148. package/dist/proxy/anthropic-to-requesty.d.ts.map +1 -1
  149. package/dist/proxy/anthropic-to-requesty.js.map +1 -1
  150. package/dist/proxy/quic-proxy.d.ts +0 -1
  151. package/dist/proxy/quic-proxy.d.ts.map +1 -1
  152. package/dist/proxy/quic-proxy.js +2 -1
  153. package/dist/proxy/quic-proxy.js.map +1 -1
  154. package/dist/reasoningbank/AdvancedMemory.d.ts.map +1 -1
  155. package/dist/reasoningbank/AdvancedMemory.js +12 -1
  156. package/dist/reasoningbank/AdvancedMemory.js.map +1 -1
  157. package/dist/reasoningbank/HybridBackend.d.ts +9 -0
  158. package/dist/reasoningbank/HybridBackend.d.ts.map +1 -1
  159. package/dist/reasoningbank/HybridBackend.js +48 -4
  160. package/dist/reasoningbank/HybridBackend.js.map +1 -1
  161. package/dist/reasoningbank/backend-selector.d.ts +1 -1
  162. package/dist/reasoningbank/backend-selector.d.ts.map +1 -1
  163. package/dist/reasoningbank/backend-selector.js.map +1 -1
  164. package/dist/reasoningbank/index-new.d.ts +0 -6
  165. package/dist/reasoningbank/index-new.d.ts.map +1 -1
  166. package/dist/reasoningbank/index-new.js +9 -7
  167. package/dist/reasoningbank/index-new.js.map +1 -1
  168. package/dist/reasoningbank/index.d.ts +1 -6
  169. package/dist/reasoningbank/index.d.ts.map +1 -1
  170. package/dist/reasoningbank/index.js +10 -7
  171. package/dist/reasoningbank/index.js.map +1 -1
  172. package/dist/router/providers/onnx-local.d.ts.map +1 -1
  173. package/dist/router/providers/onnx-local.js +3 -1
  174. package/dist/router/providers/onnx-local.js.map +1 -1
  175. package/dist/routing/CircuitBreakerRouter.d.ts +187 -0
  176. package/dist/routing/CircuitBreakerRouter.d.ts.map +1 -0
  177. package/dist/routing/CircuitBreakerRouter.js +460 -0
  178. package/dist/routing/CircuitBreakerRouter.js.map +1 -0
  179. package/dist/routing/SemanticRouter.d.ts +164 -0
  180. package/dist/routing/SemanticRouter.d.ts.map +1 -0
  181. package/dist/routing/SemanticRouter.js +291 -0
  182. package/dist/routing/SemanticRouter.js.map +1 -0
  183. package/dist/routing/index.d.ts +12 -0
  184. package/dist/routing/index.d.ts.map +1 -0
  185. package/dist/routing/index.js +10 -0
  186. package/dist/routing/index.js.map +1 -0
  187. package/dist/services/embedding-service.d.ts.map +1 -1
  188. package/dist/services/embedding-service.js +5 -2
  189. package/dist/services/embedding-service.js.map +1 -1
  190. package/dist/services/sona-agent-training.js +1 -1
  191. package/dist/services/sona-agent-training.js.map +1 -1
  192. package/dist/services/sona-agentdb-integration.d.ts.map +1 -1
  193. package/dist/services/sona-agentdb-integration.js +10 -5
  194. package/dist/services/sona-agentdb-integration.js.map +1 -1
  195. package/dist/services/sona-service.d.ts +6 -6
  196. package/dist/services/sona-service.d.ts.map +1 -1
  197. package/dist/services/sona-service.js +3 -1
  198. package/dist/services/sona-service.js.map +1 -1
  199. package/dist/utils/agentdb-runtime-patch.d.ts +1 -0
  200. package/dist/utils/agentdb-runtime-patch.d.ts.map +1 -1
  201. package/dist/utils/agentdb-runtime-patch.js +97 -2
  202. package/dist/utils/agentdb-runtime-patch.js.map +1 -1
  203. package/dist/utils/audit-logger.d.ts +115 -0
  204. package/dist/utils/audit-logger.d.ts.map +1 -0
  205. package/dist/utils/audit-logger.js +228 -0
  206. package/dist/utils/audit-logger.js.map +1 -0
  207. package/dist/utils/cli.d.ts +1 -1
  208. package/dist/utils/cli.d.ts.map +1 -1
  209. package/dist/utils/cli.js +5 -0
  210. package/dist/utils/cli.js.map +1 -1
  211. package/dist/utils/input-validator.d.ts +116 -0
  212. package/dist/utils/input-validator.d.ts.map +1 -0
  213. package/dist/utils/input-validator.js +299 -0
  214. package/dist/utils/input-validator.js.map +1 -0
  215. package/dist/utils/rate-limiter.js +2 -2
  216. package/dist/utils/rate-limiter.js.map +1 -1
  217. package/package.json +14 -3
  218. 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,7 @@
1
+ /**
2
+ * Transfer Hook - Cross-project pattern transfer
3
+ * Enables knowledge sharing between projects
4
+ */
5
+ import type { ToolDefinition } from '../../types/index.js';
6
+ export declare const hookTransferTool: ToolDefinition;
7
+ //# sourceMappingURL=transfer.d.ts.map
@@ -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"}