@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.
- package/.eslintrc.cjs +46 -0
- package/.github/workflows/ci.yml +74 -0
- package/.iflow/commands/opsx-apply.md +152 -0
- package/.iflow/commands/opsx-archive.md +157 -0
- package/.iflow/commands/opsx-explore.md +173 -0
- package/.iflow/commands/opsx-propose.md +106 -0
- package/.iflow/skills/openspec-apply-change/SKILL.md +156 -0
- package/.iflow/skills/openspec-archive-change/SKILL.md +114 -0
- package/.iflow/skills/openspec-explore/SKILL.md +288 -0
- package/.iflow/skills/openspec-propose/SKILL.md +110 -0
- package/.prettierrc +11 -0
- package/README.md +171 -0
- package/README.zh-CN.md +169 -0
- package/dist/src/contracts/index.d.ts +7 -0
- package/dist/src/contracts/index.d.ts.map +1 -0
- package/dist/src/contracts/index.js +10 -0
- package/dist/src/contracts/index.js.map +1 -0
- package/dist/src/contracts/mcp.d.ts +194 -0
- package/dist/src/contracts/mcp.d.ts.map +1 -0
- package/dist/src/contracts/mcp.js +112 -0
- package/dist/src/contracts/mcp.js.map +1 -0
- package/dist/src/contracts/schemas.d.ts +1153 -0
- package/dist/src/contracts/schemas.d.ts.map +1 -0
- package/dist/src/contracts/schemas.js +246 -0
- package/dist/src/contracts/schemas.js.map +1 -0
- package/dist/src/contracts/types.d.ts +328 -0
- package/dist/src/contracts/types.d.ts.map +1 -0
- package/dist/src/contracts/types.js +30 -0
- package/dist/src/contracts/types.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +8 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/server/index.d.ts +5 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +5 -0
- package/dist/src/server/index.js.map +1 -0
- package/dist/src/server/mcp-server.d.ts +80 -0
- package/dist/src/server/mcp-server.d.ts.map +1 -0
- package/dist/src/server/mcp-server.js +263 -0
- package/dist/src/server/mcp-server.js.map +1 -0
- package/dist/src/services/index.d.ts +5 -0
- package/dist/src/services/index.d.ts.map +1 -0
- package/dist/src/services/index.js +5 -0
- package/dist/src/services/index.js.map +1 -0
- package/dist/src/services/memory-service.d.ts +105 -0
- package/dist/src/services/memory-service.d.ts.map +1 -0
- package/dist/src/services/memory-service.js +447 -0
- package/dist/src/services/memory-service.js.map +1 -0
- package/dist/src/storage/frontmatter-parser.d.ts +69 -0
- package/dist/src/storage/frontmatter-parser.d.ts.map +1 -0
- package/dist/src/storage/frontmatter-parser.js +207 -0
- package/dist/src/storage/frontmatter-parser.js.map +1 -0
- package/dist/src/storage/index.d.ts +6 -0
- package/dist/src/storage/index.d.ts.map +1 -0
- package/dist/src/storage/index.js +6 -0
- package/dist/src/storage/index.js.map +1 -0
- package/dist/src/storage/markdown-storage.d.ts +76 -0
- package/dist/src/storage/markdown-storage.d.ts.map +1 -0
- package/dist/src/storage/markdown-storage.js +193 -0
- package/dist/src/storage/markdown-storage.js.map +1 -0
- package/dist/src/utils/index.d.ts +5 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +5 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/slugify.d.ts +24 -0
- package/dist/src/utils/slugify.d.ts.map +1 -0
- package/dist/src/utils/slugify.js +56 -0
- package/dist/src/utils/slugify.js.map +1 -0
- package/docs/architecture.md +349 -0
- package/docs/contracts.md +119 -0
- package/docs/prompt-template.md +79 -0
- package/docs/proposal-close-gates.md +58 -0
- package/docs/tool-calling-policy.md +107 -0
- package/package.json +53 -0
- package/src/contracts/index.ts +12 -0
- package/src/contracts/mcp.ts +303 -0
- package/src/contracts/schemas.ts +311 -0
- package/src/contracts/types.ts +414 -0
- package/src/index.ts +8 -0
- package/src/server/index.ts +5 -0
- package/src/server/mcp-server.ts +352 -0
- package/src/services/index.ts +5 -0
- package/src/services/memory-service.ts +548 -0
- package/src/storage/frontmatter-parser.ts +243 -0
- package/src/storage/index.ts +6 -0
- package/src/storage/markdown-storage.ts +236 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/slugify.ts +63 -0
- package/test/contracts/schemas.test.ts +313 -0
- package/test/contracts/types.test.ts +21 -0
- package/test/frontmatter-parser-more.test.ts +94 -0
- package/test/server/mcp-server-internals.test.ts +257 -0
- package/test/server/mcp-server.test.ts +97 -0
- package/test/services/memory-service-edge.test.ts +248 -0
- package/test/services/memory-service.test.ts +279 -0
- package/test/storage/frontmatter-parser.test.ts +223 -0
- package/test/storage/markdown-storage.test.ts +217 -0
- package/test/storage/storage-edge.test.ts +238 -0
- package/test/utils/slugify-edge.test.ts +94 -0
- package/test/utils/slugify.test.ts +68 -0
- package/tsconfig.json +26 -0
- package/tsconfig.test.json +8 -0
- package/vitest.config.ts +27 -0
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,qBAAqB,CAAC"}
|
|
@@ -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"}
|