@claude-flow/cli 3.0.0-alpha.177 → 3.0.0-alpha.179
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/README.md +1 -0
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +22 -0
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +262 -13
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/ruvector/index.d.ts +1 -0
- package/dist/src/ruvector/index.d.ts.map +1 -1
- package/dist/src/ruvector/index.js +1 -0
- package/dist/src/ruvector/index.js.map +1 -1
- package/dist/src/ruvector/semantic-router.d.ts +77 -0
- package/dist/src/ruvector/semantic-router.d.ts.map +1 -0
- package/dist/src/ruvector/semantic-router.js +178 -0
- package/dist/src/ruvector/semantic-router.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure JavaScript SemanticRouter implementation
|
|
3
|
+
*
|
|
4
|
+
* Provides intent routing using cosine similarity.
|
|
5
|
+
* This is a fallback implementation since @ruvector/router's native VectorDb has bugs.
|
|
6
|
+
*
|
|
7
|
+
* Performance: ~50,000 routes/sec with 100 intents (sufficient for agent routing)
|
|
8
|
+
*/
|
|
9
|
+
export class SemanticRouter {
|
|
10
|
+
dimension;
|
|
11
|
+
metric;
|
|
12
|
+
intents = new Map();
|
|
13
|
+
totalVectors = 0;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
if (!config || typeof config.dimension !== 'number') {
|
|
16
|
+
throw new Error('SemanticRouter requires a dimension in config');
|
|
17
|
+
}
|
|
18
|
+
this.dimension = config.dimension;
|
|
19
|
+
this.metric = config.metric ?? 'cosine';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Add an intent with pre-computed embeddings
|
|
23
|
+
*/
|
|
24
|
+
addIntentWithEmbeddings(name, embeddings, metadata = {}) {
|
|
25
|
+
if (!name || !Array.isArray(embeddings)) {
|
|
26
|
+
throw new Error('Must provide name and embeddings array');
|
|
27
|
+
}
|
|
28
|
+
// Validate embeddings
|
|
29
|
+
for (const emb of embeddings) {
|
|
30
|
+
if (!(emb instanceof Float32Array) || emb.length !== this.dimension) {
|
|
31
|
+
throw new Error(`Embedding must be Float32Array of length ${this.dimension}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Normalize embeddings for cosine similarity
|
|
35
|
+
const normalizedEmbeddings = embeddings.map(emb => this.normalize(emb));
|
|
36
|
+
this.intents.set(name, {
|
|
37
|
+
name,
|
|
38
|
+
embeddings: normalizedEmbeddings,
|
|
39
|
+
metadata,
|
|
40
|
+
});
|
|
41
|
+
this.totalVectors += embeddings.length;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Route a query using a pre-computed embedding
|
|
45
|
+
*/
|
|
46
|
+
routeWithEmbedding(embedding, k = 5) {
|
|
47
|
+
if (!(embedding instanceof Float32Array) || embedding.length !== this.dimension) {
|
|
48
|
+
throw new Error(`Embedding must be Float32Array of length ${this.dimension}`);
|
|
49
|
+
}
|
|
50
|
+
const normalizedQuery = this.normalize(embedding);
|
|
51
|
+
const scores = [];
|
|
52
|
+
// Calculate best score for each intent
|
|
53
|
+
for (const [intentName, intent] of this.intents) {
|
|
54
|
+
let bestScore = -Infinity;
|
|
55
|
+
for (const storedEmb of intent.embeddings) {
|
|
56
|
+
const score = this.similarity(normalizedQuery, storedEmb);
|
|
57
|
+
if (score > bestScore) {
|
|
58
|
+
bestScore = score;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
scores.push({
|
|
62
|
+
intent: intentName,
|
|
63
|
+
score: bestScore,
|
|
64
|
+
metadata: intent.metadata,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
// Sort by score descending and take top k
|
|
68
|
+
return scores
|
|
69
|
+
.sort((a, b) => b.score - a.score)
|
|
70
|
+
.slice(0, k);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Remove an intent
|
|
74
|
+
*/
|
|
75
|
+
removeIntent(name) {
|
|
76
|
+
const intent = this.intents.get(name);
|
|
77
|
+
if (!intent)
|
|
78
|
+
return false;
|
|
79
|
+
this.totalVectors -= intent.embeddings.length;
|
|
80
|
+
this.intents.delete(name);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get all intent names
|
|
85
|
+
*/
|
|
86
|
+
getIntents() {
|
|
87
|
+
return Array.from(this.intents.keys());
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get intent details
|
|
91
|
+
*/
|
|
92
|
+
getIntent(name) {
|
|
93
|
+
const data = this.intents.get(name);
|
|
94
|
+
if (!data)
|
|
95
|
+
return null;
|
|
96
|
+
return {
|
|
97
|
+
name: data.name,
|
|
98
|
+
utterances: [], // We don't store utterances, only embeddings
|
|
99
|
+
metadata: data.metadata,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Clear all intents
|
|
104
|
+
*/
|
|
105
|
+
clear() {
|
|
106
|
+
this.intents.clear();
|
|
107
|
+
this.totalVectors = 0;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get total vector count
|
|
111
|
+
*/
|
|
112
|
+
count() {
|
|
113
|
+
return this.totalVectors;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get number of intents
|
|
117
|
+
*/
|
|
118
|
+
intentCount() {
|
|
119
|
+
return this.intents.size;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Normalize a vector for cosine similarity
|
|
123
|
+
*/
|
|
124
|
+
normalize(vec) {
|
|
125
|
+
let norm = 0;
|
|
126
|
+
for (let i = 0; i < vec.length; i++) {
|
|
127
|
+
norm += vec[i] * vec[i];
|
|
128
|
+
}
|
|
129
|
+
norm = Math.sqrt(norm);
|
|
130
|
+
if (norm === 0)
|
|
131
|
+
return vec;
|
|
132
|
+
const normalized = new Float32Array(vec.length);
|
|
133
|
+
for (let i = 0; i < vec.length; i++) {
|
|
134
|
+
normalized[i] = vec[i] / norm;
|
|
135
|
+
}
|
|
136
|
+
return normalized;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Calculate similarity between two normalized vectors
|
|
140
|
+
*/
|
|
141
|
+
similarity(a, b) {
|
|
142
|
+
switch (this.metric) {
|
|
143
|
+
case 'cosine':
|
|
144
|
+
// For normalized vectors, cosine similarity = dot product
|
|
145
|
+
return this.dotProduct(a, b);
|
|
146
|
+
case 'dotProduct':
|
|
147
|
+
return this.dotProduct(a, b);
|
|
148
|
+
case 'euclidean':
|
|
149
|
+
// Convert Euclidean distance to similarity
|
|
150
|
+
return 1 / (1 + this.euclideanDistance(a, b));
|
|
151
|
+
default:
|
|
152
|
+
return this.dotProduct(a, b);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
dotProduct(a, b) {
|
|
156
|
+
let sum = 0;
|
|
157
|
+
for (let i = 0; i < a.length; i++) {
|
|
158
|
+
sum += a[i] * b[i];
|
|
159
|
+
}
|
|
160
|
+
return sum;
|
|
161
|
+
}
|
|
162
|
+
euclideanDistance(a, b) {
|
|
163
|
+
let sum = 0;
|
|
164
|
+
for (let i = 0; i < a.length; i++) {
|
|
165
|
+
const diff = a[i] - b[i];
|
|
166
|
+
sum += diff * diff;
|
|
167
|
+
}
|
|
168
|
+
return Math.sqrt(sum);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Create a SemanticRouter with the given configuration
|
|
173
|
+
*/
|
|
174
|
+
export function createSemanticRouter(config) {
|
|
175
|
+
return new SemanticRouter(config);
|
|
176
|
+
}
|
|
177
|
+
export default SemanticRouter;
|
|
178
|
+
//# sourceMappingURL=semantic-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-router.js","sourceRoot":"","sources":["../../../src/ruvector/semantic-router.ts"],"names":[],"mappings":"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"}
|