@synth-coder/memhub 0.1.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 (104) hide show
  1. package/.eslintrc.cjs +46 -0
  2. package/.github/workflows/ci.yml +74 -0
  3. package/.iflow/commands/opsx-apply.md +152 -0
  4. package/.iflow/commands/opsx-archive.md +157 -0
  5. package/.iflow/commands/opsx-explore.md +173 -0
  6. package/.iflow/commands/opsx-propose.md +106 -0
  7. package/.iflow/skills/openspec-apply-change/SKILL.md +156 -0
  8. package/.iflow/skills/openspec-archive-change/SKILL.md +114 -0
  9. package/.iflow/skills/openspec-explore/SKILL.md +288 -0
  10. package/.iflow/skills/openspec-propose/SKILL.md +110 -0
  11. package/.prettierrc +11 -0
  12. package/README.md +171 -0
  13. package/README.zh-CN.md +169 -0
  14. package/dist/src/contracts/index.d.ts +7 -0
  15. package/dist/src/contracts/index.d.ts.map +1 -0
  16. package/dist/src/contracts/index.js +10 -0
  17. package/dist/src/contracts/index.js.map +1 -0
  18. package/dist/src/contracts/mcp.d.ts +194 -0
  19. package/dist/src/contracts/mcp.d.ts.map +1 -0
  20. package/dist/src/contracts/mcp.js +112 -0
  21. package/dist/src/contracts/mcp.js.map +1 -0
  22. package/dist/src/contracts/schemas.d.ts +1153 -0
  23. package/dist/src/contracts/schemas.d.ts.map +1 -0
  24. package/dist/src/contracts/schemas.js +246 -0
  25. package/dist/src/contracts/schemas.js.map +1 -0
  26. package/dist/src/contracts/types.d.ts +328 -0
  27. package/dist/src/contracts/types.d.ts.map +1 -0
  28. package/dist/src/contracts/types.js +30 -0
  29. package/dist/src/contracts/types.js.map +1 -0
  30. package/dist/src/index.d.ts +8 -0
  31. package/dist/src/index.d.ts.map +1 -0
  32. package/dist/src/index.js +8 -0
  33. package/dist/src/index.js.map +1 -0
  34. package/dist/src/server/index.d.ts +5 -0
  35. package/dist/src/server/index.d.ts.map +1 -0
  36. package/dist/src/server/index.js +5 -0
  37. package/dist/src/server/index.js.map +1 -0
  38. package/dist/src/server/mcp-server.d.ts +80 -0
  39. package/dist/src/server/mcp-server.d.ts.map +1 -0
  40. package/dist/src/server/mcp-server.js +263 -0
  41. package/dist/src/server/mcp-server.js.map +1 -0
  42. package/dist/src/services/index.d.ts +5 -0
  43. package/dist/src/services/index.d.ts.map +1 -0
  44. package/dist/src/services/index.js +5 -0
  45. package/dist/src/services/index.js.map +1 -0
  46. package/dist/src/services/memory-service.d.ts +105 -0
  47. package/dist/src/services/memory-service.d.ts.map +1 -0
  48. package/dist/src/services/memory-service.js +447 -0
  49. package/dist/src/services/memory-service.js.map +1 -0
  50. package/dist/src/storage/frontmatter-parser.d.ts +69 -0
  51. package/dist/src/storage/frontmatter-parser.d.ts.map +1 -0
  52. package/dist/src/storage/frontmatter-parser.js +207 -0
  53. package/dist/src/storage/frontmatter-parser.js.map +1 -0
  54. package/dist/src/storage/index.d.ts +6 -0
  55. package/dist/src/storage/index.d.ts.map +1 -0
  56. package/dist/src/storage/index.js +6 -0
  57. package/dist/src/storage/index.js.map +1 -0
  58. package/dist/src/storage/markdown-storage.d.ts +76 -0
  59. package/dist/src/storage/markdown-storage.d.ts.map +1 -0
  60. package/dist/src/storage/markdown-storage.js +193 -0
  61. package/dist/src/storage/markdown-storage.js.map +1 -0
  62. package/dist/src/utils/index.d.ts +5 -0
  63. package/dist/src/utils/index.d.ts.map +1 -0
  64. package/dist/src/utils/index.js +5 -0
  65. package/dist/src/utils/index.js.map +1 -0
  66. package/dist/src/utils/slugify.d.ts +24 -0
  67. package/dist/src/utils/slugify.d.ts.map +1 -0
  68. package/dist/src/utils/slugify.js +56 -0
  69. package/dist/src/utils/slugify.js.map +1 -0
  70. package/docs/architecture.md +349 -0
  71. package/docs/contracts.md +119 -0
  72. package/docs/prompt-template.md +79 -0
  73. package/docs/proposal-close-gates.md +58 -0
  74. package/docs/tool-calling-policy.md +107 -0
  75. package/package.json +53 -0
  76. package/src/contracts/index.ts +12 -0
  77. package/src/contracts/mcp.ts +303 -0
  78. package/src/contracts/schemas.ts +311 -0
  79. package/src/contracts/types.ts +414 -0
  80. package/src/index.ts +8 -0
  81. package/src/server/index.ts +5 -0
  82. package/src/server/mcp-server.ts +352 -0
  83. package/src/services/index.ts +5 -0
  84. package/src/services/memory-service.ts +548 -0
  85. package/src/storage/frontmatter-parser.ts +243 -0
  86. package/src/storage/index.ts +6 -0
  87. package/src/storage/markdown-storage.ts +236 -0
  88. package/src/utils/index.ts +5 -0
  89. package/src/utils/slugify.ts +63 -0
  90. package/test/contracts/schemas.test.ts +313 -0
  91. package/test/contracts/types.test.ts +21 -0
  92. package/test/frontmatter-parser-more.test.ts +94 -0
  93. package/test/server/mcp-server-internals.test.ts +257 -0
  94. package/test/server/mcp-server.test.ts +97 -0
  95. package/test/services/memory-service-edge.test.ts +248 -0
  96. package/test/services/memory-service.test.ts +279 -0
  97. package/test/storage/frontmatter-parser.test.ts +223 -0
  98. package/test/storage/markdown-storage.test.ts +217 -0
  99. package/test/storage/storage-edge.test.ts +238 -0
  100. package/test/utils/slugify-edge.test.ts +94 -0
  101. package/test/utils/slugify.test.ts +68 -0
  102. package/tsconfig.json +26 -0
  103. package/tsconfig.test.json +8 -0
  104. package/vitest.config.ts +27 -0
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Server exports
3
+ */
4
+ export * from './mcp-server.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Server exports
3
+ */
4
+ export * from './mcp-server.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * MCP Server - Model Context Protocol server implementation
3
+ * Communicates via stdio
4
+ */
5
+ /**
6
+ * MCP Server implementation
7
+ */
8
+ export declare class McpServer {
9
+ private readonly memoryService;
10
+ constructor();
11
+ /**
12
+ * Starts the MCP server and begins listening for requests on stdin
13
+ */
14
+ start(): void;
15
+ /**
16
+ * Handles an incoming JSON-RPC message
17
+ *
18
+ * @param message - The JSON-RPC message string
19
+ */
20
+ private handleMessage;
21
+ /**
22
+ * Handles a specific method call
23
+ *
24
+ * @param method - The method name
25
+ * @param params - The method parameters
26
+ * @returns The method result
27
+ */
28
+ private handleMethod;
29
+ /**
30
+ * Handles the initialize method
31
+ *
32
+ * @param params - Initialize parameters
33
+ * @returns Initialize result
34
+ */
35
+ private handleInitialize;
36
+ /**
37
+ * Handles tool calls
38
+ *
39
+ * @param request - Tool call request
40
+ * @returns Tool call result
41
+ */
42
+ private handleToolCall;
43
+ /**
44
+ * Handles errors and sends appropriate error response
45
+ *
46
+ * @param id - Request ID
47
+ * @param error - The error that occurred
48
+ */
49
+ private handleError;
50
+ /**
51
+ * Sends a JSON-RPC response
52
+ *
53
+ * @param id - Request ID
54
+ * @param result - Response result
55
+ */
56
+ private sendResponse;
57
+ /**
58
+ * Sends a JSON-RPC error
59
+ *
60
+ * @param id - Request ID
61
+ * @param code - Error code
62
+ * @param message - Error message
63
+ * @param data - Additional error data
64
+ */
65
+ private sendError;
66
+ /**
67
+ * Sends a message to stdout
68
+ *
69
+ * @param message - The message to send
70
+ */
71
+ private sendMessage;
72
+ /**
73
+ * Logs a message
74
+ *
75
+ * @param level - Log level
76
+ * @param message - Log message
77
+ */
78
+ private log;
79
+ }
80
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../../src/server/mcp-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyCH;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;;IAO9C;;OAEG;IACH,KAAK,IAAI,IAAI;IAqCb;;;;OAIG;YACW,aAAa;IAgC3B;;;;;;OAMG;YACW,YAAY;IAkC1B;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;;;;OAKG;YACW,cAAc;IAoD5B;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAkBnB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IASpB;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS;IAqBjB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAKnB;;;;;OAKG;IACH,OAAO,CAAC,GAAG;CAQZ"}
@@ -0,0 +1,263 @@
1
+ /**
2
+ * MCP Server - Model Context Protocol server implementation
3
+ * Communicates via stdio
4
+ */
5
+ import { readFileSync } from 'fs';
6
+ import { join, dirname } from 'path';
7
+ import { fileURLToPath } from 'url';
8
+ import { MCP_PROTOCOL_VERSION, SERVER_INFO, TOOL_DEFINITIONS, MCP_METHODS, ERROR_CODES, } from '../contracts/mcp.js';
9
+ import { ErrorCode } from '../contracts/types.js';
10
+ import { MemoryService, ServiceError } from '../services/memory-service.js';
11
+ import { MemoryLoadInputSchema, MemoryUpdateInputV2Schema, } from '../contracts/schemas.js';
12
+ // Get package version
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = dirname(__filename);
15
+ const packageJson = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));
16
+ /**
17
+ * MCP Server implementation
18
+ */
19
+ export class McpServer {
20
+ memoryService;
21
+ constructor() {
22
+ const storagePath = process.env.MEMHUB_STORAGE_PATH || './memories';
23
+ this.memoryService = new MemoryService({ storagePath });
24
+ }
25
+ /**
26
+ * Starts the MCP server and begins listening for requests on stdin
27
+ */
28
+ start() {
29
+ this.log('info', 'MemHub MCP Server starting...');
30
+ process.stdin.setEncoding('utf-8');
31
+ let buffer = '';
32
+ process.stdin.on('data', (chunk) => {
33
+ buffer += chunk;
34
+ // Process complete lines (JSON-RPC messages)
35
+ const lines = buffer.split('\n');
36
+ buffer = lines.pop() || ''; // Keep incomplete line in buffer
37
+ for (const line of lines) {
38
+ if (line.trim()) {
39
+ void this.handleMessage(line.trim());
40
+ }
41
+ }
42
+ });
43
+ process.stdin.on('end', () => {
44
+ this.log('info', 'Stdin closed, shutting down...');
45
+ process.exit(0);
46
+ });
47
+ process.on('SIGINT', () => {
48
+ this.log('info', 'Received SIGINT, shutting down...');
49
+ process.exit(0);
50
+ });
51
+ process.on('SIGTERM', () => {
52
+ this.log('info', 'Received SIGTERM, shutting down...');
53
+ process.exit(0);
54
+ });
55
+ }
56
+ /**
57
+ * Handles an incoming JSON-RPC message
58
+ *
59
+ * @param message - The JSON-RPC message string
60
+ */
61
+ async handleMessage(message) {
62
+ let request = null;
63
+ try {
64
+ request = JSON.parse(message);
65
+ }
66
+ catch {
67
+ this.sendError(null, ERROR_CODES.PARSE_ERROR, 'Parse error: Invalid JSON');
68
+ return;
69
+ }
70
+ // Validate JSON-RPC request
71
+ if (request.jsonrpc !== '2.0' || !request.method) {
72
+ this.sendError(request.id ?? null, ERROR_CODES.INVALID_REQUEST, 'Invalid Request');
73
+ return;
74
+ }
75
+ try {
76
+ const result = await this.handleMethod(request.method, request.params);
77
+ // Send response (only for requests with id, not notifications)
78
+ if (request.id !== undefined) {
79
+ this.sendResponse(request.id, result);
80
+ }
81
+ }
82
+ catch (error) {
83
+ this.handleError(request.id ?? null, error);
84
+ }
85
+ }
86
+ /**
87
+ * Handles a specific method call
88
+ *
89
+ * @param method - The method name
90
+ * @param params - The method parameters
91
+ * @returns The method result
92
+ */
93
+ async handleMethod(method, params) {
94
+ switch (method) {
95
+ case MCP_METHODS.INITIALIZE:
96
+ return this.handleInitialize(params);
97
+ case MCP_METHODS.INITIALIZED:
98
+ // Notification, no response needed
99
+ this.log('info', 'Client initialized');
100
+ return null;
101
+ case MCP_METHODS.SHUTDOWN:
102
+ return null;
103
+ case MCP_METHODS.EXIT:
104
+ process.exit(0);
105
+ return null;
106
+ case MCP_METHODS.TOOLS_LIST:
107
+ return { tools: TOOL_DEFINITIONS };
108
+ case MCP_METHODS.TOOLS_CALL:
109
+ return this.handleToolCall(params);
110
+ default:
111
+ throw new ServiceError(`Method not found: ${method}`, ErrorCode.METHOD_NOT_FOUND);
112
+ }
113
+ }
114
+ /**
115
+ * Handles the initialize method
116
+ *
117
+ * @param params - Initialize parameters
118
+ * @returns Initialize result
119
+ */
120
+ handleInitialize(params) {
121
+ this.log('info', `Client initializing: ${params.clientInfo.name} v${params.clientInfo.version}`);
122
+ return {
123
+ protocolVersion: MCP_PROTOCOL_VERSION,
124
+ capabilities: {
125
+ tools: { listChanged: false },
126
+ logging: {},
127
+ },
128
+ serverInfo: {
129
+ name: SERVER_INFO.name,
130
+ version: packageJson.version || SERVER_INFO.version,
131
+ },
132
+ };
133
+ }
134
+ /**
135
+ * Handles tool calls
136
+ *
137
+ * @param request - Tool call request
138
+ * @returns Tool call result
139
+ */
140
+ async handleToolCall(request) {
141
+ const { name, arguments: args } = request;
142
+ try {
143
+ let result;
144
+ switch (name) {
145
+ case 'memory_load': {
146
+ const input = MemoryLoadInputSchema.parse(args ?? {});
147
+ result = await this.memoryService.memoryLoad(input);
148
+ break;
149
+ }
150
+ case 'memory_update': {
151
+ const input = MemoryUpdateInputV2Schema.parse(args ?? {});
152
+ result = await this.memoryService.memoryUpdate(input);
153
+ break;
154
+ }
155
+ default:
156
+ throw new ServiceError(`Unknown tool: ${name}`, ErrorCode.METHOD_NOT_FOUND);
157
+ }
158
+ return {
159
+ content: [
160
+ {
161
+ type: 'text',
162
+ text: JSON.stringify(result, null, 2),
163
+ },
164
+ ],
165
+ };
166
+ }
167
+ catch (error) {
168
+ if (error instanceof ServiceError) {
169
+ return {
170
+ content: [
171
+ {
172
+ type: 'text',
173
+ text: JSON.stringify({ error: error.message }, null, 2),
174
+ },
175
+ ],
176
+ isError: true,
177
+ };
178
+ }
179
+ // Re-throw for generic error handling
180
+ throw error;
181
+ }
182
+ }
183
+ /**
184
+ * Handles errors and sends appropriate error response
185
+ *
186
+ * @param id - Request ID
187
+ * @param error - The error that occurred
188
+ */
189
+ handleError(id, error) {
190
+ if (error instanceof ServiceError) {
191
+ this.sendError(id, error.code, error.message, error.data);
192
+ }
193
+ else if (error instanceof Error && error.name === 'ZodError') {
194
+ this.sendError(id, ERROR_CODES.INVALID_PARAMS, `Invalid parameters: ${error.message}`);
195
+ }
196
+ else {
197
+ this.sendError(id, ERROR_CODES.INTERNAL_ERROR, `Internal error: ${error instanceof Error ? error.message : 'Unknown error'}`);
198
+ }
199
+ }
200
+ /**
201
+ * Sends a JSON-RPC response
202
+ *
203
+ * @param id - Request ID
204
+ * @param result - Response result
205
+ */
206
+ sendResponse(id, result) {
207
+ const response = {
208
+ jsonrpc: '2.0',
209
+ id,
210
+ result,
211
+ };
212
+ this.sendMessage(response);
213
+ }
214
+ /**
215
+ * Sends a JSON-RPC error
216
+ *
217
+ * @param id - Request ID
218
+ * @param code - Error code
219
+ * @param message - Error message
220
+ * @param data - Additional error data
221
+ */
222
+ sendError(id, code, message, data) {
223
+ const error = {
224
+ code,
225
+ message,
226
+ data,
227
+ };
228
+ const response = {
229
+ jsonrpc: '2.0',
230
+ id: id ?? null,
231
+ error,
232
+ };
233
+ this.sendMessage(response);
234
+ }
235
+ /**
236
+ * Sends a message to stdout
237
+ *
238
+ * @param message - The message to send
239
+ */
240
+ sendMessage(message) {
241
+ const json = JSON.stringify(message);
242
+ process.stdout.write(json + '\n');
243
+ }
244
+ /**
245
+ * Logs a message
246
+ *
247
+ * @param level - Log level
248
+ * @param message - Log message
249
+ */
250
+ log(level, message) {
251
+ const logLevel = process.env.MEMHUB_LOG_LEVEL || 'info';
252
+ const levels = { debug: 0, info: 1, warn: 2, error: 3 };
253
+ if (levels[level] >= levels[logLevel]) {
254
+ console.error(`[${level.toUpperCase()}] ${message}`);
255
+ }
256
+ }
257
+ }
258
+ // Start server if this file is run directly
259
+ if (import.meta.url === `file://${process.argv[1]}`) {
260
+ const server = new McpServer();
261
+ server.start();
262
+ }
263
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../../src/server/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Services exports
3
+ */
4
+ export * from './memory-service.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Services exports
3
+ */
4
+ export * from './memory-service.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Memory Service - Business logic for memory operations
3
+ */
4
+ import type { Memory, CreateMemoryInput, ReadMemoryInput, UpdateMemoryInput, DeleteMemoryInput, ListMemoryInput, SearchMemoryInput, CreateResult, UpdateResult, DeleteResult, ListResult, SearchResult, GetCategoriesOutput, GetTagsOutput, MemoryLoadInput, MemoryUpdateInput, MemoryLoadOutput, MemoryUpdateOutput } from '../contracts/types.js';
5
+ import { ErrorCode } from '../contracts/types.js';
6
+ /**
7
+ * Custom error for service operations
8
+ */
9
+ export declare class ServiceError extends Error {
10
+ readonly code: ErrorCode;
11
+ readonly data?: Record<string, unknown> | undefined;
12
+ constructor(message: string, code: ErrorCode, data?: Record<string, unknown> | undefined);
13
+ }
14
+ /**
15
+ * Memory service configuration
16
+ */
17
+ export interface MemoryServiceConfig {
18
+ storagePath: string;
19
+ }
20
+ /**
21
+ * Memory service implementation
22
+ */
23
+ export declare class MemoryService {
24
+ private readonly storage;
25
+ constructor(config: MemoryServiceConfig);
26
+ /**
27
+ * Creates a new memory entry
28
+ *
29
+ * @param input - Create memory input
30
+ * @returns Create result with ID, file path, and memory object
31
+ * @throws ServiceError if creation fails
32
+ */
33
+ create(input: CreateMemoryInput): Promise<CreateResult>;
34
+ /**
35
+ * Reads a memory by ID
36
+ *
37
+ * @param input - Read memory input
38
+ * @returns Memory object
39
+ * @throws ServiceError if memory not found
40
+ */
41
+ read(input: ReadMemoryInput): Promise<{
42
+ memory: Memory;
43
+ }>;
44
+ /**
45
+ * Updates an existing memory
46
+ *
47
+ * @param input - Update memory input
48
+ * @returns Updated memory object
49
+ * @throws ServiceError if memory not found
50
+ */
51
+ update(input: UpdateMemoryInput): Promise<UpdateResult>;
52
+ /**
53
+ * Deletes a memory by ID
54
+ *
55
+ * @param input - Delete memory input
56
+ * @returns Delete result
57
+ * @throws ServiceError if memory not found
58
+ */
59
+ delete(input: DeleteMemoryInput): Promise<DeleteResult>;
60
+ /**
61
+ * Lists memories with filtering and pagination
62
+ *
63
+ * @param input - List memory input
64
+ * @returns List result with memories, total count, and hasMore flag
65
+ */
66
+ list(input: ListMemoryInput): Promise<ListResult>;
67
+ /**
68
+ * Searches memories by query
69
+ *
70
+ * @param input - Search memory input
71
+ * @returns Search results with scores and matches
72
+ */
73
+ search(input: SearchMemoryInput): Promise<{
74
+ results: SearchResult[];
75
+ total: number;
76
+ }>;
77
+ /**
78
+ * memory_load unified read API (STM-first)
79
+ */
80
+ memoryLoad(input: MemoryLoadInput): Promise<MemoryLoadOutput>;
81
+ /**
82
+ * memory_update unified write API (append/upsert)
83
+ */
84
+ memoryUpdate(input: MemoryUpdateInput): Promise<MemoryUpdateOutput>;
85
+ /**
86
+ * Gets all unique categories
87
+ *
88
+ * @returns Array of category names
89
+ */
90
+ getCategories(): Promise<GetCategoriesOutput>;
91
+ /**
92
+ * Gets all unique tags
93
+ *
94
+ * @returns Array of tag names
95
+ */
96
+ getTags(): Promise<GetTagsOutput>;
97
+ /**
98
+ * Extracts ID from file content
99
+ *
100
+ * @param content - File content
101
+ * @returns ID string
102
+ */
103
+ private extractIdFromContent;
104
+ }
105
+ //# sourceMappingURL=memory-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-service.d.ts","sourceRoot":"","sources":["../../../src/services/memory-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,MAAM,EACN,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,mBAAmB,EACnB,aAAa,EAGb,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;aAGnB,IAAI,EAAE,SAAS;aACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAF9C,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,SAAS,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAKjD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;gBAE9B,MAAM,EAAE,mBAAmB;IAIvC;;;;;;OAMG;IACG,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IA8B7D;;;;;;OAMG;IACG,IAAI,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAe/D;;;;;;OAMG;IACG,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IAqC7D;;;;;;OAMG;IACG,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IAkB7D;;;;;OAKG;IACG,IAAI,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAiFvD;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAgG3F;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0CnE;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwDzE;;;;OAIG;IACG,aAAa,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAoBnD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IAsBvC;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;CAO7B"}