claude-conversation-memory-mcp 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 (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +223 -0
  3. package/dist/ConversationMemory.d.ts +80 -0
  4. package/dist/ConversationMemory.d.ts.map +1 -0
  5. package/dist/ConversationMemory.js +203 -0
  6. package/dist/ConversationMemory.js.map +1 -0
  7. package/dist/documentation/CodeAnalyzer.d.ts +29 -0
  8. package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
  9. package/dist/documentation/CodeAnalyzer.js +122 -0
  10. package/dist/documentation/CodeAnalyzer.js.map +1 -0
  11. package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
  12. package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
  13. package/dist/documentation/ConversationAnalyzer.js +156 -0
  14. package/dist/documentation/ConversationAnalyzer.js.map +1 -0
  15. package/dist/documentation/CrossReferencer.d.ts +67 -0
  16. package/dist/documentation/CrossReferencer.d.ts.map +1 -0
  17. package/dist/documentation/CrossReferencer.js +247 -0
  18. package/dist/documentation/CrossReferencer.js.map +1 -0
  19. package/dist/documentation/DocumentationGenerator.d.ts +22 -0
  20. package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
  21. package/dist/documentation/DocumentationGenerator.js +57 -0
  22. package/dist/documentation/DocumentationGenerator.js.map +1 -0
  23. package/dist/documentation/MarkdownFormatter.d.ts +26 -0
  24. package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
  25. package/dist/documentation/MarkdownFormatter.js +301 -0
  26. package/dist/documentation/MarkdownFormatter.js.map +1 -0
  27. package/dist/documentation/types.d.ts +176 -0
  28. package/dist/documentation/types.d.ts.map +1 -0
  29. package/dist/documentation/types.js +5 -0
  30. package/dist/documentation/types.js.map +1 -0
  31. package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
  32. package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
  33. package/dist/embeddings/EmbeddingConfig.js +132 -0
  34. package/dist/embeddings/EmbeddingConfig.js.map +1 -0
  35. package/dist/embeddings/EmbeddingGenerator.d.ts +45 -0
  36. package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
  37. package/dist/embeddings/EmbeddingGenerator.js +129 -0
  38. package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
  39. package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
  40. package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
  41. package/dist/embeddings/EmbeddingProvider.js +6 -0
  42. package/dist/embeddings/EmbeddingProvider.js.map +1 -0
  43. package/dist/embeddings/VectorStore.d.ts +75 -0
  44. package/dist/embeddings/VectorStore.d.ts.map +1 -0
  45. package/dist/embeddings/VectorStore.js +220 -0
  46. package/dist/embeddings/VectorStore.js.map +1 -0
  47. package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
  48. package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
  49. package/dist/embeddings/providers/OllamaEmbeddings.js +132 -0
  50. package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
  51. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
  52. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
  53. package/dist/embeddings/providers/OpenAIEmbeddings.js +128 -0
  54. package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
  55. package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
  56. package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
  57. package/dist/embeddings/providers/TransformersEmbeddings.js +114 -0
  58. package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
  59. package/dist/index.d.ts +7 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +127 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/parsers/ConversationParser.d.ts +138 -0
  64. package/dist/parsers/ConversationParser.d.ts.map +1 -0
  65. package/dist/parsers/ConversationParser.js +325 -0
  66. package/dist/parsers/ConversationParser.js.map +1 -0
  67. package/dist/parsers/DecisionExtractor.d.ts +76 -0
  68. package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
  69. package/dist/parsers/DecisionExtractor.js +305 -0
  70. package/dist/parsers/DecisionExtractor.js.map +1 -0
  71. package/dist/parsers/GitIntegrator.d.ts +71 -0
  72. package/dist/parsers/GitIntegrator.d.ts.map +1 -0
  73. package/dist/parsers/GitIntegrator.js +283 -0
  74. package/dist/parsers/GitIntegrator.js.map +1 -0
  75. package/dist/parsers/MistakeExtractor.d.ts +86 -0
  76. package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
  77. package/dist/parsers/MistakeExtractor.js +341 -0
  78. package/dist/parsers/MistakeExtractor.js.map +1 -0
  79. package/dist/parsers/RequirementsExtractor.d.ts +70 -0
  80. package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
  81. package/dist/parsers/RequirementsExtractor.js +252 -0
  82. package/dist/parsers/RequirementsExtractor.js.map +1 -0
  83. package/dist/search/SemanticSearch.d.ts +90 -0
  84. package/dist/search/SemanticSearch.d.ts.map +1 -0
  85. package/dist/search/SemanticSearch.js +352 -0
  86. package/dist/search/SemanticSearch.js.map +1 -0
  87. package/dist/storage/ConversationStorage.d.ts +53 -0
  88. package/dist/storage/ConversationStorage.d.ts.map +1 -0
  89. package/dist/storage/ConversationStorage.js +249 -0
  90. package/dist/storage/ConversationStorage.js.map +1 -0
  91. package/dist/storage/SQLiteManager.d.ts +88 -0
  92. package/dist/storage/SQLiteManager.d.ts.map +1 -0
  93. package/dist/storage/SQLiteManager.js +281 -0
  94. package/dist/storage/SQLiteManager.js.map +1 -0
  95. package/dist/storage/migrations.d.ts +54 -0
  96. package/dist/storage/migrations.d.ts.map +1 -0
  97. package/dist/storage/migrations.js +153 -0
  98. package/dist/storage/migrations.js.map +1 -0
  99. package/dist/storage/schema.sql +321 -0
  100. package/dist/tools/ToolDefinitions.d.ts +265 -0
  101. package/dist/tools/ToolDefinitions.d.ts.map +1 -0
  102. package/dist/tools/ToolDefinitions.js +261 -0
  103. package/dist/tools/ToolDefinitions.js.map +1 -0
  104. package/dist/tools/ToolHandlers.d.ts +56 -0
  105. package/dist/tools/ToolHandlers.d.ts.map +1 -0
  106. package/dist/tools/ToolHandlers.js +431 -0
  107. package/dist/tools/ToolHandlers.js.map +1 -0
  108. package/dist/types/ToolTypes.d.ts +333 -0
  109. package/dist/types/ToolTypes.d.ts.map +1 -0
  110. package/dist/types/ToolTypes.js +6 -0
  111. package/dist/types/ToolTypes.js.map +1 -0
  112. package/dist/utils/sanitization.d.ts +35 -0
  113. package/dist/utils/sanitization.d.ts.map +1 -0
  114. package/dist/utils/sanitization.js +97 -0
  115. package/dist/utils/sanitization.js.map +1 -0
  116. package/package.json +87 -0
package/dist/index.js ADDED
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Claude Conversation Memory - MCP Server
4
+ * Main entry point with stdio transport
5
+ */
6
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
7
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
8
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
9
+ import { ConversationMemory } from "./ConversationMemory.js";
10
+ import { ToolHandlers } from "./tools/ToolHandlers.js";
11
+ import { TOOLS } from "./tools/ToolDefinitions.js";
12
+ import { getSQLiteManager } from "./storage/SQLiteManager.js";
13
+ /**
14
+ * Main MCP Server
15
+ */
16
+ class ConversationMemoryServer {
17
+ server;
18
+ memory;
19
+ handlers;
20
+ constructor() {
21
+ this.server = new Server({
22
+ name: "claude-conversation-memory",
23
+ version: "0.1.0",
24
+ }, {
25
+ capabilities: {
26
+ tools: {},
27
+ },
28
+ });
29
+ this.memory = new ConversationMemory();
30
+ this.handlers = new ToolHandlers(this.memory, getSQLiteManager());
31
+ this.setupHandlers();
32
+ }
33
+ /**
34
+ * Setup MCP request handlers
35
+ */
36
+ setupHandlers() {
37
+ // List available tools
38
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
39
+ return {
40
+ tools: Object.values(TOOLS),
41
+ };
42
+ });
43
+ // Handle tool execution
44
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
45
+ const { name, arguments: args } = request.params;
46
+ try {
47
+ console.error(`[MCP] Executing tool: ${name}`);
48
+ let result;
49
+ switch (name) {
50
+ case "index_conversations":
51
+ result = await this.handlers.indexConversations(args);
52
+ break;
53
+ case "search_conversations":
54
+ result = await this.handlers.searchConversations(args);
55
+ break;
56
+ case "get_decisions":
57
+ result = await this.handlers.getDecisions(args);
58
+ break;
59
+ case "check_before_modify":
60
+ result = await this.handlers.checkBeforeModify(args);
61
+ break;
62
+ case "get_file_evolution":
63
+ result = await this.handlers.getFileEvolution(args);
64
+ break;
65
+ case "link_commits_to_conversations":
66
+ result = await this.handlers.linkCommitsToConversations(args);
67
+ break;
68
+ case "search_mistakes":
69
+ result = await this.handlers.searchMistakes(args);
70
+ break;
71
+ case "get_requirements":
72
+ result = await this.handlers.getRequirements(args);
73
+ break;
74
+ case "get_tool_history":
75
+ result = await this.handlers.getToolHistory(args);
76
+ break;
77
+ case "find_similar_sessions":
78
+ result = await this.handlers.findSimilarSessions(args);
79
+ break;
80
+ case "generate_documentation":
81
+ result = await this.handlers.generateDocumentation(args);
82
+ break;
83
+ default:
84
+ throw new Error(`Unknown tool: ${name}`);
85
+ }
86
+ return {
87
+ content: [
88
+ {
89
+ type: "text",
90
+ text: JSON.stringify(result, null, 2),
91
+ },
92
+ ],
93
+ };
94
+ }
95
+ catch (error) {
96
+ const err = error;
97
+ console.error(`[MCP] Error executing tool ${name}:`, err);
98
+ return {
99
+ content: [
100
+ {
101
+ type: "text",
102
+ text: `Error: ${err.message}\n\nStack: ${err.stack}`,
103
+ },
104
+ ],
105
+ isError: true,
106
+ };
107
+ }
108
+ });
109
+ }
110
+ /**
111
+ * Start the server
112
+ */
113
+ async start() {
114
+ const transport = new StdioServerTransport();
115
+ console.error("[MCP] Claude Conversation Memory Server starting...");
116
+ console.error(`[MCP] Database: ${getSQLiteManager().getStats().dbPath}`);
117
+ await this.server.connect(transport);
118
+ console.error("[MCP] Server ready - listening on stdio");
119
+ }
120
+ }
121
+ // Start the server
122
+ const server = new ConversationMemoryServer();
123
+ server.start().catch((error) => {
124
+ console.error("[MCP] Fatal error:", error);
125
+ process.exit(1);
126
+ });
127
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Multi-pass JSONL Conversation Parser
3
+ * Parses Claude Code conversation history from ~/.claude/projects
4
+ */
5
+ export interface ConversationMessage {
6
+ type: string;
7
+ uuid?: string;
8
+ parentUuid?: string | null;
9
+ sessionId?: string;
10
+ timestamp?: string;
11
+ isSidechain?: boolean;
12
+ agentId?: string;
13
+ userType?: string;
14
+ cwd?: string;
15
+ version?: string;
16
+ gitBranch?: string;
17
+ message?: unknown;
18
+ requestId?: string;
19
+ messageId?: string;
20
+ snapshot?: unknown;
21
+ summary?: string;
22
+ leafUuid?: string;
23
+ subtype?: string;
24
+ level?: string;
25
+ content?: string | unknown[];
26
+ error?: unknown;
27
+ toolUseResult?: unknown;
28
+ [key: string]: unknown;
29
+ }
30
+ export interface Conversation {
31
+ id: string;
32
+ project_path: string;
33
+ first_message_at: number;
34
+ last_message_at: number;
35
+ message_count: number;
36
+ git_branch?: string;
37
+ claude_version?: string;
38
+ metadata: Record<string, unknown>;
39
+ created_at: number;
40
+ updated_at: number;
41
+ }
42
+ export interface Message {
43
+ id: string;
44
+ conversation_id: string;
45
+ parent_id?: string;
46
+ message_type: string;
47
+ role?: string;
48
+ content?: string;
49
+ timestamp: number;
50
+ is_sidechain: boolean;
51
+ agent_id?: string;
52
+ request_id?: string;
53
+ git_branch?: string;
54
+ cwd?: string;
55
+ metadata: Record<string, unknown>;
56
+ }
57
+ export interface ToolUse {
58
+ id: string;
59
+ message_id: string;
60
+ tool_name: string;
61
+ tool_input: Record<string, unknown>;
62
+ timestamp: number;
63
+ }
64
+ export interface ToolResult {
65
+ id: string;
66
+ tool_use_id: string;
67
+ message_id: string;
68
+ content?: string;
69
+ is_error: boolean;
70
+ stdout?: string;
71
+ stderr?: string;
72
+ is_image: boolean;
73
+ timestamp: number;
74
+ }
75
+ export interface FileEdit {
76
+ id: string;
77
+ conversation_id: string;
78
+ file_path: string;
79
+ message_id: string;
80
+ backup_version?: number;
81
+ backup_time?: number;
82
+ snapshot_timestamp: number;
83
+ metadata: Record<string, unknown>;
84
+ }
85
+ export interface ThinkingBlock {
86
+ id: string;
87
+ message_id: string;
88
+ thinking_content: string;
89
+ signature?: string;
90
+ timestamp: number;
91
+ }
92
+ export interface ParseResult {
93
+ conversations: Conversation[];
94
+ messages: Message[];
95
+ tool_uses: ToolUse[];
96
+ tool_results: ToolResult[];
97
+ file_edits: FileEdit[];
98
+ thinking_blocks: ThinkingBlock[];
99
+ }
100
+ export declare class ConversationParser {
101
+ /**
102
+ * Parse all conversations for a project
103
+ */
104
+ parseProject(projectPath: string, sessionId?: string): ParseResult;
105
+ /**
106
+ * Parse a single .jsonl file
107
+ */
108
+ private parseFile;
109
+ /**
110
+ * Pass 1: Extract conversation metadata
111
+ */
112
+ private extractConversation;
113
+ /**
114
+ * Detect MCP tool usage in conversation messages
115
+ */
116
+ private detectMcpUsage;
117
+ /**
118
+ * Pass 2: Extract individual messages
119
+ */
120
+ private extractMessages;
121
+ /**
122
+ * Pass 3: Extract tool uses and results
123
+ */
124
+ private extractToolCalls;
125
+ /**
126
+ * Pass 4: Extract file edits from snapshots
127
+ */
128
+ private extractFileEdits;
129
+ /**
130
+ * Pass 5: Extract thinking blocks
131
+ */
132
+ private extractThinkingBlocks;
133
+ /**
134
+ * Extract text content from message
135
+ */
136
+ private extractContent;
137
+ }
138
+ //# sourceMappingURL=ConversationParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationParser.d.ts","sourceRoot":"","sources":["../../src/parsers/ConversationParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,325 @@
1
+ /**
2
+ * Multi-pass JSONL Conversation Parser
3
+ * Parses Claude Code conversation history from ~/.claude/projects
4
+ */
5
+ import { readFileSync, readdirSync } from "fs";
6
+ import { join } from "path";
7
+ import { nanoid } from "nanoid";
8
+ import { pathToProjectFolderName } from "../utils/sanitization.js";
9
+ export class ConversationParser {
10
+ /**
11
+ * Parse all conversations for a project
12
+ */
13
+ parseProject(projectPath, sessionId) {
14
+ console.log(`Parsing conversations for project: ${projectPath}`);
15
+ if (sessionId) {
16
+ console.log(`Filtering for session: ${sessionId}`);
17
+ }
18
+ // Convert project path to Claude projects directory name
19
+ const projectDirName = pathToProjectFolderName(projectPath);
20
+ const conversationDir = join(process.env.HOME || process.env.USERPROFILE || "", ".claude", "projects", projectDirName);
21
+ console.log(`Looking in: ${conversationDir}`);
22
+ // Read all .jsonl files, optionally filtering by session_id
23
+ let files = readdirSync(conversationDir).filter((f) => f.endsWith(".jsonl"));
24
+ // If session_id provided, filter to only that session file
25
+ if (sessionId) {
26
+ files = files.filter((f) => f === `${sessionId}.jsonl`);
27
+ if (files.length === 0) {
28
+ console.warn(`⚠️ Session file not found: ${sessionId}.jsonl`);
29
+ console.warn(`Available sessions: ${readdirSync(conversationDir).filter((f) => f.endsWith(".jsonl")).join(", ")}`);
30
+ }
31
+ }
32
+ console.log(`Found ${files.length} conversation file(s) to parse`);
33
+ // Parse each file
34
+ const result = {
35
+ conversations: [],
36
+ messages: [],
37
+ tool_uses: [],
38
+ tool_results: [],
39
+ file_edits: [],
40
+ thinking_blocks: [],
41
+ };
42
+ for (const file of files) {
43
+ const filePath = join(conversationDir, file);
44
+ this.parseFile(filePath, result, projectPath);
45
+ }
46
+ console.log(`Parsed ${result.conversations.length} conversations, ${result.messages.length} messages`);
47
+ return result;
48
+ }
49
+ /**
50
+ * Parse a single .jsonl file
51
+ */
52
+ parseFile(filePath, result, projectPath) {
53
+ const content = readFileSync(filePath, "utf-8");
54
+ const lines = content.split("\n").filter((l) => l.trim());
55
+ // Parse messages from this file
56
+ const fileMessages = [];
57
+ for (const line of lines) {
58
+ try {
59
+ const msg = JSON.parse(line);
60
+ fileMessages.push(msg);
61
+ }
62
+ catch (error) {
63
+ console.error(`Error parsing line in ${filePath}:`, error);
64
+ }
65
+ }
66
+ if (fileMessages.length === 0) {
67
+ return;
68
+ }
69
+ // Pass 1: Extract conversation info
70
+ this.extractConversation(fileMessages, result, projectPath);
71
+ // Pass 2: Extract messages
72
+ this.extractMessages(fileMessages, result);
73
+ // Pass 3: Extract tool uses and results
74
+ this.extractToolCalls(fileMessages, result);
75
+ // Pass 4: Extract file edits
76
+ this.extractFileEdits(fileMessages, result);
77
+ // Pass 5: Extract thinking blocks
78
+ this.extractThinkingBlocks(fileMessages, result);
79
+ }
80
+ /**
81
+ * Pass 1: Extract conversation metadata
82
+ */
83
+ extractConversation(messages, result, projectPath) {
84
+ // Get sessionId from first message
85
+ const firstMsg = messages.find((m) => m.sessionId);
86
+ if (!firstMsg || !firstMsg.sessionId) {
87
+ return;
88
+ }
89
+ const sessionId = firstMsg.sessionId;
90
+ // Check if conversation already exists
91
+ if (result.conversations.some((c) => c.id === sessionId)) {
92
+ return;
93
+ }
94
+ // Find timestamps
95
+ const timestamps = messages
96
+ .filter((m) => !!m.timestamp)
97
+ .map((m) => new Date(m.timestamp).getTime())
98
+ .sort((a, b) => a - b);
99
+ if (timestamps.length === 0) {
100
+ return;
101
+ }
102
+ // Get most common git branch and version
103
+ const branches = messages
104
+ .filter((m) => !!m.gitBranch)
105
+ .map((m) => m.gitBranch);
106
+ const versions = messages
107
+ .filter((m) => !!m.version)
108
+ .map((m) => m.version);
109
+ // Detect MCP tool usage
110
+ const mcpUsage = this.detectMcpUsage(messages);
111
+ const conversation = {
112
+ id: sessionId,
113
+ project_path: projectPath,
114
+ first_message_at: timestamps[0],
115
+ last_message_at: timestamps[timestamps.length - 1],
116
+ message_count: messages.filter((m) => m.type === "user" || m.type === "assistant").length,
117
+ git_branch: branches[branches.length - 1],
118
+ claude_version: versions[versions.length - 1],
119
+ metadata: {
120
+ total_messages: messages.length,
121
+ mcp_usage: mcpUsage,
122
+ },
123
+ created_at: timestamps[0],
124
+ updated_at: Date.now(),
125
+ };
126
+ result.conversations.push(conversation);
127
+ }
128
+ /**
129
+ * Detect MCP tool usage in conversation messages
130
+ */
131
+ detectMcpUsage(messages) {
132
+ const servers = new Set();
133
+ for (const msg of messages) {
134
+ const messageData = msg.message;
135
+ if (!messageData?.content || !Array.isArray(messageData.content)) {
136
+ continue;
137
+ }
138
+ for (const item of messageData.content) {
139
+ const contentItem = item;
140
+ if (contentItem.type === "tool_use" && contentItem.name?.startsWith("mcp__")) {
141
+ // Extract server name from tool name
142
+ // Format: mcp__server-name__tool-name
143
+ const parts = contentItem.name.split("__");
144
+ if (parts.length >= 2) {
145
+ servers.add(parts[1]);
146
+ }
147
+ }
148
+ }
149
+ }
150
+ return {
151
+ detected: servers.size > 0,
152
+ servers: Array.from(servers),
153
+ };
154
+ }
155
+ /**
156
+ * Pass 2: Extract individual messages
157
+ */
158
+ extractMessages(messages, result) {
159
+ for (const msg of messages) {
160
+ if (!msg.uuid || !msg.sessionId) {
161
+ continue;
162
+ }
163
+ const message = {
164
+ id: msg.uuid,
165
+ conversation_id: msg.sessionId,
166
+ parent_id: msg.parentUuid || undefined,
167
+ message_type: msg.type,
168
+ role: msg.message?.role,
169
+ content: this.extractContent(msg),
170
+ timestamp: msg.timestamp ? new Date(msg.timestamp).getTime() : Date.now(),
171
+ is_sidechain: msg.isSidechain || false,
172
+ agent_id: msg.agentId,
173
+ request_id: msg.requestId,
174
+ git_branch: msg.gitBranch,
175
+ cwd: msg.cwd,
176
+ metadata: msg,
177
+ };
178
+ result.messages.push(message);
179
+ }
180
+ }
181
+ /**
182
+ * Pass 3: Extract tool uses and results
183
+ */
184
+ extractToolCalls(messages, result) {
185
+ for (const msg of messages) {
186
+ const messageData = msg.message;
187
+ if (!messageData?.content || !Array.isArray(messageData.content) || !msg.uuid) {
188
+ continue;
189
+ }
190
+ const timestamp = msg.timestamp
191
+ ? new Date(msg.timestamp).getTime()
192
+ : Date.now();
193
+ for (const item of messageData.content) {
194
+ const contentItem = item;
195
+ // Tool use
196
+ if (contentItem.type === "tool_use") {
197
+ const toolUse = {
198
+ id: contentItem.id || "",
199
+ message_id: msg.uuid,
200
+ tool_name: contentItem.name || "",
201
+ tool_input: contentItem.input || {},
202
+ timestamp,
203
+ };
204
+ result.tool_uses.push(toolUse);
205
+ }
206
+ // Tool result
207
+ if (contentItem.type === "tool_result") {
208
+ const toolUseResult = msg.toolUseResult;
209
+ const toolResult = {
210
+ id: nanoid(),
211
+ tool_use_id: contentItem.tool_use_id || "",
212
+ message_id: msg.uuid,
213
+ content: typeof contentItem.content === "string" ? contentItem.content : JSON.stringify(contentItem.content),
214
+ is_error: contentItem.is_error || false,
215
+ stdout: toolUseResult?.stdout,
216
+ stderr: toolUseResult?.stderr,
217
+ is_image: toolUseResult?.isImage || false,
218
+ timestamp,
219
+ };
220
+ result.tool_results.push(toolResult);
221
+ }
222
+ }
223
+ }
224
+ }
225
+ /**
226
+ * Pass 4: Extract file edits from snapshots
227
+ */
228
+ extractFileEdits(messages, result) {
229
+ // Build a Set of stored message IDs for quick lookup
230
+ const storedMessageIds = new Set(result.messages.map(m => m.id));
231
+ for (const msg of messages) {
232
+ if (msg.type !== "file-history-snapshot" || !msg.snapshot) {
233
+ continue;
234
+ }
235
+ // Get the message ID that would reference this snapshot
236
+ const messageId = msg.messageId || msg.uuid;
237
+ if (!messageId) {
238
+ continue; // No message ID to reference
239
+ }
240
+ // Skip if the message wasn't stored (e.g., lacks uuid or sessionId)
241
+ if (!storedMessageIds.has(messageId)) {
242
+ // This is expected for file-history-snapshot messages that don't have uuid/sessionId
243
+ continue;
244
+ }
245
+ const snapshot = msg.snapshot;
246
+ const trackedFiles = snapshot.trackedFileBackups || {};
247
+ const conversationId = msg.sessionId;
248
+ if (!conversationId) {
249
+ continue; // Need conversation ID for foreign key
250
+ }
251
+ for (const [filePath, fileInfo] of Object.entries(trackedFiles)) {
252
+ const info = fileInfo;
253
+ const fileEdit = {
254
+ id: nanoid(),
255
+ conversation_id: conversationId,
256
+ file_path: filePath,
257
+ message_id: messageId,
258
+ backup_version: info.version,
259
+ backup_time: info.backupTime
260
+ ? new Date(info.backupTime).getTime()
261
+ : undefined,
262
+ snapshot_timestamp: snapshot.timestamp
263
+ ? new Date(snapshot.timestamp).getTime()
264
+ : Date.now(),
265
+ metadata: info,
266
+ };
267
+ result.file_edits.push(fileEdit);
268
+ }
269
+ }
270
+ }
271
+ /**
272
+ * Pass 5: Extract thinking blocks
273
+ */
274
+ extractThinkingBlocks(messages, result) {
275
+ for (const msg of messages) {
276
+ const messageData = msg.message;
277
+ if (!messageData?.content || !Array.isArray(messageData.content) || !msg.uuid) {
278
+ continue;
279
+ }
280
+ const timestamp = msg.timestamp
281
+ ? new Date(msg.timestamp).getTime()
282
+ : Date.now();
283
+ for (const item of messageData.content) {
284
+ const contentItem = item;
285
+ if (contentItem.type === "thinking") {
286
+ const thinking = {
287
+ id: nanoid(),
288
+ message_id: msg.uuid,
289
+ thinking_content: contentItem.thinking || "",
290
+ signature: contentItem.signature,
291
+ timestamp,
292
+ };
293
+ result.thinking_blocks.push(thinking);
294
+ }
295
+ }
296
+ }
297
+ }
298
+ /**
299
+ * Extract text content from message
300
+ */
301
+ extractContent(msg) {
302
+ // System messages
303
+ if (msg.type === "system" && typeof msg.content === "string") {
304
+ return msg.content;
305
+ }
306
+ // Summary messages
307
+ if (msg.type === "summary" && msg.summary) {
308
+ return msg.summary;
309
+ }
310
+ // User/Assistant messages
311
+ const messageData = msg.message;
312
+ if (messageData?.content) {
313
+ if (typeof messageData.content === "string") {
314
+ return messageData.content;
315
+ }
316
+ if (Array.isArray(messageData.content)) {
317
+ // Extract text blocks
318
+ const textBlocks = messageData.content.filter((item) => item.type === "text");
319
+ return textBlocks.map((item) => item.text || "").join("\n");
320
+ }
321
+ }
322
+ return undefined;
323
+ }
324
+ }
325
+ //# sourceMappingURL=ConversationParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationParser.js","sourceRoot":"","sources":["../../src/parsers/ConversationParser.ts"],"names":[],"mappings":"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"}