simple-memory-mcp 1.1.3

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 (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +742 -0
  3. package/dist/cli/arg-parser.d.ts +9 -0
  4. package/dist/cli/arg-parser.d.ts.map +1 -0
  5. package/dist/cli/arg-parser.js +68 -0
  6. package/dist/cli/arg-parser.js.map +1 -0
  7. package/dist/cli/help-generator.d.ts +8 -0
  8. package/dist/cli/help-generator.d.ts.map +1 -0
  9. package/dist/cli/help-generator.js +89 -0
  10. package/dist/cli/help-generator.js.map +1 -0
  11. package/dist/cli/index.d.ts +27 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +56 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/query-builder.d.ts +8 -0
  16. package/dist/cli/query-builder.d.ts.map +1 -0
  17. package/dist/cli/query-builder.js +63 -0
  18. package/dist/cli/query-builder.js.map +1 -0
  19. package/dist/cli/shortcuts-config.d.ts +26 -0
  20. package/dist/cli/shortcuts-config.d.ts.map +1 -0
  21. package/dist/cli/shortcuts-config.js +94 -0
  22. package/dist/cli/shortcuts-config.js.map +1 -0
  23. package/dist/graphql/resolvers.d.ts +101 -0
  24. package/dist/graphql/resolvers.d.ts.map +1 -0
  25. package/dist/graphql/resolvers.js +98 -0
  26. package/dist/graphql/resolvers.js.map +1 -0
  27. package/dist/graphql/schema.d.ts +13 -0
  28. package/dist/graphql/schema.d.ts.map +1 -0
  29. package/dist/graphql/schema.js +314 -0
  30. package/dist/graphql/schema.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +573 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/services/backup-service.d.ts +57 -0
  36. package/dist/services/backup-service.d.ts.map +1 -0
  37. package/dist/services/backup-service.js +191 -0
  38. package/dist/services/backup-service.js.map +1 -0
  39. package/dist/services/database-optimizer.d.ts +15 -0
  40. package/dist/services/database-optimizer.d.ts.map +1 -0
  41. package/dist/services/database-optimizer.js +45 -0
  42. package/dist/services/database-optimizer.js.map +1 -0
  43. package/dist/services/memory-service.d.ts +126 -0
  44. package/dist/services/memory-service.d.ts.map +1 -0
  45. package/dist/services/memory-service.js +862 -0
  46. package/dist/services/memory-service.js.map +1 -0
  47. package/dist/services/migrations.d.ts +17 -0
  48. package/dist/services/migrations.d.ts.map +1 -0
  49. package/dist/services/migrations.js +273 -0
  50. package/dist/services/migrations.js.map +1 -0
  51. package/dist/tests/backup-export-test.d.ts +2 -0
  52. package/dist/tests/backup-export-test.d.ts.map +1 -0
  53. package/dist/tests/backup-export-test.js +162 -0
  54. package/dist/tests/backup-export-test.js.map +1 -0
  55. package/dist/tests/backup-test.d.ts +14 -0
  56. package/dist/tests/backup-test.d.ts.map +1 -0
  57. package/dist/tests/backup-test.js +209 -0
  58. package/dist/tests/backup-test.js.map +1 -0
  59. package/dist/tests/export-import-test.d.ts +15 -0
  60. package/dist/tests/export-import-test.d.ts.map +1 -0
  61. package/dist/tests/export-import-test.js +227 -0
  62. package/dist/tests/export-import-test.js.map +1 -0
  63. package/dist/tests/graphql-comprehensive-test.d.ts +6 -0
  64. package/dist/tests/graphql-comprehensive-test.d.ts.map +1 -0
  65. package/dist/tests/graphql-comprehensive-test.js +342 -0
  66. package/dist/tests/graphql-comprehensive-test.js.map +1 -0
  67. package/dist/tests/graphql-performance-test.d.ts +6 -0
  68. package/dist/tests/graphql-performance-test.d.ts.map +1 -0
  69. package/dist/tests/graphql-performance-test.js +141 -0
  70. package/dist/tests/graphql-performance-test.js.map +1 -0
  71. package/dist/tests/graphql-test.d.ts +5 -0
  72. package/dist/tests/graphql-test.d.ts.map +1 -0
  73. package/dist/tests/graphql-test.js +47 -0
  74. package/dist/tests/graphql-test.js.map +1 -0
  75. package/dist/tests/memory-server-tests.d.ts +7 -0
  76. package/dist/tests/memory-server-tests.d.ts.map +1 -0
  77. package/dist/tests/memory-server-tests.js +466 -0
  78. package/dist/tests/memory-server-tests.js.map +1 -0
  79. package/dist/tests/migration-test.d.ts +2 -0
  80. package/dist/tests/migration-test.d.ts.map +1 -0
  81. package/dist/tests/migration-test.js +270 -0
  82. package/dist/tests/migration-test.js.map +1 -0
  83. package/dist/tests/performance-benchmark.d.ts +7 -0
  84. package/dist/tests/performance-benchmark.d.ts.map +1 -0
  85. package/dist/tests/performance-benchmark.js +234 -0
  86. package/dist/tests/performance-benchmark.js.map +1 -0
  87. package/dist/tests/performance-test.d.ts +3 -0
  88. package/dist/tests/performance-test.d.ts.map +1 -0
  89. package/dist/tests/performance-test.js +61 -0
  90. package/dist/tests/performance-test.js.map +1 -0
  91. package/dist/tests/time-range-test.d.ts +7 -0
  92. package/dist/tests/time-range-test.d.ts.map +1 -0
  93. package/dist/tests/time-range-test.js +169 -0
  94. package/dist/tests/time-range-test.js.map +1 -0
  95. package/dist/tools/delete-memory/cli-parser.d.ts +2 -0
  96. package/dist/tools/delete-memory/cli-parser.d.ts.map +1 -0
  97. package/dist/tools/delete-memory/cli-parser.js +13 -0
  98. package/dist/tools/delete-memory/cli-parser.js.map +1 -0
  99. package/dist/tools/delete-memory/executor.d.ts +13 -0
  100. package/dist/tools/delete-memory/executor.d.ts.map +1 -0
  101. package/dist/tools/delete-memory/executor.js +40 -0
  102. package/dist/tools/delete-memory/executor.js.map +1 -0
  103. package/dist/tools/delete-memory/index.d.ts +3 -0
  104. package/dist/tools/delete-memory/index.d.ts.map +1 -0
  105. package/dist/tools/delete-memory/index.js +24 -0
  106. package/dist/tools/delete-memory/index.js.map +1 -0
  107. package/dist/tools/export-memory/cli-parser.d.ts +2 -0
  108. package/dist/tools/export-memory/cli-parser.d.ts.map +1 -0
  109. package/dist/tools/export-memory/cli-parser.js +34 -0
  110. package/dist/tools/export-memory/cli-parser.js.map +1 -0
  111. package/dist/tools/export-memory/executor.d.ts +10 -0
  112. package/dist/tools/export-memory/executor.d.ts.map +1 -0
  113. package/dist/tools/export-memory/executor.js +41 -0
  114. package/dist/tools/export-memory/executor.js.map +1 -0
  115. package/dist/tools/export-memory/index.d.ts +4 -0
  116. package/dist/tools/export-memory/index.d.ts.map +1 -0
  117. package/dist/tools/export-memory/index.js +99 -0
  118. package/dist/tools/export-memory/index.js.map +1 -0
  119. package/dist/tools/import-memory/cli-parser.d.ts +2 -0
  120. package/dist/tools/import-memory/cli-parser.d.ts.map +1 -0
  121. package/dist/tools/import-memory/cli-parser.js +25 -0
  122. package/dist/tools/import-memory/cli-parser.js.map +1 -0
  123. package/dist/tools/import-memory/executor.d.ts +8 -0
  124. package/dist/tools/import-memory/executor.d.ts.map +1 -0
  125. package/dist/tools/import-memory/executor.js +31 -0
  126. package/dist/tools/import-memory/executor.js.map +1 -0
  127. package/dist/tools/import-memory/index.d.ts +4 -0
  128. package/dist/tools/import-memory/index.d.ts.map +1 -0
  129. package/dist/tools/import-memory/index.js +70 -0
  130. package/dist/tools/import-memory/index.js.map +1 -0
  131. package/dist/tools/index.d.ts +14 -0
  132. package/dist/tools/index.d.ts.map +1 -0
  133. package/dist/tools/index.js +48 -0
  134. package/dist/tools/index.js.map +1 -0
  135. package/dist/tools/memory-graphql/cli-parser.d.ts +6 -0
  136. package/dist/tools/memory-graphql/cli-parser.d.ts.map +1 -0
  137. package/dist/tools/memory-graphql/cli-parser.js +24 -0
  138. package/dist/tools/memory-graphql/cli-parser.js.map +1 -0
  139. package/dist/tools/memory-graphql/executor.d.ts +18 -0
  140. package/dist/tools/memory-graphql/executor.d.ts.map +1 -0
  141. package/dist/tools/memory-graphql/executor.js +53 -0
  142. package/dist/tools/memory-graphql/executor.js.map +1 -0
  143. package/dist/tools/memory-graphql/index.d.ts +3 -0
  144. package/dist/tools/memory-graphql/index.d.ts.map +1 -0
  145. package/dist/tools/memory-graphql/index.js +73 -0
  146. package/dist/tools/memory-graphql/index.js.map +1 -0
  147. package/dist/tools/memory-stats/cli-parser.d.ts +2 -0
  148. package/dist/tools/memory-stats/cli-parser.d.ts.map +1 -0
  149. package/dist/tools/memory-stats/cli-parser.js +8 -0
  150. package/dist/tools/memory-stats/cli-parser.js.map +1 -0
  151. package/dist/tools/memory-stats/executor.d.ts +4 -0
  152. package/dist/tools/memory-stats/executor.d.ts.map +1 -0
  153. package/dist/tools/memory-stats/executor.js +4 -0
  154. package/dist/tools/memory-stats/executor.js.map +1 -0
  155. package/dist/tools/memory-stats/index.d.ts +3 -0
  156. package/dist/tools/memory-stats/index.d.ts.map +1 -0
  157. package/dist/tools/memory-stats/index.js +15 -0
  158. package/dist/tools/memory-stats/index.js.map +1 -0
  159. package/dist/tools/search-memory/cli-parser.d.ts +2 -0
  160. package/dist/tools/search-memory/cli-parser.d.ts.map +1 -0
  161. package/dist/tools/search-memory/cli-parser.js +56 -0
  162. package/dist/tools/search-memory/cli-parser.js.map +1 -0
  163. package/dist/tools/search-memory/executor.d.ts +36 -0
  164. package/dist/tools/search-memory/executor.d.ts.map +1 -0
  165. package/dist/tools/search-memory/executor.js +83 -0
  166. package/dist/tools/search-memory/executor.js.map +1 -0
  167. package/dist/tools/search-memory/index.d.ts +3 -0
  168. package/dist/tools/search-memory/index.d.ts.map +1 -0
  169. package/dist/tools/search-memory/index.js +89 -0
  170. package/dist/tools/search-memory/index.js.map +1 -0
  171. package/dist/tools/store-memory/cli-parser.d.ts +2 -0
  172. package/dist/tools/store-memory/cli-parser.d.ts.map +1 -0
  173. package/dist/tools/store-memory/cli-parser.js +21 -0
  174. package/dist/tools/store-memory/cli-parser.js.map +1 -0
  175. package/dist/tools/store-memory/executor.d.ts +16 -0
  176. package/dist/tools/store-memory/executor.d.ts.map +1 -0
  177. package/dist/tools/store-memory/executor.js +100 -0
  178. package/dist/tools/store-memory/executor.js.map +1 -0
  179. package/dist/tools/store-memory/index.d.ts +3 -0
  180. package/dist/tools/store-memory/index.d.ts.map +1 -0
  181. package/dist/tools/store-memory/index.js +68 -0
  182. package/dist/tools/store-memory/index.js.map +1 -0
  183. package/dist/tools/sync-memory/cli-parser.d.ts +1 -0
  184. package/dist/tools/sync-memory/cli-parser.d.ts.map +1 -0
  185. package/dist/tools/sync-memory/cli-parser.js +2 -0
  186. package/dist/tools/sync-memory/cli-parser.js.map +1 -0
  187. package/dist/tools/sync-memory/executor.d.ts +1 -0
  188. package/dist/tools/sync-memory/executor.d.ts.map +1 -0
  189. package/dist/tools/sync-memory/executor.js +2 -0
  190. package/dist/tools/sync-memory/executor.js.map +1 -0
  191. package/dist/tools/sync-memory/index.d.ts +1 -0
  192. package/dist/tools/sync-memory/index.d.ts.map +1 -0
  193. package/dist/tools/sync-memory/index.js +2 -0
  194. package/dist/tools/sync-memory/index.js.map +1 -0
  195. package/dist/tools/update-memory/cli-parser.d.ts +2 -0
  196. package/dist/tools/update-memory/cli-parser.d.ts.map +1 -0
  197. package/dist/tools/update-memory/cli-parser.js +17 -0
  198. package/dist/tools/update-memory/cli-parser.js.map +1 -0
  199. package/dist/tools/update-memory/executor.d.ts +16 -0
  200. package/dist/tools/update-memory/executor.d.ts.map +1 -0
  201. package/dist/tools/update-memory/executor.js +59 -0
  202. package/dist/tools/update-memory/executor.js.map +1 -0
  203. package/dist/tools/update-memory/index.d.ts +3 -0
  204. package/dist/tools/update-memory/index.d.ts.map +1 -0
  205. package/dist/tools/update-memory/index.js +30 -0
  206. package/dist/tools/update-memory/index.js.map +1 -0
  207. package/dist/transports/streamable-http.d.ts +38 -0
  208. package/dist/transports/streamable-http.d.ts.map +1 -0
  209. package/dist/transports/streamable-http.js +209 -0
  210. package/dist/transports/streamable-http.js.map +1 -0
  211. package/dist/types/tools.d.ts +79 -0
  212. package/dist/types/tools.d.ts.map +1 -0
  213. package/dist/types/tools.js +3 -0
  214. package/dist/types/tools.js.map +1 -0
  215. package/dist/utils/cli-parser.d.ts +12 -0
  216. package/dist/utils/cli-parser.d.ts.map +1 -0
  217. package/dist/utils/cli-parser.js +43 -0
  218. package/dist/utils/cli-parser.js.map +1 -0
  219. package/dist/utils/config.d.ts +95 -0
  220. package/dist/utils/config.d.ts.map +1 -0
  221. package/dist/utils/config.js +176 -0
  222. package/dist/utils/config.js.map +1 -0
  223. package/dist/utils/db-integrity-check.d.ts +22 -0
  224. package/dist/utils/db-integrity-check.d.ts.map +1 -0
  225. package/dist/utils/db-integrity-check.js +69 -0
  226. package/dist/utils/db-integrity-check.js.map +1 -0
  227. package/dist/utils/debug.d.ts +25 -0
  228. package/dist/utils/debug.d.ts.map +1 -0
  229. package/dist/utils/debug.js +67 -0
  230. package/dist/utils/debug.js.map +1 -0
  231. package/dist/utils/help-generator.d.ts +18 -0
  232. package/dist/utils/help-generator.d.ts.map +1 -0
  233. package/dist/utils/help-generator.js +81 -0
  234. package/dist/utils/help-generator.js.map +1 -0
  235. package/dist/utils/json-parser.d.ts +12 -0
  236. package/dist/utils/json-parser.d.ts.map +1 -0
  237. package/dist/utils/json-parser.js +52 -0
  238. package/dist/utils/json-parser.js.map +1 -0
  239. package/dist/utils/mcp-config.d.ts +12 -0
  240. package/dist/utils/mcp-config.d.ts.map +1 -0
  241. package/dist/utils/mcp-config.js +64 -0
  242. package/dist/utils/mcp-config.js.map +1 -0
  243. package/dist/web-server.d.ts +3 -0
  244. package/dist/web-server.d.ts.map +1 -0
  245. package/dist/web-server.js +265 -0
  246. package/dist/web-server.js.map +1 -0
  247. package/package.json +75 -0
@@ -0,0 +1,209 @@
1
+ /**
2
+ * StreamableHTTPServerTransport - MCP transport over HTTP
3
+ *
4
+ * Implements the MCP Server transport interface using HTTP instead of stdio.
5
+ * Properly handles the async nature of MCP over synchronous HTTP.
6
+ */
7
+ import { createServer } from 'http';
8
+ import { debugLog } from '../utils/debug.js';
9
+ export class StreamableHTTPServerTransport {
10
+ port;
11
+ host;
12
+ timeout;
13
+ httpServer = null;
14
+ // Map request IDs to their response handlers
15
+ pendingResponses = new Map();
16
+ // Transport interface properties
17
+ onmessage;
18
+ onclose;
19
+ onerror;
20
+ constructor(options = {}) {
21
+ this.port = options.port || 3000;
22
+ this.host = options.host || 'localhost';
23
+ this.timeout = options.timeout || 30000; // 30 second default
24
+ }
25
+ async start() {
26
+ if (this.httpServer) {
27
+ throw new Error('Server already started');
28
+ }
29
+ return new Promise((resolve, reject) => {
30
+ this.httpServer = createServer(this.handleRequest.bind(this));
31
+ this.httpServer.once('error', (error) => {
32
+ this.httpServer = null;
33
+ if (error.code === 'EADDRINUSE') {
34
+ reject(new Error(`Port ${this.port} is already in use`));
35
+ }
36
+ else {
37
+ reject(error);
38
+ }
39
+ });
40
+ this.httpServer.once('listening', () => {
41
+ console.log(`✅ HTTP MCP Transport listening on http://${this.host}:${this.port}/mcp`);
42
+ resolve();
43
+ });
44
+ this.httpServer.listen(this.port, this.host);
45
+ });
46
+ }
47
+ async close() {
48
+ // Clear all pending responses
49
+ for (const [id, pending] of this.pendingResponses) {
50
+ clearTimeout(pending.timer);
51
+ pending.resolve({
52
+ jsonrpc: '2.0',
53
+ error: { code: -32603, message: 'Server shutting down' },
54
+ id
55
+ });
56
+ }
57
+ this.pendingResponses.clear();
58
+ return new Promise((resolve) => {
59
+ if (this.httpServer) {
60
+ this.httpServer.close(() => {
61
+ console.log('✓ HTTP MCP Transport closed');
62
+ resolve();
63
+ });
64
+ }
65
+ else {
66
+ resolve();
67
+ }
68
+ });
69
+ }
70
+ /**
71
+ * Send a message (response) back to the waiting HTTP request
72
+ */
73
+ async send(message) {
74
+ debugLog('[HTTP Transport] Sending message:', message);
75
+ // Check if this is a response to a pending request
76
+ if ('id' in message && message.id !== null && message.id !== undefined) {
77
+ const pending = this.pendingResponses.get(message.id);
78
+ if (pending) {
79
+ clearTimeout(pending.timer);
80
+ this.pendingResponses.delete(message.id);
81
+ pending.resolve(message);
82
+ }
83
+ else {
84
+ debugLog('[HTTP Transport] No pending request for response:', message.id);
85
+ }
86
+ }
87
+ // Notifications don't need handling in HTTP context
88
+ }
89
+ async handleRequest(req, res) {
90
+ // Add CORS headers
91
+ res.setHeader('Access-Control-Allow-Origin', '*');
92
+ res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
93
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
94
+ // Handle OPTIONS requests
95
+ if (req.method === 'OPTIONS') {
96
+ res.writeHead(200);
97
+ res.end();
98
+ return;
99
+ }
100
+ // Health check endpoint
101
+ if (req.url === '/health' && req.method === 'GET') {
102
+ this.sendJSON(res, 200, { status: 'ok', transport: 'http' });
103
+ return;
104
+ }
105
+ // MCP protocol endpoint
106
+ if (req.url === '/mcp' && req.method === 'POST') {
107
+ await this.handleMCPRequest(req, res);
108
+ return;
109
+ }
110
+ // Unknown endpoint
111
+ this.sendJSON(res, 404, { error: 'Not found' });
112
+ }
113
+ async handleMCPRequest(req, res) {
114
+ try {
115
+ const body = await this.readBody(req);
116
+ const request = this.parseRequest(body);
117
+ if (!request) {
118
+ this.sendError(res, 400, -32700, 'Parse error');
119
+ return;
120
+ }
121
+ debugLog('[HTTP Transport] Received request:', request);
122
+ // Handle based on whether it's a request or notification
123
+ if ('id' in request && request.id !== null) {
124
+ // Request - expects a response
125
+ const response = await this.waitForResponse(request);
126
+ this.sendJSON(res, 200, response);
127
+ }
128
+ else {
129
+ // Notification - no response expected
130
+ if (this.onmessage) {
131
+ this.onmessage(request);
132
+ }
133
+ res.writeHead(202);
134
+ res.end();
135
+ }
136
+ }
137
+ catch (error) {
138
+ debugLog('[HTTP Transport] Request error:', error);
139
+ if (!res.headersSent) {
140
+ this.sendError(res, 500, -32603, error.message || 'Internal server error');
141
+ }
142
+ }
143
+ }
144
+ async waitForResponse(request) {
145
+ return new Promise((resolve) => {
146
+ // Type narrowing - we know this request has an id because we checked before calling this method
147
+ if (!('id' in request) || request.id === null || request.id === undefined) {
148
+ resolve({
149
+ jsonrpc: '2.0',
150
+ error: { code: -32600, message: 'Invalid request - missing id' }
151
+ });
152
+ return;
153
+ }
154
+ const id = request.id;
155
+ // Set up timeout
156
+ const timer = setTimeout(() => {
157
+ this.pendingResponses.delete(id);
158
+ resolve({
159
+ jsonrpc: '2.0',
160
+ error: { code: -32603, message: 'Request timeout' },
161
+ id
162
+ });
163
+ }, this.timeout);
164
+ // Store the response handler
165
+ this.pendingResponses.set(id, { resolve, timer });
166
+ // Process the request
167
+ if (this.onmessage) {
168
+ this.onmessage(request);
169
+ }
170
+ });
171
+ }
172
+ async readBody(req) {
173
+ return new Promise((resolve, reject) => {
174
+ let body = '';
175
+ req.on('data', (chunk) => {
176
+ body += chunk.toString('utf-8');
177
+ // Prevent body from growing too large (1MB limit)
178
+ if (body.length > 1024 * 1024) {
179
+ req.removeAllListeners();
180
+ reject(new Error('Payload too large'));
181
+ }
182
+ });
183
+ req.on('end', () => resolve(body));
184
+ req.on('error', reject);
185
+ });
186
+ }
187
+ parseRequest(body) {
188
+ try {
189
+ return JSON.parse(body);
190
+ }
191
+ catch {
192
+ return null;
193
+ }
194
+ }
195
+ // Helper methods
196
+ sendJSON(res, statusCode, data) {
197
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
198
+ res.end(JSON.stringify(data));
199
+ }
200
+ sendError(res, statusCode, code, message, id = null) {
201
+ this.sendJSON(res, statusCode, {
202
+ jsonrpc: '2.0',
203
+ error: { code, message },
204
+ id
205
+ });
206
+ }
207
+ }
208
+ export default StreamableHTTPServerTransport;
209
+ //# sourceMappingURL=streamable-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamable-http.js","sourceRoot":"","sources":["../../src/transports/streamable-http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import type { MemoryService } from '../services/memory-service.js';
2
+ export interface ToolDefinition {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ type: 'object';
7
+ properties: Record<string, any>;
8
+ required?: string[];
9
+ };
10
+ }
11
+ export interface ToolContext {
12
+ memoryService: MemoryService;
13
+ config: Record<string, any>;
14
+ }
15
+ export interface ToolHandler {
16
+ (args: any, context: ToolContext): Promise<any>;
17
+ }
18
+ export interface CliParser {
19
+ (args: string[]): any;
20
+ }
21
+ export interface ToolCliMetadata {
22
+ positionalArgs?: {
23
+ name: string;
24
+ description: string;
25
+ required?: boolean;
26
+ }[];
27
+ options?: {
28
+ name: string;
29
+ description: string;
30
+ hasValue?: boolean;
31
+ example?: string;
32
+ }[];
33
+ examples?: string[];
34
+ }
35
+ export interface Tool {
36
+ definition: ToolDefinition;
37
+ handler: ToolHandler;
38
+ cliParser?: CliParser;
39
+ cliMetadata?: ToolCliMetadata;
40
+ }
41
+ export interface ExportFilters {
42
+ tags?: string[];
43
+ startDate?: Date;
44
+ endDate?: Date;
45
+ limit?: number;
46
+ }
47
+ export interface ImportOptions {
48
+ skipDuplicates?: boolean;
49
+ preserveTimestamps?: boolean;
50
+ preserveIds?: boolean;
51
+ }
52
+ export interface ImportResult {
53
+ imported: number;
54
+ skipped: number;
55
+ errors: Array<{
56
+ memory: any;
57
+ error: string;
58
+ }>;
59
+ }
60
+ export interface ExportFormat {
61
+ exportedAt: string;
62
+ exportVersion: string;
63
+ source?: string;
64
+ totalMemories: number;
65
+ memories: ExportedMemory[];
66
+ }
67
+ export interface ExportedMemory {
68
+ id: number;
69
+ content: string;
70
+ tags: string[];
71
+ createdAt: string;
72
+ hash: string;
73
+ relationships?: Array<{
74
+ relatedMemoryHash: string;
75
+ relatedMemoryId?: number;
76
+ relationshipType: string;
77
+ }>;
78
+ }
79
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/types/tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,EAAE,CAAC;IACJ,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,EAAE,CAAC;IACJ,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAGD,MAAM,WAAW,IAAI;IACnB,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAGD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,KAAK,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;CACJ"}
@@ -0,0 +1,3 @@
1
+ // Common tool interfaces and types
2
+ export {};
3
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/types/tools.ts"],"names":[],"mappings":"AAAA,mCAAmC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Generic CLI argument parser utility
3
+ */
4
+ export interface ParsedArgs {
5
+ [key: string]: string | boolean | number | undefined;
6
+ }
7
+ /**
8
+ * Parse command line arguments into structured format
9
+ * Handles flags (--flag) and key-value pairs (--key value)
10
+ */
11
+ export declare function parseCommandLineArgs(args: string[]): ParsedArgs;
12
+ //# sourceMappingURL=cli-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-parser.d.ts","sourceRoot":"","sources":["../../src/utils/cli-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;CACxD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAmC/D"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Generic CLI argument parser utility
3
+ */
4
+ /**
5
+ * Parse command line arguments into structured format
6
+ * Handles flags (--flag) and key-value pairs (--key value)
7
+ */
8
+ export function parseCommandLineArgs(args) {
9
+ const parsed = {};
10
+ let i = 0; // Start from index 0 since args are already filtered
11
+ while (i < args.length) {
12
+ const arg = args[i];
13
+ if (arg.startsWith('--')) {
14
+ const flagName = arg.slice(2).replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
15
+ if (i + 1 < args.length && !args[i + 1].startsWith('--')) {
16
+ const value = args[i + 1];
17
+ // Handle boolean strings explicitly
18
+ const lowerValue = value.toLowerCase();
19
+ if (lowerValue === 'true') {
20
+ parsed[flagName] = true;
21
+ }
22
+ else if (lowerValue === 'false') {
23
+ parsed[flagName] = false;
24
+ }
25
+ else {
26
+ // Keep as string - let tool-specific parsers handle type conversion
27
+ parsed[flagName] = value;
28
+ }
29
+ i += 2;
30
+ }
31
+ else {
32
+ // Flag without value
33
+ parsed[flagName] = true;
34
+ i++;
35
+ }
36
+ }
37
+ else {
38
+ i++;
39
+ }
40
+ }
41
+ return parsed;
42
+ }
43
+ //# sourceMappingURL=cli-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-parser.js","sourceRoot":"","sources":["../../src/utils/cli-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAc;IAC/C,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,qDAAqD;IAEhE,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YAExF,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAE1B,oCAAoC;gBACpC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;gBACvC,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;oBACxB,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;gBAC5B,CAAC;qBAAM,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;oBAChC,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACJ,oEAAoE;oBACpE,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;gBAC7B,CAAC;gBACD,CAAC,IAAI,CAAC,CAAC;YACX,CAAC;iBAAM,CAAC;gBACJ,qBAAqB;gBACrB,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;gBACxB,CAAC,EAAE,CAAC;YACR,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,CAAC,EAAE,CAAC;QACR,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Configuration utilities for simple-memory-mcp
3
+ * Provides sensible defaults with config file and environment variable overrides
4
+ *
5
+ * Resolution order (highest priority first):
6
+ * 1. Environment variables (per-client overrides)
7
+ * 2. ~/.simple-memory/config.json (user config file)
8
+ * 3. Sensible defaults
9
+ */
10
+ /**
11
+ * Configuration schema for simple-memory
12
+ */
13
+ export interface SimpleMemoryConfig {
14
+ /** Path to the database file */
15
+ database?: string;
16
+ /** Backup settings */
17
+ backup?: {
18
+ /** Path to backup directory */
19
+ path?: string;
20
+ /** Minutes between backups (0 = every write) */
21
+ interval?: number;
22
+ /** Number of backups to keep */
23
+ keep?: number;
24
+ /** Source identifier (e.g., "work", "personal") */
25
+ source?: string;
26
+ };
27
+ /** Cloud storage safe mode (uses DELETE journal instead of WAL) */
28
+ cloudSafe?: boolean;
29
+ /** Enable debug logging */
30
+ debug?: boolean;
31
+ }
32
+ /**
33
+ * Default directory for simple-memory data
34
+ * ~/.simple-memory/ on all platforms
35
+ */
36
+ export declare function getDefaultDir(): string;
37
+ /**
38
+ * Get the path to the config file
39
+ */
40
+ export declare function getConfigPath(): string;
41
+ /**
42
+ * Load configuration from ~/.simple-memory/config.json
43
+ * Returns empty object if file doesn't exist
44
+ */
45
+ export declare function loadConfigFile(): SimpleMemoryConfig;
46
+ /**
47
+ * Clear the config cache (useful for testing or after config changes)
48
+ */
49
+ export declare function clearConfigCache(): void;
50
+ /**
51
+ * Get the full resolved configuration
52
+ * Merges: defaults < config.json < environment variables
53
+ */
54
+ export declare function getConfig(): Required<SimpleMemoryConfig>;
55
+ /**
56
+ * Get the database path with sensible defaults.
57
+ *
58
+ * Resolution order:
59
+ * 1. MEMORY_DB environment variable (per-client override)
60
+ * 2. config.json database setting
61
+ * 3. ~/.simple-memory/memory.db (default)
62
+ *
63
+ * @returns Object with path and whether it's the default location
64
+ */
65
+ export declare function getDatabasePath(): {
66
+ path: string;
67
+ isDefault: boolean;
68
+ };
69
+ /**
70
+ * Get backup configuration
71
+ *
72
+ * Resolution order:
73
+ * 1. Environment variables (per-client override)
74
+ * 2. config.json backup settings
75
+ * 3. Defaults (backups disabled)
76
+ */
77
+ export declare function getBackupConfig(): {
78
+ path?: string;
79
+ interval: number;
80
+ keep: number;
81
+ source?: string;
82
+ };
83
+ /**
84
+ * Ensure the default config directory exists
85
+ */
86
+ export declare function ensureConfigDir(): string;
87
+ /**
88
+ * Create a default config file with comments
89
+ * Only creates if it doesn't exist
90
+ */
91
+ export declare function initConfigFile(): {
92
+ path: string;
93
+ created: boolean;
94
+ };
95
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,sBAAsB;IACtB,MAAM,CAAC,EAAE;QACP,+BAA+B;QAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,gDAAgD;QAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,gCAAgC;QAChC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,mDAAmD;QACnD,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IAEF,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAKD;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,kBAAkB,CAsBnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,QAAQ,CAAC,kBAAkB,CAAC,CAcxD;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAiBtE;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,IAAI;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CASpG;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAMxC;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CA4CnE"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Configuration utilities for simple-memory-mcp
3
+ * Provides sensible defaults with config file and environment variable overrides
4
+ *
5
+ * Resolution order (highest priority first):
6
+ * 1. Environment variables (per-client overrides)
7
+ * 2. ~/.simple-memory/config.json (user config file)
8
+ * 3. Sensible defaults
9
+ */
10
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
11
+ import { join } from 'path';
12
+ import { homedir } from 'os';
13
+ import { debugLog } from './debug.js';
14
+ // Cached config to avoid repeated file reads
15
+ let cachedConfig = null;
16
+ /**
17
+ * Default directory for simple-memory data
18
+ * ~/.simple-memory/ on all platforms
19
+ */
20
+ export function getDefaultDir() {
21
+ return join(homedir(), '.simple-memory');
22
+ }
23
+ /**
24
+ * Get the path to the config file
25
+ */
26
+ export function getConfigPath() {
27
+ return join(getDefaultDir(), 'config.json');
28
+ }
29
+ /**
30
+ * Load configuration from ~/.simple-memory/config.json
31
+ * Returns empty object if file doesn't exist
32
+ */
33
+ export function loadConfigFile() {
34
+ if (cachedConfig !== null) {
35
+ return cachedConfig;
36
+ }
37
+ const configPath = getConfigPath();
38
+ if (!existsSync(configPath)) {
39
+ cachedConfig = {};
40
+ return cachedConfig;
41
+ }
42
+ try {
43
+ const content = readFileSync(configPath, 'utf-8');
44
+ cachedConfig = JSON.parse(content);
45
+ debugLog(`Loaded config from: ${configPath}`);
46
+ return cachedConfig;
47
+ }
48
+ catch (error) {
49
+ debugLog(`Warning: Could not read config file: ${error}`);
50
+ cachedConfig = {};
51
+ return cachedConfig;
52
+ }
53
+ }
54
+ /**
55
+ * Clear the config cache (useful for testing or after config changes)
56
+ */
57
+ export function clearConfigCache() {
58
+ cachedConfig = null;
59
+ }
60
+ /**
61
+ * Get the full resolved configuration
62
+ * Merges: defaults < config.json < environment variables
63
+ */
64
+ export function getConfig() {
65
+ const fileConfig = loadConfigFile();
66
+ const defaultDir = getDefaultDir();
67
+ return {
68
+ database: process.env.MEMORY_DB || fileConfig.database || join(defaultDir, 'memory.db'),
69
+ backup: {
70
+ path: process.env.MEMORY_BACKUP_PATH || fileConfig.backup?.path || undefined,
71
+ interval: parseInt(process.env.MEMORY_BACKUP_INTERVAL || '', 10) || fileConfig.backup?.interval || 0,
72
+ keep: parseInt(process.env.MEMORY_BACKUP_KEEP || '', 10) || fileConfig.backup?.keep || 10,
73
+ },
74
+ cloudSafe: process.env.MEMORY_CLOUD_SAFE === 'true' || fileConfig.cloudSafe || false,
75
+ debug: process.env.MEMORY_DEBUG === 'true' || process.env.DEBUG === 'true' || fileConfig.debug || false,
76
+ };
77
+ }
78
+ /**
79
+ * Get the database path with sensible defaults.
80
+ *
81
+ * Resolution order:
82
+ * 1. MEMORY_DB environment variable (per-client override)
83
+ * 2. config.json database setting
84
+ * 3. ~/.simple-memory/memory.db (default)
85
+ *
86
+ * @returns Object with path and whether it's the default location
87
+ */
88
+ export function getDatabasePath() {
89
+ // 1. Explicit env var (per-client override)
90
+ if (process.env.MEMORY_DB) {
91
+ return { path: process.env.MEMORY_DB, isDefault: false };
92
+ }
93
+ // 2. Config file
94
+ const fileConfig = loadConfigFile();
95
+ if (fileConfig.database) {
96
+ return { path: fileConfig.database, isDefault: false };
97
+ }
98
+ // 3. Sensible default - always the same predictable path
99
+ const defaultDir = getDefaultDir();
100
+ const defaultPath = join(defaultDir, 'memory.db');
101
+ return { path: defaultPath, isDefault: true };
102
+ }
103
+ /**
104
+ * Get backup configuration
105
+ *
106
+ * Resolution order:
107
+ * 1. Environment variables (per-client override)
108
+ * 2. config.json backup settings
109
+ * 3. Defaults (backups disabled)
110
+ */
111
+ export function getBackupConfig() {
112
+ const fileConfig = loadConfigFile();
113
+ return {
114
+ path: process.env.MEMORY_BACKUP_PATH || fileConfig.backup?.path,
115
+ interval: parseInt(process.env.MEMORY_BACKUP_INTERVAL || '', 10) || fileConfig.backup?.interval || 0,
116
+ keep: parseInt(process.env.MEMORY_BACKUP_KEEP || '', 10) || fileConfig.backup?.keep || 10,
117
+ source: process.env.MEMORY_BACKUP_SOURCE || fileConfig.backup?.source,
118
+ };
119
+ }
120
+ /**
121
+ * Ensure the default config directory exists
122
+ */
123
+ export function ensureConfigDir() {
124
+ const dir = getDefaultDir();
125
+ if (!existsSync(dir)) {
126
+ mkdirSync(dir, { recursive: true });
127
+ }
128
+ return dir;
129
+ }
130
+ /**
131
+ * Create a default config file with comments
132
+ * Only creates if it doesn't exist
133
+ */
134
+ export function initConfigFile() {
135
+ ensureConfigDir();
136
+ const configPath = getConfigPath();
137
+ if (existsSync(configPath)) {
138
+ return { path: configPath, created: false };
139
+ }
140
+ const defaultConfig = {
141
+ // Commented examples in the actual file
142
+ };
143
+ // Write a nicely formatted config with descriptive fields
144
+ const configContent = `{
145
+ "_comment": "Simple Memory MCP Configuration - settings apply to CLI, MCP clients, and all consumers",
146
+ "_docs": "https://github.com/chrisribe/simple-memory-mcp#configuration",
147
+
148
+ "_database_comment": "Database path (default: ~/.simple-memory/memory.db)",
149
+ "database": null,
150
+
151
+ "_backup_comment": "Backup settings: path=directory, interval=minutes between backups (0=every write), keep=number to retain, source=identifier",
152
+ "backup": {
153
+ "path": null,
154
+ "interval": 0,
155
+ "keep": 10,
156
+ "source": null
157
+ },
158
+
159
+ "_cloudSafe_comment": "Use DELETE journal instead of WAL for cloud storage (OneDrive/Dropbox) - slower but safer",
160
+ "cloudSafe": false,
161
+
162
+ "_debug_comment": "Enable debug logging",
163
+ "debug": false
164
+ }
165
+ `;
166
+ try {
167
+ writeFileSync(configPath, configContent, 'utf-8');
168
+ debugLog(`Created default config file: ${configPath}`);
169
+ return { path: configPath, created: true };
170
+ }
171
+ catch (error) {
172
+ debugLog(`Warning: Could not create config file: ${error}`);
173
+ return { path: configPath, created: false };
174
+ }
175
+ }
176
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}