openclaw-observability 2026.3.22 → 2026.3.24-1
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 +20 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -2
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +17 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1059 -97
- package/dist/index.js.map +1 -1
- package/dist/redaction.d.ts.map +1 -1
- package/dist/redaction.js +8 -1
- package/dist/redaction.js.map +1 -1
- package/dist/security/chain-detector.d.ts +0 -9
- package/dist/security/chain-detector.d.ts.map +1 -1
- package/dist/security/chain-detector.js +7 -25
- package/dist/security/chain-detector.js.map +1 -1
- package/dist/security/rules.d.ts.map +1 -1
- package/dist/security/rules.js +30 -24
- package/dist/security/rules.js.map +1 -1
- package/dist/security/scanner.d.ts +15 -1
- package/dist/security/scanner.d.ts.map +1 -1
- package/dist/security/scanner.js +148 -11
- package/dist/security/scanner.js.map +1 -1
- package/dist/security/types.d.ts +1 -0
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/types.js +1 -0
- package/dist/security/types.js.map +1 -1
- package/dist/storage/duckdb-local-writer.d.ts +7 -2
- package/dist/storage/duckdb-local-writer.d.ts.map +1 -1
- package/dist/storage/duckdb-local-writer.js +463 -8
- package/dist/storage/duckdb-local-writer.js.map +1 -1
- package/dist/storage/mysql-writer.d.ts +6 -2
- package/dist/storage/mysql-writer.d.ts.map +1 -1
- package/dist/storage/mysql-writer.js +186 -6
- package/dist/storage/mysql-writer.js.map +1 -1
- package/dist/storage/schema.d.ts.map +1 -1
- package/dist/storage/schema.js +144 -0
- package/dist/storage/schema.js.map +1 -1
- package/dist/storage/structured-model.d.ts +68 -0
- package/dist/storage/structured-model.d.ts.map +1 -0
- package/dist/storage/structured-model.js +313 -0
- package/dist/storage/structured-model.js.map +1 -0
- package/dist/storage/writer.d.ts +23 -0
- package/dist/storage/writer.d.ts.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -1
- package/dist/web/api.d.ts +68 -2
- package/dist/web/api.d.ts.map +1 -1
- package/dist/web/api.js +390 -57
- package/dist/web/api.js.map +1 -1
- package/dist/web/routes.d.ts +11 -3
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +564 -20
- package/dist/web/routes.js.map +1 -1
- package/dist/web/ui.js +2801 -250
- package/dist/web/ui.js.map +1 -1
- package/openclaw.plugin.json +36 -1
- package/package.json +5 -2
package/dist/config.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Plugin configuration schema and defaults
|
|
3
3
|
*/
|
|
4
|
+
import { Severity } from './security/types';
|
|
4
5
|
/** MySQL connection config */
|
|
5
6
|
export interface MySQLConfig {
|
|
6
7
|
host: string;
|
|
@@ -30,13 +31,23 @@ export interface RedactionConfig {
|
|
|
30
31
|
}
|
|
31
32
|
/** Security detection config */
|
|
32
33
|
export interface SecurityPluginConfig {
|
|
34
|
+
customRegexRules: Array<{
|
|
35
|
+
id: string;
|
|
36
|
+
name: string;
|
|
37
|
+
pattern: string;
|
|
38
|
+
flags?: string;
|
|
39
|
+
severity?: Severity;
|
|
40
|
+
enabled?: boolean;
|
|
41
|
+
}>;
|
|
33
42
|
/** Whether security scanning is enabled */
|
|
34
43
|
enabled: boolean;
|
|
35
44
|
/** Enabled rule categories */
|
|
36
45
|
rules: {
|
|
37
46
|
secretLeakage: boolean;
|
|
38
47
|
highRiskOps: boolean;
|
|
48
|
+
dataExfiltration: boolean;
|
|
39
49
|
promptInjection: boolean;
|
|
50
|
+
customRegex: boolean;
|
|
40
51
|
chainDetection: boolean;
|
|
41
52
|
};
|
|
42
53
|
/** Domain whitelist for external request detection */
|
|
@@ -47,6 +58,14 @@ export interface UiConfig {
|
|
|
47
58
|
/** Optional access token: when set, requests must pass ?token=... or Authorization: Bearer ... */
|
|
48
59
|
accessToken?: string;
|
|
49
60
|
}
|
|
61
|
+
export interface MetricsConfig {
|
|
62
|
+
/** Enable OTLP push ingest endpoint */
|
|
63
|
+
enabled: boolean;
|
|
64
|
+
/** OTLP base path mounted on plugin route (the receiver listens on ${otlpPath}/v1/metrics) */
|
|
65
|
+
otlpPath: string;
|
|
66
|
+
/** Max payload size for OTLP metrics requests */
|
|
67
|
+
maxPayloadBytes: number;
|
|
68
|
+
}
|
|
50
69
|
/** Full plugin config */
|
|
51
70
|
export interface AuditPluginConfig {
|
|
52
71
|
/** Storage mode: local (embedded, zero config) | remote (external MySQL) */
|
|
@@ -57,6 +76,7 @@ export interface AuditPluginConfig {
|
|
|
57
76
|
redaction: RedactionConfig;
|
|
58
77
|
security: SecurityPluginConfig;
|
|
59
78
|
ui?: UiConfig;
|
|
79
|
+
metrics: MetricsConfig;
|
|
60
80
|
}
|
|
61
81
|
/** Default DuckDB path — use a 'data' subdirectory to avoid triggering
|
|
62
82
|
* OpenClaw's hot-reload file watcher on the top-level ~/.openclaw/ dir */
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,8BAA8B;AAC9B,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,0BAA0B;AAC1B,MAAM,WAAW,YAAY;IAC3B,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,oBAAoB;AACpB,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,uBAAuB;AACvB,MAAM,WAAW,eAAe;IAC9B,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,gCAAgC;AAChC,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,KAAK,CAAC;QACtB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,2CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,EAAE;QACL,aAAa,EAAE,OAAO,CAAC;QACvB,WAAW,EAAE,OAAO,CAAC;QACrB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,eAAe,EAAE,OAAO,CAAC;QACzB,WAAW,EAAE,OAAO,CAAC;QACrB,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,sDAAsD;IACtD,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,sCAAsC;AACtC,MAAM,WAAW,QAAQ;IACvB,kGAAkG;IAClG,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,8FAA8F;IAC9F,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,yBAAyB;AACzB,MAAM,WAAW,iBAAiB;IAChC,4EAA4E;IAC5E,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,eAAe,CAAC;IAC3B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;2EAC2E;AAC3E,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AAEF,qBAAqB;AACrB,eAAO,MAAM,cAAc,EAAE,iBAsD5B,CAAC;AAeF,wBAAgB,aAAa,CAC3B,UAAU,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,SAAS,GACjD,iBAAiB,CA2CnB"}
|
package/dist/config.js
CHANGED
|
@@ -80,16 +80,24 @@ exports.DEFAULT_CONFIG = {
|
|
|
80
80
|
],
|
|
81
81
|
},
|
|
82
82
|
security: {
|
|
83
|
+
customRegexRules: [],
|
|
83
84
|
enabled: true,
|
|
84
85
|
rules: {
|
|
85
86
|
secretLeakage: true,
|
|
86
87
|
highRiskOps: true,
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
dataExfiltration: false,
|
|
89
|
+
promptInjection: false,
|
|
90
|
+
customRegex: false,
|
|
91
|
+
chainDetection: false,
|
|
89
92
|
},
|
|
90
93
|
domainWhitelist: [],
|
|
91
94
|
},
|
|
92
95
|
ui: {},
|
|
96
|
+
metrics: {
|
|
97
|
+
enabled: true,
|
|
98
|
+
otlpPath: '/plugins/observability/api/otel',
|
|
99
|
+
maxPayloadBytes: 2 * 1024 * 1024,
|
|
100
|
+
},
|
|
93
101
|
};
|
|
94
102
|
/**
|
|
95
103
|
* Smart mode inference:
|
|
@@ -135,12 +143,17 @@ function resolveConfig(userConfig) {
|
|
|
135
143
|
...exports.DEFAULT_CONFIG.security.rules,
|
|
136
144
|
...(userConfig.security?.rules),
|
|
137
145
|
},
|
|
146
|
+
customRegexRules: userConfig.security?.customRegexRules ?? exports.DEFAULT_CONFIG.security.customRegexRules,
|
|
138
147
|
domainWhitelist: userConfig.security?.domainWhitelist ?? exports.DEFAULT_CONFIG.security.domainWhitelist,
|
|
139
148
|
},
|
|
140
149
|
ui: {
|
|
141
150
|
...exports.DEFAULT_CONFIG.ui,
|
|
142
151
|
...userConfig.ui,
|
|
143
152
|
},
|
|
153
|
+
metrics: {
|
|
154
|
+
...exports.DEFAULT_CONFIG.metrics,
|
|
155
|
+
...userConfig.metrics,
|
|
156
|
+
},
|
|
144
157
|
};
|
|
145
158
|
}
|
|
146
159
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* OpenClaw hooks:
|
|
6
6
|
* Agent: before_model_resolve, before_prompt_build, before_agent_start, agent_end
|
|
7
7
|
* LLM: llm_input, llm_output
|
|
8
|
-
* Tool: before_tool_call, after_tool_call
|
|
8
|
+
* Tool: before_tool_call, after_tool_call
|
|
9
9
|
* Msg: message_received, message_sending, message_sent, before_message_write
|
|
10
10
|
* Ctx: before_compaction, after_compaction, before_reset
|
|
11
11
|
* Session: session_start, session_end
|
|
@@ -27,6 +27,22 @@ interface PluginAPI {
|
|
|
27
27
|
match?: 'exact' | 'prefix';
|
|
28
28
|
replaceExisting?: boolean;
|
|
29
29
|
}) => void;
|
|
30
|
+
registerGatewayMethod?: (method: string, handler: (ctx: {
|
|
31
|
+
params?: unknown;
|
|
32
|
+
respond: (ok: boolean, payload: unknown) => void;
|
|
33
|
+
[key: string]: unknown;
|
|
34
|
+
}) => void | Promise<void>) => void;
|
|
35
|
+
runtime?: {
|
|
36
|
+
events?: {
|
|
37
|
+
onAgentEvent?: (listener: (evt: {
|
|
38
|
+
runId: string;
|
|
39
|
+
stream: string;
|
|
40
|
+
ts: number;
|
|
41
|
+
data: Record<string, unknown>;
|
|
42
|
+
sessionKey?: string;
|
|
43
|
+
}) => void) => (() => void) | void;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
30
46
|
[key: string]: unknown;
|
|
31
47
|
}
|
|
32
48
|
declare function activate(api: PluginAPI): {
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAiB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAiB,MAAM,UAAU,CAAC;AAiC5D,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1C,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,IAAI,CAAC;IACjE,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,WAAW,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,WAAW,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;QACzI,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC;QAC3B,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;QAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,KAAK,IAAI,CAAC;IACX,qBAAqB,CAAC,EAAE,CACtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;QACjD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KACvB,IAAI,CAAC;IACV,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE;YACP,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE;gBAC9B,KAAK,EAAE,MAAM,CAAC;gBACd,MAAM,EAAE,MAAM,CAAC;gBACf,EAAE,EAAE,MAAM,CAAC;gBACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;aACrB,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;SACpC,CAAC;KACH,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAu5BD,iBAAS,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG;IAAE,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CA2vDrE;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,eAAe,QAAQ,CAAC"}
|