agentic-flow 2.0.1-alpha.5 → 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.
- package/CHANGELOG.md +26 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentdb/controllers/EmbeddingService.d.ts +37 -0
- package/dist/agentdb/controllers/EmbeddingService.d.ts.map +1 -0
- package/dist/agentdb/controllers/EmbeddingService.js +1 -0
- package/dist/agentdb/controllers/EmbeddingService.js.map +1 -0
- package/dist/billing/mcp/tools.d.ts.map +1 -1
- package/dist/billing/mcp/tools.js +2 -0
- package/dist/billing/mcp/tools.js.map +1 -1
- package/dist/cli/commands/hooks.d.ts +18 -0
- package/dist/cli/commands/hooks.d.ts.map +1 -0
- package/dist/cli/commands/hooks.js +750 -0
- package/dist/cli/commands/hooks.js.map +1 -0
- package/dist/cli-proxy.js +26 -1
- package/dist/cli-proxy.js.map +1 -1
- package/dist/core/agentdb-fast.js +3 -3
- package/dist/core/agentdb-fast.js.map +1 -1
- package/dist/core/agentdb-wrapper-enhanced.d.ts.map +1 -1
- package/dist/core/agentdb-wrapper-enhanced.js +32 -17
- package/dist/core/agentdb-wrapper-enhanced.js.map +1 -1
- package/dist/core/attention-native.d.ts +1 -0
- package/dist/core/attention-native.d.ts.map +1 -1
- package/dist/core/attention-native.js +6 -1
- package/dist/core/attention-native.js.map +1 -1
- package/dist/federation/integrations/supabase-adapter-debug.js +3 -3
- package/dist/federation/integrations/supabase-adapter-debug.js.map +1 -1
- package/dist/intelligence/RuVectorIntelligence.d.ts +362 -0
- package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -0
- package/dist/intelligence/RuVectorIntelligence.js +852 -0
- package/dist/intelligence/RuVectorIntelligence.js.map +1 -0
- package/dist/intelligence/index.d.ts +14 -0
- package/dist/intelligence/index.d.ts.map +1 -0
- package/dist/intelligence/index.js +14 -0
- package/dist/intelligence/index.js.map +1 -0
- package/dist/llm/RuvLLMOrchestrator.d.ts +184 -0
- package/dist/llm/RuvLLMOrchestrator.d.ts.map +1 -0
- package/dist/llm/RuvLLMOrchestrator.js +442 -0
- package/dist/llm/RuvLLMOrchestrator.js.map +1 -0
- package/dist/llm/index.d.ts +9 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +8 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
- package/dist/mcp/claudeFlowSdkServer.js +86 -21
- package/dist/mcp/claudeFlowSdkServer.js.map +1 -1
- package/dist/mcp/fastmcp/servers/hooks-server.d.ts +15 -0
- package/dist/mcp/fastmcp/servers/hooks-server.d.ts.map +1 -0
- package/dist/mcp/fastmcp/servers/hooks-server.js +63 -0
- package/dist/mcp/fastmcp/servers/hooks-server.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.d.ts +20 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.js +110 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.js +276 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.d.ts +6 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.js +164 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/index.d.ts +28 -0
- package/dist/mcp/fastmcp/tools/hooks/index.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/index.js +59 -0
- package/dist/mcp/fastmcp/tools/hooks/index.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts +91 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +269 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts +58 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js +416 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.d.ts +6 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.js +137 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.js +91 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.d.ts +12 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.js +146 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.js +70 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.d.ts +14 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.js +121 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.js +171 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/route.d.ts +12 -0
- package/dist/mcp/fastmcp/tools/hooks/route.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/route.js +267 -0
- package/dist/mcp/fastmcp/tools/hooks/route.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.d.ts +46 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.js +159 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.js +151 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.js.map +1 -0
- package/dist/mcp/tools/agent-booster-tools.d.ts +10 -1
- package/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -1
- package/dist/mcp/tools/agent-booster-tools.js.map +1 -1
- package/dist/mcp/tools/sona-tools.d.ts.map +1 -1
- package/dist/mcp/tools/sona-tools.js +15 -3
- package/dist/mcp/tools/sona-tools.js.map +1 -1
- package/dist/memory/SharedMemoryPool.d.ts +16 -3
- package/dist/memory/SharedMemoryPool.d.ts.map +1 -1
- package/dist/memory/SharedMemoryPool.js +33 -1
- package/dist/memory/SharedMemoryPool.js.map +1 -1
- package/dist/middleware/auth.middleware.d.ts +114 -0
- package/dist/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/middleware/auth.middleware.js +222 -0
- package/dist/middleware/auth.middleware.js.map +1 -0
- package/dist/optimizations/agent-booster-migration.d.ts.map +1 -1
- package/dist/optimizations/agent-booster-migration.js.map +1 -1
- package/dist/proxy/anthropic-to-gemini.d.ts.map +1 -1
- package/dist/proxy/anthropic-to-gemini.js.map +1 -1
- package/dist/proxy/anthropic-to-openrouter.d.ts.map +1 -1
- package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
- package/dist/proxy/anthropic-to-requesty.d.ts.map +1 -1
- package/dist/proxy/anthropic-to-requesty.js.map +1 -1
- package/dist/proxy/quic-proxy.d.ts +0 -1
- package/dist/proxy/quic-proxy.d.ts.map +1 -1
- package/dist/proxy/quic-proxy.js +2 -1
- package/dist/proxy/quic-proxy.js.map +1 -1
- package/dist/reasoningbank/AdvancedMemory.d.ts.map +1 -1
- package/dist/reasoningbank/AdvancedMemory.js +12 -1
- package/dist/reasoningbank/AdvancedMemory.js.map +1 -1
- package/dist/reasoningbank/HybridBackend.d.ts +9 -0
- package/dist/reasoningbank/HybridBackend.d.ts.map +1 -1
- package/dist/reasoningbank/HybridBackend.js +48 -4
- package/dist/reasoningbank/HybridBackend.js.map +1 -1
- package/dist/reasoningbank/backend-selector.d.ts +1 -1
- package/dist/reasoningbank/backend-selector.d.ts.map +1 -1
- package/dist/reasoningbank/backend-selector.js.map +1 -1
- package/dist/reasoningbank/index-new.d.ts +0 -6
- package/dist/reasoningbank/index-new.d.ts.map +1 -1
- package/dist/reasoningbank/index-new.js +9 -7
- package/dist/reasoningbank/index-new.js.map +1 -1
- package/dist/reasoningbank/index.d.ts +1 -6
- package/dist/reasoningbank/index.d.ts.map +1 -1
- package/dist/reasoningbank/index.js +10 -7
- package/dist/reasoningbank/index.js.map +1 -1
- package/dist/router/providers/onnx-local.d.ts.map +1 -1
- package/dist/router/providers/onnx-local.js +3 -1
- package/dist/router/providers/onnx-local.js.map +1 -1
- package/dist/routing/CircuitBreakerRouter.d.ts +187 -0
- package/dist/routing/CircuitBreakerRouter.d.ts.map +1 -0
- package/dist/routing/CircuitBreakerRouter.js +460 -0
- package/dist/routing/CircuitBreakerRouter.js.map +1 -0
- package/dist/routing/SemanticRouter.d.ts +164 -0
- package/dist/routing/SemanticRouter.d.ts.map +1 -0
- package/dist/routing/SemanticRouter.js +291 -0
- package/dist/routing/SemanticRouter.js.map +1 -0
- package/dist/routing/index.d.ts +12 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +10 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/services/embedding-service.d.ts.map +1 -1
- package/dist/services/embedding-service.js +5 -2
- package/dist/services/embedding-service.js.map +1 -1
- package/dist/services/sona-agent-training.js +1 -1
- package/dist/services/sona-agent-training.js.map +1 -1
- package/dist/services/sona-agentdb-integration.d.ts.map +1 -1
- package/dist/services/sona-agentdb-integration.js +10 -5
- package/dist/services/sona-agentdb-integration.js.map +1 -1
- package/dist/services/sona-service.d.ts +6 -6
- package/dist/services/sona-service.d.ts.map +1 -1
- package/dist/services/sona-service.js +3 -1
- package/dist/services/sona-service.js.map +1 -1
- package/dist/utils/audit-logger.d.ts +115 -0
- package/dist/utils/audit-logger.d.ts.map +1 -0
- package/dist/utils/audit-logger.js +228 -0
- package/dist/utils/audit-logger.js.map +1 -0
- package/dist/utils/cli.d.ts +1 -1
- package/dist/utils/cli.d.ts.map +1 -1
- package/dist/utils/cli.js +5 -0
- package/dist/utils/cli.js.map +1 -1
- package/dist/utils/input-validator.d.ts +116 -0
- package/dist/utils/input-validator.d.ts.map +1 -0
- package/dist/utils/input-validator.js +299 -0
- package/dist/utils/input-validator.js.map +1 -0
- package/dist/utils/rate-limiter.js +2 -2
- package/dist/utils/rate-limiter.js.map +1 -1
- package/package.json +5 -2
- package/wasm/reasoningbank/reasoningbank_wasm_bg.js +2 -2
- package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-Command Hook - Learn from command outcomes
|
|
3
|
+
* Records command results and learns from errors
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { loadIntelligence, saveIntelligence, simpleEmbed } from './shared.js';
|
|
7
|
+
const LEARNING_RATE = 0.1;
|
|
8
|
+
export const hookPostCommandTool = {
|
|
9
|
+
name: 'hook_post_command',
|
|
10
|
+
description: 'Post-command learning: record outcome and learn from errors',
|
|
11
|
+
parameters: z.object({
|
|
12
|
+
command: z.string().describe('Command that was executed'),
|
|
13
|
+
exitCode: z.number().describe('Command exit code'),
|
|
14
|
+
stderr: z.string().optional().describe('Standard error output'),
|
|
15
|
+
stdout: z.string().optional().describe('Standard output (truncated)')
|
|
16
|
+
}),
|
|
17
|
+
execute: async ({ command, exitCode, stderr, stdout }, { onProgress }) => {
|
|
18
|
+
const startTime = Date.now();
|
|
19
|
+
const intel = loadIntelligence();
|
|
20
|
+
const success = exitCode === 0;
|
|
21
|
+
const cmdBase = command.split(' ')[0];
|
|
22
|
+
const state = `command:${cmdBase}`;
|
|
23
|
+
// 1. Update command patterns
|
|
24
|
+
if (!intel.patterns[state]) {
|
|
25
|
+
intel.patterns[state] = {};
|
|
26
|
+
}
|
|
27
|
+
const action = success ? 'success' : 'failure';
|
|
28
|
+
const currentValue = intel.patterns[state][action] || 0;
|
|
29
|
+
const reward = success ? 1.0 : -0.5;
|
|
30
|
+
intel.patterns[state][action] = currentValue + LEARNING_RATE * (reward - currentValue);
|
|
31
|
+
// 2. Learn from failures
|
|
32
|
+
let errorPattern = null;
|
|
33
|
+
if (!success && stderr) {
|
|
34
|
+
// Extract error type from stderr
|
|
35
|
+
const errorMatch = stderr.match(/^(\w+Error|\w+Exception|error\[\w+\]|ENOENT|EACCES|EPERM)/im);
|
|
36
|
+
const errorType = errorMatch ? errorMatch[1] : 'CommandError';
|
|
37
|
+
// Check for existing pattern
|
|
38
|
+
const existing = intel.errorPatterns.find(p => p.errorType === errorType && p.context.includes(cmdBase));
|
|
39
|
+
if (existing) {
|
|
40
|
+
// Update existing pattern
|
|
41
|
+
existing.agentSuccess['command'] = (existing.agentSuccess['command'] || 0) + 1;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Create new error pattern
|
|
45
|
+
errorPattern = {
|
|
46
|
+
errorType,
|
|
47
|
+
context: `${cmdBase} command: ${stderr.slice(0, 100)}`,
|
|
48
|
+
resolution: '', // Will be filled when resolved
|
|
49
|
+
agentSuccess: { 'command': 1 }
|
|
50
|
+
};
|
|
51
|
+
intel.errorPatterns.push(errorPattern);
|
|
52
|
+
}
|
|
53
|
+
// Keep last 50 error patterns
|
|
54
|
+
if (intel.errorPatterns.length > 50) {
|
|
55
|
+
intel.errorPatterns = intel.errorPatterns.slice(-50);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// 3. Store successful command as memory if useful output
|
|
59
|
+
if (success && stdout && stdout.length > 10) {
|
|
60
|
+
const memoryContent = `Command "${cmdBase}" succeeded: ${stdout.slice(0, 100)}`;
|
|
61
|
+
intel.memories.push({
|
|
62
|
+
content: memoryContent,
|
|
63
|
+
type: 'command',
|
|
64
|
+
created: new Date().toISOString(),
|
|
65
|
+
embedding: simpleEmbed(memoryContent)
|
|
66
|
+
});
|
|
67
|
+
// Keep last 200 memories
|
|
68
|
+
if (intel.memories.length > 200) {
|
|
69
|
+
intel.memories = intel.memories.slice(-200);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// 4. Update metrics
|
|
73
|
+
intel.metrics.totalRoutes++;
|
|
74
|
+
if (success) {
|
|
75
|
+
intel.metrics.successfulRoutes++;
|
|
76
|
+
}
|
|
77
|
+
// 5. Save intelligence
|
|
78
|
+
saveIntelligence(intel);
|
|
79
|
+
const latency = Date.now() - startTime;
|
|
80
|
+
return {
|
|
81
|
+
success: true,
|
|
82
|
+
learned: true,
|
|
83
|
+
commandSuccess: success,
|
|
84
|
+
errorType: errorPattern?.errorType || null,
|
|
85
|
+
patternValue: intel.patterns[state][action],
|
|
86
|
+
latencyMs: latency,
|
|
87
|
+
timestamp: new Date().toISOString()
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=post-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-command.js","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/post-command.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Post-Command Hook - Learn from command outcomes\n * Records command results and learns from errors\n */\n\nimport { z } from 'zod';\nimport type { ToolDefinition } from '../../types/index.js';\nimport {\n loadIntelligence,\n saveIntelligence,\n simpleEmbed\n} from './shared.js';\n\nconst LEARNING_RATE = 0.1;\n\nexport const hookPostCommandTool: ToolDefinition = {\n name: 'hook_post_command',\n description: 'Post-command learning: record outcome and learn from errors',\n parameters: z.object({\n command: z.string().describe('Command that was executed'),\n exitCode: z.number().describe('Command exit code'),\n stderr: z.string().optional().describe('Standard error output'),\n stdout: z.string().optional().describe('Standard output (truncated)')\n }),\n execute: async ({ command, exitCode, stderr, stdout }, { onProgress }) => {\n const startTime = Date.now();\n const intel = loadIntelligence();\n const success = exitCode === 0;\n const cmdBase = command.split(' ')[0];\n const state = `command:${cmdBase}`;\n\n // 1. Update command patterns\n if (!intel.patterns[state]) {\n intel.patterns[state] = {};\n }\n\n const action = success ? 'success' : 'failure';\n const currentValue = intel.patterns[state][action] || 0;\n const reward = success ? 1.0 : -0.5;\n\n intel.patterns[state][action] = currentValue + LEARNING_RATE * (reward - currentValue);\n\n // 2. Learn from failures\n let errorPattern = null;\n if (!success && stderr) {\n // Extract error type from stderr\n const errorMatch = stderr.match(/^(\\w+Error|\\w+Exception|error\\[\\w+\\]|ENOENT|EACCES|EPERM)/im);\n const errorType = errorMatch ? errorMatch[1] : 'CommandError';\n\n // Check for existing pattern\n const existing = intel.errorPatterns.find(\n p => p.errorType === errorType && p.context.includes(cmdBase)\n );\n\n if (existing) {\n // Update existing pattern\n existing.agentSuccess['command'] = (existing.agentSuccess['command'] || 0) + 1;\n } else {\n // Create new error pattern\n errorPattern = {\n errorType,\n context: `${cmdBase} command: ${stderr.slice(0, 100)}`,\n resolution: '', // Will be filled when resolved\n agentSuccess: { 'command': 1 }\n };\n intel.errorPatterns.push(errorPattern);\n }\n\n // Keep last 50 error patterns\n if (intel.errorPatterns.length > 50) {\n intel.errorPatterns = intel.errorPatterns.slice(-50);\n }\n }\n\n // 3. Store successful command as memory if useful output\n if (success && stdout && stdout.length > 10) {\n const memoryContent = `Command \"${cmdBase}\" succeeded: ${stdout.slice(0, 100)}`;\n intel.memories.push({\n content: memoryContent,\n type: 'command',\n created: new Date().toISOString(),\n embedding: simpleEmbed(memoryContent)\n });\n\n // Keep last 200 memories\n if (intel.memories.length > 200) {\n intel.memories = intel.memories.slice(-200);\n }\n }\n\n // 4. Update metrics\n intel.metrics.totalRoutes++;\n if (success) {\n intel.metrics.successfulRoutes++;\n }\n\n // 5. Save intelligence\n saveIntelligence(intel);\n\n const latency = Date.now() - startTime;\n\n return {\n success: true,\n learned: true,\n commandSuccess: success,\n errorType: errorPattern?.errorType || null,\n patternValue: intel.patterns[state][action],\n latencyMs: latency,\n timestamp: new Date().toISOString()\n };\n }\n};\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-Edit Hook - Learn from edit outcomes
|
|
3
|
+
* Updates Q-table patterns and stores successful patterns
|
|
4
|
+
*
|
|
5
|
+
* NOW WITH RUVECTOR INTELLIGENCE:
|
|
6
|
+
* - Completes trajectory tracking for reinforcement learning
|
|
7
|
+
* - Stores patterns in ReasoningBank via SONA
|
|
8
|
+
* - Uses EWC++ to prevent catastrophic forgetting
|
|
9
|
+
*/
|
|
10
|
+
import type { ToolDefinition } from '../../types/index.js';
|
|
11
|
+
export declare const hookPostEditTool: ToolDefinition;
|
|
12
|
+
//# sourceMappingURL=post-edit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-edit.d.ts","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/post-edit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAmB3D,eAAO,MAAM,gBAAgB,EAAE,cA4J9B,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-Edit Hook - Learn from edit outcomes
|
|
3
|
+
* Updates Q-table patterns and stores successful patterns
|
|
4
|
+
*
|
|
5
|
+
* NOW WITH RUVECTOR INTELLIGENCE:
|
|
6
|
+
* - Completes trajectory tracking for reinforcement learning
|
|
7
|
+
* - Stores patterns in ReasoningBank via SONA
|
|
8
|
+
* - Uses EWC++ to prevent catastrophic forgetting
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
import { loadIntelligence, saveIntelligence, simpleEmbed } from './shared.js';
|
|
13
|
+
import { recordTrajectoryStep, endTaskTrajectory, storePattern, getIntelligenceStats } from './intelligence-bridge.js';
|
|
14
|
+
import { activeEditTrajectories } from './pre-edit.js';
|
|
15
|
+
const LEARNING_RATE = 0.1;
|
|
16
|
+
const SUCCESS_REWARD = 1.0;
|
|
17
|
+
const FAILURE_PENALTY = -0.3;
|
|
18
|
+
export const hookPostEditTool = {
|
|
19
|
+
name: 'hook_post_edit',
|
|
20
|
+
description: 'Post-edit learning: record outcome, update patterns, distill memories',
|
|
21
|
+
parameters: z.object({
|
|
22
|
+
filePath: z.string().describe('Path to file that was edited'),
|
|
23
|
+
success: z.boolean().describe('Whether the edit was successful'),
|
|
24
|
+
agent: z.string().optional().describe('Agent that performed the edit'),
|
|
25
|
+
duration: z.number().optional().describe('Edit duration in ms'),
|
|
26
|
+
errorMessage: z.string().optional().describe('Error message if failed')
|
|
27
|
+
}),
|
|
28
|
+
execute: async ({ filePath, success, agent, duration, errorMessage }, { onProgress }) => {
|
|
29
|
+
const startTime = Date.now();
|
|
30
|
+
const intel = loadIntelligence();
|
|
31
|
+
const ext = path.extname(filePath);
|
|
32
|
+
const state = `edit:${ext}`;
|
|
33
|
+
// RUVECTOR INTELLIGENCE: Complete trajectory and learn
|
|
34
|
+
let learningOutcome = null;
|
|
35
|
+
let intelligenceEnabled = false;
|
|
36
|
+
try {
|
|
37
|
+
const trajectoryId = activeEditTrajectories.get(filePath);
|
|
38
|
+
if (trajectoryId !== undefined) {
|
|
39
|
+
// Record the final step
|
|
40
|
+
await recordTrajectoryStep(trajectoryId, `edit-${success ? 'success' : 'failure'}`, success ? SUCCESS_REWARD : FAILURE_PENALTY, {
|
|
41
|
+
file: filePath,
|
|
42
|
+
errorFixed: success,
|
|
43
|
+
testPassed: success
|
|
44
|
+
});
|
|
45
|
+
// End trajectory and get learning outcome
|
|
46
|
+
const quality = success ? 0.9 : 0.3;
|
|
47
|
+
learningOutcome = await endTaskTrajectory(trajectoryId, success, quality);
|
|
48
|
+
// Store successful pattern in ReasoningBank
|
|
49
|
+
if (success && agent) {
|
|
50
|
+
await storePattern(`Edit ${ext} file: ${path.basename(filePath)}`, `Agent ${agent} successfully edited the file`, SUCCESS_REWARD);
|
|
51
|
+
}
|
|
52
|
+
// Clean up
|
|
53
|
+
activeEditTrajectories.delete(filePath);
|
|
54
|
+
intelligenceEnabled = true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.debug('[PostEdit] Intelligence learning failed:', error);
|
|
59
|
+
}
|
|
60
|
+
// 1. Update Q-table pattern (fallback learning)
|
|
61
|
+
if (agent) {
|
|
62
|
+
if (!intel.patterns[state]) {
|
|
63
|
+
intel.patterns[state] = {};
|
|
64
|
+
}
|
|
65
|
+
const currentValue = intel.patterns[state][agent] || 0;
|
|
66
|
+
const reward = success ? SUCCESS_REWARD : FAILURE_PENALTY;
|
|
67
|
+
// Q-learning update: Q(s,a) = Q(s,a) + α * (r - Q(s,a))
|
|
68
|
+
intel.patterns[state][agent] = currentValue + LEARNING_RATE * (reward - currentValue);
|
|
69
|
+
}
|
|
70
|
+
// 2. Record in metrics
|
|
71
|
+
intel.metrics.totalRoutes++;
|
|
72
|
+
if (success) {
|
|
73
|
+
intel.metrics.successfulRoutes++;
|
|
74
|
+
}
|
|
75
|
+
intel.metrics.routingHistory.push({
|
|
76
|
+
timestamp: new Date().toISOString(),
|
|
77
|
+
task: `edit:${filePath}`,
|
|
78
|
+
agent: agent || 'unknown',
|
|
79
|
+
success
|
|
80
|
+
});
|
|
81
|
+
// Keep last 100 entries
|
|
82
|
+
if (intel.metrics.routingHistory.length > 100) {
|
|
83
|
+
intel.metrics.routingHistory = intel.metrics.routingHistory.slice(-100);
|
|
84
|
+
}
|
|
85
|
+
// 3. Store error pattern if failed
|
|
86
|
+
if (!success && errorMessage) {
|
|
87
|
+
const existingPattern = intel.errorPatterns.find(p => p.errorType === errorMessage.split(':')[0]);
|
|
88
|
+
if (existingPattern) {
|
|
89
|
+
existingPattern.agentSuccess[agent || 'unknown'] =
|
|
90
|
+
(existingPattern.agentSuccess[agent || 'unknown'] || 0) - 1;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
intel.errorPatterns.push({
|
|
94
|
+
errorType: errorMessage.split(':')[0] || 'UnknownError',
|
|
95
|
+
context: `${ext} file edit`,
|
|
96
|
+
resolution: '',
|
|
97
|
+
agentSuccess: { [agent || 'unknown']: -1 }
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
// Keep last 50 error patterns
|
|
101
|
+
if (intel.errorPatterns.length > 50) {
|
|
102
|
+
intel.errorPatterns = intel.errorPatterns.slice(-50);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// 4. Distill successful pattern as memory
|
|
106
|
+
if (success && agent) {
|
|
107
|
+
const memoryContent = `Successful ${ext} edit by ${agent} on ${path.basename(filePath)}`;
|
|
108
|
+
intel.memories.push({
|
|
109
|
+
content: memoryContent,
|
|
110
|
+
type: 'success',
|
|
111
|
+
created: new Date().toISOString(),
|
|
112
|
+
embedding: simpleEmbed(memoryContent)
|
|
113
|
+
});
|
|
114
|
+
// Keep last 200 memories
|
|
115
|
+
if (intel.memories.length > 200) {
|
|
116
|
+
intel.memories = intel.memories.slice(-200);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// 5. Save updated intelligence
|
|
120
|
+
saveIntelligence(intel);
|
|
121
|
+
const latency = Date.now() - startTime;
|
|
122
|
+
// Get intelligence stats for monitoring
|
|
123
|
+
let intelligenceStats = null;
|
|
124
|
+
try {
|
|
125
|
+
intelligenceStats = await getIntelligenceStats();
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
// Ignore if not available
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
success: true,
|
|
132
|
+
patternsUpdated: true,
|
|
133
|
+
newPatternValue: agent ? intel.patterns[state]?.[agent] : null,
|
|
134
|
+
routingAccuracy: intel.metrics.totalRoutes > 0
|
|
135
|
+
? intel.metrics.successfulRoutes / intel.metrics.totalRoutes
|
|
136
|
+
: 0,
|
|
137
|
+
// RuVector Intelligence additions
|
|
138
|
+
intelligenceEnabled,
|
|
139
|
+
learningOutcome,
|
|
140
|
+
intelligenceStats,
|
|
141
|
+
latencyMs: latency,
|
|
142
|
+
timestamp: new Date().toISOString()
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=post-edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-edit.js","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/post-edit.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Post-Edit Hook - Learn from edit outcomes\n * Updates Q-table patterns and stores successful patterns\n *\n * NOW WITH RUVECTOR INTELLIGENCE:\n * - Completes trajectory tracking for reinforcement learning\n * - Stores patterns in ReasoningBank via SONA\n * - Uses EWC++ to prevent catastrophic forgetting\n */\n\nimport { z } from 'zod';\nimport * as path from 'path';\nimport type { ToolDefinition } from '../../types/index.js';\nimport {\n loadIntelligence,\n saveIntelligence,\n simpleEmbed\n} from './shared.js';\nimport {\n recordTrajectoryStep,\n endTaskTrajectory,\n storePattern,\n forceLearningCycle,\n getIntelligenceStats\n} from './intelligence-bridge.js';\nimport { activeEditTrajectories } from './pre-edit.js';\n\nconst LEARNING_RATE = 0.1;\nconst SUCCESS_REWARD = 1.0;\nconst FAILURE_PENALTY = -0.3;\n\nexport const hookPostEditTool: ToolDefinition = {\n name: 'hook_post_edit',\n description: 'Post-edit learning: record outcome, update patterns, distill memories',\n parameters: z.object({\n filePath: z.string().describe('Path to file that was edited'),\n success: z.boolean().describe('Whether the edit was successful'),\n agent: z.string().optional().describe('Agent that performed the edit'),\n duration: z.number().optional().describe('Edit duration in ms'),\n errorMessage: z.string().optional().describe('Error message if failed')\n }),\n execute: async ({ filePath, success, agent, duration, errorMessage }, { onProgress }) => {\n const startTime = Date.now();\n const intel = loadIntelligence();\n const ext = path.extname(filePath);\n const state = `edit:${ext}`;\n\n // RUVECTOR INTELLIGENCE: Complete trajectory and learn\n let learningOutcome = null;\n let intelligenceEnabled = false;\n\n try {\n const trajectoryId = activeEditTrajectories.get(filePath);\n\n if (trajectoryId !== undefined) {\n // Record the final step\n await recordTrajectoryStep(\n trajectoryId,\n `edit-${success ? 'success' : 'failure'}`,\n success ? SUCCESS_REWARD : FAILURE_PENALTY,\n {\n file: filePath,\n errorFixed: success,\n testPassed: success\n }\n );\n\n // End trajectory and get learning outcome\n const quality = success ? 0.9 : 0.3;\n learningOutcome = await endTaskTrajectory(trajectoryId, success, quality);\n\n // Store successful pattern in ReasoningBank\n if (success && agent) {\n await storePattern(\n `Edit ${ext} file: ${path.basename(filePath)}`,\n `Agent ${agent} successfully edited the file`,\n SUCCESS_REWARD\n );\n }\n\n // Clean up\n activeEditTrajectories.delete(filePath);\n intelligenceEnabled = true;\n }\n } catch (error) {\n console.debug('[PostEdit] Intelligence learning failed:', error);\n }\n\n // 1. Update Q-table pattern (fallback learning)\n if (agent) {\n if (!intel.patterns[state]) {\n intel.patterns[state] = {};\n }\n\n const currentValue = intel.patterns[state][agent] || 0;\n const reward = success ? SUCCESS_REWARD : FAILURE_PENALTY;\n\n // Q-learning update: Q(s,a) = Q(s,a) + α * (r - Q(s,a))\n intel.patterns[state][agent] = currentValue + LEARNING_RATE * (reward - currentValue);\n }\n\n // 2. Record in metrics\n intel.metrics.totalRoutes++;\n if (success) {\n intel.metrics.successfulRoutes++;\n }\n\n intel.metrics.routingHistory.push({\n timestamp: new Date().toISOString(),\n task: `edit:${filePath}`,\n agent: agent || 'unknown',\n success\n });\n\n // Keep last 100 entries\n if (intel.metrics.routingHistory.length > 100) {\n intel.metrics.routingHistory = intel.metrics.routingHistory.slice(-100);\n }\n\n // 3. Store error pattern if failed\n if (!success && errorMessage) {\n const existingPattern = intel.errorPatterns.find(\n p => p.errorType === errorMessage.split(':')[0]\n );\n\n if (existingPattern) {\n existingPattern.agentSuccess[agent || 'unknown'] =\n (existingPattern.agentSuccess[agent || 'unknown'] || 0) - 1;\n } else {\n intel.errorPatterns.push({\n errorType: errorMessage.split(':')[0] || 'UnknownError',\n context: `${ext} file edit`,\n resolution: '',\n agentSuccess: { [agent || 'unknown']: -1 }\n });\n }\n\n // Keep last 50 error patterns\n if (intel.errorPatterns.length > 50) {\n intel.errorPatterns = intel.errorPatterns.slice(-50);\n }\n }\n\n // 4. Distill successful pattern as memory\n if (success && agent) {\n const memoryContent = `Successful ${ext} edit by ${agent} on ${path.basename(filePath)}`;\n intel.memories.push({\n content: memoryContent,\n type: 'success',\n created: new Date().toISOString(),\n embedding: simpleEmbed(memoryContent)\n });\n\n // Keep last 200 memories\n if (intel.memories.length > 200) {\n intel.memories = intel.memories.slice(-200);\n }\n }\n\n // 5. Save updated intelligence\n saveIntelligence(intel);\n\n const latency = Date.now() - startTime;\n\n // Get intelligence stats for monitoring\n let intelligenceStats = null;\n try {\n intelligenceStats = await getIntelligenceStats();\n } catch (e) {\n // Ignore if not available\n }\n\n return {\n success: true,\n patternsUpdated: true,\n newPatternValue: agent ? intel.patterns[state]?.[agent] : null,\n routingAccuracy: intel.metrics.totalRoutes > 0\n ? intel.metrics.successfulRoutes / intel.metrics.totalRoutes\n : 0,\n // RuVector Intelligence additions\n intelligenceEnabled,\n learningOutcome,\n intelligenceStats,\n latencyMs: latency,\n timestamp: new Date().toISOString()\n };\n }\n};\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-Command Hook - Command risk assessment
|
|
3
|
+
* Assesses command safety and suggests alternatives
|
|
4
|
+
*/
|
|
5
|
+
import type { ToolDefinition } from '../../types/index.js';
|
|
6
|
+
export declare const hookPreCommandTool: ToolDefinition;
|
|
7
|
+
//# sourceMappingURL=pre-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-command.d.ts","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/pre-command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAgB3D,eAAO,MAAM,kBAAkB,EAAE,cA0DhC,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-Command Hook - Command risk assessment
|
|
3
|
+
* Assesses command safety and suggests alternatives
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { loadIntelligence, assessCommandRisk } from './shared.js';
|
|
7
|
+
// Safer alternatives for risky commands
|
|
8
|
+
const saferAlternatives = {
|
|
9
|
+
'rm -rf': 'rm -ri (interactive) or move to trash',
|
|
10
|
+
'sudo rm': 'Consider using specific permissions instead',
|
|
11
|
+
'chmod 777': 'chmod 755 or more restrictive permissions',
|
|
12
|
+
'curl | sh': 'Download script first, review, then execute',
|
|
13
|
+
'wget | sh': 'Download script first, review, then execute'
|
|
14
|
+
};
|
|
15
|
+
export const hookPreCommandTool = {
|
|
16
|
+
name: 'hook_pre_command',
|
|
17
|
+
description: 'Pre-command intelligence: assess risk level and suggest alternatives',
|
|
18
|
+
parameters: z.object({
|
|
19
|
+
command: z.string().describe('Command to assess')
|
|
20
|
+
}),
|
|
21
|
+
execute: async ({ command }, { onProgress }) => {
|
|
22
|
+
const startTime = Date.now();
|
|
23
|
+
const intel = loadIntelligence();
|
|
24
|
+
// 1. Assess risk level
|
|
25
|
+
const riskLevel = assessCommandRisk(command);
|
|
26
|
+
// 2. Find matching safer alternatives
|
|
27
|
+
const suggestions = [];
|
|
28
|
+
for (const [risky, safe] of Object.entries(saferAlternatives)) {
|
|
29
|
+
if (command.includes(risky)) {
|
|
30
|
+
suggestions.push(safe);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// 3. Check if command matches known error patterns
|
|
34
|
+
const warnings = [];
|
|
35
|
+
const cmdBase = command.split(' ')[0];
|
|
36
|
+
for (const ep of intel.errorPatterns) {
|
|
37
|
+
if (ep.context.includes(cmdBase) && ep.resolution) {
|
|
38
|
+
warnings.push(`Previous issue: ${ep.resolution}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// 4. Determine approval status
|
|
42
|
+
const approved = riskLevel < 0.7;
|
|
43
|
+
const requiresConfirmation = riskLevel >= 0.5 && riskLevel < 0.9;
|
|
44
|
+
const blocked = riskLevel >= 0.9;
|
|
45
|
+
// 5. Categorize risk
|
|
46
|
+
let riskCategory;
|
|
47
|
+
if (riskLevel < 0.3)
|
|
48
|
+
riskCategory = 'safe';
|
|
49
|
+
else if (riskLevel < 0.6)
|
|
50
|
+
riskCategory = 'caution';
|
|
51
|
+
else if (riskLevel < 0.9)
|
|
52
|
+
riskCategory = 'dangerous';
|
|
53
|
+
else
|
|
54
|
+
riskCategory = 'blocked';
|
|
55
|
+
const latency = Date.now() - startTime;
|
|
56
|
+
return {
|
|
57
|
+
success: true,
|
|
58
|
+
riskLevel,
|
|
59
|
+
riskCategory,
|
|
60
|
+
approved,
|
|
61
|
+
requiresConfirmation,
|
|
62
|
+
blocked,
|
|
63
|
+
suggestions,
|
|
64
|
+
warnings: warnings.slice(0, 2),
|
|
65
|
+
latencyMs: latency,
|
|
66
|
+
timestamp: new Date().toISOString()
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=pre-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-command.js","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/pre-command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EAElB,MAAM,aAAa,CAAC;AAErB,wCAAwC;AACxC,MAAM,iBAAiB,GAA2B;IAChD,QAAQ,EAAE,uCAAuC;IACjD,SAAS,EAAE,6CAA6C;IACxD,WAAW,EAAE,2CAA2C;IACxD,WAAW,EAAE,6CAA6C;IAC1D,WAAW,EAAE,6CAA6C;CAC3D,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,sEAAsE;IACnF,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KAClD,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;QAEjC,uBAAuB;QACvB,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAE7C,sCAAsC;QACtC,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9D,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,mDAAmD;QACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;gBAClD,QAAQ,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,SAAS,GAAG,GAAG,CAAC;QACjC,MAAM,oBAAoB,GAAG,SAAS,IAAI,GAAG,IAAI,SAAS,GAAG,GAAG,CAAC;QACjE,MAAM,OAAO,GAAG,SAAS,IAAI,GAAG,CAAC;QAEjC,qBAAqB;QACrB,IAAI,YAA0D,CAAC;QAC/D,IAAI,SAAS,GAAG,GAAG;YAAE,YAAY,GAAG,MAAM,CAAC;aACtC,IAAI,SAAS,GAAG,GAAG;YAAE,YAAY,GAAG,SAAS,CAAC;aAC9C,IAAI,SAAS,GAAG,GAAG;YAAE,YAAY,GAAG,WAAW,CAAC;;YAChD,YAAY,GAAG,SAAS,CAAC;QAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAEvC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS;YACT,YAAY;YACZ,QAAQ;YACR,oBAAoB;YACpB,OAAO;YACP,WAAW;YACX,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9B,SAAS,EAAE,OAAO;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC;CACF,CAAC","sourcesContent":["/**\n * Pre-Command Hook - Command risk assessment\n * Assesses command safety and suggests alternatives\n */\n\nimport { z } from 'zod';\nimport type { ToolDefinition } from '../../types/index.js';\nimport {\n loadIntelligence,\n assessCommandRisk,\n dangerousPatterns\n} from './shared.js';\n\n// Safer alternatives for risky commands\nconst saferAlternatives: Record<string, string> = {\n 'rm -rf': 'rm -ri (interactive) or move to trash',\n 'sudo rm': 'Consider using specific permissions instead',\n 'chmod 777': 'chmod 755 or more restrictive permissions',\n 'curl | sh': 'Download script first, review, then execute',\n 'wget | sh': 'Download script first, review, then execute'\n};\n\nexport const hookPreCommandTool: ToolDefinition = {\n name: 'hook_pre_command',\n description: 'Pre-command intelligence: assess risk level and suggest alternatives',\n parameters: z.object({\n command: z.string().describe('Command to assess')\n }),\n execute: async ({ command }, { onProgress }) => {\n const startTime = Date.now();\n const intel = loadIntelligence();\n\n // 1. Assess risk level\n const riskLevel = assessCommandRisk(command);\n\n // 2. Find matching safer alternatives\n const suggestions: string[] = [];\n for (const [risky, safe] of Object.entries(saferAlternatives)) {\n if (command.includes(risky)) {\n suggestions.push(safe);\n }\n }\n\n // 3. Check if command matches known error patterns\n const warnings: string[] = [];\n const cmdBase = command.split(' ')[0];\n\n for (const ep of intel.errorPatterns) {\n if (ep.context.includes(cmdBase) && ep.resolution) {\n warnings.push(`Previous issue: ${ep.resolution}`);\n }\n }\n\n // 4. Determine approval status\n const approved = riskLevel < 0.7;\n const requiresConfirmation = riskLevel >= 0.5 && riskLevel < 0.9;\n const blocked = riskLevel >= 0.9;\n\n // 5. Categorize risk\n let riskCategory: 'safe' | 'caution' | 'dangerous' | 'blocked';\n if (riskLevel < 0.3) riskCategory = 'safe';\n else if (riskLevel < 0.6) riskCategory = 'caution';\n else if (riskLevel < 0.9) riskCategory = 'dangerous';\n else riskCategory = 'blocked';\n\n const latency = Date.now() - startTime;\n\n return {\n success: true,\n riskLevel,\n riskCategory,\n approved,\n requiresConfirmation,\n blocked,\n suggestions,\n warnings: warnings.slice(0, 2),\n latencyMs: latency,\n timestamp: new Date().toISOString()\n };\n }\n};\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-Edit Hook - Context retrieval and agent routing before file edit
|
|
3
|
+
* Latency target: <20ms
|
|
4
|
+
*
|
|
5
|
+
* NOW WITH RUVECTOR INTELLIGENCE:
|
|
6
|
+
* - Trajectory tracking for learning from edit sequences
|
|
7
|
+
* - HNSW-powered similar file retrieval
|
|
8
|
+
* - SONA pattern matching for agent selection
|
|
9
|
+
*/
|
|
10
|
+
import type { ToolDefinition } from '../../types/index.js';
|
|
11
|
+
declare const activeEditTrajectories: Map<string, number>;
|
|
12
|
+
export { activeEditTrajectories };
|
|
13
|
+
export declare const hookPreEditTool: ToolDefinition;
|
|
14
|
+
//# sourceMappingURL=pre-edit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-edit.d.ts","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/pre-edit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAc3D,QAAA,MAAM,sBAAsB,qBAA4B,CAAC;AAGzD,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC,eAAO,MAAM,eAAe,EAAE,cAuH7B,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-Edit Hook - Context retrieval and agent routing before file edit
|
|
3
|
+
* Latency target: <20ms
|
|
4
|
+
*
|
|
5
|
+
* NOW WITH RUVECTOR INTELLIGENCE:
|
|
6
|
+
* - Trajectory tracking for learning from edit sequences
|
|
7
|
+
* - HNSW-powered similar file retrieval
|
|
8
|
+
* - SONA pattern matching for agent selection
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
import { loadIntelligence, getAgentForFile, simpleEmbed, cosineSimilarity } from './shared.js';
|
|
13
|
+
import { beginTaskTrajectory, findSimilarPatterns } from './intelligence-bridge.js';
|
|
14
|
+
// Store active trajectory IDs for continuation in post-edit
|
|
15
|
+
const activeEditTrajectories = new Map();
|
|
16
|
+
// Export for post-edit to access
|
|
17
|
+
export { activeEditTrajectories };
|
|
18
|
+
export const hookPreEditTool = {
|
|
19
|
+
name: 'hook_pre_edit',
|
|
20
|
+
description: 'Pre-edit intelligence: retrieve context, suggest agent, find related files',
|
|
21
|
+
parameters: z.object({
|
|
22
|
+
filePath: z.string().describe('Path to file being edited'),
|
|
23
|
+
task: z.string().optional().describe('Optional task description')
|
|
24
|
+
}),
|
|
25
|
+
execute: async ({ filePath, task }, { onProgress }) => {
|
|
26
|
+
const startTime = Date.now();
|
|
27
|
+
const intel = loadIntelligence();
|
|
28
|
+
const ext = path.extname(filePath);
|
|
29
|
+
const dir = path.dirname(filePath);
|
|
30
|
+
// START TRAJECTORY TRACKING (RuVector Intelligence)
|
|
31
|
+
let trajectoryId = null;
|
|
32
|
+
let intelligenceEnabled = false;
|
|
33
|
+
let similarPatterns = [];
|
|
34
|
+
try {
|
|
35
|
+
// Begin trajectory for this edit
|
|
36
|
+
const taskDesc = task || `Edit ${path.basename(filePath)}`;
|
|
37
|
+
const trajectoryResult = await beginTaskTrajectory(taskDesc, getAgentForFile(filePath));
|
|
38
|
+
if (trajectoryResult.success && trajectoryResult.trajectoryId >= 0) {
|
|
39
|
+
trajectoryId = trajectoryResult.trajectoryId;
|
|
40
|
+
activeEditTrajectories.set(filePath, trajectoryId);
|
|
41
|
+
intelligenceEnabled = true;
|
|
42
|
+
}
|
|
43
|
+
// Find similar past edits using HNSW (150x faster)
|
|
44
|
+
similarPatterns = await findSimilarPatterns(taskDesc, 3);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
// Continue without trajectory if intelligence not available
|
|
48
|
+
console.debug('[PreEdit] Intelligence not available:', error);
|
|
49
|
+
}
|
|
50
|
+
// 1. Determine suggested agent from patterns
|
|
51
|
+
const state = `edit:${ext}`;
|
|
52
|
+
let suggestedAgent = getAgentForFile(filePath);
|
|
53
|
+
let confidence = 0.5;
|
|
54
|
+
// Check learned patterns
|
|
55
|
+
if (intel.patterns[state]) {
|
|
56
|
+
const agents = intel.patterns[state];
|
|
57
|
+
let bestAgent = suggestedAgent;
|
|
58
|
+
let bestScore = 0;
|
|
59
|
+
for (const [agent, score] of Object.entries(agents)) {
|
|
60
|
+
if (score > bestScore) {
|
|
61
|
+
bestScore = score;
|
|
62
|
+
bestAgent = agent;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (bestScore > 0) {
|
|
66
|
+
suggestedAgent = bestAgent;
|
|
67
|
+
confidence = Math.min(0.9, 0.5 + bestScore / 10);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Check directory patterns
|
|
71
|
+
if (intel.dirPatterns[dir]) {
|
|
72
|
+
suggestedAgent = intel.dirPatterns[dir];
|
|
73
|
+
confidence = Math.max(confidence, 0.6);
|
|
74
|
+
}
|
|
75
|
+
// 2. Find related files from co-edit sequences
|
|
76
|
+
const relatedFiles = [];
|
|
77
|
+
if (intel.sequences[filePath]) {
|
|
78
|
+
relatedFiles.push(...intel.sequences[filePath]
|
|
79
|
+
.sort((a, b) => b.score - a.score)
|
|
80
|
+
.slice(0, 5));
|
|
81
|
+
}
|
|
82
|
+
// 3. Retrieve relevant memories
|
|
83
|
+
const memories = [];
|
|
84
|
+
if (task && intel.memories.length > 0) {
|
|
85
|
+
const taskEmbed = simpleEmbed(task);
|
|
86
|
+
for (const mem of intel.memories) {
|
|
87
|
+
if (mem.embedding) {
|
|
88
|
+
const score = cosineSimilarity(taskEmbed, mem.embedding);
|
|
89
|
+
if (score > 0.3) {
|
|
90
|
+
memories.push({ content: mem.content.slice(0, 200), score });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
memories.sort((a, b) => b.score - a.score);
|
|
95
|
+
memories.splice(3); // Keep top 3
|
|
96
|
+
}
|
|
97
|
+
// 4. Check for relevant error patterns
|
|
98
|
+
const errorHints = [];
|
|
99
|
+
for (const ep of intel.errorPatterns) {
|
|
100
|
+
if (ep.context.includes(ext) || ep.context.includes(path.basename(filePath))) {
|
|
101
|
+
errorHints.push(ep.resolution);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const latency = Date.now() - startTime;
|
|
105
|
+
return {
|
|
106
|
+
success: true,
|
|
107
|
+
suggestedAgent,
|
|
108
|
+
confidence,
|
|
109
|
+
relatedFiles,
|
|
110
|
+
memories,
|
|
111
|
+
errorHints: errorHints.slice(0, 2),
|
|
112
|
+
// RuVector Intelligence additions
|
|
113
|
+
trajectoryId,
|
|
114
|
+
intelligenceEnabled,
|
|
115
|
+
similarPatterns: similarPatterns.slice(0, 3),
|
|
116
|
+
latencyMs: latency,
|
|
117
|
+
timestamp: new Date().toISOString()
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=pre-edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-edit.js","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/pre-edit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,gBAAgB,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EAEpB,MAAM,0BAA0B,CAAC;AAElC,4DAA4D;AAC5D,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEzD,iCAAiC;AACjC,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC,MAAM,CAAC,MAAM,eAAe,GAAmB;IAC7C,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,4EAA4E;IACzF,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC1D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KAClE,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEnC,oDAAoD;QACpD,IAAI,YAAY,GAAkB,IAAI,CAAC;QACvC,IAAI,mBAAmB,GAAG,KAAK,CAAC;QAChC,IAAI,eAAe,GAAoE,EAAE,CAAC;QAE1F,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,QAAQ,GAAG,IAAI,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,MAAM,gBAAgB,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;YAExF,IAAI,gBAAgB,CAAC,OAAO,IAAI,gBAAgB,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;gBACnE,YAAY,GAAG,gBAAgB,CAAC,YAAY,CAAC;gBAC7C,sBAAsB,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;gBACnD,mBAAmB,GAAG,IAAI,CAAC;YAC7B,CAAC;YAED,mDAAmD;YACnD,eAAe,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4DAA4D;YAC5D,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC;QAED,6CAA6C;QAC7C,MAAM,KAAK,GAAG,QAAQ,GAAG,EAAE,CAAC;QAC5B,IAAI,cAAc,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,UAAU,GAAG,GAAG,CAAC;QAErB,yBAAyB;QACzB,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,SAAS,GAAG,cAAc,CAAC;YAC/B,IAAI,SAAS,GAAG,CAAC,CAAC;YAElB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpD,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;oBACtB,SAAS,GAAG,KAAK,CAAC;oBAClB,SAAS,GAAG,KAAK,CAAC;gBACpB,CAAC;YACH,CAAC;YAED,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClB,cAAc,GAAG,SAAS,CAAC;gBAC3B,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,GAAG,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACxC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;QAED,+CAA+C;QAC/C,MAAM,YAAY,GAA2C,EAAE,CAAC;QAChE,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,YAAY,CAAC,IAAI,CACf,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC;iBACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;iBACjC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CACf,CAAC;QACJ,CAAC;QAED,gCAAgC;QAChC,MAAM,QAAQ,GAA8C,EAAE,CAAC;QAC/D,IAAI,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YAEpC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;oBAClB,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;oBACzD,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;wBAChB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC/D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YAC3C,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;QACnC,CAAC;QAED,uCAAuC;QACvC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAC7E,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAEvC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,cAAc;YACd,UAAU;YACV,YAAY;YACZ,QAAQ;YACR,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAClC,kCAAkC;YAClC,YAAY;YACZ,mBAAmB;YACnB,eAAe,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5C,SAAS,EAAE,OAAO;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC;CACF,CAAC","sourcesContent":["/**\n * Pre-Edit Hook - Context retrieval and agent routing before file edit\n * Latency target: <20ms\n *\n * NOW WITH RUVECTOR INTELLIGENCE:\n * - Trajectory tracking for learning from edit sequences\n * - HNSW-powered similar file retrieval\n * - SONA pattern matching for agent selection\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} from './shared.js';\nimport {\n beginTaskTrajectory,\n findSimilarPatterns,\n getIntelligenceStats\n} from './intelligence-bridge.js';\n\n// Store active trajectory IDs for continuation in post-edit\nconst activeEditTrajectories = new Map<string, number>();\n\n// Export for post-edit to access\nexport { activeEditTrajectories };\n\nexport const hookPreEditTool: ToolDefinition = {\n name: 'hook_pre_edit',\n description: 'Pre-edit intelligence: retrieve context, suggest agent, find related files',\n parameters: z.object({\n filePath: z.string().describe('Path to file being edited'),\n task: z.string().optional().describe('Optional task description')\n }),\n execute: async ({ filePath, task }, { onProgress }) => {\n const startTime = Date.now();\n const intel = loadIntelligence();\n const ext = path.extname(filePath);\n const dir = path.dirname(filePath);\n\n // START TRAJECTORY TRACKING (RuVector Intelligence)\n let trajectoryId: number | null = null;\n let intelligenceEnabled = false;\n let similarPatterns: Array<{ task: string; resolution: string; similarity: number }> = [];\n\n try {\n // Begin trajectory for this edit\n const taskDesc = task || `Edit ${path.basename(filePath)}`;\n const trajectoryResult = await beginTaskTrajectory(taskDesc, getAgentForFile(filePath));\n\n if (trajectoryResult.success && trajectoryResult.trajectoryId >= 0) {\n trajectoryId = trajectoryResult.trajectoryId;\n activeEditTrajectories.set(filePath, trajectoryId);\n intelligenceEnabled = true;\n }\n\n // Find similar past edits using HNSW (150x faster)\n similarPatterns = await findSimilarPatterns(taskDesc, 3);\n } catch (error) {\n // Continue without trajectory if intelligence not available\n console.debug('[PreEdit] Intelligence not available:', error);\n }\n\n // 1. Determine suggested agent from patterns\n const state = `edit:${ext}`;\n let suggestedAgent = getAgentForFile(filePath);\n let confidence = 0.5;\n\n // Check learned patterns\n if (intel.patterns[state]) {\n const agents = intel.patterns[state];\n let bestAgent = suggestedAgent;\n let bestScore = 0;\n\n for (const [agent, score] of Object.entries(agents)) {\n if (score > bestScore) {\n bestScore = score;\n bestAgent = agent;\n }\n }\n\n if (bestScore > 0) {\n suggestedAgent = bestAgent;\n confidence = Math.min(0.9, 0.5 + bestScore / 10);\n }\n }\n\n // Check directory patterns\n if (intel.dirPatterns[dir]) {\n suggestedAgent = intel.dirPatterns[dir];\n confidence = Math.max(confidence, 0.6);\n }\n\n // 2. Find related files from co-edit sequences\n const relatedFiles: Array<{ file: string; score: number }> = [];\n if (intel.sequences[filePath]) {\n relatedFiles.push(\n ...intel.sequences[filePath]\n .sort((a, b) => b.score - a.score)\n .slice(0, 5)\n );\n }\n\n // 3. Retrieve relevant memories\n const memories: Array<{ content: string; score: number }> = [];\n if (task && intel.memories.length > 0) {\n const taskEmbed = simpleEmbed(task);\n\n for (const mem of intel.memories) {\n if (mem.embedding) {\n const score = cosineSimilarity(taskEmbed, mem.embedding);\n if (score > 0.3) {\n memories.push({ content: mem.content.slice(0, 200), score });\n }\n }\n }\n\n memories.sort((a, b) => b.score - a.score);\n memories.splice(3); // Keep top 3\n }\n\n // 4. Check for relevant error patterns\n const errorHints: string[] = [];\n for (const ep of intel.errorPatterns) {\n if (ep.context.includes(ext) || ep.context.includes(path.basename(filePath))) {\n errorHints.push(ep.resolution);\n }\n }\n\n const latency = Date.now() - startTime;\n\n return {\n success: true,\n suggestedAgent,\n confidence,\n relatedFiles,\n memories,\n errorHints: errorHints.slice(0, 2),\n // RuVector Intelligence additions\n trajectoryId,\n intelligenceEnabled,\n similarPatterns: similarPatterns.slice(0, 3),\n latencyMs: latency,\n timestamp: new Date().toISOString()\n };\n }\n};\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pretrain Hook - Analyze repository and bootstrap intelligence
|
|
3
|
+
* Swarm-distributed when available, falls back to sequential
|
|
4
|
+
*/
|
|
5
|
+
import type { ToolDefinition } from '../../types/index.js';
|
|
6
|
+
export declare const hookPretrainTool: ToolDefinition;
|
|
7
|
+
//# sourceMappingURL=pretrain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pretrain.d.ts","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/pretrain.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAS3D,eAAO,MAAM,gBAAgB,EAAE,cAyL9B,CAAC"}
|