vemora 0.1.0-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/README.md +716 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +589 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/ask.d.ts +14 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +136 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/audit.d.ts +17 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +408 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/brief.d.ts +14 -0
- package/dist/commands/brief.d.ts.map +1 -0
- package/dist/commands/brief.js +73 -0
- package/dist/commands/brief.js.map +1 -0
- package/dist/commands/chat.d.ts +7 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +161 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/context.d.ts +61 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +778 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/deps.d.ts +20 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +138 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/focus.d.ts +6 -0
- package/dist/commands/focus.d.ts.map +1 -0
- package/dist/commands/focus.js +302 -0
- package/dist/commands/focus.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +366 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init-agent.d.ts +23 -0
- package/dist/commands/init-agent.d.ts.map +1 -0
- package/dist/commands/init-agent.js +447 -0
- package/dist/commands/init-agent.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +122 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/knowledge.d.ts +8 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +98 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/plan.d.ts +16 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +535 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/query.d.ts +39 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +389 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/remember.d.ts +11 -0
- package/dist/commands/remember.d.ts.map +1 -0
- package/dist/commands/remember.js +174 -0
- package/dist/commands/remember.js.map +1 -0
- package/dist/commands/report.d.ts +10 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +180 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +127 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/summarize.d.ts +14 -0
- package/dist/commands/summarize.d.ts.map +1 -0
- package/dist/commands/summarize.js +205 -0
- package/dist/commands/summarize.js.map +1 -0
- package/dist/commands/triage.d.ts +33 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +419 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/usages.d.ts +14 -0
- package/dist/commands/usages.d.ts.map +1 -0
- package/dist/commands/usages.js +236 -0
- package/dist/commands/usages.js.map +1 -0
- package/dist/core/config.d.ts +35 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +140 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/types.d.ts +251 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -0
- package/dist/embeddings/factory.d.ts +9 -0
- package/dist/embeddings/factory.d.ts.map +1 -0
- package/dist/embeddings/factory.js +26 -0
- package/dist/embeddings/factory.js.map +1 -0
- package/dist/embeddings/noop.d.ts +17 -0
- package/dist/embeddings/noop.d.ts.map +1 -0
- package/dist/embeddings/noop.js +22 -0
- package/dist/embeddings/noop.js.map +1 -0
- package/dist/embeddings/ollama.d.ts +16 -0
- package/dist/embeddings/ollama.d.ts.map +1 -0
- package/dist/embeddings/ollama.js +41 -0
- package/dist/embeddings/ollama.js.map +1 -0
- package/dist/embeddings/openai.d.ts +10 -0
- package/dist/embeddings/openai.d.ts.map +1 -0
- package/dist/embeddings/openai.js +67 -0
- package/dist/embeddings/openai.js.map +1 -0
- package/dist/embeddings/provider.d.ts +19 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +3 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/indexer/callgraph.d.ts +16 -0
- package/dist/indexer/callgraph.d.ts.map +1 -0
- package/dist/indexer/callgraph.js +154 -0
- package/dist/indexer/callgraph.js.map +1 -0
- package/dist/indexer/chunkBySlidingWindow.d.ts +6 -0
- package/dist/indexer/chunkBySlidingWindow.d.ts.map +1 -0
- package/dist/indexer/chunkBySlidingWindow.js +30 -0
- package/dist/indexer/chunkBySlidingWindow.js.map +1 -0
- package/dist/indexer/chunkBySymbols.d.ts +7 -0
- package/dist/indexer/chunkBySymbols.d.ts.map +1 -0
- package/dist/indexer/chunkBySymbols.js +57 -0
- package/dist/indexer/chunkBySymbols.js.map +1 -0
- package/dist/indexer/chunker.d.ts +15 -0
- package/dist/indexer/chunker.d.ts.map +1 -0
- package/dist/indexer/chunker.js +26 -0
- package/dist/indexer/chunker.js.map +1 -0
- package/dist/indexer/classHeader.d.ts +7 -0
- package/dist/indexer/classHeader.d.ts.map +1 -0
- package/dist/indexer/classHeader.js +37 -0
- package/dist/indexer/classHeader.js.map +1 -0
- package/dist/indexer/deps.d.ts +66 -0
- package/dist/indexer/deps.d.ts.map +1 -0
- package/dist/indexer/deps.js +409 -0
- package/dist/indexer/deps.js.map +1 -0
- package/dist/indexer/hasher.d.ts +17 -0
- package/dist/indexer/hasher.d.ts.map +1 -0
- package/dist/indexer/hasher.js +38 -0
- package/dist/indexer/hasher.js.map +1 -0
- package/dist/indexer/parser.d.ts +18 -0
- package/dist/indexer/parser.d.ts.map +1 -0
- package/dist/indexer/parser.js +355 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/indexer/scanner.d.ts +18 -0
- package/dist/indexer/scanner.d.ts.map +1 -0
- package/dist/indexer/scanner.js +37 -0
- package/dist/indexer/scanner.js.map +1 -0
- package/dist/indexer/strategy.d.ts +11 -0
- package/dist/indexer/strategy.d.ts.map +1 -0
- package/dist/indexer/strategy.js +15 -0
- package/dist/indexer/strategy.js.map +1 -0
- package/dist/indexer/tests.d.ts +15 -0
- package/dist/indexer/tests.d.ts.map +1 -0
- package/dist/indexer/tests.js +68 -0
- package/dist/indexer/tests.js.map +1 -0
- package/dist/indexer/todos.d.ts +9 -0
- package/dist/indexer/todos.d.ts.map +1 -0
- package/dist/indexer/todos.js +29 -0
- package/dist/indexer/todos.js.map +1 -0
- package/dist/llm/anthropic.d.ts +8 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +76 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/factory.d.ts +7 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +39 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/ollama.d.ts +8 -0
- package/dist/llm/ollama.d.ts.map +1 -0
- package/dist/llm/ollama.js +83 -0
- package/dist/llm/ollama.js.map +1 -0
- package/dist/llm/openai.d.ts +8 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +68 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/provider.d.ts +29 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +3 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/search/bm25.d.ts +3 -0
- package/dist/search/bm25.d.ts.map +1 -0
- package/dist/search/bm25.js +102 -0
- package/dist/search/bm25.js.map +1 -0
- package/dist/search/formatter.d.ts +43 -0
- package/dist/search/formatter.d.ts.map +1 -0
- package/dist/search/formatter.js +208 -0
- package/dist/search/formatter.js.map +1 -0
- package/dist/search/hybrid.d.ts +10 -0
- package/dist/search/hybrid.d.ts.map +1 -0
- package/dist/search/hybrid.js +53 -0
- package/dist/search/hybrid.js.map +1 -0
- package/dist/search/merge.d.ts +33 -0
- package/dist/search/merge.d.ts.map +1 -0
- package/dist/search/merge.js +158 -0
- package/dist/search/merge.js.map +1 -0
- package/dist/search/mmr.d.ts +23 -0
- package/dist/search/mmr.d.ts.map +1 -0
- package/dist/search/mmr.js +95 -0
- package/dist/search/mmr.js.map +1 -0
- package/dist/search/rerank.d.ts +15 -0
- package/dist/search/rerank.d.ts.map +1 -0
- package/dist/search/rerank.js +76 -0
- package/dist/search/rerank.js.map +1 -0
- package/dist/search/signature.d.ts +42 -0
- package/dist/search/signature.d.ts.map +1 -0
- package/dist/search/signature.js +112 -0
- package/dist/search/signature.js.map +1 -0
- package/dist/search/vector.d.ts +41 -0
- package/dist/search/vector.d.ts.map +1 -0
- package/dist/search/vector.js +185 -0
- package/dist/search/vector.js.map +1 -0
- package/dist/storage/cache.d.ts +30 -0
- package/dist/storage/cache.d.ts.map +1 -0
- package/dist/storage/cache.js +160 -0
- package/dist/storage/cache.js.map +1 -0
- package/dist/storage/knowledge.d.ts +17 -0
- package/dist/storage/knowledge.d.ts.map +1 -0
- package/dist/storage/knowledge.js +58 -0
- package/dist/storage/knowledge.js.map +1 -0
- package/dist/storage/repository.d.ts +27 -0
- package/dist/storage/repository.d.ts.map +1 -0
- package/dist/storage/repository.js +95 -0
- package/dist/storage/repository.js.map +1 -0
- package/dist/storage/session.d.ts +38 -0
- package/dist/storage/session.d.ts.map +1 -0
- package/dist/storage/session.js +100 -0
- package/dist/storage/session.js.map +1 -0
- package/dist/storage/summaries.d.ts +19 -0
- package/dist/storage/summaries.d.ts.map +1 -0
- package/dist/storage/summaries.js +66 -0
- package/dist/storage/summaries.js.map +1 -0
- package/dist/storage/usage.d.ts +35 -0
- package/dist/storage/usage.d.ts.map +1 -0
- package/dist/storage/usage.js +55 -0
- package/dist/storage/usage.js.map +1 -0
- package/dist/utils/git.d.ts +15 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +38 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/tokenizer.d.ts +24 -0
- package/dist/utils/tokenizer.d.ts.map +1 -0
- package/dist/utils/tokenizer.js +52 -0
- package/dist/utils/tokenizer.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.EmbeddingCacheStorage = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
/** Maximum allowed size for embeddings.bin (512 MB) */
|
|
11
|
+
const MAX_CACHE_BYTES = 512 * 1024 * 1024;
|
|
12
|
+
/**
|
|
13
|
+
* Manages the local per-developer embedding cache.
|
|
14
|
+
*
|
|
15
|
+
* Stored in ~/.vemora-cache/<projectId>/ — never in the repo.
|
|
16
|
+
* Each developer builds their own cache after running `vemora index`.
|
|
17
|
+
*
|
|
18
|
+
* Design choice: dual-file storage per project.
|
|
19
|
+
* Metadata and chunk IDs are stored in JSON (inspectable).
|
|
20
|
+
* Vectors are stored as a contiguous Float32Array binary buffer (fast I/O).
|
|
21
|
+
* The HNSW index is serialized to a separate JSON file for O(log N) search.
|
|
22
|
+
*/
|
|
23
|
+
class EmbeddingCacheStorage {
|
|
24
|
+
cacheDir;
|
|
25
|
+
cachePath; // embeddings.json (metadata + chunkIds)
|
|
26
|
+
binPath; // embeddings.bin (raw floats)
|
|
27
|
+
hnswPath; // embeddings.hnsw.json (serialized HNSW)
|
|
28
|
+
constructor(projectId) {
|
|
29
|
+
this.cacheDir = path_1.default.join(os_1.default.homedir(), ".vemora-cache", projectId);
|
|
30
|
+
this.cachePath = path_1.default.join(this.cacheDir, "embeddings.json");
|
|
31
|
+
this.binPath = path_1.default.join(this.cacheDir, "embeddings.bin");
|
|
32
|
+
this.hnswPath = path_1.default.join(this.cacheDir, "embeddings.hnsw.json");
|
|
33
|
+
}
|
|
34
|
+
load() {
|
|
35
|
+
if (!fs_1.default.existsSync(this.cachePath))
|
|
36
|
+
return null;
|
|
37
|
+
try {
|
|
38
|
+
const metadata = JSON.parse(fs_1.default.readFileSync(this.cachePath, "utf-8"));
|
|
39
|
+
// Check if it's the legacy format (embeddings object instead of chunkIds list)
|
|
40
|
+
if (metadata.embeddings && !metadata.chunkIds) {
|
|
41
|
+
console.log("Migrating legacy JSON cache to binary format...");
|
|
42
|
+
this.save(metadata);
|
|
43
|
+
return this.load(); // reload so vectors are read from the binary file
|
|
44
|
+
}
|
|
45
|
+
// New format: load metadata + binary vectors
|
|
46
|
+
if (!fs_1.default.existsSync(this.binPath))
|
|
47
|
+
return metadata;
|
|
48
|
+
const { size } = fs_1.default.statSync(this.binPath);
|
|
49
|
+
if (size > MAX_CACHE_BYTES) {
|
|
50
|
+
throw new Error(`Cache file too large (${size} bytes): ${this.binPath}`);
|
|
51
|
+
}
|
|
52
|
+
const binBuffer = fs_1.default.readFileSync(this.binPath);
|
|
53
|
+
// Slice to a fresh ArrayBuffer to guarantee 4-byte alignment regardless
|
|
54
|
+
// of Node.js buffer pool offsets (avoids RangeError on misaligned views).
|
|
55
|
+
const ab = binBuffer.buffer.slice(binBuffer.byteOffset, binBuffer.byteOffset + binBuffer.byteLength);
|
|
56
|
+
const vectors = new Float32Array(ab);
|
|
57
|
+
// Load HNSW index if it exists
|
|
58
|
+
let hnswIndex = undefined;
|
|
59
|
+
if (fs_1.default.existsSync(this.hnswPath)) {
|
|
60
|
+
try {
|
|
61
|
+
hnswIndex = JSON.parse(fs_1.default.readFileSync(this.hnswPath, "utf-8"));
|
|
62
|
+
}
|
|
63
|
+
catch (_e) {
|
|
64
|
+
console.warn("Failed to load HNSW index, it will be rebuilt on next index run.");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
...metadata,
|
|
69
|
+
vectors,
|
|
70
|
+
hnswIndex,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
console.error(`Failed to load cache from ${this.cachePath}:`, err);
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
save(cache) {
|
|
79
|
+
fs_1.default.mkdirSync(this.cacheDir, { recursive: true });
|
|
80
|
+
// If we have standard embeddings record, convert to binary
|
|
81
|
+
if (cache.embeddings && Object.keys(cache.embeddings).length > 0) {
|
|
82
|
+
const chunkIds = Object.keys(cache.embeddings);
|
|
83
|
+
const dims = cache.dimensions;
|
|
84
|
+
const vectors = new Float32Array(chunkIds.length * dims);
|
|
85
|
+
chunkIds.forEach((id, i) => {
|
|
86
|
+
const embedding = cache.embeddings[id];
|
|
87
|
+
vectors.set(embedding, i * dims);
|
|
88
|
+
});
|
|
89
|
+
cache.chunkIds = chunkIds;
|
|
90
|
+
cache.vectors = vectors;
|
|
91
|
+
}
|
|
92
|
+
// Save metadata (exclude actual vectors/embeddings)
|
|
93
|
+
const { vectors, embeddings, ...metadata } = cache;
|
|
94
|
+
this.writeAtomic(this.cachePath, Buffer.from(JSON.stringify(metadata), "utf-8"));
|
|
95
|
+
// Save binary vectors
|
|
96
|
+
if (vectors) {
|
|
97
|
+
this.writeAtomic(this.binPath, Buffer.from(vectors.buffer, vectors.byteOffset, vectors.byteLength));
|
|
98
|
+
}
|
|
99
|
+
// Save HNSW index
|
|
100
|
+
if (cache.hnswIndex) {
|
|
101
|
+
this.writeAtomic(this.hnswPath, Buffer.from(JSON.stringify(cache.hnswIndex), "utf-8"));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
writeAtomic(filePath, data) {
|
|
105
|
+
const tmp = filePath + ".tmp";
|
|
106
|
+
fs_1.default.writeFileSync(tmp, data);
|
|
107
|
+
fs_1.default.renameSync(tmp, filePath);
|
|
108
|
+
}
|
|
109
|
+
update(newEmbeddings, cache) {
|
|
110
|
+
// Merge into legacy format first for simplicity, then save (which converts to bin)
|
|
111
|
+
const currentEmbeddings = this.getEmbeddingsMap(cache);
|
|
112
|
+
const updated = {
|
|
113
|
+
...cache,
|
|
114
|
+
embeddings: { ...currentEmbeddings, ...newEmbeddings },
|
|
115
|
+
lastUpdated: new Date().toISOString(),
|
|
116
|
+
};
|
|
117
|
+
this.save(updated);
|
|
118
|
+
return updated;
|
|
119
|
+
}
|
|
120
|
+
prune(validChunkIds, cache) {
|
|
121
|
+
const currentMap = this.getEmbeddingsMap(cache);
|
|
122
|
+
const prunedMap = {};
|
|
123
|
+
for (const id of validChunkIds) {
|
|
124
|
+
if (currentMap[id]) {
|
|
125
|
+
prunedMap[id] = currentMap[id];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const updated = {
|
|
129
|
+
...cache,
|
|
130
|
+
embeddings: prunedMap,
|
|
131
|
+
lastUpdated: new Date().toISOString(),
|
|
132
|
+
};
|
|
133
|
+
// Clear optimized fields to force re-generation from the pruned map
|
|
134
|
+
delete updated.vectors;
|
|
135
|
+
delete updated.chunkIds;
|
|
136
|
+
this.save(updated);
|
|
137
|
+
return updated;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Helper to always get a Map, regardless of storage format
|
|
141
|
+
*/
|
|
142
|
+
getEmbeddingsMap(cache) {
|
|
143
|
+
if (cache.embeddings)
|
|
144
|
+
return cache.embeddings;
|
|
145
|
+
if (cache.vectors && cache.chunkIds) {
|
|
146
|
+
const map = {};
|
|
147
|
+
const dims = cache.dimensions;
|
|
148
|
+
cache.chunkIds.forEach((id, i) => {
|
|
149
|
+
map[id] = Array.from(cache.vectors.subarray(i * dims, (i + 1) * dims));
|
|
150
|
+
});
|
|
151
|
+
return map;
|
|
152
|
+
}
|
|
153
|
+
return {};
|
|
154
|
+
}
|
|
155
|
+
getCacheDir() {
|
|
156
|
+
return this.cacheDir;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.EmbeddingCacheStorage = EmbeddingCacheStorage;
|
|
160
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/storage/cache.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,4CAAoB;AACpB,gDAAwB;AAGxB,uDAAuD;AACvD,MAAM,eAAe,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1C;;;;;;;;;;GAUG;AACH,MAAa,qBAAqB;IACxB,QAAQ,CAAS;IACjB,SAAS,CAAS,CAAC,wCAAwC;IAC3D,OAAO,CAAS,CAAC,8BAA8B;IAC/C,QAAQ,CAAS,CAAC,yCAAyC;IAEnE,YAAY,SAAiB;QAC3B,IAAI,CAAC,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;IACnE,CAAC;IAED,IAAI;QACF,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAEtE,+EAA+E;YAC/E,IAAI,QAAQ,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;gBAC/D,IAAI,CAAC,IAAI,CAAC,QAA0B,CAAC,CAAC;gBACtC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,kDAAkD;YACxE,CAAC;YAED,6CAA6C;YAC7C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAElD,MAAM,EAAE,IAAI,EAAE,GAAG,YAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,IAAI,GAAG,eAAe,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,YAAY,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3E,CAAC;YACD,MAAM,SAAS,GAAG,YAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChD,wEAAwE;YACxE,0EAA0E;YAC1E,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAC/B,SAAS,CAAC,UAAU,EACpB,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAC5C,CAAC;YACF,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;YAErC,+BAA+B;YAC/B,IAAI,SAAS,GAAG,SAAS,CAAC;YAC1B,IAAI,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBAClE,CAAC;gBAAC,OAAO,EAAE,EAAE,CAAC;oBACZ,OAAO,CAAC,IAAI,CACV,kEAAkE,CACnE,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,OAAO;gBACL,GAAG,QAAQ;gBACX,OAAO;gBACP,SAAS;aACV,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAqB;QACxB,YAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjD,2DAA2D;QAC3D,IAAI,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;YAEzD,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;gBACzB,MAAM,SAAS,GAAG,KAAK,CAAC,UAAW,CAAC,EAAE,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC1B,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QAC1B,CAAC;QAED,oDAAoD;QACpD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC;QACnD,IAAI,CAAC,WAAW,CACd,IAAI,CAAC,SAAS,EACd,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAC/C,CAAC;QAEF,sBAAsB;QACtB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,WAAW,CACd,IAAI,CAAC,OAAO,EACZ,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CACpE,CAAC;QACJ,CAAC;QAED,kBAAkB;QAClB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,CACd,IAAI,CAAC,QAAQ,EACb,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CACtD,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,QAAgB,EAAE,IAAY;QAChD,MAAM,GAAG,GAAG,QAAQ,GAAG,MAAM,CAAC;QAC9B,YAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5B,YAAE,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,CACJ,aAAuC,EACvC,KAAqB;QAErB,mFAAmF;QACnF,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,OAAO,GAAmB;YAC9B,GAAG,KAAK;YACR,UAAU,EAAE,EAAE,GAAG,iBAAiB,EAAE,GAAG,aAAa,EAAE;YACtD,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,aAA0B,EAAE,KAAqB;QACrD,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,SAAS,GAA6B,EAAE,CAAC;QAE/C,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;YAC/B,IAAI,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;gBACnB,SAAS,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAmB;YAC9B,GAAG,KAAK;YACR,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,oEAAoE;QACpE,OAAO,OAAO,CAAC,OAAO,CAAC;QACvB,OAAO,OAAO,CAAC,QAAQ,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,KAAqB;QAC5C,IAAI,KAAK,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC,UAAU,CAAC;QAC9C,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,GAAG,GAA6B,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC;YAC9B,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;gBAC/B,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AA3KD,sDA2KC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { KnowledgeEntry } from "../core/types";
|
|
2
|
+
/**
|
|
3
|
+
* Reads and writes the knowledge store at .vemora/knowledge/entries.json.
|
|
4
|
+
* Committed to git so the whole team shares the same knowledge base.
|
|
5
|
+
*/
|
|
6
|
+
export declare class KnowledgeStorage {
|
|
7
|
+
private knowledgeDir;
|
|
8
|
+
private entriesPath;
|
|
9
|
+
constructor(rootDir: string);
|
|
10
|
+
load(): KnowledgeEntry[];
|
|
11
|
+
save(entries: KnowledgeEntry[]): void;
|
|
12
|
+
add(entry: KnowledgeEntry): void;
|
|
13
|
+
remove(id: string): boolean;
|
|
14
|
+
hasKnowledge(): boolean;
|
|
15
|
+
getKnowledgeDir(): string;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=knowledge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/storage/knowledge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,MAAM;IAK3B,IAAI,IAAI,cAAc,EAAE;IAWxB,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI;IAOrC,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAMhC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAQ3B,YAAY,IAAI,OAAO;IAIvB,eAAe,IAAI,MAAM;CAG1B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.KnowledgeStorage = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const config_1 = require("../core/config");
|
|
10
|
+
/**
|
|
11
|
+
* Reads and writes the knowledge store at .vemora/knowledge/entries.json.
|
|
12
|
+
* Committed to git so the whole team shares the same knowledge base.
|
|
13
|
+
*/
|
|
14
|
+
class KnowledgeStorage {
|
|
15
|
+
knowledgeDir;
|
|
16
|
+
entriesPath;
|
|
17
|
+
constructor(rootDir) {
|
|
18
|
+
this.knowledgeDir = path_1.default.join(rootDir, config_1.AI_MEMORY_DIR, config_1.KNOWLEDGE_DIR);
|
|
19
|
+
this.entriesPath = path_1.default.join(this.knowledgeDir, config_1.KNOWLEDGE_JSON);
|
|
20
|
+
}
|
|
21
|
+
load() {
|
|
22
|
+
if (!fs_1.default.existsSync(this.entriesPath))
|
|
23
|
+
return [];
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(fs_1.default.readFileSync(this.entriesPath, "utf-8"));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
save(entries) {
|
|
32
|
+
fs_1.default.mkdirSync(this.knowledgeDir, { recursive: true });
|
|
33
|
+
const tmp = this.entriesPath + ".tmp";
|
|
34
|
+
fs_1.default.writeFileSync(tmp, JSON.stringify(entries), "utf-8");
|
|
35
|
+
fs_1.default.renameSync(tmp, this.entriesPath);
|
|
36
|
+
}
|
|
37
|
+
add(entry) {
|
|
38
|
+
const entries = this.load();
|
|
39
|
+
entries.push(entry);
|
|
40
|
+
this.save(entries);
|
|
41
|
+
}
|
|
42
|
+
remove(id) {
|
|
43
|
+
const entries = this.load();
|
|
44
|
+
const next = entries.filter((e) => e.id !== id);
|
|
45
|
+
if (next.length === entries.length)
|
|
46
|
+
return false;
|
|
47
|
+
this.save(next);
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
hasKnowledge() {
|
|
51
|
+
return fs_1.default.existsSync(this.entriesPath);
|
|
52
|
+
}
|
|
53
|
+
getKnowledgeDir() {
|
|
54
|
+
return this.knowledgeDir;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.KnowledgeStorage = KnowledgeStorage;
|
|
58
|
+
//# sourceMappingURL=knowledge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/storage/knowledge.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,2CAA8E;AAG9E;;;GAGG;AACH,MAAa,gBAAgB;IACnB,YAAY,CAAS;IACrB,WAAW,CAAS;IAE5B,YAAY,OAAe;QACzB,IAAI,CAAC,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAa,EAAE,sBAAa,CAAC,CAAC;QACrE,IAAI,CAAC,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,uBAAc,CAAC,CAAC;IAClE,CAAC;IAED,IAAI;QACF,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CACf,YAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CACvB,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAyB;QAC5B,YAAE,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QACtC,YAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QACxD,YAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,KAAqB;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY;QACV,OAAO,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF;AAhDD,4CAgDC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CallGraph, Chunk, DependencyGraph, FileIndex, Metadata, SymbolIndex, TodoAnnotation } from "../core/types";
|
|
2
|
+
/**
|
|
3
|
+
* Reads and writes the versioned repository memory files stored in .vemora/.
|
|
4
|
+
* All files here are committed to git so collaborators share the same index.
|
|
5
|
+
*/
|
|
6
|
+
export declare class RepositoryStorage {
|
|
7
|
+
private memoryDir;
|
|
8
|
+
private indexDir;
|
|
9
|
+
constructor(rootDir: string);
|
|
10
|
+
loadFiles(): FileIndex;
|
|
11
|
+
saveFiles(index: FileIndex): void;
|
|
12
|
+
loadChunks(): Chunk[];
|
|
13
|
+
saveChunks(chunks: Chunk[]): void;
|
|
14
|
+
loadSymbols(): SymbolIndex;
|
|
15
|
+
saveSymbols(symbols: SymbolIndex): void;
|
|
16
|
+
loadDeps(): DependencyGraph;
|
|
17
|
+
saveDeps(graph: DependencyGraph): void;
|
|
18
|
+
loadCallGraph(): CallGraph;
|
|
19
|
+
saveCallGraph(graph: CallGraph): void;
|
|
20
|
+
loadTodos(): TodoAnnotation[];
|
|
21
|
+
saveTodos(todos: TodoAnnotation[]): void;
|
|
22
|
+
loadMetadata(): Metadata | null;
|
|
23
|
+
saveMetadata(meta: Metadata): void;
|
|
24
|
+
private readJson;
|
|
25
|
+
private writeJson;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/storage/repository.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,SAAS,EACT,KAAK,EACL,eAAe,EACf,SAAS,EACT,QAAQ,EACR,WAAW,EACX,cAAc,EACf,MAAM,eAAe,CAAC;AAEvB;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,MAAM;IAO3B,SAAS,IAAI,SAAS;IAItB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAMjC,UAAU,IAAI,KAAK,EAAE;IAIrB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAMjC,WAAW,IAAI,WAAW;IAO1B,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAMvC,QAAQ,IAAI,eAAe;IAO3B,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAMtC,aAAa,IAAI,SAAS;IAO1B,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAMrC,SAAS,IAAI,cAAc,EAAE;IAO7B,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAMxC,YAAY,IAAI,QAAQ,GAAG,IAAI;IAM/B,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAMlC,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,SAAS;CAOlB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RepositoryStorage = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const config_1 = require("../core/config");
|
|
10
|
+
/**
|
|
11
|
+
* Reads and writes the versioned repository memory files stored in .vemora/.
|
|
12
|
+
* All files here are committed to git so collaborators share the same index.
|
|
13
|
+
*/
|
|
14
|
+
class RepositoryStorage {
|
|
15
|
+
memoryDir;
|
|
16
|
+
indexDir;
|
|
17
|
+
constructor(rootDir) {
|
|
18
|
+
this.memoryDir = path_1.default.join(rootDir, config_1.AI_MEMORY_DIR);
|
|
19
|
+
this.indexDir = path_1.default.join(this.memoryDir, config_1.INDEX_DIR);
|
|
20
|
+
}
|
|
21
|
+
// ─── Files Index ────────────────────────────────────────────────────────────
|
|
22
|
+
loadFiles() {
|
|
23
|
+
return this.readJson(path_1.default.join(this.indexDir, config_1.FILES_JSON), {});
|
|
24
|
+
}
|
|
25
|
+
saveFiles(index) {
|
|
26
|
+
this.writeJson(path_1.default.join(this.indexDir, config_1.FILES_JSON), index);
|
|
27
|
+
}
|
|
28
|
+
// ─── Chunks ─────────────────────────────────────────────────────────────────
|
|
29
|
+
loadChunks() {
|
|
30
|
+
return this.readJson(path_1.default.join(this.indexDir, config_1.CHUNKS_JSON), []);
|
|
31
|
+
}
|
|
32
|
+
saveChunks(chunks) {
|
|
33
|
+
this.writeJson(path_1.default.join(this.indexDir, config_1.CHUNKS_JSON), chunks);
|
|
34
|
+
}
|
|
35
|
+
// ─── Symbol Index ────────────────────────────────────────────────────────────
|
|
36
|
+
loadSymbols() {
|
|
37
|
+
return this.readJson(path_1.default.join(this.indexDir, config_1.SYMBOLS_JSON), {});
|
|
38
|
+
}
|
|
39
|
+
saveSymbols(symbols) {
|
|
40
|
+
this.writeJson(path_1.default.join(this.indexDir, config_1.SYMBOLS_JSON), symbols);
|
|
41
|
+
}
|
|
42
|
+
// ─── Dependency Graph ────────────────────────────────────────────────────────
|
|
43
|
+
loadDeps() {
|
|
44
|
+
return this.readJson(path_1.default.join(this.indexDir, config_1.DEPS_JSON), {});
|
|
45
|
+
}
|
|
46
|
+
saveDeps(graph) {
|
|
47
|
+
this.writeJson(path_1.default.join(this.indexDir, config_1.DEPS_JSON), graph);
|
|
48
|
+
}
|
|
49
|
+
// ─── Call Graph ──────────────────────────────────────────────────────────────
|
|
50
|
+
loadCallGraph() {
|
|
51
|
+
return this.readJson(path_1.default.join(this.indexDir, config_1.CALLGRAPH_JSON), {});
|
|
52
|
+
}
|
|
53
|
+
saveCallGraph(graph) {
|
|
54
|
+
this.writeJson(path_1.default.join(this.indexDir, config_1.CALLGRAPH_JSON), graph);
|
|
55
|
+
}
|
|
56
|
+
// ─── TODO Annotations ────────────────────────────────────────────────────────
|
|
57
|
+
loadTodos() {
|
|
58
|
+
return this.readJson(path_1.default.join(this.indexDir, config_1.TODOS_JSON), []);
|
|
59
|
+
}
|
|
60
|
+
saveTodos(todos) {
|
|
61
|
+
this.writeJson(path_1.default.join(this.indexDir, config_1.TODOS_JSON), todos);
|
|
62
|
+
}
|
|
63
|
+
// ─── Metadata ────────────────────────────────────────────────────────────────
|
|
64
|
+
loadMetadata() {
|
|
65
|
+
const p = path_1.default.join(this.memoryDir, config_1.METADATA_FILE);
|
|
66
|
+
if (!fs_1.default.existsSync(p))
|
|
67
|
+
return null;
|
|
68
|
+
return this.readJson(p, null);
|
|
69
|
+
}
|
|
70
|
+
saveMetadata(meta) {
|
|
71
|
+
this.writeJson(path_1.default.join(this.memoryDir, config_1.METADATA_FILE), meta);
|
|
72
|
+
}
|
|
73
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
74
|
+
readJson(filePath, fallback) {
|
|
75
|
+
if (!fs_1.default.existsSync(filePath))
|
|
76
|
+
return fallback;
|
|
77
|
+
try {
|
|
78
|
+
return JSON.parse(fs_1.default.readFileSync(filePath, "utf-8"));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
const rel = path_1.default.relative(this.memoryDir, filePath);
|
|
82
|
+
console.warn(`[vemora] warning: .vemora/${rel} is malformed — returning empty data. Re-run \`vemora index\` to rebuild.`);
|
|
83
|
+
return fallback;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
writeJson(filePath, data) {
|
|
87
|
+
const dir = path_1.default.dirname(filePath);
|
|
88
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
89
|
+
const tmp = filePath + ".tmp";
|
|
90
|
+
fs_1.default.writeFileSync(tmp, JSON.stringify(data), "utf-8");
|
|
91
|
+
fs_1.default.renameSync(tmp, filePath);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.RepositoryStorage = RepositoryStorage;
|
|
95
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/storage/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface SessionState {
|
|
2
|
+
sessionId: string;
|
|
3
|
+
/** ISO timestamp of last query in this session */
|
|
4
|
+
lastActiveAt: string;
|
|
5
|
+
/** Chunk IDs already returned to the LLM in this session */
|
|
6
|
+
seenChunkIds: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Manages per-project session memory stored in the local developer cache.
|
|
10
|
+
*
|
|
11
|
+
* The session tracks which chunk IDs have been returned to the LLM so that
|
|
12
|
+
* subsequent queries can skip already-seen chunks. Sessions auto-expire after
|
|
13
|
+
* 30 minutes of idle time.
|
|
14
|
+
*
|
|
15
|
+
* Stored in ~/.vemora-cache/<projectId>/session.json — never in the repo.
|
|
16
|
+
*/
|
|
17
|
+
export declare class SessionStorage {
|
|
18
|
+
private filePath;
|
|
19
|
+
constructor(projectId: string);
|
|
20
|
+
private load;
|
|
21
|
+
/**
|
|
22
|
+
* Returns the active session, or creates a new one if expired or absent.
|
|
23
|
+
* A session expires after SESSION_TIMEOUT_MS of inactivity.
|
|
24
|
+
*/
|
|
25
|
+
loadOrCreate(): SessionState;
|
|
26
|
+
private newSession;
|
|
27
|
+
private saveState;
|
|
28
|
+
/** Resets the session to a clean state (new session ID, empty seen list). */
|
|
29
|
+
reset(): SessionState;
|
|
30
|
+
/**
|
|
31
|
+
* Adds chunk IDs to the seen set and refreshes the session timestamp.
|
|
32
|
+
* Creates or continues the current session as needed.
|
|
33
|
+
*/
|
|
34
|
+
markSeen(chunkIds: string[]): void;
|
|
35
|
+
/** Returns the set of chunk IDs seen in the current (unexpired) session. */
|
|
36
|
+
getSeenIds(): Set<string>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/storage/session.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAUD;;;;;;;;GAQG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAS;gBAEb,SAAS,EAAE,MAAM;IAK7B,OAAO,CAAC,IAAI;IASZ;;;OAGG;IACH,YAAY,IAAI,YAAY;IAS5B,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,SAAS;IAQjB,6EAA6E;IAC7E,KAAK,IAAI,YAAY;IAMrB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IASlC,4EAA4E;IAC5E,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC;CAO1B"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SessionStorage = void 0;
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const config_1 = require("../core/config");
|
|
11
|
+
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
12
|
+
/** Idle duration after which a session is considered expired (30 min) */
|
|
13
|
+
const SESSION_TIMEOUT_MS = 30 * 60 * 1000;
|
|
14
|
+
const SESSION_FILE = "session.json";
|
|
15
|
+
// ─── Storage ──────────────────────────────────────────────────────────────────
|
|
16
|
+
/**
|
|
17
|
+
* Manages per-project session memory stored in the local developer cache.
|
|
18
|
+
*
|
|
19
|
+
* The session tracks which chunk IDs have been returned to the LLM so that
|
|
20
|
+
* subsequent queries can skip already-seen chunks. Sessions auto-expire after
|
|
21
|
+
* 30 minutes of idle time.
|
|
22
|
+
*
|
|
23
|
+
* Stored in ~/.vemora-cache/<projectId>/session.json — never in the repo.
|
|
24
|
+
*/
|
|
25
|
+
class SessionStorage {
|
|
26
|
+
filePath;
|
|
27
|
+
constructor(projectId) {
|
|
28
|
+
const dir = (0, config_1.getLocalCacheDir)(projectId);
|
|
29
|
+
this.filePath = path_1.default.join(dir, SESSION_FILE);
|
|
30
|
+
}
|
|
31
|
+
load() {
|
|
32
|
+
if (!fs_1.default.existsSync(this.filePath))
|
|
33
|
+
return null;
|
|
34
|
+
try {
|
|
35
|
+
return JSON.parse(fs_1.default.readFileSync(this.filePath, "utf-8"));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Returns the active session, or creates a new one if expired or absent.
|
|
43
|
+
* A session expires after SESSION_TIMEOUT_MS of inactivity.
|
|
44
|
+
*/
|
|
45
|
+
loadOrCreate() {
|
|
46
|
+
const existing = this.load();
|
|
47
|
+
if (existing) {
|
|
48
|
+
const idle = Date.now() - new Date(existing.lastActiveAt).getTime();
|
|
49
|
+
if (idle < 0 || idle < SESSION_TIMEOUT_MS)
|
|
50
|
+
return existing;
|
|
51
|
+
}
|
|
52
|
+
return this.newSession();
|
|
53
|
+
}
|
|
54
|
+
newSession() {
|
|
55
|
+
return {
|
|
56
|
+
sessionId: crypto_1.default.randomBytes(8).toString("hex"),
|
|
57
|
+
lastActiveAt: new Date().toISOString(),
|
|
58
|
+
seenChunkIds: [],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
saveState(state) {
|
|
62
|
+
const dir = path_1.default.dirname(this.filePath);
|
|
63
|
+
if (!fs_1.default.existsSync(dir))
|
|
64
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
65
|
+
const tmp = this.filePath + ".tmp";
|
|
66
|
+
fs_1.default.writeFileSync(tmp, JSON.stringify(state), "utf-8");
|
|
67
|
+
fs_1.default.renameSync(tmp, this.filePath);
|
|
68
|
+
}
|
|
69
|
+
/** Resets the session to a clean state (new session ID, empty seen list). */
|
|
70
|
+
reset() {
|
|
71
|
+
const fresh = this.newSession();
|
|
72
|
+
this.saveState(fresh);
|
|
73
|
+
return fresh;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Adds chunk IDs to the seen set and refreshes the session timestamp.
|
|
77
|
+
* Creates or continues the current session as needed.
|
|
78
|
+
*/
|
|
79
|
+
markSeen(chunkIds) {
|
|
80
|
+
const state = this.loadOrCreate();
|
|
81
|
+
const seen = new Set(state.seenChunkIds);
|
|
82
|
+
for (const id of chunkIds)
|
|
83
|
+
seen.add(id);
|
|
84
|
+
state.seenChunkIds = Array.from(seen);
|
|
85
|
+
state.lastActiveAt = new Date().toISOString();
|
|
86
|
+
this.saveState(state);
|
|
87
|
+
}
|
|
88
|
+
/** Returns the set of chunk IDs seen in the current (unexpired) session. */
|
|
89
|
+
getSeenIds() {
|
|
90
|
+
const state = this.load();
|
|
91
|
+
if (!state)
|
|
92
|
+
return new Set();
|
|
93
|
+
const idle = Date.now() - new Date(state.lastActiveAt).getTime();
|
|
94
|
+
if (idle >= SESSION_TIMEOUT_MS)
|
|
95
|
+
return new Set();
|
|
96
|
+
return new Set(state.seenChunkIds);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.SessionStorage = SessionStorage;
|
|
100
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/storage/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { FileSummaryIndex, ProjectSummary } from "../core/types";
|
|
2
|
+
/**
|
|
3
|
+
* Reads and writes LLM-generated summary files stored in .vemora/summaries/.
|
|
4
|
+
* These files are committed to git so the whole team shares the same summaries.
|
|
5
|
+
*/
|
|
6
|
+
export declare class SummaryStorage {
|
|
7
|
+
private summariesDir;
|
|
8
|
+
constructor(rootDir: string);
|
|
9
|
+
loadFileSummaries(): FileSummaryIndex;
|
|
10
|
+
saveFileSummaries(index: FileSummaryIndex): void;
|
|
11
|
+
loadProjectSummary(): ProjectSummary | null;
|
|
12
|
+
saveProjectSummary(summary: ProjectSummary): void;
|
|
13
|
+
hasFileSummaries(): boolean;
|
|
14
|
+
hasProjectSummary(): boolean;
|
|
15
|
+
getSummariesDir(): string;
|
|
16
|
+
private readJson;
|
|
17
|
+
private writeJson;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=summaries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summaries.d.ts","sourceRoot":"","sources":["../../src/storage/summaries.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEtE;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,EAAE,MAAM;IAM3B,iBAAiB,IAAI,gBAAgB;IAOrC,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAMhD,kBAAkB,IAAI,cAAc,GAAG,IAAI;IAM3C,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAMjD,gBAAgB,IAAI,OAAO;IAI3B,iBAAiB,IAAI,OAAO;IAI5B,eAAe,IAAI,MAAM;IAMzB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,SAAS;CAOlB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SummaryStorage = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const config_1 = require("../core/config");
|
|
10
|
+
/**
|
|
11
|
+
* Reads and writes LLM-generated summary files stored in .vemora/summaries/.
|
|
12
|
+
* These files are committed to git so the whole team shares the same summaries.
|
|
13
|
+
*/
|
|
14
|
+
class SummaryStorage {
|
|
15
|
+
summariesDir;
|
|
16
|
+
constructor(rootDir) {
|
|
17
|
+
this.summariesDir = path_1.default.join(rootDir, config_1.AI_MEMORY_DIR, config_1.SUMMARIES_DIR);
|
|
18
|
+
}
|
|
19
|
+
// ─── File Summaries ──────────────────────────────────────────────────────────
|
|
20
|
+
loadFileSummaries() {
|
|
21
|
+
return this.readJson(path_1.default.join(this.summariesDir, config_1.FILE_SUMMARIES_JSON), {});
|
|
22
|
+
}
|
|
23
|
+
saveFileSummaries(index) {
|
|
24
|
+
this.writeJson(path_1.default.join(this.summariesDir, config_1.FILE_SUMMARIES_JSON), index);
|
|
25
|
+
}
|
|
26
|
+
// ─── Project Summary ─────────────────────────────────────────────────────────
|
|
27
|
+
loadProjectSummary() {
|
|
28
|
+
const p = path_1.default.join(this.summariesDir, config_1.PROJECT_SUMMARY_JSON);
|
|
29
|
+
if (!fs_1.default.existsSync(p))
|
|
30
|
+
return null;
|
|
31
|
+
return this.readJson(p, null);
|
|
32
|
+
}
|
|
33
|
+
saveProjectSummary(summary) {
|
|
34
|
+
this.writeJson(path_1.default.join(this.summariesDir, config_1.PROJECT_SUMMARY_JSON), summary);
|
|
35
|
+
}
|
|
36
|
+
// ─── Status helpers ───────────────────────────────────────────────────────────
|
|
37
|
+
hasFileSummaries() {
|
|
38
|
+
return fs_1.default.existsSync(path_1.default.join(this.summariesDir, config_1.FILE_SUMMARIES_JSON));
|
|
39
|
+
}
|
|
40
|
+
hasProjectSummary() {
|
|
41
|
+
return fs_1.default.existsSync(path_1.default.join(this.summariesDir, config_1.PROJECT_SUMMARY_JSON));
|
|
42
|
+
}
|
|
43
|
+
getSummariesDir() {
|
|
44
|
+
return this.summariesDir;
|
|
45
|
+
}
|
|
46
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
47
|
+
readJson(filePath, fallback) {
|
|
48
|
+
if (!fs_1.default.existsSync(filePath))
|
|
49
|
+
return fallback;
|
|
50
|
+
try {
|
|
51
|
+
return JSON.parse(fs_1.default.readFileSync(filePath, "utf-8"));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return fallback;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
writeJson(filePath, data) {
|
|
58
|
+
const dir = path_1.default.dirname(filePath);
|
|
59
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
60
|
+
const tmp = filePath + ".tmp";
|
|
61
|
+
fs_1.default.writeFileSync(tmp, JSON.stringify(data), "utf-8");
|
|
62
|
+
fs_1.default.renameSync(tmp, filePath);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.SummaryStorage = SummaryStorage;
|
|
66
|
+
//# sourceMappingURL=summaries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summaries.js","sourceRoot":"","sources":["../../src/storage/summaries.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,2CAKwB;AAGxB;;;GAGG;AACH,MAAa,cAAc;IACjB,YAAY,CAAS;IAE7B,YAAY,OAAe;QACzB,IAAI,CAAC,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAa,EAAE,sBAAa,CAAC,CAAC;IACvE,CAAC;IAED,gFAAgF;IAEhF,iBAAiB;QACf,OAAO,IAAI,CAAC,QAAQ,CAClB,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,4BAAmB,CAAC,EACjD,EAAE,CACH,CAAC;IACJ,CAAC;IAED,iBAAiB,CAAC,KAAuB;QACvC,IAAI,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,4BAAmB,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3E,CAAC;IAED,gFAAgF;IAEhF,kBAAkB;QAChB,MAAM,CAAC,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,6BAAoB,CAAC,CAAC;QAC7D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,IAAI,CAAC,QAAQ,CAAiB,CAAC,EAAE,IAAiC,CAAC,CAAC;IAC7E,CAAC;IAED,kBAAkB,CAAC,OAAuB;QACxC,IAAI,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,6BAAoB,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9E,CAAC;IAED,iFAAiF;IAEjF,gBAAgB;QACd,OAAO,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,4BAAmB,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,iBAAiB;QACf,OAAO,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,6BAAoB,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,gFAAgF;IAExE,QAAQ,CAAI,QAAgB,EAAE,QAAW;QAC/C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QAC9C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAM,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,QAAgB,EAAE,IAAa;QAC/C,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,QAAQ,GAAG,MAAM,CAAC;QAC9B,YAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACrD,YAAE,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/B,CAAC;CACF;AAhED,wCAgEC"}
|