vemora 0.1.0-alpha.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/README.md +851 -0
  2. package/dist/cli.d.ts +16 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +682 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/ask.d.ts +14 -0
  7. package/dist/commands/ask.d.ts.map +1 -0
  8. package/dist/commands/ask.js +137 -0
  9. package/dist/commands/ask.js.map +1 -0
  10. package/dist/commands/audit.d.ts +17 -0
  11. package/dist/commands/audit.d.ts.map +1 -0
  12. package/dist/commands/audit.js +398 -0
  13. package/dist/commands/audit.js.map +1 -0
  14. package/dist/commands/brief.d.ts +16 -0
  15. package/dist/commands/brief.d.ts.map +1 -0
  16. package/dist/commands/brief.js +84 -0
  17. package/dist/commands/brief.js.map +1 -0
  18. package/dist/commands/chat.d.ts +7 -0
  19. package/dist/commands/chat.d.ts.map +1 -0
  20. package/dist/commands/chat.js +155 -0
  21. package/dist/commands/chat.js.map +1 -0
  22. package/dist/commands/context.d.ts +63 -0
  23. package/dist/commands/context.d.ts.map +1 -0
  24. package/dist/commands/context.js +794 -0
  25. package/dist/commands/context.js.map +1 -0
  26. package/dist/commands/dead-code.d.ts +15 -0
  27. package/dist/commands/dead-code.d.ts.map +1 -0
  28. package/dist/commands/dead-code.js +206 -0
  29. package/dist/commands/dead-code.js.map +1 -0
  30. package/dist/commands/deps.d.ts +20 -0
  31. package/dist/commands/deps.d.ts.map +1 -0
  32. package/dist/commands/deps.js +138 -0
  33. package/dist/commands/deps.js.map +1 -0
  34. package/dist/commands/focus.d.ts +8 -0
  35. package/dist/commands/focus.d.ts.map +1 -0
  36. package/dist/commands/focus.js +310 -0
  37. package/dist/commands/focus.js.map +1 -0
  38. package/dist/commands/index.d.ts +10 -0
  39. package/dist/commands/index.d.ts.map +1 -0
  40. package/dist/commands/index.js +366 -0
  41. package/dist/commands/index.js.map +1 -0
  42. package/dist/commands/init-agent.d.ts +23 -0
  43. package/dist/commands/init-agent.d.ts.map +1 -0
  44. package/dist/commands/init-agent.js +384 -0
  45. package/dist/commands/init-agent.js.map +1 -0
  46. package/dist/commands/init.d.ts +2 -0
  47. package/dist/commands/init.d.ts.map +1 -0
  48. package/dist/commands/init.js +122 -0
  49. package/dist/commands/init.js.map +1 -0
  50. package/dist/commands/knowledge.d.ts +14 -0
  51. package/dist/commands/knowledge.d.ts.map +1 -0
  52. package/dist/commands/knowledge.js +115 -0
  53. package/dist/commands/knowledge.js.map +1 -0
  54. package/dist/commands/plan.d.ts +24 -0
  55. package/dist/commands/plan.d.ts.map +1 -0
  56. package/dist/commands/plan.js +867 -0
  57. package/dist/commands/plan.js.map +1 -0
  58. package/dist/commands/query.d.ts +39 -0
  59. package/dist/commands/query.d.ts.map +1 -0
  60. package/dist/commands/query.js +392 -0
  61. package/dist/commands/query.js.map +1 -0
  62. package/dist/commands/remember.d.ts +11 -0
  63. package/dist/commands/remember.d.ts.map +1 -0
  64. package/dist/commands/remember.js +267 -0
  65. package/dist/commands/remember.js.map +1 -0
  66. package/dist/commands/report.d.ts +10 -0
  67. package/dist/commands/report.d.ts.map +1 -0
  68. package/dist/commands/report.js +243 -0
  69. package/dist/commands/report.js.map +1 -0
  70. package/dist/commands/status.d.ts +2 -0
  71. package/dist/commands/status.d.ts.map +1 -0
  72. package/dist/commands/status.js +127 -0
  73. package/dist/commands/status.js.map +1 -0
  74. package/dist/commands/summarize.d.ts +14 -0
  75. package/dist/commands/summarize.d.ts.map +1 -0
  76. package/dist/commands/summarize.js +170 -0
  77. package/dist/commands/summarize.js.map +1 -0
  78. package/dist/commands/triage.d.ts +33 -0
  79. package/dist/commands/triage.d.ts.map +1 -0
  80. package/dist/commands/triage.js +419 -0
  81. package/dist/commands/triage.js.map +1 -0
  82. package/dist/commands/usages.d.ts +14 -0
  83. package/dist/commands/usages.d.ts.map +1 -0
  84. package/dist/commands/usages.js +236 -0
  85. package/dist/commands/usages.js.map +1 -0
  86. package/dist/core/config.d.ts +35 -0
  87. package/dist/core/config.d.ts.map +1 -0
  88. package/dist/core/config.js +159 -0
  89. package/dist/core/config.js.map +1 -0
  90. package/dist/core/types.d.ts +287 -0
  91. package/dist/core/types.d.ts.map +1 -0
  92. package/dist/core/types.js +4 -0
  93. package/dist/core/types.js.map +1 -0
  94. package/dist/embeddings/factory.d.ts +9 -0
  95. package/dist/embeddings/factory.d.ts.map +1 -0
  96. package/dist/embeddings/factory.js +26 -0
  97. package/dist/embeddings/factory.js.map +1 -0
  98. package/dist/embeddings/noop.d.ts +17 -0
  99. package/dist/embeddings/noop.d.ts.map +1 -0
  100. package/dist/embeddings/noop.js +22 -0
  101. package/dist/embeddings/noop.js.map +1 -0
  102. package/dist/embeddings/ollama.d.ts +11 -0
  103. package/dist/embeddings/ollama.d.ts.map +1 -0
  104. package/dist/embeddings/ollama.js +49 -0
  105. package/dist/embeddings/ollama.js.map +1 -0
  106. package/dist/embeddings/openai.d.ts +10 -0
  107. package/dist/embeddings/openai.d.ts.map +1 -0
  108. package/dist/embeddings/openai.js +67 -0
  109. package/dist/embeddings/openai.js.map +1 -0
  110. package/dist/embeddings/provider.d.ts +19 -0
  111. package/dist/embeddings/provider.d.ts.map +1 -0
  112. package/dist/embeddings/provider.js +3 -0
  113. package/dist/embeddings/provider.js.map +1 -0
  114. package/dist/indexer/callgraph.d.ts +16 -0
  115. package/dist/indexer/callgraph.d.ts.map +1 -0
  116. package/dist/indexer/callgraph.js +154 -0
  117. package/dist/indexer/callgraph.js.map +1 -0
  118. package/dist/indexer/chunkBySlidingWindow.d.ts +6 -0
  119. package/dist/indexer/chunkBySlidingWindow.d.ts.map +1 -0
  120. package/dist/indexer/chunkBySlidingWindow.js +30 -0
  121. package/dist/indexer/chunkBySlidingWindow.js.map +1 -0
  122. package/dist/indexer/chunkBySymbols.d.ts +7 -0
  123. package/dist/indexer/chunkBySymbols.d.ts.map +1 -0
  124. package/dist/indexer/chunkBySymbols.js +57 -0
  125. package/dist/indexer/chunkBySymbols.js.map +1 -0
  126. package/dist/indexer/chunker.d.ts +15 -0
  127. package/dist/indexer/chunker.d.ts.map +1 -0
  128. package/dist/indexer/chunker.js +26 -0
  129. package/dist/indexer/chunker.js.map +1 -0
  130. package/dist/indexer/classHeader.d.ts +7 -0
  131. package/dist/indexer/classHeader.d.ts.map +1 -0
  132. package/dist/indexer/classHeader.js +37 -0
  133. package/dist/indexer/classHeader.js.map +1 -0
  134. package/dist/indexer/deps.d.ts +66 -0
  135. package/dist/indexer/deps.d.ts.map +1 -0
  136. package/dist/indexer/deps.js +412 -0
  137. package/dist/indexer/deps.js.map +1 -0
  138. package/dist/indexer/hasher.d.ts +17 -0
  139. package/dist/indexer/hasher.d.ts.map +1 -0
  140. package/dist/indexer/hasher.js +38 -0
  141. package/dist/indexer/hasher.js.map +1 -0
  142. package/dist/indexer/parser.d.ts +18 -0
  143. package/dist/indexer/parser.d.ts.map +1 -0
  144. package/dist/indexer/parser.js +355 -0
  145. package/dist/indexer/parser.js.map +1 -0
  146. package/dist/indexer/scanner.d.ts +18 -0
  147. package/dist/indexer/scanner.d.ts.map +1 -0
  148. package/dist/indexer/scanner.js +37 -0
  149. package/dist/indexer/scanner.js.map +1 -0
  150. package/dist/indexer/strategy.d.ts +11 -0
  151. package/dist/indexer/strategy.d.ts.map +1 -0
  152. package/dist/indexer/strategy.js +15 -0
  153. package/dist/indexer/strategy.js.map +1 -0
  154. package/dist/indexer/tests.d.ts +15 -0
  155. package/dist/indexer/tests.d.ts.map +1 -0
  156. package/dist/indexer/tests.js +68 -0
  157. package/dist/indexer/tests.js.map +1 -0
  158. package/dist/indexer/todos.d.ts +9 -0
  159. package/dist/indexer/todos.d.ts.map +1 -0
  160. package/dist/indexer/todos.js +29 -0
  161. package/dist/indexer/todos.js.map +1 -0
  162. package/dist/llm/anthropic.d.ts +8 -0
  163. package/dist/llm/anthropic.d.ts.map +1 -0
  164. package/dist/llm/anthropic.js +76 -0
  165. package/dist/llm/anthropic.js.map +1 -0
  166. package/dist/llm/claude-code.d.ts +37 -0
  167. package/dist/llm/claude-code.d.ts.map +1 -0
  168. package/dist/llm/claude-code.js +97 -0
  169. package/dist/llm/claude-code.js.map +1 -0
  170. package/dist/llm/factory.d.ts +7 -0
  171. package/dist/llm/factory.d.ts.map +1 -0
  172. package/dist/llm/factory.js +47 -0
  173. package/dist/llm/factory.js.map +1 -0
  174. package/dist/llm/ollama.d.ts +8 -0
  175. package/dist/llm/ollama.d.ts.map +1 -0
  176. package/dist/llm/ollama.js +83 -0
  177. package/dist/llm/ollama.js.map +1 -0
  178. package/dist/llm/openai.d.ts +8 -0
  179. package/dist/llm/openai.d.ts.map +1 -0
  180. package/dist/llm/openai.js +68 -0
  181. package/dist/llm/openai.js.map +1 -0
  182. package/dist/llm/provider.d.ts +35 -0
  183. package/dist/llm/provider.d.ts.map +1 -0
  184. package/dist/llm/provider.js +3 -0
  185. package/dist/llm/provider.js.map +1 -0
  186. package/dist/search/bm25.d.ts +3 -0
  187. package/dist/search/bm25.d.ts.map +1 -0
  188. package/dist/search/bm25.js +104 -0
  189. package/dist/search/bm25.js.map +1 -0
  190. package/dist/search/formatter.d.ts +43 -0
  191. package/dist/search/formatter.d.ts.map +1 -0
  192. package/dist/search/formatter.js +208 -0
  193. package/dist/search/formatter.js.map +1 -0
  194. package/dist/search/hybrid.d.ts +10 -0
  195. package/dist/search/hybrid.d.ts.map +1 -0
  196. package/dist/search/hybrid.js +53 -0
  197. package/dist/search/hybrid.js.map +1 -0
  198. package/dist/search/merge.d.ts +33 -0
  199. package/dist/search/merge.d.ts.map +1 -0
  200. package/dist/search/merge.js +158 -0
  201. package/dist/search/merge.js.map +1 -0
  202. package/dist/search/mmr.d.ts +23 -0
  203. package/dist/search/mmr.d.ts.map +1 -0
  204. package/dist/search/mmr.js +95 -0
  205. package/dist/search/mmr.js.map +1 -0
  206. package/dist/search/rerank.d.ts +12 -0
  207. package/dist/search/rerank.d.ts.map +1 -0
  208. package/dist/search/rerank.js +113 -0
  209. package/dist/search/rerank.js.map +1 -0
  210. package/dist/search/signature.d.ts +42 -0
  211. package/dist/search/signature.d.ts.map +1 -0
  212. package/dist/search/signature.js +112 -0
  213. package/dist/search/signature.js.map +1 -0
  214. package/dist/search/vector.d.ts +41 -0
  215. package/dist/search/vector.d.ts.map +1 -0
  216. package/dist/search/vector.js +185 -0
  217. package/dist/search/vector.js.map +1 -0
  218. package/dist/storage/cache.d.ts +30 -0
  219. package/dist/storage/cache.d.ts.map +1 -0
  220. package/dist/storage/cache.js +160 -0
  221. package/dist/storage/cache.js.map +1 -0
  222. package/dist/storage/knowledge.d.ts +23 -0
  223. package/dist/storage/knowledge.d.ts.map +1 -0
  224. package/dist/storage/knowledge.js +81 -0
  225. package/dist/storage/knowledge.js.map +1 -0
  226. package/dist/storage/planSession.d.ts +39 -0
  227. package/dist/storage/planSession.d.ts.map +1 -0
  228. package/dist/storage/planSession.js +78 -0
  229. package/dist/storage/planSession.js.map +1 -0
  230. package/dist/storage/repository.d.ts +27 -0
  231. package/dist/storage/repository.d.ts.map +1 -0
  232. package/dist/storage/repository.js +95 -0
  233. package/dist/storage/repository.js.map +1 -0
  234. package/dist/storage/session.d.ts +38 -0
  235. package/dist/storage/session.d.ts.map +1 -0
  236. package/dist/storage/session.js +100 -0
  237. package/dist/storage/session.js.map +1 -0
  238. package/dist/storage/summaries.d.ts +19 -0
  239. package/dist/storage/summaries.d.ts.map +1 -0
  240. package/dist/storage/summaries.js +66 -0
  241. package/dist/storage/summaries.js.map +1 -0
  242. package/dist/storage/usage.d.ts +39 -0
  243. package/dist/storage/usage.d.ts.map +1 -0
  244. package/dist/storage/usage.js +55 -0
  245. package/dist/storage/usage.js.map +1 -0
  246. package/dist/utils/git.d.ts +20 -0
  247. package/dist/utils/git.d.ts.map +1 -0
  248. package/dist/utils/git.js +49 -0
  249. package/dist/utils/git.js.map +1 -0
  250. package/dist/utils/tokenizer.d.ts +32 -0
  251. package/dist/utils/tokenizer.d.ts.map +1 -0
  252. package/dist/utils/tokenizer.js +66 -0
  253. package/dist/utils/tokenizer.js.map +1 -0
  254. package/package.json +71 -0
@@ -0,0 +1,30 @@
1
+ import type { EmbeddingCache } from "../core/types";
2
+ /**
3
+ * Manages the local per-developer embedding cache.
4
+ *
5
+ * Stored in ~/.vemora-cache/<projectId>/ — never in the repo.
6
+ * Each developer builds their own cache after running `vemora index`.
7
+ *
8
+ * Design choice: dual-file storage per project.
9
+ * Metadata and chunk IDs are stored in JSON (inspectable).
10
+ * Vectors are stored as a contiguous Float32Array binary buffer (fast I/O).
11
+ * The HNSW index is serialized to a separate JSON file for O(log N) search.
12
+ */
13
+ export declare class EmbeddingCacheStorage {
14
+ private cacheDir;
15
+ private cachePath;
16
+ private binPath;
17
+ private hnswPath;
18
+ constructor(projectId: string);
19
+ load(): EmbeddingCache | null;
20
+ save(cache: EmbeddingCache): void;
21
+ private writeAtomic;
22
+ update(newEmbeddings: Record<string, number[]>, cache: EmbeddingCache): EmbeddingCache;
23
+ prune(validChunkIds: Set<string>, cache: EmbeddingCache): EmbeddingCache;
24
+ /**
25
+ * Helper to always get a Map, regardless of storage format
26
+ */
27
+ private getEmbeddingsMap;
28
+ getCacheDir(): string;
29
+ }
30
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/storage/cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD;;;;;;;;;;GAUG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;gBAEb,SAAS,EAAE,MAAM;IAO7B,IAAI,IAAI,cAAc,GAAG,IAAI;IAoD7B,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IA0CjC,OAAO,CAAC,WAAW;IAMnB,MAAM,CACJ,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACvC,KAAK,EAAE,cAAc,GACpB,cAAc;IAYjB,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,cAAc,GAAG,cAAc;IAwBxE;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB,WAAW,IAAI,MAAM;CAGtB"}
@@ -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":"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"}
@@ -0,0 +1,23 @@
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
+ invalidate(id: string): boolean;
15
+ hasKnowledge(): boolean;
16
+ getKnowledgeDir(): string;
17
+ }
18
+ /**
19
+ * Returns only entries that are valid at the given point in time.
20
+ * Entries without validFrom/validUntil are treated as always-valid.
21
+ */
22
+ export declare function filterValidAt(entries: KnowledgeEntry[], asOf?: Date): KnowledgeEntry[];
23
+ //# 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,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAS/B,YAAY,IAAI,OAAO;IAIvB,eAAe,IAAI,MAAM;CAG1B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,EAAE,EACzB,IAAI,GAAE,IAAiB,GACtB,cAAc,EAAE,CAMlB"}
@@ -0,0 +1,81 @@
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
+ exports.filterValidAt = filterValidAt;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const config_1 = require("../core/config");
11
+ /**
12
+ * Reads and writes the knowledge store at .vemora/knowledge/entries.json.
13
+ * Committed to git so the whole team shares the same knowledge base.
14
+ */
15
+ class KnowledgeStorage {
16
+ knowledgeDir;
17
+ entriesPath;
18
+ constructor(rootDir) {
19
+ this.knowledgeDir = path_1.default.join(rootDir, config_1.AI_MEMORY_DIR, config_1.KNOWLEDGE_DIR);
20
+ this.entriesPath = path_1.default.join(this.knowledgeDir, config_1.KNOWLEDGE_JSON);
21
+ }
22
+ load() {
23
+ if (!fs_1.default.existsSync(this.entriesPath))
24
+ return [];
25
+ try {
26
+ return JSON.parse(fs_1.default.readFileSync(this.entriesPath, "utf-8"));
27
+ }
28
+ catch {
29
+ return [];
30
+ }
31
+ }
32
+ save(entries) {
33
+ fs_1.default.mkdirSync(this.knowledgeDir, { recursive: true });
34
+ const tmp = this.entriesPath + ".tmp";
35
+ fs_1.default.writeFileSync(tmp, JSON.stringify(entries), "utf-8");
36
+ fs_1.default.renameSync(tmp, this.entriesPath);
37
+ }
38
+ add(entry) {
39
+ const entries = this.load();
40
+ entries.push(entry);
41
+ this.save(entries);
42
+ }
43
+ remove(id) {
44
+ const entries = this.load();
45
+ const next = entries.filter((e) => e.id !== id);
46
+ if (next.length === entries.length)
47
+ return false;
48
+ this.save(next);
49
+ return true;
50
+ }
51
+ invalidate(id) {
52
+ const entries = this.load();
53
+ const match = entries.find((e) => e.id === id);
54
+ if (!match)
55
+ return false;
56
+ match.validUntil = new Date().toISOString();
57
+ this.save(entries);
58
+ return true;
59
+ }
60
+ hasKnowledge() {
61
+ return fs_1.default.existsSync(this.entriesPath);
62
+ }
63
+ getKnowledgeDir() {
64
+ return this.knowledgeDir;
65
+ }
66
+ }
67
+ exports.KnowledgeStorage = KnowledgeStorage;
68
+ /**
69
+ * Returns only entries that are valid at the given point in time.
70
+ * Entries without validFrom/validUntil are treated as always-valid.
71
+ */
72
+ function filterValidAt(entries, asOf = new Date()) {
73
+ return entries.filter((e) => {
74
+ if (e.validFrom && new Date(e.validFrom) > asOf)
75
+ return false;
76
+ if (e.validUntil && new Date(e.validUntil) <= asOf)
77
+ return false;
78
+ return true;
79
+ });
80
+ }
81
+ //# sourceMappingURL=knowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/storage/knowledge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export interface PlanSession {
2
+ sessionId: string;
3
+ /** Short 8-char prefix for display */
4
+ shortId: string;
5
+ task: string;
6
+ rootDir: string;
7
+ createdAt: string;
8
+ updatedAt: string;
9
+ status: "running" | "completed" | "failed";
10
+ plan: {
11
+ goal: string;
12
+ steps: unknown[];
13
+ };
14
+ /** stepId (string key) → executor answer */
15
+ stepResults: Record<string, string>;
16
+ /** IDs of all steps that completed successfully */
17
+ completedStepIds: number[];
18
+ /** Next available step ID for adaptive re-planning */
19
+ nextId: number;
20
+ }
21
+ /**
22
+ * Persists plan execution state to the local developer cache.
23
+ * Stored in ~/.vemora-cache/<projectId>/sessions/<sessionId>.json
24
+ * Never committed to git — local to the developer.
25
+ */
26
+ export declare class PlanSessionStorage {
27
+ private sessionsDir;
28
+ constructor(projectId: string);
29
+ save(session: PlanSession): void;
30
+ /**
31
+ * Load a session by full UUID or by 8-char prefix.
32
+ * Returns null if not found.
33
+ */
34
+ load(sessionIdOrPrefix: string): PlanSession | null;
35
+ /** List all sessions, newest first. */
36
+ list(): PlanSession[];
37
+ delete(sessionId: string): boolean;
38
+ }
39
+ //# sourceMappingURL=planSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planSession.d.ts","sourceRoot":"","sources":["../../src/storage/planSession.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,OAAO,EAAE,CAAC;KAClB,CAAC;IACF,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,mDAAmD;IACnD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;CAChB;AAQD;;;;GAIG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,WAAW,CAAS;gBAEhB,SAAS,EAAE,MAAM;IAO7B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAUhC;;;OAGG;IACH,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAoBnD,uCAAuC;IACvC,IAAI,IAAI,WAAW,EAAE;IAqBrB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAMnC"}
@@ -0,0 +1,78 @@
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.PlanSessionStorage = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const config_1 = require("../core/config");
10
+ // ─── Constants ────────────────────────────────────────────────────────────────
11
+ const SESSIONS_SUBDIR = "sessions";
12
+ // ─── Storage ──────────────────────────────────────────────────────────────────
13
+ /**
14
+ * Persists plan execution state to the local developer cache.
15
+ * Stored in ~/.vemora-cache/<projectId>/sessions/<sessionId>.json
16
+ * Never committed to git — local to the developer.
17
+ */
18
+ class PlanSessionStorage {
19
+ sessionsDir;
20
+ constructor(projectId) {
21
+ this.sessionsDir = path_1.default.join((0, config_1.getLocalCacheDir)(projectId), SESSIONS_SUBDIR);
22
+ }
23
+ save(session) {
24
+ if (!fs_1.default.existsSync(this.sessionsDir)) {
25
+ fs_1.default.mkdirSync(this.sessionsDir, { recursive: true });
26
+ }
27
+ const filePath = path_1.default.join(this.sessionsDir, `${session.sessionId}.json`);
28
+ const tmp = `${filePath}.tmp`;
29
+ fs_1.default.writeFileSync(tmp, JSON.stringify(session, null, 2), "utf-8");
30
+ fs_1.default.renameSync(tmp, filePath);
31
+ }
32
+ /**
33
+ * Load a session by full UUID or by 8-char prefix.
34
+ * Returns null if not found.
35
+ */
36
+ load(sessionIdOrPrefix) {
37
+ if (!fs_1.default.existsSync(this.sessionsDir))
38
+ return null;
39
+ const files = fs_1.default.readdirSync(this.sessionsDir).filter((f) => f.endsWith(".json"));
40
+ const match = files.find((f) => f === `${sessionIdOrPrefix}.json` ||
41
+ f.startsWith(sessionIdOrPrefix));
42
+ if (!match)
43
+ return null;
44
+ try {
45
+ return JSON.parse(fs_1.default.readFileSync(path_1.default.join(this.sessionsDir, match), "utf-8"));
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ /** List all sessions, newest first. */
52
+ list() {
53
+ if (!fs_1.default.existsSync(this.sessionsDir))
54
+ return [];
55
+ return fs_1.default
56
+ .readdirSync(this.sessionsDir)
57
+ .filter((f) => f.endsWith(".json"))
58
+ .map((f) => {
59
+ try {
60
+ return JSON.parse(fs_1.default.readFileSync(path_1.default.join(this.sessionsDir, f), "utf-8"));
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ })
66
+ .filter(Boolean)
67
+ .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
68
+ }
69
+ delete(sessionId) {
70
+ const filePath = path_1.default.join(this.sessionsDir, `${sessionId}.json`);
71
+ if (!fs_1.default.existsSync(filePath))
72
+ return false;
73
+ fs_1.default.unlinkSync(filePath);
74
+ return true;
75
+ }
76
+ }
77
+ exports.PlanSessionStorage = PlanSessionStorage;
78
+ //# sourceMappingURL=planSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planSession.js","sourceRoot":"","sources":["../../src/storage/planSession.ts"],"names":[],"mappings":"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"}
@@ -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"}