milens 0.6.2 → 0.6.3

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 (96) hide show
  1. package/README.md +157 -14
  2. package/dist/analyzer/engine.d.ts +1 -0
  3. package/dist/analyzer/engine.d.ts.map +1 -1
  4. package/dist/analyzer/engine.js +27 -8
  5. package/dist/analyzer/engine.js.map +1 -1
  6. package/dist/analyzer/review.d.ts +23 -0
  7. package/dist/analyzer/review.d.ts.map +1 -0
  8. package/dist/analyzer/review.js +143 -0
  9. package/dist/analyzer/review.js.map +1 -0
  10. package/dist/analyzer/testplan.d.ts +59 -0
  11. package/dist/analyzer/testplan.d.ts.map +1 -0
  12. package/dist/analyzer/testplan.js +218 -0
  13. package/dist/analyzer/testplan.js.map +1 -0
  14. package/dist/cli.js +2 -0
  15. package/dist/cli.js.map +1 -1
  16. package/dist/gateway/analyzer.d.ts +6 -0
  17. package/dist/gateway/analyzer.d.ts.map +1 -0
  18. package/dist/gateway/analyzer.js +218 -0
  19. package/dist/gateway/analyzer.js.map +1 -0
  20. package/dist/gateway/cache.d.ts +35 -0
  21. package/dist/gateway/cache.d.ts.map +1 -0
  22. package/dist/gateway/cache.js +175 -0
  23. package/dist/gateway/cache.js.map +1 -0
  24. package/dist/gateway/config.d.ts +10 -0
  25. package/dist/gateway/config.d.ts.map +1 -0
  26. package/dist/gateway/config.js +167 -0
  27. package/dist/gateway/config.js.map +1 -0
  28. package/dist/gateway/context-memory.d.ts +68 -0
  29. package/dist/gateway/context-memory.d.ts.map +1 -0
  30. package/dist/gateway/context-memory.js +157 -0
  31. package/dist/gateway/context-memory.js.map +1 -0
  32. package/dist/gateway/observability.d.ts +83 -0
  33. package/dist/gateway/observability.d.ts.map +1 -0
  34. package/dist/gateway/observability.js +152 -0
  35. package/dist/gateway/observability.js.map +1 -0
  36. package/dist/gateway/privacy.d.ts +27 -0
  37. package/dist/gateway/privacy.d.ts.map +1 -0
  38. package/dist/gateway/privacy.js +139 -0
  39. package/dist/gateway/privacy.js.map +1 -0
  40. package/dist/gateway/providers.d.ts +66 -0
  41. package/dist/gateway/providers.d.ts.map +1 -0
  42. package/dist/gateway/providers.js +377 -0
  43. package/dist/gateway/providers.js.map +1 -0
  44. package/dist/gateway/router.d.ts +18 -0
  45. package/dist/gateway/router.d.ts.map +1 -0
  46. package/dist/gateway/router.js +102 -0
  47. package/dist/gateway/router.js.map +1 -0
  48. package/dist/gateway/server.d.ts +20 -0
  49. package/dist/gateway/server.d.ts.map +1 -0
  50. package/dist/gateway/server.js +387 -0
  51. package/dist/gateway/server.js.map +1 -0
  52. package/dist/gateway/translator.d.ts +19 -0
  53. package/dist/gateway/translator.d.ts.map +1 -0
  54. package/dist/gateway/translator.js +340 -0
  55. package/dist/gateway/translator.js.map +1 -0
  56. package/dist/gateway/types.d.ts +215 -0
  57. package/dist/gateway/types.d.ts.map +1 -0
  58. package/dist/gateway/types.js +3 -0
  59. package/dist/gateway/types.js.map +1 -0
  60. package/dist/parser/extract.d.ts +1 -0
  61. package/dist/parser/extract.d.ts.map +1 -1
  62. package/dist/parser/extract.js +8 -0
  63. package/dist/parser/extract.js.map +1 -1
  64. package/dist/parser/lang-go.d.ts.map +1 -1
  65. package/dist/parser/lang-go.js +41 -5
  66. package/dist/parser/lang-go.js.map +1 -1
  67. package/dist/parser/lang-java.d.ts.map +1 -1
  68. package/dist/parser/lang-java.js +1 -0
  69. package/dist/parser/lang-java.js.map +1 -1
  70. package/dist/parser/lang-py.d.ts.map +1 -1
  71. package/dist/parser/lang-py.js +22 -0
  72. package/dist/parser/lang-py.js.map +1 -1
  73. package/dist/parser/lang-ruby.d.ts.map +1 -1
  74. package/dist/parser/lang-ruby.js +1 -0
  75. package/dist/parser/lang-ruby.js.map +1 -1
  76. package/dist/server/mcp.d.ts.map +1 -1
  77. package/dist/server/mcp.js +615 -106
  78. package/dist/server/mcp.js.map +1 -1
  79. package/dist/skills.js +32 -0
  80. package/dist/skills.js.map +1 -1
  81. package/dist/store/db.d.ts +44 -0
  82. package/dist/store/db.d.ts.map +1 -1
  83. package/dist/store/db.js +142 -25
  84. package/dist/store/db.js.map +1 -1
  85. package/dist/store/gateway-schema.sql +53 -0
  86. package/dist/store/schema.sql +33 -0
  87. package/dist/store/vectors.d.ts +65 -0
  88. package/dist/store/vectors.d.ts.map +1 -0
  89. package/dist/store/vectors.js +212 -0
  90. package/dist/store/vectors.js.map +1 -0
  91. package/dist/utils.d.ts +3 -0
  92. package/dist/utils.d.ts.map +1 -0
  93. package/dist/utils.js +9 -0
  94. package/dist/utils.js.map +1 -0
  95. package/docs/diagram2.svg +1 -1
  96. package/package.json +2 -1
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Vector embeddings for semantic code search.
3
+ *
4
+ * Two providers:
5
+ * - Built-in TF-IDF: zero-dependency, fast, no model download. Good baseline.
6
+ * - Neural (optional): requires `@xenova/transformers` peer dep for real semantic embeddings.
7
+ *
8
+ * Architecture: embeddings stored as BLOBs in SQLite, cosine similarity search.
9
+ */
10
+ // ── Cosine similarity ──
11
+ function cosineSimilarity(a, b) {
12
+ let dot = 0, normA = 0, normB = 0;
13
+ for (let i = 0; i < a.length; i++) {
14
+ dot += a[i] * b[i];
15
+ normA += a[i] * a[i];
16
+ normB += b[i] * b[i];
17
+ }
18
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
19
+ return denom === 0 ? 0 : dot / denom;
20
+ }
21
+ // ── Built-in TF-IDF provider (zero dependencies) ──
22
+ /** Simple bag-of-words with IDF weighting. Fixed 256-dimension hash-based. */
23
+ export class TfIdfProvider {
24
+ name = 'tfidf-256';
25
+ dimensions = 256;
26
+ // Corpus stats for IDF
27
+ docCount = 0;
28
+ termDocFreq = new Map();
29
+ async init() { }
30
+ /** Feed corpus to build IDF weights (call before embed for best results) */
31
+ trainIdf(documents) {
32
+ this.docCount = documents.length;
33
+ this.termDocFreq.clear();
34
+ for (const doc of documents) {
35
+ const uniqueTerms = new Set(this.tokenize(doc));
36
+ for (const term of uniqueTerms) {
37
+ this.termDocFreq.set(term, (this.termDocFreq.get(term) ?? 0) + 1);
38
+ }
39
+ }
40
+ }
41
+ async embed(text) {
42
+ const tokens = this.tokenize(text);
43
+ const vec = new Float32Array(this.dimensions);
44
+ // Count term frequencies
45
+ const tf = new Map();
46
+ for (const t of tokens)
47
+ tf.set(t, (tf.get(t) ?? 0) + 1);
48
+ // Hash each term to a dimension bucket, weighted by TF-IDF
49
+ for (const [term, count] of tf) {
50
+ const idf = this.docCount > 0
51
+ ? Math.log(1 + this.docCount / (1 + (this.termDocFreq.get(term) ?? 0)))
52
+ : 1;
53
+ const tfidf = (count / tokens.length) * idf;
54
+ // Deterministic hash → bucket
55
+ const bucket = this.hash(term) % this.dimensions;
56
+ // Use +/- based on secondary hash to reduce collisions
57
+ const sign = this.hash(term + '_sign') % 2 === 0 ? 1 : -1;
58
+ vec[bucket] += sign * tfidf;
59
+ }
60
+ // L2 normalize
61
+ let norm = 0;
62
+ for (let i = 0; i < vec.length; i++)
63
+ norm += vec[i] * vec[i];
64
+ norm = Math.sqrt(norm);
65
+ if (norm > 0)
66
+ for (let i = 0; i < vec.length; i++)
67
+ vec[i] /= norm;
68
+ return vec;
69
+ }
70
+ async embedBatch(texts) {
71
+ return Promise.all(texts.map(t => this.embed(t)));
72
+ }
73
+ tokenize(text) {
74
+ return text
75
+ .toLowerCase()
76
+ // Split camelCase/PascalCase
77
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
78
+ // Split on non-alphanumeric
79
+ .split(/[^a-z0-9]+/)
80
+ .filter(t => t.length > 1);
81
+ }
82
+ hash(str) {
83
+ let h = 0x811c9dc5;
84
+ for (let i = 0; i < str.length; i++) {
85
+ h ^= str.charCodeAt(i);
86
+ h = Math.imul(h, 0x01000193);
87
+ }
88
+ return h >>> 0; // unsigned
89
+ }
90
+ }
91
+ // ── Neural provider (optional, requires @xenova/transformers) ──
92
+ export class NeuralProvider {
93
+ modelId;
94
+ name;
95
+ dimensions;
96
+ pipeline = null;
97
+ constructor(modelId = 'Xenova/all-MiniLM-L6-v2', dims = 384) {
98
+ this.modelId = modelId;
99
+ this.name = `neural-${modelId.split('/').pop()}`;
100
+ this.dimensions = dims;
101
+ }
102
+ async init() {
103
+ try {
104
+ // Dynamic import — package is optional peer dependency
105
+ const mod = await import(/* webpackIgnore: true */ '@xenova/transformers');
106
+ this.pipeline = await mod.pipeline('feature-extraction', this.modelId, {
107
+ quantized: true,
108
+ });
109
+ }
110
+ catch {
111
+ throw new Error(`Neural embeddings require @xenova/transformers. Install: npm i @xenova/transformers`);
112
+ }
113
+ }
114
+ async embed(text) {
115
+ if (!this.pipeline)
116
+ await this.init();
117
+ const output = await this.pipeline(text, { pooling: 'mean', normalize: true });
118
+ return new Float32Array(output.data);
119
+ }
120
+ async embedBatch(texts) {
121
+ // Process in small batches to avoid OOM
122
+ const results = [];
123
+ const batchSize = 32;
124
+ for (let i = 0; i < texts.length; i += batchSize) {
125
+ const batch = texts.slice(i, i + batchSize);
126
+ const outputs = await Promise.all(batch.map(t => this.embed(t)));
127
+ results.push(...outputs);
128
+ }
129
+ return results;
130
+ }
131
+ }
132
+ // ── Embedding store (SQL operations) ──
133
+ export class EmbeddingStore {
134
+ db;
135
+ dimensions;
136
+ stmts;
137
+ constructor(db, dimensions) {
138
+ this.db = db;
139
+ this.dimensions = dimensions;
140
+ this.stmts = {
141
+ upsert: db.prepare(`INSERT INTO symbol_embeddings (symbol_id, embedding, model, updated_at)
142
+ VALUES (?, ?, ?, datetime('now'))
143
+ ON CONFLICT(symbol_id) DO UPDATE SET embedding = excluded.embedding, model = excluded.model, updated_at = datetime('now')`),
144
+ get: db.prepare('SELECT embedding FROM symbol_embeddings WHERE symbol_id = ?'),
145
+ getAll: db.prepare('SELECT symbol_id, embedding FROM symbol_embeddings'),
146
+ count: db.prepare('SELECT COUNT(*) as c FROM symbol_embeddings'),
147
+ delete: db.prepare('DELETE FROM symbol_embeddings WHERE symbol_id = ?'),
148
+ };
149
+ }
150
+ store(symbolId, embedding, model) {
151
+ const buf = Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength);
152
+ this.stmts.upsert.run(symbolId, buf, model);
153
+ }
154
+ get(symbolId) {
155
+ const row = this.stmts.get.get(symbolId);
156
+ if (!row)
157
+ return null;
158
+ const buf = row.embedding;
159
+ if (buf.byteLength < this.dimensions * 4)
160
+ return null; // corrupted/mismatched
161
+ // Copy to avoid byteOffset issues with SQLite Buffers
162
+ const copy = new Float32Array(this.dimensions);
163
+ copy.set(new Float32Array(buf.buffer, buf.byteOffset, this.dimensions));
164
+ return copy;
165
+ }
166
+ count() {
167
+ return this.stmts.count.get().c;
168
+ }
169
+ /** Brute-force cosine search across all stored embeddings.
170
+ * Uses iterate() to avoid loading all rows into a JS array at once,
171
+ * and maintains a bounded top-K result set during scanning. */
172
+ searchSimilar(queryVec, limit, excludeId) {
173
+ const results = [];
174
+ let minScore = -Infinity;
175
+ for (const row of this.stmts.getAll.iterate()) {
176
+ if (excludeId && row.symbol_id === excludeId)
177
+ continue;
178
+ const buf = row.embedding;
179
+ if (buf.byteLength < this.dimensions * 4)
180
+ continue; // skip corrupted
181
+ // Copy to own buffer to avoid shared ArrayBuffer offset issues
182
+ const vec = new Float32Array(this.dimensions);
183
+ vec.set(new Float32Array(buf.buffer, buf.byteOffset, this.dimensions));
184
+ const score = cosineSimilarity(queryVec, vec);
185
+ if (results.length < limit) {
186
+ results.push({ symbolId: row.symbol_id, score });
187
+ if (results.length === limit) {
188
+ results.sort((a, b) => b.score - a.score);
189
+ minScore = results[results.length - 1].score;
190
+ }
191
+ }
192
+ else if (score > minScore) {
193
+ results[results.length - 1] = { symbolId: row.symbol_id, score };
194
+ results.sort((a, b) => b.score - a.score);
195
+ minScore = results[results.length - 1].score;
196
+ }
197
+ }
198
+ if (results.length < limit) {
199
+ results.sort((a, b) => b.score - a.score);
200
+ }
201
+ return results;
202
+ }
203
+ }
204
+ // ── Embedding text builder ──
205
+ export function buildEmbeddingText(sym) {
206
+ const parts = [sym.kind, sym.name];
207
+ if (sym.signature)
208
+ parts.push(sym.signature);
209
+ parts.push('in', sym.filePath);
210
+ return parts.join(' ');
211
+ }
212
+ //# sourceMappingURL=vectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vectors.js","sourceRoot":"","sources":["../../src/store/vectors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Check if a file path looks like a test/spec file */
2
+ export declare function isTestFile(filePath: string): boolean;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMpD"}
package/dist/utils.js ADDED
@@ -0,0 +1,9 @@
1
+ /** Check if a file path looks like a test/spec file */
2
+ export function isTestFile(filePath) {
3
+ return /\.(test|spec)\.[jt]sx?$/.test(filePath) ||
4
+ /(^|[\/\\])tests?[\/\\]/.test(filePath) ||
5
+ /__tests__[/\\]/.test(filePath) ||
6
+ /_test\.(go|py|rb|rs|java|php)$/.test(filePath) ||
7
+ /^test_.*\.py$/.test(filePath.split('/').pop() ?? '');
8
+ }
9
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC7C,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACvC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC/B,gCAAgC,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC/C,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1D,CAAC"}
package/docs/diagram2.svg CHANGED
@@ -1 +1 @@
1
- <svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 1703.05px; background-color: transparent;" viewBox="0 0 1703.046875 348" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#my-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#my-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#my-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#my-svg .error-icon{fill:#552222;}#my-svg .error-text{fill:#552222;stroke:#552222;}#my-svg .edge-thickness-normal{stroke-width:1px;}#my-svg .edge-thickness-thick{stroke-width:3.5px;}#my-svg .edge-pattern-solid{stroke-dasharray:0;}#my-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#my-svg .edge-pattern-dashed{stroke-dasharray:3;}#my-svg .edge-pattern-dotted{stroke-dasharray:2;}#my-svg .marker{fill:#333333;stroke:#333333;}#my-svg .marker.cross{stroke:#333333;}#my-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#my-svg p{margin:0;}#my-svg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#my-svg .cluster-label text{fill:#333;}#my-svg .cluster-label span{color:#333;}#my-svg .cluster-label span p{background-color:transparent;}#my-svg .label text,#my-svg span{fill:#333;color:#333;}#my-svg .node rect,#my-svg .node circle,#my-svg .node ellipse,#my-svg .node polygon,#my-svg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#my-svg .rough-node .label text,#my-svg .node .label text,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-anchor:middle;}#my-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#my-svg .rough-node .label,#my-svg .node .label,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-align:center;}#my-svg .node.clickable{cursor:pointer;}#my-svg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#my-svg .arrowheadPath{fill:#333333;}#my-svg .edgePath .path{stroke:#333333;stroke-width:1px;}#my-svg .flowchart-link{stroke:#333333;fill:none;}#my-svg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#my-svg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#my-svg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#my-svg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#my-svg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#my-svg .cluster text{fill:#333;}#my-svg .cluster span{color:#333;}#my-svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#my-svg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#my-svg rect.text{fill:none;stroke-width:0;}#my-svg .icon-shape,#my-svg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#my-svg .icon-shape p,#my-svg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#my-svg .icon-shape .label rect,#my-svg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#my-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#my-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#my-svg .node .neo-node{stroke:#9370DB;}#my-svg [data-look="neo"].node rect,#my-svg [data-look="neo"].cluster rect,#my-svg [data-look="neo"].node polygon{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].node path{stroke:#9370DB;stroke-width:1px;}#my-svg [data-look="neo"].node .outer-path{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].node .neo-line path{stroke:#9370DB;filter:none;}#my-svg [data-look="neo"].node circle{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].node circle .state-start{fill:#000000;}#my-svg [data-look="neo"].icon-shape .icon{fill:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].icon-shape .icon-neo path{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker id="my-svg_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="4.5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 5 L 10 10 L 10 0 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointEnd-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="11.5" refY="7" markerUnits="userSpaceOnUse" markerWidth="10.5" markerHeight="14" orient="auto"><path d="M 0 0 L 11.5 7 L 0 14 z" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointStart-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="1" refY="7" markerUnits="userSpaceOnUse" markerWidth="11.5" markerHeight="14" orient="auto"><polygon points="0,7 11.5,14 11.5,0" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="11" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-1" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleEnd-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refY="5" refX="12.25" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleStart-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-2" refY="5" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossEnd" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="12" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossStart" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="-1" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossEnd-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="17.7" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"><path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5;"/></marker><marker id="my-svg_flowchart-v2-crossStart-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="-3.5" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"><path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5; stroke-dasharray: 1, 0;"/></marker><g class="root"><g class="clusters"><g class="cluster" id="my-svg-Serve" data-look="classic"><rect style="" x="1278.6875" y="8" width="193.75" height="332"/><g class="cluster-label" transform="translate(1335.6640625, 8)"><foreignObject width="79.796875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5;"><span class="nodeLabel"><p>MCP Server</p></span></div></foreignObject></g></g><g class="cluster" id="my-svg-Pipeline" data-look="classic"><rect style="" x="8" y="24" width="1220.6875" height="280"/><g class="cluster-label" transform="translate(557.2734375, 24)"><foreignObject width="122.140625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5;"><span class="nodeLabel"><p>Indexing Pipeline</p></span></div></foreignObject></g></g></g><g class="edgePaths"><path d="M211.172,174L215.339,174C219.505,174,227.839,174,235.505,174C243.172,174,250.172,174,253.672,174L257.172,174" id="my-svg-L_Scan_Parse_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Scan_Parse_0" data-points="W3sieCI6MjExLjE3MTg3NSwieSI6MTc0fSx7IngiOjIzNi4xNzE4NzUsInkiOjE3NH0seyJ4IjoyNjEuMTcxODc1LCJ5IjoxNzR9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M441.266,174L445.432,174C449.599,174,457.932,174,465.599,174C473.266,174,480.266,174,483.766,174L487.266,174" id="my-svg-L_Parse_Resolve_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Parse_Resolve_0" data-points="W3sieCI6NDQxLjI2NTYyNSwieSI6MTc0fSx7IngiOjQ2Ni4yNjU2MjUsInkiOjE3NH0seyJ4Ijo0OTEuMjY1NjI1LCJ5IjoxNzR9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M728.688,174L732.854,174C737.021,174,745.354,174,753.021,174C760.688,174,767.688,174,771.188,174L774.688,174" id="my-svg-L_Resolve_Enrich_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Resolve_Enrich_0" data-points="W3sieCI6NzI4LjY4NzUsInkiOjE3NH0seyJ4Ijo3NTMuNjg3NSwieSI6MTc0fSx7IngiOjc3OC42ODc1LCJ5IjoxNzR9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M995.641,174L999.807,174C1003.974,174,1012.307,174,1019.974,174C1027.641,174,1034.641,174,1038.141,174L1041.641,174" id="my-svg-L_Enrich_Store_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Enrich_Store_0" data-points="W3sieCI6OTk1LjY0MDYyNSwieSI6MTc0fSx7IngiOjEwMjAuNjQwNjI1LCJ5IjoxNzR9LHsieCI6MTA0NS42NDA2MjUsInkiOjE3NH1d" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1163.673,135L1174.509,124.167C1185.344,113.333,1207.016,91.667,1222.018,80.833C1237.021,70,1245.354,70,1253.688,70C1262.021,70,1270.354,70,1280.251,70C1290.148,70,1301.609,70,1307.34,70L1313.07,70" id="my-svg-L_Store_Tools_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Store_Tools_0" data-points="W3sieCI6MTE2My42NzI4NTE1NjI1LCJ5IjoxMzV9LHsieCI6MTIyOC42ODc1LCJ5Ijo3MH0seyJ4IjoxMjUzLjY4NzUsInkiOjcwfSx7IngiOjEyNzguNjg3NSwieSI6NzB9LHsieCI6MTMxNy4wNzAzMTI1LCJ5Ijo3MH1d" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1203.688,174L1207.854,174C1212.021,174,1220.354,174,1228.688,174C1237.021,174,1245.354,174,1253.688,174C1262.021,174,1270.354,174,1278.021,174C1285.688,174,1292.688,174,1296.188,174L1299.688,174" id="my-svg-L_Store_Resources_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Store_Resources_0" data-points="W3sieCI6MTIwMy42ODc1LCJ5IjoxNzR9LHsieCI6MTIyOC42ODc1LCJ5IjoxNzR9LHsieCI6MTI1My42ODc1LCJ5IjoxNzR9LHsieCI6MTI3OC42ODc1LCJ5IjoxNzR9LHsieCI6MTMwMy42ODc1LCJ5IjoxNzR9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1163.673,213L1174.509,223.833C1185.344,234.667,1207.016,256.333,1222.018,267.167C1237.021,278,1245.354,278,1253.688,278C1262.021,278,1270.354,278,1279.066,278C1287.779,278,1296.87,278,1301.415,278L1305.961,278" id="my-svg-L_Store_Prompts_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Store_Prompts_0" data-points="W3sieCI6MTE2My42NzI4NTE1NjI1LCJ5IjoyMTN9LHsieCI6MTIyOC42ODc1LCJ5IjoyNzh9LHsieCI6MTI1My42ODc1LCJ5IjoyNzh9LHsieCI6MTI3OC42ODc1LCJ5IjoyNzh9LHsieCI6MTMwOS45NjA5Mzc1LCJ5IjoyNzh9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1434.055,70L1440.452,70C1446.849,70,1459.643,70,1470.207,70C1480.771,70,1489.104,70,1502.237,78.378C1515.371,86.756,1533.304,103.513,1542.271,111.891L1551.237,120.269" id="my-svg-L_Tools_Agent_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Tools_Agent_0" data-points="W3sieCI6MTQzNC4wNTQ2ODc1LCJ5Ijo3MH0seyJ4IjoxNDcyLjQzNzUsInkiOjcwfSx7IngiOjE0OTcuNDM3NSwieSI6NzB9LHsieCI6MTU1NC4xNjAwODExMjk4MDc2LCJ5IjoxMjN9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1447.438,174L1451.604,174C1455.771,174,1464.104,174,1472.438,174C1480.771,174,1489.104,174,1496.771,174C1504.438,174,1511.438,174,1514.938,174L1518.438,174" id="my-svg-L_Resources_Agent_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Resources_Agent_0" data-points="W3sieCI6MTQ0Ny40Mzc1LCJ5IjoxNzR9LHsieCI6MTQ3Mi40Mzc1LCJ5IjoxNzR9LHsieCI6MTQ5Ny40Mzc1LCJ5IjoxNzR9LHsieCI6MTUyMi40Mzc1LCJ5IjoxNzR9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1441.164,278L1446.376,278C1451.589,278,1462.013,278,1471.392,278C1480.771,278,1489.104,278,1502.237,269.622C1515.371,261.244,1533.304,244.487,1542.271,236.109L1551.237,227.731" id="my-svg-L_Prompts_Agent_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Prompts_Agent_0" data-points="W3sieCI6MTQ0MS4xNjQwNjI1LCJ5IjoyNzh9LHsieCI6MTQ3Mi40Mzc1LCJ5IjoyNzh9LHsieCI6MTQ5Ny40Mzc1LCJ5IjoyNzh9LHsieCI6MTU1NC4xNjAwODExMjk4MDc2LCJ5IjoyMjV9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/></g><g class="edgeLabels"><g class="edgeLabel"><g class="label" data-id="L_Scan_Parse_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Parse_Resolve_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Resolve_Enrich_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Enrich_Store_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Store_Tools_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Store_Resources_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Store_Prompts_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Tools_Agent_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Resources_Agent_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Prompts_Agent_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g></g><g class="nodes"><g class="node default" id="my-svg-flowchart-Scan-0" data-look="classic" transform="translate(122.0859375, 174)"><rect class="basic label-container" style="" x="-89.0859375" y="-39" width="178.171875" height="78"/><g class="label" style="" transform="translate(-59.0859375, -24)"><rect/><foreignObject width="118.171875" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>📁 Scan<br />.gitignore aware</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Parse-1" data-look="classic" transform="translate(351.21875, 174)"><rect class="basic label-container" style="" x="-90.046875" y="-39" width="180.09375" height="78"/><g class="label" style="" transform="translate(-60.046875, -24)"><rect/><foreignObject width="120.09375" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>🌳 Parse<br />tree-sitter WASM</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Resolve-2" data-look="classic" transform="translate(609.9765625, 174)"><rect class="basic label-container" style="" x="-118.7109375" y="-39" width="237.421875" height="78"/><g class="label" style="" transform="translate(-88.7109375, -24)"><rect/><foreignObject width="177.421875" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>🔗 Resolve<br />imports · calls · heritage</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Enrich-3" data-look="classic" transform="translate(887.1640625, 174)"><rect class="basic label-container" style="" x="-108.4765625" y="-39" width="216.953125" height="78"/><g class="label" style="" transform="translate(-78.4765625, -24)"><rect/><foreignObject width="156.953125" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>⚡ Enrich<br />roles · heat · domains</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Store-4" data-look="classic" transform="translate(1124.6640625, 174)"><rect class="basic label-container" style="" x="-79.0234375" y="-39" width="158.046875" height="78"/><g class="label" style="" transform="translate(-49.0234375, -24)"><rect/><foreignObject width="98.046875" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>💾 Store<br />SQLite + FTS5</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Tools-5" data-look="classic" transform="translate(1375.5625, 70)"><rect class="basic label-container" style="" x="-58.4921875" y="-27" width="116.984375" height="54"/><g class="label" style="" transform="translate(-28.4921875, -12)"><rect/><foreignObject width="56.984375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>19 Tools</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Resources-6" data-look="classic" transform="translate(1375.5625, 174)"><rect class="basic label-container" style="" x="-71.875" y="-27" width="143.75" height="54"/><g class="label" style="" transform="translate(-41.875, -12)"><rect/><foreignObject width="83.75" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>4 Resources</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Prompts-7" data-look="classic" transform="translate(1375.5625, 278)"><rect class="basic label-container" style="" x="-65.6015625" y="-27" width="131.203125" height="54"/><g class="label" style="" transform="translate(-35.6015625, -12)"><rect/><foreignObject width="71.203125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>3 Prompts</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Agent-19" data-look="classic" transform="translate(1608.7421875, 174)"><rect class="basic label-container" style="" x="-86.3046875" y="-51" width="172.609375" height="102"/><g class="label" style="" transform="translate(-56.3046875, -36)"><rect/><foreignObject width="112.609375" height="72"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>🤖 AI Agent<br />Copilot · Cursor<br />Claude · Codex</p></span></div></foreignObject></g></g></g></g></g><defs><filter id="my-svg-drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs><defs><filter id="my-svg-drop-shadow-small" height="150%" width="150%"><feDropShadow dx="2" dy="2" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs></svg>
1
+ <svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 1703.05px; background-color: transparent;" viewBox="0 0 1703.046875 348" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#my-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#my-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#my-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#my-svg .error-icon{fill:#552222;}#my-svg .error-text{fill:#552222;stroke:#552222;}#my-svg .edge-thickness-normal{stroke-width:1px;}#my-svg .edge-thickness-thick{stroke-width:3.5px;}#my-svg .edge-pattern-solid{stroke-dasharray:0;}#my-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#my-svg .edge-pattern-dashed{stroke-dasharray:3;}#my-svg .edge-pattern-dotted{stroke-dasharray:2;}#my-svg .marker{fill:#333333;stroke:#333333;}#my-svg .marker.cross{stroke:#333333;}#my-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#my-svg p{margin:0;}#my-svg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#my-svg .cluster-label text{fill:#333;}#my-svg .cluster-label span{color:#333;}#my-svg .cluster-label span p{background-color:transparent;}#my-svg .label text,#my-svg span{fill:#333;color:#333;}#my-svg .node rect,#my-svg .node circle,#my-svg .node ellipse,#my-svg .node polygon,#my-svg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#my-svg .rough-node .label text,#my-svg .node .label text,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-anchor:middle;}#my-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#my-svg .rough-node .label,#my-svg .node .label,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-align:center;}#my-svg .node.clickable{cursor:pointer;}#my-svg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#my-svg .arrowheadPath{fill:#333333;}#my-svg .edgePath .path{stroke:#333333;stroke-width:1px;}#my-svg .flowchart-link{stroke:#333333;fill:none;}#my-svg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#my-svg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#my-svg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#my-svg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#my-svg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#my-svg .cluster text{fill:#333;}#my-svg .cluster span{color:#333;}#my-svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#my-svg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#my-svg rect.text{fill:none;stroke-width:0;}#my-svg .icon-shape,#my-svg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#my-svg .icon-shape p,#my-svg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#my-svg .icon-shape .label rect,#my-svg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#my-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#my-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#my-svg .node .neo-node{stroke:#9370DB;}#my-svg [data-look="neo"].node rect,#my-svg [data-look="neo"].cluster rect,#my-svg [data-look="neo"].node polygon{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].node path{stroke:#9370DB;stroke-width:1px;}#my-svg [data-look="neo"].node .outer-path{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].node .neo-line path{stroke:#9370DB;filter:none;}#my-svg [data-look="neo"].node circle{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].node circle .state-start{fill:#000000;}#my-svg [data-look="neo"].icon-shape .icon{fill:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg [data-look="neo"].icon-shape .icon-neo path{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#my-svg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker id="my-svg_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="4.5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 5 L 10 10 L 10 0 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointEnd-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="11.5" refY="7" markerUnits="userSpaceOnUse" markerWidth="10.5" markerHeight="14" orient="auto"><path d="M 0 0 L 11.5 7 L 0 14 z" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointStart-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="1" refY="7" markerUnits="userSpaceOnUse" markerWidth="11.5" markerHeight="14" orient="auto"><polygon points="0,7 11.5,14 11.5,0" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="11" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-1" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleEnd-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refY="5" refX="12.25" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleStart-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-2" refY="5" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossEnd" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="12" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossStart" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="-1" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossEnd-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="17.7" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"><path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5;"/></marker><marker id="my-svg_flowchart-v2-crossStart-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="-3.5" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"><path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5; stroke-dasharray: 1, 0;"/></marker><g class="root"><g class="clusters"><g class="cluster" id="my-svg-Serve" data-look="classic"><rect style="" x="1278.6875" y="8" width="193.75" height="332"/><g class="cluster-label" transform="translate(1335.6640625, 8)"><foreignObject width="79.796875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5;"><span class="nodeLabel"><p>MCP Server</p></span></div></foreignObject></g></g><g class="cluster" id="my-svg-Pipeline" data-look="classic"><rect style="" x="8" y="24" width="1220.6875" height="280"/><g class="cluster-label" transform="translate(557.2734375, 24)"><foreignObject width="122.140625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5;"><span class="nodeLabel"><p>Indexing Pipeline</p></span></div></foreignObject></g></g></g><g class="edgePaths"><path d="M211.172,174L215.339,174C219.505,174,227.839,174,235.505,174C243.172,174,250.172,174,253.672,174L257.172,174" id="my-svg-L_Scan_Parse_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Scan_Parse_0" data-points="W3sieCI6MjExLjE3MTg3NSwieSI6MTc0fSx7IngiOjIzNi4xNzE4NzUsInkiOjE3NH0seyJ4IjoyNjEuMTcxODc1LCJ5IjoxNzR9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M441.266,174L445.432,174C449.599,174,457.932,174,465.599,174C473.266,174,480.266,174,483.766,174L487.266,174" id="my-svg-L_Parse_Resolve_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Parse_Resolve_0" data-points="W3sieCI6NDQxLjI2NTYyNSwieSI6MTc0fSx7IngiOjQ2Ni4yNjU2MjUsInkiOjE3NH0seyJ4Ijo0OTEuMjY1NjI1LCJ5IjoxNzR9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M728.688,174L732.854,174C737.021,174,745.354,174,753.021,174C760.688,174,767.688,174,771.188,174L774.688,174" id="my-svg-L_Resolve_Enrich_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Resolve_Enrich_0" data-points="W3sieCI6NzI4LjY4NzUsInkiOjE3NH0seyJ4Ijo3NTMuNjg3NSwieSI6MTc0fSx7IngiOjc3OC42ODc1LCJ5IjoxNzR9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M995.641,174L999.807,174C1003.974,174,1012.307,174,1019.974,174C1027.641,174,1034.641,174,1038.141,174L1041.641,174" id="my-svg-L_Enrich_Store_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Enrich_Store_0" data-points="W3sieCI6OTk1LjY0MDYyNSwieSI6MTc0fSx7IngiOjEwMjAuNjQwNjI1LCJ5IjoxNzR9LHsieCI6MTA0NS42NDA2MjUsInkiOjE3NH1d" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1163.673,135L1174.509,124.167C1185.344,113.333,1207.016,91.667,1222.018,80.833C1237.021,70,1245.354,70,1253.688,70C1262.021,70,1270.354,70,1280.251,70C1290.148,70,1301.609,70,1307.34,70L1313.07,70" id="my-svg-L_Store_Tools_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Store_Tools_0" data-points="W3sieCI6MTE2My42NzI4NTE1NjI1LCJ5IjoxMzV9LHsieCI6MTIyOC42ODc1LCJ5Ijo3MH0seyJ4IjoxMjUzLjY4NzUsInkiOjcwfSx7IngiOjEyNzguNjg3NSwieSI6NzB9LHsieCI6MTMxNy4wNzAzMTI1LCJ5Ijo3MH1d" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1203.688,174L1207.854,174C1212.021,174,1220.354,174,1228.688,174C1237.021,174,1245.354,174,1253.688,174C1262.021,174,1270.354,174,1278.021,174C1285.688,174,1292.688,174,1296.188,174L1299.688,174" id="my-svg-L_Store_Resources_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Store_Resources_0" data-points="W3sieCI6MTIwMy42ODc1LCJ5IjoxNzR9LHsieCI6MTIyOC42ODc1LCJ5IjoxNzR9LHsieCI6MTI1My42ODc1LCJ5IjoxNzR9LHsieCI6MTI3OC42ODc1LCJ5IjoxNzR9LHsieCI6MTMwMy42ODc1LCJ5IjoxNzR9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1163.673,213L1174.509,223.833C1185.344,234.667,1207.016,256.333,1222.018,267.167C1237.021,278,1245.354,278,1253.688,278C1262.021,278,1270.354,278,1279.066,278C1287.779,278,1296.87,278,1301.415,278L1305.961,278" id="my-svg-L_Store_Prompts_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Store_Prompts_0" data-points="W3sieCI6MTE2My42NzI4NTE1NjI1LCJ5IjoyMTN9LHsieCI6MTIyOC42ODc1LCJ5IjoyNzh9LHsieCI6MTI1My42ODc1LCJ5IjoyNzh9LHsieCI6MTI3OC42ODc1LCJ5IjoyNzh9LHsieCI6MTMwOS45NjA5Mzc1LCJ5IjoyNzh9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1434.055,70L1440.452,70C1446.849,70,1459.643,70,1470.207,70C1480.771,70,1489.104,70,1502.237,78.378C1515.371,86.756,1533.304,103.513,1542.271,111.891L1551.237,120.269" id="my-svg-L_Tools_Agent_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Tools_Agent_0" data-points="W3sieCI6MTQzNC4wNTQ2ODc1LCJ5Ijo3MH0seyJ4IjoxNDcyLjQzNzUsInkiOjcwfSx7IngiOjE0OTcuNDM3NSwieSI6NzB9LHsieCI6MTU1NC4xNjAwODExMjk4MDc2LCJ5IjoxMjN9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1447.438,174L1451.604,174C1455.771,174,1464.104,174,1472.438,174C1480.771,174,1489.104,174,1496.771,174C1504.438,174,1511.438,174,1514.938,174L1518.438,174" id="my-svg-L_Resources_Agent_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Resources_Agent_0" data-points="W3sieCI6MTQ0Ny40Mzc1LCJ5IjoxNzR9LHsieCI6MTQ3Mi40Mzc1LCJ5IjoxNzR9LHsieCI6MTQ5Ny40Mzc1LCJ5IjoxNzR9LHsieCI6MTUyMi40Mzc1LCJ5IjoxNzR9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M1441.164,278L1446.376,278C1451.589,278,1462.013,278,1471.392,278C1480.771,278,1489.104,278,1502.237,269.622C1515.371,261.244,1533.304,244.487,1542.271,236.109L1551.237,227.731" id="my-svg-L_Prompts_Agent_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Prompts_Agent_0" data-points="W3sieCI6MTQ0MS4xNjQwNjI1LCJ5IjoyNzh9LHsieCI6MTQ3Mi40Mzc1LCJ5IjoyNzh9LHsieCI6MTQ5Ny40Mzc1LCJ5IjoyNzh9LHsieCI6MTU1NC4xNjAwODExMjk4MDc2LCJ5IjoyMjV9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/></g><g class="edgeLabels"><g class="edgeLabel"><g class="label" data-id="L_Scan_Parse_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Parse_Resolve_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Resolve_Enrich_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Enrich_Store_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Store_Tools_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Store_Resources_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Store_Prompts_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Tools_Agent_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Resources_Agent_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Prompts_Agent_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"></span></div></foreignObject></g></g></g><g class="nodes"><g class="node default" id="my-svg-flowchart-Scan-0" data-look="classic" transform="translate(122.0859375, 174)"><rect class="basic label-container" style="" x="-89.0859375" y="-39" width="178.171875" height="78"/><g class="label" style="" transform="translate(-59.0859375, -24)"><rect/><foreignObject width="118.171875" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>📁 Scan<br />.gitignore aware</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Parse-1" data-look="classic" transform="translate(351.21875, 174)"><rect class="basic label-container" style="" x="-90.046875" y="-39" width="180.09375" height="78"/><g class="label" style="" transform="translate(-60.046875, -24)"><rect/><foreignObject width="120.09375" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>🌳 Parse<br />tree-sitter WASM</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Resolve-2" data-look="classic" transform="translate(609.9765625, 174)"><rect class="basic label-container" style="" x="-118.7109375" y="-39" width="237.421875" height="78"/><g class="label" style="" transform="translate(-88.7109375, -24)"><rect/><foreignObject width="177.421875" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>🔗 Resolve<br />imports · calls · heritage</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Enrich-3" data-look="classic" transform="translate(887.1640625, 174)"><rect class="basic label-container" style="" x="-108.4765625" y="-39" width="216.953125" height="78"/><g class="label" style="" transform="translate(-78.4765625, -24)"><rect/><foreignObject width="156.953125" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>⚡ Enrich<br />roles · heat · domains</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Store-4" data-look="classic" transform="translate(1124.6640625, 174)"><rect class="basic label-container" style="" x="-79.0234375" y="-39" width="158.046875" height="78"/><g class="label" style="" transform="translate(-49.0234375, -24)"><rect/><foreignObject width="98.046875" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>💾 Store<br />SQLite + FTS5</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Tools-5" data-look="classic" transform="translate(1375.5625, 70)"><rect class="basic label-container" style="" x="-58.4921875" y="-27" width="116.984375" height="54"/><g class="label" style="" transform="translate(-28.4921875, -12)"><rect/><foreignObject width="56.984375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>32 Tools</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Resources-6" data-look="classic" transform="translate(1375.5625, 174)"><rect class="basic label-container" style="" x="-71.875" y="-27" width="143.75" height="54"/><g class="label" style="" transform="translate(-41.875, -12)"><rect/><foreignObject width="83.75" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>4 Resources</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Prompts-7" data-look="classic" transform="translate(1375.5625, 278)"><rect class="basic label-container" style="" x="-65.6015625" y="-27" width="131.203125" height="54"/><g class="label" style="" transform="translate(-35.6015625, -12)"><rect/><foreignObject width="71.203125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>3 Prompts</p></span></div></foreignObject></g></g><g class="node default" id="my-svg-flowchart-Agent-19" data-look="classic" transform="translate(1608.7421875, 174)"><rect class="basic label-container" style="" x="-86.3046875" y="-51" width="172.609375" height="102"/><g class="label" style="" transform="translate(-56.3046875, -36)"><rect/><foreignObject width="112.609375" height="72"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>🤖 AI Agent<br />Copilot · Cursor<br />Claude · Codex</p></span></div></foreignObject></g></g></g></g></g><defs><filter id="my-svg-drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs><defs><filter id="my-svg-drop-shadow-small" height="150%" width="150%"><feDropShadow dx="2" dy="2" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs></svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "milens",
3
- "version": "0.6.2",
3
+ "version": "0.6.3",
4
4
  "description": "Lightweight Code Intelligence Platform — analyze codebases and build knowledge graphs",
5
5
  "type": "module",
6
6
  "bin": {
@@ -46,6 +46,7 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@modelcontextprotocol/sdk": "^1.29.0",
49
+ "@xenova/transformers": "^2.17.2",
49
50
  "better-sqlite3": "^11.0.0",
50
51
  "commander": "^12.0.0",
51
52
  "ignore": "^7.0.0",