openclaw-observability 2026.3.26 → 2026.4.16
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 +4 -4
- package/dist/cloud/api-key-auth.d.ts +6 -0
- package/dist/cloud/api-key-auth.d.ts.map +1 -0
- package/dist/cloud/api-key-auth.js +55 -0
- package/dist/cloud/api-key-auth.js.map +1 -0
- package/dist/cloud/auth.d.ts +11 -0
- package/dist/cloud/auth.d.ts.map +1 -0
- package/dist/cloud/auth.js +33 -0
- package/dist/cloud/auth.js.map +1 -0
- package/dist/cloud/contracts.d.ts +26 -0
- package/dist/cloud/contracts.d.ts.map +1 -0
- package/dist/cloud/contracts.js +19 -0
- package/dist/cloud/contracts.js.map +1 -0
- package/dist/cloud/index.d.ts +5 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +21 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/cloud/types.d.ts +29 -0
- package/dist/cloud/types.d.ts.map +1 -0
- package/dist/cloud/types.js +3 -0
- package/dist/cloud/types.js.map +1 -0
- package/dist/config.d.ts +29 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +30 -0
- package/dist/config.js.map +1 -1
- package/dist/gateway/register-observability-gateway.d.ts +6 -4
- package/dist/gateway/register-observability-gateway.d.ts.map +1 -1
- package/dist/gateway/register-observability-gateway.js +143 -11
- package/dist/gateway/register-observability-gateway.js.map +1 -1
- package/dist/hooks/messages.d.ts +4 -3
- package/dist/hooks/messages.d.ts.map +1 -1
- package/dist/hooks/messages.js +23 -1
- package/dist/hooks/messages.js.map +1 -1
- package/dist/hooks/session.d.ts +4 -3
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +9 -4
- package/dist/hooks/session.js.map +1 -1
- package/dist/hooks/subagent.d.ts +4 -3
- package/dist/hooks/subagent.d.ts.map +1 -1
- package/dist/hooks/subagent.js +4 -1
- package/dist/hooks/subagent.js.map +1 -1
- package/dist/hooks/tools.d.ts +3 -3
- package/dist/hooks/tools.d.ts.map +1 -1
- package/dist/hooks/tools.js +122 -4
- package/dist/hooks/tools.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +542 -119
- package/dist/index.js.map +1 -1
- package/dist/llm/replay-runtime.d.ts +16 -0
- package/dist/llm/replay-runtime.d.ts.map +1 -0
- package/dist/llm/replay-runtime.js +596 -0
- package/dist/llm/replay-runtime.js.map +1 -0
- package/dist/llm/replay.d.ts +36 -0
- package/dist/llm/replay.d.ts.map +1 -0
- package/dist/llm/replay.js +289 -0
- package/dist/llm/replay.js.map +1 -0
- package/dist/redaction.d.ts +1 -1
- package/dist/redaction.js +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +3 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/session-context.d.ts +4 -3
- package/dist/runtime/session-context.d.ts.map +1 -1
- package/dist/runtime/session-context.js +37 -17
- package/dist/runtime/session-context.js.map +1 -1
- package/dist/security/chain-detector.d.ts +4 -4
- package/dist/security/chain-detector.d.ts.map +1 -1
- package/dist/security/chain-detector.js.map +1 -1
- package/dist/security/rules.d.ts +2 -2
- package/dist/security/rules.d.ts.map +1 -1
- package/dist/security/rules.js +9 -2
- package/dist/security/rules.js.map +1 -1
- package/dist/security/scanner.d.ts +8 -3
- package/dist/security/scanner.d.ts.map +1 -1
- package/dist/security/scanner.js +85 -7
- package/dist/security/scanner.js.map +1 -1
- package/dist/security/types.d.ts +4 -1
- package/dist/security/types.d.ts.map +1 -1
- package/dist/storage/buffer.d.ts +7 -7
- package/dist/storage/buffer.d.ts.map +1 -1
- package/dist/storage/buffer.js +2 -2
- package/dist/storage/buffer.js.map +1 -1
- package/dist/storage/cloud-export-writer.d.ts +23 -0
- package/dist/storage/cloud-export-writer.d.ts.map +1 -0
- package/dist/storage/cloud-export-writer.js +202 -0
- package/dist/storage/cloud-export-writer.js.map +1 -0
- package/dist/storage/duckdb-local-writer.d.ts +18 -3
- package/dist/storage/duckdb-local-writer.d.ts.map +1 -1
- package/dist/storage/duckdb-local-writer.js +233 -79
- package/dist/storage/duckdb-local-writer.js.map +1 -1
- package/dist/storage/duckdb-observability-forwarder.d.ts +16 -0
- package/dist/storage/duckdb-observability-forwarder.d.ts.map +1 -0
- package/dist/storage/duckdb-observability-forwarder.js +289 -0
- package/dist/storage/duckdb-observability-forwarder.js.map +1 -0
- package/dist/storage/mysql-writer.d.ts +35 -6
- package/dist/storage/mysql-writer.d.ts.map +1 -1
- package/dist/storage/mysql-writer.js +251 -32
- package/dist/storage/mysql-writer.js.map +1 -1
- package/dist/storage/noop-writer.d.ts +13 -0
- package/dist/storage/noop-writer.d.ts.map +1 -0
- package/dist/storage/noop-writer.js +28 -0
- package/dist/storage/noop-writer.js.map +1 -0
- package/dist/storage/schema.d.ts +2 -2
- package/dist/storage/schema.d.ts.map +1 -1
- package/dist/storage/schema.js +181 -53
- package/dist/storage/schema.js.map +1 -1
- package/dist/storage/structured-model.d.ts +11 -2
- package/dist/storage/structured-model.d.ts.map +1 -1
- package/dist/storage/structured-model.js +183 -5
- package/dist/storage/structured-model.js.map +1 -1
- package/dist/storage/writer.d.ts +14 -2
- package/dist/storage/writer.d.ts.map +1 -1
- package/dist/types.d.ts +28 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -1
- package/dist/types.js.map +1 -1
- package/dist/web/api.d.ts +102 -6
- package/dist/web/api.d.ts.map +1 -1
- package/dist/web/api.js +1024 -123
- package/dist/web/api.js.map +1 -1
- package/dist/web/routes.d.ts +22 -2
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +278 -21
- package/dist/web/routes.js.map +1 -1
- package/dist/web/ui.d.ts +3 -1
- package/dist/web/ui.d.ts.map +1 -1
- package/dist/web/ui.js +2754 -624
- package/dist/web/ui.js.map +1 -1
- package/openclaw.plugin.json +124 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# openclaw-observability
|
|
2
2
|
|
|
3
|
-
Full-stack observability plugin for [OpenClaw](https://openclaw.ai) — automatically records every LLM call, tool invocation, and agent lifecycle event into a local DuckDB or remote MySQL database, with a built-in web dashboard for tracing, analytics, and security
|
|
3
|
+
Full-stack observability plugin for [OpenClaw](https://openclaw.ai) — automatically records every LLM call, tool invocation, and agent lifecycle event into a local DuckDB or remote MySQL database, with a built-in web dashboard for tracing, analytics, and security monitoring.
|
|
4
4
|
|
|
5
5
|
## ✨ Features
|
|
6
6
|
|
|
@@ -144,9 +144,9 @@ Configure via OpenClaw Dashboard (Settings → Plugins → openclaw-observabilit
|
|
|
144
144
|
|
|
145
145
|
The plugin automatically creates three tables:
|
|
146
146
|
|
|
147
|
-
- **`
|
|
148
|
-
- **`
|
|
149
|
-
- **`
|
|
147
|
+
- **`observation_actions`** — Every recorded action (LLM call, tool invocation, etc.)
|
|
148
|
+
- **`observation_sessions`** — Aggregated session summaries (auto-updated)
|
|
149
|
+
- **`observation_alerts`** — Security alert records
|
|
150
150
|
|
|
151
151
|
Schema is identical between DuckDB and MySQL backends.
|
|
152
152
|
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { QueryPool } from '../storage/writer';
|
|
2
|
+
import { ApiKeyScope } from './types';
|
|
3
|
+
export declare function authenticateCloudApiKey(pool: QueryPool, authorization: string | undefined, opts?: {
|
|
4
|
+
secretSalt?: string;
|
|
5
|
+
}): Promise<ApiKeyScope>;
|
|
6
|
+
//# sourceMappingURL=api-key-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-key-auth.d.ts","sourceRoot":"","sources":["../../src/cloud/api-key-auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAwCtC,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,SAAS,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,WAAW,CAAC,CAsBtB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.authenticateCloudApiKey = authenticateCloudApiKey;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
function sha256(value) {
|
|
6
|
+
return (0, node_crypto_1.createHash)('sha256').update(value).digest('hex');
|
|
7
|
+
}
|
|
8
|
+
function parseAuth(authorization) {
|
|
9
|
+
const header = String(authorization || '').trim();
|
|
10
|
+
if (!header)
|
|
11
|
+
throw new Error('missing authorization header');
|
|
12
|
+
if (header.startsWith('Basic ')) {
|
|
13
|
+
const raw = Buffer.from(header.slice(6), 'base64').toString('utf8');
|
|
14
|
+
const i = raw.indexOf(':');
|
|
15
|
+
if (i <= 0)
|
|
16
|
+
throw new Error('invalid basic authorization format');
|
|
17
|
+
return {
|
|
18
|
+
publicKey: raw.slice(0, i),
|
|
19
|
+
secret: raw.slice(i + 1),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (header.startsWith('Bearer ')) {
|
|
23
|
+
const raw = header.slice(7).trim();
|
|
24
|
+
const i = raw.indexOf('.');
|
|
25
|
+
if (i <= 0)
|
|
26
|
+
throw new Error('invalid bearer authorization format');
|
|
27
|
+
return {
|
|
28
|
+
publicKey: raw.slice(0, i),
|
|
29
|
+
secret: raw.slice(i + 1),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
throw new Error('unsupported authorization scheme');
|
|
33
|
+
}
|
|
34
|
+
async function authenticateCloudApiKey(pool, authorization, opts) {
|
|
35
|
+
const { publicKey, secret } = parseAuth(authorization);
|
|
36
|
+
const hashed = sha256(`${secret}${opts?.secretSalt || ''}`);
|
|
37
|
+
const [rows] = await pool.query(`SELECT scope_id, hashed_secret_key, status, expires_at
|
|
38
|
+
FROM scope_api_keys
|
|
39
|
+
WHERE public_key = ?
|
|
40
|
+
LIMIT 1`, [publicKey]);
|
|
41
|
+
const row = (rows[0] || null);
|
|
42
|
+
if (!row)
|
|
43
|
+
throw new Error('api key not found');
|
|
44
|
+
if (String(row.status || '').toLowerCase() !== 'active')
|
|
45
|
+
throw new Error('api key is disabled');
|
|
46
|
+
if (row.expires_at && Date.parse(String(row.expires_at)) <= Date.now())
|
|
47
|
+
throw new Error('api key expired');
|
|
48
|
+
if (String(row.hashed_secret_key || '') !== hashed)
|
|
49
|
+
throw new Error('invalid api key secret');
|
|
50
|
+
return {
|
|
51
|
+
accessLevel: 'scope',
|
|
52
|
+
scopeId: row.scope_id,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=api-key-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-key-auth.js","sourceRoot":"","sources":["../../src/cloud/api-key-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CloudPrincipal } from './types';
|
|
2
|
+
export interface HeaderAuthInput {
|
|
3
|
+
authorization?: string;
|
|
4
|
+
organizationId?: string;
|
|
5
|
+
projectId?: string;
|
|
6
|
+
environment?: string;
|
|
7
|
+
userId?: string;
|
|
8
|
+
role?: CloudPrincipal['role'];
|
|
9
|
+
}
|
|
10
|
+
export declare function resolvePrincipalFromHeaders(input: HeaderAuthInput): CloudPrincipal;
|
|
11
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAc,MAAM,SAAS,CAAC;AAerD,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,GAAG,cAAc,CAiBlF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolvePrincipalFromHeaders = resolvePrincipalFromHeaders;
|
|
4
|
+
const ROLE_SCOPES = {
|
|
5
|
+
OWNER: [
|
|
6
|
+
'project:read', 'project:write', 'api-keys:read', 'api-keys:write',
|
|
7
|
+
'alerts:read', 'alerts:write', 'security-rules:read', 'security-rules:write', 'usage:read',
|
|
8
|
+
],
|
|
9
|
+
ADMIN: [
|
|
10
|
+
'project:read', 'project:write', 'api-keys:read', 'alerts:read', 'alerts:write',
|
|
11
|
+
'security-rules:read', 'security-rules:write', 'usage:read',
|
|
12
|
+
],
|
|
13
|
+
MEMBER: ['project:read', 'alerts:read', 'security-rules:read', 'usage:read'],
|
|
14
|
+
VIEWER: ['project:read', 'alerts:read', 'usage:read'],
|
|
15
|
+
};
|
|
16
|
+
function resolvePrincipalFromHeaders(input) {
|
|
17
|
+
const token = String(input.authorization || '');
|
|
18
|
+
if (!token.startsWith('Bearer ') || token.trim().length <= 10) {
|
|
19
|
+
throw new Error('unauthorized: missing bearer token');
|
|
20
|
+
}
|
|
21
|
+
const role = input.role || 'OWNER';
|
|
22
|
+
return {
|
|
23
|
+
principalId: input.userId || 'cloud-user',
|
|
24
|
+
role,
|
|
25
|
+
scopes: ROLE_SCOPES[role],
|
|
26
|
+
tenant: {
|
|
27
|
+
organizationId: input.organizationId || 'local',
|
|
28
|
+
projectId: input.projectId || 'default',
|
|
29
|
+
environment: input.environment || 'prod',
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":";;AAwBA,kEAiBC;AAvCD,MAAM,WAAW,GAAiD;IAChE,KAAK,EAAE;QACL,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB;QAClE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,YAAY;KAC3F;IACD,KAAK,EAAE;QACL,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc;QAC/E,qBAAqB,EAAE,sBAAsB,EAAE,YAAY;KAC5D;IACD,MAAM,EAAE,CAAC,cAAc,EAAE,aAAa,EAAE,qBAAqB,EAAE,YAAY,CAAC;IAC5E,MAAM,EAAE,CAAC,cAAc,EAAE,aAAa,EAAE,YAAY,CAAC;CACtD,CAAC;AAWF,SAAgB,2BAA2B,CAAC,KAAsB;IAChE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC;IACnC,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,MAAM,IAAI,YAAY;QACzC,IAAI;QACJ,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC;QACzB,MAAM,EAAE;YACN,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,OAAO;YAC/C,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,SAAS;YACvC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,MAAM;SACzC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ObservabilityAction } from '../types';
|
|
2
|
+
import { CloudPrincipal, IngestionEnvelope, TenantContext } from './types';
|
|
3
|
+
export interface CloudIngestionService {
|
|
4
|
+
authenticate(authorizationHeader: string | undefined): Promise<CloudPrincipal>;
|
|
5
|
+
ingest(batch: IngestionEnvelope[], principal: CloudPrincipal): Promise<{
|
|
6
|
+
accepted: number;
|
|
7
|
+
rejected: number;
|
|
8
|
+
}>;
|
|
9
|
+
}
|
|
10
|
+
export interface CloudExporter {
|
|
11
|
+
exportActions(actions: ObservabilityAction[], tenant: TenantContext): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export interface CloudQueryScope {
|
|
14
|
+
tenant: TenantContext;
|
|
15
|
+
principal: CloudPrincipal;
|
|
16
|
+
}
|
|
17
|
+
export interface CloudAuthorizer {
|
|
18
|
+
requireScope(principal: CloudPrincipal, scope: string): void;
|
|
19
|
+
}
|
|
20
|
+
export declare class ScopeDeniedError extends Error {
|
|
21
|
+
constructor(scope: string);
|
|
22
|
+
}
|
|
23
|
+
export declare class DefaultCloudAuthorizer implements CloudAuthorizer {
|
|
24
|
+
requireScope(principal: CloudPrincipal, scope: string): void;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/cloud/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,mBAAmB,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/E,MAAM,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC;QACrE,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,OAAO,EAAE,mBAAmB,EAAE,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9D;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,KAAK,EAAE,MAAM;CAI1B;AAED,qBAAa,sBAAuB,YAAW,eAAe;IAC5D,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;CAK7D"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DefaultCloudAuthorizer = exports.ScopeDeniedError = void 0;
|
|
4
|
+
class ScopeDeniedError extends Error {
|
|
5
|
+
constructor(scope) {
|
|
6
|
+
super(`permission denied for scope: ${scope}`);
|
|
7
|
+
this.name = 'ScopeDeniedError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.ScopeDeniedError = ScopeDeniedError;
|
|
11
|
+
class DefaultCloudAuthorizer {
|
|
12
|
+
requireScope(principal, scope) {
|
|
13
|
+
if (!principal.scopes.includes(scope)) {
|
|
14
|
+
throw new ScopeDeniedError(scope);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.DefaultCloudAuthorizer = DefaultCloudAuthorizer;
|
|
19
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/cloud/contracts.ts"],"names":[],"mappings":";;;AAwBA,MAAa,gBAAiB,SAAQ,KAAK;IACzC,YAAY,KAAa;QACvB,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AALD,4CAKC;AAED,MAAa,sBAAsB;IACjC,YAAY,CAAC,SAAyB,EAAE,KAAa;QACnD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAY,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;CACF;AAND,wDAMC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cloud/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./types"), exports);
|
|
18
|
+
__exportStar(require("./contracts"), exports);
|
|
19
|
+
__exportStar(require("./auth"), exports);
|
|
20
|
+
__exportStar(require("./api-key-auth"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cloud/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,8CAA4B;AAC5B,yCAAuB;AACvB,iDAA+B"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type CloudRole = 'OWNER' | 'ADMIN' | 'MEMBER' | 'VIEWER';
|
|
2
|
+
export type CloudScope = 'project:read' | 'project:write' | 'api-keys:read' | 'api-keys:write' | 'alerts:read' | 'alerts:write' | 'security-rules:read' | 'security-rules:write' | 'usage:read';
|
|
3
|
+
export interface TenantContext {
|
|
4
|
+
organizationId: string;
|
|
5
|
+
projectId: string;
|
|
6
|
+
environment: string;
|
|
7
|
+
}
|
|
8
|
+
export interface CloudPrincipal {
|
|
9
|
+
principalId: string;
|
|
10
|
+
role: CloudRole;
|
|
11
|
+
scopes: CloudScope[];
|
|
12
|
+
tenant: TenantContext;
|
|
13
|
+
}
|
|
14
|
+
export interface ApiKeyScope {
|
|
15
|
+
accessLevel: 'scope';
|
|
16
|
+
scopeId: string | null;
|
|
17
|
+
}
|
|
18
|
+
export interface IngestionEnvelope {
|
|
19
|
+
eventId: string;
|
|
20
|
+
idempotencyKey: string;
|
|
21
|
+
occurredAt: string;
|
|
22
|
+
source: string;
|
|
23
|
+
tenant: TenantContext;
|
|
24
|
+
sessionId?: string;
|
|
25
|
+
traceId?: string;
|
|
26
|
+
type: string;
|
|
27
|
+
payload: Record<string, unknown>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cloud/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhE,MAAM,MAAM,UAAU,GAClB,cAAc,GACd,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,aAAa,GACb,cAAc,GACd,qBAAqB,GACrB,sBAAsB,GACtB,YAAY,CAAC;AAEjB,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cloud/types.ts"],"names":[],"mappings":""}
|
package/dist/config.d.ts
CHANGED
|
@@ -65,13 +65,37 @@ export interface MetricsConfig {
|
|
|
65
65
|
otlpPath: string;
|
|
66
66
|
/** Max payload size for OTLP metrics requests */
|
|
67
67
|
maxPayloadBytes: number;
|
|
68
|
+
/** Keep metrics data for at most N days (<=0 disables cleanup) */
|
|
69
|
+
retentionDays: number;
|
|
70
|
+
}
|
|
71
|
+
/** Cloud mode config */
|
|
72
|
+
export interface CloudConfig {
|
|
73
|
+
enabled: boolean;
|
|
74
|
+
endpoint: string;
|
|
75
|
+
apiKey: string;
|
|
76
|
+
organizationId: string;
|
|
77
|
+
projectId: string;
|
|
78
|
+
environment: string;
|
|
79
|
+
batchMaxBytes: number;
|
|
80
|
+
flushIntervalMs: number;
|
|
68
81
|
}
|
|
69
82
|
/** Full plugin config */
|
|
70
|
-
export interface
|
|
71
|
-
/** Storage mode: local (embedded, zero config) | remote (external MySQL) */
|
|
72
|
-
mode: 'local' | 'remote';
|
|
83
|
+
export interface ObservabilityPluginConfig {
|
|
84
|
+
/** Storage mode: local (embedded, zero config) | remote (external MySQL) | cloud (export-only) */
|
|
85
|
+
mode: 'local' | 'remote' | 'cloud';
|
|
86
|
+
/** Delete observation/security/trace data older than N days during writer startup (<=0 disables cleanup) */
|
|
87
|
+
dataRetentionDays: number;
|
|
88
|
+
/** Tenant scope identifier used for writes and query defaults */
|
|
89
|
+
scopeId: string;
|
|
90
|
+
/** Secret token used to prove ownership of scopeId in shared remote DB */
|
|
91
|
+
scopeToken: string;
|
|
92
|
+
/** Optional compatibility fields kept for existing data model */
|
|
93
|
+
organizationId: string;
|
|
94
|
+
/** Optional environment marker */
|
|
95
|
+
environment: string;
|
|
73
96
|
mysql: MySQLConfig;
|
|
74
97
|
duckdb: DuckDBConfig;
|
|
98
|
+
cloud: CloudConfig;
|
|
75
99
|
buffer: BufferConfig;
|
|
76
100
|
redaction: RedactionConfig;
|
|
77
101
|
security: SecurityPluginConfig;
|
|
@@ -82,6 +106,6 @@ export interface AuditPluginConfig {
|
|
|
82
106
|
* OpenClaw's hot-reload file watcher on the top-level ~/.openclaw/ dir */
|
|
83
107
|
export declare const DEFAULT_DUCKDB_PATH: string;
|
|
84
108
|
/** Default config */
|
|
85
|
-
export declare const DEFAULT_CONFIG:
|
|
86
|
-
export declare function resolveConfig(userConfig: Partial<
|
|
109
|
+
export declare const DEFAULT_CONFIG: ObservabilityPluginConfig;
|
|
110
|
+
export declare function resolveConfig(userConfig: Partial<ObservabilityPluginConfig> | undefined): ObservabilityPluginConfig;
|
|
87
111
|
//# sourceMappingURL=config.d.ts.map
|
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;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,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -46,6 +46,11 @@ exports.DEFAULT_DUCKDB_PATH = path.join(os.homedir(), '.openclaw', 'data', 'obse
|
|
|
46
46
|
/** Default config */
|
|
47
47
|
exports.DEFAULT_CONFIG = {
|
|
48
48
|
mode: 'local', // default: local DuckDB, zero config
|
|
49
|
+
dataRetentionDays: 30,
|
|
50
|
+
scopeId: 'local',
|
|
51
|
+
scopeToken: '',
|
|
52
|
+
organizationId: 'local',
|
|
53
|
+
environment: 'prod',
|
|
49
54
|
mysql: {
|
|
50
55
|
host: 'localhost',
|
|
51
56
|
port: 3306,
|
|
@@ -56,6 +61,16 @@ exports.DEFAULT_CONFIG = {
|
|
|
56
61
|
duckdb: {
|
|
57
62
|
path: exports.DEFAULT_DUCKDB_PATH,
|
|
58
63
|
},
|
|
64
|
+
cloud: {
|
|
65
|
+
enabled: false,
|
|
66
|
+
endpoint: '',
|
|
67
|
+
apiKey: '',
|
|
68
|
+
organizationId: 'local',
|
|
69
|
+
projectId: 'default',
|
|
70
|
+
environment: 'prod',
|
|
71
|
+
batchMaxBytes: 512 * 1024,
|
|
72
|
+
flushIntervalMs: 2000,
|
|
73
|
+
},
|
|
59
74
|
buffer: {
|
|
60
75
|
batchSize: 50,
|
|
61
76
|
flushIntervalMs: 5000,
|
|
@@ -97,17 +112,21 @@ exports.DEFAULT_CONFIG = {
|
|
|
97
112
|
enabled: true,
|
|
98
113
|
otlpPath: '/plugins/observability/api/otel',
|
|
99
114
|
maxPayloadBytes: 2 * 1024 * 1024,
|
|
115
|
+
retentionDays: 30,
|
|
100
116
|
},
|
|
101
117
|
};
|
|
102
118
|
/**
|
|
103
119
|
* Smart mode inference:
|
|
104
120
|
* - User explicitly specified -> use user value
|
|
121
|
+
* - cloud.enabled=true -> cloud mode
|
|
105
122
|
* - Not specified but valid MySQL config provided -> auto-switch to remote
|
|
106
123
|
* - Otherwise -> local (zero config)
|
|
107
124
|
*/
|
|
108
125
|
function inferMode(userConfig) {
|
|
109
126
|
if (userConfig.mode)
|
|
110
127
|
return userConfig.mode;
|
|
128
|
+
if (userConfig.cloud?.enabled)
|
|
129
|
+
return 'cloud';
|
|
111
130
|
const m = userConfig.mysql;
|
|
112
131
|
if (m && m.host && m.host !== 'localhost' && m.password)
|
|
113
132
|
return 'remote';
|
|
@@ -119,6 +138,13 @@ function resolveConfig(userConfig) {
|
|
|
119
138
|
}
|
|
120
139
|
return {
|
|
121
140
|
mode: inferMode(userConfig),
|
|
141
|
+
dataRetentionDays: Number.isFinite(Number(userConfig.dataRetentionDays))
|
|
142
|
+
? Math.max(0, Math.floor(Number(userConfig.dataRetentionDays)))
|
|
143
|
+
: exports.DEFAULT_CONFIG.dataRetentionDays,
|
|
144
|
+
scopeId: String((userConfig.scopeId ?? exports.DEFAULT_CONFIG.scopeId) || 'local'),
|
|
145
|
+
scopeToken: String((userConfig.scopeToken ?? exports.DEFAULT_CONFIG.scopeToken) || ''),
|
|
146
|
+
organizationId: String((userConfig.organizationId ?? exports.DEFAULT_CONFIG.organizationId) || 'local'),
|
|
147
|
+
environment: String((userConfig.environment ?? exports.DEFAULT_CONFIG.environment) || 'prod'),
|
|
122
148
|
mysql: {
|
|
123
149
|
...exports.DEFAULT_CONFIG.mysql,
|
|
124
150
|
...userConfig.mysql,
|
|
@@ -127,6 +153,10 @@ function resolveConfig(userConfig) {
|
|
|
127
153
|
...exports.DEFAULT_CONFIG.duckdb,
|
|
128
154
|
...userConfig.duckdb,
|
|
129
155
|
},
|
|
156
|
+
cloud: {
|
|
157
|
+
...exports.DEFAULT_CONFIG.cloud,
|
|
158
|
+
...userConfig.cloud,
|
|
159
|
+
},
|
|
130
160
|
buffer: {
|
|
131
161
|
...exports.DEFAULT_CONFIG.buffer,
|
|
132
162
|
...userConfig.buffer,
|
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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"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ObservabilityPluginConfig } from '../config';
|
|
2
2
|
import { SecurityConfig, SecurityScanner } from '../security/scanner';
|
|
3
|
-
import {
|
|
3
|
+
import { ObservabilityWriter } from '../storage/writer';
|
|
4
4
|
export declare function registerObservabilityGatewayMethods(params: {
|
|
5
5
|
registerGatewayMethod: (method: string, handler: (ctx: {
|
|
6
6
|
params?: unknown;
|
|
7
7
|
respond: (ok: boolean, payload: unknown) => void;
|
|
8
8
|
[key: string]: unknown;
|
|
9
9
|
}) => void | Promise<void>) => void;
|
|
10
|
-
writer:
|
|
11
|
-
config:
|
|
10
|
+
writer: ObservabilityWriter;
|
|
11
|
+
config: ObservabilityPluginConfig;
|
|
12
12
|
securityScanner: SecurityScanner;
|
|
13
13
|
persistSecurityConfig: (next: SecurityConfig) => void;
|
|
14
|
+
openclawConfigPath: string;
|
|
15
|
+
runtime?: unknown;
|
|
14
16
|
}): void;
|
|
15
17
|
//# sourceMappingURL=register-observability-gateway.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-observability-gateway.d.ts","sourceRoot":"","sources":["../../src/gateway/register-observability-gateway.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"register-observability-gateway.d.ts","sourceRoot":"","sources":["../../src/gateway/register-observability-gateway.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAqBxD,wBAAgB,mCAAmC,CAAC,MAAM,EAAE;IAC1D,qBAAqB,EAAE,CACrB,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,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,yBAAyB,CAAC;IAClC,eAAe,EAAE,eAAe,CAAC;IACjC,qBAAqB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACtD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,IAAI,CA2fP"}
|