openalerts 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 (102) hide show
  1. package/README.md +253 -0
  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 +16 -0
  23. package/dist/core/alert-channel.d.ts.map +1 -0
  24. package/dist/core/alert-channel.js +23 -0
  25. package/dist/core/alert-channel.js.map +1 -0
  26. package/dist/core/bounded-map.d.ts +52 -0
  27. package/dist/core/bounded-map.d.ts.map +1 -0
  28. package/dist/core/bounded-map.js +129 -0
  29. package/dist/core/bounded-map.js.map +1 -0
  30. package/dist/core/engine.d.ts +36 -0
  31. package/dist/core/engine.d.ts.map +1 -0
  32. package/dist/core/engine.js +162 -0
  33. package/dist/core/engine.js.map +1 -0
  34. package/dist/core/evaluator.d.ts +19 -0
  35. package/dist/core/evaluator.d.ts.map +1 -0
  36. package/dist/core/evaluator.js +168 -0
  37. package/dist/core/evaluator.js.map +1 -0
  38. package/dist/core/event-bus.d.ts +18 -0
  39. package/dist/core/event-bus.d.ts.map +1 -0
  40. package/dist/core/event-bus.js +32 -0
  41. package/dist/core/event-bus.js.map +1 -0
  42. package/dist/core/formatter.d.ts +15 -0
  43. package/dist/core/formatter.d.ts.map +1 -0
  44. package/dist/core/formatter.js +125 -0
  45. package/dist/core/formatter.js.map +1 -0
  46. package/dist/core/rules.d.ts +3 -0
  47. package/dist/core/rules.d.ts.map +1 -0
  48. package/dist/core/rules.js +410 -0
  49. package/dist/core/rules.js.map +1 -0
  50. package/dist/core/store.d.ts +9 -0
  51. package/dist/core/store.d.ts.map +1 -0
  52. package/dist/core/store.js +72 -0
  53. package/dist/core/store.js.map +1 -0
  54. package/dist/core/types.d.ts +158 -0
  55. package/dist/core/types.d.ts.map +1 -0
  56. package/dist/core/types.js +18 -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 +48 -0
@@ -0,0 +1,158 @@
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" | "exec.start" | "exec.output" | "exec.end" | "custom" | "watchdog.tick";
3
+ export type OpenAlertsEvent = {
4
+ type: OpenAlertsEventType;
5
+ ts: number;
6
+ severity?: AlertSeverity;
7
+ channel?: string;
8
+ sessionKey?: string;
9
+ agentId?: string;
10
+ durationMs?: number;
11
+ tokenCount?: number;
12
+ queueDepth?: number;
13
+ ageMs?: number;
14
+ costUsd?: number;
15
+ outcome?: "success" | "error" | "skipped" | "timeout";
16
+ error?: string;
17
+ meta?: Record<string, unknown>;
18
+ };
19
+ export interface AlertChannel {
20
+ readonly name: string;
21
+ send(alert: AlertEvent, formatted: string): Promise<void> | void;
22
+ }
23
+ export type AlertEvent = {
24
+ type: "alert";
25
+ id: string;
26
+ ruleId: string;
27
+ severity: AlertSeverity;
28
+ title: string;
29
+ detail: string;
30
+ ts: number;
31
+ fingerprint: string;
32
+ };
33
+ export type DiagnosticSnapshot = {
34
+ type: "diagnostic";
35
+ eventType: string;
36
+ ts: number;
37
+ summary: string;
38
+ channel?: string;
39
+ sessionKey?: string;
40
+ };
41
+ export type HeartbeatSnapshot = {
42
+ type: "heartbeat";
43
+ status: string;
44
+ ts: number;
45
+ reason?: string;
46
+ channel?: string;
47
+ };
48
+ export type StoredEvent = AlertEvent | DiagnosticSnapshot | HeartbeatSnapshot;
49
+ export type AlertTarget = {
50
+ channel: string;
51
+ to: string;
52
+ accountId?: string;
53
+ };
54
+ /** Enriches an alert with LLM-generated summary/action. Returns enriched alert or null to skip. */
55
+ export type AlertEnricher = (alert: AlertEvent) => Promise<AlertEvent | null>;
56
+ export type RuleOverride = {
57
+ enabled?: boolean;
58
+ threshold?: number;
59
+ cooldownMinutes?: number;
60
+ };
61
+ export type MonitorConfig = {
62
+ apiKey?: string;
63
+ alertChannel?: string;
64
+ alertTo?: string;
65
+ alertAccountId?: string;
66
+ cooldownMinutes?: number;
67
+ maxLogSizeKb?: number;
68
+ maxLogAgeDays?: number;
69
+ quiet?: boolean;
70
+ llmEnriched?: boolean;
71
+ rules?: Record<string, RuleOverride>;
72
+ };
73
+ export type OpenAlertsInitOptions = {
74
+ /** Where to store JSONL event logs */
75
+ stateDir: string;
76
+ /** Monitor config (rules, cooldowns, etc.) */
77
+ config: MonitorConfig;
78
+ /** Alert channels to send to */
79
+ channels?: AlertChannel[];
80
+ /** Logger (defaults to console) */
81
+ logger?: OpenAlertsLogger;
82
+ /** Log prefix for messages */
83
+ logPrefix?: string;
84
+ /** Diagnosis hint shown in critical alerts (e.g., 'Run "openclaw doctor"') */
85
+ diagnosisHint?: string;
86
+ /** Optional LLM enricher — adds smart summaries to alerts before dispatch */
87
+ enricher?: AlertEnricher;
88
+ };
89
+ export type OpenAlertsLogger = {
90
+ info: (msg: string) => void;
91
+ warn: (msg: string) => void;
92
+ error: (msg: string) => void;
93
+ };
94
+ export type WindowEntry = {
95
+ ts: number;
96
+ value?: number;
97
+ };
98
+ export type EvaluatorState = {
99
+ /** Sliding window counters keyed by window name */
100
+ windows: Map<string, WindowEntry[]>;
101
+ /** Cooldown: fingerprint → last alerted timestamp */
102
+ cooldowns: Map<string, number>;
103
+ /** Consecutive failure counters keyed by counter name */
104
+ consecutives: Map<string, number>;
105
+ /** Hourly alert count for hard cap */
106
+ hourlyAlerts: {
107
+ count: number;
108
+ resetAt: number;
109
+ };
110
+ /** Last diagnostic heartbeat timestamp (for gateway-down detection) */
111
+ lastHeartbeatTs: number;
112
+ /** Startup timestamp */
113
+ startedAt: number;
114
+ /** Aggregate 24h counters for /health display */
115
+ stats: {
116
+ messagesProcessed: number;
117
+ messageErrors: number;
118
+ messagesReceived: number;
119
+ webhookErrors: number;
120
+ stuckSessions: number;
121
+ toolCalls: number;
122
+ toolErrors: number;
123
+ agentStarts: number;
124
+ agentErrors: number;
125
+ sessionsStarted: number;
126
+ compactions: number;
127
+ totalTokens: number;
128
+ totalCostUsd: number;
129
+ lastResetTs: number;
130
+ };
131
+ };
132
+ export type RuleContext = {
133
+ state: EvaluatorState;
134
+ config: MonitorConfig;
135
+ now: number;
136
+ };
137
+ export type AlertRuleDefinition = {
138
+ id: string;
139
+ defaultCooldownMs: number;
140
+ defaultThreshold: number;
141
+ evaluate: (event: OpenAlertsEvent, ctx: RuleContext) => AlertEvent | null;
142
+ };
143
+ export declare const STORE_DIR_NAME = "openalerts";
144
+ export declare const LOG_FILENAME = "events.jsonl";
145
+ export declare const DEFAULTS: {
146
+ readonly cooldownMs: number;
147
+ readonly maxLogSizeKb: 512;
148
+ readonly maxLogAgeDays: 7;
149
+ readonly maxWindowEntries: 100;
150
+ readonly maxCooldownEntries: 50;
151
+ readonly maxAlertsPerHour: 5;
152
+ readonly watchdogIntervalMs: 30000;
153
+ readonly pruneIntervalMs: number;
154
+ readonly platformFlushIntervalMs: number;
155
+ readonly platformBatchSize: 100;
156
+ readonly gatewayDownThresholdMs: 30000;
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":"AAEA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;AAInE,MAAM,MAAM,mBAAmB,GAC3B,UAAU,GAAG,WAAW,GAAG,iBAAiB,GAC5C,WAAW,GAAG,YAAY,GAC1B,aAAa,GAAG,WAAW,GAAG,aAAa,GAAG,aAAa,GAC3D,eAAe,GAAG,aAAa,GAAG,eAAe,GACjD,aAAa,GAAG,iBAAiB,GAAG,mBAAmB,GACvD,YAAY,GAAG,aAAa,GAAG,UAAU,GACzC,QAAQ,GAAG,eAAe,CAAC;AAE/B,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CAAC;AAIF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAClE;AAID,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;AAI9E,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF,mGAAmG;AACnG,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;AAI9E,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACtC,CAAC;AAIF,MAAM,MAAM,qBAAqB,GAAG;IAClC,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,MAAM,EAAE,aAAa,CAAC;IACtB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,mCAAmC;IACnC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,CAAC;AAIF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,mDAAmD;IACnD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACpC,qDAAqD;IACrD,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,yDAAyD;IACzD,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,sCAAsC;IACtC,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,uEAAuE;IACvE,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,KAAK,EAAE;QACL,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;QACtB,gBAAgB,EAAE,MAAM,CAAC;QACzB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAIF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,CACR,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,WAAW,KACb,UAAU,GAAG,IAAI,CAAC;CACxB,CAAC;AAIF,eAAO,MAAM,cAAc,eAAe,CAAC;AAC3C,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAE3C,eAAO,MAAM,QAAQ;;;;;;;;;;;;CAYX,CAAC"}
@@ -0,0 +1,18 @@
1
+ // ─── Alert Severity ──────────────────────────────────────────────────────────
2
+ // ─── Constants ───────────────────────────────────────────────────────────────
3
+ export const STORE_DIR_NAME = "openalerts";
4
+ export const LOG_FILENAME = "events.jsonl";
5
+ export const DEFAULTS = {
6
+ cooldownMs: 15 * 60 * 1000, // 15 minutes
7
+ maxLogSizeKb: 512,
8
+ maxLogAgeDays: 7,
9
+ maxWindowEntries: 100,
10
+ maxCooldownEntries: 50,
11
+ maxAlertsPerHour: 5,
12
+ watchdogIntervalMs: 30_000, // 30 seconds
13
+ pruneIntervalMs: 6 * 60 * 60 * 1000, // 6 hours
14
+ platformFlushIntervalMs: 5 * 60 * 1000, // 5 minutes
15
+ platformBatchSize: 100,
16
+ gatewayDownThresholdMs: 30_000, // 30 seconds
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,eAAe,CAAC,EAAgB,EAAE,GAAiB;IACjE,EAAE,CAAC,OAAO,CAAC;;;;;;;;;GASV,CAAC,CAAC,GAAG,CACJ,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI,EACjD,GAAG,CAAC,OAAO,IAAI,IAAI,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI,EACpE,GAAG,CAAC,WAAW,IAAI,IAAI,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI,EACnE,GAAG,CAAC,QAAQ,IAAI,IAAI,EAAE,GAAG,CAAC,UAAU,CACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAgB;IAC3C,OAAO,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAA+B,CAAC;AACrG,CAAC;AAmBD,MAAM,UAAU,aAAa,CAAC,EAAgB,EAAE,GAAe;IAC7D,EAAE,CAAC,OAAO,CAAC;;;;;;;;;GASV,CAAC,CAAC,GAAG,CACJ,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI,EACvE,GAAG,CAAC,aAAa,IAAI,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI,EAClD,GAAG,CAAC,WAAW,IAAI,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI,EACxE,GAAG,CAAC,WAAW,IAAI,IAAI,EAAE,GAAG,CAAC,kBAAkB,IAAI,CAAC,EAAE,GAAG,CAAC,UAAU,CACrE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAgB;IAC7C,OAAO,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,EAA6B,CAAC;AAC9F,CAAC;AAcD,MAAM,UAAU,aAAa,CAAC,EAAgB,EAAE,GAAe;IAC7D,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CACJ,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI,EAC7E,GAAG,CAAC,WAAW,IAAI,IAAI,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI,CAClG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAgB,EAAE,KAAa,EAAE,KAAK,GAAG,EAAE;IAC3E,OAAO,EAAE,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAA4B,CAAC;AACpI,CAAC;AAmBD,MAAM,UAAU,aAAa,CAAC,EAAgB,EAAE,GAAe;IAC7D,EAAE,CAAC,OAAO,CAAC;;;;;;;;;GASV,CAAC,CAAC,GAAG,CACJ,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI,EAClF,GAAG,CAAC,QAAQ,IAAI,CAAC,EAAE,GAAG,CAAC,gBAAgB,IAAI,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI,EACnE,GAAG,CAAC,aAAa,IAAI,CAAC,EAAE,GAAG,CAAC,cAAc,IAAI,CAAC,EAC/C,GAAG,CAAC,kBAAkB,IAAI,CAAC,EAAE,GAAG,CAAC,mBAAmB,IAAI,CAAC,EAAE,GAAG,CAAC,UAAU,CAC1E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAgB;IAC7C,OAAO,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,EAA6B,CAAC;AAC9G,CAAC;AAuBD,MAAM,UAAU,YAAY,CAAC,EAAgB,EAAE,GAAc;IAC3D,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CACJ,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EACpE,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI,EAAE,GAAG,CAAC,EAAE,EAChD,GAAG,CAAC,WAAW,IAAI,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI,EAC9C,GAAG,CAAC,YAAY,IAAI,IAAI,EAAE,GAAG,CAAC,aAAa,IAAI,IAAI,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI,EACzE,GAAG,CAAC,KAAK,IAAI,IAAI,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI,CAChF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAgB,EAAE,KAAK,GAAG,GAAG,EAAE,UAAmB;IACjF,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,EAAE,CAAC,OAAO,CAAC,oEAAoE,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAA2B,CAAC;IAC3I,CAAC;IACD,OAAO,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,KAAK,CAA2B,CAAC;AAC3G,CAAC;AAcD,MAAM,UAAU,WAAW,CAAC,EAAgB,EAAE,GAAa;IACzD,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAgB,EAAE,KAAK,GAAG,EAAE;IAC1D,OAAO,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,CAAC,KAAK,CAA0B,CAAC;AACzG,CAAC;AAaD,MAAM,UAAU,gBAAgB,CAAC,EAAgB,EAAE,GAAkB;IACnE,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;AAC1H,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAgB,EAAE,KAAK,GAAG,GAAG;IAChE,OAAO,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,KAAK,CAA+B,CAAC;AACtH,CAAC;AAYD,MAAM,UAAU,eAAe,CAAC,EAAgB,EAAE,GAAiB;IACjE,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,GAAG,CAAC,iBAAiB,IAAI,CAAC,EAAE,GAAG,CAAC,WAAW,IAAI,CAAC,EAAE,GAAG,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;AACjH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAgB,EAAE,KAAK,GAAG,EAAE;IAC9D,OAAO,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,KAAK,CAA8B,CAAC;AACpH,CAAC;AAuBD,SAAS,YAAY,CAAC,SAAiB,EAAE,MAAc;IACrD,MAAM,CAAC,GAAG,SAAS,IAAI,EAAE,CAAC;IAC1B,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,aAAa;YAAE,OAAO,MAAM,CAAC;QAC5D,IAAI,CAAC,KAAK,MAAM;YAAE,OAAO,MAAM,CAAC;QAChC,IAAI,CAAC,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QACpC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACrC,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACvC,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACvC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,SAAiB,EAAE,MAAc,EAAE,QAAwB,EAAE,OAAuB;IACtG,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,OAAO,IAAI,SAAS,CAAC;QAC/B,IAAI,CAAC,KAAK,yBAAyB,IAAI,CAAC,KAAK,iBAAiB;YAAE,OAAO,cAAc,CAAC;QACtF,IAAI,CAAC,KAAK,uBAAuB;YAAE,OAAO,gBAAgB,CAAC;QAC3D,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YAAC,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAAC,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAAC,CAAC;QAC3E,OAAO,CAAC,CAAC;IACX,CAAC;IACD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,OAAO,CAAC,CAAC,OAAO,eAAe,CAAC;QACrC,KAAK,WAAW,CAAC,CAAC,OAAO,WAAW,CAAC;QACrC,KAAK,WAAW,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;QACtE,KAAK,aAAa,CAAC,CAAC,OAAO,sBAAsB,CAAC;QAClD,KAAK,UAAU,CAAC,CAAC,OAAO,mBAAmB,CAAC;QAC5C,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;QAC7B,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;QACjC,KAAK,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5D,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAgB,EAAE,KAAK,GAAG,GAAG,EAAE,UAAmB;IAC/E,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,sBAAsB,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7F,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;qDAM2B,UAAU;;;;;;uBAMxC,UAAU,CAAC,CAAC,CAAC,wBAAwB,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;;;GAG/F,CAAC,CAAC,GAAG,CAAC,KAAK,CAKV,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,MAAM,EAAE,CAAC,CAAC,MAAiC;QAC3C,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,EAAE;QAC9B,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;QACrD,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC;QACzE,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,SAAS;QACvC,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS;QAC7B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,SAAS;QACnC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,SAAS;QACvC,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,SAAS;QACzC,aAAa,EAAE,CAAC,CAAC,aAAa,IAAI,SAAS;QAC3C,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,SAAS;QAC/B,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,SAAS;KAChC,CAAC,CAAC,CAAC;AACN,CAAC;AAgBD,MAAM,UAAU,kBAAkB,CAAC,EAAgB,EAAE,GAAqB;IACxE,EAAE,CAAC,OAAO,CAAC;;;;;;GAMV,CAAC,CAAC,GAAG,CACJ,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,EACrE,GAAG,CAAC,WAAW,IAAI,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,CAAC,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI,EACrE,GAAG,CAAC,MAAM,IAAI,SAAS,EAAE,GAAG,CAAC,UAAU,CACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAgB;IACnD,OAAO,EAAE,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC,GAAG,EAAmC,CAAC;AACvI,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,cAAc,CAAC,EAAgB,EAAE,GAAW,EAAE,KAAc;IAC1E,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAgB,EAAE,GAAW;IACvD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC,GAAG,CAAC,GAAG,CAAkD,CAAC;IACjI,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AACnE,CAAC;AAeD,MAAM,UAAU,iBAAiB,CAAC,EAAgB;IAChD,OAAO;QACL,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC;QACxB,QAAQ,EAAE,cAAc,CAAC,EAAE,CAAC;QAC5B,QAAQ,EAAE,cAAc,CAAC,EAAE,CAAC;QAC5B,YAAY,EAAE,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC;QACrC,iBAAiB,EAAE,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC;QAC/C,gBAAgB,EAAE,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC;QAC7C,iBAAiB,EAAE,oBAAoB,CAAC,EAAE,CAAC;QAC3C,aAAa,EAAE,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC"}