@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.
- package/command-center.html +22 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/messaging/discord-bot.d.ts +51 -0
- package/dist/messaging/discord-bot.js +152 -0
- package/dist/messaging/discord-bot.js.map +1 -0
- package/dist/messaging/index.d.ts +6 -0
- package/dist/messaging/index.js +4 -0
- package/dist/messaging/index.js.map +1 -0
- package/dist/messaging/message-router.d.ts +67 -0
- package/dist/messaging/message-router.js +249 -0
- package/dist/messaging/message-router.js.map +1 -0
- package/dist/messaging/telegram-bot.d.ts +48 -0
- package/dist/messaging/telegram-bot.js +133 -0
- package/dist/messaging/telegram-bot.js.map +1 -0
- package/dist/observability/index.d.ts +2 -0
- package/dist/observability/index.js +2 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/trace-collector.d.ts +111 -0
- package/dist/observability/trace-collector.js +303 -0
- package/dist/observability/trace-collector.js.map +1 -0
- package/package.json +1 -1
package/command-center.html
CHANGED
|
@@ -572,6 +572,18 @@ canvas{display:block;width:100%;height:100%}
|
|
|
572
572
|
</div>
|
|
573
573
|
<div id="featureWishlist" style="margin-top:12px"></div>
|
|
574
574
|
</div>
|
|
575
|
+
|
|
576
|
+
<!-- Traces / Observability -->
|
|
577
|
+
<div class="section">
|
|
578
|
+
<div class="section-title"><span class="icon">🔍</span> Observability — <span data-t="Traces & Spans">Traces & Spans</span></div>
|
|
579
|
+
<p style="font-size:12px;color:var(--text-dim);margin-bottom:12px" data-t="OpenTelemetry-artige Traces: Jeder Workflow wird in Spans aufgeteilt mit Token- und Cost-Tracking.">OpenTelemetry-artige Traces: Jeder Workflow wird in Spans aufgeteilt mit Token- und Cost-Tracking.</p>
|
|
580
|
+
<div class="grid grid-4">
|
|
581
|
+
<div class="card" style="text-align:center"><div class="card-value" id="int-tr-total" style="color:var(--cyan)">0</div><div class="card-sub" data-t="Traces gesamt">Traces gesamt</div></div>
|
|
582
|
+
<div class="card" style="text-align:center"><div class="card-value" id="int-tr-active" style="color:var(--green)">0</div><div class="card-sub" data-t="Aktiv">Aktiv</div></div>
|
|
583
|
+
<div class="card" style="text-align:center"><div class="card-value" id="int-tr-spans" style="color:var(--yellow)">0</div><div class="card-sub" data-t="Spans gesamt">Spans gesamt</div></div>
|
|
584
|
+
<div class="card" style="text-align:center"><div class="card-value" id="int-tr-cost" style="color:var(--magenta)">$0.00</div><div class="card-sub" data-t="Gesamtkosten">Gesamtkosten</div></div>
|
|
585
|
+
</div>
|
|
586
|
+
</div>
|
|
575
587
|
</div>
|
|
576
588
|
|
|
577
589
|
<!-- ════ Page 6: Cross-Brain & Borg ═════════════════ -->
|
|
@@ -819,6 +831,7 @@ const translations = { en: {
|
|
|
819
831
|
'Der Lern-Kreislauf':'The Learning Cycle','Aktivität & Missionen':'Activity & Missions','Bewusstsein':'Consciousness',
|
|
820
832
|
'Was Brain sich wünscht':'What Brain wants','Wünsche':'Wishes','Offen':'Open','Gefunden':'Found','Übernommen':'Adopted',
|
|
821
833
|
'Verbindungen':'Connections','Letzter Scan':'Last scan','Suche läuft':'Searching','Verworfen':'Dismissed','Priorität':'Priority',
|
|
834
|
+
'Traces & Spans':'Traces & Spans','Traces gesamt':'Total Traces','Aktiv':'Active','Spans gesamt':'Total Spans','Gesamtkosten':'Total Cost',
|
|
822
835
|
'Noch keine Feature-Wünsche — Brain analysiert automatisch':'No feature wishes yet — Brain analyzes automatically',
|
|
823
836
|
'Brain erkennt was ihm fehlt und sucht nach passenden Features aus absorbierten Repos.':'Brain detects what it needs and searches for matching features from absorbed repos.',
|
|
824
837
|
}};
|
|
@@ -1248,6 +1261,15 @@ function renderIntelligence() {
|
|
|
1248
1261
|
wishEl.innerHTML = `<div class="empty">${t('Noch keine Feature-Wünsche — Brain analysiert automatisch')}</div>`;
|
|
1249
1262
|
}
|
|
1250
1263
|
}
|
|
1264
|
+
|
|
1265
|
+
// Traces / Observability
|
|
1266
|
+
const tr = d.traces;
|
|
1267
|
+
if (tr) {
|
|
1268
|
+
setText('int-tr-total', (tr.totalTraces || 0).toLocaleString());
|
|
1269
|
+
setText('int-tr-active', (tr.activeTraces || 0).toLocaleString());
|
|
1270
|
+
setText('int-tr-spans', (tr.totalSpans || 0).toLocaleString());
|
|
1271
|
+
setText('int-tr-cost', '$' + (tr.totalCost || 0).toFixed(2));
|
|
1272
|
+
}
|
|
1251
1273
|
}
|
|
1252
1274
|
|
|
1253
1275
|
// ── Knowledge Growth ──────────────────────────────────────
|
package/dist/index.d.ts
CHANGED
|
@@ -239,3 +239,7 @@ export { ActiveLearner, runActiveLearningMigration } from './active-learning/ind
|
|
|
239
239
|
export type { ActiveLearnerConfig, LearningGap, LearningStrategy, ActiveLearnerStatus } from './active-learning/index.js';
|
|
240
240
|
export { CheckpointManager, runCheckpointMigration } from './checkpoint/index.js';
|
|
241
241
|
export type { Checkpoint, CheckpointSummary, CheckpointManagerStatus } from './checkpoint/index.js';
|
|
242
|
+
export { TraceCollector, runTraceMigration } from './observability/index.js';
|
|
243
|
+
export type { Trace, Span, TraceTree, TraceStats, TraceListOptions, TraceCollectorStatus } from './observability/index.js';
|
|
244
|
+
export { MessageRouter, TelegramBot, DiscordBot } from './messaging/index.js';
|
|
245
|
+
export type { IncomingMessage, OutgoingResponse, MessageRouterConfig, MessageRouterStatus, TelegramBotConfig, TelegramBotStatus, DiscordBotConfig, DiscordBotStatus, } from './messaging/index.js';
|
package/dist/index.js
CHANGED
|
@@ -207,4 +207,8 @@ export { ConsensusEngine, runConsensusMigration } from './consensus/index.js';
|
|
|
207
207
|
export { ActiveLearner, runActiveLearningMigration } from './active-learning/index.js';
|
|
208
208
|
// ── Checkpoint Manager ──────────────────────────────────────
|
|
209
209
|
export { CheckpointManager, runCheckpointMigration } from './checkpoint/index.js';
|
|
210
|
+
// ── Observability / Tracing ─────────────────────────────────
|
|
211
|
+
export { TraceCollector, runTraceMigration } from './observability/index.js';
|
|
212
|
+
// ── Messaging (Bidirectional Bots) ──────────────────────────
|
|
213
|
+
export { MessageRouter, TelegramBot, DiscordBot } from './messaging/index.js';
|
|
210
214
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discord Bot — Bidirektionaler Message-Handler
|
|
3
|
+
*
|
|
4
|
+
* Empfängt Nachrichten via discord.js Gateway, routet sie durch
|
|
5
|
+
* den MessageRouter und sendet die Antwort zurück.
|
|
6
|
+
*
|
|
7
|
+
* Voraussetzungen:
|
|
8
|
+
* npm install discord.js (optional dependency)
|
|
9
|
+
* DISCORD_BOT_TOKEN in .env
|
|
10
|
+
* DISCORD_CHANNEL_ID in .env (optional: beschränkt auf einen Channel)
|
|
11
|
+
*/
|
|
12
|
+
import type { MessageRouter } from './message-router.js';
|
|
13
|
+
export interface DiscordBotConfig {
|
|
14
|
+
botToken?: string;
|
|
15
|
+
/** If set, only respond in this channel. */
|
|
16
|
+
channelId?: string;
|
|
17
|
+
/** Allowed user IDs (if empty, all allowed). */
|
|
18
|
+
allowedUsers?: string[];
|
|
19
|
+
/** Only respond when mentioned or prefixed. Default: false */
|
|
20
|
+
mentionOnly?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface DiscordBotStatus {
|
|
23
|
+
running: boolean;
|
|
24
|
+
messagesReceived: number;
|
|
25
|
+
messagesSent: number;
|
|
26
|
+
errors: number;
|
|
27
|
+
startedAt: number | null;
|
|
28
|
+
guilds: number;
|
|
29
|
+
}
|
|
30
|
+
export declare class DiscordBot {
|
|
31
|
+
private readonly log;
|
|
32
|
+
private readonly botToken;
|
|
33
|
+
private readonly channelId;
|
|
34
|
+
private readonly allowedUsers;
|
|
35
|
+
private readonly mentionOnly;
|
|
36
|
+
private client;
|
|
37
|
+
private router;
|
|
38
|
+
private running;
|
|
39
|
+
private stats;
|
|
40
|
+
constructor(config?: DiscordBotConfig);
|
|
41
|
+
/** Set the message router for dispatching incoming messages. */
|
|
42
|
+
setRouter(router: MessageRouter): void;
|
|
43
|
+
/** Check if Discord bot can start. */
|
|
44
|
+
isConfigured(): boolean;
|
|
45
|
+
/** Start listening for messages. */
|
|
46
|
+
start(): Promise<void>;
|
|
47
|
+
/** Stop the bot. */
|
|
48
|
+
stop(): Promise<void>;
|
|
49
|
+
/** Get bot status. */
|
|
50
|
+
getStatus(): DiscordBotStatus;
|
|
51
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discord Bot — Bidirektionaler Message-Handler
|
|
3
|
+
*
|
|
4
|
+
* Empfängt Nachrichten via discord.js Gateway, routet sie durch
|
|
5
|
+
* den MessageRouter und sendet die Antwort zurück.
|
|
6
|
+
*
|
|
7
|
+
* Voraussetzungen:
|
|
8
|
+
* npm install discord.js (optional dependency)
|
|
9
|
+
* DISCORD_BOT_TOKEN in .env
|
|
10
|
+
* DISCORD_CHANNEL_ID in .env (optional: beschränkt auf einen Channel)
|
|
11
|
+
*/
|
|
12
|
+
import { getLogger } from '../utils/logger.js';
|
|
13
|
+
export class DiscordBot {
|
|
14
|
+
log = getLogger();
|
|
15
|
+
botToken;
|
|
16
|
+
channelId;
|
|
17
|
+
allowedUsers;
|
|
18
|
+
mentionOnly;
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
20
|
+
client = null;
|
|
21
|
+
router = null;
|
|
22
|
+
running = false;
|
|
23
|
+
stats = {
|
|
24
|
+
messagesReceived: 0,
|
|
25
|
+
messagesSent: 0,
|
|
26
|
+
errors: 0,
|
|
27
|
+
startedAt: null,
|
|
28
|
+
guilds: 0,
|
|
29
|
+
};
|
|
30
|
+
constructor(config = {}) {
|
|
31
|
+
this.botToken = config.botToken ?? process.env.DISCORD_BOT_TOKEN ?? null;
|
|
32
|
+
this.channelId = config.channelId ?? process.env.DISCORD_CHANNEL_ID ?? null;
|
|
33
|
+
this.allowedUsers = new Set(config.allowedUsers ?? []);
|
|
34
|
+
this.mentionOnly = config.mentionOnly ?? false;
|
|
35
|
+
}
|
|
36
|
+
/** Set the message router for dispatching incoming messages. */
|
|
37
|
+
setRouter(router) {
|
|
38
|
+
this.router = router;
|
|
39
|
+
}
|
|
40
|
+
/** Check if Discord bot can start. */
|
|
41
|
+
isConfigured() {
|
|
42
|
+
return !!this.botToken;
|
|
43
|
+
}
|
|
44
|
+
/** Start listening for messages. */
|
|
45
|
+
async start() {
|
|
46
|
+
if (!this.botToken) {
|
|
47
|
+
this.log.debug('[DiscordBot] No DISCORD_BOT_TOKEN set, skipping');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (this.running)
|
|
51
|
+
return;
|
|
52
|
+
try {
|
|
53
|
+
const modulePath = 'discord.js';
|
|
54
|
+
const { Client, GatewayIntentBits } = await import(/* webpackIgnore: true */ modulePath);
|
|
55
|
+
this.client = new Client({
|
|
56
|
+
intents: [
|
|
57
|
+
GatewayIntentBits.Guilds,
|
|
58
|
+
GatewayIntentBits.GuildMessages,
|
|
59
|
+
GatewayIntentBits.MessageContent,
|
|
60
|
+
],
|
|
61
|
+
});
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
63
|
+
this.client.on('ready', (c) => {
|
|
64
|
+
this.stats.guilds = c.guilds?.cache?.size ?? 0;
|
|
65
|
+
this.log.info(`[DiscordBot] Bot ready in ${this.stats.guilds} guilds`);
|
|
66
|
+
});
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
68
|
+
this.client.on('messageCreate', async (msg) => {
|
|
69
|
+
try {
|
|
70
|
+
// Ignore own messages
|
|
71
|
+
if (msg.author?.bot)
|
|
72
|
+
return;
|
|
73
|
+
// Channel filter
|
|
74
|
+
if (this.channelId && msg.channel?.id !== this.channelId)
|
|
75
|
+
return;
|
|
76
|
+
// Mention filter
|
|
77
|
+
if (this.mentionOnly && !msg.mentions?.has(this.client.user)) {
|
|
78
|
+
// Still allow /commands
|
|
79
|
+
if (!msg.content?.startsWith('/'))
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const senderId = String(msg.author?.id ?? '');
|
|
83
|
+
const senderName = msg.author?.username ?? 'unknown';
|
|
84
|
+
// User filter
|
|
85
|
+
if (this.allowedUsers.size > 0 && !this.allowedUsers.has(senderId))
|
|
86
|
+
return;
|
|
87
|
+
this.stats.messagesReceived++;
|
|
88
|
+
if (!this.router) {
|
|
89
|
+
await msg.reply('MessageRouter nicht konfiguriert.');
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Strip bot mention from beginning of text
|
|
93
|
+
let text = msg.content ?? '';
|
|
94
|
+
if (this.client.user) {
|
|
95
|
+
text = text.replace(new RegExp(`^<@!?${this.client.user.id}>\\s*`), '');
|
|
96
|
+
}
|
|
97
|
+
const response = await this.router.route({
|
|
98
|
+
text,
|
|
99
|
+
senderId,
|
|
100
|
+
senderName,
|
|
101
|
+
platform: 'discord',
|
|
102
|
+
channelId: msg.channel?.id,
|
|
103
|
+
});
|
|
104
|
+
if (response.code) {
|
|
105
|
+
await msg.reply(`\`\`\`\n${response.text}\n\`\`\``);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
await msg.reply(response.text);
|
|
109
|
+
}
|
|
110
|
+
this.stats.messagesSent++;
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
this.stats.errors++;
|
|
114
|
+
this.log.warn(`[DiscordBot] Error handling message: ${err.message}`);
|
|
115
|
+
try {
|
|
116
|
+
await msg.reply('Interner Fehler.');
|
|
117
|
+
}
|
|
118
|
+
catch { /* best effort */ }
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
await this.client.login(this.botToken);
|
|
122
|
+
this.running = true;
|
|
123
|
+
this.stats.startedAt = Date.now();
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
this.log.warn(`[DiscordBot] Failed to start: ${err.message}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** Stop the bot. */
|
|
130
|
+
async stop() {
|
|
131
|
+
if (this.client && this.running) {
|
|
132
|
+
try {
|
|
133
|
+
await this.client.destroy();
|
|
134
|
+
}
|
|
135
|
+
catch { /* best effort */ }
|
|
136
|
+
this.running = false;
|
|
137
|
+
this.client = null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** Get bot status. */
|
|
141
|
+
getStatus() {
|
|
142
|
+
return {
|
|
143
|
+
running: this.running,
|
|
144
|
+
messagesReceived: this.stats.messagesReceived,
|
|
145
|
+
messagesSent: this.stats.messagesSent,
|
|
146
|
+
errors: this.stats.errors,
|
|
147
|
+
startedAt: this.stats.startedAt,
|
|
148
|
+
guilds: this.stats.guilds,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=discord-bot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord-bot.js","sourceRoot":"","sources":["../../src/messaging/discord-bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { MessageRouter } from './message-router.js';
|
|
2
|
+
export type { IncomingMessage, OutgoingResponse, MessageRouterConfig, MessageRouterStatus, IpcDispatcher } from './message-router.js';
|
|
3
|
+
export { TelegramBot } from './telegram-bot.js';
|
|
4
|
+
export type { TelegramBotConfig, TelegramBotStatus } from './telegram-bot.js';
|
|
5
|
+
export { DiscordBot } from './discord-bot.js';
|
|
6
|
+
export type { DiscordBotConfig, DiscordBotStatus } from './discord-bot.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message Router — Bidirektionale Messaging-Bridge
|
|
3
|
+
*
|
|
4
|
+
* Empfängt Nachrichten von Telegram/Discord, erkennt die Intention,
|
|
5
|
+
* dispatcht an die richtige IPC-Route und formatiert die Antwort.
|
|
6
|
+
*
|
|
7
|
+
* Unterstützte Befehle:
|
|
8
|
+
* /status → brain status
|
|
9
|
+
* /query <text> → error query
|
|
10
|
+
* /intel → intelligence stats
|
|
11
|
+
* /mission <t> → create research mission
|
|
12
|
+
* /traces → trace stats
|
|
13
|
+
* /help → command list
|
|
14
|
+
* Freitext → LLM query (if available)
|
|
15
|
+
*/
|
|
16
|
+
/** Simple interface for dispatching IPC calls. */
|
|
17
|
+
export interface IpcDispatcher {
|
|
18
|
+
request(method: string, params?: unknown): Promise<unknown>;
|
|
19
|
+
}
|
|
20
|
+
export interface IncomingMessage {
|
|
21
|
+
text: string;
|
|
22
|
+
senderId: string;
|
|
23
|
+
senderName: string;
|
|
24
|
+
platform: 'telegram' | 'discord';
|
|
25
|
+
channelId?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface OutgoingResponse {
|
|
28
|
+
text: string;
|
|
29
|
+
/** If true, send as code/pre block */
|
|
30
|
+
code?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface MessageRouterConfig {
|
|
33
|
+
/** Allowed sender IDs (if empty, all senders allowed) */
|
|
34
|
+
allowedSenders?: string[];
|
|
35
|
+
/** Prefix for commands. Default: '/' */
|
|
36
|
+
commandPrefix?: string;
|
|
37
|
+
/** Brain name for IPC routing. Default: 'brain' */
|
|
38
|
+
brainName?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface MessageRouterStatus {
|
|
41
|
+
messagesReceived: number;
|
|
42
|
+
messagesRouted: number;
|
|
43
|
+
errors: number;
|
|
44
|
+
lastMessageAt: number | null;
|
|
45
|
+
uptime: number;
|
|
46
|
+
}
|
|
47
|
+
type IntentHandler = (args: string, msg: IncomingMessage) => Promise<OutgoingResponse>;
|
|
48
|
+
export declare class MessageRouter {
|
|
49
|
+
private readonly log;
|
|
50
|
+
private readonly prefix;
|
|
51
|
+
private readonly allowedSenders;
|
|
52
|
+
private readonly brainName;
|
|
53
|
+
private ipcClient;
|
|
54
|
+
private intents;
|
|
55
|
+
private stats;
|
|
56
|
+
constructor(config?: MessageRouterConfig);
|
|
57
|
+
/** Connect to Brain IPC for dispatching commands. */
|
|
58
|
+
setIpcClient(client: IpcDispatcher): void;
|
|
59
|
+
/** Process an incoming message. Returns response text. */
|
|
60
|
+
route(msg: IncomingMessage): Promise<OutgoingResponse>;
|
|
61
|
+
/** Register a custom intent handler. */
|
|
62
|
+
registerIntent(command: string, handler: IntentHandler): void;
|
|
63
|
+
/** Get router status. */
|
|
64
|
+
getStatus(): MessageRouterStatus;
|
|
65
|
+
private registerDefaultIntents;
|
|
66
|
+
}
|
|
67
|
+
export {};
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message Router — Bidirektionale Messaging-Bridge
|
|
3
|
+
*
|
|
4
|
+
* Empfängt Nachrichten von Telegram/Discord, erkennt die Intention,
|
|
5
|
+
* dispatcht an die richtige IPC-Route und formatiert die Antwort.
|
|
6
|
+
*
|
|
7
|
+
* Unterstützte Befehle:
|
|
8
|
+
* /status → brain status
|
|
9
|
+
* /query <text> → error query
|
|
10
|
+
* /intel → intelligence stats
|
|
11
|
+
* /mission <t> → create research mission
|
|
12
|
+
* /traces → trace stats
|
|
13
|
+
* /help → command list
|
|
14
|
+
* Freitext → LLM query (if available)
|
|
15
|
+
*/
|
|
16
|
+
import { getLogger } from '../utils/logger.js';
|
|
17
|
+
// ── Router ──────────────────────────────────────────────
|
|
18
|
+
export class MessageRouter {
|
|
19
|
+
log = getLogger();
|
|
20
|
+
prefix;
|
|
21
|
+
allowedSenders;
|
|
22
|
+
brainName;
|
|
23
|
+
ipcClient = null;
|
|
24
|
+
intents = new Map();
|
|
25
|
+
stats = {
|
|
26
|
+
messagesReceived: 0,
|
|
27
|
+
messagesRouted: 0,
|
|
28
|
+
errors: 0,
|
|
29
|
+
lastMessageAt: null,
|
|
30
|
+
startedAt: Date.now(),
|
|
31
|
+
};
|
|
32
|
+
constructor(config = {}) {
|
|
33
|
+
this.prefix = config.commandPrefix ?? '/';
|
|
34
|
+
this.allowedSenders = new Set(config.allowedSenders ?? []);
|
|
35
|
+
this.brainName = config.brainName ?? 'brain';
|
|
36
|
+
this.registerDefaultIntents();
|
|
37
|
+
}
|
|
38
|
+
/** Connect to Brain IPC for dispatching commands. */
|
|
39
|
+
setIpcClient(client) {
|
|
40
|
+
this.ipcClient = client;
|
|
41
|
+
}
|
|
42
|
+
/** Process an incoming message. Returns response text. */
|
|
43
|
+
async route(msg) {
|
|
44
|
+
this.stats.messagesReceived++;
|
|
45
|
+
this.stats.lastMessageAt = Date.now();
|
|
46
|
+
// Access control
|
|
47
|
+
if (this.allowedSenders.size > 0 && !this.allowedSenders.has(msg.senderId)) {
|
|
48
|
+
return { text: 'Zugriff verweigert. Deine ID ist nicht autorisiert.' };
|
|
49
|
+
}
|
|
50
|
+
const text = msg.text.trim();
|
|
51
|
+
// Command parsing
|
|
52
|
+
if (text.startsWith(this.prefix)) {
|
|
53
|
+
const withoutPrefix = text.slice(this.prefix.length);
|
|
54
|
+
const spaceIdx = withoutPrefix.indexOf(' ');
|
|
55
|
+
const command = spaceIdx >= 0 ? withoutPrefix.slice(0, spaceIdx).toLowerCase() : withoutPrefix.toLowerCase();
|
|
56
|
+
const args = spaceIdx >= 0 ? withoutPrefix.slice(spaceIdx + 1).trim() : '';
|
|
57
|
+
const handler = this.intents.get(command);
|
|
58
|
+
if (handler) {
|
|
59
|
+
try {
|
|
60
|
+
this.stats.messagesRouted++;
|
|
61
|
+
return await handler(args, msg);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
this.stats.errors++;
|
|
65
|
+
this.log.warn(`[MessageRouter] Command '${command}' failed: ${err.message}`);
|
|
66
|
+
return { text: `Fehler: ${err.message}` };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return { text: `Unbekannter Befehl: ${this.prefix}${command}\nTippe ${this.prefix}help für alle Befehle.` };
|
|
70
|
+
}
|
|
71
|
+
// Free text → query if IPC available
|
|
72
|
+
if (this.ipcClient) {
|
|
73
|
+
try {
|
|
74
|
+
this.stats.messagesRouted++;
|
|
75
|
+
const result = await this.ipcClient.request('query', { query: text });
|
|
76
|
+
if (result?.results?.length) {
|
|
77
|
+
const top = result.results.slice(0, 3);
|
|
78
|
+
const lines = top.map((r, i) => `${i + 1}. ${r.title ?? r.message ?? 'Ergebnis'}`);
|
|
79
|
+
return { text: `Ergebnisse:\n${lines.join('\n')}` };
|
|
80
|
+
}
|
|
81
|
+
return { text: 'Keine Ergebnisse gefunden.' };
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return { text: 'Freitext-Suche fehlgeschlagen. Nutze /help für Befehle.' };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return { text: `Ich verstehe Befehle mit ${this.prefix} Prefix. Tippe ${this.prefix}help für alle Befehle.` };
|
|
88
|
+
}
|
|
89
|
+
/** Register a custom intent handler. */
|
|
90
|
+
registerIntent(command, handler) {
|
|
91
|
+
this.intents.set(command.toLowerCase(), handler);
|
|
92
|
+
}
|
|
93
|
+
/** Get router status. */
|
|
94
|
+
getStatus() {
|
|
95
|
+
return {
|
|
96
|
+
messagesReceived: this.stats.messagesReceived,
|
|
97
|
+
messagesRouted: this.stats.messagesRouted,
|
|
98
|
+
errors: this.stats.errors,
|
|
99
|
+
lastMessageAt: this.stats.lastMessageAt,
|
|
100
|
+
uptime: Math.floor((Date.now() - this.stats.startedAt) / 1000),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// ── Default Intents ─────────────────────────────────
|
|
104
|
+
registerDefaultIntents() {
|
|
105
|
+
this.intents.set('help', async () => ({
|
|
106
|
+
text: [
|
|
107
|
+
`Brain Befehle:`,
|
|
108
|
+
`${this.prefix}status — Brain Status & Statistiken`,
|
|
109
|
+
`${this.prefix}query <text> — Fehler/Lösungen suchen`,
|
|
110
|
+
`${this.prefix}intel — Intelligence Stats`,
|
|
111
|
+
`${this.prefix}mission <topic> — Research-Mission starten`,
|
|
112
|
+
`${this.prefix}traces — Trace-Statistiken`,
|
|
113
|
+
`${this.prefix}engines — Engine-Übersicht`,
|
|
114
|
+
`${this.prefix}health — System-Gesundheit`,
|
|
115
|
+
`${this.prefix}help — Diese Hilfe`,
|
|
116
|
+
``,
|
|
117
|
+
`Oder einfach Freitext eingeben für Suche.`,
|
|
118
|
+
].join('\n'),
|
|
119
|
+
}));
|
|
120
|
+
this.intents.set('status', async () => {
|
|
121
|
+
if (!this.ipcClient)
|
|
122
|
+
return { text: 'IPC nicht verbunden.' };
|
|
123
|
+
try {
|
|
124
|
+
const status = await this.ipcClient.request('status', {});
|
|
125
|
+
return {
|
|
126
|
+
text: [
|
|
127
|
+
`Brain Status:`,
|
|
128
|
+
`Name: ${status.name ?? this.brainName}`,
|
|
129
|
+
`Version: ${status.version ?? '?'}`,
|
|
130
|
+
`Uptime: ${status.uptime ?? '?'}s`,
|
|
131
|
+
`PID: ${status.pid ?? '?'}`,
|
|
132
|
+
`Methods: ${status.methods ?? '?'}`,
|
|
133
|
+
].join('\n'),
|
|
134
|
+
code: true,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
return { text: `Status-Abfrage fehlgeschlagen: ${err.message}` };
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
this.intents.set('query', async (args) => {
|
|
142
|
+
if (!args)
|
|
143
|
+
return { text: 'Bitte Suchtext angeben: /query <text>' };
|
|
144
|
+
if (!this.ipcClient)
|
|
145
|
+
return { text: 'IPC nicht verbunden.' };
|
|
146
|
+
try {
|
|
147
|
+
const result = await this.ipcClient.request('error.search', { query: args, limit: 5 });
|
|
148
|
+
if (!result?.results?.length)
|
|
149
|
+
return { text: 'Keine Ergebnisse.' };
|
|
150
|
+
const lines = result.results.map((r, i) => `${i + 1}. ${r.title ?? r.message ?? '?'} (Score: ${r.score?.toFixed(2) ?? '?'})`);
|
|
151
|
+
return { text: `Suchergebnisse:\n${lines.join('\n')}` };
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
return { text: `Suche fehlgeschlagen: ${err.message}` };
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
this.intents.set('intel', async () => {
|
|
158
|
+
if (!this.ipcClient)
|
|
159
|
+
return { text: 'IPC nicht verbunden.' };
|
|
160
|
+
try {
|
|
161
|
+
const stats = await this.ipcClient.request('intelligence.stats', {});
|
|
162
|
+
const lines = ['Intelligence Stats:'];
|
|
163
|
+
for (const [key, val] of Object.entries(stats)) {
|
|
164
|
+
if (val && typeof val === 'object' && 'totalFacts' in val) {
|
|
165
|
+
lines.push(`${key}: ${val.totalFacts} facts`);
|
|
166
|
+
}
|
|
167
|
+
else if (val && typeof val === 'object' && 'totalTraces' in val) {
|
|
168
|
+
lines.push(`${key}: ${val.totalTraces} traces`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return { text: lines.length > 1 ? lines.join('\n') : 'Keine Intelligence-Daten.' };
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return { text: 'Intelligence-Abfrage fehlgeschlagen.' };
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
this.intents.set('mission', async (args) => {
|
|
178
|
+
if (!args)
|
|
179
|
+
return { text: 'Bitte Thema angeben: /mission <topic>' };
|
|
180
|
+
if (!this.ipcClient)
|
|
181
|
+
return { text: 'IPC nicht verbunden.' };
|
|
182
|
+
try {
|
|
183
|
+
const result = await this.ipcClient.request('mission.create', { topic: args, depth: 'standard' });
|
|
184
|
+
return { text: `Mission erstellt: ${result?.id ?? 'OK'}\nThema: ${args}` };
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
return { text: `Mission fehlgeschlagen: ${err.message}` };
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
this.intents.set('traces', async () => {
|
|
191
|
+
if (!this.ipcClient)
|
|
192
|
+
return { text: 'IPC nicht verbunden.' };
|
|
193
|
+
try {
|
|
194
|
+
const stats = await this.ipcClient.request('trace.stats', {});
|
|
195
|
+
return {
|
|
196
|
+
text: [
|
|
197
|
+
`Trace-Statistiken:`,
|
|
198
|
+
`Traces: ${stats.totalTraces ?? 0}`,
|
|
199
|
+
`Spans: ${stats.totalSpans ?? 0}`,
|
|
200
|
+
`Tokens: ${stats.totalTokens ?? 0}`,
|
|
201
|
+
`Kosten: $${(Number(stats.totalCost) || 0).toFixed(2)}`,
|
|
202
|
+
`Aktiv: ${stats.activeTraces ?? 0}`,
|
|
203
|
+
`Ø Latenz: ${stats.avgDurationMs ?? 0}ms`,
|
|
204
|
+
].join('\n'),
|
|
205
|
+
code: true,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return { text: 'Trace-Abfrage fehlgeschlagen.' };
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
this.intents.set('engines', async () => {
|
|
213
|
+
if (!this.ipcClient)
|
|
214
|
+
return { text: 'IPC nicht verbunden.' };
|
|
215
|
+
try {
|
|
216
|
+
const result = await this.ipcClient.request('consciousness.engines', {});
|
|
217
|
+
if (!Array.isArray(result) || result.length === 0)
|
|
218
|
+
return { text: 'Keine Engines gefunden.' };
|
|
219
|
+
const activeCount = result.filter(e => e.active).length;
|
|
220
|
+
return { text: `Engines: ${result.length} registriert, ${activeCount} aktiv` };
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
return { text: 'Engine-Abfrage fehlgeschlagen.' };
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
this.intents.set('health', async () => {
|
|
227
|
+
if (!this.ipcClient)
|
|
228
|
+
return { text: 'IPC nicht verbunden.' };
|
|
229
|
+
try {
|
|
230
|
+
const status = await this.ipcClient.request('status', {});
|
|
231
|
+
const memMB = Math.round(process.memoryUsage().rss / 1024 / 1024);
|
|
232
|
+
return {
|
|
233
|
+
text: [
|
|
234
|
+
`System Health:`,
|
|
235
|
+
`Uptime: ${status.uptime ?? '?'}s`,
|
|
236
|
+
`Memory: ${memMB} MB`,
|
|
237
|
+
`PID: ${status.pid ?? process.pid}`,
|
|
238
|
+
`IPC: verbunden`,
|
|
239
|
+
].join('\n'),
|
|
240
|
+
code: true,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
return { text: 'Health-Check fehlgeschlagen.' };
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=message-router.js.map
|