@alfe.ai/openclaw-memory-cloud 0.0.38 → 0.0.39
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 +37 -0
- package/dist/index.cjs +2 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -60
- package/dist/index.js +2 -396
- package/dist/plugin.cjs +2 -0
- package/dist/plugin.d.cts +59 -0
- package/dist/plugin.d.cts.map +1 -0
- package/dist/plugin.d.ts +59 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +2 -0
- package/dist/plugin2.cjs +1107 -0
- package/dist/plugin2.d.cts +2 -0
- package/dist/plugin2.d.ts +2 -0
- package/dist/plugin2.js +1104 -0
- package/dist/plugin2.js.map +1 -0
- package/openclaw.plugin.json +6 -5
- package/package.json +27 -7
- package/.turbo/turbo-build.log +0 -4
- package/CHANGELOG.md +0 -320
- package/dist/auto-capture.d.ts +0 -45
- package/dist/auto-capture.d.ts.map +0 -1
- package/dist/auto-capture.js +0 -101
- package/dist/auto-capture.js.map +0 -1
- package/dist/auto-recall.d.ts +0 -22
- package/dist/auto-recall.d.ts.map +0 -1
- package/dist/auto-recall.js +0 -63
- package/dist/auto-recall.js.map +0 -1
- package/dist/formatter.d.ts +0 -7
- package/dist/formatter.d.ts.map +0 -1
- package/dist/formatter.js +0 -27
- package/dist/formatter.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/ingest-epoch.d.ts +0 -38
- package/dist/ingest-epoch.d.ts.map +0 -1
- package/dist/ingest-epoch.js +0 -66
- package/dist/ingest-epoch.js.map +0 -1
- package/dist/session-backfill.d.ts +0 -54
- package/dist/session-backfill.d.ts.map +0 -1
- package/dist/session-backfill.js +0 -192
- package/dist/session-backfill.js.map +0 -1
- package/dist/types.d.ts +0 -113
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/src/__tests__/auto-capture.test.ts +0 -115
- package/src/__tests__/ingest-epoch.test.ts +0 -67
- package/src/__tests__/session-backfill.test.ts +0 -289
- package/src/auto-capture.ts +0 -108
- package/src/auto-recall.ts +0 -66
- package/src/formatter.ts +0 -30
- package/src/index.ts +0 -464
- package/src/ingest-epoch.ts +0 -78
- package/src/session-backfill.ts +0 -220
- package/src/types.ts +0 -93
- package/sst-env.d.ts +0 -10
- package/tsconfig.json +0 -20
package/dist/auto-capture.d.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { MemoryApi, MemoryCloudConfig, SessionMetadata } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Auto-capture manages the idle debounce timer and flushes
|
|
4
|
-
* accumulated messages to the memory service.
|
|
5
|
-
*
|
|
6
|
-
* Flow:
|
|
7
|
-
* 1. on_message_received: track message, reset timer
|
|
8
|
-
* 2. Timer fires (60s idle): flush batch to /memory/ingest
|
|
9
|
-
* 3. agent_end: final flush of remaining messages
|
|
10
|
-
*/
|
|
11
|
-
export declare class AutoCapture {
|
|
12
|
-
private readonly client;
|
|
13
|
-
private readonly config;
|
|
14
|
-
private readonly logger;
|
|
15
|
-
private readonly ingestEpoch;
|
|
16
|
-
private static readonly MAX_QUEUE_SIZE;
|
|
17
|
-
private pendingMessages;
|
|
18
|
-
private messageIndex;
|
|
19
|
-
private idleTimer;
|
|
20
|
-
private sessionKey;
|
|
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
|
-
*/
|
|
33
|
-
constructor(client: MemoryApi, config: MemoryCloudConfig, logger: {
|
|
34
|
-
debug: (msg: string, ctx?: Record<string, unknown>) => void;
|
|
35
|
-
warn: (msg: string, ctx?: Record<string, unknown>) => void;
|
|
36
|
-
}, ingestEpoch?: number);
|
|
37
|
-
setSession(sessionKey: string, metadata?: SessionMetadata): void;
|
|
38
|
-
trackMessage(role: string, content: string): void;
|
|
39
|
-
flush(): Promise<void>;
|
|
40
|
-
onAgentEnd(): Promise<void>;
|
|
41
|
-
destroy(): void;
|
|
42
|
-
private resetIdleTimer;
|
|
43
|
-
private clearIdleTimer;
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=auto-capture.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auto-capture manages the idle debounce timer and flushes
|
|
3
|
-
* accumulated messages to the memory service.
|
|
4
|
-
*
|
|
5
|
-
* Flow:
|
|
6
|
-
* 1. on_message_received: track message, reset timer
|
|
7
|
-
* 2. Timer fires (60s idle): flush batch to /memory/ingest
|
|
8
|
-
* 3. agent_end: final flush of remaining messages
|
|
9
|
-
*/
|
|
10
|
-
export class AutoCapture {
|
|
11
|
-
client;
|
|
12
|
-
config;
|
|
13
|
-
logger;
|
|
14
|
-
ingestEpoch;
|
|
15
|
-
static MAX_QUEUE_SIZE = 500;
|
|
16
|
-
pendingMessages = [];
|
|
17
|
-
messageIndex = 0;
|
|
18
|
-
idleTimer = null;
|
|
19
|
-
sessionKey = null;
|
|
20
|
-
metadata = {};
|
|
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()) {
|
|
33
|
-
this.client = client;
|
|
34
|
-
this.config = config;
|
|
35
|
-
this.logger = logger;
|
|
36
|
-
this.ingestEpoch = ingestEpoch;
|
|
37
|
-
}
|
|
38
|
-
setSession(sessionKey, metadata) {
|
|
39
|
-
this.sessionKey = sessionKey;
|
|
40
|
-
if (metadata)
|
|
41
|
-
this.metadata = metadata;
|
|
42
|
-
}
|
|
43
|
-
trackMessage(role, content) {
|
|
44
|
-
if (!this.config.autoCapture)
|
|
45
|
-
return;
|
|
46
|
-
if (content.length > this.config.captureMaxChars) {
|
|
47
|
-
content = content.slice(0, this.config.captureMaxChars);
|
|
48
|
-
}
|
|
49
|
-
// Enforce max queue size — drop oldest if exceeded
|
|
50
|
-
if (this.pendingMessages.length >= AutoCapture.MAX_QUEUE_SIZE) {
|
|
51
|
-
this.logger.warn("Memory queue full — dropping oldest message", { queueSize: this.pendingMessages.length });
|
|
52
|
-
this.pendingMessages.shift();
|
|
53
|
-
}
|
|
54
|
-
this.pendingMessages.push({
|
|
55
|
-
role,
|
|
56
|
-
content,
|
|
57
|
-
index: this.messageIndex++,
|
|
58
|
-
timestamp: new Date().toISOString(),
|
|
59
|
-
});
|
|
60
|
-
this.resetIdleTimer();
|
|
61
|
-
}
|
|
62
|
-
async flush() {
|
|
63
|
-
if (this.pendingMessages.length === 0 || !this.sessionKey)
|
|
64
|
-
return;
|
|
65
|
-
const batch = [...this.pendingMessages];
|
|
66
|
-
this.pendingMessages = [];
|
|
67
|
-
this.logger.debug("Flushing memory batch", {
|
|
68
|
-
sessionKey: this.sessionKey,
|
|
69
|
-
messageCount: batch.length,
|
|
70
|
-
});
|
|
71
|
-
try {
|
|
72
|
-
await this.client.memoryIngest(this.sessionKey, batch, this.metadata, this.ingestEpoch);
|
|
73
|
-
}
|
|
74
|
-
catch (err) {
|
|
75
|
-
this.logger.warn("Failed to flush memories", { error: String(err) });
|
|
76
|
-
// Re-add failed messages for next flush attempt
|
|
77
|
-
this.pendingMessages.unshift(...batch);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
async onAgentEnd() {
|
|
81
|
-
this.clearIdleTimer();
|
|
82
|
-
await this.flush();
|
|
83
|
-
}
|
|
84
|
-
destroy() {
|
|
85
|
-
this.clearIdleTimer();
|
|
86
|
-
}
|
|
87
|
-
resetIdleTimer() {
|
|
88
|
-
this.clearIdleTimer();
|
|
89
|
-
this.idleTimer = setTimeout(() => {
|
|
90
|
-
void this.flush();
|
|
91
|
-
}, this.config.idleFlushSeconds * 1000);
|
|
92
|
-
this.idleTimer.unref();
|
|
93
|
-
}
|
|
94
|
-
clearIdleTimer() {
|
|
95
|
-
if (this.idleTimer) {
|
|
96
|
-
clearTimeout(this.idleTimer);
|
|
97
|
-
this.idleTimer = null;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
//# sourceMappingURL=auto-capture.js.map
|
package/dist/auto-capture.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-capture.js","sourceRoot":"","sources":["../src/auto-capture.ts"],"names":[],"mappings":"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"}
|
package/dist/auto-recall.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { MemoryApi, MemoryCloudConfig } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Auto-recall loads tiered memory context at session start
|
|
4
|
-
* and formats it for injection into the agent's prompt.
|
|
5
|
-
*
|
|
6
|
-
* Called from the before_agent_start hook.
|
|
7
|
-
*/
|
|
8
|
-
export declare class AutoRecall {
|
|
9
|
-
private readonly client;
|
|
10
|
-
private readonly config;
|
|
11
|
-
private readonly logger;
|
|
12
|
-
constructor(client: MemoryApi, config: MemoryCloudConfig, logger: {
|
|
13
|
-
debug: (msg: string, ctx?: Record<string, unknown>) => void;
|
|
14
|
-
warn: (msg: string, ctx?: Record<string, unknown>) => void;
|
|
15
|
-
});
|
|
16
|
-
/**
|
|
17
|
-
* Load memory context and return formatted XML for prompt injection.
|
|
18
|
-
* Returns prependContext string for the before_agent_start hook result.
|
|
19
|
-
*/
|
|
20
|
-
loadForPrompt(userMessage: string): Promise<string | undefined>;
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=auto-recall.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-recall.d.ts","sourceRoot":"","sources":["../src/auto-recall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/D;;;;;GAKG;AACH,qBAAa,UAAU;IAEnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,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;IAGtJ;;;OAGG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CA8BtE"}
|
package/dist/auto-recall.js
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auto-recall loads tiered memory context at session start
|
|
3
|
-
* and formats it for injection into the agent's prompt.
|
|
4
|
-
*
|
|
5
|
-
* Called from the before_agent_start hook.
|
|
6
|
-
*/
|
|
7
|
-
export class AutoRecall {
|
|
8
|
-
client;
|
|
9
|
-
config;
|
|
10
|
-
logger;
|
|
11
|
-
constructor(client, config, logger) {
|
|
12
|
-
this.client = client;
|
|
13
|
-
this.config = config;
|
|
14
|
-
this.logger = logger;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Load memory context and return formatted XML for prompt injection.
|
|
18
|
-
* Returns prependContext string for the before_agent_start hook result.
|
|
19
|
-
*/
|
|
20
|
-
async loadForPrompt(userMessage) {
|
|
21
|
-
if (!this.config.autoRecall)
|
|
22
|
-
return undefined;
|
|
23
|
-
try {
|
|
24
|
-
// Detect topic from user message (first significant word)
|
|
25
|
-
const topicHint = extractTopicHint(userMessage);
|
|
26
|
-
// Load L1 (facts) + L2 (topic context) in one call
|
|
27
|
-
const tier = topicHint ? 2 : 1;
|
|
28
|
-
const context = await this.client.memoryLoadContext(tier, topicHint);
|
|
29
|
-
if (!context.formatted || context.formatted.length === 0) {
|
|
30
|
-
this.logger.debug("No relevant memories found for prompt");
|
|
31
|
-
return undefined;
|
|
32
|
-
}
|
|
33
|
-
this.logger.debug("Loaded memory context for prompt", {
|
|
34
|
-
tier,
|
|
35
|
-
topicHint,
|
|
36
|
-
factCount: Array.isArray(context.facts) ? context.facts.length : 0,
|
|
37
|
-
memoryCount: Array.isArray(context.memories) ? context.memories.length : 0,
|
|
38
|
-
tokenEstimate: typeof context.tokenEstimate === "number" ? context.tokenEstimate : 0,
|
|
39
|
-
});
|
|
40
|
-
return context.formatted;
|
|
41
|
-
}
|
|
42
|
-
catch (err) {
|
|
43
|
-
this.logger.warn("Failed to load memory context", { error: String(err) });
|
|
44
|
-
return undefined;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Simple topic hint extraction from user message.
|
|
50
|
-
* Returns the first capitalized word or proper noun as a potential topic.
|
|
51
|
-
*/
|
|
52
|
-
function extractTopicHint(message) {
|
|
53
|
-
// Look for proper nouns (capitalized words not at sentence start)
|
|
54
|
-
const words = message.split(/\s+/);
|
|
55
|
-
for (let i = 1; i < words.length; i++) {
|
|
56
|
-
const word = words[i];
|
|
57
|
-
if (word && word.length > 2 && /^[A-Z]/.test(word) && !/^(The|And|But|For|With|This|That|What|How|Why|When|Where)$/.test(word)) {
|
|
58
|
-
return word.toLowerCase();
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return undefined;
|
|
62
|
-
}
|
|
63
|
-
//# sourceMappingURL=auto-recall.js.map
|
package/dist/auto-recall.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-recall.js","sourceRoot":"","sources":["../src/auto-recall.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IAEF;IACA;IACA;IAHnB,YACmB,MAAiB,EACjB,MAAyB,EACzB,MAAmI;QAFnI,WAAM,GAAN,MAAM,CAAW;QACjB,WAAM,GAAN,MAAM,CAAmB;QACzB,WAAM,GAAN,MAAM,CAA6H;IACnJ,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,WAAmB;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO,SAAS,CAAC;QAE9C,IAAI,CAAC;YACH,0DAA0D;YAC1D,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAEhD,mDAAmD;YACnD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAErE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAC3D,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE;gBACpD,IAAI;gBACJ,SAAS;gBACT,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAClE,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC1E,aAAa,EAAE,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aACrF,CAAC,CAAC;YAEH,OAAO,OAAO,CAAC,SAAS,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1E,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,kEAAkE;IAClE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,4DAA4D,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/H,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/dist/formatter.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { MemorySearchResult } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Format memory search results into an XML block for agent context injection.
|
|
4
|
-
* KG facts appear first (precise), then vector results (supporting context).
|
|
5
|
-
*/
|
|
6
|
-
export declare function formatSearchResults(results: MemorySearchResult): string;
|
|
7
|
-
//# sourceMappingURL=formatter.d.ts.map
|
package/dist/formatter.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAuBvE"}
|
package/dist/formatter.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Format memory search results into an XML block for agent context injection.
|
|
3
|
-
* KG facts appear first (precise), then vector results (supporting context).
|
|
4
|
-
*/
|
|
5
|
-
export function formatSearchResults(results) {
|
|
6
|
-
const parts = [];
|
|
7
|
-
if (results.facts.length > 0) {
|
|
8
|
-
parts.push("Known facts:");
|
|
9
|
-
for (const fact of results.facts) {
|
|
10
|
-
const since = typeof fact.since === "string" ? fact.since.slice(0, 10) : "unknown";
|
|
11
|
-
parts.push(`- ${fact.subject} ${fact.predicate} ${fact.object} (since ${since}, confidence: ${String(fact.confidence)})`);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
if (results.memories.length > 0) {
|
|
15
|
-
if (parts.length > 0)
|
|
16
|
-
parts.push("");
|
|
17
|
-
parts.push("Related conversations:");
|
|
18
|
-
for (const mem of results.memories) {
|
|
19
|
-
const truncated = mem.text.length > 200 ? `${mem.text.slice(0, 200)}...` : mem.text;
|
|
20
|
-
parts.push(`- [${mem.topic}/${mem.subtopic}] ${truncated}`);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
if (parts.length === 0)
|
|
24
|
-
return "";
|
|
25
|
-
return `<relevant-memories>\n${parts.join("\n")}\n</relevant-memories>`;
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=formatter.js.map
|
package/dist/formatter.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA2B;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACnF,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,WAAW,KAAK,iBAAiB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5H,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;YACpF,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,OAAO,wBAAwB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC;AAC1E,CAAC"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,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,qEAAqE;QACrE,0EAA0E;QAC1E,qEAAqE;QACrE,qDAAqD;QACrD,MAAM,WAAW,GAAG,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QACzE,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"}
|
package/dist/ingest-epoch.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/ingest-epoch.js
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
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
|
package/dist/ingest-epoch.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Session backfill — one-time ingestion of pre-existing chat history into
|
|
3
|
-
* cloud memory, run fire-and-forget at plugin startup (see index.ts).
|
|
4
|
-
*
|
|
5
|
-
* Reads the openclaw-chat plugin's on-disk session files directly:
|
|
6
|
-
* ~/.alfe/sessions/chat/{sessionId}.json
|
|
7
|
-
* The write side is packages/openclaw-chat/src/session-store.ts — that path
|
|
8
|
-
* and file shape are a read contract; keep the two in sync. The chat plugin
|
|
9
|
-
* is not a package dependency because its session-store functions aren't
|
|
10
|
-
* part of its public entry and the plugin isn't guaranteed to be installed
|
|
11
|
-
* alongside memory. Like the session store itself, this assumes one agent
|
|
12
|
-
* per machine (`alfe remove` deletes ~/.alfe, so files never outlive the
|
|
13
|
-
* agent they belong to).
|
|
14
|
-
*
|
|
15
|
-
* No-re-sync guarantees (in concert with services/memory):
|
|
16
|
-
* 1. Runs only while the server-side `sessionsBackfillSyncedAt` flag is
|
|
17
|
-
* unset; the flag survives integration uninstall/reinstall.
|
|
18
|
-
* 2. Only messages with timestamp < cutoffMs are ingested — for agents that
|
|
19
|
-
* already had memory installed, everything after `bootstrapSyncedAt` was
|
|
20
|
-
* already captured live by AutoCapture.
|
|
21
|
-
* 3. sessionKey = file sessionId and index = file array position, so the
|
|
22
|
-
* ingest consumer's per-session `lastProcessedIndex` high-water mark makes
|
|
23
|
-
* a crash-and-retry replay free (filtered server-side before any cost).
|
|
24
|
-
*
|
|
25
|
-
* Each session is sent as exactly ONE memoryIngest call (one SQS message,
|
|
26
|
-
* windowed to the most recent messages that fit the caps below). Splitting a
|
|
27
|
-
* session across multiple SQS messages would race the shared per-session
|
|
28
|
-
* high-water mark on the standard (non-FIFO) ingest queue: a transiently
|
|
29
|
-
* failed early chunk redelivered after a later chunk succeeds gets filtered
|
|
30
|
-
* out and silently lost.
|
|
31
|
-
*/
|
|
32
|
-
import type { MemoryCloudConfig, MemoryMessage, SessionMetadata } from "./types.js";
|
|
33
|
-
interface BackfillApi {
|
|
34
|
-
memoryIngest(sessionKey: string, messages: MemoryMessage[], metadata?: SessionMetadata): Promise<{
|
|
35
|
-
queued: boolean;
|
|
36
|
-
messageCount: number;
|
|
37
|
-
}>;
|
|
38
|
-
memoryBootstrapStatusMark(scope?: "files" | "sessions"): Promise<{
|
|
39
|
-
synced: true;
|
|
40
|
-
syncedAt: string;
|
|
41
|
-
}>;
|
|
42
|
-
}
|
|
43
|
-
interface BackfillLogger {
|
|
44
|
-
info: (msg: string, ctx?: Record<string, unknown>) => void;
|
|
45
|
-
debug: (msg: string, ctx?: Record<string, unknown>) => void;
|
|
46
|
-
warn: (msg: string, ctx?: Record<string, unknown>) => void;
|
|
47
|
-
}
|
|
48
|
-
export interface SessionsBackfillOptions {
|
|
49
|
-
cutoffMs: number;
|
|
50
|
-
sessionsDir?: string;
|
|
51
|
-
}
|
|
52
|
-
export declare function runSessionsBackfill(client: BackfillApi, config: MemoryCloudConfig, logger: BackfillLogger, opts: SessionsBackfillOptions): Promise<void>;
|
|
53
|
-
export {};
|
|
54
|
-
//# sourceMappingURL=session-backfill.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-backfill.d.ts","sourceRoot":"","sources":["../src/session-backfill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAcpF,UAAU,WAAW;IACnB,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;IAC5I,yBAAyB,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtG;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC3D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC5D;AAWD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAmEf"}
|