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
|
@@ -1,31 +1,67 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Consolidation Scheduler
|
|
2
|
+
* Consolidation Scheduler - sleep-only consolidation (AWM 0.8.x).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
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
|
-
*
|
|
11
|
-
*
|
|
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/
|
|
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
|
|
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
|
|
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
|
|
4
|
+
* Consolidation Scheduler - sleep-only consolidation (AWM 0.8.x).
|
|
5
5
|
*
|
|
6
|
-
*
|
|
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
|
-
*
|
|
13
|
-
*
|
|
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
|
-
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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}
|
|
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":"AAAA,gDAAgD;AAChD,sCAAsC;AACtC
|
|
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/
|
|
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
|
-
|
|
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,
|
|
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"}
|