@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.
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/dist/adapters/sqlite.adapter.d.ts +29 -0
- package/dist/adapters/sqlite.adapter.d.ts.map +1 -0
- package/dist/adapters/sqlite.adapter.js +450 -0
- package/dist/adapters/sqlite.adapter.js.map +1 -0
- package/dist/adapters/weaviate.adapter.d.ts +43 -0
- package/dist/adapters/weaviate.adapter.d.ts.map +1 -0
- package/dist/adapters/weaviate.adapter.js +678 -0
- package/dist/adapters/weaviate.adapter.js.map +1 -0
- package/dist/cli/audit.d.ts +2 -0
- package/dist/cli/audit.d.ts.map +1 -0
- package/dist/cli/audit.js +50 -0
- package/dist/cli/audit.js.map +1 -0
- package/dist/cli/migrate-to-weaviate.d.ts +2 -0
- package/dist/cli/migrate-to-weaviate.d.ts.map +1 -0
- package/dist/cli/migrate-to-weaviate.js +65 -0
- package/dist/cli/migrate-to-weaviate.js.map +1 -0
- package/dist/cli/stale.d.ts +2 -0
- package/dist/cli/stale.d.ts.map +1 -0
- package/dist/cli/stale.js +27 -0
- package/dist/cli/stale.js.map +1 -0
- package/dist/cli/sync-ddd-docs.d.ts +2 -0
- package/dist/cli/sync-ddd-docs.d.ts.map +1 -0
- package/dist/cli/sync-ddd-docs.js +88 -0
- package/dist/cli/sync-ddd-docs.js.map +1 -0
- package/dist/cli/verify.d.ts +2 -0
- package/dist/cli/verify.d.ts.map +1 -0
- package/dist/cli/verify.js +36 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/hooks/post-commit.d.ts +13 -0
- package/dist/hooks/post-commit.d.ts.map +1 -0
- package/dist/hooks/post-commit.js +197 -0
- package/dist/hooks/post-commit.js.map +1 -0
- package/dist/ports/cognitive-store.port.d.ts +34 -0
- package/dist/ports/cognitive-store.port.d.ts.map +1 -0
- package/dist/ports/cognitive-store.port.js +2 -0
- package/dist/ports/cognitive-store.port.js.map +1 -0
- package/dist/profiles/agent-profiles.d.ts +20 -0
- package/dist/profiles/agent-profiles.d.ts.map +1 -0
- package/dist/profiles/agent-profiles.js +74 -0
- package/dist/profiles/agent-profiles.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +59 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/audit.tool.d.ts +8 -0
- package/dist/tools/audit.tool.d.ts.map +1 -0
- package/dist/tools/audit.tool.js +71 -0
- package/dist/tools/audit.tool.js.map +1 -0
- package/dist/tools/recall.tool.d.ts +30 -0
- package/dist/tools/recall.tool.d.ts.map +1 -0
- package/dist/tools/recall.tool.js +43 -0
- package/dist/tools/recall.tool.js.map +1 -0
- package/dist/tools/store.tool.d.ts +34 -0
- package/dist/tools/store.tool.d.ts.map +1 -0
- package/dist/tools/store.tool.js +51 -0
- package/dist/tools/store.tool.js.map +1 -0
- package/dist/tools/verify.tool.d.ts +10 -0
- package/dist/tools/verify.tool.d.ts.map +1 -0
- package/dist/tools/verify.tool.js +56 -0
- package/dist/tools/verify.tool.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/citation-checker.d.ts +21 -0
- package/dist/utils/citation-checker.d.ts.map +1 -0
- package/dist/utils/citation-checker.js +84 -0
- package/dist/utils/citation-checker.js.map +1 -0
- package/dist/utils/decay.d.ts +16 -0
- package/dist/utils/decay.d.ts.map +1 -0
- package/dist/utils/decay.js +62 -0
- package/dist/utils/decay.js.map +1 -0
- 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":"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"}
|