@ubundi/openclaw-cortex 1.0.0 → 1.1.0
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 +17 -4
- package/dist/adapters/cortex/client.d.ts +7 -1
- package/dist/adapters/cortex/client.d.ts.map +1 -1
- package/dist/adapters/cortex/client.js +4 -2
- package/dist/adapters/cortex/client.js.map +1 -1
- package/dist/features/capture/handler.d.ts +2 -1
- package/dist/features/capture/handler.d.ts.map +1 -1
- package/dist/features/capture/handler.js +50 -6
- package/dist/features/capture/handler.js.map +1 -1
- package/dist/features/recall/handler.d.ts +2 -1
- package/dist/features/recall/handler.d.ts.map +1 -1
- package/dist/features/recall/handler.js +12 -2
- package/dist/features/recall/handler.js.map +1 -1
- package/dist/features/sync/daily-logs-sync.d.ts +3 -1
- package/dist/features/sync/daily-logs-sync.d.ts.map +1 -1
- package/dist/features/sync/daily-logs-sync.js +13 -1
- package/dist/features/sync/daily-logs-sync.js.map +1 -1
- package/dist/features/sync/memory-md-sync.d.ts +3 -1
- package/dist/features/sync/memory-md-sync.d.ts.map +1 -1
- package/dist/features/sync/memory-md-sync.js +13 -1
- package/dist/features/sync/memory-md-sync.js.map +1 -1
- package/dist/features/sync/transcripts-sync.d.ts +3 -1
- package/dist/features/sync/transcripts-sync.d.ts.map +1 -1
- package/dist/features/sync/transcripts-sync.js +14 -1
- package/dist/features/sync/transcripts-sync.js.map +1 -1
- package/dist/features/sync/watcher.d.ts +3 -1
- package/dist/features/sync/watcher.d.ts.map +1 -1
- package/dist/features/sync/watcher.js +6 -4
- package/dist/features/sync/watcher.js.map +1 -1
- package/dist/internal/audit/audit-logger.d.ts +28 -0
- package/dist/internal/audit/audit-logger.d.ts.map +1 -0
- package/dist/internal/audit/audit-logger.js +61 -0
- package/dist/internal/audit/audit-logger.js.map +1 -0
- package/dist/internal/identity/api-key.js +1 -1
- package/dist/plugin/config/schema.d.ts +15 -0
- package/dist/plugin/config/schema.d.ts.map +1 -1
- package/dist/plugin/config/schema.js +4 -1
- package/dist/plugin/config/schema.js.map +1 -1
- package/dist/plugin/index.d.ts +6 -0
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +121 -12
- package/dist/plugin/index.js.map +1 -1
- package/openclaw.plugin.json +30 -1
- package/package.json +1 -1
- package/dist/core/config/schema.d.ts +0 -61
- package/dist/core/config/schema.d.ts.map +0 -1
- package/dist/core/config/schema.js +0 -39
- package/dist/core/config/schema.js.map +0 -1
- package/dist/core/plugin.d.ts +0 -61
- package/dist/core/plugin.d.ts.map +0 -1
- package/dist/core/plugin.js +0 -147
- package/dist/core/plugin.js.map +0 -1
- package/dist/cortex/client.d.ts +0 -142
- package/dist/cortex/client.d.ts.map +0 -1
- package/dist/cortex/client.js +0 -145
- package/dist/cortex/client.js.map +0 -1
- package/dist/features/reflect/service.d.ts +0 -19
- package/dist/features/reflect/service.d.ts.map +0 -1
- package/dist/features/reflect/service.js +0 -38
- package/dist/features/reflect/service.js.map +0 -1
- package/dist/shared/fs/safe-path.d.ts +0 -8
- package/dist/shared/fs/safe-path.d.ts.map +0 -1
- package/dist/shared/fs/safe-path.js +0 -32
- package/dist/shared/fs/safe-path.js.map +0 -1
- package/dist/shared/metrics/latency-metrics.d.ts +0 -19
- package/dist/shared/metrics/latency-metrics.d.ts.map +0 -1
- package/dist/shared/metrics/latency-metrics.js +0 -45
- package/dist/shared/metrics/latency-metrics.js.map +0 -1
- package/dist/shared/queue/retry-queue.d.ts +0 -31
- package/dist/shared/queue/retry-queue.d.ts.map +0 -1
- package/dist/shared/queue/retry-queue.js +0 -115
- package/dist/shared/queue/retry-queue.js.map +0 -1
- package/dist/shared/transcript/cleaner.d.ts +0 -24
- package/dist/shared/transcript/cleaner.d.ts.map +0 -1
- package/dist/shared/transcript/cleaner.js +0 -96
- package/dist/shared/transcript/cleaner.js.map +0 -1
|
@@ -8,14 +8,16 @@ export class TranscriptsSync {
|
|
|
8
8
|
retryQueue;
|
|
9
9
|
allowedRoot;
|
|
10
10
|
getUserId;
|
|
11
|
+
auditLogger;
|
|
11
12
|
offsets = new Map();
|
|
12
|
-
constructor(client, sessionPrefix, logger, retryQueue, allowedRoot, getUserId) {
|
|
13
|
+
constructor(client, sessionPrefix, logger, retryQueue, allowedRoot, getUserId, auditLogger) {
|
|
13
14
|
this.client = client;
|
|
14
15
|
this.sessionPrefix = sessionPrefix;
|
|
15
16
|
this.logger = logger;
|
|
16
17
|
this.retryQueue = retryQueue;
|
|
17
18
|
this.allowedRoot = allowedRoot;
|
|
18
19
|
this.getUserId = getUserId;
|
|
20
|
+
this.auditLogger = auditLogger;
|
|
19
21
|
}
|
|
20
22
|
async onFileChange(filePath, filename) {
|
|
21
23
|
try {
|
|
@@ -42,6 +44,17 @@ export class TranscriptsSync {
|
|
|
42
44
|
const sessionName = filename.replace(/\.jsonl$/, "");
|
|
43
45
|
const sessionId = `${this.sessionPrefix}:session:${sessionName}`;
|
|
44
46
|
const referenceDate = new Date().toISOString().slice(0, 10);
|
|
47
|
+
if (this.auditLogger) {
|
|
48
|
+
void this.auditLogger.log({
|
|
49
|
+
feature: "file-sync-transcripts",
|
|
50
|
+
method: "POST",
|
|
51
|
+
endpoint: "/v1/remember",
|
|
52
|
+
payload: messages.map((m) => `${m.role}: ${m.content}`).join("\n\n"),
|
|
53
|
+
sessionId,
|
|
54
|
+
userId: this.getUserId?.(),
|
|
55
|
+
messageCount: messages.length,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
45
58
|
const doRemember = () => {
|
|
46
59
|
// Re-evaluate userId at call time so retries use the resolved value
|
|
47
60
|
const userId = this.getUserId?.();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcripts-sync.js","sourceRoot":"","sources":["../../../src/features/sync/transcripts-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"transcripts-sync.js","sourceRoot":"","sources":["../../../src/features/sync/transcripts-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAS1D,MAAM,OAAO,eAAe;IAIhB;IACA;IACA;IACA;IACA;IACA;IACA;IATF,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,YACU,MAAoB,EACpB,aAAqB,EACrB,MAAc,EACd,UAAuB,EACvB,WAAoB,EACpB,SAAoC,EACpC,WAAyB;QANzB,WAAM,GAAN,MAAM,CAAc;QACpB,kBAAa,GAAb,aAAa,CAAQ;QACrB,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAa;QACvB,gBAAW,GAAX,WAAW,CAAS;QACpB,cAAS,GAAT,SAAS,CAA2B;QACpC,gBAAW,GAAX,WAAW,CAAc;IAChC,CAAC;IAEJ,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,QAAgB;QACnD,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxD,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,QAAQ,EAAE,CAAC,CAAC;oBACtE,OAAO;gBACT,CAAC;gBACD,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAE3C,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;gBAAE,OAAO;YAE/B,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;YAEtE,IAAI,CAAC,cAAc,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,6BAA6B,QAAQ,uBAAuB,CAAC,CAAC;gBAClF,OAAO;YACT,CAAC;YAED,oFAAoF;YACpF,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACrD,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,aAAa,YAAY,WAAW,EAAE,CAAC;YACjE,MAAM,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAE5D,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;oBACxB,OAAO,EAAE,uBAAuB;oBAChC,MAAM,EAAE,MAAM;oBACd,QAAQ,EAAE,cAAc;oBACxB,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;oBACpE,SAAS;oBACT,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE;oBAC1B,YAAY,EAAE,QAAQ,CAAC,MAAM;iBAC9B,CAAC,CAAC;YACL,CAAC;YAED,MAAM,UAAU,GAAG,GAAG,EAAE;gBACtB,oEAAoE;gBACpE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;gBAClC,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC1G,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,+BAA+B,GAAG,CAAC,gBAAgB,iBAAiB,QAAQ,EAAE,CAAC,CAAC;gBACtG,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,UAAU,EAAE,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,QAAQ,wBAAwB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC9F,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,cAAc,QAAQ,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CortexClient } from "../../adapters/cortex/client.js";
|
|
2
2
|
import type { RetryQueue } from "../../internal/queue/retry-queue.js";
|
|
3
|
+
import type { AuditLogger } from "../../internal/audit/audit-logger.js";
|
|
3
4
|
type Logger = {
|
|
4
5
|
debug?(...args: unknown[]): void;
|
|
5
6
|
info(...args: unknown[]): void;
|
|
@@ -17,12 +18,13 @@ export declare class FileSyncWatcher {
|
|
|
17
18
|
private retryQueue?;
|
|
18
19
|
private options;
|
|
19
20
|
private getUserId?;
|
|
21
|
+
private auditLogger?;
|
|
20
22
|
private watchers;
|
|
21
23
|
private memoryMdSync;
|
|
22
24
|
private dailyLogsSync;
|
|
23
25
|
private transcriptsSync;
|
|
24
26
|
private started;
|
|
25
|
-
constructor(workspaceDir: string, client: CortexClient, sessionPrefix: string, logger: Logger, retryQueue?: RetryQueue | undefined, options?: FileSyncOptions, getUserId?: (() => string | undefined) | undefined);
|
|
27
|
+
constructor(workspaceDir: string, client: CortexClient, sessionPrefix: string, logger: Logger, retryQueue?: RetryQueue | undefined, options?: FileSyncOptions, getUserId?: (() => string | undefined) | undefined, auditLogger?: AuditLogger | undefined);
|
|
26
28
|
start(): void;
|
|
27
29
|
stop(): void;
|
|
28
30
|
private watchPath;
|
|
@@ -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,iCAAiC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/features/sync/watcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAKxE,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;IACf,OAAO,CAAC,SAAS,CAAC;IAClB,OAAO,CAAC,WAAW,CAAC;IAdtB,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,EAC7B,SAAS,CAAC,GAAE,MAAM,MAAM,GAAG,SAAS,aAAA,EACpC,WAAW,CAAC,EAAE,WAAW,YAAA;IAGnC,KAAK,IAAI,IAAI;IA8Eb,IAAI,IAAI,IAAI;IAiBZ,OAAO,CAAC,SAAS;CAelB"}
|
|
@@ -11,12 +11,13 @@ export class FileSyncWatcher {
|
|
|
11
11
|
retryQueue;
|
|
12
12
|
options;
|
|
13
13
|
getUserId;
|
|
14
|
+
auditLogger;
|
|
14
15
|
watchers = [];
|
|
15
16
|
memoryMdSync = null;
|
|
16
17
|
dailyLogsSync = null;
|
|
17
18
|
transcriptsSync = null;
|
|
18
19
|
started = false;
|
|
19
|
-
constructor(workspaceDir, client, sessionPrefix, logger, retryQueue, options = {}, getUserId) {
|
|
20
|
+
constructor(workspaceDir, client, sessionPrefix, logger, retryQueue, options = {}, getUserId, auditLogger) {
|
|
20
21
|
this.workspaceDir = workspaceDir;
|
|
21
22
|
this.client = client;
|
|
22
23
|
this.sessionPrefix = sessionPrefix;
|
|
@@ -24,6 +25,7 @@ export class FileSyncWatcher {
|
|
|
24
25
|
this.retryQueue = retryQueue;
|
|
25
26
|
this.options = options;
|
|
26
27
|
this.getUserId = getUserId;
|
|
28
|
+
this.auditLogger = auditLogger;
|
|
27
29
|
}
|
|
28
30
|
start() {
|
|
29
31
|
if (this.started) {
|
|
@@ -34,8 +36,8 @@ export class FileSyncWatcher {
|
|
|
34
36
|
const memoryMdPath = join(this.workspaceDir, "MEMORY.md");
|
|
35
37
|
const memoryDir = join(this.workspaceDir, "memory");
|
|
36
38
|
const sessionsDir = join(this.workspaceDir, "sessions");
|
|
37
|
-
this.memoryMdSync = new MemoryMdSync(memoryMdPath, this.client, `${this.sessionPrefix}:memory-md`, this.logger, this.retryQueue, this.workspaceDir, this.getUserId);
|
|
38
|
-
this.dailyLogsSync = new DailyLogsSync(this.client, this.sessionPrefix, this.logger, this.retryQueue, memoryDir, this.getUserId);
|
|
39
|
+
this.memoryMdSync = new MemoryMdSync(memoryMdPath, this.client, `${this.sessionPrefix}:memory-md`, this.logger, this.retryQueue, this.workspaceDir, this.getUserId, this.auditLogger);
|
|
40
|
+
this.dailyLogsSync = new DailyLogsSync(this.client, this.sessionPrefix, this.logger, this.retryQueue, memoryDir, this.getUserId, this.auditLogger);
|
|
39
41
|
this.watchPath(memoryMdPath, () => {
|
|
40
42
|
this.memoryMdSync?.onFileChange();
|
|
41
43
|
}, "File sync: watching MEMORY.md", "File sync: MEMORY.md not found, skipping");
|
|
@@ -47,7 +49,7 @@ export class FileSyncWatcher {
|
|
|
47
49
|
}, "File sync: watching memory/*.md", "File sync: memory/ directory not found, skipping", { recursive: true });
|
|
48
50
|
// Watch sessions/*.jsonl (transcripts)
|
|
49
51
|
if (this.options.transcripts !== false) {
|
|
50
|
-
this.transcriptsSync = new TranscriptsSync(this.client, this.sessionPrefix, this.logger, this.retryQueue, sessionsDir, this.getUserId);
|
|
52
|
+
this.transcriptsSync = new TranscriptsSync(this.client, this.sessionPrefix, this.logger, this.retryQueue, sessionsDir, this.getUserId, this.auditLogger);
|
|
51
53
|
this.watchPath(sessionsDir, (_event, filename) => {
|
|
52
54
|
if (typeof filename !== "string" || !filename.endsWith(".jsonl"))
|
|
53
55
|
return;
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/features/sync/watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
type Logger = {
|
|
2
|
+
debug?(...args: unknown[]): void;
|
|
3
|
+
info(...args: unknown[]): void;
|
|
4
|
+
warn(...args: unknown[]): void;
|
|
5
|
+
error(...args: unknown[]): void;
|
|
6
|
+
};
|
|
7
|
+
export interface AuditEntry {
|
|
8
|
+
feature: string;
|
|
9
|
+
method: string;
|
|
10
|
+
endpoint: string;
|
|
11
|
+
payload: string;
|
|
12
|
+
sessionId?: string;
|
|
13
|
+
userId?: string;
|
|
14
|
+
messageCount?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class AuditLogger {
|
|
17
|
+
private readonly logger;
|
|
18
|
+
private readonly auditDir;
|
|
19
|
+
private readonly payloadsDir;
|
|
20
|
+
private readonly indexPath;
|
|
21
|
+
private counter;
|
|
22
|
+
private initialized;
|
|
23
|
+
constructor(workspaceDir: string, logger: Logger);
|
|
24
|
+
log(entry: AuditEntry): Promise<void>;
|
|
25
|
+
private rotateIfNeeded;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=audit-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logger.d.ts","sourceRoot":"","sources":["../../../src/internal/audit/audit-logger.ts"],"names":[],"mappings":"AAGA,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,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID,qBAAa,WAAW;IASpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,WAAW,CAAS;gBAG1B,YAAY,EAAE,MAAM,EACH,MAAM,EAAE,MAAM;IAO3B,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YAoC7B,cAAc;CAW7B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { mkdir, appendFile, writeFile, stat, rename } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const MAX_INDEX_BYTES = 5 * 1024 * 1024; // 5MB
|
|
4
|
+
export class AuditLogger {
|
|
5
|
+
logger;
|
|
6
|
+
auditDir;
|
|
7
|
+
payloadsDir;
|
|
8
|
+
indexPath;
|
|
9
|
+
counter = 0;
|
|
10
|
+
initialized = false;
|
|
11
|
+
constructor(workspaceDir, logger) {
|
|
12
|
+
this.logger = logger;
|
|
13
|
+
this.auditDir = join(workspaceDir, ".cortex", "audit");
|
|
14
|
+
this.payloadsDir = join(this.auditDir, "payloads");
|
|
15
|
+
this.indexPath = join(this.auditDir, "index.jsonl");
|
|
16
|
+
}
|
|
17
|
+
async log(entry) {
|
|
18
|
+
try {
|
|
19
|
+
if (!this.initialized) {
|
|
20
|
+
await mkdir(this.payloadsDir, { recursive: true });
|
|
21
|
+
this.initialized = true;
|
|
22
|
+
}
|
|
23
|
+
const ts = new Date().toISOString();
|
|
24
|
+
const seq = String(++this.counter).padStart(3, "0");
|
|
25
|
+
const payloadFilename = `${ts.replace(/[:.]/g, "")}-${seq}.txt`;
|
|
26
|
+
const payloadPath = join(this.payloadsDir, payloadFilename);
|
|
27
|
+
await writeFile(payloadPath, entry.payload, { encoding: "utf-8", mode: 0o600 });
|
|
28
|
+
const indexLine = {
|
|
29
|
+
ts,
|
|
30
|
+
feature: entry.feature,
|
|
31
|
+
method: entry.method,
|
|
32
|
+
endpoint: entry.endpoint,
|
|
33
|
+
bytes: Buffer.byteLength(entry.payload, "utf-8"),
|
|
34
|
+
sessionId: entry.sessionId,
|
|
35
|
+
userId: entry.userId,
|
|
36
|
+
payloadFile: payloadFilename,
|
|
37
|
+
};
|
|
38
|
+
if (entry.messageCount !== undefined) {
|
|
39
|
+
indexLine.msgs = entry.messageCount;
|
|
40
|
+
}
|
|
41
|
+
await appendFile(this.indexPath, JSON.stringify(indexLine) + "\n", "utf-8");
|
|
42
|
+
await this.rotateIfNeeded();
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
this.logger.warn(`Cortex audit log write failed: ${String(err)}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async rotateIfNeeded() {
|
|
49
|
+
try {
|
|
50
|
+
const stats = await stat(this.indexPath);
|
|
51
|
+
if (stats.size > MAX_INDEX_BYTES) {
|
|
52
|
+
const rotatedPath = join(this.auditDir, `index.${Date.now()}.jsonl`);
|
|
53
|
+
await rename(this.indexPath, rotatedPath);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// File may not exist yet or stat failed — ignore
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=audit-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logger.js","sourceRoot":"","sources":["../../../src/internal/audit/audit-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* In source this is a placeholder; the dist file contains the real value.
|
|
4
4
|
* Never commit a real key here.
|
|
5
5
|
*/
|
|
6
|
-
export const BAKED_API_KEY = "
|
|
6
|
+
export const BAKED_API_KEY = "95134e1c-7c62-42d2-8672-c1ebee09553e";
|
|
7
7
|
//# sourceMappingURL=api-key.js.map
|
|
@@ -6,8 +6,11 @@ export declare const CortexConfigSchema: z.ZodObject<{
|
|
|
6
6
|
autoCapture: z.ZodDefault<z.ZodBoolean>;
|
|
7
7
|
recallLimit: z.ZodDefault<z.ZodNumber>;
|
|
8
8
|
recallTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
9
|
+
toolTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
9
10
|
fileSync: z.ZodDefault<z.ZodBoolean>;
|
|
10
11
|
transcriptSync: z.ZodDefault<z.ZodBoolean>;
|
|
12
|
+
captureMaxPayloadBytes: z.ZodDefault<z.ZodNumber>;
|
|
13
|
+
auditLog: z.ZodDefault<z.ZodBoolean>;
|
|
11
14
|
namespace: z.ZodDefault<z.ZodString>;
|
|
12
15
|
}, "strip", z.ZodTypeAny, {
|
|
13
16
|
baseUrl: string;
|
|
@@ -15,8 +18,11 @@ export declare const CortexConfigSchema: z.ZodObject<{
|
|
|
15
18
|
autoCapture: boolean;
|
|
16
19
|
recallLimit: number;
|
|
17
20
|
recallTimeoutMs: number;
|
|
21
|
+
toolTimeoutMs: number;
|
|
18
22
|
fileSync: boolean;
|
|
19
23
|
transcriptSync: boolean;
|
|
24
|
+
captureMaxPayloadBytes: number;
|
|
25
|
+
auditLog: boolean;
|
|
20
26
|
namespace: string;
|
|
21
27
|
userId?: string | undefined;
|
|
22
28
|
}, {
|
|
@@ -26,8 +32,11 @@ export declare const CortexConfigSchema: z.ZodObject<{
|
|
|
26
32
|
autoCapture?: boolean | undefined;
|
|
27
33
|
recallLimit?: number | undefined;
|
|
28
34
|
recallTimeoutMs?: number | undefined;
|
|
35
|
+
toolTimeoutMs?: number | undefined;
|
|
29
36
|
fileSync?: boolean | undefined;
|
|
30
37
|
transcriptSync?: boolean | undefined;
|
|
38
|
+
captureMaxPayloadBytes?: number | undefined;
|
|
39
|
+
auditLog?: boolean | undefined;
|
|
31
40
|
namespace?: string | undefined;
|
|
32
41
|
}>;
|
|
33
42
|
export type CortexConfig = z.infer<typeof CortexConfigSchema>;
|
|
@@ -43,8 +52,11 @@ export declare const configSchema: {
|
|
|
43
52
|
autoCapture?: boolean | undefined;
|
|
44
53
|
recallLimit?: number | undefined;
|
|
45
54
|
recallTimeoutMs?: number | undefined;
|
|
55
|
+
toolTimeoutMs?: number | undefined;
|
|
46
56
|
fileSync?: boolean | undefined;
|
|
47
57
|
transcriptSync?: boolean | undefined;
|
|
58
|
+
captureMaxPayloadBytes?: number | undefined;
|
|
59
|
+
auditLog?: boolean | undefined;
|
|
48
60
|
namespace?: string | undefined;
|
|
49
61
|
}, {
|
|
50
62
|
baseUrl: string;
|
|
@@ -52,8 +64,11 @@ export declare const configSchema: {
|
|
|
52
64
|
autoCapture: boolean;
|
|
53
65
|
recallLimit: number;
|
|
54
66
|
recallTimeoutMs: number;
|
|
67
|
+
toolTimeoutMs: number;
|
|
55
68
|
fileSync: boolean;
|
|
56
69
|
transcriptSync: boolean;
|
|
70
|
+
captureMaxPayloadBytes: number;
|
|
71
|
+
auditLog: boolean;
|
|
57
72
|
namespace: string;
|
|
58
73
|
userId?: string | undefined;
|
|
59
74
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/plugin/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAwBxB,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/plugin/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAwBxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAe7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,YAAY;qBACN,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGzB,CAAC"}
|
|
@@ -22,9 +22,12 @@ export const CortexConfigSchema = z.object({
|
|
|
22
22
|
autoRecall: z.boolean().default(true),
|
|
23
23
|
autoCapture: z.boolean().default(true),
|
|
24
24
|
recallLimit: z.number().int().min(1).max(50).default(10),
|
|
25
|
-
recallTimeoutMs: z.number().int().min(100).max(
|
|
25
|
+
recallTimeoutMs: z.number().int().min(100).max(30000).default(10000),
|
|
26
|
+
toolTimeoutMs: z.number().int().min(1000).max(30000).default(10000),
|
|
26
27
|
fileSync: z.boolean().default(true),
|
|
27
28
|
transcriptSync: z.boolean().default(true),
|
|
29
|
+
captureMaxPayloadBytes: z.number().int().min(1024).max(1_048_576).default(262_144),
|
|
30
|
+
auditLog: z.boolean().default(false),
|
|
28
31
|
namespace: z.string().min(1).default("openclaw"),
|
|
29
32
|
});
|
|
30
33
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/plugin/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,QAAQ,GAAG,CAAC;KACf,MAAM,EAAE;KACR,GAAG,CAAC,6BAA6B,CAAC;KAClC,MAAM,CACL,CAAC,GAAG,EAAE,EAAE;IACN,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC9C,wDAAwD;IACxD,IACE,MAAM,CAAC,QAAQ,KAAK,OAAO;QAC3B,CAAC,MAAM,CAAC,QAAQ,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,EACpE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,EACD,EAAE,OAAO,EAAE,0DAA0D,EAAE,CACxE,CAAC;AAEJ,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,OAAO,EAAE,QAAQ,CAAC,OAAO,CACvB,6DAA6D,CAC9D;IACD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACrC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACtC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACxD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACnE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACnC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACzC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;CACjD,CAAC,CAAC;AAIH;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,SAAS,CAAC,KAAc;QACtB,OAAO,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/plugin/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,QAAQ,GAAG,CAAC;KACf,MAAM,EAAE;KACR,GAAG,CAAC,6BAA6B,CAAC;KAClC,MAAM,CACL,CAAC,GAAG,EAAE,EAAE;IACN,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC9C,wDAAwD;IACxD,IACE,MAAM,CAAC,QAAQ,KAAK,OAAO;QAC3B,CAAC,MAAM,CAAC,QAAQ,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,EACpE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,EACD,EAAE,OAAO,EAAE,0DAA0D,EAAE,CACxE,CAAC;AAEJ,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,OAAO,EAAE,QAAQ,CAAC,OAAO,CACvB,6DAA6D,CAC9D;IACD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACrC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACtC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACxD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACpE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACnE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACnC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACzC,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAClF,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACpC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;CACjD,CAAC,CAAC;AAIH;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,SAAS,CAAC,KAAc;QACtB,OAAO,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC"}
|
package/dist/plugin/index.d.ts
CHANGED
|
@@ -82,8 +82,11 @@ declare const plugin: {
|
|
|
82
82
|
autoCapture?: boolean | undefined;
|
|
83
83
|
recallLimit?: number | undefined;
|
|
84
84
|
recallTimeoutMs?: number | undefined;
|
|
85
|
+
toolTimeoutMs?: number | undefined;
|
|
85
86
|
fileSync?: boolean | undefined;
|
|
86
87
|
transcriptSync?: boolean | undefined;
|
|
88
|
+
captureMaxPayloadBytes?: number | undefined;
|
|
89
|
+
auditLog?: boolean | undefined;
|
|
87
90
|
namespace?: string | undefined;
|
|
88
91
|
}, {
|
|
89
92
|
baseUrl: string;
|
|
@@ -91,8 +94,11 @@ declare const plugin: {
|
|
|
91
94
|
autoCapture: boolean;
|
|
92
95
|
recallLimit: number;
|
|
93
96
|
recallTimeoutMs: number;
|
|
97
|
+
toolTimeoutMs: number;
|
|
94
98
|
fileSync: boolean;
|
|
95
99
|
transcriptSync: boolean;
|
|
100
|
+
captureMaxPayloadBytes: number;
|
|
101
|
+
auditLog: boolean;
|
|
96
102
|
namespace: string;
|
|
97
103
|
userId?: string | undefined;
|
|
98
104
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin/index.js
CHANGED
|
@@ -11,6 +11,7 @@ import { LatencyMetrics } from "../internal/metrics/latency-metrics.js";
|
|
|
11
11
|
import { loadOrCreateUserId } from "../internal/identity/user-id.js";
|
|
12
12
|
import { BAKED_API_KEY } from "../internal/identity/api-key.js";
|
|
13
13
|
import { formatMemories } from "../features/recall/formatter.js";
|
|
14
|
+
import { AuditLogger } from "../internal/audit/audit-logger.js";
|
|
14
15
|
export function deriveTier(totalSessions) {
|
|
15
16
|
if (totalSessions >= 30)
|
|
16
17
|
return 3;
|
|
@@ -69,12 +70,12 @@ async function bootstrapClient(client, logger, knowledgeState, userId) {
|
|
|
69
70
|
* falling back to the legacy api.on() for older OpenClaw runtimes.
|
|
70
71
|
*/
|
|
71
72
|
function registerHookCompat(api, hookName, handler, metadata) {
|
|
72
|
-
if (api.
|
|
73
|
-
api.registerHook(hookName, handler, metadata);
|
|
74
|
-
}
|
|
75
|
-
else if (api.on) {
|
|
73
|
+
if (api.on) {
|
|
76
74
|
api.on(hookName, handler);
|
|
77
75
|
}
|
|
76
|
+
else if (api.registerHook) {
|
|
77
|
+
api.registerHook(hookName, handler, metadata);
|
|
78
|
+
}
|
|
78
79
|
else {
|
|
79
80
|
api.logger.warn(`Cortex: cannot register hook "${hookName}" — no registerHook or on method available`);
|
|
80
81
|
}
|
|
@@ -104,11 +105,24 @@ const plugin = {
|
|
|
104
105
|
maturity: "unknown",
|
|
105
106
|
lastChecked: 0,
|
|
106
107
|
};
|
|
108
|
+
// Session ID for this plugin lifecycle — groups tool-saved memories into
|
|
109
|
+
// a single Cortex SESSION node so total_sessions increments properly.
|
|
110
|
+
const sessionId = randomUUID();
|
|
107
111
|
// Whether the user explicitly set a namespace vs. relying on default
|
|
108
112
|
const userSetNamespace = raw.namespace != null;
|
|
109
113
|
let namespace = config.namespace;
|
|
110
114
|
let started = false;
|
|
111
115
|
let watcher = null;
|
|
116
|
+
// Audit logger is created lazily in start(ctx) when workspaceDir is available,
|
|
117
|
+
// or on-demand via the /audit command. The proxy always exists so handlers can
|
|
118
|
+
// start logging without a restart when toggled on at runtime.
|
|
119
|
+
let auditLoggerInner;
|
|
120
|
+
let workspaceDirResolved;
|
|
121
|
+
const auditLoggerProxy = {
|
|
122
|
+
log(entry) {
|
|
123
|
+
return auditLoggerInner?.log(entry) ?? Promise.resolve();
|
|
124
|
+
},
|
|
125
|
+
};
|
|
112
126
|
// userId: use explicit config value if provided, otherwise load/create a
|
|
113
127
|
// stable UUID persisted at ~/.openclaw/cortex-user-id. Bootstrap is chained
|
|
114
128
|
// off the same promise so it always runs with a resolved userId. The capture
|
|
@@ -130,16 +144,30 @@ const plugin = {
|
|
|
130
144
|
api.logger.info(`Cortex user ID (from config): ${userId}`);
|
|
131
145
|
}
|
|
132
146
|
api.logger.info(`Cortex plugin registered (namespace=${namespace})`);
|
|
147
|
+
// First-run data disclosure — log what features are active so users know
|
|
148
|
+
// what data will be sent to the Cortex API.
|
|
149
|
+
const activeFeatures = [];
|
|
150
|
+
if (config.autoRecall)
|
|
151
|
+
activeFeatures.push("auto-recall (sends prompts)");
|
|
152
|
+
if (config.autoCapture)
|
|
153
|
+
activeFeatures.push("auto-capture (sends conversation transcripts)");
|
|
154
|
+
if (config.fileSync)
|
|
155
|
+
activeFeatures.push("file-sync (sends MEMORY.md and daily log changes)");
|
|
156
|
+
if (config.transcriptSync)
|
|
157
|
+
activeFeatures.push("transcript-sync (sends session transcripts)");
|
|
158
|
+
if (activeFeatures.length > 0) {
|
|
159
|
+
api.logger.info(`Cortex data features active: ${activeFeatures.join(", ")}. All data sent over HTTPS to ${config.baseUrl}. See README for details.`);
|
|
160
|
+
}
|
|
133
161
|
// Async health check + knowledge probe — chained after userId resolves
|
|
134
162
|
void userIdReady.then(() => bootstrapClient(client, api.logger, knowledgeState, userId));
|
|
135
163
|
// --- Hooks ---
|
|
136
164
|
// Auto-Recall: inject relevant memories before every agent turn
|
|
137
|
-
registerHookCompat(api, "before_agent_start", createRecallHandler(client, config, api.logger, recallMetrics, knowledgeState, () => userId), {
|
|
165
|
+
registerHookCompat(api, "before_agent_start", createRecallHandler(client, config, api.logger, recallMetrics, knowledgeState, () => userId, auditLoggerProxy), {
|
|
138
166
|
name: "openclaw-cortex.recall",
|
|
139
167
|
description: "Inject relevant Cortex memories before agent turn",
|
|
140
168
|
});
|
|
141
169
|
// Auto-Capture: extract facts after agent responses
|
|
142
|
-
registerHookCompat(api, "agent_end", createCaptureHandler(client, config, api.logger, retryQueue, knowledgeState, () => userId, userIdReady), {
|
|
170
|
+
registerHookCompat(api, "agent_end", createCaptureHandler(client, config, api.logger, retryQueue, knowledgeState, () => userId, userIdReady, sessionId, auditLoggerProxy), {
|
|
143
171
|
name: "openclaw-cortex.capture",
|
|
144
172
|
description: "Extract and store facts from conversation after agent turn",
|
|
145
173
|
});
|
|
@@ -169,8 +197,15 @@ const plugin = {
|
|
|
169
197
|
api.logger.info(`Cortex tool: cortex_search_memory called (query="${query.slice(0, 80)}", limit=${limit})`);
|
|
170
198
|
if (userIdReady)
|
|
171
199
|
await userIdReady;
|
|
200
|
+
void auditLoggerProxy.log({
|
|
201
|
+
feature: "tool-search-memory",
|
|
202
|
+
method: "POST",
|
|
203
|
+
endpoint: "/v1/recall",
|
|
204
|
+
payload: query,
|
|
205
|
+
userId,
|
|
206
|
+
});
|
|
172
207
|
try {
|
|
173
|
-
const response = await client.recall(query, config.
|
|
208
|
+
const response = await client.recall(query, config.toolTimeoutMs, {
|
|
174
209
|
limit,
|
|
175
210
|
userId: userId,
|
|
176
211
|
queryType: "combined",
|
|
@@ -210,16 +245,37 @@ const plugin = {
|
|
|
210
245
|
api.logger.info(`Cortex tool: cortex_save_memory called (text="${text.slice(0, 80)}")`);
|
|
211
246
|
if (userIdReady)
|
|
212
247
|
await userIdReady;
|
|
248
|
+
void auditLoggerProxy.log({
|
|
249
|
+
feature: "tool-save-memory",
|
|
250
|
+
method: "POST",
|
|
251
|
+
endpoint: "/v1/remember",
|
|
252
|
+
payload: text,
|
|
253
|
+
sessionId,
|
|
254
|
+
userId,
|
|
255
|
+
});
|
|
213
256
|
try {
|
|
214
|
-
const res = await client.remember(text,
|
|
257
|
+
const res = await client.remember(text, sessionId, undefined, new Date().toISOString(), userId);
|
|
215
258
|
if (knowledgeState && res.memories_created > 0) {
|
|
216
259
|
knowledgeState.hasMemories = true;
|
|
217
260
|
}
|
|
218
261
|
api.logger.info(`Cortex tool: cortex_save_memory created ${res.memories_created} memories, entities: ${res.entities_found.join(", ") || "none"}`);
|
|
262
|
+
const parts = [`Saved ${res.memories_created} memory/memories.`];
|
|
263
|
+
if (res.entities_found.length)
|
|
264
|
+
parts.push(`Entities: ${res.entities_found.join(", ")}.`);
|
|
265
|
+
if (res.facts.length)
|
|
266
|
+
parts.push(`Facts: ${res.facts.join("; ")}.`);
|
|
267
|
+
if (res.emotions.length)
|
|
268
|
+
parts.push(`Emotions: ${res.emotions.join(", ")}.`);
|
|
269
|
+
if (res.values.length)
|
|
270
|
+
parts.push(`Values: ${res.values.join(", ")}.`);
|
|
271
|
+
if (res.beliefs.length)
|
|
272
|
+
parts.push(`Beliefs: ${res.beliefs.join("; ")}.`);
|
|
273
|
+
if (res.insights.length)
|
|
274
|
+
parts.push(`Insights: ${res.insights.join("; ")}.`);
|
|
219
275
|
return {
|
|
220
276
|
content: [{
|
|
221
277
|
type: "text",
|
|
222
|
-
text:
|
|
278
|
+
text: parts.join(" "),
|
|
223
279
|
}],
|
|
224
280
|
};
|
|
225
281
|
}
|
|
@@ -263,8 +319,15 @@ const plugin = {
|
|
|
263
319
|
}
|
|
264
320
|
}
|
|
265
321
|
// With args — search memories
|
|
322
|
+
void auditLoggerProxy.log({
|
|
323
|
+
feature: "command-memories",
|
|
324
|
+
method: "POST",
|
|
325
|
+
endpoint: "/v1/recall",
|
|
326
|
+
payload: query,
|
|
327
|
+
userId,
|
|
328
|
+
});
|
|
266
329
|
try {
|
|
267
|
-
const response = await client.recall(query, config.
|
|
330
|
+
const response = await client.recall(query, config.toolTimeoutMs, {
|
|
268
331
|
limit: config.recallLimit,
|
|
269
332
|
userId,
|
|
270
333
|
queryType: "combined",
|
|
@@ -280,7 +343,46 @@ const plugin = {
|
|
|
280
343
|
}
|
|
281
344
|
},
|
|
282
345
|
});
|
|
283
|
-
api.
|
|
346
|
+
api.registerCommand({
|
|
347
|
+
name: "audit",
|
|
348
|
+
description: "Toggle or check Cortex audit log (records all data sent to Cortex)",
|
|
349
|
+
acceptsArgs: true,
|
|
350
|
+
handler: (ctx) => {
|
|
351
|
+
const arg = ctx.args?.trim().toLowerCase();
|
|
352
|
+
if (arg === "on") {
|
|
353
|
+
if (!workspaceDirResolved) {
|
|
354
|
+
return { text: "Cannot enable audit log — no workspace directory available." };
|
|
355
|
+
}
|
|
356
|
+
if (auditLoggerInner) {
|
|
357
|
+
return { text: `Audit log is already on.\nLog path: ${workspaceDirResolved}/.cortex/audit/` };
|
|
358
|
+
}
|
|
359
|
+
auditLoggerInner = new AuditLogger(workspaceDirResolved, api.logger);
|
|
360
|
+
api.logger.info(`Cortex audit log enabled via command: ${workspaceDirResolved}/.cortex/audit/`);
|
|
361
|
+
return { text: `Audit log enabled.\nLog path: ${workspaceDirResolved}/.cortex/audit/` };
|
|
362
|
+
}
|
|
363
|
+
if (arg === "off") {
|
|
364
|
+
if (!auditLoggerInner) {
|
|
365
|
+
return { text: "Audit log is already off." };
|
|
366
|
+
}
|
|
367
|
+
auditLoggerInner = undefined;
|
|
368
|
+
api.logger.info("Cortex audit log disabled via command");
|
|
369
|
+
return { text: "Audit log disabled. Existing log files are preserved." };
|
|
370
|
+
}
|
|
371
|
+
// No args — show status
|
|
372
|
+
const status = auditLoggerInner ? "on" : "off";
|
|
373
|
+
const lines = [
|
|
374
|
+
`**Cortex Audit Log**`,
|
|
375
|
+
`- Status: ${status}`,
|
|
376
|
+
`- Config default: ${config.auditLog ? "on" : "off"}`,
|
|
377
|
+
];
|
|
378
|
+
if (workspaceDirResolved) {
|
|
379
|
+
lines.push(`- Log path: ${workspaceDirResolved}/.cortex/audit/`);
|
|
380
|
+
}
|
|
381
|
+
lines.push("", "Usage: `/audit on` · `/audit off`");
|
|
382
|
+
return { text: lines.join("\n") };
|
|
383
|
+
},
|
|
384
|
+
});
|
|
385
|
+
api.logger.info("Cortex commands registered: /memories, /audit");
|
|
284
386
|
}
|
|
285
387
|
// --- Gateway RPC ---
|
|
286
388
|
if (api.registerGatewayMethod) {
|
|
@@ -319,6 +421,13 @@ const plugin = {
|
|
|
319
421
|
}
|
|
320
422
|
started = true;
|
|
321
423
|
retryQueue.start();
|
|
424
|
+
// Capture workspaceDir for runtime audit toggle via /audit command
|
|
425
|
+
workspaceDirResolved = ctx.workspaceDir;
|
|
426
|
+
// Initialize audit logger if enabled via config
|
|
427
|
+
if (config.auditLog && ctx.workspaceDir) {
|
|
428
|
+
auditLoggerInner = new AuditLogger(ctx.workspaceDir, api.logger);
|
|
429
|
+
api.logger.info(`Cortex audit log enabled: ${ctx.workspaceDir}/.cortex/audit/`);
|
|
430
|
+
}
|
|
322
431
|
// Derive workspace-scoped namespace when user didn't set one explicitly
|
|
323
432
|
if (!userSetNamespace && ctx.workspaceDir) {
|
|
324
433
|
namespace = deriveNamespace(ctx.workspaceDir);
|
|
@@ -331,7 +440,7 @@ const plugin = {
|
|
|
331
440
|
api.logger.warn("Cortex file sync: no workspaceDir, skipping");
|
|
332
441
|
}
|
|
333
442
|
else {
|
|
334
|
-
const newWatcher = new FileSyncWatcher(workspaceDir, client, namespace, api.logger, retryQueue, { transcripts: config.transcriptSync }, () => userId);
|
|
443
|
+
const newWatcher = new FileSyncWatcher(workspaceDir, client, namespace, api.logger, retryQueue, { transcripts: config.transcriptSync }, () => userId, auditLoggerProxy);
|
|
335
444
|
newWatcher.start();
|
|
336
445
|
watcher = newWatcher;
|
|
337
446
|
api.logger.info("Cortex file sync started");
|