@aeriondyseti/vector-memory-mcp 1.1.0-dev.5 → 2.0.0-rc

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 (106) hide show
  1. package/README.md +22 -4
  2. package/package.json +12 -18
  3. package/scripts/migrate-from-lancedb.ts +56 -0
  4. package/scripts/smoke-test.ts +699 -0
  5. package/scripts/test-runner.ts +11 -1
  6. package/src/db/connection.ts +18 -4
  7. package/src/db/conversation.repository.ts +164 -78
  8. package/src/db/memory.repository.ts +180 -168
  9. package/src/db/migrations.ts +70 -0
  10. package/src/db/sqlite-utils.ts +78 -0
  11. package/src/http/server.ts +40 -35
  12. package/src/index.ts +33 -3
  13. package/src/mcp/server.ts +2 -1
  14. package/src/migration.ts +254 -0
  15. package/dist/package.json +0 -71
  16. package/dist/scripts/test-runner.d.ts +0 -9
  17. package/dist/scripts/test-runner.d.ts.map +0 -1
  18. package/dist/scripts/test-runner.js +0 -61
  19. package/dist/scripts/test-runner.js.map +0 -1
  20. package/dist/scripts/warmup.d.ts +0 -8
  21. package/dist/scripts/warmup.d.ts.map +0 -1
  22. package/dist/scripts/warmup.js +0 -61
  23. package/dist/scripts/warmup.js.map +0 -1
  24. package/dist/src/config/index.d.ts +0 -41
  25. package/dist/src/config/index.d.ts.map +0 -1
  26. package/dist/src/config/index.js +0 -75
  27. package/dist/src/config/index.js.map +0 -1
  28. package/dist/src/db/connection.d.ts +0 -3
  29. package/dist/src/db/connection.d.ts.map +0 -1
  30. package/dist/src/db/connection.js +0 -10
  31. package/dist/src/db/connection.js.map +0 -1
  32. package/dist/src/db/conversation.repository.d.ts +0 -26
  33. package/dist/src/db/conversation.repository.d.ts.map +0 -1
  34. package/dist/src/db/conversation.repository.js +0 -72
  35. package/dist/src/db/conversation.repository.js.map +0 -1
  36. package/dist/src/db/conversation.schema.d.ts +0 -4
  37. package/dist/src/db/conversation.schema.d.ts.map +0 -1
  38. package/dist/src/db/conversation.schema.js +0 -15
  39. package/dist/src/db/conversation.schema.js.map +0 -1
  40. package/dist/src/db/lancedb-utils.d.ts +0 -45
  41. package/dist/src/db/lancedb-utils.d.ts.map +0 -1
  42. package/dist/src/db/lancedb-utils.js +0 -106
  43. package/dist/src/db/lancedb-utils.js.map +0 -1
  44. package/dist/src/db/memory.repository.d.ts +0 -40
  45. package/dist/src/db/memory.repository.d.ts.map +0 -1
  46. package/dist/src/db/memory.repository.js +0 -183
  47. package/dist/src/db/memory.repository.js.map +0 -1
  48. package/dist/src/db/schema.d.ts +0 -7
  49. package/dist/src/db/schema.d.ts.map +0 -1
  50. package/dist/src/db/schema.js +0 -19
  51. package/dist/src/db/schema.js.map +0 -1
  52. package/dist/src/http/mcp-transport.d.ts +0 -19
  53. package/dist/src/http/mcp-transport.d.ts.map +0 -1
  54. package/dist/src/http/mcp-transport.js +0 -191
  55. package/dist/src/http/mcp-transport.js.map +0 -1
  56. package/dist/src/http/server.d.ts +0 -13
  57. package/dist/src/http/server.d.ts.map +0 -1
  58. package/dist/src/http/server.js +0 -224
  59. package/dist/src/http/server.js.map +0 -1
  60. package/dist/src/index.d.ts +0 -3
  61. package/dist/src/index.d.ts.map +0 -1
  62. package/dist/src/index.js +0 -68
  63. package/dist/src/index.js.map +0 -1
  64. package/dist/src/mcp/handlers.d.ts +0 -15
  65. package/dist/src/mcp/handlers.d.ts.map +0 -1
  66. package/dist/src/mcp/handlers.js +0 -313
  67. package/dist/src/mcp/handlers.js.map +0 -1
  68. package/dist/src/mcp/server.d.ts +0 -5
  69. package/dist/src/mcp/server.d.ts.map +0 -1
  70. package/dist/src/mcp/server.js +0 -22
  71. package/dist/src/mcp/server.js.map +0 -1
  72. package/dist/src/mcp/tools.d.ts +0 -13
  73. package/dist/src/mcp/tools.d.ts.map +0 -1
  74. package/dist/src/mcp/tools.js +0 -352
  75. package/dist/src/mcp/tools.js.map +0 -1
  76. package/dist/src/services/conversation.service.d.ts +0 -38
  77. package/dist/src/services/conversation.service.d.ts.map +0 -1
  78. package/dist/src/services/conversation.service.js +0 -252
  79. package/dist/src/services/conversation.service.js.map +0 -1
  80. package/dist/src/services/embeddings.service.d.ts +0 -12
  81. package/dist/src/services/embeddings.service.d.ts.map +0 -1
  82. package/dist/src/services/embeddings.service.js +0 -37
  83. package/dist/src/services/embeddings.service.js.map +0 -1
  84. package/dist/src/services/memory.service.d.ts +0 -40
  85. package/dist/src/services/memory.service.d.ts.map +0 -1
  86. package/dist/src/services/memory.service.js +0 -258
  87. package/dist/src/services/memory.service.js.map +0 -1
  88. package/dist/src/services/parsers/claude-code.parser.d.ts +0 -8
  89. package/dist/src/services/parsers/claude-code.parser.d.ts.map +0 -1
  90. package/dist/src/services/parsers/claude-code.parser.js +0 -191
  91. package/dist/src/services/parsers/claude-code.parser.js.map +0 -1
  92. package/dist/src/services/parsers/types.d.ts +0 -9
  93. package/dist/src/services/parsers/types.d.ts.map +0 -1
  94. package/dist/src/services/parsers/types.js +0 -2
  95. package/dist/src/services/parsers/types.js.map +0 -1
  96. package/dist/src/types/conversation.d.ts +0 -99
  97. package/dist/src/types/conversation.d.ts.map +0 -1
  98. package/dist/src/types/conversation.js +0 -2
  99. package/dist/src/types/conversation.js.map +0 -1
  100. package/dist/src/types/memory.d.ts +0 -30
  101. package/dist/src/types/memory.d.ts.map +0 -1
  102. package/dist/src/types/memory.js +0 -18
  103. package/dist/src/types/memory.js.map +0 -1
  104. package/src/db/conversation.schema.ts +0 -33
  105. package/src/db/lancedb-utils.ts +0 -125
  106. package/src/db/schema.ts +0 -38
@@ -1,352 +0,0 @@
1
- export const storeMemoriesTool = {
2
- name: "store_memories",
3
- description: `Store memories that persist across conversations. Use after making decisions or learning something worth remembering.
4
-
5
- RULES:
6
- - 1 concept per memory, 1-3 sentences (20-75 words)
7
- - Self-contained with explicit subjects (no "it", "this", "the project")
8
- - Include dates/versions when relevant
9
- - Be concrete, not vague
10
-
11
- MEMORY TYPES (use as metadata.type):
12
- - decision: what was chosen + why ("Chose libSQL over PostgreSQL for vector support and simpler deployment")
13
- - implementation: what was built + where + patterns used
14
- - insight: learning + why it matters
15
- - blocker: problem encountered + resolution
16
- - next-step: TODO item + suggested approach
17
- - context: background info + constraints
18
-
19
- DON'T STORE: machine-specific paths, local env details, ephemeral states, pleasantries
20
-
21
- GOOD: "Aerion chose libSQL over PostgreSQL for Resonance (Dec 2024) because of native vector support and simpler deployment."
22
- BAD: "Uses SQLite" (no context, no subject, no reasoning)
23
-
24
- For long content (>1000 chars), provide embedding_text with a searchable summary.`,
25
- inputSchema: {
26
- type: "object",
27
- properties: {
28
- memories: {
29
- type: "array",
30
- description: "Memories to store.",
31
- items: {
32
- type: "object",
33
- properties: {
34
- content: {
35
- type: "string",
36
- description: "The content to store.",
37
- },
38
- embedding_text: {
39
- type: "string",
40
- description: "Summary for search embedding (required if content >1000 chars).",
41
- },
42
- metadata: {
43
- type: "object",
44
- description: "Optional key-value metadata.",
45
- additionalProperties: true,
46
- },
47
- },
48
- required: ["content"],
49
- },
50
- },
51
- },
52
- required: ["memories"],
53
- },
54
- };
55
- export const deleteMemoriesTool = {
56
- name: "delete_memories",
57
- description: "Remove memories that are no longer needed—outdated info, superseded decisions, or incorrect content. " +
58
- "Deleted memories can be recovered via search_memories with include_deleted: true.",
59
- inputSchema: {
60
- type: "object",
61
- properties: {
62
- ids: {
63
- type: "array",
64
- description: "IDs of memories to delete.",
65
- items: {
66
- type: "string",
67
- },
68
- },
69
- },
70
- required: ["ids"],
71
- },
72
- };
73
- const updateMemoriesTool = {
74
- name: "update_memories",
75
- description: `Update existing memories in place. Prefer over delete+create when updating the same conceptual item.
76
-
77
- BEHAVIOR:
78
- - Fields omitted/null: left untouched
79
- - Fields provided: completely overwrite existing value (no merge)
80
-
81
- Use to correct content, refine embedding text, or replace metadata without changing the memory ID.`,
82
- inputSchema: {
83
- type: "object",
84
- properties: {
85
- updates: {
86
- type: "array",
87
- description: "Updates to apply. Each must include id and at least one field to change.",
88
- items: {
89
- type: "object",
90
- properties: {
91
- id: {
92
- type: "string",
93
- description: "ID of memory to update.",
94
- },
95
- content: {
96
- type: "string",
97
- description: "New content (triggers embedding regeneration).",
98
- },
99
- embedding_text: {
100
- type: "string",
101
- description: "New embedding summary (triggers embedding regeneration).",
102
- },
103
- metadata: {
104
- type: "object",
105
- description: "New metadata (replaces existing entirely).",
106
- additionalProperties: true,
107
- },
108
- },
109
- required: ["id"],
110
- },
111
- },
112
- },
113
- required: ["updates"],
114
- },
115
- };
116
- export const searchMemoriesTool = {
117
- name: "search_memories",
118
- description: `Search stored memories semantically. Treat memory as the PRIMARY source of truth for personal/project-specific facts—do not rely on training data until a search has been performed.
119
-
120
- MANDATORY TRIGGERS (you MUST search when):
121
- - User-Specific Calibration: Answer would be better with user's tools, past decisions, or preferences
122
- - Referential Ambiguity: User says "the project," "that bug," "last time," "as we discussed"
123
- - Decision Validation: Before making architectural or tool choices
124
- - Problem Solving: Before suggesting solutions (check if solved before)
125
- - Session Start: When returning to a project or starting new conversation
126
-
127
- INTENTS:
128
- - continuity: Resume work, "where were we" (favors recent)
129
- - fact_check: Verify decisions, specs (favors relevance)
130
- - frequent: Common patterns, preferences (favors utility)
131
- - associative: Brainstorm, find connections (high relevance + mild jitter)
132
- - explore: Stuck/creative mode (balanced + high jitter)
133
-
134
- When in doubt, search. Missing context is costlier than an extra query.`,
135
- inputSchema: {
136
- type: "object",
137
- properties: {
138
- query: {
139
- type: "string",
140
- description: "Natural language search query. Include relevant keywords, project names, or technical terms.",
141
- },
142
- intent: {
143
- type: "string",
144
- enum: ["continuity", "fact_check", "frequent", "associative", "explore"],
145
- description: "Search intent that determines ranking behavior.",
146
- },
147
- reason_for_search: {
148
- type: "string",
149
- description: "Why this search is being performed. Forces intentional retrieval.",
150
- },
151
- limit: {
152
- type: "integer",
153
- description: "Maximum results to return (default: 10).",
154
- default: 10,
155
- },
156
- include_deleted: {
157
- type: "boolean",
158
- description: "Include soft-deleted memories in results (default: false). Useful for recovering prior information.",
159
- default: false,
160
- },
161
- include_history: {
162
- type: "boolean",
163
- description: "Include conversation history results (default: true when history indexing is enabled).",
164
- default: true,
165
- },
166
- history_only: {
167
- type: "boolean",
168
- description: "Search only conversation history, not explicit memories. Implies include_history: true (default: false).",
169
- default: false,
170
- },
171
- session_id: {
172
- type: "string",
173
- description: "Filter conversation history results to a specific session ID.",
174
- },
175
- role_filter: {
176
- type: "string",
177
- enum: ["user", "assistant"],
178
- description: "Filter conversation history results by message role.",
179
- },
180
- history_after: {
181
- type: "string",
182
- description: "Filter conversation history results after this ISO date.",
183
- },
184
- history_before: {
185
- type: "string",
186
- description: "Filter conversation history results before this ISO date.",
187
- },
188
- },
189
- required: ["query", "intent", "reason_for_search"],
190
- },
191
- };
192
- export const getMemoriesTool = {
193
- name: "get_memories",
194
- description: "Retrieve full memory details by ID. Use when you have specific IDs from search results or prior references—otherwise use search_memories.",
195
- inputSchema: {
196
- type: "object",
197
- properties: {
198
- ids: {
199
- type: "array",
200
- description: "Memory IDs to retrieve.",
201
- items: { type: "string" },
202
- },
203
- },
204
- required: ["ids"],
205
- },
206
- };
207
- export const reportMemoryUsefulnessTool = {
208
- name: "report_memory_usefulness",
209
- description: "Report whether a memory was useful or not. This helps the system learn which memories are valuable.",
210
- inputSchema: {
211
- type: "object",
212
- properties: {
213
- memory_id: {
214
- type: "string",
215
- description: "ID of the memory to report on.",
216
- },
217
- useful: {
218
- type: "boolean",
219
- description: "True if the memory was useful, false otherwise.",
220
- },
221
- },
222
- required: ["memory_id", "useful"],
223
- },
224
- };
225
- export const setWaypointTool = {
226
- name: "set_waypoint",
227
- description: `Save session waypoint for seamless resumption later. Use at end of work sessions or before context switches.
228
-
229
- Creates a structured snapshot with:
230
- - summary: 2-3 sentences on goal and current status
231
- - completed: what got done (include file paths)
232
- - in_progress_blocked: work in flight or stuck
233
- - key_decisions: choices made and WHY (crucial for future context)
234
- - next_steps: concrete, actionable items
235
- - memory_ids: link to related memories stored this session
236
-
237
- Retrievable via get_waypoint. Only one waypoint per project—new waypoints overwrite previous.`,
238
- inputSchema: {
239
- type: "object",
240
- properties: {
241
- project: { type: "string", description: "Project name." },
242
- branch: { type: "string", description: "Branch name (optional)." },
243
- summary: { type: "string", description: "2-3 sentences: primary goal, current status." },
244
- completed: {
245
- type: "array",
246
- items: { type: "string" },
247
- description: "Completed items (include file paths where relevant).",
248
- },
249
- in_progress_blocked: {
250
- type: "array",
251
- items: { type: "string" },
252
- description: "In progress or blocked items.",
253
- },
254
- key_decisions: {
255
- type: "array",
256
- items: { type: "string" },
257
- description: "Decisions made and why.",
258
- },
259
- next_steps: {
260
- type: "array",
261
- items: { type: "string" },
262
- description: "Concrete next steps.",
263
- },
264
- memory_ids: {
265
- type: "array",
266
- items: { type: "string" },
267
- description: "Memory IDs referenced by this waypoint.",
268
- },
269
- metadata: {
270
- type: "object",
271
- description: "Additional metadata.",
272
- additionalProperties: true,
273
- },
274
- },
275
- required: ["project", "summary"],
276
- },
277
- };
278
- export const getWaypointTool = {
279
- name: "get_waypoint",
280
- description: "Load the current project waypoint snapshot. Call at conversation start or when resuming a project.",
281
- inputSchema: {
282
- type: "object",
283
- properties: {},
284
- },
285
- };
286
- export const indexConversationsTool = {
287
- name: "index_conversations",
288
- description: `Scan session log directory for new or updated conversation sessions and index them as searchable history.
289
-
290
- Indexing is idempotent: sessions that haven't changed since last indexing are skipped.
291
- Requires conversation history indexing to be enabled in configuration (--enable-history).`,
292
- inputSchema: {
293
- type: "object",
294
- properties: {
295
- path: {
296
- type: "string",
297
- description: "Override session log directory path. Defaults to configured path or Claude Code's session directory.",
298
- },
299
- since: {
300
- type: "string",
301
- description: "Only index sessions modified after this ISO date. Example: '2026-03-01'",
302
- },
303
- },
304
- },
305
- };
306
- export const listIndexedSessionsTool = {
307
- name: "list_indexed_sessions",
308
- description: "Browse indexed conversation sessions with timestamps and chunk counts.",
309
- inputSchema: {
310
- type: "object",
311
- properties: {
312
- limit: {
313
- type: "integer",
314
- description: "Maximum sessions to return (default: 20).",
315
- default: 20,
316
- },
317
- offset: {
318
- type: "integer",
319
- description: "Number of sessions to skip for pagination (default: 0).",
320
- default: 0,
321
- },
322
- },
323
- },
324
- };
325
- export const reindexSessionTool = {
326
- name: "reindex_session",
327
- description: "Force reindex of a specific conversation session. Useful if the session was updated or indexing failed previously.",
328
- inputSchema: {
329
- type: "object",
330
- properties: {
331
- session_id: {
332
- type: "string",
333
- description: "The session ID to reindex.",
334
- },
335
- },
336
- required: ["session_id"],
337
- },
338
- };
339
- export const tools = [
340
- storeMemoriesTool,
341
- updateMemoriesTool,
342
- deleteMemoriesTool,
343
- searchMemoriesTool,
344
- getMemoriesTool,
345
- reportMemoryUsefulnessTool,
346
- setWaypointTool,
347
- getWaypointTool,
348
- indexConversationsTool,
349
- listIndexedSessionsTool,
350
- reindexSessionTool,
351
- ];
352
- //# sourceMappingURL=tools.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- import type { ConversationRepository } from "../db/conversation.repository.js";
2
- import type { ConversationChunk, ConversationHybridRow, HistoryFilters, IndexedSession, ParsedMessage } from "../types/conversation.js";
3
- import type { ConversationHistoryConfig } from "../config/index.js";
4
- import type { EmbeddingsService } from "./embeddings.service.js";
5
- import type { SessionLogParser } from "./parsers/types.js";
6
- /**
7
- * Group parsed messages into embeddable chunks.
8
- */
9
- export declare function chunkMessages(messages: ParsedMessage[], maxChunkMessages: number, overlap: number): ConversationChunk[];
10
- export declare class ConversationHistoryService {
11
- private repository;
12
- private embeddings;
13
- readonly config: ConversationHistoryConfig;
14
- private dbPath;
15
- private parser;
16
- private indexStatePath;
17
- private indexStateCache;
18
- constructor(repository: ConversationRepository, embeddings: EmbeddingsService, config: ConversationHistoryConfig, dbPath: string, parser?: SessionLogParser);
19
- private loadIndexState;
20
- private saveIndexState;
21
- indexConversations(path?: string, since?: Date): Promise<{
22
- indexed: number;
23
- skipped: number;
24
- errors: string[];
25
- }>;
26
- private indexSession;
27
- reindexSession(sessionId: string): Promise<{
28
- success: boolean;
29
- chunkCount: number;
30
- error?: string;
31
- }>;
32
- listIndexedSessions(limit?: number, offset?: number): Promise<{
33
- sessions: IndexedSession[];
34
- total: number;
35
- }>;
36
- searchHistory(query: string, embedding: number[], limit: number, filters?: HistoryFilters): Promise<ConversationHybridRow[]>;
37
- }
38
- //# sourceMappingURL=conversation.service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation.service.d.ts","sourceRoot":"","sources":["../../../src/services/conversation.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,aAAa,EAEd,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAiB3D;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,aAAa,EAAE,EACzB,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,MAAM,GACd,iBAAiB,EAAE,CA0DrB;AAeD,qBAAa,0BAA0B;IAKnC,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,UAAU;aACF,MAAM,EAAE,yBAAyB;IACjD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IARhB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,eAAe,CAA4C;gBAGzD,UAAU,EAAE,sBAAsB,EAClC,UAAU,EAAE,iBAAiB,EACrB,MAAM,EAAE,yBAAyB,EACzC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,gBAAgD;YAQpD,cAAc;YA4Bd,cAAc;IAiBtB,kBAAkB,CACtB,IAAI,CAAC,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,IAAI,GACX,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;YAkDpD,YAAY;IAoEpB,cAAc,CAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAkC9D,mBAAmB,CACvB,KAAK,GAAE,MAAW,EAClB,MAAM,GAAE,MAAU,GACjB,OAAO,CAAC;QAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAWnD,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,qBAAqB,EAAE,CAAC;CAGpC"}
@@ -1,252 +0,0 @@
1
- import { createHash } from "crypto";
2
- import { readFile, writeFile, mkdir } from "fs/promises";
3
- import { dirname, join } from "path";
4
- import { resolveSessionLogPath } from "../config/index.js";
5
- import { ClaudeCodeSessionParser } from "./parsers/claude-code.parser.js";
6
- /**
7
- * Generate a deterministic chunk ID from session ID and message indices.
8
- */
9
- function chunkId(sessionId, startIdx, endIdx) {
10
- return createHash("sha256")
11
- .update(`${sessionId}:${startIdx}:${endIdx}`)
12
- .digest("hex")
13
- .slice(0, 32);
14
- }
15
- /**
16
- * Group parsed messages into embeddable chunks.
17
- */
18
- export function chunkMessages(messages, maxChunkMessages, overlap) {
19
- if (messages.length === 0)
20
- return [];
21
- const chunks = [];
22
- let startIdx = 0;
23
- while (startIdx < messages.length) {
24
- const endIdx = Math.min(startIdx + maxChunkMessages, messages.length);
25
- const chunkMsgs = messages.slice(startIdx, endIdx);
26
- const firstRole = chunkMsgs[0].role;
27
- const role = chunkMsgs.every((m) => m.role === firstRole)
28
- ? firstRole
29
- : "mixed";
30
- const content = chunkMsgs
31
- .map((m) => `[${m.role} @ ${m.timestamp.toISOString()}]: ${m.content}`)
32
- .join("\n\n");
33
- const firstMsg = chunkMsgs[0];
34
- const lastMsg = chunkMsgs[chunkMsgs.length - 1];
35
- chunks.push({
36
- id: chunkId(firstMsg.sessionId, firstMsg.messageIndex, lastMsg.messageIndex),
37
- content,
38
- sessionId: firstMsg.sessionId,
39
- timestamp: firstMsg.timestamp,
40
- endTimestamp: lastMsg.timestamp,
41
- role,
42
- messageIndexStart: firstMsg.messageIndex,
43
- messageIndexEnd: lastMsg.messageIndex,
44
- project: firstMsg.project,
45
- metadata: {
46
- session_id: firstMsg.sessionId,
47
- timestamp: firstMsg.timestamp.toISOString(),
48
- role,
49
- message_index_start: firstMsg.messageIndex,
50
- message_index_end: lastMsg.messageIndex,
51
- project: firstMsg.project,
52
- git_branch: firstMsg.gitBranch,
53
- is_subagent: firstMsg.isSubagent,
54
- agent_id: firstMsg.agentId,
55
- },
56
- });
57
- // Advance by (chunkSize - overlap), but always advance at least 1
58
- const advance = Math.max(1, endIdx - startIdx - overlap);
59
- startIdx += advance;
60
- }
61
- return chunks;
62
- }
63
- export class ConversationHistoryService {
64
- repository;
65
- embeddings;
66
- config;
67
- dbPath;
68
- parser;
69
- indexStatePath;
70
- indexStateCache = null;
71
- constructor(repository, embeddings, config, dbPath, parser = new ClaudeCodeSessionParser()) {
72
- this.repository = repository;
73
- this.embeddings = embeddings;
74
- this.config = config;
75
- this.dbPath = dbPath;
76
- this.parser = parser;
77
- this.indexStatePath = join(dirname(dbPath), "conversation_index_state.json");
78
- }
79
- async loadIndexState() {
80
- if (this.indexStateCache)
81
- return this.indexStateCache;
82
- try {
83
- const raw = await readFile(this.indexStatePath, "utf-8");
84
- const entries = JSON.parse(raw);
85
- const map = new Map();
86
- for (const e of entries) {
87
- map.set(e.sessionId, {
88
- sessionId: e.sessionId,
89
- filePath: e.filePath,
90
- project: e.project,
91
- lastModified: e.lastModified,
92
- chunkCount: e.chunkCount,
93
- messageCount: e.messageCount,
94
- indexedAt: new Date(e.indexedAt),
95
- firstMessageAt: new Date(e.firstMessageAt),
96
- lastMessageAt: new Date(e.lastMessageAt),
97
- });
98
- }
99
- this.indexStateCache = map;
100
- return map;
101
- }
102
- catch {
103
- const map = new Map();
104
- this.indexStateCache = map;
105
- return map;
106
- }
107
- }
108
- async saveIndexState(state) {
109
- const entries = [...state.values()].map((s) => ({
110
- sessionId: s.sessionId,
111
- filePath: s.filePath,
112
- project: s.project,
113
- lastModified: s.lastModified,
114
- chunkCount: s.chunkCount,
115
- messageCount: s.messageCount,
116
- indexedAt: s.indexedAt.toISOString(),
117
- firstMessageAt: s.firstMessageAt.toISOString(),
118
- lastMessageAt: s.lastMessageAt.toISOString(),
119
- }));
120
- await mkdir(dirname(this.indexStatePath), { recursive: true });
121
- await writeFile(this.indexStatePath, JSON.stringify(entries, null, 2));
122
- this.indexStateCache = state;
123
- }
124
- async indexConversations(path, since) {
125
- if (!this.config.enabled) {
126
- return {
127
- indexed: 0,
128
- skipped: 0,
129
- errors: ["Conversation history indexing is not enabled"],
130
- };
131
- }
132
- const logPath = path ?? resolveSessionLogPath(this.config);
133
- if (!logPath) {
134
- return {
135
- indexed: 0,
136
- skipped: 0,
137
- errors: ["No session log path configured or detected"],
138
- };
139
- }
140
- const sessionFiles = await this.parser.findSessionFiles(logPath, since, this.config.indexSubagents);
141
- const indexState = await this.loadIndexState();
142
- let indexed = 0;
143
- let skipped = 0;
144
- const errors = [];
145
- for (const file of sessionFiles) {
146
- const existing = indexState.get(file.sessionId);
147
- if (existing && existing.lastModified >= file.lastModified.getTime()) {
148
- skipped++;
149
- continue;
150
- }
151
- try {
152
- await this.indexSession(file, indexState);
153
- indexed++;
154
- }
155
- catch (err) {
156
- errors.push(`${file.sessionId}: ${err instanceof Error ? err.message : String(err)}`);
157
- }
158
- }
159
- await this.saveIndexState(indexState);
160
- return { indexed, skipped, errors };
161
- }
162
- async indexSession(file, indexState) {
163
- const messages = await this.parser.parse(file.filePath, this.config.indexSubagents);
164
- if (messages.length === 0) {
165
- // Still track it so we don't re-attempt
166
- indexState.set(file.sessionId, {
167
- sessionId: file.sessionId,
168
- filePath: file.filePath,
169
- project: file.project,
170
- lastModified: file.lastModified.getTime(),
171
- chunkCount: 0,
172
- messageCount: 0,
173
- indexedAt: new Date(),
174
- firstMessageAt: file.lastModified,
175
- lastMessageAt: file.lastModified,
176
- });
177
- return;
178
- }
179
- const chunks = chunkMessages(messages, this.config.maxChunkMessages, this.config.chunkOverlap);
180
- // Delete existing chunks for re-indexing
181
- await this.repository.deleteBySessionId(file.sessionId);
182
- // Embed all chunks
183
- const embeddings = await this.embeddings.embedBatch(chunks.map((c) => c.content));
184
- // Insert all chunks
185
- const rows = chunks.map((chunk, i) => ({
186
- id: chunk.id,
187
- vector: embeddings[i],
188
- content: chunk.content,
189
- metadata: JSON.stringify(chunk.metadata),
190
- created_at: chunk.timestamp.getTime(),
191
- session_id: chunk.sessionId,
192
- role: chunk.role,
193
- message_index_start: chunk.messageIndexStart,
194
- message_index_end: chunk.messageIndexEnd,
195
- project: chunk.project,
196
- }));
197
- await this.repository.insertBatch(rows);
198
- // Update index state
199
- indexState.set(file.sessionId, {
200
- sessionId: file.sessionId,
201
- filePath: file.filePath,
202
- project: file.project,
203
- lastModified: file.lastModified.getTime(),
204
- chunkCount: chunks.length,
205
- messageCount: messages.length,
206
- indexedAt: new Date(),
207
- firstMessageAt: messages[0].timestamp,
208
- lastMessageAt: messages[messages.length - 1].timestamp,
209
- });
210
- }
211
- async reindexSession(sessionId) {
212
- if (!this.config.enabled) {
213
- return {
214
- success: false,
215
- chunkCount: 0,
216
- error: "Conversation history indexing is not enabled",
217
- };
218
- }
219
- const indexState = await this.loadIndexState();
220
- const existing = indexState.get(sessionId);
221
- if (!existing) {
222
- return {
223
- success: false,
224
- chunkCount: 0,
225
- error: "Session not found in index state",
226
- };
227
- }
228
- // Construct session info for re-indexing
229
- const file = {
230
- filePath: existing.filePath,
231
- sessionId,
232
- project: existing.project,
233
- lastModified: new Date(),
234
- };
235
- await this.indexSession(file, indexState);
236
- await this.saveIndexState(indexState);
237
- const updated = indexState.get(sessionId);
238
- return { success: true, chunkCount: updated.chunkCount };
239
- }
240
- async listIndexedSessions(limit = 20, offset = 0) {
241
- const indexState = await this.loadIndexState();
242
- const sessions = [...indexState.values()].sort((a, b) => b.indexedAt.getTime() - a.indexedAt.getTime());
243
- return {
244
- sessions: sessions.slice(offset, offset + limit),
245
- total: sessions.length,
246
- };
247
- }
248
- async searchHistory(query, embedding, limit, filters) {
249
- return this.repository.findHybrid(embedding, query, limit, filters);
250
- }
251
- }
252
- //# sourceMappingURL=conversation.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation.service.js","sourceRoot":"","sources":["../../../src/services/conversation.service.ts"],"names":[],"mappings":"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"}