@aeriondyseti/vector-memory-mcp 1.1.0-dev.2 → 1.1.0-dev.3

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 (92) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/src/config/index.d.ts +17 -10
  3. package/dist/src/config/index.d.ts.map +1 -1
  4. package/dist/src/config/index.js +25 -11
  5. package/dist/src/config/index.js.map +1 -1
  6. package/dist/src/db/conversation.repository.d.ts +26 -0
  7. package/dist/src/db/conversation.repository.d.ts.map +1 -0
  8. package/dist/src/db/conversation.repository.js +72 -0
  9. package/dist/src/db/conversation.repository.js.map +1 -0
  10. package/dist/src/db/conversation.schema.d.ts +4 -0
  11. package/dist/src/db/conversation.schema.d.ts.map +1 -0
  12. package/dist/src/db/conversation.schema.js +15 -0
  13. package/dist/src/db/conversation.schema.js.map +1 -0
  14. package/dist/src/db/lancedb-utils.d.ts +13 -3
  15. package/dist/src/db/lancedb-utils.d.ts.map +1 -1
  16. package/dist/src/db/lancedb-utils.js +36 -7
  17. package/dist/src/db/lancedb-utils.js.map +1 -1
  18. package/dist/src/db/memory.repository.js +7 -7
  19. package/dist/src/db/memory.repository.js.map +1 -1
  20. package/dist/src/http/server.d.ts.map +1 -1
  21. package/dist/src/http/server.js +26 -7
  22. package/dist/src/http/server.js.map +1 -1
  23. package/dist/src/index.js +7 -6
  24. package/dist/src/index.js.map +1 -1
  25. package/dist/src/mcp/handlers.d.ts +1 -1
  26. package/dist/src/mcp/handlers.d.ts.map +1 -1
  27. package/dist/src/mcp/handlers.js +106 -117
  28. package/dist/src/mcp/handlers.js.map +1 -1
  29. package/dist/src/mcp/tools.d.ts.map +1 -1
  30. package/dist/src/mcp/tools.js +43 -14
  31. package/dist/src/mcp/tools.js.map +1 -1
  32. package/dist/src/services/conversation.service.d.ts +38 -0
  33. package/dist/src/services/conversation.service.d.ts.map +1 -0
  34. package/dist/src/services/conversation.service.js +252 -0
  35. package/dist/src/services/conversation.service.js.map +1 -0
  36. package/dist/src/services/memory.service.d.ts +7 -25
  37. package/dist/src/services/memory.service.d.ts.map +1 -1
  38. package/dist/src/services/memory.service.js +66 -80
  39. package/dist/src/services/memory.service.js.map +1 -1
  40. package/dist/src/services/parsers/claude-code.parser.d.ts +8 -0
  41. package/dist/src/services/parsers/claude-code.parser.d.ts.map +1 -0
  42. package/dist/src/services/parsers/claude-code.parser.js +191 -0
  43. package/dist/src/services/parsers/claude-code.parser.js.map +1 -0
  44. package/dist/src/services/parsers/types.d.ts +9 -0
  45. package/dist/src/services/parsers/types.d.ts.map +1 -0
  46. package/dist/src/services/parsers/types.js +2 -0
  47. package/dist/src/services/parsers/types.js.map +1 -0
  48. package/dist/src/types/conversation.d.ts +99 -0
  49. package/dist/src/types/conversation.d.ts.map +1 -0
  50. package/dist/src/types/conversation.js +2 -0
  51. package/dist/src/types/conversation.js.map +1 -0
  52. package/hooks/session-start.ts +60 -42
  53. package/package.json +1 -1
  54. package/src/config/index.ts +39 -21
  55. package/src/db/conversation.repository.ts +120 -0
  56. package/src/db/conversation.schema.ts +33 -0
  57. package/src/db/lancedb-utils.ts +35 -7
  58. package/src/db/memory.repository.ts +7 -7
  59. package/src/http/server.ts +31 -7
  60. package/src/index.ts +10 -11
  61. package/src/mcp/handlers.ts +121 -123
  62. package/src/mcp/tools.ts +44 -15
  63. package/src/services/conversation.service.ts +354 -0
  64. package/src/services/memory.service.ts +101 -105
  65. package/src/services/parsers/claude-code.parser.ts +242 -0
  66. package/src/services/parsers/types.ts +14 -0
  67. package/src/types/conversation.ts +108 -0
  68. package/dist/src/db/conversation-history.repository.d.ts +0 -24
  69. package/dist/src/db/conversation-history.repository.d.ts.map +0 -1
  70. package/dist/src/db/conversation-history.repository.js +0 -184
  71. package/dist/src/db/conversation-history.repository.js.map +0 -1
  72. package/dist/src/db/conversation-history.schema.d.ts +0 -10
  73. package/dist/src/db/conversation-history.schema.d.ts.map +0 -1
  74. package/dist/src/db/conversation-history.schema.js +0 -31
  75. package/dist/src/db/conversation-history.schema.js.map +0 -1
  76. package/dist/src/services/conversation-history.service.d.ts +0 -64
  77. package/dist/src/services/conversation-history.service.d.ts.map +0 -1
  78. package/dist/src/services/conversation-history.service.js +0 -244
  79. package/dist/src/services/conversation-history.service.js.map +0 -1
  80. package/dist/src/services/session-parser.d.ts +0 -59
  81. package/dist/src/services/session-parser.d.ts.map +0 -1
  82. package/dist/src/services/session-parser.js +0 -147
  83. package/dist/src/services/session-parser.js.map +0 -1
  84. package/dist/src/types/conversation-history.d.ts +0 -74
  85. package/dist/src/types/conversation-history.d.ts.map +0 -1
  86. package/dist/src/types/conversation-history.js +0 -2
  87. package/dist/src/types/conversation-history.js.map +0 -1
  88. package/src/db/conversation-history.repository.ts +0 -255
  89. package/src/db/conversation-history.schema.ts +0 -40
  90. package/src/services/conversation-history.service.ts +0 -320
  91. package/src/services/session-parser.ts +0 -232
  92. package/src/types/conversation-history.ts +0 -82
@@ -1,64 +0,0 @@
1
- import type { ConversationHistoryRepository } from "../db/conversation-history.repository.js";
2
- import type { EmbeddingsService } from "./embeddings.service.js";
3
- import type { HistorySearchResult, IndexedSessionSummary, IndexingSummary } from "../types/conversation-history.js";
4
- export declare class ConversationHistoryService {
5
- private repository;
6
- private embeddings;
7
- private sessionPath;
8
- constructor(repository: ConversationHistoryRepository, embeddings: EmbeddingsService, sessionPath: string | null);
9
- /**
10
- * Index all conversation sessions found in the session directory.
11
- *
12
- * For each .jsonl file discovered:
13
- * - New (not tracked): full parse from byte 0
14
- * - Grown (fileSize increased): incremental parse from last-known size
15
- * - Shrunk (fileSize decreased — file replaced): delete + full reindex
16
- * - Unchanged (same fileSize): skip
17
- */
18
- indexConversations(sessionDir?: string): Promise<IndexingSummary>;
19
- /**
20
- * Search conversation history using hybrid (vector + FTS) search.
21
- */
22
- search(query: string, limit: number): Promise<HistorySearchResult[]>;
23
- /**
24
- * List all indexed sessions (pass-through to repository).
25
- */
26
- listIndexedSessions(): Promise<IndexedSessionSummary[]>;
27
- /**
28
- * Force a full reindex of a specific session.
29
- * Deletes all existing entries and tracking, then re-parses from byte 0.
30
- */
31
- reindexSession(sessionId: string): Promise<IndexingSummary>;
32
- /**
33
- * Bulk-fetch all tracked sessions into a Map for O(1) lookups.
34
- * Uses listIndexedSessions() which returns summaries, but we need full
35
- * IndexedSession records. We call getIndexedSession() is avoided by using
36
- * a repository method that returns all sessions with full details.
37
- *
38
- * Note: listIndexedSessions returns IndexedSessionSummary (no filePath/fileSize),
39
- * so we use getIndexedSession per unique session. However, we batch this via
40
- * the list + individual fetches only when needed. For now, we fetch all as
41
- * summaries and promote to full records via individual lookups grouped upfront.
42
- */
43
- private buildSessionIndex;
44
- /**
45
- * Discover all .jsonl files across resolved session directories.
46
- * Resolves dirs and discovers files in one pass to avoid double-scanning.
47
- */
48
- private discoverAllFiles;
49
- /**
50
- * List immediate subdirectories of a path. Stat calls are parallelized.
51
- */
52
- private listSubdirectories;
53
- /**
54
- * Parse a session file, embed messages in batches, insert into repository,
55
- * and upsert the tracking record. Returns count of messages indexed.
56
- */
57
- private indexFile;
58
- /**
59
- * Upsert the indexed session tracking record.
60
- * For incremental indexing, merges timestamps with the existing record.
61
- */
62
- private upsertTracking;
63
- }
64
- //# sourceMappingURL=conversation-history.service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation-history.service.d.ts","sourceRoot":"","sources":["../../../src/services/conversation-history.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,0CAA0C,CAAC;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AASjE,OAAO,KAAK,EAEV,mBAAmB,EAEnB,qBAAqB,EACrB,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAI1C,qBAAa,0BAA0B;IAEnC,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,WAAW;gBAFX,UAAU,EAAE,6BAA6B,EACzC,UAAU,EAAE,iBAAiB,EAC7B,WAAW,EAAE,MAAM,GAAG,IAAI;IAGpC;;;;;;;;OAQG;IACG,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAsDvE;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAiB1E;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAI7D;;;OAGG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA6CjE;;;;;;;;;;OAUG;YACW,iBAAiB;IAkB/B;;;OAGG;YACW,gBAAgB;IAc9B;;OAEG;YACW,kBAAkB;IAsBhC;;;OAGG;YACW,SAAS;IA4CvB;;;OAGG;YACW,cAAc;CA2B7B"}
@@ -1,244 +0,0 @@
1
- import { readdir, stat } from "fs/promises";
2
- import { join } from "path";
3
- import { parseSessionFile, discoverSessionFiles, detectSessionPath, } from "./session-parser.js";
4
- const EMBED_BATCH_SIZE = 50;
5
- export class ConversationHistoryService {
6
- repository;
7
- embeddings;
8
- sessionPath;
9
- constructor(repository, embeddings, sessionPath) {
10
- this.repository = repository;
11
- this.embeddings = embeddings;
12
- this.sessionPath = sessionPath;
13
- }
14
- /**
15
- * Index all conversation sessions found in the session directory.
16
- *
17
- * For each .jsonl file discovered:
18
- * - New (not tracked): full parse from byte 0
19
- * - Grown (fileSize increased): incremental parse from last-known size
20
- * - Shrunk (fileSize decreased — file replaced): delete + full reindex
21
- * - Unchanged (same fileSize): skip
22
- */
23
- async indexConversations(sessionDir) {
24
- const allFiles = await this.discoverAllFiles(sessionDir);
25
- // Bulk-fetch all tracked sessions into a Map to avoid N+1 lookups
26
- const trackedSessions = await this.buildSessionIndex();
27
- const summary = {
28
- sessionsDiscovered: allFiles.length,
29
- sessionsIndexed: 0,
30
- sessionsSkipped: 0,
31
- messagesIndexed: 0,
32
- };
33
- for (const file of allFiles) {
34
- const indexed = trackedSessions.get(file.sessionId) ?? null;
35
- if (indexed && indexed.fileSize === file.fileSize) {
36
- // Unchanged — skip
37
- summary.sessionsSkipped++;
38
- continue;
39
- }
40
- if (indexed && file.fileSize < indexed.fileSize) {
41
- // Shrunk — file was replaced, full reindex
42
- await this.repository.deleteBySessionId(file.sessionId);
43
- await this.repository.deleteIndexedSession(file.sessionId);
44
- const count = await this.indexFile(file, 0, 0, null);
45
- summary.sessionsIndexed++;
46
- summary.messagesIndexed += count;
47
- continue;
48
- }
49
- if (indexed && file.fileSize > indexed.fileSize) {
50
- // Grown — incremental parse from where we left off
51
- const count = await this.indexFile(file, indexed.fileSize, indexed.messageCount, indexed);
52
- summary.sessionsIndexed++;
53
- summary.messagesIndexed += count;
54
- continue;
55
- }
56
- // New — full parse
57
- const count = await this.indexFile(file, 0, 0, null);
58
- summary.sessionsIndexed++;
59
- summary.messagesIndexed += count;
60
- }
61
- return summary;
62
- }
63
- /**
64
- * Search conversation history using hybrid (vector + FTS) search.
65
- */
66
- async search(query, limit) {
67
- const embedding = await this.embeddings.embed(query);
68
- const rows = await this.repository.findHybrid(embedding, query, limit);
69
- return rows.map((row) => ({
70
- source: "conversation_history",
71
- id: row.id,
72
- content: row.content,
73
- metadata: row.metadata,
74
- score: row.rrfScore,
75
- sessionId: row.sessionId,
76
- role: row.role,
77
- messageIndex: row.messageIndex,
78
- timestamp: row.timestamp,
79
- }));
80
- }
81
- /**
82
- * List all indexed sessions (pass-through to repository).
83
- */
84
- async listIndexedSessions() {
85
- return this.repository.listIndexedSessions();
86
- }
87
- /**
88
- * Force a full reindex of a specific session.
89
- * Deletes all existing entries and tracking, then re-parses from byte 0.
90
- */
91
- async reindexSession(sessionId) {
92
- const indexed = await this.repository.getIndexedSession(sessionId);
93
- const summary = {
94
- sessionsDiscovered: 1,
95
- sessionsIndexed: 0,
96
- sessionsSkipped: 0,
97
- messagesIndexed: 0,
98
- };
99
- if (!indexed) {
100
- // Nothing to reindex — no tracking record means we don't know the file path
101
- summary.sessionsSkipped = 1;
102
- return summary;
103
- }
104
- // Delete existing data
105
- await this.repository.deleteBySessionId(sessionId);
106
- await this.repository.deleteIndexedSession(sessionId);
107
- // Get current file size (file may have changed since last index)
108
- let fileSize;
109
- try {
110
- const stats = await stat(indexed.filePath);
111
- fileSize = stats.size;
112
- }
113
- catch {
114
- // File no longer exists
115
- summary.sessionsSkipped = 1;
116
- return summary;
117
- }
118
- const fileInfo = {
119
- sessionId,
120
- filePath: indexed.filePath,
121
- fileSize,
122
- };
123
- const count = await this.indexFile(fileInfo, 0, 0, null);
124
- summary.sessionsIndexed = 1;
125
- summary.messagesIndexed = count;
126
- return summary;
127
- }
128
- // --- Private helpers ---
129
- /**
130
- * Bulk-fetch all tracked sessions into a Map for O(1) lookups.
131
- * Uses listIndexedSessions() which returns summaries, but we need full
132
- * IndexedSession records. We call getIndexedSession() is avoided by using
133
- * a repository method that returns all sessions with full details.
134
- *
135
- * Note: listIndexedSessions returns IndexedSessionSummary (no filePath/fileSize),
136
- * so we use getIndexedSession per unique session. However, we batch this via
137
- * the list + individual fetches only when needed. For now, we fetch all as
138
- * summaries and promote to full records via individual lookups grouped upfront.
139
- */
140
- async buildSessionIndex() {
141
- const summaries = await this.repository.listIndexedSessions();
142
- const sessionMap = new Map();
143
- // Fetch full records in parallel for all known sessions
144
- const fullRecords = await Promise.all(summaries.map((s) => this.repository.getIndexedSession(s.sessionId)));
145
- for (const record of fullRecords) {
146
- if (record) {
147
- sessionMap.set(record.sessionId, record);
148
- }
149
- }
150
- return sessionMap;
151
- }
152
- /**
153
- * Discover all .jsonl files across resolved session directories.
154
- * Resolves dirs and discovers files in one pass to avoid double-scanning.
155
- */
156
- async discoverAllFiles(sessionDir) {
157
- const base = sessionDir ?? this.sessionPath ?? detectSessionPath();
158
- if (!base)
159
- return [];
160
- // Check if base dir itself has .jsonl files
161
- const rootFiles = await discoverSessionFiles(base);
162
- if (rootFiles.length > 0)
163
- return rootFiles;
164
- // Otherwise enumerate subdirectories and discover files in each
165
- const dirs = await this.listSubdirectories(base);
166
- const nested = await Promise.all(dirs.map((d) => discoverSessionFiles(d)));
167
- return nested.flat();
168
- }
169
- /**
170
- * List immediate subdirectories of a path. Stat calls are parallelized.
171
- */
172
- async listSubdirectories(base) {
173
- let entries;
174
- try {
175
- entries = await readdir(base);
176
- }
177
- catch {
178
- return [];
179
- }
180
- const results = await Promise.allSettled(entries.map(async (entry) => {
181
- const fullPath = join(base, entry);
182
- const stats = await stat(fullPath);
183
- return stats.isDirectory() ? fullPath : null;
184
- }));
185
- return results
186
- .filter((r) => r.status === "fulfilled")
187
- .map((r) => r.value)
188
- .filter((v) => v != null);
189
- }
190
- /**
191
- * Parse a session file, embed messages in batches, insert into repository,
192
- * and upsert the tracking record. Returns count of messages indexed.
193
- */
194
- async indexFile(file, fromByte, startIndex, existing) {
195
- const parseResult = await parseSessionFile(file.filePath, fromByte, startIndex, file.fileSize);
196
- if (parseResult.messages.length === 0) {
197
- // Still upsert tracking so we don't re-parse an empty/no-new-content file
198
- await this.upsertTracking(file, parseResult.messages, startIndex, parseResult, existing);
199
- return 0;
200
- }
201
- // Embed and insert in batches
202
- for (let i = 0; i < parseResult.messages.length; i += EMBED_BATCH_SIZE) {
203
- const batch = parseResult.messages.slice(i, i + EMBED_BATCH_SIZE);
204
- const texts = batch.map((m) => m.content);
205
- const embeddings = await this.embeddings.embedBatch(texts);
206
- const entries = batch.map((msg, idx) => ({
207
- id: msg.id,
208
- content: msg.content,
209
- embedding: embeddings[idx],
210
- sessionId: msg.sessionId,
211
- role: msg.role,
212
- messageIndex: msg.messageIndex,
213
- timestamp: msg.timestamp,
214
- metadata: msg.metadata,
215
- createdAt: new Date(),
216
- }));
217
- await this.repository.insert(entries);
218
- }
219
- await this.upsertTracking(file, parseResult.messages, startIndex, parseResult, existing);
220
- return parseResult.messages.length;
221
- }
222
- /**
223
- * Upsert the indexed session tracking record.
224
- * For incremental indexing, merges timestamps with the existing record.
225
- */
226
- async upsertTracking(file, newMessages, startIndex, parseResult, existing) {
227
- const totalMessageCount = startIndex + newMessages.length;
228
- const firstMessageAt = existing?.firstMessageAt ?? parseResult.firstMessageAt ?? new Date();
229
- const lastMessageAt = parseResult.lastMessageAt ?? existing?.lastMessageAt ?? new Date();
230
- const session = {
231
- sessionId: file.sessionId,
232
- filePath: file.filePath,
233
- fileSize: file.fileSize,
234
- messageCount: totalMessageCount,
235
- firstMessageAt,
236
- lastMessageAt,
237
- indexedAt: new Date(),
238
- ...(parseResult.project ? { project: parseResult.project } : existing?.project ? { project: existing.project } : {}),
239
- ...(parseResult.gitBranch ? { gitBranch: parseResult.gitBranch } : existing?.gitBranch ? { gitBranch: existing.gitBranch } : {}),
240
- };
241
- await this.repository.upsertIndexedSession(session);
242
- }
243
- }
244
- //# sourceMappingURL=conversation-history.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation-history.service.js","sourceRoot":"","sources":["../../../src/services/conversation-history.service.ts"],"names":[],"mappings":"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"}
@@ -1,59 +0,0 @@
1
- import type { MessageRole } from "../types/conversation-history.js";
2
- /**
3
- * A parsed message extracted from a Claude Code JSONL session file.
4
- * Does not include embedding — that's added by the service layer.
5
- */
6
- export interface ParsedMessage {
7
- id: string;
8
- sessionId: string;
9
- role: MessageRole;
10
- messageIndex: number;
11
- content: string;
12
- timestamp: Date;
13
- metadata: Record<string, unknown>;
14
- }
15
- /**
16
- * Info about a discovered session file (before parsing).
17
- */
18
- export interface SessionFileInfo {
19
- sessionId: string;
20
- filePath: string;
21
- fileSize: number;
22
- }
23
- /**
24
- * Result of parsing a single session file.
25
- * Structurally mirrors IndexedSession but with nullable timestamps/metadata
26
- * (a file with 0 messages has no timestamps). The service layer maps this to
27
- * IndexedSession at write time, supplying messageCount and indexedAt.
28
- */
29
- export interface ParseResult {
30
- sessionId: string;
31
- filePath: string;
32
- fileSize: number;
33
- messages: ParsedMessage[];
34
- firstMessageAt: Date | null;
35
- lastMessageAt: Date | null;
36
- gitBranch: string | null;
37
- project: string | null;
38
- }
39
- /**
40
- * Parse a single Claude Code JSONL session file.
41
- *
42
- * @param filePath - Absolute path to the .jsonl file
43
- * @param fromByte - Byte offset to start reading from (for incremental parsing).
44
- * When non-zero, messageIndex starts from startIndex.
45
- * @param startIndex - Starting message index (for incremental parsing).
46
- * @param knownFileSize - If already known (e.g. from discoverSessionFiles), avoids a redundant stat().
47
- */
48
- export declare function parseSessionFile(filePath: string, fromByte?: number, startIndex?: number, knownFileSize?: number): Promise<ParseResult>;
49
- /**
50
- * Discover all .jsonl session files in a directory.
51
- * Stat calls are parallelized for efficiency.
52
- */
53
- export declare function discoverSessionFiles(sessionDir: string): Promise<SessionFileInfo[]>;
54
- /**
55
- * Auto-detect the Claude Code sessions directory.
56
- * Returns null if not found.
57
- */
58
- export declare function detectSessionPath(): string | null;
59
- //# sourceMappingURL=session-parser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-parser.d.ts","sourceRoot":"","sources":["../../../src/services/session-parser.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAgDD;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAU,EACpB,UAAU,GAAE,MAAU,EACtB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,WAAW,CAAC,CAyEtB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,EAAE,CAAC,CA8B5B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAOjD"}
@@ -1,147 +0,0 @@
1
- import { createReadStream } from "fs";
2
- import { readdir, stat } from "fs/promises";
3
- import { createInterface } from "readline";
4
- import { basename, join } from "path";
5
- import { randomUUID } from "crypto";
6
- /**
7
- * Extract the text content from a JSONL message line.
8
- * - User messages: content is string OR array (skip tool_result blocks)
9
- * - Assistant messages: content is array of blocks (keep only type=text)
10
- * Returns null if no usable text content.
11
- */
12
- function extractTextContent(line) {
13
- const content = line.message?.content;
14
- if (content == null)
15
- return null;
16
- // User messages can be a plain string
17
- if (typeof content === "string") {
18
- return content.trim() || null;
19
- }
20
- // Array of content blocks — extract text blocks only
21
- const textParts = [];
22
- for (const block of content) {
23
- if (block.type === "text" && block.text) {
24
- textParts.push(block.text);
25
- }
26
- }
27
- const joined = textParts.join("\n").trim();
28
- return joined || null;
29
- }
30
- /**
31
- * Parse a single Claude Code JSONL session file.
32
- *
33
- * @param filePath - Absolute path to the .jsonl file
34
- * @param fromByte - Byte offset to start reading from (for incremental parsing).
35
- * When non-zero, messageIndex starts from startIndex.
36
- * @param startIndex - Starting message index (for incremental parsing).
37
- * @param knownFileSize - If already known (e.g. from discoverSessionFiles), avoids a redundant stat().
38
- */
39
- export async function parseSessionFile(filePath, fromByte = 0, startIndex = 0, knownFileSize) {
40
- const fileSize = knownFileSize ?? (await stat(filePath)).size;
41
- // Extract session ID from filename (e.g. "abc-123.jsonl" → "abc-123")
42
- const sessionId = basename(filePath, ".jsonl");
43
- const messages = [];
44
- let messageIndex = startIndex;
45
- let firstMessageAt = null;
46
- let lastMessageAt = null;
47
- let gitBranch = null;
48
- let project = null;
49
- const stream = createReadStream(filePath, {
50
- encoding: "utf-8",
51
- start: fromByte,
52
- });
53
- const rl = createInterface({ input: stream, crlfDelay: Infinity });
54
- for await (const rawLine of rl) {
55
- if (!rawLine.trim())
56
- continue;
57
- let line;
58
- try {
59
- line = JSON.parse(rawLine);
60
- }
61
- catch {
62
- // Skip malformed lines
63
- continue;
64
- }
65
- // Only process user and assistant messages
66
- if (line.type !== "user" && line.type !== "assistant")
67
- continue;
68
- // Capture metadata from first line that has it
69
- if (gitBranch == null && line.gitBranch)
70
- gitBranch = line.gitBranch;
71
- if (project == null && line.cwd)
72
- project = line.cwd;
73
- const role = line.type === "user" ? "user" : "assistant";
74
- const text = extractTextContent(line);
75
- if (!text)
76
- continue;
77
- const timestamp = line.timestamp ? new Date(line.timestamp) : new Date();
78
- if (firstMessageAt == null)
79
- firstMessageAt = timestamp;
80
- lastMessageAt = timestamp;
81
- messages.push({
82
- id: randomUUID(),
83
- sessionId,
84
- role,
85
- messageIndex,
86
- content: text,
87
- timestamp,
88
- metadata: {
89
- ...(line.gitBranch ? { gitBranch: line.gitBranch } : {}),
90
- ...(line.cwd ? { cwd: line.cwd } : {}),
91
- },
92
- });
93
- messageIndex++;
94
- }
95
- return {
96
- sessionId,
97
- filePath,
98
- fileSize,
99
- messages,
100
- firstMessageAt,
101
- lastMessageAt,
102
- gitBranch,
103
- project,
104
- };
105
- }
106
- /**
107
- * Discover all .jsonl session files in a directory.
108
- * Stat calls are parallelized for efficiency.
109
- */
110
- export async function discoverSessionFiles(sessionDir) {
111
- let entries;
112
- try {
113
- entries = await readdir(sessionDir);
114
- }
115
- catch {
116
- return [];
117
- }
118
- const jsonlEntries = entries.filter((e) => e.endsWith(".jsonl"));
119
- const settled = await Promise.allSettled(jsonlEntries.map(async (entry) => {
120
- const filePath = join(sessionDir, entry);
121
- const fileStats = await stat(filePath);
122
- if (!fileStats.isFile())
123
- return null;
124
- return {
125
- sessionId: entry.replace(/\.jsonl$/, ""),
126
- filePath,
127
- fileSize: fileStats.size,
128
- };
129
- }));
130
- return settled
131
- .filter((r) => r.status === "fulfilled")
132
- .map((r) => r.value)
133
- .filter((v) => v != null);
134
- }
135
- /**
136
- * Auto-detect the Claude Code sessions directory.
137
- * Returns null if not found.
138
- */
139
- export function detectSessionPath() {
140
- const home = process.env.HOME ?? process.env.USERPROFILE;
141
- if (!home)
142
- return null;
143
- // Claude Code stores sessions at ~/.claude/projects/<project-slug>/<session-id>.jsonl
144
- // We return the projects dir — the caller iterates project subdirs
145
- return join(home, ".claude", "projects");
146
- }
147
- //# sourceMappingURL=session-parser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-parser.js","sourceRoot":"","sources":["../../../src/services/session-parser.ts"],"names":[],"mappings":"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"}
@@ -1,74 +0,0 @@
1
- import type { WithRrfScore } from "./memory.js";
2
- export type MessageRole = "user" | "assistant";
3
- /**
4
- * A single indexed message from a conversation session log.
5
- * One entry per user/assistant text message — tool calls and results are excluded.
6
- */
7
- export interface ConversationHistoryEntry {
8
- id: string;
9
- content: string;
10
- embedding: number[];
11
- sessionId: string;
12
- role: MessageRole;
13
- messageIndex: number;
14
- timestamp: Date;
15
- metadata: Record<string, unknown>;
16
- createdAt: Date;
17
- }
18
- export type ConversationHistoryHybridRow = WithRrfScore<ConversationHistoryEntry>;
19
- /**
20
- * Summary of an indexed session for list_indexed_sessions.
21
- */
22
- export interface IndexedSessionSummary {
23
- sessionId: string;
24
- messageCount: number;
25
- firstMessageAt: Date;
26
- lastMessageAt: Date;
27
- indexedAt: Date;
28
- project?: string;
29
- gitBranch?: string;
30
- }
31
- /**
32
- * Full indexed session record including storage-level fields (file path, size).
33
- * Used by the repository for upsert operations and by the parser for tracking.
34
- */
35
- export interface IndexedSession extends IndexedSessionSummary {
36
- filePath: string;
37
- fileSize: number;
38
- }
39
- /**
40
- * Discriminated union for merged search results.
41
- * Narrow on `source` to access type-specific fields.
42
- */
43
- export interface MemorySearchResult {
44
- source: "memory";
45
- id: string;
46
- content: string;
47
- metadata: Record<string, unknown>;
48
- score: number;
49
- createdAt: Date;
50
- updatedAt: Date;
51
- supersededBy: string | null;
52
- }
53
- export interface HistorySearchResult {
54
- source: "conversation_history";
55
- id: string;
56
- content: string;
57
- metadata: Record<string, unknown>;
58
- score: number;
59
- sessionId: string;
60
- role: MessageRole;
61
- messageIndex: number;
62
- timestamp: Date;
63
- }
64
- export type SearchResult = MemorySearchResult | HistorySearchResult;
65
- /**
66
- * Summary returned by indexConversations() and reindexSession().
67
- */
68
- export interface IndexingSummary {
69
- sessionsDiscovered: number;
70
- sessionsIndexed: number;
71
- sessionsSkipped: number;
72
- messagesIndexed: number;
73
- }
74
- //# sourceMappingURL=conversation-history.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation-history.d.ts","sourceRoot":"","sources":["../../../src/types/conversation-history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,4BAA4B,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AAElF;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,IAAI,CAAC;IACrB,aAAa,EAAE,IAAI,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAe,SAAQ,qBAAqB;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,QAAQ,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=conversation-history.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation-history.js","sourceRoot":"","sources":["../../../src/types/conversation-history.ts"],"names":[],"mappings":""}