0xkobold 0.2.0 → 0.3.1

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 (62) hide show
  1. package/HEARTBEAT.md +40 -58
  2. package/README.md +387 -337
  3. package/dist/package.json +11 -3
  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/init.js +134 -79
  19. package/dist/src/cli/commands/init.js.map +1 -1
  20. package/dist/src/cli/commands/migrate.js +24 -0
  21. package/dist/src/cli/commands/migrate.js.map +1 -0
  22. package/dist/src/cli/commands/tailscale.js +81 -0
  23. package/dist/src/cli/commands/tailscale.js.map +1 -0
  24. package/dist/src/cli/commands/telegram.js +111 -0
  25. package/dist/src/cli/commands/telegram.js.map +1 -0
  26. package/dist/src/cli/commands/tui.js +40 -22
  27. package/dist/src/cli/commands/tui.js.map +1 -1
  28. package/dist/src/cli/commands/whatsapp.js +116 -0
  29. package/dist/src/cli/commands/whatsapp.js.map +1 -0
  30. package/dist/src/cli/program.js +22 -0
  31. package/dist/src/cli/program.js.map +1 -1
  32. package/dist/src/config/index.js +2 -9
  33. package/dist/src/config/index.js.map +1 -1
  34. package/dist/src/config/manager.js +222 -0
  35. package/dist/src/config/manager.js.map +1 -0
  36. package/dist/src/documents/index.js +3 -0
  37. package/dist/src/documents/index.js.map +1 -0
  38. package/dist/src/documents/pdf.js +168 -0
  39. package/dist/src/documents/pdf.js.map +1 -0
  40. package/dist/src/gateway/client.js +318 -0
  41. package/dist/src/gateway/client.js.map +1 -0
  42. package/dist/src/infra/index.js +3 -0
  43. package/dist/src/infra/index.js.map +1 -0
  44. package/dist/src/infra/tailscale.js +163 -0
  45. package/dist/src/infra/tailscale.js.map +1 -0
  46. package/dist/src/media/audio.js +130 -0
  47. package/dist/src/media/audio.js.map +1 -0
  48. package/dist/src/media/index.js +4 -0
  49. package/dist/src/media/index.js.map +1 -0
  50. package/dist/src/media/vision.js +131 -0
  51. package/dist/src/media/vision.js.map +1 -0
  52. package/dist/src/migration/openclaw.js +498 -0
  53. package/dist/src/migration/openclaw.js.map +1 -0
  54. package/dist/src/sandbox/docker-runner.js +228 -0
  55. package/dist/src/sandbox/docker-runner.js.map +1 -0
  56. package/dist/src/sandbox/index.js +3 -0
  57. package/dist/src/sandbox/index.js.map +1 -0
  58. package/dist/src/skills/builtin/duplicate-detector.js +469 -0
  59. package/dist/src/skills/builtin/duplicate-detector.js.map +1 -0
  60. package/dist/src/skills/index.js +2 -0
  61. package/dist/src/skills/index.js.map +1 -1
  62. package/package.json +11 -3
@@ -0,0 +1,325 @@
1
+ /**
2
+ * WhatsApp Integration - v0.3.0
3
+ *
4
+ * Real WhatsApp channel using Baileys library.
5
+ * Part of "The Gap Closer" - matching OpenClaw's multi-channel support.
6
+ */
7
+ import { makeWASocket, DisconnectReason, useMultiFileAuthState, fetchLatestBaileysVersion, makeCacheableSignalKeyStore, } from "@whiskeysockets/baileys";
8
+ import { EventEmitter } from "events";
9
+ import * as fs from "node:fs/promises";
10
+ import * as path from "node:path";
11
+ import { getRealGateway } from "../../gateway/index.js";
12
+ const DEFAULT_CONFIG = {
13
+ sessionPath: path.join(process.env.HOME || "~", ".0xkobold", "whatsapp-session"),
14
+ qrTimeout: 60000,
15
+ reconnectInterval: 5000,
16
+ markOnlineOnConnect: true,
17
+ defaultMessageDelay: 1000,
18
+ };
19
+ class WhatsAppIntegration extends EventEmitter {
20
+ config;
21
+ socket = null;
22
+ connected = false;
23
+ qrCode = null;
24
+ gatewayConnectionId;
25
+ reconnectTimer;
26
+ sendQueue = [];
27
+ constructor(config = {}) {
28
+ super();
29
+ this.config = { ...DEFAULT_CONFIG, ...config };
30
+ }
31
+ /**
32
+ * Start WhatsApp connection
33
+ */
34
+ async start() {
35
+ if (this.connected)
36
+ return;
37
+ console.log("[WhatsApp] Starting connection...");
38
+ // Ensure session directory exists
39
+ await fs.mkdir(this.config.sessionPath, { recursive: true });
40
+ // Get latest Baileys version
41
+ const { version, isLatest } = await fetchLatestBaileysVersion();
42
+ console.log(`[WhatsApp] Using Baileys v${version.join(".")} (latest: ${isLatest})`);
43
+ // Load auth state
44
+ const { state, saveCreds } = await useMultiFileAuthState(this.config.sessionPath);
45
+ // Create socket
46
+ this.socket = makeWASocket({
47
+ version,
48
+ logger: { info: () => { }, error: () => { }, debug: () => { }, warn: () => { } },
49
+ printQRInTerminal: true,
50
+ auth: {
51
+ creds: state.creds,
52
+ keys: makeCacheableSignalKeyStore(state.keys, { info: () => { } }),
53
+ },
54
+ markOnlineOnConnect: this.config.markOnlineOnConnect,
55
+ defaultQueryTimeoutMs: 60000,
56
+ });
57
+ // Handle connection updates
58
+ this.socket.ev.on("connection.update", async (update) => {
59
+ const { connection, lastDisconnect, qr } = update;
60
+ // QR code for pairing
61
+ if (qr) {
62
+ this.qrCode = qr;
63
+ console.log("[WhatsApp] QR Code generated - scan with WhatsApp app");
64
+ this.emit("qr", qr);
65
+ }
66
+ // Connection established
67
+ if (connection === "open") {
68
+ this.connected = true;
69
+ this.qrCode = null;
70
+ console.log("[WhatsApp] āœ… Connected successfully");
71
+ // Register with gateway
72
+ this.registerWithGateway();
73
+ // Process queued messages
74
+ this.processSendQueue();
75
+ this.emit("connected", { user: this.socket?.user });
76
+ }
77
+ // Connection closed
78
+ if (connection === "close") {
79
+ this.connected = false;
80
+ this.unregisterFromGateway();
81
+ const shouldReconnect = lastDisconnect?.error?.output?.statusCode !== DisconnectReason.loggedOut;
82
+ console.log(`[WhatsApp] Disconnected. Reconnect: ${shouldReconnect}`);
83
+ this.emit("disconnected", { shouldReconnect });
84
+ if (shouldReconnect) {
85
+ this.scheduleReconnect();
86
+ }
87
+ }
88
+ });
89
+ // Handle credentials update
90
+ this.socket.ev.on("creds.update", saveCreds);
91
+ // Handle messages
92
+ this.socket.ev.on("messages.upsert", async (event) => {
93
+ for (const msg of event.messages) {
94
+ if (msg.key.fromMe)
95
+ continue; // Skip own messages
96
+ await this.handleIncomingMessage(msg);
97
+ }
98
+ });
99
+ // Handle group events
100
+ this.socket.ev.on("groups.upsert", (groups) => {
101
+ console.log("[WhatsApp] Groups updated:", groups.length);
102
+ });
103
+ }
104
+ /**
105
+ * Stop WhatsApp connection
106
+ */
107
+ async stop() {
108
+ console.log("[WhatsApp] Stopping...");
109
+ if (this.reconnectTimer) {
110
+ clearTimeout(this.reconnectTimer);
111
+ }
112
+ this.unregisterFromGateway();
113
+ if (this.socket) {
114
+ await this.socket.logout();
115
+ this.socket = null;
116
+ }
117
+ this.connected = false;
118
+ console.log("[WhatsApp] Stopped");
119
+ }
120
+ /**
121
+ * Send text message
122
+ */
123
+ async sendText(to, text) {
124
+ const jid = this.formatJid(to);
125
+ return new Promise((resolve, reject) => {
126
+ if (!this.connected || !this.socket) {
127
+ // Queue for later
128
+ this.sendQueue.push({
129
+ to: jid,
130
+ message: { text },
131
+ resolve,
132
+ });
133
+ return;
134
+ }
135
+ this.socket.sendMessage(jid, { text })
136
+ .then(resolve)
137
+ .catch(reject);
138
+ });
139
+ }
140
+ /**
141
+ * Send typing indicator
142
+ */
143
+ async sendTyping(to) {
144
+ if (!this.connected || !this.socket)
145
+ return;
146
+ const jid = this.formatJid(to);
147
+ await this.socket.sendPresenceUpdate("composing", jid);
148
+ }
149
+ /**
150
+ * Send image
151
+ */
152
+ async sendImage(to, imagePath, caption) {
153
+ if (!this.connected || !this.socket) {
154
+ throw new Error("Not connected");
155
+ }
156
+ const jid = this.formatJid(to);
157
+ const imageBuffer = await fs.readFile(imagePath);
158
+ return this.socket.sendMessage(jid, {
159
+ image: imageBuffer,
160
+ caption,
161
+ });
162
+ }
163
+ /**
164
+ * Get groups
165
+ */
166
+ async getGroups() {
167
+ if (!this.connected || !this.socket) {
168
+ throw new Error("Not connected");
169
+ }
170
+ const groups = await this.socket.groupFetchAllParticipating();
171
+ return Object.keys(groups);
172
+ }
173
+ /**
174
+ * Handle incoming message
175
+ */
176
+ async handleIncomingMessage(msg) {
177
+ const from = msg.key.remoteJid || "";
178
+ const isGroup = from.endsWith("@g.us");
179
+ // Extract message body
180
+ let body = "";
181
+ let type = "text";
182
+ if (msg.message?.conversation) {
183
+ body = msg.message.conversation;
184
+ }
185
+ else if (msg.message?.extendedTextMessage?.text) {
186
+ body = msg.message.extendedTextMessage.text;
187
+ }
188
+ else if (msg.message?.imageMessage) {
189
+ body = msg.message.imageMessage.caption || "";
190
+ type = "image";
191
+ }
192
+ else if (msg.message?.videoMessage) {
193
+ body = msg.message.videoMessage.caption || "";
194
+ type = "video";
195
+ }
196
+ const message = {
197
+ id: msg.key.id || "",
198
+ from,
199
+ fromMe: msg.key.fromMe || false,
200
+ body,
201
+ type,
202
+ timestamp: msg.messageTimestamp ? Number(msg.messageTimestamp) * 1000 : Date.now(),
203
+ isGroup,
204
+ groupName: isGroup ? await this.getGroupName(from) : undefined,
205
+ senderName: msg.pushName,
206
+ };
207
+ console.log(`[WhatsApp] Message from ${isGroup ? "group" : "user"}: ${body.slice(0, 50)}...`);
208
+ // Forward to gateway
209
+ this.forwardToGateway(message);
210
+ this.emit("message", message);
211
+ }
212
+ /**
213
+ * Forward to gateway
214
+ */
215
+ forwardToGateway(message) {
216
+ const gateway = getRealGateway();
217
+ gateway.emit("message", {
218
+ connection: {
219
+ id: this.gatewayConnectionId,
220
+ type: "whatsapp",
221
+ channel: message.isGroup ? "group" : "dm",
222
+ user: message.from,
223
+ },
224
+ data: {
225
+ type: "chat",
226
+ id: message.id,
227
+ payload: message,
228
+ timestamp: message.timestamp,
229
+ },
230
+ });
231
+ }
232
+ /**
233
+ * Register with gateway
234
+ */
235
+ registerWithGateway() {
236
+ const gateway = getRealGateway();
237
+ this.gatewayConnectionId = gateway.registerConnection({
238
+ type: "whatsapp",
239
+ channel: "whatsapp",
240
+ user: this.socket?.user?.id,
241
+ });
242
+ // Listen for gateway messages to send to WhatsApp
243
+ gateway.on("message", (event) => {
244
+ if (event.type === "whatsapp") {
245
+ const data = event.message;
246
+ this.sendText(data.to, data.text).catch(console.error);
247
+ }
248
+ });
249
+ }
250
+ /**
251
+ * Unregister from gateway
252
+ */
253
+ unregisterFromGateway() {
254
+ if (this.gatewayConnectionId) {
255
+ const gateway = getRealGateway();
256
+ gateway.removeConnection(this.gatewayConnectionId);
257
+ this.gatewayConnectionId = undefined;
258
+ }
259
+ }
260
+ /**
261
+ * Get group name
262
+ */
263
+ async getGroupName(jid) {
264
+ if (!this.socket)
265
+ return undefined;
266
+ try {
267
+ const metadata = await this.socket.groupMetadata(jid);
268
+ return metadata.subject;
269
+ }
270
+ catch {
271
+ return undefined;
272
+ }
273
+ }
274
+ /**
275
+ * Format JID
276
+ */
277
+ formatJid(input) {
278
+ if (input.includes("@"))
279
+ return input;
280
+ return `${input.replace(/\D/g, "")}@s.whatsapp.net`;
281
+ }
282
+ /**
283
+ * Process queued messages
284
+ */
285
+ processSendQueue() {
286
+ while (this.sendQueue.length > 0 && this.connected) {
287
+ const item = this.sendQueue.shift();
288
+ if (item) {
289
+ this.socket?.sendMessage(item.to, item.message)
290
+ .then(item.resolve)
291
+ .catch(console.error);
292
+ }
293
+ }
294
+ }
295
+ /**
296
+ * Schedule reconnect
297
+ */
298
+ scheduleReconnect() {
299
+ this.reconnectTimer = setTimeout(async () => {
300
+ console.log("[WhatsApp] Reconnecting...");
301
+ await this.start();
302
+ }, this.config.reconnectInterval);
303
+ }
304
+ getStatus() {
305
+ return {
306
+ connected: this.connected,
307
+ qr: this.qrCode,
308
+ user: this.socket?.user?.id,
309
+ };
310
+ }
311
+ }
312
+ // Singleton
313
+ let instance = null;
314
+ export function getWhatsAppIntegration(config) {
315
+ if (!instance) {
316
+ instance = new WhatsAppIntegration(config);
317
+ }
318
+ return instance;
319
+ }
320
+ export function resetWhatsAppIntegration() {
321
+ instance?.stop();
322
+ instance = null;
323
+ }
324
+ export default WhatsAppIntegration;
325
+ //# sourceMappingURL=integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.js","sourceRoot":"","sources":["../../../../src/channels/whatsapp/integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Check Command - v0.3.0
3
+ *
4
+ * Check for duplicate implementations before adding new code.
5
+ */
6
+ import { Command } from "commander";
7
+ import { getDuplicateDetector } from "../../skills/index.js";
8
+ export const checkCommand = new Command("check")
9
+ .description("Check for existing implementations before adding new code")
10
+ .argument("<description>", "Description of what you want to add")
11
+ .option("-f, --function <name>", "Check for function")
12
+ .option("-c, --class <name>", "Check for class")
13
+ .option("-s, --signature <signature>", "Function signature to compare")
14
+ .option("--similarity <threshold>", "Similarity threshold (0.0-1.0)", "0.7")
15
+ .option("--max-results <n>", "Max results to show", "5")
16
+ .action(async (description, options) => {
17
+ console.log("šŸ” Checking for existing implementations...\n");
18
+ const detector = getDuplicateDetector({
19
+ scanPaths: ["src", "lib"],
20
+ similarityThreshold: parseFloat(options.similarity),
21
+ maxResults: parseInt(options.maxResults),
22
+ excludePatterns: ["node_modules", ".git", "test", "*.test.ts"],
23
+ });
24
+ let result;
25
+ if (options.function) {
26
+ console.log(`Checking for function: ${options.function}`);
27
+ result = await detector.checkFunction(options.function, options.signature || "");
28
+ }
29
+ else if (options.class) {
30
+ console.log(`Checking for class: ${options.class}`);
31
+ const methods = options.signature
32
+ ? options.signature.split(",").map((m) => m.trim())
33
+ : undefined;
34
+ result = await detector.checkClass(options.class, methods);
35
+ }
36
+ else {
37
+ console.log(`Checking: ${description}`);
38
+ result = await detector.check(description);
39
+ }
40
+ console.log("\n" + "=".repeat(60));
41
+ console.log("RESULTS");
42
+ console.log("=".repeat(60));
43
+ if (result.exists) {
44
+ console.log(`\nāš ļø EXISTING IMPLEMENTATION FOUND`);
45
+ console.log(` Confidence: ${Math.round(result.confidence * 100)}%\n`);
46
+ }
47
+ else if (result.matches.length > 0) {
48
+ console.log(`\n⚔ SIMILAR IMPLEMENTATIONS FOUND`);
49
+ console.log(` Best match: ${Math.round(result.confidence * 100)}%\n`);
50
+ }
51
+ else {
52
+ console.log(`\nāœ… NO EXISTING IMPLEMENTATION FOUND`);
53
+ console.log(` Safe to proceed with implementation.\n`);
54
+ }
55
+ if (result.matches.length > 0) {
56
+ console.log("Similar files:");
57
+ result.matches.forEach((match, i) => {
58
+ console.log(` ${i + 1}. ${match.file}:${match.line} (${Math.round(match.similarity * 100)}%)`);
59
+ console.log(` ${match.snippet.slice(0, 60)}...`);
60
+ });
61
+ }
62
+ console.log("\n" + "=".repeat(60));
63
+ console.log("SUGGESTION");
64
+ console.log("=".repeat(60));
65
+ console.log(result.suggestion);
66
+ // Return exit code
67
+ process.exit(result.exists && result.confidence > 0.9 ? 1 : 0);
68
+ });
69
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../../src/cli/commands/check.ts"],"names":[],"mappings":"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"}