agentcache 0.4.2 → 0.5.0-beta.2
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/README.md +282 -151
- package/dist/{chunk-T4COG3XD.js → chunk-R5I6WWSD.js} +31 -14
- package/dist/chunk-RXGW4Q3G.js +109 -0
- package/dist/chunk-XRJ6QW6N.js +92 -0
- package/dist/chunk-YKG6CDGT.js +1818 -0
- package/dist/chunk-YY7QXBG5.js +6610 -0
- package/dist/cli.js +2535 -292
- package/dist/device-id-RV7RO5RB.js +7 -0
- package/dist/ide-detector-ETGAVVXO.js +8 -0
- package/dist/mcp.d.ts +734 -2
- package/dist/mcp.js +1126 -446
- package/dist/{paths-5LZRKNYY.js → paths-NTZ2357O.js} +3 -2
- package/dist/postinstall.js +1 -65
- package/dist/setup-7JJPW3VG.js +48 -0
- package/docs/compatibility.md +152 -0
- package/docs/demo-script.md +121 -0
- package/docs/launch-copy.md +125 -0
- package/docs/privacy.md +173 -0
- package/docs/troubleshooting.md +209 -0
- package/package.json +32 -14
- package/dist/3-canonicalizer-HIN2F7SZ.js +0 -11
- package/dist/chunk-5UO7NJPQ.js +0 -71
- package/dist/chunk-CUBZRYS5.js +0 -580
- package/dist/chunk-GGAATZKM.js +0 -120
- package/dist/chunk-JUDLOBOC.js +0 -77
- package/dist/chunk-KFQGP6VL.js +0 -33
- package/dist/chunk-PSASDZQE.js +0 -490
- package/dist/chunk-SLRKWMSE.js +0 -202
- package/dist/chunk-T7BJPANN.js +0 -45
- package/dist/chunk-WTXSZBQE.js +0 -388
- package/dist/compile-all-PTWTZVP5.js +0 -495
- package/dist/ide-detector-5TRCR4F5.js +0 -7
- package/dist/pre-tool-use-A4AJHZOJ.js +0 -30
- package/dist/session-start-DGMGEAJU.js +0 -78
- package/dist/setup-CVG35TUZ.js +0 -51
- package/dist/sqlite-NM2BVHUY.js +0 -7
- package/dist/stop-WGGRX6TQ.js +0 -38
- package/dist/transcript-JWSGSDSF.js +0 -24
package/dist/chunk-JUDLOBOC.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getDataDir
|
|
3
|
-
} from "./chunk-T4COG3XD.js";
|
|
4
|
-
|
|
5
|
-
// src/utils/background-compile.ts
|
|
6
|
-
import { spawn } from "child_process";
|
|
7
|
-
import { existsSync, writeFileSync, readFileSync, unlinkSync, openSync, closeSync, constants } from "fs";
|
|
8
|
-
import { join } from "path";
|
|
9
|
-
var LOCK_FILE = "compile-all.lock";
|
|
10
|
-
var STALE_THRESHOLD_MS = 4 * 60 * 60 * 1e3;
|
|
11
|
-
function getLockPath() {
|
|
12
|
-
return join(getDataDir(), LOCK_FILE);
|
|
13
|
-
}
|
|
14
|
-
function isLocked() {
|
|
15
|
-
const lockPath = getLockPath();
|
|
16
|
-
if (!existsSync(lockPath)) return false;
|
|
17
|
-
try {
|
|
18
|
-
const content = readFileSync(lockPath, "utf-8");
|
|
19
|
-
const { pid, startedAt } = JSON.parse(content);
|
|
20
|
-
if (Date.now() - startedAt > STALE_THRESHOLD_MS) {
|
|
21
|
-
unlinkSync(lockPath);
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
try {
|
|
25
|
-
process.kill(pid, 0);
|
|
26
|
-
return true;
|
|
27
|
-
} catch {
|
|
28
|
-
unlinkSync(lockPath);
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
} catch {
|
|
32
|
-
unlinkSync(lockPath);
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
function spawnCompileAll() {
|
|
37
|
-
if (isLocked()) return false;
|
|
38
|
-
const agentcacheBin = process.argv[1]?.replace(/\/dist\/.*/, "/dist/cli.js") || "agentcache";
|
|
39
|
-
const isLinkedBinary = agentcacheBin.includes("dist/cli.js");
|
|
40
|
-
const cmd = isLinkedBinary ? process.execPath : "agentcache";
|
|
41
|
-
const args = isLinkedBinary ? [agentcacheBin, "compile-all"] : ["compile-all"];
|
|
42
|
-
const child = spawn(cmd, args, {
|
|
43
|
-
detached: true,
|
|
44
|
-
stdio: "ignore",
|
|
45
|
-
env: { ...process.env, AGENTCACHE_BACKGROUND: "1" }
|
|
46
|
-
});
|
|
47
|
-
child.unref();
|
|
48
|
-
try {
|
|
49
|
-
writeFileSync(getLockPath(), JSON.stringify({ pid: child.pid, startedAt: Date.now() }));
|
|
50
|
-
} catch {
|
|
51
|
-
}
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
function acquireLock() {
|
|
55
|
-
if (isLocked()) return false;
|
|
56
|
-
try {
|
|
57
|
-
const fd = openSync(getLockPath(), constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL);
|
|
58
|
-
const data = JSON.stringify({ pid: process.pid, startedAt: Date.now() });
|
|
59
|
-
writeFileSync(fd, data);
|
|
60
|
-
closeSync(fd);
|
|
61
|
-
return true;
|
|
62
|
-
} catch {
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
function releaseLock() {
|
|
67
|
-
try {
|
|
68
|
-
unlinkSync(getLockPath());
|
|
69
|
-
} catch {
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export {
|
|
74
|
-
spawnCompileAll,
|
|
75
|
-
acquireLock,
|
|
76
|
-
releaseLock
|
|
77
|
-
};
|
package/dist/chunk-KFQGP6VL.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
6
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
7
|
-
}) : x)(function(x) {
|
|
8
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
9
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
10
|
-
});
|
|
11
|
-
var __esm = (fn, res) => function __init() {
|
|
12
|
-
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
13
|
-
};
|
|
14
|
-
var __export = (target, all) => {
|
|
15
|
-
for (var name in all)
|
|
16
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
-
};
|
|
18
|
-
var __copyProps = (to, from, except, desc) => {
|
|
19
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
-
for (let key of __getOwnPropNames(from))
|
|
21
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
-
}
|
|
24
|
-
return to;
|
|
25
|
-
};
|
|
26
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
-
|
|
28
|
-
export {
|
|
29
|
-
__require,
|
|
30
|
-
__esm,
|
|
31
|
-
__export,
|
|
32
|
-
__toCommonJS
|
|
33
|
-
};
|
package/dist/chunk-PSASDZQE.js
DELETED
|
@@ -1,490 +0,0 @@
|
|
|
1
|
-
// src/storage/sqlite.ts
|
|
2
|
-
import Database from "better-sqlite3";
|
|
3
|
-
var SqliteKnowledgeRepository = class {
|
|
4
|
-
db;
|
|
5
|
-
constructor(dbPath) {
|
|
6
|
-
this.db = new Database(dbPath);
|
|
7
|
-
this.db.pragma("journal_mode = WAL");
|
|
8
|
-
this.db.pragma("foreign_keys = ON");
|
|
9
|
-
this.initSchema();
|
|
10
|
-
}
|
|
11
|
-
initSchema() {
|
|
12
|
-
this.db.exec(`
|
|
13
|
-
CREATE TABLE IF NOT EXISTS sessions (
|
|
14
|
-
id TEXT PRIMARY KEY,
|
|
15
|
-
project TEXT NOT NULL,
|
|
16
|
-
started_at INTEGER NOT NULL,
|
|
17
|
-
ended_at INTEGER NOT NULL,
|
|
18
|
-
git_branch TEXT,
|
|
19
|
-
git_commit TEXT,
|
|
20
|
-
provider TEXT NOT NULL DEFAULT 'claude',
|
|
21
|
-
model TEXT NOT NULL,
|
|
22
|
-
transcript_path TEXT NOT NULL,
|
|
23
|
-
observation_count INTEGER NOT NULL DEFAULT 0
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
CREATE TABLE IF NOT EXISTS observations (
|
|
27
|
-
id TEXT PRIMARY KEY,
|
|
28
|
-
session_id TEXT NOT NULL REFERENCES sessions(id),
|
|
29
|
-
timestamp INTEGER NOT NULL,
|
|
30
|
-
type TEXT NOT NULL,
|
|
31
|
-
content TEXT NOT NULL,
|
|
32
|
-
source_quote TEXT NOT NULL,
|
|
33
|
-
confidence TEXT NOT NULL,
|
|
34
|
-
project TEXT NOT NULL,
|
|
35
|
-
scope TEXT NOT NULL DEFAULT 'project'
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
CREATE TABLE IF NOT EXISTS knowledge_items (
|
|
39
|
-
id TEXT PRIMARY KEY,
|
|
40
|
-
canonical_hash TEXT NOT NULL UNIQUE,
|
|
41
|
-
type TEXT NOT NULL,
|
|
42
|
-
title TEXT NOT NULL,
|
|
43
|
-
content TEXT NOT NULL,
|
|
44
|
-
confidence TEXT NOT NULL DEFAULT 'low',
|
|
45
|
-
observation_count INTEGER NOT NULL DEFAULT 1,
|
|
46
|
-
authority TEXT NOT NULL DEFAULT 'AUTO',
|
|
47
|
-
status TEXT NOT NULL DEFAULT 'active',
|
|
48
|
-
superseded_by_id TEXT,
|
|
49
|
-
enforce INTEGER NOT NULL DEFAULT 0,
|
|
50
|
-
project TEXT NOT NULL,
|
|
51
|
-
scope TEXT NOT NULL DEFAULT 'project',
|
|
52
|
-
created_at INTEGER NOT NULL,
|
|
53
|
-
updated_at INTEGER NOT NULL,
|
|
54
|
-
last_seen_at INTEGER NOT NULL,
|
|
55
|
-
metadata TEXT NOT NULL DEFAULT '{}'
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
CREATE TABLE IF NOT EXISTS compile_runs (
|
|
59
|
-
id TEXT PRIMARY KEY,
|
|
60
|
-
project TEXT NOT NULL,
|
|
61
|
-
session_id TEXT REFERENCES sessions(id),
|
|
62
|
-
compiler_version TEXT NOT NULL,
|
|
63
|
-
prompt_versions TEXT NOT NULL DEFAULT '{}',
|
|
64
|
-
started_at INTEGER NOT NULL,
|
|
65
|
-
ended_at INTEGER NOT NULL,
|
|
66
|
-
duration_ms INTEGER NOT NULL,
|
|
67
|
-
observations_processed INTEGER NOT NULL DEFAULT 0,
|
|
68
|
-
knowledge_created INTEGER NOT NULL DEFAULT 0,
|
|
69
|
-
knowledge_reinforced INTEGER NOT NULL DEFAULT 0,
|
|
70
|
-
knowledge_deprecated INTEGER NOT NULL DEFAULT 0,
|
|
71
|
-
knowledge_superseded INTEGER NOT NULL DEFAULT 0,
|
|
72
|
-
knowledge_ignored INTEGER NOT NULL DEFAULT 0,
|
|
73
|
-
contradictions_detected INTEGER NOT NULL DEFAULT 0,
|
|
74
|
-
diagnostics TEXT
|
|
75
|
-
);
|
|
76
|
-
|
|
77
|
-
CREATE TABLE IF NOT EXISTS contradictions (
|
|
78
|
-
id TEXT PRIMARY KEY,
|
|
79
|
-
project TEXT NOT NULL,
|
|
80
|
-
item_a_id TEXT NOT NULL,
|
|
81
|
-
item_b_id TEXT NOT NULL,
|
|
82
|
-
topic TEXT NOT NULL,
|
|
83
|
-
description TEXT NOT NULL,
|
|
84
|
-
recommendation TEXT NOT NULL,
|
|
85
|
-
resolved INTEGER NOT NULL DEFAULT 0,
|
|
86
|
-
created_at INTEGER NOT NULL
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
CREATE TABLE IF NOT EXISTS pending_transcripts (
|
|
90
|
-
id TEXT PRIMARY KEY,
|
|
91
|
-
transcript_path TEXT NOT NULL UNIQUE,
|
|
92
|
-
project TEXT NOT NULL,
|
|
93
|
-
project_root TEXT NOT NULL,
|
|
94
|
-
provider TEXT NOT NULL,
|
|
95
|
-
queued_at INTEGER NOT NULL
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
CREATE INDEX IF NOT EXISTS idx_observations_project ON observations(project);
|
|
99
|
-
CREATE INDEX IF NOT EXISTS idx_observations_session ON observations(session_id);
|
|
100
|
-
CREATE INDEX IF NOT EXISTS idx_knowledge_project ON knowledge_items(project);
|
|
101
|
-
CREATE INDEX IF NOT EXISTS idx_knowledge_enforce ON knowledge_items(enforce);
|
|
102
|
-
CREATE INDEX IF NOT EXISTS idx_knowledge_status ON knowledge_items(status);
|
|
103
|
-
CREATE INDEX IF NOT EXISTS idx_ki_scope_status ON knowledge_items(scope, status);
|
|
104
|
-
CREATE INDEX IF NOT EXISTS idx_ki_project_status ON knowledge_items(project, status);
|
|
105
|
-
CREATE INDEX IF NOT EXISTS idx_compile_runs_project ON compile_runs(project);
|
|
106
|
-
CREATE INDEX IF NOT EXISTS idx_contradictions_project ON contradictions(project, resolved);
|
|
107
|
-
`);
|
|
108
|
-
}
|
|
109
|
-
saveSession(session) {
|
|
110
|
-
this.db.prepare(
|
|
111
|
-
`INSERT INTO sessions (id, project, started_at, ended_at, git_branch, git_commit, provider, model, transcript_path, observation_count)
|
|
112
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
113
|
-
).run(
|
|
114
|
-
session.id,
|
|
115
|
-
session.project,
|
|
116
|
-
session.startedAt,
|
|
117
|
-
session.endedAt,
|
|
118
|
-
session.gitBranch,
|
|
119
|
-
session.gitCommit,
|
|
120
|
-
session.provider,
|
|
121
|
-
session.model,
|
|
122
|
-
session.transcriptPath,
|
|
123
|
-
session.observationCount
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
getSession(id) {
|
|
127
|
-
const row = this.db.prepare("SELECT * FROM sessions WHERE id = ?").get(id);
|
|
128
|
-
if (!row) return null;
|
|
129
|
-
return this.mapSession(row);
|
|
130
|
-
}
|
|
131
|
-
updateSessionTranscriptPath(sessionId, transcriptPath) {
|
|
132
|
-
this.db.prepare("UPDATE sessions SET transcript_path = ? WHERE id = ?").run(transcriptPath, sessionId);
|
|
133
|
-
}
|
|
134
|
-
getCompiledTranscriptPaths(project) {
|
|
135
|
-
const rows = this.db.prepare("SELECT transcript_path FROM sessions WHERE project = ? AND transcript_path != ''").all(project);
|
|
136
|
-
return rows.map((r) => r.transcript_path);
|
|
137
|
-
}
|
|
138
|
-
getAllCompiledTranscriptPaths() {
|
|
139
|
-
const rows = this.db.prepare("SELECT transcript_path FROM sessions WHERE transcript_path != ''").all();
|
|
140
|
-
return rows.map((r) => r.transcript_path);
|
|
141
|
-
}
|
|
142
|
-
saveObservation(obs) {
|
|
143
|
-
this.db.prepare(
|
|
144
|
-
`INSERT INTO observations (id, session_id, timestamp, type, content, source_quote, confidence, project, scope)
|
|
145
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
146
|
-
).run(
|
|
147
|
-
obs.id,
|
|
148
|
-
obs.sessionId,
|
|
149
|
-
obs.timestamp,
|
|
150
|
-
obs.type,
|
|
151
|
-
obs.content,
|
|
152
|
-
obs.sourceQuote,
|
|
153
|
-
obs.confidence,
|
|
154
|
-
obs.project,
|
|
155
|
-
obs.scope
|
|
156
|
-
);
|
|
157
|
-
}
|
|
158
|
-
saveObservations(obs) {
|
|
159
|
-
const insert = this.db.prepare(
|
|
160
|
-
`INSERT INTO observations (id, session_id, timestamp, type, content, source_quote, confidence, project, scope)
|
|
161
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
162
|
-
);
|
|
163
|
-
const transaction = this.db.transaction((observations) => {
|
|
164
|
-
for (const o of observations) {
|
|
165
|
-
insert.run(
|
|
166
|
-
o.id,
|
|
167
|
-
o.sessionId,
|
|
168
|
-
o.timestamp,
|
|
169
|
-
o.type,
|
|
170
|
-
o.content,
|
|
171
|
-
o.sourceQuote,
|
|
172
|
-
o.confidence,
|
|
173
|
-
o.project,
|
|
174
|
-
o.scope
|
|
175
|
-
);
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
transaction(obs);
|
|
179
|
-
}
|
|
180
|
-
getObservations(project, since) {
|
|
181
|
-
let sql = "SELECT * FROM observations WHERE project = ?";
|
|
182
|
-
const params = [project];
|
|
183
|
-
if (since !== void 0) {
|
|
184
|
-
sql += " AND timestamp >= ?";
|
|
185
|
-
params.push(since);
|
|
186
|
-
}
|
|
187
|
-
const rows = this.db.prepare(sql).all(...params);
|
|
188
|
-
return rows.map((row) => this.mapObservation(row));
|
|
189
|
-
}
|
|
190
|
-
saveKnowledgeItem(item) {
|
|
191
|
-
this.db.prepare(
|
|
192
|
-
`INSERT INTO knowledge_items (id, canonical_hash, type, title, content, confidence, observation_count, authority, status, superseded_by_id, enforce, project, scope, created_at, updated_at, last_seen_at, metadata)
|
|
193
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
194
|
-
).run(
|
|
195
|
-
item.id,
|
|
196
|
-
item.canonicalHash,
|
|
197
|
-
item.type,
|
|
198
|
-
item.title,
|
|
199
|
-
item.content,
|
|
200
|
-
item.confidence,
|
|
201
|
-
item.observationCount,
|
|
202
|
-
item.authority,
|
|
203
|
-
item.status,
|
|
204
|
-
item.supersededById ?? null,
|
|
205
|
-
item.enforce ? 1 : 0,
|
|
206
|
-
item.project,
|
|
207
|
-
item.scope,
|
|
208
|
-
item.createdAt,
|
|
209
|
-
item.updatedAt,
|
|
210
|
-
item.lastSeenAt,
|
|
211
|
-
JSON.stringify(item.metadata)
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
-
updateKnowledgeItem(id, patch) {
|
|
215
|
-
const fieldMap = {
|
|
216
|
-
canonicalHash: "canonical_hash",
|
|
217
|
-
type: "type",
|
|
218
|
-
title: "title",
|
|
219
|
-
content: "content",
|
|
220
|
-
confidence: "confidence",
|
|
221
|
-
observationCount: "observation_count",
|
|
222
|
-
authority: "authority",
|
|
223
|
-
status: "status",
|
|
224
|
-
supersededById: "superseded_by_id",
|
|
225
|
-
enforce: "enforce",
|
|
226
|
-
project: "project",
|
|
227
|
-
scope: "scope",
|
|
228
|
-
createdAt: "created_at",
|
|
229
|
-
updatedAt: "updated_at",
|
|
230
|
-
lastSeenAt: "last_seen_at",
|
|
231
|
-
metadata: "metadata"
|
|
232
|
-
};
|
|
233
|
-
const setClauses = [];
|
|
234
|
-
const values = [];
|
|
235
|
-
for (const [key, value] of Object.entries(patch)) {
|
|
236
|
-
const column = fieldMap[key];
|
|
237
|
-
if (!column) continue;
|
|
238
|
-
setClauses.push(`${column} = ?`);
|
|
239
|
-
if (key === "enforce") {
|
|
240
|
-
values.push(value ? 1 : 0);
|
|
241
|
-
} else if (key === "metadata") {
|
|
242
|
-
values.push(JSON.stringify(value));
|
|
243
|
-
} else {
|
|
244
|
-
values.push(value);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
if (setClauses.length === 0) return;
|
|
248
|
-
values.push(id);
|
|
249
|
-
this.db.prepare(`UPDATE knowledge_items SET ${setClauses.join(", ")} WHERE id = ?`).run(...values);
|
|
250
|
-
}
|
|
251
|
-
getKnowledgeItems(project, filter) {
|
|
252
|
-
let sql = "SELECT * FROM knowledge_items WHERE project = ?";
|
|
253
|
-
const params = [project];
|
|
254
|
-
if (filter) {
|
|
255
|
-
if (filter.type !== void 0) {
|
|
256
|
-
sql += " AND type = ?";
|
|
257
|
-
params.push(filter.type);
|
|
258
|
-
}
|
|
259
|
-
if (filter.status !== void 0) {
|
|
260
|
-
sql += " AND status = ?";
|
|
261
|
-
params.push(filter.status);
|
|
262
|
-
}
|
|
263
|
-
if (filter.enforce !== void 0) {
|
|
264
|
-
sql += " AND enforce = ?";
|
|
265
|
-
params.push(filter.enforce ? 1 : 0);
|
|
266
|
-
}
|
|
267
|
-
if (filter.authority !== void 0) {
|
|
268
|
-
sql += " AND authority = ?";
|
|
269
|
-
params.push(filter.authority);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
const rows = this.db.prepare(sql).all(...params);
|
|
273
|
-
return rows.map((row) => this.mapKnowledgeItem(row));
|
|
274
|
-
}
|
|
275
|
-
getKnowledgeItem(id) {
|
|
276
|
-
const row = this.db.prepare("SELECT * FROM knowledge_items WHERE id = ?").get(id);
|
|
277
|
-
if (!row) return null;
|
|
278
|
-
return this.mapKnowledgeItem(row);
|
|
279
|
-
}
|
|
280
|
-
getKnowledgeForContext(project, opts) {
|
|
281
|
-
const decayThreshold = Date.now() - 30 * 24 * 60 * 60 * 1e3;
|
|
282
|
-
this.db.prepare(
|
|
283
|
-
`UPDATE knowledge_items SET status = 'archived', updated_at = ?
|
|
284
|
-
WHERE status = 'active' AND authority = 'AUTO' AND last_seen_at < ?`
|
|
285
|
-
).run(Date.now(), decayThreshold);
|
|
286
|
-
const authorityFilter = opts?.userOnly ? `AND authority = 'USER'` : `AND (authority = 'USER' OR observation_count >= 2)`;
|
|
287
|
-
const rows = this.db.prepare(
|
|
288
|
-
`SELECT * FROM knowledge_items WHERE status = 'active'
|
|
289
|
-
AND (scope = 'global' OR project = ?)
|
|
290
|
-
${authorityFilter}
|
|
291
|
-
ORDER BY
|
|
292
|
-
CASE authority WHEN 'USER' THEN 0 ELSE 1 END,
|
|
293
|
-
CASE confidence WHEN 'high' THEN 3 WHEN 'medium' THEN 2 ELSE 1 END DESC,
|
|
294
|
-
last_seen_at DESC
|
|
295
|
-
LIMIT 50`
|
|
296
|
-
).all(project);
|
|
297
|
-
return rows.map((row) => this.mapKnowledgeItem(row));
|
|
298
|
-
}
|
|
299
|
-
getEnforcedRules(project) {
|
|
300
|
-
const rows = this.db.prepare(
|
|
301
|
-
`SELECT * FROM knowledge_items WHERE enforce = 1 AND status = 'active'
|
|
302
|
-
AND (scope = 'global' OR project = ?)
|
|
303
|
-
AND (authority = 'USER' OR observation_count >= 2)`
|
|
304
|
-
).all(project);
|
|
305
|
-
return rows.map((row) => this.mapKnowledgeItem(row));
|
|
306
|
-
}
|
|
307
|
-
saveCompileRun(run) {
|
|
308
|
-
this.db.prepare(
|
|
309
|
-
`INSERT INTO compile_runs (id, project, session_id, compiler_version, prompt_versions, started_at, ended_at, duration_ms, observations_processed, knowledge_created, knowledge_reinforced, knowledge_deprecated, knowledge_superseded, knowledge_ignored, contradictions_detected, diagnostics)
|
|
310
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
311
|
-
).run(
|
|
312
|
-
run.id,
|
|
313
|
-
run.project,
|
|
314
|
-
run.sessionId,
|
|
315
|
-
run.compilerVersion,
|
|
316
|
-
JSON.stringify(run.promptVersions),
|
|
317
|
-
run.startedAt,
|
|
318
|
-
run.endedAt,
|
|
319
|
-
run.durationMs,
|
|
320
|
-
run.observationsProcessed,
|
|
321
|
-
run.knowledgeCreated,
|
|
322
|
-
run.knowledgeReinforced,
|
|
323
|
-
run.knowledgeDeprecated,
|
|
324
|
-
run.knowledgeSuperseded,
|
|
325
|
-
run.knowledgeIgnored,
|
|
326
|
-
run.contradictionsDetected,
|
|
327
|
-
run.diagnostics
|
|
328
|
-
);
|
|
329
|
-
}
|
|
330
|
-
getCompileRuns(project, limit) {
|
|
331
|
-
let sql = "SELECT * FROM compile_runs WHERE project = ? ORDER BY started_at DESC";
|
|
332
|
-
const params = [project];
|
|
333
|
-
if (limit !== void 0) {
|
|
334
|
-
sql += " LIMIT ?";
|
|
335
|
-
params.push(limit);
|
|
336
|
-
}
|
|
337
|
-
const rows = this.db.prepare(sql).all(...params);
|
|
338
|
-
return rows.map((row) => this.mapCompileRun(row));
|
|
339
|
-
}
|
|
340
|
-
saveContradiction(report) {
|
|
341
|
-
this.db.prepare(
|
|
342
|
-
`INSERT INTO contradictions (id, project, item_a_id, item_b_id, topic, description, recommendation, resolved, created_at)
|
|
343
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
344
|
-
).run(
|
|
345
|
-
report.id,
|
|
346
|
-
report.project,
|
|
347
|
-
report.itemAId,
|
|
348
|
-
report.itemBId,
|
|
349
|
-
report.topic,
|
|
350
|
-
report.description,
|
|
351
|
-
report.recommendation,
|
|
352
|
-
report.resolved ? 1 : 0,
|
|
353
|
-
report.createdAt
|
|
354
|
-
);
|
|
355
|
-
}
|
|
356
|
-
getUnresolvedContradictions(project) {
|
|
357
|
-
const rows = this.db.prepare("SELECT * FROM contradictions WHERE project = ? AND resolved = 0").all(project);
|
|
358
|
-
return rows.map((row) => this.mapContradiction(row));
|
|
359
|
-
}
|
|
360
|
-
resolveContradiction(id) {
|
|
361
|
-
this.db.prepare("UPDATE contradictions SET resolved = 1 WHERE id = ?").run(id);
|
|
362
|
-
}
|
|
363
|
-
queueTranscript(entry) {
|
|
364
|
-
this.db.prepare(
|
|
365
|
-
`INSERT OR IGNORE INTO pending_transcripts (id, transcript_path, project, project_root, provider, queued_at)
|
|
366
|
-
VALUES (?, ?, ?, ?, ?, ?)`
|
|
367
|
-
).run(entry.id, entry.transcriptPath, entry.project, entry.projectRoot, entry.provider, entry.queuedAt);
|
|
368
|
-
}
|
|
369
|
-
popPendingTranscript() {
|
|
370
|
-
const row = this.db.prepare("SELECT * FROM pending_transcripts ORDER BY queued_at ASC LIMIT 1").get();
|
|
371
|
-
if (!row) return null;
|
|
372
|
-
this.db.prepare("DELETE FROM pending_transcripts WHERE id = ?").run(row.id);
|
|
373
|
-
return {
|
|
374
|
-
id: row.id,
|
|
375
|
-
transcriptPath: row.transcript_path,
|
|
376
|
-
project: row.project,
|
|
377
|
-
projectRoot: row.project_root,
|
|
378
|
-
provider: row.provider,
|
|
379
|
-
queuedAt: row.queued_at
|
|
380
|
-
};
|
|
381
|
-
}
|
|
382
|
-
getPendingCount() {
|
|
383
|
-
const row = this.db.prepare("SELECT COUNT(*) as count FROM pending_transcripts").get();
|
|
384
|
-
return row.count;
|
|
385
|
-
}
|
|
386
|
-
grandfatherExistingItems() {
|
|
387
|
-
this.db.prepare(
|
|
388
|
-
`UPDATE knowledge_items SET observation_count = 2 WHERE authority = 'AUTO' AND observation_count < 2 AND status = 'active'`
|
|
389
|
-
).run();
|
|
390
|
-
}
|
|
391
|
-
getQuarantinedItems(project) {
|
|
392
|
-
const sql = project ? `SELECT * FROM knowledge_items WHERE status = 'active' AND authority = 'AUTO' AND observation_count < 2 AND (scope = 'global' OR project = ?) ORDER BY created_at DESC` : `SELECT * FROM knowledge_items WHERE status = 'active' AND authority = 'AUTO' AND observation_count < 2 ORDER BY created_at DESC`;
|
|
393
|
-
const rows = project ? this.db.prepare(sql).all(project) : this.db.prepare(sql).all();
|
|
394
|
-
return rows.map((row) => this.mapKnowledgeItem(row));
|
|
395
|
-
}
|
|
396
|
-
promoteItem(id) {
|
|
397
|
-
this.db.prepare("UPDATE knowledge_items SET authority = 'USER', updated_at = ? WHERE id = ?").run(Date.now(), id);
|
|
398
|
-
}
|
|
399
|
-
getProjectStats() {
|
|
400
|
-
return this.db.prepare("SELECT project, COUNT(*) as count FROM knowledge_items WHERE status = 'active' GROUP BY project ORDER BY count DESC").all();
|
|
401
|
-
}
|
|
402
|
-
close() {
|
|
403
|
-
this.db.close();
|
|
404
|
-
}
|
|
405
|
-
mapSession(row) {
|
|
406
|
-
return {
|
|
407
|
-
id: row.id,
|
|
408
|
-
project: row.project,
|
|
409
|
-
startedAt: row.started_at,
|
|
410
|
-
endedAt: row.ended_at,
|
|
411
|
-
gitBranch: row.git_branch,
|
|
412
|
-
gitCommit: row.git_commit,
|
|
413
|
-
provider: row.provider,
|
|
414
|
-
model: row.model,
|
|
415
|
-
transcriptPath: row.transcript_path,
|
|
416
|
-
observationCount: row.observation_count
|
|
417
|
-
};
|
|
418
|
-
}
|
|
419
|
-
mapObservation(row) {
|
|
420
|
-
return {
|
|
421
|
-
id: row.id,
|
|
422
|
-
sessionId: row.session_id,
|
|
423
|
-
timestamp: row.timestamp,
|
|
424
|
-
type: row.type,
|
|
425
|
-
content: row.content,
|
|
426
|
-
sourceQuote: row.source_quote,
|
|
427
|
-
confidence: row.confidence,
|
|
428
|
-
project: row.project,
|
|
429
|
-
scope: row.scope || "project"
|
|
430
|
-
};
|
|
431
|
-
}
|
|
432
|
-
mapKnowledgeItem(row) {
|
|
433
|
-
return {
|
|
434
|
-
id: row.id,
|
|
435
|
-
canonicalHash: row.canonical_hash,
|
|
436
|
-
type: row.type,
|
|
437
|
-
title: row.title,
|
|
438
|
-
content: row.content,
|
|
439
|
-
confidence: row.confidence,
|
|
440
|
-
observationCount: row.observation_count,
|
|
441
|
-
authority: row.authority,
|
|
442
|
-
status: row.status,
|
|
443
|
-
supersededById: row.superseded_by_id ?? void 0,
|
|
444
|
-
enforce: row.enforce === 1,
|
|
445
|
-
project: row.project,
|
|
446
|
-
scope: row.scope || "project",
|
|
447
|
-
createdAt: row.created_at,
|
|
448
|
-
updatedAt: row.updated_at,
|
|
449
|
-
lastSeenAt: row.last_seen_at,
|
|
450
|
-
metadata: JSON.parse(row.metadata)
|
|
451
|
-
};
|
|
452
|
-
}
|
|
453
|
-
mapCompileRun(row) {
|
|
454
|
-
return {
|
|
455
|
-
id: row.id,
|
|
456
|
-
project: row.project,
|
|
457
|
-
sessionId: row.session_id,
|
|
458
|
-
compilerVersion: row.compiler_version,
|
|
459
|
-
promptVersions: JSON.parse(row.prompt_versions),
|
|
460
|
-
startedAt: row.started_at,
|
|
461
|
-
endedAt: row.ended_at,
|
|
462
|
-
durationMs: row.duration_ms,
|
|
463
|
-
observationsProcessed: row.observations_processed,
|
|
464
|
-
knowledgeCreated: row.knowledge_created,
|
|
465
|
-
knowledgeReinforced: row.knowledge_reinforced,
|
|
466
|
-
knowledgeDeprecated: row.knowledge_deprecated,
|
|
467
|
-
knowledgeSuperseded: row.knowledge_superseded,
|
|
468
|
-
knowledgeIgnored: row.knowledge_ignored,
|
|
469
|
-
contradictionsDetected: row.contradictions_detected,
|
|
470
|
-
diagnostics: row.diagnostics
|
|
471
|
-
};
|
|
472
|
-
}
|
|
473
|
-
mapContradiction(row) {
|
|
474
|
-
return {
|
|
475
|
-
id: row.id,
|
|
476
|
-
project: row.project,
|
|
477
|
-
itemAId: row.item_a_id,
|
|
478
|
-
itemBId: row.item_b_id,
|
|
479
|
-
topic: row.topic,
|
|
480
|
-
description: row.description,
|
|
481
|
-
recommendation: row.recommendation,
|
|
482
|
-
resolved: row.resolved === 1,
|
|
483
|
-
createdAt: row.created_at
|
|
484
|
-
};
|
|
485
|
-
}
|
|
486
|
-
};
|
|
487
|
-
|
|
488
|
-
export {
|
|
489
|
-
SqliteKnowledgeRepository
|
|
490
|
-
};
|