@mcp-graph-workflow/mcp-graph 5.5.3 → 5.6.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 (224) hide show
  1. package/dist/api/router.d.ts.map +1 -1
  2. package/dist/api/router.js +4 -0
  3. package/dist/api/router.js.map +1 -1
  4. package/dist/api/routes/journey.d.ts +4 -0
  5. package/dist/api/routes/journey.d.ts.map +1 -0
  6. package/dist/api/routes/journey.js +263 -0
  7. package/dist/api/routes/journey.js.map +1 -0
  8. package/dist/api/routes/siebel.d.ts +7 -0
  9. package/dist/api/routes/siebel.d.ts.map +1 -0
  10. package/dist/api/routes/siebel.js +305 -0
  11. package/dist/api/routes/siebel.js.map +1 -0
  12. package/dist/core/context/rag-context.d.ts.map +1 -1
  13. package/dist/core/context/rag-context.js +21 -5
  14. package/dist/core/context/rag-context.js.map +1 -1
  15. package/dist/core/events/event-types.d.ts +63 -1
  16. package/dist/core/events/event-types.d.ts.map +1 -1
  17. package/dist/core/integrations/integration-orchestrator.d.ts +12 -0
  18. package/dist/core/integrations/integration-orchestrator.d.ts.map +1 -1
  19. package/dist/core/integrations/integration-orchestrator.js +36 -2
  20. package/dist/core/integrations/integration-orchestrator.js.map +1 -1
  21. package/dist/core/journey/journey-store.d.ts +137 -0
  22. package/dist/core/journey/journey-store.d.ts.map +1 -0
  23. package/dist/core/journey/journey-store.js +210 -0
  24. package/dist/core/journey/journey-store.js.map +1 -0
  25. package/dist/core/parser/file-reader.d.ts.map +1 -1
  26. package/dist/core/parser/file-reader.js +16 -1
  27. package/dist/core/parser/file-reader.js.map +1 -1
  28. package/dist/core/parser/read-docx.d.ts +17 -0
  29. package/dist/core/parser/read-docx.d.ts.map +1 -0
  30. package/dist/core/parser/read-docx.js +79 -0
  31. package/dist/core/parser/read-docx.js.map +1 -0
  32. package/dist/core/parser/read-swagger.d.ts +49 -0
  33. package/dist/core/parser/read-swagger.d.ts.map +1 -0
  34. package/dist/core/parser/read-swagger.js +332 -0
  35. package/dist/core/parser/read-swagger.js.map +1 -0
  36. package/dist/core/rag/chunk-text.d.ts +5 -0
  37. package/dist/core/rag/chunk-text.d.ts.map +1 -1
  38. package/dist/core/rag/chunk-text.js +135 -0
  39. package/dist/core/rag/chunk-text.js.map +1 -1
  40. package/dist/core/rag/code-context-indexer.d.ts +27 -0
  41. package/dist/core/rag/code-context-indexer.d.ts.map +1 -0
  42. package/dist/core/rag/code-context-indexer.js +53 -0
  43. package/dist/core/rag/code-context-indexer.js.map +1 -0
  44. package/dist/core/rag/decision-indexer.d.ts +20 -0
  45. package/dist/core/rag/decision-indexer.d.ts.map +1 -0
  46. package/dist/core/rag/decision-indexer.js +32 -0
  47. package/dist/core/rag/decision-indexer.js.map +1 -0
  48. package/dist/core/rag/journey-indexer.d.ts +16 -0
  49. package/dist/core/rag/journey-indexer.d.ts.map +1 -0
  50. package/dist/core/rag/journey-indexer.js +182 -0
  51. package/dist/core/rag/journey-indexer.js.map +1 -0
  52. package/dist/core/rag/knowledge-feedback.d.ts +15 -0
  53. package/dist/core/rag/knowledge-feedback.d.ts.map +1 -0
  54. package/dist/core/rag/knowledge-feedback.js +46 -0
  55. package/dist/core/rag/knowledge-feedback.js.map +1 -0
  56. package/dist/core/rag/knowledge-linker.d.ts +20 -0
  57. package/dist/core/rag/knowledge-linker.d.ts.map +1 -0
  58. package/dist/core/rag/knowledge-linker.js +107 -0
  59. package/dist/core/rag/knowledge-linker.js.map +1 -0
  60. package/dist/core/rag/knowledge-quality.d.ts +31 -0
  61. package/dist/core/rag/knowledge-quality.d.ts.map +1 -0
  62. package/dist/core/rag/knowledge-quality.js +127 -0
  63. package/dist/core/rag/knowledge-quality.js.map +1 -0
  64. package/dist/core/rag/knowledge-synthesizer.d.ts +17 -0
  65. package/dist/core/rag/knowledge-synthesizer.d.ts.map +1 -0
  66. package/dist/core/rag/knowledge-synthesizer.js +115 -0
  67. package/dist/core/rag/knowledge-synthesizer.js.map +1 -0
  68. package/dist/core/rag/memory-rag-query.d.ts +3 -3
  69. package/dist/core/rag/memory-rag-query.d.ts.map +1 -1
  70. package/dist/core/rag/memory-rag-query.js +18 -0
  71. package/dist/core/rag/memory-rag-query.js.map +1 -1
  72. package/dist/core/rag/multi-strategy-retrieval.d.ts +46 -0
  73. package/dist/core/rag/multi-strategy-retrieval.d.ts.map +1 -0
  74. package/dist/core/rag/multi-strategy-retrieval.js +140 -0
  75. package/dist/core/rag/multi-strategy-retrieval.js.map +1 -0
  76. package/dist/core/rag/rag-pipeline.d.ts +11 -0
  77. package/dist/core/rag/rag-pipeline.d.ts.map +1 -1
  78. package/dist/core/rag/rag-pipeline.js +39 -0
  79. package/dist/core/rag/rag-pipeline.js.map +1 -1
  80. package/dist/core/rag/siebel-indexer.d.ts +16 -0
  81. package/dist/core/rag/siebel-indexer.d.ts.map +1 -0
  82. package/dist/core/rag/siebel-indexer.js +75 -0
  83. package/dist/core/rag/siebel-indexer.js.map +1 -0
  84. package/dist/core/rag/swagger-indexer.d.ts +16 -0
  85. package/dist/core/rag/swagger-indexer.d.ts.map +1 -0
  86. package/dist/core/rag/swagger-indexer.js +119 -0
  87. package/dist/core/rag/swagger-indexer.js.map +1 -0
  88. package/dist/core/rag/validation-indexer.d.ts +23 -0
  89. package/dist/core/rag/validation-indexer.d.ts.map +1 -0
  90. package/dist/core/rag/validation-indexer.js +35 -0
  91. package/dist/core/rag/validation-indexer.js.map +1 -0
  92. package/dist/core/siebel/composer-automation.d.ts +77 -0
  93. package/dist/core/siebel/composer-automation.d.ts.map +1 -0
  94. package/dist/core/siebel/composer-automation.js +110 -0
  95. package/dist/core/siebel/composer-automation.js.map +1 -0
  96. package/dist/core/siebel/dependency-analyzer.d.ts +24 -0
  97. package/dist/core/siebel/dependency-analyzer.d.ts.map +1 -0
  98. package/dist/core/siebel/dependency-analyzer.js +174 -0
  99. package/dist/core/siebel/dependency-analyzer.js.map +1 -0
  100. package/dist/core/siebel/siebel-config.d.ts +28 -0
  101. package/dist/core/siebel/siebel-config.d.ts.map +1 -0
  102. package/dist/core/siebel/siebel-config.js +86 -0
  103. package/dist/core/siebel/siebel-config.js.map +1 -0
  104. package/dist/core/siebel/sif-context-assembler.d.ts +37 -0
  105. package/dist/core/siebel/sif-context-assembler.d.ts.map +1 -0
  106. package/dist/core/siebel/sif-context-assembler.js +259 -0
  107. package/dist/core/siebel/sif-context-assembler.js.map +1 -0
  108. package/dist/core/siebel/sif-generator.d.ts +26 -0
  109. package/dist/core/siebel/sif-generator.d.ts.map +1 -0
  110. package/dist/core/siebel/sif-generator.js +232 -0
  111. package/dist/core/siebel/sif-generator.js.map +1 -0
  112. package/dist/core/siebel/sif-parser.d.ts +16 -0
  113. package/dist/core/siebel/sif-parser.d.ts.map +1 -0
  114. package/dist/core/siebel/sif-parser.js +355 -0
  115. package/dist/core/siebel/sif-parser.js.map +1 -0
  116. package/dist/core/siebel/sif-templates.d.ts +45 -0
  117. package/dist/core/siebel/sif-templates.d.ts.map +1 -0
  118. package/dist/core/siebel/sif-templates.js +179 -0
  119. package/dist/core/siebel/sif-templates.js.map +1 -0
  120. package/dist/core/siebel/sif-to-graph.d.ts +20 -0
  121. package/dist/core/siebel/sif-to-graph.d.ts.map +1 -0
  122. package/dist/core/siebel/sif-to-graph.js +176 -0
  123. package/dist/core/siebel/sif-to-graph.js.map +1 -0
  124. package/dist/core/store/knowledge-store.d.ts +25 -0
  125. package/dist/core/store/knowledge-store.d.ts.map +1 -1
  126. package/dist/core/store/knowledge-store.js +72 -0
  127. package/dist/core/store/knowledge-store.js.map +1 -1
  128. package/dist/core/store/migrations.d.ts.map +1 -1
  129. package/dist/core/store/migrations.js +96 -0
  130. package/dist/core/store/migrations.js.map +1 -1
  131. package/dist/mcp/tools/index.d.ts.map +1 -1
  132. package/dist/mcp/tools/index.js +26 -0
  133. package/dist/mcp/tools/index.js.map +1 -1
  134. package/dist/mcp/tools/journey.d.ts +4 -0
  135. package/dist/mcp/tools/journey.d.ts.map +1 -0
  136. package/dist/mcp/tools/journey.js +154 -0
  137. package/dist/mcp/tools/journey.js.map +1 -0
  138. package/dist/mcp/tools/knowledge-feedback.d.ts +8 -0
  139. package/dist/mcp/tools/knowledge-feedback.d.ts.map +1 -0
  140. package/dist/mcp/tools/knowledge-feedback.js +35 -0
  141. package/dist/mcp/tools/knowledge-feedback.js.map +1 -0
  142. package/dist/mcp/tools/knowledge-stats.d.ts +9 -0
  143. package/dist/mcp/tools/knowledge-stats.d.ts.map +1 -0
  144. package/dist/mcp/tools/knowledge-stats.js +83 -0
  145. package/dist/mcp/tools/knowledge-stats.js.map +1 -0
  146. package/dist/mcp/tools/plan-sprint.d.ts.map +1 -1
  147. package/dist/mcp/tools/plan-sprint.js +7 -1
  148. package/dist/mcp/tools/plan-sprint.js.map +1 -1
  149. package/dist/mcp/tools/rag-context.d.ts.map +1 -1
  150. package/dist/mcp/tools/rag-context.js +43 -2
  151. package/dist/mcp/tools/rag-context.js.map +1 -1
  152. package/dist/mcp/tools/reindex-knowledge.d.ts.map +1 -1
  153. package/dist/mcp/tools/reindex-knowledge.js +23 -2
  154. package/dist/mcp/tools/reindex-knowledge.js.map +1 -1
  155. package/dist/mcp/tools/siebel-analyze.d.ts +8 -0
  156. package/dist/mcp/tools/siebel-analyze.d.ts.map +1 -0
  157. package/dist/mcp/tools/siebel-analyze.js +107 -0
  158. package/dist/mcp/tools/siebel-analyze.js.map +1 -0
  159. package/dist/mcp/tools/siebel-composer.d.ts +12 -0
  160. package/dist/mcp/tools/siebel-composer.d.ts.map +1 -0
  161. package/dist/mcp/tools/siebel-composer.js +59 -0
  162. package/dist/mcp/tools/siebel-composer.js.map +1 -0
  163. package/dist/mcp/tools/siebel-env.d.ts +8 -0
  164. package/dist/mcp/tools/siebel-env.d.ts.map +1 -0
  165. package/dist/mcp/tools/siebel-env.js +60 -0
  166. package/dist/mcp/tools/siebel-env.js.map +1 -0
  167. package/dist/mcp/tools/siebel-generate-sif.d.ts +8 -0
  168. package/dist/mcp/tools/siebel-generate-sif.d.ts.map +1 -0
  169. package/dist/mcp/tools/siebel-generate-sif.js +91 -0
  170. package/dist/mcp/tools/siebel-generate-sif.js.map +1 -0
  171. package/dist/mcp/tools/siebel-import-docs.d.ts +9 -0
  172. package/dist/mcp/tools/siebel-import-docs.d.ts.map +1 -0
  173. package/dist/mcp/tools/siebel-import-docs.js +106 -0
  174. package/dist/mcp/tools/siebel-import-docs.js.map +1 -0
  175. package/dist/mcp/tools/siebel-import-sif.d.ts +8 -0
  176. package/dist/mcp/tools/siebel-import-sif.d.ts.map +1 -0
  177. package/dist/mcp/tools/siebel-import-sif.js +68 -0
  178. package/dist/mcp/tools/siebel-import-sif.js.map +1 -0
  179. package/dist/mcp/tools/siebel-search.d.ts +8 -0
  180. package/dist/mcp/tools/siebel-search.d.ts.map +1 -0
  181. package/dist/mcp/tools/siebel-search.js +47 -0
  182. package/dist/mcp/tools/siebel-search.js.map +1 -0
  183. package/dist/mcp/tools/siebel-validate.d.ts +8 -0
  184. package/dist/mcp/tools/siebel-validate.d.ts.map +1 -0
  185. package/dist/mcp/tools/siebel-validate.js +107 -0
  186. package/dist/mcp/tools/siebel-validate.js.map +1 -0
  187. package/dist/mcp/tools/update-status.d.ts.map +1 -1
  188. package/dist/mcp/tools/update-status.js +22 -1
  189. package/dist/mcp/tools/update-status.js.map +1 -1
  190. package/dist/mcp/tools/validate.d.ts.map +1 -1
  191. package/dist/mcp/tools/validate.js +21 -0
  192. package/dist/mcp/tools/validate.js.map +1 -1
  193. package/dist/schemas/knowledge.schema.d.ts +66 -0
  194. package/dist/schemas/knowledge.schema.d.ts.map +1 -1
  195. package/dist/schemas/knowledge.schema.js +28 -0
  196. package/dist/schemas/knowledge.schema.js.map +1 -1
  197. package/dist/schemas/siebel.schema.d.ts +564 -0
  198. package/dist/schemas/siebel.schema.d.ts.map +1 -0
  199. package/dist/schemas/siebel.schema.js +197 -0
  200. package/dist/schemas/siebel.schema.js.map +1 -0
  201. package/dist/web/dashboard/dist/assets/{benchmark-tab-C5fwIqgM.js → benchmark-tab-WCcv55oB.js} +1 -1
  202. package/dist/web/dashboard/dist/assets/{context-tab-ChCyrRlr.js → context-tab-CYnMjkHN.js} +1 -1
  203. package/dist/web/dashboard/dist/assets/{gitnexus-tab-DnlGT63w.js → gitnexus-tab-Dj0DERUy.js} +1 -1
  204. package/dist/web/dashboard/dist/assets/graph-tab-tI93ZxxW.js +1 -0
  205. package/dist/web/dashboard/dist/assets/graph-utils-DeQEwmsr.js +1 -0
  206. package/dist/web/dashboard/dist/assets/index-B1PLsGu1.js +55 -0
  207. package/dist/web/dashboard/dist/assets/index-DKvjo_C5.css +1 -0
  208. package/dist/web/dashboard/dist/assets/{index-DlZhNCGR.js → index-NmopQGmQ.js} +1 -1
  209. package/dist/web/dashboard/dist/assets/{insights-tab-Cj4f85vS.js → insights-tab-X7u4J-xv.js} +1 -1
  210. package/dist/web/dashboard/dist/assets/journey-tab-Cpz6_3mB.js +1 -0
  211. package/dist/web/dashboard/dist/assets/{logs-tab-C4C2Vn8-.js → logs-tab-QB__4Xdl.js} +1 -1
  212. package/dist/web/dashboard/dist/assets/{memories-tab-NtNwoxbT.js → memories-tab-Dry9wz7q.js} +1 -1
  213. package/dist/web/dashboard/dist/assets/prd-backlog-tab-OXTksZKv.js +1 -0
  214. package/dist/web/dashboard/dist/assets/siebel-tab-x7OCuCmb.js +3 -0
  215. package/dist/web/dashboard/dist/assets/{skills-tab-CIj4z1Ol.js → skills-tab-DeUEKmpZ.js} +1 -1
  216. package/dist/web/dashboard/dist/assets/style-C-e8BTyP.js +7 -0
  217. package/dist/web/dashboard/dist/index.html +2 -2
  218. package/package.json +3 -1
  219. package/dist/web/dashboard/dist/assets/graph-tab-DjV9RD41.js +0 -1
  220. package/dist/web/dashboard/dist/assets/graph-utils-C6bvcT4d.js +0 -7
  221. package/dist/web/dashboard/dist/assets/index-DQqYFXms.css +0 -1
  222. package/dist/web/dashboard/dist/assets/index-dCyMex_p.js +0 -53
  223. package/dist/web/dashboard/dist/assets/prd-backlog-tab-Bxt7qiVG.js +0 -1
  224. /package/dist/web/dashboard/dist/assets/{graph-utils-BZV40eAE.css → style-BZV40eAE.css} +0 -0
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Knowledge Linker — creates cross-source relationships between knowledge documents
3
+ * based on shared nodeId, tags, and source_id patterns.
4
+ *
5
+ * v1: Lightweight linking via metadata matching (no embedding similarity).
6
+ */
7
+ import { generateId } from "../utils/id.js";
8
+ import { now } from "../utils/time.js";
9
+ import { logger } from "../utils/logger.js";
10
+ /**
11
+ * Link knowledge documents that share context (nodeId, tags, source patterns).
12
+ */
13
+ export function linkBySharedContext(db) {
14
+ const docs = db
15
+ .prepare("SELECT id, source_type, source_id, metadata FROM knowledge_documents")
16
+ .all();
17
+ const parsed = docs.map((d) => ({
18
+ id: d.id,
19
+ sourceType: d.source_type,
20
+ sourceId: d.source_id,
21
+ metadata: d.metadata ? JSON.parse(d.metadata) : null,
22
+ }));
23
+ let relationsCreated = 0;
24
+ const insertRelation = db.prepare(`INSERT OR IGNORE INTO knowledge_relations (id, from_doc_id, to_doc_id, relation, score, created_at)
25
+ VALUES (?, ?, ?, ?, ?, ?)`);
26
+ const timestamp = now();
27
+ db.transaction(() => {
28
+ // Strategy 1: Link by shared nodeId (score 1.0)
29
+ const byNodeId = new Map();
30
+ for (const doc of parsed) {
31
+ const nodeId = doc.metadata?.nodeId;
32
+ if (nodeId) {
33
+ const group = byNodeId.get(nodeId) ?? [];
34
+ group.push(doc);
35
+ byNodeId.set(nodeId, group);
36
+ }
37
+ }
38
+ for (const [, group] of byNodeId) {
39
+ if (group.length < 2)
40
+ continue;
41
+ for (let i = 0; i < group.length; i++) {
42
+ for (let j = i + 1; j < group.length; j++) {
43
+ const result = insertRelation.run(generateId("krel"), group[i].id, group[j].id, "related_to", 1.0, timestamp);
44
+ if (result.changes > 0)
45
+ relationsCreated++;
46
+ }
47
+ }
48
+ }
49
+ // Strategy 2: Link by shared tags (score 0.7)
50
+ const byTag = new Map();
51
+ for (const doc of parsed) {
52
+ const tags = doc.metadata?.tags;
53
+ if (tags && Array.isArray(tags)) {
54
+ for (const tag of tags) {
55
+ const group = byTag.get(tag) ?? [];
56
+ group.push(doc);
57
+ byTag.set(tag, group);
58
+ }
59
+ }
60
+ }
61
+ for (const [, group] of byTag) {
62
+ if (group.length < 2)
63
+ continue;
64
+ for (let i = 0; i < group.length; i++) {
65
+ for (let j = i + 1; j < group.length; j++) {
66
+ // Skip if already linked by nodeId
67
+ if (group[i].id === group[j].id)
68
+ continue;
69
+ const result = insertRelation.run(generateId("krel"), group[i].id, group[j].id, "related_to", 0.7, timestamp);
70
+ if (result.changes > 0)
71
+ relationsCreated++;
72
+ }
73
+ }
74
+ }
75
+ })();
76
+ logger.info("Knowledge linking completed", { relationsCreated });
77
+ return { relationsCreated };
78
+ }
79
+ /**
80
+ * Find documents related to a given doc via knowledge_relations.
81
+ * Returns docs from different source types for cross-referencing.
82
+ */
83
+ export function findCrossSourceContext(db, docId, limit = 10) {
84
+ const rows = db
85
+ .prepare(`SELECT kd.* FROM knowledge_relations kr
86
+ JOIN knowledge_documents kd ON kd.id = kr.to_doc_id
87
+ WHERE kr.from_doc_id = ?
88
+ UNION
89
+ SELECT kd.* FROM knowledge_relations kr
90
+ JOIN knowledge_documents kd ON kd.id = kr.from_doc_id
91
+ WHERE kr.to_doc_id = ?
92
+ LIMIT ?`)
93
+ .all(docId, docId, limit);
94
+ return rows.map((row) => ({
95
+ id: row.id,
96
+ sourceType: row.source_type,
97
+ sourceId: row.source_id,
98
+ title: row.title,
99
+ content: row.content,
100
+ contentHash: row.content_hash,
101
+ chunkIndex: row.chunk_index,
102
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
103
+ createdAt: row.created_at,
104
+ updatedAt: row.updated_at,
105
+ }));
106
+ }
107
+ //# sourceMappingURL=knowledge-linker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-linker.js","sourceRoot":"","sources":["../../../src/core/rag/knowledge-linker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Knowledge Quality Engine — scores, decays, and tracks knowledge relevance.
3
+ *
4
+ * Quality score is a composite (0–1) based on:
5
+ * - Freshness (0.3): exponential decay from created_at, half-life 30 days
6
+ * - Source reliability (0.3): static weight per source_type
7
+ * - Usage frequency (0.2): normalized usage_count (log scale)
8
+ * - Content richness (0.2): content length relative to average
9
+ */
10
+ import type Database from "better-sqlite3";
11
+ import type { KnowledgeDocument, KnowledgeSourceType } from "../../schemas/knowledge.schema.js";
12
+ /**
13
+ * Get the reliability weight for a knowledge source type.
14
+ */
15
+ export declare function getSourceReliabilityWeight(sourceType: KnowledgeSourceType): number;
16
+ /**
17
+ * Calculate a composite quality score (0–1) for a knowledge document.
18
+ */
19
+ export declare function calculateQualityScore(doc: KnowledgeDocument): number;
20
+ /**
21
+ * Record a usage event for a knowledge document.
22
+ * Inserts into knowledge_usage_log and increments usage_count + last_accessed_at.
23
+ */
24
+ export declare function recordUsage(db: Database.Database, docId: string, query: string, action: string, context?: Record<string, unknown>): void;
25
+ /**
26
+ * Batch update staleness_days and quality_score for all knowledge documents.
27
+ */
28
+ export declare function decayStaleKnowledge(db: Database.Database): {
29
+ updated: number;
30
+ };
31
+ //# sourceMappingURL=knowledge-quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-quality.d.ts","sourceRoot":"","sources":["../../../src/core/rag/knowledge-quality.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AA6BhG;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAElF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,CAapE;AAqCD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI,CAYN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAwC9E"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Knowledge Quality Engine — scores, decays, and tracks knowledge relevance.
3
+ *
4
+ * Quality score is a composite (0–1) based on:
5
+ * - Freshness (0.3): exponential decay from created_at, half-life 30 days
6
+ * - Source reliability (0.3): static weight per source_type
7
+ * - Usage frequency (0.2): normalized usage_count (log scale)
8
+ * - Content richness (0.2): content length relative to average
9
+ */
10
+ import { now } from "../utils/time.js";
11
+ import { logger } from "../utils/logger.js";
12
+ const FRESHNESS_WEIGHT = 0.3;
13
+ const RELIABILITY_WEIGHT = 0.3;
14
+ const USAGE_WEIGHT = 0.2;
15
+ const RICHNESS_WEIGHT = 0.2;
16
+ /** Half-life in days for freshness decay */
17
+ const FRESHNESS_HALF_LIFE_DAYS = 30;
18
+ /** Average content length baseline (chars) for richness scoring */
19
+ const AVG_CONTENT_LENGTH = 500;
20
+ const SOURCE_RELIABILITY = {
21
+ docs: 0.9,
22
+ prd: 0.85,
23
+ memory: 0.8,
24
+ skill: 0.75,
25
+ web_capture: 0.7,
26
+ sprint_plan: 0.7,
27
+ code_context: 0.65,
28
+ ai_decision: 0.6,
29
+ validation_result: 0.6,
30
+ synthesis: 0.55,
31
+ phase_summary: 0.5,
32
+ };
33
+ /**
34
+ * Get the reliability weight for a knowledge source type.
35
+ */
36
+ export function getSourceReliabilityWeight(sourceType) {
37
+ return SOURCE_RELIABILITY[sourceType] ?? 0.5;
38
+ }
39
+ /**
40
+ * Calculate a composite quality score (0–1) for a knowledge document.
41
+ */
42
+ export function calculateQualityScore(doc) {
43
+ const freshness = calculateFreshness(doc.createdAt);
44
+ const reliability = getSourceReliabilityWeight(doc.sourceType);
45
+ const usage = calculateUsageScore(doc.usageCount ?? 0);
46
+ const richness = calculateRichness(doc.content);
47
+ const score = FRESHNESS_WEIGHT * freshness +
48
+ RELIABILITY_WEIGHT * reliability +
49
+ USAGE_WEIGHT * usage +
50
+ RICHNESS_WEIGHT * richness;
51
+ return Math.max(0, Math.min(1, score));
52
+ }
53
+ /**
54
+ * Freshness score: exponential decay with 30-day half-life.
55
+ * Returns 1.0 for brand-new docs, 0.5 at 30 days, ~0.25 at 60 days.
56
+ */
57
+ function calculateFreshness(createdAt) {
58
+ const ageMs = Date.now() - new Date(createdAt).getTime();
59
+ const ageDays = Math.max(0, ageMs / (24 * 60 * 60 * 1000));
60
+ return Math.pow(0.5, ageDays / FRESHNESS_HALF_LIFE_DAYS);
61
+ }
62
+ /**
63
+ * Usage score: logarithmic scale. More usage = higher score, with diminishing returns.
64
+ * 0 usage → 0.0, 1 usage → 0.5, 10 usage → 0.83, 100 usage → 1.0
65
+ */
66
+ function calculateUsageScore(usageCount) {
67
+ if (usageCount <= 0)
68
+ return 0;
69
+ return Math.min(1, Math.log10(usageCount + 1) / 2);
70
+ }
71
+ /**
72
+ * Content richness score: longer content scores higher, up to a cap.
73
+ */
74
+ function calculateRichness(content) {
75
+ const ratio = content.length / AVG_CONTENT_LENGTH;
76
+ return Math.min(1, ratio);
77
+ }
78
+ /**
79
+ * Calculate staleness in days from a date string.
80
+ */
81
+ function calculateStalenessDays(createdAt) {
82
+ const ageMs = Date.now() - new Date(createdAt).getTime();
83
+ return Math.max(0, Math.floor(ageMs / (24 * 60 * 60 * 1000)));
84
+ }
85
+ /**
86
+ * Record a usage event for a knowledge document.
87
+ * Inserts into knowledge_usage_log and increments usage_count + last_accessed_at.
88
+ */
89
+ export function recordUsage(db, docId, query, action, context) {
90
+ const timestamp = now();
91
+ db.prepare("INSERT INTO knowledge_usage_log (doc_id, query, action, context, created_at) VALUES (?, ?, ?, ?, ?)").run(docId, query, action, context ? JSON.stringify(context) : null, timestamp);
92
+ db.prepare("UPDATE knowledge_documents SET usage_count = usage_count + 1, last_accessed_at = ? WHERE id = ?").run(timestamp, docId);
93
+ logger.debug("Knowledge usage recorded", { docId, action });
94
+ }
95
+ /**
96
+ * Batch update staleness_days and quality_score for all knowledge documents.
97
+ */
98
+ export function decayStaleKnowledge(db) {
99
+ const rows = db
100
+ .prepare("SELECT id, source_type, content, content_hash, created_at, usage_count FROM knowledge_documents")
101
+ .all();
102
+ const update = db.prepare("UPDATE knowledge_documents SET staleness_days = ?, quality_score = ? WHERE id = ?");
103
+ let updated = 0;
104
+ db.transaction(() => {
105
+ for (const row of rows) {
106
+ const stalenessDays = calculateStalenessDays(row.created_at);
107
+ const doc = {
108
+ id: row.id,
109
+ sourceType: row.source_type,
110
+ sourceId: "",
111
+ title: "",
112
+ content: row.content,
113
+ contentHash: row.content_hash,
114
+ chunkIndex: 0,
115
+ createdAt: row.created_at,
116
+ updatedAt: row.created_at,
117
+ usageCount: row.usage_count,
118
+ };
119
+ const qualityScore = calculateQualityScore(doc);
120
+ update.run(stalenessDays, qualityScore, row.id);
121
+ updated++;
122
+ }
123
+ })();
124
+ logger.info("Knowledge staleness decay completed", { updated });
125
+ return { updated };
126
+ }
127
+ //# sourceMappingURL=knowledge-quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-quality.js","sourceRoot":"","sources":["../../../src/core/rag/knowledge-quality.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Knowledge Synthesizer — generates derived knowledge by analyzing patterns
3
+ * across existing knowledge documents.
4
+ *
5
+ * This is the "self-learning" layer: the system creates new knowledge from
6
+ * patterns found in AI decisions, sprint reports, and validation results.
7
+ */
8
+ import type Database from "better-sqlite3";
9
+ export interface SynthesisResult {
10
+ synthesized: number;
11
+ strategies: Record<string, number>;
12
+ }
13
+ /**
14
+ * Run all synthesis strategies and store derived knowledge.
15
+ */
16
+ export declare function runSynthesisCycle(db: Database.Database): SynthesisResult;
17
+ //# sourceMappingURL=knowledge-synthesizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-synthesizer.d.ts","sourceRoot":"","sources":["../../../src/core/rag/knowledge-synthesizer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAM3C,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,eAAe,CAiBxE"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Knowledge Synthesizer — generates derived knowledge by analyzing patterns
3
+ * across existing knowledge documents.
4
+ *
5
+ * This is the "self-learning" layer: the system creates new knowledge from
6
+ * patterns found in AI decisions, sprint reports, and validation results.
7
+ */
8
+ import { KnowledgeStore } from "../store/knowledge-store.js";
9
+ import { logger } from "../utils/logger.js";
10
+ const MIN_DOCS_FOR_SYNTHESIS = 3;
11
+ /**
12
+ * Run all synthesis strategies and store derived knowledge.
13
+ */
14
+ export function runSynthesisCycle(db) {
15
+ const store = new KnowledgeStore(db);
16
+ let synthesized = 0;
17
+ const strategies = {};
18
+ // Strategy 1: Error/Decision pattern detection from ai_decision docs
19
+ const decisionCount = synthesizeDecisionPatterns(db, store);
20
+ strategies.decisionPatterns = decisionCount;
21
+ synthesized += decisionCount;
22
+ // Strategy 2: Sprint trend analysis from sprint_plan docs
23
+ const sprintCount = synthesizeSprintTrends(db, store);
24
+ strategies.sprintTrends = sprintCount;
25
+ synthesized += sprintCount;
26
+ logger.info("Synthesis cycle complete", { synthesized, strategies });
27
+ return { synthesized, strategies };
28
+ }
29
+ /**
30
+ * Strategy 1: Detect patterns in AI decisions by grouping by shared tags.
31
+ * When multiple decisions share a tag, synthesize a "pattern" document.
32
+ */
33
+ function synthesizeDecisionPatterns(db, store) {
34
+ const decisions = db
35
+ .prepare("SELECT id, title, content, metadata FROM knowledge_documents WHERE source_type = 'ai_decision'")
36
+ .all();
37
+ if (decisions.length < MIN_DOCS_FOR_SYNTHESIS)
38
+ return 0;
39
+ // Group by tags
40
+ const byTag = new Map();
41
+ for (const dec of decisions) {
42
+ const meta = dec.metadata ? JSON.parse(dec.metadata) : {};
43
+ const tags = (meta.tags ?? []);
44
+ for (const tag of tags) {
45
+ const group = byTag.get(tag) ?? [];
46
+ group.push({ title: dec.title, content: dec.content });
47
+ byTag.set(tag, group);
48
+ }
49
+ }
50
+ let synthesized = 0;
51
+ for (const [tag, group] of byTag) {
52
+ if (group.length < MIN_DOCS_FOR_SYNTHESIS)
53
+ continue;
54
+ const summaryLines = group.map((d) => `- ${d.title}: ${d.content.slice(0, 200)}`);
55
+ const content = `# Pattern Synthesis: "${tag}"\n\nFound ${group.length} decisions related to "${tag}":\n\n${summaryLines.join("\n")}\n\n## Insight\nMultiple decisions share the "${tag}" theme. Consider creating a shared strategy or guideline for this topic.`;
56
+ const sourceId = `synthesis:pattern:${tag}`;
57
+ store.insert({
58
+ sourceType: "synthesis",
59
+ sourceId,
60
+ title: `Pattern: ${tag} (${group.length} decisions)`,
61
+ content,
62
+ metadata: {
63
+ strategy: "decision_patterns",
64
+ tag,
65
+ decisionCount: group.length,
66
+ phase: "REVIEW",
67
+ indexedAt: new Date().toISOString(),
68
+ },
69
+ });
70
+ synthesized++;
71
+ }
72
+ return synthesized;
73
+ }
74
+ /**
75
+ * Strategy 2: Analyze sprint plan trends across multiple sprints.
76
+ */
77
+ function synthesizeSprintTrends(db, store) {
78
+ const sprints = db
79
+ .prepare("SELECT content, metadata FROM knowledge_documents WHERE source_type = 'sprint_plan' ORDER BY created_at")
80
+ .all();
81
+ if (sprints.length < MIN_DOCS_FOR_SYNTHESIS)
82
+ return 0;
83
+ const velocities = [];
84
+ for (const sprint of sprints) {
85
+ const meta = sprint.metadata ? JSON.parse(sprint.metadata) : {};
86
+ if (typeof meta.velocity === "number") {
87
+ velocities.push(meta.velocity);
88
+ }
89
+ }
90
+ if (velocities.length < 2)
91
+ return 0;
92
+ const avgVelocity = velocities.reduce((a, b) => a + b, 0) / velocities.length;
93
+ const trend = velocities.length >= 2
94
+ ? velocities[velocities.length - 1] - velocities[0]
95
+ : 0;
96
+ const trendDirection = trend > 0 ? "improving" : trend < 0 ? "declining" : "stable";
97
+ const content = `# Sprint Velocity Trend Analysis\n\nAnalyzed ${velocities.length} sprints.\n\n- Average velocity: ${avgVelocity.toFixed(1)}\n- Trend: ${trendDirection} (${trend > 0 ? "+" : ""}${trend.toFixed(1)})\n- Latest velocity: ${velocities[velocities.length - 1]}\n\n## Recommendation\n${trendDirection === "improving" ? "Velocity is improving. Consider slightly increasing sprint capacity." : trendDirection === "declining" ? "Velocity is declining. Investigate blockers and reduce WIP." : "Velocity is stable. Current capacity planning is well-calibrated."}`;
98
+ const sourceId = `synthesis:sprint_trend:${new Date().toISOString()}`;
99
+ store.insert({
100
+ sourceType: "synthesis",
101
+ sourceId,
102
+ title: `Sprint Trend: ${trendDirection} (avg ${avgVelocity.toFixed(1)})`,
103
+ content,
104
+ metadata: {
105
+ strategy: "sprint_trends",
106
+ sprintCount: sprints.length,
107
+ avgVelocity,
108
+ trend: trendDirection,
109
+ phase: "PLAN",
110
+ indexedAt: new Date().toISOString(),
111
+ },
112
+ });
113
+ return 1;
114
+ }
115
+ //# sourceMappingURL=knowledge-synthesizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-synthesizer.js","sourceRoot":"","sources":["../../../src/core/rag/knowledge-synthesizer.ts"],"names":[],"mappings":"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"}
@@ -10,8 +10,8 @@
10
10
  */
11
11
  import type { SqliteStore } from "../store/sqlite-store.js";
12
12
  export interface MemoryRagOptions {
13
- /** Search mode: fts (keyword), semantic (embeddings), hybrid (both) */
14
- mode?: "fts" | "semantic" | "hybrid";
13
+ /** Search mode: fts (keyword), semantic (embeddings), hybrid (both), multi (multi-strategy) */
14
+ mode?: "fts" | "semantic" | "hybrid" | "multi";
15
15
  /** Maximum results to return */
16
16
  limit?: number;
17
17
  }
@@ -25,7 +25,7 @@ export interface MemoryRagResultItem {
25
25
  }
26
26
  export interface MemoryRagResult {
27
27
  query: string;
28
- mode: "fts" | "semantic" | "hybrid";
28
+ mode: "fts" | "semantic" | "hybrid" | "multi";
29
29
  results: MemoryRagResultItem[];
30
30
  totalMemoryDocuments: number;
31
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"memory-rag-query.d.ts","sourceRoot":"","sources":["../../../src/core/rag/memory-rag-query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAM5D,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,IAAI,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;IACrC,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,GAAG,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;IACpC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAKD;;GAEG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAwE1B"}
1
+ {"version":3,"file":"memory-rag-query.d.ts","sourceRoot":"","sources":["../../../src/core/rag/memory-rag-query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAO5D,MAAM,WAAW,gBAAgB;IAC/B,+FAA+F;IAC/F,IAAI,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC/C,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,GAAG,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC9C,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAKD;;GAEG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CA0F1B"}
@@ -11,6 +11,7 @@
11
11
  import { KnowledgeStore } from "../store/knowledge-store.js";
12
12
  import { EmbeddingStore } from "./embedding-store.js";
13
13
  import { indexAllEmbeddings, semanticSearch } from "./rag-pipeline.js";
14
+ import { multiStrategySearch } from "./multi-strategy-retrieval.js";
14
15
  import { logger } from "../utils/logger.js";
15
16
  /** Source types to include in memory queries (backward compat with "serena") */
16
17
  const MEMORY_SOURCE_TYPES = new Set(["memory", "serena"]);
@@ -28,6 +29,23 @@ export async function queryMemories(store, query, options) {
28
29
  }
29
30
  const results = [];
30
31
  const seenIds = new Set();
32
+ // Multi-strategy search (combines FTS, graph, quality, recency)
33
+ if (mode === "multi") {
34
+ const multiResults = multiStrategySearch(store.getDb(), query, { limit });
35
+ for (const r of multiResults) {
36
+ if (!MEMORY_SOURCE_TYPES.has(r.sourceType))
37
+ continue;
38
+ results.push({
39
+ id: r.id,
40
+ title: r.title,
41
+ content: r.content,
42
+ sourceId: r.sourceId,
43
+ score: r.score,
44
+ method: "fts",
45
+ });
46
+ }
47
+ return { query, mode, results: results.slice(0, limit), totalMemoryDocuments };
48
+ }
31
49
  // FTS search
32
50
  if (mode === "fts" || mode === "hybrid") {
33
51
  const ftsResults = knowledgeStore.search(query, limit);
@@ -1 +1 @@
1
- {"version":3,"file":"memory-rag-query.js","sourceRoot":"","sources":["../../../src/core/rag/memory-rag-query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-rag-query.js","sourceRoot":"","sources":["../../../src/core/rag/memory-rag-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Multi-Strategy Retrieval — combines FTS5, graph traversal, quality scoring,
3
+ * and recency boost into a unified search pipeline.
4
+ *
5
+ * Strategies:
6
+ * 1. FTS5 + BM25 (weight 0.4)
7
+ * 2. Graph traversal via knowledge_relations (weight 0.3)
8
+ * 3. Recency boost (weight 0.2)
9
+ * 4. Quality score multiplier (weight 0.1)
10
+ *
11
+ * Results merged via Reciprocal Rank Fusion (RRF).
12
+ */
13
+ import type Database from "better-sqlite3";
14
+ export interface RankedResult {
15
+ id: string;
16
+ sourceType: string;
17
+ sourceId: string;
18
+ title: string;
19
+ content: string;
20
+ score: number;
21
+ qualityScore: number;
22
+ strategies: string[];
23
+ }
24
+ interface SearchOptions {
25
+ limit?: number;
26
+ minQuality?: number;
27
+ phase?: string;
28
+ }
29
+ /**
30
+ * Reciprocal Rank Fusion — merge multiple ranked lists into one.
31
+ * score = Σ(1 / (k + rank_i))
32
+ */
33
+ export declare function reciprocalRankFusion(rankedLists: Array<Array<{
34
+ id: string;
35
+ score: number;
36
+ }>>): Array<{
37
+ id: string;
38
+ rrfScore: number;
39
+ }>;
40
+ /**
41
+ * Multi-strategy knowledge search combining FTS, graph relations,
42
+ * quality scoring, and recency.
43
+ */
44
+ export declare function multiStrategySearch(db: Database.Database, query: string, options?: SearchOptions): RankedResult[];
45
+ export {};
46
+ //# sourceMappingURL=multi-strategy-retrieval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-strategy-retrieval.d.ts","sourceRoot":"","sources":["../../../src/core/rag/multi-strategy-retrieval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GACvD,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAczC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,GACtB,YAAY,EAAE,CAmHhB"}