@porast1/mcp-cognitive 1.0.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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -0
  3. package/dist/adapters/sqlite.adapter.d.ts +29 -0
  4. package/dist/adapters/sqlite.adapter.d.ts.map +1 -0
  5. package/dist/adapters/sqlite.adapter.js +450 -0
  6. package/dist/adapters/sqlite.adapter.js.map +1 -0
  7. package/dist/adapters/weaviate.adapter.d.ts +43 -0
  8. package/dist/adapters/weaviate.adapter.d.ts.map +1 -0
  9. package/dist/adapters/weaviate.adapter.js +678 -0
  10. package/dist/adapters/weaviate.adapter.js.map +1 -0
  11. package/dist/cli/audit.d.ts +2 -0
  12. package/dist/cli/audit.d.ts.map +1 -0
  13. package/dist/cli/audit.js +50 -0
  14. package/dist/cli/audit.js.map +1 -0
  15. package/dist/cli/migrate-to-weaviate.d.ts +2 -0
  16. package/dist/cli/migrate-to-weaviate.d.ts.map +1 -0
  17. package/dist/cli/migrate-to-weaviate.js +65 -0
  18. package/dist/cli/migrate-to-weaviate.js.map +1 -0
  19. package/dist/cli/stale.d.ts +2 -0
  20. package/dist/cli/stale.d.ts.map +1 -0
  21. package/dist/cli/stale.js +27 -0
  22. package/dist/cli/stale.js.map +1 -0
  23. package/dist/cli/sync-ddd-docs.d.ts +2 -0
  24. package/dist/cli/sync-ddd-docs.d.ts.map +1 -0
  25. package/dist/cli/sync-ddd-docs.js +88 -0
  26. package/dist/cli/sync-ddd-docs.js.map +1 -0
  27. package/dist/cli/verify.d.ts +2 -0
  28. package/dist/cli/verify.d.ts.map +1 -0
  29. package/dist/cli/verify.js +36 -0
  30. package/dist/cli/verify.js.map +1 -0
  31. package/dist/hooks/post-commit.d.ts +13 -0
  32. package/dist/hooks/post-commit.d.ts.map +1 -0
  33. package/dist/hooks/post-commit.js +197 -0
  34. package/dist/hooks/post-commit.js.map +1 -0
  35. package/dist/ports/cognitive-store.port.d.ts +34 -0
  36. package/dist/ports/cognitive-store.port.d.ts.map +1 -0
  37. package/dist/ports/cognitive-store.port.js +2 -0
  38. package/dist/ports/cognitive-store.port.js.map +1 -0
  39. package/dist/profiles/agent-profiles.d.ts +20 -0
  40. package/dist/profiles/agent-profiles.d.ts.map +1 -0
  41. package/dist/profiles/agent-profiles.js +74 -0
  42. package/dist/profiles/agent-profiles.js.map +1 -0
  43. package/dist/server.d.ts +2 -0
  44. package/dist/server.d.ts.map +1 -0
  45. package/dist/server.js +59 -0
  46. package/dist/server.js.map +1 -0
  47. package/dist/tools/audit.tool.d.ts +8 -0
  48. package/dist/tools/audit.tool.d.ts.map +1 -0
  49. package/dist/tools/audit.tool.js +71 -0
  50. package/dist/tools/audit.tool.js.map +1 -0
  51. package/dist/tools/recall.tool.d.ts +30 -0
  52. package/dist/tools/recall.tool.d.ts.map +1 -0
  53. package/dist/tools/recall.tool.js +43 -0
  54. package/dist/tools/recall.tool.js.map +1 -0
  55. package/dist/tools/store.tool.d.ts +34 -0
  56. package/dist/tools/store.tool.d.ts.map +1 -0
  57. package/dist/tools/store.tool.js +51 -0
  58. package/dist/tools/store.tool.js.map +1 -0
  59. package/dist/tools/verify.tool.d.ts +10 -0
  60. package/dist/tools/verify.tool.d.ts.map +1 -0
  61. package/dist/tools/verify.tool.js +56 -0
  62. package/dist/tools/verify.tool.js.map +1 -0
  63. package/dist/types.d.ts +85 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +3 -0
  66. package/dist/types.js.map +1 -0
  67. package/dist/utils/citation-checker.d.ts +21 -0
  68. package/dist/utils/citation-checker.d.ts.map +1 -0
  69. package/dist/utils/citation-checker.js +84 -0
  70. package/dist/utils/citation-checker.js.map +1 -0
  71. package/dist/utils/decay.d.ts +16 -0
  72. package/dist/utils/decay.d.ts.map +1 -0
  73. package/dist/utils/decay.js +62 -0
  74. package/dist/utils/decay.js.map +1 -0
  75. package/package.json +57 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,142 @@
1
+ # @osobisty/mcp-cognitive
2
+
3
+ Universal MCP server for AI knowledge persistence with SQLite fallback and Weaviate hybrid search.
4
+
5
+ ## Features
6
+
7
+ - 🧠 **SQLite fallback** — Works offline, no infrastructure required
8
+ - 🔍 **Weaviate hybrid search** — BM25 keyword + vector embeddings (optional)
9
+ - 🏢 **Multi-tenancy** — Isolate data per project via `WEAVIATE_TENANT` env var
10
+ - 🛠️ **CLI tools** — Migration, sync, audit, verification
11
+ - 📚 **4 MCP Tools** — `cognitive_recall`, `cognitive_store`, `cognitive_verify`, `cognitive_audit`
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ npm install @osobisty/mcp-cognitive
17
+ # or
18
+ pnpm add @osobisty/mcp-cognitive
19
+ ```
20
+
21
+ ## Configuration
22
+
23
+ Add to `.vscode/mcp.json`:
24
+
25
+ ```jsonc
26
+ {
27
+ "servers": {
28
+ "cognitive": {
29
+ "command": "node",
30
+ "args": ["./node_modules/@osobisty/mcp-cognitive/dist/server.js"],
31
+ "env": {
32
+ "COGNITIVE_DB_PATH": ".cognitive/facts.sqlite",
33
+ "WORKSPACE_ROOT": "${workspaceFolder}",
34
+ "USE_WEAVIATE": "true",
35
+ "WEAVIATE_URL": "localhost:8200",
36
+ "WEAVIATE_TENANT": "myproject" // 🔑 Project isolation
37
+ }
38
+ }
39
+ }
40
+ }
41
+ ```
42
+
43
+ > **Note:** Works with pnpm, npm, yarn - `node_modules/` path is standard across package managers.
44
+
45
+ ## Environment Variables
46
+
47
+ | Variable | Default | Description |
48
+ | ----------------- | --------------------------- | --------------------------------- |
49
+ | COGNITIVE_DB_PATH | `.cognitive/facts.sqlite` | SQLite database location |
50
+ | WORKSPACE_ROOT | `process.cwd()` | Project root (for relative paths) |
51
+ | USE_WEAVIATE | `false` | Enable Weaviate hybrid search |
52
+ | WEAVIATE_URL | `localhost:8200` | Weaviate connection URL |
53
+ | WEAVIATE_TENANT | `default` | Tenant name for multi-tenancy |
54
+
55
+ ## CLI Tools
56
+
57
+ ```bash
58
+ # Migrate SQLite → Weaviate
59
+ npx mcp-cognitive-migrate
60
+
61
+ # Sync markdown docs to knowledge base
62
+ npx mcp-cognitive-sync
63
+
64
+ # Audit stale facts (broken citations)
65
+ npx mcp-cognitive-audit
66
+
67
+ # Verify citations exist
68
+ npx mcp-cognitive-verify
69
+
70
+ # Detect stale facts
71
+ npx mcp-cognitive-stale
72
+ ```
73
+
74
+ ## Multi-Tenancy
75
+
76
+ Use `WEAVIATE_TENANT` to isolate data between projects:
77
+
78
+ ```jsonc
79
+ // Project A (.vscode/mcp.json)
80
+ "WEAVIATE_TENANT": "project-a"
81
+
82
+ // Project B (.vscode/mcp.json)
83
+ "WEAVIATE_TENANT": "project-b"
84
+ ```
85
+
86
+ Both projects share the same Weaviate instance (~1GB RAM) but have isolated data.
87
+
88
+ ## MCP Tools
89
+
90
+ ### `cognitive_recall`
91
+
92
+ Search facts with filters.
93
+
94
+ **Parameters:**
95
+ - `query` (string): Search query
96
+ - `module` (optional): Filter by module
97
+ - `types` (optional): Filter by classification
98
+ - `minConfidence` (optional): Minimum confidence score
99
+
100
+ **Returns:** Array of `Fact` objects with metadata.
101
+
102
+ ### `cognitive_store`
103
+
104
+ Store new fact.
105
+
106
+ **Parameters:**
107
+ - `fact` (string): Knowledge statement
108
+ - `module` (string): Module name
109
+ - `classification` (string): `invariant | policy | convention | observation`
110
+ - `citations` (array): File:line references
111
+ - `tags` (array): Keywords
112
+
113
+ **Returns:** Created fact with ID.
114
+
115
+ ### `cognitive_verify`
116
+
117
+ Verify citations exist.
118
+
119
+ **Parameters:**
120
+ - `factId` (string): Fact to verify
121
+
122
+ **Returns:** Verification status + broken citations.
123
+
124
+ ### `cognitive_audit`
125
+
126
+ Audit all facts for stale citations.
127
+
128
+ **Returns:** Summary + list of stale facts.
129
+
130
+ ## Architecture
131
+
132
+ ```
133
+ CognitiveStore (interface)
134
+ ├── SqliteStore (fallback)
135
+ └── WeaviateStore (hybrid search)
136
+ ├── BM25 keyword search
137
+ └── Vector embeddings (text2vec-transformers)
138
+ ```
139
+
140
+ ## License
141
+
142
+ MIT
@@ -0,0 +1,29 @@
1
+ import type { CognitiveStore } from '../ports/cognitive-store.port.js';
2
+ import type { AuditReport, Fact, FactInput, RecallQuery, RecallResult, VerifyResult } from '../types.js';
3
+ export declare class SqliteStore implements CognitiveStore {
4
+ private db;
5
+ private readonly dbPath;
6
+ private readonly workspaceRoot;
7
+ private constructor();
8
+ static create(dbPath: string, workspaceRoot: string): Promise<SqliteStore>;
9
+ private initSchema;
10
+ private persist;
11
+ private query;
12
+ private queryOne;
13
+ store(input: FactInput): Promise<Fact>;
14
+ update(id: string, patch: Partial<FactInput>): Promise<Fact>;
15
+ archive(id: string, _reason: string): Promise<void>;
16
+ recall(query: RecallQuery): Promise<RecallResult>;
17
+ verify(factId: string): Promise<VerifyResult>;
18
+ verifyAll(): Promise<VerifyResult[]>;
19
+ audit(): Promise<AuditReport>;
20
+ decayCheck(): Promise<Fact[]>;
21
+ migrate(facts: readonly FactInput[]): Promise<void>;
22
+ exportAll(): Promise<Fact[]>;
23
+ count(): Promise<number>;
24
+ private findDuplicateCandidates;
25
+ private wordOverlap;
26
+ /** Close the database connection. */
27
+ close(): void;
28
+ }
29
+ //# sourceMappingURL=sqlite.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/sqlite.adapter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,KAAK,EACV,WAAW,EAEX,IAAI,EACJ,SAAS,EAIT,WAAW,EACX,YAAY,EACZ,YAAY,EACb,MAAM,aAAa,CAAC;AA8CrB,qBAAa,WAAY,YAAW,cAAc;IAChD,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,OAAO;WAMM,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBhF,OAAO,CAAC,UAAU;IA0BlB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,KAAK;IAkBb,OAAO,CAAC,QAAQ;IAOV,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCtC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgD5D,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAanD,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA6GjD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAsB7C,SAAS,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IA0BpC,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC;IAwD7B,UAAU,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IA2B7B,OAAO,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BnD,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAK5B,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAO9B,OAAO,CAAC,uBAAuB;IA2B/B,OAAO,CAAC,WAAW;IAcnB,qCAAqC;IACrC,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,450 @@
1
+ import initSqlJs from 'sql.js';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
+ import { dirname } from 'node:path';
5
+ import { checkCitations, overallCitationStatus } from '../utils/citation-checker.js';
6
+ import { checkDecayBatch } from '../utils/decay.js';
7
+ // ─── Row ↔ Fact mappers ───────────────────────────────────────────────────
8
+ function rowToFact(row) {
9
+ return {
10
+ id: row.id,
11
+ fact: row.fact,
12
+ type: row.type,
13
+ module: row.module,
14
+ confidence: row.confidence,
15
+ citations: JSON.parse(row.citations),
16
+ tags: JSON.parse(row.tags),
17
+ epoch: row.epoch,
18
+ createdAt: row.created_at,
19
+ updatedAt: row.updated_at,
20
+ lastRecalled: row.last_recalled,
21
+ recallCount: row.recall_count,
22
+ supersedes: row.supersedes,
23
+ status: row.status,
24
+ };
25
+ }
26
+ // ─── SqliteStore ──────────────────────────────────────────────────────────
27
+ export class SqliteStore {
28
+ db;
29
+ dbPath;
30
+ workspaceRoot;
31
+ constructor(db, dbPath, workspaceRoot) {
32
+ this.db = db;
33
+ this.dbPath = dbPath;
34
+ this.workspaceRoot = workspaceRoot;
35
+ }
36
+ static async create(dbPath, workspaceRoot) {
37
+ // Ensure directory exists
38
+ mkdirSync(dirname(dbPath), { recursive: true });
39
+ const SQL = await initSqlJs();
40
+ let db;
41
+ // Load existing DB or create new
42
+ if (existsSync(dbPath)) {
43
+ const buffer = readFileSync(dbPath);
44
+ db = new SQL.Database(buffer);
45
+ }
46
+ else {
47
+ db = new SQL.Database();
48
+ }
49
+ const store = new SqliteStore(db, dbPath, workspaceRoot);
50
+ store.initSchema();
51
+ return store;
52
+ }
53
+ initSchema() {
54
+ this.db.run(`
55
+ CREATE TABLE IF NOT EXISTS facts (
56
+ id TEXT PRIMARY KEY,
57
+ fact TEXT NOT NULL,
58
+ type TEXT NOT NULL CHECK(type IN ('invariant','policy','convention','observation','ephemeral')),
59
+ module TEXT NOT NULL,
60
+ confidence REAL NOT NULL DEFAULT 0.8,
61
+ citations TEXT NOT NULL DEFAULT '[]',
62
+ tags TEXT NOT NULL DEFAULT '[]',
63
+ epoch INTEGER NOT NULL DEFAULT 3,
64
+ created_at TEXT NOT NULL,
65
+ updated_at TEXT NOT NULL,
66
+ last_recalled TEXT,
67
+ recall_count INTEGER NOT NULL DEFAULT 0,
68
+ supersedes TEXT,
69
+ status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active','stale','archived'))
70
+ );
71
+ `);
72
+ this.db.run(`CREATE INDEX IF NOT EXISTS idx_facts_module ON facts(module);`);
73
+ this.db.run(`CREATE INDEX IF NOT EXISTS idx_facts_type ON facts(type);`);
74
+ this.db.run(`CREATE INDEX IF NOT EXISTS idx_facts_status ON facts(status);`);
75
+ this.db.run(`CREATE INDEX IF NOT EXISTS idx_facts_tags ON facts(tags);`);
76
+ this.persist();
77
+ }
78
+ persist() {
79
+ const data = this.db.export();
80
+ writeFileSync(this.dbPath, data);
81
+ }
82
+ query(sql, params = []) {
83
+ const results = this.db.exec(sql, params);
84
+ if (results.length === 0)
85
+ return [];
86
+ const result = results[0];
87
+ const rows = [];
88
+ for (const values of result.values) {
89
+ const row = {};
90
+ for (let i = 0; i < result.columns.length; i++) {
91
+ row[result.columns[i]] = values[i];
92
+ }
93
+ rows.push(row);
94
+ }
95
+ return rows;
96
+ }
97
+ queryOne(sql, params = []) {
98
+ const rows = this.query(sql, params);
99
+ return rows[0];
100
+ }
101
+ // ─── CRUD ─────────────────────────────────────────────────────────────
102
+ async store(input) {
103
+ const now = new Date().toISOString();
104
+ const id = randomUUID();
105
+ this.db.run(`INSERT INTO facts (id, fact, type, module, confidence, citations, tags, epoch, created_at, updated_at, supersedes, status)
106
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'active')`, [
107
+ id,
108
+ input.fact,
109
+ input.type,
110
+ input.module,
111
+ input.confidence ?? 0.8,
112
+ JSON.stringify(input.citations ?? []),
113
+ JSON.stringify(input.tags ?? []),
114
+ input.epoch ?? 3,
115
+ now,
116
+ now,
117
+ input.supersedes ?? null,
118
+ ]);
119
+ // If supersedes, archive the old fact
120
+ if (input.supersedes) {
121
+ this.db.run(`UPDATE facts SET status = 'archived', updated_at = ? WHERE id = ?`, [
122
+ now,
123
+ input.supersedes,
124
+ ]);
125
+ }
126
+ this.persist();
127
+ const row = this.queryOne('SELECT * FROM facts WHERE id = ?', [id]);
128
+ if (!row)
129
+ throw new Error('Failed to store fact');
130
+ return rowToFact(row);
131
+ }
132
+ async update(id, patch) {
133
+ const existing = this.queryOne('SELECT * FROM facts WHERE id = ?', [id]);
134
+ if (!existing) {
135
+ throw new Error(`Fact not found: ${id}`);
136
+ }
137
+ const now = new Date().toISOString();
138
+ const updates = ['updated_at = ?'];
139
+ const values = [now];
140
+ if (patch.fact !== undefined) {
141
+ updates.push('fact = ?');
142
+ values.push(patch.fact);
143
+ }
144
+ if (patch.type !== undefined) {
145
+ updates.push('type = ?');
146
+ values.push(patch.type);
147
+ }
148
+ if (patch.module !== undefined) {
149
+ updates.push('module = ?');
150
+ values.push(patch.module);
151
+ }
152
+ if (patch.confidence !== undefined) {
153
+ updates.push('confidence = ?');
154
+ values.push(patch.confidence);
155
+ }
156
+ if (patch.citations !== undefined) {
157
+ updates.push('citations = ?');
158
+ values.push(JSON.stringify(patch.citations));
159
+ }
160
+ if (patch.tags !== undefined) {
161
+ updates.push('tags = ?');
162
+ values.push(JSON.stringify(patch.tags));
163
+ }
164
+ if (patch.epoch !== undefined) {
165
+ updates.push('epoch = ?');
166
+ values.push(patch.epoch);
167
+ }
168
+ values.push(id);
169
+ this.db.run(`UPDATE facts SET ${updates.join(', ')} WHERE id = ?`, values);
170
+ this.persist();
171
+ const row = this.queryOne('SELECT * FROM facts WHERE id = ?', [id]);
172
+ if (!row)
173
+ throw new Error('Failed to update fact');
174
+ return rowToFact(row);
175
+ }
176
+ async archive(id, _reason) {
177
+ const now = new Date().toISOString();
178
+ const existing = this.queryOne('SELECT * FROM facts WHERE id = ?', [id]);
179
+ if (!existing) {
180
+ throw new Error(`Fact not found: ${id}`);
181
+ }
182
+ this.db.run(`UPDATE facts SET status = 'archived', updated_at = ? WHERE id = ?`, [now, id]);
183
+ this.persist();
184
+ }
185
+ // ─── Search ─────────────────────────────────────────────────────────────
186
+ async recall(query) {
187
+ const start = performance.now();
188
+ // Build WHERE conditions
189
+ const conditions = ["status = 'active'"];
190
+ const params = [];
191
+ // Keyword search: split query into words, match against fact + tags
192
+ const keywords = query.query
193
+ .toLowerCase()
194
+ .split(/\s+/)
195
+ .filter((w) => w.length > 2);
196
+ if (keywords.length > 0) {
197
+ const keywordConditions = keywords.map(() => "(LOWER(fact) LIKE ? OR LOWER(tags) LIKE ?)");
198
+ conditions.push(`(${keywordConditions.join(' OR ')})`);
199
+ for (const kw of keywords) {
200
+ params.push(`%${kw}%`, `%${kw}%`);
201
+ }
202
+ }
203
+ // Module filter
204
+ if (query.module !== undefined) {
205
+ conditions.push('module = ?');
206
+ params.push(query.module);
207
+ }
208
+ // Type filter
209
+ if (query.types !== undefined && query.types.length > 0) {
210
+ const placeholders = query.types.map(() => '?').join(', ');
211
+ conditions.push(`type IN (${placeholders})`);
212
+ params.push(...query.types);
213
+ }
214
+ // Tag filter (AND — all tags must match)
215
+ if (query.tags !== undefined && query.tags.length > 0) {
216
+ for (const tag of query.tags) {
217
+ conditions.push('LOWER(tags) LIKE ?');
218
+ params.push(`%"${tag.toLowerCase()}"%`);
219
+ }
220
+ }
221
+ // Minimum confidence
222
+ if (query.minConfidence !== undefined) {
223
+ conditions.push('confidence >= ?');
224
+ params.push(query.minConfidence);
225
+ }
226
+ const whereClause = conditions.join(' AND ');
227
+ const limit = query.limit ?? 10;
228
+ // Count total matches
229
+ const countResult = this.query(`SELECT COUNT(*) as cnt FROM facts WHERE ${whereClause}`, params);
230
+ const totalMatches = countResult[0]?.cnt ?? 0;
231
+ // Fetch ranked results
232
+ const rows = this.query(`SELECT * FROM facts
233
+ WHERE ${whereClause}
234
+ ORDER BY confidence DESC, updated_at DESC
235
+ LIMIT ?`, [...params, limit]);
236
+ // Re-rank by keyword match count
237
+ const rankedFacts = rows
238
+ .map((row) => {
239
+ const factLower = row.fact.toLowerCase();
240
+ const tagsLower = row.tags.toLowerCase();
241
+ let matchCount = 0;
242
+ for (const kw of keywords) {
243
+ if (factLower.includes(kw))
244
+ matchCount++;
245
+ if (tagsLower.includes(kw))
246
+ matchCount++;
247
+ }
248
+ return { row, matchCount };
249
+ })
250
+ .sort((a, b) => {
251
+ if (b.matchCount !== a.matchCount)
252
+ return b.matchCount - a.matchCount;
253
+ if (b.row.confidence !== a.row.confidence)
254
+ return b.row.confidence - a.row.confidence;
255
+ return b.row.updated_at.localeCompare(a.row.updated_at);
256
+ })
257
+ .map(({ row }) => rowToFact(row));
258
+ // Side effect: update recall metadata
259
+ const now = new Date().toISOString();
260
+ for (const fact of rankedFacts) {
261
+ this.db.run(`UPDATE facts SET last_recalled = ?, recall_count = recall_count + 1 WHERE id = ?`, [now, fact.id]);
262
+ }
263
+ this.persist();
264
+ const queryTimeMs = Math.round(performance.now() - start);
265
+ return {
266
+ facts: rankedFacts,
267
+ totalMatches,
268
+ queryTimeMs,
269
+ };
270
+ }
271
+ // ─── Maintenance ────────────────────────────────────────────────────────
272
+ async verify(factId) {
273
+ const row = this.queryOne('SELECT * FROM facts WHERE id = ?', [factId]);
274
+ if (!row) {
275
+ throw new Error(`Fact not found: ${factId}`);
276
+ }
277
+ const fact = rowToFact(row);
278
+ const results = checkCitations(fact.citations, this.workspaceRoot);
279
+ const overall = overallCitationStatus(results);
280
+ return {
281
+ factId: fact.id,
282
+ factSnippet: fact.fact.substring(0, 100),
283
+ citations: results.map((r) => ({
284
+ citation: r.citation,
285
+ status: r.status,
286
+ ...(r.detail !== undefined ? { detail: r.detail } : {}),
287
+ })),
288
+ overallStatus: overall,
289
+ };
290
+ }
291
+ async verifyAll() {
292
+ const rows = this.query("SELECT * FROM facts WHERE status = 'active'");
293
+ const results = [];
294
+ for (const row of rows) {
295
+ const fact = rowToFact(row);
296
+ if (fact.citations.length === 0)
297
+ continue;
298
+ const citResults = checkCitations(fact.citations, this.workspaceRoot);
299
+ const overall = overallCitationStatus(citResults);
300
+ results.push({
301
+ factId: fact.id,
302
+ factSnippet: fact.fact.substring(0, 100),
303
+ citations: citResults.map((r) => ({
304
+ citation: r.citation,
305
+ status: r.status,
306
+ ...(r.detail !== undefined ? { detail: r.detail } : {}),
307
+ })),
308
+ overallStatus: overall,
309
+ });
310
+ }
311
+ return results;
312
+ }
313
+ async audit() {
314
+ const allRows = this.query('SELECT * FROM facts');
315
+ const allFacts = allRows.map(rowToFact);
316
+ const activeFacts = allFacts.filter((f) => f.status === 'active');
317
+ // By status
318
+ const byStatus = { active: 0, stale: 0, archived: 0 };
319
+ for (const f of allFacts) {
320
+ byStatus[f.status]++;
321
+ }
322
+ // By type
323
+ const byType = {
324
+ invariant: 0,
325
+ policy: 0,
326
+ convention: 0,
327
+ observation: 0,
328
+ ephemeral: 0,
329
+ };
330
+ for (const f of allFacts) {
331
+ byType[f.type]++;
332
+ }
333
+ // By module
334
+ const byModule = {};
335
+ for (const f of allFacts) {
336
+ byModule[f.module] = (byModule[f.module] ?? 0) + 1;
337
+ }
338
+ // Stale facts via decay check
339
+ const decayActions = checkDecayBatch(activeFacts);
340
+ const staleFacts = decayActions
341
+ .filter((a) => a.action === 'mark-stale')
342
+ .map((a) => a.fact);
343
+ // Broken citations
344
+ const verifications = await this.verifyAll();
345
+ const brokenCitations = verifications.filter((v) => v.overallStatus === 'broken');
346
+ // Simple duplicate detection: facts with high word overlap
347
+ const duplicateCandidates = this.findDuplicateCandidates(activeFacts);
348
+ return {
349
+ totalFacts: allFacts.length,
350
+ byStatus,
351
+ byType,
352
+ byModule,
353
+ staleFacts,
354
+ brokenCitations,
355
+ duplicateCandidates,
356
+ generatedAt: new Date().toISOString(),
357
+ };
358
+ }
359
+ // ─── Lifecycle ──────────────────────────────────────────────────────────
360
+ async decayCheck() {
361
+ const rows = this.query("SELECT * FROM facts WHERE status IN ('active', 'stale')");
362
+ const facts = rows.map(rowToFact);
363
+ const actions = checkDecayBatch(facts);
364
+ const now = new Date().toISOString();
365
+ for (const action of actions) {
366
+ if (action.action === 'mark-stale') {
367
+ this.db.run(`UPDATE facts SET status = 'stale', updated_at = ? WHERE id = ?`, [
368
+ now,
369
+ action.fact.id,
370
+ ]);
371
+ }
372
+ else {
373
+ this.db.run(`UPDATE facts SET status = 'archived', updated_at = ? WHERE id = ?`, [
374
+ now,
375
+ action.fact.id,
376
+ ]);
377
+ }
378
+ }
379
+ this.persist();
380
+ return actions.map((a) => a.fact);
381
+ }
382
+ async migrate(facts) {
383
+ const now = new Date().toISOString();
384
+ for (const input of facts) {
385
+ this.db.run(`INSERT OR IGNORE INTO facts (id, fact, type, module, confidence, citations, tags, epoch, created_at, updated_at, supersedes, status)
386
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'active')`, [
387
+ randomUUID(),
388
+ input.fact,
389
+ input.type,
390
+ input.module,
391
+ input.confidence ?? 0.8,
392
+ JSON.stringify(input.citations ?? []),
393
+ JSON.stringify(input.tags ?? []),
394
+ input.epoch ?? 3,
395
+ now,
396
+ now,
397
+ input.supersedes ?? null,
398
+ ]);
399
+ }
400
+ this.persist();
401
+ }
402
+ // ─── Export ────────────────────────────────────────────────────────────
403
+ async exportAll() {
404
+ const rows = this.query('SELECT * FROM facts');
405
+ return rows.map(rowToFact);
406
+ }
407
+ async count() {
408
+ const row = this.query('SELECT COUNT(*) as cnt FROM facts')[0];
409
+ return row?.cnt ?? 0;
410
+ }
411
+ // ─── Internal Helpers ──────────────────────────────────────────────────
412
+ findDuplicateCandidates(facts) {
413
+ const candidates = [];
414
+ for (let i = 0; i < facts.length; i++) {
415
+ for (let j = i + 1; j < facts.length; j++) {
416
+ const a = facts[i];
417
+ const b = facts[j];
418
+ // Only compare within same module
419
+ if (a.module !== b.module)
420
+ continue;
421
+ const similarity = this.wordOverlap(a.fact, b.fact);
422
+ if (similarity >= 0.6) {
423
+ candidates.push({
424
+ a: a.id,
425
+ b: b.id,
426
+ similarity: `${Math.round(similarity * 100)}%`,
427
+ });
428
+ }
429
+ }
430
+ }
431
+ return candidates;
432
+ }
433
+ wordOverlap(textA, textB) {
434
+ const wordsA = new Set(textA.toLowerCase().split(/\W+/).filter((w) => w.length > 2));
435
+ const wordsB = new Set(textB.toLowerCase().split(/\W+/).filter((w) => w.length > 2));
436
+ if (wordsA.size === 0 || wordsB.size === 0)
437
+ return 0;
438
+ let overlap = 0;
439
+ for (const word of wordsA) {
440
+ if (wordsB.has(word))
441
+ overlap++;
442
+ }
443
+ return overlap / Math.max(wordsA.size, wordsB.size);
444
+ }
445
+ /** Close the database connection. */
446
+ close() {
447
+ this.db.close();
448
+ }
449
+ }
450
+ //# sourceMappingURL=sqlite.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.adapter.js","sourceRoot":"","sources":["../../src/adapters/sqlite.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,SAA2C,MAAM,QAAQ,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAqBpD,6EAA6E;AAE7E,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAgB;QAC1B,MAAM,EAAE,GAAG,CAAC,MAAgB;QAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAe;QAClD,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAa;QACtC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,MAAM,EAAE,GAAG,CAAC,MAAoB;KACjC,CAAC;AACJ,CAAC;AAED,6EAA6E;AAE7E,MAAM,OAAO,WAAW;IACd,EAAE,CAAW;IACJ,MAAM,CAAS;IACf,aAAa,CAAS;IAEvC,YAAoB,EAAY,EAAE,MAAc,EAAE,aAAqB;QACrE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,aAAqB;QACvD,0BAA0B;QAC1B,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhD,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,IAAI,EAAY,CAAC;QAEjB,iCAAiC;QACjC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACpC,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QACzD,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;KAiBX,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QAC7E,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QAC7E,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAEO,OAAO;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;QAC9B,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAEO,KAAK,CAAc,GAAW,EAAE,SAAqB,EAAE;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QAC3B,MAAM,IAAI,GAAO,EAAE,CAAC;QAEpB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,GAAG,GAA4B,EAAE,CAAC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACtC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,GAAQ,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,QAAQ,CAAc,GAAW,EAAE,SAAqB,EAAE;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAI,GAAG,EAAE,MAAM,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,yEAAyE;IAEzE,KAAK,CAAC,KAAK,CAAC,KAAgB;QAC1B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAExB,IAAI,CAAC,EAAE,CAAC,GAAG,CACT;0DACoD,EACpD;YACE,EAAE;YACF,KAAK,CAAC,IAAI;YACV,KAAK,CAAC,IAAI;YACV,KAAK,CAAC,MAAM;YACZ,KAAK,CAAC,UAAU,IAAI,GAAG;YACvB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,KAAK,CAAC,KAAK,IAAI,CAAC;YAChB,GAAG;YACH,GAAG;YACH,KAAK,CAAC,UAAU,IAAI,IAAI;SACzB,CACF,CAAC;QAEF,sCAAsC;QACtC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,mEAAmE,EAAE;gBAC/E,GAAG;gBACH,KAAK,CAAC,UAAU;aACjB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;QAEf,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,kCAAkC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAClD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,KAAyB;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,kCAAkC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,GAAa,CAAC,gBAAgB,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAc,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAoB,CAAC,CAAC;QACzF,IAAI,CAAC,OAAO,EAAE,CAAC;QAEf,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,kCAAkC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACnD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU,EAAE,OAAe;QACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,kCAAkC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,mEAAmE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,2EAA2E;IAE3E,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEhC,yBAAyB;QACzB,MAAM,UAAU,GAAa,CAAC,mBAAmB,CAAC,CAAC;QACnD,MAAM,MAAM,GAAe,EAAE,CAAC;QAE9B,oEAAoE;QACpE,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK;aACzB,WAAW,EAAE;aACb,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE/B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAC1C,4CAA4C,CAC7C,CAAC;YACF,UAAU,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvD,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAED,cAAc;QACd,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3D,UAAU,CAAC,IAAI,CAAC,YAAY,YAAY,GAAG,CAAC,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,yCAAyC;QACzC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC7B,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAEhC,sBAAsB;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,2CAA2C,WAAW,EAAE,EACxD,MAAM,CACP,CAAC;QACF,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QAE9C,uBAAuB;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CACrB;eACS,WAAW;;eAEX,EACT,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,CACnB,CAAC;QAEF,iCAAiC;QACjC,MAAM,WAAW,GAAG,IAAI;aACrB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACX,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACzC,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC1B,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAAE,UAAU,EAAE,CAAC;gBACzC,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAAE,UAAU,EAAE,CAAC;YAC3C,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QAC7B,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;gBAAE,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;YACtE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,CAAC,GAAG,CAAC,UAAU;gBAAE,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;YACtF,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1D,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAEpC,sCAAsC;QACtC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,EAAE,CAAC,GAAG,CACT,kFAAkF,EAClF,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CACf,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;QAEf,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;QAE1D,OAAO;YACL,KAAK,EAAE,WAAW;YAClB,YAAY;YACZ,WAAW;SACZ,CAAC;IACJ,CAAC;IAED,2EAA2E;IAE3E,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,kCAAkC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAE/C,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;YACxC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxD,CAAC,CAAC;YACH,aAAa,EAAE,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACvE,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAE1C,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACtE,MAAM,OAAO,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;YAElD,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;gBACxC,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAChC,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACxD,CAAC,CAAC;gBACH,aAAa,EAAE,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;QAElE,YAAY;QACZ,MAAM,QAAQ,GAA+B,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAClF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,CAAC;QAED,UAAU;QACV,MAAM,MAAM,GAA6B;YACvC,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,CAAC;YACT,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;YACd,SAAS,EAAE,CAAC;SACb,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,CAAC;QAED,YAAY;QACZ,MAAM,QAAQ,GAAoC,EAAE,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,8BAA8B;QAC9B,MAAM,YAAY,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,YAAY;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC;aACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEtB,mBAAmB;QACnB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAC7C,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC;QAElF,2DAA2D;QAC3D,MAAM,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;QAEtE,OAAO;YACL,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3B,QAAQ;YACR,MAAM;YACN,QAAQ;YACR,UAAU;YACV,eAAe;YACf,mBAAmB;YACnB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;IACJ,CAAC;IAED,2EAA2E;IAE3E,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CACrB,yDAAyD,CAC1D,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAEvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBACnC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,gEAAgE,EAAE;oBAC5E,GAAG;oBACH,MAAM,CAAC,IAAI,CAAC,EAAE;iBACf,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,mEAAmE,EAAE;oBAC/E,GAAG;oBACH,MAAM,CAAC,IAAI,CAAC,EAAE;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAA2B;QACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,EAAE,CAAC,GAAG,CACT;4DACoD,EACpD;gBACE,UAAU,EAAE;gBACZ,KAAK,CAAC,IAAI;gBACV,KAAK,CAAC,IAAI;gBACV,KAAK,CAAC,MAAM;gBACZ,KAAK,CAAC,UAAU,IAAI,GAAG;gBACvB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC;gBACrC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;gBAChC,KAAK,CAAC,KAAK,IAAI,CAAC;gBAChB,GAAG;gBACH,GAAG;gBACH,KAAK,CAAC,UAAU,IAAI,IAAI;aACzB,CACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,0EAA0E;IAE1E,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAkB,mCAAmC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,0EAA0E;IAElE,uBAAuB,CAC7B,KAAsB;QAEtB,MAAM,UAAU,GAAmD,EAAE,CAAC;QAEtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;gBACpB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;gBAEpB,kCAAkC;gBAClC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;oBAAE,SAAS;gBAEpC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBACpD,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;oBACtB,UAAU,CAAC,IAAI,CAAC;wBACd,CAAC,EAAE,CAAC,CAAC,EAAE;wBACP,CAAC,EAAE,CAAC,CAAC,EAAE;wBACP,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG;qBAC/C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,WAAW,CAAC,KAAa,EAAE,KAAa;QAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAErF,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAErD,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAC;QAClC,CAAC;QAED,OAAO,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,qCAAqC;IACrC,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF"}