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.
Files changed (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +80 -0
  3. package/dist/artifacts/artifact-manager.d.ts +58 -0
  4. package/dist/artifacts/artifact-manager.d.ts.map +1 -0
  5. package/dist/artifacts/artifact-manager.js +445 -0
  6. package/dist/artifacts/artifact-manager.js.map +1 -0
  7. package/dist/artifacts/artifact-store.d.ts +33 -0
  8. package/dist/artifacts/artifact-store.d.ts.map +1 -0
  9. package/dist/artifacts/artifact-store.js +116 -0
  10. package/dist/artifacts/artifact-store.js.map +1 -0
  11. package/dist/compaction/compaction-record.d.ts +74 -0
  12. package/dist/compaction/compaction-record.d.ts.map +1 -0
  13. package/dist/compaction/compaction-record.js +113 -0
  14. package/dist/compaction/compaction-record.js.map +1 -0
  15. package/dist/compaction/summary-contract.d.ts +68 -0
  16. package/dist/compaction/summary-contract.d.ts.map +1 -0
  17. package/dist/compaction/summary-contract.js +315 -0
  18. package/dist/compaction/summary-contract.js.map +1 -0
  19. package/dist/compaction/summary-graph.d.ts +48 -0
  20. package/dist/compaction/summary-graph.d.ts.map +1 -0
  21. package/dist/compaction/summary-graph.js +123 -0
  22. package/dist/compaction/summary-graph.js.map +1 -0
  23. package/dist/config/config-loader.d.ts +18 -0
  24. package/dist/config/config-loader.d.ts.map +1 -0
  25. package/dist/config/config-loader.js +305 -0
  26. package/dist/config/config-loader.js.map +1 -0
  27. package/dist/config/config.d.ts +113 -0
  28. package/dist/config/config.d.ts.map +1 -0
  29. package/dist/config/config.js +89 -0
  30. package/dist/config/config.js.map +1 -0
  31. package/dist/continuation/native-continuation.d.ts +107 -0
  32. package/dist/continuation/native-continuation.d.ts.map +1 -0
  33. package/dist/continuation/native-continuation.js +374 -0
  34. package/dist/continuation/native-continuation.js.map +1 -0
  35. package/dist/core/budget-manager.d.ts +26 -0
  36. package/dist/core/budget-manager.d.ts.map +1 -0
  37. package/dist/core/budget-manager.js +42 -0
  38. package/dist/core/budget-manager.js.map +1 -0
  39. package/dist/core/canonical-message.d.ts +69 -0
  40. package/dist/core/canonical-message.d.ts.map +1 -0
  41. package/dist/core/canonical-message.js +2 -0
  42. package/dist/core/canonical-message.js.map +1 -0
  43. package/dist/core/model-awareness.d.ts +59 -0
  44. package/dist/core/model-awareness.d.ts.map +1 -0
  45. package/dist/core/model-awareness.js +177 -0
  46. package/dist/core/model-awareness.js.map +1 -0
  47. package/dist/core/model-profile.d.ts +27 -0
  48. package/dist/core/model-profile.d.ts.map +1 -0
  49. package/dist/core/model-profile.js +29 -0
  50. package/dist/core/model-profile.js.map +1 -0
  51. package/dist/core/token-estimator.d.ts +4 -0
  52. package/dist/core/token-estimator.d.ts.map +1 -0
  53. package/dist/core/token-estimator.js +64 -0
  54. package/dist/core/token-estimator.js.map +1 -0
  55. package/dist/index.d.ts +37 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +37 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/manifest/context-manifest.d.ts +163 -0
  60. package/dist/manifest/context-manifest.d.ts.map +1 -0
  61. package/dist/manifest/context-manifest.js +2 -0
  62. package/dist/manifest/context-manifest.js.map +1 -0
  63. package/dist/manifest/observer.d.ts +63 -0
  64. package/dist/manifest/observer.d.ts.map +1 -0
  65. package/dist/manifest/observer.js +150 -0
  66. package/dist/manifest/observer.js.map +1 -0
  67. package/dist/memory/memory-manager.d.ts +112 -0
  68. package/dist/memory/memory-manager.d.ts.map +1 -0
  69. package/dist/memory/memory-manager.js +499 -0
  70. package/dist/memory/memory-manager.js.map +1 -0
  71. package/dist/memory/memory-types.d.ts +126 -0
  72. package/dist/memory/memory-types.d.ts.map +1 -0
  73. package/dist/memory/memory-types.js +73 -0
  74. package/dist/memory/memory-types.js.map +1 -0
  75. package/dist/persistence/migrations.d.ts +17 -0
  76. package/dist/persistence/migrations.d.ts.map +1 -0
  77. package/dist/persistence/migrations.js +588 -0
  78. package/dist/persistence/migrations.js.map +1 -0
  79. package/dist/persistence/repositories/artifact-repository.d.ts +50 -0
  80. package/dist/persistence/repositories/artifact-repository.d.ts.map +1 -0
  81. package/dist/persistence/repositories/artifact-repository.js +186 -0
  82. package/dist/persistence/repositories/artifact-repository.js.map +1 -0
  83. package/dist/persistence/repositories/context-manifest-repository.d.ts +19 -0
  84. package/dist/persistence/repositories/context-manifest-repository.d.ts.map +1 -0
  85. package/dist/persistence/repositories/context-manifest-repository.js +144 -0
  86. package/dist/persistence/repositories/context-manifest-repository.js.map +1 -0
  87. package/dist/persistence/repositories/memory-repository.d.ts +33 -0
  88. package/dist/persistence/repositories/memory-repository.d.ts.map +1 -0
  89. package/dist/persistence/repositories/memory-repository.js +429 -0
  90. package/dist/persistence/repositories/memory-repository.js.map +1 -0
  91. package/dist/persistence/repositories/project-knowledge-repository.d.ts +65 -0
  92. package/dist/persistence/repositories/project-knowledge-repository.d.ts.map +1 -0
  93. package/dist/persistence/repositories/project-knowledge-repository.js +248 -0
  94. package/dist/persistence/repositories/project-knowledge-repository.js.map +1 -0
  95. package/dist/persistence/repositories/session-index-repository.d.ts +81 -0
  96. package/dist/persistence/repositories/session-index-repository.d.ts.map +1 -0
  97. package/dist/persistence/repositories/session-index-repository.js +220 -0
  98. package/dist/persistence/repositories/session-index-repository.js.map +1 -0
  99. package/dist/persistence/repositories/summary-repository.d.ts +16 -0
  100. package/dist/persistence/repositories/summary-repository.d.ts.map +1 -0
  101. package/dist/persistence/repositories/summary-repository.js +242 -0
  102. package/dist/persistence/repositories/summary-repository.js.map +1 -0
  103. package/dist/persistence/sqlite.d.ts +45 -0
  104. package/dist/persistence/sqlite.d.ts.map +1 -0
  105. package/dist/persistence/sqlite.js +137 -0
  106. package/dist/persistence/sqlite.js.map +1 -0
  107. package/dist/planner/atomic-groups.d.ts +15 -0
  108. package/dist/planner/atomic-groups.d.ts.map +1 -0
  109. package/dist/planner/atomic-groups.js +177 -0
  110. package/dist/planner/atomic-groups.js.map +1 -0
  111. package/dist/planner/context-planner.d.ts +49 -0
  112. package/dist/planner/context-planner.d.ts.map +1 -0
  113. package/dist/planner/context-planner.js +367 -0
  114. package/dist/planner/context-planner.js.map +1 -0
  115. package/dist/privacy/privacy-policy.d.ts +58 -0
  116. package/dist/privacy/privacy-policy.d.ts.map +1 -0
  117. package/dist/privacy/privacy-policy.js +412 -0
  118. package/dist/privacy/privacy-policy.js.map +1 -0
  119. package/dist/project/file-indexer.d.ts +32 -0
  120. package/dist/project/file-indexer.d.ts.map +1 -0
  121. package/dist/project/file-indexer.js +374 -0
  122. package/dist/project/file-indexer.js.map +1 -0
  123. package/dist/project/git-state.d.ts +12 -0
  124. package/dist/project/git-state.d.ts.map +1 -0
  125. package/dist/project/git-state.js +109 -0
  126. package/dist/project/git-state.js.map +1 -0
  127. package/dist/project/project-knowledge.d.ts +63 -0
  128. package/dist/project/project-knowledge.d.ts.map +1 -0
  129. package/dist/project/project-knowledge.js +332 -0
  130. package/dist/project/project-knowledge.js.map +1 -0
  131. package/dist/retrieval/retrieval-engine.d.ts +55 -0
  132. package/dist/retrieval/retrieval-engine.d.ts.map +1 -0
  133. package/dist/retrieval/retrieval-engine.js +290 -0
  134. package/dist/retrieval/retrieval-engine.js.map +1 -0
  135. package/dist/retrieval/task-descriptor.d.ts +17 -0
  136. package/dist/retrieval/task-descriptor.d.ts.map +1 -0
  137. package/dist/retrieval/task-descriptor.js +107 -0
  138. package/dist/retrieval/task-descriptor.js.map +1 -0
  139. package/dist/shared/hash.d.ts +2 -0
  140. package/dist/shared/hash.d.ts.map +1 -0
  141. package/dist/shared/hash.js +5 -0
  142. package/dist/shared/hash.js.map +1 -0
  143. package/dist/shared/logging.d.ts +27 -0
  144. package/dist/shared/logging.d.ts.map +1 -0
  145. package/dist/shared/logging.js +83 -0
  146. package/dist/shared/logging.js.map +1 -0
  147. package/dist/shared/stable-json.d.ts +2 -0
  148. package/dist/shared/stable-json.d.ts.map +1 -0
  149. package/dist/shared/stable-json.js +38 -0
  150. package/dist/shared/stable-json.js.map +1 -0
  151. package/package.json +56 -0
@@ -0,0 +1,248 @@
1
+ function parseJsonArray(value) {
2
+ try {
3
+ const parsed = JSON.parse(value);
4
+ return Array.isArray(parsed) ? parsed.filter((item) => typeof item === "string") : [];
5
+ }
6
+ catch {
7
+ return [];
8
+ }
9
+ }
10
+ function mapState(row) {
11
+ return {
12
+ projectPath: row.project_path,
13
+ ...(row.git_root ? { gitRoot: row.git_root } : {}),
14
+ ...(row.git_branch ? { gitBranch: row.git_branch } : {}),
15
+ ...(row.git_head ? { gitHead: row.git_head } : {}),
16
+ dirty: row.dirty === 1,
17
+ changedFiles: parseJsonArray(row.changed_files_json),
18
+ indexedAt: row.indexed_at,
19
+ };
20
+ }
21
+ function mapFile(row) {
22
+ return {
23
+ projectPath: row.project_path,
24
+ filePath: row.file_path,
25
+ contentHash: row.content_hash,
26
+ sizeBytes: row.size_bytes,
27
+ mtimeMs: row.mtime_ms,
28
+ ...(row.language ? { language: row.language } : {}),
29
+ ...(row.git_commit ? { gitCommit: row.git_commit } : {}),
30
+ modified: row.modified === 1,
31
+ tracked: row.tracked === 1,
32
+ status: row.status,
33
+ indexedAt: row.indexed_at,
34
+ };
35
+ }
36
+ function mapSnippet(row) {
37
+ return {
38
+ snippetId: row.snippet_id,
39
+ projectPath: row.project_path,
40
+ filePath: row.file_path,
41
+ fileHash: row.file_hash,
42
+ startLine: row.start_line,
43
+ endLine: row.end_line,
44
+ content: row.content,
45
+ symbols: parseJsonArray(row.symbols),
46
+ tokenEstimate: row.token_estimate,
47
+ stale: row.stale === 1,
48
+ indexedAt: row.indexed_at,
49
+ ...(row.language ? { language: row.language } : {}),
50
+ ...(row.git_commit ? { gitCommit: row.git_commit } : {}),
51
+ modified: row.modified === 1,
52
+ tracked: row.tracked === 1,
53
+ ...(row.fts_rank !== undefined ? { ftsRank: row.fts_rank } : {}),
54
+ };
55
+ }
56
+ const SEARCH_SELECT = `
57
+ SELECT
58
+ snippet.snippet_id, snippet.project_path, snippet.file_path, snippet.file_hash,
59
+ snippet.start_line, snippet.end_line, snippet.content, snippet.symbols,
60
+ snippet.token_estimate, snippet.stale, snippet.indexed_at,
61
+ file.language, file.git_commit, file.modified, file.tracked
62
+ FROM project_snippets AS snippet
63
+ JOIN project_files AS file
64
+ ON file.project_path = snippet.project_path AND file.file_path = snippet.file_path
65
+ `;
66
+ export class ProjectKnowledgeRepository {
67
+ database;
68
+ constructor(database) {
69
+ this.database = database;
70
+ }
71
+ getState(projectPath) {
72
+ const row = this.database.prepare(`
73
+ SELECT project_path, git_root, git_branch, git_head, dirty, changed_files_json, indexed_at
74
+ FROM project_states WHERE project_path = ?
75
+ `).get(projectPath);
76
+ return row ? mapState(row) : undefined;
77
+ }
78
+ saveState(state) {
79
+ this.database.prepare(`
80
+ INSERT INTO project_states(
81
+ project_path, git_root, git_branch, git_head, dirty, changed_files_json, indexed_at
82
+ ) VALUES (?, ?, ?, ?, ?, ?, ?)
83
+ ON CONFLICT(project_path) DO UPDATE SET
84
+ git_root = excluded.git_root,
85
+ git_branch = excluded.git_branch,
86
+ git_head = excluded.git_head,
87
+ dirty = excluded.dirty,
88
+ changed_files_json = excluded.changed_files_json,
89
+ indexed_at = excluded.indexed_at
90
+ `).run(state.projectPath, state.gitRoot ?? null, state.gitBranch ?? null, state.gitHead ?? null, state.dirty ? 1 : 0, JSON.stringify(state.changedFiles), state.indexedAt);
91
+ }
92
+ listFiles(projectPath) {
93
+ const rows = this.database.prepare(`
94
+ SELECT project_path, file_path, content_hash, size_bytes, mtime_ms, language,
95
+ git_commit, modified, tracked, status, indexed_at
96
+ FROM project_files WHERE project_path = ? ORDER BY file_path
97
+ `).all(projectPath);
98
+ return rows.map(mapFile);
99
+ }
100
+ getFile(projectPath, filePath) {
101
+ const row = this.database.prepare(`
102
+ SELECT project_path, file_path, content_hash, size_bytes, mtime_ms, language,
103
+ git_commit, modified, tracked, status, indexed_at
104
+ FROM project_files WHERE project_path = ? AND file_path = ?
105
+ `).get(projectPath, filePath);
106
+ return row ? mapFile(row) : undefined;
107
+ }
108
+ replaceFile(file, snippets) {
109
+ this.database.exec("BEGIN IMMEDIATE");
110
+ try {
111
+ this.database.prepare(`
112
+ INSERT INTO project_files(
113
+ project_path, file_path, content_hash, size_bytes, mtime_ms, language,
114
+ git_commit, modified, tracked, status, indexed_at
115
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'current', ?)
116
+ ON CONFLICT(project_path, file_path) DO UPDATE SET
117
+ content_hash = excluded.content_hash,
118
+ size_bytes = excluded.size_bytes,
119
+ mtime_ms = excluded.mtime_ms,
120
+ language = excluded.language,
121
+ git_commit = excluded.git_commit,
122
+ modified = excluded.modified,
123
+ tracked = excluded.tracked,
124
+ status = 'current',
125
+ indexed_at = excluded.indexed_at
126
+ `).run(file.projectPath, file.filePath, file.contentHash, file.sizeBytes, file.mtimeMs, file.language ?? null, file.gitCommit ?? null, file.modified ? 1 : 0, file.tracked ? 1 : 0, file.indexedAt);
127
+ this.database.prepare(`
128
+ UPDATE project_snippets SET stale = 1
129
+ WHERE project_path = ? AND file_path = ? AND stale = 0
130
+ `).run(file.projectPath, file.filePath);
131
+ const removeFts = this.database.prepare("DELETE FROM project_snippets_fts WHERE snippet_id = ? AND project_path = ?");
132
+ const upsertSnippet = this.database.prepare(`
133
+ INSERT INTO project_snippets(
134
+ snippet_id, project_path, file_path, file_hash, start_line, end_line,
135
+ content, symbols, token_estimate, stale, indexed_at
136
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?)
137
+ ON CONFLICT(snippet_id) DO UPDATE SET
138
+ content = excluded.content,
139
+ symbols = excluded.symbols,
140
+ token_estimate = excluded.token_estimate,
141
+ stale = 0,
142
+ indexed_at = excluded.indexed_at
143
+ `);
144
+ const insertFts = this.database.prepare(`
145
+ INSERT INTO project_snippets_fts(
146
+ content, file_path, symbols, snippet_id, project_path
147
+ ) VALUES (?, ?, ?, ?, ?)
148
+ `);
149
+ for (const snippet of snippets) {
150
+ removeFts.run(snippet.snippetId, snippet.projectPath);
151
+ upsertSnippet.run(snippet.snippetId, snippet.projectPath, snippet.filePath, snippet.fileHash, snippet.startLine, snippet.endLine, snippet.content, JSON.stringify(snippet.symbols), snippet.tokenEstimate, snippet.indexedAt);
152
+ insertFts.run(snippet.content, snippet.filePath, snippet.symbols.join(" "), snippet.snippetId, snippet.projectPath);
153
+ }
154
+ this.database.exec("COMMIT");
155
+ }
156
+ catch (error) {
157
+ if (this.database.isTransaction)
158
+ this.database.exec("ROLLBACK");
159
+ throw error;
160
+ }
161
+ }
162
+ markDeleted(projectPath, filePaths, indexedAt) {
163
+ if (filePaths.length === 0)
164
+ return;
165
+ this.database.exec("BEGIN IMMEDIATE");
166
+ try {
167
+ const markFile = this.database.prepare(`
168
+ UPDATE project_files SET status = 'deleted', modified = 1, indexed_at = ?
169
+ WHERE project_path = ? AND file_path = ?
170
+ `);
171
+ const markSnippets = this.database.prepare(`
172
+ UPDATE project_snippets SET stale = 1
173
+ WHERE project_path = ? AND file_path = ? AND stale = 0
174
+ `);
175
+ for (const path of filePaths) {
176
+ markFile.run(indexedAt, projectPath, path);
177
+ markSnippets.run(projectPath, path);
178
+ }
179
+ this.database.exec("COMMIT");
180
+ }
181
+ catch (error) {
182
+ if (this.database.isTransaction)
183
+ this.database.exec("ROLLBACK");
184
+ throw error;
185
+ }
186
+ }
187
+ searchExact(projectPath, term, limit) {
188
+ const rows = this.database.prepare(`${SEARCH_SELECT}
189
+ WHERE snippet.project_path = ? AND snippet.stale = 0 AND file.status = 'current'
190
+ AND (instr(snippet.file_path, ?) > 0 OR instr(snippet.symbols, ?) > 0 OR instr(snippet.content, ?) > 0)
191
+ ORDER BY file.modified DESC, snippet.start_line, snippet.snippet_id
192
+ LIMIT ?
193
+ `).all(projectPath, term, term, term, limit);
194
+ return rows.map(mapSnippet);
195
+ }
196
+ searchFts(projectPath, query, limit) {
197
+ const rows = this.database.prepare(`
198
+ SELECT
199
+ snippet.snippet_id, snippet.project_path, snippet.file_path, snippet.file_hash,
200
+ snippet.start_line, snippet.end_line, snippet.content, snippet.symbols,
201
+ snippet.token_estimate, snippet.stale, snippet.indexed_at,
202
+ file.language, file.git_commit, file.modified, file.tracked,
203
+ bm25(project_snippets_fts, 1.0, 3.0, 4.0) AS fts_rank
204
+ FROM project_snippets_fts
205
+ JOIN project_snippets AS snippet
206
+ ON snippet.snippet_id = project_snippets_fts.snippet_id
207
+ AND snippet.project_path = project_snippets_fts.project_path
208
+ JOIN project_files AS file
209
+ ON file.project_path = snippet.project_path AND file.file_path = snippet.file_path
210
+ WHERE project_snippets_fts MATCH ? AND snippet.project_path = ?
211
+ AND snippet.stale = 0 AND file.status = 'current'
212
+ ORDER BY fts_rank, file.modified DESC, snippet.start_line, snippet.snippet_id
213
+ LIMIT ?
214
+ `).all(query, projectPath, limit);
215
+ return rows.map(mapSnippet);
216
+ }
217
+ getStats(projectPath) {
218
+ const row = this.database.prepare(`
219
+ SELECT
220
+ (SELECT count(*) FROM project_files WHERE project_path = ? AND status = 'current') AS files,
221
+ (SELECT count(*) FROM project_files WHERE project_path = ? AND status = 'deleted') AS deleted_files,
222
+ (SELECT count(*) FROM project_snippets WHERE project_path = ? AND stale = 0) AS current_snippets,
223
+ (SELECT count(*) FROM project_snippets WHERE project_path = ? AND stale = 1) AS stale_snippets,
224
+ (SELECT COALESCE(sum(token_estimate), 0) FROM project_snippets WHERE project_path = ? AND stale = 0) AS indexed_tokens
225
+ `).get(projectPath, projectPath, projectPath, projectPath, projectPath);
226
+ return {
227
+ files: row.files,
228
+ deletedFiles: row.deleted_files,
229
+ currentSnippets: row.current_snippets,
230
+ staleSnippets: row.stale_snippets,
231
+ indexedTokens: row.indexed_tokens,
232
+ };
233
+ }
234
+ clearProject(projectPath) {
235
+ this.database.exec("BEGIN IMMEDIATE");
236
+ try {
237
+ this.database.prepare("DELETE FROM project_snippets_fts WHERE project_path = ?").run(projectPath);
238
+ this.database.prepare("DELETE FROM project_states WHERE project_path = ?").run(projectPath);
239
+ this.database.exec("COMMIT");
240
+ }
241
+ catch (error) {
242
+ if (this.database.isTransaction)
243
+ this.database.exec("ROLLBACK");
244
+ throw error;
245
+ }
246
+ }
247
+ }
248
+ //# sourceMappingURL=project-knowledge-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-knowledge-repository.js","sourceRoot":"","sources":["../../../src/persistence/repositories/project-knowledge-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { DatabaseSync } from "node:sqlite";
2
+ export interface StoredSessionEntry {
3
+ entryKey: string;
4
+ entryId: string;
5
+ sessionId: string;
6
+ parentId: string | null;
7
+ entryType: string;
8
+ role?: string;
9
+ createdAt?: number;
10
+ contentHash: string;
11
+ searchableText: string;
12
+ tokenEstimate: number;
13
+ indexedAt: number;
14
+ }
15
+ export interface SessionIdentity {
16
+ sessionId: string;
17
+ sessionFile: string;
18
+ projectPath?: string;
19
+ indexedAt: number;
20
+ }
21
+ export interface SessionIndexCheckpointInput {
22
+ sessionId: string;
23
+ sessionFile: string;
24
+ headerHash: string;
25
+ fileSize: number;
26
+ fileMtimeMs: number;
27
+ checkpointOffset: number;
28
+ checkpointHashStart: number;
29
+ checkpointHash?: string;
30
+ malformedLines: number;
31
+ indexedAt: number;
32
+ }
33
+ export interface SessionIndexState extends SessionIndexCheckpointInput {
34
+ indexedEntries: number;
35
+ }
36
+ export interface SessionIndexStats {
37
+ entries: number;
38
+ estimatedTokens: number;
39
+ }
40
+ export interface IndexWriteResult {
41
+ inserted: number;
42
+ unchanged: number;
43
+ totalEntries: number;
44
+ }
45
+ export declare class AppendOnlyEntryChangedError extends Error {
46
+ readonly entryId: string;
47
+ constructor(entryId: string);
48
+ }
49
+ export interface EntrySearchResult {
50
+ entryId: string;
51
+ parentId: string | null;
52
+ entryType: string;
53
+ role?: string;
54
+ createdAt?: number;
55
+ searchableText: string;
56
+ tokenEstimate: number;
57
+ contentHash: string;
58
+ score?: number;
59
+ }
60
+ export declare class SessionIndexRepository {
61
+ private readonly database;
62
+ private readonly upsertSessionStatement;
63
+ private readonly insertEntryStatement;
64
+ private readonly insertFtsStatement;
65
+ private readonly deleteFtsEntryStatement;
66
+ private readonly existingHashStatement;
67
+ private readonly upsertStateStatement;
68
+ constructor(database: DatabaseSync);
69
+ getState(sessionId: string): SessionIndexState | undefined;
70
+ upsertSession(identity: SessionIdentity): void;
71
+ rebuild(identity: SessionIdentity, entries: readonly StoredSessionEntry[], checkpoint: SessionIndexCheckpointInput): IndexWriteResult;
72
+ append(identity: SessionIdentity, entries: readonly StoredSessionEntry[], checkpoint: SessionIndexCheckpointInput): IndexWriteResult;
73
+ hasEntry(sessionId: string, entryId: string): boolean;
74
+ getStats(sessionId: string): SessionIndexStats;
75
+ searchExact(sessionId: string, phrase: string, limit: number): EntrySearchResult[];
76
+ searchFts(sessionId: string, query: string, limit: number): EntrySearchResult[];
77
+ private writeEntry;
78
+ private writeState;
79
+ private countEntries;
80
+ }
81
+ //# sourceMappingURL=session-index-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-index-repository.d.ts","sourceRoot":"","sources":["../../../src/persistence/repositories/session-index-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,220 @@
1
+ export class AppendOnlyEntryChangedError extends Error {
2
+ entryId;
3
+ constructor(entryId) {
4
+ super(`Entry ${entryId} changed during append-only indexing`);
5
+ this.entryId = entryId;
6
+ this.name = "AppendOnlyEntryChangedError";
7
+ }
8
+ }
9
+ function runTransaction(database, operation) {
10
+ database.exec("BEGIN IMMEDIATE");
11
+ try {
12
+ const result = operation();
13
+ database.exec("COMMIT");
14
+ return result;
15
+ }
16
+ catch (error) {
17
+ if (database.isTransaction)
18
+ database.exec("ROLLBACK");
19
+ throw error;
20
+ }
21
+ }
22
+ export class SessionIndexRepository {
23
+ database;
24
+ upsertSessionStatement;
25
+ insertEntryStatement;
26
+ insertFtsStatement;
27
+ deleteFtsEntryStatement;
28
+ existingHashStatement;
29
+ upsertStateStatement;
30
+ constructor(database) {
31
+ this.database = database;
32
+ this.upsertSessionStatement = database.prepare(`
33
+ INSERT INTO sessions(session_id, session_file, project_path, indexed_at)
34
+ VALUES (?, ?, ?, ?)
35
+ ON CONFLICT(session_id) DO UPDATE SET
36
+ session_file = excluded.session_file,
37
+ project_path = excluded.project_path,
38
+ indexed_at = excluded.indexed_at
39
+ `);
40
+ this.insertEntryStatement = database.prepare(`
41
+ INSERT INTO entries(
42
+ entry_key, entry_id, session_id, parent_id, entry_type, role,
43
+ created_at, content_hash, searchable_text, token_estimate, indexed_at
44
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
45
+ ON CONFLICT(entry_key) DO UPDATE SET
46
+ parent_id = excluded.parent_id,
47
+ entry_type = excluded.entry_type,
48
+ role = excluded.role,
49
+ created_at = excluded.created_at,
50
+ content_hash = excluded.content_hash,
51
+ searchable_text = excluded.searchable_text,
52
+ token_estimate = excluded.token_estimate,
53
+ indexed_at = excluded.indexed_at
54
+ `);
55
+ this.insertFtsStatement = database.prepare(`
56
+ INSERT INTO entries_fts(searchable_text, entry_key, entry_id, session_id)
57
+ VALUES (?, ?, ?, ?)
58
+ `);
59
+ this.deleteFtsEntryStatement = database.prepare("DELETE FROM entries_fts WHERE entry_key = ?");
60
+ this.existingHashStatement = database.prepare("SELECT content_hash FROM entries WHERE entry_key = ? AND session_id = ?");
61
+ this.upsertStateStatement = database.prepare(`
62
+ INSERT INTO session_index_state(
63
+ session_id, session_file, header_hash, file_size, file_mtime_ms,
64
+ checkpoint_offset, checkpoint_hash_start, checkpoint_hash,
65
+ indexed_entries, malformed_lines, indexed_at
66
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
67
+ ON CONFLICT(session_id) DO UPDATE SET
68
+ session_file = excluded.session_file,
69
+ header_hash = excluded.header_hash,
70
+ file_size = excluded.file_size,
71
+ file_mtime_ms = excluded.file_mtime_ms,
72
+ checkpoint_offset = excluded.checkpoint_offset,
73
+ checkpoint_hash_start = excluded.checkpoint_hash_start,
74
+ checkpoint_hash = excluded.checkpoint_hash,
75
+ indexed_entries = excluded.indexed_entries,
76
+ malformed_lines = excluded.malformed_lines,
77
+ indexed_at = excluded.indexed_at
78
+ `);
79
+ }
80
+ getState(sessionId) {
81
+ const row = this.database.prepare(`
82
+ SELECT session_id, session_file, header_hash, file_size, file_mtime_ms,
83
+ checkpoint_offset, checkpoint_hash_start, checkpoint_hash,
84
+ indexed_entries, malformed_lines, indexed_at
85
+ FROM session_index_state
86
+ WHERE session_id = ?
87
+ `).get(sessionId);
88
+ if (!row)
89
+ return undefined;
90
+ return {
91
+ sessionId: row.session_id,
92
+ sessionFile: row.session_file,
93
+ headerHash: row.header_hash,
94
+ fileSize: row.file_size,
95
+ fileMtimeMs: row.file_mtime_ms,
96
+ checkpointOffset: row.checkpoint_offset,
97
+ checkpointHashStart: row.checkpoint_hash_start,
98
+ ...(row.checkpoint_hash ? { checkpointHash: row.checkpoint_hash } : {}),
99
+ indexedEntries: row.indexed_entries,
100
+ malformedLines: row.malformed_lines,
101
+ indexedAt: row.indexed_at,
102
+ };
103
+ }
104
+ upsertSession(identity) {
105
+ this.upsertSessionStatement.run(identity.sessionId, identity.sessionFile, identity.projectPath ?? null, identity.indexedAt);
106
+ }
107
+ rebuild(identity, entries, checkpoint) {
108
+ return runTransaction(this.database, () => {
109
+ this.upsertSession(identity);
110
+ this.database.exec(`
111
+ CREATE TEMP TABLE IF NOT EXISTS ds4_seen_entries (
112
+ entry_key TEXT PRIMARY KEY
113
+ ) WITHOUT ROWID;
114
+ DELETE FROM ds4_seen_entries;
115
+ `);
116
+ const markSeen = this.database.prepare("INSERT INTO ds4_seen_entries(entry_key) VALUES (?)");
117
+ for (const entry of entries) {
118
+ markSeen.run(entry.entryKey);
119
+ this.writeEntry(entry);
120
+ }
121
+ this.database.prepare(`
122
+ DELETE FROM entries_fts
123
+ WHERE session_id = ?
124
+ AND entry_key NOT IN (SELECT entry_key FROM ds4_seen_entries)
125
+ `).run(identity.sessionId);
126
+ this.database.prepare(`
127
+ DELETE FROM entries
128
+ WHERE session_id = ?
129
+ AND entry_key NOT IN (SELECT entry_key FROM ds4_seen_entries)
130
+ `).run(identity.sessionId);
131
+ this.writeState(checkpoint, entries.length);
132
+ return { inserted: entries.length, unchanged: 0, totalEntries: entries.length };
133
+ });
134
+ }
135
+ append(identity, entries, checkpoint) {
136
+ return runTransaction(this.database, () => {
137
+ this.upsertSession(identity);
138
+ let inserted = 0;
139
+ let unchanged = 0;
140
+ for (const entry of entries) {
141
+ const existing = this.existingHashStatement.get(entry.entryKey, entry.sessionId);
142
+ if (existing) {
143
+ if (existing.content_hash !== entry.contentHash) {
144
+ throw new AppendOnlyEntryChangedError(entry.entryId);
145
+ }
146
+ unchanged++;
147
+ continue;
148
+ }
149
+ this.writeEntry(entry);
150
+ inserted++;
151
+ }
152
+ const totalEntries = this.countEntries(identity.sessionId);
153
+ this.writeState(checkpoint, totalEntries);
154
+ return { inserted, unchanged, totalEntries };
155
+ });
156
+ }
157
+ hasEntry(sessionId, entryId) {
158
+ const row = this.database.prepare("SELECT 1 AS found FROM entries WHERE entry_key = ? AND session_id = ?").get(`${sessionId}:${entryId}`, sessionId);
159
+ return row !== undefined;
160
+ }
161
+ getStats(sessionId) {
162
+ const row = this.database.prepare(`
163
+ SELECT COUNT(*) AS entries, COALESCE(SUM(token_estimate), 0) AS estimated_tokens
164
+ FROM entries
165
+ WHERE session_id = ?
166
+ `).get(sessionId);
167
+ return { entries: row.entries, estimatedTokens: row.estimated_tokens };
168
+ }
169
+ searchExact(sessionId, phrase, limit) {
170
+ const rows = this.database.prepare(`
171
+ SELECT entry_id, parent_id, entry_type, role, created_at,
172
+ searchable_text, token_estimate, content_hash
173
+ FROM entries
174
+ WHERE session_id = ? AND instr(searchable_text, ?) > 0
175
+ ORDER BY created_at DESC, entry_id DESC
176
+ LIMIT ?
177
+ `).all(sessionId, phrase, limit);
178
+ return rows.map(toSearchResult);
179
+ }
180
+ searchFts(sessionId, query, limit) {
181
+ const rows = this.database.prepare(`
182
+ SELECT entry.entry_id, entry.parent_id, entry.entry_type, entry.role,
183
+ entry.created_at, entry.searchable_text, entry.token_estimate,
184
+ entry.content_hash, bm25(entries_fts) AS score
185
+ FROM entries_fts
186
+ JOIN entries AS entry ON entry.entry_key = entries_fts.entry_key
187
+ WHERE entries_fts MATCH ? AND entries_fts.session_id = ?
188
+ ORDER BY score, entry.created_at DESC
189
+ LIMIT ?
190
+ `).all(query, sessionId, limit);
191
+ return rows.map(toSearchResult);
192
+ }
193
+ writeEntry(entry) {
194
+ this.insertEntryStatement.run(entry.entryKey, entry.entryId, entry.sessionId, entry.parentId, entry.entryType, entry.role ?? null, entry.createdAt ?? null, entry.contentHash, entry.searchableText, entry.tokenEstimate, entry.indexedAt);
195
+ this.deleteFtsEntryStatement.run(entry.entryKey);
196
+ this.insertFtsStatement.run(entry.searchableText, entry.entryKey, entry.entryId, entry.sessionId);
197
+ }
198
+ writeState(checkpoint, indexedEntries) {
199
+ this.upsertStateStatement.run(checkpoint.sessionId, checkpoint.sessionFile, checkpoint.headerHash, checkpoint.fileSize, checkpoint.fileMtimeMs, checkpoint.checkpointOffset, checkpoint.checkpointHashStart, checkpoint.checkpointHash ?? null, indexedEntries, checkpoint.malformedLines, checkpoint.indexedAt);
200
+ }
201
+ countEntries(sessionId) {
202
+ const row = this.database.prepare("SELECT COUNT(*) AS count FROM entries WHERE session_id = ?")
203
+ .get(sessionId);
204
+ return row.count;
205
+ }
206
+ }
207
+ function toSearchResult(row) {
208
+ return {
209
+ entryId: row.entry_id,
210
+ parentId: row.parent_id,
211
+ entryType: row.entry_type,
212
+ ...(row.role ? { role: row.role } : {}),
213
+ ...(row.created_at !== null ? { createdAt: row.created_at } : {}),
214
+ searchableText: row.searchable_text ?? "",
215
+ tokenEstimate: row.token_estimate ?? 0,
216
+ contentHash: row.content_hash,
217
+ ...(row.score !== undefined ? { score: row.score } : {}),
218
+ };
219
+ }
220
+ //# sourceMappingURL=session-index-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-index-repository.js","sourceRoot":"","sources":["../../../src/persistence/repositories/session-index-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { DatabaseSync } from "node:sqlite";
2
+ import { type SummaryRecord } from "../../compaction/compaction-record.ts";
3
+ export declare class SummaryRepository {
4
+ private readonly database;
5
+ constructor(database: DatabaseSync);
6
+ save(record: SummaryRecord): void;
7
+ saveGraph(records: readonly SummaryRecord[]): void;
8
+ markCommitted(summaryId: string, piCompactionEntryId?: string): boolean;
9
+ markFailed(summaryId: string): boolean;
10
+ markFailedMany(summaryIds: readonly string[]): number;
11
+ failPreparedForSession(sessionId: string): number;
12
+ getById(summaryId: string): SummaryRecord | undefined;
13
+ getLatest(sessionId: string): SummaryRecord | undefined;
14
+ listBySession(sessionId: string): SummaryRecord[];
15
+ }
16
+ //# sourceMappingURL=summary-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary-repository.d.ts","sourceRoot":"","sources":["../../../src/persistence/repositories/summary-repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,uCAAuC,CAAC;AA4H/C,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAEnD,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAIjC,SAAS,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,IAAI;IA4GlD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO;IAUvE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAQtC,cAAc,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM;IAMrD,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAQjD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAMrD,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAUvD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE;CAQlD"}