agent-working-memory 0.7.16 → 0.8.5
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 +156 -15
- package/dist/adapters/claude-code.d.ts.map +1 -1
- package/dist/adapters/claude-code.js +2 -16
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/adapters/codex.d.ts.map +1 -1
- package/dist/adapters/codex.js +2 -11
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/common.d.ts +18 -0
- package/dist/adapters/common.d.ts.map +1 -1
- package/dist/adapters/common.js +254 -141
- package/dist/adapters/common.js.map +1 -1
- package/dist/adapters/cursor.d.ts.map +1 -1
- package/dist/adapters/cursor.js +2 -15
- package/dist/adapters/cursor.js.map +1 -1
- package/dist/adapters/http.d.ts.map +1 -1
- package/dist/adapters/http.js +28 -34
- package/dist/adapters/http.js.map +1 -1
- package/dist/api/routes.d.ts +1 -1
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +280 -113
- package/dist/api/routes.js.map +1 -1
- package/dist/cli/migrate.d.ts +42 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/migrate.js +268 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli.js +45 -1
- package/dist/cli.js.map +1 -1
- package/dist/coordination/circuit-breaker.d.ts +24 -0
- package/dist/coordination/circuit-breaker.d.ts.map +1 -0
- package/dist/coordination/circuit-breaker.js +70 -0
- package/dist/coordination/circuit-breaker.js.map +1 -0
- package/dist/coordination/failure-modes.d.ts +21 -0
- package/dist/coordination/failure-modes.d.ts.map +1 -0
- package/dist/coordination/failure-modes.js +49 -0
- package/dist/coordination/failure-modes.js.map +1 -0
- package/dist/coordination/peer-decisions.js +7 -7
- package/dist/coordination/routes.d.ts.map +1 -1
- package/dist/coordination/routes.js +44 -1
- package/dist/coordination/routes.js.map +1 -1
- package/dist/coordination/schema.d.ts.map +1 -1
- package/dist/coordination/schema.js +18 -0
- package/dist/coordination/schema.js.map +1 -1
- package/dist/coordination/schemas.d.ts +9 -9
- package/dist/coordination/stale.d.ts +9 -1
- package/dist/coordination/stale.d.ts.map +1 -1
- package/dist/coordination/stale.js +53 -9
- package/dist/coordination/stale.js.map +1 -1
- package/dist/core/embeddings.d.ts +16 -10
- package/dist/core/embeddings.d.ts.map +1 -1
- package/dist/core/embeddings.js +54 -38
- package/dist/core/embeddings.js.map +1 -1
- package/dist/core/ml-worker-entry.d.ts +17 -0
- package/dist/core/ml-worker-entry.d.ts.map +1 -0
- package/dist/core/ml-worker-entry.js +193 -0
- package/dist/core/ml-worker-entry.js.map +1 -0
- package/dist/core/ml-worker.d.ts +59 -0
- package/dist/core/ml-worker.d.ts.map +1 -0
- package/dist/core/ml-worker.js +253 -0
- package/dist/core/ml-worker.js.map +1 -0
- package/dist/core/query-expander.d.ts +13 -15
- package/dist/core/query-expander.d.ts.map +1 -1
- package/dist/core/query-expander.js +48 -54
- package/dist/core/query-expander.js.map +1 -1
- package/dist/core/reranker.d.ts +9 -19
- package/dist/core/reranker.d.ts.map +1 -1
- package/dist/core/reranker.js +33 -35
- package/dist/core/reranker.js.map +1 -1
- package/dist/core/salience.d.ts +32 -5
- package/dist/core/salience.d.ts.map +1 -1
- package/dist/core/salience.js +201 -28
- package/dist/core/salience.js.map +1 -1
- package/dist/core/write-pipeline.d.ts +128 -0
- package/dist/core/write-pipeline.d.ts.map +1 -0
- package/dist/core/write-pipeline.js +405 -0
- package/dist/core/write-pipeline.js.map +1 -0
- package/dist/engine/activation.d.ts +2 -2
- package/dist/engine/activation.d.ts.map +1 -1
- package/dist/engine/activation.js +238 -115
- package/dist/engine/activation.js.map +1 -1
- package/dist/engine/confidence.d.ts +62 -0
- package/dist/engine/confidence.d.ts.map +1 -0
- package/dist/engine/confidence.js +100 -0
- package/dist/engine/confidence.js.map +1 -0
- package/dist/engine/connections.d.ts +47 -8
- package/dist/engine/connections.d.ts.map +1 -1
- package/dist/engine/connections.js +83 -22
- package/dist/engine/connections.js.map +1 -1
- package/dist/engine/consolidation-scheduler.d.ts +46 -10
- package/dist/engine/consolidation-scheduler.d.ts.map +1 -1
- package/dist/engine/consolidation-scheduler.js +170 -50
- package/dist/engine/consolidation-scheduler.js.map +1 -1
- package/dist/engine/consolidation.d.ts +16 -2
- package/dist/engine/consolidation.d.ts.map +1 -1
- package/dist/engine/consolidation.js +143 -44
- package/dist/engine/consolidation.js.map +1 -1
- package/dist/engine/eval.d.ts +2 -2
- package/dist/engine/eval.d.ts.map +1 -1
- package/dist/engine/eval.js +9 -9
- package/dist/engine/eval.js.map +1 -1
- package/dist/engine/eviction.d.ts +4 -4
- package/dist/engine/eviction.d.ts.map +1 -1
- package/dist/engine/eviction.js +15 -15
- package/dist/engine/eviction.js.map +1 -1
- package/dist/engine/retraction.d.ts +93 -5
- package/dist/engine/retraction.d.ts.map +1 -1
- package/dist/engine/retraction.js +238 -19
- package/dist/engine/retraction.js.map +1 -1
- package/dist/engine/staging.d.ts +1 -1
- package/dist/engine/staging.d.ts.map +1 -1
- package/dist/engine/staging.js +3 -3
- package/dist/engine/staging.js.map +1 -1
- package/dist/hooks/sidecar.d.ts +1 -1
- package/dist/hooks/sidecar.d.ts.map +1 -1
- package/dist/hooks/sidecar.js +4 -4
- package/dist/hooks/sidecar.js.map +1 -1
- package/dist/index.js +48 -31
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +110 -155
- package/dist/mcp.js.map +1 -1
- package/dist/storage/factory.d.ts +55 -0
- package/dist/storage/factory.d.ts.map +1 -0
- package/dist/storage/factory.js +135 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/pglite-schema.d.ts +20 -0
- package/dist/storage/pglite-schema.d.ts.map +1 -0
- package/dist/storage/pglite-schema.js +165 -0
- package/dist/storage/pglite-schema.js.map +1 -0
- package/dist/storage/pglite.d.ts +187 -0
- package/dist/storage/pglite.d.ts.map +1 -0
- package/dist/storage/pglite.js +1114 -0
- package/dist/storage/pglite.js.map +1 -0
- package/dist/storage/sqlite.d.ts +117 -0
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +357 -8
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/storage/store.d.ts +63 -0
- package/dist/storage/store.d.ts.map +1 -0
- package/dist/storage/store.js +27 -0
- package/dist/storage/store.js.map +1 -0
- package/dist/types/engram.d.ts +92 -2
- package/dist/types/engram.d.ts.map +1 -1
- package/dist/types/engram.js.map +1 -1
- package/package.json +3 -1
- package/src/adapters/claude-code.ts +218 -234
- package/src/adapters/codex.ts +252 -262
- package/src/adapters/common.ts +411 -284
- package/src/adapters/cursor.ts +135 -150
- package/src/adapters/http.ts +93 -100
- package/src/adapters/index.ts +31 -31
- package/src/adapters/types.ts +75 -75
- package/src/api/index.ts +3 -3
- package/src/api/routes.ts +367 -120
- package/src/cli/migrate.ts +307 -0
- package/src/cli.ts +37 -1
- package/src/coordination/circuit-breaker.ts +83 -0
- package/src/coordination/events.ts +90 -90
- package/src/coordination/failure-modes.ts +50 -0
- package/src/coordination/peer-decisions.ts +105 -105
- package/src/coordination/plugin-loader.ts +60 -60
- package/src/coordination/plugin.ts +44 -44
- package/src/coordination/routes.ts +56 -1
- package/src/coordination/schema.ts +13 -0
- package/src/coordination/stale.ts +80 -11
- package/src/coordination/types.ts +311 -311
- package/src/coordination/write-mutex.ts +69 -69
- package/src/core/auto-tagger.ts +168 -168
- package/src/core/decay.ts +63 -63
- package/src/core/embeddings.ts +110 -93
- package/src/core/index.ts +5 -5
- package/src/core/logger.ts +36 -36
- package/src/core/ml-worker-entry.ts +194 -0
- package/src/core/ml-worker.ts +281 -0
- package/src/core/query-expander.ts +122 -128
- package/src/core/reranker.ts +119 -125
- package/src/core/salience.ts +200 -33
- package/src/core/write-pipeline.ts +521 -0
- package/src/engine/activation.ts +235 -109
- package/src/engine/confidence.ts +120 -0
- package/src/engine/connections.ts +162 -103
- package/src/engine/consolidation-scheduler.ts +242 -125
- package/src/engine/consolidation.ts +138 -45
- package/src/engine/eval.ts +102 -102
- package/src/engine/eviction.ts +101 -101
- package/src/engine/index.ts +8 -8
- package/src/engine/retraction.ts +366 -116
- package/src/engine/staging.ts +74 -74
- package/src/hooks/sidecar.ts +5 -5
- package/src/index.ts +42 -28
- package/src/mcp.ts +105 -152
- package/src/storage/factory.ts +147 -0
- package/src/storage/index.ts +3 -3
- package/src/storage/pglite-schema.ts +166 -0
- package/src/storage/pglite.ts +1363 -0
- package/src/storage/sqlite.ts +402 -7
- package/src/storage/store.ts +80 -0
- package/src/types/agent.ts +67 -67
- package/src/types/checkpoint.ts +46 -46
- package/src/types/engram.ts +101 -3
- package/src/types/eval.ts +100 -100
- package/src/types/index.ts +6 -6
package/src/hooks/sidecar.ts
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';
|
|
20
20
|
import { readFileSync, existsSync } from 'node:fs';
|
|
21
|
-
import type { EngramStore } from '../storage/
|
|
21
|
+
import type { IEngramStore as EngramStore } from '../storage/store.js';
|
|
22
22
|
import type { ConsciousState } from '../types/checkpoint.js';
|
|
23
23
|
import { log, getLogPath } from '../core/logger.js';
|
|
24
24
|
|
|
@@ -211,7 +211,7 @@ export function startSidecar(deps: SidecarDeps): { close: () => void } {
|
|
|
211
211
|
episodeId: null,
|
|
212
212
|
};
|
|
213
213
|
|
|
214
|
-
store.saveCheckpoint(agentId, state);
|
|
214
|
+
await store.saveCheckpoint(agentId, state);
|
|
215
215
|
log(agentId, `hook:${event}`, `auto-checkpoint files=${state.activeFiles.length} task="${state.currentTask.slice(0, 80)}"`);
|
|
216
216
|
|
|
217
217
|
// On SessionEnd: run full consolidation (sleep cycle) before process dies
|
|
@@ -255,9 +255,9 @@ export function startSidecar(deps: SidecarDeps): { close: () => void } {
|
|
|
255
255
|
});
|
|
256
256
|
|
|
257
257
|
// --- Silent auto-checkpoint every 15 minutes ---
|
|
258
|
-
const autoCheckpointTimer = setInterval(() => {
|
|
258
|
+
const autoCheckpointTimer = setInterval(async () => {
|
|
259
259
|
try {
|
|
260
|
-
const checkpoint = store.getCheckpoint(agentId);
|
|
260
|
+
const checkpoint = await store.getCheckpoint(agentId);
|
|
261
261
|
if (!checkpoint) return; // No state to save yet
|
|
262
262
|
|
|
263
263
|
// Only checkpoint if there's been activity since last auto-checkpoint
|
|
@@ -275,7 +275,7 @@ export function startSidecar(deps: SidecarDeps): { close: () => void } {
|
|
|
275
275
|
episodeId: checkpoint.executionState?.episodeId ?? null,
|
|
276
276
|
};
|
|
277
277
|
|
|
278
|
-
store.saveCheckpoint(agentId, state);
|
|
278
|
+
await store.saveCheckpoint(agentId, state);
|
|
279
279
|
log(agentId, 'hook:timer', `auto-checkpoint (${Math.round(sinceActivity / 60_000)}min since activity)`);
|
|
280
280
|
} catch { /* timer failure is non-fatal */ }
|
|
281
281
|
}, AUTO_CHECKPOINT_INTERVAL_MS);
|
package/src/index.ts
CHANGED
|
@@ -33,14 +33,18 @@ import { getEmbedder } from './core/embeddings.js';
|
|
|
33
33
|
import { getReranker } from './core/reranker.js';
|
|
34
34
|
import { getExpander } from './core/query-expander.js';
|
|
35
35
|
import { initLogger } from './core/logger.js';
|
|
36
|
+
import { openStore, getConfiguredBackend, type StoreBackend } from './storage/factory.js';
|
|
37
|
+
import type { IEngramStore } from './storage/store.js';
|
|
36
38
|
|
|
37
39
|
const PORT = parseInt(process.env.AWM_PORT ?? '8400', 10);
|
|
38
|
-
const
|
|
40
|
+
const BACKEND: StoreBackend = getConfiguredBackend();
|
|
41
|
+
const DB_PATH = process.env.AWM_DB_PATH ?? (BACKEND === 'pglite' ? 'memory-pglite' : 'memory.db');
|
|
39
42
|
const API_KEY = process.env.AWM_API_KEY ?? null;
|
|
40
43
|
|
|
41
44
|
async function main() {
|
|
42
|
-
// Auto-backup: copy DB to backups/ on startup (
|
|
43
|
-
|
|
45
|
+
// Auto-backup: copy DB to backups/ on startup (SQLite-only; PGlite is a
|
|
46
|
+
// directory and is backed up by snapshot/replication at the OS level).
|
|
47
|
+
if (BACKEND === 'sqlite' && existsSync(DB_PATH)) {
|
|
44
48
|
const dbDir = dirname(resolve(DB_PATH));
|
|
45
49
|
const backupDir = resolve(dbDir, 'backups');
|
|
46
50
|
mkdirSync(backupDir, { recursive: true });
|
|
@@ -57,11 +61,16 @@ async function main() {
|
|
|
57
61
|
// Logger — write activity to awm.log alongside the DB
|
|
58
62
|
initLogger(DB_PATH);
|
|
59
63
|
|
|
60
|
-
// Storage
|
|
61
|
-
|
|
64
|
+
// Storage — backend-agnostic open via the factory.
|
|
65
|
+
// Some routes (export, coordination health) are still SQLite-only and
|
|
66
|
+
// gracefully return 501 / skip when running on PGlite.
|
|
67
|
+
const { store: storeAny } = await openStore();
|
|
68
|
+
const store = storeAny as unknown as EngramStore;
|
|
62
69
|
|
|
63
|
-
// Integrity check
|
|
64
|
-
const integrity =
|
|
70
|
+
// Integrity check — SQLite-only. PGlite has its own consistency model.
|
|
71
|
+
const integrity = BACKEND === 'sqlite'
|
|
72
|
+
? store.integrityCheck()
|
|
73
|
+
: { ok: true, result: 'pglite: skipped' };
|
|
65
74
|
if (!integrity.ok) {
|
|
66
75
|
console.error(`DB integrity check FAILED: ${integrity.result}`);
|
|
67
76
|
// Close corrupt DB, restore from backup, and exit for process manager to restart
|
|
@@ -97,7 +106,7 @@ async function main() {
|
|
|
97
106
|
const evictionEngine = new EvictionEngine(store);
|
|
98
107
|
const retractionEngine = new RetractionEngine(store);
|
|
99
108
|
const evalEngine = new EvalEngine(store);
|
|
100
|
-
const consolidationEngine = new ConsolidationEngine(store);
|
|
109
|
+
const consolidationEngine = new ConsolidationEngine(store, connectionEngine);
|
|
101
110
|
const consolidationScheduler = new ConsolidationScheduler(store, consolidationEngine);
|
|
102
111
|
|
|
103
112
|
// API — disable Fastify's default request logging (too noisy for hive polling)
|
|
@@ -122,10 +131,12 @@ async function main() {
|
|
|
122
131
|
consolidationEngine, consolidationScheduler,
|
|
123
132
|
});
|
|
124
133
|
|
|
125
|
-
// Coordination module (opt-in via AWM_COORDINATION=true)
|
|
134
|
+
// Coordination module (opt-in via AWM_COORDINATION=true) — SQLite-only.
|
|
126
135
|
const { isCoordinationEnabled, initCoordination, stopCoordinationCleanup } = await import('./coordination/index.js');
|
|
127
|
-
if (isCoordinationEnabled()) {
|
|
136
|
+
if (isCoordinationEnabled() && BACKEND === 'sqlite') {
|
|
128
137
|
initCoordination(app, store.getDb(), store);
|
|
138
|
+
} else if (isCoordinationEnabled()) {
|
|
139
|
+
console.log(` Coordination requested but disabled — requires SQLite backend (current: ${BACKEND})`);
|
|
129
140
|
} else {
|
|
130
141
|
console.log(' Coordination module disabled (set AWM_COORDINATION=true to enable)');
|
|
131
142
|
}
|
|
@@ -154,7 +165,8 @@ async function main() {
|
|
|
154
165
|
}
|
|
155
166
|
} catch { /* cleanup is non-fatal */ }
|
|
156
167
|
|
|
157
|
-
|
|
168
|
+
// Periodic hot backup — SQLite-only. PGlite directory backups are an OS-level concern.
|
|
169
|
+
const backupTimer: ReturnType<typeof setInterval> | null = BACKEND === 'sqlite' ? setInterval(() => {
|
|
158
170
|
try {
|
|
159
171
|
const ts = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
160
172
|
const backupPath = resolve(backupDir, `${basename(DB_PATH, '.db')}-${ts}.db`);
|
|
@@ -168,38 +180,40 @@ async function main() {
|
|
|
168
180
|
} catch (err) {
|
|
169
181
|
console.warn(`[backup] failed: ${(err as Error).message}`);
|
|
170
182
|
}
|
|
171
|
-
}, 10 * 60_000)
|
|
183
|
+
}, 10 * 60_000) : null;
|
|
172
184
|
|
|
173
185
|
// Pre-load ML models (downloads on first run: embeddings ~22MB, reranker ~22MB, expander ~80MB)
|
|
174
186
|
getEmbedder().catch(err => console.warn('Embedding model unavailable:', err.message));
|
|
175
187
|
getReranker().catch(err => console.warn('Reranker model unavailable:', err.message));
|
|
176
188
|
getExpander().catch(err => console.warn('Query expander model unavailable:', err.message));
|
|
177
189
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
+
if (BACKEND === 'sqlite') {
|
|
191
|
+
setImmediate(() => {
|
|
192
|
+
try {
|
|
193
|
+
const t0 = Date.now();
|
|
194
|
+
store.warmSlimCache();
|
|
195
|
+
const stats = store.getSlimCacheStats();
|
|
196
|
+
console.log(` Slim cache warmed: ${stats.size} entries in ${Date.now() - t0}ms`);
|
|
197
|
+
} catch (err) {
|
|
198
|
+
console.warn(` Slim cache warm failed: ${(err as Error).message}`);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
}
|
|
190
202
|
|
|
191
203
|
// Start server
|
|
192
204
|
await app.listen({ port: PORT, host: '0.0.0.0' });
|
|
193
|
-
console.log(`AgentWorkingMemory v0.
|
|
205
|
+
console.log(`AgentWorkingMemory v0.8.5 listening on port ${PORT}`);
|
|
194
206
|
|
|
195
207
|
// Graceful shutdown
|
|
196
208
|
const shutdown = async () => {
|
|
197
|
-
clearInterval(backupTimer);
|
|
209
|
+
if (backupTimer) clearInterval(backupTimer);
|
|
198
210
|
await stopCoordinationCleanup();
|
|
199
211
|
consolidationScheduler.stop();
|
|
200
212
|
stagingBuffer.stop();
|
|
201
|
-
|
|
202
|
-
|
|
213
|
+
if (BACKEND === 'sqlite') {
|
|
214
|
+
try { store.walCheckpoint(); } catch { /* non-fatal */ }
|
|
215
|
+
}
|
|
216
|
+
try { await (store as any).close?.(); } catch { /* best-effort */ }
|
|
203
217
|
process.exit(0);
|
|
204
218
|
};
|
|
205
219
|
process.on('SIGINT', shutdown);
|