From 98f3a2f50d9dd2ccf217b6fbb6cf65bcb7b95f4b Mon Sep 17 00:00:00 2001 From: sevencat2004 <11336110@qq.com> Date: Sat, 30 May 2026 23:09:29 +0800 Subject: [PATCH 1/6] fix(bot): align nested tsconfig base paths --- packages/bot/core/tsconfig.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/bot/core/tsconfig.json b/packages/bot/core/tsconfig.json index 61d15314..6e585a7b 100644 --- a/packages/bot/core/tsconfig.json +++ b/packages/bot/core/tsconfig.json @@ -1,8 +1,8 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*.ts"] -} \ No newline at end of file +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*.ts"] +} From f9aa6447b559f9781510536ee07c750ead3363cb Mon Sep 17 00:00:00 2001 From: sevencat2004 <11336110@qq.com> Date: Sat, 30 May 2026 23:09:31 +0800 Subject: [PATCH 2/6] fix(bot): align nested tsconfig base paths --- packages/bot/discord/tsconfig.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/bot/discord/tsconfig.json b/packages/bot/discord/tsconfig.json index 61d15314..6e585a7b 100644 --- a/packages/bot/discord/tsconfig.json +++ b/packages/bot/discord/tsconfig.json @@ -1,8 +1,8 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*.ts"] -} \ No newline at end of file +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*.ts"] +} From abc6791d3d131196295a4c7005e7099a911a4e1d Mon Sep 17 00:00:00 2001 From: sevencat2004 <11336110@qq.com> Date: Sat, 30 May 2026 23:09:33 +0800 Subject: [PATCH 3/6] fix(bot): align nested tsconfig base paths --- packages/bot/signal/tsconfig.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/bot/signal/tsconfig.json b/packages/bot/signal/tsconfig.json index 61d15314..6e585a7b 100644 --- a/packages/bot/signal/tsconfig.json +++ b/packages/bot/signal/tsconfig.json @@ -1,8 +1,8 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*.ts"] -} \ No newline at end of file +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*.ts"] +} From 71750f65d845c2af63c27220fd9e2eebe42f89f7 Mon Sep 17 00:00:00 2001 From: sevencat2004 <11336110@qq.com> Date: Sat, 30 May 2026 23:09:35 +0800 Subject: [PATCH 4/6] fix(bot): align nested tsconfig base paths --- packages/bot/telegram/tsconfig.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/bot/telegram/tsconfig.json b/packages/bot/telegram/tsconfig.json index 61d15314..6e585a7b 100644 --- a/packages/bot/telegram/tsconfig.json +++ b/packages/bot/telegram/tsconfig.json @@ -1,8 +1,8 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*.ts"] -} \ No newline at end of file +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*.ts"] +} From 35e047fe2ea457ff7cf5cf5b33fc381446c27d3e Mon Sep 17 00:00:00 2001 From: sevencat2004 <11336110@qq.com> Date: Sat, 30 May 2026 23:09:37 +0800 Subject: [PATCH 5/6] fix(bot): align nested tsconfig base paths --- packages/bot/whatsapp/src/index.ts | 247 +++++++++++++++-------------- 1 file changed, 124 insertions(+), 123 deletions(-) diff --git a/packages/bot/whatsapp/src/index.ts b/packages/bot/whatsapp/src/index.ts index e1948341..4a76f0ae 100644 --- a/packages/bot/whatsapp/src/index.ts +++ b/packages/bot/whatsapp/src/index.ts @@ -1,128 +1,129 @@ -import makeBaileysBot, { type WASocket } from "baileys"; -import { z } from "zod"; - -const configSchema = z.object({ - botName: z.string().default("Bot"), - aiProvider: z.enum(["claude-code", "opencode", "qwen"]).default("claude-code"), - aiCliPath: z.string().default("claude"), - aiModel: z.string().optional(), - sessionTimeoutMs: z.number().int().positive().default(30 * 60 * 1000), - maxOutputLength: z.number().int().positive().default(4000), - maxConcurrentSessions: z.number().int().positive().default(5), - allowedUsers: z.array(z.string()).default([]), - adminUsers: z.array(z.string()).default([]), -}); - -export type Config = z.infer; - -export interface IncomingMessage { - source: string; - sourceName: string; - text: string; - timestamp: number; - chatId: string; - isGroup: boolean; - attachments: Array<{ filename: string; url: string }>; - raw: any; -} - -type MessageHandler = (msg: IncomingMessage) => void | Promise; - -export class WhatsAppBot { - private sock: WASocket | null = null; - private handlers: MessageHandler[] = []; - private config: Config; - private running = false; - - constructor(config: Config) { - this.config = config; - } - - onMessage(handler: MessageHandler): void { - this.handlers.push(handler); - } - - async start(): Promise { - const { state, saveState } = useMultiFileAuthState("./auth"); - - this.sock = makeBaileysBot(state, { - print: console.log, +import makeBaileysBot, { type WASocket } from "baileys"; +import { z } from "zod"; + +const configSchema = z.object({ + botName: z.string().default("Bot"), + aiProvider: z.enum(["claude-code", "opencode", "qwen"]).default("claude-code"), + aiCliPath: z.string().default("claude"), + aiModel: z.string().optional(), + sessionTimeoutMs: z.number().int().positive().default(30 * 60 * 1000), + maxOutputLength: z.number().int().positive().default(4000), + maxConcurrentSessions: z.number().int().positive().default(5), + allowedUsers: z.array(z.string()).default([]), + adminUsers: z.array(z.string()).default([]), +}); + +export type Config = z.infer; + +export interface IncomingMessage { + source: string; + sourceName: string; + text: string; + timestamp: number; + chatId: string; + isGroup: boolean; + attachments: Array<{ filename: string; url: string }>; + raw: any; +} + +type MessageHandler = (msg: IncomingMessage) => void | Promise; + +export class WhatsAppBot { + private sock: WASocket | null = null; + private handlers: MessageHandler[] = []; + private config: Config; + private running = false; + + constructor(config: Config) { + this.config = config; + } + + onMessage(handler: MessageHandler): void { + this.handlers.push(handler); + } + + async start(): Promise { + const { state, saveState } = useMultiFileAuthState("./auth"); + + this.sock = makeBaileysBot({ + auth: state, browser: ["sh1pt-bot", "Chrome", "120"], }); + this.sock.ev.on("creds.update", saveState); this.sock.ev.on("messages.upsert", async ({ messages }) => { - for (const msg of messages) { - if (!msg.message || msg.key.fromMe) continue; - - const chatId = msg.key.remoteJid!; - const isGroup = chatId.endsWith("@g.us"); - const text = - msg.message.conversation || - msg.message.extendedTextMessage?.text || - ""; - - const incoming: IncomingMessage = { - source: chatId, - sourceName: msg.pushName || "User", - text, - timestamp: msg.messageTimestamp * 1000, - chatId, - isGroup, - attachments: [], - raw: msg, - }; - - for (const handler of this.handlers) { - try { - const result = handler(incoming); - if (result instanceof Promise) result.catch(console.error); - } catch (err) { - console.error("Handler error:", err); - } - } - } - }); - - this.running = true; - console.log("WhatsApp bot started"); - } - - async stop(): Promise { - this.running = false; - } - - isRunning(): boolean { - return this.running; - } - - async reply(msg: IncomingMessage, text: string): Promise { - await this.sock?.sendMessage(msg.chatId, { text }); - } - - async send(chatId: string, text: string): Promise { - await this.sock?.sendMessage(chatId, { text }); - } + for (const msg of messages) { + if (!msg.message || msg.key.fromMe) continue; + + const chatId = msg.key.remoteJid!; + const isGroup = chatId.endsWith("@g.us"); + const text = + msg.message.conversation || + msg.message.extendedTextMessage?.text || + ""; + + const incoming: IncomingMessage = { + source: chatId, + sourceName: msg.pushName || "User", + text, + timestamp: msg.messageTimestamp * 1000, + chatId, + isGroup, + attachments: [], + raw: msg, + }; + + for (const handler of this.handlers) { + try { + const result = handler(incoming); + if (result instanceof Promise) result.catch(console.error); + } catch (err) { + console.error("Handler error:", err); + } + } + } + }); + + this.running = true; + console.log("WhatsApp bot started"); + } + + async stop(): Promise { + this.running = false; + } + + isRunning(): boolean { + return this.running; + } + + async reply(msg: IncomingMessage, text: string): Promise { + await this.sock?.sendMessage(msg.chatId, { text }); + } + + async send(chatId: string, text: string): Promise { + await this.sock?.sendMessage(chatId, { text }); + } +} + +function useMultiFileAuthState( + dir: string +): { state: any; saveState: () => void } { + return { + state: {}, + saveState: () => {}, + }; +} + +export function loadConfig(env: Record): Config { + return configSchema.parse({ + botName: env.BOT_NAME || "Bot", + aiProvider: (env.AI_PROVIDER as any) || "claude-code", + aiCliPath: env.AI_CLI_PATH || "claude", + aiModel: env.AI_MODEL, + sessionTimeoutMs: parseInt(env.SESSION_TIMEOUT_MS || "1800000", 10), + maxOutputLength: parseInt(env.MAX_OUTPUT_LENGTH || "4000", 10), + maxConcurrentSessions: parseInt(env.MAX_CONCURRENT_SESSIONS || "5", 10), + allowedUsers: env.ALLOWED_USERS?.split(",").map((u) => u.trim()).filter(Boolean) || [], + adminUsers: env.ADMIN_USERS?.split(",").map((u) => u.trim()).filter(Boolean) || [], + }); } - -function useMultiFileAuthState( - dir: string -): { state: any; saveState: () => void } { - return { - state: {}, - saveState: () => {}, - }; -} - -export function loadConfig(env: Record): Config { - return configSchema.parse({ - botName: env.BOT_NAME || "Bot", - aiProvider: (env.AI_PROVIDER as any) || "claude-code", - aiCliPath: env.AI_CLI_PATH || "claude", - aiModel: env.AI_MODEL, - sessionTimeoutMs: parseInt(env.SESSION_TIMEOUT_MS || "1800000", 10), - maxOutputLength: parseInt(env.MAX_OUTPUT_LENGTH || "4000", 10), - maxConcurrentSessions: parseInt(env.MAX_CONCURRENT_SESSIONS || "5", 10), - allowedUsers: env.ALLOWED_USERS?.split(",").map((u) => u.trim()).filter(Boolean) || [], - adminUsers: env.ADMIN_USERS?.split(",").map((u) => u.trim()).filter(Boolean) || [], - }); -} \ No newline at end of file From af1bcd03c48c26b4c9b719cab6997de2e8a1a6f3 Mon Sep 17 00:00:00 2001 From: sevencat2004 <11336110@qq.com> Date: Sat, 30 May 2026 23:09:39 +0800 Subject: [PATCH 6/6] fix(bot): align nested tsconfig base paths --- packages/bot/whatsapp/tsconfig.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/bot/whatsapp/tsconfig.json b/packages/bot/whatsapp/tsconfig.json index 61d15314..6e585a7b 100644 --- a/packages/bot/whatsapp/tsconfig.json +++ b/packages/bot/whatsapp/tsconfig.json @@ -1,8 +1,8 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*.ts"] -} \ No newline at end of file +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*.ts"] +}