@fingerskier/augment 0.1.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.
Files changed (65) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +130 -0
  3. package/dist/bin/augment-daemon.d.ts +2 -0
  4. package/dist/bin/augment-daemon.js +5 -0
  5. package/dist/bin/augment-daemon.js.map +1 -0
  6. package/dist/bin/augment-mcp.d.ts +2 -0
  7. package/dist/bin/augment-mcp.js +5 -0
  8. package/dist/bin/augment-mcp.js.map +1 -0
  9. package/dist/bin/augment.d.ts +2 -0
  10. package/dist/bin/augment.js +5 -0
  11. package/dist/bin/augment.js.map +1 -0
  12. package/dist/cli.d.ts +1 -0
  13. package/dist/cli.js +13 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +9 -0
  16. package/dist/config.js +57 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/constants.d.ts +11 -0
  19. package/dist/constants.js +10 -0
  20. package/dist/constants.js.map +1 -0
  21. package/dist/daemon/client.d.ts +19 -0
  22. package/dist/daemon/client.js +146 -0
  23. package/dist/daemon/client.js.map +1 -0
  24. package/dist/daemon/http.d.ts +8 -0
  25. package/dist/daemon/http.js +142 -0
  26. package/dist/daemon/http.js.map +1 -0
  27. package/dist/daemon/main.d.ts +1 -0
  28. package/dist/daemon/main.js +16 -0
  29. package/dist/daemon/main.js.map +1 -0
  30. package/dist/db.d.ts +33 -0
  31. package/dist/db.js +338 -0
  32. package/dist/db.js.map +1 -0
  33. package/dist/embeddings.d.ts +20 -0
  34. package/dist/embeddings.js +35 -0
  35. package/dist/embeddings.js.map +1 -0
  36. package/dist/mcp/server.d.ts +1 -0
  37. package/dist/mcp/server.js +91 -0
  38. package/dist/mcp/server.js.map +1 -0
  39. package/dist/memory/files.d.ts +11 -0
  40. package/dist/memory/files.js +107 -0
  41. package/dist/memory/files.js.map +1 -0
  42. package/dist/memory/project.d.ts +8 -0
  43. package/dist/memory/project.js +59 -0
  44. package/dist/memory/project.js.map +1 -0
  45. package/dist/memory/scan.d.ts +1 -0
  46. package/dist/memory/scan.js +29 -0
  47. package/dist/memory/scan.js.map +1 -0
  48. package/dist/service.d.ts +43 -0
  49. package/dist/service.js +339 -0
  50. package/dist/service.js.map +1 -0
  51. package/dist/types.d.ts +95 -0
  52. package/dist/types.js +2 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/util/hash.d.ts +3 -0
  55. package/dist/util/hash.js +25 -0
  56. package/dist/util/hash.js.map +1 -0
  57. package/dist/util/text.d.ts +4 -0
  58. package/dist/util/text.js +42 -0
  59. package/dist/util/text.js.map +1 -0
  60. package/docs/FEATURES.md +245 -0
  61. package/integrations/claude/CLAUDE.md +28 -0
  62. package/integrations/codex/SKILL.md +29 -0
  63. package/integrations/examples/claude-mcp-config.json +11 -0
  64. package/integrations/examples/codex-mcp-config.json +11 -0
  65. package/package.json +45 -0
@@ -0,0 +1,339 @@
1
+ import { DEFAULT_MEMORY_HARD_LIMIT_CHARS, DEFAULT_SEARCH_LIMIT, DEFAULT_SEARCH_MAX_CHARS } from "./constants.js";
2
+ import { ensureConfigDirs } from "./config.js";
3
+ import { AugmentDatabase } from "./db.js";
4
+ import { TransformersEmbeddingProvider } from "./embeddings.js";
5
+ import { normalizeKind, normalizeLinkType, memoryRelativePath, readMemory, writeMemory } from "./memory/files.js";
6
+ import { inferProjectName } from "./memory/project.js";
7
+ import { findMemoryFiles } from "./memory/scan.js";
8
+ import { clamp01, cosineSimilarity, lexicalScore } from "./util/text.js";
9
+ export class AugmentService {
10
+ config;
11
+ embeddingProvider;
12
+ db;
13
+ initialized = false;
14
+ constructor(config, embeddingProvider = new TransformersEmbeddingProvider()) {
15
+ this.config = config;
16
+ this.embeddingProvider = embeddingProvider;
17
+ this.db = new AugmentDatabase(config.databasePath);
18
+ }
19
+ async close() {
20
+ this.db.close();
21
+ this.initialized = false;
22
+ await new Promise((resolve) => setTimeout(resolve, 50));
23
+ }
24
+ async init() {
25
+ if (this.initialized) {
26
+ return;
27
+ }
28
+ await ensureConfigDirs(this.config);
29
+ await this.db.init();
30
+ await this.rebuildIndex();
31
+ this.initialized = true;
32
+ }
33
+ async initProject(input = {}) {
34
+ await this.init();
35
+ const name = input.project_name ?? (await inferProjectName());
36
+ return this.db.upsertProject(name);
37
+ }
38
+ async listProjects(name) {
39
+ await this.init();
40
+ return this.db.listProjects(name);
41
+ }
42
+ async rebuildIndex() {
43
+ await ensureConfigDirs(this.config);
44
+ await this.db.init();
45
+ const relativePaths = await findMemoryFiles(this.config.memoryRoot);
46
+ for (const relativePath of relativePaths) {
47
+ const parsed = await readMemory(this.config.memoryRoot, relativePath);
48
+ const record = await this.db.upsertMemory(parsed);
49
+ await this.ensureEmbedding(record).catch((error) => {
50
+ console.error(`Embedding failed for ${relativePath}:`, error);
51
+ });
52
+ }
53
+ await this.db.removeMissingMemories(relativePaths);
54
+ await this.db.rebuildLinks();
55
+ return { indexed: relativePaths.length };
56
+ }
57
+ async upsert(input) {
58
+ await this.init();
59
+ if (input.content.length > DEFAULT_MEMORY_HARD_LIMIT_CHARS) {
60
+ throw new Error(`Memory content exceeds hard maximum of ${DEFAULT_MEMORY_HARD_LIMIT_CHARS} characters`);
61
+ }
62
+ const project = await this.db.getProjectById(input.project_id);
63
+ if (!project) {
64
+ throw new Error(`Unknown project_id: ${input.project_id}`);
65
+ }
66
+ const now = new Date().toISOString();
67
+ let relativePath;
68
+ let existing;
69
+ let action = "created";
70
+ if (input.memory_id !== undefined) {
71
+ existing = await this.db.getMemoryById(input.memory_id);
72
+ if (!existing) {
73
+ throw new Error(`Unknown memory_id: ${input.memory_id}`);
74
+ }
75
+ relativePath = existing.relative_path;
76
+ action = "updated";
77
+ }
78
+ else {
79
+ const kind = normalizeKind(input.kind);
80
+ relativePath = memoryRelativePath(project.name, kind, input.name);
81
+ existing = await this.db.getMemoryByPath(relativePath);
82
+ if (existing) {
83
+ action = "updated";
84
+ }
85
+ else {
86
+ existing = await this.findSimilarMemory(project.id, kind, input.content);
87
+ if (existing) {
88
+ relativePath = existing.relative_path;
89
+ action = "similar-updated";
90
+ }
91
+ }
92
+ }
93
+ const metadata = existing
94
+ ? {
95
+ project: existing.project_name,
96
+ kind: existing.kind,
97
+ name: existing.name,
98
+ tags: input.tags ?? existing.tags,
99
+ links: existing.links,
100
+ created_at: existing.created_at,
101
+ updated_at: now,
102
+ }
103
+ : {
104
+ project: project.name,
105
+ kind: normalizeKind(input.kind),
106
+ name: input.name,
107
+ tags: input.tags ?? [],
108
+ links: [],
109
+ created_at: now,
110
+ updated_at: now,
111
+ };
112
+ await writeMemory(this.config.memoryRoot, relativePath, normalizeMemoryFrontmatter(metadata), input.content);
113
+ const parsed = await readMemory(this.config.memoryRoot, relativePath);
114
+ const memory = await this.db.upsertMemory(parsed);
115
+ await this.ensureEmbedding(memory);
116
+ await this.db.rebuildLinks();
117
+ return {
118
+ memory,
119
+ action,
120
+ text: `${action} memory ${memory.id} at ${memory.relative_path}`,
121
+ };
122
+ }
123
+ async read(id) {
124
+ await this.init();
125
+ const memory = await this.db.getMemoryById(id);
126
+ if (!memory) {
127
+ throw new Error(`Unknown memory id: ${id}`);
128
+ }
129
+ return memory;
130
+ }
131
+ async link(fromMemoryId, toMemoryId, typeInput) {
132
+ await this.init();
133
+ const from = await this.read(fromMemoryId);
134
+ const to = await this.read(toMemoryId);
135
+ const type = normalizeLinkType(typeInput);
136
+ const frontmatter = normalizeMemoryFrontmatter({
137
+ project: from.project_name,
138
+ kind: from.kind,
139
+ name: from.name,
140
+ tags: from.tags,
141
+ links: mergeFrontmatterLink(from.links, { to: to.relative_path, type }),
142
+ created_at: from.created_at,
143
+ updated_at: new Date().toISOString(),
144
+ });
145
+ await writeMemory(this.config.memoryRoot, from.relative_path, frontmatter, from.body);
146
+ const parsed = await readMemory(this.config.memoryRoot, from.relative_path);
147
+ await this.db.upsertMemory(parsed);
148
+ await this.db.rebuildLinks();
149
+ const links = await this.db.listLinks(from.id);
150
+ const link = links.find((candidate) => candidate.to_memory_id === to.id && candidate.type === type);
151
+ if (!link) {
152
+ throw new Error(`Failed to create link ${from.id} -> ${to.id}`);
153
+ }
154
+ return {
155
+ link,
156
+ text: `linked memory ${from.id} to ${to.id} as ${type}`,
157
+ };
158
+ }
159
+ async listLinks(memoryId) {
160
+ await this.init();
161
+ return this.db.listLinks(memoryId);
162
+ }
163
+ async unlink(linkId) {
164
+ await this.init();
165
+ const link = await this.db.getLinkById(linkId);
166
+ if (!link) {
167
+ throw new Error(`Unknown link id: ${linkId}`);
168
+ }
169
+ const from = await this.read(link.from_memory_id);
170
+ const frontmatter = normalizeMemoryFrontmatter({
171
+ project: from.project_name,
172
+ kind: from.kind,
173
+ name: from.name,
174
+ tags: from.tags,
175
+ links: from.links.filter((candidate) => !(candidate.to === link.to_relative_path && candidate.type === link.type)),
176
+ created_at: from.created_at,
177
+ updated_at: new Date().toISOString(),
178
+ });
179
+ await writeMemory(this.config.memoryRoot, from.relative_path, frontmatter, from.body);
180
+ const parsed = await readMemory(this.config.memoryRoot, from.relative_path);
181
+ await this.db.upsertMemory(parsed);
182
+ await this.db.rebuildLinks();
183
+ return { text: `removed link ${linkId}` };
184
+ }
185
+ async search(input) {
186
+ await this.init();
187
+ const limit = input.limit ?? DEFAULT_SEARCH_LIMIT;
188
+ const maxChars = input.max_chars ?? DEFAULT_SEARCH_MAX_CHARS;
189
+ const includeLinked = input.include_linked ?? true;
190
+ const memories = (await this.db.listMemories()).filter((memory) => !input.kinds || input.kinds.includes(memory.kind));
191
+ const embeddings = await this.db.getAllEmbeddings();
192
+ const queryEmbedding = await this.embeddingProvider.embed(input.query).catch(() => undefined);
193
+ const links = includeLinked ? await this.db.getAllLinks() : [];
194
+ const direct = new Map();
195
+ for (const memory of memories) {
196
+ const semanticScore = queryEmbedding ? normalizedCosine(queryEmbedding, embeddings.get(memory.id)) : 0;
197
+ const lexScore = lexicalScore(input.query, searchDocument(memory));
198
+ const metadataScore = metadataScoreFor(input.project_name, memory);
199
+ const score = clamp01(semanticScore * 0.55 + lexScore * 0.25 + metadataScore * 0.1);
200
+ direct.set(memory.id, {
201
+ memory,
202
+ score,
203
+ semanticScore,
204
+ lexicalScore: lexScore,
205
+ linkScore: 0,
206
+ metadataScore,
207
+ });
208
+ }
209
+ const strongDirect = Array.from(direct.values())
210
+ .sort((a, b) => b.score - a.score)
211
+ .slice(0, Math.max(limit * 3, limit));
212
+ if (includeLinked) {
213
+ for (const directResult of strongDirect) {
214
+ for (const link of linksForMemory(links, directResult.memory.id)) {
215
+ const linkedId = link.from_memory_id === directResult.memory.id ? link.to_memory_id : link.from_memory_id;
216
+ const linked = direct.get(linkedId);
217
+ if (!linked) {
218
+ continue;
219
+ }
220
+ const linkScore = linkWeight(link.type) * directResult.score;
221
+ linked.linkScore = Math.max(linked.linkScore, linkScore);
222
+ linked.score = clamp01(linked.score + linkScore * 0.1);
223
+ linked.linkedFrom = directResult.memory.id;
224
+ linked.linkType = link.type;
225
+ }
226
+ }
227
+ }
228
+ const results = Array.from(direct.values())
229
+ .filter((result) => result.score > 0)
230
+ .sort((a, b) => b.score - a.score)
231
+ .slice(0, limit);
232
+ return {
233
+ results,
234
+ text: renderSearchText(input.query, results, maxChars),
235
+ };
236
+ }
237
+ async findSimilarMemory(projectId, kind, content) {
238
+ const candidates = await this.db.listMemoriesForProject(projectId, kind);
239
+ let best;
240
+ for (const memory of candidates) {
241
+ const score = lexicalScore(content, memory.body);
242
+ if (!best || score > best.score) {
243
+ best = { memory, score };
244
+ }
245
+ }
246
+ return best && best.score >= 0.92 ? best.memory : undefined;
247
+ }
248
+ async ensureEmbedding(memory) {
249
+ const existing = await this.db.getEmbedding(memory.id);
250
+ if (existing?.embeddedHash === memory.content_hash) {
251
+ return;
252
+ }
253
+ const vector = await this.embeddingProvider.embed(this.db.embeddingText(memory));
254
+ await this.db.upsertEmbedding(memory, this.embeddingProvider, vector);
255
+ }
256
+ }
257
+ function normalizeMemoryFrontmatter(input) {
258
+ return {
259
+ project: input.project,
260
+ kind: normalizeKind(input.kind),
261
+ name: input.name,
262
+ tags: input.tags ?? [],
263
+ links: input.links ?? [],
264
+ created_at: input.created_at,
265
+ updated_at: input.updated_at,
266
+ };
267
+ }
268
+ function mergeFrontmatterLink(links, link) {
269
+ if (links.some((candidate) => candidate.to === link.to && candidate.type === link.type)) {
270
+ return links;
271
+ }
272
+ return [...links, link];
273
+ }
274
+ function searchDocument(memory) {
275
+ return [
276
+ memory.project_name,
277
+ memory.kind,
278
+ memory.name,
279
+ memory.relative_path,
280
+ memory.tags.join(" "),
281
+ memory.body,
282
+ ].join("\n");
283
+ }
284
+ function normalizedCosine(queryEmbedding, memoryEmbedding) {
285
+ if (!memoryEmbedding) {
286
+ return 0;
287
+ }
288
+ return clamp01((cosineSimilarity(queryEmbedding, memoryEmbedding) + 1) / 2);
289
+ }
290
+ function metadataScoreFor(projectName, memory) {
291
+ if (!projectName) {
292
+ return clamp01(memory.density * 0.02);
293
+ }
294
+ if (memory.project_name === projectName) {
295
+ return 0.1;
296
+ }
297
+ const queryOrg = projectName.split("/")[0];
298
+ const memoryOrg = memory.project_name.split("/")[0];
299
+ return queryOrg && queryOrg === memoryOrg ? 0.04 : clamp01(memory.density * 0.02);
300
+ }
301
+ function linksForMemory(links, memoryId) {
302
+ return links.filter((link) => link.from_memory_id === memoryId || link.to_memory_id === memoryId);
303
+ }
304
+ function linkWeight(type) {
305
+ switch (type) {
306
+ case "IMPLEMENTS":
307
+ case "DEPENDS_ON":
308
+ return 0.9;
309
+ case "PARENT":
310
+ return 0.6;
311
+ case "BLOCKS":
312
+ return 0.45;
313
+ case "RELATED":
314
+ return 0.3;
315
+ }
316
+ }
317
+ function renderSearchText(query, results, maxChars) {
318
+ const parts = [`Relevant memories for \`${query}\`:\n`];
319
+ let used = parts[0].length;
320
+ for (const result of results) {
321
+ const memory = result.memory;
322
+ const linkAnnotation = result.linkedFrom && result.linkType ? ` link:${result.linkType} linked_from:${result.linkedFrom}` : "";
323
+ const header = `[memory:${memory.id} kind:${memory.kind} project:${memory.project_name} path:${memory.relative_path} score:${result.score.toFixed(2)}${linkAnnotation}]\n`;
324
+ const block = `${header}${memory.body.trim()}\n`;
325
+ if (used + block.length > maxChars) {
326
+ if (parts.length === 1) {
327
+ parts.push(`${header}[omitted: memory exceeds max_chars]\n`);
328
+ }
329
+ break;
330
+ }
331
+ parts.push(block);
332
+ used += block.length;
333
+ }
334
+ if (parts.length === 1) {
335
+ parts.push("No relevant memories found.\n");
336
+ }
337
+ return parts.join("\n");
338
+ }
339
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAEjH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAiBzE,MAAM,OAAO,cAAc;IAKN;IACA;IALV,EAAE,CAAkB;IACrB,WAAW,GAAG,KAAK,CAAC;IAE5B,YACmB,MAAqB,EACrB,oBAAuC,IAAI,6BAA6B,EAAE;QAD1E,WAAM,GAAN,MAAM,CAAe;QACrB,sBAAiB,GAAjB,iBAAiB,CAAyD;QAE3F,IAAI,CAAC,EAAE,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAA0B,EAAE;QAC5C,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,IAAI,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAa;QAC9B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACrB,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACpE,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACtE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBAC1D,OAAO,CAAC,KAAK,CAAC,wBAAwB,YAAY,GAAG,EAAE,KAAK,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QACnD,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,+BAA+B,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,0CAA0C,+BAA+B,aAAa,CAAC,CAAC;QAC1G,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,YAAoB,CAAC;QACzB,IAAI,QAAkC,CAAC;QACvC,IAAI,MAAM,GAA2B,SAAS,CAAC;QAE/C,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAClC,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC;YACtC,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAClE,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;YACvD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBACzE,IAAI,QAAQ,EAAE,CAAC;oBACb,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC;oBACtC,MAAM,GAAG,iBAAiB,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ;YACvB,CAAC,CAAC;gBACE,OAAO,EAAE,QAAQ,CAAC,YAAY;gBAC9B,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;gBACjC,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,UAAU,EAAE,GAAG;aAChB;YACH,CAAC,CAAC;gBACE,OAAO,EAAE,OAAO,CAAC,IAAI;gBACrB,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;gBACtB,KAAK,EAAE,EAAE;gBACT,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,GAAG;aAChB,CAAC;QAEN,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,0BAA0B,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7G,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC;QAE7B,OAAO;YACL,MAAM;YACN,MAAM;YACN,IAAI,EAAE,GAAG,MAAM,WAAW,MAAM,CAAC,EAAE,OAAO,MAAM,CAAC,aAAa,EAAE;SACjE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAU;QACnB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,YAAoB,EAAE,UAAkB,EAAE,SAAkB;QACrE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAE1C,MAAM,WAAW,GAAG,0BAA0B,CAAC;YAC7C,OAAO,EAAE,IAAI,CAAC,YAAY;YAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;YACvE,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC;QAEH,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5E,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,YAAY,KAAK,EAAE,CAAC,EAAE,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACpG,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,iBAAiB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,IAAI,EAAE;SACxD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC9B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,0BAA0B,CAAC;YAC7C,OAAO,EAAE,IAAI,CAAC,YAAY;YAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,gBAAgB,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;YAClH,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC;QACH,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5E,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,gBAAgB,MAAM,EAAE,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,oBAAoB,CAAC;QAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,IAAI,wBAAwB,CAAC;QAC7D,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC;QACnD,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,CACpD,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAC9D,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACpD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9F,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE/D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;QAC/C,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,cAAc,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvG,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;YACnE,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YACnE,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,GAAG,aAAa,GAAG,GAAG,CAAC,CAAC;YACpF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE;gBACpB,MAAM;gBACN,KAAK;gBACL,aAAa;gBACb,YAAY,EAAE,QAAQ;gBACtB,SAAS,EAAE,CAAC;gBACZ,aAAa;aACd,CAAC,CAAC;QACL,CAAC;QAED,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;aAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAExC,IAAI,aAAa,EAAE,CAAC;YAClB,KAAK,MAAM,YAAY,IAAI,YAAY,EAAE,CAAC;gBACxC,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;oBACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,KAAK,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;oBAC1G,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACpC,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,SAAS;oBACX,CAAC;oBACD,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;oBAC7D,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;oBACzD,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC;oBACvD,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC3C,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;aACxC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;aACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAEnB,OAAO;YACL,OAAO;YACP,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC;SACvD,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,SAAiB,EAAE,IAAY,EAAE,OAAe;QAC9E,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACzE,IAAI,IAAyD,CAAC;QAE9D,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChC,IAAI,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,MAAoB;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvD,IAAI,QAAQ,EAAE,YAAY,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC;YACnD,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QACjF,MAAM,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACxE,CAAC;CACF;AAED,SAAS,0BAA0B,CAAC,KAAwB;IAC1D,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;QACxB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAiC,EAAE,IAAwC;IACvG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,MAAoB;IAC1C,OAAO;QACL,MAAM,CAAC,YAAY;QACnB,MAAM,CAAC,IAAI;QACX,MAAM,CAAC,IAAI;QACX,MAAM,CAAC,aAAa;QACpB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACrB,MAAM,CAAC,IAAI;KACZ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,cAAwB,EAAE,eAAqC;IACvF,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,gBAAgB,CAAC,cAAc,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,gBAAgB,CAAC,WAA+B,EAAE,MAAoB;IAC7E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,KAAK,WAAW,EAAE,CAAC;QACxC,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,QAAQ,IAAI,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,cAAc,CAAC,KAAmB,EAAE,QAAgB;IAC3D,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,UAAU,CAAC,IAAwB;IAC1C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY,CAAC;QAClB,KAAK,YAAY;YACf,OAAO,GAAG,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,GAAG,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,OAAuB,EAAE,QAAgB;IAChF,MAAM,KAAK,GAAG,CAAC,2BAA2B,KAAK,OAAO,CAAC,CAAC;IACxD,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,MAAM,cAAc,GAClB,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,QAAQ,gBAAgB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1G,MAAM,MAAM,GAAG,WAAW,MAAM,CAAC,EAAE,SAAS,MAAM,CAAC,IAAI,YAAY,MAAM,CAAC,YAAY,SAAS,MAAM,CAAC,aAAa,UAAU,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,cAAc,KAAK,CAAC;QAC3K,MAAM,KAAK,GAAG,GAAG,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QAEjD,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,uCAAuC,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,95 @@
1
+ import type { LinkType, MemoryKind } from "./constants.js";
2
+ export interface ProjectRecord {
3
+ id: number;
4
+ name: string;
5
+ org: string;
6
+ repo: string;
7
+ source: string;
8
+ created_at: string;
9
+ updated_at: string;
10
+ }
11
+ export interface FrontmatterLink {
12
+ to: string;
13
+ type: LinkType;
14
+ }
15
+ export interface MemoryFrontmatter {
16
+ kind: MemoryKind;
17
+ project: string;
18
+ name: string;
19
+ tags: string[];
20
+ links: FrontmatterLink[];
21
+ created_at: string;
22
+ updated_at: string;
23
+ }
24
+ export interface ParsedMemory {
25
+ frontmatter: MemoryFrontmatter;
26
+ body: string;
27
+ relativePath: string;
28
+ absolutePath: string;
29
+ contentHash: string;
30
+ frontmatterHash: string;
31
+ size: number;
32
+ density: number;
33
+ mtime: number;
34
+ }
35
+ export interface MemoryRecord {
36
+ id: number;
37
+ project_id: number;
38
+ project_name: string;
39
+ kind: MemoryKind;
40
+ name: string;
41
+ relative_path: string;
42
+ content_hash: string;
43
+ frontmatter_hash: string;
44
+ size: number;
45
+ density: number;
46
+ mtime: number;
47
+ tags: string[];
48
+ links: FrontmatterLink[];
49
+ body: string;
50
+ created_at: string;
51
+ updated_at: string;
52
+ }
53
+ export interface LinkRecord {
54
+ id: number;
55
+ from_memory_id: number;
56
+ to_memory_id: number;
57
+ from_relative_path: string;
58
+ to_relative_path: string;
59
+ type: LinkType;
60
+ created_at: string;
61
+ }
62
+ export interface SearchInput {
63
+ project_name?: string;
64
+ query: string;
65
+ limit?: number;
66
+ max_chars?: number;
67
+ kinds?: MemoryKind[];
68
+ include_linked?: boolean;
69
+ }
70
+ export interface SearchResult {
71
+ memory: MemoryRecord;
72
+ score: number;
73
+ semanticScore: number;
74
+ lexicalScore: number;
75
+ linkScore: number;
76
+ metadataScore: number;
77
+ linkedFrom?: number;
78
+ linkType?: LinkType;
79
+ }
80
+ export interface UpsertInput {
81
+ project_id: number;
82
+ memory_id?: number;
83
+ kind?: MemoryKind;
84
+ name: string;
85
+ content: string;
86
+ tags?: string[];
87
+ }
88
+ export interface DaemonInfo {
89
+ pid: number;
90
+ endpoint: string;
91
+ token: string;
92
+ memoryRoot: string;
93
+ model: string;
94
+ startedAt: string;
95
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export declare function sha256(value: string): string;
2
+ export declare function gzipDensity(value: string): number;
3
+ export declare function stableJson(value: unknown): string;
@@ -0,0 +1,25 @@
1
+ import { createHash } from "node:crypto";
2
+ import { gzipSync } from "node:zlib";
3
+ export function sha256(value) {
4
+ return createHash("sha256").update(value).digest("hex");
5
+ }
6
+ export function gzipDensity(value) {
7
+ if (value.length === 0) {
8
+ return 0;
9
+ }
10
+ return gzipSync(value).byteLength / Buffer.byteLength(value, "utf8");
11
+ }
12
+ export function stableJson(value) {
13
+ return JSON.stringify(sortJson(value));
14
+ }
15
+ function sortJson(value) {
16
+ if (Array.isArray(value)) {
17
+ return value.map(sortJson);
18
+ }
19
+ if (value && typeof value === "object") {
20
+ const input = value;
21
+ return Object.fromEntries(Object.keys(input).sort().map((key) => [key, sortJson(input[key])]));
22
+ }
23
+ return value;
24
+ }
25
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/util/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,KAAgC,CAAC;QAC/C,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function tokens(value: string): string[];
2
+ export declare function lexicalScore(query: string, document: string): number;
3
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
4
+ export declare function clamp01(value: number): number;
@@ -0,0 +1,42 @@
1
+ const WORD_RE = /[a-z0-9_./-]+/gi;
2
+ export function tokens(value) {
3
+ return Array.from(value.toLowerCase().matchAll(WORD_RE), (match) => match[0]).filter((token) => token.length > 1);
4
+ }
5
+ export function lexicalScore(query, document) {
6
+ const queryTokens = new Set(tokens(query));
7
+ if (queryTokens.size === 0) {
8
+ return 0;
9
+ }
10
+ const documentTokens = new Set(tokens(document));
11
+ let hits = 0;
12
+ for (const token of queryTokens) {
13
+ if (documentTokens.has(token)) {
14
+ hits += 1;
15
+ }
16
+ }
17
+ return hits / queryTokens.size;
18
+ }
19
+ export function cosineSimilarity(a, b) {
20
+ if (a.length === 0 || a.length !== b.length) {
21
+ return 0;
22
+ }
23
+ let dot = 0;
24
+ let aMag = 0;
25
+ let bMag = 0;
26
+ for (let index = 0; index < a.length; index += 1) {
27
+ dot += a[index] * b[index];
28
+ aMag += a[index] * a[index];
29
+ bMag += b[index] * b[index];
30
+ }
31
+ if (aMag === 0 || bMag === 0) {
32
+ return 0;
33
+ }
34
+ return dot / (Math.sqrt(aMag) * Math.sqrt(bMag));
35
+ }
36
+ export function clamp01(value) {
37
+ if (!Number.isFinite(value)) {
38
+ return 0;
39
+ }
40
+ return Math.max(0, Math.min(1, value));
41
+ }
42
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/util/text.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,iBAAiB,CAAC;AAElC,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,QAAgB;IAC1D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACjD,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC"}