kiri-mcp-server 0.16.1 → 0.18.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 (164) hide show
  1. package/README.md +65 -22
  2. package/dist/package.json +4 -2
  3. package/dist/src/client/proxy.js +0 -0
  4. package/dist/src/daemon/daemon.js +0 -0
  5. package/dist/src/indexer/codeintel/dart/adapter.d.ts +36 -0
  6. package/dist/src/indexer/codeintel/dart/adapter.d.ts.map +1 -0
  7. package/dist/src/indexer/codeintel/dart/adapter.js +60 -0
  8. package/dist/src/indexer/codeintel/dart/adapter.js.map +1 -0
  9. package/dist/src/indexer/codeintel/dart/index.d.ts +7 -0
  10. package/dist/src/indexer/codeintel/dart/index.d.ts.map +1 -0
  11. package/dist/src/indexer/codeintel/dart/index.js +7 -0
  12. package/dist/src/indexer/codeintel/dart/index.js.map +1 -0
  13. package/dist/src/indexer/codeintel/index.d.ts +30 -0
  14. package/dist/src/indexer/codeintel/index.d.ts.map +1 -0
  15. package/dist/src/indexer/codeintel/index.js +32 -0
  16. package/dist/src/indexer/codeintel/index.js.map +1 -0
  17. package/dist/src/indexer/codeintel/java/analyzer.d.ts +22 -0
  18. package/dist/src/indexer/codeintel/java/analyzer.d.ts.map +1 -0
  19. package/dist/src/indexer/codeintel/java/analyzer.js +281 -0
  20. package/dist/src/indexer/codeintel/java/analyzer.js.map +1 -0
  21. package/dist/src/indexer/codeintel/java/index.d.ts +7 -0
  22. package/dist/src/indexer/codeintel/java/index.d.ts.map +1 -0
  23. package/dist/src/indexer/codeintel/java/index.js +7 -0
  24. package/dist/src/indexer/codeintel/java/index.js.map +1 -0
  25. package/dist/src/indexer/codeintel/php/analyzer.d.ts +23 -0
  26. package/dist/src/indexer/codeintel/php/analyzer.d.ts.map +1 -0
  27. package/dist/src/indexer/codeintel/php/analyzer.js +342 -0
  28. package/dist/src/indexer/codeintel/php/analyzer.js.map +1 -0
  29. package/dist/src/indexer/codeintel/php/index.d.ts +7 -0
  30. package/dist/src/indexer/codeintel/php/index.d.ts.map +1 -0
  31. package/dist/src/indexer/codeintel/php/index.js +7 -0
  32. package/dist/src/indexer/codeintel/php/index.js.map +1 -0
  33. package/dist/src/indexer/codeintel/registry.d.ts +76 -0
  34. package/dist/src/indexer/codeintel/registry.d.ts.map +1 -0
  35. package/dist/src/indexer/codeintel/registry.js +127 -0
  36. package/dist/src/indexer/codeintel/registry.js.map +1 -0
  37. package/dist/src/indexer/codeintel/rust/analyzer.d.ts +14 -0
  38. package/dist/src/indexer/codeintel/rust/analyzer.d.ts.map +1 -0
  39. package/dist/src/indexer/codeintel/rust/analyzer.js +388 -0
  40. package/dist/src/indexer/codeintel/rust/analyzer.js.map +1 -0
  41. package/dist/src/indexer/codeintel/rust/index.d.ts +5 -0
  42. package/dist/src/indexer/codeintel/rust/index.d.ts.map +1 -0
  43. package/dist/src/indexer/codeintel/rust/index.js +5 -0
  44. package/dist/src/indexer/codeintel/rust/index.js.map +1 -0
  45. package/dist/src/indexer/codeintel/swift/analyzer.d.ts +22 -0
  46. package/dist/src/indexer/codeintel/swift/analyzer.d.ts.map +1 -0
  47. package/dist/src/indexer/codeintel/swift/analyzer.js +271 -0
  48. package/dist/src/indexer/codeintel/swift/analyzer.js.map +1 -0
  49. package/dist/src/indexer/codeintel/swift/index.d.ts +7 -0
  50. package/dist/src/indexer/codeintel/swift/index.d.ts.map +1 -0
  51. package/dist/src/indexer/codeintel/swift/index.js +7 -0
  52. package/dist/src/indexer/codeintel/swift/index.js.map +1 -0
  53. package/dist/src/indexer/codeintel/types.d.ts +114 -0
  54. package/dist/src/indexer/codeintel/types.d.ts.map +1 -0
  55. package/dist/src/indexer/codeintel/types.js +13 -0
  56. package/dist/src/indexer/codeintel/types.js.map +1 -0
  57. package/dist/src/indexer/codeintel/typescript/analyzer.d.ts +22 -0
  58. package/dist/src/indexer/codeintel/typescript/analyzer.d.ts.map +1 -0
  59. package/dist/{indexer/codeintel.js → src/indexer/codeintel/typescript/analyzer.js} +62 -34
  60. package/dist/src/indexer/codeintel/typescript/analyzer.js.map +1 -0
  61. package/dist/src/indexer/codeintel/typescript/index.d.ts +7 -0
  62. package/dist/src/indexer/codeintel/typescript/index.d.ts.map +1 -0
  63. package/dist/src/indexer/codeintel/typescript/index.js +7 -0
  64. package/dist/src/indexer/codeintel/typescript/index.js.map +1 -0
  65. package/dist/src/indexer/codeintel/utils.d.ts +91 -0
  66. package/dist/src/indexer/codeintel/utils.d.ts.map +1 -0
  67. package/dist/src/indexer/codeintel/utils.js +145 -0
  68. package/dist/src/indexer/codeintel/utils.js.map +1 -0
  69. package/dist/src/indexer/codeintel.d.ts +33 -26
  70. package/dist/src/indexer/codeintel.d.ts.map +1 -1
  71. package/dist/src/indexer/codeintel.js +56 -1078
  72. package/dist/src/indexer/codeintel.js.map +1 -1
  73. package/dist/src/indexer/graph-metrics.d.ts.map +1 -1
  74. package/dist/src/indexer/graph-metrics.js +16 -4
  75. package/dist/src/indexer/graph-metrics.js.map +1 -1
  76. package/dist/src/server/boost-profiles.d.ts +1 -1
  77. package/dist/src/server/boost-profiles.d.ts.map +1 -1
  78. package/dist/src/server/boost-profiles.js +22 -0
  79. package/dist/src/server/boost-profiles.js.map +1 -1
  80. package/dist/src/server/main.js +0 -0
  81. package/dist/src/server/rpc.js +4 -4
  82. package/dist/src/server/rpc.js.map +1 -1
  83. package/package.json +10 -2
  84. package/dist/client/cli.js +0 -68
  85. package/dist/client/cli.js.map +0 -1
  86. package/dist/client/index.js +0 -5
  87. package/dist/client/index.js.map +0 -1
  88. package/dist/eval/metrics.js +0 -47
  89. package/dist/eval/metrics.js.map +0 -1
  90. package/dist/indexer/cli.js +0 -362
  91. package/dist/indexer/cli.js.map +0 -1
  92. package/dist/indexer/codeintel.js.map +0 -1
  93. package/dist/indexer/git.js +0 -30
  94. package/dist/indexer/git.js.map +0 -1
  95. package/dist/indexer/language.js +0 -34
  96. package/dist/indexer/language.js.map +0 -1
  97. package/dist/indexer/pipeline/filters/denylist.js +0 -71
  98. package/dist/indexer/pipeline/filters/denylist.js.map +0 -1
  99. package/dist/indexer/schema.js +0 -101
  100. package/dist/indexer/schema.js.map +0 -1
  101. package/dist/server/bootstrap.js +0 -19
  102. package/dist/server/bootstrap.js.map +0 -1
  103. package/dist/server/context.js +0 -1
  104. package/dist/server/context.js.map +0 -1
  105. package/dist/server/fallbacks/degradeController.js +0 -69
  106. package/dist/server/fallbacks/degradeController.js.map +0 -1
  107. package/dist/server/handlers.js +0 -1268
  108. package/dist/server/handlers.js.map +0 -1
  109. package/dist/server/main.js +0 -151
  110. package/dist/server/main.js.map +0 -1
  111. package/dist/server/observability/metrics.js +0 -56
  112. package/dist/server/observability/metrics.js.map +0 -1
  113. package/dist/server/observability/tracing.js +0 -58
  114. package/dist/server/observability/tracing.js.map +0 -1
  115. package/dist/server/rpc.js +0 -477
  116. package/dist/server/rpc.js.map +0 -1
  117. package/dist/server/runtime.js +0 -47
  118. package/dist/server/runtime.js.map +0 -1
  119. package/dist/server/scoring.js +0 -116
  120. package/dist/server/scoring.js.map +0 -1
  121. package/dist/server/stdio.js +0 -76
  122. package/dist/server/stdio.js.map +0 -1
  123. package/dist/shared/duckdb.js +0 -119
  124. package/dist/shared/duckdb.js.map +0 -1
  125. package/dist/shared/embedding.js +0 -98
  126. package/dist/shared/embedding.js.map +0 -1
  127. package/dist/shared/index.js +0 -9
  128. package/dist/shared/index.js.map +0 -1
  129. package/dist/shared/security/config.js +0 -64
  130. package/dist/shared/security/config.js.map +0 -1
  131. package/dist/shared/security/masker.js +0 -56
  132. package/dist/shared/security/masker.js.map +0 -1
  133. package/dist/shared/tokenizer.js +0 -4
  134. package/dist/shared/tokenizer.js.map +0 -1
  135. package/dist/shared/utils/simpleYaml.js +0 -89
  136. package/dist/shared/utils/simpleYaml.js.map +0 -1
  137. package/dist/src/server/rrf.d.ts +0 -86
  138. package/dist/src/server/rrf.d.ts.map +0 -1
  139. package/dist/src/server/rrf.js +0 -108
  140. package/dist/src/server/rrf.js.map +0 -1
  141. package/dist/src/shared/embedding/engine.d.ts +0 -38
  142. package/dist/src/shared/embedding/engine.d.ts.map +0 -1
  143. package/dist/src/shared/embedding/engine.js +0 -6
  144. package/dist/src/shared/embedding/engine.js.map +0 -1
  145. package/dist/src/shared/embedding/lsh-engine.d.ts +0 -11
  146. package/dist/src/shared/embedding/lsh-engine.d.ts.map +0 -1
  147. package/dist/src/shared/embedding/lsh-engine.js +0 -14
  148. package/dist/src/shared/embedding/lsh-engine.js.map +0 -1
  149. package/dist/src/shared/embedding/registry.d.ts +0 -25
  150. package/dist/src/shared/embedding/registry.d.ts.map +0 -1
  151. package/dist/src/shared/embedding/registry.js +0 -50
  152. package/dist/src/shared/embedding/registry.js.map +0 -1
  153. package/dist/src/shared/embedding/semantic-engine.d.ts +0 -14
  154. package/dist/src/shared/embedding/semantic-engine.d.ts.map +0 -1
  155. package/dist/src/shared/embedding/semantic-engine.js +0 -50
  156. package/dist/src/shared/embedding/semantic-engine.js.map +0 -1
  157. package/dist/src/shared/models/model-manager.d.ts +0 -38
  158. package/dist/src/shared/models/model-manager.d.ts.map +0 -1
  159. package/dist/src/shared/models/model-manager.js +0 -116
  160. package/dist/src/shared/models/model-manager.js.map +0 -1
  161. package/dist/src/shared/models/model-manifest.d.ts +0 -22
  162. package/dist/src/shared/models/model-manifest.d.ts.map +0 -1
  163. package/dist/src/shared/models/model-manifest.js +0 -24
  164. package/dist/src/shared/models/model-manifest.js.map +0 -1
@@ -1,86 +0,0 @@
1
- /**
2
- * Reciprocal Rank Fusion (RRF) implementation for hybrid search
3
- *
4
- * RRF combines rankings from multiple retrieval systems (e.g., BM25 and vector search)
5
- * into a single ranking using the formula:
6
- *
7
- * rrf(doc) = Σ_i [1 / (k + rank_i)]
8
- *
9
- * where:
10
- * - k: constant (typically 60, per TREC/TAP standards)
11
- * - rank_i: 1-indexed rank from retrieval system i
12
- *
13
- * References:
14
- * - TREC: Reciprocal Rank Fusion outperforms individual rankers
15
- * - Used by GitHub Copilot, Sourcegraph Cody, Cursor
16
- */
17
- export interface RRFInput {
18
- /** File path */
19
- path: string;
20
- /** Retrieval channel (e.g., 'bm25' for keyword search, 'vector' for semantic search) */
21
- channel: string;
22
- /** 1-indexed rank from this channel (1 = best match) */
23
- rank: number;
24
- }
25
- export interface RRFOutput {
26
- /** File path */
27
- path: string;
28
- /** Normalized RRF score (0-1 range, higher = better) */
29
- rrfScore: number;
30
- /** Set of channels that contributed to this result */
31
- sources: Set<string>;
32
- /** Raw RRF score before normalization (for debugging) */
33
- rawScore: number;
34
- }
35
- export interface RRFOptions {
36
- /** RRF constant k (default: 60, per TREC standards) */
37
- k?: number;
38
- /**
39
- * Maximum number of documents to keep per channel before fusion (default: no cap)
40
- * Example: perChannelCap=5 means only top 5 from BM25 and top 5 from vector
41
- */
42
- perChannelCap?: number;
43
- /**
44
- * Channel-specific weights for weighted RRF (default: equal weights)
45
- * Example: { bm25: 0.7, vector: 0.3 } gives more weight to BM25 results
46
- * Formula: score(path) += weight[channel] * (1 / (k + rank))
47
- */
48
- weights?: Record<string, number>;
49
- }
50
- /**
51
- * Fuse rankings from multiple retrieval systems using Reciprocal Rank Fusion
52
- *
53
- * @param inputs - Array of ranked documents from各 retrieval systems
54
- * @param options - RRF configuration options
55
- * @returns Map of path → RRF scores, sorted by score (desc)
56
- *
57
- * @example
58
- * ```typescript
59
- * const inputs: RRFInput[] = [
60
- * { path: 'a.ts', channel: 'bm25', rank: 1 },
61
- * { path: 'a.ts', channel: 'vector', rank: 2 },
62
- * { path: 'b.ts', channel: 'bm25', rank: 3 },
63
- * ];
64
- *
65
- * const result = fuseWithRRF(inputs, { k: 60 });
66
- * // a.ts: 1/(60+1) + 1/(60+2) = 0.0325 → normalized to 1.0
67
- * // b.ts: 1/(60+3) = 0.0159 → normalized to 0.489
68
- * ```
69
- */
70
- export declare function fuseWithRRF(inputs: RRFInput[], options?: RRFOptions): Map<string, RRFOutput>;
71
- /**
72
- * Convert RRF output map to sorted array
73
- *
74
- * @param rrfMap - Map from fuseWithRRF
75
- * @returns Array sorted by rrfScore (desc), then path (asc)
76
- */
77
- export declare function rrfMapToSortedArray(rrfMap: Map<string, RRFOutput>): RRFOutput[];
78
- /**
79
- * Get top K documents from RRF fusion result
80
- *
81
- * @param rrfMap - Map from fuseWithRRF
82
- * @param k - Number of top documents to return
83
- * @returns Array of top K documents
84
- */
85
- export declare function getTopK(rrfMap: Map<string, RRFOutput>, k: number): RRFOutput[];
86
- //# sourceMappingURL=rrf.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rrf.d.ts","sourceRoot":"","sources":["../../../src/server/rrf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,QAAQ;IACvB,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,uDAAuD;IACvD,CAAC,CAAC,EAAE,MAAM,CAAC;IACX;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,GAAE,UAAe,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CA0DhG;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,EAAE,CAO/E;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAE9E"}
@@ -1,108 +0,0 @@
1
- /**
2
- * Reciprocal Rank Fusion (RRF) implementation for hybrid search
3
- *
4
- * RRF combines rankings from multiple retrieval systems (e.g., BM25 and vector search)
5
- * into a single ranking using the formula:
6
- *
7
- * rrf(doc) = Σ_i [1 / (k + rank_i)]
8
- *
9
- * where:
10
- * - k: constant (typically 60, per TREC/TAP standards)
11
- * - rank_i: 1-indexed rank from retrieval system i
12
- *
13
- * References:
14
- * - TREC: Reciprocal Rank Fusion outperforms individual rankers
15
- * - Used by GitHub Copilot, Sourcegraph Cody, Cursor
16
- */
17
- /**
18
- * Fuse rankings from multiple retrieval systems using Reciprocal Rank Fusion
19
- *
20
- * @param inputs - Array of ranked documents from各 retrieval systems
21
- * @param options - RRF configuration options
22
- * @returns Map of path → RRF scores, sorted by score (desc)
23
- *
24
- * @example
25
- * ```typescript
26
- * const inputs: RRFInput[] = [
27
- * { path: 'a.ts', channel: 'bm25', rank: 1 },
28
- * { path: 'a.ts', channel: 'vector', rank: 2 },
29
- * { path: 'b.ts', channel: 'bm25', rank: 3 },
30
- * ];
31
- *
32
- * const result = fuseWithRRF(inputs, { k: 60 });
33
- * // a.ts: 1/(60+1) + 1/(60+2) = 0.0325 → normalized to 1.0
34
- * // b.ts: 1/(60+3) = 0.0159 → normalized to 0.489
35
- * ```
36
- */
37
- export function fuseWithRRF(inputs, options = {}) {
38
- const k = options.k ?? 60;
39
- const perChannelCap = options.perChannelCap;
40
- const weights = options.weights;
41
- // Apply per-channel cap if specified
42
- let filteredInputs = inputs;
43
- if (perChannelCap !== undefined && perChannelCap > 0) {
44
- const channelCounts = new Map();
45
- filteredInputs = inputs.filter((input) => {
46
- const count = channelCounts.get(input.channel) ?? 0;
47
- if (count >= perChannelCap) {
48
- return false;
49
- }
50
- channelCounts.set(input.channel, count + 1);
51
- return true;
52
- });
53
- }
54
- // Calculate raw RRF scores
55
- const scoreMap = new Map();
56
- for (const input of filteredInputs) {
57
- const existing = scoreMap.get(input.path) ?? {
58
- rawScore: 0,
59
- sources: new Set(),
60
- contributions: new Map(),
61
- };
62
- // Apply channel-specific weight if provided, otherwise use equal weight (1.0)
63
- const weight = weights?.[input.channel] ?? 1.0;
64
- const contribution = weight * (1 / (k + input.rank));
65
- existing.rawScore += contribution;
66
- existing.sources.add(input.channel);
67
- existing.contributions.set(input.channel, contribution);
68
- scoreMap.set(input.path, existing);
69
- }
70
- // Normalize scores to [0, 1] range
71
- const maxScore = Math.max(...Array.from(scoreMap.values()).map((v) => v.rawScore), 0);
72
- const result = new Map();
73
- for (const [path, data] of scoreMap) {
74
- const normalizedScore = maxScore > 0 ? data.rawScore / maxScore : 0;
75
- result.set(path, {
76
- path,
77
- rrfScore: normalizedScore,
78
- sources: data.sources,
79
- rawScore: data.rawScore,
80
- });
81
- }
82
- return result;
83
- }
84
- /**
85
- * Convert RRF output map to sorted array
86
- *
87
- * @param rrfMap - Map from fuseWithRRF
88
- * @returns Array sorted by rrfScore (desc), then path (asc)
89
- */
90
- export function rrfMapToSortedArray(rrfMap) {
91
- return Array.from(rrfMap.values()).sort((a, b) => {
92
- if (b.rrfScore !== a.rrfScore) {
93
- return b.rrfScore - a.rrfScore;
94
- }
95
- return a.path.localeCompare(b.path);
96
- });
97
- }
98
- /**
99
- * Get top K documents from RRF fusion result
100
- *
101
- * @param rrfMap - Map from fuseWithRRF
102
- * @param k - Number of top documents to return
103
- * @returns Array of top K documents
104
- */
105
- export function getTopK(rrfMap, k) {
106
- return rrfMapToSortedArray(rrfMap).slice(0, k);
107
- }
108
- //# sourceMappingURL=rrf.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rrf.js","sourceRoot":"","sources":["../../../src/server/rrf.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- /**
2
- * Embedding engine abstraction layer
3
- * Supports multiple embedding models (LSH-64, semantic embeddings)
4
- */
5
- export type EmbeddingModel = "lsh-64" | "semantic-gte-384";
6
- export interface EmbeddingVector {
7
- dims: number;
8
- values: number[];
9
- }
10
- /**
11
- * Embedding engine interface
12
- * Each engine generates embeddings of a specific dimensionality
13
- */
14
- export interface EmbeddingEngine {
15
- /** Engine identifier (matches embedding_model column in DB) */
16
- readonly name: EmbeddingModel;
17
- /** Embedding dimensionality */
18
- readonly dims: number;
19
- /**
20
- * Optional initialization/warmup (for lazy-loaded models)
21
- * Called once before first use
22
- */
23
- warmup?(): Promise<void>;
24
- /**
25
- * Generate embedding for input text
26
- * @param text - Input text to embed
27
- * @returns Embedding vector or null if unsupported/error
28
- */
29
- embed(text: string): Promise<EmbeddingVector | null>;
30
- }
31
- /**
32
- * Feature flags for embedding system
33
- */
34
- export interface EmbeddingFeatureFlags {
35
- /** Enable semantic embeddings (requires model download) */
36
- semanticIndex?: boolean;
37
- }
38
- //# sourceMappingURL=engine.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../src/shared/embedding/engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,kBAAkB,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAE9B,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;CACtD;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Embedding engine abstraction layer
3
- * Supports multiple embedding models (LSH-64, semantic embeddings)
4
- */
5
- export {};
6
- //# sourceMappingURL=engine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../../src/shared/embedding/engine.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -1,11 +0,0 @@
1
- /**
2
- * LSH-64 embedding engine (existing implementation wrapper)
3
- * Fast, deterministic, no external dependencies
4
- */
5
- import type { EmbeddingEngine, EmbeddingModel, EmbeddingVector } from "./engine.js";
6
- export declare class LshEngine implements EmbeddingEngine {
7
- readonly name: EmbeddingModel;
8
- readonly dims = 64;
9
- embed(text: string): Promise<EmbeddingVector | null>;
10
- }
11
- //# sourceMappingURL=lsh-engine.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lsh-engine.d.ts","sourceRoot":"","sources":["../../../../src/shared/embedding/lsh-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpF,qBAAa,SAAU,YAAW,eAAe;IAC/C,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAY;IACzC,QAAQ,CAAC,IAAI,MAAM;IAEb,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;CAI3D"}
@@ -1,14 +0,0 @@
1
- /**
2
- * LSH-64 embedding engine (existing implementation wrapper)
3
- * Fast, deterministic, no external dependencies
4
- */
5
- import { generateEmbedding } from "../embedding.js";
6
- export class LshEngine {
7
- name = "lsh-64";
8
- dims = 64;
9
- async embed(text) {
10
- // Reuse existing LSH implementation
11
- return generateEmbedding(text, 64);
12
- }
13
- }
14
- //# sourceMappingURL=lsh-engine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lsh-engine.js","sourceRoot":"","sources":["../../../../src/shared/embedding/lsh-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIpD,MAAM,OAAO,SAAS;IACX,IAAI,GAAmB,QAAQ,CAAC;IAChC,IAAI,GAAG,EAAE,CAAC;IAEnB,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,oCAAoC;QACpC,OAAO,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC;CACF"}
@@ -1,25 +0,0 @@
1
- /**
2
- * Embedding engine registry
3
- * Manages LSH and semantic engines, selects based on feature flags
4
- */
5
- import type { EmbeddingEngine, EmbeddingFeatureFlags } from "./engine.js";
6
- export declare class EmbeddingRegistry {
7
- private static lshEngine;
8
- private static semanticEngine;
9
- /**
10
- * Get embedding engine based on feature flags
11
- * @param flags - Feature flags (semanticIndex)
12
- * @param allowFallback - Fall back to LSH if semantic unavailable (default: true)
13
- * @returns Embedding engine
14
- */
15
- static getEngine(flags: EmbeddingFeatureFlags, allowFallback?: boolean): Promise<EmbeddingEngine>;
16
- /**
17
- * Get LSH engine directly (for testing)
18
- */
19
- static getLshEngine(): EmbeddingEngine;
20
- /**
21
- * Reset semantic engine (for testing)
22
- */
23
- static resetSemanticEngine(): void;
24
- }
25
- //# sourceMappingURL=registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/shared/embedding/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAI1E,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAmB;IAC3C,OAAO,CAAC,MAAM,CAAC,cAAc,CAA+B;IAE5D;;;;;OAKG;WACU,SAAS,CACpB,KAAK,EAAE,qBAAqB,EAC5B,aAAa,UAAO,GACnB,OAAO,CAAC,eAAe,CAAC;IAwB3B;;OAEG;IACH,MAAM,CAAC,YAAY,IAAI,eAAe;IAItC;;OAEG;IACH,MAAM,CAAC,mBAAmB,IAAI,IAAI;CAGnC"}
@@ -1,50 +0,0 @@
1
- /**
2
- * Embedding engine registry
3
- * Manages LSH and semantic engines, selects based on feature flags
4
- */
5
- import { LshEngine } from "./lsh-engine.js";
6
- import { SemanticEngine } from "./semantic-engine.js";
7
- export class EmbeddingRegistry {
8
- static lshEngine = new LshEngine();
9
- static semanticEngine = null;
10
- /**
11
- * Get embedding engine based on feature flags
12
- * @param flags - Feature flags (semanticIndex)
13
- * @param allowFallback - Fall back to LSH if semantic unavailable (default: true)
14
- * @returns Embedding engine
15
- */
16
- static async getEngine(flags, allowFallback = true) {
17
- // Default: LSH-64
18
- if (!flags.semanticIndex) {
19
- return this.lshEngine;
20
- }
21
- // Semantic requested: lazy-load engine
22
- if (!this.semanticEngine) {
23
- try {
24
- this.semanticEngine = new SemanticEngine();
25
- await this.semanticEngine.warmup();
26
- }
27
- catch (error) {
28
- console.warn("Semantic engine unavailable, falling back to LSH:", error);
29
- if (allowFallback) {
30
- return this.lshEngine;
31
- }
32
- throw error;
33
- }
34
- }
35
- return this.semanticEngine;
36
- }
37
- /**
38
- * Get LSH engine directly (for testing)
39
- */
40
- static getLshEngine() {
41
- return this.lshEngine;
42
- }
43
- /**
44
- * Reset semantic engine (for testing)
45
- */
46
- static resetSemanticEngine() {
47
- this.semanticEngine = null;
48
- }
49
- }
50
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/shared/embedding/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAC,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IACnC,MAAM,CAAC,cAAc,GAA0B,IAAI,CAAC;IAE5D;;;;;OAKG;IACH,MAAM,CAAC,KAAK,CAAC,SAAS,CACpB,KAA4B,EAC5B,aAAa,GAAG,IAAI;QAEpB,kBAAkB;QAClB,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;gBAC3C,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YACrC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,mDAAmD,EAAE,KAAK,CAAC,CAAC;gBAEzE,IAAI,aAAa,EAAE,CAAC;oBAClB,OAAO,IAAI,CAAC,SAAS,CAAC;gBACxB,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,mBAAmB;QACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Semantic embedding engine using Xenova/gte-small
3
- * 384-dimensional embeddings via @xenova/transformers
4
- */
5
- import type { EmbeddingEngine, EmbeddingModel, EmbeddingVector } from "./engine.js";
6
- export declare class SemanticEngine implements EmbeddingEngine {
7
- readonly name: EmbeddingModel;
8
- readonly dims = 384;
9
- private pipeline;
10
- private modelPath;
11
- warmup(): Promise<void>;
12
- embed(text: string): Promise<EmbeddingVector | null>;
13
- }
14
- //# sourceMappingURL=semantic-engine.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"semantic-engine.d.ts","sourceRoot":"","sources":["../../../../src/shared/embedding/semantic-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAKpF,qBAAa,cAAe,YAAW,eAAe;IACpD,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAsB;IACnD,QAAQ,CAAC,IAAI,OAAO;IAEpB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,SAAS,CAAuB;IAElC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;CAyB3D"}
@@ -1,50 +0,0 @@
1
- /**
2
- * Semantic embedding engine using Xenova/gte-small
3
- * 384-dimensional embeddings via @xenova/transformers
4
- */
5
- import { MODELS } from "../models/model-manifest.js";
6
- import { ModelManager } from "../models/model-manager.js";
7
- export class SemanticEngine {
8
- name = "semantic-gte-384";
9
- dims = 384;
10
- pipeline = null;
11
- modelPath = null;
12
- async warmup() {
13
- if (this.pipeline)
14
- return;
15
- const model = MODELS["semantic-gte-384"];
16
- // Ensure model is downloaded
17
- this.modelPath = await ModelManager.ensureModel(model);
18
- // Lazy-load @xenova/transformers (don't bundle if not used)
19
- const { pipeline, env } = await import("@xenova/transformers");
20
- // Configure to use cached model
21
- env.cacheDir = this.modelPath;
22
- env.allowRemoteModels = false; // Already downloaded
23
- env.allowLocalModels = true;
24
- // Load pipeline
25
- this.pipeline = await pipeline("feature-extraction", model.source);
26
- }
27
- async embed(text) {
28
- // Ensure model is loaded
29
- if (!this.pipeline) {
30
- await this.warmup();
31
- }
32
- try {
33
- // Truncate to prevent OOM (~2k tokens max)
34
- const truncated = text.slice(0, 8192);
35
- // Generate embedding
36
- const output = await this.pipeline(truncated, {
37
- pooling: "mean",
38
- normalize: true,
39
- });
40
- // Extract embedding vector
41
- const values = Array.from(output.data);
42
- return { dims: this.dims, values };
43
- }
44
- catch (error) {
45
- console.warn(`Semantic embedding failed: ${error}`);
46
- return null;
47
- }
48
- }
49
- }
50
- //# sourceMappingURL=semantic-engine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"semantic-engine.js","sourceRoot":"","sources":["../../../../src/shared/embedding/semantic-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAO1D,MAAM,OAAO,cAAc;IAChB,IAAI,GAAmB,kBAAkB,CAAC;IAC1C,IAAI,GAAG,GAAG,CAAC;IAEZ,QAAQ,GAAoB,IAAI,CAAC;IACjC,SAAS,GAAkB,IAAI,CAAC;IAExC,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE1B,MAAM,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAEzC,6BAA6B;QAC7B,IAAI,CAAC,SAAS,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAEvD,4DAA4D;QAC5D,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAE/D,gCAAgC;QAChC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAC9B,GAAG,CAAC,iBAAiB,GAAG,KAAK,CAAC,CAAC,qBAAqB;QACpD,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAE5B,gBAAgB;QAChB,IAAI,CAAC,QAAQ,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,yBAAyB;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,2CAA2C;YAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAEtC,qBAAqB;YACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAS,CAAC,SAAS,EAAE;gBAC7C,OAAO,EAAE,MAAM;gBACf,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YAEH,2BAA2B;YAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAoB,CAAC,CAAC;YAEvD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -1,38 +0,0 @@
1
- /**
2
- * Model download and cache management
3
- * Handles model downloads to ~/.kiri/models/
4
- */
5
- import type { ModelDescriptor } from "./model-manifest.js";
6
- export interface ModelCacheMetadata {
7
- name: string;
8
- version: string;
9
- downloadedAt: string;
10
- checksum?: string;
11
- }
12
- export declare class ModelManager {
13
- private static cacheDir;
14
- /**
15
- * Ensure model is downloaded and cached
16
- * @param model - Model descriptor
17
- * @param interactive - Show interactive prompt (default: true if TTY)
18
- * @returns Path to cached model
19
- */
20
- static ensureModel(model: ModelDescriptor, interactive?: boolean): Promise<string>;
21
- /**
22
- * Check if model is cached
23
- */
24
- private static hasModel;
25
- /**
26
- * Download model using @xenova/transformers
27
- */
28
- private static downloadModel;
29
- /**
30
- * Prompt user for input (interactive mode)
31
- */
32
- private static promptUser;
33
- /**
34
- * Get model metadata
35
- */
36
- static getMetadata(modelPath: string): Promise<ModelCacheMetadata | null>;
37
- }
38
- //# sourceMappingURL=model-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-manager.d.ts","sourceRoot":"","sources":["../../../../src/shared/models/model-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsC;IAE7D;;;;;OAKG;WACU,WAAW,CACtB,KAAK,EAAE,eAAe,EACtB,WAAW,UAAuB,GACjC,OAAO,CAAC,MAAM,CAAC;IAuClB;;OAEG;mBACkB,QAAQ;IAK7B;;OAEG;mBACkB,aAAa;IA8BlC;;OAEG;mBACkB,UAAU;IAc/B;;OAEG;WACU,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;CAahF"}
@@ -1,116 +0,0 @@
1
- /**
2
- * Model download and cache management
3
- * Handles model downloads to ~/.kiri/models/
4
- */
5
- import { existsSync } from "node:fs";
6
- import { mkdir, readFile, writeFile } from "node:fs/promises";
7
- import { homedir } from "node:os";
8
- import { join } from "node:path";
9
- import * as readline from "node:readline";
10
- export class ModelManager {
11
- static cacheDir = join(homedir(), ".kiri", "models");
12
- /**
13
- * Ensure model is downloaded and cached
14
- * @param model - Model descriptor
15
- * @param interactive - Show interactive prompt (default: true if TTY)
16
- * @returns Path to cached model
17
- */
18
- static async ensureModel(model, interactive = process.stdout.isTTY) {
19
- const modelPath = join(this.cacheDir, `${model.name}@${model.version}`);
20
- // Check if already cached
21
- if (await this.hasModel(modelPath)) {
22
- return modelPath;
23
- }
24
- // Built-in models don't need download
25
- if (model.source === "builtin") {
26
- return modelPath;
27
- }
28
- // Interactive prompt (if TTY)
29
- if (interactive) {
30
- const answer = await this.promptUser(`\nSemantic embeddings require ~${model.sizeMB}MB download to ${this.cacheDir}.\nDownload now? [Y/n]: `);
31
- if (answer !== "Y" && answer !== "y" && answer !== "") {
32
- throw new Error("Model download declined by user");
33
- }
34
- }
35
- else {
36
- // Non-interactive: Check if env var allows auto-download
37
- if (process.env.KIRI_AUTO_DOWNLOAD !== "1") {
38
- throw new Error("Semantic embeddings require model download. " +
39
- "Run interactively or set KIRI_AUTO_DOWNLOAD=1");
40
- }
41
- }
42
- // Download with progress
43
- console.info(`📥 Downloading ${model.name} (~${model.sizeMB}MB)...`);
44
- await this.downloadModel(model, modelPath);
45
- console.info(`✅ Model cached to ${modelPath}`);
46
- return modelPath;
47
- }
48
- /**
49
- * Check if model is cached
50
- */
51
- static async hasModel(modelPath) {
52
- const metadataPath = join(modelPath, "metadata.json");
53
- return existsSync(metadataPath);
54
- }
55
- /**
56
- * Download model using @xenova/transformers
57
- */
58
- static async downloadModel(model, targetPath) {
59
- try {
60
- // Ensure cache directory exists
61
- await mkdir(targetPath, { recursive: true });
62
- // Import @xenova/transformers dynamically (lazy-load)
63
- const { pipeline, env } = await import("@xenova/transformers");
64
- // Configure cache directory
65
- env.cacheDir = targetPath;
66
- env.allowRemoteModels = true;
67
- env.allowLocalModels = false;
68
- // Trigger download by loading pipeline
69
- // This downloads model files to targetPath
70
- await pipeline("feature-extraction", model.source);
71
- // Write metadata
72
- const metadata = {
73
- name: model.name,
74
- version: model.version,
75
- downloadedAt: new Date().toISOString(),
76
- };
77
- await writeFile(join(targetPath, "metadata.json"), JSON.stringify(metadata, null, 2));
78
- }
79
- catch (error) {
80
- // Clean up partial download on error
81
- throw new Error(`Model download failed: ${error}`);
82
- }
83
- }
84
- /**
85
- * Prompt user for input (interactive mode)
86
- */
87
- static async promptUser(question) {
88
- const rl = readline.createInterface({
89
- input: process.stdin,
90
- output: process.stdout,
91
- });
92
- return new Promise((resolve) => {
93
- rl.question(question, (answer) => {
94
- rl.close();
95
- resolve(answer.trim());
96
- });
97
- });
98
- }
99
- /**
100
- * Get model metadata
101
- */
102
- static async getMetadata(modelPath) {
103
- const metadataPath = join(modelPath, "metadata.json");
104
- if (!existsSync(metadataPath)) {
105
- return null;
106
- }
107
- try {
108
- const content = await readFile(metadataPath, "utf-8");
109
- return JSON.parse(content);
110
- }
111
- catch {
112
- return null;
113
- }
114
- }
115
- }
116
- //# sourceMappingURL=model-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-manager.js","sourceRoot":"","sources":["../../../../src/shared/models/model-manager.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- /**
2
- * Model manifest and descriptors
3
- * Defines available embedding models and their properties
4
- */
5
- import type { EmbeddingModel } from "../embedding/engine.js";
6
- export interface ModelDescriptor {
7
- /** Model identifier */
8
- name: EmbeddingModel;
9
- /** Model version */
10
- version: string;
11
- /** Download size in MB */
12
- sizeMB: number;
13
- /** Source (Hugging Face model ID or 'builtin') */
14
- source: string;
15
- /** Embedding dimensionality */
16
- dims: number;
17
- }
18
- /**
19
- * Available embedding models
20
- */
21
- export declare const MODELS: Record<EmbeddingModel, ModelDescriptor>;
22
- //# sourceMappingURL=model-manifest.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-manifest.d.ts","sourceRoot":"","sources":["../../../../src/shared/models/model-manifest.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,uBAAuB;IACvB,IAAI,EAAE,cAAc,CAAC;IAErB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAEhB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IAEf,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IAEf,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,eAAe,CAe1D,CAAC"}