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,436 @@
1
+ -- CCCMemory Database Schema
2
+ -- Version: 1.0.0
3
+ -- Optimized for SQLite + sqlite-vec
4
+
5
+ -- ==================================================
6
+ -- CORE TABLES
7
+ -- ==================================================
8
+
9
+ -- Table 1: Conversations
10
+ CREATE TABLE IF NOT EXISTS conversations (
11
+ id TEXT PRIMARY KEY, -- sessionId from JSONL
12
+ project_path TEXT NOT NULL, -- Derived from directory name
13
+ source_type TEXT DEFAULT 'claude-code', -- 'claude-code' or 'codex'
14
+ first_message_at INTEGER NOT NULL,
15
+ last_message_at INTEGER NOT NULL,
16
+ message_count INTEGER DEFAULT 0,
17
+ git_branch TEXT, -- Most recent branch
18
+ claude_version TEXT, -- Most recent version
19
+ metadata TEXT, -- JSON: {cwd, tags}
20
+ created_at INTEGER NOT NULL,
21
+ updated_at INTEGER NOT NULL
22
+ );
23
+
24
+ CREATE INDEX IF NOT EXISTS idx_conv_project ON conversations(project_path);
25
+ CREATE INDEX IF NOT EXISTS idx_conv_source ON conversations(source_type);
26
+ CREATE INDEX IF NOT EXISTS idx_conv_time ON conversations(last_message_at);
27
+ CREATE INDEX IF NOT EXISTS idx_conv_branch ON conversations(git_branch);
28
+ CREATE INDEX IF NOT EXISTS idx_conv_created ON conversations(created_at);
29
+
30
+ -- Table 2: Messages
31
+ CREATE TABLE IF NOT EXISTS messages (
32
+ id TEXT PRIMARY KEY, -- uuid from JSONL
33
+ conversation_id TEXT NOT NULL,
34
+ parent_id TEXT, -- parentUuid (threading)
35
+ message_type TEXT NOT NULL, -- user/assistant/system/summary/file-history-snapshot
36
+ role TEXT, -- user/assistant (for user/assistant types)
37
+ content TEXT, -- Main message content
38
+ timestamp INTEGER NOT NULL,
39
+ is_sidechain INTEGER DEFAULT 0, -- Agent messages (boolean as integer)
40
+ agent_id TEXT, -- For agent messages
41
+ request_id TEXT, -- API request ID
42
+ git_branch TEXT,
43
+ cwd TEXT,
44
+ metadata TEXT, -- JSON: full message metadata
45
+ FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
46
+ FOREIGN KEY (parent_id) REFERENCES messages(id) ON DELETE SET NULL
47
+ );
48
+
49
+ CREATE INDEX IF NOT EXISTS idx_msg_conv ON messages(conversation_id);
50
+ CREATE INDEX IF NOT EXISTS idx_msg_parent ON messages(parent_id);
51
+ CREATE INDEX IF NOT EXISTS idx_msg_type ON messages(message_type);
52
+ CREATE INDEX IF NOT EXISTS idx_msg_time ON messages(timestamp);
53
+ CREATE INDEX IF NOT EXISTS idx_msg_conv_time ON messages(conversation_id, timestamp);
54
+ CREATE INDEX IF NOT EXISTS idx_msg_role ON messages(role);
55
+
56
+ -- Table 3: Tool Uses
57
+ CREATE TABLE IF NOT EXISTS tool_uses (
58
+ id TEXT PRIMARY KEY, -- tool_use_id (toolu_xxx)
59
+ message_id TEXT NOT NULL,
60
+ tool_name TEXT NOT NULL, -- Bash, Read, Write, Edit, etc.
61
+ tool_input TEXT NOT NULL, -- JSON parameters
62
+ timestamp INTEGER NOT NULL,
63
+ FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
64
+ );
65
+
66
+ CREATE INDEX IF NOT EXISTS idx_tool_msg ON tool_uses(message_id);
67
+ CREATE INDEX IF NOT EXISTS idx_tool_name ON tool_uses(tool_name);
68
+ CREATE INDEX IF NOT EXISTS idx_tool_time ON tool_uses(timestamp);
69
+ CREATE INDEX IF NOT EXISTS idx_tool_name_time ON tool_uses(tool_name, timestamp);
70
+
71
+ -- Table 4: Tool Results
72
+ CREATE TABLE IF NOT EXISTS tool_results (
73
+ id TEXT PRIMARY KEY,
74
+ tool_use_id TEXT NOT NULL,
75
+ message_id TEXT NOT NULL,
76
+ content TEXT,
77
+ is_error INTEGER DEFAULT 0, -- Boolean as integer
78
+ stdout TEXT,
79
+ stderr TEXT,
80
+ is_image INTEGER DEFAULT 0, -- Boolean as integer
81
+ timestamp INTEGER NOT NULL,
82
+ FOREIGN KEY (tool_use_id) REFERENCES tool_uses(id) ON DELETE CASCADE,
83
+ FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
84
+ );
85
+
86
+ CREATE INDEX IF NOT EXISTS idx_result_tool ON tool_results(tool_use_id);
87
+ CREATE INDEX IF NOT EXISTS idx_result_msg ON tool_results(message_id);
88
+ CREATE INDEX IF NOT EXISTS idx_result_error ON tool_results(is_error);
89
+
90
+ -- Table 5: File Edits
91
+ CREATE TABLE IF NOT EXISTS file_edits (
92
+ id TEXT PRIMARY KEY,
93
+ conversation_id TEXT NOT NULL,
94
+ file_path TEXT NOT NULL,
95
+ message_id TEXT NOT NULL,
96
+ backup_version INTEGER,
97
+ backup_time INTEGER,
98
+ snapshot_timestamp INTEGER NOT NULL,
99
+ metadata TEXT, -- JSON from trackedFileBackups
100
+ FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
101
+ FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
102
+ );
103
+
104
+ CREATE INDEX IF NOT EXISTS idx_edit_file ON file_edits(file_path);
105
+ CREATE INDEX IF NOT EXISTS idx_edit_conv ON file_edits(conversation_id);
106
+ CREATE INDEX IF NOT EXISTS idx_edit_time ON file_edits(snapshot_timestamp);
107
+ CREATE INDEX IF NOT EXISTS idx_edit_file_time ON file_edits(file_path, snapshot_timestamp);
108
+
109
+ -- Table 6: Thinking Blocks
110
+ CREATE TABLE IF NOT EXISTS thinking_blocks (
111
+ id TEXT PRIMARY KEY,
112
+ message_id TEXT NOT NULL,
113
+ thinking_content TEXT NOT NULL,
114
+ signature TEXT,
115
+ timestamp INTEGER NOT NULL,
116
+ FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
117
+ );
118
+
119
+ CREATE INDEX IF NOT EXISTS idx_think_msg ON thinking_blocks(message_id);
120
+
121
+ -- ==================================================
122
+ -- ENHANCED MEMORY TABLES
123
+ -- ==================================================
124
+
125
+ -- Table 7: Decisions (Critical for preventing regressions)
126
+ CREATE TABLE IF NOT EXISTS decisions (
127
+ id TEXT PRIMARY KEY,
128
+ conversation_id TEXT NOT NULL,
129
+ message_id TEXT NOT NULL,
130
+ decision_text TEXT NOT NULL,
131
+ rationale TEXT,
132
+ alternatives_considered TEXT, -- JSON array
133
+ rejected_reasons TEXT, -- JSON object
134
+ context TEXT, -- What feature/area
135
+ related_files TEXT, -- JSON array
136
+ related_commits TEXT, -- JSON array (git hashes)
137
+ timestamp INTEGER NOT NULL,
138
+ FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
139
+ FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
140
+ );
141
+
142
+ CREATE INDEX IF NOT EXISTS idx_decision_conv ON decisions(conversation_id);
143
+ CREATE INDEX IF NOT EXISTS idx_decision_time ON decisions(timestamp);
144
+ CREATE INDEX IF NOT EXISTS idx_decision_context ON decisions(context);
145
+
146
+ -- Table 8: Git Commits (Essential for linking code to conversations)
147
+ CREATE TABLE IF NOT EXISTS git_commits (
148
+ hash TEXT PRIMARY KEY,
149
+ message TEXT NOT NULL,
150
+ author TEXT,
151
+ timestamp INTEGER NOT NULL,
152
+ branch TEXT,
153
+ files_changed TEXT, -- JSON array
154
+ conversation_id TEXT, -- Linked conversation
155
+ related_message_id TEXT, -- Message that led to commit
156
+ metadata TEXT, -- JSON: stats, etc.
157
+ FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE SET NULL,
158
+ FOREIGN KEY (related_message_id) REFERENCES messages(id) ON DELETE SET NULL
159
+ );
160
+
161
+ CREATE INDEX IF NOT EXISTS idx_commit_conv ON git_commits(conversation_id);
162
+ CREATE INDEX IF NOT EXISTS idx_commit_time ON git_commits(timestamp);
163
+ CREATE INDEX IF NOT EXISTS idx_commit_branch ON git_commits(branch);
164
+
165
+ -- Table 9: Mistakes (Learning from errors)
166
+ CREATE TABLE IF NOT EXISTS mistakes (
167
+ id TEXT PRIMARY KEY,
168
+ conversation_id TEXT NOT NULL,
169
+ message_id TEXT NOT NULL,
170
+ mistake_type TEXT NOT NULL, -- logic_error, wrong_approach, misunderstanding
171
+ what_went_wrong TEXT NOT NULL,
172
+ correction TEXT,
173
+ user_correction_message TEXT,
174
+ files_affected TEXT, -- JSON array
175
+ timestamp INTEGER NOT NULL,
176
+ FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
177
+ FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
178
+ );
179
+
180
+ CREATE INDEX IF NOT EXISTS idx_mistake_conv ON mistakes(conversation_id);
181
+ CREATE INDEX IF NOT EXISTS idx_mistake_type ON mistakes(mistake_type);
182
+ CREATE INDEX IF NOT EXISTS idx_mistake_time ON mistakes(timestamp);
183
+
184
+ -- Table 10: File Evolution (Timeline tracking)
185
+ CREATE TABLE IF NOT EXISTS file_evolution (
186
+ id TEXT PRIMARY KEY,
187
+ file_path TEXT NOT NULL,
188
+ conversation_id TEXT NOT NULL,
189
+ change_summary TEXT,
190
+ decision_ids TEXT, -- JSON array
191
+ commit_hash TEXT,
192
+ fixes_mistake_id TEXT,
193
+ timestamp INTEGER NOT NULL,
194
+ FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
195
+ FOREIGN KEY (commit_hash) REFERENCES git_commits(hash) ON DELETE SET NULL,
196
+ FOREIGN KEY (fixes_mistake_id) REFERENCES mistakes(id) ON DELETE SET NULL
197
+ );
198
+
199
+ CREATE INDEX IF NOT EXISTS idx_evolution_file ON file_evolution(file_path);
200
+ CREATE INDEX IF NOT EXISTS idx_evolution_time ON file_evolution(timestamp);
201
+ CREATE INDEX IF NOT EXISTS idx_evolution_file_time ON file_evolution(file_path, timestamp);
202
+
203
+ -- Table 11: Requirements (Constraints tracking)
204
+ CREATE TABLE IF NOT EXISTS requirements (
205
+ id TEXT PRIMARY KEY,
206
+ type TEXT NOT NULL, -- dependency, performance, compatibility, business
207
+ description TEXT NOT NULL,
208
+ rationale TEXT,
209
+ affects_components TEXT, -- JSON array
210
+ conversation_id TEXT NOT NULL,
211
+ message_id TEXT NOT NULL,
212
+ timestamp INTEGER NOT NULL,
213
+ FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
214
+ FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
215
+ );
216
+
217
+ CREATE INDEX IF NOT EXISTS idx_req_type ON requirements(type);
218
+ CREATE INDEX IF NOT EXISTS idx_req_conv ON requirements(conversation_id);
219
+
220
+ -- Table 12: Validations (Testing context)
221
+ CREATE TABLE IF NOT EXISTS validations (
222
+ id TEXT PRIMARY KEY,
223
+ conversation_id TEXT NOT NULL,
224
+ what_was_tested TEXT NOT NULL,
225
+ test_command TEXT,
226
+ result TEXT NOT NULL, -- passed, failed, error
227
+ performance_data TEXT, -- JSON
228
+ files_tested TEXT, -- JSON array
229
+ timestamp INTEGER NOT NULL,
230
+ FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE
231
+ );
232
+
233
+ CREATE INDEX IF NOT EXISTS idx_valid_conv ON validations(conversation_id);
234
+ CREATE INDEX IF NOT EXISTS idx_valid_result ON validations(result);
235
+
236
+ -- Table 13: User Preferences (Pattern learning)
237
+ CREATE TABLE IF NOT EXISTS user_preferences (
238
+ id TEXT PRIMARY KEY,
239
+ category TEXT NOT NULL, -- coding_style, architecture, tooling
240
+ preference TEXT NOT NULL,
241
+ rationale TEXT,
242
+ examples TEXT, -- JSON array of conversation_ids
243
+ established_date INTEGER NOT NULL,
244
+ updated_at INTEGER NOT NULL
245
+ );
246
+
247
+ CREATE INDEX IF NOT EXISTS idx_pref_category ON user_preferences(category);
248
+
249
+ -- ==================================================
250
+ -- VECTOR & SEARCH TABLES
251
+ -- ==================================================
252
+
253
+ -- Table 14: Message Embeddings (for semantic search)
254
+ CREATE TABLE IF NOT EXISTS message_embeddings (
255
+ id TEXT PRIMARY KEY,
256
+ message_id TEXT NOT NULL,
257
+ content TEXT NOT NULL,
258
+ embedding BLOB NOT NULL,
259
+ model_name TEXT DEFAULT 'all-MiniLM-L6-v2',
260
+ created_at INTEGER NOT NULL,
261
+ FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
262
+ );
263
+
264
+ CREATE INDEX IF NOT EXISTS idx_embed_msg ON message_embeddings(message_id);
265
+
266
+ -- Table 15: Decision Embeddings
267
+ CREATE TABLE IF NOT EXISTS decision_embeddings (
268
+ id TEXT PRIMARY KEY,
269
+ decision_id TEXT NOT NULL,
270
+ embedding BLOB NOT NULL,
271
+ created_at INTEGER NOT NULL,
272
+ FOREIGN KEY (decision_id) REFERENCES decisions(id) ON DELETE CASCADE
273
+ );
274
+
275
+ CREATE INDEX IF NOT EXISTS idx_dec_embed ON decision_embeddings(decision_id);
276
+
277
+ -- Table 16: Mistake Embeddings (for semantic search of mistakes)
278
+ CREATE TABLE IF NOT EXISTS mistake_embeddings (
279
+ id TEXT PRIMARY KEY,
280
+ mistake_id TEXT NOT NULL,
281
+ embedding BLOB NOT NULL,
282
+ created_at INTEGER NOT NULL,
283
+ FOREIGN KEY (mistake_id) REFERENCES mistakes(id) ON DELETE CASCADE
284
+ );
285
+
286
+ CREATE INDEX IF NOT EXISTS idx_mistake_embed ON mistake_embeddings(mistake_id);
287
+
288
+ -- Table 17: Full-Text Search Index for Messages
289
+ -- NOTE: Column names must match the messages table exactly for external content mode
290
+ CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(
291
+ id UNINDEXED,
292
+ content,
293
+ metadata,
294
+ content=messages,
295
+ content_rowid=rowid
296
+ );
297
+
298
+ -- Table 18: Full-Text Search Index for Decisions
299
+ CREATE VIRTUAL TABLE IF NOT EXISTS decisions_fts USING fts5(
300
+ id UNINDEXED,
301
+ decision_text,
302
+ rationale,
303
+ context,
304
+ content=decisions,
305
+ content_rowid=rowid
306
+ );
307
+
308
+ -- Table 19: Full-Text Search Index for Mistakes (standalone, not content-synced)
309
+ CREATE VIRTUAL TABLE IF NOT EXISTS mistakes_fts USING fts5(
310
+ id,
311
+ what_went_wrong,
312
+ correction,
313
+ mistake_type
314
+ );
315
+
316
+ -- ==================================================
317
+ -- PERFORMANCE & CACHING
318
+ -- ==================================================
319
+
320
+ -- Query Cache (Performance optimization)
321
+ CREATE TABLE IF NOT EXISTS query_cache (
322
+ cache_key TEXT PRIMARY KEY,
323
+ result TEXT NOT NULL,
324
+ created_at INTEGER NOT NULL,
325
+ expires_at INTEGER NOT NULL,
326
+ hit_count INTEGER DEFAULT 0,
327
+ last_accessed INTEGER
328
+ );
329
+
330
+ CREATE INDEX IF NOT EXISTS idx_cache_expires ON query_cache(expires_at);
331
+
332
+ -- ==================================================
333
+ -- METADATA TABLE
334
+ -- ==================================================
335
+
336
+ -- Schema Version Tracking
337
+ CREATE TABLE IF NOT EXISTS schema_version (
338
+ version INTEGER PRIMARY KEY,
339
+ applied_at INTEGER NOT NULL,
340
+ description TEXT,
341
+ checksum TEXT
342
+ );
343
+
344
+ -- ==================================================
345
+ -- GLOBAL INDEX TABLE (for cross-project search)
346
+ -- ==================================================
347
+
348
+ -- Table 18: Project Metadata (Global registry of all indexed projects)
349
+ CREATE TABLE IF NOT EXISTS project_metadata (
350
+ id TEXT PRIMARY KEY, -- UUID for project entry
351
+ project_path TEXT NOT NULL UNIQUE, -- Absolute path to project
352
+ source_type TEXT NOT NULL, -- 'claude-code' or 'codex'
353
+ db_path TEXT NOT NULL, -- Path to project's database
354
+ last_indexed INTEGER NOT NULL, -- Last indexing timestamp
355
+ message_count INTEGER DEFAULT 0, -- Total messages indexed
356
+ conversation_count INTEGER DEFAULT 0, -- Total conversations indexed
357
+ decision_count INTEGER DEFAULT 0, -- Total decisions indexed
358
+ mistake_count INTEGER DEFAULT 0, -- Total mistakes indexed
359
+ metadata TEXT, -- JSON: {git_repo, last_commit, etc}
360
+ created_at INTEGER NOT NULL,
361
+ updated_at INTEGER NOT NULL
362
+ );
363
+
364
+ CREATE INDEX IF NOT EXISTS idx_proj_source ON project_metadata(source_type);
365
+ CREATE INDEX IF NOT EXISTS idx_proj_last_indexed ON project_metadata(last_indexed);
366
+ CREATE INDEX IF NOT EXISTS idx_proj_path ON project_metadata(project_path);
367
+
368
+ -- ==================================================
369
+ -- LIVE CONTEXT LAYER TABLES
370
+ -- ==================================================
371
+
372
+ -- Table 19: Working Memory (Key-value store for facts/context)
373
+ CREATE TABLE IF NOT EXISTS working_memory (
374
+ id TEXT PRIMARY KEY,
375
+ key TEXT NOT NULL,
376
+ value TEXT NOT NULL,
377
+ context TEXT,
378
+ tags TEXT, -- JSON array
379
+ session_id TEXT,
380
+ project_path TEXT NOT NULL,
381
+ created_at INTEGER NOT NULL,
382
+ updated_at INTEGER NOT NULL,
383
+ expires_at INTEGER,
384
+ embedding BLOB,
385
+ UNIQUE(project_path, key)
386
+ );
387
+
388
+ CREATE INDEX IF NOT EXISTS idx_wm_session ON working_memory(session_id);
389
+ CREATE INDEX IF NOT EXISTS idx_wm_project ON working_memory(project_path);
390
+ CREATE INDEX IF NOT EXISTS idx_wm_expires ON working_memory(expires_at);
391
+ CREATE INDEX IF NOT EXISTS idx_wm_key ON working_memory(key);
392
+ CREATE INDEX IF NOT EXISTS idx_wm_project_key ON working_memory(project_path, key);
393
+
394
+ -- Table 20: Session Handoffs (Context transfer between conversations)
395
+ CREATE TABLE IF NOT EXISTS session_handoffs (
396
+ id TEXT PRIMARY KEY,
397
+ from_session_id TEXT NOT NULL,
398
+ project_path TEXT NOT NULL,
399
+ created_at INTEGER NOT NULL,
400
+ handoff_data TEXT NOT NULL, -- JSON with decisions, files, tasks, memory
401
+ resumed_by_session_id TEXT,
402
+ resumed_at INTEGER
403
+ );
404
+
405
+ CREATE INDEX IF NOT EXISTS idx_handoff_session ON session_handoffs(from_session_id);
406
+ CREATE INDEX IF NOT EXISTS idx_handoff_project ON session_handoffs(project_path);
407
+ CREATE INDEX IF NOT EXISTS idx_handoff_created ON session_handoffs(created_at);
408
+ CREATE INDEX IF NOT EXISTS idx_handoff_resumed ON session_handoffs(resumed_by_session_id);
409
+
410
+ -- Table 21: Session Checkpoints (Real-time progress tracking)
411
+ CREATE TABLE IF NOT EXISTS session_checkpoints (
412
+ id TEXT PRIMARY KEY,
413
+ session_id TEXT NOT NULL,
414
+ project_path TEXT NOT NULL,
415
+ checkpoint_number INTEGER NOT NULL,
416
+ created_at INTEGER NOT NULL,
417
+ decisions TEXT, -- JSON array
418
+ active_files TEXT, -- JSON array
419
+ task_state TEXT, -- JSON
420
+ context_summary TEXT NOT NULL
421
+ );
422
+
423
+ CREATE INDEX IF NOT EXISTS idx_checkpoint_session ON session_checkpoints(session_id);
424
+ CREATE INDEX IF NOT EXISTS idx_checkpoint_project ON session_checkpoints(project_path);
425
+ CREATE INDEX IF NOT EXISTS idx_checkpoint_created ON session_checkpoints(created_at);
426
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_checkpoint_session_num ON session_checkpoints(session_id, checkpoint_number);
427
+
428
+ -- Table 22: Full-Text Search Index for Working Memory
429
+ CREATE VIRTUAL TABLE IF NOT EXISTS working_memory_fts USING fts5(
430
+ id UNINDEXED,
431
+ key,
432
+ value,
433
+ context,
434
+ content=working_memory,
435
+ content_rowid=rowid
436
+ );