@kanson1996/audit-trail 0.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.
@@ -0,0 +1,92 @@
1
+ /**
2
+ * @openclaw/audit-trail — OpenClaw Plugin
3
+ *
4
+ * Tamper-evident audit trail for AI Agent lifecycle events.
5
+ *
6
+ * Registers lifecycle hooks that map OpenClaw events → AuditEvents
7
+ * stored in a hash-chained JSONL log. Provides CLI commands for
8
+ * verification, trail reconstruction, and compliance reporting.
9
+ *
10
+ * Plugin config (in openclaw.json):
11
+ * {
12
+ * "plugins": [{
13
+ * "path": "@openclaw/audit-trail",
14
+ * "config": {
15
+ * "logDir": "~/.openclaw/audit-trail",
16
+ * "captureMode": "metadata_only"
17
+ * }
18
+ * }]
19
+ * }
20
+ */
21
+ type PluginApi = {
22
+ id: string;
23
+ pluginConfig?: Record<string, unknown>;
24
+ logger: {
25
+ info: (msg: string) => void;
26
+ warn: (msg: string) => void;
27
+ error: (msg: string) => void;
28
+ };
29
+ on: (hookName: string, handler: (...args: unknown[]) => unknown) => void;
30
+ registerCli: (registrar: (ctx: {
31
+ program: import("commander").Command;
32
+ }) => void, opts?: {
33
+ commands?: string[];
34
+ }) => void;
35
+ registerService: (service: {
36
+ id: string;
37
+ start: () => void;
38
+ stop?: () => void;
39
+ }) => void;
40
+ resolvePath: (p: string) => string;
41
+ };
42
+ declare const plugin: {
43
+ id: string;
44
+ name: string;
45
+ description: string;
46
+ version: string;
47
+ configSchema: {
48
+ parse(value: unknown): import("agent-audit-trail").AuditTrailConfig;
49
+ uiHints: {
50
+ logDir: {
51
+ label: string;
52
+ placeholder: string;
53
+ help: string;
54
+ advanced: boolean;
55
+ };
56
+ captureMode: {
57
+ label: string;
58
+ help: string;
59
+ placeholder: string;
60
+ };
61
+ "rotation.strategy": {
62
+ label: string;
63
+ help: string;
64
+ placeholder: string;
65
+ };
66
+ "rotation.maxSizeBytes": {
67
+ label: string;
68
+ help: string;
69
+ advanced: boolean;
70
+ placeholder: string;
71
+ };
72
+ "redaction.mode": {
73
+ label: string;
74
+ help: string;
75
+ placeholder: string;
76
+ };
77
+ "redaction.fields": {
78
+ label: string;
79
+ help: string;
80
+ advanced: boolean;
81
+ };
82
+ captureBeforeToolCall: {
83
+ label: string;
84
+ help: string;
85
+ advanced: boolean;
86
+ };
87
+ };
88
+ };
89
+ register(api: PluginApi): void;
90
+ };
91
+ export default plugin;
92
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAQH,KAAK,SAAS,GAAG;IACf,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IACnG,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,KAAK,IAAI,CAAC;IACzE,WAAW,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,OAAO,WAAW,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1H,eAAe,EAAE,CAAC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;IACzF,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC,CAAC;AAEF,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAOI,SAAS;CAiCxB,CAAC;AAEF,eAAe,MAAM,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,59 @@
1
+ /**
2
+ * @openclaw/audit-trail — OpenClaw Plugin
3
+ *
4
+ * Tamper-evident audit trail for AI Agent lifecycle events.
5
+ *
6
+ * Registers lifecycle hooks that map OpenClaw events → AuditEvents
7
+ * stored in a hash-chained JSONL log. Provides CLI commands for
8
+ * verification, trail reconstruction, and compliance reporting.
9
+ *
10
+ * Plugin config (in openclaw.json):
11
+ * {
12
+ * "plugins": [{
13
+ * "path": "@openclaw/audit-trail",
14
+ * "config": {
15
+ * "logDir": "~/.openclaw/audit-trail",
16
+ * "captureMode": "metadata_only"
17
+ * }
18
+ * }]
19
+ * }
20
+ */
21
+ import { AuditWriter } from "agent-audit-trail";
22
+ import { auditTrailConfigSchema } from "./src/config.js";
23
+ import { registerHooks } from "./src/hooks.js";
24
+ import { registerAuditCli } from "./src/cli.js";
25
+ const plugin = {
26
+ id: "audit-trail",
27
+ name: "Audit Trail",
28
+ description: "Tamper-evident audit trail for AI Agent lifecycle events",
29
+ version: "0.1.0",
30
+ configSchema: auditTrailConfigSchema,
31
+ register(api) {
32
+ // Parse and resolve config
33
+ const rawConfig = auditTrailConfigSchema.parse(api.pluginConfig ?? {});
34
+ const config = {
35
+ ...rawConfig,
36
+ logDir: api.resolvePath(rawConfig.logDir),
37
+ };
38
+ const writer = new AuditWriter({ config });
39
+ // Register lifecycle hooks
40
+ registerHooks(api, writer, config);
41
+ // Register CLI commands
42
+ api.registerCli(({ program }) => {
43
+ registerAuditCli(program, config);
44
+ }, { commands: ["audit"] });
45
+ // Register service for clean shutdown
46
+ api.registerService({
47
+ id: "audit-trail",
48
+ start: () => {
49
+ api.logger.info(`audit-trail: started (logDir=${config.logDir}, mode=${config.captureMode})`);
50
+ },
51
+ stop: async () => {
52
+ await writer.flush();
53
+ api.logger.info("audit-trail: flushed and stopped");
54
+ },
55
+ });
56
+ },
57
+ };
58
+ export default plugin;
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAkB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAahD,MAAM,MAAM,GAAG;IACb,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,0DAA0D;IACvE,OAAO,EAAE,OAAO;IAChB,YAAY,EAAE,sBAAsB;IAEpC,QAAQ,CAAC,GAAc;QACrB,2BAA2B;QAC3B,MAAM,SAAS,GAAG,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG;YACb,GAAG,SAAS;YACZ,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC;SAC1C,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAE3C,2BAA2B;QAC3B,aAAa,CAAC,GAA0C,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAE1E,wBAAwB;QACxB,GAAG,CAAC,WAAW,CACb,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YACd,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC,EACD,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CACxB,CAAC;QAEF,sCAAsC;QACtC,GAAG,CAAC,eAAe,CAAC;YAClB,EAAE,EAAE,aAAa;YACjB,KAAK,EAAE,GAAG,EAAE;gBACV,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,MAAM,UAAU,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;YAChG,CAAC;YACD,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;gBACrB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACtD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * CLI commands for audit-trail: verify, trail, report, search.
3
+ *
4
+ * Registered via api.registerCli under the "audit" subcommand.
5
+ * Usage: openclaw audit <subcommand> [options]
6
+ */
7
+ import type { Command } from "commander";
8
+ import type { AuditTrailConfig } from "agent-audit-trail";
9
+ export declare function registerAuditCli(program: Command, config: AuditTrailConfig): void;
10
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAyJjF"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * CLI commands for audit-trail: verify, trail, report, search.
3
+ *
4
+ * Registered via api.registerCli under the "audit" subcommand.
5
+ * Usage: openclaw audit <subcommand> [options]
6
+ */
7
+ import { verifyDirectory, readTrail, searchEvents, generateReport, formatReportText, } from "agent-audit-trail";
8
+ export function registerAuditCli(program, config) {
9
+ const audit = program.command("audit").description("Audit trail commands");
10
+ // ---------------------------------------------------------------------------
11
+ // verify
12
+ // ---------------------------------------------------------------------------
13
+ audit
14
+ .command("verify")
15
+ .description("Verify hash chain integrity of all audit log files")
16
+ .option("--dir <logDir>", "Log directory", config.logDir)
17
+ .option("--from <date>", "Start date (YYYY-MM-DD)")
18
+ .option("--to <date>", "End date (YYYY-MM-DD)")
19
+ .option("--json", "Output as JSON")
20
+ .action(async (opts) => {
21
+ const report = await verifyDirectory(opts.dir, { from: opts.from, to: opts.to });
22
+ if (opts.json) {
23
+ process.stdout.write(JSON.stringify(report, null, 2) + "\n");
24
+ }
25
+ else {
26
+ for (const result of report.results) {
27
+ const icon = result.valid ? "✓" : "✗";
28
+ const detail = result.valid
29
+ ? `${result.totalEvents} events`
30
+ : `TAMPERED at seq=${result.tamperedAtSeq ?? "?"} — ${result.error ?? ""}`;
31
+ process.stdout.write(`${icon} ${result.filePath} — ${detail}\n`);
32
+ }
33
+ process.stdout.write(`\n${report.validFiles}/${report.checkedFiles} files valid` +
34
+ (report.tamperedFiles > 0 ? ` (${report.tamperedFiles} tampered!)` : "") +
35
+ "\n");
36
+ }
37
+ process.exit(report.tamperedFiles > 0 ? 1 : 0);
38
+ });
39
+ // ---------------------------------------------------------------------------
40
+ // trail
41
+ // ---------------------------------------------------------------------------
42
+ audit
43
+ .command("trail")
44
+ .description("Show the full decision chain for an agent run or session")
45
+ .option("--run <runId>", "Run ID")
46
+ .option("--session <sessionId>", "Session ID")
47
+ .option("--agent <agentId>", "Agent ID")
48
+ .option("--dir <logDir>", "Log directory", config.logDir)
49
+ .option("--json", "Output as JSON")
50
+ .action(async (opts) => {
51
+ if (!opts.run && !opts.session && !opts.agent) {
52
+ process.stderr.write("Error: at least one of --run, --session, or --agent is required\n");
53
+ process.exit(1);
54
+ }
55
+ const events = await readTrail(opts.dir, {
56
+ runId: opts.run,
57
+ sessionId: opts.session,
58
+ agentId: opts.agent,
59
+ });
60
+ if (opts.json) {
61
+ process.stdout.write(JSON.stringify(events, null, 2) + "\n");
62
+ return;
63
+ }
64
+ if (events.length === 0) {
65
+ process.stdout.write("No events found.\n");
66
+ return;
67
+ }
68
+ process.stdout.write(`Found ${events.length} events:\n\n`);
69
+ for (const ev of events) {
70
+ const ts = ev.timestamp.replace("T", " ").replace("Z", "");
71
+ const runTag = ev.runId ? ` run=${ev.runId}` : "";
72
+ const toolTag = "toolName" in ev.payload
73
+ ? ` tool=${ev.payload["toolName"]}`
74
+ : "";
75
+ process.stdout.write(`[${ts}]${runTag} ${ev.type}${toolTag}\n`);
76
+ }
77
+ });
78
+ // ---------------------------------------------------------------------------
79
+ // report
80
+ // ---------------------------------------------------------------------------
81
+ audit
82
+ .command("report")
83
+ .description("Generate a compliance summary report")
84
+ .option("--dir <logDir>", "Log directory", config.logDir)
85
+ .option("--from <date>", "Start date (YYYY-MM-DD)")
86
+ .option("--to <date>", "End date (YYYY-MM-DD)")
87
+ .option("--format <format>", "Output format: text | json | csv", "text")
88
+ .action(async (opts) => {
89
+ const report = await generateReport({
90
+ logDir: opts.dir,
91
+ from: opts.from,
92
+ to: opts.to,
93
+ });
94
+ if (opts.format === "json") {
95
+ process.stdout.write(JSON.stringify(report, null, 2) + "\n");
96
+ }
97
+ else if (opts.format === "csv") {
98
+ // Simple CSV output
99
+ process.stdout.write("type,count\n");
100
+ for (const [type, count] of Object.entries(report.eventsByType)) {
101
+ process.stdout.write(`${type},${count}\n`);
102
+ }
103
+ }
104
+ else {
105
+ process.stdout.write(formatReportText(report) + "\n");
106
+ }
107
+ });
108
+ // ---------------------------------------------------------------------------
109
+ // search
110
+ // ---------------------------------------------------------------------------
111
+ audit
112
+ .command("search")
113
+ .description("Stream-search audit events")
114
+ .option("--dir <logDir>", "Log directory", config.logDir)
115
+ .option("--type <type>", "Event type filter")
116
+ .option("--tool <name>", "Tool name filter")
117
+ .option("--from <ts>", "Start timestamp (ISO)")
118
+ .option("--to <ts>", "End timestamp (ISO)")
119
+ .action(async (opts) => {
120
+ let count = 0;
121
+ await searchEvents(opts.dir, {
122
+ type: opts.type,
123
+ toolName: opts.tool,
124
+ from: opts.from,
125
+ to: opts.to,
126
+ }, (ev) => {
127
+ process.stdout.write(JSON.stringify(ev) + "\n");
128
+ count++;
129
+ });
130
+ if (count === 0) {
131
+ process.stderr.write("No matching events.\n");
132
+ }
133
+ });
134
+ }
135
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.d.ts","sourceRoot":"","sources":["../../src/cli.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,169 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ import { Command } from "commander";
6
+ import { AuditWriter } from "agent-audit-trail";
7
+ import { registerAuditCli } from "./cli.js";
8
+ let tmpDir;
9
+ beforeEach(async () => {
10
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "cli-test-"));
11
+ });
12
+ afterEach(async () => {
13
+ await fs.rm(tmpDir, { recursive: true, force: true });
14
+ });
15
+ function makeConfig() {
16
+ return {
17
+ logDir: tmpDir,
18
+ captureMode: "metadata_only",
19
+ rotation: { strategy: "daily" },
20
+ redaction: { mode: "hash", fields: [] },
21
+ captureBeforeToolCall: false,
22
+ };
23
+ }
24
+ async function writeTestEvents(count = 3) {
25
+ const writer = new AuditWriter({ config: makeConfig() });
26
+ for (let i = 0; i < count; i++) {
27
+ writer.append({
28
+ type: "session_start",
29
+ timestamp: `2026-03-13T00:00:0${i}.000Z`,
30
+ runId: `run-${i}`,
31
+ payload: { sessionId: `s-${i}` },
32
+ });
33
+ }
34
+ await writer.flush();
35
+ }
36
+ async function runCommand(args) {
37
+ const program = new Command();
38
+ program.exitOverride();
39
+ const stdoutChunks = [];
40
+ const stderrChunks = [];
41
+ let exitCode = 0;
42
+ const origStdoutWrite = process.stdout.write.bind(process.stdout);
43
+ const origStderrWrite = process.stderr.write.bind(process.stderr);
44
+ const origExit = process.exit.bind(process);
45
+ process.stdout.write = (chunk) => { stdoutChunks.push(chunk); return true; };
46
+ process.stderr.write = (chunk) => { stderrChunks.push(chunk); return true; };
47
+ process.exit = (code) => { exitCode = code ?? 0; throw new Error(`EXIT:${code}`); };
48
+ try {
49
+ registerAuditCli(program, makeConfig());
50
+ await program.parseAsync(["node", "audit", ...args]);
51
+ }
52
+ catch (err) {
53
+ const msg = String(err);
54
+ if (!msg.startsWith("Error: EXIT:")) {
55
+ // Re-throw real errors
56
+ }
57
+ }
58
+ finally {
59
+ process.stdout.write = origStdoutWrite;
60
+ process.stderr.write = origStderrWrite;
61
+ process.exit = origExit;
62
+ }
63
+ return {
64
+ stdout: stdoutChunks.join(""),
65
+ stderr: stderrChunks.join(""),
66
+ exitCode,
67
+ };
68
+ }
69
+ describe("audit verify", () => {
70
+ it("exits 0 when all files are valid", async () => {
71
+ await writeTestEvents();
72
+ const { exitCode, stdout } = await runCommand(["audit", "verify", "--dir", tmpDir]);
73
+ expect(exitCode).toBe(0);
74
+ expect(stdout).toContain("✓");
75
+ });
76
+ it("exits 1 when a file is tampered", async () => {
77
+ await writeTestEvents(3);
78
+ // Find and tamper the file
79
+ const files = [];
80
+ async function find(d) {
81
+ const entries = await fs.readdir(d, { withFileTypes: true });
82
+ for (const e of entries) {
83
+ const fp = path.join(d, e.name);
84
+ if (e.isDirectory())
85
+ await find(fp);
86
+ else if (e.name.endsWith(".jsonl") && e.name !== "index.jsonl")
87
+ files.push(fp);
88
+ }
89
+ }
90
+ await find(tmpDir);
91
+ const content = await fs.readFile(files[0], "utf8");
92
+ const lines = content.trimEnd().split("\n");
93
+ const ev = JSON.parse(lines[1]);
94
+ lines[1] = JSON.stringify({ ...ev, payload: { sessionId: "HACKED" } });
95
+ await fs.writeFile(files[0], lines.join("\n") + "\n");
96
+ const { exitCode } = await runCommand(["audit", "verify", "--dir", tmpDir]);
97
+ expect(exitCode).toBe(1);
98
+ });
99
+ it("outputs JSON when --json flag is set", async () => {
100
+ await writeTestEvents();
101
+ const { stdout } = await runCommand(["audit", "verify", "--dir", tmpDir, "--json"]);
102
+ const parsed = JSON.parse(stdout);
103
+ expect(parsed).toHaveProperty("checkedFiles");
104
+ expect(parsed).toHaveProperty("results");
105
+ });
106
+ });
107
+ describe("audit trail", () => {
108
+ it("finds events by runId", async () => {
109
+ await writeTestEvents(3);
110
+ const { stdout } = await runCommand(["audit", "trail", "--run", "run-1", "--dir", tmpDir]);
111
+ expect(stdout).toContain("session_start");
112
+ expect(stdout).toContain("run=run-1");
113
+ });
114
+ it("shows error when no filter given", async () => {
115
+ const { stderr, exitCode } = await runCommand(["audit", "trail", "--dir", tmpDir]);
116
+ expect(exitCode).toBe(1);
117
+ expect(stderr).toContain("at least one");
118
+ });
119
+ it("outputs JSON when --json flag is set", async () => {
120
+ await writeTestEvents(2);
121
+ const { stdout } = await runCommand(["audit", "trail", "--run", "run-0", "--json", "--dir", tmpDir]);
122
+ const parsed = JSON.parse(stdout);
123
+ expect(Array.isArray(parsed)).toBe(true);
124
+ });
125
+ it("shows 'No events found' when nothing matches", async () => {
126
+ await writeTestEvents(1);
127
+ const { stdout } = await runCommand(["audit", "trail", "--run", "nonexistent", "--dir", tmpDir]);
128
+ expect(stdout).toContain("No events found");
129
+ });
130
+ });
131
+ describe("audit report", () => {
132
+ it("generates text report", async () => {
133
+ await writeTestEvents(3);
134
+ const { stdout } = await runCommand(["audit", "report", "--dir", tmpDir]);
135
+ expect(stdout).toContain("Compliance Report");
136
+ expect(stdout).toContain("Sessions:");
137
+ });
138
+ it("generates JSON report with --format json", async () => {
139
+ await writeTestEvents(3);
140
+ const { stdout } = await runCommand(["audit", "report", "--format", "json", "--dir", tmpDir]);
141
+ const parsed = JSON.parse(stdout);
142
+ expect(parsed).toHaveProperty("totalEvents");
143
+ expect(parsed).toHaveProperty("integrity");
144
+ });
145
+ it("generates CSV report with --format csv", async () => {
146
+ await writeTestEvents(3);
147
+ const { stdout } = await runCommand(["audit", "report", "--format", "csv", "--dir", tmpDir]);
148
+ expect(stdout).toContain("type,count");
149
+ expect(stdout).toContain("session_start");
150
+ });
151
+ });
152
+ describe("audit search", () => {
153
+ it("streams matching events as JSON lines", async () => {
154
+ await writeTestEvents(3);
155
+ const { stdout } = await runCommand(["audit", "search", "--type", "session_start", "--dir", tmpDir]);
156
+ const lines = stdout.trimEnd().split("\n").filter(Boolean);
157
+ expect(lines.length).toBeGreaterThan(0);
158
+ for (const line of lines) {
159
+ const ev = JSON.parse(line);
160
+ expect(ev["type"]).toBe("session_start");
161
+ }
162
+ });
163
+ it("writes to stderr when no events match", async () => {
164
+ await writeTestEvents(1);
165
+ const { stderr } = await runCommand(["audit", "search", "--type", "agent_end", "--dir", tmpDir]);
166
+ expect(stderr).toContain("No matching events");
167
+ });
168
+ });
169
+ //# sourceMappingURL=cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../src/cli.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * OpenClaw plugin configuration schema for audit-trail.
3
+ *
4
+ * Follows the same pattern as memory-lancedb's configSchema:
5
+ * a plain object with parse() and uiHints.
6
+ */
7
+ import type { AuditTrailConfig } from "agent-audit-trail";
8
+ export declare const DEFAULT_CONFIG: AuditTrailConfig;
9
+ export declare const auditTrailConfigSchema: {
10
+ parse(value: unknown): AuditTrailConfig;
11
+ uiHints: {
12
+ logDir: {
13
+ label: string;
14
+ placeholder: string;
15
+ help: string;
16
+ advanced: boolean;
17
+ };
18
+ captureMode: {
19
+ label: string;
20
+ help: string;
21
+ placeholder: string;
22
+ };
23
+ "rotation.strategy": {
24
+ label: string;
25
+ help: string;
26
+ placeholder: string;
27
+ };
28
+ "rotation.maxSizeBytes": {
29
+ label: string;
30
+ help: string;
31
+ advanced: boolean;
32
+ placeholder: string;
33
+ };
34
+ "redaction.mode": {
35
+ label: string;
36
+ help: string;
37
+ placeholder: string;
38
+ };
39
+ "redaction.fields": {
40
+ label: string;
41
+ help: string;
42
+ advanced: boolean;
43
+ };
44
+ captureBeforeToolCall: {
45
+ label: string;
46
+ help: string;
47
+ advanced: boolean;
48
+ };
49
+ };
50
+ };
51
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D,eAAO,MAAM,cAAc,EAAE,gBAM5B,CAAC;AASF,eAAO,MAAM,sBAAsB;iBACpB,OAAO,GAAG,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoGxC,CAAC"}