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,177 @@
1
+ /**
2
+ * Configuration Manager for CLI
3
+ * Handles reading and writing embedding configuration
4
+ */
5
+ import { readFileSync, writeFileSync, existsSync } from "fs";
6
+ import { join } from "path";
7
+ import { homedir } from "os";
8
+ import { ConfigLoader } from "./EmbeddingConfig.js";
9
+ export class ConfigManager {
10
+ static CONFIG_FILENAME = ".claude-memory-config.json";
11
+ /**
12
+ * Get current effective configuration (after all precedence rules)
13
+ */
14
+ static getCurrentConfig() {
15
+ return ConfigLoader.load();
16
+ }
17
+ /**
18
+ * Get configuration sources breakdown
19
+ */
20
+ static getConfigSources() {
21
+ const homeConfigPath = join(homedir(), this.CONFIG_FILENAME);
22
+ const projectConfigPath = join(process.cwd(), this.CONFIG_FILENAME);
23
+ const homeConfig = existsSync(homeConfigPath)
24
+ ? this.loadConfigFile(homeConfigPath)?.embedding || null
25
+ : null;
26
+ const projectConfig = existsSync(projectConfigPath)
27
+ ? this.loadConfigFile(projectConfigPath)?.embedding || null
28
+ : null;
29
+ const envConfig = {};
30
+ if (process.env.EMBEDDING_PROVIDER) {
31
+ envConfig.provider = process.env.EMBEDDING_PROVIDER;
32
+ }
33
+ if (process.env.EMBEDDING_MODEL) {
34
+ envConfig.model = process.env.EMBEDDING_MODEL;
35
+ }
36
+ if (process.env.EMBEDDING_DIMENSIONS) {
37
+ envConfig.dimensions = parseInt(process.env.EMBEDDING_DIMENSIONS, 10);
38
+ }
39
+ if (process.env.EMBEDDING_BASE_URL) {
40
+ envConfig.baseUrl = process.env.EMBEDDING_BASE_URL;
41
+ }
42
+ if (process.env.OPENAI_API_KEY) {
43
+ envConfig.apiKey = process.env.OPENAI_API_KEY;
44
+ }
45
+ return {
46
+ home: homeConfig,
47
+ project: projectConfig,
48
+ env: envConfig,
49
+ effective: ConfigLoader.load(),
50
+ };
51
+ }
52
+ /**
53
+ * Get a specific config value
54
+ */
55
+ static getConfigValue(key) {
56
+ const config = this.getCurrentConfig();
57
+ switch (key) {
58
+ case "provider":
59
+ return config.provider;
60
+ case "model":
61
+ return config.model;
62
+ case "dimensions":
63
+ return config.dimensions;
64
+ case "baseUrl":
65
+ case "base_url":
66
+ return config.baseUrl;
67
+ case "apiKey":
68
+ case "api_key":
69
+ return config.apiKey;
70
+ default:
71
+ throw new Error(`Unknown config key: ${key}. Valid keys: provider, model, dimensions, baseUrl, apiKey`);
72
+ }
73
+ }
74
+ /**
75
+ * Set a config value (writes to home config file)
76
+ */
77
+ static setConfigValue(key, value) {
78
+ const homeConfigPath = join(homedir(), this.CONFIG_FILENAME);
79
+ // Load existing config or create new one
80
+ let config = { embedding: {} };
81
+ if (existsSync(homeConfigPath)) {
82
+ const existing = this.loadConfigFile(homeConfigPath);
83
+ if (existing && existing.embedding) {
84
+ config = { embedding: existing.embedding };
85
+ }
86
+ }
87
+ // Ensure embedding object exists
88
+ if (!config.embedding) {
89
+ config.embedding = {};
90
+ }
91
+ // Set the value with type conversion
92
+ switch (key) {
93
+ case "provider":
94
+ if (!["ollama", "transformers", "openai"].includes(value)) {
95
+ throw new Error(`Invalid provider: ${value}. Must be 'ollama', 'transformers', or 'openai'`);
96
+ }
97
+ config.embedding.provider = value;
98
+ break;
99
+ case "model":
100
+ if (!value || value.trim() === "") {
101
+ throw new Error("Model name cannot be empty");
102
+ }
103
+ config.embedding.model = value;
104
+ break;
105
+ case "dimensions": {
106
+ const dims = parseInt(value, 10);
107
+ if (isNaN(dims) || dims < 1 || dims > 10000) {
108
+ throw new Error("Dimensions must be a number between 1 and 10000");
109
+ }
110
+ config.embedding.dimensions = dims;
111
+ break;
112
+ }
113
+ case "baseUrl":
114
+ case "base_url":
115
+ config.embedding.baseUrl = value;
116
+ break;
117
+ case "apiKey":
118
+ case "api_key":
119
+ config.embedding.apiKey = value;
120
+ break;
121
+ default:
122
+ throw new Error(`Unknown config key: ${key}. Valid keys: provider, model, dimensions, baseUrl, apiKey`);
123
+ }
124
+ // Write config file
125
+ try {
126
+ writeFileSync(homeConfigPath, JSON.stringify(config, null, 2), "utf-8");
127
+ }
128
+ catch (error) {
129
+ throw new Error(`Failed to write config file: ${error.message}`);
130
+ }
131
+ }
132
+ /**
133
+ * Get config file path (home directory)
134
+ */
135
+ static getConfigPath() {
136
+ return join(homedir(), this.CONFIG_FILENAME);
137
+ }
138
+ /**
139
+ * Check if config file exists
140
+ */
141
+ static configExists() {
142
+ return existsSync(this.getConfigPath());
143
+ }
144
+ /**
145
+ * Load config file
146
+ */
147
+ static loadConfigFile(path) {
148
+ try {
149
+ const content = readFileSync(path, "utf-8");
150
+ return JSON.parse(content);
151
+ }
152
+ catch (_error) {
153
+ return null;
154
+ }
155
+ }
156
+ /**
157
+ * Get known model dimensions for common models
158
+ */
159
+ static getKnownModelDimensions(model) {
160
+ const knownDimensions = {
161
+ // Ollama models
162
+ "mxbai-embed-large": 1024,
163
+ "nomic-embed-text": 768,
164
+ "all-minilm": 384,
165
+ "snowflake-arctic-embed": 1024,
166
+ // OpenAI models
167
+ "text-embedding-3-small": 1536,
168
+ "text-embedding-3-large": 3072,
169
+ "text-embedding-ada-002": 1536,
170
+ // Transformers models
171
+ "Xenova/all-MiniLM-L6-v2": 384,
172
+ "Xenova/all-mpnet-base-v2": 768,
173
+ };
174
+ return knownDimensions[model] || null;
175
+ }
176
+ }
177
+ //# sourceMappingURL=ConfigManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigManager.js","sourceRoot":"","sources":["../../src/embeddings/ConfigManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Embedding Configuration Management
3
+ * Loads config from file and environment variables (env vars take precedence)
4
+ */
5
+ export type EmbeddingProviderType = "ollama" | "transformers" | "openai";
6
+ export interface EmbeddingConfig {
7
+ provider: EmbeddingProviderType;
8
+ model: string;
9
+ dimensions?: number;
10
+ baseUrl?: string;
11
+ apiKey?: string;
12
+ }
13
+ export declare class ConfigLoader {
14
+ private static readonly CONFIG_FILENAME;
15
+ /**
16
+ * Load configuration with precedence: env vars > project config > home config > defaults
17
+ */
18
+ static load(): EmbeddingConfig;
19
+ /**
20
+ * Load and parse config file
21
+ */
22
+ private static loadConfigFile;
23
+ /**
24
+ * Apply provider-specific defaults
25
+ */
26
+ private static applyProviderDefaults;
27
+ /**
28
+ * Validate configuration
29
+ */
30
+ static validate(config: EmbeddingConfig): {
31
+ valid: boolean;
32
+ errors: string[];
33
+ };
34
+ /**
35
+ * Get example config for documentation
36
+ */
37
+ static getExampleConfig(): string;
38
+ }
39
+ //# sourceMappingURL=EmbeddingConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddingConfig.d.ts","sourceRoot":"","sources":["../../src/embeddings/EmbeddingConfig.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,cAAc,GAAG,QAAQ,CAAC;AAEzE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,qBAAqB,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAgC;IAEvE;;OAEG;IACH,MAAM,CAAC,IAAI,IAAI,eAAe;IAqD9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAU7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IA6BpC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IA2B9E;;OAEG;IACH,MAAM,CAAC,gBAAgB,IAAI,MAAM;CAalC"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Embedding Configuration Management
3
+ * Loads config from file and environment variables (env vars take precedence)
4
+ */
5
+ import { readFileSync, existsSync } from "fs";
6
+ import { join } from "path";
7
+ import { homedir } from "os";
8
+ export class ConfigLoader {
9
+ static CONFIG_FILENAME = ".claude-memory-config.json";
10
+ /**
11
+ * Load configuration with precedence: env vars > project config > home config > defaults
12
+ */
13
+ static load() {
14
+ // Start with defaults
15
+ let config = {
16
+ provider: "transformers",
17
+ model: "Xenova/all-MiniLM-L6-v2",
18
+ dimensions: 384,
19
+ };
20
+ // Try loading from home directory config
21
+ const homeConfigPath = join(homedir(), this.CONFIG_FILENAME);
22
+ if (existsSync(homeConfigPath)) {
23
+ const homeConfig = this.loadConfigFile(homeConfigPath);
24
+ if (homeConfig?.embedding) {
25
+ config = { ...config, ...homeConfig.embedding };
26
+ }
27
+ }
28
+ // Try loading from project config (overrides home config)
29
+ const projectConfigPath = join(process.cwd(), this.CONFIG_FILENAME);
30
+ if (existsSync(projectConfigPath)) {
31
+ const projectConfig = this.loadConfigFile(projectConfigPath);
32
+ if (projectConfig?.embedding) {
33
+ config = { ...config, ...projectConfig.embedding };
34
+ }
35
+ }
36
+ // Environment variables override everything
37
+ if (process.env.EMBEDDING_PROVIDER) {
38
+ config.provider = process.env.EMBEDDING_PROVIDER;
39
+ }
40
+ if (process.env.EMBEDDING_MODEL) {
41
+ config.model = process.env.EMBEDDING_MODEL;
42
+ }
43
+ if (process.env.EMBEDDING_DIMENSIONS) {
44
+ config.dimensions = parseInt(process.env.EMBEDDING_DIMENSIONS, 10);
45
+ }
46
+ if (process.env.EMBEDDING_BASE_URL) {
47
+ config.baseUrl = process.env.EMBEDDING_BASE_URL;
48
+ }
49
+ if (process.env.OPENAI_API_KEY) {
50
+ config.apiKey = process.env.OPENAI_API_KEY;
51
+ }
52
+ // Set provider-specific defaults
53
+ config = this.applyProviderDefaults(config);
54
+ return config;
55
+ }
56
+ /**
57
+ * Load and parse config file
58
+ */
59
+ static loadConfigFile(path) {
60
+ try {
61
+ const content = readFileSync(path, "utf-8");
62
+ return JSON.parse(content);
63
+ }
64
+ catch (error) {
65
+ console.error(`Warning: Could not load config file ${path}:`, error);
66
+ return null;
67
+ }
68
+ }
69
+ /**
70
+ * Apply provider-specific defaults
71
+ */
72
+ static applyProviderDefaults(config) {
73
+ switch (config.provider) {
74
+ case "ollama":
75
+ return {
76
+ ...config,
77
+ baseUrl: config.baseUrl || "http://localhost:11434",
78
+ model: config.model || "mxbai-embed-large",
79
+ dimensions: config.dimensions || 1024, // mxbai-embed-large default
80
+ };
81
+ case "openai":
82
+ return {
83
+ ...config,
84
+ model: config.model || "text-embedding-3-small",
85
+ dimensions: config.dimensions || 1536, // text-embedding-3-small default
86
+ };
87
+ case "transformers":
88
+ return {
89
+ ...config,
90
+ model: config.model || "Xenova/all-MiniLM-L6-v2",
91
+ dimensions: config.dimensions || 384,
92
+ };
93
+ default:
94
+ return config;
95
+ }
96
+ }
97
+ /**
98
+ * Validate configuration
99
+ */
100
+ static validate(config) {
101
+ const errors = [];
102
+ if (!["ollama", "transformers", "openai"].includes(config.provider)) {
103
+ errors.push(`Invalid provider: ${config.provider}. Must be 'ollama', 'transformers', or 'openai'`);
104
+ }
105
+ if (!config.model || config.model.trim() === "") {
106
+ errors.push("Model name is required");
107
+ }
108
+ if (config.provider === "openai" && !config.apiKey) {
109
+ errors.push("OpenAI provider requires OPENAI_API_KEY environment variable or apiKey in config");
110
+ }
111
+ if (config.dimensions && (config.dimensions < 1 || config.dimensions > 10000)) {
112
+ errors.push("Dimensions must be between 1 and 10000");
113
+ }
114
+ return {
115
+ valid: errors.length === 0,
116
+ errors,
117
+ };
118
+ }
119
+ /**
120
+ * Get example config for documentation
121
+ */
122
+ static getExampleConfig() {
123
+ return JSON.stringify({
124
+ embedding: {
125
+ provider: "ollama",
126
+ model: "nomic-embed-text",
127
+ baseUrl: "http://localhost:11434",
128
+ },
129
+ }, null, 2);
130
+ }
131
+ }
132
+ //# sourceMappingURL=EmbeddingConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddingConfig.js","sourceRoot":"","sources":["../../src/embeddings/EmbeddingConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Embedding Generator Factory
3
+ * Creates appropriate embedding provider based on configuration
4
+ */
5
+ import type { EmbeddingProvider } from "./EmbeddingProvider.js";
6
+ /**
7
+ * Factory class for creating embedding providers
8
+ */
9
+ export declare class EmbeddingGenerator {
10
+ private static instance;
11
+ private static initializationPromise;
12
+ /**
13
+ * Get or create embedding provider based on configuration
14
+ * Uses promise-based mutex to prevent concurrent initialization race condition
15
+ */
16
+ static getProvider(): Promise<EmbeddingProvider>;
17
+ /**
18
+ * Internal initialization logic (called once via mutex)
19
+ */
20
+ private static initializeProvider;
21
+ /**
22
+ * Create specific provider instance
23
+ */
24
+ private static createProvider;
25
+ /**
26
+ * Auto-detect best available provider
27
+ * Tries in order: Transformers.js (bundled, reliable) → Ollama (fast if running)
28
+ */
29
+ private static autoDetectProvider;
30
+ /**
31
+ * Reset singleton (useful for testing)
32
+ */
33
+ static reset(): void;
34
+ /**
35
+ * Get current provider info (if initialized)
36
+ */
37
+ static getInfo(): {
38
+ provider: string;
39
+ model: string;
40
+ available: boolean;
41
+ } | null;
42
+ }
43
+ /**
44
+ * Legacy API compatibility - returns provider instance
45
+ */
46
+ export declare function getEmbeddingGenerator(): Promise<EmbeddingProvider>;
47
+ /**
48
+ * Legacy API compatibility - resets singleton
49
+ */
50
+ export declare function resetEmbeddingGenerator(): void;
51
+ //# sourceMappingURL=EmbeddingGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddingGenerator.d.ts","sourceRoot":"","sources":["../../src/embeddings/EmbeddingGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAMhE;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkC;IACzD,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAA2C;IAE/E;;;OAGG;WACU,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAwBtD;;OAEG;mBACkB,kBAAkB;IA2CvC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IA2B7B;;;OAGG;mBACkB,kBAAkB;IA6BvC;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;IAKpB;;OAEG;IACH,MAAM,CAAC,OAAO,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;CAYjF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAExE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Embedding Generator Factory
3
+ * Creates appropriate embedding provider based on configuration
4
+ */
5
+ import { ConfigLoader } from "./EmbeddingConfig.js";
6
+ import { OllamaEmbeddings } from "./providers/OllamaEmbeddings.js";
7
+ import { OpenAIEmbeddings } from "./providers/OpenAIEmbeddings.js";
8
+ import { TransformersEmbeddings } from "./providers/TransformersEmbeddings.js";
9
+ /**
10
+ * Factory class for creating embedding providers
11
+ */
12
+ export class EmbeddingGenerator {
13
+ static instance = null;
14
+ static initializationPromise = null;
15
+ /**
16
+ * Get or create embedding provider based on configuration
17
+ * Uses promise-based mutex to prevent concurrent initialization race condition
18
+ */
19
+ static async getProvider() {
20
+ // Fast path: already initialized
21
+ if (this.instance) {
22
+ return this.instance;
23
+ }
24
+ // If initialization is in progress, wait for it
25
+ if (this.initializationPromise) {
26
+ return this.initializationPromise;
27
+ }
28
+ // Start initialization with mutex
29
+ this.initializationPromise = this.initializeProvider();
30
+ try {
31
+ const provider = await this.initializationPromise;
32
+ return provider;
33
+ }
34
+ catch (error) {
35
+ // Reset on failure so next call can retry
36
+ this.initializationPromise = null;
37
+ throw error;
38
+ }
39
+ }
40
+ /**
41
+ * Internal initialization logic (called once via mutex)
42
+ */
43
+ static async initializeProvider() {
44
+ // Double-check after acquiring mutex
45
+ if (this.instance) {
46
+ return this.instance;
47
+ }
48
+ // Load configuration
49
+ const config = ConfigLoader.load();
50
+ // Validate configuration
51
+ const validation = ConfigLoader.validate(config);
52
+ if (!validation.valid) {
53
+ console.error("⚠️ Invalid embedding configuration:");
54
+ validation.errors.forEach((error) => console.error(` - ${error}`));
55
+ console.error(" Falling back to auto-detection...");
56
+ }
57
+ // Try to create provider based on config (or auto-detect)
58
+ let provider;
59
+ if (validation.valid) {
60
+ console.error(`Attempting to use ${config.provider} embeddings...`);
61
+ provider = this.createProvider(config.provider, config);
62
+ }
63
+ else {
64
+ // Auto-detect: try providers in order of preference
65
+ console.error("Auto-detecting available embedding provider...");
66
+ provider = await this.autoDetectProvider();
67
+ }
68
+ // Initialize the provider
69
+ await provider.initialize();
70
+ // If provider is not available, try fallback
71
+ if (!provider.isAvailable()) {
72
+ console.error(`⚠️ ${config.provider} provider not available, trying fallback...`);
73
+ provider = await this.autoDetectProvider();
74
+ await provider.initialize();
75
+ }
76
+ this.instance = provider;
77
+ return provider;
78
+ }
79
+ /**
80
+ * Create specific provider instance
81
+ */
82
+ static createProvider(type, config) {
83
+ switch (type) {
84
+ case "ollama":
85
+ return new OllamaEmbeddings(config.baseUrl || "http://localhost:11434", config.model, config.dimensions);
86
+ case "openai":
87
+ return new OpenAIEmbeddings(config.apiKey || "", config.model, config.dimensions);
88
+ case "transformers":
89
+ return new TransformersEmbeddings(config.model, config.dimensions);
90
+ default:
91
+ throw new Error(`Unknown provider type: ${type}`);
92
+ }
93
+ }
94
+ /**
95
+ * Auto-detect best available provider
96
+ * Tries in order: Transformers.js (bundled, reliable) → Ollama (fast if running)
97
+ */
98
+ static async autoDetectProvider() {
99
+ // Try Transformers.js first (bundled dependency, always works offline)
100
+ const transformers = new TransformersEmbeddings();
101
+ await transformers.initialize();
102
+ if (transformers.isAvailable()) {
103
+ console.error("✓ Auto-detected: Using Transformers.js embeddings");
104
+ return transformers;
105
+ }
106
+ // Try Ollama as fallback (requires Ollama to be running)
107
+ const ollama = new OllamaEmbeddings();
108
+ await ollama.initialize();
109
+ if (ollama.isAvailable()) {
110
+ console.error("✓ Auto-detected: Using Ollama embeddings");
111
+ return ollama;
112
+ }
113
+ // No provider available - return transformers as placeholder
114
+ // It will fail gracefully when used, falling back to FTS
115
+ console.error("⚠️ No embedding provider available");
116
+ console.error(" Options:");
117
+ console.error(" 1. Ensure @xenova/transformers is properly installed");
118
+ console.error(" 2. Install Ollama: https://ollama.com");
119
+ console.error(" 3. Configure OpenAI: Set OPENAI_API_KEY environment variable");
120
+ console.error(" Falling back to full-text search only.");
121
+ return transformers; // Return uninitialized provider (will fail gracefully)
122
+ }
123
+ /**
124
+ * Reset singleton (useful for testing)
125
+ */
126
+ static reset() {
127
+ this.instance = null;
128
+ this.initializationPromise = null;
129
+ }
130
+ /**
131
+ * Get current provider info (if initialized)
132
+ */
133
+ static getInfo() {
134
+ if (!this.instance) {
135
+ return null;
136
+ }
137
+ const info = this.instance.getModelInfo();
138
+ return {
139
+ provider: info.provider,
140
+ model: info.model,
141
+ available: info.available,
142
+ };
143
+ }
144
+ }
145
+ /**
146
+ * Legacy API compatibility - returns provider instance
147
+ */
148
+ export async function getEmbeddingGenerator() {
149
+ return EmbeddingGenerator.getProvider();
150
+ }
151
+ /**
152
+ * Legacy API compatibility - resets singleton
153
+ */
154
+ export function resetEmbeddingGenerator() {
155
+ EmbeddingGenerator.reset();
156
+ }
157
+ //# sourceMappingURL=EmbeddingGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddingGenerator.js","sourceRoot":"","sources":["../../src/embeddings/EmbeddingGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Embedding Provider Interface
3
+ * Defines the contract for all embedding implementations
4
+ */
5
+ export interface ModelInfo {
6
+ provider: string;
7
+ model: string;
8
+ dimensions: number;
9
+ available: boolean;
10
+ }
11
+ export interface EmbeddingProvider {
12
+ /**
13
+ * Initialize the embedding provider
14
+ * Should handle graceful failure if provider unavailable
15
+ */
16
+ initialize(): Promise<void>;
17
+ /**
18
+ * Check if embeddings are available
19
+ */
20
+ isAvailable(): boolean;
21
+ /**
22
+ * Generate embedding for a single text
23
+ */
24
+ embed(text: string): Promise<Float32Array>;
25
+ /**
26
+ * Generate embeddings for multiple texts (batched for efficiency)
27
+ */
28
+ embedBatch(texts: string[], batchSize?: number): Promise<Float32Array[]>;
29
+ /**
30
+ * Get information about the model being used
31
+ */
32
+ getModelInfo(): ModelInfo;
33
+ }
34
+ //# sourceMappingURL=EmbeddingProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddingProvider.d.ts","sourceRoot":"","sources":["../../src/embeddings/EmbeddingProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC;IAEvB;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE3C;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAEzE;;OAEG;IACH,YAAY,IAAI,SAAS,CAAC;CAC3B"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Embedding Provider Interface
3
+ * Defines the contract for all embedding implementations
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=EmbeddingProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddingProvider.js","sourceRoot":"","sources":["../../src/embeddings/EmbeddingProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG"}