@hivehub/rulebook 2.0.0 → 3.0.0
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 +779 -654
- package/dist/cli/commands.d.ts +22 -0
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +291 -8
- package/dist/cli/commands.js.map +1 -1
- package/dist/core/claude-mcp.d.ts +32 -0
- package/dist/core/claude-mcp.d.ts.map +1 -0
- package/dist/core/claude-mcp.js +92 -0
- package/dist/core/claude-mcp.js.map +1 -0
- package/dist/core/config-manager.d.ts.map +1 -1
- package/dist/core/config-manager.js +27 -6
- package/dist/core/config-manager.js.map +1 -1
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +98 -49
- package/dist/core/generator.js.map +1 -1
- package/dist/core/migrator.d.ts +13 -0
- package/dist/core/migrator.d.ts.map +1 -1
- package/dist/core/migrator.js +76 -9
- package/dist/core/migrator.js.map +1 -1
- package/dist/core/openspec-migrator.d.ts +1 -1
- package/dist/core/openspec-migrator.d.ts.map +1 -1
- package/dist/core/openspec-migrator.js +14 -7
- package/dist/core/openspec-migrator.js.map +1 -1
- package/dist/core/workflow-generator.js +297 -176
- package/dist/core/workflow-generator.js.map +1 -1
- package/dist/index.js +40 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +255 -74
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/dist/memory/hnsw-index.d.ts +63 -0
- package/dist/memory/hnsw-index.d.ts.map +1 -0
- package/dist/memory/hnsw-index.js +421 -0
- package/dist/memory/hnsw-index.js.map +1 -0
- package/dist/memory/memory-cache.d.ts +33 -0
- package/dist/memory/memory-cache.d.ts.map +1 -0
- package/dist/memory/memory-cache.js +85 -0
- package/dist/memory/memory-cache.js.map +1 -0
- package/dist/memory/memory-hooks.d.ts +42 -0
- package/dist/memory/memory-hooks.d.ts.map +1 -0
- package/dist/memory/memory-hooks.js +193 -0
- package/dist/memory/memory-hooks.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +55 -0
- package/dist/memory/memory-manager.d.ts.map +1 -0
- package/dist/memory/memory-manager.js +209 -0
- package/dist/memory/memory-manager.js.map +1 -0
- package/dist/memory/memory-search.d.ts +42 -0
- package/dist/memory/memory-search.d.ts.map +1 -0
- package/dist/memory/memory-search.js +166 -0
- package/dist/memory/memory-search.js.map +1 -0
- package/dist/memory/memory-store.d.ts +59 -0
- package/dist/memory/memory-store.d.ts.map +1 -0
- package/dist/memory/memory-store.js +394 -0
- package/dist/memory/memory-store.js.map +1 -0
- package/dist/memory/memory-types.d.ts +69 -0
- package/dist/memory/memory-types.d.ts.map +1 -0
- package/dist/memory/memory-types.js +7 -0
- package/dist/memory/memory-types.js.map +1 -0
- package/dist/memory/memory-vectorizer.d.ts +29 -0
- package/dist/memory/memory-vectorizer.d.ts.map +1 -0
- package/dist/memory/memory-vectorizer.js +104 -0
- package/dist/memory/memory-vectorizer.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +107 -106
- package/templates/cli/CLAUDE_CODE.md +114 -13
- package/templates/commands/rulebook-memory-save.md +48 -0
- package/templates/commands/rulebook-memory-search.md +47 -0
- package/templates/commands/rulebook-task-apply.md +2 -2
- package/templates/commands/rulebook-task-archive.md +2 -2
- package/templates/commands/rulebook-task-create.md +2 -2
- package/templates/commands/rulebook-task-list.md +2 -2
- package/templates/commands/rulebook-task-show.md +2 -2
- package/templates/commands/rulebook-task-validate.md +2 -2
- package/templates/git/CI_CD_PATTERNS.md +4 -4
- package/templates/git/GITHUB_ACTIONS.md +3 -3
- package/templates/git/GITLAB_CI.md +4 -4
- package/templates/git/SECRETS_MANAGEMENT.md +4 -4
- package/templates/hooks/COMMIT_MSG.md +4 -4
- package/templates/hooks/POST_CHECKOUT.md +3 -3
- package/templates/hooks/PREPARE_COMMIT_MSG.md +3 -3
- package/templates/hooks/PRE_COMMIT.md +4 -4
- package/templates/hooks/PRE_PUSH.md +4 -4
- package/templates/modules/MEMORY.md +63 -0
- package/templates/skills/cli/aider/SKILL.md +59 -0
- package/templates/skills/cli/amazon-q/SKILL.md +35 -0
- package/templates/skills/cli/auggie/SKILL.md +42 -0
- package/templates/skills/cli/claude/SKILL.md +42 -0
- package/templates/skills/cli/claude-code/SKILL.md +146 -0
- package/templates/skills/cli/cline/SKILL.md +42 -0
- package/templates/skills/cli/codebuddy/SKILL.md +30 -0
- package/templates/skills/cli/codeium/SKILL.md +30 -0
- package/templates/skills/cli/codex/SKILL.md +31 -0
- package/templates/skills/cli/continue/SKILL.md +44 -0
- package/templates/skills/cli/cursor-cli/SKILL.md +38 -0
- package/templates/skills/cli/factory/SKILL.md +28 -0
- package/templates/skills/cli/gemini/SKILL.md +45 -0
- package/templates/skills/cli/kilocode/SKILL.md +28 -0
- package/templates/skills/cli/opencode/SKILL.md +28 -0
- package/templates/skills/core/agent-automation/SKILL.md +194 -0
- package/templates/skills/core/dag/SKILL.md +314 -0
- package/templates/skills/core/documentation-rules/SKILL.md +47 -0
- package/templates/skills/core/quality-enforcement/SKILL.md +78 -0
- package/templates/skills/frameworks/angular/SKILL.md +46 -0
- package/templates/skills/frameworks/django/SKILL.md +93 -0
- package/templates/skills/frameworks/electron/SKILL.md +157 -0
- package/templates/skills/frameworks/flask/SKILL.md +48 -0
- package/templates/skills/frameworks/flutter/SKILL.md +65 -0
- package/templates/skills/frameworks/jquery/SKILL.md +42 -0
- package/templates/skills/frameworks/laravel/SKILL.md +48 -0
- package/templates/skills/frameworks/nestjs/SKILL.md +53 -0
- package/templates/skills/frameworks/nextjs/SKILL.md +137 -0
- package/templates/skills/frameworks/nuxt/SKILL.md +50 -0
- package/templates/skills/frameworks/rails/SKILL.md +76 -0
- package/templates/skills/frameworks/react/SKILL.md +48 -0
- package/templates/skills/frameworks/react-native/SKILL.md +57 -0
- package/templates/skills/frameworks/spring/SKILL.md +49 -0
- package/templates/skills/frameworks/symfony/SKILL.md +46 -0
- package/templates/skills/frameworks/vue/SKILL.md +46 -0
- package/templates/skills/frameworks/zend/SKILL.md +45 -0
- package/templates/skills/ides/copilot/SKILL.md +47 -0
- package/templates/skills/ides/cursor/SKILL.md +53 -0
- package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -0
- package/templates/skills/ides/replit/SKILL.md +46 -0
- package/templates/skills/ides/tabnine/SKILL.md +39 -0
- package/templates/skills/ides/vscode/SKILL.md +50 -0
- package/templates/skills/ides/windsurf/SKILL.md +46 -0
- package/templates/skills/ides/zed/SKILL.md +42 -0
- package/templates/skills/languages/ada/SKILL.md +68 -0
- package/templates/skills/languages/c/SKILL.md +343 -0
- package/templates/skills/languages/cpp/SKILL.md +753 -0
- package/templates/skills/languages/csharp/SKILL.md +427 -0
- package/templates/skills/languages/dart/SKILL.md +342 -0
- package/templates/skills/languages/elixir/SKILL.md +464 -0
- package/templates/skills/languages/erlang/SKILL.md +371 -0
- package/templates/skills/languages/go/SKILL.md +655 -0
- package/templates/skills/languages/haskell/SKILL.md +187 -0
- package/templates/skills/languages/java/SKILL.md +617 -0
- package/templates/skills/languages/javascript/SKILL.md +641 -0
- package/templates/skills/languages/julia/SKILL.md +107 -0
- package/templates/skills/languages/kotlin/SKILL.md +521 -0
- package/templates/skills/languages/lisp/SKILL.md +110 -0
- package/templates/skills/languages/lua/SKILL.md +84 -0
- package/templates/skills/languages/objectivec/SKILL.md +100 -0
- package/templates/skills/languages/php/SKILL.md +426 -0
- package/templates/skills/languages/python/SKILL.md +692 -0
- package/templates/skills/languages/r/SKILL.md +360 -0
- package/templates/skills/languages/ruby/SKILL.md +431 -0
- package/templates/skills/languages/rust/SKILL.md +487 -0
- package/templates/skills/languages/sas/SKILL.md +83 -0
- package/templates/skills/languages/scala/SKILL.md +358 -0
- package/templates/skills/languages/solidity/SKILL.md +590 -0
- package/templates/skills/languages/sql/SKILL.md +147 -0
- package/templates/skills/languages/swift/SKILL.md +476 -0
- package/templates/skills/languages/zig/SKILL.md +275 -0
- package/templates/skills/modules/atlassian/SKILL.md +265 -0
- package/templates/skills/modules/context7/SKILL.md +64 -0
- package/templates/skills/modules/figma/SKILL.md +277 -0
- package/templates/skills/modules/github-mcp/SKILL.md +74 -0
- package/templates/skills/modules/grafana/SKILL.md +338 -0
- package/templates/skills/modules/memory/SKILL.md +73 -0
- package/templates/skills/modules/notion/SKILL.md +257 -0
- package/templates/skills/modules/playwright/SKILL.md +100 -0
- package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -0
- package/templates/skills/modules/serena/SKILL.md +347 -0
- package/templates/skills/modules/supabase/SKILL.md +233 -0
- package/templates/skills/modules/synap/SKILL.md +79 -0
- package/templates/skills/modules/vectorizer/SKILL.md +73 -0
- package/templates/skills/services/azure-blob/SKILL.md +194 -0
- package/templates/skills/services/cassandra/SKILL.md +249 -0
- package/templates/skills/services/dynamodb/SKILL.md +318 -0
- package/templates/skills/services/elasticsearch/SKILL.md +357 -0
- package/templates/skills/services/gcs/SKILL.md +188 -0
- package/templates/skills/services/influxdb/SKILL.md +275 -0
- package/templates/skills/services/kafka/SKILL.md +351 -0
- package/templates/skills/services/mariadb/SKILL.md +193 -0
- package/templates/skills/services/memcached/SKILL.md +252 -0
- package/templates/skills/services/minio/SKILL.md +211 -0
- package/templates/skills/services/mongodb/SKILL.md +278 -0
- package/templates/skills/services/mysql/SKILL.md +368 -0
- package/templates/skills/services/neo4j/SKILL.md +257 -0
- package/templates/skills/services/oracle/SKILL.md +300 -0
- package/templates/skills/services/postgresql/SKILL.md +336 -0
- package/templates/skills/services/rabbitmq/SKILL.md +296 -0
- package/templates/skills/services/redis/SKILL.md +302 -0
- package/templates/skills/services/s3/SKILL.md +308 -0
- package/templates/skills/services/sqlite/SKILL.md +304 -0
- package/templates/skills/services/sqlserver/SKILL.md +304 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure TypeScript HNSW (Hierarchical Navigable Small World) Index
|
|
3
|
+
*
|
|
4
|
+
* Approximate nearest neighbor search using cosine distance.
|
|
5
|
+
* Zero native dependencies. Designed for <50K vectors.
|
|
6
|
+
*/
|
|
7
|
+
const MAGIC_NUMBER = 0x484e5357; // 'HNSW'
|
|
8
|
+
const FORMAT_VERSION = 1;
|
|
9
|
+
export class HNSWIndex {
|
|
10
|
+
M;
|
|
11
|
+
efConstruction;
|
|
12
|
+
dimensions;
|
|
13
|
+
mL; // normalization factor for layer assignment
|
|
14
|
+
nodes = new Map();
|
|
15
|
+
entryPoint = null;
|
|
16
|
+
maxLayer = 0;
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.M = config.M ?? 16;
|
|
19
|
+
this.efConstruction = config.efConstruction ?? 200;
|
|
20
|
+
this.dimensions = config.dimensions;
|
|
21
|
+
this.mL = 1 / Math.log(this.M);
|
|
22
|
+
}
|
|
23
|
+
get size() {
|
|
24
|
+
return this.nodes.size;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Cosine distance: 1 - cosine_similarity (0 = identical, 2 = opposite)
|
|
28
|
+
*/
|
|
29
|
+
cosineDistance(a, b) {
|
|
30
|
+
let dot = 0;
|
|
31
|
+
let magA = 0;
|
|
32
|
+
let magB = 0;
|
|
33
|
+
for (let i = 0; i < a.length; i++) {
|
|
34
|
+
dot += a[i] * b[i];
|
|
35
|
+
magA += a[i] * a[i];
|
|
36
|
+
magB += b[i] * b[i];
|
|
37
|
+
}
|
|
38
|
+
const denom = Math.sqrt(magA) * Math.sqrt(magB);
|
|
39
|
+
if (denom === 0)
|
|
40
|
+
return 1;
|
|
41
|
+
return 1 - dot / denom;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Assign a random layer for a new node
|
|
45
|
+
*/
|
|
46
|
+
randomLayer() {
|
|
47
|
+
return Math.floor(-Math.log(Math.random()) * this.mL);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Greedy search at a single layer, returning ef nearest candidates
|
|
51
|
+
*/
|
|
52
|
+
searchLayer(query, entryLabel, ef, layer) {
|
|
53
|
+
const visited = new Set();
|
|
54
|
+
const candidates = [];
|
|
55
|
+
const results = [];
|
|
56
|
+
const entryNode = this.nodes.get(entryLabel);
|
|
57
|
+
if (!entryNode)
|
|
58
|
+
return [];
|
|
59
|
+
const entryDist = this.cosineDistance(query, entryNode.vector);
|
|
60
|
+
candidates.push({ label: entryLabel, distance: entryDist });
|
|
61
|
+
results.push({ label: entryLabel, distance: entryDist });
|
|
62
|
+
visited.add(entryLabel);
|
|
63
|
+
while (candidates.length > 0) {
|
|
64
|
+
// Get closest candidate
|
|
65
|
+
candidates.sort((a, b) => a.distance - b.distance);
|
|
66
|
+
const current = candidates.shift();
|
|
67
|
+
// Get farthest result
|
|
68
|
+
results.sort((a, b) => a.distance - b.distance);
|
|
69
|
+
const farthest = results[results.length - 1];
|
|
70
|
+
if (current.distance > farthest.distance)
|
|
71
|
+
break;
|
|
72
|
+
const currentNode = this.nodes.get(current.label);
|
|
73
|
+
if (!currentNode)
|
|
74
|
+
continue;
|
|
75
|
+
const connections = currentNode.connections.get(layer);
|
|
76
|
+
if (!connections)
|
|
77
|
+
continue;
|
|
78
|
+
for (const neighborLabel of connections) {
|
|
79
|
+
if (visited.has(neighborLabel))
|
|
80
|
+
continue;
|
|
81
|
+
visited.add(neighborLabel);
|
|
82
|
+
const neighborNode = this.nodes.get(neighborLabel);
|
|
83
|
+
if (!neighborNode)
|
|
84
|
+
continue;
|
|
85
|
+
const dist = this.cosineDistance(query, neighborNode.vector);
|
|
86
|
+
results.sort((a, b) => a.distance - b.distance);
|
|
87
|
+
const currentFarthest = results[results.length - 1];
|
|
88
|
+
if (results.length < ef || dist < currentFarthest.distance) {
|
|
89
|
+
candidates.push({ label: neighborLabel, distance: dist });
|
|
90
|
+
results.push({ label: neighborLabel, distance: dist });
|
|
91
|
+
if (results.length > ef) {
|
|
92
|
+
results.sort((a, b) => a.distance - b.distance);
|
|
93
|
+
results.pop();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
results.sort((a, b) => a.distance - b.distance);
|
|
99
|
+
return results;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Select M nearest neighbors from candidates, pruning for diversity
|
|
103
|
+
*/
|
|
104
|
+
selectNeighbors(candidates, M) {
|
|
105
|
+
candidates.sort((a, b) => a.distance - b.distance);
|
|
106
|
+
return candidates.slice(0, M);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Add a vector to the index
|
|
110
|
+
*/
|
|
111
|
+
add(label, vector) {
|
|
112
|
+
if (vector.length !== this.dimensions) {
|
|
113
|
+
throw new Error(`Vector dimensions mismatch: expected ${this.dimensions}, got ${vector.length}`);
|
|
114
|
+
}
|
|
115
|
+
// If label already exists, remove first
|
|
116
|
+
if (this.nodes.has(label)) {
|
|
117
|
+
this.remove(label);
|
|
118
|
+
}
|
|
119
|
+
const nodeLayer = this.randomLayer();
|
|
120
|
+
const node = {
|
|
121
|
+
label,
|
|
122
|
+
vector: new Float32Array(vector),
|
|
123
|
+
connections: new Map(),
|
|
124
|
+
layer: nodeLayer,
|
|
125
|
+
};
|
|
126
|
+
// Initialize connection sets for all layers
|
|
127
|
+
for (let l = 0; l <= nodeLayer; l++) {
|
|
128
|
+
node.connections.set(l, new Set());
|
|
129
|
+
}
|
|
130
|
+
this.nodes.set(label, node);
|
|
131
|
+
if (this.entryPoint === null) {
|
|
132
|
+
this.entryPoint = label;
|
|
133
|
+
this.maxLayer = nodeLayer;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
let currentLabel = this.entryPoint;
|
|
137
|
+
// Traverse from top layer to nodeLayer + 1 (greedy, single nearest)
|
|
138
|
+
for (let l = this.maxLayer; l > nodeLayer; l--) {
|
|
139
|
+
const results = this.searchLayer(vector, currentLabel, 1, l);
|
|
140
|
+
if (results.length > 0) {
|
|
141
|
+
currentLabel = results[0].label;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Insert at layers nodeLayer down to 0
|
|
145
|
+
for (let l = Math.min(nodeLayer, this.maxLayer); l >= 0; l--) {
|
|
146
|
+
const candidates = this.searchLayer(vector, currentLabel, this.efConstruction, l);
|
|
147
|
+
const neighbors = this.selectNeighbors(candidates, this.M);
|
|
148
|
+
for (const neighbor of neighbors) {
|
|
149
|
+
// Bidirectional connections
|
|
150
|
+
node.connections.get(l).add(neighbor.label);
|
|
151
|
+
const neighborNode = this.nodes.get(neighbor.label);
|
|
152
|
+
if (neighborNode) {
|
|
153
|
+
if (!neighborNode.connections.has(l)) {
|
|
154
|
+
neighborNode.connections.set(l, new Set());
|
|
155
|
+
}
|
|
156
|
+
neighborNode.connections.get(l).add(label);
|
|
157
|
+
// Prune neighbor connections if exceeding M
|
|
158
|
+
const neighborConns = neighborNode.connections.get(l);
|
|
159
|
+
if (neighborConns.size > this.M * 2) {
|
|
160
|
+
const allCandidates = [];
|
|
161
|
+
for (const connLabel of neighborConns) {
|
|
162
|
+
if (connLabel === label)
|
|
163
|
+
continue;
|
|
164
|
+
const connNode = this.nodes.get(connLabel);
|
|
165
|
+
if (connNode) {
|
|
166
|
+
allCandidates.push({
|
|
167
|
+
label: connLabel,
|
|
168
|
+
distance: this.cosineDistance(neighborNode.vector, connNode.vector),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const kept = this.selectNeighbors(allCandidates, this.M * 2);
|
|
173
|
+
neighborConns.clear();
|
|
174
|
+
neighborConns.add(label); // always keep the new connection
|
|
175
|
+
for (const k of kept) {
|
|
176
|
+
neighborConns.add(k.label);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (candidates.length > 0) {
|
|
182
|
+
currentLabel = candidates[0].label;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Update entry point if new node has higher layer
|
|
186
|
+
if (nodeLayer > this.maxLayer) {
|
|
187
|
+
this.entryPoint = label;
|
|
188
|
+
this.maxLayer = nodeLayer;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Search k nearest neighbors
|
|
193
|
+
*/
|
|
194
|
+
search(query, k, ef) {
|
|
195
|
+
if (this.entryPoint === null || this.nodes.size === 0) {
|
|
196
|
+
return [];
|
|
197
|
+
}
|
|
198
|
+
if (query.length !== this.dimensions) {
|
|
199
|
+
throw new Error(`Query dimensions mismatch: expected ${this.dimensions}, got ${query.length}`);
|
|
200
|
+
}
|
|
201
|
+
const searchEf = Math.max(ef ?? 50, k);
|
|
202
|
+
let currentLabel = this.entryPoint;
|
|
203
|
+
// Traverse from top layer to layer 1 (greedy, single nearest)
|
|
204
|
+
for (let l = this.maxLayer; l > 0; l--) {
|
|
205
|
+
const results = this.searchLayer(query, currentLabel, 1, l);
|
|
206
|
+
if (results.length > 0) {
|
|
207
|
+
currentLabel = results[0].label;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Search at layer 0 with ef candidates
|
|
211
|
+
const candidates = this.searchLayer(query, currentLabel, searchEf, 0);
|
|
212
|
+
return candidates.slice(0, k);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Remove a vector from the index
|
|
216
|
+
*/
|
|
217
|
+
remove(label) {
|
|
218
|
+
const node = this.nodes.get(label);
|
|
219
|
+
if (!node)
|
|
220
|
+
return;
|
|
221
|
+
// Remove all connections to this node
|
|
222
|
+
for (const [layer, connections] of node.connections) {
|
|
223
|
+
for (const neighborLabel of connections) {
|
|
224
|
+
const neighborNode = this.nodes.get(neighborLabel);
|
|
225
|
+
if (neighborNode) {
|
|
226
|
+
const neighborConns = neighborNode.connections.get(layer);
|
|
227
|
+
if (neighborConns) {
|
|
228
|
+
neighborConns.delete(label);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
this.nodes.delete(label);
|
|
234
|
+
// Update entry point if needed
|
|
235
|
+
if (this.entryPoint === label) {
|
|
236
|
+
if (this.nodes.size === 0) {
|
|
237
|
+
this.entryPoint = null;
|
|
238
|
+
this.maxLayer = 0;
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
// Find node with highest layer
|
|
242
|
+
let bestLabel = '';
|
|
243
|
+
let bestLayer = -1;
|
|
244
|
+
for (const [l, n] of this.nodes) {
|
|
245
|
+
if (n.layer > bestLayer) {
|
|
246
|
+
bestLayer = n.layer;
|
|
247
|
+
bestLabel = l;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
this.entryPoint = bestLabel;
|
|
251
|
+
this.maxLayer = bestLayer;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Serialize the index to an ArrayBuffer for disk persistence
|
|
257
|
+
* Format: [magic:u32][version:u8][dimensions:u32][M:u16][nodeCount:u32][...nodes]
|
|
258
|
+
*/
|
|
259
|
+
serialize() {
|
|
260
|
+
const nodeEntries = Array.from(this.nodes.entries());
|
|
261
|
+
const labelToIndex = new Map();
|
|
262
|
+
nodeEntries.forEach(([label], i) => labelToIndex.set(label, i));
|
|
263
|
+
// Calculate buffer size
|
|
264
|
+
let size = 4 + 1 + 4 + 2 + 4; // header
|
|
265
|
+
size += 4; // entryPointIndex
|
|
266
|
+
size += 4; // maxLayer
|
|
267
|
+
for (const [, node] of nodeEntries) {
|
|
268
|
+
const labelBytes = new TextEncoder().encode(node.label);
|
|
269
|
+
size += 2 + labelBytes.length; // label length + label
|
|
270
|
+
size += this.dimensions * 4; // vector (float32)
|
|
271
|
+
size += 4; // node layer
|
|
272
|
+
size += 4; // connection layer count
|
|
273
|
+
for (const [, connections] of node.connections) {
|
|
274
|
+
size += 4; // layer number
|
|
275
|
+
size += 4; // connection count
|
|
276
|
+
size += connections.size * 4; // neighbor indices (u32)
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
const buffer = new ArrayBuffer(size);
|
|
280
|
+
const view = new DataView(buffer);
|
|
281
|
+
let offset = 0;
|
|
282
|
+
// Header
|
|
283
|
+
view.setUint32(offset, MAGIC_NUMBER, true);
|
|
284
|
+
offset += 4;
|
|
285
|
+
view.setUint8(offset, FORMAT_VERSION);
|
|
286
|
+
offset += 1;
|
|
287
|
+
view.setUint32(offset, this.dimensions, true);
|
|
288
|
+
offset += 4;
|
|
289
|
+
view.setUint16(offset, this.M, true);
|
|
290
|
+
offset += 2;
|
|
291
|
+
view.setUint32(offset, nodeEntries.length, true);
|
|
292
|
+
offset += 4;
|
|
293
|
+
view.setInt32(offset, this.entryPoint ? labelToIndex.get(this.entryPoint) : -1, true);
|
|
294
|
+
offset += 4;
|
|
295
|
+
view.setUint32(offset, this.maxLayer, true);
|
|
296
|
+
offset += 4;
|
|
297
|
+
// Nodes
|
|
298
|
+
const encoder = new TextEncoder();
|
|
299
|
+
for (const [, node] of nodeEntries) {
|
|
300
|
+
const labelBytes = encoder.encode(node.label);
|
|
301
|
+
view.setUint16(offset, labelBytes.length, true);
|
|
302
|
+
offset += 2;
|
|
303
|
+
new Uint8Array(buffer, offset, labelBytes.length).set(labelBytes);
|
|
304
|
+
offset += labelBytes.length;
|
|
305
|
+
// Vector
|
|
306
|
+
for (let i = 0; i < this.dimensions; i++) {
|
|
307
|
+
view.setFloat32(offset, node.vector[i], true);
|
|
308
|
+
offset += 4;
|
|
309
|
+
}
|
|
310
|
+
// Layer
|
|
311
|
+
view.setUint32(offset, node.layer, true);
|
|
312
|
+
offset += 4;
|
|
313
|
+
// Connections
|
|
314
|
+
const layerCount = node.connections.size;
|
|
315
|
+
view.setUint32(offset, layerCount, true);
|
|
316
|
+
offset += 4;
|
|
317
|
+
for (const [layer, connections] of node.connections) {
|
|
318
|
+
view.setUint32(offset, layer, true);
|
|
319
|
+
offset += 4;
|
|
320
|
+
view.setUint32(offset, connections.size, true);
|
|
321
|
+
offset += 4;
|
|
322
|
+
for (const neighborLabel of connections) {
|
|
323
|
+
const idx = labelToIndex.get(neighborLabel);
|
|
324
|
+
view.setUint32(offset, idx ?? 0, true);
|
|
325
|
+
offset += 4;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return buffer;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Deserialize an index from an ArrayBuffer
|
|
333
|
+
*/
|
|
334
|
+
static deserialize(buffer) {
|
|
335
|
+
const view = new DataView(buffer);
|
|
336
|
+
let offset = 0;
|
|
337
|
+
const decoder = new TextDecoder();
|
|
338
|
+
// Header
|
|
339
|
+
const magic = view.getUint32(offset, true);
|
|
340
|
+
offset += 4;
|
|
341
|
+
if (magic !== MAGIC_NUMBER) {
|
|
342
|
+
throw new Error('Invalid HNSW index file');
|
|
343
|
+
}
|
|
344
|
+
const version = view.getUint8(offset);
|
|
345
|
+
offset += 1;
|
|
346
|
+
if (version !== FORMAT_VERSION) {
|
|
347
|
+
throw new Error(`Unsupported HNSW format version: ${version}`);
|
|
348
|
+
}
|
|
349
|
+
const dimensions = view.getUint32(offset, true);
|
|
350
|
+
offset += 4;
|
|
351
|
+
const M = view.getUint16(offset, true);
|
|
352
|
+
offset += 2;
|
|
353
|
+
const nodeCount = view.getUint32(offset, true);
|
|
354
|
+
offset += 4;
|
|
355
|
+
const entryPointIndex = view.getInt32(offset, true);
|
|
356
|
+
offset += 4;
|
|
357
|
+
const maxLayer = view.getUint32(offset, true);
|
|
358
|
+
offset += 4;
|
|
359
|
+
const index = new HNSWIndex({ dimensions, M });
|
|
360
|
+
index.maxLayer = maxLayer;
|
|
361
|
+
// Read all nodes first (labels + vectors + layers)
|
|
362
|
+
const labels = [];
|
|
363
|
+
const nodeData = [];
|
|
364
|
+
for (let n = 0; n < nodeCount; n++) {
|
|
365
|
+
const labelLen = view.getUint16(offset, true);
|
|
366
|
+
offset += 2;
|
|
367
|
+
const labelBytes = new Uint8Array(buffer, offset, labelLen);
|
|
368
|
+
const label = decoder.decode(labelBytes);
|
|
369
|
+
offset += labelLen;
|
|
370
|
+
labels.push(label);
|
|
371
|
+
const vector = new Float32Array(dimensions);
|
|
372
|
+
for (let i = 0; i < dimensions; i++) {
|
|
373
|
+
vector[i] = view.getFloat32(offset, true);
|
|
374
|
+
offset += 4;
|
|
375
|
+
}
|
|
376
|
+
const layer = view.getUint32(offset, true);
|
|
377
|
+
offset += 4;
|
|
378
|
+
const layerCount = view.getUint32(offset, true);
|
|
379
|
+
offset += 4;
|
|
380
|
+
const connectionLayers = [];
|
|
381
|
+
for (let lc = 0; lc < layerCount; lc++) {
|
|
382
|
+
const connLayer = view.getUint32(offset, true);
|
|
383
|
+
offset += 4;
|
|
384
|
+
const connCount = view.getUint32(offset, true);
|
|
385
|
+
offset += 4;
|
|
386
|
+
const neighborIndices = [];
|
|
387
|
+
for (let c = 0; c < connCount; c++) {
|
|
388
|
+
neighborIndices.push(view.getUint32(offset, true));
|
|
389
|
+
offset += 4;
|
|
390
|
+
}
|
|
391
|
+
connectionLayers.push({ layer: connLayer, neighborIndices });
|
|
392
|
+
}
|
|
393
|
+
nodeData.push({ label, vector, layer, connectionLayers });
|
|
394
|
+
}
|
|
395
|
+
// Reconstruct nodes with proper connections
|
|
396
|
+
for (const data of nodeData) {
|
|
397
|
+
const connections = new Map();
|
|
398
|
+
for (const cl of data.connectionLayers) {
|
|
399
|
+
const neighbors = new Set();
|
|
400
|
+
for (const idx of cl.neighborIndices) {
|
|
401
|
+
if (idx < labels.length) {
|
|
402
|
+
neighbors.add(labels[idx]);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
connections.set(cl.layer, neighbors);
|
|
406
|
+
}
|
|
407
|
+
const node = {
|
|
408
|
+
label: data.label,
|
|
409
|
+
vector: data.vector,
|
|
410
|
+
connections,
|
|
411
|
+
layer: data.layer,
|
|
412
|
+
};
|
|
413
|
+
index.nodes.set(data.label, node);
|
|
414
|
+
}
|
|
415
|
+
if (entryPointIndex >= 0 && entryPointIndex < labels.length) {
|
|
416
|
+
index.entryPoint = labels[entryPointIndex];
|
|
417
|
+
}
|
|
418
|
+
return index;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=hnsw-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hnsw-index.js","sourceRoot":"","sources":["../../src/memory/hnsw-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache Size Limiter with LRU Eviction
|
|
3
|
+
*
|
|
4
|
+
* Enforces configurable max database size (default 500MB)
|
|
5
|
+
* using LRU-based eviction to protect the SSD.
|
|
6
|
+
*/
|
|
7
|
+
import type { MemoryStore } from './memory-store.js';
|
|
8
|
+
import type { HNSWIndex } from './hnsw-index.js';
|
|
9
|
+
export interface EvictionResult {
|
|
10
|
+
evictedCount: number;
|
|
11
|
+
freedBytes: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class MemoryCache {
|
|
14
|
+
private store;
|
|
15
|
+
private index;
|
|
16
|
+
private maxSizeBytes;
|
|
17
|
+
constructor(store: MemoryStore, index: HNSWIndex, maxSizeBytes?: number);
|
|
18
|
+
getCurrentSize(): number;
|
|
19
|
+
getUsagePercent(): number;
|
|
20
|
+
isOverLimit(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Check and evict if over limit
|
|
23
|
+
* Returns number of evicted memories and freed bytes
|
|
24
|
+
*/
|
|
25
|
+
checkAndEvict(activeSessionId?: string): EvictionResult;
|
|
26
|
+
/**
|
|
27
|
+
* Force eviction regardless of current size.
|
|
28
|
+
* Evicts at least one batch of candidates.
|
|
29
|
+
*/
|
|
30
|
+
forceEvict(activeSessionId?: string): EvictionResult;
|
|
31
|
+
private evict;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=memory-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-cache.d.ts","sourceRoot":"","sources":["../../src/memory/memory-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAMjD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IAIpB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,KAAK;IAJf,OAAO,CAAC,YAAY,CAAS;gBAGnB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,SAAS,EACxB,YAAY,CAAC,EAAE,MAAM;IAKvB,cAAc,IAAI,MAAM;IAIxB,eAAe,IAAI,MAAM;IAIzB,WAAW,IAAI,OAAO;IAItB;;;OAGG;IACH,aAAa,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,cAAc;IAQvD;;;OAGG;IACH,UAAU,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,cAAc;IAoCpD,OAAO,CAAC,KAAK;CAuBd"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache Size Limiter with LRU Eviction
|
|
3
|
+
*
|
|
4
|
+
* Enforces configurable max database size (default 500MB)
|
|
5
|
+
* using LRU-based eviction to protect the SSD.
|
|
6
|
+
*/
|
|
7
|
+
const DEFAULT_MAX_SIZE = 524288000; // 500MB
|
|
8
|
+
const EVICTION_BATCH_SIZE = 100;
|
|
9
|
+
const TARGET_USAGE = 0.85; // 85% — evict until 15% headroom
|
|
10
|
+
export class MemoryCache {
|
|
11
|
+
store;
|
|
12
|
+
index;
|
|
13
|
+
maxSizeBytes;
|
|
14
|
+
constructor(store, index, maxSizeBytes) {
|
|
15
|
+
this.store = store;
|
|
16
|
+
this.index = index;
|
|
17
|
+
this.maxSizeBytes = maxSizeBytes ?? DEFAULT_MAX_SIZE;
|
|
18
|
+
}
|
|
19
|
+
getCurrentSize() {
|
|
20
|
+
return this.store.getDbSizeBytes();
|
|
21
|
+
}
|
|
22
|
+
getUsagePercent() {
|
|
23
|
+
return (this.getCurrentSize() / this.maxSizeBytes) * 100;
|
|
24
|
+
}
|
|
25
|
+
isOverLimit() {
|
|
26
|
+
return this.getCurrentSize() > this.maxSizeBytes;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check and evict if over limit
|
|
30
|
+
* Returns number of evicted memories and freed bytes
|
|
31
|
+
*/
|
|
32
|
+
checkAndEvict(activeSessionId) {
|
|
33
|
+
if (!this.isOverLimit()) {
|
|
34
|
+
return { evictedCount: 0, freedBytes: 0 };
|
|
35
|
+
}
|
|
36
|
+
return this.evict(activeSessionId);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Force eviction regardless of current size.
|
|
40
|
+
* Evicts at least one batch of candidates.
|
|
41
|
+
*/
|
|
42
|
+
forceEvict(activeSessionId) {
|
|
43
|
+
const sizeBefore = this.getCurrentSize();
|
|
44
|
+
let evictedCount = 0;
|
|
45
|
+
// Always run at least one batch
|
|
46
|
+
const candidates = this.store.getEvictionCandidates(EVICTION_BATCH_SIZE, activeSessionId);
|
|
47
|
+
for (const candidate of candidates) {
|
|
48
|
+
this.store.deleteMemory(candidate.id);
|
|
49
|
+
this.index.remove(candidate.id);
|
|
50
|
+
evictedCount++;
|
|
51
|
+
}
|
|
52
|
+
// If still over target, keep evicting
|
|
53
|
+
const targetSize = this.maxSizeBytes * TARGET_USAGE;
|
|
54
|
+
while (this.getCurrentSize() > targetSize) {
|
|
55
|
+
const moreCandidates = this.store.getEvictionCandidates(EVICTION_BATCH_SIZE, activeSessionId);
|
|
56
|
+
if (moreCandidates.length === 0)
|
|
57
|
+
break;
|
|
58
|
+
for (const candidate of moreCandidates) {
|
|
59
|
+
this.store.deleteMemory(candidate.id);
|
|
60
|
+
this.index.remove(candidate.id);
|
|
61
|
+
evictedCount++;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const freedBytes = sizeBefore - this.getCurrentSize();
|
|
65
|
+
return { evictedCount, freedBytes: Math.max(0, freedBytes) };
|
|
66
|
+
}
|
|
67
|
+
evict(activeSessionId) {
|
|
68
|
+
const sizeBefore = this.getCurrentSize();
|
|
69
|
+
const targetSize = this.maxSizeBytes * TARGET_USAGE;
|
|
70
|
+
let evictedCount = 0;
|
|
71
|
+
while (this.getCurrentSize() > targetSize) {
|
|
72
|
+
const candidates = this.store.getEvictionCandidates(EVICTION_BATCH_SIZE, activeSessionId);
|
|
73
|
+
if (candidates.length === 0)
|
|
74
|
+
break;
|
|
75
|
+
for (const candidate of candidates) {
|
|
76
|
+
this.store.deleteMemory(candidate.id);
|
|
77
|
+
this.index.remove(candidate.id);
|
|
78
|
+
evictedCount++;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const freedBytes = sizeBefore - this.getCurrentSize();
|
|
82
|
+
return { evictedCount, freedBytes: Math.max(0, freedBytes) };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=memory-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-cache.js","sourceRoot":"","sources":["../../src/memory/memory-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Capture Hooks
|
|
3
|
+
*
|
|
4
|
+
* Auto-classification heuristics and capture adapters
|
|
5
|
+
* for Claude Code, Cursor, and Gemini agent output.
|
|
6
|
+
*
|
|
7
|
+
* Also provides MCP auto-capture: intercepts tool calls
|
|
8
|
+
* and automatically saves significant interactions to memory.
|
|
9
|
+
*/
|
|
10
|
+
import type { MemoryType } from './memory-types.js';
|
|
11
|
+
export interface CapturedMemory {
|
|
12
|
+
type: MemoryType;
|
|
13
|
+
title: string;
|
|
14
|
+
content: string;
|
|
15
|
+
tags?: string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Classify memory content by type using keyword heuristics
|
|
19
|
+
*/
|
|
20
|
+
export declare function classifyMemory(content: string): MemoryType;
|
|
21
|
+
/**
|
|
22
|
+
* Extract a short title from content (first meaningful line, truncated)
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractTitle(content: string, maxLength?: number): string;
|
|
25
|
+
/**
|
|
26
|
+
* Capture memories from Claude Code agent output
|
|
27
|
+
*/
|
|
28
|
+
export declare function captureFromClaudeCode(output: string, _sessionId: string): CapturedMemory[];
|
|
29
|
+
/**
|
|
30
|
+
* Capture memories from Cursor agent output
|
|
31
|
+
*/
|
|
32
|
+
export declare function captureFromCursor(output: string, _sessionId: string): CapturedMemory[];
|
|
33
|
+
/**
|
|
34
|
+
* Capture memories from Gemini agent output
|
|
35
|
+
*/
|
|
36
|
+
export declare function captureFromGemini(output: string, _sessionId: string): CapturedMemory[];
|
|
37
|
+
/**
|
|
38
|
+
* Build a memory from an MCP tool call and its result.
|
|
39
|
+
* Returns null if the interaction is not worth capturing.
|
|
40
|
+
*/
|
|
41
|
+
export declare function captureFromToolCall(toolName: string, args: Record<string, unknown>, result: string): CapturedMemory | null;
|
|
42
|
+
//# sourceMappingURL=memory-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-hooks.d.ts","sourceRoot":"","sources":["../../src/memory/memory-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAWD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAO1D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAW,GAAG,MAAM,CAY5E;AAmBD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,cAAc,EAAE,CAOlB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,cAAc,EAAE,CAOlB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,cAAc,EAAE,CAOlB;AAyCD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,MAAM,GACb,cAAc,GAAG,IAAI,CA+BvB"}
|