apex-memory 0.2.1 → 0.3.1

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/README.md CHANGED
@@ -3,15 +3,19 @@
3
3
  [![CI](https://github.com/JJerryChoi/apex-memory/actions/workflows/ci.yml/badge.svg)](https://github.com/JJerryChoi/apex-memory/actions/workflows/ci.yml)
4
4
  [![npm version](https://img.shields.io/npm/v/apex-memory.svg)](https://www.npmjs.com/package/apex-memory)
5
5
  [![npm downloads](https://img.shields.io/npm/dm/apex-memory.svg)](https://www.npmjs.com/package/apex-memory)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
7
 
7
8
  **Persistent memory for AI coding agents.**
8
9
 
9
10
  Give your AI coding agent memory that survives across sessions. apex-memory is an [MCP](https://modelcontextprotocol.io) server that lets agents save decisions, patterns, bugs, and context — then recall them exactly when needed.
10
11
 
11
12
  - **One install, works everywhere** — MCP-native, works with Claude Code, Cursor, Windsurf, and any MCP-compatible editor
13
+ - **Ultra-lightweight** — 19 kB package, starts in milliseconds, no ML models or vector databases
12
14
  - **Zero infrastructure** — local SQLite database, no servers, no accounts
13
15
  - **Built for coding agents** — categories like `decision`, `architecture`, `bug`, `pattern` designed for real development workflows
16
+ - **Smart memory management** — importance scoring (1-5), access tracking, and auto-decay keep your memory store relevant
14
17
  - **Full-text search** — find any memory instantly with FTS5-powered search
18
+ - **Cloud sync** — sync memories across machines with the Pro tier (v0.3.0)
15
19
 
16
20
  ## Quick Start
17
21
 
@@ -57,6 +61,42 @@ Open `~/.codeium/windsurf/mcp_config.json` (via `Cmd+Shift+P` → "Windsurf: Ope
57
61
 
58
62
  See the [Windsurf setup guide](docs/guides/windsurf.md) for full details and troubleshooting.
59
63
 
64
+ ### VS Code + GitHub Copilot
65
+
66
+ In your project root, create `.vscode/mcp.json`:
67
+
68
+ ```json
69
+ {
70
+ "servers": {
71
+ "apex-memory": {
72
+ "command": "npx",
73
+ "args": ["apex-memory"]
74
+ }
75
+ }
76
+ }
77
+ ```
78
+
79
+ See the [VS Code setup guide](docs/guides/vscode.md) for full details and troubleshooting.
80
+
81
+ ### Cline
82
+
83
+ Open the MCP Servers panel in Cline's sidebar → **Edit MCP Settings**, then add:
84
+
85
+ ```json
86
+ {
87
+ "mcpServers": {
88
+ "apex-memory": {
89
+ "command": "npx",
90
+ "args": ["apex-memory"],
91
+ "disabled": false,
92
+ "autoApprove": []
93
+ }
94
+ }
95
+ }
96
+ ```
97
+
98
+ See the [Cline setup guide](docs/guides/cline.md) for full details and troubleshooting.
99
+
60
100
  ### Other MCP Clients
61
101
 
62
102
  apex-memory works with any MCP-compatible client. Point it at:
@@ -69,19 +109,25 @@ The server communicates over stdio using the standard MCP protocol. See the [gen
69
109
 
70
110
  ## Tools
71
111
 
72
- apex-memory gives your agent 9 tools:
112
+ apex-memory gives your agent 15 tools:
73
113
 
74
114
  | Tool | Description |
75
115
  |------|-------------|
76
116
  | `save_memory` | Save knowledge, decisions, patterns, or context with categories, tags, and importance scoring (1–5) |
77
117
  | `search_memories` | Full-text search across all memories (supports AND, OR, NOT, phrases) |
78
118
  | `recall` | Retrieve recent memories filtered by project, category, or tags |
119
+ | `update_memory` | Update an existing memory's content, category, tags, or importance in place |
79
120
  | `delete_memory` | Remove a specific memory by ID |
80
121
  | `decay_memories` | Archive old low-importance memories that were never accessed — keeps the store clean |
81
122
  | `start_session` | Begin a coding session tied to a project |
82
123
  | `end_session` | End a session with a summary of what was accomplished |
83
124
  | `list_sessions` | View past coding sessions |
84
125
  | `memory_stats` | Get statistics about stored memories and sessions |
126
+ | `apex_memory_sync` | Manually trigger a cloud sync — push local changes and pull remote (Pro) |
127
+ | `apex_memory_login` | Register this machine with apex-memory cloud and get a Pro upgrade link |
128
+ | `apex_memory_status` | Show cloud sync status: workspace ID, subscription tier, last sync time |
129
+ | `apex_memory_auto_capture` | Automatically capture session context (decisions, files, errors, solutions) at session end |
130
+ | `session_summary` | Review all memories captured in a session — use at session start to restore prior context |
85
131
 
86
132
  ## How It Works
87
133
 
@@ -133,31 +179,100 @@ start_session({ project: "api-server" })
133
179
  end_session({ session_id: "...", summary: "Refactored auth middleware to use JWT" })
134
180
  ```
135
181
 
182
+ ## Cloud Sync (Pro)
183
+
184
+ Sync memories across machines with a Pro subscription ($9/workspace/month).
185
+
186
+ **1. Register and get a Pro upgrade link:**
187
+
188
+ ```
189
+ apex_memory_login({
190
+ server_url: "https://apex-memory-sync.your-account.workers.dev",
191
+ email: "you@example.com"
192
+ })
193
+ ```
194
+
195
+ This registers your workspace, stores an API key locally, and returns a checkout URL to activate Pro.
196
+
197
+ **2. Check your sync status:**
198
+
199
+ ```
200
+ apex_memory_status()
201
+ ```
202
+
203
+ Shows workspace ID, subscription tier, and last sync timestamp.
204
+
205
+ **3. Sync manually at any time:**
206
+
207
+ ```
208
+ apex_memory_sync()
209
+ ```
210
+
211
+ Pushes local changes to the cloud and pulls remote changes. Memories are merged across machines.
212
+
213
+ > Auto-sync also runs on agent startup when Pro is active — no manual trigger needed.
214
+
215
+ ## Auto-Capture
216
+
217
+ Auto-capture saves session context automatically at the end of every coding session — no manual `save_memory` calls needed.
218
+
219
+ ```
220
+ apex_memory_auto_capture({
221
+ project: "api-server",
222
+ summary: "Refactored auth middleware to use JWT refresh tokens",
223
+ session_id: "...",
224
+ decisions: ["Use RS256 signing for cross-service token validation"],
225
+ files_worked_on: ["src/auth/middleware.ts", "src/auth/tokens.ts"],
226
+ errors_encountered: ["JWT expired during refresh cycle"],
227
+ solutions_found: ["Added 30s clock skew tolerance to token validation"]
228
+ })
229
+ ```
230
+
231
+ At the start of your next session, use `session_summary` to recall what was captured:
232
+
233
+ ```
234
+ session_summary({ session_id: "..." })
235
+ ```
236
+
237
+ Auto-capture is enabled by default. To disable, set `auto_capture.enabled = false` in `~/.apex-memory/config.json`.
238
+
136
239
  ## Storage
137
240
 
138
241
  All data is stored locally in `~/.apex-memory/memory.db` — a SQLite database with WAL mode and FTS5 full-text search. No data leaves your machine.
139
242
 
140
243
  ## Pricing
141
244
 
142
- | Tier | What you get | Price |
143
- |------|-------------|-------|
144
- | **Free** | Local storage, unlimited sessions, single machine | $0 |
145
- | **Pro** | Cloud sync across machines, search API, up to 1GB | $9/workspace/month |
146
- | **Team** | Shared multi-agent memory, analytics, unlimited storage | $29/workspace/month |
245
+ **Free and open source.** The core MCP server is MIT-licensed and fully functional — local storage, unlimited memories, unlimited sessions, no restrictions.
147
246
 
148
- The free tier is fully functional. Pro and Team tiers are coming soon.
247
+ **Cloud sync live in v0.3.0.** Sync memories across machines with the Pro tier ($9/workspace/month). [Get started](https://github.com/JJerryChoi/apex-memory).
248
+
249
+ **Support the project.** If apex-memory is useful to you, consider [sponsoring on GitHub](https://github.com/sponsors/JJerryChoi).
149
250
 
150
251
  ## Why apex-memory?
151
252
 
253
+ ### vs. MCP memory servers
254
+
255
+ | | apex-memory | shieldcortex | cortex-mcp | kiro-memory | claude-recall |
256
+ |---|---|---|---|---|---|
257
+ | **Package size** | **46 kB** | 75.9 MB | 1.1 MB | 3.6 MB | 862 kB |
258
+ | **Install time** | Instant | Slow (ML deps) | Fast | Fast | Fast |
259
+ | **Cloud sync** | **Yes (Pro)** | No | No | No | No |
260
+ | **Importance scoring** | Built-in | No | No | No | No |
261
+ | **Auto-decay** | Built-in | Yes | No | No | No |
262
+ | **Session tracking** | Built-in | No | No | No | No |
263
+ | **Works with any MCP client** | Yes | Yes | Yes | Yes | Claude-only |
264
+ | **License** | MIT | MIT | MIT | AGPL-3.0 | ISC |
265
+ | **Dependencies** | 3 | 8 (incl. HuggingFace) | 3 | 16 | 5 |
266
+
267
+ **apex-memory is 18x smaller than the next smallest competitor** and starts in milliseconds. No ML models, no vector databases, no bloat — just fast, reliable memory backed by SQLite FTS5.
268
+
269
+ ### vs. general-purpose memory
270
+
152
271
  | | apex-memory | Mem0 | Letta | OneContext |
153
272
  |---|---|---|---|---|
154
273
  | **Built for coding agents** | Yes | General purpose | General purpose | General purpose |
155
274
  | **MCP-native** | Yes | No | No | No |
156
275
  | **Zero infrastructure** | Yes (SQLite) | Requires server | Requires server | Cloud-only |
157
- | **Install time** | 30 seconds | Minutes | Minutes | Minutes |
158
- | **Works with Claude Code** | Yes | Manual integration | Manual integration | No |
159
- | **Session tracking** | Built-in | No | No | No |
160
- | **Full-text search** | FTS5 | Vector search | Vector search | Vector search |
161
276
  | **Open source** | MIT | Partial | Yes | No |
162
277
 
163
278
  apex-memory is purpose-built for the coding agent workflow. It's not a general-purpose memory layer — it's the memory system your AI coding agent should have had from day one.
@@ -0,0 +1,10 @@
1
+ interface AutoCaptureConfig {
2
+ enabled: boolean;
3
+ }
4
+ export interface ApexConfig {
5
+ auto_capture: AutoCaptureConfig;
6
+ }
7
+ export declare function getConfig(configDir?: string): ApexConfig;
8
+ export declare function isAutoCaptureEnabled(configDir?: string): boolean;
9
+ export {};
10
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,iBAAiB,CAAC;CACjC;AAMD,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,CAgBxD;AAED,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAEhE"}
@@ -0,0 +1,29 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ const DEFAULT_CONFIG = {
5
+ auto_capture: { enabled: true },
6
+ };
7
+ export function getConfig(configDir) {
8
+ const dir = configDir ?? join(homedir(), ".apex-memory");
9
+ const configPath = join(dir, "config.json");
10
+ if (!existsSync(configPath))
11
+ return DEFAULT_CONFIG;
12
+ try {
13
+ const raw = readFileSync(configPath, "utf8");
14
+ const parsed = JSON.parse(raw);
15
+ const ac = parsed["auto_capture"];
16
+ return {
17
+ auto_capture: {
18
+ enabled: ac?.enabled ?? DEFAULT_CONFIG.auto_capture.enabled,
19
+ },
20
+ };
21
+ }
22
+ catch {
23
+ return DEFAULT_CONFIG;
24
+ }
25
+ }
26
+ export function isAutoCaptureEnabled(configDir) {
27
+ return getConfig(configDir).auto_capture.enabled;
28
+ }
29
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAUlC,MAAM,cAAc,GAAe;IACjC,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;CAChC,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,SAAkB;IAC1C,MAAM,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,cAAc,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqC,CAAC;QACnE,MAAM,EAAE,GAAG,MAAM,CAAC,cAAc,CAA2C,CAAC;QAC5E,OAAO;YACL,YAAY,EAAE;gBACZ,OAAO,EAAE,EAAE,EAAE,OAAO,IAAI,cAAc,CAAC,YAAY,CAAC,OAAO;aAC5D;SACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAkB;IACrD,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;AACnD,CAAC"}
@@ -24,6 +24,12 @@ export declare function createDatabase(dbPath?: string): Database.Database;
24
24
  export declare function saveMemory(db: Database.Database, content: string, category: string, tags: string[], project: string, sessionId?: string, importance?: number): Memory;
25
25
  export declare function searchMemories(db: Database.Database, query: string, project?: string, limit?: number): Memory[];
26
26
  export declare function recallMemories(db: Database.Database, project?: string, category?: string, tags?: string[], limit?: number): Memory[];
27
+ export declare function updateMemory(db: Database.Database, id: string, updates: {
28
+ content?: string;
29
+ category?: string;
30
+ tags?: string[];
31
+ importance?: number;
32
+ }): Memory | null;
27
33
  export declare function deleteMemory(db: Database.Database, id: string): boolean;
28
34
  export declare function decayMemories(db: Database.Database, dayThreshold?: number, maxImportance?: number): number;
29
35
  export declare function startSession(db: Database.Database, project: string): Session;
@@ -34,6 +40,18 @@ export declare function getStats(db: Database.Database): {
34
40
  sessions: number;
35
41
  projects: string[];
36
42
  };
43
+ export interface ExportData {
44
+ version: string;
45
+ exported_at: string;
46
+ memories: Memory[];
47
+ sessions: Session[];
48
+ }
49
+ export declare function exportMemories(db: Database.Database, project?: string): ExportData;
50
+ export declare function importMemories(db: Database.Database, data: ExportData): {
51
+ memories_imported: number;
52
+ sessions_imported: number;
53
+ skipped: number;
54
+ };
37
55
  export declare function getSyncState(db: Database.Database, key: string): string | null;
38
56
  export declare function setSyncState(db: Database.Database, key: string, value: string): void;
39
57
  //# sourceMappingURL=database.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAMtC,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAqDD,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CA+DjE;AAYD,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,GAAE,MAAU,GACrB,MAAM,CAwBR;AAED,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,GAAE,MAAW,GACjB,MAAM,EAAE,CAqCV;AAED,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,KAAK,GAAE,MAAW,GACjB,MAAM,EAAE,CA6BV;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAMvE;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,YAAY,GAAE,MAAW,EACzB,aAAa,GAAE,MAAU,GACxB,MAAM,CAYR;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAST;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,GAAG,IAAI,CAUhB;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,GAAE,MAAW,GACjB,OAAO,EAAE,CASX;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAK1G;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG9E;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEpF"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
package/build/database.js CHANGED
@@ -185,8 +185,9 @@ export function recallMemories(db, project, category, tags, limit = 20) {
185
185
  }
186
186
  if (tags && tags.length > 0) {
187
187
  for (const tag of tags) {
188
- sql += ` AND tags LIKE ?`;
189
- params.push(`%${tag}%`);
188
+ // Match exact tag within comma-separated list: start/comma before, end/comma after
189
+ sql += ` AND (',' || tags || ',' LIKE ?)`;
190
+ params.push(`%,${tag},%`);
190
191
  }
191
192
  }
192
193
  sql += ` ORDER BY created_at DESC LIMIT ?`;
@@ -200,6 +201,18 @@ export function recallMemories(db, project, category, tags, limit = 20) {
200
201
  }
201
202
  return results;
202
203
  }
204
+ export function updateMemory(db, id, updates) {
205
+ const existing = db.prepare(`SELECT * FROM memories WHERE id = ? AND deleted_at IS NULL`).get(id);
206
+ if (!existing)
207
+ return null;
208
+ const now = new Date().toISOString();
209
+ const content = updates.content ?? existing.content;
210
+ const category = updates.category ?? existing.category;
211
+ const tags = updates.tags !== undefined ? updates.tags.join(",") : existing.tags;
212
+ const importance = updates.importance ?? existing.importance;
213
+ db.prepare(`UPDATE memories SET content = ?, category = ?, tags = ?, importance = ?, updated_at = ? WHERE id = ?`).run(content, category, tags, importance, now, id);
214
+ return { ...existing, content, category, tags, importance, updated_at: now };
215
+ }
203
216
  export function deleteMemory(db, id) {
204
217
  const now = new Date().toISOString();
205
218
  const result = db
@@ -247,6 +260,63 @@ export function getStats(db) {
247
260
  const projects = db.prepare(`SELECT DISTINCT project FROM memories WHERE project != '' AND deleted_at IS NULL ORDER BY project`).all().map(r => r.project);
248
261
  return { memories: memoriesCount, sessions: sessionsCount, projects };
249
262
  }
263
+ export function exportMemories(db, project) {
264
+ let memories;
265
+ if (project) {
266
+ memories = db
267
+ .prepare(`SELECT * FROM memories WHERE deleted_at IS NULL AND project = ? ORDER BY created_at ASC`)
268
+ .all(project);
269
+ }
270
+ else {
271
+ memories = db
272
+ .prepare(`SELECT * FROM memories WHERE deleted_at IS NULL ORDER BY created_at ASC`)
273
+ .all();
274
+ }
275
+ let sessions;
276
+ if (project) {
277
+ sessions = db
278
+ .prepare(`SELECT * FROM sessions WHERE project = ? ORDER BY started_at ASC`)
279
+ .all(project);
280
+ }
281
+ else {
282
+ sessions = db
283
+ .prepare(`SELECT * FROM sessions ORDER BY started_at ASC`)
284
+ .all();
285
+ }
286
+ return {
287
+ version: "1.0",
288
+ exported_at: new Date().toISOString(),
289
+ memories,
290
+ sessions,
291
+ };
292
+ }
293
+ export function importMemories(db, data) {
294
+ let memoriesImported = 0;
295
+ let sessionsImported = 0;
296
+ let skipped = 0;
297
+ const insertMemory = db.prepare(`INSERT OR IGNORE INTO memories (id, content, category, tags, project, session_id, importance, access_count, last_accessed_at, created_at, updated_at, deleted_at)
298
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL)`);
299
+ const insertSession = db.prepare(`INSERT OR IGNORE INTO sessions (id, project, summary, started_at, ended_at)
300
+ VALUES (?, ?, ?, ?, ?)`);
301
+ const importAll = db.transaction(() => {
302
+ for (const s of data.sessions ?? []) {
303
+ const result = insertSession.run(s.id, s.project, s.summary, s.started_at, s.ended_at);
304
+ if (result.changes > 0)
305
+ sessionsImported++;
306
+ else
307
+ skipped++;
308
+ }
309
+ for (const m of data.memories ?? []) {
310
+ const result = insertMemory.run(m.id, m.content, m.category, m.tags, m.project, m.session_id, m.importance ?? 3, m.access_count ?? 0, m.last_accessed_at, m.created_at, m.updated_at ?? m.created_at);
311
+ if (result.changes > 0)
312
+ memoriesImported++;
313
+ else
314
+ skipped++;
315
+ }
316
+ });
317
+ importAll();
318
+ return { memories_imported: memoriesImported, sessions_imported: sessionsImported, skipped };
319
+ }
250
320
  export function getSyncState(db, key) {
251
321
  const row = db.prepare(`SELECT value FROM sync_state WHERE key = ?`).get(key);
252
322
  return row?.value ?? null;
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
package/build/index.js CHANGED
@@ -1,18 +1,34 @@
1
1
  #!/usr/bin/env node
2
+ import { createRequire } from "node:module";
2
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
4
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
5
  import { createDatabase } from "./database.js";
5
6
  import { registerTools } from "./tools.js";
7
+ import { registerResources } from "./resources.js";
8
+ import { syncIfConfigured } from "./sync-client.js";
9
+ const require = createRequire(import.meta.url);
10
+ const { version } = require("../package.json");
6
11
  const server = new McpServer({
7
12
  name: "apex-memory",
8
- version: "0.2.1",
13
+ version,
9
14
  });
10
15
  const db = createDatabase();
11
16
  registerTools(server, db);
17
+ registerResources(server, db);
12
18
  async function main() {
13
19
  const transport = new StdioServerTransport();
14
20
  await server.connect(transport);
15
- console.error("apex-memory v0.2.1 running on stdio");
21
+ console.error(`apex-memory v${version} running on stdio`);
22
+ // Background sync — non-blocking, fire-and-forget
23
+ syncIfConfigured(db)
24
+ .then((stats) => {
25
+ if (stats) {
26
+ console.error(`[sync] pushed=${stats.pushed} pulled=${stats.pulled}`);
27
+ }
28
+ })
29
+ .catch((err) => {
30
+ console.error("[sync] background sync failed:", err instanceof Error ? err.message : err);
31
+ });
16
32
  }
17
33
  main().catch((error) => {
18
34
  console.error("Fatal error:", error);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;AAC5B,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAE1B,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACvD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,aAAa;IACnB,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;AAC5B,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1B,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAE9B,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,gBAAgB,OAAO,mBAAmB,CAAC,CAAC;IAE1D,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,CAAC;SACjB,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACd,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;AACP,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type Database from "better-sqlite3";
3
+ export declare function registerResources(server: McpServer, db: Database.Database): void;
4
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAEtF,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAY3C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CA+LhF"}
@@ -0,0 +1,146 @@
1
+ import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { z } from "zod";
3
+ import { recallMemories, listSessions, getStats } from "./database.js";
4
+ function formatMemory(m) {
5
+ return `[${m.id}] (${m.category}) [importance:${m.importance}] ${m.project ? `[${m.project}]` : ""} ${m.created_at}\n${m.content}${m.tags ? `\nTags: ${m.tags}` : ""}`;
6
+ }
7
+ function formatSession(s) {
8
+ return `[${s.id}] ${s.project} | ${s.started_at} → ${s.ended_at ?? "active"}${s.summary ? `\n ${s.summary}` : ""}`;
9
+ }
10
+ export function registerResources(server, db) {
11
+ // ── Resources ──────────────────────────────────────────────────────────────
12
+ server.resource("recent-memories", "memory://recent", { description: "The 20 most recently created memories across all projects" }, async (uri) => {
13
+ const memories = recallMemories(db, undefined, undefined, undefined, 20);
14
+ const text = memories.length === 0
15
+ ? "No memories stored yet."
16
+ : `Recent memories (${memories.length}):\n\n${memories.map(formatMemory).join("\n---\n")}`;
17
+ return { contents: [{ uri: uri.toString(), mimeType: "text/plain", text }] };
18
+ });
19
+ server.resource("memory-stats", "memory://stats", { description: "Summary statistics: total memories, sessions, and projects" }, async (uri) => {
20
+ const stats = getStats(db);
21
+ const text = [
22
+ `Memories: ${stats.memories}`,
23
+ `Sessions: ${stats.sessions}`,
24
+ `Projects: ${stats.projects.length > 0 ? stats.projects.join(", ") : "(none)"}`,
25
+ ].join("\n");
26
+ return { contents: [{ uri: uri.toString(), mimeType: "text/plain", text }] };
27
+ });
28
+ server.resource("sessions-list", "memory://sessions", { description: "List of all coding sessions (most recent 20)" }, async (uri) => {
29
+ const sessions = listSessions(db, undefined, 20);
30
+ const text = sessions.length === 0
31
+ ? "No sessions found."
32
+ : `Sessions (${sessions.length}):\n\n${sessions.map(formatSession).join("\n")}`;
33
+ return { contents: [{ uri: uri.toString(), mimeType: "text/plain", text }] };
34
+ });
35
+ const projectTemplate = new ResourceTemplate("memory://project/{name}", {
36
+ list: async () => {
37
+ const stats = getStats(db);
38
+ return {
39
+ resources: stats.projects.map((p) => ({
40
+ name: p,
41
+ uri: `memory://project/${encodeURIComponent(p)}`,
42
+ description: `Memories for project: ${p}`,
43
+ })),
44
+ };
45
+ },
46
+ });
47
+ server.resource("project-memories", projectTemplate, { description: "Memories for a specific project (up to 50 most recent)" }, async (uri, variables) => {
48
+ const name = decodeURIComponent(String(variables.name ?? ""));
49
+ const memories = recallMemories(db, name, undefined, undefined, 50);
50
+ const text = memories.length === 0
51
+ ? `No memories found for project "${name}".`
52
+ : `Memories for project "${name}" (${memories.length}):\n\n${memories.map(formatMemory).join("\n---\n")}`;
53
+ return { contents: [{ uri: uri.toString(), mimeType: "text/plain", text }] };
54
+ });
55
+ const sessionTemplate = new ResourceTemplate("memory://session/{id}", {
56
+ list: async () => {
57
+ const sessions = listSessions(db, undefined, 20);
58
+ return {
59
+ resources: sessions.map((s) => ({
60
+ name: `${s.project} — ${s.started_at}`,
61
+ uri: `memory://session/${s.id}`,
62
+ description: s.summary ?? `Session for ${s.project}`,
63
+ })),
64
+ };
65
+ },
66
+ });
67
+ server.resource("session-memories", sessionTemplate, { description: "Memories captured during a specific session" }, async (uri, variables) => {
68
+ const id = String(variables.id ?? "");
69
+ const session = db.prepare(`SELECT * FROM sessions WHERE id = ?`).get(id);
70
+ if (!session) {
71
+ return {
72
+ contents: [{ uri: uri.toString(), mimeType: "text/plain", text: `Session ${id} not found.` }],
73
+ };
74
+ }
75
+ const memories = db
76
+ .prepare(`SELECT * FROM memories WHERE session_id = ? AND deleted_at IS NULL ORDER BY created_at ASC`)
77
+ .all(id);
78
+ const lines = [
79
+ `Session: ${session.id}`,
80
+ `Project: ${session.project}`,
81
+ `Duration: ${session.started_at} → ${session.ended_at ?? "active"}`,
82
+ ...(session.summary ? [`Summary: ${session.summary}`] : []),
83
+ "",
84
+ memories.length === 0
85
+ ? "No memories captured in this session."
86
+ : `Memories (${memories.length}):\n\n${memories.map(formatMemory).join("\n---\n")}`,
87
+ ];
88
+ return { contents: [{ uri: uri.toString(), mimeType: "text/plain", text: lines.join("\n") }] };
89
+ });
90
+ // ── Prompts ────────────────────────────────────────────────────────────────
91
+ server.prompt("recall-context", "Recall relevant memories for the current project and inject them into the agent context", { project: z.string().describe("Project name to recall context for") }, async ({ project }) => {
92
+ const memories = recallMemories(db, project, undefined, undefined, 20);
93
+ const text = memories.length === 0
94
+ ? `No memories found for project "${project}". Start saving context with save_memory.`
95
+ : `Relevant context for project "${project}" (${memories.length} memories):\n\n${memories.map(formatMemory).join("\n---\n")}`;
96
+ return {
97
+ description: `Recalled context for ${project}`,
98
+ messages: [{ role: "user", content: { type: "text", text } }],
99
+ };
100
+ });
101
+ server.prompt("session-start", "Begin a new session by injecting context from the most recent previous session", { project: z.string().describe("Project name for this session") }, async ({ project }) => {
102
+ const sessions = listSessions(db, project, 1);
103
+ const lastSession = sessions[0];
104
+ let contextText = `Starting new session for project "${project}".`;
105
+ if (lastSession) {
106
+ const lastMemories = db
107
+ .prepare(`SELECT * FROM memories WHERE session_id = ? AND deleted_at IS NULL ORDER BY created_at DESC LIMIT 10`)
108
+ .all(lastSession.id);
109
+ if (lastSession.summary) {
110
+ contextText += `\n\nLast session summary: ${lastSession.summary}`;
111
+ }
112
+ if (lastMemories.length > 0) {
113
+ contextText += `\n\nLast session memories:\n\n${lastMemories.map(formatMemory).join("\n---\n")}`;
114
+ }
115
+ }
116
+ else {
117
+ contextText += "\n\nNo previous sessions found for this project.";
118
+ }
119
+ return {
120
+ description: `Session start context for ${project}`,
121
+ messages: [{ role: "user", content: { type: "text", text: contextText } }],
122
+ };
123
+ });
124
+ server.prompt("session-end", "Prompt to end the current session and capture context via apex_memory_auto_capture", {
125
+ project: z.string().describe("Project name"),
126
+ session_id: z.string().optional().describe("Session ID to close"),
127
+ }, async ({ project, session_id }) => {
128
+ const lines = [
129
+ `Session ending for project "${project}".`,
130
+ "",
131
+ "Please call apex_memory_auto_capture with:",
132
+ ` project: "${project}"`,
133
+ ...(session_id ? [` session_id: "${session_id}"`] : []),
134
+ " summary: <summary of what was accomplished>",
135
+ " decisions: [<key decisions made>]",
136
+ " files_worked_on: [<files created or modified>]",
137
+ " errors_encountered: [<errors hit>]",
138
+ " solutions_found: [<solutions applied>]",
139
+ ];
140
+ return {
141
+ description: `Session end prompt for ${project}`,
142
+ messages: [{ role: "user", content: { type: "text", text: lines.join("\n") } }],
143
+ };
144
+ });
145
+ }
146
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type Database from "better-sqlite3";
2
+ export interface SyncStats {
3
+ pushed: number;
4
+ pulled: number;
5
+ server_time: string;
6
+ }
7
+ export declare function syncIfConfigured(db: Database.Database): Promise<SyncStats | null>;
8
+ export declare function registerWorkspaceWithServer(db: Database.Database, serverUrl: string): Promise<{
9
+ workspace_id: string;
10
+ api_key: string;
11
+ }>;
12
+ export declare function getCheckoutUrl(db: Database.Database, email?: string): Promise<string>;
13
+ export declare function getSubscriptionStatus(db: Database.Database): Promise<{
14
+ is_pro: boolean;
15
+ tier: string;
16
+ workspace_id?: string;
17
+ }>;
18
+ //# sourceMappingURL=sync-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-client.d.ts","sourceRoot":"","sources":["../src/sync-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAiC3C,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAoDD,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAmCvF;AAED,wBAAsB,2BAA2B,CAC/C,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBpD;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAwBjB;AAED,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GACpB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAWnE"}
@@ -0,0 +1,125 @@
1
+ import { getSyncState, setSyncState } from "./database.js";
2
+ function getLocalMemoriesSince(db, since) {
3
+ return db
4
+ .prepare(`SELECT * FROM memories WHERE updated_at > ? ORDER BY updated_at ASC`)
5
+ .all(since);
6
+ }
7
+ function getLocalSessionsSince(db, since) {
8
+ // Sessions have no updated_at locally; use started_at as proxy
9
+ return db
10
+ .prepare(`SELECT *, COALESCE(ended_at, started_at) as updated_at
11
+ FROM sessions WHERE started_at > ? ORDER BY started_at ASC`)
12
+ .all(since);
13
+ }
14
+ function applyServerMemory(db, m) {
15
+ db.prepare(`
16
+ INSERT INTO memories
17
+ (id, content, category, tags, project, session_id, importance,
18
+ access_count, last_accessed_at, created_at, updated_at, deleted_at)
19
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
20
+ ON CONFLICT(id) DO UPDATE SET
21
+ content = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.content ELSE memories.content END,
22
+ category = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.category ELSE memories.category END,
23
+ tags = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.tags ELSE memories.tags END,
24
+ project = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.project ELSE memories.project END,
25
+ session_id = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.session_id ELSE memories.session_id END,
26
+ importance = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.importance ELSE memories.importance END,
27
+ access_count = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.access_count ELSE memories.access_count END,
28
+ last_accessed_at = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.last_accessed_at ELSE memories.last_accessed_at END,
29
+ deleted_at = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.deleted_at ELSE memories.deleted_at END,
30
+ updated_at = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.updated_at ELSE memories.updated_at END
31
+ `).run(m.id, m.content, m.category, m.tags, m.project, m.session_id, m.importance, m.access_count, m.last_accessed_at, m.created_at, m.updated_at, m.deleted_at);
32
+ }
33
+ function applyServerSession(db, s) {
34
+ db.prepare(`
35
+ INSERT INTO sessions (id, project, summary, started_at, ended_at)
36
+ VALUES (?, ?, ?, ?, ?)
37
+ ON CONFLICT(id) DO UPDATE SET
38
+ summary = COALESCE(excluded.summary, sessions.summary),
39
+ ended_at = COALESCE(excluded.ended_at, sessions.ended_at)
40
+ `).run(s.id, s.project, s.summary, s.started_at, s.ended_at);
41
+ }
42
+ export async function syncIfConfigured(db) {
43
+ const apiKey = getSyncState(db, "api_key");
44
+ const serverUrl = getSyncState(db, "server_url");
45
+ if (!apiKey || !serverUrl)
46
+ return null;
47
+ const lastSyncedAt = getSyncState(db, "last_synced_at") ?? "1970-01-01T00:00:00.000Z";
48
+ const localMemories = getLocalMemoriesSince(db, lastSyncedAt);
49
+ const localSessions = getLocalSessionsSince(db, lastSyncedAt);
50
+ const response = await fetch(`${serverUrl}/sync`, {
51
+ method: "POST",
52
+ headers: {
53
+ Authorization: `Bearer ${apiKey}`,
54
+ "Content-Type": "application/json",
55
+ },
56
+ body: JSON.stringify({ since: lastSyncedAt, memories: localMemories, sessions: localSessions }),
57
+ });
58
+ if (!response.ok) {
59
+ if (response.status === 402)
60
+ return null; // free tier, skip silently
61
+ throw new Error(`Sync failed with status ${response.status}`);
62
+ }
63
+ const result = (await response.json());
64
+ for (const m of result.memories)
65
+ applyServerMemory(db, m);
66
+ for (const s of result.sessions)
67
+ applyServerSession(db, s);
68
+ setSyncState(db, "last_synced_at", result.server_time);
69
+ return {
70
+ pushed: localMemories.length,
71
+ pulled: result.memories.length,
72
+ server_time: result.server_time,
73
+ };
74
+ }
75
+ export async function registerWorkspaceWithServer(db, serverUrl) {
76
+ const response = await fetch(`${serverUrl}/auth/workspace`, {
77
+ method: "POST",
78
+ headers: { "Content-Type": "application/json" },
79
+ });
80
+ if (!response.ok) {
81
+ throw new Error(`Registration failed with status ${response.status}`);
82
+ }
83
+ const result = (await response.json());
84
+ setSyncState(db, "workspace_id", result.workspace_id);
85
+ setSyncState(db, "api_key", result.api_key);
86
+ setSyncState(db, "server_url", serverUrl);
87
+ return result;
88
+ }
89
+ export async function getCheckoutUrl(db, email) {
90
+ const apiKey = getSyncState(db, "api_key");
91
+ const serverUrl = getSyncState(db, "server_url");
92
+ if (!apiKey || !serverUrl) {
93
+ throw new Error("Not registered. Run apex_memory_login first.");
94
+ }
95
+ const response = await fetch(`${serverUrl}/billing/checkout`, {
96
+ method: "POST",
97
+ headers: {
98
+ Authorization: `Bearer ${apiKey}`,
99
+ "Content-Type": "application/json",
100
+ },
101
+ body: JSON.stringify(email ? { email } : {}),
102
+ });
103
+ if (!response.ok) {
104
+ throw new Error(`Checkout request failed with status ${response.status}`);
105
+ }
106
+ const data = (await response.json());
107
+ if (data.message)
108
+ return data.message;
109
+ if (!data.checkout_url)
110
+ throw new Error("No checkout URL returned");
111
+ return data.checkout_url;
112
+ }
113
+ export async function getSubscriptionStatus(db) {
114
+ const apiKey = getSyncState(db, "api_key");
115
+ const serverUrl = getSyncState(db, "server_url");
116
+ if (!apiKey || !serverUrl)
117
+ return { is_pro: false, tier: "local" };
118
+ const response = await fetch(`${serverUrl}/subscription/status`, {
119
+ headers: { Authorization: `Bearer ${apiKey}` },
120
+ });
121
+ if (!response.ok)
122
+ return { is_pro: false, tier: "unknown" };
123
+ return (await response.json());
124
+ }
125
+ //# sourceMappingURL=sync-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-client.js","sourceRoot":"","sources":["../src/sync-client.ts"],"names":[],"mappings":"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"}
package/build/tools.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import type Database from "better-sqlite3";
3
- export declare function registerTools(server: McpServer, db: Database.Database): void;
3
+ export declare function registerTools(server: McpServer, db: Database.Database, configDir?: string): void;
4
4
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAa3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CA4P5E"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AA0B3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAuhBhG"}
package/build/tools.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import { z } from "zod";
2
- import { saveMemory, searchMemories, recallMemories, deleteMemory, decayMemories, startSession, endSession, listSessions, getStats, } from "./database.js";
3
- export function registerTools(server, db) {
2
+ import { saveMemory, searchMemories, recallMemories, updateMemory, deleteMemory, decayMemories, startSession, endSession, listSessions, getStats, getSyncState, } from "./database.js";
3
+ import { syncIfConfigured, registerWorkspaceWithServer, getCheckoutUrl, getSubscriptionStatus, } from "./sync-client.js";
4
+ import { isAutoCaptureEnabled } from "./config.js";
5
+ export function registerTools(server, db, configDir) {
4
6
  server.tool("save_memory", "Save a piece of knowledge, decision, pattern, or context for future recall. Use categories like: decision, pattern, bug, architecture, preference, learning, context.", {
5
7
  content: z.string().describe("The memory content to save"),
6
8
  category: z
@@ -86,6 +88,34 @@ export function registerTools(server, db) {
86
88
  content: [{ type: "text", text: `Recalled ${memories.length} memories:\n\n${formatted}` }],
87
89
  };
88
90
  });
91
+ server.tool("update_memory", "Update an existing memory's content, category, tags, or importance without deleting and re-creating it.", {
92
+ id: z.string().describe("The memory ID to update"),
93
+ content: z.string().optional().describe("New content (leave empty to keep current)"),
94
+ category: z.string().optional().describe("New category"),
95
+ tags: z.array(z.string()).optional().describe("New tags (replaces existing tags)"),
96
+ importance: z
97
+ .number()
98
+ .int()
99
+ .min(1)
100
+ .max(5)
101
+ .optional()
102
+ .describe("New importance score 1-5"),
103
+ }, async ({ id, content, category, tags, importance }) => {
104
+ const updated = updateMemory(db, id, { content, category, tags, importance });
105
+ if (!updated) {
106
+ return {
107
+ content: [{ type: "text", text: `Memory ${id} not found` }],
108
+ };
109
+ }
110
+ return {
111
+ content: [
112
+ {
113
+ type: "text",
114
+ text: `Updated memory ${updated.id}\nCategory: ${updated.category}\nImportance: ${updated.importance}/5\nTags: ${updated.tags || "(none)"}`,
115
+ },
116
+ ],
117
+ };
118
+ });
89
119
  server.tool("delete_memory", "Delete a specific memory by ID.", {
90
120
  id: z.string().describe("The memory ID to delete"),
91
121
  }, async ({ id }) => {
@@ -189,5 +219,216 @@ export function registerTools(server, db) {
189
219
  ],
190
220
  };
191
221
  });
222
+ server.tool("apex_memory_sync", "Manually trigger a cloud sync — push local changes to the server and pull remote changes. Requires a Pro subscription and prior login via apex_memory_login.", {}, async () => {
223
+ try {
224
+ const stats = await syncIfConfigured(db);
225
+ if (!stats) {
226
+ return {
227
+ content: [
228
+ {
229
+ type: "text",
230
+ text: "Sync skipped: not configured or no Pro subscription. Use apex_memory_login to set up cloud sync.",
231
+ },
232
+ ],
233
+ };
234
+ }
235
+ return {
236
+ content: [
237
+ {
238
+ type: "text",
239
+ text: `Sync complete.\nPushed: ${stats.pushed} changes\nPulled: ${stats.pulled} changes\nServer time: ${stats.server_time}`,
240
+ },
241
+ ],
242
+ };
243
+ }
244
+ catch (err) {
245
+ const msg = err instanceof Error ? err.message : String(err);
246
+ return {
247
+ content: [{ type: "text", text: `Sync failed: ${msg}` }],
248
+ };
249
+ }
250
+ });
251
+ server.tool("apex_memory_login", "Register this machine with the apex-memory cloud and get a Pro upgrade link. Provide server_url pointing to your deployed apex-memory-sync Worker.", {
252
+ server_url: z
253
+ .string()
254
+ .describe("URL of the apex-memory-sync Worker (e.g. https://apex-memory-sync.your-account.workers.dev)"),
255
+ email: z
256
+ .string()
257
+ .optional()
258
+ .describe("Email address to pre-fill in the checkout form (optional)"),
259
+ }, async ({ server_url, email }) => {
260
+ try {
261
+ const { workspace_id, api_key } = await registerWorkspaceWithServer(db, server_url);
262
+ const checkoutUrl = await getCheckoutUrl(db, email);
263
+ return {
264
+ content: [
265
+ {
266
+ type: "text",
267
+ text: [
268
+ `Registered workspace: ${workspace_id}`,
269
+ `API key stored locally.`,
270
+ ``,
271
+ `To activate Pro ($9/month), open this URL in your browser:`,
272
+ checkoutUrl,
273
+ ].join("\n"),
274
+ },
275
+ ],
276
+ };
277
+ }
278
+ catch (err) {
279
+ const msg = err instanceof Error ? err.message : String(err);
280
+ return {
281
+ content: [{ type: "text", text: `Login failed: ${msg}` }],
282
+ };
283
+ }
284
+ });
285
+ server.tool("apex_memory_status", "Show cloud sync status: workspace ID, Pro subscription tier, and last sync timestamp.", {}, async () => {
286
+ const workspaceId = getSyncState(db, "workspace_id");
287
+ const serverUrl = getSyncState(db, "server_url");
288
+ const lastSyncedAt = getSyncState(db, "last_synced_at");
289
+ if (!workspaceId || !serverUrl) {
290
+ return {
291
+ content: [
292
+ {
293
+ type: "text",
294
+ text: "Cloud sync not configured. Use apex_memory_login to set up.",
295
+ },
296
+ ],
297
+ };
298
+ }
299
+ try {
300
+ const sub = await getSubscriptionStatus(db);
301
+ return {
302
+ content: [
303
+ {
304
+ type: "text",
305
+ text: [
306
+ `Workspace: ${workspaceId}`,
307
+ `Server: ${serverUrl}`,
308
+ `Tier: ${sub.tier}${sub.is_pro ? " ✓" : " (use apex_memory_login to upgrade)"}`,
309
+ `Last synced: ${lastSyncedAt ?? "never"}`,
310
+ ].join("\n"),
311
+ },
312
+ ],
313
+ };
314
+ }
315
+ catch (err) {
316
+ const msg = err instanceof Error ? err.message : String(err);
317
+ return {
318
+ content: [{ type: "text", text: `Status check failed: ${msg}` }],
319
+ };
320
+ }
321
+ });
322
+ server.tool("apex_memory_auto_capture", "Automatically capture session context at the end of a coding session. Saves key decisions, file paths, errors, and solutions as searchable memories. Opt-in: configure auto_capture.enabled in ~/.apex-memory/config.json (enabled by default). Works with any MCP-compatible editor.", {
323
+ project: z.string().describe("Project name for this session"),
324
+ summary: z.string().describe("Overall summary of what was accomplished this session"),
325
+ session_id: z.string().optional().describe("Session ID to close (if using session tracking)"),
326
+ decisions: z
327
+ .array(z.string())
328
+ .default([])
329
+ .describe("Key architectural or code decisions made during the session"),
330
+ files_worked_on: z
331
+ .array(z.string())
332
+ .default([])
333
+ .describe("File paths created or modified"),
334
+ errors_encountered: z
335
+ .array(z.string())
336
+ .default([])
337
+ .describe("Errors or bugs encountered during the session"),
338
+ solutions_found: z
339
+ .array(z.string())
340
+ .default([])
341
+ .describe("Solutions or fixes applied (paired with errors_encountered by index when possible)"),
342
+ }, async ({ project, summary, session_id, decisions, files_worked_on, errors_encountered, solutions_found }) => {
343
+ if (!isAutoCaptureEnabled(configDir)) {
344
+ return {
345
+ content: [
346
+ {
347
+ type: "text",
348
+ text: "Auto-capture is disabled. Set auto_capture.enabled = true in ~/.apex-memory/config.json to enable.",
349
+ },
350
+ ],
351
+ };
352
+ }
353
+ const captured = [];
354
+ if (session_id) {
355
+ endSession(db, session_id, summary);
356
+ }
357
+ // Session summary memory
358
+ saveMemory(db, summary, "context", ["session-summary"], project, session_id, 3);
359
+ captured.push(`context: session summary`);
360
+ // Key decisions (importance 4 — above default, below critical)
361
+ for (const decision of decisions) {
362
+ saveMemory(db, decision, "decision", ["auto-capture"], project, session_id, 4);
363
+ captured.push(`decision: ${decision.length > 60 ? decision.slice(0, 60) + "…" : decision}`);
364
+ }
365
+ // Error/solution pairs
366
+ const pairCount = Math.max(errors_encountered.length, solutions_found.length);
367
+ for (let i = 0; i < pairCount; i++) {
368
+ const error = errors_encountered[i];
369
+ const solution = solutions_found[i];
370
+ if (error && solution) {
371
+ saveMemory(db, `Error: ${error}\nSolution: ${solution}`, "bug", ["auto-capture", "error-solution"], project, session_id, 3);
372
+ captured.push(`bug fix: ${error.length > 50 ? error.slice(0, 50) + "…" : error}`);
373
+ }
374
+ else if (error) {
375
+ saveMemory(db, `Error encountered: ${error}`, "bug", ["auto-capture", "error"], project, session_id, 2);
376
+ captured.push(`error: ${error.length > 60 ? error.slice(0, 60) + "…" : error}`);
377
+ }
378
+ else if (solution) {
379
+ saveMemory(db, `Solution applied: ${solution}`, "pattern", ["auto-capture", "solution"], project, session_id, 3);
380
+ captured.push(`solution: ${solution.length > 60 ? solution.slice(0, 60) + "…" : solution}`);
381
+ }
382
+ }
383
+ // Files worked on (single memory, low importance — ephemeral path context)
384
+ if (files_worked_on.length > 0) {
385
+ const content = `Files worked on:\n${files_worked_on.map((f) => `- ${f}`).join("\n")}`;
386
+ saveMemory(db, content, "context", ["auto-capture", "files"], project, session_id, 2);
387
+ captured.push(`files: ${files_worked_on.length} file(s)`);
388
+ }
389
+ return {
390
+ content: [
391
+ {
392
+ type: "text",
393
+ text: `Auto-capture complete. Saved ${captured.length} memories for project "${project}":\n${captured.map((s) => ` • ${s}`).join("\n")}`,
394
+ },
395
+ ],
396
+ };
397
+ });
398
+ server.tool("session_summary", "Review all memories captured in a session. Shows what was saved via apex_memory_auto_capture or save_memory during the session. Use at the start of a new session to recall prior context.", {
399
+ session_id: z.string().describe("The session ID to summarize"),
400
+ }, async ({ session_id }) => {
401
+ const session = db.prepare(`SELECT * FROM sessions WHERE id = ?`).get(session_id);
402
+ if (!session) {
403
+ return {
404
+ content: [{ type: "text", text: `Session ${session_id} not found.` }],
405
+ };
406
+ }
407
+ const memories = db
408
+ .prepare(`SELECT * FROM memories WHERE session_id = ? AND deleted_at IS NULL ORDER BY created_at ASC`)
409
+ .all(session_id);
410
+ const lines = [
411
+ `Session: ${session.id}`,
412
+ `Project: ${session.project}`,
413
+ `Duration: ${session.started_at} → ${session.ended_at ?? "active"}`,
414
+ ];
415
+ if (session.summary) {
416
+ lines.push(`Summary: ${session.summary}`);
417
+ }
418
+ if (memories.length === 0) {
419
+ lines.push(`\nNo memories captured in this session.`);
420
+ lines.push(`Tip: Call apex_memory_auto_capture at session end to save context automatically.`);
421
+ }
422
+ else {
423
+ lines.push(`\nCaptured ${memories.length} memories:`);
424
+ for (const m of memories) {
425
+ const preview = m.content.length > 100 ? `${m.content.slice(0, 100)}…` : m.content;
426
+ lines.push(` [${m.category}] [importance:${m.importance}] ${preview}`);
427
+ }
428
+ }
429
+ return {
430
+ content: [{ type: "text", text: lines.join("\n") }],
431
+ };
432
+ });
192
433
  }
193
434
  //# sourceMappingURL=tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apex-memory",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "description": "Persistent memory MCP server for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,10 +19,19 @@
19
19
  ],
20
20
  "keywords": [
21
21
  "mcp",
22
+ "model-context-protocol",
22
23
  "memory",
23
24
  "ai",
24
25
  "coding-agents",
25
- "persistent-context"
26
+ "persistent-context",
27
+ "claude-code",
28
+ "cursor",
29
+ "windsurf",
30
+ "cline",
31
+ "sqlite",
32
+ "session-tracking",
33
+ "agent-memory",
34
+ "typescript"
26
35
  ],
27
36
  "license": "MIT",
28
37
  "repository": {