@steadwing/openalerts 0.2.5 → 0.2.7

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 (104) hide show
  1. package/README.md +198 -141
  2. package/dist/channels/console.d.ts +6 -0
  3. package/dist/channels/console.d.ts.map +1 -0
  4. package/dist/channels/console.js +10 -0
  5. package/dist/channels/console.js.map +1 -0
  6. package/dist/channels/telegram.d.ts +12 -0
  7. package/dist/channels/telegram.d.ts.map +1 -0
  8. package/dist/channels/telegram.js +28 -0
  9. package/dist/channels/telegram.js.map +1 -0
  10. package/dist/channels/webhook.d.ts +8 -0
  11. package/dist/channels/webhook.d.ts.map +1 -0
  12. package/dist/channels/webhook.js +15 -0
  13. package/dist/channels/webhook.js.map +1 -0
  14. package/dist/cli.d.ts +3 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +234 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/config.d.ts +51 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +86 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/core/alert-channel.d.ts +3 -10
  23. package/dist/core/alert-channel.d.ts.map +1 -0
  24. package/dist/core/alert-channel.js +9 -30
  25. package/dist/core/alert-channel.js.map +1 -0
  26. package/dist/core/bounded-map.d.ts +1 -0
  27. package/dist/core/bounded-map.d.ts.map +1 -0
  28. package/dist/core/bounded-map.js +1 -0
  29. package/dist/core/bounded-map.js.map +1 -0
  30. package/dist/core/engine.d.ts +6 -18
  31. package/dist/core/engine.d.ts.map +1 -0
  32. package/dist/core/engine.js +48 -98
  33. package/dist/core/engine.js.map +1 -0
  34. package/dist/core/evaluator.d.ts +1 -0
  35. package/dist/core/evaluator.d.ts.map +1 -0
  36. package/dist/core/evaluator.js +1 -0
  37. package/dist/core/evaluator.js.map +1 -0
  38. package/dist/core/event-bus.d.ts +1 -0
  39. package/dist/core/event-bus.d.ts.map +1 -0
  40. package/dist/core/event-bus.js +1 -0
  41. package/dist/core/event-bus.js.map +1 -0
  42. package/dist/core/formatter.d.ts +1 -0
  43. package/dist/core/formatter.d.ts.map +1 -0
  44. package/dist/core/formatter.js +1 -0
  45. package/dist/core/formatter.js.map +1 -0
  46. package/dist/core/rules.d.ts +1 -0
  47. package/dist/core/rules.d.ts.map +1 -0
  48. package/dist/core/rules.js +1 -0
  49. package/dist/core/rules.js.map +1 -0
  50. package/dist/core/store.d.ts +6 -9
  51. package/dist/core/store.d.ts.map +1 -0
  52. package/dist/core/store.js +43 -96
  53. package/dist/core/store.js.map +1 -0
  54. package/dist/core/types.d.ts +1 -0
  55. package/dist/core/types.d.ts.map +1 -0
  56. package/dist/core/types.js +1 -0
  57. package/dist/core/types.js.map +1 -0
  58. package/dist/db/index.d.ts +6 -0
  59. package/dist/db/index.d.ts.map +1 -0
  60. package/dist/db/index.js +31 -0
  61. package/dist/db/index.js.map +1 -0
  62. package/dist/db/queries.d.ts +157 -0
  63. package/dist/db/queries.d.ts.map +1 -0
  64. package/dist/db/queries.js +227 -0
  65. package/dist/db/queries.js.map +1 -0
  66. package/dist/db/schema.d.ts +5 -0
  67. package/dist/db/schema.d.ts.map +1 -0
  68. package/dist/db/schema.js +177 -0
  69. package/dist/db/schema.js.map +1 -0
  70. package/dist/readers/openclaw.d.ts +11 -0
  71. package/dist/readers/openclaw.d.ts.map +1 -0
  72. package/dist/readers/openclaw.js +267 -0
  73. package/dist/readers/openclaw.js.map +1 -0
  74. package/dist/server/dashboard.d.ts +2 -0
  75. package/dist/server/dashboard.d.ts.map +1 -0
  76. package/dist/server/dashboard.js +765 -0
  77. package/dist/server/dashboard.js.map +1 -0
  78. package/dist/server/index.d.ts +10 -0
  79. package/dist/server/index.d.ts.map +1 -0
  80. package/dist/server/index.js +28 -0
  81. package/dist/server/index.js.map +1 -0
  82. package/dist/server/routes.d.ts +6 -0
  83. package/dist/server/routes.d.ts.map +1 -0
  84. package/dist/server/routes.js +146 -0
  85. package/dist/server/routes.js.map +1 -0
  86. package/dist/server/sse.d.ts +21 -0
  87. package/dist/server/sse.d.ts.map +1 -0
  88. package/dist/server/sse.js +53 -0
  89. package/dist/server/sse.js.map +1 -0
  90. package/dist/watchers/files.d.ts +19 -0
  91. package/dist/watchers/files.d.ts.map +1 -0
  92. package/dist/watchers/files.js +105 -0
  93. package/dist/watchers/files.js.map +1 -0
  94. package/dist/watchers/gateway-adapter.d.ts +18 -0
  95. package/dist/watchers/gateway-adapter.d.ts.map +1 -0
  96. package/dist/watchers/gateway-adapter.js +274 -0
  97. package/dist/watchers/gateway-adapter.js.map +1 -0
  98. package/dist/watchers/gateway.d.ts +27 -0
  99. package/dist/watchers/gateway.d.ts.map +1 -0
  100. package/dist/watchers/gateway.js +131 -0
  101. package/dist/watchers/gateway.js.map +1 -0
  102. package/package.json +21 -43
  103. package/LICENSE +0 -201
  104. package/openclaw.plugin.json +0 -87
@@ -0,0 +1,6 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ export type DB = DatabaseSync;
3
+ export declare function openDb(stateDir: string): DatabaseSync;
4
+ export declare function getDb(): DatabaseSync;
5
+ export declare function pruneDb(db: DatabaseSync): void;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,MAAM,MAAM,EAAE,GAAG,YAAY,CAAC;AAI9B,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAOrD;AAED,wBAAgB,KAAK,IAAI,YAAY,CAGpC;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAW9C"}
@@ -0,0 +1,31 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { SCHEMA_SQL, PRUNE_DIAGNOSTICS_SQL, PRUNE_HEARTBEATS_SQL } from "./schema.js";
5
+ let _db = null;
6
+ export function openDb(stateDir) {
7
+ fs.mkdirSync(stateDir, { recursive: true });
8
+ const dbPath = path.join(stateDir, "openalerts.db");
9
+ const db = new DatabaseSync(dbPath);
10
+ db.exec(SCHEMA_SQL);
11
+ _db = db;
12
+ return db;
13
+ }
14
+ export function getDb() {
15
+ if (!_db)
16
+ throw new Error("DB not initialized — call openDb() first");
17
+ return _db;
18
+ }
19
+ export function pruneDb(db) {
20
+ db.exec(PRUNE_DIAGNOSTICS_SQL);
21
+ db.exec(PRUNE_HEARTBEATS_SQL);
22
+ // Prune cron runs older than 30 days
23
+ const cutoff = Date.now() - 30 * 24 * 60 * 60 * 1000;
24
+ db.prepare("DELETE FROM cron_runs WHERE ts < ?").run(cutoff);
25
+ // Prune actions older than 7 days
26
+ const actionCutoff = Date.now() - 7 * 24 * 60 * 60 * 1000;
27
+ db.prepare("DELETE FROM actions WHERE ts < ?").run(actionCutoff);
28
+ // Prune daily_metrics older than 90 days
29
+ db.prepare("DELETE FROM daily_metrics WHERE hour_ts < ?").run(cutoff);
30
+ }
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAItF,IAAI,GAAG,GAAwB,IAAI,CAAC;AAEpC,MAAM,UAAU,MAAM,CAAC,QAAgB;IACrC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpB,GAAG,GAAG,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,KAAK;IACnB,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACtE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAgB;IACtC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC/B,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC9B,qCAAqC;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACrD,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7D,kCAAkC;IAClC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1D,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACjE,yCAAyC;IACzC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,157 @@
1
+ import type { DatabaseSync } from "node:sqlite";
2
+ export interface AgentInfoRow {
3
+ agent_id: string;
4
+ name?: string;
5
+ emoji?: string;
6
+ soul_md?: string;
7
+ heartbeat_md?: string;
8
+ memory_md?: string;
9
+ identity_md?: string;
10
+ user_md?: string;
11
+ agents_md?: string;
12
+ tools_md?: string;
13
+ updated_at: number;
14
+ }
15
+ export declare function upsertAgentInfo(db: DatabaseSync, row: AgentInfoRow): void;
16
+ export declare function getAllAgents(db: DatabaseSync): AgentInfoRow[];
17
+ export interface CronJobRow {
18
+ id: string;
19
+ agent_id?: string;
20
+ name?: string;
21
+ description?: string;
22
+ schedule_expr?: string;
23
+ schedule_tz?: string;
24
+ last_run_at?: number;
25
+ last_status?: string;
26
+ last_error?: string;
27
+ next_run_at?: number;
28
+ consecutive_errors?: number;
29
+ updated_at: number;
30
+ }
31
+ export declare function upsertCronJob(db: DatabaseSync, row: CronJobRow): void;
32
+ export declare function getAllCronJobs(db: DatabaseSync): CronJobRow[];
33
+ export interface CronRunRow {
34
+ job_id: string;
35
+ ts: number;
36
+ action?: string;
37
+ status?: string;
38
+ error?: string;
39
+ duration_ms?: number;
40
+ session_id?: string;
41
+ session_key?: string;
42
+ next_run_at?: number;
43
+ }
44
+ export declare function insertCronRun(db: DatabaseSync, row: CronRunRow): void;
45
+ export declare function getRecentCronRuns(db: DatabaseSync, jobId: string, limit?: number): CronRunRow[];
46
+ export interface SessionRow {
47
+ session_key: string;
48
+ agent_id?: string;
49
+ platform?: string;
50
+ recipient?: string;
51
+ is_group?: number;
52
+ last_activity_at?: number;
53
+ status?: string;
54
+ message_count?: number;
55
+ total_cost_usd?: number;
56
+ total_input_tokens?: number;
57
+ total_output_tokens?: number;
58
+ updated_at: number;
59
+ }
60
+ export declare function upsertSession(db: DatabaseSync, row: SessionRow): void;
61
+ export declare function getAllSessions(db: DatabaseSync): SessionRow[];
62
+ export interface ActionRow {
63
+ id: string;
64
+ run_id?: string;
65
+ session_key?: string;
66
+ seq?: number;
67
+ type?: string;
68
+ event_type?: string;
69
+ ts: number;
70
+ duration_ms?: number;
71
+ tool_name?: string;
72
+ input_tokens?: number;
73
+ output_tokens?: number;
74
+ cost_usd?: number;
75
+ model?: string;
76
+ provider?: string;
77
+ outcome?: string;
78
+ error?: string;
79
+ }
80
+ export declare function upsertAction(db: DatabaseSync, row: ActionRow): void;
81
+ export declare function getRecentActions(db: DatabaseSync, limit?: number, sessionKey?: string): ActionRow[];
82
+ export interface AlertRow {
83
+ id: string;
84
+ rule_id: string;
85
+ severity: string;
86
+ title: string;
87
+ detail?: string;
88
+ ts: number;
89
+ fingerprint: string;
90
+ }
91
+ export declare function upsertAlert(db: DatabaseSync, row: AlertRow): void;
92
+ export declare function getRecentAlerts(db: DatabaseSync, limit?: number): AlertRow[];
93
+ export interface DiagnosticRow {
94
+ event_type: string;
95
+ ts: number;
96
+ summary?: string;
97
+ channel?: string;
98
+ session_key?: string;
99
+ agent_id?: string;
100
+ }
101
+ export declare function insertDiagnostic(db: DatabaseSync, row: DiagnosticRow): void;
102
+ export declare function getRecentDiagnostics(db: DatabaseSync, limit?: number): DiagnosticRow[];
103
+ export interface HeartbeatRow {
104
+ ts: number;
105
+ status?: string;
106
+ gateway_connected?: number;
107
+ queue_depth?: number;
108
+ active_sessions?: number;
109
+ }
110
+ export declare function insertHeartbeat(db: DatabaseSync, row: HeartbeatRow): void;
111
+ export declare function getRecentHeartbeats(db: DatabaseSync, limit?: number): HeartbeatRow[];
112
+ export interface ActivityEntry {
113
+ ts: number;
114
+ source: "action" | "diagnostic";
115
+ /** action type (start/complete/tool_call…) or diagnostic event_type */
116
+ event_type: string;
117
+ /** e.g. "agent", "tool", "llm", "infra" */
118
+ subsystem: string;
119
+ /** human-readable message */
120
+ message: string;
121
+ session_key?: string;
122
+ run_id?: string;
123
+ tool_name?: string;
124
+ duration_ms?: number;
125
+ input_tokens?: number;
126
+ output_tokens?: number;
127
+ summary?: string;
128
+ channel?: string;
129
+ }
130
+ export declare function getActivityLog(db: DatabaseSync, limit?: number, sessionKey?: string): ActivityEntry[];
131
+ export interface DeliveryQueueRow {
132
+ id: string;
133
+ channel?: string;
134
+ to_address?: string;
135
+ text?: string;
136
+ enqueued_at?: number;
137
+ retry_count?: number;
138
+ last_error?: string;
139
+ status?: string;
140
+ updated_at: number;
141
+ }
142
+ export declare function upsertDeliveryItem(db: DatabaseSync, row: DeliveryQueueRow): void;
143
+ export declare function getPendingDeliveries(db: DatabaseSync): DeliveryQueueRow[];
144
+ export declare function upsertOcConfig(db: DatabaseSync, key: string, value: unknown): void;
145
+ export declare function getOcConfig(db: DatabaseSync, key: string): unknown;
146
+ export interface DashboardState {
147
+ agents: AgentInfoRow[];
148
+ cronJobs: CronJobRow[];
149
+ sessions: SessionRow[];
150
+ recentAlerts: AlertRow[];
151
+ recentDiagnostics: DiagnosticRow[];
152
+ recentHeartbeats: HeartbeatRow[];
153
+ pendingDeliveries: DeliveryQueueRow[];
154
+ recentActions: ActionRow[];
155
+ }
156
+ export declare function getDashboardState(db: DatabaseSync): DashboardState;
157
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,227 @@
1
+ export function upsertAgentInfo(db, row) {
2
+ db.prepare(`
3
+ INSERT INTO agent_info (agent_id, name, emoji, soul_md, heartbeat_md, memory_md, identity_md, user_md, agents_md, tools_md, updated_at)
4
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
5
+ ON CONFLICT(agent_id) DO UPDATE SET
6
+ name=excluded.name, emoji=excluded.emoji,
7
+ soul_md=excluded.soul_md, heartbeat_md=excluded.heartbeat_md,
8
+ memory_md=excluded.memory_md, identity_md=excluded.identity_md,
9
+ user_md=excluded.user_md, agents_md=excluded.agents_md,
10
+ tools_md=excluded.tools_md, updated_at=excluded.updated_at
11
+ `).run(row.agent_id, row.name ?? null, row.emoji ?? null, row.soul_md ?? null, row.heartbeat_md ?? null, row.memory_md ?? null, row.identity_md ?? null, row.user_md ?? null, row.agents_md ?? null, row.tools_md ?? null, row.updated_at);
12
+ }
13
+ export function getAllAgents(db) {
14
+ return db.prepare("SELECT * FROM agent_info ORDER BY agent_id").all();
15
+ }
16
+ export function upsertCronJob(db, row) {
17
+ db.prepare(`
18
+ INSERT INTO cron_jobs (id, agent_id, name, description, schedule_expr, schedule_tz, last_run_at, last_status, last_error, next_run_at, consecutive_errors, updated_at)
19
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
20
+ ON CONFLICT(id) DO UPDATE SET
21
+ agent_id=excluded.agent_id, name=excluded.name, description=excluded.description,
22
+ schedule_expr=excluded.schedule_expr, schedule_tz=excluded.schedule_tz,
23
+ last_run_at=excluded.last_run_at, last_status=excluded.last_status,
24
+ last_error=excluded.last_error, next_run_at=excluded.next_run_at,
25
+ consecutive_errors=excluded.consecutive_errors, updated_at=excluded.updated_at
26
+ `).run(row.id, row.agent_id ?? null, row.name ?? null, row.description ?? null, row.schedule_expr ?? null, row.schedule_tz ?? null, row.last_run_at ?? null, row.last_status ?? null, row.last_error ?? null, row.next_run_at ?? null, row.consecutive_errors ?? 0, row.updated_at);
27
+ }
28
+ export function getAllCronJobs(db) {
29
+ return db.prepare("SELECT * FROM cron_jobs ORDER BY name").all();
30
+ }
31
+ export function insertCronRun(db, row) {
32
+ db.prepare(`
33
+ INSERT OR IGNORE INTO cron_runs (job_id, ts, action, status, error, duration_ms, session_id, session_key, next_run_at)
34
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
35
+ `).run(row.job_id, row.ts, row.action ?? null, row.status ?? null, row.error ?? null, row.duration_ms ?? null, row.session_id ?? null, row.session_key ?? null, row.next_run_at ?? null);
36
+ }
37
+ export function getRecentCronRuns(db, jobId, limit = 20) {
38
+ return db.prepare("SELECT * FROM cron_runs WHERE job_id=? ORDER BY ts DESC LIMIT ?").all(jobId, limit);
39
+ }
40
+ export function upsertSession(db, row) {
41
+ db.prepare(`
42
+ INSERT INTO sessions (session_key, agent_id, platform, recipient, is_group, last_activity_at, status, message_count, total_cost_usd, total_input_tokens, total_output_tokens, updated_at)
43
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
44
+ ON CONFLICT(session_key) DO UPDATE SET
45
+ agent_id=COALESCE(excluded.agent_id, sessions.agent_id),
46
+ platform=COALESCE(excluded.platform, sessions.platform),
47
+ recipient=COALESCE(excluded.recipient, sessions.recipient),
48
+ is_group=excluded.is_group,
49
+ last_activity_at=excluded.last_activity_at,
50
+ status=excluded.status,
51
+ message_count=sessions.message_count + excluded.message_count,
52
+ total_cost_usd=sessions.total_cost_usd + excluded.total_cost_usd,
53
+ total_input_tokens=sessions.total_input_tokens + excluded.total_input_tokens,
54
+ total_output_tokens=sessions.total_output_tokens + excluded.total_output_tokens,
55
+ updated_at=excluded.updated_at
56
+ `).run(row.session_key, row.agent_id ?? null, row.platform ?? null, row.recipient ?? null, row.is_group ?? 0, row.last_activity_at ?? null, row.status ?? null, row.message_count ?? 0, row.total_cost_usd ?? 0, row.total_input_tokens ?? 0, row.total_output_tokens ?? 0, row.updated_at);
57
+ }
58
+ export function getAllSessions(db) {
59
+ return db.prepare("SELECT * FROM sessions ORDER BY last_activity_at DESC").all();
60
+ }
61
+ export function upsertAction(db, row) {
62
+ db.prepare(`
63
+ INSERT OR REPLACE INTO actions (id, run_id, session_key, seq, type, event_type, ts, duration_ms, tool_name, input_tokens, output_tokens, cost_usd, model, provider, outcome, error)
64
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
65
+ `).run(row.id, row.run_id ?? null, row.session_key ?? null, row.seq ?? null, row.type ?? null, row.event_type ?? null, row.ts, row.duration_ms ?? null, row.tool_name ?? null, row.input_tokens ?? null, row.output_tokens ?? null, row.cost_usd ?? null, row.model ?? null, row.provider ?? null, row.outcome ?? null, row.error ?? null);
66
+ }
67
+ export function getRecentActions(db, limit = 100, sessionKey) {
68
+ if (sessionKey) {
69
+ return db.prepare("SELECT * FROM actions WHERE session_key=? ORDER BY ts DESC LIMIT ?").all(sessionKey, limit);
70
+ }
71
+ return db.prepare("SELECT * FROM actions ORDER BY ts DESC LIMIT ?").all(limit);
72
+ }
73
+ export function upsertAlert(db, row) {
74
+ db.prepare(`
75
+ INSERT OR REPLACE INTO alerts (id, rule_id, severity, title, detail, ts, fingerprint)
76
+ VALUES (?, ?, ?, ?, ?, ?, ?)
77
+ `).run(row.id, row.rule_id, row.severity, row.title, row.detail ?? null, row.ts, row.fingerprint);
78
+ }
79
+ export function getRecentAlerts(db, limit = 50) {
80
+ return db.prepare("SELECT * FROM alerts ORDER BY ts DESC LIMIT ?").all(limit);
81
+ }
82
+ export function insertDiagnostic(db, row) {
83
+ db.prepare(`
84
+ INSERT INTO diagnostics (event_type, ts, summary, channel, session_key, agent_id)
85
+ VALUES (?, ?, ?, ?, ?, ?)
86
+ `).run(row.event_type, row.ts, row.summary ?? null, row.channel ?? null, row.session_key ?? null, row.agent_id ?? null);
87
+ }
88
+ export function getRecentDiagnostics(db, limit = 100) {
89
+ return db.prepare("SELECT * FROM diagnostics ORDER BY rowid DESC LIMIT ?").all(limit);
90
+ }
91
+ export function insertHeartbeat(db, row) {
92
+ db.prepare(`
93
+ INSERT INTO heartbeats (ts, status, gateway_connected, queue_depth, active_sessions)
94
+ VALUES (?, ?, ?, ?, ?)
95
+ `).run(row.ts, row.status ?? null, row.gateway_connected ?? 0, row.queue_depth ?? 0, row.active_sessions ?? 0);
96
+ }
97
+ export function getRecentHeartbeats(db, limit = 20) {
98
+ return db.prepare("SELECT * FROM heartbeats ORDER BY rowid DESC LIMIT ?").all(limit);
99
+ }
100
+ function subsystemFor(eventType, source) {
101
+ const t = eventType ?? "";
102
+ if (source === "action") {
103
+ if (t === "tool_call" || t === "tool_result")
104
+ return "tool";
105
+ if (t === "exec")
106
+ return "exec";
107
+ if (t === "streaming")
108
+ return "llm";
109
+ return "agent";
110
+ }
111
+ const prefix = t.split(".")[0];
112
+ if (prefix === "llm")
113
+ return "llm";
114
+ if (prefix === "tool")
115
+ return "tool";
116
+ if (prefix === "agent")
117
+ return "agent";
118
+ if (prefix === "infra")
119
+ return "infra";
120
+ if (prefix === "session")
121
+ return "session";
122
+ return "sys";
123
+ }
124
+ function messageFor(eventType, source, toolName, summary) {
125
+ if (source === "diagnostic") {
126
+ const s = summary ?? eventType;
127
+ if (s === "infra.heartbeat:success" || s === "infra.heartbeat")
128
+ return "heartbeat ok";
129
+ if (s === "infra.heartbeat:error")
130
+ return "heartbeat FAIL";
131
+ const ci = s.indexOf(":");
132
+ if (ci > 0) {
133
+ const after = s.substring(ci + 1);
134
+ if (after)
135
+ return after;
136
+ }
137
+ return s;
138
+ }
139
+ switch (eventType) {
140
+ case "start": return "agent started";
141
+ case "streaming": return "thinking…";
142
+ case "tool_call": return toolName ? `tool: ${toolName}` : "tool call";
143
+ case "tool_result": return "tool result received";
144
+ case "complete": return "response complete";
145
+ case "error": return "error";
146
+ case "aborted": return "aborted";
147
+ case "exec": return toolName ? `exec: ${toolName}` : "exec";
148
+ default: return eventType;
149
+ }
150
+ }
151
+ export function getActivityLog(db, limit = 100, sessionKey) {
152
+ const sessFilter = sessionKey ? `AND session_key = '${sessionKey.replace(/'/g, "''")}'` : "";
153
+ const rows = db.prepare(`
154
+ SELECT
155
+ ts, 'action' AS source, type AS event_type, tool_name, session_key,
156
+ run_id, input_tokens, output_tokens, duration_ms,
157
+ NULL AS summary, NULL AS channel
158
+ FROM actions
159
+ WHERE type IS NOT NULL AND type != 'streaming' ${sessFilter}
160
+ UNION ALL
161
+ SELECT
162
+ ts, 'diagnostic' AS source, event_type, NULL AS tool_name, session_key,
163
+ NULL AS run_id, NULL AS input_tokens, NULL AS output_tokens, NULL AS duration_ms,
164
+ summary, channel
165
+ FROM diagnostics ${sessionKey ? `WHERE session_key = '${sessionKey.replace(/'/g, "''")}'` : ""}
166
+ ORDER BY ts DESC
167
+ LIMIT ?
168
+ `).all(limit);
169
+ return rows.map(r => ({
170
+ ts: r.ts,
171
+ source: r.source,
172
+ event_type: r.event_type ?? "",
173
+ subsystem: subsystemFor(r.event_type ?? "", r.source),
174
+ message: messageFor(r.event_type ?? "", r.source, r.tool_name, r.summary),
175
+ session_key: r.session_key ?? undefined,
176
+ run_id: r.run_id ?? undefined,
177
+ tool_name: r.tool_name ?? undefined,
178
+ duration_ms: r.duration_ms ?? undefined,
179
+ input_tokens: r.input_tokens ?? undefined,
180
+ output_tokens: r.output_tokens ?? undefined,
181
+ summary: r.summary ?? undefined,
182
+ channel: r.channel ?? undefined,
183
+ }));
184
+ }
185
+ export function upsertDeliveryItem(db, row) {
186
+ db.prepare(`
187
+ INSERT INTO delivery_queue (id, channel, to_address, text, enqueued_at, retry_count, last_error, status, updated_at)
188
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
189
+ ON CONFLICT(id) DO UPDATE SET
190
+ retry_count=excluded.retry_count, last_error=excluded.last_error,
191
+ status=excluded.status, updated_at=excluded.updated_at
192
+ `).run(row.id, row.channel ?? null, row.to_address ?? null, row.text ?? null, row.enqueued_at ?? null, row.retry_count ?? 0, row.last_error ?? null, row.status ?? 'pending', row.updated_at);
193
+ }
194
+ export function getPendingDeliveries(db) {
195
+ return db.prepare("SELECT * FROM delivery_queue WHERE status='pending' ORDER BY enqueued_at").all();
196
+ }
197
+ // ── OC Config ────────────────────────────────────────────────────────────────
198
+ export function upsertOcConfig(db, key, value) {
199
+ db.prepare(`
200
+ INSERT INTO oc_config (key, value_json, updated_at) VALUES (?, ?, ?)
201
+ ON CONFLICT(key) DO UPDATE SET value_json=excluded.value_json, updated_at=excluded.updated_at
202
+ `).run(key, JSON.stringify(value), Date.now());
203
+ }
204
+ export function getOcConfig(db, key) {
205
+ const row = db.prepare("SELECT value_json FROM oc_config WHERE key=?").get(key);
206
+ if (!row)
207
+ return null;
208
+ try {
209
+ return JSON.parse(row.value_json);
210
+ }
211
+ catch {
212
+ return null;
213
+ }
214
+ }
215
+ export function getDashboardState(db) {
216
+ return {
217
+ agents: getAllAgents(db),
218
+ cronJobs: getAllCronJobs(db),
219
+ sessions: getAllSessions(db),
220
+ recentAlerts: getRecentAlerts(db, 50),
221
+ recentDiagnostics: getRecentDiagnostics(db, 50),
222
+ recentHeartbeats: getRecentHeartbeats(db, 10),
223
+ pendingDeliveries: getPendingDeliveries(db),
224
+ recentActions: getRecentActions(db, 50),
225
+ };
226
+ }
227
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** SQLite schema for openalerts */
2
+ export declare const SCHEMA_SQL = "\nPRAGMA journal_mode=WAL;\nPRAGMA foreign_keys=ON;\n\n-- \u2500\u2500 Agent identity + workspace docs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS agent_info (\n agent_id TEXT PRIMARY KEY,\n name TEXT,\n emoji TEXT,\n soul_md TEXT,\n heartbeat_md TEXT,\n memory_md TEXT,\n identity_md TEXT,\n user_md TEXT,\n agents_md TEXT,\n tools_md TEXT,\n updated_at INTEGER NOT NULL\n);\n\n-- \u2500\u2500 Cron job definitions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS cron_jobs (\n id TEXT PRIMARY KEY,\n agent_id TEXT,\n name TEXT,\n description TEXT,\n schedule_expr TEXT,\n schedule_tz TEXT,\n last_run_at INTEGER,\n last_status TEXT,\n last_error TEXT,\n next_run_at INTEGER,\n consecutive_errors INTEGER DEFAULT 0,\n updated_at INTEGER NOT NULL\n);\n\n-- \u2500\u2500 Cron job run history \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS cron_runs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n job_id TEXT NOT NULL,\n ts INTEGER NOT NULL,\n action TEXT,\n status TEXT,\n error TEXT,\n duration_ms INTEGER,\n session_id TEXT,\n session_key TEXT,\n next_run_at INTEGER\n);\nCREATE INDEX IF NOT EXISTS idx_cron_runs_job ON cron_runs(job_id, ts DESC);\n\n-- \u2500\u2500 Sessions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS sessions (\n session_key TEXT PRIMARY KEY,\n agent_id TEXT,\n platform TEXT,\n recipient TEXT,\n is_group INTEGER DEFAULT 0,\n last_activity_at INTEGER,\n status TEXT,\n message_count INTEGER DEFAULT 0,\n total_cost_usd REAL DEFAULT 0,\n total_input_tokens INTEGER DEFAULT 0,\n total_output_tokens INTEGER DEFAULT 0,\n updated_at INTEGER NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_sessions_agent ON sessions(agent_id, last_activity_at DESC);\n\n-- \u2500\u2500 Agent actions (tool calls, LLM runs, etc.) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS actions (\n id TEXT PRIMARY KEY,\n run_id TEXT,\n session_key TEXT,\n seq INTEGER,\n type TEXT,\n event_type TEXT,\n ts INTEGER NOT NULL,\n duration_ms INTEGER,\n tool_name TEXT,\n input_tokens INTEGER,\n output_tokens INTEGER,\n cost_usd REAL,\n model TEXT,\n provider TEXT,\n outcome TEXT,\n error TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_actions_session ON actions(session_key, ts DESC);\nCREATE INDEX IF NOT EXISTS idx_actions_run ON actions(run_id, seq);\n\n-- \u2500\u2500 Alert events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS alerts (\n id TEXT PRIMARY KEY,\n rule_id TEXT NOT NULL,\n severity TEXT NOT NULL,\n title TEXT NOT NULL,\n detail TEXT,\n ts INTEGER NOT NULL,\n fingerprint TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_alerts_ts ON alerts(ts DESC);\nCREATE INDEX IF NOT EXISTS idx_alerts_rule ON alerts(rule_id);\n\n-- \u2500\u2500 Diagnostic events (ring buffer, keep last 2000) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS diagnostics (\n rowid INTEGER PRIMARY KEY AUTOINCREMENT,\n event_type TEXT NOT NULL,\n ts INTEGER NOT NULL,\n summary TEXT,\n channel TEXT,\n session_key TEXT,\n agent_id TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_diag_ts ON diagnostics(ts DESC);\n\n-- \u2500\u2500 Heartbeat log \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS heartbeats (\n rowid INTEGER PRIMARY KEY AUTOINCREMENT,\n ts INTEGER NOT NULL,\n status TEXT,\n gateway_connected INTEGER DEFAULT 0,\n queue_depth INTEGER DEFAULT 0,\n active_sessions INTEGER DEFAULT 0\n);\nCREATE INDEX IF NOT EXISTS idx_hb_ts ON heartbeats(ts DESC);\n\n-- \u2500\u2500 Delivery queue snapshot \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS delivery_queue (\n id TEXT PRIMARY KEY,\n channel TEXT,\n to_address TEXT,\n text TEXT,\n enqueued_at INTEGER,\n retry_count INTEGER DEFAULT 0,\n last_error TEXT,\n status TEXT DEFAULT 'pending',\n updated_at INTEGER NOT NULL\n);\n\n-- \u2500\u2500 Daily metrics \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS daily_metrics (\n date_key TEXT NOT NULL,\n hour_ts INTEGER NOT NULL,\n agent_runs INTEGER DEFAULT 0,\n tool_calls INTEGER DEFAULT 0,\n total_tokens INTEGER DEFAULT 0,\n total_cost REAL DEFAULT 0,\n errors INTEGER DEFAULT 0,\n PRIMARY KEY (date_key, hour_ts)\n);\n\n-- \u2500\u2500 OpenClaw config snapshot (for dashboard display) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS oc_config (\n key TEXT PRIMARY KEY,\n value_json TEXT,\n updated_at INTEGER NOT NULL\n);\n\n-- \u2500\u2500 Schema version \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER PRIMARY KEY\n);\nINSERT OR IGNORE INTO schema_version VALUES (1);\n";
3
+ export declare const PRUNE_DIAGNOSTICS_SQL = "\n DELETE FROM diagnostics\n WHERE rowid NOT IN (\n SELECT rowid FROM diagnostics ORDER BY rowid DESC LIMIT 2000\n )\n";
4
+ export declare const PRUNE_HEARTBEATS_SQL = "\n DELETE FROM heartbeats\n WHERE rowid NOT IN (\n SELECT rowid FROM heartbeats ORDER BY rowid DESC LIMIT 500\n )\n";
5
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC,eAAO,MAAM,UAAU,kmQAkKtB,CAAC;AAEF,eAAO,MAAM,qBAAqB,iIAKjC,CAAC;AAEF,eAAO,MAAM,oBAAoB,8HAKhC,CAAC"}
@@ -0,0 +1,177 @@
1
+ /** SQLite schema for openalerts */
2
+ export const SCHEMA_SQL = `
3
+ PRAGMA journal_mode=WAL;
4
+ PRAGMA foreign_keys=ON;
5
+
6
+ -- ── Agent identity + workspace docs ─────────────────────────────────────────
7
+ CREATE TABLE IF NOT EXISTS agent_info (
8
+ agent_id TEXT PRIMARY KEY,
9
+ name TEXT,
10
+ emoji TEXT,
11
+ soul_md TEXT,
12
+ heartbeat_md TEXT,
13
+ memory_md TEXT,
14
+ identity_md TEXT,
15
+ user_md TEXT,
16
+ agents_md TEXT,
17
+ tools_md TEXT,
18
+ updated_at INTEGER NOT NULL
19
+ );
20
+
21
+ -- ── Cron job definitions ─────────────────────────────────────────────────────
22
+ CREATE TABLE IF NOT EXISTS cron_jobs (
23
+ id TEXT PRIMARY KEY,
24
+ agent_id TEXT,
25
+ name TEXT,
26
+ description TEXT,
27
+ schedule_expr TEXT,
28
+ schedule_tz TEXT,
29
+ last_run_at INTEGER,
30
+ last_status TEXT,
31
+ last_error TEXT,
32
+ next_run_at INTEGER,
33
+ consecutive_errors INTEGER DEFAULT 0,
34
+ updated_at INTEGER NOT NULL
35
+ );
36
+
37
+ -- ── Cron job run history ─────────────────────────────────────────────────────
38
+ CREATE TABLE IF NOT EXISTS cron_runs (
39
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
40
+ job_id TEXT NOT NULL,
41
+ ts INTEGER NOT NULL,
42
+ action TEXT,
43
+ status TEXT,
44
+ error TEXT,
45
+ duration_ms INTEGER,
46
+ session_id TEXT,
47
+ session_key TEXT,
48
+ next_run_at INTEGER
49
+ );
50
+ CREATE INDEX IF NOT EXISTS idx_cron_runs_job ON cron_runs(job_id, ts DESC);
51
+
52
+ -- ── Sessions ─────────────────────────────────────────────────────────────────
53
+ CREATE TABLE IF NOT EXISTS sessions (
54
+ session_key TEXT PRIMARY KEY,
55
+ agent_id TEXT,
56
+ platform TEXT,
57
+ recipient TEXT,
58
+ is_group INTEGER DEFAULT 0,
59
+ last_activity_at INTEGER,
60
+ status TEXT,
61
+ message_count INTEGER DEFAULT 0,
62
+ total_cost_usd REAL DEFAULT 0,
63
+ total_input_tokens INTEGER DEFAULT 0,
64
+ total_output_tokens INTEGER DEFAULT 0,
65
+ updated_at INTEGER NOT NULL
66
+ );
67
+ CREATE INDEX IF NOT EXISTS idx_sessions_agent ON sessions(agent_id, last_activity_at DESC);
68
+
69
+ -- ── Agent actions (tool calls, LLM runs, etc.) ───────────────────────────────
70
+ CREATE TABLE IF NOT EXISTS actions (
71
+ id TEXT PRIMARY KEY,
72
+ run_id TEXT,
73
+ session_key TEXT,
74
+ seq INTEGER,
75
+ type TEXT,
76
+ event_type TEXT,
77
+ ts INTEGER NOT NULL,
78
+ duration_ms INTEGER,
79
+ tool_name TEXT,
80
+ input_tokens INTEGER,
81
+ output_tokens INTEGER,
82
+ cost_usd REAL,
83
+ model TEXT,
84
+ provider TEXT,
85
+ outcome TEXT,
86
+ error TEXT
87
+ );
88
+ CREATE INDEX IF NOT EXISTS idx_actions_session ON actions(session_key, ts DESC);
89
+ CREATE INDEX IF NOT EXISTS idx_actions_run ON actions(run_id, seq);
90
+
91
+ -- ── Alert events ─────────────────────────────────────────────────────────────
92
+ CREATE TABLE IF NOT EXISTS alerts (
93
+ id TEXT PRIMARY KEY,
94
+ rule_id TEXT NOT NULL,
95
+ severity TEXT NOT NULL,
96
+ title TEXT NOT NULL,
97
+ detail TEXT,
98
+ ts INTEGER NOT NULL,
99
+ fingerprint TEXT NOT NULL
100
+ );
101
+ CREATE INDEX IF NOT EXISTS idx_alerts_ts ON alerts(ts DESC);
102
+ CREATE INDEX IF NOT EXISTS idx_alerts_rule ON alerts(rule_id);
103
+
104
+ -- ── Diagnostic events (ring buffer, keep last 2000) ──────────────────────────
105
+ CREATE TABLE IF NOT EXISTS diagnostics (
106
+ rowid INTEGER PRIMARY KEY AUTOINCREMENT,
107
+ event_type TEXT NOT NULL,
108
+ ts INTEGER NOT NULL,
109
+ summary TEXT,
110
+ channel TEXT,
111
+ session_key TEXT,
112
+ agent_id TEXT
113
+ );
114
+ CREATE INDEX IF NOT EXISTS idx_diag_ts ON diagnostics(ts DESC);
115
+
116
+ -- ── Heartbeat log ────────────────────────────────────────────────────────────
117
+ CREATE TABLE IF NOT EXISTS heartbeats (
118
+ rowid INTEGER PRIMARY KEY AUTOINCREMENT,
119
+ ts INTEGER NOT NULL,
120
+ status TEXT,
121
+ gateway_connected INTEGER DEFAULT 0,
122
+ queue_depth INTEGER DEFAULT 0,
123
+ active_sessions INTEGER DEFAULT 0
124
+ );
125
+ CREATE INDEX IF NOT EXISTS idx_hb_ts ON heartbeats(ts DESC);
126
+
127
+ -- ── Delivery queue snapshot ───────────────────────────────────────────────────
128
+ CREATE TABLE IF NOT EXISTS delivery_queue (
129
+ id TEXT PRIMARY KEY,
130
+ channel TEXT,
131
+ to_address TEXT,
132
+ text TEXT,
133
+ enqueued_at INTEGER,
134
+ retry_count INTEGER DEFAULT 0,
135
+ last_error TEXT,
136
+ status TEXT DEFAULT 'pending',
137
+ updated_at INTEGER NOT NULL
138
+ );
139
+
140
+ -- ── Daily metrics ─────────────────────────────────────────────────────────────
141
+ CREATE TABLE IF NOT EXISTS daily_metrics (
142
+ date_key TEXT NOT NULL,
143
+ hour_ts INTEGER NOT NULL,
144
+ agent_runs INTEGER DEFAULT 0,
145
+ tool_calls INTEGER DEFAULT 0,
146
+ total_tokens INTEGER DEFAULT 0,
147
+ total_cost REAL DEFAULT 0,
148
+ errors INTEGER DEFAULT 0,
149
+ PRIMARY KEY (date_key, hour_ts)
150
+ );
151
+
152
+ -- ── OpenClaw config snapshot (for dashboard display) ─────────────────────────
153
+ CREATE TABLE IF NOT EXISTS oc_config (
154
+ key TEXT PRIMARY KEY,
155
+ value_json TEXT,
156
+ updated_at INTEGER NOT NULL
157
+ );
158
+
159
+ -- ── Schema version ────────────────────────────────────────────────────────────
160
+ CREATE TABLE IF NOT EXISTS schema_version (
161
+ version INTEGER PRIMARY KEY
162
+ );
163
+ INSERT OR IGNORE INTO schema_version VALUES (1);
164
+ `;
165
+ export const PRUNE_DIAGNOSTICS_SQL = `
166
+ DELETE FROM diagnostics
167
+ WHERE rowid NOT IN (
168
+ SELECT rowid FROM diagnostics ORDER BY rowid DESC LIMIT 2000
169
+ )
170
+ `;
171
+ export const PRUNE_HEARTBEATS_SQL = `
172
+ DELETE FROM heartbeats
173
+ WHERE rowid NOT IN (
174
+ SELECT rowid FROM heartbeats ORDER BY rowid DESC LIMIT 500
175
+ )
176
+ `;
177
+ //# sourceMappingURL=schema.js.map