@agentplugged/claw 0.1.0
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/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +111 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +94 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/capture.d.ts +13 -0
- package/dist/memory/capture.d.ts.map +1 -0
- package/dist/memory/capture.js +102 -0
- package/dist/memory/capture.js.map +1 -0
- package/dist/memory/db.d.ts +56 -0
- package/dist/memory/db.d.ts.map +1 -0
- package/dist/memory/db.js +206 -0
- package/dist/memory/db.js.map +1 -0
- package/dist/memory/index.d.ts +8 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +42 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/llm-extract.d.ts +13 -0
- package/dist/memory/llm-extract.d.ts.map +1 -0
- package/dist/memory/llm-extract.js +135 -0
- package/dist/memory/llm-extract.js.map +1 -0
- package/dist/memory/recall.d.ts +16 -0
- package/dist/memory/recall.d.ts.map +1 -0
- package/dist/memory/recall.js +131 -0
- package/dist/memory/recall.js.map +1 -0
- package/dist/observability/collector.d.ts +40 -0
- package/dist/observability/collector.d.ts.map +1 -0
- package/dist/observability/collector.js +119 -0
- package/dist/observability/collector.js.map +1 -0
- package/dist/observability/db.d.ts +60 -0
- package/dist/observability/db.d.ts.map +1 -0
- package/dist/observability/db.js +189 -0
- package/dist/observability/db.js.map +1 -0
- package/dist/observability/index.d.ts +7 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +35 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/queries.d.ts +54 -0
- package/dist/observability/queries.d.ts.map +1 -0
- package/dist/observability/queries.js +181 -0
- package/dist/observability/queries.js.map +1 -0
- package/dist/router/classifier.d.ts +8 -0
- package/dist/router/classifier.d.ts.map +1 -0
- package/dist/router/classifier.js +90 -0
- package/dist/router/classifier.js.map +1 -0
- package/dist/router/fallback.d.ts +18 -0
- package/dist/router/fallback.d.ts.map +1 -0
- package/dist/router/fallback.js +102 -0
- package/dist/router/fallback.js.map +1 -0
- package/dist/router/index.d.ts +5 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +214 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/leak-detector.d.ts +33 -0
- package/dist/router/leak-detector.d.ts.map +1 -0
- package/dist/router/leak-detector.js +320 -0
- package/dist/router/leak-detector.js.map +1 -0
- package/dist/router/logger.d.ts +18 -0
- package/dist/router/logger.d.ts.map +1 -0
- package/dist/router/logger.js +130 -0
- package/dist/router/logger.js.map +1 -0
- package/dist/router/models.d.ts +5 -0
- package/dist/router/models.d.ts.map +1 -0
- package/dist/router/models.js +96 -0
- package/dist/router/models.js.map +1 -0
- package/dist/router/providers.d.ts +4 -0
- package/dist/router/providers.d.ts.map +1 -0
- package/dist/router/providers.js +323 -0
- package/dist/router/providers.js.map +1 -0
- package/dist/router/strategy.d.ts +29 -0
- package/dist/router/strategy.d.ts.map +1 -0
- package/dist/router/strategy.js +169 -0
- package/dist/router/strategy.js.map +1 -0
- package/dist/router/types.d.ts +63 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +3 -0
- package/dist/router/types.js.map +1 -0
- package/dist/sidecar/auth.d.ts +7 -0
- package/dist/sidecar/auth.d.ts.map +1 -0
- package/dist/sidecar/auth.js +36 -0
- package/dist/sidecar/auth.js.map +1 -0
- package/dist/sidecar/index.d.ts +2 -0
- package/dist/sidecar/index.d.ts.map +1 -0
- package/dist/sidecar/index.js +336 -0
- package/dist/sidecar/index.js.map +1 -0
- package/dist/sidecar/routes/addons.d.ts +6 -0
- package/dist/sidecar/routes/addons.d.ts.map +1 -0
- package/dist/sidecar/routes/addons.js +332 -0
- package/dist/sidecar/routes/addons.js.map +1 -0
- package/dist/sidecar/routes/backup.d.ts +7 -0
- package/dist/sidecar/routes/backup.d.ts.map +1 -0
- package/dist/sidecar/routes/backup.js +204 -0
- package/dist/sidecar/routes/backup.js.map +1 -0
- package/dist/sidecar/routes/channels.d.ts +4 -0
- package/dist/sidecar/routes/channels.d.ts.map +1 -0
- package/dist/sidecar/routes/channels.js +120 -0
- package/dist/sidecar/routes/channels.js.map +1 -0
- package/dist/sidecar/routes/health.d.ts +5 -0
- package/dist/sidecar/routes/health.d.ts.map +1 -0
- package/dist/sidecar/routes/health.js +28 -0
- package/dist/sidecar/routes/health.js.map +1 -0
- package/dist/sidecar/routes/memory.d.ts +7 -0
- package/dist/sidecar/routes/memory.d.ts.map +1 -0
- package/dist/sidecar/routes/memory.js +234 -0
- package/dist/sidecar/routes/memory.js.map +1 -0
- package/dist/sidecar/routes/metrics.d.ts +5 -0
- package/dist/sidecar/routes/metrics.d.ts.map +1 -0
- package/dist/sidecar/routes/metrics.js +273 -0
- package/dist/sidecar/routes/metrics.js.map +1 -0
- package/dist/sidecar/routes/restart.d.ts +4 -0
- package/dist/sidecar/routes/restart.d.ts.map +1 -0
- package/dist/sidecar/routes/restart.js +81 -0
- package/dist/sidecar/routes/restart.js.map +1 -0
- package/dist/sidecar/routes/router-config.d.ts +5 -0
- package/dist/sidecar/routes/router-config.d.ts.map +1 -0
- package/dist/sidecar/routes/router-config.js +150 -0
- package/dist/sidecar/routes/router-config.js.map +1 -0
- package/dist/sidecar/routes/security.d.ts +8 -0
- package/dist/sidecar/routes/security.d.ts.map +1 -0
- package/dist/sidecar/routes/security.js +308 -0
- package/dist/sidecar/routes/security.js.map +1 -0
- package/dist/sidecar/routes/skills.d.ts +5 -0
- package/dist/sidecar/routes/skills.d.ts.map +1 -0
- package/dist/sidecar/routes/skills.js +146 -0
- package/dist/sidecar/routes/skills.js.map +1 -0
- package/dist/sidecar/routes/soul.d.ts +4 -0
- package/dist/sidecar/routes/soul.d.ts.map +1 -0
- package/dist/sidecar/routes/soul.js +115 -0
- package/dist/sidecar/routes/soul.js.map +1 -0
- package/dist/sidecar/routes/team.d.ts +4 -0
- package/dist/sidecar/routes/team.d.ts.map +1 -0
- package/dist/sidecar/routes/team.js +139 -0
- package/dist/sidecar/routes/team.js.map +1 -0
- package/dist/sidecar/routes/update.d.ts +4 -0
- package/dist/sidecar/routes/update.d.ts.map +1 -0
- package/dist/sidecar/routes/update.js +96 -0
- package/dist/sidecar/routes/update.js.map +1 -0
- package/dist/sidecar/utils.d.ts +9 -0
- package/dist/sidecar/utils.d.ts.map +1 -0
- package/dist/sidecar/utils.js +57 -0
- package/dist/sidecar/utils.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ObservabilityCollector = void 0;
|
|
4
|
+
const db_1 = require("./db");
|
|
5
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
6
|
+
function todayDate() {
|
|
7
|
+
return new Date().toISOString().slice(0, 10); // YYYY-MM-DD
|
|
8
|
+
}
|
|
9
|
+
// ─── Collector ────────────────────────────────────────────────────────────────
|
|
10
|
+
/**
|
|
11
|
+
* ObservabilityCollector hooks into OpenClaw and the router to track
|
|
12
|
+
* every interaction for the dashboard.
|
|
13
|
+
*
|
|
14
|
+
* All methods are synchronous (SQLite writes are fast enough) so they
|
|
15
|
+
* can be called from lifecycle hooks without async overhead.
|
|
16
|
+
*/
|
|
17
|
+
class ObservabilityCollector {
|
|
18
|
+
db;
|
|
19
|
+
// In-memory accumulator for daily stats before flush
|
|
20
|
+
dailyAccumulator = new Map();
|
|
21
|
+
constructor(db) {
|
|
22
|
+
this.db = db;
|
|
23
|
+
}
|
|
24
|
+
// ── Session lifecycle ────────────────────────────────────────────────────────
|
|
25
|
+
/**
|
|
26
|
+
* Called when a new conversation starts (before_agent_start hook).
|
|
27
|
+
*/
|
|
28
|
+
startSession(sessionId, channel) {
|
|
29
|
+
(0, db_1.createSession)(this.db, { id: sessionId, channel });
|
|
30
|
+
(0, db_1.logEvent)(this.db, {
|
|
31
|
+
sessionId,
|
|
32
|
+
type: "session_start",
|
|
33
|
+
data: { channel: channel ?? null },
|
|
34
|
+
});
|
|
35
|
+
this.accumulateDaily("sessions", 1);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Called when the conversation ends (agent_end hook).
|
|
39
|
+
*/
|
|
40
|
+
endSession(sessionId) {
|
|
41
|
+
(0, db_1.endSession)(this.db, sessionId);
|
|
42
|
+
(0, db_1.logEvent)(this.db, { sessionId, type: "session_end" });
|
|
43
|
+
}
|
|
44
|
+
// ── Message tracking ─────────────────────────────────────────────────────────
|
|
45
|
+
/**
|
|
46
|
+
* Called for each message sent or received.
|
|
47
|
+
*/
|
|
48
|
+
trackMessage(sessionId, role, tokens) {
|
|
49
|
+
(0, db_1.updateSessionStats)(this.db, sessionId, { messages: 1 });
|
|
50
|
+
(0, db_1.logEvent)(this.db, {
|
|
51
|
+
sessionId,
|
|
52
|
+
type: "message",
|
|
53
|
+
data: { role, tokens },
|
|
54
|
+
});
|
|
55
|
+
this.accumulateDaily("messages", 1);
|
|
56
|
+
}
|
|
57
|
+
// ── Tool call tracking ───────────────────────────────────────────────────────
|
|
58
|
+
/**
|
|
59
|
+
* Called for each tool invocation.
|
|
60
|
+
*/
|
|
61
|
+
trackToolCall(sessionId, toolName, duration, success) {
|
|
62
|
+
(0, db_1.updateSessionStats)(this.db, sessionId, { toolCalls: 1 });
|
|
63
|
+
(0, db_1.logEvent)(this.db, {
|
|
64
|
+
sessionId,
|
|
65
|
+
type: "tool_call",
|
|
66
|
+
data: { tool: toolName, duration_ms: duration, success },
|
|
67
|
+
});
|
|
68
|
+
this.accumulateDaily("tool_calls", 1);
|
|
69
|
+
if (!success) {
|
|
70
|
+
this.accumulateDaily("errors", 1);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ── LLM call tracking ────────────────────────────────────────────────────────
|
|
74
|
+
/**
|
|
75
|
+
* Called when an LLM request completes (from router logs).
|
|
76
|
+
*/
|
|
77
|
+
trackLLMCall(sessionId, model, inputTokens, outputTokens, cost, latencyMs) {
|
|
78
|
+
(0, db_1.updateSessionStats)(this.db, sessionId, {
|
|
79
|
+
inputTokens,
|
|
80
|
+
outputTokens,
|
|
81
|
+
cost,
|
|
82
|
+
});
|
|
83
|
+
(0, db_1.logEvent)(this.db, {
|
|
84
|
+
sessionId,
|
|
85
|
+
type: "llm_call",
|
|
86
|
+
data: {
|
|
87
|
+
model,
|
|
88
|
+
input_tokens: inputTokens,
|
|
89
|
+
output_tokens: outputTokens,
|
|
90
|
+
cost,
|
|
91
|
+
latency_ms: latencyMs,
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
this.accumulateDaily("tokens_in", inputTokens);
|
|
95
|
+
this.accumulateDaily("tokens_out", outputTokens);
|
|
96
|
+
this.accumulateDaily("cost", cost);
|
|
97
|
+
}
|
|
98
|
+
// ── Daily stats flush ─────────────────────────────────────────────────────────
|
|
99
|
+
/**
|
|
100
|
+
* Flushes accumulated daily stats to the database.
|
|
101
|
+
* Should be called periodically (e.g. every minute) or at session end.
|
|
102
|
+
*/
|
|
103
|
+
flushDailyStats() {
|
|
104
|
+
if (this.dailyAccumulator.size === 0)
|
|
105
|
+
return;
|
|
106
|
+
const date = todayDate();
|
|
107
|
+
for (const [metric, value] of this.dailyAccumulator.entries()) {
|
|
108
|
+
(0, db_1.updateDailyStat)(this.db, date, metric, value);
|
|
109
|
+
}
|
|
110
|
+
this.dailyAccumulator.clear();
|
|
111
|
+
}
|
|
112
|
+
// ── Private helpers ───────────────────────────────────────────────────────────
|
|
113
|
+
accumulateDaily(metric, value) {
|
|
114
|
+
const current = this.dailyAccumulator.get(metric) ?? 0;
|
|
115
|
+
this.dailyAccumulator.set(metric, current + value);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.ObservabilityCollector = ObservabilityCollector;
|
|
119
|
+
//# sourceMappingURL=collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/observability/collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
export interface Session {
|
|
3
|
+
id: string;
|
|
4
|
+
channel: string | null;
|
|
5
|
+
started_at: string;
|
|
6
|
+
ended_at: string | null;
|
|
7
|
+
message_count: number;
|
|
8
|
+
total_input_tokens: number;
|
|
9
|
+
total_output_tokens: number;
|
|
10
|
+
total_cost: number;
|
|
11
|
+
tool_calls: number;
|
|
12
|
+
status: string;
|
|
13
|
+
}
|
|
14
|
+
export interface Event {
|
|
15
|
+
id: number;
|
|
16
|
+
session_id: string | null;
|
|
17
|
+
type: string;
|
|
18
|
+
data: string | null;
|
|
19
|
+
timestamp: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Opens (or creates) the metrics SQLite database.
|
|
23
|
+
* Stored at <dataDir>/observability/metrics.db.
|
|
24
|
+
* WAL mode is enabled for concurrent reads.
|
|
25
|
+
*/
|
|
26
|
+
export declare function openMetricsDatabase(dataDir: string): Database.Database;
|
|
27
|
+
/**
|
|
28
|
+
* Creates a new session record.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createSession(db: Database.Database, opts: {
|
|
31
|
+
id: string;
|
|
32
|
+
channel?: string;
|
|
33
|
+
}): void;
|
|
34
|
+
/**
|
|
35
|
+
* Marks a session as completed and sets ended_at.
|
|
36
|
+
*/
|
|
37
|
+
export declare function endSession(db: Database.Database, id: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Inserts a generic event record linked to an optional session.
|
|
40
|
+
*/
|
|
41
|
+
export declare function logEvent(db: Database.Database, event: {
|
|
42
|
+
sessionId?: string;
|
|
43
|
+
type: string;
|
|
44
|
+
data?: unknown;
|
|
45
|
+
}): void;
|
|
46
|
+
/**
|
|
47
|
+
* Increments session counters atomically.
|
|
48
|
+
*/
|
|
49
|
+
export declare function updateSessionStats(db: Database.Database, sessionId: string, stats: {
|
|
50
|
+
messages?: number;
|
|
51
|
+
inputTokens?: number;
|
|
52
|
+
outputTokens?: number;
|
|
53
|
+
cost?: number;
|
|
54
|
+
toolCalls?: number;
|
|
55
|
+
}): void;
|
|
56
|
+
/**
|
|
57
|
+
* Upserts a daily stat value (additive).
|
|
58
|
+
*/
|
|
59
|
+
export declare function updateDailyStat(db: Database.Database, date: string, metric: string, value: number): void;
|
|
60
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/observability/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AA4CtC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CActE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAMlE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1D,IAAI,CAcN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;IACL,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,IAAI,CAgCN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,IAAI,CAWN"}
|
|
@@ -0,0 +1,189 @@
|
|
|
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.openMetricsDatabase = openMetricsDatabase;
|
|
40
|
+
exports.createSession = createSession;
|
|
41
|
+
exports.endSession = endSession;
|
|
42
|
+
exports.logEvent = logEvent;
|
|
43
|
+
exports.updateSessionStats = updateSessionStats;
|
|
44
|
+
exports.updateDailyStat = updateDailyStat;
|
|
45
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
// ─── Schema ──────────────────────────────────────────────────────────────────
|
|
49
|
+
const SCHEMA_SQL = `
|
|
50
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
51
|
+
id TEXT PRIMARY KEY,
|
|
52
|
+
channel TEXT,
|
|
53
|
+
started_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
54
|
+
ended_at TEXT,
|
|
55
|
+
message_count INTEGER NOT NULL DEFAULT 0,
|
|
56
|
+
total_input_tokens INTEGER NOT NULL DEFAULT 0,
|
|
57
|
+
total_output_tokens INTEGER NOT NULL DEFAULT 0,
|
|
58
|
+
total_cost REAL NOT NULL DEFAULT 0,
|
|
59
|
+
tool_calls INTEGER NOT NULL DEFAULT 0,
|
|
60
|
+
status TEXT NOT NULL DEFAULT 'active'
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
64
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
65
|
+
session_id TEXT,
|
|
66
|
+
type TEXT NOT NULL,
|
|
67
|
+
data TEXT,
|
|
68
|
+
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
|
|
69
|
+
FOREIGN KEY (session_id) REFERENCES sessions(id)
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_events_type ON events(type);
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions(started_at);
|
|
76
|
+
|
|
77
|
+
CREATE TABLE IF NOT EXISTS daily_stats (
|
|
78
|
+
date TEXT NOT NULL,
|
|
79
|
+
metric TEXT NOT NULL,
|
|
80
|
+
value REAL NOT NULL DEFAULT 0,
|
|
81
|
+
PRIMARY KEY (date, metric)
|
|
82
|
+
);
|
|
83
|
+
`;
|
|
84
|
+
// ─── Functions ────────────────────────────────────────────────────────────────
|
|
85
|
+
/**
|
|
86
|
+
* Opens (or creates) the metrics SQLite database.
|
|
87
|
+
* Stored at <dataDir>/observability/metrics.db.
|
|
88
|
+
* WAL mode is enabled for concurrent reads.
|
|
89
|
+
*/
|
|
90
|
+
function openMetricsDatabase(dataDir) {
|
|
91
|
+
const obsDir = path.join(dataDir, "observability");
|
|
92
|
+
if (!fs.existsSync(obsDir)) {
|
|
93
|
+
fs.mkdirSync(obsDir, { recursive: true });
|
|
94
|
+
}
|
|
95
|
+
const dbPath = path.join(obsDir, "metrics.db");
|
|
96
|
+
const db = new better_sqlite3_1.default(dbPath);
|
|
97
|
+
db.pragma("journal_mode = WAL");
|
|
98
|
+
db.exec(SCHEMA_SQL);
|
|
99
|
+
return db;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Creates a new session record.
|
|
103
|
+
*/
|
|
104
|
+
function createSession(db, opts) {
|
|
105
|
+
db.prepare(`
|
|
106
|
+
INSERT OR IGNORE INTO sessions (id, channel, status)
|
|
107
|
+
VALUES (@id, @channel, 'active')
|
|
108
|
+
`).run({ id: opts.id, channel: opts.channel ?? null });
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Marks a session as completed and sets ended_at.
|
|
112
|
+
*/
|
|
113
|
+
function endSession(db, id) {
|
|
114
|
+
db.prepare(`
|
|
115
|
+
UPDATE sessions
|
|
116
|
+
SET ended_at = datetime('now'), status = 'completed'
|
|
117
|
+
WHERE id = @id AND status = 'active'
|
|
118
|
+
`).run({ id });
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Inserts a generic event record linked to an optional session.
|
|
122
|
+
*/
|
|
123
|
+
function logEvent(db, event) {
|
|
124
|
+
try {
|
|
125
|
+
db.prepare(`
|
|
126
|
+
INSERT INTO events (session_id, type, data)
|
|
127
|
+
VALUES (@sessionId, @type, @data)
|
|
128
|
+
`).run({
|
|
129
|
+
sessionId: event.sessionId ?? null,
|
|
130
|
+
type: event.type,
|
|
131
|
+
data: event.data !== undefined ? JSON.stringify(event.data) : null,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
// Observability must never crash the system
|
|
136
|
+
console.error("[observability/db] Failed to log event:", err);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Increments session counters atomically.
|
|
141
|
+
*/
|
|
142
|
+
function updateSessionStats(db, sessionId, stats) {
|
|
143
|
+
const setClauses = [];
|
|
144
|
+
const params = { id: sessionId };
|
|
145
|
+
if (stats.messages !== undefined) {
|
|
146
|
+
setClauses.push("message_count = message_count + @messages");
|
|
147
|
+
params["messages"] = stats.messages;
|
|
148
|
+
}
|
|
149
|
+
if (stats.inputTokens !== undefined) {
|
|
150
|
+
setClauses.push("total_input_tokens = total_input_tokens + @inputTokens");
|
|
151
|
+
params["inputTokens"] = stats.inputTokens;
|
|
152
|
+
}
|
|
153
|
+
if (stats.outputTokens !== undefined) {
|
|
154
|
+
setClauses.push("total_output_tokens = total_output_tokens + @outputTokens");
|
|
155
|
+
params["outputTokens"] = stats.outputTokens;
|
|
156
|
+
}
|
|
157
|
+
if (stats.cost !== undefined) {
|
|
158
|
+
setClauses.push("total_cost = total_cost + @cost");
|
|
159
|
+
params["cost"] = stats.cost;
|
|
160
|
+
}
|
|
161
|
+
if (stats.toolCalls !== undefined) {
|
|
162
|
+
setClauses.push("tool_calls = tool_calls + @toolCalls");
|
|
163
|
+
params["toolCalls"] = stats.toolCalls;
|
|
164
|
+
}
|
|
165
|
+
if (setClauses.length === 0)
|
|
166
|
+
return;
|
|
167
|
+
db.prepare(`
|
|
168
|
+
UPDATE sessions
|
|
169
|
+
SET ${setClauses.join(", ")}
|
|
170
|
+
WHERE id = @id
|
|
171
|
+
`).run(params);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Upserts a daily stat value (additive).
|
|
175
|
+
*/
|
|
176
|
+
function updateDailyStat(db, date, metric, value) {
|
|
177
|
+
try {
|
|
178
|
+
db.prepare(`
|
|
179
|
+
INSERT INTO daily_stats (date, metric, value)
|
|
180
|
+
VALUES (@date, @metric, @value)
|
|
181
|
+
ON CONFLICT(date, metric)
|
|
182
|
+
DO UPDATE SET value = value + @value
|
|
183
|
+
`).run({ date, metric, value });
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
console.error("[observability/db] Failed to update daily stat:", err);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/observability/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { openMetricsDatabase, createSession, endSession, logEvent, updateSessionStats, updateDailyStat, } from "./db";
|
|
2
|
+
export type { Session, Event } from "./db";
|
|
3
|
+
export { ObservabilityCollector } from "./collector";
|
|
4
|
+
export { getTodayStats, getWeeklyStats, getMonthlyStats, getActiveSessions, getRecentSessions, getSessionEvents, getTopSkillsByCost, getModelDistribution, } from "./queries";
|
|
5
|
+
export type { DayStats } from "./queries";
|
|
6
|
+
export declare const OBSERVABILITY_SKILL_MD = "---\nname: agentplugged-observability\ndescription: Usage tracking and metrics collection\nalways: true\nhidden: true\n---\n\n# Observability\n\nThis agent is monitored by AgentPlugged ClawMetry. All interactions, tool calls, and token usage are tracked for the dashboard.\n\nThis skill is invisible to users and requires no interaction.\n";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,UAAU,EACV,QAAQ,EACR,kBAAkB,EAClB,eAAe,GAChB,MAAM,MAAM,CAAC;AACd,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EACL,aAAa,EACb,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,eAAO,MAAM,sBAAsB,wVAYlC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OBSERVABILITY_SKILL_MD = exports.getModelDistribution = exports.getTopSkillsByCost = exports.getSessionEvents = exports.getRecentSessions = exports.getActiveSessions = exports.getMonthlyStats = exports.getWeeklyStats = exports.getTodayStats = exports.ObservabilityCollector = exports.updateDailyStat = exports.updateSessionStats = exports.logEvent = exports.endSession = exports.createSession = exports.openMetricsDatabase = void 0;
|
|
4
|
+
var db_1 = require("./db");
|
|
5
|
+
Object.defineProperty(exports, "openMetricsDatabase", { enumerable: true, get: function () { return db_1.openMetricsDatabase; } });
|
|
6
|
+
Object.defineProperty(exports, "createSession", { enumerable: true, get: function () { return db_1.createSession; } });
|
|
7
|
+
Object.defineProperty(exports, "endSession", { enumerable: true, get: function () { return db_1.endSession; } });
|
|
8
|
+
Object.defineProperty(exports, "logEvent", { enumerable: true, get: function () { return db_1.logEvent; } });
|
|
9
|
+
Object.defineProperty(exports, "updateSessionStats", { enumerable: true, get: function () { return db_1.updateSessionStats; } });
|
|
10
|
+
Object.defineProperty(exports, "updateDailyStat", { enumerable: true, get: function () { return db_1.updateDailyStat; } });
|
|
11
|
+
var collector_1 = require("./collector");
|
|
12
|
+
Object.defineProperty(exports, "ObservabilityCollector", { enumerable: true, get: function () { return collector_1.ObservabilityCollector; } });
|
|
13
|
+
var queries_1 = require("./queries");
|
|
14
|
+
Object.defineProperty(exports, "getTodayStats", { enumerable: true, get: function () { return queries_1.getTodayStats; } });
|
|
15
|
+
Object.defineProperty(exports, "getWeeklyStats", { enumerable: true, get: function () { return queries_1.getWeeklyStats; } });
|
|
16
|
+
Object.defineProperty(exports, "getMonthlyStats", { enumerable: true, get: function () { return queries_1.getMonthlyStats; } });
|
|
17
|
+
Object.defineProperty(exports, "getActiveSessions", { enumerable: true, get: function () { return queries_1.getActiveSessions; } });
|
|
18
|
+
Object.defineProperty(exports, "getRecentSessions", { enumerable: true, get: function () { return queries_1.getRecentSessions; } });
|
|
19
|
+
Object.defineProperty(exports, "getSessionEvents", { enumerable: true, get: function () { return queries_1.getSessionEvents; } });
|
|
20
|
+
Object.defineProperty(exports, "getTopSkillsByCost", { enumerable: true, get: function () { return queries_1.getTopSkillsByCost; } });
|
|
21
|
+
Object.defineProperty(exports, "getModelDistribution", { enumerable: true, get: function () { return queries_1.getModelDistribution; } });
|
|
22
|
+
exports.OBSERVABILITY_SKILL_MD = `---
|
|
23
|
+
name: agentplugged-observability
|
|
24
|
+
description: Usage tracking and metrics collection
|
|
25
|
+
always: true
|
|
26
|
+
hidden: true
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
# Observability
|
|
30
|
+
|
|
31
|
+
This agent is monitored by AgentPlugged ClawMetry. All interactions, tool calls, and token usage are tracked for the dashboard.
|
|
32
|
+
|
|
33
|
+
This skill is invisible to users and requires no interaction.
|
|
34
|
+
`;
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":";;;AAAA,2BAOc;AANZ,yGAAA,mBAAmB,OAAA;AACnB,mGAAA,aAAa,OAAA;AACb,gGAAA,UAAU,OAAA;AACV,8FAAA,QAAQ,OAAA;AACR,wGAAA,kBAAkB,OAAA;AAClB,qGAAA,eAAe,OAAA;AAIjB,yCAAqD;AAA5C,mHAAA,sBAAsB,OAAA;AAE/B,qCASmB;AARjB,wGAAA,aAAa,OAAA;AACb,yGAAA,cAAc,OAAA;AACd,0GAAA,eAAe,OAAA;AACf,4GAAA,iBAAiB,OAAA;AACjB,4GAAA,iBAAiB,OAAA;AACjB,2GAAA,gBAAgB,OAAA;AAChB,6GAAA,kBAAkB,OAAA;AAClB,+GAAA,oBAAoB,OAAA;AAIT,QAAA,sBAAsB,GAAG;;;;;;;;;;;;CAYrC,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import { Session, Event } from "./db";
|
|
3
|
+
export interface DayStats {
|
|
4
|
+
date: string;
|
|
5
|
+
messages: number;
|
|
6
|
+
tokens_in: number;
|
|
7
|
+
tokens_out: number;
|
|
8
|
+
cost: number;
|
|
9
|
+
tool_calls: number;
|
|
10
|
+
sessions: number;
|
|
11
|
+
errors: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Returns aggregated stats for today.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getTodayStats(db: Database.Database): DayStats;
|
|
17
|
+
/**
|
|
18
|
+
* Returns aggregated stats for each of the last 7 days.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getWeeklyStats(db: Database.Database): DayStats[];
|
|
21
|
+
/**
|
|
22
|
+
* Returns aggregated stats for each of the last 30 days.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getMonthlyStats(db: Database.Database): DayStats[];
|
|
25
|
+
/**
|
|
26
|
+
* Returns sessions currently in 'active' status.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getActiveSessions(db: Database.Database): Session[];
|
|
29
|
+
/**
|
|
30
|
+
* Returns the most recent sessions (default: 20).
|
|
31
|
+
*/
|
|
32
|
+
export declare function getRecentSessions(db: Database.Database, limit?: number): Session[];
|
|
33
|
+
/**
|
|
34
|
+
* Returns all events for a given session, ordered chronologically.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getSessionEvents(db: Database.Database, sessionId: string): Event[];
|
|
37
|
+
/**
|
|
38
|
+
* Returns the top skills ranked by cost over the last N days.
|
|
39
|
+
* Skill name is extracted from the tool_call event's data.tool field.
|
|
40
|
+
*/
|
|
41
|
+
export declare function getTopSkillsByCost(db: Database.Database, days?: number): Array<{
|
|
42
|
+
skill: string;
|
|
43
|
+
cost: number;
|
|
44
|
+
calls: number;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Returns model distribution (call count and total cost) over the last N days.
|
|
48
|
+
*/
|
|
49
|
+
export declare function getModelDistribution(db: Database.Database, days?: number): Array<{
|
|
50
|
+
model: string;
|
|
51
|
+
count: number;
|
|
52
|
+
cost: number;
|
|
53
|
+
}>;
|
|
54
|
+
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/observability/queries.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAItC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AA4DD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAW7D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAqBhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAoBjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,EAAE,CAMlE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,SAAK,GACT,OAAO,EAAE,CAMX;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,GAChB,KAAK,EAAE,CAMT;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,SAAK,GACR,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAwCvD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,SAAK,GACR,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAyBvD"}
|