abtars 0.2.0 → 0.2.1-alpha.2

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/platforms/discord/discord-api.ts", "../src/platforms/discord/discord-poller.ts", "../src/platforms/discord/discord-adapter.ts"],
4
+ "sourcesContent": ["import { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport {\n Client,\n GatewayIntentBits,\n Partials,\n type Message,\n type MessageReaction,\n type User,\n type TextChannel,\n} from \"discord.js\";\nimport { logInfo, logError, logDebug, logWarn } from \"../../components/logger.js\";\n\nconst TAG = \"DiscordApi\";\n\n/**\n * Thin wrapper around discord.js Client.\n * Provides typed methods for Gateway connection, message listening, and sending.\n */\nexport class DiscordApi {\n private readonly client: Client;\n private readonly token: string;\n private ready = false;\n\n constructor(botToken: string) {\n this.token = botToken;\n this.client = new Client({\n intents: [\n GatewayIntentBits.Guilds,\n GatewayIntentBits.GuildMessages,\n GatewayIntentBits.GuildMessageReactions,\n GatewayIntentBits.DirectMessages,\n GatewayIntentBits.MessageContent,\n ],\n partials: [Partials.Channel, Partials.Message, Partials.Reaction],\n });\n\n this.client.on(\"clientReady\", () => {\n this.ready = true;\n logInfo(TAG, `Connected as ${this.client.user?.tag ?? \"unknown\"}`);\n });\n\n this.client.on(\"error\", (err) => {\n logError(TAG, \"Client error\", err);\n });\n }\n\n /** Connect to the Discord Gateway. Resolves when the client is ready. */\n async connect(): Promise<void> {\n logInfo(TAG, \"Connecting to Discord Gateway\u2026\");\n return new Promise<void>((resolve, reject) => {\n const onReady = () => {\n cleanup();\n resolve();\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n const cleanup = () => {\n this.client.removeListener(\"clientReady\", onReady);\n this.client.removeListener(\"error\", onError);\n };\n\n this.client.once(\"clientReady\", onReady);\n this.client.once(\"error\", onError);\n\n this.client.login(this.token).catch((err: unknown) => {\n cleanup();\n reject(err instanceof Error ? err : new Error(String(err)));\n });\n });\n }\n\n /** Register a handler for MESSAGE_CREATE events. */\n onMessage(handler: (message: Message) => void | Promise<void>): void {\n this.client.on(\"messageCreate\", (message) => {\n logDebug(TAG, `Message from ${message.author.tag} in #${message.channel.id}`);\n try {\n const result = handler(message);\n if (result instanceof Promise) {\n result.catch((err: unknown) => {\n logError(TAG, \"Message handler error\", err);\n });\n }\n } catch (err) {\n logError(TAG, \"Message handler error\", err);\n }\n });\n }\n\n /** Register a handler for MESSAGE_REACTION_ADD events. */\n onReaction(handler: (reaction: MessageReaction, user: User) => void | Promise<void>): void {\n this.client.on(\"messageReactionAdd\", async (reaction, user) => {\n if (user.bot) return;\n try {\n if (reaction.partial) await reaction.fetch();\n if (user.partial) await user.fetch();\n } catch (err) { logAndSwallow(TAG, \"fetch reaction/user partial\", err); return; }\n try {\n const result = handler(reaction as MessageReaction, user as User);\n if (result instanceof Promise) result.catch((err: unknown) => logError(TAG, \"Reaction handler error\", err));\n } catch (err) { logError(TAG, \"Reaction handler error\", err); }\n });\n }\n\n /** Register a handler for slash command interactions. */\n onInteraction(handler: (interaction: import(\"discord.js\").ChatInputCommandInteraction) => void | Promise<void>): void {\n this.client.on(\"interactionCreate\", async (interaction) => {\n if (interaction.isChatInputCommand()) {\n try {\n const result = handler(interaction);\n if (result instanceof Promise) result.catch((err: unknown) => logError(TAG, \"Interaction handler error\", err));\n } catch (err) { logError(TAG, \"Interaction handler error\", err); }\n }\n if (interaction.isStringSelectMenu()) {\n this.selectMenuHandlers.get(interaction.customId)?.(interaction);\n }\n });\n }\n\n private selectMenuHandlers = new Map<string, (i: import(\"discord.js\").StringSelectMenuInteraction) => void | Promise<void>>();\n\n onSelectMenu(customId: string, handler: (interaction: import(\"discord.js\").StringSelectMenuInteraction) => void | Promise<void>): void {\n this.selectMenuHandlers.set(customId, handler);\n }\n\n /** Register global application commands. Idempotent \u2014 Discord diffs and updates. */\n async registerCommands(commands: Array<{ name: string; description: string }>): Promise<void> {\n if (!this.client.application) {\n logWarn(TAG, \"Cannot register commands \u2014 application not available\");\n return;\n }\n await this.client.application.commands.set(commands.map(c => ({ name: c.name, description: c.description, type: 1 as const })));\n logInfo(TAG, `Registered ${commands.length} slash commands`);\n }\n\n /** Send a text message to a channel. Returns the sent message ID. */\n async sendMessage(channelId: string, text: string): Promise<string> {\n const channel = await this.client.channels.fetch(channelId);\n if (!channel?.isTextBased()) {\n throw new Error(`Channel ${channelId} is not a text channel`);\n }\n const sent = await (channel as TextChannel).send(text);\n logDebug(TAG, `Sent message ${sent.id} to channel ${channelId}`);\n return sent.id;\n }\n\n /** Send typing indicator to a channel. */\n async sendTyping(channelId: string): Promise<void> {\n try {\n const channel = await this.client.channels.fetch(channelId);\n if (channel?.isTextBased()) await (channel as TextChannel).sendTyping();\n } catch (err) { logAndSwallow(\"discord_api\", \"op\", err); }\n }\n\n /** Add or remove a reaction on a message. Empty emoji = remove bot's reactions. */\n async setReaction(channelId: string, messageId: string, emoji: string): Promise<void> {\n try {\n const channel = await this.client.channels.fetch(channelId);\n if (!channel?.isTextBased()) return;\n const message = await (channel as TextChannel).messages.fetch(messageId);\n if (!emoji) {\n // Remove bot's reactions\n const botId = this.client.user?.id;\n if (botId) {\n for (const reaction of message.reactions.cache.values()) {\n await reaction.users.remove(botId).catch(err => logAndSwallow(TAG, \"remove bot reaction\", err));\n }\n }\n } else {\n await message.react(emoji);\n }\n } catch (err) { logAndSwallow(\"discord_api\", \"op\", err); }\n }\n\n /** Edit a previously sent message. */\n async editMessage(channelId: string, messageId: string, text: string): Promise<void> {\n try {\n const channel = await this.client.channels.fetch(channelId);\n if (!channel?.isTextBased()) return;\n const message = await (channel as TextChannel).messages.fetch(messageId);\n await message.edit(text);\n } catch (err) { logAndSwallow(\"discord_api\", \"op\", err); }\n }\n\n /** Gracefully close the Gateway connection. */\n async disconnect(): Promise<void> {\n logInfo(TAG, \"Disconnecting from Discord Gateway\u2026\");\n this.ready = false;\n this.client.destroy();\n }\n\n /** Whether the client is connected and ready. */\n get isReady(): boolean {\n return this.ready;\n }\n\n /** Get the bot's own user ID (for filtering self-messages). */\n get botUserId(): string | null {\n return this.client.user?.id ?? null;\n }\n\n /** Fetch a specific message by channel + message ID. Returns null on failure. (#388) */\n async fetchMessage(channelId: string, messageId: string): Promise<{ authorId: string } | null> {\n try {\n const channel = await this.client.channels.fetch(channelId);\n if (!channel?.isTextBased()) return null;\n const msg = await (channel as TextChannel).messages.fetch(messageId);\n return msg ? { authorId: msg.author.id } : null;\n } catch (err) { logAndSwallow(TAG, \"fetchMessage\", err); return null; }\n }\n}\n", "import type { Message } from \"discord.js\";\nimport type { DiscordInboundMessage } from \"../../types/discord.js\";\nimport type { DiscordApi } from \"./discord-api.js\";\nimport { logInfo, logDebug, logWarn } from \"../../components/logger.js\";\n\nconst TAG = \"DiscordPoller\";\n\n/**\n * Event-driven listener for Discord messages via the Gateway WebSocket.\n * Mirrors TelegramPoller in lifecycle (start/stop) but uses discord.js\n * event handlers instead of long-polling. Reconnection and heartbeat\n * are handled by discord.js internally.\n */\nexport class DiscordPoller {\n private readonly api: DiscordApi;\n private readonly appId: string;\n private readonly onMessage: (message: DiscordInboundMessage) => void | Promise<void>;\n private started = false;\n\n constructor(\n api: DiscordApi,\n appId: string,\n onMessage: (message: DiscordInboundMessage) => void | Promise<void>,\n ) {\n this.api = api;\n this.appId = appId;\n this.onMessage = onMessage;\n }\n\n /** Connect to Gateway and start listening. */\n async start(): Promise<void> {\n if (this.started) return;\n this.started = true;\n\n await this.api.connect();\n\n this.api.onMessage((raw: Message) => {\n // Filter out self-messages (use appId from config, fallback to client user id)\n const selfId = this.api.botUserId ?? this.appId;\n if (raw.author.id === selfId) {\n logDebug(TAG, `Ignoring self-message ${raw.id}`);\n return;\n }\n\n const inbound = toDiscordInboundMessage(raw, this.appId);\n logDebug(TAG, `Dispatching message ${inbound.id} from ${inbound.authorUsername}`);\n\n try {\n const result = this.onMessage(inbound);\n if (result instanceof Promise) {\n result.catch((err: unknown) => {\n logWarn(TAG, `Error in message callback: ${err instanceof Error ? err.message : String(err)}`);\n });\n }\n } catch (err) {\n logWarn(TAG, `Error in message callback: ${err instanceof Error ? err.message : String(err)}`);\n }\n });\n\n logInfo(TAG, \"Started \u2014 listening for Discord messages\");\n }\n\n /** Disconnect from Gateway cleanly. */\n stop(): void {\n if (!this.started) return;\n this.started = false;\n this.api.disconnect();\n logInfo(TAG, \"Stopped\");\n }\n}\n\n/** Convert a raw discord.js Message to a DiscordInboundMessage. */\nfunction toDiscordInboundMessage(raw: Message, botId: string | null): DiscordInboundMessage {\n const parentId = \"parentId\" in raw.channel ? (raw.channel.parentId ?? null) : null;\n const channelName = \"name\" in raw.channel ? (raw.channel.name ?? null) : null;\n // Check both discord.js parsed mentions AND raw content for the bot's mention tag\n const mentionsBotId = botId\n ? (raw.mentions.users.has(botId) || new RegExp(`<@!?${botId}>`).test(raw.content))\n : false;\n\n // #388 \u2014 role-mention detection. Look up the bot's own guild member and check\n // if any of its role IDs appear in raw.mentions.roles. If the bot's member isn't\n // cached yet (cold start, first message in a guild), stay safe by returning false \u2014\n // a missed role-mention is better than an accidental always-respond.\n const botMember = raw.guild?.members.me ?? null;\n const botRoleIds = botMember ? new Set([...botMember.roles.cache.keys()]) : new Set<string>();\n const mentionsBotRole = botMember\n ? [...raw.mentions.roles.keys()].some(rid => botRoleIds.has(rid))\n : false;\n\n logDebug(TAG, `mentionsBotId=${mentionsBotId} mentionsBotRole=${mentionsBotRole} (appId=${botId}, mentions=${[...raw.mentions.users.keys()].join(\",\")}, content=${raw.content.slice(0, 60)})`);\n return {\n id: raw.id,\n channelId: raw.channelId,\n parentChannelId: parentId,\n channelName,\n isDM: !raw.guildId,\n authorId: raw.author.id,\n authorUsername: raw.author.username,\n authorIsBot: raw.author.bot ?? false,\n content: raw.content,\n timestamp: raw.createdTimestamp,\n mentionsBotId,\n mentionsBotRole,\n mentionsEveryone: raw.mentions.everyone,\n hasUserMentions: raw.mentions.users.size > 0,\n replyReferenceMessageId: raw.reference?.messageId ?? null,\n attachments: raw.attachments.size > 0\n ? [...raw.attachments.values()].map(a => ({ url: a.url, filename: a.name ?? \"file\", contentType: a.contentType ?? undefined, size: a.size }))\n : undefined,\n };\n}\n", "/**\n * Discord platform adapter \u2014 wraps DiscordApi, DiscordPoller, DiscordSecurityGate.\n * Handles Discord-specific pre-processing (mention stripping, A2A routing, sender prefix)\n * then delegates to the shared message pipeline.\n */\n\nimport { DiscordApi } from \"./discord-api.js\";\nimport { DiscordPoller } from \"./discord-poller.js\";\nimport { SecurityGate } from \"../../components/security-gate.js\";\nimport { loadUsers } from \"../../components/user-registry.js\";\nimport { BOT_COMMANDS } from \"../../components/command-registry.js\";\nimport { ResponseFormatter } from \"../../components/response-formatter.js\";\nimport { formatReactionSignal } from \"../../components/reactions.js\";\n\nexport const DISCORD_CAPABILITIES: PlatformCapabilities = { voice: false, reactions: true, typing: true, threads: true };\nimport { emojiToScore } from \"../../utils/emoji-score.js\";\nimport { logInfo, logWarn, logDebug } from \"../../components/logger.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { getEnv } from \"../../components/env-schema.js\";\nimport { handleInboundMessage, type PipelineDeps } from \"../../components/message-pipeline.js\";\nimport type { PlatformAdapter, PlatformCapabilities, InboundMessage, SendOpts } from \"../../types/platform.js\";\nimport type { DiscordInboundMessage } from \"../../types/index.js\";\nimport type { IKiroTransport } from \"../../components/transport/kiro-transport.js\";\nimport type { IMemorySystem } from \"abmind\";\nimport type { ConversationBuffer } from \"../../components/conversation-buffer.js\";\n\nconst TAG = \"discord\";\n\nexport interface DiscordAdapterConfig {\n botToken: string;\n appId: string;\n allowedUserIds: Set<string>;\n}\n\nexport interface DiscordAdapterDeps {\n pipeline: PipelineDeps;\n transport: IKiroTransport;\n memory: IMemorySystem | null;\n conversationBuffer: ConversationBuffer;\n}\n\nexport class DiscordAdapter implements PlatformAdapter {\n readonly name = \"discord\" as const;\n readonly capabilities: PlatformCapabilities = DISCORD_CAPABILITIES;\n\n private readonly api: DiscordApi;\n private readonly securityGate: SecurityGate;\n private readonly formatter = new ResponseFormatter();\n private readonly config: DiscordAdapterConfig;\n private readonly deps: DiscordAdapterDeps;\n private poller: DiscordPoller | null = null;\n\n constructor(config: DiscordAdapterConfig, deps: DiscordAdapterDeps) {\n this.api = new DiscordApi(config.botToken);\n this.securityGate = new SecurityGate(loadUsers());\n this.config = config;\n this.deps = deps;\n }\n\n async start(): Promise<void> {\n this.poller = new DiscordPoller(this.api, this.config.appId, (m) => this.handleMessage(m));\n this.api.onReaction((reaction, user) => this.handleReaction(reaction, user));\n this.api.onInteraction((interaction) => this.handleInteraction(interaction));\n await this.poller.start();\n\n // Register slash commands (idempotent)\n await this.api.registerCommands([...BOT_COMMANDS]).catch(err =>\n logWarn(TAG, `Slash command registration failed: ${err instanceof Error ? err.message : String(err)}`),\n );\n }\n\n /** Handle Discord slash command interactions. */\n private async handleInteraction(interaction: import(\"discord.js\").ChatInputCommandInteraction): Promise<void> {\n // Interactive model picker for /model and /models\n if (interaction.commandName === \"model\" || interaction.commandName === \"models\") {\n await this.handleModelPicker(interaction);\n return;\n }\n\n await interaction.deferReply();\n\n const registry = loadUsers();\n const userEntry = registry.byPlatformId.get(`discord:${interaction.user.id}`);\n if (!this.securityGate.authorizeById(interaction.user.id, interaction.channelId)) {\n await interaction.editReply(\"\u26D4 Unauthorized.\");\n return;\n }\n\n const commandText = `/${interaction.commandName}`;\n const userId = userEntry?.userId ?? \"unknown\";\n const channelId = interaction.channelId;\n\n // Wrap adapter so pipeline responses route through the interaction reply\n let initialReplied = false;\n const interactionAdapter: PlatformAdapter = {\n ...this,\n sendMessage: async (_ch: string, text: string): Promise<string | undefined> => {\n if (!text?.trim()) return undefined;\n const chunks = text.length <= 2000 ? [text] : text.match(/.{1,2000}/gs) ?? [text];\n let lastId: string | undefined;\n for (const chunk of chunks) {\n if (!initialReplied) {\n initialReplied = true;\n const sent = await interaction.editReply(chunk);\n lastId = sent.id;\n } else {\n const sent = await interaction.followUp(chunk);\n lastId = sent.id;\n }\n }\n return lastId;\n },\n editMessage: async (_ch: string, _messageId: number | string, text: string): Promise<void> => {\n // For interaction replies, editReply edits the initial deferred response\n await interaction.editReply(text);\n },\n };\n\n const msg: InboundMessage = {\n text: commandText,\n channelId,\n userId,\n senderId: interaction.user.id,\n senderName: interaction.user.username ?? \"unknown\",\n platform: \"discord\",\n timestamp: Date.now(),\n isGroup: !!interaction.guildId,\n isVoice: false,\n };\n\n await handleInboundMessage(msg, interactionAdapter, this.deps.pipeline);\n }\n\n /** Interactive model picker \u2014 ephemeral select menus. */\n private async handleModelPicker(interaction: import(\"discord.js\").ChatInputCommandInteraction): Promise<void> {\n const { ActionRowBuilder, StringSelectMenuBuilder } = await import(\"discord.js\");\n const { loadTransport } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n if (!tc) { await interaction.reply({ content: \"No transport config.\", ephemeral: true }); return; }\n\n const providers = Object.entries(tc.providers).map(([id, p]) => ({ id, name: (p as any).name ?? id }));\n if (providers.length === 0) {\n await interaction.reply({ content: \"No providers configured.\", ephemeral: true });\n return;\n }\n\n const menu = new StringSelectMenuBuilder()\n .setCustomId(\"model_picker_provider\")\n .setPlaceholder(\"Select provider\")\n .addOptions(providers.slice(0, 25).map(p => ({ label: p.name, value: p.id })));\n\n const row = new ActionRowBuilder<import(\"discord.js\").StringSelectMenuBuilder>().addComponents(menu);\n await interaction.reply({ content: \"\uD83D\uDD27 Select provider:\", components: [row], ephemeral: true });\n\n // Handle provider selection \u2192 show models\n this.api.onSelectMenu(\"model_picker_provider\", async (selectInteraction) => {\n const providerId = selectInteraction.values[0]!;\n const provider = tc.providers[providerId];\n if (!provider) { await selectInteraction.update({ content: \"Provider not found.\", components: [] }); return; }\n\n const { getModelsForProvider } = await import(\"../../components/transport-config.js\");\n const models = getModelsForProvider(providerId).filter((m) => m.entry.status === \"alive\" || !m.entry.status).slice(0, 25);\n if (models.length === 0) { await selectInteraction.update({ content: `No models for ${providerId}.`, components: [] }); return; }\n\n const modelMenu = new StringSelectMenuBuilder()\n .setCustomId(\"model_picker_model\")\n .setPlaceholder(\"Select model\")\n .addOptions(models.map((m) => ({ label: m.id, value: m.id })));\n\n const modelRow = new ActionRowBuilder<import(\"discord.js\").StringSelectMenuBuilder>().addComponents(modelMenu);\n await selectInteraction.update({ content: `Provider: **${providerId}**\\nSelect model:`, components: [modelRow] });\n\n // Handle model selection \u2192 apply\n this.api.onSelectMenu(\"model_picker_model\", async (modelInteraction) => {\n const modelId = modelInteraction.values[0]!;\n // Route through command handler as /model <provider> <model>\n await modelInteraction.update({ content: `\u2705 Switching to **${providerId}/${modelId}**...`, components: [] });\n\n // Trigger the actual switch via the command pipeline\n const msg: InboundMessage = {\n text: `/model ${providerId} ${modelId}`,\n channelId: modelInteraction.channelId,\n userId: interaction.user.id,\n senderId: interaction.user.id,\n senderName: interaction.user.username ?? \"unknown\",\n platform: \"discord\",\n timestamp: Date.now(),\n isGroup: !!interaction.guildId,\n isVoice: false,\n };\n await handleInboundMessage(msg, this, this.deps.pipeline);\n });\n });\n }\n\n stop(): void {\n this.poller?.stop();\n this.poller = null;\n }\n\n authorize(msg: InboundMessage): boolean {\n // Discord security uses string IDs + channel check\n return this.securityGate.authorizeById(msg.senderId, msg.channelId);\n }\n\n async sendMessage(channelId: string, text: string, _opts?: SendOpts): Promise<string | undefined> {\n const id = await this.api.sendMessage(channelId, text);\n return id || undefined;\n }\n\n async sendTyping(channelId: string): Promise<void> {\n await this.api.sendTyping(channelId);\n }\n\n async setReaction(channelId: string, messageId: number | string, emoji: string): Promise<void> {\n await this.api.setReaction(channelId, String(messageId), emoji);\n }\n\n async editMessage(channelId: string, messageId: number | string, text: string): Promise<void> {\n await this.api.editMessage(channelId, String(messageId), text);\n }\n\n chunkResponse(text: string): string[] {\n return this.formatter.chunkForPlatform(text, \"discord\");\n }\n\n injectMessage(msg: InboundMessage): void {\n // Discord doesn't support synthetic injection the same way.\n // For sleep replay, we call handleInboundMessage directly.\n handleInboundMessage(msg, this, this.deps.pipeline).catch((err) => {\n logWarn(TAG, `Failed to replay queued message: ${err instanceof Error ? err.message : String(err)}`);\n });\n }\n\n // --- Internal: Discord message handler ---\n\n private async handleMessage(message: DiscordInboundMessage): Promise<void> {\n logDebug(TAG, `Message from ${message.authorUsername} in ${message.channelId}`);\n\n const effectiveChannelId = message.parentChannelId ?? message.channelId;\n\n if (!this.securityGate.authorizeById(message.authorId, effectiveChannelId)) {\n logDebug(TAG, `Unauthorized user=${message.authorId} channel=${effectiveChannelId}`);\n return;\n }\n\n const rawText = message.content.trim();\n if (!rawText && !message.attachments?.length) return;\n\n // Strip bot's own mention\n let text = rawText.replace(new RegExp(`<@!?${this.config.appId}>`, \"g\"), \"\").replace(/\\s{2,}/g, \" \").trim();\n\n // Download attachments\n let mediaPath: string | undefined;\n if (message.attachments?.length) {\n try {\n const { saveInboundMedia } = await import(\"../../components/media-utils.js\");\n const att = message.attachments[0]!; // handle first attachment\n const res = await fetch(att.url);\n if (res.ok) {\n const buf = Buffer.from(await res.arrayBuffer());\n const extHint = att.filename ? \".\" + (att.filename.split(\".\").pop() ?? \"\") : undefined;\n const saved = await saveInboundMedia(buf, message.channelId, { extHint, claimedMime: att.contentType });\n if (saved) {\n mediaPath = saved.path;\n if (!text) text = `User sent a ${saved.isImage ? \"photo\" : \"file\"}.`;\n }\n }\n } catch (err) {\n logWarn(TAG, `Attachment download failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n if (!text) return;\n\n // Mention filter: in non-DM channels, check DISCORD_GROUP_MENTIONS mode.\n const isDM = message.isDM;\n if (!isDM) {\n const mentionMode = getEnv().discordGroupMentions; // \"required\" | \"optional\"\n\n if (mentionMode === \"optional\") {\n // Skip messages that mention someone else (not us, not @everyone)\n if (message.hasUserMentions && !message.mentionsBotId && !message.mentionsBotRole && !message.mentionsEveryone) {\n logDebug(TAG, `Skipped \u2014 mentions another user (optional mode, channel=${effectiveChannelId})`);\n return;\n }\n } else {\n // Required mode: must be explicitly addressed\n let isReplyToBot = false;\n if (message.replyReferenceMessageId && this.config.appId) {\n try {\n const referenced = await this.api.fetchMessage(message.channelId, message.replyReferenceMessageId);\n isReplyToBot = referenced?.authorId === this.config.appId;\n } catch (err) { logAndSwallow(TAG, \"fetchMessage reply ref\", err); }\n }\n\n const addressed = message.mentionsBotId || message.mentionsBotRole || isReplyToBot;\n if (!addressed) {\n logDebug(TAG, `Skipped \u2014 not addressed (channel=${effectiveChannelId})`);\n return;\n }\n }\n }\n\n const channelLabel = message.parentChannelId ? message.channelName ?? \"thread\" : message.channelName ?? \"DM\";\n const senderPrefix = isDM ? \"\" : `[${message.authorUsername}${message.authorIsBot ? \" (bot)\" : \"\"}] in #${channelLabel}: `;\n\n const inbound: InboundMessage = {\n platform: \"discord\",\n channelId: message.channelId,\n userId: loadUsers().byPlatformId.get(\"discord:\" + message.authorId)?.userId ?? \"unknown\",\n senderId: message.authorId,\n senderName: message.authorUsername,\n text: senderPrefix + text,\n timestamp: message.timestamp,\n isGroup: !isDM,\n isVoice: false,\n mediaPath,\n rawPlatformData: message,\n };\n\n // #512: commands bypass sequential await\n if (text.startsWith(\"/\") && !text.startsWith(\"//\")) {\n handleInboundMessage(inbound, this, this.deps.pipeline).catch(err => logAndSwallow(TAG, \"handleInboundMessage command\", err));\n return;\n }\n\n await handleInboundMessage(inbound, this, this.deps.pipeline);\n }\n\n private async handleReaction(\n reaction: import(\"discord.js\").MessageReaction,\n user: import(\"discord.js\").User,\n ): Promise<void> {\n const channelId = reaction.message.channelId;\n const messageId = Number(reaction.message.id);\n const emoji = reaction.emoji.name ?? \"\";\n if (!emoji) return;\n\n const isAuthorized = this.securityGate.authorizeById(user.id, channelId);\n const senderName = user.username || `id:${user.id}`;\n logInfo(TAG, `Reaction ${emoji} from ${senderName} on msg ${reaction.message.id}`);\n\n // Emotion scoring on authorized reactions\n if (isAuthorized && this.deps.memory) {\n const score = emojiToScore(emoji);\n const resolvedUserId = loadUsers().byPlatformId.get(\"discord:\" + user.id)?.userId ?? \"unknown\";\n const updated = this.deps.memory.updateEmotionByPlatformId(resolvedUserId, messageId, score);\n if (updated) logDebug(TAG, `Emotion score ${score} set on msg ${reaction.message.id}`);\n }\n\n if (!isAuthorized) {\n logDebug(TAG, `Unauthorized reaction from ${user.id}, discarding`);\n return;\n }\n\n // Buffer reaction signal for next message context\n const signal = formatReactionSignal(senderName, [emoji]);\n const bufKey = `discord:${channelId}`;\n this.deps.conversationBuffer.push(bufKey, senderName, signal);\n logDebug(TAG, `Buffered reaction signal for channel ${channelId}`);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["TAG", "TAG"]
7
+ }
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
+ import {
4
+ SessionRegistry,
5
+ handleInboundMessage,
6
+ resetAndPrepare,
7
+ resetIdleCompactFlag,
8
+ setIdleCompactReset,
9
+ startSession
10
+ } from "./chunk-SMPIFP43.js";
11
+ import "./chunk-NIRYBWUW.js";
12
+ import "./chunk-3MO2MDXJ.js";
13
+ import "./chunk-RV54J75Q.js";
14
+ import "./chunk-KFENC7BM.js";
15
+ import "./chunk-OZ4IZFV4.js";
16
+ import "./chunk-GBBTK6H2.js";
17
+ import "./chunk-JAJ3DUQ2.js";
18
+ import "./chunk-G6IXMYIO.js";
19
+ import "./chunk-UDZIZB5F.js";
20
+ import "./chunk-XLLSPBBT.js";
21
+ import "./chunk-MZWMYN4O.js";
22
+ import "./chunk-EX2SRTUE.js";
23
+ import "./chunk-PZE3J7ER.js";
24
+ import "./chunk-2BY6I4P5.js";
25
+ import "./chunk-MJ6PHMOK.js";
26
+ import "./chunk-7K2YZTLD.js";
27
+ export {
28
+ SessionRegistry,
29
+ handleInboundMessage,
30
+ resetAndPrepare,
31
+ resetIdleCompactFlag,
32
+ setIdleCompactReset,
33
+ startSession
34
+ };
35
+ //# sourceMappingURL=message-pipeline-U2CGLUNH.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
package/bundle/meta.json CHANGED
@@ -5002,7 +5002,7 @@
5002
5002
  "format": "esm"
5003
5003
  },
5004
5004
  "src/components/pipeline/busy-guard.ts": {
5005
- "bytes": 2870,
5005
+ "bytes": 3209,
5006
5006
  "imports": [
5007
5007
  {
5008
5008
  "path": "src/components/logger.ts",
@@ -21504,7 +21504,7 @@
21504
21504
  "format": "esm"
21505
21505
  },
21506
21506
  "src/components/heartbeat-tasks.ts": {
21507
- "bytes": 6670,
21507
+ "bytes": 6767,
21508
21508
  "imports": [
21509
21509
  {
21510
21510
  "path": "src/components/log-and-swallow.ts",
@@ -23077,7 +23077,7 @@
23077
23077
  "format": "esm"
23078
23078
  },
23079
23079
  "src/cli/commands/onboard.ts": {
23080
- "bytes": 31439,
23080
+ "bytes": 32065,
23081
23081
  "imports": [
23082
23082
  {
23083
23083
  "path": "src/components/log-and-swallow.ts",
@@ -23094,6 +23094,11 @@
23094
23094
  "kind": "import-statement",
23095
23095
  "external": true
23096
23096
  },
23097
+ {
23098
+ "path": "node:os",
23099
+ "kind": "import-statement",
23100
+ "external": true
23101
+ },
23097
23102
  {
23098
23103
  "path": "node:url",
23099
23104
  "kind": "import-statement",
@@ -23139,6 +23144,11 @@
23139
23144
  "kind": "dynamic-import",
23140
23145
  "external": true
23141
23146
  },
23147
+ {
23148
+ "path": "node:fs",
23149
+ "kind": "dynamic-import",
23150
+ "external": true
23151
+ },
23142
23152
  {
23143
23153
  "path": "abmind",
23144
23154
  "kind": "dynamic-import",
@@ -25438,16 +25448,16 @@
25438
25448
  },
25439
25449
  "bytes": 1272
25440
25450
  },
25441
- "bundle/commands-E3Y4QUNF.js.map": {
25451
+ "bundle/commands-2JNT6SYN.js.map": {
25442
25452
  "imports": [],
25443
25453
  "exports": [],
25444
25454
  "inputs": {},
25445
25455
  "bytes": 93
25446
25456
  },
25447
- "bundle/commands-E3Y4QUNF.js": {
25457
+ "bundle/commands-2JNT6SYN.js": {
25448
25458
  "imports": [
25449
25459
  {
25450
- "path": "bundle/chunk-WUTCGJDZ.js",
25460
+ "path": "bundle/chunk-SMPIFP43.js",
25451
25461
  "kind": "import-statement"
25452
25462
  },
25453
25463
  {
@@ -25526,16 +25536,16 @@
25526
25536
  "inputs": {},
25527
25537
  "bytes": 1167
25528
25538
  },
25529
- "bundle/message-pipeline-CFVO73CK.js.map": {
25539
+ "bundle/message-pipeline-U2CGLUNH.js.map": {
25530
25540
  "imports": [],
25531
25541
  "exports": [],
25532
25542
  "inputs": {},
25533
25543
  "bytes": 93
25534
25544
  },
25535
- "bundle/message-pipeline-CFVO73CK.js": {
25545
+ "bundle/message-pipeline-U2CGLUNH.js": {
25536
25546
  "imports": [
25537
25547
  {
25538
- "path": "bundle/chunk-WUTCGJDZ.js",
25548
+ "path": "bundle/chunk-SMPIFP43.js",
25539
25549
  "kind": "import-statement"
25540
25550
  },
25541
25551
  {
@@ -25866,20 +25876,20 @@
25866
25876
  },
25867
25877
  "bytes": 142293
25868
25878
  },
25869
- "bundle/telegram-adapter-MVA33IO2.js.map": {
25879
+ "bundle/telegram-adapter-5SG4BFO6.js.map": {
25870
25880
  "imports": [],
25871
25881
  "exports": [],
25872
25882
  "inputs": {},
25873
25883
  "bytes": 87308
25874
25884
  },
25875
- "bundle/telegram-adapter-MVA33IO2.js": {
25885
+ "bundle/telegram-adapter-5SG4BFO6.js": {
25876
25886
  "imports": [
25877
25887
  {
25878
25888
  "path": "bundle/chunk-R36WIOYX.js",
25879
25889
  "kind": "import-statement"
25880
25890
  },
25881
25891
  {
25882
- "path": "bundle/chunk-WUTCGJDZ.js",
25892
+ "path": "bundle/chunk-SMPIFP43.js",
25883
25893
  "kind": "import-statement"
25884
25894
  },
25885
25895
  {
@@ -26075,13 +26085,13 @@
26075
26085
  "inputs": {},
26076
26086
  "bytes": 578
26077
26087
  },
26078
- "bundle/discord-adapter-5DS7UTBE.js.map": {
26088
+ "bundle/discord-adapter-GWAFMN2H.js.map": {
26079
26089
  "imports": [],
26080
26090
  "exports": [],
26081
26091
  "inputs": {},
26082
26092
  "bytes": 42950
26083
26093
  },
26084
- "bundle/discord-adapter-5DS7UTBE.js": {
26094
+ "bundle/discord-adapter-GWAFMN2H.js": {
26085
26095
  "imports": [
26086
26096
  {
26087
26097
  "path": "bundle/chunk-R36WIOYX.js",
@@ -26092,7 +26102,7 @@
26092
26102
  "kind": "import-statement"
26093
26103
  },
26094
26104
  {
26095
- "path": "bundle/chunk-WUTCGJDZ.js",
26105
+ "path": "bundle/chunk-SMPIFP43.js",
26096
26106
  "kind": "import-statement"
26097
26107
  },
26098
26108
  {
@@ -30836,7 +30846,7 @@
30836
30846
  "imports": [],
30837
30847
  "exports": [],
30838
30848
  "inputs": {},
30839
- "bytes": 335899
30849
+ "bytes": 336051
30840
30850
  },
30841
30851
  "bundle/abtars.js": {
30842
30852
  "imports": [
@@ -30845,7 +30855,7 @@
30845
30855
  "kind": "import-statement"
30846
30856
  },
30847
30857
  {
30848
- "path": "bundle/chunk-WUTCGJDZ.js",
30858
+ "path": "bundle/chunk-SMPIFP43.js",
30849
30859
  "kind": "import-statement"
30850
30860
  },
30851
30861
  {
@@ -31123,7 +31133,7 @@
31123
31133
  "kind": "dynamic-import"
31124
31134
  },
31125
31135
  {
31126
- "path": "bundle/telegram-adapter-MVA33IO2.js",
31136
+ "path": "bundle/telegram-adapter-5SG4BFO6.js",
31127
31137
  "kind": "dynamic-import"
31128
31138
  },
31129
31139
  {
@@ -31131,7 +31141,7 @@
31131
31141
  "kind": "dynamic-import"
31132
31142
  },
31133
31143
  {
31134
- "path": "bundle/discord-adapter-5DS7UTBE.js",
31144
+ "path": "bundle/discord-adapter-GWAFMN2H.js",
31135
31145
  "kind": "dynamic-import"
31136
31146
  },
31137
31147
  {
@@ -31143,7 +31153,7 @@
31143
31153
  "kind": "dynamic-import"
31144
31154
  },
31145
31155
  {
31146
- "path": "bundle/message-pipeline-CFVO73CK.js",
31156
+ "path": "bundle/message-pipeline-U2CGLUNH.js",
31147
31157
  "kind": "dynamic-import"
31148
31158
  },
31149
31159
  {
@@ -31270,7 +31280,7 @@
31270
31280
  "kind": "dynamic-import"
31271
31281
  },
31272
31282
  {
31273
- "path": "bundle/commands-E3Y4QUNF.js",
31283
+ "path": "bundle/commands-2JNT6SYN.js",
31274
31284
  "kind": "dynamic-import"
31275
31285
  },
31276
31286
  {
@@ -31282,7 +31292,7 @@
31282
31292
  "kind": "dynamic-import"
31283
31293
  },
31284
31294
  {
31285
- "path": "bundle/commands-E3Y4QUNF.js",
31295
+ "path": "bundle/commands-2JNT6SYN.js",
31286
31296
  "kind": "dynamic-import"
31287
31297
  },
31288
31298
  {
@@ -31504,7 +31514,7 @@
31504
31514
  "bytesInOutput": 7082
31505
31515
  },
31506
31516
  "src/components/heartbeat-tasks.ts": {
31507
- "bytesInOutput": 3642
31517
+ "bytesInOutput": 3718
31508
31518
  },
31509
31519
  "src/components/daily-cycle.ts": {
31510
31520
  "bytesInOutput": 1903
@@ -31564,7 +31574,7 @@
31564
31574
  "bytesInOutput": 189
31565
31575
  }
31566
31576
  },
31567
- "bytes": 151895
31577
+ "bytes": 151971
31568
31578
  },
31569
31579
  "bundle/chunk-PQ62LZNA.js.map": {
31570
31580
  "imports": [],
@@ -31654,13 +31664,13 @@
31654
31664
  },
31655
31665
  "bytes": 17589
31656
31666
  },
31657
- "bundle/chunk-WUTCGJDZ.js.map": {
31667
+ "bundle/chunk-SMPIFP43.js.map": {
31658
31668
  "imports": [],
31659
31669
  "exports": [],
31660
31670
  "inputs": {},
31661
- "bytes": 278694
31671
+ "bytes": 279238
31662
31672
  },
31663
- "bundle/chunk-WUTCGJDZ.js": {
31673
+ "bundle/chunk-SMPIFP43.js": {
31664
31674
  "imports": [
31665
31675
  {
31666
31676
  "path": "bundle/chunk-NIRYBWUW.js",
@@ -32046,7 +32056,7 @@
32046
32056
  "bytesInOutput": 3529
32047
32057
  },
32048
32058
  "src/components/pipeline/busy-guard.ts": {
32049
- "bytesInOutput": 2545
32059
+ "bytesInOutput": 2798
32050
32060
  },
32051
32061
  "src/components/pipeline/prompt-builder.ts": {
32052
32062
  "bytesInOutput": 9626
@@ -32094,7 +32104,7 @@
32094
32104
  "bytesInOutput": 8888
32095
32105
  }
32096
32106
  },
32097
- "bytes": 144665
32107
+ "bytes": 144918
32098
32108
  },
32099
32109
  "bundle/chunk-NIRYBWUW.js.map": {
32100
32110
  "imports": [],
@@ -33811,7 +33821,7 @@
33811
33821
  "imports": [],
33812
33822
  "exports": [],
33813
33823
  "inputs": {},
33814
- "bytes": 149468
33824
+ "bytes": 150479
33815
33825
  },
33816
33826
  "bundle/abtars-cli.js": {
33817
33827
  "imports": [
@@ -33923,6 +33933,11 @@
33923
33933
  "kind": "import-statement",
33924
33934
  "external": true
33925
33935
  },
33936
+ {
33937
+ "path": "node:os",
33938
+ "kind": "import-statement",
33939
+ "external": true
33940
+ },
33926
33941
  {
33927
33942
  "path": "node:url",
33928
33943
  "kind": "import-statement",
@@ -33964,6 +33979,11 @@
33964
33979
  "kind": "dynamic-import",
33965
33980
  "external": true
33966
33981
  },
33982
+ {
33983
+ "path": "node:fs",
33984
+ "kind": "dynamic-import",
33985
+ "external": true
33986
+ },
33967
33987
  {
33968
33988
  "path": "abmind",
33969
33989
  "kind": "dynamic-import",
@@ -34190,7 +34210,7 @@
34190
34210
  "bytesInOutput": 4230
34191
34211
  },
34192
34212
  "src/cli/commands/onboard.ts": {
34193
- "bytesInOutput": 26246
34213
+ "bytesInOutput": 26816
34194
34214
  },
34195
34215
  "src/components/hints.ts": {
34196
34216
  "bytesInOutput": 1010
@@ -34214,7 +34234,7 @@
34214
34234
  "bytesInOutput": 5169
34215
34235
  }
34216
34236
  },
34217
- "bytes": 76439
34237
+ "bytes": 77009
34218
34238
  },
34219
34239
  "bundle/chunk-PPSB2ZIN.js.map": {
34220
34240
  "imports": [],