@ubundi/openclaw-cortex 0.3.4 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/plugin.d.ts.map +1 -1
- package/dist/core/plugin.js +37 -23
- package/dist/core/plugin.js.map +1 -1
- package/dist/features/sync/watcher.d.ts +2 -0
- package/dist/features/sync/watcher.d.ts.map +1 -1
- package/dist/features/sync/watcher.js +36 -38
- package/dist/features/sync/watcher.js.map +1 -1
- package/dist/shared/queue/retry-queue.d.ts +4 -1
- package/dist/shared/queue/retry-queue.d.ts.map +1 -1
- package/dist/shared/queue/retry-queue.js +62 -31
- package/dist/shared/queue/retry-queue.js.map +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/core/plugin.ts"],"names":[],"mappings":"AAuBA,UAAU,SAAS;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,EAAE;QACN,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;KACjC,CAAC;IACF,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3F,eAAe,CAAC,OAAO,EAAE;QACvB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE;YAAE,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;QACjD,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;YAAE,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;KACjD,GAAG,IAAI,CAAC;CACV;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/core/plugin.ts"],"names":[],"mappings":"AAuBA,UAAU,SAAS;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,EAAE;QACN,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;KACjC,CAAC;IACF,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3F,eAAe,CAAC,OAAO,EAAE;QACvB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE;YAAE,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;QACjD,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;YAAE,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;KACjD,GAAG,IAAI,CAAC;CACV;AAuCD,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBASI,SAAS;CA6GxB,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/core/plugin.js
CHANGED
|
@@ -29,6 +29,21 @@ function resolveConfigEnvVars(raw) {
|
|
|
29
29
|
}
|
|
30
30
|
return resolved;
|
|
31
31
|
}
|
|
32
|
+
async function bootstrapClient(client, logger) {
|
|
33
|
+
try {
|
|
34
|
+
const healthy = await client.healthCheck();
|
|
35
|
+
if (!healthy) {
|
|
36
|
+
logger.warn("Cortex health check failed — API may be unreachable");
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
logger.info("Cortex health check passed");
|
|
40
|
+
const warmup = await client.warmup();
|
|
41
|
+
logger.info(`Cortex warmup: ${warmup.already_warm ? "already warm" : "initialized"} (tenant: ${warmup.tenant_id})`);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
logger.warn("Cortex warmup failed — first ingest may be slow");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
32
47
|
const plugin = {
|
|
33
48
|
id: "cortex-memory",
|
|
34
49
|
name: "Cortex Memory",
|
|
@@ -51,24 +66,13 @@ const plugin = {
|
|
|
51
66
|
// Whether the user explicitly set a namespace vs. relying on default
|
|
52
67
|
const userSetNamespace = raw.namespace != null;
|
|
53
68
|
let namespace = config.namespace;
|
|
69
|
+
let started = false;
|
|
70
|
+
let watcher = null;
|
|
71
|
+
let reflect = null;
|
|
54
72
|
api.logger.info(`Cortex plugin registered (recallMode=${config.recallMode}, namespace=${namespace})`);
|
|
55
73
|
// Async health check + warmup — validate connection and pre-init the tenant's
|
|
56
74
|
// Cortex instance so the first ingest doesn't pay the cold-start cost.
|
|
57
|
-
client.
|
|
58
|
-
if (ok) {
|
|
59
|
-
api.logger.info("Cortex health check passed");
|
|
60
|
-
return client.warmup();
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
api.logger.warn("Cortex health check failed — API may be unreachable");
|
|
64
|
-
}
|
|
65
|
-
}).then((warmup) => {
|
|
66
|
-
if (warmup) {
|
|
67
|
-
api.logger.info(`Cortex warmup: ${warmup.already_warm ? "already warm" : "initialized"} (tenant: ${warmup.tenant_id})`);
|
|
68
|
-
}
|
|
69
|
-
}).catch(() => {
|
|
70
|
-
api.logger.warn("Cortex warmup failed — first ingest may be slow");
|
|
71
|
-
});
|
|
75
|
+
void bootstrapClient(client, api.logger);
|
|
72
76
|
// Auto-Recall: inject relevant memories before every agent turn
|
|
73
77
|
api.on("before_agent_start", createRecallHandler(client, config, api.logger, recallMetrics));
|
|
74
78
|
// Auto-Capture: extract facts after agent responses
|
|
@@ -77,6 +81,11 @@ const plugin = {
|
|
|
77
81
|
api.registerService({
|
|
78
82
|
id: "cortex-services",
|
|
79
83
|
start(ctx) {
|
|
84
|
+
if (started) {
|
|
85
|
+
api.logger.debug?.("Cortex services already started, skipping");
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
started = true;
|
|
80
89
|
retryQueue.start();
|
|
81
90
|
// Derive workspace-scoped namespace when user didn't set one explicitly
|
|
82
91
|
if (!userSetNamespace && ctx.workspaceDir) {
|
|
@@ -90,24 +99,29 @@ const plugin = {
|
|
|
90
99
|
api.logger.warn("Cortex file sync: no workspaceDir, skipping");
|
|
91
100
|
}
|
|
92
101
|
else {
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
102
|
+
const newWatcher = new FileSyncWatcher(workspaceDir, client, namespace, api.logger, retryQueue, { transcripts: config.transcriptSync });
|
|
103
|
+
newWatcher.start();
|
|
104
|
+
watcher = newWatcher;
|
|
96
105
|
api.logger.info("Cortex file sync started");
|
|
97
106
|
}
|
|
98
107
|
}
|
|
99
108
|
// Periodic reflect (memory consolidation)
|
|
100
109
|
if (config.reflectIntervalMs > 0) {
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
110
|
+
const newReflect = new PeriodicReflect(client, api.logger, config.reflectIntervalMs);
|
|
111
|
+
newReflect.start();
|
|
112
|
+
reflect = newReflect;
|
|
104
113
|
api.logger.info(`Cortex periodic reflect started (every ${config.reflectIntervalMs / 1000}s)`);
|
|
105
114
|
}
|
|
106
115
|
api.logger.info("Cortex services started");
|
|
107
116
|
},
|
|
108
117
|
stop() {
|
|
109
|
-
|
|
110
|
-
|
|
118
|
+
if (!started)
|
|
119
|
+
return;
|
|
120
|
+
started = false;
|
|
121
|
+
watcher?.stop();
|
|
122
|
+
watcher = null;
|
|
123
|
+
reflect?.stop();
|
|
124
|
+
reflect = null;
|
|
111
125
|
retryQueue.stop();
|
|
112
126
|
const summary = recallMetrics.summary();
|
|
113
127
|
if (summary.count > 0) {
|
package/dist/core/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/core/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE;;;;GAIG;AACH,SAAS,eAAe,CAAC,YAAoB;IAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAC3B,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/core/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,9 +20,11 @@ export declare class FileSyncWatcher {
|
|
|
20
20
|
private memoryMdSync;
|
|
21
21
|
private dailyLogsSync;
|
|
22
22
|
private transcriptsSync;
|
|
23
|
+
private started;
|
|
23
24
|
constructor(workspaceDir: string, client: CortexClient, sessionPrefix: string, logger: Logger, retryQueue?: RetryQueue | undefined, options?: FileSyncOptions);
|
|
24
25
|
start(): void;
|
|
25
26
|
stop(): void;
|
|
27
|
+
private watchPath;
|
|
26
28
|
}
|
|
27
29
|
export {};
|
|
28
30
|
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/features/sync/watcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAKpE,KAAK,MAAM,GAAG;IACZ,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,eAAe;
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/features/sync/watcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAKpE,KAAK,MAAM,GAAG;IACZ,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,eAAe;IAQxB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,UAAU,CAAC;IACnB,OAAO,CAAC,OAAO;IAZjB,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,OAAO,CAAS;gBAGd,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,UAAU,YAAA,EACvB,OAAO,GAAE,eAAoB;IAGvC,KAAK,IAAI,IAAI;IAwEb,IAAI,IAAI,IAAI;IAiBZ,OAAO,CAAC,SAAS;CAelB"}
|
|
@@ -14,6 +14,7 @@ export class FileSyncWatcher {
|
|
|
14
14
|
memoryMdSync = null;
|
|
15
15
|
dailyLogsSync = null;
|
|
16
16
|
transcriptsSync = null;
|
|
17
|
+
started = false;
|
|
17
18
|
constructor(workspaceDir, client, sessionPrefix, logger, retryQueue, options = {}) {
|
|
18
19
|
this.workspaceDir = workspaceDir;
|
|
19
20
|
this.client = client;
|
|
@@ -23,55 +24,42 @@ export class FileSyncWatcher {
|
|
|
23
24
|
this.options = options;
|
|
24
25
|
}
|
|
25
26
|
start() {
|
|
27
|
+
if (this.started) {
|
|
28
|
+
this.logger.debug?.("File sync: start() called while already running, skipping");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.started = true;
|
|
26
32
|
const memoryMdPath = join(this.workspaceDir, "MEMORY.md");
|
|
27
33
|
const memoryDir = join(this.workspaceDir, "memory");
|
|
28
34
|
const sessionsDir = join(this.workspaceDir, "sessions");
|
|
29
35
|
this.memoryMdSync = new MemoryMdSync(memoryMdPath, this.client, `${this.sessionPrefix}:memory-md`, this.logger, this.retryQueue, this.workspaceDir);
|
|
30
36
|
this.dailyLogsSync = new DailyLogsSync(this.client, this.sessionPrefix, this.logger, this.retryQueue, memoryDir);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
this.logger.debug?.("File sync: MEMORY.md not found, skipping");
|
|
41
|
-
}
|
|
42
|
-
// Watch memory/*.md (daily logs)
|
|
43
|
-
try {
|
|
44
|
-
const logsWatcher = watch(memoryDir, { recursive: true }, (_event, filename) => {
|
|
45
|
-
if (!filename?.endsWith(".md"))
|
|
46
|
-
return;
|
|
47
|
-
const fullPath = join(memoryDir, filename);
|
|
48
|
-
this.dailyLogsSync?.onFileChange(fullPath, filename);
|
|
49
|
-
});
|
|
50
|
-
this.watchers.push(logsWatcher);
|
|
51
|
-
this.logger.debug?.("File sync: watching memory/*.md");
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
this.logger.debug?.("File sync: memory/ directory not found, skipping");
|
|
55
|
-
}
|
|
37
|
+
this.watchPath(memoryMdPath, () => {
|
|
38
|
+
this.memoryMdSync?.onFileChange();
|
|
39
|
+
}, "File sync: watching MEMORY.md", "File sync: MEMORY.md not found, skipping");
|
|
40
|
+
this.watchPath(memoryDir, (_event, filename) => {
|
|
41
|
+
if (typeof filename !== "string" || !filename.endsWith(".md"))
|
|
42
|
+
return;
|
|
43
|
+
const fullPath = join(memoryDir, filename);
|
|
44
|
+
this.dailyLogsSync?.onFileChange(fullPath, filename);
|
|
45
|
+
}, "File sync: watching memory/*.md", "File sync: memory/ directory not found, skipping", { recursive: true });
|
|
56
46
|
// Watch sessions/*.jsonl (transcripts)
|
|
57
47
|
if (this.options.transcripts !== false) {
|
|
58
48
|
this.transcriptsSync = new TranscriptsSync(this.client, this.sessionPrefix, this.logger, this.retryQueue, sessionsDir);
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
});
|
|
66
|
-
this.watchers.push(sessionsWatcher);
|
|
67
|
-
this.logger.debug?.("File sync: watching sessions/*.jsonl");
|
|
68
|
-
}
|
|
69
|
-
catch {
|
|
70
|
-
this.logger.debug?.("File sync: sessions/ directory not found, skipping");
|
|
71
|
-
}
|
|
49
|
+
this.watchPath(sessionsDir, (_event, filename) => {
|
|
50
|
+
if (typeof filename !== "string" || !filename.endsWith(".jsonl"))
|
|
51
|
+
return;
|
|
52
|
+
const fullPath = join(sessionsDir, filename);
|
|
53
|
+
this.transcriptsSync?.onFileChange(fullPath, filename);
|
|
54
|
+
}, "File sync: watching sessions/*.jsonl", "File sync: sessions/ directory not found, skipping", { recursive: true });
|
|
72
55
|
}
|
|
73
56
|
}
|
|
74
57
|
stop() {
|
|
58
|
+
if (!this.started) {
|
|
59
|
+
this.logger.info("File sync stopped");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this.started = false;
|
|
75
63
|
for (const w of this.watchers) {
|
|
76
64
|
w.close();
|
|
77
65
|
}
|
|
@@ -81,5 +69,15 @@ export class FileSyncWatcher {
|
|
|
81
69
|
this.transcriptsSync?.stop();
|
|
82
70
|
this.logger.info("File sync stopped");
|
|
83
71
|
}
|
|
72
|
+
watchPath(path, handler, successMessage, skipMessage, options) {
|
|
73
|
+
try {
|
|
74
|
+
const watcher = options ? watch(path, options, handler) : watch(path, handler);
|
|
75
|
+
this.watchers.push(watcher);
|
|
76
|
+
this.logger.debug?.(successMessage);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
this.logger.debug?.(skipMessage);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
84
82
|
}
|
|
85
83
|
//# sourceMappingURL=watcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/features/sync/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAaxD,MAAM,OAAO,eAAe;
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/features/sync/watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,15 +14,18 @@ export declare class RetryQueue {
|
|
|
14
14
|
private logger;
|
|
15
15
|
private maxRetries;
|
|
16
16
|
private maxCapacity;
|
|
17
|
-
private
|
|
17
|
+
private tasksById;
|
|
18
|
+
private taskOrder;
|
|
18
19
|
private timer;
|
|
19
20
|
private taskCounter;
|
|
21
|
+
private isFlushing;
|
|
20
22
|
constructor(logger: Logger, maxRetries?: number, maxCapacity?: number);
|
|
21
23
|
start(): void;
|
|
22
24
|
stop(): void;
|
|
23
25
|
enqueue(execute: () => Promise<void>, label?: string): void;
|
|
24
26
|
get pending(): number;
|
|
25
27
|
private flush;
|
|
28
|
+
private remove;
|
|
26
29
|
}
|
|
27
30
|
export {};
|
|
28
31
|
//# sourceMappingURL=retry-queue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-queue.d.ts","sourceRoot":"","sources":["../../../src/shared/queue/retry-queue.ts"],"names":[],"mappings":"AAAA,KAAK,MAAM,GAAG;IACZ,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAQD,qBAAa,UAAU;
|
|
1
|
+
{"version":3,"file":"retry-queue.d.ts","sourceRoot":"","sources":["../../../src/shared/queue/retry-queue.ts"],"names":[],"mappings":"AAAA,KAAK,MAAM,GAAG;IACZ,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAQD,qBAAa,UAAU;IAQnB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,WAAW;IATrB,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,UAAU,CAAS;gBAGjB,MAAM,EAAE,MAAM,EACd,UAAU,SAAc,EACxB,WAAW,SAAe;IAGpC,KAAK,IAAI,IAAI;IAOb,IAAI,IAAI,IAAI;IAcZ,OAAO,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAmC3D,IAAI,OAAO,IAAI,MAAM,CAEpB;YAEa,KAAK;IAwCnB,OAAO,CAAC,MAAM;CAOf"}
|
|
@@ -7,9 +7,11 @@ export class RetryQueue {
|
|
|
7
7
|
logger;
|
|
8
8
|
maxRetries;
|
|
9
9
|
maxCapacity;
|
|
10
|
-
|
|
10
|
+
tasksById = new Map();
|
|
11
|
+
taskOrder = [];
|
|
11
12
|
timer = null;
|
|
12
13
|
taskCounter = 0;
|
|
14
|
+
isFlushing = false;
|
|
13
15
|
constructor(logger, maxRetries = MAX_RETRIES, maxCapacity = MAX_CAPACITY) {
|
|
14
16
|
this.logger = logger;
|
|
15
17
|
this.maxRetries = maxRetries;
|
|
@@ -18,67 +20,96 @@ export class RetryQueue {
|
|
|
18
20
|
start() {
|
|
19
21
|
if (this.timer)
|
|
20
22
|
return;
|
|
21
|
-
this.timer = setInterval(() =>
|
|
23
|
+
this.timer = setInterval(() => {
|
|
24
|
+
void this.flush();
|
|
25
|
+
}, FLUSH_INTERVAL_MS);
|
|
22
26
|
}
|
|
23
27
|
stop() {
|
|
24
28
|
if (this.timer) {
|
|
25
29
|
clearInterval(this.timer);
|
|
26
30
|
this.timer = null;
|
|
27
31
|
}
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
const pendingCount = this.pending;
|
|
33
|
+
if (pendingCount > 0) {
|
|
34
|
+
this.logger.warn(`Retry queue stopped with ${pendingCount} pending tasks`);
|
|
30
35
|
}
|
|
31
|
-
this.
|
|
36
|
+
this.tasksById.clear();
|
|
37
|
+
this.taskOrder = [];
|
|
38
|
+
this.isFlushing = false;
|
|
32
39
|
}
|
|
33
40
|
enqueue(execute, label) {
|
|
34
41
|
const id = label ?? `task-${++this.taskCounter}`;
|
|
35
42
|
// Deduplicate: if a task with the same label exists, replace it
|
|
36
|
-
const
|
|
37
|
-
if (
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
43
|
+
const existing = this.tasksById.get(id);
|
|
44
|
+
if (existing) {
|
|
45
|
+
existing.execute = execute;
|
|
46
|
+
existing.retries = 0;
|
|
47
|
+
existing.nextAttemptAt = Date.now();
|
|
41
48
|
this.logger.debug?.(`Retry queue: deduplicated ${id}`);
|
|
42
49
|
return;
|
|
43
50
|
}
|
|
44
51
|
// Capacity check: drop oldest task if at limit
|
|
45
|
-
if (this.
|
|
46
|
-
const
|
|
47
|
-
|
|
52
|
+
if (this.pending >= this.maxCapacity) {
|
|
53
|
+
const droppedId = this.taskOrder.shift();
|
|
54
|
+
const dropped = droppedId ? this.tasksById.get(droppedId) : undefined;
|
|
55
|
+
if (droppedId) {
|
|
56
|
+
this.tasksById.delete(droppedId);
|
|
57
|
+
}
|
|
58
|
+
this.logger.warn(`Retry queue: at capacity (${this.maxCapacity}), dropped oldest task ${dropped?.id ?? "unknown"}`);
|
|
48
59
|
}
|
|
49
|
-
this.
|
|
60
|
+
this.tasksById.set(id, {
|
|
50
61
|
id,
|
|
51
62
|
execute,
|
|
52
63
|
retries: 0,
|
|
53
64
|
nextAttemptAt: Date.now(),
|
|
54
65
|
});
|
|
66
|
+
this.taskOrder.push(id);
|
|
55
67
|
this.logger.debug?.(`Retry queue: enqueued ${id}`);
|
|
56
68
|
}
|
|
57
69
|
get pending() {
|
|
58
|
-
return this.
|
|
70
|
+
return this.tasksById.size;
|
|
59
71
|
}
|
|
60
72
|
async flush() {
|
|
73
|
+
if (this.isFlushing)
|
|
74
|
+
return;
|
|
75
|
+
this.isFlushing = true;
|
|
61
76
|
const now = Date.now();
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
this.queue = this.queue.filter((t) => t.id !== task.id);
|
|
73
|
-
this.logger.warn(`Retry queue: ${task.id} failed after ${this.maxRetries} retries, dropping: ${String(err)}`);
|
|
77
|
+
const ids = [...this.taskOrder];
|
|
78
|
+
try {
|
|
79
|
+
for (const id of ids) {
|
|
80
|
+
const task = this.tasksById.get(id);
|
|
81
|
+
if (!task || task.nextAttemptAt > now)
|
|
82
|
+
continue;
|
|
83
|
+
try {
|
|
84
|
+
await task.execute();
|
|
85
|
+
this.remove(id);
|
|
86
|
+
this.logger.debug?.(`Retry queue: ${task.id} succeeded`);
|
|
74
87
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
task.
|
|
78
|
-
|
|
88
|
+
catch (err) {
|
|
89
|
+
task.retries++;
|
|
90
|
+
if (task.retries >= this.maxRetries) {
|
|
91
|
+
this.remove(id);
|
|
92
|
+
this.logger.warn(`Retry queue: ${task.id} failed after ${this.maxRetries} retries, dropping: ${String(err)}`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const delay = Math.min(BASE_DELAY_MS * Math.pow(2, task.retries), MAX_DELAY_MS);
|
|
96
|
+
task.nextAttemptAt = Date.now() + delay;
|
|
97
|
+
this.logger.debug?.(`Retry queue: ${task.id} retry ${task.retries}/${this.maxRetries} in ${delay}ms`);
|
|
98
|
+
}
|
|
79
99
|
}
|
|
80
100
|
}
|
|
81
101
|
}
|
|
102
|
+
finally {
|
|
103
|
+
this.isFlushing = false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
remove(id) {
|
|
107
|
+
if (!this.tasksById.delete(id))
|
|
108
|
+
return;
|
|
109
|
+
const idx = this.taskOrder.indexOf(id);
|
|
110
|
+
if (idx !== -1) {
|
|
111
|
+
this.taskOrder.splice(idx, 1);
|
|
112
|
+
}
|
|
82
113
|
}
|
|
83
114
|
}
|
|
84
115
|
//# sourceMappingURL=retry-queue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-queue.js","sourceRoot":"","sources":["../../../src/shared/queue/retry-queue.ts"],"names":[],"mappings":"AAcA,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,MAAM,OAAO,UAAU;
|
|
1
|
+
{"version":3,"file":"retry-queue.js","sourceRoot":"","sources":["../../../src/shared/queue/retry-queue.ts"],"names":[],"mappings":"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"}
|
package/openclaw.plugin.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "cortex-memory",
|
|
3
3
|
"name": "Cortex Memory",
|
|
4
4
|
"description": "Long-term memory powered by Cortex — Auto-Recall, Auto-Capture, transcript ingestion, periodic consolidation, and background file sync",
|
|
5
|
-
"version": "0.3.
|
|
5
|
+
"version": "0.3.5",
|
|
6
6
|
"kind": "memory",
|
|
7
7
|
"configSchema": {
|
|
8
8
|
"type": "object",
|