@steadwing/openalerts 0.2.4 → 0.2.6

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 (124) hide show
  1. package/README.md +198 -137
  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 +49 -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 +98 -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 +2 -1
  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 +221 -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 +273 -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 +29 -43
  103. package/LICENSE +0 -201
  104. package/dist/core/index.d.ts +0 -12
  105. package/dist/core/index.js +0 -23
  106. package/dist/core/llm-enrichment.d.ts +0 -21
  107. package/dist/core/llm-enrichment.js +0 -180
  108. package/dist/core/platform.d.ts +0 -17
  109. package/dist/core/platform.js +0 -93
  110. package/dist/index.d.ts +0 -8
  111. package/dist/index.js +0 -213
  112. package/dist/plugin/adapter.d.ts +0 -150
  113. package/dist/plugin/adapter.js +0 -530
  114. package/dist/plugin/commands.d.ts +0 -18
  115. package/dist/plugin/commands.js +0 -103
  116. package/dist/plugin/dashboard-html.d.ts +0 -7
  117. package/dist/plugin/dashboard-html.js +0 -938
  118. package/dist/plugin/dashboard-routes.d.ts +0 -7
  119. package/dist/plugin/dashboard-routes.js +0 -336
  120. package/dist/plugin/gateway-client.d.ts +0 -39
  121. package/dist/plugin/gateway-client.js +0 -193
  122. package/dist/plugin/log-bridge.d.ts +0 -22
  123. package/dist/plugin/log-bridge.js +0 -363
  124. package/openclaw.plugin.json +0 -57
@@ -1,125 +1,72 @@
1
+ /**
2
+ * JSONL persistence for openalerts.
3
+ * Keeps a flat events.jsonl alongside SQLite as a backup/audit log.
4
+ */
1
5
  import fs from "node:fs";
2
6
  import path from "node:path";
3
- import { DEFAULTS, LOG_FILENAME, STORE_DIR_NAME } from "./types.js";
4
- function resolveDir(stateDir) {
5
- return path.join(stateDir, STORE_DIR_NAME);
6
- }
7
- function resolveLogPath(stateDir) {
8
- return path.join(resolveDir(stateDir), LOG_FILENAME);
9
- }
10
- function ensureDir(stateDir) {
11
- const dir = resolveDir(stateDir);
12
- if (!fs.existsSync(dir)) {
13
- fs.mkdirSync(dir, { recursive: true });
14
- }
15
- }
16
- /** Append a single event to the JSONL log. */
7
+ import { LOG_FILENAME } from "./types.js";
17
8
  export function appendEvent(stateDir, event) {
18
- ensureDir(stateDir);
19
- const line = JSON.stringify(event) + "\n";
20
- fs.appendFileSync(resolveLogPath(stateDir), line, "utf-8");
9
+ const logPath = path.join(stateDir, LOG_FILENAME);
10
+ fs.mkdirSync(stateDir, { recursive: true });
11
+ fs.appendFileSync(logPath, JSON.stringify(event) + "\n");
21
12
  }
22
- /** Read the most recent N events from the log. Skips malformed lines. */
23
- export function readRecentEvents(stateDir, limit) {
24
- const logPath = resolveLogPath(stateDir);
13
+ export function readAllEvents(stateDir) {
14
+ const logPath = path.join(stateDir, LOG_FILENAME);
25
15
  if (!fs.existsSync(logPath))
26
16
  return [];
27
- let content;
28
- try {
29
- content = fs.readFileSync(logPath, "utf-8");
30
- }
31
- catch {
32
- return [];
33
- }
34
- const lines = content.trim().split("\n").filter(Boolean);
35
- const recent = lines.slice(-limit);
36
- const events = [];
37
- for (const line of recent) {
17
+ const lines = fs.readFileSync(logPath, "utf8").split("\n").filter(Boolean);
18
+ return lines.slice(-1000).map(l => {
38
19
  try {
39
- const parsed = JSON.parse(line);
40
- if (parsed && typeof parsed.type === "string" && typeof parsed.ts === "number") {
41
- events.push(parsed);
42
- }
20
+ return JSON.parse(l);
43
21
  }
44
22
  catch {
45
- // Skip malformed lines silently
23
+ return null;
46
24
  }
47
- }
48
- return events;
25
+ }).filter(Boolean);
49
26
  }
50
- /** Read all events (for warm-start). Caps at 1000 most recent. */
51
- export function readAllEvents(stateDir) {
52
- return readRecentEvents(stateDir, 1000);
27
+ export function readRecentEvents(stateDir, limit = 50) {
28
+ const all = readAllEvents(stateDir);
29
+ return all.slice(-limit);
53
30
  }
54
- /** Prune the log by age and size. Atomic rewrite via .tmp + rename. */
55
31
  export function pruneLog(stateDir, opts) {
56
- const logPath = resolveLogPath(stateDir);
32
+ const logPath = path.join(stateDir, LOG_FILENAME);
57
33
  if (!fs.existsSync(logPath))
58
34
  return;
59
- const maxAgeMs = opts?.maxAgeMs ?? DEFAULTS.maxLogAgeDays * 24 * 60 * 60 * 1000;
60
- const maxSizeBytes = (opts?.maxSizeKb ?? DEFAULTS.maxLogSizeKb) * 1024;
61
- let content;
62
- try {
63
- content = fs.readFileSync(logPath, "utf-8");
64
- }
65
- catch {
66
- return;
67
- }
68
- // Check size first — skip if well within limits
69
- if (Buffer.byteLength(content, "utf-8") < maxSizeBytes * 0.8) {
70
- // Only prune by age if size is okay
71
- const cutoff = Date.now() - maxAgeMs;
72
- const lines = content.trim().split("\n").filter(Boolean);
73
- const filtered = lines.filter((line) => {
35
+ const stat = fs.statSync(logPath);
36
+ const cutoff = Date.now() - opts.maxAgeMs;
37
+ const oversized = stat.size > opts.maxSizeKb * 1024;
38
+ if (!oversized) {
39
+ const lines = fs.readFileSync(logPath, "utf8").split("\n").filter(Boolean);
40
+ const fresh = lines.filter(l => {
74
41
  try {
75
- const parsed = JSON.parse(line);
76
- return typeof parsed.ts === "number" && parsed.ts >= cutoff;
42
+ return JSON.parse(l).ts >= cutoff;
77
43
  }
78
44
  catch {
79
- return false; // Drop malformed lines during prune
45
+ return false;
80
46
  }
81
47
  });
82
- if (filtered.length < lines.length) {
83
- writeAtomic(logPath, filtered.join("\n") + "\n");
84
- }
48
+ if (fresh.length === lines.length)
49
+ return;
50
+ const tmp = logPath + ".tmp";
51
+ fs.writeFileSync(tmp, fresh.join("\n") + "\n");
52
+ fs.renameSync(tmp, logPath);
85
53
  return;
86
54
  }
87
- // Over size limit filter by age first, then trim oldest if still too large
88
- const cutoff = Date.now() - maxAgeMs;
89
- let lines = content.trim().split("\n").filter(Boolean);
90
- // Remove expired
91
- lines = lines.filter((line) => {
92
- try {
93
- const parsed = JSON.parse(line);
94
- return typeof parsed.ts === "number" && parsed.ts >= cutoff;
95
- }
96
- catch {
97
- return false;
98
- }
99
- });
100
- // Still too large? Keep only the newest lines that fit
101
- let result = lines.join("\n") + "\n";
102
- while (Buffer.byteLength(result, "utf-8") > maxSizeBytes && lines.length > 10) {
103
- lines = lines.slice(Math.floor(lines.length * 0.25)); // Drop oldest quarter
104
- result = lines.join("\n") + "\n";
105
- }
106
- writeAtomic(logPath, result);
107
- }
108
- /** Atomic write: write to .tmp, then rename. Falls back to direct write on Windows. */
109
- function writeAtomic(filePath, content) {
110
- const tmpPath = filePath + ".tmp";
55
+ // Oversized: keep last 500 lines
56
+ const lines = fs.readFileSync(logPath, "utf8").split("\n").filter(Boolean);
57
+ const keep = lines.slice(-500);
58
+ const tmp = logPath + ".tmp";
59
+ fs.writeFileSync(tmp, keep.join("\n") + "\n");
111
60
  try {
112
- fs.writeFileSync(tmpPath, content, "utf-8");
113
- fs.renameSync(tmpPath, filePath);
61
+ fs.renameSync(tmp, logPath);
114
62
  }
115
63
  catch {
116
- // Windows fallback: direct write (rename can be flaky)
117
- fs.writeFileSync(filePath, content, "utf-8");
64
+ // Windows rename fallback
65
+ fs.writeFileSync(logPath, keep.join("\n") + "\n");
118
66
  try {
119
- fs.unlinkSync(tmpPath);
120
- }
121
- catch {
122
- // Ignore cleanup failure
67
+ fs.unlinkSync(tmp);
123
68
  }
69
+ catch { /* ignore */ }
124
70
  }
125
71
  }
72
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export type AlertSeverity = "info" | "warn" | "error" | "critical";
2
- export type OpenAlertsEventType = "llm.call" | "llm.error" | "llm.token_usage" | "tool.call" | "tool.error" | "agent.start" | "agent.end" | "agent.error" | "agent.stuck" | "session.start" | "session.end" | "session.stuck" | "infra.error" | "infra.heartbeat" | "infra.queue_depth" | "custom" | "watchdog.tick";
2
+ export type OpenAlertsEventType = "llm.call" | "llm.error" | "llm.token_usage" | "tool.call" | "tool.error" | "agent.start" | "agent.end" | "agent.error" | "agent.stuck" | "session.start" | "session.end" | "session.stuck" | "infra.error" | "infra.heartbeat" | "infra.queue_depth" | "exec.start" | "exec.output" | "exec.end" | "custom" | "watchdog.tick";
3
3
  export type OpenAlertsEvent = {
4
4
  type: OpenAlertsEventType;
5
5
  ts: number;
@@ -155,3 +155,4 @@ export declare const DEFAULTS: {
155
155
  readonly platformBatchSize: 100;
156
156
  readonly gatewayDownThresholdMs: 30000;
157
157
  };
158
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -15,3 +15,4 @@ export const DEFAULTS = {
15
15
  platformBatchSize: 100,
16
16
  gatewayDownThresholdMs: 30_000, // 30 seconds
17
17
  };
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,gFAAgF;AA2LhF,gFAAgF;AAEhF,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAC3C,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,aAAa;IACzC,YAAY,EAAE,GAAG;IACjB,aAAa,EAAE,CAAC;IAChB,gBAAgB,EAAE,GAAG;IACrB,kBAAkB,EAAE,EAAE;IACtB,gBAAgB,EAAE,CAAC;IACnB,kBAAkB,EAAE,MAAM,EAAE,aAAa;IACzC,eAAe,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU;IAC/C,uBAAuB,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,YAAY;IACpD,iBAAiB,EAAE,GAAG;IACtB,sBAAsB,EAAE,MAAM,EAAE,aAAa;CACrC,CAAC"}
@@ -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,221 @@
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=excluded.agent_id, platform=excluded.platform, recipient=excluded.recipient,
46
+ is_group=excluded.is_group, last_activity_at=excluded.last_activity_at,
47
+ status=excluded.status, message_count=excluded.message_count,
48
+ total_cost_usd=excluded.total_cost_usd, total_input_tokens=excluded.total_input_tokens,
49
+ total_output_tokens=excluded.total_output_tokens, updated_at=excluded.updated_at
50
+ `).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);
51
+ }
52
+ export function getAllSessions(db) {
53
+ return db.prepare("SELECT * FROM sessions ORDER BY last_activity_at DESC").all();
54
+ }
55
+ export function upsertAction(db, row) {
56
+ db.prepare(`
57
+ 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)
58
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
59
+ `).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);
60
+ }
61
+ export function getRecentActions(db, limit = 100, sessionKey) {
62
+ if (sessionKey) {
63
+ return db.prepare("SELECT * FROM actions WHERE session_key=? ORDER BY ts DESC LIMIT ?").all(sessionKey, limit);
64
+ }
65
+ return db.prepare("SELECT * FROM actions ORDER BY ts DESC LIMIT ?").all(limit);
66
+ }
67
+ export function upsertAlert(db, row) {
68
+ db.prepare(`
69
+ INSERT OR REPLACE INTO alerts (id, rule_id, severity, title, detail, ts, fingerprint)
70
+ VALUES (?, ?, ?, ?, ?, ?, ?)
71
+ `).run(row.id, row.rule_id, row.severity, row.title, row.detail ?? null, row.ts, row.fingerprint);
72
+ }
73
+ export function getRecentAlerts(db, limit = 50) {
74
+ return db.prepare("SELECT * FROM alerts ORDER BY ts DESC LIMIT ?").all(limit);
75
+ }
76
+ export function insertDiagnostic(db, row) {
77
+ db.prepare(`
78
+ INSERT INTO diagnostics (event_type, ts, summary, channel, session_key, agent_id)
79
+ VALUES (?, ?, ?, ?, ?, ?)
80
+ `).run(row.event_type, row.ts, row.summary ?? null, row.channel ?? null, row.session_key ?? null, row.agent_id ?? null);
81
+ }
82
+ export function getRecentDiagnostics(db, limit = 100) {
83
+ return db.prepare("SELECT * FROM diagnostics ORDER BY rowid DESC LIMIT ?").all(limit);
84
+ }
85
+ export function insertHeartbeat(db, row) {
86
+ db.prepare(`
87
+ INSERT INTO heartbeats (ts, status, gateway_connected, queue_depth, active_sessions)
88
+ VALUES (?, ?, ?, ?, ?)
89
+ `).run(row.ts, row.status ?? null, row.gateway_connected ?? 0, row.queue_depth ?? 0, row.active_sessions ?? 0);
90
+ }
91
+ export function getRecentHeartbeats(db, limit = 20) {
92
+ return db.prepare("SELECT * FROM heartbeats ORDER BY rowid DESC LIMIT ?").all(limit);
93
+ }
94
+ function subsystemFor(eventType, source) {
95
+ const t = eventType ?? "";
96
+ if (source === "action") {
97
+ if (t === "tool_call" || t === "tool_result")
98
+ return "tool";
99
+ if (t === "exec")
100
+ return "exec";
101
+ if (t === "streaming")
102
+ return "llm";
103
+ return "agent";
104
+ }
105
+ const prefix = t.split(".")[0];
106
+ if (prefix === "llm")
107
+ return "llm";
108
+ if (prefix === "tool")
109
+ return "tool";
110
+ if (prefix === "agent")
111
+ return "agent";
112
+ if (prefix === "infra")
113
+ return "infra";
114
+ if (prefix === "session")
115
+ return "session";
116
+ return "sys";
117
+ }
118
+ function messageFor(eventType, source, toolName, summary) {
119
+ if (source === "diagnostic") {
120
+ const s = summary ?? eventType;
121
+ if (s === "infra.heartbeat:success" || s === "infra.heartbeat")
122
+ return "heartbeat ok";
123
+ if (s === "infra.heartbeat:error")
124
+ return "heartbeat FAIL";
125
+ const ci = s.indexOf(":");
126
+ if (ci > 0) {
127
+ const after = s.substring(ci + 1);
128
+ if (after)
129
+ return after;
130
+ }
131
+ return s;
132
+ }
133
+ switch (eventType) {
134
+ case "start": return "agent started";
135
+ case "streaming": return "thinking…";
136
+ case "tool_call": return toolName ? `tool: ${toolName}` : "tool call";
137
+ case "tool_result": return "tool result received";
138
+ case "complete": return "response complete";
139
+ case "error": return "error";
140
+ case "aborted": return "aborted";
141
+ case "exec": return toolName ? `exec: ${toolName}` : "exec";
142
+ default: return eventType;
143
+ }
144
+ }
145
+ export function getActivityLog(db, limit = 100, sessionKey) {
146
+ const sessFilter = sessionKey ? `AND session_key = '${sessionKey.replace(/'/g, "''")}'` : "";
147
+ const rows = db.prepare(`
148
+ SELECT
149
+ ts, 'action' AS source, type AS event_type, tool_name, session_key,
150
+ run_id, input_tokens, output_tokens, duration_ms,
151
+ NULL AS summary, NULL AS channel
152
+ FROM actions
153
+ WHERE type IS NOT NULL AND type != 'streaming' ${sessFilter}
154
+ UNION ALL
155
+ SELECT
156
+ ts, 'diagnostic' AS source, event_type, NULL AS tool_name, session_key,
157
+ NULL AS run_id, NULL AS input_tokens, NULL AS output_tokens, NULL AS duration_ms,
158
+ summary, channel
159
+ FROM diagnostics ${sessionKey ? `WHERE session_key = '${sessionKey.replace(/'/g, "''")}'` : ""}
160
+ ORDER BY ts DESC
161
+ LIMIT ?
162
+ `).all(limit);
163
+ return rows.map(r => ({
164
+ ts: r.ts,
165
+ source: r.source,
166
+ event_type: r.event_type ?? "",
167
+ subsystem: subsystemFor(r.event_type ?? "", r.source),
168
+ message: messageFor(r.event_type ?? "", r.source, r.tool_name, r.summary),
169
+ session_key: r.session_key ?? undefined,
170
+ run_id: r.run_id ?? undefined,
171
+ tool_name: r.tool_name ?? undefined,
172
+ duration_ms: r.duration_ms ?? undefined,
173
+ input_tokens: r.input_tokens ?? undefined,
174
+ output_tokens: r.output_tokens ?? undefined,
175
+ summary: r.summary ?? undefined,
176
+ channel: r.channel ?? undefined,
177
+ }));
178
+ }
179
+ export function upsertDeliveryItem(db, row) {
180
+ db.prepare(`
181
+ INSERT INTO delivery_queue (id, channel, to_address, text, enqueued_at, retry_count, last_error, status, updated_at)
182
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
183
+ ON CONFLICT(id) DO UPDATE SET
184
+ retry_count=excluded.retry_count, last_error=excluded.last_error,
185
+ status=excluded.status, updated_at=excluded.updated_at
186
+ `).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);
187
+ }
188
+ export function getPendingDeliveries(db) {
189
+ return db.prepare("SELECT * FROM delivery_queue WHERE status='pending' ORDER BY enqueued_at").all();
190
+ }
191
+ // ── OC Config ────────────────────────────────────────────────────────────────
192
+ export function upsertOcConfig(db, key, value) {
193
+ db.prepare(`
194
+ INSERT INTO oc_config (key, value_json, updated_at) VALUES (?, ?, ?)
195
+ ON CONFLICT(key) DO UPDATE SET value_json=excluded.value_json, updated_at=excluded.updated_at
196
+ `).run(key, JSON.stringify(value), Date.now());
197
+ }
198
+ export function getOcConfig(db, key) {
199
+ const row = db.prepare("SELECT value_json FROM oc_config WHERE key=?").get(key);
200
+ if (!row)
201
+ return null;
202
+ try {
203
+ return JSON.parse(row.value_json);
204
+ }
205
+ catch {
206
+ return null;
207
+ }
208
+ }
209
+ export function getDashboardState(db) {
210
+ return {
211
+ agents: getAllAgents(db),
212
+ cronJobs: getAllCronJobs(db),
213
+ sessions: getAllSessions(db),
214
+ recentAlerts: getRecentAlerts(db, 50),
215
+ recentDiagnostics: getRecentDiagnostics(db, 50),
216
+ recentHeartbeats: getRecentHeartbeats(db, 10),
217
+ pendingDeliveries: getPendingDeliveries(db),
218
+ recentActions: getRecentActions(db, 50),
219
+ };
220
+ }
221
+ //# sourceMappingURL=queries.js.map