@agentgazer/server 0.1.1
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/LICENSE +191 -0
- package/README.md +86 -0
- package/dist/alerts/evaluator.d.ts +9 -0
- package/dist/alerts/evaluator.d.ts.map +1 -0
- package/dist/alerts/evaluator.js +323 -0
- package/dist/alerts/evaluator.js.map +1 -0
- package/dist/db.d.ts +121 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +425 -0
- package/dist/db.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +3 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +65 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +8 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +72 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/routes/agents.d.ts +3 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +149 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/alerts.d.ts +3 -0
- package/dist/routes/alerts.d.ts.map +1 -0
- package/dist/routes/alerts.js +286 -0
- package/dist/routes/alerts.js.map +1 -0
- package/dist/routes/auth.d.ts +3 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +20 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/events.d.ts +3 -0
- package/dist/routes/events.d.ts.map +1 -0
- package/dist/routes/events.js +304 -0
- package/dist/routes/events.js.map +1 -0
- package/dist/routes/health.d.ts +3 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +13 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/model-rules.d.ts +3 -0
- package/dist/routes/model-rules.d.ts.map +1 -0
- package/dist/routes/model-rules.js +71 -0
- package/dist/routes/model-rules.js.map +1 -0
- package/dist/routes/rate-limits.d.ts +3 -0
- package/dist/routes/rate-limits.d.ts.map +1 -0
- package/dist/routes/rate-limits.js +58 -0
- package/dist/routes/rate-limits.js.map +1 -0
- package/dist/routes/stats.d.ts +3 -0
- package/dist/routes/stats.d.ts.map +1 -0
- package/dist/routes/stats.js +233 -0
- package/dist/routes/stats.js.map +1 -0
- package/dist/server.d.ts +20 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +155 -0
- package/dist/server.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const express_1 = require("express");
|
|
4
|
+
const router = (0, express_1.Router)();
|
|
5
|
+
function computeFromTime(range, from, to) {
|
|
6
|
+
const now = new Date();
|
|
7
|
+
const toTime = to ? new Date(to) : now;
|
|
8
|
+
if (range === "custom") {
|
|
9
|
+
if (!from) {
|
|
10
|
+
// Default to 24h if custom range without from
|
|
11
|
+
const d = new Date(toTime);
|
|
12
|
+
d.setHours(d.getHours() - 24);
|
|
13
|
+
return { from: d.toISOString(), to: toTime.toISOString() };
|
|
14
|
+
}
|
|
15
|
+
return { from: new Date(from).toISOString(), to: toTime.toISOString() };
|
|
16
|
+
}
|
|
17
|
+
const d = new Date(toTime);
|
|
18
|
+
switch (range) {
|
|
19
|
+
case "1h":
|
|
20
|
+
d.setHours(d.getHours() - 1);
|
|
21
|
+
break;
|
|
22
|
+
case "24h":
|
|
23
|
+
d.setHours(d.getHours() - 24);
|
|
24
|
+
break;
|
|
25
|
+
case "7d":
|
|
26
|
+
d.setDate(d.getDate() - 7);
|
|
27
|
+
break;
|
|
28
|
+
case "30d":
|
|
29
|
+
d.setDate(d.getDate() - 30);
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
return { from: d.toISOString(), to: toTime.toISOString() };
|
|
33
|
+
}
|
|
34
|
+
function percentile(sorted, p) {
|
|
35
|
+
if (sorted.length === 0)
|
|
36
|
+
return null;
|
|
37
|
+
const idx = Math.ceil((p / 100) * sorted.length) - 1;
|
|
38
|
+
return sorted[Math.max(0, idx)];
|
|
39
|
+
}
|
|
40
|
+
// GET /api/stats/overview — aggregate stats across ALL agents
|
|
41
|
+
// Must be registered BEFORE /api/stats/:agentId
|
|
42
|
+
router.get("/api/stats/overview", (req, res) => {
|
|
43
|
+
const db = req.app.locals.db;
|
|
44
|
+
const VALID_RANGES = new Set(["1h", "24h", "7d", "30d"]);
|
|
45
|
+
const rangeParam = req.query.range;
|
|
46
|
+
const range = (rangeParam && VALID_RANGES.has(rangeParam) ? rangeParam : "24h");
|
|
47
|
+
const modelFilter = req.query.model;
|
|
48
|
+
const timeRange = computeFromTime(range);
|
|
49
|
+
// Build query conditions
|
|
50
|
+
const conditions = [
|
|
51
|
+
"timestamp >= ?",
|
|
52
|
+
"timestamp <= ?",
|
|
53
|
+
"(event_type = 'llm_call' OR event_type = 'completion')",
|
|
54
|
+
];
|
|
55
|
+
const params = [timeRange.from, timeRange.to];
|
|
56
|
+
if (modelFilter) {
|
|
57
|
+
conditions.push("model = ?");
|
|
58
|
+
params.push(modelFilter);
|
|
59
|
+
}
|
|
60
|
+
const where = `WHERE ${conditions.join(" AND ")}`;
|
|
61
|
+
// Aggregate totals
|
|
62
|
+
const totals = db
|
|
63
|
+
.prepare(`SELECT
|
|
64
|
+
COALESCE(SUM(cost_usd), 0) AS total_cost,
|
|
65
|
+
COALESCE(SUM(tokens_total), 0) AS total_tokens,
|
|
66
|
+
COUNT(*) AS total_requests
|
|
67
|
+
FROM agent_events
|
|
68
|
+
${where}`)
|
|
69
|
+
.get(...params);
|
|
70
|
+
const avgCostPerRequest = totals.total_requests > 0 ? totals.total_cost / totals.total_requests : 0;
|
|
71
|
+
// Cost by model
|
|
72
|
+
const costByModelRows = db
|
|
73
|
+
.prepare(`SELECT
|
|
74
|
+
COALESCE(model, 'unknown') AS model,
|
|
75
|
+
COALESCE(provider, 'unknown') AS provider,
|
|
76
|
+
COALESCE(SUM(cost_usd), 0) AS cost,
|
|
77
|
+
COUNT(*) AS count
|
|
78
|
+
FROM agent_events
|
|
79
|
+
${where}
|
|
80
|
+
GROUP BY model, provider
|
|
81
|
+
ORDER BY cost DESC`)
|
|
82
|
+
.all(...params);
|
|
83
|
+
// Available models (unfiltered — always show all models in the time range)
|
|
84
|
+
const availableModelsRows = db
|
|
85
|
+
.prepare(`SELECT DISTINCT model FROM agent_events
|
|
86
|
+
WHERE timestamp >= ? AND timestamp <= ?
|
|
87
|
+
AND (event_type = 'llm_call' OR event_type = 'completion')
|
|
88
|
+
AND model IS NOT NULL
|
|
89
|
+
ORDER BY model`)
|
|
90
|
+
.all(timeRange.from, timeRange.to);
|
|
91
|
+
const availableModels = availableModelsRows.map((r) => r.model);
|
|
92
|
+
// Active models count
|
|
93
|
+
const activeModels = costByModelRows.length;
|
|
94
|
+
// Cost time series — bucket appropriately by range
|
|
95
|
+
// 1h: 5-minute buckets, 24h: hourly buckets, 7d/30d: daily buckets
|
|
96
|
+
let costSeriesSQL;
|
|
97
|
+
if (range === "1h") {
|
|
98
|
+
// 5-minute buckets for 1h range
|
|
99
|
+
costSeriesSQL = `SELECT
|
|
100
|
+
strftime('%Y-%m-%dT%H:', timestamp) || printf('%02d', (CAST(strftime('%M', timestamp) AS INTEGER) / 5) * 5) || ':00Z' AS timestamp,
|
|
101
|
+
COALESCE(SUM(cost_usd), 0) AS cost,
|
|
102
|
+
COALESCE(SUM(tokens_total), 0) AS tokens
|
|
103
|
+
FROM agent_events
|
|
104
|
+
${where}
|
|
105
|
+
GROUP BY strftime('%Y-%m-%dT%H:', timestamp) || printf('%02d', (CAST(strftime('%M', timestamp) AS INTEGER) / 5) * 5)
|
|
106
|
+
ORDER BY timestamp ASC`;
|
|
107
|
+
}
|
|
108
|
+
else if (range === "24h") {
|
|
109
|
+
// Hourly buckets for 24h range
|
|
110
|
+
costSeriesSQL = `SELECT
|
|
111
|
+
strftime('%Y-%m-%dT%H:00:00Z', timestamp) AS timestamp,
|
|
112
|
+
COALESCE(SUM(cost_usd), 0) AS cost,
|
|
113
|
+
COALESCE(SUM(tokens_total), 0) AS tokens
|
|
114
|
+
FROM agent_events
|
|
115
|
+
${where}
|
|
116
|
+
GROUP BY strftime('%Y-%m-%dT%H:00:00Z', timestamp)
|
|
117
|
+
ORDER BY timestamp ASC`;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
// Daily buckets for 7d/30d
|
|
121
|
+
costSeriesSQL = `SELECT
|
|
122
|
+
strftime('%Y-%m-%dT00:00:00Z', timestamp) AS timestamp,
|
|
123
|
+
COALESCE(SUM(cost_usd), 0) AS cost,
|
|
124
|
+
COALESCE(SUM(tokens_total), 0) AS tokens
|
|
125
|
+
FROM agent_events
|
|
126
|
+
${where}
|
|
127
|
+
GROUP BY strftime('%Y-%m-%dT00:00:00Z', timestamp)
|
|
128
|
+
ORDER BY timestamp ASC`;
|
|
129
|
+
}
|
|
130
|
+
const costSeries = db
|
|
131
|
+
.prepare(costSeriesSQL)
|
|
132
|
+
.all(...params);
|
|
133
|
+
res.json({
|
|
134
|
+
total_cost: totals.total_cost,
|
|
135
|
+
total_tokens: totals.total_tokens,
|
|
136
|
+
total_requests: totals.total_requests,
|
|
137
|
+
avg_cost_per_request: avgCostPerRequest,
|
|
138
|
+
active_models: activeModels,
|
|
139
|
+
cost_by_model: costByModelRows,
|
|
140
|
+
cost_series: costSeries,
|
|
141
|
+
available_models: availableModels,
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
router.get("/api/stats/:agentId", (req, res) => {
|
|
145
|
+
const db = req.app.locals.db;
|
|
146
|
+
const { agentId } = req.params;
|
|
147
|
+
const VALID_RANGES = new Set(["1h", "24h", "7d", "30d", "custom"]);
|
|
148
|
+
const rangeParam = req.query.range;
|
|
149
|
+
const range = (rangeParam && VALID_RANGES.has(rangeParam) ? rangeParam : "24h");
|
|
150
|
+
const fromParam = req.query.from;
|
|
151
|
+
const toParam = req.query.to;
|
|
152
|
+
const timeRange = computeFromTime(range, fromParam, toParam);
|
|
153
|
+
// Query all events for this agent in the time range
|
|
154
|
+
const allEvents = db
|
|
155
|
+
.prepare(`SELECT * FROM agent_events
|
|
156
|
+
WHERE agent_id = ? AND timestamp >= ? AND timestamp <= ?
|
|
157
|
+
ORDER BY timestamp ASC`)
|
|
158
|
+
.all(agentId, timeRange.from, timeRange.to);
|
|
159
|
+
// Filter LLM-specific events for cost/token/latency stats
|
|
160
|
+
const llmEvents = allEvents.filter((e) => e.event_type === "llm_call" || e.event_type === "completion");
|
|
161
|
+
const totalRequests = allEvents.length;
|
|
162
|
+
const totalErrors = allEvents.filter((e) => e.event_type === "error").length;
|
|
163
|
+
const errorRate = totalRequests > 0 ? totalErrors / totalRequests : 0;
|
|
164
|
+
// Cost
|
|
165
|
+
const totalCost = llmEvents.reduce((sum, e) => sum + (e.cost_usd ?? 0), 0);
|
|
166
|
+
// Tokens
|
|
167
|
+
const totalTokens = llmEvents.reduce((sum, e) => sum + (e.tokens_total ?? 0), 0);
|
|
168
|
+
// Latency percentiles
|
|
169
|
+
const latencies = llmEvents
|
|
170
|
+
.map((e) => e.latency_ms)
|
|
171
|
+
.filter((v) => v != null)
|
|
172
|
+
.sort((a, b) => a - b);
|
|
173
|
+
const p50Latency = percentile(latencies, 50);
|
|
174
|
+
const p99Latency = percentile(latencies, 99);
|
|
175
|
+
// Cost by model
|
|
176
|
+
const modelMap = new Map();
|
|
177
|
+
for (const e of llmEvents) {
|
|
178
|
+
const key = `${e.model ?? "unknown"}::${e.provider ?? "unknown"}`;
|
|
179
|
+
const existing = modelMap.get(key);
|
|
180
|
+
if (existing) {
|
|
181
|
+
existing.cost += e.cost_usd ?? 0;
|
|
182
|
+
existing.count += 1;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
modelMap.set(key, {
|
|
186
|
+
model: e.model,
|
|
187
|
+
provider: e.provider,
|
|
188
|
+
cost: e.cost_usd ?? 0,
|
|
189
|
+
count: 1,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const costByModel = [...modelMap.values()];
|
|
194
|
+
// Token series: return raw events with tokens (limit 500)
|
|
195
|
+
const tokenSeries = llmEvents
|
|
196
|
+
.filter((e) => e.tokens_in != null || e.tokens_out != null)
|
|
197
|
+
.slice(0, 500)
|
|
198
|
+
.map((e) => ({
|
|
199
|
+
timestamp: e.timestamp,
|
|
200
|
+
tokens_in: e.tokens_in,
|
|
201
|
+
tokens_out: e.tokens_out,
|
|
202
|
+
}));
|
|
203
|
+
// Blocked events stats
|
|
204
|
+
const blockedEvents = allEvents.filter((e) => e.event_type === "blocked");
|
|
205
|
+
const blockedCount = blockedEvents.length;
|
|
206
|
+
// Count by block reason
|
|
207
|
+
const blockReasons = {};
|
|
208
|
+
for (const e of blockedEvents) {
|
|
209
|
+
try {
|
|
210
|
+
const tags = JSON.parse(e.tags || "{}");
|
|
211
|
+
const reason = tags.block_reason || "unknown";
|
|
212
|
+
blockReasons[reason] = (blockReasons[reason] || 0) + 1;
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
blockReasons["unknown"] = (blockReasons["unknown"] || 0) + 1;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
res.json({
|
|
219
|
+
total_requests: totalRequests,
|
|
220
|
+
total_errors: totalErrors,
|
|
221
|
+
error_rate: errorRate,
|
|
222
|
+
total_cost: totalCost,
|
|
223
|
+
total_tokens: totalTokens,
|
|
224
|
+
p50_latency: p50Latency,
|
|
225
|
+
p99_latency: p99Latency,
|
|
226
|
+
cost_by_model: costByModel,
|
|
227
|
+
token_series: tokenSeries,
|
|
228
|
+
blocked_count: blockedCount,
|
|
229
|
+
block_reasons: blockReasons,
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
exports.default = router;
|
|
233
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/routes/stats.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as http from "node:http";
|
|
2
|
+
import express from "express";
|
|
3
|
+
import { initDatabase } from "./db.js";
|
|
4
|
+
export interface ServerOptions {
|
|
5
|
+
port?: number;
|
|
6
|
+
token: string;
|
|
7
|
+
dbPath: string;
|
|
8
|
+
dashboardDir?: string;
|
|
9
|
+
retentionDays?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function createServer(options: ServerOptions): {
|
|
12
|
+
app: express.Express;
|
|
13
|
+
db: ReturnType<typeof initDatabase>;
|
|
14
|
+
};
|
|
15
|
+
export declare function startServer(options: ServerOptions): Promise<{
|
|
16
|
+
server: http.Server;
|
|
17
|
+
db: ReturnType<typeof initDatabase>;
|
|
18
|
+
shutdown: () => Promise<void>;
|
|
19
|
+
}>;
|
|
20
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,YAAY,EAAgB,MAAM,SAAS,CAAC;AAcrD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG;IAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;IAAC,EAAE,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;CAAE,CA0ClH;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IAAC,EAAE,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CA2DtG"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.createServer = createServer;
|
|
40
|
+
exports.startServer = startServer;
|
|
41
|
+
const http = __importStar(require("node:http"));
|
|
42
|
+
const path = __importStar(require("node:path"));
|
|
43
|
+
const express_1 = __importDefault(require("express"));
|
|
44
|
+
const cors_1 = __importDefault(require("cors"));
|
|
45
|
+
const shared_1 = require("@agentgazer/shared");
|
|
46
|
+
const db_js_1 = require("./db.js");
|
|
47
|
+
const log = (0, shared_1.createLogger)("server");
|
|
48
|
+
const auth_js_1 = require("./middleware/auth.js");
|
|
49
|
+
const health_js_1 = __importDefault(require("./routes/health.js"));
|
|
50
|
+
const auth_js_2 = __importDefault(require("./routes/auth.js"));
|
|
51
|
+
const agents_js_1 = __importDefault(require("./routes/agents.js"));
|
|
52
|
+
const events_js_1 = __importDefault(require("./routes/events.js"));
|
|
53
|
+
const stats_js_1 = __importDefault(require("./routes/stats.js"));
|
|
54
|
+
const alerts_js_1 = __importDefault(require("./routes/alerts.js"));
|
|
55
|
+
const model_rules_js_1 = __importDefault(require("./routes/model-rules.js"));
|
|
56
|
+
const rate_limits_js_1 = __importDefault(require("./routes/rate-limits.js"));
|
|
57
|
+
const evaluator_js_1 = require("./alerts/evaluator.js");
|
|
58
|
+
function createServer(options) {
|
|
59
|
+
const db = (0, db_js_1.initDatabase)({ path: options.dbPath });
|
|
60
|
+
const app = (0, express_1.default)();
|
|
61
|
+
// Store shared state on app.locals
|
|
62
|
+
app.locals.db = db;
|
|
63
|
+
app.locals.token = options.token;
|
|
64
|
+
app.locals.startTime = Date.now();
|
|
65
|
+
// Middleware
|
|
66
|
+
app.use((0, cors_1.default)({
|
|
67
|
+
origin: /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/,
|
|
68
|
+
}));
|
|
69
|
+
app.use(express_1.default.json({ limit: "5mb" }));
|
|
70
|
+
app.use(auth_js_1.authMiddleware);
|
|
71
|
+
// API routes
|
|
72
|
+
app.use(health_js_1.default);
|
|
73
|
+
app.use(auth_js_2.default);
|
|
74
|
+
app.use(agents_js_1.default);
|
|
75
|
+
app.use(events_js_1.default);
|
|
76
|
+
app.use(stats_js_1.default);
|
|
77
|
+
app.use(alerts_js_1.default);
|
|
78
|
+
app.use(model_rules_js_1.default);
|
|
79
|
+
app.use(rate_limits_js_1.default);
|
|
80
|
+
// Serve dashboard static files if a directory is provided
|
|
81
|
+
if (options.dashboardDir) {
|
|
82
|
+
app.use(express_1.default.static(options.dashboardDir));
|
|
83
|
+
// SPA fallback: all non-API routes serve index.html
|
|
84
|
+
app.get("*", (req, res) => {
|
|
85
|
+
if (req.path.startsWith("/api/")) {
|
|
86
|
+
res.status(404).json({ error: "Not found" });
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
res.sendFile(path.join(options.dashboardDir, "index.html"));
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return { app, db };
|
|
93
|
+
}
|
|
94
|
+
async function startServer(options) {
|
|
95
|
+
const port = options.port ?? 8080;
|
|
96
|
+
const { app, db } = createServer(options);
|
|
97
|
+
// Start alert evaluator
|
|
98
|
+
const evaluator = (0, evaluator_js_1.startEvaluator)({ db });
|
|
99
|
+
// Start data retention cleanup (runs on startup and every 24h)
|
|
100
|
+
const retentionDays = options.retentionDays ?? 30;
|
|
101
|
+
let retentionTimer = null;
|
|
102
|
+
let retentionRetryTimer = null;
|
|
103
|
+
function runRetention() {
|
|
104
|
+
try {
|
|
105
|
+
const { eventsDeleted, historyDeleted } = (0, db_js_1.purgeOldData)(db, retentionDays);
|
|
106
|
+
if (eventsDeleted > 0 || historyDeleted > 0) {
|
|
107
|
+
log.info("Retention cleanup complete", { eventsDeleted, historyDeleted, retentionDays });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
log.error("Retention cleanup failed, will retry in 1 hour", { err: String(err) });
|
|
112
|
+
retentionRetryTimer = setTimeout(runRetention, 60 * 60 * 1000);
|
|
113
|
+
retentionRetryTimer.unref();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
runRetention();
|
|
117
|
+
retentionTimer = setInterval(runRetention, 24 * 60 * 60 * 1000);
|
|
118
|
+
retentionTimer.unref();
|
|
119
|
+
const server = http.createServer(app);
|
|
120
|
+
await new Promise((resolve, reject) => {
|
|
121
|
+
server.on("error", reject);
|
|
122
|
+
server.listen(port, () => resolve());
|
|
123
|
+
});
|
|
124
|
+
async function shutdown() {
|
|
125
|
+
evaluator.stop();
|
|
126
|
+
if (retentionTimer)
|
|
127
|
+
clearInterval(retentionTimer);
|
|
128
|
+
if (retentionRetryTimer)
|
|
129
|
+
clearTimeout(retentionRetryTimer);
|
|
130
|
+
return new Promise((resolve, reject) => {
|
|
131
|
+
const shutdownTimeout = setTimeout(() => {
|
|
132
|
+
log.warn("Shutdown timed out, forcing close");
|
|
133
|
+
try {
|
|
134
|
+
db.close();
|
|
135
|
+
}
|
|
136
|
+
catch { /* ignore */ }
|
|
137
|
+
resolve();
|
|
138
|
+
}, 10_000);
|
|
139
|
+
shutdownTimeout.unref();
|
|
140
|
+
server.close((err) => {
|
|
141
|
+
clearTimeout(shutdownTimeout);
|
|
142
|
+
try {
|
|
143
|
+
db.close();
|
|
144
|
+
}
|
|
145
|
+
catch { /* ignore */ }
|
|
146
|
+
if (err)
|
|
147
|
+
reject(err);
|
|
148
|
+
else
|
|
149
|
+
resolve();
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return { server, db, shutdown };
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agentgazer/server",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "AgentGazer local server with Express and SQLite",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist/",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "https://github.com/agentgazer/agentgazer.git",
|
|
25
|
+
"directory": "packages/server"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://github.com/agentgazer/agentgazer/tree/main/packages/server#readme",
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/agentgazer/agentgazer/issues"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"agentgazer",
|
|
33
|
+
"ai-agents",
|
|
34
|
+
"observability",
|
|
35
|
+
"server",
|
|
36
|
+
"express",
|
|
37
|
+
"sqlite"
|
|
38
|
+
],
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsc",
|
|
44
|
+
"dev": "tsc --watch",
|
|
45
|
+
"test": "vitest run",
|
|
46
|
+
"prepublishOnly": "npm run build"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@agentgazer/shared": "^0.1.0",
|
|
50
|
+
"better-sqlite3": "^11.7.0",
|
|
51
|
+
"cors": "^2.8.5",
|
|
52
|
+
"express": "^4.21.0",
|
|
53
|
+
"nodemailer": "^7.0.13",
|
|
54
|
+
"uuid": "^11.1.0"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@types/better-sqlite3": "^7.6.12",
|
|
58
|
+
"@types/cors": "^2.8.17",
|
|
59
|
+
"@types/express": "^5.0.0",
|
|
60
|
+
"@types/nodemailer": "^7.0.9",
|
|
61
|
+
"@types/uuid": "^10.0.0",
|
|
62
|
+
"typescript": "^5.5.0",
|
|
63
|
+
"vitest": "^4.0.18"
|
|
64
|
+
}
|
|
65
|
+
}
|