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.
- package/LICENSE +21 -0
- package/README.md +349 -0
- package/dist/ConversationMemory.d.ts +231 -0
- package/dist/ConversationMemory.d.ts.map +1 -0
- package/dist/ConversationMemory.js +357 -0
- package/dist/ConversationMemory.js.map +1 -0
- package/dist/cache/QueryCache.d.ts +215 -0
- package/dist/cache/QueryCache.d.ts.map +1 -0
- package/dist/cache/QueryCache.js +294 -0
- package/dist/cache/QueryCache.js.map +1 -0
- package/dist/cli/commands.d.ts +9 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +954 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/help.d.ts +16 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +361 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +30 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +111 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/context/ContextInjector.d.ts +38 -0
- package/dist/context/ContextInjector.d.ts.map +1 -0
- package/dist/context/ContextInjector.js +235 -0
- package/dist/context/ContextInjector.js.map +1 -0
- package/dist/documentation/CodeAnalyzer.d.ts +29 -0
- package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
- package/dist/documentation/CodeAnalyzer.js +122 -0
- package/dist/documentation/CodeAnalyzer.js.map +1 -0
- package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
- package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
- package/dist/documentation/ConversationAnalyzer.js +157 -0
- package/dist/documentation/ConversationAnalyzer.js.map +1 -0
- package/dist/documentation/CrossReferencer.d.ts +67 -0
- package/dist/documentation/CrossReferencer.d.ts.map +1 -0
- package/dist/documentation/CrossReferencer.js +247 -0
- package/dist/documentation/CrossReferencer.js.map +1 -0
- package/dist/documentation/DocumentationGenerator.d.ts +22 -0
- package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
- package/dist/documentation/DocumentationGenerator.js +57 -0
- package/dist/documentation/DocumentationGenerator.js.map +1 -0
- package/dist/documentation/MarkdownFormatter.d.ts +26 -0
- package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
- package/dist/documentation/MarkdownFormatter.js +301 -0
- package/dist/documentation/MarkdownFormatter.js.map +1 -0
- package/dist/documentation/types.d.ts +176 -0
- package/dist/documentation/types.d.ts.map +1 -0
- package/dist/documentation/types.js +5 -0
- package/dist/documentation/types.js.map +1 -0
- package/dist/embeddings/ConfigManager.d.ts +46 -0
- package/dist/embeddings/ConfigManager.d.ts.map +1 -0
- package/dist/embeddings/ConfigManager.js +177 -0
- package/dist/embeddings/ConfigManager.js.map +1 -0
- package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
- package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingConfig.js +132 -0
- package/dist/embeddings/EmbeddingConfig.js.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts +51 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.js +157 -0
- package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
- package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
- package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingProvider.js +6 -0
- package/dist/embeddings/EmbeddingProvider.js.map +1 -0
- package/dist/embeddings/ModelRegistry.d.ts +48 -0
- package/dist/embeddings/ModelRegistry.d.ts.map +1 -0
- package/dist/embeddings/ModelRegistry.js +170 -0
- package/dist/embeddings/ModelRegistry.js.map +1 -0
- package/dist/embeddings/VectorStore.d.ts +114 -0
- package/dist/embeddings/VectorStore.d.ts.map +1 -0
- package/dist/embeddings/VectorStore.js +393 -0
- package/dist/embeddings/VectorStore.js.map +1 -0
- package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
- package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/OllamaEmbeddings.js +125 -0
- package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.js +129 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
- package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
- package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js +115 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
- package/dist/handoff/SessionHandoffStore.d.ts +80 -0
- package/dist/handoff/SessionHandoffStore.d.ts.map +1 -0
- package/dist/handoff/SessionHandoffStore.js +314 -0
- package/dist/handoff/SessionHandoffStore.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +115 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +27 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +157 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/memory/WorkingMemoryStore.d.ts +83 -0
- package/dist/memory/WorkingMemoryStore.d.ts.map +1 -0
- package/dist/memory/WorkingMemoryStore.js +318 -0
- package/dist/memory/WorkingMemoryStore.js.map +1 -0
- package/dist/memory/types.d.ts +192 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +8 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/parsers/CodexConversationParser.d.ts +51 -0
- package/dist/parsers/CodexConversationParser.d.ts.map +1 -0
- package/dist/parsers/CodexConversationParser.js +301 -0
- package/dist/parsers/CodexConversationParser.js.map +1 -0
- package/dist/parsers/ConversationParser.d.ts +286 -0
- package/dist/parsers/ConversationParser.d.ts.map +1 -0
- package/dist/parsers/ConversationParser.js +795 -0
- package/dist/parsers/ConversationParser.js.map +1 -0
- package/dist/parsers/DecisionExtractor.d.ts +144 -0
- package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
- package/dist/parsers/DecisionExtractor.js +434 -0
- package/dist/parsers/DecisionExtractor.js.map +1 -0
- package/dist/parsers/GitIntegrator.d.ts +156 -0
- package/dist/parsers/GitIntegrator.d.ts.map +1 -0
- package/dist/parsers/GitIntegrator.js +348 -0
- package/dist/parsers/GitIntegrator.js.map +1 -0
- package/dist/parsers/MistakeExtractor.d.ts +151 -0
- package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
- package/dist/parsers/MistakeExtractor.js +460 -0
- package/dist/parsers/MistakeExtractor.js.map +1 -0
- package/dist/parsers/RequirementsExtractor.d.ts +166 -0
- package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
- package/dist/parsers/RequirementsExtractor.js +338 -0
- package/dist/parsers/RequirementsExtractor.js.map +1 -0
- package/dist/realtime/ConversationWatcher.d.ts +87 -0
- package/dist/realtime/ConversationWatcher.d.ts.map +1 -0
- package/dist/realtime/ConversationWatcher.js +204 -0
- package/dist/realtime/ConversationWatcher.js.map +1 -0
- package/dist/realtime/IncrementalParser.d.ts +83 -0
- package/dist/realtime/IncrementalParser.d.ts.map +1 -0
- package/dist/realtime/IncrementalParser.js +232 -0
- package/dist/realtime/IncrementalParser.js.map +1 -0
- package/dist/realtime/LiveExtractor.d.ts +72 -0
- package/dist/realtime/LiveExtractor.d.ts.map +1 -0
- package/dist/realtime/LiveExtractor.js +288 -0
- package/dist/realtime/LiveExtractor.js.map +1 -0
- package/dist/search/SemanticSearch.d.ts +121 -0
- package/dist/search/SemanticSearch.d.ts.map +1 -0
- package/dist/search/SemanticSearch.js +823 -0
- package/dist/search/SemanticSearch.js.map +1 -0
- package/dist/storage/BackupManager.d.ts +58 -0
- package/dist/storage/BackupManager.d.ts.map +1 -0
- package/dist/storage/BackupManager.js +223 -0
- package/dist/storage/BackupManager.js.map +1 -0
- package/dist/storage/ConversationStorage.d.ts +341 -0
- package/dist/storage/ConversationStorage.d.ts.map +1 -0
- package/dist/storage/ConversationStorage.js +792 -0
- package/dist/storage/ConversationStorage.js.map +1 -0
- package/dist/storage/DeletionService.d.ts +70 -0
- package/dist/storage/DeletionService.d.ts.map +1 -0
- package/dist/storage/DeletionService.js +253 -0
- package/dist/storage/DeletionService.js.map +1 -0
- package/dist/storage/GlobalIndex.d.ts +133 -0
- package/dist/storage/GlobalIndex.d.ts.map +1 -0
- package/dist/storage/GlobalIndex.js +310 -0
- package/dist/storage/GlobalIndex.js.map +1 -0
- package/dist/storage/SQLiteManager.d.ts +114 -0
- package/dist/storage/SQLiteManager.d.ts.map +1 -0
- package/dist/storage/SQLiteManager.js +636 -0
- package/dist/storage/SQLiteManager.js.map +1 -0
- package/dist/storage/migrations.d.ts +54 -0
- package/dist/storage/migrations.d.ts.map +1 -0
- package/dist/storage/migrations.js +285 -0
- package/dist/storage/migrations.js.map +1 -0
- package/dist/storage/schema.sql +436 -0
- package/dist/tools/ToolDefinitions.d.ts +946 -0
- package/dist/tools/ToolDefinitions.d.ts.map +1 -0
- package/dist/tools/ToolDefinitions.js +937 -0
- package/dist/tools/ToolDefinitions.js.map +1 -0
- package/dist/tools/ToolHandlers.d.ts +791 -0
- package/dist/tools/ToolHandlers.d.ts.map +1 -0
- package/dist/tools/ToolHandlers.js +3262 -0
- package/dist/tools/ToolHandlers.js.map +1 -0
- package/dist/types/ToolTypes.d.ts +824 -0
- package/dist/types/ToolTypes.d.ts.map +1 -0
- package/dist/types/ToolTypes.js +6 -0
- package/dist/types/ToolTypes.js.map +1 -0
- package/dist/utils/Logger.d.ts +70 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +131 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/McpConfig.d.ts +54 -0
- package/dist/utils/McpConfig.d.ts.map +1 -0
- package/dist/utils/McpConfig.js +136 -0
- package/dist/utils/McpConfig.js.map +1 -0
- package/dist/utils/ProjectMigration.d.ts +82 -0
- package/dist/utils/ProjectMigration.d.ts.map +1 -0
- package/dist/utils/ProjectMigration.js +416 -0
- package/dist/utils/ProjectMigration.js.map +1 -0
- package/dist/utils/constants.d.ts +75 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +105 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/safeJson.d.ts +37 -0
- package/dist/utils/safeJson.d.ts.map +1 -0
- package/dist/utils/safeJson.js +48 -0
- package/dist/utils/safeJson.js.map +1 -0
- package/dist/utils/sanitization.d.ts +45 -0
- package/dist/utils/sanitization.d.ts.map +1 -0
- package/dist/utils/sanitization.js +153 -0
- package/dist/utils/sanitization.js.map +1 -0
- package/dist/utils/worktree.d.ts +15 -0
- package/dist/utils/worktree.d.ts.map +1 -0
- package/dist/utils/worktree.js +86 -0
- package/dist/utils/worktree.js.map +1 -0
- package/package.json +98 -0
- package/scripts/changelog-check.sh +62 -0
- package/scripts/check-node.js +17 -0
- package/scripts/dev-config.js +56 -0
- 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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|