@alfe.ai/openclaw-memory-cloud 0.0.36 → 0.0.38
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +19 -0
- package/dist/auto-capture.d.ts +13 -1
- package/dist/auto-capture.d.ts.map +1 -1
- package/dist/auto-capture.js +15 -2
- package/dist/auto-capture.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/ingest-epoch.d.ts +38 -0
- package/dist/ingest-epoch.d.ts.map +1 -0
- package/dist/ingest-epoch.js +66 -0
- package/dist/ingest-epoch.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/auto-capture.test.ts +115 -0
- package/src/__tests__/ingest-epoch.test.ts +67 -0
- package/src/auto-capture.ts +13 -1
- package/src/index.ts +7 -1
- package/src/ingest-epoch.ts +78 -0
- package/src/types.ts +1 -1
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @alfe.ai/openclaw-memory-cloud
|
|
2
2
|
|
|
3
|
+
## 0.0.38
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [0b8d3f5]
|
|
8
|
+
- Updated dependencies [0b8d3f5]
|
|
9
|
+
- Updated dependencies [0b8d3f5]
|
|
10
|
+
- Updated dependencies [0b8d3f5]
|
|
11
|
+
- @alfe.ai/agent-api-client@0.14.0
|
|
12
|
+
- @alfe.ai/config@0.4.0
|
|
13
|
+
|
|
14
|
+
## 0.0.37
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- 84bd15e: Fix: live auto-capture no longer silently drops messages after a daemon restart. `AutoCapture` now stamps each flush with a per-boot `ingestEpoch` (wall-clock ms captured at process start) and forwards it through `memoryIngest`. The memory service uses it to detect that a restarted daemon's message-index counter has reset to 0 and resets the per-session high-water mark accordingly — previously every post-restart capture was filtered out by the surviving watermark (`storedCount: 0`) until the local counter climbed back past the pre-restart max. Backfill is unchanged (it keeps stable file-position indices and sends no epoch).
|
|
19
|
+
- Updated dependencies [84bd15e]
|
|
20
|
+
- @alfe.ai/agent-api-client@0.13.0
|
|
21
|
+
|
|
3
22
|
## 0.0.36
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
package/dist/auto-capture.d.ts
CHANGED
|
@@ -12,16 +12,28 @@ export declare class AutoCapture {
|
|
|
12
12
|
private readonly client;
|
|
13
13
|
private readonly config;
|
|
14
14
|
private readonly logger;
|
|
15
|
+
private readonly ingestEpoch;
|
|
15
16
|
private static readonly MAX_QUEUE_SIZE;
|
|
16
17
|
private pendingMessages;
|
|
17
18
|
private messageIndex;
|
|
18
19
|
private idleTimer;
|
|
19
20
|
private sessionKey;
|
|
20
21
|
private metadata;
|
|
22
|
+
/**
|
|
23
|
+
* Per-boot STRICTLY-monotonic epoch, resolved once at process start by
|
|
24
|
+
* `resolveIngestEpoch` (index.ts) as `max(Date.now(), lastEpoch + 1)` from a
|
|
25
|
+
* persisted state file — so it never regresses even if the wall clock steps
|
|
26
|
+
* backward across a restart. Stamped on every flush so the memory service can
|
|
27
|
+
* tell a restarted daemon (whose `messageIndex` counter has reset to 0) from
|
|
28
|
+
* a continuing one and reset the server-side high-water mark accordingly —
|
|
29
|
+
* otherwise post-restart captures are silently dropped by the surviving
|
|
30
|
+
* watermark. Defaults to `Date.now()` only for tests that don't exercise the
|
|
31
|
+
* restart path. See ingest-epoch.ts + services/memory/src/lib/ingest-offset.ts.
|
|
32
|
+
*/
|
|
21
33
|
constructor(client: MemoryApi, config: MemoryCloudConfig, logger: {
|
|
22
34
|
debug: (msg: string, ctx?: Record<string, unknown>) => void;
|
|
23
35
|
warn: (msg: string, ctx?: Record<string, unknown>) => void;
|
|
24
|
-
});
|
|
36
|
+
}, ingestEpoch?: number);
|
|
25
37
|
setSession(sessionKey: string, metadata?: SessionMetadata): void;
|
|
26
38
|
trackMessage(role: string, content: string): void;
|
|
27
39
|
flush(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-capture.d.ts","sourceRoot":"","sources":["../src/auto-capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAiB,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/F;;;;;;;;GAQG;AACH,qBAAa,WAAW;
|
|
1
|
+
{"version":3,"file":"auto-capture.d.ts","sourceRoot":"","sources":["../src/auto-capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAiB,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/F;;;;;;;;GAQG;AACH,qBAAa,WAAW;IAoBpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAtB9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAO;IAC7C,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAuB;IAEvC;;;;;;;;;;OAUG;gBAEgB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;KAAE,EACnI,WAAW,GAAE,MAAmB;IAGnD,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,IAAI;IAKhE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAsB3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBtB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,cAAc;CAMvB"}
|
package/dist/auto-capture.js
CHANGED
|
@@ -11,16 +11,29 @@ export class AutoCapture {
|
|
|
11
11
|
client;
|
|
12
12
|
config;
|
|
13
13
|
logger;
|
|
14
|
+
ingestEpoch;
|
|
14
15
|
static MAX_QUEUE_SIZE = 500;
|
|
15
16
|
pendingMessages = [];
|
|
16
17
|
messageIndex = 0;
|
|
17
18
|
idleTimer = null;
|
|
18
19
|
sessionKey = null;
|
|
19
20
|
metadata = {};
|
|
20
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Per-boot STRICTLY-monotonic epoch, resolved once at process start by
|
|
23
|
+
* `resolveIngestEpoch` (index.ts) as `max(Date.now(), lastEpoch + 1)` from a
|
|
24
|
+
* persisted state file — so it never regresses even if the wall clock steps
|
|
25
|
+
* backward across a restart. Stamped on every flush so the memory service can
|
|
26
|
+
* tell a restarted daemon (whose `messageIndex` counter has reset to 0) from
|
|
27
|
+
* a continuing one and reset the server-side high-water mark accordingly —
|
|
28
|
+
* otherwise post-restart captures are silently dropped by the surviving
|
|
29
|
+
* watermark. Defaults to `Date.now()` only for tests that don't exercise the
|
|
30
|
+
* restart path. See ingest-epoch.ts + services/memory/src/lib/ingest-offset.ts.
|
|
31
|
+
*/
|
|
32
|
+
constructor(client, config, logger, ingestEpoch = Date.now()) {
|
|
21
33
|
this.client = client;
|
|
22
34
|
this.config = config;
|
|
23
35
|
this.logger = logger;
|
|
36
|
+
this.ingestEpoch = ingestEpoch;
|
|
24
37
|
}
|
|
25
38
|
setSession(sessionKey, metadata) {
|
|
26
39
|
this.sessionKey = sessionKey;
|
|
@@ -56,7 +69,7 @@ export class AutoCapture {
|
|
|
56
69
|
messageCount: batch.length,
|
|
57
70
|
});
|
|
58
71
|
try {
|
|
59
|
-
await this.client.memoryIngest(this.sessionKey, batch, this.metadata);
|
|
72
|
+
await this.client.memoryIngest(this.sessionKey, batch, this.metadata, this.ingestEpoch);
|
|
60
73
|
}
|
|
61
74
|
catch (err) {
|
|
62
75
|
this.logger.warn("Failed to flush memories", { error: String(err) });
|
package/dist/auto-capture.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-capture.js","sourceRoot":"","sources":["../src/auto-capture.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,OAAO,WAAW;
|
|
1
|
+
{"version":3,"file":"auto-capture.js","sourceRoot":"","sources":["../src/auto-capture.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiBH,UAAU,SAAS;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QAC3D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QAC5D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QAC3D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;KAC7D,CAAC;IACF,YAAY,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IACzF,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5I,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACvG,2BAA2B,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;QAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;KAAE,KAAK,MAAM,EAAE,KAAK,IAAI,CAAC;IACtG,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACnD;AAED,UAAU,WAAW;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,IAAI;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACpF;;;;;;;kBAkCe,SAAS,GAAG,IAAI;;AAPhC,wBA6RE"}
|
package/dist/index.js
CHANGED
|
@@ -19,6 +19,7 @@ import { AutoCapture } from "./auto-capture.js";
|
|
|
19
19
|
import { AutoRecall } from "./auto-recall.js";
|
|
20
20
|
import { formatSearchResults } from "./formatter.js";
|
|
21
21
|
import { runSessionsBackfill } from "./session-backfill.js";
|
|
22
|
+
import { resolveIngestEpoch } from "./ingest-epoch.js";
|
|
22
23
|
import { createRequire } from 'node:module';
|
|
23
24
|
const require = createRequire(import.meta.url);
|
|
24
25
|
const pkg = require('../package.json');
|
|
@@ -60,7 +61,12 @@ export default {
|
|
|
60
61
|
apiKey: alfeConfig.apiKey,
|
|
61
62
|
apiUrl: alfeConfig.apiUrl,
|
|
62
63
|
});
|
|
63
|
-
|
|
64
|
+
// Strictly-monotonic per-boot epoch, resolved once at process start.
|
|
65
|
+
// Guards against a backward wall-clock step across a restart (which would
|
|
66
|
+
// otherwise trap every live-capture flush in the server's stale-boot
|
|
67
|
+
// branch and silently drop it). See ingest-epoch.ts.
|
|
68
|
+
const ingestEpoch = resolveIngestEpoch({ logger });
|
|
69
|
+
const autoCapture = new AutoCapture(client, config, logger, ingestEpoch);
|
|
64
70
|
const autoRecall = new AutoRecall(client, config, logger);
|
|
65
71
|
// ─── Memory prompt section ──────────────────────────────────
|
|
66
72
|
api.registerMemoryPromptSection(({ availableTools }) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAoC9D,MAAM,cAAc,GAAsB;IACxC,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,IAAI;IAChB,eAAe,EAAE,GAAG;IACpB,gBAAgB,EAAE,EAAE;IACpB,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,EAAE;CACxB,CAAC;AAEF,SAAS,mBAAmB,CAAC,YAAsC;IACjE,OAAO;QACL,WAAW,EAAE,OAAO,YAAY,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW;QACnH,UAAU,EAAE,OAAO,YAAY,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,UAAU;QAC/G,eAAe,EAAE,OAAO,YAAY,EAAE,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe;QAClI,gBAAgB,EAAE,OAAO,YAAY,EAAE,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB;QACtI,gBAAgB,EAAE,OAAO,YAAY,EAAE,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB;QACvI,mBAAmB,EACjB,OAAO,YAAY,EAAE,mBAAmB,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,mBAAmB,CAAC,IAAI,YAAY,CAAC,mBAAmB,GAAG,CAAC;YAChJ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,mBAAmB,CAAC;YAC9C,CAAC,CAAC,cAAc,CAAC,mBAAmB;KACzC,CAAC;AACJ,CAAC;AAED,eAAe;IACb,EAAE,EAAE,gCAAgC;IACpC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,0EAA0E;IACvF,OAAO,EAAE,GAAG,CAAC,OAAO;IACpB,IAAI,EAAE,QAAiB;IAEvB,QAAQ,CAAC,GAAc;QACrB,kEAAkE;QAClE,2EAA2E;QAC3E,+DAA+D;QAC/D,uBAAuB,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QAE1B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;YAChC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAE1D,+DAA+D;QAC/D,GAAG,CAAC,2BAA2B,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE;YACrD,MAAM,KAAK,GAAa,CAAC,WAAW,CAAC,CAAC;YACtC,IAAI,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;gBACzF,KAAK,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;YAC5G,CAAC;YACD,IAAI,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC;YAChG,CAAC;YACD,IAAI,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,sMAAsM,CAAC,CAAC;YACrN,CAAC;YACD,IAAI,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;YACnF,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,+DAA+D;QAC/D,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,eAAe;YACtB,WAAW,EAAE,8GAA8G;YAC3H,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;oBAC5D,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;oBACtE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE;oBACzD,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0DAA0D,EAAE;iBACjG;gBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;aACpB;YACD,OAAO,EAAE,KAAK,EAAE,WAAmB,EAAE,MAA+B,EAAE,EAAE;gBACtE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CACvC,MAAM,CAAC,KAAe,EACtB;oBACE,KAAK,EAAE,MAAM,CAAC,KAA2B;oBACzC,KAAK,EAAE,MAAM,CAAC,KAA2B;oBACzC,GAAG,EAAE,MAAM,CAAC,GAAyB;iBACtC,CACF,CAAC;gBACF,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;SACF,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;QAEnD,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,cAAc;YACrB,WAAW,EAAE,6DAA6D;YAC1E,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;oBACpE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6CAA6C,EAAE;oBACrF,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2DAA2D,EAAE;oBACjG,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;iBAC5E;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;YACD,OAAO,EAAE,KAAK,EAAE,WAAmB,EAAE,MAA+B,EAAE,EAAE;gBACtE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CACrC,MAAM,CAAC,IAAc,EACrB;oBACE,KAAK,EAAE,MAAM,CAAC,KAA2B;oBACzC,GAAG,EAAE,MAAM,CAAC,GAAyB;oBACrC,UAAU,EAAE,MAAM,CAAC,UAAgC;iBACpD,CACF,CAAC;gBACF,OAAO,kBAAkB,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC7C,CAAC;SACF,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAEjC,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,cAAc;YACrB,WAAW,EAAE,iTAAiT;YAC9T,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kEAAkE,EAAE;oBAC5G,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4FAA4F,EAAE;oBACnI,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8EAA8E,EAAE;iBACxH;aACF;YACD,OAAO,EAAE,KAAK,EAAE,WAAmB,EAAE,MAA+B,EAAE,EAAE;gBACtE,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;gBAChF,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC3E,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;gBAE7E,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC1B,OAAO,4CAA4C,CAAC;gBACtD,CAAC;gBACD,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;oBACxB,OAAO,sDAAsD,CAAC;gBAChE,CAAC;gBAED,IAAI,IAAY,CAAC;gBACjB,IAAI,cAAc,GAAG,MAAM,CAAC;gBAC5B,IAAI,UAAU,GAAsB,QAAQ,CAAC;gBAE7C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;oBAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBAC7C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;wBAC7D,OAAO,gBAAgB,QAAQ,0BAA0B,CAAC;oBAC5D,CAAC;oBACD,IAAI,CAAC;wBACH,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;oBAC7C,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,OAAO,kBAAkB,QAAQ,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5F,CAAC;oBACD,cAAc,GAAG,MAAM,IAAI,QAAQ,CAAC;oBACpC,UAAU,GAAG,MAAM,CAAC;gBACtB,CAAC;qBAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBACjC,IAAI,GAAG,OAAO,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,OAAO,4CAA4C,CAAC;gBACtD,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC;oBACtF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC;oBACzC,OAAO,UAAU,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,KAAK,GAAG,CAAC;gBACpJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACzD,OAAO,mCAAmC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/F,CAAC;YACH,CAAC;SACF,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAEjC,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,eAAe;YACtB,WAAW,EAAE,kDAAkD;YAC/D,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE;iBACxE;gBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;aACpB;YACD,OAAO,EAAE,KAAK,EAAE,WAAmB,EAAE,MAA+B,EAAE,EAAE;gBACtE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAe,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;gBAChF,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,6BAA6B,CAAC;gBAExE,MAAM,OAAO,GAAa,EAAE,CAAC;gBAC7B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACnC,IAAI,CAAC;wBACH,MAAM,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAClC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACvB,CAAC;oBAAC,MAAM,CAAC;wBACP,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC/D,CAAC;gBACH,CAAC;gBACD,OAAO,WAAW,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,qBAAqB,CAAC;YACtG,CAAC;SACF,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAElC,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE,yEAAyE;YACtF,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iDAAiD,EAAE;iBAC3F;gBACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;aACrB;YACD,OAAO,EAAE,KAAK,EAAE,WAAmB,EAAE,MAA+B,EAAE,EAAE;gBACtE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAgB,CAAC,CAAC;gBACxE,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,6BAA6B,MAAM,CAAC,MAAgB,IAAI,CAAC;gBACjG,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBAC9H,OAAO,qBAAqB,MAAM,CAAC,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE,CAAC;SACF,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAEjC,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,cAAc;YACrB,WAAW,EAAE,gCAAgC;YAC7C,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;YAC9C,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;gBACrC,OAAO,aAAa,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,sBAAsB,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,cAAc,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC;YAC3J,CAAC;SACF,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAEjC,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE,kFAAkF;YAC/F,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;YAC9C,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;gBAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,yBAAyB,CAAC;gBAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;gBAChI,OAAO,mBAAmB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,CAAC;SACF,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAEpC,+DAA+D;QAE/D,yDAAyD;QACzD,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,KAAc,EAAE,GAAY,EAAE,EAAE;YAClE,MAAM,UAAU,GAAG,KAAgC,CAAC;YACpD,MAAM,QAAQ,GAAG,GAA8B,CAAC;YAChD,MAAM,MAAM,GAAG,OAAO,UAAU,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,MAAM,UAAU,GAAG,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7F,MAAM,SAAS,GAAG,OAAO,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YAE1F,IAAI,UAAU,EAAE,CAAC;gBACf,WAAW,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YACpD,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC1D,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;YACxC,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAErB,4CAA4C;QAC5C,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,KAAc,EAAE,EAAE;YAC5C,MAAM,QAAQ,GAAG,KAAgC,CAAC;YAClD,MAAM,OAAO,GAAG,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,GAAG,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAc,EAAE,EAAE;YAC3C,MAAM,QAAQ,GAAG,KAAgC,CAAC;YAClD,MAAM,OAAO,GAAG,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,WAAW,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,KAAc,EAAE,EAAE;YAC3C,MAAM,QAAQ,GAAG,KAAgC,CAAC;YAClD,IAAI,QAAQ,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBAC/B,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;YACjC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,4EAA4E;QAC5E,8DAA8D;QAC9D,sEAAsE;QACtE,KAAK,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACjE,MAAM,CAAC,IAAI,CAAC,wDAAwD,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACvH,CAAC;CACF,CAAC;AAEF,KAAK,UAAU,cAAc,CAC3B,MAAsB,EACtB,MAAyB,EACzB,MAA2B;IAE3B,2EAA2E;IAC3E,wEAAwE;IACxE,0EAA0E;IAC1E,0DAA0D;IAC1D,IAAI,MAAgF,CAAC;IACrF,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,gDAAgD,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,qDAAqD,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,oEAAoE;IACpE,qEAAqE;IACrE,oEAAoE;IACpE,IAAI,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,sBAAsB,KAAK,KAAK,EAAE,CAAC;QACvE,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAC/F,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAC7G,MAAM,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,MAAsB,EACtB,MAA2B;IAE3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QAC7C,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAEvC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACrE,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,yBAAyB,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAEhF,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;YAChE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;YACvF,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;gBAC9C,IAAI,EAAE,OAAO;gBACb,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,aAAa,EAAE,MAAM,CAAC,aAAa;aACpC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,2DAA2D,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9G,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,yBAAyB,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,2DAA2D,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strictly-monotonic per-boot ingest epoch.
|
|
3
|
+
*
|
|
4
|
+
* Live `AutoCapture` stamps each flush with a boot epoch so the memory service
|
|
5
|
+
* can tell a restarted daemon (whose message-index counter has reset to 0) from
|
|
6
|
+
* a continuing one and reset the per-session high-water mark accordingly (see
|
|
7
|
+
* services/memory/src/lib/ingest-offset.ts).
|
|
8
|
+
*
|
|
9
|
+
* `Date.now()` alone is NOT safe as that epoch: if the wall clock steps BACKWARD
|
|
10
|
+
* across a restart (NTP correction, or a boot before NTP sync), the new
|
|
11
|
+
* process's epoch would be LESS than the epoch already stored on the server —
|
|
12
|
+
* and the server's `incomingEpoch < storedEpoch` branch classifies every such
|
|
13
|
+
* flush as a stale-boot late delivery and acks it WITHOUT storing. That would
|
|
14
|
+
* silently drop ALL live captures for the entire life of that process (worse
|
|
15
|
+
* than the pre-fix bug, which self-healed once the counter climbed).
|
|
16
|
+
*
|
|
17
|
+
* The guard: persist the last epoch to a single small file and take
|
|
18
|
+
* `max(Date.now(), lastEpoch + 1)`. This is strictly increasing regardless of
|
|
19
|
+
* clock direction, needs no server round-trip, and is written exactly once per
|
|
20
|
+
* boot (a single integer — NOT the per-message counter that made a local state
|
|
21
|
+
* file unattractive for the message index itself).
|
|
22
|
+
*/
|
|
23
|
+
export interface ResolveIngestEpochOptions {
|
|
24
|
+
/** Override the state-file path (tests). */
|
|
25
|
+
epochFile?: string;
|
|
26
|
+
/** Override the clock (tests). */
|
|
27
|
+
now?: number;
|
|
28
|
+
logger?: {
|
|
29
|
+
warn: (msg: string, ctx?: Record<string, unknown>) => void;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolve and persist a strictly-monotonic epoch for this process. Best-effort:
|
|
34
|
+
* if the state dir isn't writable the returned epoch is still `>= now` (correct
|
|
35
|
+
* in the common forward-clock case), and the failure is logged, not thrown.
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveIngestEpoch(opts?: ResolveIngestEpochOptions): number;
|
|
38
|
+
//# sourceMappingURL=ingest-epoch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest-epoch.d.ts","sourceRoot":"","sources":["../src/ingest-epoch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAaH,MAAM,WAAW,yBAAyB;IACxC,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;KAAE,CAAC;CACzE;AAiBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,yBAA8B,GAAG,MAAM,CAe/E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strictly-monotonic per-boot ingest epoch.
|
|
3
|
+
*
|
|
4
|
+
* Live `AutoCapture` stamps each flush with a boot epoch so the memory service
|
|
5
|
+
* can tell a restarted daemon (whose message-index counter has reset to 0) from
|
|
6
|
+
* a continuing one and reset the per-session high-water mark accordingly (see
|
|
7
|
+
* services/memory/src/lib/ingest-offset.ts).
|
|
8
|
+
*
|
|
9
|
+
* `Date.now()` alone is NOT safe as that epoch: if the wall clock steps BACKWARD
|
|
10
|
+
* across a restart (NTP correction, or a boot before NTP sync), the new
|
|
11
|
+
* process's epoch would be LESS than the epoch already stored on the server —
|
|
12
|
+
* and the server's `incomingEpoch < storedEpoch` branch classifies every such
|
|
13
|
+
* flush as a stale-boot late delivery and acks it WITHOUT storing. That would
|
|
14
|
+
* silently drop ALL live captures for the entire life of that process (worse
|
|
15
|
+
* than the pre-fix bug, which self-healed once the counter climbed).
|
|
16
|
+
*
|
|
17
|
+
* The guard: persist the last epoch to a single small file and take
|
|
18
|
+
* `max(Date.now(), lastEpoch + 1)`. This is strictly increasing regardless of
|
|
19
|
+
* clock direction, needs no server round-trip, and is written exactly once per
|
|
20
|
+
* boot (a single integer — NOT the per-message counter that made a local state
|
|
21
|
+
* file unattractive for the message index itself).
|
|
22
|
+
*/
|
|
23
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
24
|
+
import { dirname, join } from "node:path";
|
|
25
|
+
import { homedir } from "node:os";
|
|
26
|
+
/**
|
|
27
|
+
* `~/.alfe` is the plugin's canonical local-state dir (config lives at
|
|
28
|
+
* `~/.alfe/config.toml`, chat sessions at `~/.alfe/sessions/chat`), and
|
|
29
|
+
* `alfe remove` wipes it — so the epoch never outlives the agent it belongs to.
|
|
30
|
+
*/
|
|
31
|
+
const DEFAULT_EPOCH_FILE = join(homedir(), ".alfe", "memory", "ingest-epoch.json");
|
|
32
|
+
function readLastEpoch(epochFile) {
|
|
33
|
+
try {
|
|
34
|
+
const parsed = JSON.parse(readFileSync(epochFile, "utf8"));
|
|
35
|
+
if (typeof parsed === "object" && parsed !== null) {
|
|
36
|
+
const epoch = parsed.epoch;
|
|
37
|
+
if (typeof epoch === "number" && Number.isFinite(epoch)) {
|
|
38
|
+
return epoch;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Missing or corrupt file → treat as no prior epoch.
|
|
44
|
+
}
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve and persist a strictly-monotonic epoch for this process. Best-effort:
|
|
49
|
+
* if the state dir isn't writable the returned epoch is still `>= now` (correct
|
|
50
|
+
* in the common forward-clock case), and the failure is logged, not thrown.
|
|
51
|
+
*/
|
|
52
|
+
export function resolveIngestEpoch(opts = {}) {
|
|
53
|
+
const epochFile = opts.epochFile ?? DEFAULT_EPOCH_FILE;
|
|
54
|
+
const now = opts.now ?? Date.now();
|
|
55
|
+
const last = readLastEpoch(epochFile);
|
|
56
|
+
const epoch = Math.max(now, last + 1);
|
|
57
|
+
try {
|
|
58
|
+
mkdirSync(dirname(epochFile), { recursive: true });
|
|
59
|
+
writeFileSync(epochFile, JSON.stringify({ epoch }));
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
opts.logger?.warn("memory ingest epoch: could not persist monotonic epoch; a backward clock across a future restart could drop captures", { err: String(err) });
|
|
63
|
+
}
|
|
64
|
+
return epoch;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=ingest-epoch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest-epoch.js","sourceRoot":"","sources":["../src/ingest-epoch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;AAUnF,SAAS,aAAa,CAAC,SAAiB;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QACpE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,MAAM,KAAK,GAAI,MAAkC,CAAC,KAAK,CAAC;YACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAkC,EAAE;IACrE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAEnC,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;IAEtC,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,sHAAsH,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClK,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -73,7 +73,7 @@ export interface MemoryApi {
|
|
|
73
73
|
}): Promise<{
|
|
74
74
|
memoryId: string;
|
|
75
75
|
}>;
|
|
76
|
-
memoryIngest(sessionKey: string, messages: MemoryMessage[], metadata?: SessionMetadata): Promise<{
|
|
76
|
+
memoryIngest(sessionKey: string, messages: MemoryMessage[], metadata?: SessionMetadata, ingestEpoch?: number): Promise<{
|
|
77
77
|
queued: boolean;
|
|
78
78
|
messageCount: number;
|
|
79
79
|
}>;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;KACpB,EAAE,CAAC;IACJ,QAAQ,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;KACf,EAAE,CAAC;CACL;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/E,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7E,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QACjC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEhC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAElC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alfe.ai/openclaw-memory-cloud",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.38",
|
|
4
4
|
"description": "Cloud memory extension for OpenClaw — Turbopuffer vectors + DynamoDB knowledge graph",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
]
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@alfe.ai/agent-api-client": "0.
|
|
15
|
-
"@alfe.ai/config": "0.
|
|
14
|
+
"@alfe.ai/agent-api-client": "0.14.0",
|
|
15
|
+
"@alfe.ai/config": "0.4.0"
|
|
16
16
|
},
|
|
17
17
|
"license": "UNLICENSED",
|
|
18
18
|
"homepage": "https://alfe.ai",
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { AutoCapture } from "../auto-capture.js";
|
|
3
|
+
import type { MemoryApi, MemoryCloudConfig, MemoryMessage, SessionMetadata } from "../types.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Restart-drop regression (Defect 1).
|
|
7
|
+
*
|
|
8
|
+
* `AutoCapture.messageIndex` is process-local and resets to 0 on every daemon
|
|
9
|
+
* restart, but the memory service's per-session `lastProcessedIndex` high-water
|
|
10
|
+
* mark survives. Before the fix, a `index > lastProcessedIndex` filter dropped
|
|
11
|
+
* every post-restart capture (`storedCount: 0`) until the local counter climbed
|
|
12
|
+
* back past the old max. The fix: each flush carries a per-boot `ingestEpoch`,
|
|
13
|
+
* and the server resets the mark when it sees a strictly-newer epoch.
|
|
14
|
+
*
|
|
15
|
+
* This drives two AutoCapture instances (a restart == a fresh instance with the
|
|
16
|
+
* counter back at 0) against a fake server that applies the real epoch rule,
|
|
17
|
+
* and asserts the post-restart captures survive.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const config: MemoryCloudConfig = {
|
|
21
|
+
autoCapture: true,
|
|
22
|
+
autoRecall: true,
|
|
23
|
+
captureMaxChars: 500,
|
|
24
|
+
// Huge idle window so the debounce timer never fires; we flush explicitly.
|
|
25
|
+
idleFlushSeconds: 3600,
|
|
26
|
+
backfillSessions: false,
|
|
27
|
+
backfillMaxSessions: 0,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const logger = { debug: vi.fn(), warn: vi.fn() };
|
|
31
|
+
|
|
32
|
+
/** Minimal in-memory replica of the server's per-session epoch-fenced watermark. */
|
|
33
|
+
function createFakeServer() {
|
|
34
|
+
const marks = new Map<string, { lastIndex: number; epoch?: number }>();
|
|
35
|
+
const stored = new Map<string, MemoryMessage[]>();
|
|
36
|
+
|
|
37
|
+
const client: Pick<MemoryApi, "memoryIngest"> = {
|
|
38
|
+
async memoryIngest(sessionKey: string, messages: MemoryMessage[], _metadata?: SessionMetadata, ingestEpoch?: number) {
|
|
39
|
+
const prev = marks.get(sessionKey);
|
|
40
|
+
const storedEpoch = prev?.epoch;
|
|
41
|
+
const storedIndex = prev?.lastIndex ?? -1;
|
|
42
|
+
|
|
43
|
+
let lastIndex = storedIndex;
|
|
44
|
+
let nextEpoch = storedEpoch;
|
|
45
|
+
if (ingestEpoch !== undefined) {
|
|
46
|
+
if (storedEpoch === undefined || ingestEpoch > storedEpoch) {
|
|
47
|
+
lastIndex = -1; // new/newer boot → reset
|
|
48
|
+
nextEpoch = ingestEpoch;
|
|
49
|
+
} else if (ingestEpoch < storedEpoch) {
|
|
50
|
+
return { queued: true, messageCount: 0 }; // stale boot → skip
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const survivors = messages.filter((m) => m.index > lastIndex);
|
|
55
|
+
if (survivors.length > 0) {
|
|
56
|
+
stored.set(sessionKey, [...(stored.get(sessionKey) ?? []), ...survivors]);
|
|
57
|
+
marks.set(sessionKey, { lastIndex: Math.max(...survivors.map((m) => m.index)), epoch: nextEpoch });
|
|
58
|
+
}
|
|
59
|
+
return { queued: true, messageCount: survivors.length };
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
return { client: client as MemoryApi, storedFor: (k: string) => stored.get(k) ?? [] };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const SESSION = "conv:web:idn_1";
|
|
67
|
+
|
|
68
|
+
describe("AutoCapture restart-drop fix", () => {
|
|
69
|
+
it("does NOT drop post-restart captures against a surviving high-water mark", async () => {
|
|
70
|
+
const server = createFakeServer();
|
|
71
|
+
|
|
72
|
+
// ── Boot 1: capture three messages (indices 0,1,2), advancing the mark ──
|
|
73
|
+
const boot1 = new AutoCapture(server.client, config, logger, 1000);
|
|
74
|
+
boot1.setSession(SESSION);
|
|
75
|
+
boot1.trackMessage("user", "hello");
|
|
76
|
+
boot1.trackMessage("assistant", "hi there");
|
|
77
|
+
boot1.trackMessage("user", "how are you");
|
|
78
|
+
await boot1.flush();
|
|
79
|
+
boot1.destroy();
|
|
80
|
+
expect(server.storedFor(SESSION)).toHaveLength(3);
|
|
81
|
+
|
|
82
|
+
// ── Restart: a fresh instance, message counter back at 0, higher epoch ──
|
|
83
|
+
const boot2 = new AutoCapture(server.client, config, logger, 2000);
|
|
84
|
+
boot2.setSession(SESSION);
|
|
85
|
+
boot2.trackMessage("user", "still here?");
|
|
86
|
+
boot2.trackMessage("assistant", "yep");
|
|
87
|
+
await boot2.flush();
|
|
88
|
+
boot2.destroy();
|
|
89
|
+
|
|
90
|
+
// The two post-restart messages must NOT be silently dropped.
|
|
91
|
+
expect(server.storedFor(SESSION)).toHaveLength(5);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("REGRESSION GUARD: without a newer epoch the same messages WOULD be dropped", async () => {
|
|
95
|
+
const server = createFakeServer();
|
|
96
|
+
|
|
97
|
+
const boot1 = new AutoCapture(server.client, config, logger, 1000);
|
|
98
|
+
boot1.setSession(SESSION);
|
|
99
|
+
boot1.trackMessage("user", "hello");
|
|
100
|
+
boot1.trackMessage("assistant", "hi there");
|
|
101
|
+
boot1.trackMessage("user", "how are you");
|
|
102
|
+
await boot1.flush();
|
|
103
|
+
|
|
104
|
+
// Simulate the OLD behaviour: a restart that reuses the same epoch (no
|
|
105
|
+
// reset signal). The post-restart index-0.. messages fall under the stale
|
|
106
|
+
// watermark and are dropped — exactly the bug the epoch fixes.
|
|
107
|
+
const boot2 = new AutoCapture(server.client, config, logger, 1000);
|
|
108
|
+
boot2.setSession(SESSION);
|
|
109
|
+
boot2.trackMessage("user", "still here?");
|
|
110
|
+
boot2.trackMessage("assistant", "yep");
|
|
111
|
+
await boot2.flush();
|
|
112
|
+
|
|
113
|
+
expect(server.storedFor(SESSION)).toHaveLength(3);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { mkdtempSync, rmSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { resolveIngestEpoch } from "../ingest-epoch.js";
|
|
6
|
+
|
|
7
|
+
// The client-side guard that keeps the server's stale-boot branch a rare edge
|
|
8
|
+
// rather than a whole-process outage: the per-boot epoch must be STRICTLY
|
|
9
|
+
// monotonic across restarts even if the wall clock steps backward. Otherwise a
|
|
10
|
+
// backward clock makes every flush look older than the stored epoch and the
|
|
11
|
+
// server silently acks (drops) all of them for the life of the process.
|
|
12
|
+
|
|
13
|
+
describe("resolveIngestEpoch", () => {
|
|
14
|
+
let dir: string;
|
|
15
|
+
let epochFile: string;
|
|
16
|
+
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
dir = mkdtempSync(join(tmpdir(), "ingest-epoch-"));
|
|
19
|
+
epochFile = join(dir, "memory", "ingest-epoch.json");
|
|
20
|
+
});
|
|
21
|
+
afterEach(() => rmSync(dir, { recursive: true, force: true }));
|
|
22
|
+
|
|
23
|
+
it("first boot with no state file returns now and persists it", () => {
|
|
24
|
+
const epoch = resolveIngestEpoch({ epochFile, now: 1000 });
|
|
25
|
+
expect(epoch).toBe(1000);
|
|
26
|
+
expect(JSON.parse(readFileSync(epochFile, "utf8"))).toEqual({ epoch: 1000 });
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("BACKWARD CLOCK across a restart still yields a strictly-greater epoch", () => {
|
|
30
|
+
// Boot 1 at a high wall-clock time.
|
|
31
|
+
const first = resolveIngestEpoch({ epochFile, now: 5_000_000 });
|
|
32
|
+
expect(first).toBe(5_000_000);
|
|
33
|
+
|
|
34
|
+
// Restart with the clock stepped BACKWARD (NTP correction / pre-sync boot).
|
|
35
|
+
const second = resolveIngestEpoch({ epochFile, now: 4_000_000 });
|
|
36
|
+
|
|
37
|
+
// Must be strictly greater than the stored epoch, NOT the (smaller) now —
|
|
38
|
+
// so the server sees a newer boot and resets the watermark instead of
|
|
39
|
+
// classifying every flush as stale and dropping it.
|
|
40
|
+
expect(second).toBe(5_000_001);
|
|
41
|
+
expect(second).toBeGreaterThan(first);
|
|
42
|
+
expect(JSON.parse(readFileSync(epochFile, "utf8"))).toEqual({ epoch: 5_000_001 });
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("forward clock uses the real time (monotonicity doesn't peg it low)", () => {
|
|
46
|
+
resolveIngestEpoch({ epochFile, now: 1000 });
|
|
47
|
+
const next = resolveIngestEpoch({ epochFile, now: 9000 });
|
|
48
|
+
expect(next).toBe(9000);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("repeated restarts stay strictly increasing even under a stuck/rewound clock", () => {
|
|
52
|
+
let last = 0;
|
|
53
|
+
for (const now of [1000, 1000, 999, 500, 1000]) {
|
|
54
|
+
const epoch = resolveIngestEpoch({ epochFile, now });
|
|
55
|
+
expect(epoch).toBeGreaterThan(last);
|
|
56
|
+
last = epoch;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("a corrupt state file is treated as no prior epoch (falls back to now)", () => {
|
|
61
|
+
resolveIngestEpoch({ epochFile, now: 1000 });
|
|
62
|
+
// Clobber with garbage.
|
|
63
|
+
writeFileSync(epochFile, "{ not json");
|
|
64
|
+
const epoch = resolveIngestEpoch({ epochFile, now: 7000 });
|
|
65
|
+
expect(epoch).toBe(7000);
|
|
66
|
+
});
|
|
67
|
+
});
|
package/src/auto-capture.ts
CHANGED
|
@@ -17,10 +17,22 @@ export class AutoCapture {
|
|
|
17
17
|
private sessionKey: string | null = null;
|
|
18
18
|
private metadata: SessionMetadata = {};
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Per-boot STRICTLY-monotonic epoch, resolved once at process start by
|
|
22
|
+
* `resolveIngestEpoch` (index.ts) as `max(Date.now(), lastEpoch + 1)` from a
|
|
23
|
+
* persisted state file — so it never regresses even if the wall clock steps
|
|
24
|
+
* backward across a restart. Stamped on every flush so the memory service can
|
|
25
|
+
* tell a restarted daemon (whose `messageIndex` counter has reset to 0) from
|
|
26
|
+
* a continuing one and reset the server-side high-water mark accordingly —
|
|
27
|
+
* otherwise post-restart captures are silently dropped by the surviving
|
|
28
|
+
* watermark. Defaults to `Date.now()` only for tests that don't exercise the
|
|
29
|
+
* restart path. See ingest-epoch.ts + services/memory/src/lib/ingest-offset.ts.
|
|
30
|
+
*/
|
|
20
31
|
constructor(
|
|
21
32
|
private readonly client: MemoryApi,
|
|
22
33
|
private readonly config: MemoryCloudConfig,
|
|
23
34
|
private readonly logger: { debug: (msg: string, ctx?: Record<string, unknown>) => void; warn: (msg: string, ctx?: Record<string, unknown>) => void },
|
|
35
|
+
private readonly ingestEpoch: number = Date.now(),
|
|
24
36
|
) {}
|
|
25
37
|
|
|
26
38
|
setSession(sessionKey: string, metadata?: SessionMetadata): void {
|
|
@@ -62,7 +74,7 @@ export class AutoCapture {
|
|
|
62
74
|
});
|
|
63
75
|
|
|
64
76
|
try {
|
|
65
|
-
await this.client.memoryIngest(this.sessionKey, batch, this.metadata);
|
|
77
|
+
await this.client.memoryIngest(this.sessionKey, batch, this.metadata, this.ingestEpoch);
|
|
66
78
|
} catch (err) {
|
|
67
79
|
this.logger.warn("Failed to flush memories", { error: String(err) });
|
|
68
80
|
// Re-add failed messages for next flush attempt
|
package/src/index.ts
CHANGED
|
@@ -20,6 +20,7 @@ import { AutoCapture } from "./auto-capture.js";
|
|
|
20
20
|
import { AutoRecall } from "./auto-recall.js";
|
|
21
21
|
import { formatSearchResults } from "./formatter.js";
|
|
22
22
|
import { runSessionsBackfill } from "./session-backfill.js";
|
|
23
|
+
import { resolveIngestEpoch } from "./ingest-epoch.js";
|
|
23
24
|
import type { MemoryCloudConfig } from "./types.js";
|
|
24
25
|
import { createRequire } from 'node:module';
|
|
25
26
|
const require = createRequire(import.meta.url);
|
|
@@ -103,7 +104,12 @@ export default {
|
|
|
103
104
|
apiUrl: alfeConfig.apiUrl,
|
|
104
105
|
});
|
|
105
106
|
|
|
106
|
-
|
|
107
|
+
// Strictly-monotonic per-boot epoch, resolved once at process start.
|
|
108
|
+
// Guards against a backward wall-clock step across a restart (which would
|
|
109
|
+
// otherwise trap every live-capture flush in the server's stale-boot
|
|
110
|
+
// branch and silently drop it). See ingest-epoch.ts.
|
|
111
|
+
const ingestEpoch = resolveIngestEpoch({ logger });
|
|
112
|
+
const autoCapture = new AutoCapture(client, config, logger, ingestEpoch);
|
|
107
113
|
const autoRecall = new AutoRecall(client, config, logger);
|
|
108
114
|
|
|
109
115
|
// ─── Memory prompt section ──────────────────────────────────
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strictly-monotonic per-boot ingest epoch.
|
|
3
|
+
*
|
|
4
|
+
* Live `AutoCapture` stamps each flush with a boot epoch so the memory service
|
|
5
|
+
* can tell a restarted daemon (whose message-index counter has reset to 0) from
|
|
6
|
+
* a continuing one and reset the per-session high-water mark accordingly (see
|
|
7
|
+
* services/memory/src/lib/ingest-offset.ts).
|
|
8
|
+
*
|
|
9
|
+
* `Date.now()` alone is NOT safe as that epoch: if the wall clock steps BACKWARD
|
|
10
|
+
* across a restart (NTP correction, or a boot before NTP sync), the new
|
|
11
|
+
* process's epoch would be LESS than the epoch already stored on the server —
|
|
12
|
+
* and the server's `incomingEpoch < storedEpoch` branch classifies every such
|
|
13
|
+
* flush as a stale-boot late delivery and acks it WITHOUT storing. That would
|
|
14
|
+
* silently drop ALL live captures for the entire life of that process (worse
|
|
15
|
+
* than the pre-fix bug, which self-healed once the counter climbed).
|
|
16
|
+
*
|
|
17
|
+
* The guard: persist the last epoch to a single small file and take
|
|
18
|
+
* `max(Date.now(), lastEpoch + 1)`. This is strictly increasing regardless of
|
|
19
|
+
* clock direction, needs no server round-trip, and is written exactly once per
|
|
20
|
+
* boot (a single integer — NOT the per-message counter that made a local state
|
|
21
|
+
* file unattractive for the message index itself).
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
25
|
+
import { dirname, join } from "node:path";
|
|
26
|
+
import { homedir } from "node:os";
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* `~/.alfe` is the plugin's canonical local-state dir (config lives at
|
|
30
|
+
* `~/.alfe/config.toml`, chat sessions at `~/.alfe/sessions/chat`), and
|
|
31
|
+
* `alfe remove` wipes it — so the epoch never outlives the agent it belongs to.
|
|
32
|
+
*/
|
|
33
|
+
const DEFAULT_EPOCH_FILE = join(homedir(), ".alfe", "memory", "ingest-epoch.json");
|
|
34
|
+
|
|
35
|
+
export interface ResolveIngestEpochOptions {
|
|
36
|
+
/** Override the state-file path (tests). */
|
|
37
|
+
epochFile?: string;
|
|
38
|
+
/** Override the clock (tests). */
|
|
39
|
+
now?: number;
|
|
40
|
+
logger?: { warn: (msg: string, ctx?: Record<string, unknown>) => void };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function readLastEpoch(epochFile: string): number {
|
|
44
|
+
try {
|
|
45
|
+
const parsed: unknown = JSON.parse(readFileSync(epochFile, "utf8"));
|
|
46
|
+
if (typeof parsed === "object" && parsed !== null) {
|
|
47
|
+
const epoch = (parsed as Record<string, unknown>).epoch;
|
|
48
|
+
if (typeof epoch === "number" && Number.isFinite(epoch)) {
|
|
49
|
+
return epoch;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
} catch {
|
|
53
|
+
// Missing or corrupt file → treat as no prior epoch.
|
|
54
|
+
}
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Resolve and persist a strictly-monotonic epoch for this process. Best-effort:
|
|
60
|
+
* if the state dir isn't writable the returned epoch is still `>= now` (correct
|
|
61
|
+
* in the common forward-clock case), and the failure is logged, not thrown.
|
|
62
|
+
*/
|
|
63
|
+
export function resolveIngestEpoch(opts: ResolveIngestEpochOptions = {}): number {
|
|
64
|
+
const epochFile = opts.epochFile ?? DEFAULT_EPOCH_FILE;
|
|
65
|
+
const now = opts.now ?? Date.now();
|
|
66
|
+
|
|
67
|
+
const last = readLastEpoch(epochFile);
|
|
68
|
+
const epoch = Math.max(now, last + 1);
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
mkdirSync(dirname(epochFile), { recursive: true });
|
|
72
|
+
writeFileSync(epochFile, JSON.stringify({ epoch }));
|
|
73
|
+
} catch (err) {
|
|
74
|
+
opts.logger?.warn("memory ingest epoch: could not persist monotonic epoch; a backward clock across a future restart could drop captures", { err: String(err) });
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return epoch;
|
|
78
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -68,7 +68,7 @@ export interface MemoryApi {
|
|
|
68
68
|
importance?: number;
|
|
69
69
|
}): Promise<{ memoryId: string }>;
|
|
70
70
|
|
|
71
|
-
memoryIngest(sessionKey: string, messages: MemoryMessage[], metadata?: SessionMetadata): Promise<{ queued: boolean; messageCount: number }>;
|
|
71
|
+
memoryIngest(sessionKey: string, messages: MemoryMessage[], metadata?: SessionMetadata, ingestEpoch?: number): Promise<{ queued: boolean; messageCount: number }>;
|
|
72
72
|
|
|
73
73
|
memoryLoadContext(tier?: number, topicHint?: string): Promise<{ formatted: string; [key: string]: unknown }>;
|
|
74
74
|
|