0xkobold 0.2.0 → 0.3.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.
Files changed (60) hide show
  1. package/HEARTBEAT.md +40 -58
  2. package/README.md +387 -337
  3. package/dist/package.json +4 -2
  4. package/dist/src/auth/device-auth.js +202 -0
  5. package/dist/src/auth/device-auth.js.map +1 -0
  6. package/dist/src/auth/index.js +3 -0
  7. package/dist/src/auth/index.js.map +1 -0
  8. package/dist/src/channels/index.js +8 -0
  9. package/dist/src/channels/index.js.map +1 -0
  10. package/dist/src/channels/slack/webhook.js +128 -0
  11. package/dist/src/channels/slack/webhook.js.map +1 -0
  12. package/dist/src/channels/telegram/bot.js +223 -0
  13. package/dist/src/channels/telegram/bot.js.map +1 -0
  14. package/dist/src/channels/whatsapp/integration.js +325 -0
  15. package/dist/src/channels/whatsapp/integration.js.map +1 -0
  16. package/dist/src/cli/commands/check.js +69 -0
  17. package/dist/src/cli/commands/check.js.map +1 -0
  18. package/dist/src/cli/commands/migrate.js +24 -0
  19. package/dist/src/cli/commands/migrate.js.map +1 -0
  20. package/dist/src/cli/commands/tailscale.js +81 -0
  21. package/dist/src/cli/commands/tailscale.js.map +1 -0
  22. package/dist/src/cli/commands/telegram.js +111 -0
  23. package/dist/src/cli/commands/telegram.js.map +1 -0
  24. package/dist/src/cli/commands/tui.js +40 -22
  25. package/dist/src/cli/commands/tui.js.map +1 -1
  26. package/dist/src/cli/commands/whatsapp.js +116 -0
  27. package/dist/src/cli/commands/whatsapp.js.map +1 -0
  28. package/dist/src/cli/program.js +20 -0
  29. package/dist/src/cli/program.js.map +1 -1
  30. package/dist/src/config/index.js +2 -9
  31. package/dist/src/config/index.js.map +1 -1
  32. package/dist/src/config/manager.js +222 -0
  33. package/dist/src/config/manager.js.map +1 -0
  34. package/dist/src/documents/index.js +3 -0
  35. package/dist/src/documents/index.js.map +1 -0
  36. package/dist/src/documents/pdf.js +168 -0
  37. package/dist/src/documents/pdf.js.map +1 -0
  38. package/dist/src/gateway/client.js +318 -0
  39. package/dist/src/gateway/client.js.map +1 -0
  40. package/dist/src/infra/index.js +3 -0
  41. package/dist/src/infra/index.js.map +1 -0
  42. package/dist/src/infra/tailscale.js +163 -0
  43. package/dist/src/infra/tailscale.js.map +1 -0
  44. package/dist/src/media/audio.js +130 -0
  45. package/dist/src/media/audio.js.map +1 -0
  46. package/dist/src/media/index.js +4 -0
  47. package/dist/src/media/index.js.map +1 -0
  48. package/dist/src/media/vision.js +131 -0
  49. package/dist/src/media/vision.js.map +1 -0
  50. package/dist/src/migration/openclaw.js +498 -0
  51. package/dist/src/migration/openclaw.js.map +1 -0
  52. package/dist/src/sandbox/docker-runner.js +228 -0
  53. package/dist/src/sandbox/docker-runner.js.map +1 -0
  54. package/dist/src/sandbox/index.js +3 -0
  55. package/dist/src/sandbox/index.js.map +1 -0
  56. package/dist/src/skills/builtin/duplicate-detector.js +469 -0
  57. package/dist/src/skills/builtin/duplicate-detector.js.map +1 -0
  58. package/dist/src/skills/index.js +2 -0
  59. package/dist/src/skills/index.js.map +1 -1
  60. package/package.json +4 -2
package/dist/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "0xkobold",
3
- "version": "0.2.0",
4
- "description": "Your digital familiar - a personal AI assistant that learns and evolves (v0.2.0 - Complete with Real Gateway, Worker Skills)",
3
+ "version": "0.3.0",
4
+ "description": "Your digital familiar - a personal AI assistant that learns and evolves (v0.3.0 - Multi-Channel, Security, Media Support)",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
7
7
  "type": "module",
@@ -38,12 +38,14 @@
38
38
  "@mariozechner/pi-agent-core": "0.57.1",
39
39
  "@mariozechner/pi-coding-agent": "0.57.1",
40
40
  "@mariozechner/pi-tui": "0.57.1",
41
+ "@whiskeysockets/baileys": "^7.0.0-rc.9",
41
42
  "ajv": "^8.18.0",
42
43
  "blessed": "^0.1.81",
43
44
  "commander": "^11.1.0",
44
45
  "discord.js": "^14.25.1",
45
46
  "glob": "^10.5.0",
46
47
  "json5": "^2.2.3",
48
+ "node-telegram-bot-api": "^0.67.0",
47
49
  "playwright": "^1.58.2",
48
50
  "react": "^19.2.4",
49
51
  "sharp": "^0.33.5",
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Device Authentication - v0.3.0
3
+ *
4
+ * Device identity and token management for secure multi-device support.
5
+ */
6
+ import { randomUUID, randomBytes } from "node:crypto";
7
+ import * as fs from "node:fs/promises";
8
+ import * as path from "node:path";
9
+ import { existsSync } from "node:fs";
10
+ const DEFAULT_CONFIG = {
11
+ storagePath: path.join(process.env.HOME || "~", ".0xkobold", "devices"),
12
+ tokenExpiryHours: 168, // 7 days
13
+ maxDevices: 5,
14
+ requireApproval: true,
15
+ };
16
+ class DeviceAuthManager {
17
+ config;
18
+ currentDevice = null;
19
+ tokens = new Map();
20
+ constructor(config = {}) {
21
+ this.config = { ...DEFAULT_CONFIG, ...config };
22
+ }
23
+ /**
24
+ * Initialize device identity
25
+ */
26
+ async initialize(deviceName) {
27
+ await fs.mkdir(this.config.storagePath, { recursive: true });
28
+ // Check for existing device
29
+ const existing = await this.loadCurrentDevice();
30
+ if (existing) {
31
+ this.currentDevice = existing;
32
+ existing.lastUsed = new Date().toISOString();
33
+ await this.saveDevice(existing);
34
+ console.log(`[DeviceAuth] Loaded device: ${existing.name}`);
35
+ return existing;
36
+ }
37
+ // Create new device
38
+ const device = await this.createDevice(deviceName || `device-${Date.now()}`);
39
+ this.currentDevice = device;
40
+ console.log(`[DeviceAuth] Created device: ${device.name}`);
41
+ return device;
42
+ }
43
+ /**
44
+ * Create new device
45
+ */
46
+ async createDevice(name) {
47
+ const now = new Date().toISOString();
48
+ // Generate keys
49
+ const publicKey = randomBytes(32).toString("hex");
50
+ const privateKey = randomBytes(64).toString("hex"); // Would be encrypted in production
51
+ const device = {
52
+ id: randomUUID(),
53
+ name,
54
+ publicKey,
55
+ privateKey,
56
+ createdAt: now,
57
+ lastUsed: now,
58
+ trusted: true, // Auto-trust first device
59
+ };
60
+ await this.saveDevice(device);
61
+ return device;
62
+ }
63
+ /**
64
+ * Save device to storage
65
+ */
66
+ async saveDevice(device) {
67
+ const filePath = path.join(this.config.storagePath, `${device.id}.json`);
68
+ await fs.writeFile(filePath, JSON.stringify(device, null, 2), "utf-8");
69
+ }
70
+ /**
71
+ * Load current device
72
+ */
73
+ async loadCurrentDevice() {
74
+ try {
75
+ const files = await fs.readdir(this.config.storagePath);
76
+ const deviceFiles = files.filter((f) => f.endsWith(".json"));
77
+ if (deviceFiles.length === 0)
78
+ return null;
79
+ // Load most recently used
80
+ const devices = await Promise.all(deviceFiles.map(async (f) => {
81
+ const content = await fs.readFile(path.join(this.config.storagePath, f), "utf-8");
82
+ return JSON.parse(content);
83
+ }));
84
+ return devices.sort((a, b) => new Date(b.lastUsed).getTime() - new Date(a.lastUsed).getTime())[0];
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }
90
+ /**
91
+ * Generate auth token
92
+ */
93
+ generateToken(scopes = ["read", "write"]) {
94
+ if (!this.currentDevice) {
95
+ throw new Error("No device initialized");
96
+ }
97
+ const token = randomBytes(32).toString("hex");
98
+ const now = Date.now();
99
+ const expiryMs = this.config.tokenExpiryHours * 60 * 60 * 1000;
100
+ const authToken = {
101
+ token,
102
+ deviceId: this.currentDevice.id,
103
+ scopes,
104
+ expiresAt: now + expiryMs,
105
+ createdAt: now,
106
+ };
107
+ this.tokens.set(token, authToken);
108
+ return authToken;
109
+ }
110
+ /**
111
+ * Validate token
112
+ */
113
+ validateToken(token) {
114
+ const authToken = this.tokens.get(token);
115
+ if (!authToken) {
116
+ return { valid: false, error: "Token not found" };
117
+ }
118
+ if (Date.now() > authToken.expiresAt) {
119
+ this.tokens.delete(token);
120
+ return { valid: false, error: "Token expired" };
121
+ }
122
+ return { valid: true, token: authToken };
123
+ }
124
+ /**
125
+ * Revoke token
126
+ */
127
+ revokeToken(token) {
128
+ return this.tokens.delete(token);
129
+ }
130
+ /**
131
+ * List devices
132
+ */
133
+ async listDevices() {
134
+ try {
135
+ const files = await fs.readdir(this.config.storagePath);
136
+ const devices = [];
137
+ for (const file of files) {
138
+ if (file.endsWith(".json")) {
139
+ const content = await fs.readFile(path.join(this.config.storagePath, file), "utf-8");
140
+ devices.push(JSON.parse(content));
141
+ }
142
+ }
143
+ return devices.sort((a, b) => new Date(b.lastUsed).getTime() - new Date(a.lastUsed).getTime());
144
+ }
145
+ catch {
146
+ return [];
147
+ }
148
+ }
149
+ /**
150
+ * Remove device
151
+ */
152
+ async removeDevice(deviceId) {
153
+ try {
154
+ const filePath = path.join(this.config.storagePath, `${deviceId}.json`);
155
+ if (existsSync(filePath)) {
156
+ await fs.unlink(filePath);
157
+ // Remove tokens for this device
158
+ for (const [token, auth] of this.tokens) {
159
+ if (auth.deviceId === deviceId) {
160
+ this.tokens.delete(token);
161
+ }
162
+ }
163
+ return true;
164
+ }
165
+ return false;
166
+ }
167
+ catch {
168
+ return false;
169
+ }
170
+ }
171
+ /**
172
+ * Get current device
173
+ */
174
+ getCurrentDevice() {
175
+ return this.currentDevice;
176
+ }
177
+ /**
178
+ * Sign payload with device key
179
+ */
180
+ signPayload(payload) {
181
+ if (!this.currentDevice) {
182
+ throw new Error("No device initialized");
183
+ }
184
+ // Simple HMAC-like signing (in production use proper crypto)
185
+ const hash = Buffer.from(this.currentDevice.privateKey + payload).toString("base64");
186
+ return hash.slice(0, 32);
187
+ }
188
+ }
189
+ // Singleton
190
+ let manager = null;
191
+ export function getDeviceAuth(config) {
192
+ if (!manager) {
193
+ manager = new DeviceAuthManager(config);
194
+ }
195
+ return manager;
196
+ }
197
+ export function resetDeviceAuth() {
198
+ manager = null;
199
+ }
200
+ export { DeviceAuthManager, DEFAULT_CONFIG };
201
+ export default DeviceAuthManager;
202
+ //# sourceMappingURL=device-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-auth.js","sourceRoot":"","sources":["../../../src/auth/device-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ // Auth Module - v0.3.0
2
+ export { DeviceAuthManager, getDeviceAuth, resetDeviceAuth, DEFAULT_CONFIG, } from "./device-auth.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,cAAc,GAIf,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,8 @@
1
+ // Channels Module - v0.3.0
2
+ // WhatsApp Integration
3
+ export { getWhatsAppIntegration, resetWhatsAppIntegration, } from "./whatsapp/integration.js";
4
+ // Telegram Integration
5
+ export { TelegramIntegration, getTelegramIntegration, resetTelegramIntegration, } from "./telegram/bot.js";
6
+ // Slack Integration
7
+ export { SlackIntegration, getSlackIntegration, resetSlackIntegration, } from "./slack/webhook.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/index.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,uBAAuB;AACvB,OAAO,EACL,sBAAsB,EACtB,wBAAwB,GAGzB,MAAM,2BAA2B,CAAC;AAEnC,uBAAuB;AACvB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,GAGzB,MAAM,mBAAmB,CAAC;AAE3B,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,GAGtB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Slack Integration - v0.3.0
3
+ *
4
+ * Webhook and slash command support for Slack.
5
+ */
6
+ import { EventEmitter } from "events";
7
+ import { getRealGateway } from "../../gateway/index.js";
8
+ class SlackIntegration extends EventEmitter {
9
+ config;
10
+ connected = false;
11
+ gatewayConnectionId;
12
+ constructor(config) {
13
+ super();
14
+ this.config = {
15
+ port: 3001,
16
+ ...config,
17
+ };
18
+ }
19
+ /**
20
+ * Send message via webhook
21
+ */
22
+ async sendMessage(text, options) {
23
+ const payload = { text };
24
+ if (options?.channel)
25
+ payload.channel = options.channel;
26
+ if (options?.username)
27
+ payload.username = options.username;
28
+ if (options?.iconEmoji)
29
+ payload.icon_emoji = options.iconEmoji;
30
+ if (options?.blocks)
31
+ payload.blocks = options.blocks;
32
+ try {
33
+ const response = await fetch(this.config.webhookUrl, {
34
+ method: "POST",
35
+ headers: { "Content-Type": "application/json" },
36
+ body: JSON.stringify(payload),
37
+ });
38
+ if (!response.ok) {
39
+ const error = await response.text();
40
+ return { ok: false, error };
41
+ }
42
+ return { ok: true };
43
+ }
44
+ catch (error) {
45
+ return { ok: false, error: String(error) };
46
+ }
47
+ }
48
+ /**
49
+ * Send rich message with blocks
50
+ */
51
+ async sendRichMessage(blocks) {
52
+ return this.sendMessage("", { blocks });
53
+ }
54
+ /**
55
+ * Send typing indicator (simulated via webhook)
56
+ */
57
+ async sendTyping(channel) {
58
+ // Slack webhooks don't support typing, but we can simulate with a status update
59
+ console.log(`[Slack] Typing in ${channel}`);
60
+ }
61
+ /**
62
+ * Handle incoming webhook
63
+ */
64
+ handleWebhook(payload) {
65
+ console.log(`[Slack] ${payload.type}: ${payload.text.slice(0, 50)}...`);
66
+ // Forward to gateway
67
+ this.forwardToGateway(payload);
68
+ this.emit("message", payload);
69
+ }
70
+ /**
71
+ * Verify Slack signature
72
+ */
73
+ verifySignature(body, timestamp, signature) {
74
+ if (!this.config.signingSecret) {
75
+ // Skip verification if no secret configured
76
+ return true;
77
+ }
78
+ // Simple verification - in production use proper HMAC
79
+ const crypto = require("node:crypto");
80
+ const hmac = crypto.createHmac("sha256", this.config.signingSecret);
81
+ hmac.update(`v0:${timestamp}:${body}`);
82
+ const expected = `v0=${hmac.digest("hex")}`;
83
+ return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
84
+ }
85
+ /**
86
+ * Forward to gateway
87
+ */
88
+ forwardToGateway(message) {
89
+ const gateway = getRealGateway();
90
+ gateway.emit("message", {
91
+ connection: {
92
+ id: this.gatewayConnectionId,
93
+ type: "slack",
94
+ channel: message.channel || "webhook",
95
+ user: message.user,
96
+ },
97
+ data: {
98
+ type: "chat",
99
+ id: Date.now().toString(),
100
+ payload: message,
101
+ timestamp: message.timestamp,
102
+ },
103
+ });
104
+ }
105
+ getStatus() {
106
+ return {
107
+ connected: true,
108
+ webhook: this.config.webhookUrl,
109
+ };
110
+ }
111
+ }
112
+ // Singleton
113
+ let instance = null;
114
+ export function getSlackIntegration(config) {
115
+ if (!instance && config) {
116
+ instance = new SlackIntegration(config);
117
+ }
118
+ if (!instance) {
119
+ throw new Error("Slack not initialized");
120
+ }
121
+ return instance;
122
+ }
123
+ export function resetSlackIntegration() {
124
+ instance = null;
125
+ }
126
+ export { SlackIntegration };
127
+ export default SlackIntegration;
128
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../../../src/channels/slack/webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Telegram Bot Completion - v0.3.0
3
+ *
4
+ * Full Telegram bot integration with webhook/polling, inline queries, and group support.
5
+ */
6
+ import TelegramBot from "node-telegram-bot-api";
7
+ import { EventEmitter } from "events";
8
+ import { getRealGateway } from "../../gateway/index.js";
9
+ class TelegramIntegration extends EventEmitter {
10
+ config;
11
+ bot;
12
+ connected = false;
13
+ gatewayConnectionId;
14
+ constructor(config) {
15
+ super();
16
+ this.config = {
17
+ mode: "polling",
18
+ port: 3000,
19
+ allowedUpdates: ["message", "edited_message", "callback_query"],
20
+ ...config,
21
+ };
22
+ }
23
+ /**
24
+ * Start Telegram bot
25
+ */
26
+ async start() {
27
+ if (!this.config.token) {
28
+ throw new Error("Telegram bot token required");
29
+ }
30
+ console.log("[Telegram] Starting bot...");
31
+ this.bot = new TelegramBot(this.config.token, {
32
+ polling: this.config.mode === "polling",
33
+ webHook: this.config.mode === "webhook" ? {
34
+ port: this.config.port,
35
+ } : false,
36
+ });
37
+ // Setup webhook if needed
38
+ if (this.config.mode === "webhook" && this.config.webhookUrl) {
39
+ await this.bot.setWebHook(this.config.webhookUrl);
40
+ console.log(`[Telegram] Webhook set: ${this.config.webhookUrl}`);
41
+ }
42
+ // Handle messages
43
+ this.bot.on("message", (msg) => this.handleMessage(msg));
44
+ this.bot.on("edited_message", (msg) => this.handleMessage(msg, true));
45
+ this.bot.on("callback_query", (query) => this.handleCallback(query));
46
+ // Handle polling errors
47
+ this.bot.on("polling_error", (err) => {
48
+ console.error("[Telegram] Polling error:", err.message);
49
+ this.emit("error", err);
50
+ });
51
+ this.connected = true;
52
+ console.log("[Telegram] Bot started successfully");
53
+ // Register with gateway
54
+ this.registerWithGateway();
55
+ this.emit("connected", { bot: this.bot });
56
+ }
57
+ /**
58
+ * Stop Telegram bot
59
+ */
60
+ async stop() {
61
+ console.log("[Telegram] Stopping...");
62
+ this.unregisterFromGateway();
63
+ if (this.bot) {
64
+ if (this.config.mode === "webhook") {
65
+ await this.bot.deleteWebHook();
66
+ }
67
+ else {
68
+ await this.bot.stopPolling();
69
+ }
70
+ this.bot = undefined;
71
+ }
72
+ this.connected = false;
73
+ console.log("[Telegram] Stopped");
74
+ }
75
+ /**
76
+ * Send message
77
+ */
78
+ async sendMessage(chatId, text, options) {
79
+ if (!this.bot) {
80
+ throw new Error("Bot not initialized");
81
+ }
82
+ const sendOptions = {};
83
+ if (options?.parseMode)
84
+ sendOptions.parse_mode = options.parseMode;
85
+ if (options?.replyTo)
86
+ sendOptions.reply_to_message_id = options.replyTo;
87
+ if (options?.buttons) {
88
+ sendOptions.reply_markup = {
89
+ inline_keyboard: options.buttons.map(row => row.map(btn => ({ text: btn.text, callback_data: btn.callbackData }))),
90
+ };
91
+ }
92
+ await this.bot.sendMessage(chatId, text, sendOptions);
93
+ }
94
+ /**
95
+ * Send typing indicator
96
+ */
97
+ async sendTyping(chatId) {
98
+ if (!this.bot)
99
+ return;
100
+ await this.bot.sendChatAction(chatId, "typing");
101
+ }
102
+ /**
103
+ * Send photo
104
+ */
105
+ async sendPhoto(chatId, photo, caption) {
106
+ if (!this.bot)
107
+ return;
108
+ await this.bot.sendPhoto(chatId, photo, { caption });
109
+ }
110
+ /**
111
+ * Handle incoming message
112
+ */
113
+ handleMessage(msg, edited = false) {
114
+ const message = {
115
+ id: msg.message_id,
116
+ from: {
117
+ id: msg.from?.id || 0,
118
+ username: msg.from?.username,
119
+ firstName: msg.from?.first_name,
120
+ },
121
+ chat: {
122
+ id: msg.chat.id,
123
+ type: msg.chat.type,
124
+ title: msg.chat.title,
125
+ },
126
+ text: msg.text,
127
+ caption: msg.caption,
128
+ date: msg.date * 1000,
129
+ isGroup: msg.chat.type !== "private",
130
+ entities: msg.entities?.map(e => ({ type: e.type, offset: e.offset, length: e.length })),
131
+ };
132
+ console.log(`[Telegram] ${edited ? "Edited" : "New"} message from ${message.from.username || message.from.id}`);
133
+ // Forward to gateway
134
+ this.forwardToGateway(message);
135
+ this.emit("message", message);
136
+ }
137
+ /**
138
+ * Handle callback query
139
+ */
140
+ handleCallback(query) {
141
+ console.log("[Telegram] Callback query:", query.data);
142
+ // Answer callback to remove loading state
143
+ this.bot?.answerCallbackQuery(query.id);
144
+ this.emit("callback", {
145
+ id: query.id,
146
+ from: query.from,
147
+ data: query.data,
148
+ message: query.message,
149
+ });
150
+ }
151
+ /**
152
+ * Forward to gateway
153
+ */
154
+ forwardToGateway(message) {
155
+ const gateway = getRealGateway();
156
+ gateway.emit("message", {
157
+ connection: {
158
+ id: this.gatewayConnectionId,
159
+ type: "telegram",
160
+ channel: message.isGroup ? "group" : "dm",
161
+ user: String(message.from.id),
162
+ },
163
+ data: {
164
+ type: "chat",
165
+ id: String(message.id),
166
+ payload: message,
167
+ timestamp: message.date,
168
+ },
169
+ });
170
+ }
171
+ /**
172
+ * Register with gateway
173
+ */
174
+ registerWithGateway() {
175
+ const gateway = getRealGateway();
176
+ this.gatewayConnectionId = gateway.registerConnection({
177
+ type: "telegram",
178
+ channel: "telegram",
179
+ user: "bot",
180
+ });
181
+ gateway.on("message", (event) => {
182
+ if (event.type === "telegram" && event.message) {
183
+ const { chatId, text, options } = event.message;
184
+ this.sendMessage(chatId, text, options).catch(console.error);
185
+ }
186
+ });
187
+ }
188
+ /**
189
+ * Unregister from gateway
190
+ */
191
+ unregisterFromGateway() {
192
+ if (this.gatewayConnectionId) {
193
+ const gateway = getRealGateway();
194
+ gateway.removeConnection(this.gatewayConnectionId);
195
+ this.gatewayConnectionId = undefined;
196
+ }
197
+ }
198
+ getStatus() {
199
+ return {
200
+ connected: this.connected,
201
+ mode: this.config.mode,
202
+ bot: this.bot ? "initialized" : undefined,
203
+ };
204
+ }
205
+ }
206
+ // Singleton
207
+ let instance = null;
208
+ export function getTelegramIntegration(config) {
209
+ if (!instance && config) {
210
+ instance = new TelegramIntegration(config);
211
+ }
212
+ if (!instance) {
213
+ throw new Error("Telegram not initialized");
214
+ }
215
+ return instance;
216
+ }
217
+ export function resetTelegramIntegration() {
218
+ instance?.stop();
219
+ instance = null;
220
+ }
221
+ export { TelegramIntegration };
222
+ export default TelegramIntegration;
223
+ //# sourceMappingURL=bot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot.js","sourceRoot":"","sources":["../../../../src/channels/telegram/bot.ts"],"names":[],"mappings":"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"}