@timmeck/brain-core 2.36.38 → 2.36.40

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-router.js","sourceRoot":"","sources":["../../src/messaging/message-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Telegram Bot — Bidirektionaler Message-Handler
3
+ *
4
+ * Empfängt Nachrichten via grammy Long Polling, routet sie durch
5
+ * den MessageRouter und sendet die Antwort zurück.
6
+ *
7
+ * Voraussetzungen:
8
+ * npm install grammy (optional dependency)
9
+ * TELEGRAM_BOT_TOKEN in .env
10
+ * TELEGRAM_CHAT_ID in .env (optional: beschränkt auf einen Chat)
11
+ */
12
+ import type { MessageRouter } from './message-router.js';
13
+ export interface TelegramBotConfig {
14
+ botToken?: string;
15
+ /** If set, only respond in this chat. */
16
+ chatId?: string;
17
+ /** Allowed user IDs (if empty, all allowed). */
18
+ allowedUsers?: string[];
19
+ }
20
+ export interface TelegramBotStatus {
21
+ running: boolean;
22
+ messagesReceived: number;
23
+ messagesSent: number;
24
+ errors: number;
25
+ startedAt: number | null;
26
+ }
27
+ export declare class TelegramBot {
28
+ private readonly log;
29
+ private readonly botToken;
30
+ private readonly chatId;
31
+ private readonly allowedUsers;
32
+ private bot;
33
+ private router;
34
+ private running;
35
+ private stats;
36
+ constructor(config?: TelegramBotConfig);
37
+ /** Set the message router for dispatching incoming messages. */
38
+ setRouter(router: MessageRouter): void;
39
+ /** Check if Telegram bot can start. */
40
+ isConfigured(): boolean;
41
+ /** Start listening for messages. */
42
+ start(): Promise<void>;
43
+ /** Stop the bot. */
44
+ stop(): Promise<void>;
45
+ /** Get bot status. */
46
+ getStatus(): TelegramBotStatus;
47
+ private escapeHtml;
48
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Telegram Bot — Bidirektionaler Message-Handler
3
+ *
4
+ * Empfängt Nachrichten via grammy Long Polling, routet sie durch
5
+ * den MessageRouter und sendet die Antwort zurück.
6
+ *
7
+ * Voraussetzungen:
8
+ * npm install grammy (optional dependency)
9
+ * TELEGRAM_BOT_TOKEN in .env
10
+ * TELEGRAM_CHAT_ID in .env (optional: beschränkt auf einen Chat)
11
+ */
12
+ import { getLogger } from '../utils/logger.js';
13
+ export class TelegramBot {
14
+ log = getLogger();
15
+ botToken;
16
+ chatId;
17
+ allowedUsers;
18
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
+ bot = null;
20
+ router = null;
21
+ running = false;
22
+ stats = {
23
+ messagesReceived: 0,
24
+ messagesSent: 0,
25
+ errors: 0,
26
+ startedAt: null,
27
+ };
28
+ constructor(config = {}) {
29
+ this.botToken = config.botToken ?? process.env.TELEGRAM_BOT_TOKEN ?? null;
30
+ this.chatId = config.chatId ?? process.env.TELEGRAM_CHAT_ID ?? null;
31
+ this.allowedUsers = new Set(config.allowedUsers ?? []);
32
+ }
33
+ /** Set the message router for dispatching incoming messages. */
34
+ setRouter(router) {
35
+ this.router = router;
36
+ }
37
+ /** Check if Telegram bot can start. */
38
+ isConfigured() {
39
+ return !!this.botToken;
40
+ }
41
+ /** Start listening for messages. */
42
+ async start() {
43
+ if (!this.botToken) {
44
+ this.log.debug('[TelegramBot] No TELEGRAM_BOT_TOKEN set, skipping');
45
+ return;
46
+ }
47
+ if (this.running)
48
+ return;
49
+ try {
50
+ const modulePath = 'grammy';
51
+ const { Bot } = await import(/* webpackIgnore: true */ modulePath);
52
+ this.bot = new Bot(this.botToken);
53
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
54
+ this.bot.on('message:text', async (ctx) => {
55
+ try {
56
+ const senderId = String(ctx.from?.id ?? '');
57
+ const senderName = ctx.from?.first_name ?? ctx.from?.username ?? 'unknown';
58
+ const chatId = String(ctx.chat?.id ?? '');
59
+ // Chat filter
60
+ if (this.chatId && chatId !== this.chatId)
61
+ return;
62
+ // User filter
63
+ if (this.allowedUsers.size > 0 && !this.allowedUsers.has(senderId)) {
64
+ await ctx.reply('Zugriff verweigert.');
65
+ return;
66
+ }
67
+ this.stats.messagesReceived++;
68
+ if (!this.router) {
69
+ await ctx.reply('MessageRouter nicht konfiguriert.');
70
+ return;
71
+ }
72
+ const response = await this.router.route({
73
+ text: ctx.message.text,
74
+ senderId,
75
+ senderName,
76
+ platform: 'telegram',
77
+ channelId: chatId,
78
+ });
79
+ if (response.code) {
80
+ await ctx.reply(`<pre>${this.escapeHtml(response.text)}</pre>`, { parse_mode: 'HTML' });
81
+ }
82
+ else {
83
+ await ctx.reply(response.text);
84
+ }
85
+ this.stats.messagesSent++;
86
+ }
87
+ catch (err) {
88
+ this.stats.errors++;
89
+ this.log.warn(`[TelegramBot] Error handling message: ${err.message}`);
90
+ try {
91
+ await ctx.reply('Interner Fehler.');
92
+ }
93
+ catch { /* best effort */ }
94
+ }
95
+ });
96
+ // Start polling (non-blocking)
97
+ this.bot.start({
98
+ onStart: () => {
99
+ this.log.info('[TelegramBot] Bot started, listening for messages');
100
+ },
101
+ });
102
+ this.running = true;
103
+ this.stats.startedAt = Date.now();
104
+ }
105
+ catch (err) {
106
+ this.log.warn(`[TelegramBot] Failed to start: ${err.message}`);
107
+ }
108
+ }
109
+ /** Stop the bot. */
110
+ async stop() {
111
+ if (this.bot && this.running) {
112
+ try {
113
+ await this.bot.stop();
114
+ }
115
+ catch { /* best effort */ }
116
+ this.running = false;
117
+ }
118
+ }
119
+ /** Get bot status. */
120
+ getStatus() {
121
+ return {
122
+ running: this.running,
123
+ messagesReceived: this.stats.messagesReceived,
124
+ messagesSent: this.stats.messagesSent,
125
+ errors: this.stats.errors,
126
+ startedAt: this.stats.startedAt,
127
+ };
128
+ }
129
+ escapeHtml(text) {
130
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
131
+ }
132
+ }
133
+ //# sourceMappingURL=telegram-bot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-bot.js","sourceRoot":"","sources":["../../src/messaging/telegram-bot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAmB/C,MAAM,OAAO,WAAW;IACL,GAAG,GAAG,SAAS,EAAE,CAAC;IAClB,QAAQ,CAAgB;IACxB,MAAM,CAAgB;IACtB,YAAY,CAAc;IAC3C,8DAA8D;IACtD,GAAG,GAAQ,IAAI,CAAC;IAChB,MAAM,GAAyB,IAAI,CAAC;IACpC,OAAO,GAAG,KAAK,CAAC;IAChB,KAAK,GAAG;QACd,gBAAgB,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;QACf,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,IAAqB;KACjC,CAAC;IAEF,YAAY,SAA4B,EAAE;QACxC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC;QAC1E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC;QACpE,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,gEAAgE;IAChE,SAAS,CAAC,MAAqB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,uCAAuC;IACvC,YAAY;QACV,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAEzB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,QAAQ,CAAC;YAC5B,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC;YACnE,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAElC,8DAA8D;YAC9D,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,GAAQ,EAAE,EAAE;gBAC7C,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,UAAU,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,IAAI,SAAS,CAAC;oBAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;oBAE1C,cAAc;oBACd,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM;wBAAE,OAAO;oBAElD,cAAc;oBACd,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACnE,MAAM,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;wBACvC,OAAO;oBACT,CAAC;oBAED,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;oBAE9B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;wBACjB,MAAM,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;wBACrD,OAAO;oBACT,CAAC;oBAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;wBACvC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;wBACtB,QAAQ;wBACR,UAAU;wBACV,QAAQ,EAAE,UAAU;wBACpB,SAAS,EAAE,MAAM;qBAClB,CAAC,CAAC;oBAEH,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;wBAClB,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC1F,CAAC;yBAAM,CAAC;wBACN,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBACjC,CAAC;oBACD,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC5B,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,yCAA0C,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;oBACjF,IAAI,CAAC;wBAAC,MAAM,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,+BAA+B;YAC/B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;gBACb,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;gBACrE,CAAC;aACF,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kCAAmC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,SAAS;QACP,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB;YAC7C,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;YACrC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YACzB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;SAChC,CAAC;IACJ,CAAC;IAEO,UAAU,CAAC,IAAY;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjF,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export { TraceCollector, runTraceMigration } from './trace-collector.js';
2
+ export type { Trace, Span, TraceTree, TraceStats, TraceListOptions, TraceCollectorStatus, } from './trace-collector.js';
@@ -0,0 +1,2 @@
1
+ export { TraceCollector, runTraceMigration } from './trace-collector.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Trace Collector — Observability für das Brain Ecosystem
3
+ *
4
+ * Inspiriert von OpenTelemetry / LangSmith Tracing.
5
+ * Erfasst Spans (Arbeitseinheiten) in hierarchischen Traces,
6
+ * speichert sie in SQLite und berechnet Latenz-Statistiken.
7
+ *
8
+ * Usage:
9
+ * ```typescript
10
+ * const traceId = collector.startTrace('research-cycle');
11
+ * const spanId = collector.startSpan(traceId, 'llm-call', { template: 'explain' });
12
+ * // ... do work ...
13
+ * collector.endSpan(spanId, { tokens: 150, cost: 0.001 });
14
+ * collector.endTrace(traceId);
15
+ * ```
16
+ */
17
+ import type Database from 'better-sqlite3';
18
+ export interface Trace {
19
+ id: string;
20
+ name: string;
21
+ status: 'running' | 'completed' | 'error';
22
+ startedAt: number;
23
+ endedAt: number | null;
24
+ durationMs: number | null;
25
+ spanCount: number;
26
+ totalTokens: number;
27
+ totalCost: number;
28
+ metadata: Record<string, unknown>;
29
+ error?: string;
30
+ }
31
+ export interface Span {
32
+ id: string;
33
+ traceId: string;
34
+ parentSpanId: string | null;
35
+ name: string;
36
+ status: 'running' | 'completed' | 'error';
37
+ startedAt: number;
38
+ endedAt: number | null;
39
+ durationMs: number | null;
40
+ tokens: number;
41
+ cost: number;
42
+ metadata: Record<string, unknown>;
43
+ error?: string;
44
+ }
45
+ export interface TraceTree {
46
+ trace: Trace;
47
+ spans: Span[];
48
+ }
49
+ export interface TraceStats {
50
+ totalTraces: number;
51
+ totalSpans: number;
52
+ totalTokens: number;
53
+ totalCost: number;
54
+ avgDurationMs: number;
55
+ p50DurationMs: number;
56
+ p99DurationMs: number;
57
+ tracesByName: Record<string, number>;
58
+ activeTraces: number;
59
+ }
60
+ export interface TraceListOptions {
61
+ limit?: number;
62
+ offset?: number;
63
+ name?: string;
64
+ status?: 'running' | 'completed' | 'error';
65
+ since?: number;
66
+ }
67
+ export interface TraceCollectorStatus {
68
+ totalTraces: number;
69
+ activeTraces: number;
70
+ totalSpans: number;
71
+ totalTokens: number;
72
+ totalCost: number;
73
+ }
74
+ export declare function runTraceMigration(db: Database.Database): void;
75
+ export declare class TraceCollector {
76
+ private db;
77
+ private readonly log;
78
+ private stmtInsertTrace;
79
+ private stmtInsertSpan;
80
+ private stmtEndTrace;
81
+ private stmtEndSpan;
82
+ private stmtUpdateTraceStats;
83
+ constructor(db: Database.Database);
84
+ /** Start a new trace. Returns trace ID. */
85
+ startTrace(name: string, metadata?: Record<string, unknown>): string;
86
+ /** End a trace (complete or error). */
87
+ endTrace(traceId: string, error?: string): void;
88
+ /** Start a span within a trace. Returns span ID. */
89
+ startSpan(traceId: string, name: string, options?: {
90
+ parentSpanId?: string;
91
+ metadata?: Record<string, unknown>;
92
+ }): string;
93
+ /** End a span with optional results. */
94
+ endSpan(spanId: string, result?: {
95
+ tokens?: number;
96
+ cost?: number;
97
+ error?: string;
98
+ }): void;
99
+ /** Get a single trace with all its spans. */
100
+ getTrace(traceId: string): TraceTree | null;
101
+ /** List traces with optional filters. */
102
+ listTraces(options?: TraceListOptions): Trace[];
103
+ /** Get aggregate statistics. */
104
+ getStats(): TraceStats;
105
+ /** Get collector status (lightweight). */
106
+ getStatus(): TraceCollectorStatus;
107
+ /** Delete traces older than maxAgeDays. Returns number pruned. */
108
+ prune(maxAgeDays?: number): number;
109
+ private mapTrace;
110
+ private mapSpan;
111
+ }
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Trace Collector — Observability für das Brain Ecosystem
3
+ *
4
+ * Inspiriert von OpenTelemetry / LangSmith Tracing.
5
+ * Erfasst Spans (Arbeitseinheiten) in hierarchischen Traces,
6
+ * speichert sie in SQLite und berechnet Latenz-Statistiken.
7
+ *
8
+ * Usage:
9
+ * ```typescript
10
+ * const traceId = collector.startTrace('research-cycle');
11
+ * const spanId = collector.startSpan(traceId, 'llm-call', { template: 'explain' });
12
+ * // ... do work ...
13
+ * collector.endSpan(spanId, { tokens: 150, cost: 0.001 });
14
+ * collector.endTrace(traceId);
15
+ * ```
16
+ */
17
+ import { randomUUID } from 'node:crypto';
18
+ import { getLogger } from '../utils/logger.js';
19
+ // ── Migration ───────────────────────────────────────────
20
+ export function runTraceMigration(db) {
21
+ db.exec(`
22
+ CREATE TABLE IF NOT EXISTS workflow_traces (
23
+ id TEXT PRIMARY KEY,
24
+ name TEXT NOT NULL,
25
+ status TEXT NOT NULL DEFAULT 'running',
26
+ started_at INTEGER NOT NULL,
27
+ ended_at INTEGER,
28
+ duration_ms INTEGER,
29
+ span_count INTEGER NOT NULL DEFAULT 0,
30
+ total_tokens INTEGER NOT NULL DEFAULT 0,
31
+ total_cost REAL NOT NULL DEFAULT 0,
32
+ metadata TEXT DEFAULT '{}',
33
+ error TEXT,
34
+ created_at TEXT DEFAULT (datetime('now'))
35
+ );
36
+ CREATE INDEX IF NOT EXISTS idx_traces_name ON workflow_traces(name);
37
+ CREATE INDEX IF NOT EXISTS idx_traces_status ON workflow_traces(status);
38
+ CREATE INDEX IF NOT EXISTS idx_traces_started ON workflow_traces(started_at);
39
+
40
+ CREATE TABLE IF NOT EXISTS trace_spans (
41
+ id TEXT PRIMARY KEY,
42
+ trace_id TEXT NOT NULL,
43
+ parent_span_id TEXT,
44
+ name TEXT NOT NULL,
45
+ status TEXT NOT NULL DEFAULT 'running',
46
+ started_at INTEGER NOT NULL,
47
+ ended_at INTEGER,
48
+ duration_ms INTEGER,
49
+ tokens INTEGER NOT NULL DEFAULT 0,
50
+ cost REAL NOT NULL DEFAULT 0,
51
+ metadata TEXT DEFAULT '{}',
52
+ error TEXT,
53
+ FOREIGN KEY (trace_id) REFERENCES workflow_traces(id) ON DELETE CASCADE
54
+ );
55
+ CREATE INDEX IF NOT EXISTS idx_spans_trace ON trace_spans(trace_id);
56
+ CREATE INDEX IF NOT EXISTS idx_spans_parent ON trace_spans(parent_span_id);
57
+ `);
58
+ }
59
+ // ── Collector ───────────────────────────────────────────
60
+ export class TraceCollector {
61
+ db;
62
+ log = getLogger();
63
+ stmtInsertTrace;
64
+ stmtInsertSpan;
65
+ stmtEndTrace;
66
+ stmtEndSpan;
67
+ stmtUpdateTraceStats;
68
+ constructor(db) {
69
+ this.db = db;
70
+ runTraceMigration(db);
71
+ this.stmtInsertTrace = db.prepare(`INSERT INTO workflow_traces (id, name, status, started_at, metadata)
72
+ VALUES (?, ?, 'running', ?, ?)`);
73
+ this.stmtInsertSpan = db.prepare(`INSERT INTO trace_spans (id, trace_id, parent_span_id, name, status, started_at, metadata)
74
+ VALUES (?, ?, ?, ?, 'running', ?, ?)`);
75
+ this.stmtEndTrace = db.prepare(`UPDATE workflow_traces SET status = ?, ended_at = ?, duration_ms = ?, error = ?
76
+ WHERE id = ?`);
77
+ this.stmtEndSpan = db.prepare(`UPDATE trace_spans SET status = ?, ended_at = ?, duration_ms = ?, tokens = ?, cost = ?, error = ?
78
+ WHERE id = ?`);
79
+ this.stmtUpdateTraceStats = db.prepare(`UPDATE workflow_traces SET
80
+ span_count = (SELECT COUNT(*) FROM trace_spans WHERE trace_id = ?),
81
+ total_tokens = (SELECT COALESCE(SUM(tokens), 0) FROM trace_spans WHERE trace_id = ?),
82
+ total_cost = (SELECT COALESCE(SUM(cost), 0) FROM trace_spans WHERE trace_id = ?)
83
+ WHERE id = ?`);
84
+ this.log.debug('[TraceCollector] Initialized');
85
+ }
86
+ // ── Trace Lifecycle ─────────────────────────────────
87
+ /** Start a new trace. Returns trace ID. */
88
+ startTrace(name, metadata = {}) {
89
+ const id = randomUUID();
90
+ const now = Date.now();
91
+ try {
92
+ this.stmtInsertTrace.run(id, name, now, JSON.stringify(metadata));
93
+ }
94
+ catch (e) {
95
+ this.log.warn(`[TraceCollector] Failed to start trace: ${e.message}`);
96
+ }
97
+ return id;
98
+ }
99
+ /** End a trace (complete or error). */
100
+ endTrace(traceId, error) {
101
+ const now = Date.now();
102
+ try {
103
+ const trace = this.db.prepare('SELECT started_at FROM workflow_traces WHERE id = ?').get(traceId);
104
+ const duration = trace ? now - trace.started_at : 0;
105
+ const status = error ? 'error' : 'completed';
106
+ // Update aggregate stats from spans
107
+ this.stmtUpdateTraceStats.run(traceId, traceId, traceId, traceId);
108
+ this.stmtEndTrace.run(status, now, duration, error ?? null, traceId);
109
+ }
110
+ catch (e) {
111
+ this.log.warn(`[TraceCollector] Failed to end trace: ${e.message}`);
112
+ }
113
+ }
114
+ // ── Span Lifecycle ──────────────────────────────────
115
+ /** Start a span within a trace. Returns span ID. */
116
+ startSpan(traceId, name, options) {
117
+ const id = randomUUID();
118
+ const now = Date.now();
119
+ try {
120
+ this.stmtInsertSpan.run(id, traceId, options?.parentSpanId ?? null, name, now, JSON.stringify(options?.metadata ?? {}));
121
+ }
122
+ catch (e) {
123
+ this.log.warn(`[TraceCollector] Failed to start span: ${e.message}`);
124
+ }
125
+ return id;
126
+ }
127
+ /** End a span with optional results. */
128
+ endSpan(spanId, result) {
129
+ const now = Date.now();
130
+ try {
131
+ const span = this.db.prepare('SELECT started_at FROM trace_spans WHERE id = ?').get(spanId);
132
+ const duration = span ? now - span.started_at : 0;
133
+ const status = result?.error ? 'error' : 'completed';
134
+ this.stmtEndSpan.run(status, now, duration, result?.tokens ?? 0, result?.cost ?? 0, result?.error ?? null, spanId);
135
+ }
136
+ catch (e) {
137
+ this.log.warn(`[TraceCollector] Failed to end span: ${e.message}`);
138
+ }
139
+ }
140
+ // ── Queries ─────────────────────────────────────────
141
+ /** Get a single trace with all its spans. */
142
+ getTrace(traceId) {
143
+ try {
144
+ const row = this.db.prepare('SELECT * FROM workflow_traces WHERE id = ?').get(traceId);
145
+ if (!row)
146
+ return null;
147
+ const spans = this.db.prepare('SELECT * FROM trace_spans WHERE trace_id = ? ORDER BY started_at').all(traceId);
148
+ return {
149
+ trace: this.mapTrace(row),
150
+ spans: spans.map(s => this.mapSpan(s)),
151
+ };
152
+ }
153
+ catch {
154
+ return null;
155
+ }
156
+ }
157
+ /** List traces with optional filters. */
158
+ listTraces(options = {}) {
159
+ const { limit = 50, offset = 0, name, status, since } = options;
160
+ try {
161
+ const conditions = [];
162
+ const params = [];
163
+ if (name) {
164
+ conditions.push('name = ?');
165
+ params.push(name);
166
+ }
167
+ if (status) {
168
+ conditions.push('status = ?');
169
+ params.push(status);
170
+ }
171
+ if (since) {
172
+ conditions.push('started_at >= ?');
173
+ params.push(since);
174
+ }
175
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
176
+ const sql = `SELECT * FROM workflow_traces ${where} ORDER BY started_at DESC LIMIT ? OFFSET ?`;
177
+ params.push(limit, offset);
178
+ const rows = this.db.prepare(sql).all(...params);
179
+ return rows.map(r => this.mapTrace(r));
180
+ }
181
+ catch {
182
+ return [];
183
+ }
184
+ }
185
+ /** Get aggregate statistics. */
186
+ getStats() {
187
+ try {
188
+ const totals = this.db.prepare(`
189
+ SELECT
190
+ COUNT(*) as total_traces,
191
+ COALESCE(SUM(span_count), 0) as total_spans,
192
+ COALESCE(SUM(total_tokens), 0) as total_tokens,
193
+ COALESCE(SUM(total_cost), 0) as total_cost,
194
+ COALESCE(AVG(duration_ms), 0) as avg_duration
195
+ FROM workflow_traces
196
+ WHERE status != 'running'
197
+ `).get();
198
+ const active = this.db.prepare("SELECT COUNT(*) as count FROM workflow_traces WHERE status = 'running'").get();
199
+ // P50 / P99 from completed traces
200
+ const durations = this.db.prepare("SELECT duration_ms FROM workflow_traces WHERE status = 'completed' AND duration_ms IS NOT NULL ORDER BY duration_ms").all();
201
+ const p50 = durations.length > 0
202
+ ? durations[Math.floor(durations.length * 0.5)]?.duration_ms ?? 0
203
+ : 0;
204
+ const p99 = durations.length > 0
205
+ ? durations[Math.floor(durations.length * 0.99)]?.duration_ms ?? 0
206
+ : 0;
207
+ // Traces by name
208
+ const byName = this.db.prepare('SELECT name, COUNT(*) as count FROM workflow_traces GROUP BY name').all();
209
+ const tracesByName = {};
210
+ for (const row of byName) {
211
+ tracesByName[row.name] = row.count;
212
+ }
213
+ return {
214
+ totalTraces: totals.total_traces ?? 0,
215
+ totalSpans: totals.total_spans ?? 0,
216
+ totalTokens: totals.total_tokens ?? 0,
217
+ totalCost: totals.total_cost ?? 0,
218
+ avgDurationMs: Math.round(totals.avg_duration ?? 0),
219
+ p50DurationMs: p50,
220
+ p99DurationMs: p99,
221
+ tracesByName,
222
+ activeTraces: active.count,
223
+ };
224
+ }
225
+ catch {
226
+ return {
227
+ totalTraces: 0, totalSpans: 0, totalTokens: 0, totalCost: 0,
228
+ avgDurationMs: 0, p50DurationMs: 0, p99DurationMs: 0,
229
+ tracesByName: {}, activeTraces: 0,
230
+ };
231
+ }
232
+ }
233
+ /** Get collector status (lightweight). */
234
+ getStatus() {
235
+ try {
236
+ const row = this.db.prepare(`
237
+ SELECT
238
+ COUNT(*) as total,
239
+ SUM(CASE WHEN status = 'running' THEN 1 ELSE 0 END) as active,
240
+ COALESCE(SUM(span_count), 0) as spans,
241
+ COALESCE(SUM(total_tokens), 0) as tokens,
242
+ COALESCE(SUM(total_cost), 0) as cost
243
+ FROM workflow_traces
244
+ `).get();
245
+ return {
246
+ totalTraces: row.total ?? 0,
247
+ activeTraces: row.active ?? 0,
248
+ totalSpans: row.spans ?? 0,
249
+ totalTokens: row.tokens ?? 0,
250
+ totalCost: row.cost ?? 0,
251
+ };
252
+ }
253
+ catch {
254
+ return { totalTraces: 0, activeTraces: 0, totalSpans: 0, totalTokens: 0, totalCost: 0 };
255
+ }
256
+ }
257
+ /** Delete traces older than maxAgeDays. Returns number pruned. */
258
+ prune(maxAgeDays = 30) {
259
+ try {
260
+ const cutoff = Date.now() - maxAgeDays * 86_400_000;
261
+ // Delete spans first (FK constraint)
262
+ this.db.prepare('DELETE FROM trace_spans WHERE trace_id IN (SELECT id FROM workflow_traces WHERE started_at < ? AND status != ?)').run(cutoff, 'running');
263
+ const result = this.db.prepare('DELETE FROM workflow_traces WHERE started_at < ? AND status != ?').run(cutoff, 'running');
264
+ return result.changes;
265
+ }
266
+ catch {
267
+ return 0;
268
+ }
269
+ }
270
+ // ── Private ─────────────────────────────────────────
271
+ mapTrace(row) {
272
+ return {
273
+ id: row.id,
274
+ name: row.name,
275
+ status: row.status,
276
+ startedAt: row.started_at,
277
+ endedAt: row.ended_at,
278
+ durationMs: row.duration_ms,
279
+ spanCount: row.span_count,
280
+ totalTokens: row.total_tokens,
281
+ totalCost: row.total_cost,
282
+ metadata: JSON.parse(row.metadata || '{}'),
283
+ error: row.error,
284
+ };
285
+ }
286
+ mapSpan(row) {
287
+ return {
288
+ id: row.id,
289
+ traceId: row.trace_id,
290
+ parentSpanId: row.parent_span_id,
291
+ name: row.name,
292
+ status: row.status,
293
+ startedAt: row.started_at,
294
+ endedAt: row.ended_at,
295
+ durationMs: row.duration_ms,
296
+ tokens: row.tokens,
297
+ cost: row.cost,
298
+ metadata: JSON.parse(row.metadata || '{}'),
299
+ error: row.error,
300
+ };
301
+ }
302
+ }
303
+ //# sourceMappingURL=trace-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-collector.js","sourceRoot":"","sources":["../../src/observability/trace-collector.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@timmeck/brain-core",
3
- "version": "2.36.38",
3
+ "version": "2.36.40",
4
4
  "description": "Shared core infrastructure for the Brain ecosystem — IPC, MCP, CLI, DB connection, and utilities",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",