@geminixiang/mikan 1.0.0-beta.40 → 1.0.0-beta.41
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/CHANGELOG.md +26 -0
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +7 -6
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/components.d.ts +33 -0
- package/dist/adapters/discord/components.d.ts.map +1 -0
- package/dist/adapters/discord/components.js +32 -0
- package/dist/adapters/discord/components.js.map +1 -0
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +16 -6
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/discord/format.d.ts +3 -0
- package/dist/adapters/discord/format.d.ts.map +1 -0
- package/dist/adapters/discord/format.js +86 -0
- package/dist/adapters/discord/format.js.map +1 -0
- package/dist/adapters/markdown-tables.d.ts +37 -0
- package/dist/adapters/markdown-tables.d.ts.map +1 -0
- package/dist/adapters/markdown-tables.js +164 -0
- package/dist/adapters/markdown-tables.js.map +1 -0
- package/dist/adapters/progressive-renderer.d.ts.map +1 -1
- package/dist/adapters/progressive-renderer.js +69 -12
- package/dist/adapters/progressive-renderer.js.map +1 -1
- package/dist/adapters/slack/assistant.d.ts +101 -0
- package/dist/adapters/slack/assistant.d.ts.map +1 -0
- package/dist/adapters/slack/assistant.js +204 -0
- package/dist/adapters/slack/assistant.js.map +1 -0
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +4 -82
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +52 -0
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +161 -5
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +86 -15
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/stream-limits.d.ts +35 -0
- package/dist/adapters/slack/stream-limits.d.ts.map +1 -0
- package/dist/adapters/slack/stream-limits.js +56 -0
- package/dist/adapters/slack/stream-limits.js.map +1 -0
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +26 -47
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +7 -19
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/types.d.ts +24 -1
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +2 -1
- package/dist/agent.js.map +1 -1
- package/dist/commands/extensions.d.ts +18 -6
- package/dist/commands/extensions.d.ts.map +1 -1
- package/dist/commands/extensions.js +55 -8
- package/dist/commands/extensions.js.map +1 -1
- package/dist/env-manifest.d.ts.map +1 -1
- package/dist/env-manifest.js +4 -0
- package/dist/env-manifest.js.map +1 -1
- package/dist/harness/subagent-runner.d.ts +6 -0
- package/dist/harness/subagent-runner.d.ts.map +1 -1
- package/dist/harness/subagent-runner.js +63 -0
- package/dist/harness/subagent-runner.js.map +1 -1
- package/dist/subagent-progress.d.ts +3 -7
- package/dist/subagent-progress.d.ts.map +1 -1
- package/dist/subagent-progress.js +15 -10
- package/dist/subagent-progress.js.map +1 -1
- package/dist/tools/subagent.d.ts +8 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +24 -1
- package/dist/tools/subagent.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/web/admin/portal.js +5 -1
- package/dist/web/admin/portal.js.map +1 -1
- package/package.json +2 -1
- package/dist/adapters/telegram/html.d.ts +0 -3
- package/dist/adapters/telegram/html.d.ts.map +0 -1
- package/dist/adapters/telegram/html.js +0 -101
- package/dist/adapters/telegram/html.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../../src/adapters/telegram/bot.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport { Bot as GrammyMessagingBot, InputFile } from \"grammy\";\nimport type { Message } from \"grammy/types\";\nimport type {\n ConversationEvent,\n MessagingEventHandler,\n ConversationKind,\n MessagingInfo,\n} from \"../../adapter.js\";\nimport { createConversationEvent, type MessagingBot } from \"../../adapter.js\";\nimport type { TelegramEvent } from \"./types.js\";\nimport * as log from \"../../log.js\";\nimport { resolveChatSessionKey } from \"../../sessions/session-key.js\";\nimport {\n appendBotResponseLog,\n appendChannelLog,\n MessagingEventQueue,\n downloadUrlToFile,\n withRetry,\n saveIncomingAttachments,\n type IncomingAttachment,\n} from \"../shared.js\";\nimport { telegramCommandMenu } from \"../../commands/manifest.js\";\nimport { processMessageIntake } from \"../intake.js\";\nimport { createTelegramAdapters } from \"./context.js\";\nimport { escapeTelegramHtml } from \"./html.js\";\nimport { createOfficeAddress, type Workspace } from \"../../office/index.js\";\n\n// grammY surfaces Telegram errors as `GrammyError` with `error_code` mirroring\n// the Bot API. 429 is the rate-limit status; the response also includes\n// `parameters.retry_after` but exponential backoff is good enough here.\nfunction telegramIsRateLimited(err: Error): boolean {\n return (err as { error_code?: number }).error_code === 429;\n}\n\nconst telegramRetry = <T>(fn: () => Promise<T>): Promise<T> =>\n withRetry(fn, { isRateLimited: telegramIsRateLimited });\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type { TelegramEvent } from \"./types.js\";\n\ninterface MessageContext {\n msg: Message;\n text: string;\n chatId: string;\n chatType: string;\n conversationKind: ConversationKind;\n userId: string;\n userName: string;\n msgId: string;\n threadTs: string | undefined;\n sessionKey: string;\n}\n\n// ============================================================================\n// TelegramMessagingBot\n// ============================================================================\n\nfunction isTelegramHtmlParseError(message: string): boolean {\n return message.includes(\"can't parse entities\");\n}\n\nexport class TelegramMessagingBot implements MessagingBot {\n private client: GrammyMessagingBot;\n private handler: MessagingEventHandler;\n private botToken: string;\n private workspace: Workspace;\n private botUserId: string | null = null;\n private botUsername: string | null = null;\n private queues = new Map<string, MessagingEventQueue>();\n private startupTime: number = 0;\n\n constructor(handler: MessagingEventHandler, config: { token: string; workspace: Workspace }) {\n this.handler = handler;\n this.botToken = config.token;\n this.workspace = config.workspace;\n this.client = new GrammyMessagingBot(config.token);\n this.client.catch((err) => {\n log.logWarning(\"Telegram error\", err instanceof Error ? err.message : String(err));\n });\n }\n\n // ==========================================================================\n // Public API (implements MessagingBot)\n // ==========================================================================\n\n async start(): Promise<void> {\n const me = await this.client.api.getMe();\n this.botUserId = String(me.id);\n this.botUsername = me.username ?? null;\n this.startupTime = Date.now();\n\n // Menu registration derives from the command manifest; routing is\n // separate (native handlers below + intake/dispatch for the rest).\n await this.client.api.setMyCommands(telegramCommandMenu());\n\n this.setupEventHandlers();\n\n // Start polling in background (bot.start() runs indefinitely)\n this.client.start().catch((err) => {\n log.logWarning(\"Telegram polling error\", err instanceof Error ? err.message : String(err));\n });\n\n log.logConnected(\"Telegram\");\n log.logInfo(`Telegram bot started as @${this.botUsername ?? this.botUserId}`);\n }\n\n async postMessage(channel: string, text: string): Promise<string> {\n const result = await this.postMessageRaw(parseInt(channel), text);\n return String(result);\n }\n\n async addReaction(channel: string, messageTs: string, emoji: string): Promise<void> {\n // Telegram reactions are set via setMessageReaction with a Unicode emoji.\n // Short names (Slack style) won't resolve; callers should pass an emoji.\n const name = emoji.replace(/^:|:$/g, \"\");\n await telegramRetry(async () => {\n await this.client.api.setMessageReaction(parseInt(channel), parseInt(messageTs), [\n { type: \"emoji\", emoji: name as never },\n ]);\n });\n }\n\n async updateMessage(channel: string, ts: string, text: string): Promise<void> {\n return telegramRetry(async () => {\n try {\n await this.client.api.editMessageText(parseInt(channel), parseInt(ts), text, {\n parse_mode: \"HTML\",\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes(\"message is not modified\")) {\n return;\n }\n if (!isTelegramHtmlParseError(msg)) {\n throw err;\n }\n await this.client.api.editMessageText(\n parseInt(channel),\n parseInt(ts),\n escapeTelegramHtml(text),\n {\n parse_mode: \"HTML\",\n },\n );\n }\n });\n }\n\n enqueueEvent(event: ConversationEvent): boolean {\n const conversationId = event.conversationId;\n const queue = this.getQueue(conversationId);\n if (queue.size() >= 5) {\n log.logWarning(\n `Event queue full for ${conversationId}, discarding: ${event.text.substring(0, 50)}`,\n );\n return false;\n }\n log.logInfo(`Enqueueing event for ${conversationId}: ${event.text.substring(0, 50)}`);\n queue.enqueue(() => {\n const context = createTelegramAdapters(event as TelegramEvent, this);\n return this.handler.handleEvent(event, this, context);\n });\n return true;\n }\n\n getMessagingInfo(): MessagingInfo {\n return {\n name: \"telegram\",\n trustModel: \"membership\",\n formattingGuide:\n '## Telegram Formatting (HTML mode)\\nBold: <b>text</b>, Italic: <i>text</i>, Code: <code>code</code>, Pre: <pre>code</pre>\\nLinks: <a href=\"url\">text</a>\\nDo NOT use Markdown asterisks or backtick syntax.\\nDo NOT use <table> tags — they are unsupported. Use <pre> with ASCII art for tables instead.',\n channels: [],\n users: [],\n };\n }\n\n // ==========================================================================\n // Internal helpers (used by context.ts)\n // ==========================================================================\n\n async postMessageRaw(chatId: number, text: string): Promise<number> {\n return telegramRetry(async () => {\n try {\n const result = await this.client.api.sendMessage(chatId, text, { parse_mode: \"HTML\" });\n return result.message_id;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!isTelegramHtmlParseError(msg)) {\n throw err;\n }\n const result = await this.client.api.sendMessage(chatId, escapeTelegramHtml(text), {\n parse_mode: \"HTML\",\n });\n return result.message_id;\n }\n });\n }\n\n async postPlainMessage(chatId: number, text: string): Promise<void> {\n return telegramRetry(async () => {\n await this.client.api.sendMessage(chatId, text);\n });\n }\n\n async postReply(chatId: number, replyToMessageId: number, text: string): Promise<number> {\n return telegramRetry(async () => {\n try {\n const result = await this.client.api.sendMessage(chatId, text, {\n parse_mode: \"HTML\",\n reply_parameters: { message_id: replyToMessageId },\n });\n return result.message_id;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!isTelegramHtmlParseError(msg)) {\n throw err;\n }\n const result = await this.client.api.sendMessage(chatId, escapeTelegramHtml(text), {\n parse_mode: \"HTML\",\n reply_parameters: { message_id: replyToMessageId },\n });\n return result.message_id;\n }\n });\n }\n\n async deleteMessageRaw(chatId: number, messageId: number): Promise<void> {\n await this.client.api.deleteMessage(chatId, messageId);\n }\n\n async sendTyping(chatId: number): Promise<void> {\n await this.client.api.sendChatAction(chatId, \"typing\");\n }\n\n async uploadFile(channel: string, filePath: string, title?: string): Promise<void> {\n return telegramRetry(async () => {\n const fileName = title ?? basename(filePath);\n const fileContent = readFileSync(filePath);\n await this.client.api.sendDocument(parseInt(channel), new InputFile(fileContent, fileName));\n });\n }\n\n logToFile(channel: string, entry: object): void {\n appendChannelLog(this.workspace.office(createOfficeAddress(\"telegram\", channel)), entry);\n }\n\n logBotResponse(channel: string, text: string, ts: string): void {\n appendBotResponseLog(this.workspace.office(createOfficeAddress(\"telegram\", channel)), text, ts);\n }\n\n /**\n * Process attachments from a Telegram message\n * Downloads files before returning metadata so the agent can read them immediately\n * Returns format compatible with ConversationMessage: { name: string, localPath: string }[]\n */\n async processAttachments(\n chatId: string,\n message: Message,\n ): Promise<{ name: string; localPath: string }[]> {\n const items: IncomingAttachment[] = [];\n\n // Photos: take the largest size for best quality.\n const photo = message.photo?.[message.photo.length - 1];\n if (photo) {\n items.push(this.telegramFileItem(photo.file_id, `photo_${message.message_id}.jpg`));\n }\n if (message.document) {\n const doc = message.document;\n items.push(\n this.telegramFileItem(doc.file_id, doc.file_name ?? `document_${message.message_id}`),\n );\n }\n\n const office = this.workspace.office(createOfficeAddress(\"telegram\", chatId));\n const { saved, failed } = await saveIncomingAttachments(office, items);\n for (const failure of failed) {\n log.logWarning(`Failed to process Telegram file`, `${failure.name}: ${failure.error}`);\n }\n return saved.map((item) => ({ name: item.original, localPath: item.localPath }));\n }\n\n /** One Telegram file as a saveIncomingAttachments item; failures skip, never throw. */\n private telegramFileItem(fileId: string, name: string): IncomingAttachment {\n return {\n name,\n download: async (destPath) => {\n const file = await this.client.api.getFile(fileId);\n if (!file.file_path) throw new Error(`Telegram file has no path: ${fileId}`);\n await downloadUrlToFile(\n `https://api.telegram.org/file/bot${this.botToken}/${file.file_path}`,\n destPath,\n );\n },\n };\n }\n\n // ==========================================================================\n // Private - Event Handlers\n // ==========================================================================\n\n private getQueue(channelId: string): MessagingEventQueue {\n let queue = this.queues.get(channelId);\n if (!queue) {\n queue = new MessagingEventQueue(\"Telegram\");\n this.queues.set(channelId, queue);\n }\n return queue;\n }\n\n private extractMessageContext(msg: Message): MessageContext | null {\n if (!msg) return null;\n if (msg.date * 1000 < this.startupTime) return null;\n if (msg.from?.is_bot) return null;\n\n const text = msg.text ?? msg.caption ?? \"\";\n if (!text && !msg.document && !msg.photo) return null;\n\n const chatId = String(msg.chat.id);\n const chatType = msg.chat.type;\n const userId = String(msg.from?.id ?? \"unknown\");\n const userName = msg.from?.username ?? msg.from?.first_name ?? userId;\n const msgId = String(msg.message_id);\n const replyToId = msg.reply_to_message?.message_id;\n const threadTs = replyToId ? String(replyToId) : undefined;\n const conversationKind = chatType === \"private\" ? \"direct\" : \"shared\";\n\n const sessionKey = resolveChatSessionKey({\n conversationId: chatId,\n conversationKind,\n messageId: msgId,\n threadTs,\n });\n\n return {\n msg,\n text,\n chatId,\n chatType,\n conversationKind,\n userId,\n userName,\n msgId,\n threadTs,\n sessionKey,\n };\n }\n\n private isAddressedToMessagingBot(text: string, chatType: string): boolean {\n if (chatType === \"private\") return true;\n if (!this.botUsername) return false;\n return text.toLowerCase().includes(`@${this.botUsername.toLowerCase()}`);\n }\n\n private cleanText(text: string): string {\n if (!this.botUsername) return text.trim();\n return text.replace(new RegExp(`@${this.botUsername}`, \"gi\"), \"\").trim();\n }\n\n private setupEventHandlers(): void {\n // --- Slash commands (registered before catch-all so grammY intercepts them) ---\n // `/stop` is deliberately NOT registered here: it is a magic word owned by\n // conversation intake, so the catch-all below must receive it.\n\n this.client.command(\"new\", async (ctx) => {\n const mc = ctx.message ? this.extractMessageContext(ctx.message) : null;\n if (!mc) return;\n const commandText = this.cleanText(mc.text);\n const event = createConversationEvent({\n platform: \"telegram\",\n type: \"command\",\n conversationId: mc.chatId,\n conversationKind: mc.conversationKind,\n ts: mc.msgId,\n thread_ts: mc.threadTs,\n sessionKey: mc.sessionKey,\n user: mc.userId,\n userName: mc.userName,\n text: commandText,\n attachments: [],\n }) as TelegramEvent;\n this.logToFile(mc.chatId, {\n date: new Date(mc.msg.date * 1000).toISOString(),\n ts: mc.msgId,\n ...(mc.conversationKind === \"shared\" && mc.threadTs ? { threadTs: mc.threadTs } : {}),\n user: mc.userId,\n userName: mc.userName,\n text: commandText,\n attachments: [],\n isMessagingBot: false,\n });\n await this.handler.handleEvent(event, this, createTelegramAdapters(event, this));\n });\n\n this.client.command(\"sandbox\", async (ctx) => {\n const mc = ctx.message ? this.extractMessageContext(ctx.message) : null;\n if (!mc) return;\n // The sandbox handler's grammar accepts /sandbox directly (manifest\n // slash forms), so the user's spelling is logged and dispatched as-is.\n const cleanedText = this.cleanText(mc.text);\n const event = createConversationEvent({\n platform: \"telegram\",\n type: \"command\",\n conversationId: mc.chatId,\n conversationKind: mc.conversationKind,\n ts: mc.msgId,\n thread_ts: mc.threadTs,\n sessionKey: mc.sessionKey,\n user: mc.userId,\n userName: mc.userName,\n text: cleanedText,\n attachments: [],\n }) as TelegramEvent;\n this.logToFile(mc.chatId, {\n date: new Date(mc.msg.date * 1000).toISOString(),\n ts: mc.msgId,\n ...(mc.conversationKind === \"shared\" && mc.threadTs ? { threadTs: mc.threadTs } : {}),\n user: mc.userId,\n userName: mc.userName,\n text: cleanedText,\n attachments: [],\n isMessagingBot: false,\n });\n const context = createTelegramAdapters(event, this);\n await this.handler.handleEvent(event, this, context);\n });\n\n // --- Catch-all for regular (non-command) messages ---\n\n this.client.on(\"message\", async (ctx) => {\n const mc = ctx.message ? this.extractMessageContext(ctx.message) : null;\n if (!mc) return;\n\n const cleanedText = this.cleanText(mc.text);\n const addressedToMessagingBot = this.isAddressedToMessagingBot(mc.text, mc.chatType);\n const isAutoReplyCandidate = mc.chatType !== \"private\" && !addressedToMessagingBot;\n\n const eventBase = createConversationEvent({\n platform: \"telegram\",\n type: \"message\",\n conversationId: mc.chatId,\n conversationKind: mc.conversationKind,\n ts: mc.msgId,\n thread_ts: mc.threadTs,\n sessionKey: mc.sessionKey,\n user: mc.userId,\n userName: mc.userName,\n text: cleanedText,\n }) as TelegramEvent;\n\n await processMessageIntake({\n eventBase,\n office: this.workspace.office(eventBase.address),\n isAutoReplyCandidate,\n magicWord: {\n addressed: addressedToMessagingBot || mc.chatType === \"private\",\n scopeFallback: \"always\",\n },\n busyPolicy: \"reject\",\n logEntryBase: {\n date: new Date(mc.msg.date * 1000).toISOString(),\n ts: mc.msgId,\n ...(mc.conversationKind === \"shared\" && mc.threadTs ? { threadTs: mc.threadTs } : {}),\n user: mc.userId,\n userName: mc.userName,\n text: cleanedText,\n isMessagingBot: false,\n },\n log: (entry) => this.logToFile(mc.chatId, entry),\n processAttachments: () => this.processAttachments(mc.chatId, mc.msg),\n queueKey: mc.sessionKey,\n enqueue: (queueKey, work) => this.getQueue(queueKey).enqueue(work),\n handler: this.handler,\n bot: this,\n createContext: (event) => createTelegramAdapters(event, this),\n });\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../../src/adapters/telegram/bot.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport { Bot as GrammyMessagingBot, InputFile } from \"grammy\";\nimport type { Message } from \"grammy/types\";\nimport type {\n ConversationEvent,\n MessagingEventHandler,\n ConversationKind,\n MessagingInfo,\n} from \"../../adapter.js\";\nimport { createConversationEvent, type MessagingBot } from \"../../adapter.js\";\nimport type { TelegramEvent } from \"./types.js\";\nimport * as log from \"../../log.js\";\nimport { resolveChatSessionKey } from \"../../sessions/session-key.js\";\nimport {\n appendBotResponseLog,\n appendChannelLog,\n MessagingEventQueue,\n downloadUrlToFile,\n withRetry,\n saveIncomingAttachments,\n type IncomingAttachment,\n} from \"../shared.js\";\nimport { telegramCommandMenu } from \"../../commands/manifest.js\";\nimport { processMessageIntake } from \"../intake.js\";\nimport { createTelegramAdapters } from \"./context.js\";\nimport { createOfficeAddress, type Workspace } from \"../../office/index.js\";\n\n// grammY surfaces Telegram errors as `GrammyError` with `error_code` mirroring\n// the Bot API. 429 is the rate-limit status; the response also includes\n// `parameters.retry_after` but exponential backoff is good enough here.\nfunction telegramIsRateLimited(err: Error): boolean {\n return (err as { error_code?: number }).error_code === 429;\n}\n\nconst telegramRetry = <T>(fn: () => Promise<T>): Promise<T> =>\n withRetry(fn, { isRateLimited: telegramIsRateLimited });\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type { TelegramEvent } from \"./types.js\";\n\ninterface MessageContext {\n msg: Message;\n text: string;\n chatId: string;\n chatType: string;\n conversationKind: ConversationKind;\n userId: string;\n userName: string;\n msgId: string;\n threadTs: string | undefined;\n sessionKey: string;\n}\n\n// ============================================================================\n// TelegramMessagingBot\n// ============================================================================\n\n/**\n * A response as a Telegram rich message.\n *\n * Telegram parses the markdown into native blocks itself — a GFM table becomes\n * a real table, `##` a heading, a fence a code block. That is why this adapter\n * has no converter of its own: unlike Slack and Discord, nothing here has to be\n * translated before sending.\n *\n * It replaces the HTML pipeline, and with it the escape-and-retry dance that\n * existed only because a model writing HTML by hand regularly produced markup\n * Telegram rejected.\n */\nfunction richMessage(markdown: string): { markdown: string } {\n return { markdown };\n}\n\nexport class TelegramMessagingBot implements MessagingBot {\n private client: GrammyMessagingBot;\n private handler: MessagingEventHandler;\n private botToken: string;\n private workspace: Workspace;\n private botUserId: string | null = null;\n private botUsername: string | null = null;\n private queues = new Map<string, MessagingEventQueue>();\n private startupTime: number = 0;\n\n constructor(handler: MessagingEventHandler, config: { token: string; workspace: Workspace }) {\n this.handler = handler;\n this.botToken = config.token;\n this.workspace = config.workspace;\n this.client = new GrammyMessagingBot(config.token);\n this.client.catch((err) => {\n log.logWarning(\"Telegram error\", err instanceof Error ? err.message : String(err));\n });\n }\n\n // ==========================================================================\n // Public API (implements MessagingBot)\n // ==========================================================================\n\n async start(): Promise<void> {\n const me = await this.client.api.getMe();\n this.botUserId = String(me.id);\n this.botUsername = me.username ?? null;\n this.startupTime = Date.now();\n\n // Menu registration derives from the command manifest; routing is\n // separate (native handlers below + intake/dispatch for the rest).\n await this.client.api.setMyCommands(telegramCommandMenu());\n\n this.setupEventHandlers();\n\n // Start polling in background (bot.start() runs indefinitely)\n this.client.start().catch((err) => {\n log.logWarning(\"Telegram polling error\", err instanceof Error ? err.message : String(err));\n });\n\n log.logConnected(\"Telegram\");\n log.logInfo(`Telegram bot started as @${this.botUsername ?? this.botUserId}`);\n }\n\n async postMessage(channel: string, text: string): Promise<string> {\n const result = await this.postMessageRaw(parseInt(channel), text);\n return String(result);\n }\n\n async addReaction(channel: string, messageTs: string, emoji: string): Promise<void> {\n // Telegram reactions are set via setMessageReaction with a Unicode emoji.\n // Short names (Slack style) won't resolve; callers should pass an emoji.\n const name = emoji.replace(/^:|:$/g, \"\");\n await telegramRetry(async () => {\n await this.client.api.setMessageReaction(parseInt(channel), parseInt(messageTs), [\n { type: \"emoji\", emoji: name as never },\n ]);\n });\n }\n\n async updateMessage(channel: string, ts: string, text: string): Promise<void> {\n return telegramRetry(async () => {\n try {\n await this.client.api.editMessageText(parseInt(channel), parseInt(ts), richMessage(text));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n // Editing to identical content is something streaming asks for\n // constantly; it is a no-op, not a failure.\n if (msg.includes(\"message is not modified\")) return;\n throw err;\n }\n });\n }\n\n enqueueEvent(event: ConversationEvent): boolean {\n const conversationId = event.conversationId;\n const queue = this.getQueue(conversationId);\n if (queue.size() >= 5) {\n log.logWarning(\n `Event queue full for ${conversationId}, discarding: ${event.text.substring(0, 50)}`,\n );\n return false;\n }\n log.logInfo(`Enqueueing event for ${conversationId}: ${event.text.substring(0, 50)}`);\n queue.enqueue(() => {\n const context = createTelegramAdapters(event as TelegramEvent, this);\n return this.handler.handleEvent(event, this, context);\n });\n return true;\n }\n\n getMessagingInfo(): MessagingInfo {\n return {\n name: \"telegram\",\n trustModel: \"membership\",\n formattingGuide:\n \"## Telegram Formatting (Markdown)\\nWrite ordinary Markdown — headings, lists, tables, code fences, quotes and links all render natively. Nothing needs converting by hand.\",\n channels: [],\n users: [],\n };\n }\n\n // ==========================================================================\n // Internal helpers (used by context.ts)\n // ==========================================================================\n\n async postMessageRaw(chatId: number, text: string): Promise<number> {\n return telegramRetry(async () => {\n const result = await this.client.api.sendRichMessage(chatId, richMessage(text));\n return result.message_id;\n });\n }\n\n async postPlainMessage(chatId: number, text: string): Promise<void> {\n return telegramRetry(async () => {\n await this.client.api.sendMessage(chatId, text);\n });\n }\n\n async postReply(chatId: number, replyToMessageId: number, text: string): Promise<number> {\n return telegramRetry(async () => {\n const result = await this.client.api.sendRichMessage(chatId, richMessage(text), {\n reply_parameters: { message_id: replyToMessageId },\n });\n return result.message_id;\n });\n }\n\n async deleteMessageRaw(chatId: number, messageId: number): Promise<void> {\n await this.client.api.deleteMessage(chatId, messageId);\n }\n\n async sendTyping(chatId: number): Promise<void> {\n await this.client.api.sendChatAction(chatId, \"typing\");\n }\n\n async uploadFile(channel: string, filePath: string, title?: string): Promise<void> {\n return telegramRetry(async () => {\n const fileName = title ?? basename(filePath);\n const fileContent = readFileSync(filePath);\n await this.client.api.sendDocument(parseInt(channel), new InputFile(fileContent, fileName));\n });\n }\n\n logToFile(channel: string, entry: object): void {\n appendChannelLog(this.workspace.office(createOfficeAddress(\"telegram\", channel)), entry);\n }\n\n logBotResponse(channel: string, text: string, ts: string): void {\n appendBotResponseLog(this.workspace.office(createOfficeAddress(\"telegram\", channel)), text, ts);\n }\n\n /**\n * Process attachments from a Telegram message\n * Downloads files before returning metadata so the agent can read them immediately\n * Returns format compatible with ConversationMessage: { name: string, localPath: string }[]\n */\n async processAttachments(\n chatId: string,\n message: Message,\n ): Promise<{ name: string; localPath: string }[]> {\n const items: IncomingAttachment[] = [];\n\n // Photos: take the largest size for best quality.\n const photo = message.photo?.[message.photo.length - 1];\n if (photo) {\n items.push(this.telegramFileItem(photo.file_id, `photo_${message.message_id}.jpg`));\n }\n if (message.document) {\n const doc = message.document;\n items.push(\n this.telegramFileItem(doc.file_id, doc.file_name ?? `document_${message.message_id}`),\n );\n }\n\n const office = this.workspace.office(createOfficeAddress(\"telegram\", chatId));\n const { saved, failed } = await saveIncomingAttachments(office, items);\n for (const failure of failed) {\n log.logWarning(`Failed to process Telegram file`, `${failure.name}: ${failure.error}`);\n }\n return saved.map((item) => ({ name: item.original, localPath: item.localPath }));\n }\n\n /** One Telegram file as a saveIncomingAttachments item; failures skip, never throw. */\n private telegramFileItem(fileId: string, name: string): IncomingAttachment {\n return {\n name,\n download: async (destPath) => {\n const file = await this.client.api.getFile(fileId);\n if (!file.file_path) throw new Error(`Telegram file has no path: ${fileId}`);\n await downloadUrlToFile(\n `https://api.telegram.org/file/bot${this.botToken}/${file.file_path}`,\n destPath,\n );\n },\n };\n }\n\n // ==========================================================================\n // Private - Event Handlers\n // ==========================================================================\n\n private getQueue(channelId: string): MessagingEventQueue {\n let queue = this.queues.get(channelId);\n if (!queue) {\n queue = new MessagingEventQueue(\"Telegram\");\n this.queues.set(channelId, queue);\n }\n return queue;\n }\n\n private extractMessageContext(msg: Message): MessageContext | null {\n if (!msg) return null;\n if (msg.date * 1000 < this.startupTime) return null;\n if (msg.from?.is_bot) return null;\n\n const text = msg.text ?? msg.caption ?? \"\";\n if (!text && !msg.document && !msg.photo) return null;\n\n const chatId = String(msg.chat.id);\n const chatType = msg.chat.type;\n const userId = String(msg.from?.id ?? \"unknown\");\n const userName = msg.from?.username ?? msg.from?.first_name ?? userId;\n const msgId = String(msg.message_id);\n const replyToId = msg.reply_to_message?.message_id;\n const threadTs = replyToId ? String(replyToId) : undefined;\n const conversationKind = chatType === \"private\" ? \"direct\" : \"shared\";\n\n const sessionKey = resolveChatSessionKey({\n conversationId: chatId,\n conversationKind,\n messageId: msgId,\n threadTs,\n });\n\n return {\n msg,\n text,\n chatId,\n chatType,\n conversationKind,\n userId,\n userName,\n msgId,\n threadTs,\n sessionKey,\n };\n }\n\n private isAddressedToMessagingBot(text: string, chatType: string): boolean {\n if (chatType === \"private\") return true;\n if (!this.botUsername) return false;\n return text.toLowerCase().includes(`@${this.botUsername.toLowerCase()}`);\n }\n\n private cleanText(text: string): string {\n if (!this.botUsername) return text.trim();\n return text.replace(new RegExp(`@${this.botUsername}`, \"gi\"), \"\").trim();\n }\n\n private setupEventHandlers(): void {\n // --- Slash commands (registered before catch-all so grammY intercepts them) ---\n // `/stop` is deliberately NOT registered here: it is a magic word owned by\n // conversation intake, so the catch-all below must receive it.\n\n this.client.command(\"new\", async (ctx) => {\n const mc = ctx.message ? this.extractMessageContext(ctx.message) : null;\n if (!mc) return;\n const commandText = this.cleanText(mc.text);\n const event = createConversationEvent({\n platform: \"telegram\",\n type: \"command\",\n conversationId: mc.chatId,\n conversationKind: mc.conversationKind,\n ts: mc.msgId,\n thread_ts: mc.threadTs,\n sessionKey: mc.sessionKey,\n user: mc.userId,\n userName: mc.userName,\n text: commandText,\n attachments: [],\n }) as TelegramEvent;\n this.logToFile(mc.chatId, {\n date: new Date(mc.msg.date * 1000).toISOString(),\n ts: mc.msgId,\n ...(mc.conversationKind === \"shared\" && mc.threadTs ? { threadTs: mc.threadTs } : {}),\n user: mc.userId,\n userName: mc.userName,\n text: commandText,\n attachments: [],\n isMessagingBot: false,\n });\n await this.handler.handleEvent(event, this, createTelegramAdapters(event, this));\n });\n\n this.client.command(\"sandbox\", async (ctx) => {\n const mc = ctx.message ? this.extractMessageContext(ctx.message) : null;\n if (!mc) return;\n // The sandbox handler's grammar accepts /sandbox directly (manifest\n // slash forms), so the user's spelling is logged and dispatched as-is.\n const cleanedText = this.cleanText(mc.text);\n const event = createConversationEvent({\n platform: \"telegram\",\n type: \"command\",\n conversationId: mc.chatId,\n conversationKind: mc.conversationKind,\n ts: mc.msgId,\n thread_ts: mc.threadTs,\n sessionKey: mc.sessionKey,\n user: mc.userId,\n userName: mc.userName,\n text: cleanedText,\n attachments: [],\n }) as TelegramEvent;\n this.logToFile(mc.chatId, {\n date: new Date(mc.msg.date * 1000).toISOString(),\n ts: mc.msgId,\n ...(mc.conversationKind === \"shared\" && mc.threadTs ? { threadTs: mc.threadTs } : {}),\n user: mc.userId,\n userName: mc.userName,\n text: cleanedText,\n attachments: [],\n isMessagingBot: false,\n });\n const context = createTelegramAdapters(event, this);\n await this.handler.handleEvent(event, this, context);\n });\n\n // --- Catch-all for regular (non-command) messages ---\n\n this.client.on(\"message\", async (ctx) => {\n const mc = ctx.message ? this.extractMessageContext(ctx.message) : null;\n if (!mc) return;\n\n const cleanedText = this.cleanText(mc.text);\n const addressedToMessagingBot = this.isAddressedToMessagingBot(mc.text, mc.chatType);\n const isAutoReplyCandidate = mc.chatType !== \"private\" && !addressedToMessagingBot;\n\n const eventBase = createConversationEvent({\n platform: \"telegram\",\n type: \"message\",\n conversationId: mc.chatId,\n conversationKind: mc.conversationKind,\n ts: mc.msgId,\n thread_ts: mc.threadTs,\n sessionKey: mc.sessionKey,\n user: mc.userId,\n userName: mc.userName,\n text: cleanedText,\n }) as TelegramEvent;\n\n await processMessageIntake({\n eventBase,\n office: this.workspace.office(eventBase.address),\n isAutoReplyCandidate,\n magicWord: {\n addressed: addressedToMessagingBot || mc.chatType === \"private\",\n scopeFallback: \"always\",\n },\n busyPolicy: \"reject\",\n logEntryBase: {\n date: new Date(mc.msg.date * 1000).toISOString(),\n ts: mc.msgId,\n ...(mc.conversationKind === \"shared\" && mc.threadTs ? { threadTs: mc.threadTs } : {}),\n user: mc.userId,\n userName: mc.userName,\n text: cleanedText,\n isMessagingBot: false,\n },\n log: (entry) => this.logToFile(mc.chatId, entry),\n processAttachments: () => this.processAttachments(mc.chatId, mc.msg),\n queueKey: mc.sessionKey,\n enqueue: (queueKey, work) => this.getQueue(queueKey).enqueue(work),\n handler: this.handler,\n bot: this,\n createContext: (event) => createTelegramAdapters(event, this),\n });\n });\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/adapters/telegram/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/adapters/telegram/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACd,MAAM,kBAAkB,CAAC;AAI1B,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAgBtD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,oBAAoB,GACxB;IACD,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,SAAS,EAAE,qBAAqB,CAAC;IACjC,QAAQ,EAAE,aAAa,CAAC;CACzB,CAkEA"}
|
|
@@ -1,24 +1,12 @@
|
|
|
1
1
|
import { createConversationMessage } from "../../adapter.js";
|
|
2
2
|
import { deriveSessionKey } from "../../sessions/session-key.js";
|
|
3
|
-
import { subagentDashboardHeader, subagentDashboardNodeLines } from "../../subagent-progress.js";
|
|
4
3
|
import { createProgressiveRenderer } from "../progressive-renderer.js";
|
|
5
4
|
import { formatToolArgs } from "../shared.js";
|
|
6
|
-
|
|
7
|
-
//
|
|
8
|
-
|
|
5
|
+
// A rich message allows far more than the 4096 a plain message did; this stays
|
|
6
|
+
// well inside it, and the headroom is now for the continuation marker alone
|
|
7
|
+
// rather than for HTML escapes that no longer happen.
|
|
8
|
+
const MAX_LENGTH = 30000;
|
|
9
9
|
const formatTelegramContinuation = (partNum) => `(continued ${partNum})`;
|
|
10
|
-
/**
|
|
11
|
-
* Telegram's pipeline is HTML, not response source Markdown, so its dashboard
|
|
12
|
-
* conversion lives here with the rest of that debt; content comes from the
|
|
13
|
-
* snapshot module's text primitives. Labels need no escaping — the responder's
|
|
14
|
-
* sanitize pass owns that.
|
|
15
|
-
*/
|
|
16
|
-
function formatSubagentProgressTelegram(snapshot) {
|
|
17
|
-
return [
|
|
18
|
-
`<b>${subagentDashboardHeader(snapshot)}</b>`,
|
|
19
|
-
...snapshot.nodes.flatMap(subagentDashboardNodeLines),
|
|
20
|
-
].join("\n");
|
|
21
|
-
}
|
|
22
10
|
function formatToolResult(result) {
|
|
23
11
|
const argsFormatted = formatToolArgs(result.args);
|
|
24
12
|
const duration = (result.durationMs / 1000).toFixed(1);
|
|
@@ -49,8 +37,6 @@ export function createTelegramAdapters(event, bot) {
|
|
|
49
37
|
maxLength: MAX_LENGTH,
|
|
50
38
|
formatContinuation: formatTelegramContinuation,
|
|
51
39
|
errorPrefix: "Error: ",
|
|
52
|
-
sanitize: sanitizeTelegramHtml,
|
|
53
|
-
formatSubagentProgress: formatSubagentProgressTelegram,
|
|
54
40
|
supportsDeltas: true,
|
|
55
41
|
typing: {
|
|
56
42
|
// Send immediately and repeat every 4s (Telegram clears indicator after ~5s)
|
|
@@ -78,7 +64,9 @@ export function createTelegramAdapters(event, bot) {
|
|
|
78
64
|
return String(id);
|
|
79
65
|
},
|
|
80
66
|
update: (id, text) => bot.updateMessage(conversationId, id, text),
|
|
81
|
-
|
|
67
|
+
// Returns the id so the renderer can edit this overflow message on the
|
|
68
|
+
// next redraw instead of posting another copy of the tail.
|
|
69
|
+
postExtra: async (text) => bot.postMessageRaw(chatId, text),
|
|
82
70
|
delete: async (id) => {
|
|
83
71
|
await bot.deleteMessageRaw(chatId, Number(id));
|
|
84
72
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/telegram/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/telegram/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAO7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C,+EAA+E;AAC/E,4EAA4E;AAC5E,sDAAsD;AACtD,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB,MAAM,0BAA0B,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,cAAc,OAAO,GAAG,CAAC;AAEzF,SAAS,gBAAgB,CAAC,MAAsB;IAC9C,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC;IACjI,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAoB,EACpB,GAAyB;IAOzB,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAErE,MAAM,OAAO,GAAG,yBAAyB,CAAC;QACxC,QAAQ,EAAE,UAAU;QACpB,cAAc;QACd,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,UAAU,EAAE,gBAAgB,CAAC,KAAK,CAAC;QACnC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,MAAM,EAAE,KAAK,CAAC,IAAI;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,0EAA0E;IAC1E,MAAM,QAAQ,GAAkB,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAEvD,MAAM,EAAE,SAAS,EAAE,GAAG,yBAAyB,CAAC;QAC9C,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,UAAU;QACrB,kBAAkB,EAAE,0BAA0B;QAC9C,WAAW,EAAE,SAAS;QACtB,cAAc,EAAE,IAAI;QACpB,MAAM,EAAE;YACN,6EAA6E;YAC7E,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YAClC,UAAU,EAAE,IAAI;SACjB;QACD,gBAAgB;QAChB,oBAAoB,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACrC,QAAQ,EAAE,UAAU;YACpB,cAAc;YACd,MAAM;YACN,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,iBAAiB,EAAE,UAAU;YAC7B,SAAS;YACT,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC;QACF,iBAAiB,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;YACxC,MAAM,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,YAAY,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnB,MAAM,EAAE,GACN,SAAS,KAAK,IAAI;gBAChB,CAAC,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC;gBAC9C,CAAC,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7C,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QACD,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE,EAAE,IAAI,CAAC;QACjE,uEAAuE;QACvE,2DAA2D;QAC3D,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC;QAC3D,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnB,MAAM,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1E,UAAU,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,EAAE,QAAQ,EAAE,KAAK,CAAC;KACjF,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACpE,CAAC","sourcesContent":["import { createConversationMessage } from \"../../adapter.js\";\nimport type {\n ChatToolResult,\n ConversationMessage,\n ConversationResponder,\n MessagingInfo,\n} from \"../../adapter.js\";\nimport { deriveSessionKey } from \"../../sessions/session-key.js\";\nimport { createProgressiveRenderer } from \"../progressive-renderer.js\";\nimport { formatToolArgs } from \"../shared.js\";\nimport type { TelegramMessagingBot, TelegramEvent } from \"./bot.js\";\nimport type { OfficeAddress } from \"../../adapter.js\";\n\n// A rich message allows far more than the 4096 a plain message did; this stays\n// well inside it, and the headroom is now for the continuation marker alone\n// rather than for HTML escapes that no longer happen.\nconst MAX_LENGTH = 30000;\n\nconst formatTelegramContinuation = (partNum: number): string => `(continued ${partNum})`;\n\nfunction formatToolResult(result: ChatToolResult): string {\n const argsFormatted = formatToolArgs(result.args);\n const duration = (result.durationMs / 1000).toFixed(1);\n const title = `${result.isError ? \"Error\" : \"Done\"} ${result.toolName}${result.label ? `: ${result.label}` : \"\"} (${duration}s)`;\n return [title, argsFormatted, result.result].filter(Boolean).join(\"\\n\\n\");\n}\n\nexport function createTelegramAdapters(\n event: TelegramEvent,\n bot: TelegramMessagingBot,\n): {\n address: OfficeAddress;\n message: ConversationMessage;\n responder: ConversationResponder;\n platform: MessagingInfo;\n} {\n const conversationId = event.conversationId;\n const chatId = parseInt(conversationId);\n const replyToId = event.thread_ts ? parseInt(event.thread_ts) : null;\n\n const message = createConversationMessage({\n platform: \"telegram\",\n conversationId,\n address: event.address,\n id: event.ts,\n sessionKey: deriveSessionKey(event),\n conversationKind: event.conversationKind,\n userId: event.user,\n userName: event.userName,\n text: event.text,\n attachments: event.attachments,\n threadTs: event.thread_ts,\n });\n\n // The bot's getMessagingInfo() is the single authority for platform info.\n const platform: MessagingInfo = bot.getMessagingInfo();\n\n const { responder } = createProgressiveRenderer({\n label: \"Telegram\",\n maxLength: MAX_LENGTH,\n formatContinuation: formatTelegramContinuation,\n errorPrefix: \"Error: \",\n supportsDeltas: true,\n typing: {\n // Send immediately and repeat every 4s (Telegram clears indicator after ~5s)\n send: () => bot.sendTyping(chatId),\n intervalMs: 4000,\n },\n formatToolResult,\n responseErrorContext: (responseId) => ({\n platform: \"telegram\",\n conversationId,\n chatId,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: responseId,\n replyToId,\n conversationKind: message.conversationKind,\n }),\n notifySendFailure: async (errorMessage) => {\n await bot.postPlainMessage(chatId, `⚠️ 發送失敗:${errorMessage}`);\n },\n post: async (text) => {\n const id =\n replyToId !== null\n ? await bot.postReply(chatId, replyToId, text)\n : await bot.postMessageRaw(chatId, text);\n return String(id);\n },\n update: (id, text) => bot.updateMessage(conversationId, id, text),\n // Returns the id so the renderer can edit this overflow message on the\n // next redraw instead of posting another copy of the tail.\n postExtra: async (text) => bot.postMessageRaw(chatId, text),\n delete: async (id) => {\n await bot.deleteMessageRaw(chatId, Number(id));\n },\n logBotResponse: (text, id) => bot.logBotResponse(conversationId, text, id),\n uploadFile: (filePath, title) => bot.uploadFile(conversationId, filePath, title),\n });\n\n return { address: message.address, message, responder, platform };\n}\n"]}
|
package/dist/adapters/types.d.ts
CHANGED
|
@@ -37,10 +37,25 @@ interface ProgressiveStreamTransport {
|
|
|
37
37
|
start(text: string): Promise<string>;
|
|
38
38
|
append(messageId: string, delta: string): Promise<void>;
|
|
39
39
|
stop(messageId: string): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Withhold an append until this many characters have accumulated. A
|
|
42
|
+
* streaming transport is usually rate-limited per call rather than per byte,
|
|
43
|
+
* so forwarding every token spends the budget on latency nobody perceives.
|
|
44
|
+
* The final render flushes whatever is left before stopping, so buffering
|
|
45
|
+
* can never drop text. Omit for no buffering.
|
|
46
|
+
*/
|
|
47
|
+
minDeltaChars?: number;
|
|
40
48
|
}
|
|
41
49
|
export interface ProgressiveRendererPlatform {
|
|
42
50
|
label: string;
|
|
43
51
|
maxLength: number;
|
|
52
|
+
/**
|
|
53
|
+
* Shortest gap between redraws of a streaming response, measured from the
|
|
54
|
+
* end of the previous one. Platforms meter edits per channel at different
|
|
55
|
+
* rates; the default suits the tightest of them. Zero redraws on every
|
|
56
|
+
* delta, which only a platform with no such limit can afford.
|
|
57
|
+
*/
|
|
58
|
+
flushIntervalMs?: number;
|
|
44
59
|
initialResponseId?: string | null;
|
|
45
60
|
formatContinuation: (partNum: number) => string;
|
|
46
61
|
errorPrefix: string;
|
|
@@ -50,7 +65,8 @@ export interface ProgressiveRendererPlatform {
|
|
|
50
65
|
prepareSource?: (text: string, working: boolean) => string;
|
|
51
66
|
onWorkingChanged?: (working: boolean, responseId: string | null) => Promise<void>;
|
|
52
67
|
setTyping?: (isTyping: boolean, responseId: string | null) => Promise<void>;
|
|
53
|
-
|
|
68
|
+
/** Terminal hook. Awaited, so it may finish sending before the run ends. */
|
|
69
|
+
onFinish?: (text: string, responseId: string | null) => void | Promise<void>;
|
|
54
70
|
/** Whether `respond` calls are complete messages that should be logged immediately. */
|
|
55
71
|
logIntermediateResponses?: boolean;
|
|
56
72
|
/** Whether the platform accepts incremental response deltas. */
|
|
@@ -83,6 +99,13 @@ export interface ProgressiveRendererPlatform {
|
|
|
83
99
|
uploadFile?: (filePath: string, title?: string) => Promise<void>;
|
|
84
100
|
uploadFallbackNote?: (name: string) => string;
|
|
85
101
|
react?: (emoji: string) => Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Whether a send failure is a length rejection, as opposed to a rate limit
|
|
104
|
+
* or an outage. Without this the fallback swallows every error, so a
|
|
105
|
+
* transient 429 gets reported to the reader as "message too long" and the
|
|
106
|
+
* response is truncated for no reason.
|
|
107
|
+
*/
|
|
108
|
+
isTooLongError?: (err: unknown) => boolean;
|
|
86
109
|
/** Handle a Slack-style length rejection and return the canonical fallback text. */
|
|
87
110
|
handleTooLong?: (text: string, operation: "render" | "replace", options: {
|
|
88
111
|
createOverflowLink?: () => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,wBAAwB,EACzB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,MAAM,0BAA0B,GAClC,SAAS,GACT,kBAAkB,GAClB,oBAAoB,GACpB,aAAa,CAAC;AAElB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,0BAA0B,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,0BAA0B,EACrC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,IAAI,CAAC;AAEV,MAAM,WAAW,YAAY;IAC3B,qGAAqG;IACrG,aAAa,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC;IACvC,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,qDAAqD;IACrD,OAAO,EAAE,aAAa,CAAC;IACvB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,0BAA0B;IAClC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ChatToolResult,\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n OfficeAddress,\n SubagentProgressSnapshot,\n} from \"../adapter.js\";\nimport type { Office } from \"../office/types.js\";\nimport type { Attachment } from \"../types.js\";\n\nexport type ChatResponseErrorOperation =\n | \"respond\"\n | \"replace_response\"\n | \"respond_diagnostic\"\n | \"set_working\";\n\nexport interface ChatResponseErrorContext {\n platform: string;\n conversationId: string;\n messageId: string;\n sessionKey: string;\n conversationKind: string;\n operation: ChatResponseErrorOperation;\n channelId?: string;\n chatId?: number;\n responseMessageId?: string | number | null;\n threadTs?: string;\n replyTargetId?: string;\n replyToId?: number | null;\n isThreaded?: boolean;\n extra?: Record<string, unknown>;\n}\n\nexport type ChatResponseErrorReporter = (\n err: unknown,\n operation: ChatResponseErrorOperation,\n extra?: Record<string, unknown>,\n) => void;\n\nexport interface RetryOptions {\n /** Predicate that returns true when an error is worth retrying (rate limit, transient 5xx, etc.). */\n isRateLimited: (err: Error) => boolean;\n /** Total attempts including the first call. */\n maxAttempts?: number;\n baseDelayMs?: number;\n}\n\nexport interface ResolveStopTargetInput {\n handler: MessagingEventHandler;\n /** The office whose runtime state may be stopped. */\n address: OfficeAddress;\n /** Session key derived from the current message; checked first when present. */\n sessionKey?: string;\n}\n\ninterface ProgressiveStreamTransport {\n start(text: string): Promise<string>;\n append(messageId: string, delta: string): Promise<void>;\n stop(messageId: string): Promise<void>;\n}\n\nexport interface ProgressiveRendererPlatform {\n label: string;\n maxLength: number;\n initialResponseId?: string | null;\n formatContinuation: (partNum: number) => string;\n errorPrefix: string;\n sanitize?: (text: string) => string;\n workingIndicator?: string;\n formatProvisional?: (text: string, working: boolean) => string;\n prepareSource?: (text: string, working: boolean) => string;\n onWorkingChanged?: (working: boolean, responseId: string | null) => Promise<void>;\n setTyping?: (isTyping: boolean, responseId: string | null) => Promise<void>;\n onFinish?: (text: string, responseId: string | null) => void
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ChatToolResult,\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n OfficeAddress,\n SubagentProgressSnapshot,\n} from \"../adapter.js\";\nimport type { Office } from \"../office/types.js\";\nimport type { Attachment } from \"../types.js\";\n\nexport type ChatResponseErrorOperation =\n | \"respond\"\n | \"replace_response\"\n | \"respond_diagnostic\"\n | \"set_working\";\n\nexport interface ChatResponseErrorContext {\n platform: string;\n conversationId: string;\n messageId: string;\n sessionKey: string;\n conversationKind: string;\n operation: ChatResponseErrorOperation;\n channelId?: string;\n chatId?: number;\n responseMessageId?: string | number | null;\n threadTs?: string;\n replyTargetId?: string;\n replyToId?: number | null;\n isThreaded?: boolean;\n extra?: Record<string, unknown>;\n}\n\nexport type ChatResponseErrorReporter = (\n err: unknown,\n operation: ChatResponseErrorOperation,\n extra?: Record<string, unknown>,\n) => void;\n\nexport interface RetryOptions {\n /** Predicate that returns true when an error is worth retrying (rate limit, transient 5xx, etc.). */\n isRateLimited: (err: Error) => boolean;\n /** Total attempts including the first call. */\n maxAttempts?: number;\n baseDelayMs?: number;\n}\n\nexport interface ResolveStopTargetInput {\n handler: MessagingEventHandler;\n /** The office whose runtime state may be stopped. */\n address: OfficeAddress;\n /** Session key derived from the current message; checked first when present. */\n sessionKey?: string;\n}\n\ninterface ProgressiveStreamTransport {\n start(text: string): Promise<string>;\n append(messageId: string, delta: string): Promise<void>;\n stop(messageId: string): Promise<void>;\n /**\n * Withhold an append until this many characters have accumulated. A\n * streaming transport is usually rate-limited per call rather than per byte,\n * so forwarding every token spends the budget on latency nobody perceives.\n * The final render flushes whatever is left before stopping, so buffering\n * can never drop text. Omit for no buffering.\n */\n minDeltaChars?: number;\n}\n\nexport interface ProgressiveRendererPlatform {\n label: string;\n maxLength: number;\n /**\n * Shortest gap between redraws of a streaming response, measured from the\n * end of the previous one. Platforms meter edits per channel at different\n * rates; the default suits the tightest of them. Zero redraws on every\n * delta, which only a platform with no such limit can afford.\n */\n flushIntervalMs?: number;\n initialResponseId?: string | null;\n formatContinuation: (partNum: number) => string;\n errorPrefix: string;\n sanitize?: (text: string) => string;\n workingIndicator?: string;\n formatProvisional?: (text: string, working: boolean) => string;\n prepareSource?: (text: string, working: boolean) => string;\n onWorkingChanged?: (working: boolean, responseId: string | null) => Promise<void>;\n setTyping?: (isTyping: boolean, responseId: string | null) => Promise<void>;\n /** Terminal hook. Awaited, so it may finish sending before the run ends. */\n onFinish?: (text: string, responseId: string | null) => void | Promise<void>;\n /** Whether `respond` calls are complete messages that should be logged immediately. */\n logIntermediateResponses?: boolean;\n /** Whether the platform accepts incremental response deltas. */\n supportsDeltas?: boolean;\n /** Native stream operations, when this reply target supports them. */\n stream?: ProgressiveStreamTransport;\n /** Re-render a finished response when the provisional stream lacked structure. */\n needsCanonicalRender?: (text: string) => boolean;\n formatSubagentProgress?: (progress: SubagentProgressSnapshot) => string;\n typing?: {\n send: () => Promise<unknown>;\n intervalMs: number;\n stopOnSend?: boolean;\n };\n formatToolResult: (result: ChatToolResult) => string;\n /** Stable platform context plus the current response identity for error reporting. */\n responseErrorContext?: (\n responseId: string | null,\n ) => Omit<ChatResponseErrorContext, \"operation\" | \"extra\">;\n /** @deprecated Provide `responseErrorContext`; the renderer now owns reporting. */\n reportError?: (\n err: unknown,\n operation: ChatResponseErrorOperation,\n extra: Record<string, unknown>,\n responseId: string | null,\n ) => void;\n notifySendFailure?: (errorMessage: string) => Promise<void>;\n post: (text: string) => Promise<string>;\n update: (id: string, text: string) => Promise<void>;\n postExtra: (text: string, responseId: string | null) => Promise<string | number | void>;\n postDiagnostic?: (\n text: string,\n options: { style?: \"muted\" | \"error\" },\n responseId: string | null,\n ) => Promise<Array<string | number>>;\n delete?: (id: string) => Promise<void>;\n deleteExtra?: (id: string | number) => Promise<void>;\n logBotResponse?: (text: string, id: string) => void;\n uploadFile?: (filePath: string, title?: string) => Promise<void>;\n uploadFallbackNote?: (name: string) => string;\n react?: (emoji: string) => Promise<void>;\n /**\n * Whether a send failure is a length rejection, as opposed to a rate limit\n * or an outage. Without this the fallback swallows every error, so a\n * transient 429 gets reported to the reader as \"message too long\" and the\n * response is truncated for no reason.\n */\n isTooLongError?: (err: unknown) => boolean;\n /** Handle a Slack-style length rejection and return the canonical fallback text. */\n handleTooLong?: (\n text: string,\n operation: \"render\" | \"replace\",\n options: { createOverflowLink?: () => string } | undefined,\n responseId: string | null,\n write: (text: string) => Promise<void>,\n getResponseId: () => string | null,\n ) => Promise<{ text: string; prefixLength?: number }>;\n}\n\n/** How intake resolved a message. Callers branch on this instead of passing callbacks. */\nexport type MessageIntakeOutcome = \"magic-word\" | \"not-triggered\" | \"rejected-busy\" | \"enqueued\";\n\n/** Platform policy for the magic-word step, stated as data. */\nexport interface MagicWordIntakeOptions {\n /**\n * Raw user-typed text to match when `eventBase.text` is decorated for the\n * agent (e.g. GitHub review-comment framing). Defaults to `eventBase.text`.\n */\n text?: string;\n /**\n * Whether the message addressed the bot (mention, DM, slash form). The idle\n * \"Nothing running.\" reply is suppressed for unaddressed messages.\n */\n addressed: boolean;\n /**\n * How far a stop may widen when the direct session key is not running:\n * \"top-level\" widens to the single running scoped session only from the\n * persistent conversation session, \"always\" widens unconditionally,\n * \"never\" stops only exact matches.\n */\n scopeFallback: \"top-level\" | \"always\" | \"never\";\n}\n\n/** One platform file to save into an office's attachments directory. */\nexport interface IncomingAttachment {\n /** Original file name as the platform reports it. */\n name: string;\n /** Epoch ms used in the stored filename; defaults to the time of saving. */\n timestampMs?: number;\n /** Fetch the file and write it to destPath (the parent directory exists). */\n download(destPath: string): Promise<void>;\n}\n\n/** Outcome of saving incoming attachments; error policy stays with the adapter. */\nexport interface SavedAttachments {\n saved: Attachment[];\n failed: { name: string; error: unknown }[];\n}\n\nexport interface MessageIntakeOptions<TEvent extends ConversationEvent> {\n eventBase: TEvent;\n /** The event's Conversation office; absent when auto-reply is unconfigured (embedders). */\n office: Office | undefined;\n isAutoReplyCandidate: boolean;\n magicWord: MagicWordIntakeOptions;\n /**\n * \"reject\" bounces a new message while its session is already running\n * (with an \"Already working\" reply); \"queue\" lines it up behind the run.\n */\n busyPolicy: \"queue\" | \"reject\";\n logEntryBase: Record<string, unknown>;\n log?: (entry: Record<string, unknown>) => void;\n processAttachments: () => Promise<unknown[]>;\n queueKey: string;\n enqueue: (queueKey: string, work: () => Promise<void>) => void;\n handler: MessagingEventHandler;\n bot: MessagingBot;\n createContext: (event: TEvent) => ConversationContext;\n deferAttachmentsUntilRun?: boolean;\n}\n"]}
|
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAiB,cAAc,EAAE,MAAM,YAAY,CAAC;AAIrF,OAAO,EAAY,KAAK,YAAY,EAAc,MAAM,uBAAuB,CAAC;AA+BhF,OAAO,KAAK,EAEV,mBAAmB,EAKpB,MAAM,cAAc,CAAC;AAmBtB,OAAO,EAKL,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;AAiC5B,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,kBAAkB,GAC9B,MAAM,CAER;AAcD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,kBAAkB,GAC9B,MAAM,CA2BR;AAgGD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GACxD,OAAO,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,YAAY,EAAE,CAAC;CAClC,CAAC,CAcD;AAwKD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC,GAC7D,MAAM,GAAG,SAAS,CAOpB;AAsMD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,OAAO,EACvB,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,YAAY,EAAE,MAAM,GACnB,MAAM,CAkBR;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAYR;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAiB,cAAc,EAAE,MAAM,YAAY,CAAC;AAIrF,OAAO,EAAY,KAAK,YAAY,EAAc,MAAM,uBAAuB,CAAC;AA+BhF,OAAO,KAAK,EAEV,mBAAmB,EAKpB,MAAM,cAAc,CAAC;AAmBtB,OAAO,EAKL,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;AAiC5B,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,kBAAkB,GAC9B,MAAM,CAER;AAcD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,kBAAkB,GAC9B,MAAM,CA2BR;AAgGD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GACxD,OAAO,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,YAAY,EAAE,CAAC;CAClC,CAAC,CAcD;AAwKD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC,GAC7D,MAAM,GAAG,SAAS,CAOpB;AAsMD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,OAAO,EACvB,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,YAAY,EAAE,MAAM,GACnB,MAAM,CAkBR;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAYR;AA02CD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAiZxF"}
|
package/dist/agent.js
CHANGED
|
@@ -1040,8 +1040,9 @@ async function createConfiguredAgentSession(params) {
|
|
|
1040
1040
|
if (extensionsResult.extensions.length > 0) {
|
|
1041
1041
|
log.logInfo(`[${conversationId}] Loaded ${extensionsResult.extensions.length} extension(s): ${extensionsResult.extensions.map((extension) => extension.name).join(", ")}`);
|
|
1042
1042
|
}
|
|
1043
|
-
const subagentTool = createSubagentTool((request) => runSubagent({
|
|
1043
|
+
const subagentTool = createSubagentTool((request, hooks) => runSubagent({
|
|
1044
1044
|
request,
|
|
1045
|
+
...(hooks?.onActivity ? { onActivity: hooks.onActivity } : {}),
|
|
1045
1046
|
defaultModel: model,
|
|
1046
1047
|
thinkingLevel,
|
|
1047
1048
|
models,
|