openclaw-observability 1.0.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/dist/config.d.ts +60 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +140 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1114 -0
- package/dist/index.js.map +1 -0
- package/dist/redaction.d.ts +20 -0
- package/dist/redaction.d.ts.map +1 -0
- package/dist/redaction.js +93 -0
- package/dist/redaction.js.map +1 -0
- package/dist/security/chain-detector.d.ts +37 -0
- package/dist/security/chain-detector.d.ts.map +1 -0
- package/dist/security/chain-detector.js +187 -0
- package/dist/security/chain-detector.js.map +1 -0
- package/dist/security/rules.d.ts +22 -0
- package/dist/security/rules.d.ts.map +1 -0
- package/dist/security/rules.js +479 -0
- package/dist/security/rules.js.map +1 -0
- package/dist/security/scanner.d.ts +47 -0
- package/dist/security/scanner.d.ts.map +1 -0
- package/dist/security/scanner.js +150 -0
- package/dist/security/scanner.js.map +1 -0
- package/dist/security/types.d.ts +47 -0
- package/dist/security/types.d.ts.map +1 -0
- package/dist/security/types.js +23 -0
- package/dist/security/types.js.map +1 -0
- package/dist/storage/buffer.d.ts +64 -0
- package/dist/storage/buffer.d.ts.map +1 -0
- package/dist/storage/buffer.js +120 -0
- package/dist/storage/buffer.js.map +1 -0
- package/dist/storage/duckdb-local-writer.d.ts +26 -0
- package/dist/storage/duckdb-local-writer.d.ts.map +1 -0
- package/dist/storage/duckdb-local-writer.js +454 -0
- package/dist/storage/duckdb-local-writer.js.map +1 -0
- package/dist/storage/mysql-writer.d.ts +55 -0
- package/dist/storage/mysql-writer.d.ts.map +1 -0
- package/dist/storage/mysql-writer.js +287 -0
- package/dist/storage/mysql-writer.js.map +1 -0
- package/dist/storage/schema.d.ts +13 -0
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/schema.js +94 -0
- package/dist/storage/schema.js.map +1 -0
- package/dist/storage/writer.d.ts +31 -0
- package/dist/storage/writer.d.ts.map +1 -0
- package/dist/storage/writer.js +7 -0
- package/dist/storage/writer.js.map +1 -0
- package/dist/types.d.ts +72 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +44 -0
- package/dist/types.js.map +1 -0
- package/dist/web/api.d.ts +115 -0
- package/dist/web/api.d.ts.map +1 -0
- package/dist/web/api.js +219 -0
- package/dist/web/api.js.map +1 -0
- package/dist/web/routes.d.ts +20 -0
- package/dist/web/routes.d.ts.map +1 -0
- package/dist/web/routes.js +175 -0
- package/dist/web/routes.js.map +1 -0
- package/dist/web/ui.d.ts +9 -0
- package/dist/web/ui.d.ts.map +1 -0
- package/dist/web/ui.js +1327 -0
- package/dist/web/ui.js.map +1 -0
- package/openclaw.plugin.json +231 -0
- package/package.json +41 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MySQL write layer
|
|
4
|
+
* Writes audit records to MySQL-compatible database
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.MySQLWriter = void 0;
|
|
11
|
+
const promise_1 = __importDefault(require("mysql2/promise"));
|
|
12
|
+
const schema_1 = require("./schema");
|
|
13
|
+
/**
|
|
14
|
+
* MySQL writer
|
|
15
|
+
* Manages connection pool and data writing
|
|
16
|
+
*/
|
|
17
|
+
class MySQLWriter {
|
|
18
|
+
pool = null;
|
|
19
|
+
config;
|
|
20
|
+
initialized = false;
|
|
21
|
+
initializing = false;
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.config = config;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Initialize connection pool and schema (with retries)
|
|
27
|
+
*/
|
|
28
|
+
async initialize(maxRetries = 3, retryDelayMs = 15000) {
|
|
29
|
+
if (this.initialized)
|
|
30
|
+
return;
|
|
31
|
+
if (this.initializing)
|
|
32
|
+
return; // prevent concurrent initialization
|
|
33
|
+
this.initializing = true;
|
|
34
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
35
|
+
try {
|
|
36
|
+
await this._doInitialize();
|
|
37
|
+
this.initializing = false;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error(`[audit-duckdb] Initialize attempt ${attempt}/${maxRetries} failed:`, error.message || error);
|
|
42
|
+
if (attempt < maxRetries) {
|
|
43
|
+
console.log(`[audit-duckdb] Retrying in ${retryDelayMs / 1000}s...`);
|
|
44
|
+
await new Promise((r) => setTimeout(r, retryDelayMs));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
this.initializing = false;
|
|
49
|
+
throw new Error('All MySQL initialization attempts failed');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Lazy initialization — auto-connect on query
|
|
53
|
+
*/
|
|
54
|
+
async ensureReady() {
|
|
55
|
+
if (this.initialized && this.pool)
|
|
56
|
+
return true;
|
|
57
|
+
try {
|
|
58
|
+
await this.initialize(1, 0);
|
|
59
|
+
return this.initialized;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async _doInitialize() {
|
|
66
|
+
// Connect without specifying database first, ensure it exists, then switch
|
|
67
|
+
const initPool = promise_1.default.createPool({
|
|
68
|
+
host: this.config.host,
|
|
69
|
+
port: this.config.port,
|
|
70
|
+
user: this.config.user,
|
|
71
|
+
password: this.config.password,
|
|
72
|
+
charset: 'utf8mb4',
|
|
73
|
+
waitForConnections: true,
|
|
74
|
+
connectionLimit: 2,
|
|
75
|
+
connectTimeout: 30000,
|
|
76
|
+
});
|
|
77
|
+
// Ensure database exists (DDL uses query, not execute)
|
|
78
|
+
await initPool.query(`CREATE DATABASE IF NOT EXISTS \`${this.config.database}\``);
|
|
79
|
+
await initPool.end();
|
|
80
|
+
// Create main connection pool with database specified
|
|
81
|
+
this.pool = promise_1.default.createPool({
|
|
82
|
+
host: this.config.host,
|
|
83
|
+
port: this.config.port,
|
|
84
|
+
user: this.config.user,
|
|
85
|
+
password: this.config.password,
|
|
86
|
+
database: this.config.database,
|
|
87
|
+
charset: 'utf8mb4',
|
|
88
|
+
waitForConnections: true,
|
|
89
|
+
connectionLimit: 5,
|
|
90
|
+
queueLimit: 0,
|
|
91
|
+
connectTimeout: 30000,
|
|
92
|
+
enableKeepAlive: true,
|
|
93
|
+
keepAliveInitialDelay: 10000,
|
|
94
|
+
});
|
|
95
|
+
// Test connection
|
|
96
|
+
const conn = await this.pool.getConnection();
|
|
97
|
+
conn.release();
|
|
98
|
+
// Ensure table schema exists
|
|
99
|
+
await (0, schema_1.ensureSchema)(this.pool);
|
|
100
|
+
this.initialized = true;
|
|
101
|
+
console.log('[audit-duckdb] MySQL writer initialized successfully');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Batch write buffer entries
|
|
105
|
+
*/
|
|
106
|
+
async writeBatch(entries) {
|
|
107
|
+
if (!this.pool || !this.initialized) {
|
|
108
|
+
throw new Error('MySQL writer not initialized');
|
|
109
|
+
}
|
|
110
|
+
const actions = entries
|
|
111
|
+
.filter((e) => e.type === 'action')
|
|
112
|
+
.map((e) => e.data);
|
|
113
|
+
const sessions = entries
|
|
114
|
+
.filter((e) => e.type === 'session')
|
|
115
|
+
.map((e) => e.data);
|
|
116
|
+
// Write actions first, then sessions — ensures session stats aggregate this batch's actions
|
|
117
|
+
if (actions.length > 0)
|
|
118
|
+
await this.writeActions(actions);
|
|
119
|
+
if (sessions.length > 0)
|
|
120
|
+
await this.writeSessions(sessions);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Batch insert audit action records
|
|
124
|
+
*/
|
|
125
|
+
async writeActions(actions) {
|
|
126
|
+
if (!this.pool)
|
|
127
|
+
return;
|
|
128
|
+
const sql = `
|
|
129
|
+
INSERT INTO audit_actions
|
|
130
|
+
(session_id, action_type, action_name, model_name, input_params, output_result,
|
|
131
|
+
prompt_tokens, completion_tokens, duration_ms, user_id, created_at)
|
|
132
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
133
|
+
`;
|
|
134
|
+
const conn = await this.pool.getConnection();
|
|
135
|
+
try {
|
|
136
|
+
for (const action of actions) {
|
|
137
|
+
await conn.execute(sql, [
|
|
138
|
+
action.sessionId,
|
|
139
|
+
action.actionType,
|
|
140
|
+
action.actionName,
|
|
141
|
+
action.modelName,
|
|
142
|
+
action.inputParams ? JSON.stringify(action.inputParams) : null,
|
|
143
|
+
action.outputResult ? JSON.stringify(action.outputResult) : null,
|
|
144
|
+
action.promptTokens,
|
|
145
|
+
action.completionTokens,
|
|
146
|
+
action.durationMs,
|
|
147
|
+
action.userId,
|
|
148
|
+
action.createdAt,
|
|
149
|
+
]);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
conn.release();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Write or update session summary records
|
|
158
|
+
* Stats are aggregated in real-time from audit_actions, not from memory counters
|
|
159
|
+
* This ensures historical data is preserved even after Gateway restarts
|
|
160
|
+
*/
|
|
161
|
+
async writeSessions(sessions) {
|
|
162
|
+
if (!this.pool)
|
|
163
|
+
return;
|
|
164
|
+
// Deduplicate: keep only the latest entry per sessionId in same batch
|
|
165
|
+
const deduped = new Map();
|
|
166
|
+
for (const s of sessions) {
|
|
167
|
+
deduped.set(s.sessionId, s);
|
|
168
|
+
}
|
|
169
|
+
const conn = await this.pool.getConnection();
|
|
170
|
+
try {
|
|
171
|
+
for (const session of deduped.values()) {
|
|
172
|
+
// Aggregate stats from audit_actions in real-time
|
|
173
|
+
const [statsRows] = await conn.query(`SELECT
|
|
174
|
+
MIN(created_at) AS start_time,
|
|
175
|
+
MAX(created_at) AS end_time,
|
|
176
|
+
COUNT(*) AS total_actions,
|
|
177
|
+
COALESCE(SUM(COALESCE(prompt_tokens, 0) + COALESCE(completion_tokens, 0)), 0) AS total_tokens
|
|
178
|
+
FROM audit_actions
|
|
179
|
+
WHERE session_id = ?`, [session.sessionId]);
|
|
180
|
+
const stats = statsRows[0];
|
|
181
|
+
// If no action records for this session, use passed-in values
|
|
182
|
+
const startTime = stats?.start_time || session.startTime;
|
|
183
|
+
const endTime = stats?.end_time || session.endTime;
|
|
184
|
+
const totalActions = Number(stats?.total_actions) || 0;
|
|
185
|
+
const totalTokens = Number(stats?.total_tokens) || 0;
|
|
186
|
+
// Check if session already exists
|
|
187
|
+
const [existingRows] = await conn.query('SELECT session_id, start_time FROM audit_sessions WHERE session_id = ?', [session.sessionId]);
|
|
188
|
+
const existing = existingRows[0];
|
|
189
|
+
if (existing) {
|
|
190
|
+
// UPDATE — keep the earlier start_time, use latest aggregated values for the rest
|
|
191
|
+
const earlierStart = existing.start_time && startTime && new Date(existing.start_time) < new Date(startTime)
|
|
192
|
+
? existing.start_time
|
|
193
|
+
: startTime;
|
|
194
|
+
await conn.execute(`UPDATE audit_sessions
|
|
195
|
+
SET user_id = ?,
|
|
196
|
+
model_name = CASE WHEN ? != '' THEN ? ELSE model_name END,
|
|
197
|
+
start_time = ?,
|
|
198
|
+
end_time = ?,
|
|
199
|
+
total_actions = ?,
|
|
200
|
+
total_tokens = ?
|
|
201
|
+
WHERE session_id = ?`, [
|
|
202
|
+
session.userId || existing.user_id || '',
|
|
203
|
+
session.modelName, session.modelName,
|
|
204
|
+
earlierStart,
|
|
205
|
+
endTime,
|
|
206
|
+
totalActions,
|
|
207
|
+
totalTokens,
|
|
208
|
+
session.sessionId,
|
|
209
|
+
]);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
// INSERT — new session
|
|
213
|
+
await conn.execute(`INSERT INTO audit_sessions
|
|
214
|
+
(session_id, user_id, model_name, start_time, end_time, total_actions, total_tokens)
|
|
215
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`, [
|
|
216
|
+
session.sessionId,
|
|
217
|
+
session.userId,
|
|
218
|
+
session.modelName,
|
|
219
|
+
startTime,
|
|
220
|
+
endTime,
|
|
221
|
+
totalActions,
|
|
222
|
+
totalTokens,
|
|
223
|
+
]);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
finally {
|
|
228
|
+
conn.release();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Write security alert records
|
|
233
|
+
*/
|
|
234
|
+
async writeAlerts(alerts) {
|
|
235
|
+
if (!this.pool || alerts.length === 0)
|
|
236
|
+
return;
|
|
237
|
+
const sql = `
|
|
238
|
+
INSERT INTO audit_alerts
|
|
239
|
+
(alert_id, session_id, action_type, action_name, rule_id, rule_name,
|
|
240
|
+
category, severity, finding, context, status, user_id, model_name, created_at)
|
|
241
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
242
|
+
`;
|
|
243
|
+
const conn = await this.pool.getConnection();
|
|
244
|
+
try {
|
|
245
|
+
for (const alert of alerts) {
|
|
246
|
+
await conn.execute(sql, [
|
|
247
|
+
alert.alertId,
|
|
248
|
+
alert.sessionId,
|
|
249
|
+
alert.actionType,
|
|
250
|
+
alert.actionName,
|
|
251
|
+
alert.ruleId,
|
|
252
|
+
alert.ruleName,
|
|
253
|
+
alert.category,
|
|
254
|
+
alert.severity,
|
|
255
|
+
alert.finding,
|
|
256
|
+
alert.context,
|
|
257
|
+
alert.status,
|
|
258
|
+
alert.userId,
|
|
259
|
+
alert.modelName,
|
|
260
|
+
alert.createdAt,
|
|
261
|
+
]);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
finally {
|
|
265
|
+
conn.release();
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Get connection pool (for Web API queries)
|
|
270
|
+
*/
|
|
271
|
+
getPool() {
|
|
272
|
+
return this.pool;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Close connection pool
|
|
276
|
+
*/
|
|
277
|
+
async close() {
|
|
278
|
+
if (this.pool) {
|
|
279
|
+
await this.pool.end();
|
|
280
|
+
this.pool = null;
|
|
281
|
+
this.initialized = false;
|
|
282
|
+
console.log('[audit-duckdb] MySQL writer closed');
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
exports.MySQLWriter = MySQLWriter;
|
|
287
|
+
//# sourceMappingURL=mysql-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-writer.js","sourceRoot":"","sources":["../../src/storage/mysql-writer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAEH,6DAA6C;AAI7C,qCAAwC;AAIxC;;;GAGG;AACH,MAAa,WAAW;IACd,IAAI,GAAgB,IAAI,CAAC;IACzB,MAAM,CAAc;IACpB,WAAW,GAAY,KAAK,CAAC;IAC7B,YAAY,GAAY,KAAK,CAAC;IAEtC,YAAY,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,UAAU,GAAG,CAAC,EAAE,YAAY,GAAG,KAAK;QACnD,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,CAAC,oCAAoC;QAEnE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC3B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,OAAO;YACT,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CACX,qCAAqC,OAAO,IAAI,UAAU,UAAU,EACnE,KAAe,CAAC,OAAO,IAAI,KAAK,CAClC,CAAC;gBACF,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,8BAA8B,YAAY,GAAG,IAAI,MAAM,CAAC,CAAC;oBACrE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,2EAA2E;QAC3E,MAAM,QAAQ,GAAG,iBAAK,CAAC,UAAU,CAAC;YAChC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,OAAO,EAAE,SAAS;YAClB,kBAAkB,EAAE,IAAI;YACxB,eAAe,EAAE,CAAC;YAClB,cAAc,EAAE,KAAK;SACtB,CAAC,CAAC;QAEH,uDAAuD;QACvD,MAAM,QAAQ,CAAC,KAAK,CAClB,mCAAmC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAC5D,CAAC;QACF,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC;QAErB,sDAAsD;QACtD,IAAI,CAAC,IAAI,GAAG,iBAAK,CAAC,UAAU,CAAC;YAC3B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,OAAO,EAAE,SAAS;YAClB,kBAAkB,EAAE,IAAI;YACxB,eAAe,EAAE,CAAC;YAClB,UAAU,EAAE,CAAC;YACb,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,IAAI;YACrB,qBAAqB,EAAE,KAAK;SAC7B,CAAC,CAAC;QAEH,kBAAkB;QAClB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QAEf,6BAA6B;QAC7B,MAAM,IAAA,qBAAY,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,OAAsB;QACrC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,OAAO,GAAG,OAAO;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAmB,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,OAAO;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;aACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAoB,CAAC,CAAC;QAEtC,4FAA4F;QAC5F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,OAAsB;QAC/C,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QAEvB,MAAM,GAAG,GAAG;;;;;KAKX,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;oBACtB,MAAM,CAAC,SAAS;oBAChB,MAAM,CAAC,UAAU;oBACjB,MAAM,CAAC,UAAU;oBACjB,MAAM,CAAC,SAAS;oBAChB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;oBAC9D,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI;oBAChE,MAAM,CAAC,YAAY;oBACnB,MAAM,CAAC,gBAAgB;oBACvB,MAAM,CAAC,UAAU;oBACjB,MAAM,CAAC,MAAM;oBACb,MAAM,CAAC,SAAS;iBACjB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,aAAa,CAAC,QAAwB;QAClD,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QAEvB,sEAAsE;QACtE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,kDAAkD;gBAClD,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAClC;;;;;;gCAMsB,EACtB,CAAC,OAAO,CAAC,SAAS,CAAC,CACpB,CAAC;gBACF,MAAM,KAAK,GAAI,SAAmB,CAAC,CAAC,CAAC,CAAC;gBAEtC,8DAA8D;gBAC9D,MAAM,SAAS,GAAG,KAAK,EAAE,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;gBACzD,MAAM,OAAO,GAAG,KAAK,EAAE,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;gBACnD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;gBACvD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;gBAErD,kCAAkC;gBAClC,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CACrC,wEAAwE,EACxE,CAAC,OAAO,CAAC,SAAS,CAAC,CACpB,CAAC;gBACF,MAAM,QAAQ,GAAI,YAAsB,CAAC,CAAC,CAAC,CAAC;gBAE5C,IAAI,QAAQ,EAAE,CAAC;oBACb,kFAAkF;oBAClF,MAAM,YAAY,GAChB,QAAQ,CAAC,UAAU,IAAI,SAAS,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC;wBACrF,CAAC,CAAC,QAAQ,CAAC,UAAU;wBACrB,CAAC,CAAC,SAAS,CAAC;oBAEhB,MAAM,IAAI,CAAC,OAAO,CAChB;;;;;;;kCAOsB,EACtB;wBACE,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,IAAI,EAAE;wBACxC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS;wBACpC,YAAY;wBACZ,OAAO;wBACP,YAAY;wBACZ,WAAW;wBACX,OAAO,CAAC,SAAS;qBAClB,CACF,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,uBAAuB;oBACvB,MAAM,IAAI,CAAC,OAAO,CAChB;;0CAE8B,EAC9B;wBACE,OAAO,CAAC,SAAS;wBACjB,OAAO,CAAC,MAAM;wBACd,OAAO,CAAC,SAAS;wBACjB,SAAS;wBACT,OAAO;wBACP,YAAY;wBACZ,WAAW;qBACZ,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,MAAuB;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE9C,MAAM,GAAG,GAAG;;;;;KAKX,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;oBACtB,KAAK,CAAC,OAAO;oBACb,KAAK,CAAC,SAAS;oBACf,KAAK,CAAC,UAAU;oBAChB,KAAK,CAAC,UAAU;oBAChB,KAAK,CAAC,MAAM;oBACZ,KAAK,CAAC,QAAQ;oBACd,KAAK,CAAC,QAAQ;oBACd,KAAK,CAAC,QAAQ;oBACd,KAAK,CAAC,OAAO;oBACb,KAAK,CAAC,OAAO;oBACb,KAAK,CAAC,MAAM;oBACZ,KAAK,CAAC,MAAM;oBACZ,KAAK,CAAC,SAAS;oBACf,KAAK,CAAC,SAAS;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;CACF;AA7SD,kCA6SC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MySQL database schema definition and migrations
|
|
3
|
+
* Creates audit tables in MySQL-compatible databases
|
|
4
|
+
*
|
|
5
|
+
* WARNING: DuckDB schema is defined in duckdb-local-writer.ts (DUCKDB_SCHEMA_STATEMENTS).
|
|
6
|
+
* When modifying table structure, update both places.
|
|
7
|
+
*/
|
|
8
|
+
import { Pool } from 'mysql2/promise';
|
|
9
|
+
/**
|
|
10
|
+
* Create audit tables in MySQL (if not exists)
|
|
11
|
+
*/
|
|
12
|
+
export declare function ensureSchema(pool: Pool): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/storage/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAiF5D"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MySQL database schema definition and migrations
|
|
4
|
+
* Creates audit tables in MySQL-compatible databases
|
|
5
|
+
*
|
|
6
|
+
* WARNING: DuckDB schema is defined in duckdb-local-writer.ts (DUCKDB_SCHEMA_STATEMENTS).
|
|
7
|
+
* When modifying table structure, update both places.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ensureSchema = ensureSchema;
|
|
11
|
+
/**
|
|
12
|
+
* Create audit tables in MySQL (if not exists)
|
|
13
|
+
*/
|
|
14
|
+
async function ensureSchema(pool) {
|
|
15
|
+
// Create audit_actions core table (DDL does not support prepared statements)
|
|
16
|
+
await pool.query(`
|
|
17
|
+
CREATE TABLE IF NOT EXISTS audit_actions (
|
|
18
|
+
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
19
|
+
session_id VARCHAR(64) NOT NULL,
|
|
20
|
+
action_type VARCHAR(32) NOT NULL,
|
|
21
|
+
action_name VARCHAR(255) NOT NULL,
|
|
22
|
+
model_name VARCHAR(128) DEFAULT '',
|
|
23
|
+
input_params TEXT,
|
|
24
|
+
output_result TEXT,
|
|
25
|
+
prompt_tokens INT DEFAULT NULL,
|
|
26
|
+
completion_tokens INT DEFAULT NULL,
|
|
27
|
+
duration_ms INT DEFAULT NULL,
|
|
28
|
+
user_id VARCHAR(128) DEFAULT '',
|
|
29
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
30
|
+
INDEX idx_session_id (session_id),
|
|
31
|
+
INDEX idx_action_type (action_type),
|
|
32
|
+
INDEX idx_created_at (created_at),
|
|
33
|
+
INDEX idx_user_id (user_id)
|
|
34
|
+
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
|
|
35
|
+
`);
|
|
36
|
+
// If table already exists, widen action_type column (20 -> 32)
|
|
37
|
+
try {
|
|
38
|
+
await pool.query(`ALTER TABLE audit_actions MODIFY COLUMN action_type VARCHAR(32) NOT NULL`);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Ignore error (column may already be VARCHAR(32))
|
|
42
|
+
}
|
|
43
|
+
// Create audit_sessions summary table
|
|
44
|
+
await pool.query(`
|
|
45
|
+
CREATE TABLE IF NOT EXISTS audit_sessions (
|
|
46
|
+
session_id VARCHAR(64) PRIMARY KEY,
|
|
47
|
+
user_id VARCHAR(128) DEFAULT '',
|
|
48
|
+
model_name VARCHAR(128) DEFAULT '',
|
|
49
|
+
start_time TIMESTAMP NOT NULL,
|
|
50
|
+
end_time TIMESTAMP NULL DEFAULT NULL,
|
|
51
|
+
total_actions INT DEFAULT 0,
|
|
52
|
+
total_tokens INT DEFAULT 0,
|
|
53
|
+
INDEX idx_user_id (user_id),
|
|
54
|
+
INDEX idx_start_time (start_time)
|
|
55
|
+
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
|
|
56
|
+
`);
|
|
57
|
+
// Migration: drop deprecated session_key column
|
|
58
|
+
try {
|
|
59
|
+
await pool.query(`ALTER TABLE audit_sessions DROP COLUMN session_key`);
|
|
60
|
+
console.log('[audit-duckdb] Dropped session_key column from audit_sessions');
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Column does not exist, ignore
|
|
64
|
+
}
|
|
65
|
+
// Create audit_alerts security alerts table
|
|
66
|
+
await pool.query(`
|
|
67
|
+
CREATE TABLE IF NOT EXISTS audit_alerts (
|
|
68
|
+
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
69
|
+
alert_id VARCHAR(64) NOT NULL,
|
|
70
|
+
session_id VARCHAR(64) NOT NULL,
|
|
71
|
+
action_type VARCHAR(32) NOT NULL,
|
|
72
|
+
action_name VARCHAR(256) DEFAULT '',
|
|
73
|
+
rule_id VARCHAR(32) NOT NULL,
|
|
74
|
+
rule_name VARCHAR(128) NOT NULL,
|
|
75
|
+
category VARCHAR(32) NOT NULL,
|
|
76
|
+
severity VARCHAR(16) NOT NULL,
|
|
77
|
+
finding TEXT,
|
|
78
|
+
context TEXT,
|
|
79
|
+
status VARCHAR(16) DEFAULT 'open',
|
|
80
|
+
resolved_by VARCHAR(128) DEFAULT NULL,
|
|
81
|
+
resolved_at TIMESTAMP NULL DEFAULT NULL,
|
|
82
|
+
user_id VARCHAR(128) DEFAULT '',
|
|
83
|
+
model_name VARCHAR(128) DEFAULT '',
|
|
84
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
85
|
+
INDEX idx_alert_severity (severity),
|
|
86
|
+
INDEX idx_alert_category (category),
|
|
87
|
+
INDEX idx_alert_status (status),
|
|
88
|
+
INDEX idx_alert_session (session_id),
|
|
89
|
+
INDEX idx_alert_created (created_at),
|
|
90
|
+
INDEX idx_alert_rule (rule_id)
|
|
91
|
+
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
|
|
92
|
+
`);
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/storage/schema.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAOH,oCAiFC;AApFD;;GAEG;AACI,KAAK,UAAU,YAAY,CAAC,IAAU;IAC3C,6EAA6E;IAC7E,MAAM,IAAI,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;GAmBhB,CAAC,CAAC;IAEH,+DAA+D;IAC/D,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC/F,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;IACrD,CAAC;IAED,sCAAsC;IACtC,MAAM,IAAI,CAAC,KAAK,CAAC;;;;;;;;;;;;GAYhB,CAAC,CAAC;IAEH,gDAAgD;IAChD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IAED,4CAA4C;IAC5C,MAAM,IAAI,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BhB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage layer common interface
|
|
3
|
+
* Both MySQLWriter and DuckDBLocalWriter implement this interface
|
|
4
|
+
*/
|
|
5
|
+
import { BufferEntry } from './buffer';
|
|
6
|
+
import { SecurityAlert } from '../security/types';
|
|
7
|
+
/**
|
|
8
|
+
* Generic query pool interface — used by Web API query layer
|
|
9
|
+
* mysql2 Pool natively satisfies this interface; DuckDB is adapted via wrapper
|
|
10
|
+
*/
|
|
11
|
+
export interface QueryPool {
|
|
12
|
+
query(sql: string, params?: unknown[]): Promise<[any[], any]>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Audit writer common interface
|
|
16
|
+
*/
|
|
17
|
+
export interface AuditWriter {
|
|
18
|
+
/** Initialize connection / file (with retries) */
|
|
19
|
+
initialize(maxRetries?: number, retryDelayMs?: number): Promise<void>;
|
|
20
|
+
/** Lazy initialization — auto-connect on query */
|
|
21
|
+
ensureReady(): Promise<boolean>;
|
|
22
|
+
/** Batch write buffer entries */
|
|
23
|
+
writeBatch(entries: BufferEntry[]): Promise<void>;
|
|
24
|
+
/** Write security alerts */
|
|
25
|
+
writeAlerts(alerts: SecurityAlert[]): Promise<void>;
|
|
26
|
+
/** Get query pool (for Web API use) */
|
|
27
|
+
getPool(): QueryPool | null;
|
|
28
|
+
/** Close connection */
|
|
29
|
+
close(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/storage/writer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;CAC/D;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,kDAAkD;IAClD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,iCAAiC;IACjC,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,4BAA4B;IAC5B,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,uCAAuC;IACvC,OAAO,IAAI,SAAS,GAAG,IAAI,CAAC;IAC5B,uBAAuB;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/storage/writer.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit record type definitions
|
|
3
|
+
*/
|
|
4
|
+
/** Action type enum — covers all OpenClaw hooks */
|
|
5
|
+
export declare enum ActionType {
|
|
6
|
+
Message = "message",// llm_output (LLM call)
|
|
7
|
+
ToolCall = "tool_call",// after_tool_call
|
|
8
|
+
ToolPersist = "tool_persist",// tool_result_persist
|
|
9
|
+
ModelResolve = "model_resolve",// before_model_resolve
|
|
10
|
+
PromptBuild = "prompt_build",// before_prompt_build
|
|
11
|
+
AgentEnd = "agent_end",// agent_end
|
|
12
|
+
Compaction = "compaction",// before_compaction / after_compaction
|
|
13
|
+
Reset = "reset",// before_reset
|
|
14
|
+
UserMessage = "user_message",// message_received
|
|
15
|
+
MsgSending = "msg_sending",// message_sending
|
|
16
|
+
AssistantMsg = "assistant_msg",// message_sent
|
|
17
|
+
SessionStart = "session_start",// session_start
|
|
18
|
+
SessionEnd = "session_end",// session_end
|
|
19
|
+
SubagentSpawn = "subagent_spawn",// subagent_spawned
|
|
20
|
+
SubagentEnd = "subagent_end",// subagent_ended
|
|
21
|
+
GatewayStart = "gateway_start",// gateway_start
|
|
22
|
+
GatewayStop = "gateway_stop"
|
|
23
|
+
}
|
|
24
|
+
/** Message role */
|
|
25
|
+
export declare enum MessageRole {
|
|
26
|
+
User = "user",
|
|
27
|
+
Assistant = "assistant",
|
|
28
|
+
System = "system"
|
|
29
|
+
}
|
|
30
|
+
/** Core audit record */
|
|
31
|
+
export interface AuditAction {
|
|
32
|
+
/** Session ID */
|
|
33
|
+
sessionId: string;
|
|
34
|
+
/** Action type */
|
|
35
|
+
actionType: ActionType;
|
|
36
|
+
/** Action name (tool name or message type) */
|
|
37
|
+
actionName: string;
|
|
38
|
+
/** Model name */
|
|
39
|
+
modelName: string;
|
|
40
|
+
/** Input parameters */
|
|
41
|
+
inputParams: Record<string, unknown> | null;
|
|
42
|
+
/** Output result */
|
|
43
|
+
outputResult: Record<string, unknown> | null;
|
|
44
|
+
/** Prompt token count */
|
|
45
|
+
promptTokens: number | null;
|
|
46
|
+
/** Completion token count */
|
|
47
|
+
completionTokens: number | null;
|
|
48
|
+
/** Duration (ms) */
|
|
49
|
+
durationMs: number | null;
|
|
50
|
+
/** User identifier */
|
|
51
|
+
userId: string;
|
|
52
|
+
/** Record timestamp */
|
|
53
|
+
createdAt: Date;
|
|
54
|
+
}
|
|
55
|
+
/** Session summary record */
|
|
56
|
+
export interface AuditSession {
|
|
57
|
+
/** Session ID */
|
|
58
|
+
sessionId: string;
|
|
59
|
+
/** User */
|
|
60
|
+
userId: string;
|
|
61
|
+
/** Model */
|
|
62
|
+
modelName: string;
|
|
63
|
+
/** Start time */
|
|
64
|
+
startTime: Date;
|
|
65
|
+
/** End time */
|
|
66
|
+
endTime: Date | null;
|
|
67
|
+
/** Total action count */
|
|
68
|
+
totalActions: number;
|
|
69
|
+
/** Total token usage */
|
|
70
|
+
totalTokens: number;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,mDAAmD;AACnD,oBAAY,UAAU;IAEpB,OAAO,YAAY,CAAc,wBAAwB;IACzD,QAAQ,cAAc,CAAW,kBAAkB;IACnD,WAAW,iBAAiB,CAAK,sBAAsB;IAGvD,YAAY,kBAAkB,CAAG,uBAAuB;IACxD,WAAW,iBAAiB,CAAK,sBAAsB;IAEvD,QAAQ,cAAc,CAAW,YAAY;IAG7C,UAAU,eAAe,CAAQ,uCAAuC;IACxE,KAAK,UAAU,CAAkB,eAAe;IAGhD,WAAW,iBAAiB,CAAK,mBAAmB;IACpD,UAAU,gBAAgB,CAAO,kBAAkB;IACnD,YAAY,kBAAkB,CAAG,eAAe;IAIhD,YAAY,kBAAkB,CAAG,gBAAgB;IACjD,UAAU,gBAAgB,CAAO,cAAc;IAG/C,aAAa,mBAAmB,CAAE,mBAAmB;IACrD,WAAW,iBAAiB,CAAK,iBAAiB;IAGlD,YAAY,kBAAkB,CAAG,gBAAgB;IACjD,WAAW,iBAAiB;CAC7B;AAED,mBAAmB;AACnB,oBAAY,WAAW;IACrB,IAAI,SAAS;IACb,SAAS,cAAc;IACvB,MAAM,WAAW;CAClB;AAED,wBAAwB;AACxB,MAAM,WAAW,WAAW;IAC1B,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7C,yBAAyB;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,6BAA6B;IAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,oBAAoB;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,6BAA6B;AAC7B,MAAM,WAAW,YAAY;IAC3B,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,YAAY;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,eAAe;IACf,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,yBAAyB;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Audit record type definitions
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MessageRole = exports.ActionType = void 0;
|
|
7
|
+
/** Action type enum — covers all OpenClaw hooks */
|
|
8
|
+
var ActionType;
|
|
9
|
+
(function (ActionType) {
|
|
10
|
+
// LLM core
|
|
11
|
+
ActionType["Message"] = "message";
|
|
12
|
+
ActionType["ToolCall"] = "tool_call";
|
|
13
|
+
ActionType["ToolPersist"] = "tool_persist";
|
|
14
|
+
// Agent lifecycle
|
|
15
|
+
ActionType["ModelResolve"] = "model_resolve";
|
|
16
|
+
ActionType["PromptBuild"] = "prompt_build";
|
|
17
|
+
// AgentStart removed — before_agent_start is a legacy hook that triggers redundantly
|
|
18
|
+
ActionType["AgentEnd"] = "agent_end";
|
|
19
|
+
// Context management
|
|
20
|
+
ActionType["Compaction"] = "compaction";
|
|
21
|
+
ActionType["Reset"] = "reset";
|
|
22
|
+
// Message channel
|
|
23
|
+
ActionType["UserMessage"] = "user_message";
|
|
24
|
+
ActionType["MsgSending"] = "msg_sending";
|
|
25
|
+
ActionType["AssistantMsg"] = "assistant_msg";
|
|
26
|
+
// MsgWrite removed — before_message_write has no additional audit value
|
|
27
|
+
// Session
|
|
28
|
+
ActionType["SessionStart"] = "session_start";
|
|
29
|
+
ActionType["SessionEnd"] = "session_end";
|
|
30
|
+
// Sub-agent
|
|
31
|
+
ActionType["SubagentSpawn"] = "subagent_spawn";
|
|
32
|
+
ActionType["SubagentEnd"] = "subagent_end";
|
|
33
|
+
// Gateway
|
|
34
|
+
ActionType["GatewayStart"] = "gateway_start";
|
|
35
|
+
ActionType["GatewayStop"] = "gateway_stop";
|
|
36
|
+
})(ActionType || (exports.ActionType = ActionType = {}));
|
|
37
|
+
/** Message role */
|
|
38
|
+
var MessageRole;
|
|
39
|
+
(function (MessageRole) {
|
|
40
|
+
MessageRole["User"] = "user";
|
|
41
|
+
MessageRole["Assistant"] = "assistant";
|
|
42
|
+
MessageRole["System"] = "system";
|
|
43
|
+
})(MessageRole || (exports.MessageRole = MessageRole = {}));
|
|
44
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,mDAAmD;AACnD,IAAY,UAiCX;AAjCD,WAAY,UAAU;IACpB,WAAW;IACX,iCAAmB,CAAA;IACnB,oCAAsB,CAAA;IACtB,0CAA4B,CAAA;IAE5B,kBAAkB;IAClB,4CAA8B,CAAA;IAC9B,0CAA4B,CAAA;IAC5B,qFAAqF;IACrF,oCAAsB,CAAA;IAEtB,qBAAqB;IACrB,uCAAyB,CAAA;IACzB,6BAAe,CAAA;IAEf,kBAAkB;IAClB,0CAA4B,CAAA;IAC5B,wCAA0B,CAAA;IAC1B,4CAA8B,CAAA;IAC9B,wEAAwE;IAExE,UAAU;IACV,4CAA8B,CAAA;IAC9B,wCAA0B,CAAA;IAE1B,YAAY;IACZ,8CAAgC,CAAA;IAChC,0CAA4B,CAAA;IAE5B,UAAU;IACV,4CAA8B,CAAA;IAC9B,0CAA4B,CAAA;AAC9B,CAAC,EAjCW,UAAU,0BAAV,UAAU,QAiCrB;AAED,mBAAmB;AACnB,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,4BAAa,CAAA;IACb,sCAAuB,CAAA;IACvB,gCAAiB,CAAA;AACnB,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB"}
|