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.
Files changed (200) hide show
  1. package/README.md +156 -15
  2. package/dist/adapters/claude-code.d.ts.map +1 -1
  3. package/dist/adapters/claude-code.js +2 -16
  4. package/dist/adapters/claude-code.js.map +1 -1
  5. package/dist/adapters/codex.d.ts.map +1 -1
  6. package/dist/adapters/codex.js +2 -11
  7. package/dist/adapters/codex.js.map +1 -1
  8. package/dist/adapters/common.d.ts +18 -0
  9. package/dist/adapters/common.d.ts.map +1 -1
  10. package/dist/adapters/common.js +254 -141
  11. package/dist/adapters/common.js.map +1 -1
  12. package/dist/adapters/cursor.d.ts.map +1 -1
  13. package/dist/adapters/cursor.js +2 -15
  14. package/dist/adapters/cursor.js.map +1 -1
  15. package/dist/adapters/http.d.ts.map +1 -1
  16. package/dist/adapters/http.js +28 -34
  17. package/dist/adapters/http.js.map +1 -1
  18. package/dist/api/routes.d.ts +1 -1
  19. package/dist/api/routes.d.ts.map +1 -1
  20. package/dist/api/routes.js +280 -113
  21. package/dist/api/routes.js.map +1 -1
  22. package/dist/cli/migrate.d.ts +42 -0
  23. package/dist/cli/migrate.d.ts.map +1 -0
  24. package/dist/cli/migrate.js +268 -0
  25. package/dist/cli/migrate.js.map +1 -0
  26. package/dist/cli.js +45 -1
  27. package/dist/cli.js.map +1 -1
  28. package/dist/coordination/circuit-breaker.d.ts +24 -0
  29. package/dist/coordination/circuit-breaker.d.ts.map +1 -0
  30. package/dist/coordination/circuit-breaker.js +70 -0
  31. package/dist/coordination/circuit-breaker.js.map +1 -0
  32. package/dist/coordination/failure-modes.d.ts +21 -0
  33. package/dist/coordination/failure-modes.d.ts.map +1 -0
  34. package/dist/coordination/failure-modes.js +49 -0
  35. package/dist/coordination/failure-modes.js.map +1 -0
  36. package/dist/coordination/peer-decisions.js +7 -7
  37. package/dist/coordination/routes.d.ts.map +1 -1
  38. package/dist/coordination/routes.js +44 -1
  39. package/dist/coordination/routes.js.map +1 -1
  40. package/dist/coordination/schema.d.ts.map +1 -1
  41. package/dist/coordination/schema.js +18 -0
  42. package/dist/coordination/schema.js.map +1 -1
  43. package/dist/coordination/schemas.d.ts +9 -9
  44. package/dist/coordination/stale.d.ts +9 -1
  45. package/dist/coordination/stale.d.ts.map +1 -1
  46. package/dist/coordination/stale.js +53 -9
  47. package/dist/coordination/stale.js.map +1 -1
  48. package/dist/core/embeddings.d.ts +16 -10
  49. package/dist/core/embeddings.d.ts.map +1 -1
  50. package/dist/core/embeddings.js +54 -38
  51. package/dist/core/embeddings.js.map +1 -1
  52. package/dist/core/ml-worker-entry.d.ts +17 -0
  53. package/dist/core/ml-worker-entry.d.ts.map +1 -0
  54. package/dist/core/ml-worker-entry.js +193 -0
  55. package/dist/core/ml-worker-entry.js.map +1 -0
  56. package/dist/core/ml-worker.d.ts +59 -0
  57. package/dist/core/ml-worker.d.ts.map +1 -0
  58. package/dist/core/ml-worker.js +253 -0
  59. package/dist/core/ml-worker.js.map +1 -0
  60. package/dist/core/query-expander.d.ts +13 -15
  61. package/dist/core/query-expander.d.ts.map +1 -1
  62. package/dist/core/query-expander.js +48 -54
  63. package/dist/core/query-expander.js.map +1 -1
  64. package/dist/core/reranker.d.ts +9 -19
  65. package/dist/core/reranker.d.ts.map +1 -1
  66. package/dist/core/reranker.js +33 -35
  67. package/dist/core/reranker.js.map +1 -1
  68. package/dist/core/salience.d.ts +32 -5
  69. package/dist/core/salience.d.ts.map +1 -1
  70. package/dist/core/salience.js +201 -28
  71. package/dist/core/salience.js.map +1 -1
  72. package/dist/core/write-pipeline.d.ts +128 -0
  73. package/dist/core/write-pipeline.d.ts.map +1 -0
  74. package/dist/core/write-pipeline.js +405 -0
  75. package/dist/core/write-pipeline.js.map +1 -0
  76. package/dist/engine/activation.d.ts +2 -2
  77. package/dist/engine/activation.d.ts.map +1 -1
  78. package/dist/engine/activation.js +238 -115
  79. package/dist/engine/activation.js.map +1 -1
  80. package/dist/engine/confidence.d.ts +62 -0
  81. package/dist/engine/confidence.d.ts.map +1 -0
  82. package/dist/engine/confidence.js +100 -0
  83. package/dist/engine/confidence.js.map +1 -0
  84. package/dist/engine/connections.d.ts +47 -8
  85. package/dist/engine/connections.d.ts.map +1 -1
  86. package/dist/engine/connections.js +83 -22
  87. package/dist/engine/connections.js.map +1 -1
  88. package/dist/engine/consolidation-scheduler.d.ts +46 -10
  89. package/dist/engine/consolidation-scheduler.d.ts.map +1 -1
  90. package/dist/engine/consolidation-scheduler.js +170 -50
  91. package/dist/engine/consolidation-scheduler.js.map +1 -1
  92. package/dist/engine/consolidation.d.ts +16 -2
  93. package/dist/engine/consolidation.d.ts.map +1 -1
  94. package/dist/engine/consolidation.js +143 -44
  95. package/dist/engine/consolidation.js.map +1 -1
  96. package/dist/engine/eval.d.ts +2 -2
  97. package/dist/engine/eval.d.ts.map +1 -1
  98. package/dist/engine/eval.js +9 -9
  99. package/dist/engine/eval.js.map +1 -1
  100. package/dist/engine/eviction.d.ts +4 -4
  101. package/dist/engine/eviction.d.ts.map +1 -1
  102. package/dist/engine/eviction.js +15 -15
  103. package/dist/engine/eviction.js.map +1 -1
  104. package/dist/engine/retraction.d.ts +93 -5
  105. package/dist/engine/retraction.d.ts.map +1 -1
  106. package/dist/engine/retraction.js +238 -19
  107. package/dist/engine/retraction.js.map +1 -1
  108. package/dist/engine/staging.d.ts +1 -1
  109. package/dist/engine/staging.d.ts.map +1 -1
  110. package/dist/engine/staging.js +3 -3
  111. package/dist/engine/staging.js.map +1 -1
  112. package/dist/hooks/sidecar.d.ts +1 -1
  113. package/dist/hooks/sidecar.d.ts.map +1 -1
  114. package/dist/hooks/sidecar.js +4 -4
  115. package/dist/hooks/sidecar.js.map +1 -1
  116. package/dist/index.js +48 -31
  117. package/dist/index.js.map +1 -1
  118. package/dist/mcp.js +110 -155
  119. package/dist/mcp.js.map +1 -1
  120. package/dist/storage/factory.d.ts +55 -0
  121. package/dist/storage/factory.d.ts.map +1 -0
  122. package/dist/storage/factory.js +135 -0
  123. package/dist/storage/factory.js.map +1 -0
  124. package/dist/storage/pglite-schema.d.ts +20 -0
  125. package/dist/storage/pglite-schema.d.ts.map +1 -0
  126. package/dist/storage/pglite-schema.js +165 -0
  127. package/dist/storage/pglite-schema.js.map +1 -0
  128. package/dist/storage/pglite.d.ts +187 -0
  129. package/dist/storage/pglite.d.ts.map +1 -0
  130. package/dist/storage/pglite.js +1114 -0
  131. package/dist/storage/pglite.js.map +1 -0
  132. package/dist/storage/sqlite.d.ts +117 -0
  133. package/dist/storage/sqlite.d.ts.map +1 -1
  134. package/dist/storage/sqlite.js +357 -8
  135. package/dist/storage/sqlite.js.map +1 -1
  136. package/dist/storage/store.d.ts +63 -0
  137. package/dist/storage/store.d.ts.map +1 -0
  138. package/dist/storage/store.js +27 -0
  139. package/dist/storage/store.js.map +1 -0
  140. package/dist/types/engram.d.ts +92 -2
  141. package/dist/types/engram.d.ts.map +1 -1
  142. package/dist/types/engram.js.map +1 -1
  143. package/package.json +3 -1
  144. package/src/adapters/claude-code.ts +218 -234
  145. package/src/adapters/codex.ts +252 -262
  146. package/src/adapters/common.ts +411 -284
  147. package/src/adapters/cursor.ts +135 -150
  148. package/src/adapters/http.ts +93 -100
  149. package/src/adapters/index.ts +31 -31
  150. package/src/adapters/types.ts +75 -75
  151. package/src/api/index.ts +3 -3
  152. package/src/api/routes.ts +367 -120
  153. package/src/cli/migrate.ts +307 -0
  154. package/src/cli.ts +37 -1
  155. package/src/coordination/circuit-breaker.ts +83 -0
  156. package/src/coordination/events.ts +90 -90
  157. package/src/coordination/failure-modes.ts +50 -0
  158. package/src/coordination/peer-decisions.ts +105 -105
  159. package/src/coordination/plugin-loader.ts +60 -60
  160. package/src/coordination/plugin.ts +44 -44
  161. package/src/coordination/routes.ts +56 -1
  162. package/src/coordination/schema.ts +13 -0
  163. package/src/coordination/stale.ts +80 -11
  164. package/src/coordination/types.ts +311 -311
  165. package/src/coordination/write-mutex.ts +69 -69
  166. package/src/core/auto-tagger.ts +168 -168
  167. package/src/core/decay.ts +63 -63
  168. package/src/core/embeddings.ts +110 -93
  169. package/src/core/index.ts +5 -5
  170. package/src/core/logger.ts +36 -36
  171. package/src/core/ml-worker-entry.ts +194 -0
  172. package/src/core/ml-worker.ts +281 -0
  173. package/src/core/query-expander.ts +122 -128
  174. package/src/core/reranker.ts +119 -125
  175. package/src/core/salience.ts +200 -33
  176. package/src/core/write-pipeline.ts +521 -0
  177. package/src/engine/activation.ts +235 -109
  178. package/src/engine/confidence.ts +120 -0
  179. package/src/engine/connections.ts +162 -103
  180. package/src/engine/consolidation-scheduler.ts +242 -125
  181. package/src/engine/consolidation.ts +138 -45
  182. package/src/engine/eval.ts +102 -102
  183. package/src/engine/eviction.ts +101 -101
  184. package/src/engine/index.ts +8 -8
  185. package/src/engine/retraction.ts +366 -116
  186. package/src/engine/staging.ts +74 -74
  187. package/src/hooks/sidecar.ts +5 -5
  188. package/src/index.ts +42 -28
  189. package/src/mcp.ts +105 -152
  190. package/src/storage/factory.ts +147 -0
  191. package/src/storage/index.ts +3 -3
  192. package/src/storage/pglite-schema.ts +166 -0
  193. package/src/storage/pglite.ts +1363 -0
  194. package/src/storage/sqlite.ts +402 -7
  195. package/src/storage/store.ts +80 -0
  196. package/src/types/agent.ts +67 -67
  197. package/src/types/checkpoint.ts +46 -46
  198. package/src/types/engram.ts +101 -3
  199. package/src/types/eval.ts +100 -100
  200. package/src/types/index.ts +6 -6
@@ -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/sqlite.js';
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 DB_PATH = process.env.AWM_DB_PATH ?? 'memory.db';
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 (cheap insurance)
43
- if (existsSync(DB_PATH)) {
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
- const store = new EngramStore(DB_PATH);
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 = store.integrityCheck();
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
- const backupTimer = setInterval(() => {
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); // 10 minutes
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
- // Eager slim-cache populate — pays the ~600ms first-fetch cost at startup
179
- // instead of charging it to the first user recall (0.7.14+).
180
- setImmediate(() => {
181
- try {
182
- const t0 = Date.now();
183
- store.warmSlimCache();
184
- const stats = store.getSlimCacheStats();
185
- console.log(` Slim cache warmed: ${stats.size} entries in ${Date.now() - t0}ms`);
186
- } catch (err) {
187
- console.warn(` Slim cache warm failed: ${(err as Error).message}`);
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.7.16 listening on port ${PORT}`);
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
- try { store.walCheckpoint(); } catch { /* non-fatal */ }
202
- store.close();
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);