ds4-context-core 0.1.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 +80 -0
- package/dist/artifacts/artifact-manager.d.ts +58 -0
- package/dist/artifacts/artifact-manager.d.ts.map +1 -0
- package/dist/artifacts/artifact-manager.js +445 -0
- package/dist/artifacts/artifact-manager.js.map +1 -0
- package/dist/artifacts/artifact-store.d.ts +33 -0
- package/dist/artifacts/artifact-store.d.ts.map +1 -0
- package/dist/artifacts/artifact-store.js +116 -0
- package/dist/artifacts/artifact-store.js.map +1 -0
- package/dist/compaction/compaction-record.d.ts +74 -0
- package/dist/compaction/compaction-record.d.ts.map +1 -0
- package/dist/compaction/compaction-record.js +113 -0
- package/dist/compaction/compaction-record.js.map +1 -0
- package/dist/compaction/summary-contract.d.ts +68 -0
- package/dist/compaction/summary-contract.d.ts.map +1 -0
- package/dist/compaction/summary-contract.js +315 -0
- package/dist/compaction/summary-contract.js.map +1 -0
- package/dist/compaction/summary-graph.d.ts +48 -0
- package/dist/compaction/summary-graph.d.ts.map +1 -0
- package/dist/compaction/summary-graph.js +123 -0
- package/dist/compaction/summary-graph.js.map +1 -0
- package/dist/config/config-loader.d.ts +18 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +305 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config.d.ts +113 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +89 -0
- package/dist/config/config.js.map +1 -0
- package/dist/continuation/native-continuation.d.ts +107 -0
- package/dist/continuation/native-continuation.d.ts.map +1 -0
- package/dist/continuation/native-continuation.js +374 -0
- package/dist/continuation/native-continuation.js.map +1 -0
- package/dist/core/budget-manager.d.ts +26 -0
- package/dist/core/budget-manager.d.ts.map +1 -0
- package/dist/core/budget-manager.js +42 -0
- package/dist/core/budget-manager.js.map +1 -0
- package/dist/core/canonical-message.d.ts +69 -0
- package/dist/core/canonical-message.d.ts.map +1 -0
- package/dist/core/canonical-message.js +2 -0
- package/dist/core/canonical-message.js.map +1 -0
- package/dist/core/model-awareness.d.ts +59 -0
- package/dist/core/model-awareness.d.ts.map +1 -0
- package/dist/core/model-awareness.js +177 -0
- package/dist/core/model-awareness.js.map +1 -0
- package/dist/core/model-profile.d.ts +27 -0
- package/dist/core/model-profile.d.ts.map +1 -0
- package/dist/core/model-profile.js +29 -0
- package/dist/core/model-profile.js.map +1 -0
- package/dist/core/token-estimator.d.ts +4 -0
- package/dist/core/token-estimator.d.ts.map +1 -0
- package/dist/core/token-estimator.js +64 -0
- package/dist/core/token-estimator.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest/context-manifest.d.ts +163 -0
- package/dist/manifest/context-manifest.d.ts.map +1 -0
- package/dist/manifest/context-manifest.js +2 -0
- package/dist/manifest/context-manifest.js.map +1 -0
- package/dist/manifest/observer.d.ts +63 -0
- package/dist/manifest/observer.d.ts.map +1 -0
- package/dist/manifest/observer.js +150 -0
- package/dist/manifest/observer.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +112 -0
- package/dist/memory/memory-manager.d.ts.map +1 -0
- package/dist/memory/memory-manager.js +499 -0
- package/dist/memory/memory-manager.js.map +1 -0
- package/dist/memory/memory-types.d.ts +126 -0
- package/dist/memory/memory-types.d.ts.map +1 -0
- package/dist/memory/memory-types.js +73 -0
- package/dist/memory/memory-types.js.map +1 -0
- package/dist/persistence/migrations.d.ts +17 -0
- package/dist/persistence/migrations.d.ts.map +1 -0
- package/dist/persistence/migrations.js +588 -0
- package/dist/persistence/migrations.js.map +1 -0
- package/dist/persistence/repositories/artifact-repository.d.ts +50 -0
- package/dist/persistence/repositories/artifact-repository.d.ts.map +1 -0
- package/dist/persistence/repositories/artifact-repository.js +186 -0
- package/dist/persistence/repositories/artifact-repository.js.map +1 -0
- package/dist/persistence/repositories/context-manifest-repository.d.ts +19 -0
- package/dist/persistence/repositories/context-manifest-repository.d.ts.map +1 -0
- package/dist/persistence/repositories/context-manifest-repository.js +144 -0
- package/dist/persistence/repositories/context-manifest-repository.js.map +1 -0
- package/dist/persistence/repositories/memory-repository.d.ts +33 -0
- package/dist/persistence/repositories/memory-repository.d.ts.map +1 -0
- package/dist/persistence/repositories/memory-repository.js +429 -0
- package/dist/persistence/repositories/memory-repository.js.map +1 -0
- package/dist/persistence/repositories/project-knowledge-repository.d.ts +65 -0
- package/dist/persistence/repositories/project-knowledge-repository.d.ts.map +1 -0
- package/dist/persistence/repositories/project-knowledge-repository.js +248 -0
- package/dist/persistence/repositories/project-knowledge-repository.js.map +1 -0
- package/dist/persistence/repositories/session-index-repository.d.ts +81 -0
- package/dist/persistence/repositories/session-index-repository.d.ts.map +1 -0
- package/dist/persistence/repositories/session-index-repository.js +220 -0
- package/dist/persistence/repositories/session-index-repository.js.map +1 -0
- package/dist/persistence/repositories/summary-repository.d.ts +16 -0
- package/dist/persistence/repositories/summary-repository.d.ts.map +1 -0
- package/dist/persistence/repositories/summary-repository.js +242 -0
- package/dist/persistence/repositories/summary-repository.js.map +1 -0
- package/dist/persistence/sqlite.d.ts +45 -0
- package/dist/persistence/sqlite.d.ts.map +1 -0
- package/dist/persistence/sqlite.js +137 -0
- package/dist/persistence/sqlite.js.map +1 -0
- package/dist/planner/atomic-groups.d.ts +15 -0
- package/dist/planner/atomic-groups.d.ts.map +1 -0
- package/dist/planner/atomic-groups.js +177 -0
- package/dist/planner/atomic-groups.js.map +1 -0
- package/dist/planner/context-planner.d.ts +49 -0
- package/dist/planner/context-planner.d.ts.map +1 -0
- package/dist/planner/context-planner.js +367 -0
- package/dist/planner/context-planner.js.map +1 -0
- package/dist/privacy/privacy-policy.d.ts +58 -0
- package/dist/privacy/privacy-policy.d.ts.map +1 -0
- package/dist/privacy/privacy-policy.js +412 -0
- package/dist/privacy/privacy-policy.js.map +1 -0
- package/dist/project/file-indexer.d.ts +32 -0
- package/dist/project/file-indexer.d.ts.map +1 -0
- package/dist/project/file-indexer.js +374 -0
- package/dist/project/file-indexer.js.map +1 -0
- package/dist/project/git-state.d.ts +12 -0
- package/dist/project/git-state.d.ts.map +1 -0
- package/dist/project/git-state.js +109 -0
- package/dist/project/git-state.js.map +1 -0
- package/dist/project/project-knowledge.d.ts +63 -0
- package/dist/project/project-knowledge.d.ts.map +1 -0
- package/dist/project/project-knowledge.js +332 -0
- package/dist/project/project-knowledge.js.map +1 -0
- package/dist/retrieval/retrieval-engine.d.ts +55 -0
- package/dist/retrieval/retrieval-engine.d.ts.map +1 -0
- package/dist/retrieval/retrieval-engine.js +290 -0
- package/dist/retrieval/retrieval-engine.js.map +1 -0
- package/dist/retrieval/task-descriptor.d.ts +17 -0
- package/dist/retrieval/task-descriptor.d.ts.map +1 -0
- package/dist/retrieval/task-descriptor.js +107 -0
- package/dist/retrieval/task-descriptor.js.map +1 -0
- package/dist/shared/hash.d.ts +2 -0
- package/dist/shared/hash.d.ts.map +1 -0
- package/dist/shared/hash.js +5 -0
- package/dist/shared/hash.js.map +1 -0
- package/dist/shared/logging.d.ts +27 -0
- package/dist/shared/logging.d.ts.map +1 -0
- package/dist/shared/logging.js +83 -0
- package/dist/shared/logging.js.map +1 -0
- package/dist/shared/stable-json.d.ts +2 -0
- package/dist/shared/stable-json.d.ts.map +1 -0
- package/dist/shared/stable-json.js +38 -0
- package/dist/shared/stable-json.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import { parseMemoryMutation, parsePinMutation, } from "../../memory/memory-types.js";
|
|
2
|
+
function runTransaction(database, operation) {
|
|
3
|
+
database.exec("BEGIN IMMEDIATE");
|
|
4
|
+
try {
|
|
5
|
+
const result = operation();
|
|
6
|
+
database.exec("COMMIT");
|
|
7
|
+
return result;
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
if (database.isTransaction)
|
|
11
|
+
database.exec("ROLLBACK");
|
|
12
|
+
throw error;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function parseJson(value) {
|
|
16
|
+
try {
|
|
17
|
+
return JSON.parse(value);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function classificationFromMetadata(value) {
|
|
24
|
+
const metadata = parseJson(value);
|
|
25
|
+
if (!metadata || typeof metadata !== "object" || !("classification" in metadata))
|
|
26
|
+
return undefined;
|
|
27
|
+
const classification = metadata.classification;
|
|
28
|
+
return classification === "normal"
|
|
29
|
+
|| classification === "internal"
|
|
30
|
+
|| classification === "sensitive"
|
|
31
|
+
|| classification === "local-only"
|
|
32
|
+
? classification
|
|
33
|
+
: undefined;
|
|
34
|
+
}
|
|
35
|
+
function entryIdFromKey(entryKey) {
|
|
36
|
+
const separator = entryKey.indexOf(":");
|
|
37
|
+
return separator < 0 ? entryKey : entryKey.slice(separator + 1);
|
|
38
|
+
}
|
|
39
|
+
function identityKey(item) {
|
|
40
|
+
if (!item.key || item.status !== "active")
|
|
41
|
+
return undefined;
|
|
42
|
+
return [item.scope, item.sessionId ?? "", item.projectPath ?? "", item.key].join("\0");
|
|
43
|
+
}
|
|
44
|
+
function mapMemory(row, sourceEntryIds) {
|
|
45
|
+
return {
|
|
46
|
+
id: row.memory_id,
|
|
47
|
+
scope: row.scope,
|
|
48
|
+
...(row.session_id ? { sessionId: row.session_id } : {}),
|
|
49
|
+
...(row.project_path ? { projectPath: row.project_path } : {}),
|
|
50
|
+
...(row.memory_key ? { key: row.memory_key } : {}),
|
|
51
|
+
...(classificationFromMetadata(row.metadata_json)
|
|
52
|
+
? { classification: classificationFromMetadata(row.metadata_json) }
|
|
53
|
+
: {}),
|
|
54
|
+
claim: row.claim,
|
|
55
|
+
status: row.status,
|
|
56
|
+
createdAt: row.created_at,
|
|
57
|
+
updatedAt: row.updated_at,
|
|
58
|
+
originSessionId: row.origin_session_id ?? row.session_id ?? "legacy",
|
|
59
|
+
...(row.superseded_by ? { supersededBy: row.superseded_by } : {}),
|
|
60
|
+
...(row.status_reason ? { statusReason: row.status_reason } : {}),
|
|
61
|
+
sourceEntryIds,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function mapPin(row) {
|
|
65
|
+
return {
|
|
66
|
+
id: row.pin_id,
|
|
67
|
+
scope: row.scope,
|
|
68
|
+
...(row.session_id ? { sessionId: row.session_id } : {}),
|
|
69
|
+
...(row.project_path ? { projectPath: row.project_path } : {}),
|
|
70
|
+
...(row.branch_leaf_id ? { branchLeafId: row.branch_leaf_id } : {}),
|
|
71
|
+
...(classificationFromMetadata(row.metadata_json)
|
|
72
|
+
? { classification: classificationFromMetadata(row.metadata_json) }
|
|
73
|
+
: {}),
|
|
74
|
+
content: row.content,
|
|
75
|
+
status: row.status,
|
|
76
|
+
createdAt: row.created_at,
|
|
77
|
+
updatedAt: row.updated_at,
|
|
78
|
+
...(row.superseded_by ? { supersededBy: row.superseded_by } : {}),
|
|
79
|
+
...(row.status_reason ? { statusReason: row.status_reason } : {}),
|
|
80
|
+
...(row.source_entry_id ? { sourceEntryId: row.source_entry_id } : {}),
|
|
81
|
+
...(row.source_file ? { sourceFile: row.source_file } : {}),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export class MemoryRepository {
|
|
85
|
+
database;
|
|
86
|
+
constructor(database) {
|
|
87
|
+
this.database = database;
|
|
88
|
+
}
|
|
89
|
+
reconcileSession(sessionId, memoryMutations, pinMutations) {
|
|
90
|
+
return runTransaction(this.database, () => {
|
|
91
|
+
this.database.prepare("DELETE FROM memory_mutations WHERE session_id = ?").run(sessionId);
|
|
92
|
+
this.database.prepare("DELETE FROM pin_mutations WHERE session_id = ?").run(sessionId);
|
|
93
|
+
const insertMemoryMutation = this.database.prepare(`
|
|
94
|
+
INSERT INTO memory_mutations(
|
|
95
|
+
mutation_key, mutation_id, session_id, created_at, entry_order, payload_json
|
|
96
|
+
) VALUES (?, ?, ?, ?, ?, ?)
|
|
97
|
+
`);
|
|
98
|
+
const insertPinMutation = this.database.prepare(`
|
|
99
|
+
INSERT INTO pin_mutations(
|
|
100
|
+
mutation_key, mutation_id, session_id, created_at, entry_order, payload_json
|
|
101
|
+
) VALUES (?, ?, ?, ?, ?, ?)
|
|
102
|
+
`);
|
|
103
|
+
for (const mutation of memoryMutations) {
|
|
104
|
+
insertMemoryMutation.run(mutation.mutationKey, mutation.mutationId, mutation.sessionId, mutation.createdAt, mutation.entryOrder, JSON.stringify(mutation.payload));
|
|
105
|
+
}
|
|
106
|
+
for (const mutation of pinMutations) {
|
|
107
|
+
insertPinMutation.run(mutation.mutationKey, mutation.mutationId, mutation.sessionId, mutation.createdAt, mutation.entryOrder, JSON.stringify(mutation.payload));
|
|
108
|
+
}
|
|
109
|
+
return this.materialize();
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
getMemory(id) {
|
|
113
|
+
const row = this.database.prepare("SELECT * FROM memory_items WHERE memory_id = ?").get(id);
|
|
114
|
+
return row ? mapMemory(row, this.memorySourceIds(id)) : undefined;
|
|
115
|
+
}
|
|
116
|
+
listMemories(options) {
|
|
117
|
+
const status = options.activeOnly === false ? "" : "AND status = 'active'";
|
|
118
|
+
const rows = this.database.prepare(`
|
|
119
|
+
SELECT * FROM memory_items
|
|
120
|
+
WHERE (
|
|
121
|
+
(scope = 'session' AND session_id = ?)
|
|
122
|
+
OR (scope = 'project' AND project_path = ? AND ? = 1)
|
|
123
|
+
) ${status}
|
|
124
|
+
ORDER BY created_at DESC, memory_id
|
|
125
|
+
`).all(options.sessionId, options.projectPath, options.includeProject ? 1 : 0);
|
|
126
|
+
const sources = this.memorySources(new Set(rows.map((row) => row.memory_id)));
|
|
127
|
+
return rows.map((row) => mapMemory(row, sources.get(row.memory_id) ?? []));
|
|
128
|
+
}
|
|
129
|
+
getPin(id) {
|
|
130
|
+
const row = this.database.prepare("SELECT * FROM pins WHERE pin_id = ?").get(id);
|
|
131
|
+
return row ? mapPin(row) : undefined;
|
|
132
|
+
}
|
|
133
|
+
listPins(options) {
|
|
134
|
+
const status = options.activeOnly === false ? "" : "AND status = 'active'";
|
|
135
|
+
const rows = this.database.prepare(`
|
|
136
|
+
SELECT * FROM pins
|
|
137
|
+
WHERE (
|
|
138
|
+
(scope IN ('session', 'branch') AND session_id = ?)
|
|
139
|
+
OR (scope = 'project' AND project_path = ? AND ? = 1)
|
|
140
|
+
) ${status}
|
|
141
|
+
ORDER BY created_at ASC, pin_id
|
|
142
|
+
`).all(options.sessionId, options.projectPath, options.includeProject ? 1 : 0);
|
|
143
|
+
return rows.map(mapPin);
|
|
144
|
+
}
|
|
145
|
+
stats(sessionId, projectPath) {
|
|
146
|
+
const memories = this.database.prepare(`
|
|
147
|
+
SELECT
|
|
148
|
+
COALESCE(sum(status = 'active'), 0) AS active,
|
|
149
|
+
COALESCE(sum(status <> 'active'), 0) AS inactive
|
|
150
|
+
FROM memory_items
|
|
151
|
+
WHERE (scope = 'session' AND session_id = ?) OR (scope = 'project' AND project_path = ?)
|
|
152
|
+
`).get(sessionId, projectPath);
|
|
153
|
+
const pins = this.database.prepare(`
|
|
154
|
+
SELECT
|
|
155
|
+
COALESCE(sum(status = 'active'), 0) AS active,
|
|
156
|
+
COALESCE(sum(status <> 'active'), 0) AS inactive
|
|
157
|
+
FROM pins
|
|
158
|
+
WHERE (scope IN ('session', 'branch') AND session_id = ?)
|
|
159
|
+
OR (scope = 'project' AND project_path = ?)
|
|
160
|
+
`).get(sessionId, projectPath);
|
|
161
|
+
return {
|
|
162
|
+
activeMemories: memories.active,
|
|
163
|
+
inactiveMemories: memories.inactive,
|
|
164
|
+
activePins: pins.active,
|
|
165
|
+
inactivePins: pins.inactive,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
materialize() {
|
|
169
|
+
const warnings = [];
|
|
170
|
+
let ignoredMutations = 0;
|
|
171
|
+
const memories = new Map();
|
|
172
|
+
const pins = new Map();
|
|
173
|
+
const memoryRows = this.database.prepare(`
|
|
174
|
+
SELECT mutation_key, mutation_id, session_id, created_at, entry_order, payload_json
|
|
175
|
+
FROM memory_mutations ORDER BY created_at, session_id, entry_order, mutation_id, mutation_key
|
|
176
|
+
`).all();
|
|
177
|
+
const memoryOperations = [];
|
|
178
|
+
for (const row of memoryRows) {
|
|
179
|
+
const mutation = parseMemoryMutation(parseJson(row.payload_json));
|
|
180
|
+
if (!mutation || mutation.mutationId !== row.mutation_id) {
|
|
181
|
+
warnings.push(`Ignored malformed memory mutation ${row.mutation_id}`);
|
|
182
|
+
ignoredMutations++;
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
memoryOperations.push({ mutation, row });
|
|
186
|
+
this.applyMemoryMutation(memories, mutation, row, warnings, false);
|
|
187
|
+
}
|
|
188
|
+
for (const { mutation, row } of memoryOperations) {
|
|
189
|
+
this.applyMemoryMutation(memories, mutation, row, warnings, true);
|
|
190
|
+
}
|
|
191
|
+
const pinRows = this.database.prepare(`
|
|
192
|
+
SELECT mutation_key, mutation_id, session_id, created_at, entry_order, payload_json
|
|
193
|
+
FROM pin_mutations ORDER BY created_at, session_id, entry_order, mutation_id, mutation_key
|
|
194
|
+
`).all();
|
|
195
|
+
const pinOperations = [];
|
|
196
|
+
for (const row of pinRows) {
|
|
197
|
+
const mutation = parsePinMutation(parseJson(row.payload_json));
|
|
198
|
+
if (!mutation || mutation.mutationId !== row.mutation_id) {
|
|
199
|
+
warnings.push(`Ignored malformed pin mutation ${row.mutation_id}`);
|
|
200
|
+
ignoredMutations++;
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
pinOperations.push({ mutation, row });
|
|
204
|
+
this.applyPinMutation(pins, mutation, row, warnings, false);
|
|
205
|
+
}
|
|
206
|
+
for (const { mutation, row } of pinOperations) {
|
|
207
|
+
this.applyPinMutation(pins, mutation, row, warnings, true);
|
|
208
|
+
}
|
|
209
|
+
const activeKeys = new Map();
|
|
210
|
+
for (const memory of memories.values()) {
|
|
211
|
+
const key = identityKey(memory.item);
|
|
212
|
+
if (!key)
|
|
213
|
+
continue;
|
|
214
|
+
const previousId = activeKeys.get(key);
|
|
215
|
+
if (!previousId) {
|
|
216
|
+
activeKeys.set(key, memory.item.id);
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
memory.item.status = "invalid";
|
|
220
|
+
memory.item.statusReason = `Conflicts with active memory ${previousId}`;
|
|
221
|
+
memory.item.updatedAt = Math.max(memory.item.updatedAt, memory.item.createdAt);
|
|
222
|
+
warnings.push(`Memory ${memory.item.id} invalidated because key conflicts with ${previousId}`);
|
|
223
|
+
}
|
|
224
|
+
this.database.exec(`
|
|
225
|
+
DELETE FROM memory_fts;
|
|
226
|
+
DELETE FROM memory_sources;
|
|
227
|
+
UPDATE memory_items SET superseded_by = NULL;
|
|
228
|
+
DELETE FROM memory_items;
|
|
229
|
+
UPDATE pins SET superseded_by = NULL;
|
|
230
|
+
DELETE FROM pins;
|
|
231
|
+
`);
|
|
232
|
+
const availableEntryKeys = new Set(this.database.prepare("SELECT entry_key FROM entries").all()
|
|
233
|
+
.map((row) => row.entry_key));
|
|
234
|
+
const insertMemory = this.database.prepare(`
|
|
235
|
+
INSERT INTO memory_items(
|
|
236
|
+
memory_id, scope, session_id, project_path, claim, status, created_at,
|
|
237
|
+
superseded_by, memory_key, origin_session_id, updated_at, status_reason, metadata_json
|
|
238
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
239
|
+
`);
|
|
240
|
+
const insertMemorySource = this.database.prepare("INSERT OR IGNORE INTO memory_sources(memory_id, entry_key) VALUES (?, ?)");
|
|
241
|
+
const insertMemoryFts = this.database.prepare("INSERT INTO memory_fts(claim, memory_id) VALUES (?, ?)");
|
|
242
|
+
for (const { item, sourceKeys } of memories.values()) {
|
|
243
|
+
insertMemory.run(item.id, item.scope, item.sessionId ?? null, item.projectPath ?? null, item.claim, item.status, item.createdAt, null, item.key ?? null, item.originSessionId, item.updatedAt, item.statusReason ?? null, JSON.stringify({ ...(item.classification ? { classification: item.classification } : {}) }));
|
|
244
|
+
for (const sourceKey of sourceKeys) {
|
|
245
|
+
if (availableEntryKeys.has(sourceKey))
|
|
246
|
+
insertMemorySource.run(item.id, sourceKey);
|
|
247
|
+
}
|
|
248
|
+
insertMemoryFts.run(item.claim, item.id);
|
|
249
|
+
}
|
|
250
|
+
const updateSupersededMemory = this.database.prepare("UPDATE memory_items SET superseded_by = ? WHERE memory_id = ?");
|
|
251
|
+
for (const { item } of memories.values()) {
|
|
252
|
+
if (item.supersededBy)
|
|
253
|
+
updateSupersededMemory.run(item.supersededBy, item.id);
|
|
254
|
+
}
|
|
255
|
+
const insertPin = this.database.prepare(`
|
|
256
|
+
INSERT INTO pins(
|
|
257
|
+
pin_id, scope, session_id, project_path, content, source_entry_key,
|
|
258
|
+
source_entry_id, source_file, status, created_at, branch_leaf_id,
|
|
259
|
+
superseded_by, updated_at, status_reason, metadata_json
|
|
260
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
261
|
+
`);
|
|
262
|
+
for (const item of pins.values()) {
|
|
263
|
+
const sourceEntryId = item.sourceEntryId ?? item.id;
|
|
264
|
+
const sourceEntryKey = item.sessionId ? `${item.sessionId}:${sourceEntryId}` : null;
|
|
265
|
+
const sourceExists = sourceEntryKey ? availableEntryKeys.has(sourceEntryKey) : false;
|
|
266
|
+
insertPin.run(item.id, item.scope, item.sessionId ?? null, item.projectPath ?? null, item.content, sourceExists ? sourceEntryKey : null, sourceExists ? sourceEntryId : null, item.sourceFile ?? null, item.status, item.createdAt, item.branchLeafId ?? null, null, item.updatedAt, item.statusReason ?? null, JSON.stringify({ ...(item.classification ? { classification: item.classification } : {}) }));
|
|
267
|
+
}
|
|
268
|
+
const updateSupersededPin = this.database.prepare("UPDATE pins SET superseded_by = ? WHERE pin_id = ?");
|
|
269
|
+
for (const item of pins.values()) {
|
|
270
|
+
if (item.supersededBy)
|
|
271
|
+
updateSupersededPin.run(item.supersededBy, item.id);
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
memories: memories.size,
|
|
275
|
+
pins: pins.size,
|
|
276
|
+
memoryMutations: memoryRows.length,
|
|
277
|
+
pinMutations: pinRows.length,
|
|
278
|
+
ignoredMutations,
|
|
279
|
+
warnings,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
applyMemoryMutation(memories, mutation, row, warnings, lifecycleOnly) {
|
|
283
|
+
if (lifecycleOnly) {
|
|
284
|
+
if (mutation.operation === "status") {
|
|
285
|
+
const existing = memories.get(mutation.memoryId);
|
|
286
|
+
if (!existing) {
|
|
287
|
+
warnings.push(`Memory status mutation ${mutation.mutationId} references missing ${mutation.memoryId}`);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
existing.item.status = mutation.status;
|
|
291
|
+
existing.item.updatedAt = mutation.createdAt;
|
|
292
|
+
existing.item.statusReason = mutation.reason;
|
|
293
|
+
existing.item.supersededBy = undefined;
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
if (mutation.operation === "supersede") {
|
|
297
|
+
const previous = memories.get(mutation.previousId);
|
|
298
|
+
if (!previous) {
|
|
299
|
+
warnings.push(`Memory supersession ${mutation.mutationId} references missing ${mutation.previousId}`);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
previous.item.status = "superseded";
|
|
303
|
+
previous.item.supersededBy = mutation.item.id;
|
|
304
|
+
previous.item.updatedAt = mutation.createdAt;
|
|
305
|
+
previous.item.statusReason = `Superseded by ${mutation.item.id}`;
|
|
306
|
+
}
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (mutation.operation === "status")
|
|
310
|
+
return;
|
|
311
|
+
const value = mutation.item;
|
|
312
|
+
const existing = memories.get(value.id);
|
|
313
|
+
if (existing) {
|
|
314
|
+
if (existing.item.claim !== value.claim || existing.item.scope !== value.scope) {
|
|
315
|
+
warnings.push(`Memory ID collision ignored for ${value.id}`);
|
|
316
|
+
}
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (value.scope === "project" && !value.projectPath) {
|
|
320
|
+
warnings.push(`Project memory ${value.id} has no project path`);
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
const sourceKeys = new Set([
|
|
324
|
+
row.mutation_key,
|
|
325
|
+
...value.sourceEntryIds.map((entryId) => `${row.session_id}:${entryId}`),
|
|
326
|
+
]);
|
|
327
|
+
const item = {
|
|
328
|
+
id: value.id,
|
|
329
|
+
scope: value.scope,
|
|
330
|
+
...(value.scope === "session" ? { sessionId: row.session_id } : {}),
|
|
331
|
+
...(value.projectPath ? { projectPath: value.projectPath } : {}),
|
|
332
|
+
...(value.key ? { key: value.key } : {}),
|
|
333
|
+
...(value.classification ? { classification: value.classification } : {}),
|
|
334
|
+
claim: value.claim,
|
|
335
|
+
status: "active",
|
|
336
|
+
createdAt: value.createdAt,
|
|
337
|
+
updatedAt: mutation.createdAt,
|
|
338
|
+
originSessionId: row.session_id,
|
|
339
|
+
sourceEntryIds: [...new Set([entryIdFromKey(row.mutation_key), ...value.sourceEntryIds])],
|
|
340
|
+
};
|
|
341
|
+
memories.set(item.id, { item, sourceKeys });
|
|
342
|
+
}
|
|
343
|
+
applyPinMutation(pins, mutation, row, warnings, lifecycleOnly) {
|
|
344
|
+
if (lifecycleOnly) {
|
|
345
|
+
if (mutation.operation === "status") {
|
|
346
|
+
const existing = pins.get(mutation.pinId);
|
|
347
|
+
if (!existing) {
|
|
348
|
+
warnings.push(`Pin status mutation ${mutation.mutationId} references missing ${mutation.pinId}`);
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
existing.status = mutation.status;
|
|
352
|
+
existing.updatedAt = mutation.createdAt;
|
|
353
|
+
existing.statusReason = mutation.reason;
|
|
354
|
+
existing.supersededBy = undefined;
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
if (mutation.operation === "supersede") {
|
|
358
|
+
const previous = pins.get(mutation.previousId);
|
|
359
|
+
if (!previous) {
|
|
360
|
+
warnings.push(`Pin supersession ${mutation.mutationId} references missing ${mutation.previousId}`);
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
previous.status = "superseded";
|
|
364
|
+
previous.supersededBy = mutation.item.id;
|
|
365
|
+
previous.updatedAt = mutation.createdAt;
|
|
366
|
+
previous.statusReason = `Superseded by ${mutation.item.id}`;
|
|
367
|
+
}
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
if (mutation.operation === "status")
|
|
371
|
+
return;
|
|
372
|
+
const value = mutation.item;
|
|
373
|
+
const existing = pins.get(value.id);
|
|
374
|
+
if (existing) {
|
|
375
|
+
if (existing.content !== value.content || existing.scope !== value.scope) {
|
|
376
|
+
warnings.push(`Pin ID collision ignored for ${value.id}`);
|
|
377
|
+
}
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
if (value.scope === "project" && !value.projectPath) {
|
|
381
|
+
warnings.push(`Project pin ${value.id} has no project path`);
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
if (value.scope === "branch" && !value.branchLeafId) {
|
|
385
|
+
warnings.push(`Branch pin ${value.id} has no branch leaf`);
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
const item = {
|
|
389
|
+
id: value.id,
|
|
390
|
+
scope: value.scope,
|
|
391
|
+
sessionId: row.session_id,
|
|
392
|
+
...(value.projectPath ? { projectPath: value.projectPath } : {}),
|
|
393
|
+
...(value.branchLeafId ? { branchLeafId: value.branchLeafId } : {}),
|
|
394
|
+
...(value.classification ? { classification: value.classification } : {}),
|
|
395
|
+
content: value.content,
|
|
396
|
+
status: "active",
|
|
397
|
+
createdAt: value.createdAt,
|
|
398
|
+
updatedAt: mutation.createdAt,
|
|
399
|
+
...(value.sourceEntryId
|
|
400
|
+
? { sourceEntryId: value.sourceEntryId }
|
|
401
|
+
: { sourceEntryId: entryIdFromKey(row.mutation_key) }),
|
|
402
|
+
...(value.sourceFile ? { sourceFile: value.sourceFile } : {}),
|
|
403
|
+
};
|
|
404
|
+
pins.set(item.id, item);
|
|
405
|
+
}
|
|
406
|
+
memorySourceIds(memoryId) {
|
|
407
|
+
return this.memorySources(new Set([memoryId])).get(memoryId) ?? [];
|
|
408
|
+
}
|
|
409
|
+
memorySources(memoryIds) {
|
|
410
|
+
if (memoryIds.size === 0)
|
|
411
|
+
return new Map();
|
|
412
|
+
const rows = this.database.prepare(`
|
|
413
|
+
SELECT source.memory_id, entry.entry_id
|
|
414
|
+
FROM memory_sources AS source
|
|
415
|
+
JOIN entries AS entry ON entry.entry_key = source.entry_key
|
|
416
|
+
ORDER BY entry.created_at, entry.entry_id
|
|
417
|
+
`).all();
|
|
418
|
+
const result = new Map();
|
|
419
|
+
for (const row of rows) {
|
|
420
|
+
if (!memoryIds.has(row.memory_id))
|
|
421
|
+
continue;
|
|
422
|
+
const values = result.get(row.memory_id) ?? [];
|
|
423
|
+
values.push(row.entry_id);
|
|
424
|
+
result.set(row.memory_id, values);
|
|
425
|
+
}
|
|
426
|
+
return result;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
//# sourceMappingURL=memory-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-repository.js","sourceRoot":"","sources":["../../../src/persistence/repositories/memory-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
export interface StoredProjectState {
|
|
3
|
+
projectPath: string;
|
|
4
|
+
gitRoot?: string;
|
|
5
|
+
gitBranch?: string;
|
|
6
|
+
gitHead?: string;
|
|
7
|
+
dirty: boolean;
|
|
8
|
+
changedFiles: string[];
|
|
9
|
+
indexedAt: number;
|
|
10
|
+
}
|
|
11
|
+
export interface StoredProjectFile {
|
|
12
|
+
projectPath: string;
|
|
13
|
+
filePath: string;
|
|
14
|
+
contentHash: string;
|
|
15
|
+
sizeBytes: number;
|
|
16
|
+
mtimeMs: number;
|
|
17
|
+
language?: string;
|
|
18
|
+
gitCommit?: string;
|
|
19
|
+
modified: boolean;
|
|
20
|
+
tracked: boolean;
|
|
21
|
+
status: "current" | "deleted";
|
|
22
|
+
indexedAt: number;
|
|
23
|
+
}
|
|
24
|
+
export interface StoredProjectSnippet {
|
|
25
|
+
snippetId: string;
|
|
26
|
+
projectPath: string;
|
|
27
|
+
filePath: string;
|
|
28
|
+
fileHash: string;
|
|
29
|
+
startLine: number;
|
|
30
|
+
endLine: number;
|
|
31
|
+
content: string;
|
|
32
|
+
symbols: string[];
|
|
33
|
+
tokenEstimate: number;
|
|
34
|
+
stale: boolean;
|
|
35
|
+
indexedAt: number;
|
|
36
|
+
}
|
|
37
|
+
export interface ProjectSnippetSearchResult extends StoredProjectSnippet {
|
|
38
|
+
language?: string;
|
|
39
|
+
gitCommit?: string;
|
|
40
|
+
modified: boolean;
|
|
41
|
+
tracked: boolean;
|
|
42
|
+
ftsRank?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface ProjectIndexStats {
|
|
45
|
+
files: number;
|
|
46
|
+
deletedFiles: number;
|
|
47
|
+
currentSnippets: number;
|
|
48
|
+
staleSnippets: number;
|
|
49
|
+
indexedTokens: number;
|
|
50
|
+
}
|
|
51
|
+
export declare class ProjectKnowledgeRepository {
|
|
52
|
+
private readonly database;
|
|
53
|
+
constructor(database: DatabaseSync);
|
|
54
|
+
getState(projectPath: string): StoredProjectState | undefined;
|
|
55
|
+
saveState(state: StoredProjectState): void;
|
|
56
|
+
listFiles(projectPath: string): StoredProjectFile[];
|
|
57
|
+
getFile(projectPath: string, filePath: string): StoredProjectFile | undefined;
|
|
58
|
+
replaceFile(file: StoredProjectFile, snippets: readonly StoredProjectSnippet[]): void;
|
|
59
|
+
markDeleted(projectPath: string, filePaths: readonly string[], indexedAt: number): void;
|
|
60
|
+
searchExact(projectPath: string, term: string, limit: number): ProjectSnippetSearchResult[];
|
|
61
|
+
searchFts(projectPath: string, query: string, limit: number): ProjectSnippetSearchResult[];
|
|
62
|
+
getStats(projectPath: string): ProjectIndexStats;
|
|
63
|
+
clearProject(projectPath: string): void;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=project-knowledge-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-knowledge-repository.d.ts","sourceRoot":"","sources":["../../../src/persistence/repositories/project-knowledge-repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,0BAA2B,SAAQ,oBAAoB;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAkHD,qBAAa,0BAA0B;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAEnD,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAQ7D,SAAS,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAuB1C,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,EAAE;IASnD,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAS7E,WAAW,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,oBAAoB,EAAE,GAAG,IAAI;IAoFrF,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAuBvF,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,0BAA0B,EAAE;IAU3F,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,0BAA0B,EAAE;IAsB1F,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB;IAwBhD,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;CAWxC"}
|