agent-working-memory 0.7.17 → 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 (186) hide show
  1. package/README.md +156 -15
  2. package/dist/adapters/common.js +202 -202
  3. package/dist/adapters/http.js +22 -22
  4. package/dist/api/routes.d.ts +1 -1
  5. package/dist/api/routes.d.ts.map +1 -1
  6. package/dist/api/routes.js +258 -79
  7. package/dist/api/routes.js.map +1 -1
  8. package/dist/cli/migrate.d.ts +42 -0
  9. package/dist/cli/migrate.d.ts.map +1 -0
  10. package/dist/cli/migrate.js +268 -0
  11. package/dist/cli/migrate.js.map +1 -0
  12. package/dist/cli.js +147 -103
  13. package/dist/cli.js.map +1 -1
  14. package/dist/coordination/circuit-breaker.d.ts +24 -0
  15. package/dist/coordination/circuit-breaker.d.ts.map +1 -0
  16. package/dist/coordination/circuit-breaker.js +70 -0
  17. package/dist/coordination/circuit-breaker.js.map +1 -0
  18. package/dist/coordination/failure-modes.d.ts +21 -0
  19. package/dist/coordination/failure-modes.d.ts.map +1 -0
  20. package/dist/coordination/failure-modes.js +49 -0
  21. package/dist/coordination/failure-modes.js.map +1 -0
  22. package/dist/coordination/peer-decisions.js +7 -7
  23. package/dist/coordination/routes.d.ts.map +1 -1
  24. package/dist/coordination/routes.js +44 -1
  25. package/dist/coordination/routes.js.map +1 -1
  26. package/dist/coordination/schema.d.ts.map +1 -1
  27. package/dist/coordination/schema.js +18 -0
  28. package/dist/coordination/schema.js.map +1 -1
  29. package/dist/coordination/schemas.d.ts +9 -9
  30. package/dist/coordination/stale.d.ts +9 -1
  31. package/dist/coordination/stale.d.ts.map +1 -1
  32. package/dist/coordination/stale.js +53 -9
  33. package/dist/coordination/stale.js.map +1 -1
  34. package/dist/core/embeddings.d.ts +16 -10
  35. package/dist/core/embeddings.d.ts.map +1 -1
  36. package/dist/core/embeddings.js +54 -38
  37. package/dist/core/embeddings.js.map +1 -1
  38. package/dist/core/ml-worker-entry.d.ts +17 -0
  39. package/dist/core/ml-worker-entry.d.ts.map +1 -0
  40. package/dist/core/ml-worker-entry.js +193 -0
  41. package/dist/core/ml-worker-entry.js.map +1 -0
  42. package/dist/core/ml-worker.d.ts +59 -0
  43. package/dist/core/ml-worker.d.ts.map +1 -0
  44. package/dist/core/ml-worker.js +253 -0
  45. package/dist/core/ml-worker.js.map +1 -0
  46. package/dist/core/query-expander.d.ts +13 -15
  47. package/dist/core/query-expander.d.ts.map +1 -1
  48. package/dist/core/query-expander.js +48 -54
  49. package/dist/core/query-expander.js.map +1 -1
  50. package/dist/core/reranker.d.ts +9 -19
  51. package/dist/core/reranker.d.ts.map +1 -1
  52. package/dist/core/reranker.js +33 -35
  53. package/dist/core/reranker.js.map +1 -1
  54. package/dist/core/salience.d.ts +32 -5
  55. package/dist/core/salience.d.ts.map +1 -1
  56. package/dist/core/salience.js +201 -28
  57. package/dist/core/salience.js.map +1 -1
  58. package/dist/core/write-pipeline.d.ts +10 -2
  59. package/dist/core/write-pipeline.d.ts.map +1 -1
  60. package/dist/core/write-pipeline.js +218 -49
  61. package/dist/core/write-pipeline.js.map +1 -1
  62. package/dist/engine/activation.d.ts +2 -2
  63. package/dist/engine/activation.d.ts.map +1 -1
  64. package/dist/engine/activation.js +238 -115
  65. package/dist/engine/activation.js.map +1 -1
  66. package/dist/engine/confidence.d.ts +62 -0
  67. package/dist/engine/confidence.d.ts.map +1 -0
  68. package/dist/engine/confidence.js +100 -0
  69. package/dist/engine/confidence.js.map +1 -0
  70. package/dist/engine/connections.d.ts +47 -8
  71. package/dist/engine/connections.d.ts.map +1 -1
  72. package/dist/engine/connections.js +83 -22
  73. package/dist/engine/connections.js.map +1 -1
  74. package/dist/engine/consolidation-scheduler.d.ts +46 -10
  75. package/dist/engine/consolidation-scheduler.d.ts.map +1 -1
  76. package/dist/engine/consolidation-scheduler.js +170 -50
  77. package/dist/engine/consolidation-scheduler.js.map +1 -1
  78. package/dist/engine/consolidation.d.ts +16 -2
  79. package/dist/engine/consolidation.d.ts.map +1 -1
  80. package/dist/engine/consolidation.js +143 -44
  81. package/dist/engine/consolidation.js.map +1 -1
  82. package/dist/engine/eval.d.ts +2 -2
  83. package/dist/engine/eval.d.ts.map +1 -1
  84. package/dist/engine/eval.js +9 -9
  85. package/dist/engine/eval.js.map +1 -1
  86. package/dist/engine/eviction.d.ts +4 -4
  87. package/dist/engine/eviction.d.ts.map +1 -1
  88. package/dist/engine/eviction.js +15 -15
  89. package/dist/engine/eviction.js.map +1 -1
  90. package/dist/engine/retraction.d.ts +93 -5
  91. package/dist/engine/retraction.d.ts.map +1 -1
  92. package/dist/engine/retraction.js +238 -19
  93. package/dist/engine/retraction.js.map +1 -1
  94. package/dist/engine/staging.d.ts +1 -1
  95. package/dist/engine/staging.d.ts.map +1 -1
  96. package/dist/engine/staging.js +3 -3
  97. package/dist/engine/staging.js.map +1 -1
  98. package/dist/hooks/sidecar.d.ts +1 -1
  99. package/dist/hooks/sidecar.d.ts.map +1 -1
  100. package/dist/hooks/sidecar.js +4 -4
  101. package/dist/hooks/sidecar.js.map +1 -1
  102. package/dist/index.js +48 -31
  103. package/dist/index.js.map +1 -1
  104. package/dist/mcp.js +167 -141
  105. package/dist/mcp.js.map +1 -1
  106. package/dist/storage/factory.d.ts +55 -0
  107. package/dist/storage/factory.d.ts.map +1 -0
  108. package/dist/storage/factory.js +135 -0
  109. package/dist/storage/factory.js.map +1 -0
  110. package/dist/storage/pglite-schema.d.ts +20 -0
  111. package/dist/storage/pglite-schema.d.ts.map +1 -0
  112. package/dist/storage/pglite-schema.js +165 -0
  113. package/dist/storage/pglite-schema.js.map +1 -0
  114. package/dist/storage/pglite.d.ts +187 -0
  115. package/dist/storage/pglite.d.ts.map +1 -0
  116. package/dist/storage/pglite.js +1114 -0
  117. package/dist/storage/pglite.js.map +1 -0
  118. package/dist/storage/sqlite.d.ts +117 -0
  119. package/dist/storage/sqlite.d.ts.map +1 -1
  120. package/dist/storage/sqlite.js +357 -8
  121. package/dist/storage/sqlite.js.map +1 -1
  122. package/dist/storage/store.d.ts +63 -0
  123. package/dist/storage/store.d.ts.map +1 -0
  124. package/dist/storage/store.js +27 -0
  125. package/dist/storage/store.js.map +1 -0
  126. package/dist/types/engram.d.ts +92 -2
  127. package/dist/types/engram.d.ts.map +1 -1
  128. package/dist/types/engram.js.map +1 -1
  129. package/package.json +3 -1
  130. package/src/adapters/claude-code.ts +218 -218
  131. package/src/adapters/codex.ts +252 -252
  132. package/src/adapters/common.ts +411 -411
  133. package/src/adapters/cursor.ts +135 -135
  134. package/src/adapters/http.ts +93 -93
  135. package/src/adapters/index.ts +31 -31
  136. package/src/adapters/types.ts +75 -75
  137. package/src/api/index.ts +3 -3
  138. package/src/api/routes.ts +970 -714
  139. package/src/cli/migrate.ts +307 -0
  140. package/src/cli.ts +755 -719
  141. package/src/coordination/circuit-breaker.ts +83 -0
  142. package/src/coordination/events.ts +90 -90
  143. package/src/coordination/failure-modes.ts +50 -0
  144. package/src/coordination/peer-decisions.ts +105 -105
  145. package/src/coordination/plugin-loader.ts +60 -60
  146. package/src/coordination/plugin.ts +44 -44
  147. package/src/coordination/routes.ts +56 -1
  148. package/src/coordination/schema.ts +13 -0
  149. package/src/coordination/stale.ts +80 -11
  150. package/src/coordination/types.ts +311 -311
  151. package/src/coordination/write-mutex.ts +69 -69
  152. package/src/core/auto-tagger.ts +168 -168
  153. package/src/core/decay.ts +63 -63
  154. package/src/core/embeddings.ts +110 -93
  155. package/src/core/index.ts +5 -5
  156. package/src/core/logger.ts +36 -36
  157. package/src/core/ml-worker-entry.ts +194 -0
  158. package/src/core/ml-worker.ts +281 -0
  159. package/src/core/query-expander.ts +122 -128
  160. package/src/core/reranker.ts +119 -125
  161. package/src/core/salience.ts +200 -33
  162. package/src/core/write-pipeline.ts +521 -343
  163. package/src/engine/activation.ts +235 -109
  164. package/src/engine/confidence.ts +120 -0
  165. package/src/engine/connections.ts +162 -103
  166. package/src/engine/consolidation-scheduler.ts +242 -125
  167. package/src/engine/consolidation.ts +138 -45
  168. package/src/engine/eval.ts +102 -102
  169. package/src/engine/eviction.ts +101 -101
  170. package/src/engine/index.ts +8 -8
  171. package/src/engine/retraction.ts +366 -116
  172. package/src/engine/staging.ts +74 -74
  173. package/src/hooks/sidecar.ts +5 -5
  174. package/src/index.ts +226 -212
  175. package/src/mcp.ts +1145 -1121
  176. package/src/storage/factory.ts +147 -0
  177. package/src/storage/index.ts +3 -3
  178. package/src/storage/pglite-schema.ts +166 -0
  179. package/src/storage/pglite.ts +1363 -0
  180. package/src/storage/sqlite.ts +402 -7
  181. package/src/storage/store.ts +80 -0
  182. package/src/types/agent.ts +67 -67
  183. package/src/types/checkpoint.ts +46 -46
  184. package/src/types/engram.ts +101 -3
  185. package/src/types/eval.ts +100 -100
  186. package/src/types/index.ts +6 -6
@@ -1,31 +1,67 @@
1
1
  /**
2
- * Consolidation Scheduler automatically triggers sleep cycles.
2
+ * Consolidation Scheduler - sleep-only consolidation (AWM 0.8.x).
3
3
  *
4
- * Four triggers:
5
- * 1. Idle — agent inactive >10min → full consolidation
6
- * 2. Volume — 50+ writes since last consolidation → full consolidation
7
- * 3. Time — 30min since last consolidation → full consolidation
8
- * 4. Adaptive — retrieval precision <0.4 → full consolidation
4
+ * Two triggers, both modeled on biological sleep (offline consolidation, not in-band):
9
5
  *
10
- * Also provides mini-consolidation for restore (fire-and-forget, lightweight).
11
- * Checks every 30 seconds across all active agents.
6
+ * 1. Cron - fires at a configured time (default: 0 3 * * * = 3 AM local time).
7
+ * Configurable via AWM_CONSOLIDATION_CRON env var.
8
+ *
9
+ * 2. Quiescence - fires when ALL active agents have been idle >30 min.
10
+ * "Truly asleep" - no agent is currently writing or recalling.
11
+ *
12
+ * Kill switch: AWM_DISABLE_SCHEDULER=1 skips both triggers. Manual
13
+ * consolidation via POST /system/consolidate still works.
14
+ *
15
+ * Removed in 2.0: in-band idle/volume/time/precision triggers that fired
16
+ * during active hours and blocked HTTP.
17
+ *
18
+ * Tick granularity: 1 minute (sufficient for cron-at-the-minute precision
19
+ * and quiescence checks at human timescales).
12
20
  */
13
- import type { EngramStore } from '../storage/sqlite.js';
21
+ import type { IEngramStore as EngramStore } from '../storage/store.js';
14
22
  import type { ConsolidationEngine } from './consolidation.js';
23
+ /**
24
+ * Return true if `now` matches the cron expression at minute granularity.
25
+ * Format: "minute hour dayOfMonth month dayOfWeek" (5 fields, space-separated).
26
+ * Day-of-week: 0-6 (0 = Sunday). 7 is also accepted as Sunday alias.
27
+ */
28
+ export declare function cronMatches(now: Date, expr: string): boolean;
15
29
  export declare class ConsolidationScheduler {
16
30
  private store;
17
31
  private consolidationEngine;
18
32
  private timer;
19
33
  private running;
34
+ private readonly cronExpr;
35
+ private readonly disabled;
36
+ private lastCronTriggeredMinute;
20
37
  constructor(store: EngramStore, consolidationEngine: ConsolidationEngine);
21
38
  start(): void;
22
39
  stop(): void;
40
+ /** True if the scheduler is currently running a consolidation cycle. */
41
+ isRunning(): boolean;
42
+ /** True if the scheduler's automatic triggers are disabled (kill switch). */
43
+ isDisabled(): boolean;
23
44
  /**
24
- * Mini-consolidation lightweight, called from restore path.
45
+ * Mini-consolidation - lightweight, called from restore path.
25
46
  * Only runs replay + strengthen (phases 1-2), skips heavy phases.
26
47
  */
27
48
  runMiniConsolidation(agentId: string): Promise<void>;
49
+ /**
50
+ * Tick handler - checks both triggers. Cron first (planned), then quiescence (opportunistic).
51
+ * Fires consolidation for at most one agent per tick to avoid overload.
52
+ */
28
53
  private tick;
54
+ /**
55
+ * Pick the agent that benefits most from consolidation:
56
+ * highest writeCount since last consolidation, tie-break by oldest consolidation.
57
+ */
58
+ private pickAgent;
59
+ /**
60
+ * Quiescence check: ALL active agents must have lastActivityAt > threshold ago.
61
+ * `lastActivityAt` is updated on both writes and recalls so this captures both.
62
+ * If no active agents, the system is trivially quiescent.
63
+ */
64
+ private isQuiescent;
29
65
  private runFullConsolidation;
30
66
  }
31
67
  //# sourceMappingURL=consolidation-scheduler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"consolidation-scheduler.d.ts","sourceRoot":"","sources":["../../src/engine/consolidation-scheduler.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAQ9D,qBAAa,sBAAsB;IAK/B,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,mBAAmB;IAL7B,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,OAAO,CAAS;gBAGd,KAAK,EAAE,WAAW,EAClB,mBAAmB,EAAE,mBAAmB;IAGlD,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI;IAQZ;;;OAGG;IACG,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc1D,OAAO,CAAC,IAAI;YA8CE,oBAAoB;CAanC"}
1
+ {"version":3,"file":"consolidation-scheduler.d.ts","sourceRoot":"","sources":["../../src/engine/consolidation-scheduler.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,YAAY,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAmD9D;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAoB5D;AAID,qBAAa,sBAAsB;IAQ/B,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,mBAAmB;IAR7B,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,uBAAuB,CAAuB;gBAG5C,KAAK,EAAE,WAAW,EAClB,mBAAmB,EAAE,mBAAmB;IAMlD,KAAK,IAAI,IAAI;IAUb,IAAI,IAAI,IAAI;IAQZ,wEAAwE;IACxE,SAAS,IAAI,OAAO;IAIpB,6EAA6E;IAC7E,UAAU,IAAI,OAAO;IAIrB;;;OAGG;IACG,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc1D;;;OAGG;YACW,IAAI;IA2BlB;;;OAGG;YACW,SAAS;IAYvB;;;;OAIG;YACW,WAAW;YAWX,oBAAoB;CAanC"}
@@ -1,36 +1,124 @@
1
1
  // Copyright 2026 Robert Winter / Complete Ideas
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  /**
4
- * Consolidation Scheduler automatically triggers sleep cycles.
4
+ * Consolidation Scheduler - sleep-only consolidation (AWM 0.8.x).
5
5
  *
6
- * Four triggers:
7
- * 1. Idle — agent inactive >10min → full consolidation
8
- * 2. Volume — 50+ writes since last consolidation → full consolidation
9
- * 3. Time — 30min since last consolidation → full consolidation
10
- * 4. Adaptive — retrieval precision <0.4 → full consolidation
6
+ * Two triggers, both modeled on biological sleep (offline consolidation, not in-band):
11
7
  *
12
- * Also provides mini-consolidation for restore (fire-and-forget, lightweight).
13
- * Checks every 30 seconds across all active agents.
8
+ * 1. Cron - fires at a configured time (default: 0 3 * * * = 3 AM local time).
9
+ * Configurable via AWM_CONSOLIDATION_CRON env var.
10
+ *
11
+ * 2. Quiescence - fires when ALL active agents have been idle >30 min.
12
+ * "Truly asleep" - no agent is currently writing or recalling.
13
+ *
14
+ * Kill switch: AWM_DISABLE_SCHEDULER=1 skips both triggers. Manual
15
+ * consolidation via POST /system/consolidate still works.
16
+ *
17
+ * Removed in 2.0: in-band idle/volume/time/precision triggers that fired
18
+ * during active hours and blocked HTTP.
19
+ *
20
+ * Tick granularity: 1 minute (sufficient for cron-at-the-minute precision
21
+ * and quiescence checks at human timescales).
22
+ */
23
+ const TICK_INTERVAL_MS = 60_000; // Check every 60s
24
+ const QUIESCENCE_THRESHOLD_MS = 30 * 60_000; // 30 minutes
25
+ const DEFAULT_CRON = '0 3 * * *'; // 3 AM local time daily
26
+ // --- Cron matcher (hand-rolled, minute-granularity) ---
27
+ /**
28
+ * Parse a single cron field into a Set of valid integer values.
29
+ * Supports: wildcard, literal value, range A-B, list A,B,C, step A-B/N.
30
+ */
31
+ function parseCronField(field, min, max) {
32
+ const result = new Set();
33
+ for (const part of field.split(',')) {
34
+ // Handle step: <range>/N
35
+ const stepMatch = part.match(/^(.+?)\/(\d+)$/);
36
+ if (stepMatch) {
37
+ const range = stepMatch[1];
38
+ const step = parseInt(stepMatch[2], 10);
39
+ if (step <= 0)
40
+ continue;
41
+ const [lo, hi] = range === '*'
42
+ ? [min, max]
43
+ : range.includes('-')
44
+ ? range.split('-').map(n => parseInt(n, 10))
45
+ : [parseInt(range, 10), max];
46
+ for (let n = lo; n <= hi; n += step) {
47
+ if (n >= min && n <= max)
48
+ result.add(n);
49
+ }
50
+ continue;
51
+ }
52
+ // Range: A-B
53
+ if (part.includes('-')) {
54
+ const [lo, hi] = part.split('-').map(n => parseInt(n, 10));
55
+ for (let n = lo; n <= hi; n++) {
56
+ if (n >= min && n <= max)
57
+ result.add(n);
58
+ }
59
+ continue;
60
+ }
61
+ // Wildcard
62
+ if (part === '*') {
63
+ for (let n = min; n <= max; n++)
64
+ result.add(n);
65
+ continue;
66
+ }
67
+ // Single value
68
+ const n = parseInt(part, 10);
69
+ if (!Number.isNaN(n) && n >= min && n <= max)
70
+ result.add(n);
71
+ }
72
+ return result;
73
+ }
74
+ /**
75
+ * Return true if `now` matches the cron expression at minute granularity.
76
+ * Format: "minute hour dayOfMonth month dayOfWeek" (5 fields, space-separated).
77
+ * Day-of-week: 0-6 (0 = Sunday). 7 is also accepted as Sunday alias.
14
78
  */
15
- const TICK_INTERVAL_MS = 30_000; // Check every 30s
16
- const IDLE_THRESHOLD_MS = 10 * 60_000; // 10 minutes
17
- const VOLUME_THRESHOLD = 50; // 50 writes
18
- const TIME_THRESHOLD_MS = 30 * 60_000; // 30 minutes
19
- const PRECISION_THRESHOLD = 0.4; // Below this triggers consolidation
79
+ export function cronMatches(now, expr) {
80
+ const fields = expr.trim().split(/\s+/);
81
+ if (fields.length !== 5)
82
+ return false;
83
+ const minutes = parseCronField(fields[0], 0, 59);
84
+ const hours = parseCronField(fields[1], 0, 23);
85
+ const daysOfMonth = parseCronField(fields[2], 1, 31);
86
+ const months = parseCronField(fields[3], 1, 12);
87
+ const daysOfWeekRaw = parseCronField(fields[4], 0, 7);
88
+ // Normalize: 7 == 0 (Sunday)
89
+ const daysOfWeek = new Set();
90
+ for (const d of daysOfWeekRaw)
91
+ daysOfWeek.add(d === 7 ? 0 : d);
92
+ return (minutes.has(now.getMinutes()) &&
93
+ hours.has(now.getHours()) &&
94
+ daysOfMonth.has(now.getDate()) &&
95
+ months.has(now.getMonth() + 1) &&
96
+ daysOfWeek.has(now.getDay()));
97
+ }
98
+ // --- Scheduler ---
20
99
  export class ConsolidationScheduler {
21
100
  store;
22
101
  consolidationEngine;
23
102
  timer = null;
24
103
  running = false;
104
+ cronExpr;
105
+ disabled;
106
+ lastCronTriggeredMinute = null;
25
107
  constructor(store, consolidationEngine) {
26
108
  this.store = store;
27
109
  this.consolidationEngine = consolidationEngine;
110
+ this.cronExpr = process.env.AWM_CONSOLIDATION_CRON ?? DEFAULT_CRON;
111
+ this.disabled = process.env.AWM_DISABLE_SCHEDULER === '1' || process.env.AWM_DISABLE_SCHEDULER === 'true';
28
112
  }
29
113
  start() {
30
114
  if (this.timer)
31
115
  return;
116
+ if (this.disabled) {
117
+ console.log('ConsolidationScheduler disabled (AWM_DISABLE_SCHEDULER=1)');
118
+ return;
119
+ }
32
120
  this.timer = setInterval(() => this.tick(), TICK_INTERVAL_MS);
33
- console.log('ConsolidationScheduler started (30s tick)');
121
+ console.log(`ConsolidationScheduler started - cron='${this.cronExpr}', quiescence-gate=${QUIESCENCE_THRESHOLD_MS / 60_000}min`);
34
122
  }
35
123
  stop() {
36
124
  if (this.timer) {
@@ -39,8 +127,16 @@ export class ConsolidationScheduler {
39
127
  }
40
128
  console.log('ConsolidationScheduler stopped');
41
129
  }
130
+ /** True if the scheduler is currently running a consolidation cycle. */
131
+ isRunning() {
132
+ return this.running;
133
+ }
134
+ /** True if the scheduler's automatic triggers are disabled (kill switch). */
135
+ isDisabled() {
136
+ return this.disabled;
137
+ }
42
138
  /**
43
- * Mini-consolidation lightweight, called from restore path.
139
+ * Mini-consolidation - lightweight, called from restore path.
44
140
  * Only runs replay + strengthen (phases 1-2), skips heavy phases.
45
141
  */
46
142
  async runMiniConsolidation(agentId) {
@@ -50,7 +146,7 @@ export class ConsolidationScheduler {
50
146
  try {
51
147
  console.log(`[scheduler] mini-consolidation for ${agentId}`);
52
148
  await this.consolidationEngine.consolidate(agentId);
53
- this.store.markConsolidation(agentId, true);
149
+ await this.store.markConsolidation(agentId, true);
54
150
  }
55
151
  catch (err) {
56
152
  console.error(`[scheduler] mini-consolidation failed for ${agentId}:`, err);
@@ -59,51 +155,75 @@ export class ConsolidationScheduler {
59
155
  this.running = false;
60
156
  }
61
157
  }
62
- tick() {
158
+ /**
159
+ * Tick handler - checks both triggers. Cron first (planned), then quiescence (opportunistic).
160
+ * Fires consolidation for at most one agent per tick to avoid overload.
161
+ */
162
+ async tick() {
63
163
  if (this.running)
64
164
  return;
65
- const agents = this.store.getActiveAgents();
66
- const now = Date.now();
67
- for (const agent of agents) {
68
- const idleMs = now - agent.lastActivityAt.getTime();
69
- const sinceConsolidation = agent.lastConsolidationAt
70
- ? now - agent.lastConsolidationAt.getTime()
71
- : Infinity;
72
- let trigger = null;
73
- // 1. Idle trigger — agent stopped writing/recalling >10min ago
74
- if (idleMs > IDLE_THRESHOLD_MS && sinceConsolidation > IDLE_THRESHOLD_MS) {
75
- trigger = `idle (${Math.round(idleMs / 60_000)}min)`;
76
- }
77
- // 2. Volume trigger — many writes accumulated
78
- if (!trigger && agent.writeCount >= VOLUME_THRESHOLD) {
79
- trigger = `volume (${agent.writeCount} writes)`;
80
- }
81
- // 3. Time trigger — been too long since last consolidation
82
- if (!trigger && sinceConsolidation > TIME_THRESHOLD_MS) {
83
- trigger = `time (${Math.round(sinceConsolidation / 60_000)}min)`;
84
- }
85
- // 4. Adaptive trigger — precision is low
86
- if (!trigger) {
87
- try {
88
- const precision = this.store.getRetrievalPrecision(agent.agentId, 1);
89
- if (precision > 0 && precision < PRECISION_THRESHOLD) {
90
- trigger = `adaptive (precision ${(precision * 100).toFixed(0)}%)`;
91
- }
165
+ const now = new Date();
166
+ // Trigger 1: cron
167
+ if (cronMatches(now, this.cronExpr)) {
168
+ const minuteKey = `${now.getFullYear()}-${now.getMonth()}-${now.getDate()}T${now.getHours()}:${now.getMinutes()}`;
169
+ if (this.lastCronTriggeredMinute !== minuteKey) {
170
+ this.lastCronTriggeredMinute = minuteKey;
171
+ const agent = await this.pickAgent();
172
+ if (agent) {
173
+ this.runFullConsolidation(agent.agentId, `cron (${this.cronExpr})`);
174
+ return;
92
175
  }
93
- catch { /* precision check is non-fatal */ }
94
176
  }
95
- if (trigger) {
96
- this.runFullConsolidation(agent.agentId, trigger);
97
- return; // One consolidation per tick to avoid overload
177
+ }
178
+ // Trigger 2: quiescence
179
+ if (await this.isQuiescent(now)) {
180
+ const agent = await this.pickAgent();
181
+ if (agent) {
182
+ this.runFullConsolidation(agent.agentId, `quiescence (>${QUIESCENCE_THRESHOLD_MS / 60_000}min idle, all agents)`);
183
+ return;
98
184
  }
99
185
  }
100
186
  }
187
+ /**
188
+ * Pick the agent that benefits most from consolidation:
189
+ * highest writeCount since last consolidation, tie-break by oldest consolidation.
190
+ */
191
+ async pickAgent() {
192
+ const agents = await this.store.getActiveAgents();
193
+ if (agents.length === 0)
194
+ return null;
195
+ const sorted = [...agents].sort((a, b) => {
196
+ if (b.writeCount !== a.writeCount)
197
+ return b.writeCount - a.writeCount;
198
+ const aT = a.lastConsolidationAt?.getTime() ?? 0;
199
+ const bT = b.lastConsolidationAt?.getTime() ?? 0;
200
+ return aT - bT;
201
+ });
202
+ return sorted[0];
203
+ }
204
+ /**
205
+ * Quiescence check: ALL active agents must have lastActivityAt > threshold ago.
206
+ * `lastActivityAt` is updated on both writes and recalls so this captures both.
207
+ * If no active agents, the system is trivially quiescent.
208
+ */
209
+ async isQuiescent(now) {
210
+ const agents = await this.store.getActiveAgents();
211
+ if (agents.length === 0)
212
+ return true;
213
+ const nowMs = now.getTime();
214
+ for (const agent of agents) {
215
+ const idleMs = nowMs - agent.lastActivityAt.getTime();
216
+ if (idleMs < QUIESCENCE_THRESHOLD_MS)
217
+ return false;
218
+ }
219
+ return true;
220
+ }
101
221
  async runFullConsolidation(agentId, reason) {
102
222
  this.running = true;
103
223
  try {
104
- console.log(`[scheduler] full consolidation for ${agentId} trigger: ${reason}`);
224
+ console.log(`[scheduler] full consolidation for ${agentId} - trigger: ${reason}`);
105
225
  const result = await this.consolidationEngine.consolidate(agentId);
106
- this.store.markConsolidation(agentId, false);
226
+ await this.store.markConsolidation(agentId, false);
107
227
  console.log(`[scheduler] consolidation done: ${result.edgesStrengthened} strengthened, ${result.memoriesForgotten} forgotten`);
108
228
  }
109
229
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"consolidation-scheduler.js","sourceRoot":"","sources":["../../src/engine/consolidation-scheduler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"consolidation-scheduler.js","sourceRoot":"","sources":["../../src/engine/consolidation-scheduler.ts"],"names":[],"mappings":"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"}
@@ -17,7 +17,8 @@
17
17
  *
18
18
  * Run between sessions or on a timer (e.g., every few hours).
19
19
  */
20
- import type { EngramStore } from '../storage/sqlite.js';
20
+ import type { IEngramStore as EngramStore } from '../storage/store.js';
21
+ import type { ConnectionEngine } from './connections.js';
21
22
  export interface ConsolidationResult {
22
23
  clustersFound: number;
23
24
  edgesStrengthened: number;
@@ -28,6 +29,7 @@ export interface ConsolidationResult {
28
29
  edgesNormalized: number;
29
30
  memoriesForgotten: number;
30
31
  memoriesArchived: number;
32
+ memoriesFaded: number;
31
33
  redundancyPruned: number;
32
34
  confidenceAdjusted: number;
33
35
  stagingPromoted: number;
@@ -37,16 +39,28 @@ export interface ConsolidationResult {
37
39
  }
38
40
  export declare class ConsolidationEngine {
39
41
  private store;
40
- constructor(store: EngramStore);
42
+ private connectionEngine;
43
+ /**
44
+ * Optional `connectionEngine` is drained at the start of each
45
+ * consolidation pass (v0.8.2). Connection discovery is no longer
46
+ * triggered per write — the work batches into the existing sleep cycle
47
+ * so writes return in ~50 ms instead of being pegged by an inline
48
+ * embed + rerank cycle (~200-500 ms/write under load).
49
+ */
50
+ constructor(store: EngramStore, connectionEngine?: ConnectionEngine);
41
51
  /**
42
52
  * Run a full sleep cycle for an agent.
43
53
  *
54
+ * Phase 0: Connection drain — discover associations for engrams enqueued
55
+ * by writes since the last consolidation (v0.8.2)
44
56
  * Phase 1: Replay — find clusters of semantically similar memories
45
57
  * Phase 2: Strengthen — reinforce edges within clusters (access-weighted)
46
58
  * Phase 3: Bridge — create cross-cluster shortcuts
47
59
  * Phase 4: Decay — weaken unused edges, prune dead ones
48
60
  * Phase 5: Homeostasis — normalize outgoing edge weights per node
61
+ * Phase 5.5: Content fade — coarsen un-recalled engrams (Paper 1)
49
62
  * Phase 6: Forget — archive/delete memories never retrieved (age-gated)
63
+ * Phase 6.5: Redundancy prune
50
64
  * Phase 6.7: Confidence drift — adjust confidence based on structural signals
51
65
  * Phase 7: Sweep — check staging buffer for resonance
52
66
  */
@@ -1 +1 @@
1
- {"version":3,"file":"consolidation.d.ts","sourceRoot":"","sources":["../../src/engine/consolidation.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA6DxD,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAYD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAc;gBAEf,KAAK,EAAE,WAAW;IAI9B;;;;;;;;;;;OAWG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAwiBhE;;;;OAIG;IACH;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IA4DpB;;OAEG;IACH,OAAO,CAAC,eAAe;CAgBxB"}
1
+ {"version":3,"file":"consolidation.d.ts","sourceRoot":"","sources":["../../src/engine/consolidation.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EAAE,YAAY,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AA2FzD,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAYD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,gBAAgB,CAA0B;IAElD;;;;;;OAMG;gBACS,KAAK,EAAE,WAAW,EAAE,gBAAgB,CAAC,EAAE,gBAAgB;IAKnE;;;;;;;;;;;;;;;OAeG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAwlBhE;;;;OAIG;IACH;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IA4DpB;;OAEG;IACH,OAAO,CAAC,eAAe;CAgBxB"}