agent-working-memory 0.3.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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +311 -0
  3. package/dist/api/index.d.ts +2 -0
  4. package/dist/api/index.d.ts.map +1 -0
  5. package/dist/api/index.js +2 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/api/routes.d.ts +53 -0
  8. package/dist/api/routes.d.ts.map +1 -0
  9. package/dist/api/routes.js +388 -0
  10. package/dist/api/routes.js.map +1 -0
  11. package/dist/cli.d.ts +12 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +245 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/core/decay.d.ts +36 -0
  16. package/dist/core/decay.d.ts.map +1 -0
  17. package/dist/core/decay.js +38 -0
  18. package/dist/core/decay.js.map +1 -0
  19. package/dist/core/embeddings.d.ts +33 -0
  20. package/dist/core/embeddings.d.ts.map +1 -0
  21. package/dist/core/embeddings.js +76 -0
  22. package/dist/core/embeddings.js.map +1 -0
  23. package/dist/core/hebbian.d.ts +38 -0
  24. package/dist/core/hebbian.d.ts.map +1 -0
  25. package/dist/core/hebbian.js +74 -0
  26. package/dist/core/hebbian.js.map +1 -0
  27. package/dist/core/index.d.ts +4 -0
  28. package/dist/core/index.d.ts.map +1 -0
  29. package/dist/core/index.js +4 -0
  30. package/dist/core/index.js.map +1 -0
  31. package/dist/core/query-expander.d.ts +24 -0
  32. package/dist/core/query-expander.d.ts.map +1 -0
  33. package/dist/core/query-expander.js +58 -0
  34. package/dist/core/query-expander.js.map +1 -0
  35. package/dist/core/reranker.d.ts +25 -0
  36. package/dist/core/reranker.d.ts.map +1 -0
  37. package/dist/core/reranker.js +75 -0
  38. package/dist/core/reranker.js.map +1 -0
  39. package/dist/core/salience.d.ts +30 -0
  40. package/dist/core/salience.d.ts.map +1 -0
  41. package/dist/core/salience.js +81 -0
  42. package/dist/core/salience.js.map +1 -0
  43. package/dist/engine/activation.d.ts +38 -0
  44. package/dist/engine/activation.d.ts.map +1 -0
  45. package/dist/engine/activation.js +516 -0
  46. package/dist/engine/activation.js.map +1 -0
  47. package/dist/engine/connections.d.ts +31 -0
  48. package/dist/engine/connections.d.ts.map +1 -0
  49. package/dist/engine/connections.js +74 -0
  50. package/dist/engine/connections.js.map +1 -0
  51. package/dist/engine/consolidation-scheduler.d.ts +31 -0
  52. package/dist/engine/consolidation-scheduler.d.ts.map +1 -0
  53. package/dist/engine/consolidation-scheduler.js +115 -0
  54. package/dist/engine/consolidation-scheduler.js.map +1 -0
  55. package/dist/engine/consolidation.d.ts +62 -0
  56. package/dist/engine/consolidation.d.ts.map +1 -0
  57. package/dist/engine/consolidation.js +368 -0
  58. package/dist/engine/consolidation.js.map +1 -0
  59. package/dist/engine/eval.d.ts +22 -0
  60. package/dist/engine/eval.d.ts.map +1 -0
  61. package/dist/engine/eval.js +79 -0
  62. package/dist/engine/eval.js.map +1 -0
  63. package/dist/engine/eviction.d.ts +29 -0
  64. package/dist/engine/eviction.d.ts.map +1 -0
  65. package/dist/engine/eviction.js +86 -0
  66. package/dist/engine/eviction.js.map +1 -0
  67. package/dist/engine/index.d.ts +7 -0
  68. package/dist/engine/index.d.ts.map +1 -0
  69. package/dist/engine/index.js +7 -0
  70. package/dist/engine/index.js.map +1 -0
  71. package/dist/engine/retraction.d.ts +32 -0
  72. package/dist/engine/retraction.d.ts.map +1 -0
  73. package/dist/engine/retraction.js +77 -0
  74. package/dist/engine/retraction.js.map +1 -0
  75. package/dist/engine/staging.d.ts +33 -0
  76. package/dist/engine/staging.d.ts.map +1 -0
  77. package/dist/engine/staging.js +63 -0
  78. package/dist/engine/staging.js.map +1 -0
  79. package/dist/index.d.ts +2 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +95 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/mcp.d.ts +24 -0
  84. package/dist/mcp.d.ts.map +1 -0
  85. package/dist/mcp.js +532 -0
  86. package/dist/mcp.js.map +1 -0
  87. package/dist/storage/index.d.ts +2 -0
  88. package/dist/storage/index.d.ts.map +1 -0
  89. package/dist/storage/index.js +2 -0
  90. package/dist/storage/index.js.map +1 -0
  91. package/dist/storage/sqlite.d.ts +116 -0
  92. package/dist/storage/sqlite.d.ts.map +1 -0
  93. package/dist/storage/sqlite.js +750 -0
  94. package/dist/storage/sqlite.js.map +1 -0
  95. package/dist/types/agent.d.ts +30 -0
  96. package/dist/types/agent.d.ts.map +1 -0
  97. package/dist/types/agent.js +23 -0
  98. package/dist/types/agent.js.map +1 -0
  99. package/dist/types/checkpoint.d.ts +50 -0
  100. package/dist/types/checkpoint.d.ts.map +1 -0
  101. package/dist/types/checkpoint.js +8 -0
  102. package/dist/types/checkpoint.js.map +1 -0
  103. package/dist/types/engram.d.ts +165 -0
  104. package/dist/types/engram.d.ts.map +1 -0
  105. package/dist/types/engram.js +8 -0
  106. package/dist/types/engram.js.map +1 -0
  107. package/dist/types/eval.d.ts +84 -0
  108. package/dist/types/eval.d.ts.map +1 -0
  109. package/dist/types/eval.js +11 -0
  110. package/dist/types/eval.js.map +1 -0
  111. package/dist/types/index.d.ts +5 -0
  112. package/dist/types/index.d.ts.map +1 -0
  113. package/dist/types/index.js +5 -0
  114. package/dist/types/index.js.map +1 -0
  115. package/package.json +55 -0
  116. package/src/api/index.ts +1 -0
  117. package/src/api/routes.ts +528 -0
  118. package/src/cli.ts +260 -0
  119. package/src/core/decay.ts +61 -0
  120. package/src/core/embeddings.ts +82 -0
  121. package/src/core/hebbian.ts +91 -0
  122. package/src/core/index.ts +3 -0
  123. package/src/core/query-expander.ts +64 -0
  124. package/src/core/reranker.ts +99 -0
  125. package/src/core/salience.ts +95 -0
  126. package/src/engine/activation.ts +577 -0
  127. package/src/engine/connections.ts +101 -0
  128. package/src/engine/consolidation-scheduler.ts +123 -0
  129. package/src/engine/consolidation.ts +443 -0
  130. package/src/engine/eval.ts +100 -0
  131. package/src/engine/eviction.ts +99 -0
  132. package/src/engine/index.ts +6 -0
  133. package/src/engine/retraction.ts +98 -0
  134. package/src/engine/staging.ts +72 -0
  135. package/src/index.ts +100 -0
  136. package/src/mcp.ts +635 -0
  137. package/src/storage/index.ts +1 -0
  138. package/src/storage/sqlite.ts +893 -0
  139. package/src/types/agent.ts +65 -0
  140. package/src/types/checkpoint.ts +44 -0
  141. package/src/types/engram.ts +194 -0
  142. package/src/types/eval.ts +98 -0
  143. package/src/types/index.ts +4 -0
@@ -0,0 +1,388 @@
1
+ /**
2
+ * API Routes — the black box interface agents interact with.
3
+ *
4
+ * Core (agent-facing):
5
+ * POST /memory/write — write a memory (salience filter decides disposition)
6
+ * POST /memory/activate — retrieve by context activation
7
+ * POST /memory/feedback — report whether a memory was useful
8
+ * POST /memory/retract — invalidate a wrong memory
9
+ *
10
+ * Checkpointing:
11
+ * POST /memory/checkpoint — save explicit execution state
12
+ * GET /memory/restore/:agentId — restore state + targeted recall + async mini-consolidation
13
+ *
14
+ * Task management:
15
+ * POST /task/create — create a prioritized task
16
+ * POST /task/update — update status, priority, or blocking
17
+ * GET /task/list/:agentId — list tasks (filtered by status)
18
+ * GET /task/next/:agentId — get highest-priority actionable task
19
+ *
20
+ * Diagnostic (debugging/eval):
21
+ * POST /memory/search — deterministic search (not cognitive)
22
+ * GET /memory/:id — get a specific engram
23
+ * GET /agent/:id/stats — memory stats for an agent
24
+ * GET /agent/:id/metrics — eval metrics
25
+ * POST /agent/register — register a new agent
26
+ *
27
+ * System:
28
+ * POST /system/evict — trigger eviction check
29
+ * POST /system/decay — trigger edge decay
30
+ * POST /system/consolidate — run sleep cycle (strengthen, decay, sweep)
31
+ * GET /health — health check
32
+ */
33
+ import { evaluateSalience } from '../core/salience.js';
34
+ import { DEFAULT_AGENT_CONFIG } from '../types/agent.js';
35
+ import { embed } from '../core/embeddings.js';
36
+ export function registerRoutes(app, deps) {
37
+ const { store, activationEngine, connectionEngine, evictionEngine, retractionEngine, evalEngine, consolidationEngine, consolidationScheduler } = deps;
38
+ // ============================================================
39
+ // CORE — Agent-facing endpoints
40
+ // ============================================================
41
+ app.post('/memory/write', async (req, reply) => {
42
+ const body = req.body;
43
+ const salience = evaluateSalience({
44
+ content: body.content,
45
+ eventType: body.eventType,
46
+ surprise: body.surprise,
47
+ decisionMade: body.decisionMade,
48
+ causalDepth: body.causalDepth,
49
+ resolutionEffort: body.resolutionEffort,
50
+ });
51
+ if (salience.disposition === 'discard') {
52
+ return reply.code(200).send({
53
+ stored: false,
54
+ disposition: 'discard',
55
+ salience: salience.score,
56
+ reasonCodes: salience.reasonCodes,
57
+ });
58
+ }
59
+ const engram = store.createEngram({
60
+ agentId: body.agentId,
61
+ concept: body.concept,
62
+ content: body.content,
63
+ tags: body.tags,
64
+ salience: salience.score,
65
+ confidence: body.confidence,
66
+ salienceFeatures: salience.features,
67
+ reasonCodes: salience.reasonCodes,
68
+ ttl: salience.disposition === 'staging' ? DEFAULT_AGENT_CONFIG.stagingTtlMs : undefined,
69
+ });
70
+ if (salience.disposition === 'staging') {
71
+ store.updateStage(engram.id, 'staging');
72
+ }
73
+ // Create temporal adjacency edge to previous memory (conversation thread graph)
74
+ // This enables multi-hop graph walk through conversation sequences
75
+ try {
76
+ const prev = store.getLatestEngram(body.agentId, engram.id);
77
+ if (prev) {
78
+ store.upsertAssociation(prev.id, engram.id, 0.3, 'temporal', 0.8);
79
+ }
80
+ }
81
+ catch { /* Temporal edge creation is non-fatal */ }
82
+ if (salience.disposition === 'active') {
83
+ connectionEngine.enqueue(engram.id);
84
+ // Auto-assign to episode (1-hour window per agent)
85
+ try {
86
+ let episode = store.getActiveEpisode(body.agentId, 3600_000);
87
+ if (!episode) {
88
+ episode = store.createEpisode({ agentId: body.agentId, label: body.concept });
89
+ }
90
+ store.addEngramToEpisode(engram.id, episode.id);
91
+ }
92
+ catch { /* Episode assignment is non-fatal */ }
93
+ }
94
+ // Generate embedding asynchronously (don't block response)
95
+ embed(`${body.concept} ${body.content}`).then(vec => {
96
+ store.updateEmbedding(engram.id, vec);
97
+ }).catch(() => { }); // Embedding failure is non-fatal
98
+ // Auto-checkpoint: track write for consolidation scheduling
99
+ try {
100
+ store.updateAutoCheckpointWrite(body.agentId, engram.id);
101
+ }
102
+ catch { /* non-fatal */ }
103
+ return reply.code(201).send({
104
+ stored: true,
105
+ disposition: salience.disposition,
106
+ salience: salience.score,
107
+ reasonCodes: salience.reasonCodes,
108
+ engram,
109
+ });
110
+ });
111
+ app.post('/memory/activate', async (req, reply) => {
112
+ const body = req.body;
113
+ const results = await activationEngine.activate({
114
+ agentId: body.agentId,
115
+ context: body.context,
116
+ limit: body.limit,
117
+ minScore: body.minScore,
118
+ includeStaging: body.includeStaging,
119
+ useReranker: body.useReranker,
120
+ useExpansion: body.useExpansion,
121
+ abstentionThreshold: body.abstentionThreshold,
122
+ });
123
+ // Auto-checkpoint: track recall for consolidation scheduling
124
+ try {
125
+ const ids = results.map(r => r.engram.id);
126
+ store.updateAutoCheckpointRecall(body.agentId, body.context, ids);
127
+ }
128
+ catch { /* non-fatal */ }
129
+ return reply.send({ results });
130
+ });
131
+ app.post('/memory/feedback', async (req, reply) => {
132
+ const body = req.body;
133
+ store.logRetrievalFeedback(body.activationEventId ?? null, body.engramId, body.useful, body.context ?? '');
134
+ // Update engram confidence based on feedback
135
+ const engram = store.getEngram(body.engramId);
136
+ if (engram) {
137
+ const config = DEFAULT_AGENT_CONFIG;
138
+ const delta = body.useful
139
+ ? config.feedbackPositiveBoost
140
+ : -config.feedbackNegativePenalty;
141
+ store.updateConfidence(engram.id, engram.confidence + delta);
142
+ }
143
+ // Touch activity for consolidation scheduling
144
+ if (engram) {
145
+ try {
146
+ store.touchActivity(engram.agentId);
147
+ }
148
+ catch { /* non-fatal */ }
149
+ }
150
+ return reply.send({ recorded: true });
151
+ });
152
+ app.post('/memory/retract', async (req, reply) => {
153
+ const body = req.body;
154
+ const result = retractionEngine.retract({
155
+ agentId: body.agentId,
156
+ targetEngramId: body.targetEngramId,
157
+ reason: body.reason,
158
+ counterContent: body.counterContent,
159
+ });
160
+ // Touch activity for consolidation scheduling
161
+ try {
162
+ store.touchActivity(body.agentId);
163
+ }
164
+ catch { /* non-fatal */ }
165
+ return reply.send(result);
166
+ });
167
+ // ============================================================
168
+ // DIAGNOSTIC — Debugging and inspection
169
+ // ============================================================
170
+ app.post('/memory/search', async (req, reply) => {
171
+ const body = req.body;
172
+ const results = store.search({
173
+ agentId: body.agentId,
174
+ text: body.text,
175
+ concept: body.concept,
176
+ tags: body.tags,
177
+ stage: body.stage,
178
+ retracted: body.retracted,
179
+ limit: body.limit,
180
+ offset: body.offset,
181
+ });
182
+ return reply.send({ results, count: results.length });
183
+ });
184
+ app.get('/memory/:id', async (req, reply) => {
185
+ const { id } = req.params;
186
+ const engram = store.getEngram(id);
187
+ if (!engram)
188
+ return reply.code(404).send({ error: 'Not found' });
189
+ const associations = store.getAssociationsFor(id);
190
+ return reply.send({ engram, associations });
191
+ });
192
+ app.get('/agent/:id/stats', async (req, reply) => {
193
+ const { id } = req.params;
194
+ const active = store.getEngramsByAgent(id, 'active');
195
+ const staging = store.getEngramsByAgent(id, 'staging');
196
+ const retracted = store.getEngramsByAgent(id, undefined, true).filter(e => e.retracted);
197
+ const associations = store.getAllAssociations(id);
198
+ return reply.send({
199
+ agentId: id,
200
+ engrams: {
201
+ active: active.length,
202
+ staging: staging.length,
203
+ retracted: retracted.length,
204
+ total: active.length + staging.length + retracted.length,
205
+ },
206
+ associations: associations.length,
207
+ avgConfidence: active.length > 0
208
+ ? +(active.reduce((s, e) => s + e.confidence, 0) / active.length).toFixed(3)
209
+ : 0,
210
+ });
211
+ });
212
+ app.get('/agent/:id/metrics', async (req, reply) => {
213
+ const { id } = req.params;
214
+ const windowHours = parseInt(req.query.window ?? '24', 10);
215
+ const metrics = evalEngine.computeMetrics(id, windowHours);
216
+ return reply.send({ metrics });
217
+ });
218
+ app.post('/agent/register', async (req, reply) => {
219
+ const body = req.body;
220
+ const id = crypto.randomUUID();
221
+ return reply.code(201).send({
222
+ id,
223
+ name: body.name,
224
+ config: DEFAULT_AGENT_CONFIG,
225
+ });
226
+ });
227
+ // ============================================================
228
+ // SYSTEM — Maintenance operations
229
+ // ============================================================
230
+ app.post('/system/evict', async (req, reply) => {
231
+ const body = req.body;
232
+ const result = evictionEngine.enforceCapacity(body.agentId, DEFAULT_AGENT_CONFIG);
233
+ return reply.send(result);
234
+ });
235
+ app.post('/system/decay', async (req, reply) => {
236
+ const body = req.body;
237
+ const decayed = evictionEngine.decayEdges(body.agentId, body.halfLifeDays);
238
+ return reply.send({ edgesDecayed: decayed });
239
+ });
240
+ app.post('/system/consolidate', async (req, reply) => {
241
+ const body = req.body;
242
+ const result = consolidationEngine.consolidate(body.agentId);
243
+ return reply.send(result);
244
+ });
245
+ // ============================================================
246
+ // CHECKPOINTING — Conscious state preservation
247
+ // ============================================================
248
+ app.post('/memory/checkpoint', async (req, reply) => {
249
+ const body = req.body;
250
+ const state = {
251
+ currentTask: body.currentTask,
252
+ decisions: body.decisions ?? [],
253
+ activeFiles: body.activeFiles ?? [],
254
+ nextSteps: body.nextSteps ?? [],
255
+ relatedMemoryIds: body.relatedMemoryIds ?? [],
256
+ notes: body.notes ?? '',
257
+ episodeId: body.episodeId ?? null,
258
+ };
259
+ store.saveCheckpoint(body.agentId, state);
260
+ return reply.send({ saved: true, agentId: body.agentId });
261
+ });
262
+ app.get('/memory/restore/:agentId', async (req, reply) => {
263
+ const { agentId } = req.params;
264
+ const checkpoint = store.getCheckpoint(agentId);
265
+ const now = Date.now();
266
+ const idleMs = checkpoint
267
+ ? now - checkpoint.auto.lastActivityAt.getTime()
268
+ : 0;
269
+ // Get last written engram for context
270
+ let lastWrite = null;
271
+ if (checkpoint?.auto.lastWriteId) {
272
+ const engram = store.getEngram(checkpoint.auto.lastWriteId);
273
+ if (engram) {
274
+ lastWrite = { id: engram.id, concept: engram.concept, content: engram.content };
275
+ }
276
+ }
277
+ // Recall memories using last context (if available)
278
+ let recalledMemories = [];
279
+ const recallContext = checkpoint?.auto.lastRecallContext
280
+ ?? checkpoint?.executionState?.currentTask
281
+ ?? null;
282
+ if (recallContext) {
283
+ try {
284
+ const results = await activationEngine.activate({
285
+ agentId,
286
+ context: recallContext,
287
+ limit: 5,
288
+ minScore: 0.05,
289
+ useReranker: true,
290
+ useExpansion: true,
291
+ });
292
+ recalledMemories = results.map(r => ({
293
+ id: r.engram.id,
294
+ concept: r.engram.concept,
295
+ content: r.engram.content,
296
+ score: r.score,
297
+ }));
298
+ }
299
+ catch { /* recall failure is non-fatal */ }
300
+ }
301
+ // Trigger mini-consolidation if idle >5min (async, fire-and-forget)
302
+ const MINI_CONSOLIDATION_IDLE_MS = 5 * 60_000;
303
+ let miniConsolidationTriggered = false;
304
+ if (idleMs > MINI_CONSOLIDATION_IDLE_MS) {
305
+ miniConsolidationTriggered = true;
306
+ consolidationScheduler.runMiniConsolidation(agentId).catch(() => { });
307
+ }
308
+ return reply.send({
309
+ executionState: checkpoint?.executionState ?? null,
310
+ checkpointAt: checkpoint?.checkpointAt ?? null,
311
+ recalledMemories,
312
+ lastWrite,
313
+ idleMs,
314
+ miniConsolidationTriggered,
315
+ });
316
+ });
317
+ // ============================================================
318
+ // TASK MANAGEMENT
319
+ // ============================================================
320
+ app.post('/task/create', async (req, reply) => {
321
+ const body = req.body;
322
+ const engram = store.createEngram({
323
+ agentId: body.agentId,
324
+ concept: body.concept,
325
+ content: body.content,
326
+ tags: [...(body.tags ?? []), 'task'],
327
+ salience: 0.9,
328
+ confidence: 0.8,
329
+ salienceFeatures: {
330
+ surprise: 0.5, decisionMade: true, causalDepth: 0.5,
331
+ resolutionEffort: 0.5, eventType: 'decision',
332
+ },
333
+ reasonCodes: ['task-created'],
334
+ taskStatus: body.blockedBy ? 'blocked' : 'open',
335
+ taskPriority: body.priority ?? 'medium',
336
+ blockedBy: body.blockedBy,
337
+ });
338
+ connectionEngine.enqueue(engram.id);
339
+ embed(`${body.concept} ${body.content}`).then(vec => {
340
+ store.updateEmbedding(engram.id, vec);
341
+ }).catch(() => { });
342
+ return reply.send(engram);
343
+ });
344
+ app.post('/task/update', async (req, reply) => {
345
+ const body = req.body;
346
+ const engram = store.getEngram(body.taskId);
347
+ if (!engram || !engram.taskStatus) {
348
+ return reply.code(404).send({ error: 'Task not found' });
349
+ }
350
+ if (body.blockedBy !== undefined) {
351
+ store.updateBlockedBy(body.taskId, body.blockedBy);
352
+ }
353
+ if (body.status) {
354
+ store.updateTaskStatus(body.taskId, body.status);
355
+ }
356
+ if (body.priority) {
357
+ store.updateTaskPriority(body.taskId, body.priority);
358
+ }
359
+ return reply.send(store.getEngram(body.taskId));
360
+ });
361
+ app.get('/task/list/:agentId', async (req, reply) => {
362
+ const { agentId } = req.params;
363
+ const { status, includeDone } = req.query;
364
+ let tasks = store.getTasks(agentId, status);
365
+ if (includeDone !== 'true' && !status) {
366
+ tasks = tasks.filter(t => t.taskStatus !== 'done');
367
+ }
368
+ return reply.send({ tasks, count: tasks.length });
369
+ });
370
+ app.get('/task/next/:agentId', async (req, reply) => {
371
+ const { agentId } = req.params;
372
+ const next = store.getNextTask(agentId);
373
+ return reply.send(next ? { task: next } : { task: null, message: 'No actionable tasks' });
374
+ });
375
+ // Time warp — shift all timestamps backward by N days (for testing)
376
+ app.post('/system/time-warp', async (req, reply) => {
377
+ const body = req.body;
378
+ const ms = body.days * 24 * 60 * 60 * 1000;
379
+ const shifted = store.timeWarp(body.agentId, ms);
380
+ return reply.send({ shifted, days: body.days });
381
+ });
382
+ app.get('/health', async () => ({
383
+ status: 'ok',
384
+ timestamp: new Date().toISOString(),
385
+ version: '0.3.0',
386
+ }));
387
+ }
388
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/api/routes.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entrypoint for AgentWorkingMemory.
4
+ *
5
+ * Commands:
6
+ * awm setup — configure MCP for the current project
7
+ * awm mcp — start the MCP server (called by Claude Code)
8
+ * awm serve — start the HTTP API server
9
+ * awm health — check if a running server is healthy
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
package/dist/cli.js ADDED
@@ -0,0 +1,245 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entrypoint for AgentWorkingMemory.
4
+ *
5
+ * Commands:
6
+ * awm setup — configure MCP for the current project
7
+ * awm mcp — start the MCP server (called by Claude Code)
8
+ * awm serve — start the HTTP API server
9
+ * awm health — check if a running server is healthy
10
+ */
11
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
12
+ import { resolve, basename, join, dirname } from 'node:path';
13
+ import { execSync } from 'node:child_process';
14
+ import { fileURLToPath } from 'node:url';
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const __dirname = dirname(__filename);
17
+ // Load .env if present
18
+ try {
19
+ const envPath = resolve(process.cwd(), '.env');
20
+ const envContent = readFileSync(envPath, 'utf-8');
21
+ for (const line of envContent.split('\n')) {
22
+ const trimmed = line.trim();
23
+ if (!trimmed || trimmed.startsWith('#'))
24
+ continue;
25
+ const eqIdx = trimmed.indexOf('=');
26
+ if (eqIdx === -1)
27
+ continue;
28
+ const key = trimmed.slice(0, eqIdx).trim();
29
+ const val = trimmed.slice(eqIdx + 1).trim().replace(/^["']|["']$/g, '');
30
+ if (!process.env[key])
31
+ process.env[key] = val;
32
+ }
33
+ }
34
+ catch { /* No .env file */ }
35
+ const args = process.argv.slice(2);
36
+ const command = args[0];
37
+ function printUsage() {
38
+ console.log(`
39
+ AgentWorkingMemory — Cognitive memory for AI agents
40
+
41
+ Usage:
42
+ awm setup [--agent-id <id>] [--db-path <path>] [--no-claude-md]
43
+ Configure MCP for current project
44
+ awm mcp Start MCP server (used by Claude Code)
45
+ awm serve [--port <port>] Start HTTP API server
46
+ awm health [--port <port>] Check server health
47
+
48
+ Setup:
49
+ Run 'awm setup' in your project directory. This creates .mcp.json
50
+ and appends workflow instructions to CLAUDE.md so Claude Code
51
+ automatically connects to your memory layer.
52
+
53
+ Use --no-claude-md to skip CLAUDE.md modification.
54
+ Restart Claude Code after setup to pick up the new MCP server.
55
+ `.trim());
56
+ }
57
+ // ─── SETUP ──────────────────────────────────────
58
+ function setup() {
59
+ const cwd = process.cwd();
60
+ const projectName = basename(cwd).toLowerCase().replace(/[^a-z0-9-]/g, '-');
61
+ // Parse flags
62
+ let agentId = projectName;
63
+ let dbPath = null;
64
+ let skipClaudeMd = false;
65
+ for (let i = 1; i < args.length; i++) {
66
+ if (args[i] === '--agent-id' && args[i + 1]) {
67
+ agentId = args[++i];
68
+ }
69
+ else if (args[i] === '--db-path' && args[i + 1]) {
70
+ dbPath = args[++i];
71
+ }
72
+ else if (args[i] === '--no-claude-md') {
73
+ skipClaudeMd = true;
74
+ }
75
+ }
76
+ // Find the package root (where src/mcp.ts lives)
77
+ const packageRoot = resolve(__dirname, '..');
78
+ const mcpScript = join(packageRoot, 'src', 'mcp.ts');
79
+ const mcpDist = join(packageRoot, 'dist', 'mcp.js');
80
+ // Determine DB path — default to <awm-root>/data/memory.db (shared across projects)
81
+ if (!dbPath) {
82
+ dbPath = join(packageRoot, 'data', 'memory.db');
83
+ }
84
+ const dbDir = dirname(dbPath);
85
+ // Ensure data directory exists
86
+ if (!existsSync(dbDir)) {
87
+ mkdirSync(dbDir, { recursive: true });
88
+ console.log(`Created data directory: ${dbDir}`);
89
+ }
90
+ // Determine command based on platform and whether dist exists
91
+ const isWindows = process.platform === 'win32';
92
+ const hasDist = existsSync(mcpDist);
93
+ let mcpConfig;
94
+ if (hasDist) {
95
+ // Use compiled JS (faster startup, no tsx needed)
96
+ mcpConfig = {
97
+ command: 'node',
98
+ args: [mcpDist.replace(/\\/g, '/')],
99
+ env: {
100
+ AWM_DB_PATH: dbPath.replace(/\\/g, '/'),
101
+ AWM_AGENT_ID: agentId,
102
+ },
103
+ };
104
+ }
105
+ else if (isWindows) {
106
+ mcpConfig = {
107
+ command: 'cmd',
108
+ args: ['/c', 'npx', 'tsx', mcpScript.replace(/\\/g, '/')],
109
+ env: {
110
+ AWM_DB_PATH: dbPath.replace(/\\/g, '/'),
111
+ AWM_AGENT_ID: agentId,
112
+ },
113
+ };
114
+ }
115
+ else {
116
+ mcpConfig = {
117
+ command: 'npx',
118
+ args: ['tsx', mcpScript],
119
+ env: {
120
+ AWM_DB_PATH: dbPath,
121
+ AWM_AGENT_ID: agentId,
122
+ },
123
+ };
124
+ }
125
+ // Read or create .mcp.json
126
+ const mcpJsonPath = join(cwd, '.mcp.json');
127
+ let existing = { mcpServers: {} };
128
+ if (existsSync(mcpJsonPath)) {
129
+ try {
130
+ existing = JSON.parse(readFileSync(mcpJsonPath, 'utf-8'));
131
+ if (!existing.mcpServers)
132
+ existing.mcpServers = {};
133
+ }
134
+ catch {
135
+ existing = { mcpServers: {} };
136
+ }
137
+ }
138
+ existing.mcpServers['agent-working-memory'] = mcpConfig;
139
+ writeFileSync(mcpJsonPath, JSON.stringify(existing, null, 2) + '\n');
140
+ // Auto-append CLAUDE.md snippet unless --no-claude-md
141
+ let claudeMdAction = '';
142
+ const claudeMdSnippet = `
143
+
144
+ ## Memory (AWM)
145
+ You have persistent memory via the agent-working-memory MCP server.
146
+ - At conversation start: call memory_restore to recover previous context
147
+ - When you learn something important: call memory_write
148
+ - When you need past context: call memory_recall
149
+ - Before long operations: call memory_checkpoint to save your state
150
+ - After using a recalled memory: call memory_feedback (useful/not-useful)
151
+ - To retract incorrect info: call memory_retract
152
+ - To manage tasks: call memory_task_add, memory_task_update, memory_task_list, memory_task_next
153
+ `;
154
+ const claudeMdPath = join(cwd, 'CLAUDE.md');
155
+ if (skipClaudeMd) {
156
+ claudeMdAction = ' CLAUDE.md: skipped (--no-claude-md)';
157
+ }
158
+ else if (existsSync(claudeMdPath)) {
159
+ const content = readFileSync(claudeMdPath, 'utf-8');
160
+ if (content.includes('## Memory (AWM)')) {
161
+ claudeMdAction = ' CLAUDE.md: already has AWM section (skipped)';
162
+ }
163
+ else {
164
+ writeFileSync(claudeMdPath, content.trimEnd() + '\n' + claudeMdSnippet);
165
+ claudeMdAction = ' CLAUDE.md: appended AWM workflow section';
166
+ }
167
+ }
168
+ else {
169
+ writeFileSync(claudeMdPath, `# ${basename(cwd)}\n${claudeMdSnippet}`);
170
+ claudeMdAction = ' CLAUDE.md: created with AWM workflow section';
171
+ }
172
+ console.log(`
173
+ AWM configured for: ${cwd}
174
+
175
+ Agent ID: ${agentId}
176
+ DB path: ${dbPath}
177
+ MCP config: ${mcpJsonPath}
178
+ ${claudeMdAction}
179
+
180
+ Next steps:
181
+ 1. Restart Claude Code to pick up the MCP server
182
+ 2. The memory tools will appear automatically
183
+ `.trim());
184
+ }
185
+ // ─── MCP ──────────────────────────────────────
186
+ async function mcp() {
187
+ // Dynamic import to avoid loading heavy deps for setup/health commands
188
+ await import('./mcp.js');
189
+ }
190
+ // ─── SERVE ──────────────────────────────────────
191
+ async function serve() {
192
+ // Parse --port flag
193
+ for (let i = 1; i < args.length; i++) {
194
+ if (args[i] === '--port' && args[i + 1]) {
195
+ process.env.AWM_PORT = args[++i];
196
+ }
197
+ }
198
+ await import('./index.js');
199
+ }
200
+ // ─── HEALTH ──────────────────────────────────────
201
+ function health() {
202
+ let port = '8400';
203
+ for (let i = 1; i < args.length; i++) {
204
+ if (args[i] === '--port' && args[i + 1]) {
205
+ port = args[++i];
206
+ }
207
+ }
208
+ try {
209
+ const result = execSync(`curl -sf http://localhost:${port}/health`, {
210
+ encoding: 'utf8',
211
+ timeout: 5000,
212
+ });
213
+ const data = JSON.parse(result);
214
+ console.log(`OK — v${data.version} (${data.timestamp})`);
215
+ }
216
+ catch {
217
+ console.error(`Cannot reach AWM server on port ${port}`);
218
+ process.exit(1);
219
+ }
220
+ }
221
+ // ─── Dispatch ──────────────────────────────────────
222
+ switch (command) {
223
+ case 'setup':
224
+ setup();
225
+ break;
226
+ case 'mcp':
227
+ mcp();
228
+ break;
229
+ case 'serve':
230
+ serve();
231
+ break;
232
+ case 'health':
233
+ health();
234
+ break;
235
+ case '--help':
236
+ case '-h':
237
+ case undefined:
238
+ printUsage();
239
+ break;
240
+ default:
241
+ console.error(`Unknown command: ${command}`);
242
+ printUsage();
243
+ process.exit(1);
244
+ }
245
+ //# sourceMappingURL=cli.js.map