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.
- package/HEARTBEAT.md +40 -58
- package/README.md +387 -337
- package/dist/package.json +4 -2
- package/dist/src/auth/device-auth.js +202 -0
- package/dist/src/auth/device-auth.js.map +1 -0
- package/dist/src/auth/index.js +3 -0
- package/dist/src/auth/index.js.map +1 -0
- package/dist/src/channels/index.js +8 -0
- package/dist/src/channels/index.js.map +1 -0
- package/dist/src/channels/slack/webhook.js +128 -0
- package/dist/src/channels/slack/webhook.js.map +1 -0
- package/dist/src/channels/telegram/bot.js +223 -0
- package/dist/src/channels/telegram/bot.js.map +1 -0
- package/dist/src/channels/whatsapp/integration.js +325 -0
- package/dist/src/channels/whatsapp/integration.js.map +1 -0
- package/dist/src/cli/commands/check.js +69 -0
- package/dist/src/cli/commands/check.js.map +1 -0
- package/dist/src/cli/commands/migrate.js +24 -0
- package/dist/src/cli/commands/migrate.js.map +1 -0
- package/dist/src/cli/commands/tailscale.js +81 -0
- package/dist/src/cli/commands/tailscale.js.map +1 -0
- package/dist/src/cli/commands/telegram.js +111 -0
- package/dist/src/cli/commands/telegram.js.map +1 -0
- package/dist/src/cli/commands/tui.js +40 -22
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/cli/commands/whatsapp.js +116 -0
- package/dist/src/cli/commands/whatsapp.js.map +1 -0
- package/dist/src/cli/program.js +20 -0
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/config/index.js +2 -9
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/manager.js +222 -0
- package/dist/src/config/manager.js.map +1 -0
- package/dist/src/documents/index.js +3 -0
- package/dist/src/documents/index.js.map +1 -0
- package/dist/src/documents/pdf.js +168 -0
- package/dist/src/documents/pdf.js.map +1 -0
- package/dist/src/gateway/client.js +318 -0
- package/dist/src/gateway/client.js.map +1 -0
- package/dist/src/infra/index.js +3 -0
- package/dist/src/infra/index.js.map +1 -0
- package/dist/src/infra/tailscale.js +163 -0
- package/dist/src/infra/tailscale.js.map +1 -0
- package/dist/src/media/audio.js +130 -0
- package/dist/src/media/audio.js.map +1 -0
- package/dist/src/media/index.js +4 -0
- package/dist/src/media/index.js.map +1 -0
- package/dist/src/media/vision.js +131 -0
- package/dist/src/media/vision.js.map +1 -0
- package/dist/src/migration/openclaw.js +498 -0
- package/dist/src/migration/openclaw.js.map +1 -0
- package/dist/src/sandbox/docker-runner.js +228 -0
- package/dist/src/sandbox/docker-runner.js.map +1 -0
- package/dist/src/sandbox/index.js +3 -0
- package/dist/src/sandbox/index.js.map +1 -0
- package/dist/src/skills/builtin/duplicate-detector.js +469 -0
- package/dist/src/skills/builtin/duplicate-detector.js.map +1 -0
- package/dist/src/skills/index.js +2 -0
- package/dist/src/skills/index.js.map +1 -1
- package/package.json +4 -2
package/dist/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "0xkobold",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Your digital familiar - a personal AI assistant that learns and evolves (v0.
|
|
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 @@
|
|
|
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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"}
|