@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.
Files changed (59) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +86 -0
  3. package/dist/alerts/evaluator.d.ts +9 -0
  4. package/dist/alerts/evaluator.d.ts.map +1 -0
  5. package/dist/alerts/evaluator.js +323 -0
  6. package/dist/alerts/evaluator.js.map +1 -0
  7. package/dist/db.d.ts +121 -0
  8. package/dist/db.d.ts.map +1 -0
  9. package/dist/db.js +425 -0
  10. package/dist/db.js.map +1 -0
  11. package/dist/index.d.ts +5 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +15 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/middleware/auth.d.ts +3 -0
  16. package/dist/middleware/auth.d.ts.map +1 -0
  17. package/dist/middleware/auth.js +65 -0
  18. package/dist/middleware/auth.js.map +1 -0
  19. package/dist/middleware/rate-limit.d.ts +8 -0
  20. package/dist/middleware/rate-limit.d.ts.map +1 -0
  21. package/dist/middleware/rate-limit.js +72 -0
  22. package/dist/middleware/rate-limit.js.map +1 -0
  23. package/dist/routes/agents.d.ts +3 -0
  24. package/dist/routes/agents.d.ts.map +1 -0
  25. package/dist/routes/agents.js +149 -0
  26. package/dist/routes/agents.js.map +1 -0
  27. package/dist/routes/alerts.d.ts +3 -0
  28. package/dist/routes/alerts.d.ts.map +1 -0
  29. package/dist/routes/alerts.js +286 -0
  30. package/dist/routes/alerts.js.map +1 -0
  31. package/dist/routes/auth.d.ts +3 -0
  32. package/dist/routes/auth.d.ts.map +1 -0
  33. package/dist/routes/auth.js +20 -0
  34. package/dist/routes/auth.js.map +1 -0
  35. package/dist/routes/events.d.ts +3 -0
  36. package/dist/routes/events.d.ts.map +1 -0
  37. package/dist/routes/events.js +304 -0
  38. package/dist/routes/events.js.map +1 -0
  39. package/dist/routes/health.d.ts +3 -0
  40. package/dist/routes/health.d.ts.map +1 -0
  41. package/dist/routes/health.js +13 -0
  42. package/dist/routes/health.js.map +1 -0
  43. package/dist/routes/model-rules.d.ts +3 -0
  44. package/dist/routes/model-rules.d.ts.map +1 -0
  45. package/dist/routes/model-rules.js +71 -0
  46. package/dist/routes/model-rules.js.map +1 -0
  47. package/dist/routes/rate-limits.d.ts +3 -0
  48. package/dist/routes/rate-limits.d.ts.map +1 -0
  49. package/dist/routes/rate-limits.js +58 -0
  50. package/dist/routes/rate-limits.js.map +1 -0
  51. package/dist/routes/stats.d.ts +3 -0
  52. package/dist/routes/stats.d.ts.map +1 -0
  53. package/dist/routes/stats.js +233 -0
  54. package/dist/routes/stats.js.map +1 -0
  55. package/dist/server.d.ts +20 -0
  56. package/dist/server.d.ts.map +1 -0
  57. package/dist/server.js +155 -0
  58. package/dist/server.js.map +1 -0
  59. 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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"}
@@ -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
+ }