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.
Files changed (132) hide show
  1. package/README.md +4 -4
  2. package/dist/cloud/api-key-auth.d.ts +6 -0
  3. package/dist/cloud/api-key-auth.d.ts.map +1 -0
  4. package/dist/cloud/api-key-auth.js +55 -0
  5. package/dist/cloud/api-key-auth.js.map +1 -0
  6. package/dist/cloud/auth.d.ts +11 -0
  7. package/dist/cloud/auth.d.ts.map +1 -0
  8. package/dist/cloud/auth.js +33 -0
  9. package/dist/cloud/auth.js.map +1 -0
  10. package/dist/cloud/contracts.d.ts +26 -0
  11. package/dist/cloud/contracts.d.ts.map +1 -0
  12. package/dist/cloud/contracts.js +19 -0
  13. package/dist/cloud/contracts.js.map +1 -0
  14. package/dist/cloud/index.d.ts +5 -0
  15. package/dist/cloud/index.d.ts.map +1 -0
  16. package/dist/cloud/index.js +21 -0
  17. package/dist/cloud/index.js.map +1 -0
  18. package/dist/cloud/types.d.ts +29 -0
  19. package/dist/cloud/types.d.ts.map +1 -0
  20. package/dist/cloud/types.js +3 -0
  21. package/dist/cloud/types.js.map +1 -0
  22. package/dist/config.d.ts +29 -5
  23. package/dist/config.d.ts.map +1 -1
  24. package/dist/config.js +30 -0
  25. package/dist/config.js.map +1 -1
  26. package/dist/gateway/register-observability-gateway.d.ts +6 -4
  27. package/dist/gateway/register-observability-gateway.d.ts.map +1 -1
  28. package/dist/gateway/register-observability-gateway.js +143 -11
  29. package/dist/gateway/register-observability-gateway.js.map +1 -1
  30. package/dist/hooks/messages.d.ts +4 -3
  31. package/dist/hooks/messages.d.ts.map +1 -1
  32. package/dist/hooks/messages.js +23 -1
  33. package/dist/hooks/messages.js.map +1 -1
  34. package/dist/hooks/session.d.ts +4 -3
  35. package/dist/hooks/session.d.ts.map +1 -1
  36. package/dist/hooks/session.js +9 -4
  37. package/dist/hooks/session.js.map +1 -1
  38. package/dist/hooks/subagent.d.ts +4 -3
  39. package/dist/hooks/subagent.d.ts.map +1 -1
  40. package/dist/hooks/subagent.js +4 -1
  41. package/dist/hooks/subagent.js.map +1 -1
  42. package/dist/hooks/tools.d.ts +3 -3
  43. package/dist/hooks/tools.d.ts.map +1 -1
  44. package/dist/hooks/tools.js +122 -4
  45. package/dist/hooks/tools.js.map +1 -1
  46. package/dist/index.d.ts +2 -2
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +542 -119
  49. package/dist/index.js.map +1 -1
  50. package/dist/llm/replay-runtime.d.ts +16 -0
  51. package/dist/llm/replay-runtime.d.ts.map +1 -0
  52. package/dist/llm/replay-runtime.js +596 -0
  53. package/dist/llm/replay-runtime.js.map +1 -0
  54. package/dist/llm/replay.d.ts +36 -0
  55. package/dist/llm/replay.d.ts.map +1 -0
  56. package/dist/llm/replay.js +289 -0
  57. package/dist/llm/replay.js.map +1 -0
  58. package/dist/redaction.d.ts +1 -1
  59. package/dist/redaction.js +1 -1
  60. package/dist/runtime/index.d.ts +1 -1
  61. package/dist/runtime/index.d.ts.map +1 -1
  62. package/dist/runtime/index.js +3 -1
  63. package/dist/runtime/index.js.map +1 -1
  64. package/dist/runtime/session-context.d.ts +4 -3
  65. package/dist/runtime/session-context.d.ts.map +1 -1
  66. package/dist/runtime/session-context.js +37 -17
  67. package/dist/runtime/session-context.js.map +1 -1
  68. package/dist/security/chain-detector.d.ts +4 -4
  69. package/dist/security/chain-detector.d.ts.map +1 -1
  70. package/dist/security/chain-detector.js.map +1 -1
  71. package/dist/security/rules.d.ts +2 -2
  72. package/dist/security/rules.d.ts.map +1 -1
  73. package/dist/security/rules.js +9 -2
  74. package/dist/security/rules.js.map +1 -1
  75. package/dist/security/scanner.d.ts +8 -3
  76. package/dist/security/scanner.d.ts.map +1 -1
  77. package/dist/security/scanner.js +85 -7
  78. package/dist/security/scanner.js.map +1 -1
  79. package/dist/security/types.d.ts +4 -1
  80. package/dist/security/types.d.ts.map +1 -1
  81. package/dist/storage/buffer.d.ts +7 -7
  82. package/dist/storage/buffer.d.ts.map +1 -1
  83. package/dist/storage/buffer.js +2 -2
  84. package/dist/storage/buffer.js.map +1 -1
  85. package/dist/storage/cloud-export-writer.d.ts +23 -0
  86. package/dist/storage/cloud-export-writer.d.ts.map +1 -0
  87. package/dist/storage/cloud-export-writer.js +202 -0
  88. package/dist/storage/cloud-export-writer.js.map +1 -0
  89. package/dist/storage/duckdb-local-writer.d.ts +18 -3
  90. package/dist/storage/duckdb-local-writer.d.ts.map +1 -1
  91. package/dist/storage/duckdb-local-writer.js +233 -79
  92. package/dist/storage/duckdb-local-writer.js.map +1 -1
  93. package/dist/storage/duckdb-observability-forwarder.d.ts +16 -0
  94. package/dist/storage/duckdb-observability-forwarder.d.ts.map +1 -0
  95. package/dist/storage/duckdb-observability-forwarder.js +289 -0
  96. package/dist/storage/duckdb-observability-forwarder.js.map +1 -0
  97. package/dist/storage/mysql-writer.d.ts +35 -6
  98. package/dist/storage/mysql-writer.d.ts.map +1 -1
  99. package/dist/storage/mysql-writer.js +251 -32
  100. package/dist/storage/mysql-writer.js.map +1 -1
  101. package/dist/storage/noop-writer.d.ts +13 -0
  102. package/dist/storage/noop-writer.d.ts.map +1 -0
  103. package/dist/storage/noop-writer.js +28 -0
  104. package/dist/storage/noop-writer.js.map +1 -0
  105. package/dist/storage/schema.d.ts +2 -2
  106. package/dist/storage/schema.d.ts.map +1 -1
  107. package/dist/storage/schema.js +181 -53
  108. package/dist/storage/schema.js.map +1 -1
  109. package/dist/storage/structured-model.d.ts +11 -2
  110. package/dist/storage/structured-model.d.ts.map +1 -1
  111. package/dist/storage/structured-model.js +183 -5
  112. package/dist/storage/structured-model.js.map +1 -1
  113. package/dist/storage/writer.d.ts +14 -2
  114. package/dist/storage/writer.d.ts.map +1 -1
  115. package/dist/types.d.ts +28 -4
  116. package/dist/types.d.ts.map +1 -1
  117. package/dist/types.js +3 -1
  118. package/dist/types.js.map +1 -1
  119. package/dist/web/api.d.ts +102 -6
  120. package/dist/web/api.d.ts.map +1 -1
  121. package/dist/web/api.js +1024 -123
  122. package/dist/web/api.js.map +1 -1
  123. package/dist/web/routes.d.ts +22 -2
  124. package/dist/web/routes.d.ts.map +1 -1
  125. package/dist/web/routes.js +278 -21
  126. package/dist/web/routes.js.map +1 -1
  127. package/dist/web/ui.d.ts +3 -1
  128. package/dist/web/ui.d.ts.map +1 -1
  129. package/dist/web/ui.js +2754 -624
  130. package/dist/web/ui.js.map +1 -1
  131. package/openclaw.plugin.json +124 -3
  132. 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 auditing.
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
- - **`audit_actions`** — Every recorded action (LLM call, tool invocation, etc.)
148
- - **`audit_sessions`** — Aggregated session summaries (auto-updated)
149
- - **`audit_alerts`** — Security alert records
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,5 @@
1
+ export * from './types';
2
+ export * from './contracts';
3
+ export * from './auth';
4
+ export * from './api-key-auth';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -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 AuditPluginConfig {
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: AuditPluginConfig;
86
- export declare function resolveConfig(userConfig: Partial<AuditPluginConfig> | undefined): AuditPluginConfig;
109
+ export declare const DEFAULT_CONFIG: ObservabilityPluginConfig;
110
+ export declare function resolveConfig(userConfig: Partial<ObservabilityPluginConfig> | undefined): ObservabilityPluginConfig;
87
111
  //# sourceMappingURL=config.d.ts.map
@@ -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,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"}
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,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,17 @@
1
- import { AuditPluginConfig } from '../config';
1
+ import { ObservabilityPluginConfig } from '../config';
2
2
  import { SecurityConfig, SecurityScanner } from '../security/scanner';
3
- import { AuditWriter } from '../storage/writer';
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: AuditWriter;
11
- config: AuditPluginConfig;
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,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAgBhD,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,WAAW,CAAC;IACpB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,eAAe,EAAE,eAAe,CAAC;IACjC,qBAAqB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;CACvD,GAAG,IAAI,CA6WP"}
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"}