cccmemory 1.8.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 (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +349 -0
  3. package/dist/ConversationMemory.d.ts +231 -0
  4. package/dist/ConversationMemory.d.ts.map +1 -0
  5. package/dist/ConversationMemory.js +357 -0
  6. package/dist/ConversationMemory.js.map +1 -0
  7. package/dist/cache/QueryCache.d.ts +215 -0
  8. package/dist/cache/QueryCache.d.ts.map +1 -0
  9. package/dist/cache/QueryCache.js +294 -0
  10. package/dist/cache/QueryCache.js.map +1 -0
  11. package/dist/cli/commands.d.ts +9 -0
  12. package/dist/cli/commands.d.ts.map +1 -0
  13. package/dist/cli/commands.js +954 -0
  14. package/dist/cli/commands.js.map +1 -0
  15. package/dist/cli/help.d.ts +16 -0
  16. package/dist/cli/help.d.ts.map +1 -0
  17. package/dist/cli/help.js +361 -0
  18. package/dist/cli/help.js.map +1 -0
  19. package/dist/cli/index.d.ts +30 -0
  20. package/dist/cli/index.d.ts.map +1 -0
  21. package/dist/cli/index.js +111 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/context/ContextInjector.d.ts +38 -0
  24. package/dist/context/ContextInjector.d.ts.map +1 -0
  25. package/dist/context/ContextInjector.js +235 -0
  26. package/dist/context/ContextInjector.js.map +1 -0
  27. package/dist/documentation/CodeAnalyzer.d.ts +29 -0
  28. package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
  29. package/dist/documentation/CodeAnalyzer.js +122 -0
  30. package/dist/documentation/CodeAnalyzer.js.map +1 -0
  31. package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
  32. package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
  33. package/dist/documentation/ConversationAnalyzer.js +157 -0
  34. package/dist/documentation/ConversationAnalyzer.js.map +1 -0
  35. package/dist/documentation/CrossReferencer.d.ts +67 -0
  36. package/dist/documentation/CrossReferencer.d.ts.map +1 -0
  37. package/dist/documentation/CrossReferencer.js +247 -0
  38. package/dist/documentation/CrossReferencer.js.map +1 -0
  39. package/dist/documentation/DocumentationGenerator.d.ts +22 -0
  40. package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
  41. package/dist/documentation/DocumentationGenerator.js +57 -0
  42. package/dist/documentation/DocumentationGenerator.js.map +1 -0
  43. package/dist/documentation/MarkdownFormatter.d.ts +26 -0
  44. package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
  45. package/dist/documentation/MarkdownFormatter.js +301 -0
  46. package/dist/documentation/MarkdownFormatter.js.map +1 -0
  47. package/dist/documentation/types.d.ts +176 -0
  48. package/dist/documentation/types.d.ts.map +1 -0
  49. package/dist/documentation/types.js +5 -0
  50. package/dist/documentation/types.js.map +1 -0
  51. package/dist/embeddings/ConfigManager.d.ts +46 -0
  52. package/dist/embeddings/ConfigManager.d.ts.map +1 -0
  53. package/dist/embeddings/ConfigManager.js +177 -0
  54. package/dist/embeddings/ConfigManager.js.map +1 -0
  55. package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
  56. package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
  57. package/dist/embeddings/EmbeddingConfig.js +132 -0
  58. package/dist/embeddings/EmbeddingConfig.js.map +1 -0
  59. package/dist/embeddings/EmbeddingGenerator.d.ts +51 -0
  60. package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
  61. package/dist/embeddings/EmbeddingGenerator.js +157 -0
  62. package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
  63. package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
  64. package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
  65. package/dist/embeddings/EmbeddingProvider.js +6 -0
  66. package/dist/embeddings/EmbeddingProvider.js.map +1 -0
  67. package/dist/embeddings/ModelRegistry.d.ts +48 -0
  68. package/dist/embeddings/ModelRegistry.d.ts.map +1 -0
  69. package/dist/embeddings/ModelRegistry.js +170 -0
  70. package/dist/embeddings/ModelRegistry.js.map +1 -0
  71. package/dist/embeddings/VectorStore.d.ts +114 -0
  72. package/dist/embeddings/VectorStore.d.ts.map +1 -0
  73. package/dist/embeddings/VectorStore.js +393 -0
  74. package/dist/embeddings/VectorStore.js.map +1 -0
  75. package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
  76. package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
  77. package/dist/embeddings/providers/OllamaEmbeddings.js +125 -0
  78. package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
  79. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
  80. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
  81. package/dist/embeddings/providers/OpenAIEmbeddings.js +129 -0
  82. package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
  83. package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
  84. package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
  85. package/dist/embeddings/providers/TransformersEmbeddings.js +115 -0
  86. package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
  87. package/dist/handoff/SessionHandoffStore.d.ts +80 -0
  88. package/dist/handoff/SessionHandoffStore.d.ts.map +1 -0
  89. package/dist/handoff/SessionHandoffStore.js +314 -0
  90. package/dist/handoff/SessionHandoffStore.js.map +1 -0
  91. package/dist/index.d.ts +7 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +115 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/mcp-server.d.ts +27 -0
  96. package/dist/mcp-server.d.ts.map +1 -0
  97. package/dist/mcp-server.js +157 -0
  98. package/dist/mcp-server.js.map +1 -0
  99. package/dist/memory/WorkingMemoryStore.d.ts +83 -0
  100. package/dist/memory/WorkingMemoryStore.d.ts.map +1 -0
  101. package/dist/memory/WorkingMemoryStore.js +318 -0
  102. package/dist/memory/WorkingMemoryStore.js.map +1 -0
  103. package/dist/memory/types.d.ts +192 -0
  104. package/dist/memory/types.d.ts.map +1 -0
  105. package/dist/memory/types.js +8 -0
  106. package/dist/memory/types.js.map +1 -0
  107. package/dist/parsers/CodexConversationParser.d.ts +51 -0
  108. package/dist/parsers/CodexConversationParser.d.ts.map +1 -0
  109. package/dist/parsers/CodexConversationParser.js +301 -0
  110. package/dist/parsers/CodexConversationParser.js.map +1 -0
  111. package/dist/parsers/ConversationParser.d.ts +286 -0
  112. package/dist/parsers/ConversationParser.d.ts.map +1 -0
  113. package/dist/parsers/ConversationParser.js +795 -0
  114. package/dist/parsers/ConversationParser.js.map +1 -0
  115. package/dist/parsers/DecisionExtractor.d.ts +144 -0
  116. package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
  117. package/dist/parsers/DecisionExtractor.js +434 -0
  118. package/dist/parsers/DecisionExtractor.js.map +1 -0
  119. package/dist/parsers/GitIntegrator.d.ts +156 -0
  120. package/dist/parsers/GitIntegrator.d.ts.map +1 -0
  121. package/dist/parsers/GitIntegrator.js +348 -0
  122. package/dist/parsers/GitIntegrator.js.map +1 -0
  123. package/dist/parsers/MistakeExtractor.d.ts +151 -0
  124. package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
  125. package/dist/parsers/MistakeExtractor.js +460 -0
  126. package/dist/parsers/MistakeExtractor.js.map +1 -0
  127. package/dist/parsers/RequirementsExtractor.d.ts +166 -0
  128. package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
  129. package/dist/parsers/RequirementsExtractor.js +338 -0
  130. package/dist/parsers/RequirementsExtractor.js.map +1 -0
  131. package/dist/realtime/ConversationWatcher.d.ts +87 -0
  132. package/dist/realtime/ConversationWatcher.d.ts.map +1 -0
  133. package/dist/realtime/ConversationWatcher.js +204 -0
  134. package/dist/realtime/ConversationWatcher.js.map +1 -0
  135. package/dist/realtime/IncrementalParser.d.ts +83 -0
  136. package/dist/realtime/IncrementalParser.d.ts.map +1 -0
  137. package/dist/realtime/IncrementalParser.js +232 -0
  138. package/dist/realtime/IncrementalParser.js.map +1 -0
  139. package/dist/realtime/LiveExtractor.d.ts +72 -0
  140. package/dist/realtime/LiveExtractor.d.ts.map +1 -0
  141. package/dist/realtime/LiveExtractor.js +288 -0
  142. package/dist/realtime/LiveExtractor.js.map +1 -0
  143. package/dist/search/SemanticSearch.d.ts +121 -0
  144. package/dist/search/SemanticSearch.d.ts.map +1 -0
  145. package/dist/search/SemanticSearch.js +823 -0
  146. package/dist/search/SemanticSearch.js.map +1 -0
  147. package/dist/storage/BackupManager.d.ts +58 -0
  148. package/dist/storage/BackupManager.d.ts.map +1 -0
  149. package/dist/storage/BackupManager.js +223 -0
  150. package/dist/storage/BackupManager.js.map +1 -0
  151. package/dist/storage/ConversationStorage.d.ts +341 -0
  152. package/dist/storage/ConversationStorage.d.ts.map +1 -0
  153. package/dist/storage/ConversationStorage.js +792 -0
  154. package/dist/storage/ConversationStorage.js.map +1 -0
  155. package/dist/storage/DeletionService.d.ts +70 -0
  156. package/dist/storage/DeletionService.d.ts.map +1 -0
  157. package/dist/storage/DeletionService.js +253 -0
  158. package/dist/storage/DeletionService.js.map +1 -0
  159. package/dist/storage/GlobalIndex.d.ts +133 -0
  160. package/dist/storage/GlobalIndex.d.ts.map +1 -0
  161. package/dist/storage/GlobalIndex.js +310 -0
  162. package/dist/storage/GlobalIndex.js.map +1 -0
  163. package/dist/storage/SQLiteManager.d.ts +114 -0
  164. package/dist/storage/SQLiteManager.d.ts.map +1 -0
  165. package/dist/storage/SQLiteManager.js +636 -0
  166. package/dist/storage/SQLiteManager.js.map +1 -0
  167. package/dist/storage/migrations.d.ts +54 -0
  168. package/dist/storage/migrations.d.ts.map +1 -0
  169. package/dist/storage/migrations.js +285 -0
  170. package/dist/storage/migrations.js.map +1 -0
  171. package/dist/storage/schema.sql +436 -0
  172. package/dist/tools/ToolDefinitions.d.ts +946 -0
  173. package/dist/tools/ToolDefinitions.d.ts.map +1 -0
  174. package/dist/tools/ToolDefinitions.js +937 -0
  175. package/dist/tools/ToolDefinitions.js.map +1 -0
  176. package/dist/tools/ToolHandlers.d.ts +791 -0
  177. package/dist/tools/ToolHandlers.d.ts.map +1 -0
  178. package/dist/tools/ToolHandlers.js +3262 -0
  179. package/dist/tools/ToolHandlers.js.map +1 -0
  180. package/dist/types/ToolTypes.d.ts +824 -0
  181. package/dist/types/ToolTypes.d.ts.map +1 -0
  182. package/dist/types/ToolTypes.js +6 -0
  183. package/dist/types/ToolTypes.js.map +1 -0
  184. package/dist/utils/Logger.d.ts +70 -0
  185. package/dist/utils/Logger.d.ts.map +1 -0
  186. package/dist/utils/Logger.js +131 -0
  187. package/dist/utils/Logger.js.map +1 -0
  188. package/dist/utils/McpConfig.d.ts +54 -0
  189. package/dist/utils/McpConfig.d.ts.map +1 -0
  190. package/dist/utils/McpConfig.js +136 -0
  191. package/dist/utils/McpConfig.js.map +1 -0
  192. package/dist/utils/ProjectMigration.d.ts +82 -0
  193. package/dist/utils/ProjectMigration.d.ts.map +1 -0
  194. package/dist/utils/ProjectMigration.js +416 -0
  195. package/dist/utils/ProjectMigration.js.map +1 -0
  196. package/dist/utils/constants.d.ts +75 -0
  197. package/dist/utils/constants.d.ts.map +1 -0
  198. package/dist/utils/constants.js +105 -0
  199. package/dist/utils/constants.js.map +1 -0
  200. package/dist/utils/safeJson.d.ts +37 -0
  201. package/dist/utils/safeJson.d.ts.map +1 -0
  202. package/dist/utils/safeJson.js +48 -0
  203. package/dist/utils/safeJson.js.map +1 -0
  204. package/dist/utils/sanitization.d.ts +45 -0
  205. package/dist/utils/sanitization.d.ts.map +1 -0
  206. package/dist/utils/sanitization.js +153 -0
  207. package/dist/utils/sanitization.js.map +1 -0
  208. package/dist/utils/worktree.d.ts +15 -0
  209. package/dist/utils/worktree.d.ts.map +1 -0
  210. package/dist/utils/worktree.js +86 -0
  211. package/dist/utils/worktree.js.map +1 -0
  212. package/package.json +98 -0
  213. package/scripts/changelog-check.sh +62 -0
  214. package/scripts/check-node.js +17 -0
  215. package/scripts/dev-config.js +56 -0
  216. package/scripts/postinstall.js +117 -0
@@ -0,0 +1,314 @@
1
+ /**
2
+ * Session Handoff Store
3
+ *
4
+ * Manages session handoff documents for transferring context between
5
+ * conversations when context fills up or when explicitly requested.
6
+ */
7
+ import { nanoid } from "nanoid";
8
+ import { WorkingMemoryStore } from "../memory/WorkingMemoryStore.js";
9
+ export class SessionHandoffStore {
10
+ db;
11
+ constructor(db) {
12
+ this.db = db;
13
+ }
14
+ /**
15
+ * Prepare a handoff document from the current session
16
+ */
17
+ prepareHandoff(options) {
18
+ const { sessionId = "current", projectPath, include = ["decisions", "files", "tasks", "memory"], } = options;
19
+ const id = nanoid();
20
+ const now = Date.now();
21
+ // Collect data based on include options
22
+ const handoffData = {
23
+ decisions: [],
24
+ activeFiles: [],
25
+ pendingTasks: [],
26
+ workingMemory: [],
27
+ contextSummary: "",
28
+ };
29
+ // Get recent decisions from the database
30
+ if (include.includes("decisions")) {
31
+ handoffData.decisions = this.getRecentDecisions(projectPath, sessionId);
32
+ }
33
+ // Get recent file activity
34
+ if (include.includes("files")) {
35
+ handoffData.activeFiles = this.getActiveFiles(projectPath, sessionId);
36
+ }
37
+ // Get pending tasks (from working memory tagged as "task")
38
+ if (include.includes("tasks")) {
39
+ handoffData.pendingTasks = this.getPendingTasks(projectPath);
40
+ }
41
+ // Get working memory items
42
+ if (include.includes("memory")) {
43
+ const memoryStore = new WorkingMemoryStore(this.db);
44
+ handoffData.workingMemory = memoryStore.list(projectPath);
45
+ }
46
+ // Generate context summary
47
+ handoffData.contextSummary = this.generateContextSummary(handoffData);
48
+ // Store the handoff
49
+ this.db
50
+ .prepare(`INSERT INTO session_handoffs
51
+ (id, from_session_id, project_path, created_at, handoff_data, resumed_by_session_id, resumed_at)
52
+ VALUES (?, ?, ?, ?, ?, NULL, NULL)`)
53
+ .run(id, sessionId, projectPath, now, JSON.stringify(handoffData));
54
+ return {
55
+ id,
56
+ fromSessionId: sessionId,
57
+ projectPath,
58
+ createdAt: now,
59
+ ...handoffData,
60
+ };
61
+ }
62
+ /**
63
+ * Resume from a handoff in a new session
64
+ */
65
+ resumeFromHandoff(options) {
66
+ const { handoffId, projectPath, newSessionId, injectContext = true } = options;
67
+ let row;
68
+ if (handoffId) {
69
+ // Get specific handoff
70
+ row = this.db
71
+ .prepare("SELECT * FROM session_handoffs WHERE id = ?")
72
+ .get(handoffId);
73
+ }
74
+ else {
75
+ // Get most recent unresumed handoff for this project
76
+ row = this.db
77
+ .prepare(`SELECT * FROM session_handoffs
78
+ WHERE project_path = ? AND resumed_by_session_id IS NULL
79
+ ORDER BY created_at DESC
80
+ LIMIT 1`)
81
+ .get(projectPath);
82
+ }
83
+ if (!row) {
84
+ return null;
85
+ }
86
+ const handoffData = JSON.parse(row.handoff_data);
87
+ // Mark as resumed if newSessionId provided
88
+ if (newSessionId) {
89
+ this.db
90
+ .prepare(`UPDATE session_handoffs
91
+ SET resumed_by_session_id = ?, resumed_at = ?
92
+ WHERE id = ?`)
93
+ .run(newSessionId, Date.now(), row.id);
94
+ }
95
+ // Optionally inject working memory into new session
96
+ if (injectContext && handoffData.workingMemory.length > 0) {
97
+ const memoryStore = new WorkingMemoryStore(this.db);
98
+ for (const item of handoffData.workingMemory) {
99
+ // Re-remember each item in the new session
100
+ memoryStore.remember({
101
+ key: item.key,
102
+ value: item.value,
103
+ context: item.context,
104
+ tags: item.tags,
105
+ sessionId: newSessionId,
106
+ projectPath: item.projectPath,
107
+ });
108
+ }
109
+ }
110
+ return {
111
+ id: row.id,
112
+ fromSessionId: row.from_session_id,
113
+ projectPath: row.project_path,
114
+ createdAt: row.created_at,
115
+ ...handoffData,
116
+ resumedBy: row.resumed_by_session_id || newSessionId,
117
+ resumedAt: row.resumed_at || (newSessionId ? Date.now() : undefined),
118
+ };
119
+ }
120
+ /**
121
+ * List available handoffs for a project
122
+ */
123
+ listHandoffs(projectPath, options) {
124
+ const limit = options?.limit || 10;
125
+ const includeResumed = options?.includeResumed ?? false;
126
+ let sql = `SELECT * FROM session_handoffs WHERE project_path = ?`;
127
+ if (!includeResumed) {
128
+ sql += " AND resumed_by_session_id IS NULL";
129
+ }
130
+ sql += " ORDER BY created_at DESC LIMIT ?";
131
+ const rows = this.db.prepare(sql).all(projectPath, limit);
132
+ return rows.map((row) => {
133
+ const handoffData = JSON.parse(row.handoff_data);
134
+ return {
135
+ id: row.id,
136
+ fromSessionId: row.from_session_id,
137
+ createdAt: row.created_at,
138
+ resumedBy: row.resumed_by_session_id || undefined,
139
+ resumedAt: row.resumed_at || undefined,
140
+ summary: handoffData.contextSummary,
141
+ };
142
+ });
143
+ }
144
+ /**
145
+ * Get a specific handoff by ID
146
+ */
147
+ getHandoff(handoffId) {
148
+ const row = this.db
149
+ .prepare("SELECT * FROM session_handoffs WHERE id = ?")
150
+ .get(handoffId);
151
+ if (!row) {
152
+ return null;
153
+ }
154
+ const handoffData = JSON.parse(row.handoff_data);
155
+ return {
156
+ id: row.id,
157
+ fromSessionId: row.from_session_id,
158
+ projectPath: row.project_path,
159
+ createdAt: row.created_at,
160
+ ...handoffData,
161
+ resumedBy: row.resumed_by_session_id || undefined,
162
+ resumedAt: row.resumed_at || undefined,
163
+ };
164
+ }
165
+ /**
166
+ * Delete a handoff by ID
167
+ */
168
+ deleteHandoff(handoffId) {
169
+ const result = this.db
170
+ .prepare("DELETE FROM session_handoffs WHERE id = ?")
171
+ .run(handoffId);
172
+ return result.changes > 0;
173
+ }
174
+ /**
175
+ * Get recent decisions from the database
176
+ */
177
+ getRecentDecisions(projectPath, _sessionId) {
178
+ try {
179
+ // Query recent decisions from the decisions table
180
+ const rows = this.db
181
+ .prepare(`SELECT d.id, d.decision_text, d.rationale, d.context, d.timestamp
182
+ FROM decisions d
183
+ JOIN messages m ON d.message_id = m.id
184
+ JOIN conversations c ON m.conversation_id = c.id
185
+ WHERE c.project_path = ?
186
+ ORDER BY d.timestamp DESC
187
+ LIMIT 20`)
188
+ .all(projectPath);
189
+ return rows.map((row) => ({
190
+ id: row.id,
191
+ text: row.decision_text,
192
+ rationale: row.rationale || undefined,
193
+ context: row.context || undefined,
194
+ timestamp: row.timestamp,
195
+ }));
196
+ }
197
+ catch (_error) {
198
+ // Table may not exist yet
199
+ return [];
200
+ }
201
+ }
202
+ /**
203
+ * Get recent file activity from tool uses
204
+ */
205
+ getActiveFiles(projectPath, _sessionId) {
206
+ try {
207
+ // Query recent file operations from tool_uses table
208
+ const rows = this.db
209
+ .prepare(`SELECT tu.tool_name, tu.parameters, tu.timestamp
210
+ FROM tool_uses tu
211
+ JOIN messages m ON tu.message_id = m.id
212
+ JOIN conversations c ON m.conversation_id = c.id
213
+ WHERE c.project_path = ?
214
+ AND tu.tool_name IN ('Read', 'Edit', 'Write', 'Bash')
215
+ ORDER BY tu.timestamp DESC
216
+ LIMIT 50`)
217
+ .all(projectPath);
218
+ // Extract unique files from tool parameters
219
+ const fileMap = new Map();
220
+ for (const row of rows) {
221
+ try {
222
+ const params = JSON.parse(row.parameters || "{}");
223
+ let filePath;
224
+ let action = "read";
225
+ if (row.tool_name === "Read" && typeof params.file_path === "string") {
226
+ filePath = params.file_path;
227
+ action = "read";
228
+ }
229
+ else if (row.tool_name === "Edit" && typeof params.file_path === "string") {
230
+ filePath = params.file_path;
231
+ action = "edit";
232
+ }
233
+ else if (row.tool_name === "Write" && typeof params.file_path === "string") {
234
+ filePath = params.file_path;
235
+ action = "create";
236
+ }
237
+ if (filePath && !fileMap.has(filePath)) {
238
+ fileMap.set(filePath, {
239
+ path: filePath,
240
+ lastAction: action,
241
+ timestamp: row.timestamp,
242
+ });
243
+ }
244
+ }
245
+ catch (_e) {
246
+ // Skip malformed parameters
247
+ }
248
+ }
249
+ return Array.from(fileMap.values()).slice(0, 20);
250
+ }
251
+ catch (_error) {
252
+ // Table may not exist yet
253
+ return [];
254
+ }
255
+ }
256
+ /**
257
+ * Get pending tasks from working memory
258
+ */
259
+ getPendingTasks(projectPath) {
260
+ try {
261
+ const memoryStore = new WorkingMemoryStore(this.db);
262
+ const items = memoryStore.recallMany({
263
+ projectPath,
264
+ tags: ["task", "pending", "in_progress", "blocked"],
265
+ });
266
+ return items.map((item) => ({
267
+ description: item.value,
268
+ status: this.inferTaskStatus(item.tags),
269
+ context: item.context,
270
+ }));
271
+ }
272
+ catch (_error) {
273
+ return [];
274
+ }
275
+ }
276
+ /**
277
+ * Infer task status from tags
278
+ */
279
+ inferTaskStatus(tags) {
280
+ if (tags.includes("blocked")) {
281
+ return "blocked";
282
+ }
283
+ if (tags.includes("in_progress")) {
284
+ return "in_progress";
285
+ }
286
+ return "pending";
287
+ }
288
+ /**
289
+ * Generate a context summary from handoff data
290
+ */
291
+ generateContextSummary(data) {
292
+ const parts = [];
293
+ if (data.decisions.length > 0) {
294
+ parts.push(`${data.decisions.length} decision(s): ${data.decisions
295
+ .slice(0, 3)
296
+ .map((d) => d.text.substring(0, 50))
297
+ .join("; ")}`);
298
+ }
299
+ if (data.activeFiles.length > 0) {
300
+ parts.push(`${data.activeFiles.length} file(s) active: ${data.activeFiles
301
+ .slice(0, 3)
302
+ .map((f) => f.path.split("/").pop())
303
+ .join(", ")}`);
304
+ }
305
+ if (data.pendingTasks.length > 0) {
306
+ parts.push(`${data.pendingTasks.length} pending task(s)`);
307
+ }
308
+ if (data.workingMemory.length > 0) {
309
+ parts.push(`${data.workingMemory.length} memory item(s)`);
310
+ }
311
+ return parts.length > 0 ? parts.join(". ") + "." : "Empty handoff.";
312
+ }
313
+ }
314
+ //# sourceMappingURL=SessionHandoffStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionHandoffStore.js","sourceRoot":"","sources":["../../src/handoff/SessionHandoffStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CCCMemory - Main Entry Point
4
+ * Supports both MCP server mode and interactive CLI mode
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
package/dist/index.js ADDED
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CCCMemory - Main Entry Point
4
+ * Supports both MCP server mode and interactive CLI mode
5
+ */
6
+ import { readFileSync, existsSync } from "fs";
7
+ import { join, dirname } from "path";
8
+ import { fileURLToPath } from "url";
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = dirname(__filename);
11
+ /**
12
+ * Get version from package.json
13
+ */
14
+ function getVersion() {
15
+ try {
16
+ const packageJsonPath = join(__dirname, "..", "package.json");
17
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
18
+ return packageJson.version;
19
+ }
20
+ catch (_error) {
21
+ return "unknown";
22
+ }
23
+ }
24
+ function checkNodeAbi() {
25
+ const abiPath = join(__dirname, "..", ".node-abi.json");
26
+ if (!existsSync(abiPath)) {
27
+ return;
28
+ }
29
+ try {
30
+ const payload = JSON.parse(readFileSync(abiPath, "utf-8"));
31
+ const expectedModules = String(payload.modules || "");
32
+ const currentModules = String(process.versions.modules || "");
33
+ if (expectedModules && currentModules && expectedModules !== currentModules) {
34
+ console.error("❌ Native module ABI mismatch.");
35
+ console.error(` This install was built with ABI ${expectedModules} (Node ${payload.nodeVersion || "unknown"}).`);
36
+ console.error(` Current runtime ABI is ${currentModules} (Node ${process.versions.node}).`);
37
+ console.error(" Reinstall with your runtime Node version, or use npx/volta/asdf to pin Node.");
38
+ process.exit(1);
39
+ }
40
+ }
41
+ catch {
42
+ // If the file is unreadable, skip ABI checks to avoid blocking startup.
43
+ }
44
+ }
45
+ /**
46
+ * Detect mode based on arguments and environment
47
+ */
48
+ function detectMode() {
49
+ const args = process.argv.slice(2);
50
+ // If --version or -v flag is present, show version
51
+ if (args.includes("--version") || args.includes("-v")) {
52
+ return "version";
53
+ }
54
+ // If --server flag is present, run MCP server mode
55
+ if (args.includes("--server")) {
56
+ return "mcp";
57
+ }
58
+ // If command arguments are present (excluding --server), run single command mode
59
+ if (args.length > 0) {
60
+ return "single-command";
61
+ }
62
+ // If not a TTY (running via stdio), run MCP server mode
63
+ if (!process.stdin.isTTY) {
64
+ return "mcp";
65
+ }
66
+ // Otherwise, run interactive CLI mode
67
+ return "cli";
68
+ }
69
+ /**
70
+ * Main entry point
71
+ */
72
+ async function main() {
73
+ const mode = detectMode();
74
+ const args = process.argv.slice(2).filter((arg) => arg !== "--server");
75
+ if (mode !== "version") {
76
+ checkNodeAbi();
77
+ }
78
+ switch (mode) {
79
+ case "version": {
80
+ // Show version
81
+ console.log(`cccmemory v${getVersion()}`);
82
+ process.exit(0);
83
+ break;
84
+ }
85
+ case "mcp": {
86
+ // MCP Server Mode (for Claude Code CLI integration)
87
+ const { ConversationMemoryServer } = await import("./mcp-server.js");
88
+ const mcpServer = new ConversationMemoryServer();
89
+ await mcpServer.start();
90
+ break;
91
+ }
92
+ case "single-command": {
93
+ // Single Command Mode
94
+ const { ConversationMemoryCLI } = await import("./cli/index.js");
95
+ const singleCLI = new ConversationMemoryCLI();
96
+ await singleCLI.runSingleCommand(args.join(" "));
97
+ break;
98
+ }
99
+ case "cli":
100
+ default: {
101
+ // Interactive REPL Mode
102
+ const { ConversationMemoryCLI } = await import("./cli/index.js");
103
+ const repl = new ConversationMemoryCLI();
104
+ await repl.start();
105
+ break;
106
+ }
107
+ }
108
+ }
109
+ // Run main
110
+ main().catch((error) => {
111
+ const isDebug = process.env.LOG_LEVEL?.toUpperCase() === "DEBUG";
112
+ console.error("Fatal error:", isDebug ? error : error.message);
113
+ process.exit(1);
114
+ });
115
+ //# 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,27 @@
1
+ /**
2
+ * CCCMemory - MCP Server
3
+ * MCP server implementation with stdio transport
4
+ */
5
+ /**
6
+ * Main MCP Server
7
+ */
8
+ export declare class ConversationMemoryServer {
9
+ private server;
10
+ private memory;
11
+ private handlers;
12
+ constructor();
13
+ /**
14
+ * Get tool handler map for dynamic dispatch
15
+ * Using a map prevents switch/case drift and makes it easy to add new tools
16
+ */
17
+ private getToolHandlerMap;
18
+ /**
19
+ * Setup MCP request handlers
20
+ */
21
+ private setupHandlers;
22
+ /**
23
+ * Start the server
24
+ */
25
+ start(): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH;;GAEG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAe;;IAqB/B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAuCzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAmErB;;OAEG;IACG,KAAK;CAUZ"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * CCCMemory - MCP Server
3
+ * MCP server implementation with stdio transport
4
+ */
5
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
6
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
8
+ import { readFileSync } from "fs";
9
+ import { join, dirname } from "path";
10
+ import { fileURLToPath } from "url";
11
+ import { ConversationMemory } from "./ConversationMemory.js";
12
+ import { ToolHandlers } from "./tools/ToolHandlers.js";
13
+ import { TOOLS } from "./tools/ToolDefinitions.js";
14
+ import { getSQLiteManager } from "./storage/SQLiteManager.js";
15
+ // Read version from package.json
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = dirname(__filename);
18
+ const packageJsonPath = join(__dirname, "..", "package.json");
19
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
20
+ const VERSION = packageJson.version;
21
+ /**
22
+ * Main MCP Server
23
+ */
24
+ export class ConversationMemoryServer {
25
+ server;
26
+ memory;
27
+ handlers;
28
+ constructor() {
29
+ this.server = new Server({
30
+ name: "cccmemory",
31
+ version: VERSION,
32
+ }, {
33
+ capabilities: {
34
+ tools: {},
35
+ },
36
+ });
37
+ this.memory = new ConversationMemory();
38
+ this.handlers = new ToolHandlers(this.memory, getSQLiteManager());
39
+ this.setupHandlers();
40
+ }
41
+ /**
42
+ * Get tool handler map for dynamic dispatch
43
+ * Using a map prevents switch/case drift and makes it easy to add new tools
44
+ */
45
+ getToolHandlerMap() {
46
+ return {
47
+ index_conversations: (args) => this.handlers.indexConversations(args),
48
+ search_conversations: (args) => this.handlers.searchConversations(args),
49
+ get_decisions: (args) => this.handlers.getDecisions(args),
50
+ check_before_modify: (args) => this.handlers.checkBeforeModify(args),
51
+ get_file_evolution: (args) => this.handlers.getFileEvolution(args),
52
+ link_commits_to_conversations: (args) => this.handlers.linkCommitsToConversations(args),
53
+ search_mistakes: (args) => this.handlers.searchMistakes(args),
54
+ get_requirements: (args) => this.handlers.getRequirements(args),
55
+ get_tool_history: (args) => this.handlers.getToolHistory(args),
56
+ find_similar_sessions: (args) => this.handlers.findSimilarSessions(args),
57
+ recall_and_apply: (args) => this.handlers.recallAndApply(args),
58
+ generate_documentation: (args) => this.handlers.generateDocumentation(args),
59
+ discover_old_conversations: (args) => this.handlers.discoverOldConversations(args),
60
+ migrate_project: (args) => this.handlers.migrateProject(args),
61
+ forget_by_topic: (args) => this.handlers.forgetByTopic(args),
62
+ search_by_file: (args) => this.handlers.searchByFile(args),
63
+ list_recent_sessions: (args) => this.handlers.listRecentSessions(args),
64
+ index_all_projects: (args) => this.handlers.indexAllProjects(args),
65
+ search_all_conversations: (args) => this.handlers.searchAllConversations(args),
66
+ get_all_decisions: (args) => this.handlers.getAllDecisions(args),
67
+ search_all_mistakes: (args) => this.handlers.searchAllMistakes(args),
68
+ // Live Context Layer: Working Memory
69
+ remember: (args) => this.handlers.remember(args),
70
+ recall: (args) => this.handlers.recall(args),
71
+ recall_relevant: (args) => this.handlers.recallRelevant(args),
72
+ list_memory: (args) => this.handlers.listMemory(args),
73
+ forget: (args) => this.handlers.forget(args),
74
+ // Live Context Layer: Session Handoff
75
+ prepare_handoff: (args) => this.handlers.prepareHandoff(args),
76
+ resume_from_handoff: (args) => this.handlers.resumeFromHandoff(args),
77
+ list_handoffs: (args) => this.handlers.listHandoffs(args),
78
+ // Live Context Layer: Context Injection
79
+ get_startup_context: (args) => this.handlers.getStartupContext(args),
80
+ inject_relevant_context: (args) => this.handlers.injectRelevantContext(args),
81
+ };
82
+ }
83
+ /**
84
+ * Setup MCP request handlers
85
+ */
86
+ setupHandlers() {
87
+ const toolHandlers = this.getToolHandlerMap();
88
+ // List available tools
89
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
90
+ return {
91
+ tools: Object.values(TOOLS),
92
+ };
93
+ });
94
+ // Handle tool execution
95
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
96
+ const { name, arguments: args } = request.params;
97
+ // Ensure args is always an object, defaulting to empty
98
+ const argsObj = (args ?? {});
99
+ try {
100
+ console.error(`[MCP] Executing tool: ${name}`);
101
+ // Guard against prototype pollution: only allow own properties
102
+ if (!Object.hasOwn(toolHandlers, name)) {
103
+ return {
104
+ content: [
105
+ {
106
+ type: "text",
107
+ text: JSON.stringify({ error: `Unknown tool: ${name}` }),
108
+ },
109
+ ],
110
+ isError: true,
111
+ };
112
+ }
113
+ const handler = toolHandlers[name];
114
+ const result = await handler(argsObj);
115
+ // Use compact JSON for responses (no pretty-printing)
116
+ return {
117
+ content: [
118
+ {
119
+ type: "text",
120
+ text: JSON.stringify(result),
121
+ },
122
+ ],
123
+ };
124
+ }
125
+ catch (error) {
126
+ // Safely handle non-Error throws
127
+ const err = error instanceof Error ? error : new Error(String(error));
128
+ // Log full error details server-side only
129
+ console.error(`[MCP] Error executing tool ${name}:`, err.message);
130
+ if (err.stack) {
131
+ console.error(`[MCP] Stack trace:`, err.stack);
132
+ }
133
+ // SECURITY: Return only error message to client, not stack traces
134
+ return {
135
+ content: [
136
+ {
137
+ type: "text",
138
+ text: JSON.stringify({ error: err.message }),
139
+ },
140
+ ],
141
+ isError: true,
142
+ };
143
+ }
144
+ });
145
+ }
146
+ /**
147
+ * Start the server
148
+ */
149
+ async start() {
150
+ const transport = new StdioServerTransport();
151
+ console.error("[MCP] CCCMemory Server starting...");
152
+ console.error(`[MCP] Database: ${getSQLiteManager().getStats().dbPath}`);
153
+ await this.server.connect(transport);
154
+ console.error("[MCP] Server ready - listening on stdio");
155
+ }
156
+ }
157
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}