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.
- package/LICENSE +21 -0
- package/README.md +311 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +2 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/routes.d.ts +53 -0
- package/dist/api/routes.d.ts.map +1 -0
- package/dist/api/routes.js +388 -0
- package/dist/api/routes.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +245 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/decay.d.ts +36 -0
- package/dist/core/decay.d.ts.map +1 -0
- package/dist/core/decay.js +38 -0
- package/dist/core/decay.js.map +1 -0
- package/dist/core/embeddings.d.ts +33 -0
- package/dist/core/embeddings.d.ts.map +1 -0
- package/dist/core/embeddings.js +76 -0
- package/dist/core/embeddings.js.map +1 -0
- package/dist/core/hebbian.d.ts +38 -0
- package/dist/core/hebbian.d.ts.map +1 -0
- package/dist/core/hebbian.js +74 -0
- package/dist/core/hebbian.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/query-expander.d.ts +24 -0
- package/dist/core/query-expander.d.ts.map +1 -0
- package/dist/core/query-expander.js +58 -0
- package/dist/core/query-expander.js.map +1 -0
- package/dist/core/reranker.d.ts +25 -0
- package/dist/core/reranker.d.ts.map +1 -0
- package/dist/core/reranker.js +75 -0
- package/dist/core/reranker.js.map +1 -0
- package/dist/core/salience.d.ts +30 -0
- package/dist/core/salience.d.ts.map +1 -0
- package/dist/core/salience.js +81 -0
- package/dist/core/salience.js.map +1 -0
- package/dist/engine/activation.d.ts +38 -0
- package/dist/engine/activation.d.ts.map +1 -0
- package/dist/engine/activation.js +516 -0
- package/dist/engine/activation.js.map +1 -0
- package/dist/engine/connections.d.ts +31 -0
- package/dist/engine/connections.d.ts.map +1 -0
- package/dist/engine/connections.js +74 -0
- package/dist/engine/connections.js.map +1 -0
- package/dist/engine/consolidation-scheduler.d.ts +31 -0
- package/dist/engine/consolidation-scheduler.d.ts.map +1 -0
- package/dist/engine/consolidation-scheduler.js +115 -0
- package/dist/engine/consolidation-scheduler.js.map +1 -0
- package/dist/engine/consolidation.d.ts +62 -0
- package/dist/engine/consolidation.d.ts.map +1 -0
- package/dist/engine/consolidation.js +368 -0
- package/dist/engine/consolidation.js.map +1 -0
- package/dist/engine/eval.d.ts +22 -0
- package/dist/engine/eval.d.ts.map +1 -0
- package/dist/engine/eval.js +79 -0
- package/dist/engine/eval.js.map +1 -0
- package/dist/engine/eviction.d.ts +29 -0
- package/dist/engine/eviction.d.ts.map +1 -0
- package/dist/engine/eviction.js +86 -0
- package/dist/engine/eviction.js.map +1 -0
- package/dist/engine/index.d.ts +7 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +7 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/retraction.d.ts +32 -0
- package/dist/engine/retraction.d.ts.map +1 -0
- package/dist/engine/retraction.js +77 -0
- package/dist/engine/retraction.js.map +1 -0
- package/dist/engine/staging.d.ts +33 -0
- package/dist/engine/staging.d.ts.map +1 -0
- package/dist/engine/staging.js +63 -0
- package/dist/engine/staging.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +24 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +532 -0
- package/dist/mcp.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/sqlite.d.ts +116 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +750 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/types/agent.d.ts +30 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +23 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/checkpoint.d.ts +50 -0
- package/dist/types/checkpoint.d.ts.map +1 -0
- package/dist/types/checkpoint.js +8 -0
- package/dist/types/checkpoint.js.map +1 -0
- package/dist/types/engram.d.ts +165 -0
- package/dist/types/engram.d.ts.map +1 -0
- package/dist/types/engram.js +8 -0
- package/dist/types/engram.js.map +1 -0
- package/dist/types/eval.d.ts +84 -0
- package/dist/types/eval.d.ts.map +1 -0
- package/dist/types/eval.js +11 -0
- package/dist/types/eval.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +55 -0
- package/src/api/index.ts +1 -0
- package/src/api/routes.ts +528 -0
- package/src/cli.ts +260 -0
- package/src/core/decay.ts +61 -0
- package/src/core/embeddings.ts +82 -0
- package/src/core/hebbian.ts +91 -0
- package/src/core/index.ts +3 -0
- package/src/core/query-expander.ts +64 -0
- package/src/core/reranker.ts +99 -0
- package/src/core/salience.ts +95 -0
- package/src/engine/activation.ts +577 -0
- package/src/engine/connections.ts +101 -0
- package/src/engine/consolidation-scheduler.ts +123 -0
- package/src/engine/consolidation.ts +443 -0
- package/src/engine/eval.ts +100 -0
- package/src/engine/eviction.ts +99 -0
- package/src/engine/index.ts +6 -0
- package/src/engine/retraction.ts +98 -0
- package/src/engine/staging.ts +72 -0
- package/src/index.ts +100 -0
- package/src/mcp.ts +635 -0
- package/src/storage/index.ts +1 -0
- package/src/storage/sqlite.ts +893 -0
- package/src/types/agent.ts +65 -0
- package/src/types/checkpoint.ts +44 -0
- package/src/types/engram.ts +194 -0
- package/src/types/eval.ts +98 -0
- 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
|