agentic-flow 2.0.1-alpha.4 → 2.0.1-alpha.8

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 (197) hide show
  1. package/CHANGELOG.md +26 -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 +750 -0
  13. package/dist/cli/commands/hooks.js.map +1 -0
  14. package/dist/cli-proxy.js +26 -1
  15. package/dist/cli-proxy.js.map +1 -1
  16. package/dist/core/agentdb-fast.js +3 -3
  17. package/dist/core/agentdb-fast.js.map +1 -1
  18. package/dist/core/agentdb-wrapper-enhanced.d.ts.map +1 -1
  19. package/dist/core/agentdb-wrapper-enhanced.js +32 -17
  20. package/dist/core/agentdb-wrapper-enhanced.js.map +1 -1
  21. package/dist/core/attention-native.d.ts +1 -0
  22. package/dist/core/attention-native.d.ts.map +1 -1
  23. package/dist/core/attention-native.js +6 -1
  24. package/dist/core/attention-native.js.map +1 -1
  25. package/dist/federation/integrations/supabase-adapter-debug.js +3 -3
  26. package/dist/federation/integrations/supabase-adapter-debug.js.map +1 -1
  27. package/dist/intelligence/RuVectorIntelligence.d.ts +362 -0
  28. package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -0
  29. package/dist/intelligence/RuVectorIntelligence.js +852 -0
  30. package/dist/intelligence/RuVectorIntelligence.js.map +1 -0
  31. package/dist/intelligence/index.d.ts +14 -0
  32. package/dist/intelligence/index.d.ts.map +1 -0
  33. package/dist/intelligence/index.js +14 -0
  34. package/dist/intelligence/index.js.map +1 -0
  35. package/dist/llm/RuvLLMOrchestrator.d.ts +184 -0
  36. package/dist/llm/RuvLLMOrchestrator.d.ts.map +1 -0
  37. package/dist/llm/RuvLLMOrchestrator.js +442 -0
  38. package/dist/llm/RuvLLMOrchestrator.js.map +1 -0
  39. package/dist/llm/index.d.ts +9 -0
  40. package/dist/llm/index.d.ts.map +1 -0
  41. package/dist/llm/index.js +8 -0
  42. package/dist/llm/index.js.map +1 -0
  43. package/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
  44. package/dist/mcp/claudeFlowSdkServer.js +86 -21
  45. package/dist/mcp/claudeFlowSdkServer.js.map +1 -1
  46. package/dist/mcp/fastmcp/servers/hooks-server.d.ts +15 -0
  47. package/dist/mcp/fastmcp/servers/hooks-server.d.ts.map +1 -0
  48. package/dist/mcp/fastmcp/servers/hooks-server.js +63 -0
  49. package/dist/mcp/fastmcp/servers/hooks-server.js.map +1 -0
  50. package/dist/mcp/fastmcp/tools/hooks/benchmark.d.ts +20 -0
  51. package/dist/mcp/fastmcp/tools/hooks/benchmark.d.ts.map +1 -0
  52. package/dist/mcp/fastmcp/tools/hooks/benchmark.js +110 -0
  53. package/dist/mcp/fastmcp/tools/hooks/benchmark.js.map +1 -0
  54. package/dist/mcp/fastmcp/tools/hooks/build-agents.d.ts +7 -0
  55. package/dist/mcp/fastmcp/tools/hooks/build-agents.d.ts.map +1 -0
  56. package/dist/mcp/fastmcp/tools/hooks/build-agents.js +276 -0
  57. package/dist/mcp/fastmcp/tools/hooks/build-agents.js.map +1 -0
  58. package/dist/mcp/fastmcp/tools/hooks/explain.d.ts +6 -0
  59. package/dist/mcp/fastmcp/tools/hooks/explain.d.ts.map +1 -0
  60. package/dist/mcp/fastmcp/tools/hooks/explain.js +164 -0
  61. package/dist/mcp/fastmcp/tools/hooks/explain.js.map +1 -0
  62. package/dist/mcp/fastmcp/tools/hooks/index.d.ts +28 -0
  63. package/dist/mcp/fastmcp/tools/hooks/index.d.ts.map +1 -0
  64. package/dist/mcp/fastmcp/tools/hooks/index.js +59 -0
  65. package/dist/mcp/fastmcp/tools/hooks/index.js.map +1 -0
  66. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts +91 -0
  67. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts.map +1 -0
  68. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +269 -0
  69. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -0
  70. package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts +58 -0
  71. package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts.map +1 -0
  72. package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js +416 -0
  73. package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js.map +1 -0
  74. package/dist/mcp/fastmcp/tools/hooks/metrics.d.ts +6 -0
  75. package/dist/mcp/fastmcp/tools/hooks/metrics.d.ts.map +1 -0
  76. package/dist/mcp/fastmcp/tools/hooks/metrics.js +137 -0
  77. package/dist/mcp/fastmcp/tools/hooks/metrics.js.map +1 -0
  78. package/dist/mcp/fastmcp/tools/hooks/post-command.d.ts +7 -0
  79. package/dist/mcp/fastmcp/tools/hooks/post-command.d.ts.map +1 -0
  80. package/dist/mcp/fastmcp/tools/hooks/post-command.js +91 -0
  81. package/dist/mcp/fastmcp/tools/hooks/post-command.js.map +1 -0
  82. package/dist/mcp/fastmcp/tools/hooks/post-edit.d.ts +12 -0
  83. package/dist/mcp/fastmcp/tools/hooks/post-edit.d.ts.map +1 -0
  84. package/dist/mcp/fastmcp/tools/hooks/post-edit.js +146 -0
  85. package/dist/mcp/fastmcp/tools/hooks/post-edit.js.map +1 -0
  86. package/dist/mcp/fastmcp/tools/hooks/pre-command.d.ts +7 -0
  87. package/dist/mcp/fastmcp/tools/hooks/pre-command.d.ts.map +1 -0
  88. package/dist/mcp/fastmcp/tools/hooks/pre-command.js +70 -0
  89. package/dist/mcp/fastmcp/tools/hooks/pre-command.js.map +1 -0
  90. package/dist/mcp/fastmcp/tools/hooks/pre-edit.d.ts +14 -0
  91. package/dist/mcp/fastmcp/tools/hooks/pre-edit.d.ts.map +1 -0
  92. package/dist/mcp/fastmcp/tools/hooks/pre-edit.js +121 -0
  93. package/dist/mcp/fastmcp/tools/hooks/pre-edit.js.map +1 -0
  94. package/dist/mcp/fastmcp/tools/hooks/pretrain.d.ts +7 -0
  95. package/dist/mcp/fastmcp/tools/hooks/pretrain.d.ts.map +1 -0
  96. package/dist/mcp/fastmcp/tools/hooks/pretrain.js +171 -0
  97. package/dist/mcp/fastmcp/tools/hooks/pretrain.js.map +1 -0
  98. package/dist/mcp/fastmcp/tools/hooks/route.d.ts +12 -0
  99. package/dist/mcp/fastmcp/tools/hooks/route.d.ts.map +1 -0
  100. package/dist/mcp/fastmcp/tools/hooks/route.js +267 -0
  101. package/dist/mcp/fastmcp/tools/hooks/route.js.map +1 -0
  102. package/dist/mcp/fastmcp/tools/hooks/shared.d.ts +46 -0
  103. package/dist/mcp/fastmcp/tools/hooks/shared.d.ts.map +1 -0
  104. package/dist/mcp/fastmcp/tools/hooks/shared.js +159 -0
  105. package/dist/mcp/fastmcp/tools/hooks/shared.js.map +1 -0
  106. package/dist/mcp/fastmcp/tools/hooks/transfer.d.ts +7 -0
  107. package/dist/mcp/fastmcp/tools/hooks/transfer.d.ts.map +1 -0
  108. package/dist/mcp/fastmcp/tools/hooks/transfer.js +151 -0
  109. package/dist/mcp/fastmcp/tools/hooks/transfer.js.map +1 -0
  110. package/dist/mcp/tools/agent-booster-tools.d.ts +10 -1
  111. package/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -1
  112. package/dist/mcp/tools/agent-booster-tools.js.map +1 -1
  113. package/dist/mcp/tools/sona-tools.d.ts.map +1 -1
  114. package/dist/mcp/tools/sona-tools.js +15 -3
  115. package/dist/mcp/tools/sona-tools.js.map +1 -1
  116. package/dist/memory/SharedMemoryPool.d.ts +16 -3
  117. package/dist/memory/SharedMemoryPool.d.ts.map +1 -1
  118. package/dist/memory/SharedMemoryPool.js +33 -1
  119. package/dist/memory/SharedMemoryPool.js.map +1 -1
  120. package/dist/middleware/auth.middleware.d.ts +114 -0
  121. package/dist/middleware/auth.middleware.d.ts.map +1 -0
  122. package/dist/middleware/auth.middleware.js +222 -0
  123. package/dist/middleware/auth.middleware.js.map +1 -0
  124. package/dist/optimizations/agent-booster-migration.d.ts.map +1 -1
  125. package/dist/optimizations/agent-booster-migration.js.map +1 -1
  126. package/dist/proxy/anthropic-to-gemini.d.ts.map +1 -1
  127. package/dist/proxy/anthropic-to-gemini.js.map +1 -1
  128. package/dist/proxy/anthropic-to-openrouter.d.ts.map +1 -1
  129. package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
  130. package/dist/proxy/anthropic-to-requesty.d.ts.map +1 -1
  131. package/dist/proxy/anthropic-to-requesty.js.map +1 -1
  132. package/dist/proxy/quic-proxy.d.ts +0 -1
  133. package/dist/proxy/quic-proxy.d.ts.map +1 -1
  134. package/dist/proxy/quic-proxy.js +2 -1
  135. package/dist/proxy/quic-proxy.js.map +1 -1
  136. package/dist/reasoningbank/AdvancedMemory.d.ts.map +1 -1
  137. package/dist/reasoningbank/AdvancedMemory.js +12 -1
  138. package/dist/reasoningbank/AdvancedMemory.js.map +1 -1
  139. package/dist/reasoningbank/HybridBackend.d.ts +9 -0
  140. package/dist/reasoningbank/HybridBackend.d.ts.map +1 -1
  141. package/dist/reasoningbank/HybridBackend.js +48 -4
  142. package/dist/reasoningbank/HybridBackend.js.map +1 -1
  143. package/dist/reasoningbank/backend-selector.d.ts +1 -1
  144. package/dist/reasoningbank/backend-selector.d.ts.map +1 -1
  145. package/dist/reasoningbank/backend-selector.js.map +1 -1
  146. package/dist/reasoningbank/index-new.d.ts +0 -6
  147. package/dist/reasoningbank/index-new.d.ts.map +1 -1
  148. package/dist/reasoningbank/index-new.js +9 -7
  149. package/dist/reasoningbank/index-new.js.map +1 -1
  150. package/dist/reasoningbank/index.d.ts +1 -6
  151. package/dist/reasoningbank/index.d.ts.map +1 -1
  152. package/dist/reasoningbank/index.js +10 -7
  153. package/dist/reasoningbank/index.js.map +1 -1
  154. package/dist/router/providers/onnx-local.d.ts.map +1 -1
  155. package/dist/router/providers/onnx-local.js +3 -1
  156. package/dist/router/providers/onnx-local.js.map +1 -1
  157. package/dist/routing/CircuitBreakerRouter.d.ts +187 -0
  158. package/dist/routing/CircuitBreakerRouter.d.ts.map +1 -0
  159. package/dist/routing/CircuitBreakerRouter.js +460 -0
  160. package/dist/routing/CircuitBreakerRouter.js.map +1 -0
  161. package/dist/routing/SemanticRouter.d.ts +164 -0
  162. package/dist/routing/SemanticRouter.d.ts.map +1 -0
  163. package/dist/routing/SemanticRouter.js +291 -0
  164. package/dist/routing/SemanticRouter.js.map +1 -0
  165. package/dist/routing/index.d.ts +12 -0
  166. package/dist/routing/index.d.ts.map +1 -0
  167. package/dist/routing/index.js +10 -0
  168. package/dist/routing/index.js.map +1 -0
  169. package/dist/services/embedding-service.d.ts.map +1 -1
  170. package/dist/services/embedding-service.js +5 -2
  171. package/dist/services/embedding-service.js.map +1 -1
  172. package/dist/services/sona-agent-training.js +1 -1
  173. package/dist/services/sona-agent-training.js.map +1 -1
  174. package/dist/services/sona-agentdb-integration.d.ts.map +1 -1
  175. package/dist/services/sona-agentdb-integration.js +10 -5
  176. package/dist/services/sona-agentdb-integration.js.map +1 -1
  177. package/dist/services/sona-service.d.ts +6 -6
  178. package/dist/services/sona-service.d.ts.map +1 -1
  179. package/dist/services/sona-service.js +3 -1
  180. package/dist/services/sona-service.js.map +1 -1
  181. package/dist/utils/audit-logger.d.ts +115 -0
  182. package/dist/utils/audit-logger.d.ts.map +1 -0
  183. package/dist/utils/audit-logger.js +228 -0
  184. package/dist/utils/audit-logger.js.map +1 -0
  185. package/dist/utils/cli.d.ts +1 -1
  186. package/dist/utils/cli.d.ts.map +1 -1
  187. package/dist/utils/cli.js +5 -0
  188. package/dist/utils/cli.js.map +1 -1
  189. package/dist/utils/input-validator.d.ts +116 -0
  190. package/dist/utils/input-validator.d.ts.map +1 -0
  191. package/dist/utils/input-validator.js +299 -0
  192. package/dist/utils/input-validator.js.map +1 -0
  193. package/dist/utils/rate-limiter.js +2 -2
  194. package/dist/utils/rate-limiter.js.map +1 -1
  195. package/package.json +5 -2
  196. package/wasm/reasoningbank/reasoningbank_wasm_bg.js +2 -2
  197. package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm +0 -0
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Pretrain Hook - Analyze repository and bootstrap intelligence
3
+ * Swarm-distributed when available, falls back to sequential
4
+ */
5
+ import { z } from 'zod';
6
+ import * as path from 'path';
7
+ import * as fs from 'fs';
8
+ import { execSync } from 'child_process';
9
+ import { loadIntelligence, saveIntelligence, getAgentForFile, simpleEmbed } from './shared.js';
10
+ export const hookPretrainTool = {
11
+ name: 'hook_pretrain',
12
+ description: 'Analyze repository with swarm for intelligent patterns',
13
+ parameters: z.object({
14
+ depth: z.number().optional().default(100).describe('Git history depth'),
15
+ incremental: z.boolean().optional().default(false).describe('Only analyze changes since last pretrain'),
16
+ skipGit: z.boolean().optional().default(false).describe('Skip git history analysis'),
17
+ skipFiles: z.boolean().optional().default(false).describe('Skip file structure analysis'),
18
+ verbose: z.boolean().optional().default(false).describe('Show detailed progress')
19
+ }),
20
+ execute: async ({ depth, incremental, skipGit, skipFiles, verbose }, { onProgress }) => {
21
+ const startTime = Date.now();
22
+ const intel = loadIntelligence();
23
+ const stats = { files: 0, patterns: 0, memories: 0, coedits: 0 };
24
+ onProgress?.({ progress: 0, message: 'Starting pretrain analysis...' });
25
+ // Phase 1: Analyze file structure
26
+ if (!skipFiles) {
27
+ onProgress?.({ progress: 0.1, message: 'Analyzing file structure...' });
28
+ try {
29
+ const filesOutput = execSync('git ls-files 2>/dev/null || find . -type f -not -path "./.git/*" -not -path "./node_modules/*" -not -path "./target/*" 2>/dev/null', { encoding: 'utf-8', maxBuffer: 50 * 1024 * 1024 });
30
+ const files = filesOutput.trim().split('\n').filter(f => f);
31
+ for (const file of files) {
32
+ stats.files++;
33
+ const ext = path.extname(file);
34
+ const agent = getAgentForFile(file);
35
+ // Create Q-learning pattern
36
+ const state = `edit:${ext || 'unknown'}`;
37
+ if (!intel.patterns[state]) {
38
+ intel.patterns[state] = {};
39
+ }
40
+ intel.patterns[state][agent] = (intel.patterns[state][agent] || 0) + 0.3;
41
+ stats.patterns++;
42
+ // Track directory patterns
43
+ const dir = path.dirname(file);
44
+ const dirParts = dir.split('/');
45
+ if (dirParts[0] && !intel.dirPatterns[dirParts[0]]) {
46
+ intel.dirPatterns[dirParts[0]] = agent;
47
+ }
48
+ }
49
+ if (verbose) {
50
+ console.log(`[Pretrain] Analyzed ${stats.files} files`);
51
+ }
52
+ }
53
+ catch (e) {
54
+ // Continue without file analysis
55
+ }
56
+ }
57
+ // Phase 2: Analyze git history for co-edit patterns
58
+ if (!skipGit) {
59
+ onProgress?.({ progress: 0.4, message: 'Analyzing git history...' });
60
+ try {
61
+ const gitLog = execSync(`git log --name-only --pretty=format:"COMMIT:%H" -n ${depth} 2>/dev/null`, { encoding: 'utf-8', maxBuffer: 50 * 1024 * 1024 });
62
+ const commits = gitLog.split('COMMIT:').filter(c => c.trim());
63
+ const coEditMap = {};
64
+ for (const commit of commits) {
65
+ const lines = commit.trim().split('\n').filter(l => l && !l.match(/^[a-f0-9]{40}$/));
66
+ const files = lines.filter(f => f.trim());
67
+ // Track co-edits
68
+ for (let i = 0; i < files.length; i++) {
69
+ for (let j = i + 1; j < files.length; j++) {
70
+ const key = [files[i], files[j]].sort().join('|');
71
+ coEditMap[key] = (coEditMap[key] || 0) + 1;
72
+ }
73
+ }
74
+ }
75
+ // Store strong co-edit patterns
76
+ const strongPatterns = Object.entries(coEditMap)
77
+ .filter(([, count]) => count >= 3)
78
+ .sort((a, b) => b[1] - a[1]);
79
+ for (const [key, count] of strongPatterns.slice(0, 100)) {
80
+ const [file1, file2] = key.split('|');
81
+ if (!intel.sequences[file1]) {
82
+ intel.sequences[file1] = [];
83
+ }
84
+ const existing = intel.sequences[file1].find(s => s.file === file2);
85
+ if (existing) {
86
+ existing.score += count;
87
+ }
88
+ else {
89
+ intel.sequences[file1].push({ file: file2, score: count });
90
+ }
91
+ stats.coedits++;
92
+ }
93
+ if (verbose) {
94
+ console.log(`[Pretrain] Found ${strongPatterns.length} co-edit patterns`);
95
+ }
96
+ }
97
+ catch (e) {
98
+ // Continue without git analysis
99
+ }
100
+ }
101
+ // Phase 3: Create memories from important files
102
+ onProgress?.({ progress: 0.7, message: 'Creating memories from key files...' });
103
+ const importantFiles = [
104
+ 'README.md', 'CLAUDE.md', 'package.json', 'Cargo.toml',
105
+ 'pyproject.toml', 'go.mod', '.claude/settings.json', 'tsconfig.json'
106
+ ];
107
+ for (const filename of importantFiles) {
108
+ const filePath = path.join(process.cwd(), filename);
109
+ if (fs.existsSync(filePath)) {
110
+ try {
111
+ const content = fs.readFileSync(filePath, 'utf-8').slice(0, 2000);
112
+ intel.memories.push({
113
+ content: `[${filename}] ${content.replace(/\n/g, ' ').slice(0, 500)}`,
114
+ type: 'project',
115
+ created: new Date().toISOString(),
116
+ embedding: simpleEmbed(content)
117
+ });
118
+ stats.memories++;
119
+ }
120
+ catch (e) {
121
+ // Skip unreadable files
122
+ }
123
+ }
124
+ }
125
+ // Phase 4: Build directory-agent mappings
126
+ onProgress?.({ progress: 0.85, message: 'Building directory mappings...' });
127
+ try {
128
+ const dirs = execSync('find . -type d -maxdepth 2 -not -path "./.git*" -not -path "./node_modules*" 2>/dev/null || echo "."', { encoding: 'utf-8' }).trim().split('\n');
129
+ for (const dir of dirs) {
130
+ const name = path.basename(dir);
131
+ if (['src', 'lib', 'core'].includes(name))
132
+ intel.dirPatterns[dir] = 'coder';
133
+ else if (['test', 'tests', '__tests__', 'spec'].includes(name))
134
+ intel.dirPatterns[dir] = 'test-engineer';
135
+ else if (['docs', 'documentation'].includes(name))
136
+ intel.dirPatterns[dir] = 'documentation-specialist';
137
+ else if (['scripts', 'bin'].includes(name))
138
+ intel.dirPatterns[dir] = 'devops-engineer';
139
+ else if (['components', 'views', 'pages'].includes(name))
140
+ intel.dirPatterns[dir] = 'frontend-developer';
141
+ else if (['api', 'routes', 'handlers'].includes(name))
142
+ intel.dirPatterns[dir] = 'backend-developer';
143
+ else if (['models', 'entities', 'schemas'].includes(name))
144
+ intel.dirPatterns[dir] = 'database-specialist';
145
+ }
146
+ }
147
+ catch (e) {
148
+ // Continue without directory analysis
149
+ }
150
+ // Save pretrain metadata
151
+ intel.pretrained = {
152
+ date: new Date().toISOString(),
153
+ stats
154
+ };
155
+ // Save intelligence
156
+ saveIntelligence(intel);
157
+ onProgress?.({ progress: 1.0, message: 'Pretrain complete!' });
158
+ const latency = Date.now() - startTime;
159
+ return {
160
+ success: true,
161
+ filesAnalyzed: stats.files,
162
+ patternsCreated: stats.patterns,
163
+ memoriesStored: stats.memories,
164
+ coEditsFound: stats.coedits,
165
+ directoryMappings: Object.keys(intel.dirPatterns).length,
166
+ latencyMs: latency,
167
+ timestamp: new Date().toISOString()
168
+ };
169
+ }
170
+ };
171
+ //# sourceMappingURL=pretrain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pretrain.js","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/pretrain.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pretrain Hook - Analyze repository and bootstrap intelligence\n * Swarm-distributed when available, falls back to sequential\n */\n\nimport { z } from 'zod';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { execSync } from 'child_process';\nimport type { ToolDefinition } from '../../types/index.js';\nimport {\n loadIntelligence,\n saveIntelligence,\n getAgentForFile,\n simpleEmbed,\n agentMapping\n} from './shared.js';\n\nexport const hookPretrainTool: ToolDefinition = {\n name: 'hook_pretrain',\n description: 'Analyze repository with swarm for intelligent patterns',\n parameters: z.object({\n depth: z.number().optional().default(100).describe('Git history depth'),\n incremental: z.boolean().optional().default(false).describe('Only analyze changes since last pretrain'),\n skipGit: z.boolean().optional().default(false).describe('Skip git history analysis'),\n skipFiles: z.boolean().optional().default(false).describe('Skip file structure analysis'),\n verbose: z.boolean().optional().default(false).describe('Show detailed progress')\n }),\n execute: async ({ depth, incremental, skipGit, skipFiles, verbose }, { onProgress }) => {\n const startTime = Date.now();\n const intel = loadIntelligence();\n const stats = { files: 0, patterns: 0, memories: 0, coedits: 0 };\n\n onProgress?.({ progress: 0, message: 'Starting pretrain analysis...' });\n\n // Phase 1: Analyze file structure\n if (!skipFiles) {\n onProgress?.({ progress: 0.1, message: 'Analyzing file structure...' });\n\n try {\n const filesOutput = execSync(\n 'git ls-files 2>/dev/null || find . -type f -not -path \"./.git/*\" -not -path \"./node_modules/*\" -not -path \"./target/*\" 2>/dev/null',\n { encoding: 'utf-8', maxBuffer: 50 * 1024 * 1024 }\n );\n\n const files = filesOutput.trim().split('\\n').filter(f => f);\n\n for (const file of files) {\n stats.files++;\n const ext = path.extname(file);\n const agent = getAgentForFile(file);\n\n // Create Q-learning pattern\n const state = `edit:${ext || 'unknown'}`;\n if (!intel.patterns[state]) {\n intel.patterns[state] = {};\n }\n intel.patterns[state][agent] = (intel.patterns[state][agent] || 0) + 0.3;\n stats.patterns++;\n\n // Track directory patterns\n const dir = path.dirname(file);\n const dirParts = dir.split('/');\n if (dirParts[0] && !intel.dirPatterns[dirParts[0]]) {\n intel.dirPatterns[dirParts[0]] = agent;\n }\n }\n\n if (verbose) {\n console.log(`[Pretrain] Analyzed ${stats.files} files`);\n }\n } catch (e) {\n // Continue without file analysis\n }\n }\n\n // Phase 2: Analyze git history for co-edit patterns\n if (!skipGit) {\n onProgress?.({ progress: 0.4, message: 'Analyzing git history...' });\n\n try {\n const gitLog = execSync(\n `git log --name-only --pretty=format:\"COMMIT:%H\" -n ${depth} 2>/dev/null`,\n { encoding: 'utf-8', maxBuffer: 50 * 1024 * 1024 }\n );\n\n const commits = gitLog.split('COMMIT:').filter(c => c.trim());\n const coEditMap: Record<string, number> = {};\n\n for (const commit of commits) {\n const lines = commit.trim().split('\\n').filter(l => l && !l.match(/^[a-f0-9]{40}$/));\n const files = lines.filter(f => f.trim());\n\n // Track co-edits\n for (let i = 0; i < files.length; i++) {\n for (let j = i + 1; j < files.length; j++) {\n const key = [files[i], files[j]].sort().join('|');\n coEditMap[key] = (coEditMap[key] || 0) + 1;\n }\n }\n }\n\n // Store strong co-edit patterns\n const strongPatterns = Object.entries(coEditMap)\n .filter(([, count]) => count >= 3)\n .sort((a, b) => b[1] - a[1]);\n\n for (const [key, count] of strongPatterns.slice(0, 100)) {\n const [file1, file2] = key.split('|');\n if (!intel.sequences[file1]) {\n intel.sequences[file1] = [];\n }\n\n const existing = intel.sequences[file1].find(s => s.file === file2);\n if (existing) {\n existing.score += count;\n } else {\n intel.sequences[file1].push({ file: file2, score: count });\n }\n stats.coedits++;\n }\n\n if (verbose) {\n console.log(`[Pretrain] Found ${strongPatterns.length} co-edit patterns`);\n }\n } catch (e) {\n // Continue without git analysis\n }\n }\n\n // Phase 3: Create memories from important files\n onProgress?.({ progress: 0.7, message: 'Creating memories from key files...' });\n\n const importantFiles = [\n 'README.md', 'CLAUDE.md', 'package.json', 'Cargo.toml',\n 'pyproject.toml', 'go.mod', '.claude/settings.json', 'tsconfig.json'\n ];\n\n for (const filename of importantFiles) {\n const filePath = path.join(process.cwd(), filename);\n if (fs.existsSync(filePath)) {\n try {\n const content = fs.readFileSync(filePath, 'utf-8').slice(0, 2000);\n intel.memories.push({\n content: `[${filename}] ${content.replace(/\\n/g, ' ').slice(0, 500)}`,\n type: 'project',\n created: new Date().toISOString(),\n embedding: simpleEmbed(content)\n });\n stats.memories++;\n } catch (e) {\n // Skip unreadable files\n }\n }\n }\n\n // Phase 4: Build directory-agent mappings\n onProgress?.({ progress: 0.85, message: 'Building directory mappings...' });\n\n try {\n const dirs = execSync(\n 'find . -type d -maxdepth 2 -not -path \"./.git*\" -not -path \"./node_modules*\" 2>/dev/null || echo \".\"',\n { encoding: 'utf-8' }\n ).trim().split('\\n');\n\n for (const dir of dirs) {\n const name = path.basename(dir);\n if (['src', 'lib', 'core'].includes(name)) intel.dirPatterns[dir] = 'coder';\n else if (['test', 'tests', '__tests__', 'spec'].includes(name)) intel.dirPatterns[dir] = 'test-engineer';\n else if (['docs', 'documentation'].includes(name)) intel.dirPatterns[dir] = 'documentation-specialist';\n else if (['scripts', 'bin'].includes(name)) intel.dirPatterns[dir] = 'devops-engineer';\n else if (['components', 'views', 'pages'].includes(name)) intel.dirPatterns[dir] = 'frontend-developer';\n else if (['api', 'routes', 'handlers'].includes(name)) intel.dirPatterns[dir] = 'backend-developer';\n else if (['models', 'entities', 'schemas'].includes(name)) intel.dirPatterns[dir] = 'database-specialist';\n }\n } catch (e) {\n // Continue without directory analysis\n }\n\n // Save pretrain metadata\n intel.pretrained = {\n date: new Date().toISOString(),\n stats\n };\n\n // Save intelligence\n saveIntelligence(intel);\n\n onProgress?.({ progress: 1.0, message: 'Pretrain complete!' });\n\n const latency = Date.now() - startTime;\n\n return {\n success: true,\n filesAnalyzed: stats.files,\n patternsCreated: stats.patterns,\n memoriesStored: stats.memories,\n coEditsFound: stats.coedits,\n directoryMappings: Object.keys(intel.dirPatterns).length,\n latencyMs: latency,\n timestamp: new Date().toISOString()\n };\n }\n};\n"]}
@@ -0,0 +1,12 @@
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 type { ToolDefinition } from '../../types/index.js';
11
+ export declare const hookRouteTool: ToolDefinition;
12
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA0C3D,eAAO,MAAM,aAAa,EAAE,cA4P3B,CAAC"}
@@ -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"}