@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.
- package/README.md +198 -137
- package/dist/channels/console.d.ts +6 -0
- package/dist/channels/console.d.ts.map +1 -0
- package/dist/channels/console.js +10 -0
- package/dist/channels/console.js.map +1 -0
- package/dist/channels/telegram.d.ts +12 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +28 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/webhook.d.ts +8 -0
- package/dist/channels/webhook.d.ts.map +1 -0
- package/dist/channels/webhook.js +15 -0
- package/dist/channels/webhook.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +234 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +51 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +86 -0
- package/dist/config.js.map +1 -0
- package/dist/core/alert-channel.d.ts +3 -10
- package/dist/core/alert-channel.d.ts.map +1 -0
- package/dist/core/alert-channel.js +9 -30
- package/dist/core/alert-channel.js.map +1 -0
- package/dist/core/bounded-map.d.ts +1 -0
- package/dist/core/bounded-map.d.ts.map +1 -0
- package/dist/core/bounded-map.js +1 -0
- package/dist/core/bounded-map.js.map +1 -0
- package/dist/core/engine.d.ts +6 -18
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +49 -98
- package/dist/core/engine.js.map +1 -0
- package/dist/core/evaluator.d.ts +1 -0
- package/dist/core/evaluator.d.ts.map +1 -0
- package/dist/core/evaluator.js +1 -0
- package/dist/core/evaluator.js.map +1 -0
- package/dist/core/event-bus.d.ts +1 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +1 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/formatter.d.ts +1 -0
- package/dist/core/formatter.d.ts.map +1 -0
- package/dist/core/formatter.js +1 -0
- package/dist/core/formatter.js.map +1 -0
- package/dist/core/rules.d.ts +1 -0
- package/dist/core/rules.d.ts.map +1 -0
- package/dist/core/rules.js +98 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/store.d.ts +6 -9
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +43 -96
- package/dist/core/store.js.map +1 -0
- package/dist/core/types.d.ts +2 -1
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +1 -0
- package/dist/core/types.js.map +1 -0
- package/dist/db/index.d.ts +6 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +31 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/queries.d.ts +157 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +221 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/db/schema.d.ts +5 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +177 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/readers/openclaw.d.ts +11 -0
- package/dist/readers/openclaw.d.ts.map +1 -0
- package/dist/readers/openclaw.js +267 -0
- package/dist/readers/openclaw.js.map +1 -0
- package/dist/server/dashboard.d.ts +2 -0
- package/dist/server/dashboard.d.ts.map +1 -0
- package/dist/server/dashboard.js +765 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +28 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes.d.ts +6 -0
- package/dist/server/routes.d.ts.map +1 -0
- package/dist/server/routes.js +146 -0
- package/dist/server/routes.js.map +1 -0
- package/dist/server/sse.d.ts +21 -0
- package/dist/server/sse.d.ts.map +1 -0
- package/dist/server/sse.js +53 -0
- package/dist/server/sse.js.map +1 -0
- package/dist/watchers/files.d.ts +19 -0
- package/dist/watchers/files.d.ts.map +1 -0
- package/dist/watchers/files.js +105 -0
- package/dist/watchers/files.js.map +1 -0
- package/dist/watchers/gateway-adapter.d.ts +18 -0
- package/dist/watchers/gateway-adapter.d.ts.map +1 -0
- package/dist/watchers/gateway-adapter.js +273 -0
- package/dist/watchers/gateway-adapter.js.map +1 -0
- package/dist/watchers/gateway.d.ts +27 -0
- package/dist/watchers/gateway.d.ts.map +1 -0
- package/dist/watchers/gateway.js +131 -0
- package/dist/watchers/gateway.js.map +1 -0
- package/package.json +29 -43
- package/LICENSE +0 -201
- package/dist/core/index.d.ts +0 -12
- package/dist/core/index.js +0 -23
- package/dist/core/llm-enrichment.d.ts +0 -21
- package/dist/core/llm-enrichment.js +0 -180
- package/dist/core/platform.d.ts +0 -17
- package/dist/core/platform.js +0 -93
- package/dist/index.d.ts +0 -8
- package/dist/index.js +0 -213
- package/dist/plugin/adapter.d.ts +0 -150
- package/dist/plugin/adapter.js +0 -530
- package/dist/plugin/commands.d.ts +0 -18
- package/dist/plugin/commands.js +0 -103
- package/dist/plugin/dashboard-html.d.ts +0 -7
- package/dist/plugin/dashboard-html.js +0 -938
- package/dist/plugin/dashboard-routes.d.ts +0 -7
- package/dist/plugin/dashboard-routes.js +0 -336
- package/dist/plugin/gateway-client.d.ts +0 -39
- package/dist/plugin/gateway-client.js +0 -193
- package/dist/plugin/log-bridge.d.ts +0 -22
- package/dist/plugin/log-bridge.js +0 -363
- package/openclaw.plugin.json +0 -57
package/dist/core/store.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
fs.appendFileSync(
|
|
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
|
-
|
|
23
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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
|
-
|
|
23
|
+
return null;
|
|
46
24
|
}
|
|
47
|
-
}
|
|
48
|
-
return events;
|
|
25
|
+
}).filter(Boolean);
|
|
49
26
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return
|
|
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 =
|
|
32
|
+
const logPath = path.join(stateDir, LOG_FILENAME);
|
|
57
33
|
if (!fs.existsSync(logPath))
|
|
58
34
|
return;
|
|
59
|
-
const
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
76
|
-
return typeof parsed.ts === "number" && parsed.ts >= cutoff;
|
|
42
|
+
return JSON.parse(l).ts >= cutoff;
|
|
77
43
|
}
|
|
78
44
|
catch {
|
|
79
|
-
return false;
|
|
45
|
+
return false;
|
|
80
46
|
}
|
|
81
47
|
});
|
|
82
|
-
if (
|
|
83
|
-
|
|
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
|
-
//
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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.
|
|
113
|
-
fs.renameSync(tmpPath, filePath);
|
|
61
|
+
fs.renameSync(tmp, logPath);
|
|
114
62
|
}
|
|
115
63
|
catch {
|
|
116
|
-
// Windows
|
|
117
|
-
fs.writeFileSync(
|
|
64
|
+
// Windows rename fallback
|
|
65
|
+
fs.writeFileSync(logPath, keep.join("\n") + "\n");
|
|
118
66
|
try {
|
|
119
|
-
fs.unlinkSync(
|
|
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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"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -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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"}
|
package/dist/core/types.js
CHANGED
|
@@ -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"}
|
package/dist/db/index.js
ADDED
|
@@ -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
|