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,83 @@
1
+ /**
2
+ * Working Memory Store
3
+ *
4
+ * A key-value store for facts, decisions, and context that persists
5
+ * across conversation boundaries. Enables Claude to "remember" things
6
+ * explicitly and retrieve them later.
7
+ */
8
+ import type { Database } from "better-sqlite3";
9
+ import type { WorkingMemoryItem, RememberOptions, RecallOptions, SemanticRecallOptions, SemanticRecallResult } from "./types.js";
10
+ export declare class WorkingMemoryStore {
11
+ private db;
12
+ constructor(db: Database);
13
+ /**
14
+ * Store a fact/decision/context in working memory
15
+ */
16
+ remember(options: RememberOptions): WorkingMemoryItem;
17
+ /**
18
+ * Recall a specific item by key
19
+ */
20
+ recall(key: string, projectPath: string): WorkingMemoryItem | null;
21
+ /**
22
+ * Recall items matching options
23
+ */
24
+ recallMany(options: RecallOptions): WorkingMemoryItem[];
25
+ /**
26
+ * Semantic search across working memory using FTS
27
+ */
28
+ recallRelevant(options: SemanticRecallOptions): SemanticRecallResult[];
29
+ /**
30
+ * Forget (delete) a memory item by key
31
+ */
32
+ forget(key: string, projectPath: string): boolean;
33
+ /**
34
+ * Forget all items for a project
35
+ */
36
+ forgetAll(projectPath: string): number;
37
+ /**
38
+ * List all memory items for a project
39
+ */
40
+ list(projectPath: string, options?: {
41
+ tags?: string[];
42
+ limit?: number;
43
+ offset?: number;
44
+ }): WorkingMemoryItem[];
45
+ /**
46
+ * Get count of items for a project
47
+ */
48
+ count(projectPath: string): number;
49
+ /**
50
+ * Get a single item by ID
51
+ */
52
+ private getById;
53
+ /**
54
+ * Convert database row to WorkingMemoryItem
55
+ */
56
+ private rowToItem;
57
+ /**
58
+ * Clean up expired items
59
+ */
60
+ private cleanupExpired;
61
+ /**
62
+ * Insert into FTS index
63
+ */
64
+ private insertFts;
65
+ /**
66
+ * Update FTS index
67
+ */
68
+ private updateFts;
69
+ /**
70
+ * Delete from FTS index
71
+ */
72
+ private deleteFts;
73
+ /**
74
+ * Escape FTS query for safe matching
75
+ */
76
+ private escapeFtsQuery;
77
+ /**
78
+ * Normalize BM25 rank to a similarity score (0-1)
79
+ * BM25 returns negative scores, lower is better
80
+ */
81
+ private normalizeRank;
82
+ }
83
+ //# sourceMappingURL=WorkingMemoryStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkingMemoryStore.d.ts","sourceRoot":"","sources":["../../src/memory/WorkingMemoryStore.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EACV,iBAAiB,EAEjB,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAW;gBAET,EAAE,EAAE,QAAQ;IAIxB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,iBAAiB;IAyErD;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAmBlE;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,iBAAiB,EAAE;IA8CvD;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,oBAAoB,EAAE;IAgCtE;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAiBjD;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAiBtC;;OAEG;IACH,IAAI,CACF,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7D,iBAAiB,EAAE;IA8BtB;;OAEG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAYlC;;OAEG;IACH,OAAO,CAAC,OAAO;IAYf;;OAEG;IACH,OAAO,CAAC,SAAS;IAejB;;OAEG;IACH,OAAO,CAAC,cAAc;IAsBtB;;OAEG;IACH,OAAO,CAAC,SAAS;IAmBjB;;OAEG;IACH,OAAO,CAAC,SAAS;IAgBjB;;OAEG;IACH,OAAO,CAAC,SAAS;IAUjB;;OAEG;IACH,OAAO,CAAC,cAAc;IAqBtB;;;OAGG;IACH,OAAO,CAAC,aAAa;CAKtB"}
@@ -0,0 +1,318 @@
1
+ /**
2
+ * Working Memory Store
3
+ *
4
+ * A key-value store for facts, decisions, and context that persists
5
+ * across conversation boundaries. Enables Claude to "remember" things
6
+ * explicitly and retrieve them later.
7
+ */
8
+ import { nanoid } from "nanoid";
9
+ export class WorkingMemoryStore {
10
+ db;
11
+ constructor(db) {
12
+ this.db = db;
13
+ }
14
+ /**
15
+ * Store a fact/decision/context in working memory
16
+ */
17
+ remember(options) {
18
+ const now = Date.now();
19
+ const id = nanoid();
20
+ const expiresAt = options.ttl ? now + options.ttl * 1000 : null;
21
+ // Check if key already exists for this project
22
+ const existing = this.db
23
+ .prepare("SELECT id FROM working_memory WHERE project_path = ? AND key = ?")
24
+ .get(options.projectPath, options.key);
25
+ if (existing) {
26
+ // Update existing
27
+ this.db
28
+ .prepare(`UPDATE working_memory
29
+ SET value = ?, context = ?, tags = ?, session_id = ?, updated_at = ?, expires_at = ?
30
+ WHERE id = ?`)
31
+ .run(options.value, options.context || null, options.tags ? JSON.stringify(options.tags) : null, options.sessionId || null, now, expiresAt, existing.id);
32
+ // Update FTS
33
+ this.updateFts(existing.id, options.key, options.value, options.context);
34
+ return this.getById(existing.id);
35
+ }
36
+ // Insert new
37
+ this.db
38
+ .prepare(`INSERT INTO working_memory
39
+ (id, key, value, context, tags, session_id, project_path, created_at, updated_at, expires_at)
40
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
41
+ .run(id, options.key, options.value, options.context || null, options.tags ? JSON.stringify(options.tags) : null, options.sessionId || null, options.projectPath, now, now, expiresAt);
42
+ // Insert into FTS
43
+ this.insertFts(id, options.key, options.value, options.context);
44
+ return {
45
+ id,
46
+ key: options.key,
47
+ value: options.value,
48
+ context: options.context,
49
+ tags: options.tags || [],
50
+ sessionId: options.sessionId,
51
+ projectPath: options.projectPath,
52
+ createdAt: now,
53
+ updatedAt: now,
54
+ expiresAt: expiresAt || undefined,
55
+ };
56
+ }
57
+ /**
58
+ * Recall a specific item by key
59
+ */
60
+ recall(key, projectPath) {
61
+ // First, clean up expired items
62
+ this.cleanupExpired();
63
+ const row = this.db
64
+ .prepare(`SELECT * FROM working_memory
65
+ WHERE project_path = ? AND key = ?
66
+ AND (expires_at IS NULL OR expires_at > ?)`)
67
+ .get(projectPath, key, Date.now());
68
+ if (!row) {
69
+ return null;
70
+ }
71
+ return this.rowToItem(row);
72
+ }
73
+ /**
74
+ * Recall items matching options
75
+ */
76
+ recallMany(options) {
77
+ // First, clean up expired items
78
+ if (!options.includeExpired) {
79
+ this.cleanupExpired();
80
+ }
81
+ let sql = "SELECT * FROM working_memory WHERE 1=1";
82
+ const params = [];
83
+ if (options.projectPath) {
84
+ sql += " AND project_path = ?";
85
+ params.push(options.projectPath);
86
+ }
87
+ if (options.key) {
88
+ sql += " AND key = ?";
89
+ params.push(options.key);
90
+ }
91
+ if (options.sessionId) {
92
+ sql += " AND session_id = ?";
93
+ params.push(options.sessionId);
94
+ }
95
+ if (!options.includeExpired) {
96
+ sql += " AND (expires_at IS NULL OR expires_at > ?)";
97
+ params.push(Date.now());
98
+ }
99
+ sql += " ORDER BY updated_at DESC";
100
+ const rows = this.db.prepare(sql).all(...params);
101
+ // Filter by tags in JavaScript (JSON array in SQLite)
102
+ let items = rows.map((row) => this.rowToItem(row));
103
+ const filterTags = options.tags;
104
+ if (filterTags && filterTags.length > 0) {
105
+ items = items.filter((item) => filterTags.some((tag) => item.tags.includes(tag)));
106
+ }
107
+ return items;
108
+ }
109
+ /**
110
+ * Semantic search across working memory using FTS
111
+ */
112
+ recallRelevant(options) {
113
+ // First, clean up expired items
114
+ this.cleanupExpired();
115
+ const limit = options.limit || 10;
116
+ // Use FTS5 for text search
117
+ const ftsResults = this.db
118
+ .prepare(`SELECT wm.*,
119
+ bm25(working_memory_fts) as rank
120
+ FROM working_memory_fts fts
121
+ JOIN working_memory wm ON wm.id = fts.id
122
+ WHERE working_memory_fts MATCH ?
123
+ AND wm.project_path = ?
124
+ AND (wm.expires_at IS NULL OR wm.expires_at > ?)
125
+ ORDER BY rank
126
+ LIMIT ?`)
127
+ .all(this.escapeFtsQuery(options.query), options.projectPath, Date.now(), limit);
128
+ return ftsResults.map((row) => ({
129
+ ...this.rowToItem(row),
130
+ similarity: this.normalizeRank(row.rank),
131
+ }));
132
+ }
133
+ /**
134
+ * Forget (delete) a memory item by key
135
+ */
136
+ forget(key, projectPath) {
137
+ const item = this.recall(key, projectPath);
138
+ if (!item) {
139
+ return false;
140
+ }
141
+ // Delete from FTS first
142
+ this.deleteFts(item.id);
143
+ // Delete from main table
144
+ const result = this.db
145
+ .prepare("DELETE FROM working_memory WHERE project_path = ? AND key = ?")
146
+ .run(projectPath, key);
147
+ return result.changes > 0;
148
+ }
149
+ /**
150
+ * Forget all items for a project
151
+ */
152
+ forgetAll(projectPath) {
153
+ // Get all IDs first for FTS cleanup
154
+ const items = this.db
155
+ .prepare("SELECT id FROM working_memory WHERE project_path = ?")
156
+ .all(projectPath);
157
+ for (const item of items) {
158
+ this.deleteFts(item.id);
159
+ }
160
+ const result = this.db
161
+ .prepare("DELETE FROM working_memory WHERE project_path = ?")
162
+ .run(projectPath);
163
+ return result.changes;
164
+ }
165
+ /**
166
+ * List all memory items for a project
167
+ */
168
+ list(projectPath, options) {
169
+ // First, clean up expired items
170
+ this.cleanupExpired();
171
+ const limit = options?.limit || 100;
172
+ const offset = options?.offset || 0;
173
+ const rows = this.db
174
+ .prepare(`SELECT * FROM working_memory
175
+ WHERE project_path = ?
176
+ AND (expires_at IS NULL OR expires_at > ?)
177
+ ORDER BY updated_at DESC
178
+ LIMIT ? OFFSET ?`)
179
+ .all(projectPath, Date.now(), limit, offset);
180
+ let items = rows.map((row) => this.rowToItem(row));
181
+ // Filter by tags if specified
182
+ const listTags = options?.tags;
183
+ if (listTags && listTags.length > 0) {
184
+ items = items.filter((item) => listTags.some((tag) => item.tags.includes(tag)));
185
+ }
186
+ return items;
187
+ }
188
+ /**
189
+ * Get count of items for a project
190
+ */
191
+ count(projectPath) {
192
+ const result = this.db
193
+ .prepare(`SELECT COUNT(*) as count FROM working_memory
194
+ WHERE project_path = ?
195
+ AND (expires_at IS NULL OR expires_at > ?)`)
196
+ .get(projectPath, Date.now());
197
+ return result.count;
198
+ }
199
+ /**
200
+ * Get a single item by ID
201
+ */
202
+ getById(id) {
203
+ const row = this.db
204
+ .prepare("SELECT * FROM working_memory WHERE id = ?")
205
+ .get(id);
206
+ if (!row) {
207
+ return null;
208
+ }
209
+ return this.rowToItem(row);
210
+ }
211
+ /**
212
+ * Convert database row to WorkingMemoryItem
213
+ */
214
+ rowToItem(row) {
215
+ return {
216
+ id: row.id,
217
+ key: row.key,
218
+ value: row.value,
219
+ context: row.context || undefined,
220
+ tags: row.tags ? JSON.parse(row.tags) : [],
221
+ sessionId: row.session_id || undefined,
222
+ projectPath: row.project_path,
223
+ createdAt: row.created_at,
224
+ updatedAt: row.updated_at,
225
+ expiresAt: row.expires_at || undefined,
226
+ };
227
+ }
228
+ /**
229
+ * Clean up expired items
230
+ */
231
+ cleanupExpired() {
232
+ const now = Date.now();
233
+ // Get expired IDs for FTS cleanup
234
+ const expired = this.db
235
+ .prepare("SELECT id FROM working_memory WHERE expires_at IS NOT NULL AND expires_at <= ?")
236
+ .all(now);
237
+ for (const item of expired) {
238
+ this.deleteFts(item.id);
239
+ }
240
+ // Delete expired items
241
+ this.db
242
+ .prepare("DELETE FROM working_memory WHERE expires_at IS NOT NULL AND expires_at <= ?")
243
+ .run(now);
244
+ }
245
+ /**
246
+ * Insert into FTS index
247
+ */
248
+ insertFts(id, key, value, context) {
249
+ try {
250
+ this.db
251
+ .prepare(`INSERT INTO working_memory_fts(id, key, value, context)
252
+ VALUES (?, ?, ?, ?)`)
253
+ .run(id, key, value, context || "");
254
+ }
255
+ catch (_error) {
256
+ // FTS insert can fail if table doesn't exist yet
257
+ // Silently ignore - search will fall back to non-FTS
258
+ }
259
+ }
260
+ /**
261
+ * Update FTS index
262
+ */
263
+ updateFts(id, key, value, context) {
264
+ try {
265
+ // Delete old entry
266
+ this.deleteFts(id);
267
+ // Insert new entry
268
+ this.insertFts(id, key, value, context);
269
+ }
270
+ catch (_error) {
271
+ // Silently ignore FTS errors
272
+ }
273
+ }
274
+ /**
275
+ * Delete from FTS index
276
+ */
277
+ deleteFts(id) {
278
+ try {
279
+ this.db
280
+ .prepare("DELETE FROM working_memory_fts WHERE id = ?")
281
+ .run(id);
282
+ }
283
+ catch (_error) {
284
+ // Silently ignore FTS errors
285
+ }
286
+ }
287
+ /**
288
+ * Escape FTS query for safe matching
289
+ */
290
+ escapeFtsQuery(query) {
291
+ // Escape special FTS5 characters and wrap in quotes for phrase matching
292
+ // Also handle simple word queries
293
+ const words = query
294
+ .split(/\s+/)
295
+ .filter((w) => w.length > 0)
296
+ .map((word) => {
297
+ // Remove special characters that could break FTS
298
+ const cleaned = word.replace(/['"(){}[\]:*^~\\-]/g, "");
299
+ return cleaned;
300
+ })
301
+ .filter((w) => w.length > 0);
302
+ if (words.length === 0) {
303
+ return '""';
304
+ }
305
+ // Join with OR for broad matching
306
+ return words.map((w) => `"${w}"`).join(" OR ");
307
+ }
308
+ /**
309
+ * Normalize BM25 rank to a similarity score (0-1)
310
+ * BM25 returns negative scores, lower is better
311
+ */
312
+ normalizeRank(rank) {
313
+ // Convert negative BM25 score to positive similarity
314
+ // Typical BM25 scores range from -50 to 0
315
+ return Math.max(0, Math.min(1, 1 + rank / 50));
316
+ }
317
+ }
318
+ //# sourceMappingURL=WorkingMemoryStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkingMemoryStore.js","sourceRoot":"","sources":["../../src/memory/WorkingMemoryStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Working Memory Types
3
+ *
4
+ * Types for the working memory store that allows Claude to remember
5
+ * facts, decisions, and context across conversation boundaries.
6
+ */
7
+ /**
8
+ * A single item stored in working memory
9
+ */
10
+ export interface WorkingMemoryItem {
11
+ id: string;
12
+ key: string;
13
+ value: string;
14
+ context?: string;
15
+ tags: string[];
16
+ sessionId?: string;
17
+ projectPath: string;
18
+ createdAt: number;
19
+ updatedAt: number;
20
+ expiresAt?: number;
21
+ }
22
+ /**
23
+ * Database row representation of a working memory item
24
+ */
25
+ export interface WorkingMemoryRow {
26
+ id: string;
27
+ key: string;
28
+ value: string;
29
+ context: string | null;
30
+ tags: string | null;
31
+ session_id: string | null;
32
+ project_path: string;
33
+ created_at: number;
34
+ updated_at: number;
35
+ expires_at: number | null;
36
+ embedding: Buffer | null;
37
+ }
38
+ /**
39
+ * Options for storing a memory item
40
+ */
41
+ export interface RememberOptions {
42
+ key: string;
43
+ value: string;
44
+ context?: string;
45
+ tags?: string[];
46
+ sessionId?: string;
47
+ projectPath: string;
48
+ ttl?: number;
49
+ }
50
+ /**
51
+ * Options for recalling memory items
52
+ */
53
+ export interface RecallOptions {
54
+ key?: string;
55
+ tags?: string[];
56
+ sessionId?: string;
57
+ projectPath?: string;
58
+ includeExpired?: boolean;
59
+ }
60
+ /**
61
+ * Options for semantic recall
62
+ */
63
+ export interface SemanticRecallOptions {
64
+ query: string;
65
+ projectPath: string;
66
+ limit?: number;
67
+ threshold?: number;
68
+ }
69
+ /**
70
+ * Result from semantic recall with similarity score
71
+ */
72
+ export interface SemanticRecallResult extends WorkingMemoryItem {
73
+ similarity: number;
74
+ }
75
+ /**
76
+ * Session handoff document for transferring context between conversations
77
+ */
78
+ export interface SessionHandoff {
79
+ id: string;
80
+ fromSessionId: string;
81
+ projectPath: string;
82
+ createdAt: number;
83
+ decisions: HandoffDecision[];
84
+ activeFiles: ActiveFile[];
85
+ pendingTasks: PendingTask[];
86
+ workingMemory: WorkingMemoryItem[];
87
+ contextSummary: string;
88
+ resumedBy?: string;
89
+ resumedAt?: number;
90
+ }
91
+ /**
92
+ * Decision included in a handoff
93
+ */
94
+ export interface HandoffDecision {
95
+ id: string;
96
+ text: string;
97
+ rationale?: string;
98
+ context?: string;
99
+ timestamp: number;
100
+ }
101
+ /**
102
+ * File that was actively worked on
103
+ */
104
+ export interface ActiveFile {
105
+ path: string;
106
+ lastAction: "read" | "edit" | "create" | "delete";
107
+ summary?: string;
108
+ timestamp: number;
109
+ }
110
+ /**
111
+ * Task that was in progress
112
+ */
113
+ export interface PendingTask {
114
+ description: string;
115
+ status: "in_progress" | "blocked" | "pending";
116
+ context?: string;
117
+ }
118
+ /**
119
+ * Database row for session handoff
120
+ */
121
+ export interface SessionHandoffRow {
122
+ id: string;
123
+ from_session_id: string;
124
+ project_path: string;
125
+ created_at: number;
126
+ handoff_data: string;
127
+ resumed_by_session_id: string | null;
128
+ resumed_at: number | null;
129
+ }
130
+ /**
131
+ * Live checkpoint for real-time session tracking
132
+ */
133
+ export interface SessionCheckpoint {
134
+ id: string;
135
+ sessionId: string;
136
+ projectPath: string;
137
+ checkpointNumber: number;
138
+ createdAt: number;
139
+ decisions: HandoffDecision[];
140
+ activeFiles: ActiveFile[];
141
+ taskState?: Record<string, unknown>;
142
+ contextSummary: string;
143
+ }
144
+ /**
145
+ * Database row for session checkpoint
146
+ */
147
+ export interface SessionCheckpointRow {
148
+ id: string;
149
+ session_id: string;
150
+ project_path: string;
151
+ checkpoint_number: number;
152
+ created_at: number;
153
+ decisions: string;
154
+ active_files: string;
155
+ task_state: string | null;
156
+ context_summary: string;
157
+ }
158
+ /**
159
+ * Configuration for real-time watching
160
+ */
161
+ export interface RealtimeConfig {
162
+ enabled: boolean;
163
+ watchPaths: string[];
164
+ extractionInterval: number;
165
+ checkpointInterval: number;
166
+ autoRemember: {
167
+ decisions: boolean;
168
+ fileEdits: boolean;
169
+ errors: boolean;
170
+ };
171
+ }
172
+ /**
173
+ * Context injection result
174
+ */
175
+ export interface InjectedContext {
176
+ handoff?: SessionHandoff;
177
+ decisions: HandoffDecision[];
178
+ memory: WorkingMemoryItem[];
179
+ recentFiles: ActiveFile[];
180
+ summary: string;
181
+ tokenEstimate: number;
182
+ }
183
+ /**
184
+ * Options for context injection
185
+ */
186
+ export interface ContextInjectionOptions {
187
+ query?: string;
188
+ projectPath: string;
189
+ maxTokens?: number;
190
+ sources?: Array<"history" | "decisions" | "memory" | "handoffs">;
191
+ }
192
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Working Memory Types
3
+ *
4
+ * Types for the working memory store that allows Claude to remember
5
+ * facts, decisions, and context across conversation boundaries.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Codex Conversation Parser for MCP integration.
3
+ *
4
+ * This parser reads conversation history from Codex's storage location
5
+ * (~/.codex/sessions) and converts it to the same format as ConversationParser.
6
+ *
7
+ * Codex stores conversations in a date-hierarchical structure:
8
+ * ~/.codex/sessions/YYYY/MM/DD/rollout-{timestamp}-{uuid}.jsonl
9
+ *
10
+ * Each line in a Codex session file has the structure:
11
+ * {
12
+ * timestamp: string,
13
+ * type: "session_meta" | "response_item" | "event_msg" | "turn_context",
14
+ * payload: { ... }
15
+ * }
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const parser = new CodexConversationParser();
20
+ * const result = parser.parseSessions('/Users/username/.codex');
21
+ * console.error(`Parsed ${result.conversations.length} Codex sessions`);
22
+ * ```
23
+ */
24
+ import type { ParseResult } from "./ConversationParser.js";
25
+ /**
26
+ * Parser for Codex conversation history.
27
+ *
28
+ * Converts Codex session files into the same format as ConversationParser
29
+ * so they can be stored in the same database and searched together.
30
+ */
31
+ export declare class CodexConversationParser {
32
+ /**
33
+ * Parse all Codex sessions.
34
+ *
35
+ * Recursively scans the sessions directory for JSONL files and parses them.
36
+ *
37
+ * @param codexPath - Path to Codex home directory (default: ~/.codex)
38
+ * @param sessionId - Optional specific session ID to parse
39
+ * @returns ParseResult with all extracted entities
40
+ */
41
+ parseSession(codexPath: string, sessionId?: string, lastIndexedMs?: number): ParseResult;
42
+ /**
43
+ * Recursively find all .jsonl session files.
44
+ */
45
+ private findSessionFiles;
46
+ /**
47
+ * Parse a single Codex session file.
48
+ */
49
+ private parseSessionFile;
50
+ }
51
+ //# sourceMappingURL=CodexConversationParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodexConversationParser.d.ts","sourceRoot":"","sources":["../../src/parsers/CodexConversationParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAOV,WAAW,EACZ,MAAM,yBAAyB,CAAC;AAwCjC;;;;;GAKG;AACH,qBAAa,uBAAuB;IAClC;;;;;;;;OAQG;IACH,YAAY,CACV,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,WAAW;IA0Fd;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CA6KzB"}