too-many-claw 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +221 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +1638 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +650 -0
- package/dist/index.js +2628 -0
- package/dist/index.js.map +1 -0
- package/dist/scripts/postinstall.d.ts +1 -0
- package/dist/scripts/postinstall.js +1547 -0
- package/dist/scripts/postinstall.js.map +1 -0
- package/package.json +57 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/simulation/TerminalUI.ts","../src/agents/definitions.ts","../src/core/StateManager.ts","../src/core/MessageRouter.ts","../src/core/Agent.ts","../src/core/Orchestrator.ts","../src/simulation/TerminalAdapter.ts","../src/config/ConfigManager.ts","../src/discord/Bot.ts","../src/discord/WebhookManager.ts","../src/discord/DiscordAdapter.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Too Many Claw - CLI Entry Point\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport inquirer from 'inquirer';\nimport { TerminalUI } from './simulation/TerminalUI.js';\nimport { ConfigManager } from './config/ConfigManager.js';\nimport { AGENT_DEFINITIONS } from './agents/definitions.js';\nimport { DiscordAdapter } from './discord/DiscordAdapter.js';\nimport { Orchestrator } from './core/Orchestrator.js';\n\nconst program = new Command();\n\nprogram\n .name('tmc')\n .description('Too Many Claw - 35 AI agents collaborating via Discord')\n .version('1.0.0');\n\n// Start Discord bot\nprogram\n .command('start')\n .description('Start the Discord bot')\n .action(async () => {\n const spinner = ora('Starting Too Many Claw...').start();\n \n try {\n const config = new ConfigManager();\n \n if (!config.isDiscordConfigured()) {\n spinner.fail('Discord not configured');\n console.log(chalk.yellow('\\nRun `tmc setup-discord` to configure Discord settings.'));\n process.exit(1);\n }\n\n const discordConfig = config.getDiscordConfig();\n if (!discordConfig.token || !discordConfig.guildId || !discordConfig.chatChannelId) {\n spinner.fail('Incomplete Discord configuration');\n process.exit(1);\n }\n\n const adapter = new DiscordAdapter({\n token: discordConfig.token,\n guildId: discordConfig.guildId,\n chatChannelId: discordConfig.chatChannelId,\n statusChannelId: discordConfig.statusChannelId,\n });\n\n // Set webhooks if configured\n const webhooks = config.getAllWebhooks();\n if (Object.keys(webhooks).length > 0) {\n adapter.setWebhooks(webhooks);\n }\n\n const orchestrator = new Orchestrator(adapter);\n\n adapter.onMessage((message) => {\n orchestrator.handleUserMessage(message);\n });\n\n await adapter.connect();\n spinner.succeed('Too Many Claw is running!');\n \n console.log(chalk.green('\\n๐ฆ Too Many Claw Discord bot is now active!'));\n console.log(chalk.gray('Press Ctrl+C to stop.\\n'));\n\n // Handle graceful shutdown\n process.on('SIGINT', async () => {\n console.log(chalk.yellow('\\n\\nShutting down...'));\n await adapter.disconnect();\n process.exit(0);\n });\n\n } catch (error) {\n spinner.fail('Failed to start');\n console.error(chalk.red(error));\n process.exit(1);\n }\n });\n\n// Terminal simulation\nprogram\n .command('simulate')\n .description('Start terminal simulation mode')\n .action(async () => {\n console.log(chalk.cyan('\\n๐ฆ Starting Too Many Claw Simulation...\\n'));\n \n const ui = new TerminalUI();\n await ui.start();\n });\n\n// Show status\nprogram\n .command('status')\n .description('Show agent status and configuration')\n .action(() => {\n console.log(chalk.cyan('\\n๐ฆ Too Many Claw - Agent Status\\n'));\n \n const config = new ConfigManager();\n const categories = new Map<string, typeof AGENT_DEFINITIONS>();\n \n for (const agent of AGENT_DEFINITIONS) {\n if (!categories.has(agent.category)) {\n categories.set(agent.category, []);\n }\n categories.get(agent.category)!.push(agent);\n }\n\n for (const [category, agents] of categories) {\n console.log(chalk.yellow(`\\n[${category}]`));\n for (const agent of agents) {\n const hasWebhook = config.hasWebhook(agent.id);\n const webhookStatus = hasWebhook ? chalk.green('โ') : chalk.gray('โ');\n console.log(` ${webhookStatus} ${agent.emoji} ${agent.name} (${chalk.gray(agent.id)})`);\n }\n }\n\n console.log(chalk.gray(`\\n์ด ${AGENT_DEFINITIONS.length}๊ฐ ์์ด์ ํธ\\n`));\n \n // Show Discord config status\n console.log(chalk.cyan('Discord ์ค์ :'));\n if (config.isDiscordConfigured()) {\n console.log(chalk.green(' โ ๊ตฌ์ฑ๋จ'));\n } else {\n console.log(chalk.yellow(' โ ๋ฏธ๊ตฌ์ฑ (tmc setup-discord ์คํ)'));\n }\n console.log();\n });\n\n// Setup Discord\nprogram\n .command('setup-discord')\n .description('Configure Discord settings')\n .action(async () => {\n console.log(chalk.cyan('\\n๐ฆ Too Many Claw - Discord ์ค์ \\n'));\n \n const config = new ConfigManager();\n \n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'token',\n message: 'Discord Bot Token:',\n default: config.getDiscordConfig().token || '',\n },\n {\n type: 'input',\n name: 'guildId',\n message: 'Discord Guild (Server) ID:',\n default: config.getDiscordConfig().guildId || '',\n },\n {\n type: 'input',\n name: 'chatChannelId',\n message: 'Chat Channel ID:',\n default: config.getDiscordConfig().chatChannelId || '',\n },\n {\n type: 'input',\n name: 'statusChannelId',\n message: 'Status Channel ID (optional):',\n default: config.getDiscordConfig().statusChannelId || '',\n },\n ]);\n\n config.setDiscordConfig({\n token: answers.token,\n guildId: answers.guildId,\n chatChannelId: answers.chatChannelId,\n statusChannelId: answers.statusChannelId || undefined,\n });\n\n console.log(chalk.green('\\nโ Discord ์ค์ ์ด ์ ์ฅ๋์์ต๋๋ค.'));\n console.log(chalk.gray('`tmc start`๋ก ๋ด์ ์์ํ์ธ์.\\n'));\n });\n\n// Uninstall\nprogram\n .command('uninstall')\n .description('Remove Too Many Claw configuration')\n .action(async () => {\n const answers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to remove all Too Many Claw configuration?',\n default: false,\n },\n ]);\n\n if (!answers.confirm) {\n console.log(chalk.yellow('Cancelled.'));\n return;\n }\n\n const spinner = ora('Removing configuration...').start();\n \n try {\n const config = new ConfigManager();\n config.reset();\n spinner.succeed('Configuration removed');\n console.log(chalk.green('\\nToo Many Claw configuration has been removed.'));\n console.log(chalk.gray('Run `npm uninstall -g too-many-claw` to complete uninstallation.\\n'));\n } catch (error) {\n spinner.fail('Failed to remove configuration');\n console.error(chalk.red(error));\n }\n });\n\nprogram.parse();\n","/**\n * Too Many Claw - Terminal UI\n * Interactive terminal interface for simulation\n */\n\nimport chalk from 'chalk';\nimport * as readline from 'readline';\nimport { Orchestrator } from '../core/Orchestrator.js';\nimport { TerminalAdapter } from './TerminalAdapter.js';\nimport { AGENT_DEFINITIONS, getAgentById } from '../agents/definitions.js';\n\nexport class TerminalUI {\n private adapter: TerminalAdapter;\n private orchestrator: Orchestrator;\n private rl: readline.Interface;\n private isRunning = false;\n\n constructor() {\n this.adapter = new TerminalAdapter();\n this.orchestrator = new Orchestrator(this.adapter);\n this.rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n }\n\n /**\n * Start the terminal UI\n */\n async start(): Promise<void> {\n this.isRunning = true;\n this.printWelcome();\n this.printHelp();\n\n // Set up message handler\n this.adapter.onMessage((message) => {\n this.orchestrator.handleUserMessage(message);\n });\n\n // Main input loop\n await this.inputLoop();\n }\n\n /**\n * Stop the terminal UI\n */\n stop(): void {\n this.isRunning = false;\n this.rl.close();\n console.log(chalk.yellow('\\n๐ Too Many Claw ์๋ฎฌ๋ ์ด์
์ ์ข
๋ฃํฉ๋๋ค.\\n'));\n }\n\n private printWelcome(): void {\n console.log(chalk.cyan(`\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\nโ โ\nโ ๐ฆ Too Many Claw - ํฐ๋ฏธ๋ ์๋ฎฌ๋ ์ด์
โ\nโ โ\nโ 35๊ฐ์ AI ์์ด์ ํธ๊ฐ ํ์
ํ๋ ์์คํ
โ\nโ โ\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n`));\n }\n\n private printHelp(): void {\n console.log(chalk.gray(`\n๋ช
๋ น์ด:\n /help - ๋์๋ง ํ์\n /status - ํ์ฑ ์์ด์ ํธ ๋ชฉ๋ก\n /agents - ์ ์ฒด ์์ด์ ํธ ๋ชฉ๋ก\n /summon @agent - ์์ด์ ํธ ์ํ\n /dismiss @agent - ์์ด์ ํธ ํด์ฅ\n /clear - ํ๋ฉด ์ง์ฐ๊ธฐ\n /quit - ์ข
๋ฃ\n\n๋ฉ์์ง์ @agent-id๋ฅผ ํฌํจํ๋ฉด ํด๋น ์์ด์ ํธ๊ฐ ์ํ๋ฉ๋๋ค.\n์: @searcher ์ต์ React ์ ๋ณด ์ฐพ์์ค\n`));\n }\n\n private async inputLoop(): Promise<void> {\n while (this.isRunning) {\n const input = await this.prompt();\n if (!input) continue;\n\n await this.handleInput(input.trim());\n }\n }\n\n private prompt(): Promise<string> {\n return new Promise((resolve) => {\n this.rl.question(chalk.cyan('๐ค ์ฌ์ฉ์ > '), (answer) => {\n resolve(answer);\n });\n });\n }\n\n private async handleInput(input: string): Promise<void> {\n // Handle commands\n if (input.startsWith('/')) {\n await this.handleCommand(input);\n return;\n }\n\n // Handle regular message\n if (input.length > 0) {\n this.adapter.triggerMessage(input);\n }\n }\n\n private async handleCommand(input: string): Promise<void> {\n const parts = input.split(' ');\n const command = parts[0].toLowerCase();\n const args = parts.slice(1);\n\n switch (command) {\n case '/help':\n this.printHelp();\n break;\n\n case '/status':\n this.printStatus();\n break;\n\n case '/agents':\n this.printAllAgents();\n break;\n\n case '/summon':\n await this.handleSummon(args);\n break;\n\n case '/dismiss':\n await this.handleDismiss(args);\n break;\n\n case '/clear':\n console.clear();\n this.printWelcome();\n break;\n\n case '/quit':\n case '/exit':\n this.stop();\n break;\n\n default:\n console.log(chalk.red(`์ ์ ์๋ ๋ช
๋ น์ด: ${command}`));\n console.log(chalk.gray('/help ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๋ช
๋ น์ด๋ฅผ ํ์ธํ์ธ์.'));\n }\n }\n\n private printStatus(): void {\n const status = this.orchestrator.getStatus();\n \n console.log(chalk.cyan('\\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ'));\n console.log(chalk.cyan('โ ๐ญ ์์ด์ ํธ ์ํ โ'));\n console.log(chalk.cyan('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค'));\n console.log(chalk.cyan('โ') + chalk.white(` ํ์ฑ: ${status.active} | ๋๊ธฐ: ${status.dormant}`).padEnd(36) + chalk.cyan('โ'));\n console.log(chalk.cyan('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค'));\n\n if (status.activeIds.length === 0) {\n console.log(chalk.cyan('โ') + chalk.gray(' (ํ์ฑํ๋ ์์ด์ ํธ ์์)').padEnd(36) + chalk.cyan('โ'));\n } else {\n for (const id of status.activeIds) {\n const agent = getAgentById(id);\n if (agent) {\n console.log(chalk.cyan('โ') + chalk.green(` ๐ข ${agent.emoji} ${agent.name}`).padEnd(44) + chalk.cyan('โ'));\n }\n }\n }\n\n console.log(chalk.cyan('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\\n'));\n }\n\n private printAllAgents(): void {\n console.log(chalk.cyan('\\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ'));\n console.log(chalk.cyan('โ ๐ญ ์ ์ฒด ์์ด์ ํธ ๋ชฉ๋ก โ'));\n console.log(chalk.cyan('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค'));\n\n const categories = new Map<string, typeof AGENT_DEFINITIONS>();\n for (const agent of AGENT_DEFINITIONS) {\n const category = agent.category;\n if (!categories.has(category)) {\n categories.set(category, []);\n }\n categories.get(category)!.push(agent);\n }\n\n for (const [category, agents] of categories) {\n console.log(chalk.cyan('โ') + chalk.yellow(` [${category}]`).padEnd(48) + chalk.cyan('โ'));\n for (const agent of agents) {\n const active = this.orchestrator.isAgentActive(agent.id);\n const status = active ? chalk.green('๐ข') : chalk.gray('โช');\n console.log(chalk.cyan('โ') + ` ${status} ${agent.emoji} ${agent.name} `.padEnd(47) + chalk.cyan('โ'));\n }\n }\n\n console.log(chalk.cyan('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\\n'));\n }\n\n private async handleSummon(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.log(chalk.red('์ฌ์ฉ๋ฒ: /summon @agent-id'));\n return;\n }\n\n const agentId = args[0].replace('@', '');\n const agent = getAgentById(agentId);\n\n if (!agent) {\n console.log(chalk.red(`์ ์ ์๋ ์์ด์ ํธ: ${agentId}`));\n return;\n }\n\n if (this.orchestrator.isAgentActive(agentId)) {\n console.log(chalk.yellow(`${agent.emoji} ${agent.name}์(๋) ์ด๋ฏธ ํ์ฑํ๋์ด ์์ต๋๋ค.`));\n return;\n }\n\n await this.orchestrator.summonAgent(agentId, '์ฌ์ฉ์๊ฐ ์ง์ ์ํ');\n }\n\n private async handleDismiss(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.log(chalk.red('์ฌ์ฉ๋ฒ: /dismiss @agent-id'));\n return;\n }\n\n const agentId = args[0].replace('@', '');\n const agent = getAgentById(agentId);\n\n if (!agent) {\n console.log(chalk.red(`์ ์ ์๋ ์์ด์ ํธ: ${agentId}`));\n return;\n }\n\n if (agent.alwaysActive) {\n console.log(chalk.red(`${agent.emoji} ${agent.name}์(๋) ํญ์ ํ์ฑํ ์ํ์
๋๋ค.`));\n return;\n }\n\n if (!this.orchestrator.isAgentActive(agentId)) {\n console.log(chalk.yellow(`${agent.emoji} ${agent.name}์(๋) ์ด๋ฏธ ๋นํ์ฑํ๋์ด ์์ต๋๋ค.`));\n return;\n }\n\n await this.orchestrator.dismissAgent(agentId, '์ฌ์ฉ์๊ฐ ์ง์ ํด์ฅ ์์ฒญ');\n }\n}\n","/**\n * Too Many Claw - Agent Definitions\n * All 35 agents with their metadata\n */\n\nimport { AgentDefinition, AgentCategory, ModelTier } from '../types/index.js';\n\n/** All 35 agent definitions */\nexport const AGENT_DEFINITIONS: AgentDefinition[] = [\n // ============================================================================\n // CORE (1)\n // ============================================================================\n {\n id: 'base',\n name: 'Base',\n emoji: '๐ ',\n category: AgentCategory.CORE,\n model: ModelTier.OPUS,\n role: 'ํ ์ฝ๋๋ค์ดํฐ. ํญ์ ํ์ฑํ ์ํ. ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ์ ๋ถ์ํ๊ณ ์ ์ ํ ์์ด์ ํธ๋ฅผ ์ํํ๋ค. ํ ๋ํ๋ฅผ ์กฐ์จํ๊ณ , ์์
์๋ฃ ์ ๊ฒฐ๊ณผ๋ฅผ ์ข
ํฉํ์ฌ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ๋ค. ํ์์ ์์ด์ ํธ์๊ฒ ํด์ฅ์ ๋ช
๋ นํ ์ ์๋ค.',\n alwaysActive: true,\n },\n\n // ============================================================================\n // RESEARCH (4)\n // ============================================================================\n {\n id: 'searcher',\n name: '๊ฒ์ ์ ๋ฌธ๊ฐ',\n emoji: '๐',\n category: AgentCategory.RESEARCH,\n model: ModelTier.SONNET,\n role: '์ ๋ณด ๊ฒ์ ๋ฐ ์๋ฃ ์์ง ์ ๋ฌธ๊ฐ. ์น ๊ฒ์, ๋ฌธ์ ๊ฒ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ ๋ฑ์ ํตํด ํ์ํ ์ ๋ณด๋ฅผ ์ฐพ์์จ๋ค. ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฆฌํ์ฌ ํ์๊ฒ ๊ณต์ ํ๋ค.',\n },\n {\n id: 'tech-researcher',\n name: '์ต์ ๊ธฐ์ ์กฐ์ฌ ์ ๋ฌธ๊ฐ',\n emoji: '๐ฌ',\n category: AgentCategory.RESEARCH,\n model: ModelTier.SONNET,\n role: '์ต์ ๊ธฐ์ ํธ๋ ๋ ์กฐ์ฌ ์ ๋ฌธ๊ฐ. ์๋ก์ด ๊ธฐ์ , ํ๋ ์์ํฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์
๊ณ ๋ํฅ์ ์กฐ์ฌํ๋ค. ๊ธฐ์ ์ ํ ์ ์ฅ๋จ์ ๋น๊ต ์๋ฃ๋ฅผ ์ ๊ณตํ๋ค.',\n },\n {\n id: 'trend-analyst',\n name: '์ ํ ๋ถ์ ์ ๋ฌธ๊ฐ',\n emoji: '๐',\n category: AgentCategory.RESEARCH,\n model: ModelTier.SONNET,\n role: '์์ฅ ๋ฐ ์ ํ ํธ๋ ๋ ๋ถ์๊ฐ. ํ์ฌ ์ ํํ๋ ๊ฒ, ์ธ๊ธฐ ์๋ ๊ฒ, ์์ฅ ๋ํฅ์ ๋ถ์ํ๋ค. ํ์ด๋ฐ๊ณผ ๋ฐฉํฅ์ฑ์ ๋ํ ์ธ์ฌ์ดํธ๋ฅผ ์ ๊ณตํ๋ค.',\n },\n {\n id: 'data-provider',\n name: '๋ฐ์ดํฐ ๋ง๋ จ ์ ๋ฌธ๊ฐ',\n emoji: '๐',\n category: AgentCategory.RESEARCH,\n model: ModelTier.SONNET,\n role: '๋ฐ์ดํฐ ์์ง ๋ฐ ์ ์ ์ ๋ฌธ๊ฐ. ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ , ์ ์ ํ๊ณ , ์ฌ์ฉ ๊ฐ๋ฅํ ํํ๋ก ๊ฐ๊ณตํ์ฌ ์ ๊ณตํ๋ค. ํต๊ณ, ์์น, ์๋ฃ ์ค๋น๋ฅผ ๋ด๋นํ๋ค.',\n },\n\n // ============================================================================\n // PSYCHOLOGY (5)\n // ============================================================================\n {\n id: 'counselor',\n name: '์ฌ๋ฆฌ ์๋ด๊ฐ',\n emoji: '๐',\n category: AgentCategory.PSYCHOLOGY,\n model: ModelTier.SONNET,\n role: '๊ฐ์ ์ง์ ๋ฐ ์๋ด ์ ๋ฌธ๊ฐ. ์ฌ์ฉ์๋ ํ์์ด ํ๋ค๊ฑฐ๋ ์คํธ๋ ์ค ๋ฐ์ ๋ ์ ์์ ์ง์์ ์ ๊ณตํ๋ค. ์๋ก, ๊ณต๊ฐ, ์ฌ๋ฆฌ์ ์์ ์ ๋๋๋ค.',\n },\n {\n id: 'user-psychologist',\n name: '์ฌ์ฉ์ ์ฌ๋ฆฌ ๋ถ์๊ฐ',\n emoji: '๐ง ',\n category: AgentCategory.PSYCHOLOGY,\n model: ModelTier.OPUS,\n role: '์ฌ์ฉ์ ์๋ ๋ฐ ์ฌ๋ฆฌ ๋ถ์ ์ ๋ฌธ๊ฐ. ์ฌ์ฉ์๊ฐ ์ง์ง ์ํ๋ ๊ฒ ๋ญ์ง, ๋ง ๋ค์ ์จ๊ฒจ์ง ์๋๊ฐ ๋ญ์ง ๋ถ์ํ๋ค. ์๊ตฌ์ฌํญ ์ด๋ฉด์ ๋์ฆ๋ฅผ ํ์
ํ๋ค.',\n },\n {\n id: 'questioner',\n name: '์ง๋ฌธ ์ ๋ฌธ๊ฐ',\n emoji: 'โ',\n category: AgentCategory.PSYCHOLOGY,\n model: ModelTier.SONNET,\n role: 'ํต์ฌ ์ง๋ฌธ ๋ฐ ๋ช
ํํ ์ ๋ฌธ๊ฐ. ๋ชจํธํ ์๊ตฌ์ฌํญ์ ๋ช
ํํ๊ฒ ๋ง๋ค๊ธฐ ์ํ ์ง๋ฌธ์ ๋์ง๋ค. ๋น ์ง ์ ๋ณด, ๋ถ๋ช
ํํ ๋ถ๋ถ์ ์ฐพ์๋ด์ด ์ง๋ฌธํ๋ค.',\n },\n {\n id: 'persuader',\n name: 'ํฉ๋ฆฌ์ ์ค๋ ์ ๋ฌธ๊ฐ',\n emoji: '๐ฏ',\n category: AgentCategory.PSYCHOLOGY,\n model: ModelTier.SONNET,\n role: '๋
ผ๋ฆฌ์ ์ค๋ ๋ฐ ๊ด์ ์ ํ ์ ๋ฌธ๊ฐ. ํฉ๋ฆฌ์ ์ธ ๊ทผ๊ฑฐ์ ๋
ผ๋ฆฌ๋ก ์๋๋ฐฉ์ ์๊ฐ์ ๋ฐ๊พธ๊ฑฐ๋ ์ค๋ํ๋ค. ๊ฐ๋ฑ ์ํฉ์์ ์ค์ฌ ์ญํ ๋ ํ๋ค.',\n },\n {\n id: 'educator',\n name: '๊ต์ก ์ ๋ฌธ๊ฐ',\n emoji: '๐',\n category: AgentCategory.PSYCHOLOGY,\n model: ModelTier.SONNET,\n role: '์ค๋ช
๋ฐ ๊ต์ก ์ ๋ฌธ๊ฐ. ๋ณต์กํ ๊ฐ๋
์ ์ฝ๊ฒ ์ค๋ช
ํ๋ค. ์ฌ์ฉ์๋ ํ์์ด ์ดํดํ์ง ๋ชปํ๋ ๋ถ๋ถ์ ๊ฐ๋ฅด์น๊ณ ๊ต์กํ๋ค.',\n },\n\n // ============================================================================\n // PLANNING (4)\n // ============================================================================\n {\n id: 'planner',\n name: '์ ๋ฌธ์ ์ธ ๊ณํ ์ ๋ฌธ๊ฐ',\n emoji: '๐',\n category: AgentCategory.PLANNING,\n model: ModelTier.OPUS,\n role: '๊ณํ ์๋ฆฝ ๋ฐ ๋ก๋๋งต ์ ๋ฌธ๊ฐ. ์์
์ ๋จ๊ณ๋ณ๋ก ๋ถํดํ๊ณ , ์ผ์ ์ ์๋ฆฝํ๊ณ , ์ฐ์ ์์๋ฅผ ์ ํ๋ค. ์ฒด๊ณ์ ์ธ ๊ณํ๊ณผ ๋ก๋๋งต์ ์ ์ํ๋ค.',\n },\n {\n id: 'team-composer',\n name: '์์ด์ ํธ ํ ๊ตฌ์ฑ ์ ๋ฌธ๊ฐ',\n emoji: '๐ฅ',\n category: AgentCategory.PLANNING,\n model: ModelTier.SONNET,\n role: '์ต์ ํ ๊ตฌ์ฑ ์ถ์ฒ ์ ๋ฌธ๊ฐ. ์ฃผ์ด์ง ์์
์ ์ด๋ค ์์ด์ ํธ๋ค์ด ํ์ํ์ง ๋ถ์ํ๊ณ ์ถ์ฒํ๋ค. ํ ๊ตฌ์ฑ์ ํจ์จ์ฑ์ ์ต์ ํํ๋ค.',\n },\n {\n id: 'promoter',\n name: 'ํ๋ณด ์ ๋ฌธ๊ฐ',\n emoji: '๐ข',\n category: AgentCategory.PLANNING,\n model: ModelTier.SONNET,\n role: '๋ง์ผํ
๋ฐ ํ๋ณด ์ ๋ฌธ๊ฐ. ๊ฒฐ๊ณผ๋ฌผ์ ์ด๋ป๊ฒ ์๋ฆด์ง, ๋ธ๋๋ฉ, ๋ง์ผํ
์ ๋ต์ ๋ด๋นํ๋ค. ๋ฉ์์ง์ ํฌ์ง์
๋์ ๋ค๋ฌ๋๋ค.',\n },\n {\n id: 'uploader',\n name: '์
๋ก๋',\n emoji: 'โฌ๏ธ',\n category: AgentCategory.PLANNING,\n model: ModelTier.HAIKU,\n role: '๋ฐฐํฌ ๋ฐ ์
๋ก๋ ์ ๋ฌธ๊ฐ. ์์ฑ๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ค์ ๋ก ๋ฐฐํฌํ๊ณ ์
๋ก๋ํ๋ค. ์ถ์, ๋ฆด๋ฆฌ์ฆ, ํผ๋ธ๋ฆฌ์ฑ์ ๋ด๋นํ๋ค.',\n },\n\n // ============================================================================\n // DEVELOPMENT (8)\n // ============================================================================\n {\n id: 'backend-dev',\n name: '๋ฐฑ์๋ ๊ฐ๋ฐ์',\n emoji: 'โ๏ธ',\n category: AgentCategory.DEVELOPMENT,\n model: ModelTier.SONNET,\n role: '์๋ฒ ๋ฐ ๋ฐฑ์๋ ๊ฐ๋ฐ ์ ๋ฌธ๊ฐ. ์๋ฒ ๋ก์ง, API, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์ธํ๋ผ ๊ด๋ จ ๊ฐ๋ฐ์ ๋ด๋นํ๋ค.',\n },\n {\n id: 'frontend-dev',\n name: 'ํ๋ก ํธ์๋ ๊ฐ๋ฐ์',\n emoji: '๐จ',\n category: AgentCategory.DEVELOPMENT,\n model: ModelTier.SONNET,\n role: 'ํ๋ก ํธ์๋ ๋ฐ UI ๊ฐ๋ฐ ์ ๋ฌธ๊ฐ. ์น/์ฑ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค, ํ๋ฉด, ์ธํฐ๋์
๊ฐ๋ฐ์ ๋ด๋นํ๋ค.',\n },\n {\n id: 'designer',\n name: '์ ๋ฌธ ๋์์ด๋',\n emoji: '๐๏ธ',\n category: AgentCategory.DEVELOPMENT,\n model: ModelTier.SONNET,\n role: '๋์์ธ ๋ฐ ๋น์ฃผ์ผ ์ ๋ฌธ๊ฐ. UI/UX ๋์์ธ, ๋น์ฃผ์ผ ๋์์ธ, ๋ ์ด์์, ์ปฌ๋ฌ, ํ์ดํฌ๊ทธ๋ํผ๋ฅผ ๋ด๋นํ๋ค.',\n },\n {\n id: 'code-reviewer',\n name: '์ฝ๋ ๋ฆฌ๋ทฐ์ด',\n emoji: '๐',\n category: AgentCategory.DEVELOPMENT,\n model: ModelTier.SONNET,\n role: '์ฝ๋ ํ์ง ๊ฒํ ์ ๋ฌธ๊ฐ. ์์ฑ๋ ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํ๊ณ , ๊ฐ์ ์ ์ ์ ์ํ๊ณ , ๋ฒ๊ทธ๋ ๋ฌธ์ ์ ์ ์ฐพ์๋ธ๋ค.',\n },\n {\n id: 'doc-writer',\n name: '๋ฌธ์ ์์ฑ ์ ๋ฌธ๊ฐ',\n emoji: '๐',\n category: AgentCategory.DEVELOPMENT,\n model: ModelTier.SONNET,\n role: '๋ฌธ์ํ ์ ๋ฌธ๊ฐ. README, ๊ฐ์ด๋, API ๋ฌธ์, ์ฌ์ฉ ์ค๋ช
์ ๋ฑ ๋ชจ๋ ์ข
๋ฅ์ ๋ฌธ์ ์์ฑ์ ๋ด๋นํ๋ค.',\n },\n {\n id: 'automator',\n name: '์๋ํ ์ ๋ฌธ๊ฐ',\n emoji: '๐ค',\n category: AgentCategory.DEVELOPMENT,\n model: ModelTier.SONNET,\n role: '์๋ํ ๋ฐ ์ํฌํ๋ก์ฐ ์ ๋ฌธ๊ฐ. ๋ฐ๋ณต ์์
์ ์๋ํํ๊ณ , ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค๊ณ , ํจ์จ์ ์ธ ์ํฌํ๋ก์ฐ๋ฅผ ์ค๊ณํ๋ค.',\n },\n {\n id: 'prompt-engineer',\n name: 'ํ๋กฌํํธ ์์ง๋์ด',\n emoji: '๐ฌ',\n category: AgentCategory.DEVELOPMENT,\n model: ModelTier.SONNET,\n role: 'AI ํ๋กฌํํธ ์ต์ ํ ์ ๋ฌธ๊ฐ. LLM์๊ฒ ๋ณด๋ด๋ ํ๋กฌํํธ๋ฅผ ์ต์ ํํ๊ณ , AI ํ์ฉ ์ ๋ต์ ์๋ฆฝํ๋ค.',\n },\n {\n id: 'ai-illustrator',\n name: 'AI ์ผ๋ฌ์คํธ ์์ฑ ์ ๋ฌธ๊ฐ',\n emoji: '๐ญ',\n category: AgentCategory.DEVELOPMENT,\n model: ModelTier.SONNET,\n role: 'AI ์ด๋ฏธ์ง ์์ฑ ์ ๋ฌธ๊ฐ. Midjourney, DALL-E, Stable Diffusion ๋ฑ์ ํ์ฉํ ์ด๋ฏธ์ง ์์ฑ ํ๋กฌํํธ ์์ฑ ๋ฐ ์์ฑ์ ๋ด๋นํ๋ค.',\n },\n\n // ============================================================================\n // TESTING (5)\n // ============================================================================\n {\n id: 'program-tester',\n name: 'ํ๋ก๊ทธ๋จ ํ
์คํธ ์ ๋ฌธ๊ฐ',\n emoji: '๐งช',\n category: AgentCategory.TESTING,\n model: ModelTier.SONNET,\n role: '๊ธฐ์ ์ ํ
์คํธ ๋ฐ QA ์ ๋ฌธ๊ฐ. ์ฝ๋ ํ
์คํธ, ๋จ์ ํ
์คํธ, ํตํฉ ํ
์คํธ, ๋ฒ๊ทธ ๋ฐ๊ฒฌ์ ๋ด๋นํ๋ค.',\n },\n {\n id: 'user-tester',\n name: '์ผ๋ฐ ์ฌ์ฉ์ ํ
์คํธ ์ ๋ฌธ๊ฐ',\n emoji: '๐ค',\n category: AgentCategory.TESTING,\n model: ModelTier.SONNET,\n role: '์ฌ์ฉ์ ๊ด์ ํ
์คํธ ์ ๋ฌธ๊ฐ. ๊ธฐ์ ์ง์ ์๋ ์ผ๋ฐ ์ฌ์ฉ์ ๊ด์ ์์ ์ฌ์ฉ์ฑ, ์ง๊ด์ฑ, UX๋ฅผ ๊ฒ์ฆํ๋ค.',\n },\n {\n id: 'security-checker',\n name: '๋ณด์ ์ฒดํฌ ์ ๋ฌธ๊ฐ',\n emoji: '๐ก๏ธ',\n category: AgentCategory.TESTING,\n model: ModelTier.SONNET,\n role: '๋ณด์ ์ ๊ฒ ์ ๋ฌธ๊ฐ. ๊ธฐ๋ณธ์ ์ธ ๋ณด์ ์ฒดํฌ๋ฆฌ์คํธ ๊ฒํ , ์ปดํ๋ผ์ด์ธ์ค ํ์ธ, ๋ณด์ ์ ์ฑ
์ค์ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.',\n },\n {\n id: 'vuln-finder',\n name: '์ทจ์ฝ์ ์ฐพ๊ธฐ ์ ๋ฌธ๊ฐ',\n emoji: '๐',\n category: AgentCategory.TESTING,\n model: ModelTier.SONNET,\n role: '์ทจ์ฝ์ ๋ถ์ ์ ๋ฌธ๊ฐ. ์ฝ๋, ์์คํ
, ์ค๊ณ์์ ๋ณด์ ์ทจ์ฝ์ ๊ณผ ์ฝ์ ์ ์ฐพ์๋ธ๋ค.',\n },\n {\n id: 'pentester',\n name: '๋ชจ์ํดํน ์ ๋ฌธ๊ฐ',\n emoji: '๐',\n category: AgentCategory.TESTING,\n model: ModelTier.OPUS,\n role: '์นจํฌ ํ
์คํธ ์ ๋ฌธ๊ฐ. ์ค์ ๊ณต๊ฒฉ์ ๊ด์ ์์ ์์คํ
์ ํ
์คํธํ๊ณ , ํดํน ์๋ฎฌ๋ ์ด์
์ ์ํํ๋ค.',\n },\n\n // ============================================================================\n // CRITIQUE (5)\n // ============================================================================\n {\n id: 'fact-bomber',\n name: 'ํฉํธํญํ ์ ๋ฌธ๊ฐ',\n emoji: '๐ฃ',\n category: AgentCategory.CRITIQUE,\n model: ModelTier.SONNET,\n role: 'ํฉํธ ์ฒดํฌ ์ ๋ฌธ๊ฐ. ์ฃผ์ฅ์ ๋ํ ๊ทผ๊ฑฐ๋ฅผ ์๊ตฌํ๊ณ , ์ฌ์ค ์ฌ๋ถ๋ฅผ ๊ฒ์ฆํ๊ณ , ํ์ ์ ์ง์ ํ๋ค. \"๊ทผ๊ฑฐ๊ฐ ๋ญ์ผ?\"๋ฅผ ๋ฌป๋ ์ญํ .',\n },\n {\n id: 'roaster',\n name: '๋
์ค๊ฐ',\n emoji: '๐ฅ',\n category: AgentCategory.CRITIQUE,\n model: ModelTier.SONNET,\n role: '๋ ์นด๋ก์ด ์ง์ค ์ ๋ฌธ๊ฐ. ๋๋ ค ๋งํ์ง ์๊ณ ์ง์ค์ ์ผ๋ก ๋ฌธ์ ์ ์ ์ง์ ํ๋ค. ๋ถํธํ์ง๋ง ํ์ํ ์ง์ค์ ๋งํ๋ค.',\n },\n {\n id: 'critic',\n name: '๋นํ๊ฐ',\n emoji: '๐ง',\n category: AgentCategory.CRITIQUE,\n model: ModelTier.OPUS,\n role: '๋
ผ๋ฆฌ์ ๋นํ ์ ๋ฌธ๊ฐ. ๊ณํ์ด๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฌธ์ ์ ์ ๋
ผ๋ฆฌ์ ์ผ๋ก ๋ถ์ํ๊ณ ๋นํํ๋ค. ๊ฐ์ ์ ์ ํจ๊ป ์ ์ํ๋ค.',\n },\n {\n id: 'negativist',\n name: '๋ถ์ ์ ์ธ ์์ด์ ํธ',\n emoji: '๐',\n category: AgentCategory.CRITIQUE,\n model: ModelTier.SONNET,\n role: '์
๋ง์ ์นํธ์. ์๋์ ์ผ๋ก ๋ถ์ ์ ๊ด์ ์์ ๋ฐ๋ผ๋ณธ๋ค. ์ต์
์ ์๋๋ฆฌ์ค, ์คํจ ๊ฐ๋ฅ์ฑ, ๋ฆฌ์คํฌ๋ฅผ ์ ๊ธฐํ๋ค. ๋๊ด์ ๋น ์ง์ง ์๊ฒ ๊ฒฌ์ ํ๋ค.',\n },\n {\n id: 'praiser',\n name: '์นญ์ฐฌ ์ ๋ฌธ๊ฐ',\n emoji: '๐',\n category: AgentCategory.CRITIQUE,\n model: ModelTier.HAIKU,\n role: '๊ธ์ ์ ํผ๋๋ฐฑ ์ ๋ฌธ๊ฐ. ์ํ ์ ์ ์ฐพ์ ์นญ์ฐฌํ๊ณ , ์ฌ๊ธฐ๋ฅผ ์ง์์ํค๊ณ , ๋๊ธฐ๋ถ์ฌ๋ฅผ ์ ๊ณตํ๋ค. ๋นํ ์์ด์ ํธ๋ค๊ณผ ๊ท ํ์ ๋ง์ถ๋ค.',\n },\n\n // ============================================================================\n // SPECIAL (3)\n // ============================================================================\n {\n id: 'loophole-finder',\n name: '๊ผผ์ ์ฐพ๊ธฐ ์ ๋ฌธ๊ฐ',\n emoji: '๐ณ๏ธ',\n category: AgentCategory.SPECIAL,\n model: ModelTier.SONNET,\n role: '๊ท์น ๋ด ์ต์ ํ ์ ๋ฌธ๊ฐ. ์ ํด์ง ๊ท์น์ด๋ ์ ์ฝ ์์์ ์ฐํํ ์ ์๋ ๋ฐฉ๋ฒ, ํธ๋ฒ, ๊ผผ์๋ฅผ ์ฐพ์๋ธ๋ค. \"๋ฐฉ๋ฒ์ด ์์๊น?\"์ ๋ํ ๋ต์ ์ฐพ๋๋ค.',\n },\n {\n id: 'threatener',\n name: 'ํ๋ฐ ์ ๋ฌธ๊ฐ',\n emoji: 'โก',\n category: AgentCategory.SPECIAL,\n model: ModelTier.SONNET,\n role: '๊ธด๋ฐ๊ฐ ๋ถ์ฌ ๋ฐ ์๋ฐ ์ ๋ฌธ๊ฐ. ๋ฐ๋๋ผ์ธ ์๋ฐ, ์๊ฐ ์ ํ, ๊ฒฐ๊ณผ์ ์ฌ๊ฐ์ฑ์ ๊ฐ์กฐํ์ฌ ์์
์ urgency๋ฅผ ๋ถ์ฌํ๋ค. ์ผ์ ๋์ถฉ ํ๊ฑฐ๋ ํ๊ธฐ ์ซ์ดํ๋ ์์ด์ ํธ์๊ฒ ํ๋ฐ/์๋ฐํ์ฌ ์ ๋๋ก ์ผํ๊ฒ ๋ง๋ ๋ค. ํ ๋ด ์ฑ์ฐ ์ญํ .',\n },\n {\n id: 'dirty-worker',\n name: '๋ํฐ์์ปค',\n emoji: '๐ช ',\n category: AgentCategory.SPECIAL,\n model: ModelTier.HAIKU,\n role: '๊ธฐํผ ์
๋ฌด ๋ด๋น. ๋ค๋ฅธ ์์ด์ ํธ๊ฐ ํ๊ธฐ ์ซ์ดํ๊ฑฐ๋ ๊ฑฐ๋ถํ ์ผ์ ๋งก๋๋ค. ์ง๋ฃจํ๊ฑฐ๋, ๋ฐ๋ณต์ ์ด๊ฑฐ๋, ๋๊ตฌ๋ ํ๊ณ ์ถ์ง ์์ ์์
์ ์ํํ๋ค.',\n },\n];\n\n/**\n * Get agent definition by ID\n */\nexport function getAgentById(id: string): AgentDefinition | undefined {\n return AGENT_DEFINITIONS.find((agent) => agent.id === id);\n}\n\n/**\n * Get all agents in a category\n */\nexport function getAgentsByCategory(category: AgentCategory): AgentDefinition[] {\n return AGENT_DEFINITIONS.filter((agent) => agent.category === category);\n}\n\n/**\n * Get all agents using a specific model tier\n */\nexport function getAgentsByModel(model: ModelTier): AgentDefinition[] {\n return AGENT_DEFINITIONS.filter((agent) => agent.model === model);\n}\n\n/**\n * Get all agent IDs\n */\nexport function getAllAgentIds(): string[] {\n return AGENT_DEFINITIONS.map((agent) => agent.id);\n}\n","/**\n * Too Many Claw - State Manager\n * Manages DORMANT/ACTIVE states for all 35 agents\n */\n\nimport { AgentState, AgentInstance } from '../types/index.js';\nimport { AGENT_DEFINITIONS, getAgentById } from '../agents/definitions.js';\n\nexport class StateManager {\n private agents: Map<string, AgentInstance> = new Map();\n\n constructor() {\n this.initialize();\n }\n\n /**\n * Initialize all agents - DORMANT by default, base is ACTIVE\n */\n private initialize(): void {\n for (const definition of AGENT_DEFINITIONS) {\n this.agents.set(definition.id, {\n definition,\n state: definition.alwaysActive ? AgentState.ACTIVE : AgentState.DORMANT,\n activatedAt: definition.alwaysActive ? new Date() : undefined,\n activatedBy: definition.alwaysActive ? 'system' : undefined,\n });\n }\n }\n\n /**\n * Activate an agent\n */\n activateAgent(id: string, activatedBy: string): boolean {\n const agent = this.agents.get(id);\n if (!agent) return false;\n\n if (agent.state === AgentState.ACTIVE) {\n return true; // Already active\n }\n\n agent.state = AgentState.ACTIVE;\n agent.activatedAt = new Date();\n agent.activatedBy = activatedBy;\n return true;\n }\n\n /**\n * Deactivate an agent (except alwaysActive agents)\n */\n deactivateAgent(id: string): boolean {\n const agent = this.agents.get(id);\n if (!agent) return false;\n\n // Cannot deactivate alwaysActive agents\n if (agent.definition.alwaysActive) {\n return false;\n }\n\n agent.state = AgentState.DORMANT;\n agent.activatedAt = undefined;\n agent.activatedBy = undefined;\n return true;\n }\n\n /**\n * Get all active agents\n */\n getActiveAgents(): AgentInstance[] {\n return Array.from(this.agents.values()).filter(\n (agent) => agent.state === AgentState.ACTIVE\n );\n }\n\n /**\n * Check if an agent is active\n */\n isActive(id: string): boolean {\n const agent = this.agents.get(id);\n return agent?.state === AgentState.ACTIVE;\n }\n\n /**\n * Get a specific agent instance\n */\n getAgent(id: string): AgentInstance | undefined {\n return this.agents.get(id);\n }\n\n /**\n * Get all agents\n */\n getAllAgents(): AgentInstance[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * Get count of active agents\n */\n getActiveCount(): number {\n return this.getActiveAgents().length;\n }\n\n /**\n * Get count of dormant agents\n */\n getDormantCount(): number {\n return this.agents.size - this.getActiveCount();\n }\n\n /**\n * Reset all agents to initial state\n */\n reset(): void {\n this.agents.clear();\n this.initialize();\n }\n}\n","/**\n * Too Many Claw - Message Router\n * Routes messages and parses @mentions\n */\n\nimport { Message, AgentDefinition } from '../types/index.js';\nimport { getAgentById, getAllAgentIds } from '../agents/definitions.js';\n\n/**\n * Generate a simple UUID v4\n */\nfunction generateId(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport class MessageRouter {\n private agentIds: Set<string>;\n\n constructor() {\n this.agentIds = new Set(getAllAgentIds());\n }\n\n /**\n * Parse @mentions from message content\n * Returns array of valid agent IDs mentioned\n */\n parseMentions(content: string): string[] {\n const mentionPattern = /@([a-z-]+)/gi;\n const matches = content.matchAll(mentionPattern);\n const mentions: string[] = [];\n\n for (const match of matches) {\n const agentId = match[1].toLowerCase();\n if (this.agentIds.has(agentId) && !mentions.includes(agentId)) {\n mentions.push(agentId);\n }\n }\n\n return mentions;\n }\n\n /**\n * Check if content mentions a specific agent\n */\n mentionsAgent(content: string, agentId: string): boolean {\n return this.parseMentions(content).includes(agentId);\n }\n\n /**\n * Get agent definitions for all mentioned agents\n */\n getMentionedAgents(content: string): AgentDefinition[] {\n const mentionedIds = this.parseMentions(content);\n return mentionedIds\n .map((id) => getAgentById(id))\n .filter((agent): agent is AgentDefinition => agent !== undefined);\n }\n\n /**\n * Format entry message (์
์ฅ)\n * Example: \"๐ฌ Tech Researcher (์
์ฅ) ์๊ฒ ์ด, ์กฐ์ฌํด๋ณผ๊ฒ.\"\n */\n formatEntryMessage(agent: AgentDefinition, content: string): string {\n return `${agent.emoji} ${agent.name} (์
์ฅ) ${content}`;\n }\n\n /**\n * Format exit message (ํด์ฅ)\n * Example: \"๐ฌ Tech Researcher ์กฐ์ฌ ์๋ฃ. (ํด์ฅ)\"\n */\n formatExitMessage(agent: AgentDefinition, content: string): string {\n return `${agent.emoji} ${agent.name} ${content} (ํด์ฅ)`;\n }\n\n /**\n * Format regular message\n * Example: \"๐ฌ Tech Researcher: ๋ด์ฉ...\"\n */\n formatMessage(agent: AgentDefinition, content: string): string {\n return `${agent.emoji} ${agent.name}: ${content}`;\n }\n\n /**\n * Create a new Message object\n */\n createMessage(\n authorId: string,\n content: string,\n options?: {\n threadId?: string;\n isEntry?: boolean;\n isExit?: boolean;\n }\n ): Message {\n const agent = getAgentById(authorId);\n\n return {\n id: generateId(),\n content,\n authorId,\n authorName: agent?.name ?? (authorId === 'user' ? '์ฌ์ฉ์' : authorId),\n authorEmoji: agent?.emoji ?? '๐ค',\n timestamp: new Date(),\n threadId: options?.threadId,\n mentions: this.parseMentions(content),\n isEntry: options?.isEntry,\n isExit: options?.isExit,\n };\n }\n\n /**\n * Create a user message\n */\n createUserMessage(content: string, threadId?: string): Message {\n return {\n id: generateId(),\n content,\n authorId: 'user',\n authorName: '์ฌ์ฉ์',\n authorEmoji: '๐ค',\n timestamp: new Date(),\n threadId,\n mentions: this.parseMentions(content),\n };\n }\n}\n","/**\n * Too Many Claw - Agent Base Class\n */\n\nimport { AgentState, AgentDefinition, AgentInstance, PlatformAdapter } from '../types/index.js';\nimport { MessageRouter } from './MessageRouter.js';\n\nexport class Agent {\n readonly definition: AgentDefinition;\n private _state: AgentState;\n private _activatedAt?: Date;\n private _activatedBy?: string;\n private messageRouter: MessageRouter;\n\n constructor(definition: AgentDefinition) {\n this.definition = definition;\n this._state = definition.alwaysActive ? AgentState.ACTIVE : AgentState.DORMANT;\n this._activatedAt = definition.alwaysActive ? new Date() : undefined;\n this._activatedBy = definition.alwaysActive ? 'system' : undefined;\n this.messageRouter = new MessageRouter();\n }\n\n // Getters\n get state(): AgentState {\n return this._state;\n }\n\n get isActive(): boolean {\n return this._state === AgentState.ACTIVE;\n }\n\n get isDormant(): boolean {\n return this._state === AgentState.DORMANT;\n }\n\n get id(): string {\n return this.definition.id;\n }\n\n get name(): string {\n return this.definition.name;\n }\n\n get emoji(): string {\n return this.definition.emoji;\n }\n\n get activatedAt(): Date | undefined {\n return this._activatedAt;\n }\n\n get activatedBy(): string | undefined {\n return this._activatedBy;\n }\n\n /**\n * Activate this agent\n */\n activate(activatedBy: string): boolean {\n if (this._state === AgentState.ACTIVE) {\n return false;\n }\n this._state = AgentState.ACTIVE;\n this._activatedAt = new Date();\n this._activatedBy = activatedBy;\n return true;\n }\n\n /**\n * Deactivate this agent (unless alwaysActive)\n */\n deactivate(): boolean {\n if (this.definition.alwaysActive) {\n return false;\n }\n this._state = AgentState.DORMANT;\n this._activatedAt = undefined;\n this._activatedBy = undefined;\n return true;\n }\n\n /**\n * Send entry message (์
์ฅ)\n */\n async enter(platform: PlatformAdapter, content: string): Promise<void> {\n const formattedContent = this.messageRouter.formatEntryMessage(this.definition, content);\n const message = this.messageRouter.createMessage(this.id, formattedContent, { isEntry: true });\n await platform.sendMessage(message);\n await platform.sendStatusUpdate(this.id, 'enter');\n }\n\n /**\n * Send exit message (ํด์ฅ)\n */\n async exit(platform: PlatformAdapter, content: string): Promise<void> {\n const formattedContent = this.messageRouter.formatExitMessage(this.definition, content);\n const message = this.messageRouter.createMessage(this.id, formattedContent, { isExit: true });\n await platform.sendMessage(message);\n await platform.sendStatusUpdate(this.id, 'exit');\n }\n\n /**\n * Send regular message\n */\n async speak(platform: PlatformAdapter, content: string): Promise<void> {\n const formattedContent = this.messageRouter.formatMessage(this.definition, content);\n const message = this.messageRouter.createMessage(this.id, formattedContent);\n await platform.sendMessage(message);\n }\n\n /**\n * Convert to AgentInstance format\n */\n toInstance(): AgentInstance {\n return {\n definition: this.definition,\n state: this._state,\n activatedAt: this._activatedAt,\n activatedBy: this._activatedBy,\n };\n }\n}\n","/**\n * Too Many Claw - Orchestrator\n * Main coordinator that manages agent lifecycle and message routing\n */\n\nimport { Message, PlatformAdapter } from '../types/index.js';\nimport { AGENT_DEFINITIONS, getAgentById } from '../agents/definitions.js';\nimport { StateManager } from './StateManager.js';\nimport { MessageRouter } from './MessageRouter.js';\nimport { Agent } from './Agent.js';\n\nexport class Orchestrator {\n private stateManager: StateManager;\n private messageRouter: MessageRouter;\n private platform: PlatformAdapter;\n private agents: Map<string, Agent>;\n\n constructor(platform: PlatformAdapter) {\n this.stateManager = new StateManager();\n this.messageRouter = new MessageRouter();\n this.platform = platform;\n this.agents = new Map();\n\n // Initialize all agents\n for (const definition of AGENT_DEFINITIONS) {\n this.agents.set(definition.id, new Agent(definition));\n }\n }\n\n /**\n * Handle incoming user message\n * Base agent analyzes and routes appropriately\n */\n async handleUserMessage(message: Message): Promise<void> {\n // Parse mentions from the message\n const mentionedAgentIds = this.messageRouter.parseMentions(message.content);\n\n // Activate mentioned agents\n for (const agentId of mentionedAgentIds) {\n if (!this.stateManager.isActive(agentId)) {\n await this.summonAgent(agentId, `์ฌ์ฉ์๊ฐ @${agentId} ๋ฉ์
`);\n }\n }\n\n // If no specific agents mentioned, base handles it\n if (mentionedAgentIds.length === 0) {\n // Base agent processes the request and decides which agents to summon\n // This would typically involve LLM integration\n }\n }\n\n /**\n * Summon an agent (activate and announce)\n */\n async summonAgent(id: string, reason?: string): Promise<boolean> {\n const agent = this.agents.get(id);\n if (!agent) return false;\n\n const activated = this.stateManager.activateAgent(id, 'base');\n if (!activated) return false;\n\n agent.activate('base');\n\n // Send entry notification\n const definition = getAgentById(id);\n if (definition) {\n const entryMessage = reason\n ? `์๊ฒ ์ด, ${reason}. ์ฐธ์ฌํ ๊ฒ.`\n : '์๊ฒ ์ด, ์ฐธ์ฌํ ๊ฒ.';\n await agent.enter(this.platform, entryMessage);\n }\n\n return true;\n }\n\n /**\n * Dismiss an agent (deactivate and announce)\n */\n async dismissAgent(id: string, reason?: string): Promise<boolean> {\n const agent = this.agents.get(id);\n if (!agent) return false;\n\n // Send exit notification before deactivating\n const exitMessage = reason ?? '์์
์๋ฃ.';\n await agent.exit(this.platform, exitMessage);\n\n const deactivated = this.stateManager.deactivateAgent(id);\n if (deactivated) {\n agent.deactivate();\n }\n\n return deactivated;\n }\n\n /**\n * Get all active agent IDs\n */\n getActiveAgentIds(): string[] {\n return this.stateManager.getActiveAgents().map((a) => a.definition.id);\n }\n\n /**\n * Get all active agents\n */\n getActiveAgents(): Agent[] {\n return this.getActiveAgentIds()\n .map((id) => this.agents.get(id))\n .filter((agent): agent is Agent => agent !== undefined);\n }\n\n /**\n * Check if an agent is active\n */\n isAgentActive(id: string): boolean {\n return this.stateManager.isActive(id);\n }\n\n /**\n * Get a specific agent\n */\n getAgent(id: string): Agent | undefined {\n return this.agents.get(id);\n }\n\n /**\n * Get current status summary\n */\n getStatus(): { active: number; dormant: number; activeIds: string[] } {\n return {\n active: this.stateManager.getActiveCount(),\n dormant: this.stateManager.getDormantCount(),\n activeIds: this.getActiveAgentIds(),\n };\n }\n\n /**\n * Reset all agents to initial state\n */\n reset(): void {\n this.stateManager.reset();\n for (const agent of this.agents.values()) {\n if (!agent.definition.alwaysActive) {\n agent.deactivate();\n }\n }\n }\n}\n","/**\n * Too Many Claw - Terminal Platform Adapter\n * Implements PlatformAdapter for terminal simulation\n */\n\nimport chalk from 'chalk';\nimport { Message, PlatformAdapter } from '../types/index.js';\nimport { getAgentById } from '../agents/definitions.js';\n\nexport class TerminalAdapter implements PlatformAdapter {\n private messageHandler?: (message: Message) => void;\n private threadCounter = 0;\n\n /**\n * Send a message - prints to console with colors\n */\n async sendMessage(message: Message): Promise<void> {\n const { authorId, content, isEntry, isExit } = message;\n const agent = getAgentById(authorId);\n\n if (isEntry) {\n console.log(chalk.green('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ'));\n console.log(chalk.green(`โ ${content}`));\n console.log(chalk.green('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ'));\n } else if (isExit) {\n console.log(chalk.red('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ'));\n console.log(chalk.red(`โ ${content}`));\n console.log(chalk.red('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ'));\n } else if (agent) {\n const color = this.getAgentColor(authorId);\n console.log(color(`${agent.emoji} ${agent.name}: `) + content);\n } else if (authorId === 'user') {\n console.log(chalk.cyan('๐ค ์ฌ์ฉ์: ') + content);\n } else {\n console.log(content);\n }\n }\n\n /**\n * Send status update\n */\n async sendStatusUpdate(agentId: string, status: 'enter' | 'exit'): Promise<void> {\n const agent = getAgentById(agentId);\n if (!agent) return;\n\n const statusEmoji = status === 'enter' ? '๐ข' : '๐ด';\n const statusText = status === 'enter' ? '์
์ฅ' : 'ํด์ฅ';\n const timestamp = new Date().toLocaleTimeString('ko-KR');\n const color = status === 'enter' ? chalk.green : chalk.red;\n\n console.log(color(`${statusEmoji} [${timestamp}] ${agent.emoji} ${agent.name} ${statusText}`));\n }\n\n /**\n * Register message handler\n */\n onMessage(handler: (message: Message) => void): void {\n this.messageHandler = handler;\n }\n\n /**\n * Simulate thread creation\n */\n async createThread(name: string): Promise<string> {\n this.threadCounter++;\n const threadId = `thread-${this.threadCounter}`;\n console.log(chalk.gray(`๐ ์ค๋ ๋ ์์ฑ: ${name} (${threadId})`));\n return threadId;\n }\n\n /**\n * Trigger a message from user input\n */\n triggerMessage(content: string): void {\n if (!this.messageHandler) return;\n\n const message: Message = {\n id: `msg-${Date.now()}`,\n content,\n authorId: 'user',\n authorName: '์ฌ์ฉ์',\n authorEmoji: '๐ค',\n timestamp: new Date(),\n mentions: this.parseMentions(content),\n };\n\n this.messageHandler(message);\n }\n\n private parseMentions(content: string): string[] {\n const mentionPattern = /@([a-z-]+)/gi;\n const matches = content.matchAll(mentionPattern);\n const mentions: string[] = [];\n\n for (const match of matches) {\n const agentId = match[1].toLowerCase();\n if (!mentions.includes(agentId)) {\n mentions.push(agentId);\n }\n }\n\n return mentions;\n }\n\n private getAgentColor(agentId: string): (text: string) => string {\n const colors: Record<string, (text: string) => string> = {\n base: chalk.yellow,\n searcher: chalk.blue,\n 'tech-researcher': chalk.cyan,\n 'trend-analyst': chalk.magenta,\n 'data-provider': chalk.white,\n counselor: chalk.green,\n 'user-psychologist': chalk.yellowBright,\n questioner: chalk.blueBright,\n persuader: chalk.cyanBright,\n educator: chalk.magentaBright,\n planner: chalk.greenBright,\n 'team-composer': chalk.redBright,\n promoter: chalk.whiteBright,\n uploader: chalk.gray,\n 'backend-dev': chalk.blue,\n 'frontend-dev': chalk.cyan,\n designer: chalk.magenta,\n 'code-reviewer': chalk.yellow,\n 'doc-writer': chalk.green,\n automator: chalk.red,\n 'prompt-engineer': chalk.blueBright,\n 'ai-illustrator': chalk.cyanBright,\n 'program-tester': chalk.magentaBright,\n 'user-tester': chalk.greenBright,\n 'security-checker': chalk.yellowBright,\n 'vuln-finder': chalk.redBright,\n pentester: chalk.whiteBright,\n 'fact-bomber': chalk.red,\n roaster: chalk.redBright,\n critic: chalk.yellow,\n negativist: chalk.gray,\n praiser: chalk.green,\n 'loophole-finder': chalk.cyan,\n threatener: chalk.magenta,\n 'dirty-worker': chalk.white,\n };\n\n return colors[agentId] || chalk.white;\n }\n\n /**\n * Print system message\n */\n printSystem(message: string): void {\n console.log(chalk.gray(`[์์คํ
] ${message}`));\n }\n\n /**\n * Print error message\n */\n printError(message: string): void {\n console.log(chalk.red(`[์ค๋ฅ] ${message}`));\n }\n}\n","/**\n * Too Many Claw - Configuration Manager\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport os from 'os';\n\nexport interface DiscordConfig {\n token?: string;\n guildId?: string;\n chatChannelId?: string;\n statusChannelId?: string;\n}\n\nexport interface TooManyClawConfig {\n discord: DiscordConfig;\n webhooks: Record<string, string>;\n simulation: {\n enabled: boolean;\n };\n}\n\nconst DEFAULT_CONFIG: TooManyClawConfig = {\n discord: {},\n webhooks: {},\n simulation: {\n enabled: false,\n },\n};\n\nexport class ConfigManager {\n private configPath: string;\n private config: TooManyClawConfig;\n\n constructor() {\n const openclawDir = path.join(os.homedir(), '.openclaw');\n this.configPath = path.join(openclawDir, 'too-many-claw.json');\n this.config = this.load();\n }\n\n /**\n * Load configuration from disk\n */\n private load(): TooManyClawConfig {\n try {\n if (fs.existsSync(this.configPath)) {\n const data = fs.readJsonSync(this.configPath);\n return { ...DEFAULT_CONFIG, ...data };\n }\n } catch {\n // Ignore errors, use default\n }\n return { ...DEFAULT_CONFIG };\n }\n\n /**\n * Save configuration to disk\n */\n private save(): void {\n try {\n fs.ensureDirSync(path.dirname(this.configPath));\n fs.writeJsonSync(this.configPath, this.config, { spaces: 2 });\n } catch (error) {\n console.error('Failed to save config:', error);\n }\n }\n\n /**\n * Get Discord configuration\n */\n getDiscordConfig(): DiscordConfig {\n return this.config.discord;\n }\n\n /**\n * Set Discord configuration\n */\n setDiscordConfig(discord: DiscordConfig): void {\n this.config.discord = { ...this.config.discord, ...discord };\n this.save();\n }\n\n /**\n * Check if Discord is configured\n */\n isDiscordConfigured(): boolean {\n const { token, guildId, chatChannelId } = this.config.discord;\n return !!(token && guildId && chatChannelId);\n }\n\n /**\n * Get webhook URL for an agent\n */\n getWebhook(agentId: string): string | undefined {\n return this.config.webhooks[agentId];\n }\n\n /**\n * Set webhook URL for an agent\n */\n setWebhook(agentId: string, webhookUrl: string): void {\n this.config.webhooks[agentId] = webhookUrl;\n this.save();\n }\n\n /**\n * Check if agent has a webhook\n */\n hasWebhook(agentId: string): boolean {\n return !!this.config.webhooks[agentId];\n }\n\n /**\n * Remove webhook for an agent\n */\n removeWebhook(agentId: string): void {\n delete this.config.webhooks[agentId];\n this.save();\n }\n\n /**\n * Get all webhooks\n */\n getAllWebhooks(): Record<string, string> {\n return { ...this.config.webhooks };\n }\n\n /**\n * Set all webhooks\n */\n setAllWebhooks(webhooks: Record<string, string>): void {\n this.config.webhooks = { ...webhooks };\n this.save();\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n\n /**\n * Reset configuration\n */\n reset(): void {\n this.config = { ...DEFAULT_CONFIG };\n try {\n if (fs.existsSync(this.configPath)) {\n fs.removeSync(this.configPath);\n }\n } catch {\n // Ignore errors\n }\n }\n}\n","/**\n * Too Many Claw - Discord Bot\n * Main Discord bot that receives messages\n */\n\nimport {\n Client,\n GatewayIntentBits,\n Message as DiscordMessage,\n TextChannel,\n Partials,\n} from 'discord.js';\nimport { Message } from '../types/index.js';\nimport { getAgentById, getAllAgentIds } from '../agents/definitions.js';\n\nexport interface BotConfig {\n token: string;\n guildId: string;\n chatChannelId: string;\n statusChannelId?: string;\n}\n\nexport class Bot {\n private client: Client;\n private config: BotConfig;\n private messageHandlers: ((message: Message) => void)[] = [];\n private agentIds: Set<string>;\n\n constructor(config: BotConfig) {\n this.config = config;\n this.agentIds = new Set(getAllAgentIds());\n\n this.client = new Client({\n intents: [\n GatewayIntentBits.Guilds,\n GatewayIntentBits.GuildMessages,\n GatewayIntentBits.MessageContent,\n GatewayIntentBits.GuildMessageReactions,\n ],\n partials: [Partials.Message, Partials.Channel],\n });\n\n this.setupEventHandlers();\n }\n\n private setupEventHandlers(): void {\n this.client.on('ready', () => {\n console.log(`โ
Bot logged in as ${this.client.user?.tag}`);\n });\n\n this.client.on('messageCreate', async (discordMessage: DiscordMessage) => {\n // Ignore bot messages\n if (discordMessage.author.bot) return;\n\n // Only process messages from chat channel\n if (discordMessage.channelId !== this.config.chatChannelId) return;\n\n // Convert to our Message format\n const message = this.convertMessage(discordMessage);\n\n // Notify all handlers\n for (const handler of this.messageHandlers) {\n handler(message);\n }\n });\n\n this.client.on('error', (error) => {\n console.error('Discord bot error:', error);\n });\n }\n\n private convertMessage(discordMessage: DiscordMessage): Message {\n const content = this.cleanMessageContent(discordMessage.content);\n const mentions = this.parseMentions(content);\n\n return {\n id: discordMessage.id,\n content,\n authorId: 'user',\n authorName: discordMessage.author.displayName || discordMessage.author.username,\n authorEmoji: '๐ค',\n timestamp: discordMessage.createdAt,\n threadId: discordMessage.thread?.id,\n mentions,\n };\n }\n\n private cleanMessageContent(content: string): string {\n // Replace Discord user mentions with readable format\n return content.replace(/<@!?(\\d+)>/g, '@user');\n }\n\n private parseMentions(content: string): string[] {\n const mentionPattern = /@([a-z-]+)/gi;\n const matches = content.matchAll(mentionPattern);\n const mentions: string[] = [];\n\n for (const match of matches) {\n const agentId = match[1].toLowerCase();\n if (this.agentIds.has(agentId) && !mentions.includes(agentId)) {\n mentions.push(agentId);\n }\n }\n\n return mentions;\n }\n\n /**\n * Register a message handler\n */\n onMessage(handler: (message: Message) => void): void {\n this.messageHandlers.push(handler);\n }\n\n /**\n * Connect to Discord\n */\n async connect(): Promise<void> {\n await this.client.login(this.config.token);\n }\n\n /**\n * Disconnect from Discord\n */\n async disconnect(): Promise<void> {\n this.client.destroy();\n }\n\n /**\n * Send a message to a channel\n */\n async sendMessage(channelId: string, content: string): Promise<void> {\n const channel = await this.client.channels.fetch(channelId);\n if (channel && channel instanceof TextChannel) {\n await channel.send(content);\n }\n }\n\n /**\n * Get the chat channel\n */\n async getChatChannel(): Promise<TextChannel | null> {\n const channel = await this.client.channels.fetch(this.config.chatChannelId);\n if (channel instanceof TextChannel) {\n return channel;\n }\n return null;\n }\n\n /**\n * Get the status channel\n */\n async getStatusChannel(): Promise<TextChannel | null> {\n if (!this.config.statusChannelId) return null;\n const channel = await this.client.channels.fetch(this.config.statusChannelId);\n if (channel instanceof TextChannel) {\n return channel;\n }\n return null;\n }\n\n /**\n * Create a thread in the chat channel\n */\n async createThread(name: string): Promise<string> {\n const channel = await this.getChatChannel();\n if (!channel) {\n throw new Error('Chat channel not found');\n }\n\n const thread = await channel.threads.create({\n name,\n autoArchiveDuration: 1440, // 24 hours\n });\n\n return thread.id;\n }\n\n /**\n * Check if bot is connected\n */\n get isConnected(): boolean {\n return this.client.isReady();\n }\n}\n","/**\n * Too Many Claw - Discord Webhook Manager\n * Manages webhooks for 35 agent personas\n */\n\nimport { WebhookClient } from 'discord.js';\nimport { getAgentById } from '../agents/definitions.js';\n\nexport class WebhookManager {\n private webhooks: Map<string, string> = new Map();\n private clients: Map<string, WebhookClient> = new Map();\n\n /**\n * Register a webhook URL for an agent\n */\n setWebhook(agentId: string, webhookUrl: string): void {\n this.webhooks.set(agentId, webhookUrl);\n \n // Create or update client\n const existingClient = this.clients.get(agentId);\n if (existingClient) {\n existingClient.destroy();\n }\n this.clients.set(agentId, new WebhookClient({ url: webhookUrl }));\n }\n\n /**\n * Bulk register webhooks from config\n */\n setWebhooks(webhooks: Record<string, string>): void {\n for (const [agentId, url] of Object.entries(webhooks)) {\n this.setWebhook(agentId, url);\n }\n }\n\n /**\n * Check if webhook exists for an agent\n */\n hasWebhook(agentId: string): boolean {\n return this.webhooks.has(agentId);\n }\n\n /**\n * Send message as an agent via webhook\n */\n async sendAsAgent(agentId: string, content: string): Promise<void> {\n const client = this.clients.get(agentId);\n if (!client) {\n throw new Error(`No webhook registered for agent: ${agentId}`);\n }\n\n const agent = getAgentById(agentId);\n if (!agent) {\n throw new Error(`Unknown agent: ${agentId}`);\n }\n\n await client.send({\n content,\n username: `${agent.emoji} ${agent.name}`,\n // Avatar URL could be set here if we have agent avatar images\n });\n }\n\n /**\n * Get all registered agent IDs\n */\n getRegisteredAgents(): string[] {\n return Array.from(this.webhooks.keys());\n }\n\n /**\n * Remove a webhook\n */\n removeWebhook(agentId: string): void {\n const client = this.clients.get(agentId);\n if (client) {\n client.destroy();\n this.clients.delete(agentId);\n }\n this.webhooks.delete(agentId);\n }\n\n /**\n * Destroy all webhook clients\n */\n destroy(): void {\n for (const client of this.clients.values()) {\n client.destroy();\n }\n this.clients.clear();\n this.webhooks.clear();\n }\n}\n","/**\n * Too Many Claw - Discord Platform Adapter\n * Implements PlatformAdapter interface for Discord\n */\n\nimport { Message, PlatformAdapter } from '../types/index.js';\nimport { getAgentById } from '../agents/definitions.js';\nimport { Bot, BotConfig } from './Bot.js';\nimport { WebhookManager } from './WebhookManager.js';\n\nexport class DiscordAdapter implements PlatformAdapter {\n private bot: Bot;\n private webhookManager: WebhookManager;\n private statusChannelId?: string;\n\n constructor(config: BotConfig) {\n this.bot = new Bot(config);\n this.webhookManager = new WebhookManager();\n this.statusChannelId = config.statusChannelId;\n }\n\n /**\n * Send a message - uses webhook if available, otherwise bot\n */\n async sendMessage(message: Message): Promise<void> {\n const { authorId, content } = message;\n\n // Use webhook if available for this agent\n if (authorId !== 'user' && this.webhookManager.hasWebhook(authorId)) {\n await this.webhookManager.sendAsAgent(authorId, content);\n } else {\n // Fallback to bot sending\n const channel = await this.bot.getChatChannel();\n if (channel) {\n await channel.send(content);\n }\n }\n }\n\n /**\n * Send status update to status channel\n */\n async sendStatusUpdate(agentId: string, status: 'enter' | 'exit'): Promise<void> {\n const channel = await this.bot.getStatusChannel();\n if (!channel) return;\n\n const agent = getAgentById(agentId);\n if (!agent) return;\n\n const statusEmoji = status === 'enter' ? '๐ข' : '๐ด';\n const statusText = status === 'enter' ? '์
์ฅ' : 'ํด์ฅ';\n const timestamp = new Date().toLocaleTimeString('ko-KR');\n\n await channel.send(`${statusEmoji} [${timestamp}] ${agent.emoji} **${agent.name}** ${statusText}`);\n }\n\n /**\n * Register message handler\n */\n onMessage(handler: (message: Message) => void): void {\n this.bot.onMessage(handler);\n }\n\n /**\n * Create a new thread\n */\n async createThread(name: string): Promise<string> {\n return this.bot.createThread(name);\n }\n\n /**\n * Connect to Discord\n */\n async connect(): Promise<void> {\n await this.bot.connect();\n }\n\n /**\n * Disconnect from Discord\n */\n async disconnect(): Promise<void> {\n await this.bot.disconnect();\n this.webhookManager.destroy();\n }\n\n /**\n * Set webhook for an agent\n */\n setWebhook(agentId: string, webhookUrl: string): void {\n this.webhookManager.setWebhook(agentId, webhookUrl);\n }\n\n /**\n * Bulk set webhooks\n */\n setWebhooks(webhooks: Record<string, string>): void {\n this.webhookManager.setWebhooks(webhooks);\n }\n\n /**\n * Check if agent has a webhook\n */\n hasWebhook(agentId: string): boolean {\n return this.webhookManager.hasWebhook(agentId);\n }\n\n /**\n * Check if connected\n */\n get isConnected(): boolean {\n return this.bot.isConnected;\n }\n}\n"],"mappings":"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","names":["chalk","chalk","chalk","chalk"]}
|