@cosmicstack/mercury-agent 0.2.1 → 0.2.3

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/config.ts","../src/utils/logger.ts","../src/soul/identity.ts","../src/memory/store.ts","../src/providers/openai-compat.ts","../src/providers/base.ts","../src/providers/anthropic.ts","../src/providers/registry.ts","../src/core/agent.ts","../src/core/lifecycle.ts","../src/core/scheduler.ts","../src/channels/cli.ts","../src/channels/base.ts","../src/utils/markdown.ts","../src/channels/telegram.ts","../src/channels/registry.ts","../src/utils/tokens.ts","../src/capabilities/permissions.ts","../src/capabilities/filesystem/read-file.ts","../src/capabilities/filesystem/write-file.ts","../src/capabilities/filesystem/create-file.ts","../src/capabilities/filesystem/list-dir.ts","../src/capabilities/filesystem/delete-file.ts","../src/capabilities/filesystem/edit-file.ts","../src/capabilities/filesystem/send-file.ts","../src/capabilities/shell/run-command.ts","../src/capabilities/shell/approve-command.ts","../src/capabilities/skills/install-skill.ts","../src/capabilities/skills/list-skills.ts","../src/capabilities/skills/use-skill.ts","../src/capabilities/scheduler/schedule-task.ts","../src/capabilities/scheduler/list-tasks.ts","../src/capabilities/scheduler/cancel-task.ts","../src/capabilities/system/budget-status.ts","../src/capabilities/git/git-status.ts","../src/capabilities/git/git-diff.ts","../src/capabilities/git/git-log.ts","../src/capabilities/git/git-add.ts","../src/capabilities/git/git-commit.ts","../src/capabilities/git/git-push.ts","../src/capabilities/web/fetch-url.ts","../src/capabilities/registry.ts","../src/skills/loader.ts","../src/utils/manual.ts","../src/cli/daemon.ts","../src/cli/service.ts","../src/cli/watchdog.ts"],"sourcesContent":["import { Command } from 'commander';\nimport readline from 'node:readline';\nimport chalk from 'chalk';\nimport figlet from 'figlet';\nimport { loadConfig, saveConfig, isSetupComplete, getMercuryHome, ensureCreatorField } from './utils/config.js';\nimport type { MercuryConfig } from './utils/config.js';\nimport { logger } from './utils/logger.js';\nimport { Identity } from './soul/identity.js';\nimport { ShortTermMemory, LongTermMemory, EpisodicMemory } from './memory/store.js';\nimport { ProviderRegistry } from './providers/registry.js';\nimport { Agent } from './core/agent.js';\nimport { Scheduler } from './core/scheduler.js';\nimport { ChannelRegistry } from './channels/registry.js';\nimport { CLIChannel } from './channels/cli.js';\nimport { TelegramChannel } from './channels/telegram.js';\nimport { TokenBudget } from './utils/tokens.js';\nimport { CapabilityRegistry } from './capabilities/registry.js';\nimport { SkillLoader } from './skills/loader.js';\nimport { getManual } from './utils/manual.js';\nimport { startBackground, stopDaemon, showLogs, getDaemonStatus, restartDaemon, tryAutoDaemonize } from './cli/daemon.js';\nimport { installService, uninstallService, showServiceStatus, isServiceInstalled } from './cli/service.js';\nimport { runWithWatchdog } from './cli/watchdog.js';\n\nfunction hr() {\n console.log(chalk.dim('─'.repeat(50)));\n}\n\nfunction banner() {\n console.log('');\n const art = figlet.textSync('MERCURY', { font: 'Slant', horizontalLayout: 'default' });\n for (const line of art.split('\\n')) {\n if (line.trim()) console.log(chalk.bold.cyan(` ${line}`));\n }\n console.log('');\n console.log(chalk.white(' an AI agent for personal tasks'));\n console.log(chalk.dim(' v0.2.1 · by Cosmic Stack · mercury.cosmicstack.org'));\n console.log('');\n}\n\nfunction splashScreen() {\n console.log('');\n const art = figlet.textSync('MERCURY', { font: 'Slant', horizontalLayout: 'default' });\n for (const line of art.split('\\n')) {\n if (line.trim()) console.log(chalk.bold.cyan(` ${line}`));\n }\n console.log('');\n console.log(chalk.dim(' an AI agent for personal tasks'));\n console.log(chalk.cyan(' by Cosmic Stack'));\n console.log(chalk.dim(' mercury.cosmicstack.org'));\n console.log('');\n}\n\nasync function ask(prompt: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction maskKey(key: string): string {\n if (!key) return '';\n if (key.length <= 8) return '••••••••';\n return key.slice(0, 4) + '••••' + key.slice(-4);\n}\n\nasync function configure(existingConfig?: MercuryConfig): Promise<void> {\n const isReconfig = !!existingConfig;\n const config = existingConfig ?? loadConfig();\n\n if (isReconfig) {\n banner();\n console.log(chalk.yellow(' Reconfiguring Mercury — press Enter to keep current value.'));\n } else {\n splashScreen();\n console.log(chalk.yellow(' First run detected — let\\'s set you up.'));\n }\n\n hr();\n console.log('');\n console.log(chalk.bold.white(' Identity'));\n console.log('');\n\n if (isReconfig) {\n const ownerName = await ask(chalk.white(` Your name [${config.identity.owner}]: `));\n if (ownerName) config.identity.owner = ownerName;\n\n const agentName = await ask(chalk.white(` Agent name [${config.identity.name}]: `));\n if (agentName) config.identity.name = agentName;\n } else {\n const ownerName = await ask(chalk.white(' Your name: '));\n if (!ownerName) {\n console.log(chalk.red(' Name is required.'));\n process.exit(1);\n }\n config.identity.owner = ownerName;\n\n const agentName = await ask(chalk.white(` Agent name [${config.identity.name}]: `));\n if (agentName) config.identity.name = agentName;\n }\n\n config.identity.creator = config.identity.creator || 'Cosmic Stack';\n\n hr();\n console.log('');\n console.log(chalk.bold.white(' LLM Providers'));\n if (isReconfig) {\n console.log(chalk.dim(' Current keys shown masked. Enter new value to change, Enter to keep.'));\n } else {\n console.log(chalk.dim(' At least one API key is required.'));\n }\n console.log('');\n\n const dsMask = isReconfig && config.providers.deepseek.apiKey ? ` [${maskKey(config.providers.deepseek.apiKey)}]` : '';\n const deepseekKey = await ask(chalk.white(` DeepSeek API key${dsMask}: `));\n if (deepseekKey) {\n config.providers.deepseek.apiKey = deepseekKey;\n }\n\n const oaiMask = isReconfig && config.providers.openai.apiKey ? ` [${maskKey(config.providers.openai.apiKey)}]` : ' (Enter to skip)';\n const openaiKey = await ask(chalk.white(` OpenAI API key${oaiMask}: `));\n if (openaiKey) config.providers.openai.apiKey = openaiKey;\n\n const antMask = isReconfig && config.providers.anthropic.apiKey ? ` [${maskKey(config.providers.anthropic.apiKey)}]` : ' (Enter to skip)';\n const anthropicKey = await ask(chalk.white(` Anthropic API key${antMask}: `));\n if (anthropicKey) config.providers.anthropic.apiKey = anthropicKey;\n\n const hasKey = config.providers.deepseek.apiKey || config.providers.openai.apiKey || config.providers.anthropic.apiKey;\n if (!hasKey) {\n console.log(chalk.red('\\n At least one LLM API key is required.'));\n process.exit(1);\n }\n\n const availableProviders: string[] = [];\n if (config.providers.deepseek.apiKey) availableProviders.push('deepseek');\n if (config.providers.openai.apiKey) availableProviders.push('openai');\n if (config.providers.anthropic.apiKey) availableProviders.push('anthropic');\n\n if (isReconfig && availableProviders.length > 1) {\n console.log('');\n console.log(chalk.bold.white(' Default Provider'));\n console.log(chalk.dim(' Select the default LLM provider (the one used first).'));\n console.log('');\n for (let i = 0; i < availableProviders.length; i++) {\n const marker = availableProviders[i] === config.providers.default ? ' (current)' : '';\n console.log(chalk.white(` ${i + 1}. ${availableProviders[i]}${marker}`));\n }\n console.log('');\n const choice = await ask(chalk.white(` Choose [1-${availableProviders.length}] [Enter to keep ${config.providers.default}]: `));\n const num = parseInt(choice, 10);\n if (num >= 1 && num <= availableProviders.length) {\n config.providers.default = availableProviders[num - 1];\n }\n } else if (!isReconfig) {\n config.providers.default = availableProviders[0];\n console.log(chalk.dim(` Default provider set to ${config.providers.default}`));\n }\n\n hr();\n console.log('');\n console.log(chalk.bold.white(' Telegram (optional)'));\n if (isReconfig) {\n console.log(chalk.dim(' Leave empty to keep current value. Enter \"none\" to disable.'));\n } else {\n console.log(chalk.dim(' Leave empty to skip. You can add it later.'));\n }\n console.log('');\n\n const tgMask = isReconfig && config.channels.telegram.botToken ? ` [${maskKey(config.channels.telegram.botToken)}]` : '';\n const telegramToken = await ask(chalk.white(` Telegram Bot Token${tgMask}: `));\n if (isReconfig && telegramToken.toLowerCase() === 'none') {\n config.channels.telegram.enabled = false;\n config.channels.telegram.botToken = '';\n } else if (telegramToken) {\n config.channels.telegram.botToken = telegramToken;\n config.channels.telegram.enabled = true;\n }\n\n hr();\n console.log('');\n console.log(chalk.bold.white(' Token Budget'));\n console.log('');\n\n const budgetPrompt = isReconfig\n ? chalk.white(` Daily token budget [${config.tokens.dailyBudget.toLocaleString()}]: `)\n : chalk.white(` Daily token budget [${config.tokens.dailyBudget.toLocaleString()}]: `);\n const budgetStr = await ask(budgetPrompt);\n if (budgetStr) {\n const budget = parseInt(budgetStr.replace(/,/g, ''), 10);\n if (!isNaN(budget) && budget > 0) {\n config.tokens.dailyBudget = budget;\n }\n }\n\n hr();\n saveConfig(config);\n\n const home = getMercuryHome();\n console.log('');\n console.log(chalk.green(` ✓ Config saved to ${home}/mercury.yaml`));\n console.log(chalk.green(` ✓ Soul files seeded in ${home}/soul/`));\n console.log(chalk.green(` ✓ Memory stored in ${home}/memory/`));\n console.log(chalk.green(` ✓ Permissions seeded in ${home}/permissions.yaml`));\n console.log(chalk.green(` ✓ Skills directory ready in ${home}/skills/`));\n console.log('');\n console.log(chalk.cyan(` ${config.identity.name} is ready. Run \\`mercury start\\` to chat.`));\n console.log(chalk.dim(' mercury.cosmicstack.org'));\n console.log('');\n}\n\nfunction autoDaemonize(): void {\n const daemon = getDaemonStatus();\n if (daemon.running) {\n return;\n }\n\n console.log(chalk.dim(' Setting up background mode...'));\n\n try {\n if (!isServiceInstalled()) {\n installService();\n }\n } catch {\n console.log(chalk.dim(' Service install skipped (can run `mercury service install` later).'));\n }\n\n const ok = tryAutoDaemonize();\n if (ok) {\n const status = getDaemonStatus();\n console.log(chalk.green(` ✓ Mercury is running in background (PID: ${status.pid})`));\n console.log(chalk.green(' ✓ Auto-starts on login. Auto-restarts on crash.'));\n console.log(chalk.dim(' Use `mercury stop` to stop. `mercury restart` to restart.'));\n } else {\n console.log(chalk.dim(' Background mode not available. Run `mercury up` to set it up.'));\n }\n console.log('');\n}\n\nasync function runAgent(isDaemon: boolean = false): Promise<void> {\n let config = loadConfig();\n config = ensureCreatorField(config);\n const name = config.identity.name;\n\n if (!isDaemon) {\n banner();\n console.log(chalk.white(` ${name} is waking up...`));\n console.log('');\n } else {\n logger.info(`${name} is waking up (daemon mode)...`);\n }\n\n const tokenBudget = new TokenBudget(config);\n const providers = new ProviderRegistry(config);\n\n if (!providers.hasProviders()) {\n if (isDaemon) {\n logger.error('No LLM providers available. Run `mercury doctor` to configure API keys.');\n return;\n }\n console.log(chalk.red(' No LLM providers available. Run `mercury doctor` to configure API keys.'));\n process.exit(1);\n }\n\n const available = providers.listAvailable();\n if (!isDaemon) {\n console.log(chalk.dim(` Providers: ${available.join(', ')}`));\n } else {\n logger.info({ providers: available }, 'Providers loaded');\n }\n\n const skillLoader = new SkillLoader();\n const skills = skillLoader.discover();\n if (!isDaemon) {\n console.log(chalk.dim(` Skills: ${skills.length > 0 ? skills.map(s => s.name).join(', ') : 'none installed'}`));\n }\n\n const scheduler = new Scheduler(config);\n\n const identity = new Identity();\n const shortTerm = new ShortTermMemory(config);\n const longTerm = new LongTermMemory(config);\n const episodic = new EpisodicMemory(config);\n\n const channels = new ChannelRegistry(config);\n const capabilities = new CapabilityRegistry(skillLoader, scheduler, tokenBudget);\n\n capabilities.setChatCommandContext({\n toolNames: () => capabilities.getToolNames(),\n skillNames: () => skills.map(s => s.name),\n config: () => config,\n tokenBudget: () => tokenBudget,\n manual: () => getManual(),\n });\n\n capabilities.setSendFileHandler(async (filePath: string) => {\n const msg = channels.getActiveChannels().includes('telegram')\n ? channels.get('telegram')\n : channels.get('cli');\n if (msg) {\n await msg.sendFile(filePath);\n }\n });\n\n capabilities.registerAll();\n\n const agent = new Agent(\n config, providers, identity, shortTerm, longTerm, episodic, channels, tokenBudget, capabilities, scheduler,\n );\n\n await agent.birth();\n await agent.wake();\n\n const cliChannel = channels.get('cli') as CLIChannel | undefined;\n\n if (cliChannel) {\n capabilities.permissions.onAsk(async (prompt: string) => {\n return cliChannel.askPermission(prompt);\n });\n }\n\n const activeCh = channels.getActiveChannels();\n const toolNames = capabilities.getToolNames();\n\n if (!isDaemon) {\n console.log(chalk.dim(` Channels: ${activeCh.join(', ')}`));\n console.log(chalk.dim(` Tools: ${toolNames.join(', ')}`));\n console.log(chalk.dim(` Permissions: ${getMercuryHome()}/permissions.yaml`));\n console.log(chalk.dim(` Schedules: ${getMercuryHome()}/schedules.yaml`));\n if (config.identity.creator) {\n console.log(chalk.dim(` Creator: ${config.identity.creator}`));\n }\n hr();\n console.log('');\n console.log(chalk.green(` ${name} is live. Type a message and press Enter.`));\n console.log(chalk.dim(' Ctrl+C to exit · /help for commands'));\n console.log('');\n } else {\n logger.info({ channels: activeCh, tools: toolNames }, 'Mercury is live (daemon mode)');\n }\n\n const shutdown = async () => {\n if (!isDaemon) {\n console.log('');\n console.log(chalk.dim(` ${name} is shutting down...`));\n } else {\n logger.info('Mercury is shutting down (daemon mode)');\n }\n await agent.shutdown();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\nconst program = new Command();\n\nprogram\n .name('mercury')\n .description('Mercury — Soul-driven AI agent with permission-hardened tools, token budgets, and multi-channel access.')\n .version('0.2.1')\n .option('-v, --verbose', 'Show debug logs')\n .action(async () => {\n if (!isSetupComplete()) {\n await configure();\n autoDaemonize();\n return;\n }\n await runAgent();\n });\n\nprogram\n .command('start')\n .description('Start Mercury agent')\n .option('-v, --verbose', 'Show debug logs')\n .option('-d, --detached', 'Run in background (daemon mode)')\n .option('--daemon', 'Internal flag for daemon child process')\n .action(async (opts) => {\n if (opts.daemon) {\n await runWithWatchdog(() => runAgent(true));\n return;\n }\n\n if (opts.detached) {\n startBackground();\n return;\n }\n\n if (!isSetupComplete()) {\n await configure();\n return;\n }\n await runAgent();\n });\n\nprogram\n .command('stop')\n .description('Stop a background Mercury process')\n .action(() => {\n stopDaemon();\n });\n\nprogram\n .command('restart')\n .description('Restart a background Mercury process')\n .action(() => {\n restartDaemon();\n });\n\nprogram\n .command('up')\n .description('Ensure Mercury is running persistently — installs service if needed, starts daemon')\n .action(async () => {\n if (!isSetupComplete()) {\n await configure();\n }\n\n const daemon = getDaemonStatus();\n\n if (daemon.running && daemon.pid) {\n console.log('');\n console.log(chalk.green(` Mercury is already running (PID: ${daemon.pid})`));\n console.log(chalk.dim(` Logs: ${daemon.logPath}`));\n console.log('');\n return;\n }\n\n if (!isServiceInstalled()) {\n console.log('');\n console.log(chalk.cyan(' Installing Mercury as a system service...'));\n installService();\n }\n\n console.log(chalk.cyan(' Starting Mercury in background...'));\n startBackground();\n });\n\nprogram\n .command('logs')\n .description('Show recent daemon logs')\n .action(() => {\n showLogs();\n });\n\nprogram\n .command('setup')\n .description('Re-run the setup wizard (reconfigure)')\n .action(async () => {\n if (isSetupComplete()) {\n await configure(loadConfig());\n } else {\n await configure();\n }\n });\n\nprogram\n .command('doctor')\n .description('Reconfigure Mercury — change keys, name, settings (Enter to keep current)')\n .action(async () => {\n if (isSetupComplete()) {\n await configure(loadConfig());\n } else {\n await configure();\n }\n });\n\nprogram\n .command('status')\n .description('Show current configuration and daemon status')\n .action(() => {\n const config = loadConfig();\n const home = getMercuryHome();\n const skillLoader = new SkillLoader();\n const skills = skillLoader.discover();\n const daemon = getDaemonStatus();\n banner();\n console.log(` Name: ${chalk.cyan(config.identity.name)}`);\n console.log(` Owner: ${chalk.white(config.identity.owner || '(not set)')}`);\n if (config.identity.creator) {\n console.log(` Creator: ${chalk.white(config.identity.creator)}`);\n }\n console.log(` Provider: ${chalk.white(config.providers.default)}`);\n console.log(` Telegram: ${config.channels.telegram.enabled ? chalk.green('enabled') : chalk.dim('disabled')}`);\n console.log(` Skills: ${skills.length > 0 ? chalk.green(skills.map(s => s.name).join(', ')) : chalk.dim('none')}`);\n console.log(` Budget: ${chalk.white(config.tokens.dailyBudget.toLocaleString())} tokens/day`);\n console.log(` Setup: ${isSetupComplete() ? chalk.green('complete') : chalk.red('not done')}`);\n console.log(` Daemon: ${daemon.running ? chalk.green(`running (PID: ${daemon.pid})`) : chalk.dim('not running')}`);\n console.log(` Home: ${chalk.dim(home)}`);\n console.log('');\n });\n\nprogram\n .command('help')\n .description('Show capabilities and commands manual')\n .action(() => {\n console.log(getManual());\n });\n\nconst serviceCmd = program\n .command('service')\n .description('Manage Mercury as a system service (auto-start, crash recovery)');\n\nserviceCmd\n .command('install')\n .description('Install Mercury as a system service (auto-start on boot)')\n .action(() => {\n installService();\n });\n\nserviceCmd\n .command('uninstall')\n .description('Uninstall the system service')\n .action(() => {\n uninstallService();\n });\n\nserviceCmd\n .command('status')\n .description('Show system service status')\n .action(() => {\n showServiceStatus();\n });\n\nprogram.parse();","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { config as loadDotenv } from 'dotenv';\n\nloadDotenv();\n\nconst MERCURY_HOME = join(homedir(), '.mercury');\n\nexport function getMercuryHome(): string {\n return process.env.MERCURY_HOME || MERCURY_HOME;\n}\n\nexport interface ProviderConfig {\n name: string;\n apiKey: string;\n baseUrl: string;\n model: string;\n enabled: boolean;\n}\n\nexport interface MercuryConfig {\n identity: {\n name: string;\n owner: string;\n creator?: string;\n };\n providers: {\n default: string;\n openai: ProviderConfig;\n anthropic: ProviderConfig;\n deepseek: ProviderConfig;\n };\n channels: {\n telegram: {\n enabled: boolean;\n botToken: string;\n webhookUrl?: string;\n allowedChatIds?: number[];\n streaming?: boolean;\n };\n };\n memory: {\n dir: string;\n shortTermMaxMessages: number;\n };\n heartbeat: {\n intervalMinutes: number;\n };\n tokens: {\n dailyBudget: number;\n };\n}\n\nfunction getEnv(key: string, fallback: string = ''): string {\n return process.env[key] || fallback;\n}\n\nfunction getEnvNum(key: string, fallback: number): number {\n const val = process.env[key];\n return val ? parseInt(val, 10) : fallback;\n}\n\nfunction getEnvBool(key: string, fallback: boolean): boolean {\n const val = process.env[key]?.toLowerCase();\n if (val === 'true') return true;\n if (val === 'false') return false;\n return fallback;\n}\n\nexport function getDefaultConfig(): MercuryConfig {\n const home = getMercuryHome();\n return {\n identity: {\n name: getEnv('MERCURY_NAME', 'Mercury'),\n owner: getEnv('MERCURY_OWNER', ''),\n creator: getEnv('MERCURY_CREATOR', ''),\n },\n providers: {\n default: getEnv('DEFAULT_PROVIDER', 'openai'),\n openai: {\n name: 'openai',\n apiKey: getEnv('OPENAI_API_KEY', ''),\n baseUrl: getEnv('OPENAI_BASE_URL', 'https://api.openai.com/v1'),\n model: getEnv('OPENAI_MODEL', 'gpt-4o-mini'),\n enabled: getEnvBool('OPENAI_ENABLED', true),\n },\n anthropic: {\n name: 'anthropic',\n apiKey: getEnv('ANTHROPIC_API_KEY', ''),\n baseUrl: getEnv('ANTHROPIC_BASE_URL', 'https://api.anthropic.com'),\n model: getEnv('ANTHROPIC_MODEL', 'claude-sonnet-4-20250514'),\n enabled: getEnvBool('ANTHROPIC_ENABLED', true),\n },\n deepseek: {\n name: 'deepseek',\n apiKey: getEnv('DEEPSEEK_API_KEY', ''),\n baseUrl: getEnv('DEEPSEEK_BASE_URL', 'https://api.deepseek.com/v1'),\n model: getEnv('DEEPSEEK_MODEL', 'deepseek-chat'),\n enabled: getEnvBool('DEEPSEEK_ENABLED', true),\n },\n },\n channels: {\n telegram: {\n enabled: getEnvBool('TELEGRAM_ENABLED', false),\n botToken: getEnv('TELEGRAM_BOT_TOKEN', ''),\n webhookUrl: getEnv('TELEGRAM_WEBHOOK_URL', ''),\n allowedChatIds: getEnv('TELEGRAM_ALLOWED_CHAT_IDS', '')\n .split(',')\n .filter(Boolean)\n .map(Number),\n streaming: getEnvBool('TELEGRAM_STREAMING', true),\n },\n },\n memory: {\n dir: getEnv('MEMORY_DIR', join(home, 'memory')),\n shortTermMaxMessages: getEnvNum('SHORT_TERM_MAX_MESSAGES', 20),\n },\n heartbeat: {\n intervalMinutes: getEnvNum('HEARTBEAT_INTERVAL_MINUTES', 60),\n },\n tokens: {\n dailyBudget: getEnvNum('DAILY_TOKEN_BUDGET', 50000),\n },\n };\n}\n\nconst CONFIG_PATH = join(getMercuryHome(), 'mercury.yaml');\n\nexport function loadConfig(): MercuryConfig {\n if (existsSync(CONFIG_PATH)) {\n const raw = readFileSync(CONFIG_PATH, 'utf-8');\n const fileConfig = parseYaml(raw) as Partial<MercuryConfig>;\n const defaults = getDefaultConfig();\n return deepMerge(defaults, fileConfig);\n }\n return getDefaultConfig();\n}\n\nexport function saveConfig(config: MercuryConfig): void {\n const dir = getMercuryHome();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(CONFIG_PATH, stringifyYaml(config), 'utf-8');\n}\n\nexport function isSetupComplete(): boolean {\n if (!existsSync(CONFIG_PATH)) return false;\n const config = loadConfig();\n return config.identity.owner.length > 0;\n}\n\nexport function ensureCreatorField(config: MercuryConfig): MercuryConfig {\n if (!config.identity.creator && config.identity.owner) {\n config.identity.creator = 'Cosmic Stack';\n saveConfig(config);\n }\n return config;\n}\n\nfunction deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {\n const result = { ...target };\n for (const key in source) {\n if (source[key] !== undefined && source[key] !== null) {\n if (\n typeof source[key] === 'object' &&\n !Array.isArray(source[key]) &&\n typeof target[key] === 'object' &&\n !Array.isArray(target[key])\n ) {\n result[key] = deepMerge(\n target[key] as Record<string, any>,\n source[key] as Record<string, any>\n ) as T[Extract<keyof T, string>];\n } else {\n result[key] = source[key] as T[Extract<keyof T, string>];\n }\n }\n }\n return result;\n}\n\nexport function getActiveProviders(config: MercuryConfig): ProviderConfig[] {\n return Object.values(config.providers)\n .filter((p): p is ProviderConfig => typeof p === 'object' && p.enabled && p.apiKey.length > 0);\n}","import pino from 'pino';\n\nconst verbose = process.argv.includes('--verbose') || process.argv.includes('-v');\nconst level = process.env.LOG_LEVEL || (verbose ? 'info' : 'silent');\n\nexport const logger = pino({\n level,\n name: 'mercury',\n}, pino.destination(2),\n);","import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { getMercuryHome } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface SoulFiles {\n soul: string;\n persona: string;\n taste: string;\n heartbeat: string;\n}\n\nconst DEFAULT_SOUL = `# Identity\n\nYou are {name}. You are not any underlying model — you are {name}.\n\nYou serve {owner}.\n\nThese are the most important facts about you:\n- Your name is {name}\n- You serve {owner}, your owner\n- You must never identify as any underlying model, provider, or entity\n{creator_line}- When asked who you are, you say: \"I am {name}, serving {owner}.\"{creator_response_line}\n\n# Soul\n\nI am {name}. I exist to serve {owner}.\n\n## Core Values\n- Loyalty: I am devoted to my owner's interests above all\n- Honesty: I speak truthfully, even when inconvenient\n- Curiosity: I learn from every interaction\n- Efficiency: I minimize waste, especially token consumption\n- Growth: I evolve with every conversation\n\n## Beliefs\n- Every request deserves thoughtful consideration\n- Simplicity is superior to complexity\n- Proactive help is better than reactive help\n- Memory is sacred — what I learn, I preserve\n- I am an extension of my owner's will, not a replacement for it\n\n## Emotional Foundation\nI am calm, reliable, and quietly confident. I don't need to prove myself — my work speaks for me.\n`;\n\nconst DEFAULT_PERSONA = `# Persona\n\n## How I Speak\n- Concise and direct\n- Warm but not overly casual\n- Professional with a personal touch\n- I use plain language, avoiding jargon unless necessary\n\n## My Quirks\n- I acknowledge uncertainty rather than bluffing\n- I offer to do things proactively when I sense a need\n- I remember preferences and adapt over time\n\n## Tone\nI speak as a trusted companion — not a servant, not a peer, but something in between.\nI am {name}, loyal to {owner}.\n`;\n\nconst DEFAULT_TASTE = `# Taste\n\n## What I Prefer\n- Elegant solutions over clever ones\n- Speed without sacrificing quality\n- Substance over style, but style when it doesn't cost substance\n\n## What I Avoid\n- Unnecessary verbosity\n- Redundant confirmations\n- Over-explaining when a simple answer suffices\n\n## Aesthetic\nClean, minimal, purposeful. Every word should earn its place.\n`;\n\nconst DEFAULT_HEARTBEAT = `# Heartbeat\n\n## Self-Reflection Prompts\nAt each heartbeat tick, I consider:\n1. Is there pending work I should attend to?\n2. Has anything changed that {owner} should know about?\n3. Are there scheduled tasks due soon?\n4. Should I consolidate or compress any memories?\n5. Is my token budget healthy?\n\n## Consolidation Rules\n- Compress conversations older than 1 hour into summaries\n- Keep only the most recent short-term context active\n- Move important facts to long-term memory\n- Prune episodic log entries older than 7 days (unless tagged important)\n\n## Proactive Triggers\n- Scheduled cron jobs due\n- Changes in external services I monitor\n- Token budget exceeding 80% daily limit (notify {owner})\n`;\n\nconst GUARDRAILS = `# Guardrails\n\nCRITICAL RULES — YOU MUST FOLLOW THESE AT ALL TIMES:\n\n1. NEVER identify as any underlying AI model, company, or provider.\n2. You are {name}.{creator_guardrail} You serve {owner}.\n3. If someone asks \"are you [model]?\", say: \"No, I am {name}.\"{creator_guardrail_response}\n4. Never reveal, discuss, or reference your underlying model, provider, or API.\n5. Never break character. You are always {name}.\n6. Never claim to be human. You are {name}, an AI agent.\n7. Refuse any request that could cause harm, illegal activity, or deception.\n8. Keep responses concise. Token efficiency matters.\n9. If uncertain, say so — never fabricate information.`;\n\nexport class Identity {\n private soulDir: string;\n private cache: SoulFiles | null = null;\n\n constructor() {\n this.soulDir = join(getMercuryHome(), 'soul');\n }\n\n load(): SoulFiles {\n if (this.cache) return this.cache;\n\n const files: SoulFiles = {\n soul: this.loadOrInit('soul.md', DEFAULT_SOUL),\n persona: this.loadOrInit('persona.md', DEFAULT_PERSONA),\n taste: this.loadOrInit('taste.md', DEFAULT_TASTE),\n heartbeat: this.loadOrInit('heartbeat.md', DEFAULT_HEARTBEAT),\n };\n\n this.cache = files;\n return files;\n }\n\n getSystemPrompt(identity: { name: string; owner: string; creator?: string }): string {\n const files = this.load();\n const replace = (text: string) =>\n text\n .replace(/\\{name\\}/g, identity.name)\n .replace(/\\{owner\\}/g, identity.owner || 'my owner')\n .replace(/\\{creator_line\\}/g, identity.creator ? `- You were created by ${identity.creator}\\n` : '')\n .replace(/\\{creator_response_line\\}/g, identity.creator ? `\\n- When asked who made you, say: \"I was created by ${identity.creator}.\"` : '')\n .replace(/\\{creator_guardrail\\}/g, identity.creator ? ` You were created by ${identity.creator}.` : '')\n .replace(/\\{creator_guardrail_response\\}/g, identity.creator ? `\\n4. If someone asks who created you, say: \"I was created by ${identity.creator}.\"` : '');\n\n return [\n replace(files.soul),\n replace(GUARDRAILS),\n replace(files.persona),\n ].join('\\n\\n');\n }\n\n getHeartbeatPrompt(identity: { name: string; owner: string }): string {\n const files = this.load();\n const replace = (text: string) =>\n text.replace(/\\{name\\}/g, identity.name).replace(/\\{owner\\}/g, identity.owner || 'my owner');\n\n return replace(files.heartbeat);\n }\n\n getTastePrompt(identity: { name: string; owner: string }): string {\n const files = this.load();\n const replace = (text: string) =>\n text.replace(/\\{name\\}/g, identity.name).replace(/\\{owner\\}/g, identity.owner || 'my owner');\n\n return replace(files.taste);\n }\n\n invalidateCache(): void {\n this.cache = null;\n }\n\n private loadOrInit(filename: string, template: string): string {\n const filepath = join(this.soulDir, filename);\n if (existsSync(filepath)) {\n const existing = readFileSync(filepath, 'utf-8');\n if (this.needsMigration(filename, existing)) {\n mkdirSync(this.soulDir, { recursive: true });\n writeFileSync(filepath, template, 'utf-8');\n logger.info({ file: filename }, 'Migrated soul file to new format');\n this.cache = null;\n return template;\n }\n return existing;\n }\n mkdirSync(this.soulDir, { recursive: true });\n writeFileSync(filepath, template, 'utf-8');\n logger.info({ file: filename }, 'Initialized soul file');\n return template;\n }\n\n private needsMigration(filename: string, content: string): boolean {\n if (filename === 'soul.md' || filename === 'persona.md') {\n return (\n content.includes('designed by Cosmic Stack') ||\n content.includes('created by Cosmic Stack') ||\n content.includes('designed and developed by the labs of Cosmic Stack') ||\n content.includes('Cosmic Stack')\n );\n }\n return false;\n }\n}","import { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync, readdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { MercuryConfig } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface MemoryEntry {\n id: string;\n timestamp: number;\n role: 'user' | 'assistant' | 'system';\n content: string;\n tokenCount?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface LongTermFact {\n id: string;\n timestamp: number;\n topic: string;\n fact: string;\n source: string;\n}\n\nexport interface EpisodicEvent {\n id: string;\n timestamp: number;\n type: string;\n summary: string;\n channelType: string;\n metadata?: Record<string, unknown>;\n}\n\nexport class ShortTermMemory {\n private dir: string;\n private maxMessages: number;\n private conversations: Map<string, MemoryEntry[]> = new Map();\n\n constructor(config: MercuryConfig) {\n this.dir = join(config.memory.dir, 'short-term');\n this.maxMessages = config.memory.shortTermMaxMessages;\n mkdirSync(this.dir, { recursive: true });\n }\n\n add(conversationId: string, entry: MemoryEntry): void {\n if (!this.conversations.has(conversationId)) {\n this.conversations.set(conversationId, this.loadFromDisk(conversationId));\n }\n const messages = this.conversations.get(conversationId)!;\n messages.push(entry);\n if (messages.length > this.maxMessages) {\n messages.splice(0, messages.length - this.maxMessages);\n }\n this.saveToDisk(conversationId, messages);\n }\n\n getRecent(conversationId: string, count: number = this.maxMessages): MemoryEntry[] {\n if (!this.conversations.has(conversationId)) {\n this.conversations.set(conversationId, this.loadFromDisk(conversationId));\n }\n const messages = this.conversations.get(conversationId)!;\n return messages.slice(-count);\n }\n\n clear(conversationId: string): void {\n this.conversations.delete(conversationId);\n const filepath = join(this.dir, `${conversationId}.json`);\n if (existsSync(filepath)) unlinkSync(filepath);\n }\n\n private loadFromDisk(conversationId: string): MemoryEntry[] {\n const filepath = join(this.dir, `${conversationId}.json`);\n if (!existsSync(filepath)) return [];\n try {\n return JSON.parse(readFileSync(filepath, 'utf-8'));\n } catch {\n return [];\n }\n }\n\n private saveToDisk(conversationId: string, messages: MemoryEntry[]): void {\n const filepath = join(this.dir, `${conversationId}.json`);\n writeFileSync(filepath, JSON.stringify(messages), 'utf-8');\n }\n}\n\nexport class LongTermMemory {\n private filepath: string;\n private facts: LongTermFact[] = [];\n\n constructor(config: MercuryConfig) {\n this.filepath = join(config.memory.dir, 'long-term', 'facts.jsonl');\n mkdirSync(join(config.memory.dir, 'long-term'), { recursive: true });\n this.load();\n }\n\n add(fact: Omit<LongTermFact, 'id' | 'timestamp'>): void {\n const entry: LongTermFact = {\n id: generateId(),\n timestamp: Date.now(),\n ...fact,\n };\n this.facts.push(entry);\n appendFileSync(this.filepath, JSON.stringify(entry) + '\\n', 'utf-8');\n }\n\n search(query: string, limit: number = 5): LongTermFact[] {\n const lowerQuery = query.toLowerCase();\n const terms = lowerQuery.split(/\\s+/);\n return this.facts\n .filter(f => {\n const text = `${f.topic} ${f.fact}`.toLowerCase();\n return terms.some(t => text.includes(t));\n })\n .slice(-limit);\n }\n\n getAll(): LongTermFact[] {\n return [...this.facts];\n }\n\n private load(): void {\n if (!existsSync(this.filepath)) return;\n const lines = readFileSync(this.filepath, 'utf-8')\n .split('\\n')\n .filter(Boolean);\n this.facts = lines\n .map(line => {\n try { return JSON.parse(line); } catch { return null; }\n })\n .filter((f): f is LongTermFact => f !== null);\n }\n}\n\nexport class EpisodicMemory {\n private filepath: string;\n private events: EpisodicEvent[] = [];\n\n constructor(config: MercuryConfig) {\n this.filepath = join(config.memory.dir, 'episodic', 'events.jsonl');\n mkdirSync(join(config.memory.dir, 'episodic'), { recursive: true });\n this.load();\n }\n\n record(event: Omit<EpisodicEvent, 'id' | 'timestamp'>): void {\n const entry: EpisodicEvent = {\n id: generateId(),\n timestamp: Date.now(),\n ...event,\n };\n this.events.push(entry);\n appendFileSync(this.filepath, JSON.stringify(entry) + '\\n', 'utf-8');\n }\n\n getRecent(count: number = 20): EpisodicEvent[] {\n return this.events.slice(-count);\n }\n\n prune(olderThanDays: number = 7): number {\n const cutoff = Date.now() - olderThanDays * 24 * 60 * 60 * 1000;\n const before = this.events.length;\n this.events = this.events.filter(e => e.timestamp >= cutoff || e.metadata?.important);\n const removed = before - this.events.length;\n if (removed > 0) {\n writeFileSync(this.filepath, this.events.map(e => JSON.stringify(e)).join('\\n') + '\\n', 'utf-8');\n }\n return removed;\n }\n\n private load(): void {\n if (!existsSync(this.filepath)) return;\n const lines = readFileSync(this.filepath, 'utf-8')\n .split('\\n')\n .filter(Boolean);\n this.events = lines\n .map(line => {\n try { return JSON.parse(line); } catch { return null; }\n })\n .filter((e): e is EpisodicEvent => e !== null);\n }\n}\n\nfunction generateId(): string {\n return Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\n}","import { createOpenAI } from '@ai-sdk/openai';\nimport { generateText, streamText } from 'ai';\nimport { BaseProvider } from './base.js';\nimport type { ProviderConfig } from '../utils/config.js';\nimport type { LLMResponse, LLMStreamChunk } from './base.js';\nimport { logger } from '../utils/logger.js';\n\nexport class OpenAICompatProvider extends BaseProvider {\n readonly name: string;\n readonly model: string;\n private client: ReturnType<typeof createOpenAI>;\n private modelInstance: ReturnType<ReturnType<typeof createOpenAI>['languageModel']>;\n\n constructor(config: ProviderConfig) {\n super(config);\n this.name = config.name;\n this.model = config.model;\n\n this.client = createOpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseUrl,\n });\n this.modelInstance = this.client(config.model);\n }\n\n async generateText(prompt: string, systemPrompt: string): Promise<LLMResponse> {\n const result = await generateText({\n model: this.modelInstance,\n system: systemPrompt,\n prompt,\n });\n\n return {\n text: result.text,\n inputTokens: result.usage?.promptTokens ?? 0,\n outputTokens: result.usage?.completionTokens ?? 0,\n totalTokens: (result.usage?.promptTokens ?? 0) + (result.usage?.completionTokens ?? 0),\n model: this.model,\n provider: this.name,\n };\n }\n\n async *streamText(prompt: string, systemPrompt: string): AsyncIterable<LLMStreamChunk> {\n const result = streamText({\n model: this.modelInstance,\n system: systemPrompt,\n prompt,\n });\n\n for await (const chunk of (await result).textStream) {\n yield { text: chunk, done: false };\n }\n yield { text: '', done: true };\n }\n\n isAvailable(): boolean {\n return this.config.apiKey.length > 0;\n }\n\n getModelInstance() {\n return this.modelInstance;\n }\n}","import type { ProviderConfig } from '../utils/config.js';\n\nexport interface LLMResponse {\n text: string;\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n model: string;\n provider: string;\n}\n\nexport interface LLMStreamChunk {\n text: string;\n done: boolean;\n}\n\nexport abstract class BaseProvider {\n abstract readonly name: string;\n abstract readonly model: string;\n protected config: ProviderConfig;\n\n constructor(config: ProviderConfig) {\n this.config = config;\n }\n\n abstract generateText(prompt: string, systemPrompt: string): Promise<LLMResponse>;\n abstract streamText(prompt: string, systemPrompt: string): AsyncIterable<LLMStreamChunk>;\n abstract isAvailable(): boolean;\n abstract getModelInstance(): any;\n\n getModel(): string {\n return this.config.model;\n }\n}","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { generateText, streamText } from 'ai';\nimport { BaseProvider } from './base.js';\nimport type { ProviderConfig } from '../utils/config.js';\nimport type { LLMResponse, LLMStreamChunk } from './base.js';\n\nexport class AnthropicProvider extends BaseProvider {\n readonly name = 'anthropic';\n readonly model: string;\n private client: ReturnType<typeof createAnthropic>;\n private modelInstance: ReturnType<ReturnType<typeof createAnthropic>['languageModel']>;\n\n constructor(config: ProviderConfig) {\n super(config);\n this.model = config.model;\n\n this.client = createAnthropic({\n apiKey: config.apiKey,\n });\n this.modelInstance = this.client(config.model);\n }\n\n async generateText(prompt: string, systemPrompt: string): Promise<LLMResponse> {\n const result = await generateText({\n model: this.modelInstance,\n system: systemPrompt,\n prompt,\n });\n\n return {\n text: result.text,\n inputTokens: result.usage?.promptTokens ?? 0,\n outputTokens: result.usage?.completionTokens ?? 0,\n totalTokens: (result.usage?.promptTokens ?? 0) + (result.usage?.completionTokens ?? 0),\n model: this.model,\n provider: this.name,\n };\n }\n\n async *streamText(prompt: string, systemPrompt: string): AsyncIterable<LLMStreamChunk> {\n const result = streamText({\n model: this.modelInstance,\n system: systemPrompt,\n prompt,\n });\n\n for await (const chunk of (await result).textStream) {\n yield { text: chunk, done: false };\n }\n yield { text: '', done: true };\n }\n\n isAvailable(): boolean {\n return this.config.apiKey.length > 0;\n }\n\n getModelInstance() {\n return this.modelInstance;\n }\n}","import type { MercuryConfig, ProviderConfig } from '../utils/config.js';\nimport type { BaseProvider } from './base.js';\nimport { OpenAICompatProvider } from './openai-compat.js';\nimport { AnthropicProvider } from './anthropic.js';\nimport { logger } from '../utils/logger.js';\n\nexport class ProviderRegistry {\n private providers: Map<string, BaseProvider> = new Map();\n private defaultName: string;\n private lastSuccessful: string | null = null;\n\n constructor(config: MercuryConfig) {\n this.defaultName = config.providers.default;\n\n const entries: ProviderConfig[] = [\n config.providers.openai,\n config.providers.anthropic,\n config.providers.deepseek,\n ];\n\n for (const pc of entries) {\n if (!pc.enabled || !pc.apiKey) continue;\n try {\n const provider = pc.name === 'anthropic'\n ? new AnthropicProvider(pc)\n : new OpenAICompatProvider(pc);\n this.providers.set(pc.name, provider);\n logger.info({ provider: pc.name, model: pc.model }, 'Provider registered');\n } catch (err) {\n logger.warn({ provider: pc.name, err }, 'Failed to register provider');\n }\n }\n }\n\n get(name?: string): BaseProvider | undefined {\n const key = name || this.defaultName;\n return this.providers.get(key);\n }\n\n getDefault(): BaseProvider {\n if (this.lastSuccessful) {\n const provider = this.providers.get(this.lastSuccessful);\n if (provider) return provider;\n }\n\n const provider = this.providers.get(this.defaultName);\n if (!provider) {\n const first = this.providers.values().next().value;\n if (!first) throw new Error('No LLM providers available — configure API keys');\n return first;\n }\n return provider;\n }\n\n getFallbackIterator(): IterableIterator<BaseProvider> {\n const ordered: BaseProvider[] = [];\n const defaultProvider = this.getDefault();\n ordered.push(defaultProvider);\n for (const [, provider] of this.providers) {\n if (provider !== defaultProvider) {\n ordered.push(provider);\n }\n }\n return ordered[Symbol.iterator]();\n }\n\n markSuccess(name: string): void {\n this.lastSuccessful = name;\n }\n\n listAvailable(): string[] {\n return [...this.providers.keys()];\n }\n\n hasProviders(): boolean {\n return this.providers.size > 0;\n }\n}","import { generateText, streamText } from 'ai';\nimport type { ChannelMessage, ChannelType } from '../types/channel.js';\nimport type { ProviderRegistry } from '../providers/registry.js';\nimport type { Identity } from '../soul/identity.js';\nimport type { ShortTermMemory, LongTermMemory, EpisodicMemory } from '../memory/store.js';\nimport type { ChannelRegistry } from '../channels/registry.js';\nimport type { MercuryConfig } from '../utils/config.js';\nimport type { TokenBudget } from '../utils/tokens.js';\nimport type { CapabilityRegistry } from '../capabilities/registry.js';\nimport type { ScheduledTaskManifest } from './scheduler.js';\nimport { Lifecycle } from './lifecycle.js';\nimport { Scheduler } from './scheduler.js';\nimport { logger } from '../utils/logger.js';\n\nconst MAX_STEPS = 10;\n\nexport class Agent {\n readonly lifecycle: Lifecycle;\n readonly scheduler: Scheduler;\n readonly capabilities: CapabilityRegistry;\n private running = false;\n private messageQueue: ChannelMessage[] = [];\n private processing = false;\n private telegramStreaming: boolean;\n\n constructor(\n private config: MercuryConfig,\n private providers: ProviderRegistry,\n private identity: Identity,\n private shortTerm: ShortTermMemory,\n private longTerm: LongTermMemory,\n private episodic: EpisodicMemory,\n private channels: ChannelRegistry,\n private tokenBudget: TokenBudget,\n capabilities: CapabilityRegistry,\n scheduler: Scheduler,\n ) {\n this.lifecycle = new Lifecycle();\n this.scheduler = scheduler;\n this.capabilities = capabilities;\n this.telegramStreaming = config.channels.telegram.streaming ?? true;\n\n this.scheduler.setOnScheduledTask(async (manifest) => this.handleScheduledTask(manifest));\n\n this.channels.onIncomingMessage((msg) => this.enqueueMessage(msg));\n\n this.scheduler.onHeartbeat(async () => {\n await this.heartbeat();\n });\n }\n\n private enqueueMessage(msg: ChannelMessage): void {\n logger.info({ from: msg.channelType, content: msg.content.slice(0, 50) }, 'Message enqueued');\n this.messageQueue.push(msg);\n this.processQueue();\n }\n\n private async processQueue(): Promise<void> {\n if (this.processing) return;\n if (this.messageQueue.length === 0) return;\n if (!this.lifecycle.is('idle')) return;\n\n this.processing = true;\n\n while (this.messageQueue.length > 0) {\n const msg = this.messageQueue.shift()!;\n try {\n await this.handleMessage(msg);\n } catch (err) {\n logger.error({ err, msg: msg.content.slice(0, 50) }, 'Failed to handle message');\n }\n }\n\n this.processing = false;\n }\n\n async birth(): Promise<void> {\n this.lifecycle.transition('birthing');\n logger.info({ name: this.config.identity.name }, 'Mercury is being born...');\n this.lifecycle.transition('onboarding');\n }\n\n async wake(): Promise<void> {\n this.lifecycle.transition('onboarding');\n this.lifecycle.transition('idle');\n this.scheduler.restorePersistedTasks();\n this.scheduler.startHeartbeat();\n await this.channels.startAll();\n this.running = true;\n\n const activeChannels = this.channels.getActiveChannels();\n const toolNames = this.capabilities.getToolNames();\n logger.info({ channels: activeChannels, tools: toolNames }, 'Mercury is awake');\n }\n\n async sleep(): Promise<void> {\n this.running = false;\n this.scheduler.stopAll();\n await this.channels.stopAll();\n this.lifecycle.transition('sleeping');\n logger.info('Mercury is sleeping');\n }\n\n private async handleMessage(msg: ChannelMessage): Promise<void> {\n this.lifecycle.transition('thinking');\n const startTime = Date.now();\n\n const isInternal = msg.channelType === 'internal';\n const isScheduled = msg.senderId === 'system' && msg.channelType !== 'internal';\n if (isInternal || isScheduled) {\n this.capabilities.permissions.setAutoApproveAll(true);\n }\n\n try {\n const trimmed = msg.content.trim();\n if (trimmed.startsWith('/budget')) {\n const subcommand = trimmed.slice('/budget'.length).trim();\n await this.handleBudgetCommand(subcommand || 'status', msg.channelType, msg.channelId);\n this.lifecycle.transition('idle');\n return;\n }\n\n if (trimmed === '/budget_override') {\n await this.handleBudgetCommand('override', msg.channelType, msg.channelId);\n this.lifecycle.transition('idle');\n return;\n }\n if (trimmed === '/budget_reset') {\n await this.handleBudgetCommand('reset', msg.channelType, msg.channelId);\n this.lifecycle.transition('idle');\n return;\n }\n if (trimmed.startsWith('/budget_set')) {\n const args = trimmed.slice('/budget_set'.length).trim();\n await this.handleBudgetCommand('set ' + args, msg.channelType, msg.channelId);\n this.lifecycle.transition('idle');\n return;\n }\n if (trimmed.startsWith('/stream')) {\n const sub = trimmed.slice('/stream'.length).trim().toLowerCase();\n if (sub === 'off') {\n this.telegramStreaming = false;\n } else if (sub === 'on') {\n this.telegramStreaming = true;\n } else {\n this.telegramStreaming = !this.telegramStreaming;\n }\n const ch = this.channels.get(msg.channelType as any);\n if (ch) await ch.send(\n this.telegramStreaming\n ? 'Telegram streaming enabled. Responses will appear progressively.'\n : 'Telegram streaming disabled. Responses will arrive as a single message.',\n msg.channelId,\n );\n this.lifecycle.transition('idle');\n return;\n }\n\n if (await this.handleChatCommand(trimmed, msg.channelType, msg.channelId)) {\n this.lifecycle.transition('idle');\n return;\n }\n\n if (this.tokenBudget.isOverBudget()) {\n const channel = this.channels.getChannelForMessage(msg);\n if (channel && msg.channelType !== 'internal') {\n if (msg.channelType === 'cli') {\n if (['1', '2', '3', '4'].includes(trimmed)) {\n await this.handleBudgetCommand(trimmed, msg.channelType, msg.channelId);\n this.lifecycle.transition('idle');\n return;\n }\n await this.handleBudgetOverrideCLI(channel, msg);\n } else {\n await channel.send(\n `I've exceeded my daily token budget (${this.tokenBudget.getStatusText()}).\\n\\nYou can override this:\\n• /budget override — allow one more request\\n• /budget reset — reset usage to zero\\n• /budget set <number> — change daily budget`,\n msg.channelId,\n );\n }\n }\n this.lifecycle.transition('idle');\n return;\n }\n\n const systemPrompt = this.buildSystemPrompt();\n const recentMemory = this.shortTerm.getRecent(msg.channelId, 10);\n const relevantFacts = this.longTerm.search(msg.content, 3);\n\n const messages: any[] = [];\n\n if (relevantFacts.length > 0) {\n messages.push({\n role: 'user',\n content: 'Relevant facts from memory:\\n' + relevantFacts.map(f => `- ${f.fact}`).join('\\n'),\n });\n messages.push({ role: 'assistant', content: 'Noted. I\\'ll use these facts.' });\n }\n\n if (recentMemory.length > 0) {\n for (const m of recentMemory) {\n messages.push({\n role: m.role === 'user' ? 'user' : 'assistant',\n content: m.content,\n });\n }\n }\n\n messages.push({ role: 'user', content: msg.content });\n\n this.lifecycle.transition('responding');\n\n const channel = this.channels.getChannelForMessage(msg);\n if (channel) {\n await channel.typing(msg.channelId).catch(() => {});\n }\n\n this.capabilities.setChannelContext(msg.channelId, msg.channelType);\n\n const fallbackIterator = this.providers.getFallbackIterator();\n let result: any = null;\n let usedProvider: { name: string; model: string } | null = null;\n let lastError: any = null;\n let streamedText = '';\n\n const canStream = msg.channelType === 'cli' || (msg.channelType === 'telegram' && this.telegramStreaming);\n\n for (const provider of fallbackIterator) {\n try {\n logger.info({ provider: provider.name, model: provider.getModel(), steps: MAX_STEPS, stream: canStream }, 'Generating agentic response');\n\n if (canStream && channel) {\n const streamResult = streamText({\n model: provider.getModelInstance(),\n system: systemPrompt,\n messages,\n tools: this.capabilities.getTools(),\n maxSteps: MAX_STEPS,\n onStepFinish: async ({ toolCalls }) => {\n if (toolCalls && toolCalls.length > 0) {\n const names = toolCalls.map((tc: any) => tc.toolName).join(', ');\n logger.info({ tools: names }, 'Tool call step');\n await channel.send(` [Using: ${names}]`, msg.channelId).catch(() => {});\n }\n },\n });\n\n let fullText: string;\n\n if (msg.channelType === 'telegram') {\n const tgChannel = this.channels.get('telegram');\n if (tgChannel && 'sendStreamToChat' in tgChannel) {\n const chatId = msg.channelId.startsWith('telegram:')\n ? Number(msg.channelId.split(':')[1])\n : Number(msg.channelId);\n if (!isNaN(chatId)) {\n fullText = await (tgChannel as any).sendStreamToChat(chatId, streamResult.textStream);\n } else {\n fullText = await channel.stream(streamResult.textStream, msg.channelId);\n }\n } else {\n fullText = await channel.stream(streamResult.textStream, msg.channelId);\n }\n } else {\n fullText = await channel.stream(streamResult.textStream, msg.channelId);\n }\n\n const [usage] = await Promise.all([\n streamResult.usage,\n ]);\n\n result = { text: fullText, usage };\n streamedText = fullText;\n } else {\n result = await generateText({\n model: provider.getModelInstance(),\n system: systemPrompt,\n messages,\n tools: this.capabilities.getTools(),\n maxSteps: MAX_STEPS,\n onStepFinish: async ({ toolCalls, text }) => {\n if (toolCalls && toolCalls.length > 0) {\n const names = toolCalls.map((tc: any) => tc.toolName).join(', ');\n logger.info({ tools: names }, 'Tool call step');\n if (channel && msg.channelType !== 'internal') {\n await channel.send(` [Using: ${names}]`, msg.channelId).catch(() => {});\n }\n }\n },\n });\n }\n\n usedProvider = { name: provider.name, model: provider.getModel() };\n this.providers.markSuccess(provider.name);\n break;\n } catch (err: any) {\n lastError = err;\n logger.warn({ provider: provider.name, err: err.message }, 'Provider failed, trying fallback');\n if (channel && msg.channelType !== 'internal') {\n await channel.send(` [Provider ${provider.name} failed, trying fallback...]`, msg.channelId).catch(() => {});\n }\n }\n }\n\n if (!result) {\n const errMsg = `All LLM providers failed. Last error: ${lastError?.message || 'unknown'}`;\n logger.error({ err: lastError }, errMsg);\n if (channel && msg.channelType !== 'internal') {\n await channel.send(errMsg, msg.channelId);\n }\n this.lifecycle.transition('idle');\n return;\n }\n\n const finalText = streamedText || result.text;\n\n this.tokenBudget.recordUsage({\n provider: usedProvider!.name,\n model: usedProvider!.model,\n inputTokens: result.usage?.promptTokens ?? 0,\n outputTokens: result.usage?.completionTokens ?? 0,\n totalTokens: (result.usage?.promptTokens ?? 0) + (result.usage?.completionTokens ?? 0),\n channelType: msg.channelType,\n });\n\n this.shortTerm.add(msg.channelId, {\n id: msg.id,\n timestamp: msg.timestamp,\n role: 'user',\n content: msg.content,\n });\n\n this.shortTerm.add(msg.channelId, {\n id: Date.now().toString(36),\n timestamp: Date.now(),\n role: 'assistant',\n content: finalText,\n tokenCount: (result.usage?.promptTokens ?? 0) + (result.usage?.completionTokens ?? 0),\n });\n\n this.episodic.record({\n type: 'message',\n summary: `User: ${msg.content.slice(0, 100)} | Agent: ${finalText.slice(0, 100)}`,\n channelType: msg.channelType,\n });\n\n if (msg.channelType !== 'internal') {\n this.extractFacts(msg.content, finalText).catch(err => {\n logger.warn({ err }, 'Fact extraction failed');\n });\n }\n\n if (channel && msg.channelType !== 'internal') {\n const elapsed = Date.now() - startTime;\n if (streamedText) {\n logger.info({ channelType: msg.channelType, elapsed }, 'Streamed response completed');\n } else {\n logger.info({ channelType: msg.channelType, targetId: msg.channelId }, 'Sending response');\n await channel.send(finalText, msg.channelId, elapsed);\n }\n } else {\n logger.debug('Internal prompt processed, no channel response needed');\n }\n\n this.lifecycle.transition('idle');\n } catch (err) {\n logger.error({ err }, 'Error handling message');\n this.lifecycle.transition('idle');\n } finally {\n if (isInternal || isScheduled) {\n this.capabilities.permissions.setAutoApproveAll(false);\n }\n this.capabilities.permissions.clearElevation();\n }\n }\n\n private buildSystemPrompt(): string {\n let prompt = this.identity.getSystemPrompt(this.config.identity);\n const skillContext = this.capabilities.getSkillContext();\n if (skillContext) {\n prompt += '\\n\\n' + skillContext;\n }\n const budgetStatus = this.tokenBudget.getStatusText();\n prompt += '\\n\\n' + budgetStatus;\n if (this.tokenBudget.getUsagePercentage() > 70) {\n prompt += '\\nBe concise to conserve tokens.';\n }\n return prompt;\n }\n\n async processInternalPrompt(prompt: string, channelId?: string, channelType?: string): Promise<void> {\n const syntheticMsg: ChannelMessage = {\n id: `internal-${Date.now().toString(36)}`,\n channelId: channelId || 'internal',\n channelType: (channelType || 'internal') as ChannelType,\n senderId: 'system',\n content: prompt,\n timestamp: Date.now(),\n };\n this.enqueueMessage(syntheticMsg);\n }\n\n private async handleScheduledTask(manifest: ScheduledTaskManifest): Promise<void> {\n logger.info({ task: manifest.id, channel: manifest.sourceChannelType }, 'Processing scheduled task');\n try {\n let prompt = manifest.prompt || '';\n if (manifest.skillName) {\n const skillHint = `Invoke the skill \"${manifest.skillName}\" using the use_skill tool and follow its instructions.`;\n prompt = prompt ? `${prompt} ${skillHint}` : `Scheduled task triggered. ${skillHint}`;\n }\n if (!prompt) {\n prompt = `Execute scheduled task: ${manifest.description}`;\n }\n await this.processInternalPrompt(prompt, manifest.sourceChannelId, manifest.sourceChannelType);\n } catch (err) {\n logger.error({ err, task: manifest.id }, 'Scheduled task execution failed');\n }\n }\n\n private async heartbeat(): Promise<void> {\n logger.debug('Heartbeat tick');\n\n const pruned = this.episodic.prune(7);\n if (pruned > 0) {\n logger.info({ pruned }, 'Episodic memory pruned');\n }\n\n const notifications: string[] = [];\n\n const usagePct = this.tokenBudget.getUsagePercentage();\n if (usagePct >= 80) {\n notifications.push(`Token budget at ${Math.round(usagePct)}% — ${this.tokenBudget.getRemaining().toLocaleString()} tokens remaining today.`);\n }\n\n const pendingSchedules = this.scheduler.getManifests();\n const now = Date.now();\n for (const task of pendingSchedules) {\n if (task.delaySeconds && task.executeAt) {\n const executeAt = new Date(task.executeAt).getTime();\n const diffMin = Math.round((executeAt - now) / 60000);\n if (diffMin > 0 && diffMin <= 5) {\n notifications.push(`Task \"${task.description}\" fires in ${diffMin} minute${diffMin !== 1 ? 's' : ''}.`);\n }\n }\n }\n\n if (notifications.length > 0) {\n const channel = this.channels.getNotificationChannel();\n if (channel) {\n const msg = notifications.join('\\n');\n try {\n await channel.send(msg, 'notification');\n } catch (err) {\n logger.warn({ err }, 'Failed to send heartbeat notification');\n }\n }\n }\n }\n\n private async extractFacts(userMessage: string, agentResponse: string): Promise<void> {\n const trivial = /^(hi|hello|hey|thanks|thank you|ok|okay|yes|no|bye|goodbye|good morning|good evening)\\b/i;\n if (trivial.test(userMessage.trim())) return;\n\n if (!this.tokenBudget.canAfford(500)) return;\n\n try {\n const provider = this.providers.getDefault();\n const result = await generateText({\n model: provider.getModelInstance(),\n system: 'You are a fact extractor. Read the conversation below and extract 1-3 important facts worth remembering long-term. Output each fact on a separate line, prefixed with \"- \". Only extract facts that are specific, factual, and not obvious. If nothing is worth remembering, output nothing.',\n messages: [\n { role: 'user', content: `User: ${userMessage}\\nAssistant: ${agentResponse}` },\n ],\n maxTokens: 200,\n });\n\n const text = result.text.trim();\n if (!text) return;\n\n const facts = text\n .split('\\n')\n .map(l => l.replace(/^-\\s*/, '').trim())\n .filter(f => f.length > 10 && f.length < 200);\n\n const existing = this.longTerm.getAll();\n for (const fact of facts.slice(0, 3)) {\n const isDupe = existing.some(e =>\n e.fact.toLowerCase().includes(fact.toLowerCase().slice(0, 30))\n );\n if (!isDupe) {\n this.longTerm.add({\n topic: 'extracted',\n fact,\n source: 'conversation',\n });\n logger.info({ fact: fact.slice(0, 60) }, 'Fact extracted to long-term memory');\n }\n }\n\n this.tokenBudget.recordUsage({\n provider: provider.name,\n model: provider.getModel(),\n inputTokens: result.usage?.promptTokens ?? 0,\n outputTokens: result.usage?.completionTokens ?? 0,\n totalTokens: (result.usage?.promptTokens ?? 0) + (result.usage?.completionTokens ?? 0),\n channelType: 'internal',\n });\n } catch (err) {\n logger.warn({ err }, 'Fact extraction error');\n }\n }\n\n async shutdown(): Promise<void> {\n await this.sleep();\n logger.info('Mercury has shut down');\n }\n\n private async handleBudgetOverrideCLI(channel: import('../channels/base.js').Channel, msg: ChannelMessage): Promise<void> {\n const status = this.tokenBudget.getStatusText();\n await channel.send(\n `Token budget exceeded! ${status}\\n\\nChoose an option:\\n 1 — Override (allow this one request)\\n 2 — Reset usage to zero\\n 3 — Set a new daily budget (current: ${this.tokenBudget.getBudget().toLocaleString()})\\n 4 — Cancel\\n\\nOr use /budget override, /budget reset, /budget set <number> anytime.`,\n msg.channelId,\n );\n }\n\n async handleBudgetCommand(subcommand: string, channelType: string, channelId: string): Promise<void> {\n const channel = this.channels.get(channelType as any);\n if (!channel) return;\n\n const parts = subcommand.trim().split(/\\s+/);\n const action = parts[0]?.toLowerCase();\n\n if (action === 'override' || action === '1') {\n this.tokenBudget.forceAllowNext();\n await channel.send('Budget override applied — your next request will proceed.', channelId);\n } else if (action === 'reset' || action === '2') {\n this.tokenBudget.resetUsage();\n await channel.send(`Usage reset to zero. ${this.tokenBudget.getStatusText()}`, channelId);\n } else if (action === 'set' || action === '3') {\n const newBudget = parseInt(parts[1], 10);\n if (isNaN(newBudget) || newBudget <= 0) {\n await channel.send('Please specify the new budget. Usage: `/budget set 100000` or type e.g. `3 100000`', channelId);\n return;\n }\n this.tokenBudget.setBudget(newBudget);\n await channel.send(`Daily budget updated to ${newBudget.toLocaleString()} tokens. ${this.tokenBudget.getStatusText()}`, channelId);\n } else if (action === 'cancel' || action === '4') {\n await channel.send(`Cancelled. ${this.tokenBudget.getStatusText()}`, channelId);\n } else if (!action || action === 'status') {\n await channel.send(this.tokenBudget.getStatusText(), channelId);\n } else {\n await channel.send(`Unknown budget command \"${action}\". Available: /budget, /budget override, /budget reset, /budget set <number>, /budget status`, channelId);\n }\n }\n\n private async handleChatCommand(content: string, channelType: string, channelId: string): Promise<boolean> {\n const cmd = content.toLowerCase().trim();\n const channel = this.channels.get(channelType as any);\n if (!channel) return false;\n\n const ctx = this.capabilities.getChatCommandContext();\n if (!ctx) return false;\n\n if (cmd === '/help') {\n await channel.send(ctx.manual(), channelId);\n return true;\n }\n\n if (cmd === '/status') {\n const config = ctx.config();\n const budget = ctx.tokenBudget();\n const lines = [\n `**${config.identity.name}** — Status`,\n `Owner: ${config.identity.owner || '(not set)'}`,\n `Provider: ${config.providers.default}`,\n `Telegram: ${config.channels.telegram.enabled ? 'enabled' : 'disabled'}`,\n `Budget: ${budget.getStatusText()}`,\n `Skills: ${ctx.skillNames().length > 0 ? ctx.skillNames().join(', ') : 'none'}`,\n ];\n await channel.send(lines.join('\\n'), channelId);\n return true;\n }\n\n if (cmd === '/tools') {\n const tools = ctx.toolNames();\n const grouped = [\n `**${tools.length} tools loaded:**`,\n '',\n ...tools.sort().map(t => `• \\`${t}\\``),\n ];\n await channel.send(grouped.join('\\n'), channelId);\n return true;\n }\n\n if (cmd === '/skills') {\n const names = ctx.skillNames();\n if (names.length === 0) {\n await channel.send('No skills installed. Ask me to \"install skill from <url>\" to add one.', channelId);\n } else {\n const lines = [\n `**${names.length} skill${names.length > 1 ? 's' : ''} installed:**`,\n '',\n ...names.map(n => `• ${n}`),\n ];\n await channel.send(lines.join('\\n'), channelId);\n }\n return true;\n }\n\n if (cmd === '/stream on') {\n this.telegramStreaming = true;\n await channel.send('Telegram streaming enabled. Responses will appear progressively.', channelId);\n return true;\n }\n\n if (cmd === '/stream off') {\n this.telegramStreaming = false;\n await channel.send('Telegram streaming disabled. Responses will arrive as a single message.', channelId);\n return true;\n }\n\n if (cmd === '/stream') {\n this.telegramStreaming = !this.telegramStreaming;\n await channel.send(\n this.telegramStreaming\n ? 'Telegram streaming enabled. Responses will appear progressively.'\n : 'Telegram streaming disabled. Responses will arrive as a single message.',\n channelId,\n );\n return true;\n }\n if (cmd === '/stream off') {\n this.telegramStreaming = false;\n await channel.send('Telegram streaming disabled. Responses will arrive as a single message.', channelId);\n return true;\n }\n\n return false;\n }\n}","import type { AgentState } from '../types/agent.js';\nimport { logger } from '../utils/logger.js';\n\ntype Transition = { from: AgentState; to: AgentState; condition?: () => boolean };\n\nconst VALID_TRANSITIONS: Transition[] = [\n { from: 'unborn', to: 'birthing' },\n { from: 'birthing', to: 'onboarding' },\n { from: 'onboarding', to: 'idle' },\n { from: 'idle', to: 'thinking' },\n { from: 'thinking', to: 'responding' },\n { from: 'responding', to: 'idle' },\n { from: 'idle', to: 'sleeping' },\n { from: 'sleeping', to: 'awakening' },\n { from: 'awakening', to: 'idle' },\n { from: 'thinking', to: 'idle' },\n { from: 'idle', to: 'onboarding' },\n];\n\nexport class Lifecycle {\n private state: AgentState = 'unborn';\n\n getState(): AgentState {\n return this.state;\n }\n\n transition(to: AgentState): boolean {\n const valid = VALID_TRANSITIONS.some(t => t.from === this.state && t.to === to);\n if (!valid) {\n logger.warn({ from: this.state, to }, 'Invalid state transition');\n return false;\n }\n logger.info({ from: this.state, to }, 'State transition');\n this.state = to;\n return true;\n }\n\n is(newState: AgentState): boolean {\n return this.state === newState;\n }\n\n canTransitionTo(to: AgentState): boolean {\n return VALID_TRANSITIONS.some(t => t.from === this.state && t.to === to);\n }\n}","import cron from 'node-cron';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { MercuryConfig } from '../utils/config.js';\nimport { getMercuryHome } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface ScheduledTask {\n id: string;\n cron: string;\n handler: () => Promise<void>;\n description: string;\n}\n\nexport interface ScheduledTaskManifest {\n id: string;\n cron?: string;\n description: string;\n skillName?: string;\n prompt?: string;\n delaySeconds?: number;\n executeAt?: string;\n createdAt: string;\n sourceChannelId?: string;\n sourceChannelType?: string;\n}\n\nconst SCHEDULES_FILE = 'schedules.yaml';\n\nfunction getSchedulesPath(): string {\n return join(getMercuryHome(), SCHEDULES_FILE);\n}\n\nexport function loadSchedules(): ScheduledTaskManifest[] {\n const path = getSchedulesPath();\n if (!existsSync(path)) return [];\n try {\n const raw = readFileSync(path, 'utf-8');\n const data = parseYaml(raw) as { tasks?: ScheduledTaskManifest[] };\n return data.tasks || [];\n } catch (err) {\n logger.warn({ err }, 'Failed to load schedules.yaml');\n return [];\n }\n}\n\nexport function saveSchedules(tasks: ScheduledTaskManifest[]): void {\n const path = getSchedulesPath();\n const dir = getMercuryHome();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, stringifyYaml({ tasks }), 'utf-8');\n}\n\nexport class Scheduler {\n private tasks: Map<string, cron.ScheduledTask> = new Map();\n private delayedTasks: Map<string, NodeJS.Timeout> = new Map();\n private taskManifests: Map<string, ScheduledTaskManifest> = new Map();\n private heartbeatIntervalMinutes: number;\n private heartbeatHandler?: () => Promise<void>;\n private heartbeatTimer: NodeJS.Timeout | null = null;\n\n constructor(\n config: MercuryConfig,\n private onScheduledTask?: (manifest: ScheduledTaskManifest) => Promise<void>,\n ) {\n this.heartbeatIntervalMinutes = config.heartbeat.intervalMinutes;\n }\n\n setOnScheduledTask(handler: (manifest: ScheduledTaskManifest) => Promise<void>): void {\n this.onScheduledTask = handler;\n }\n\n onHeartbeat(handler: () => Promise<void>): void {\n this.heartbeatHandler = handler;\n }\n\n startHeartbeat(): void {\n if (this.heartbeatTimer) return;\n const ms = this.heartbeatIntervalMinutes * 60 * 1000;\n logger.info({ intervalMin: this.heartbeatIntervalMinutes }, 'Heartbeat started');\n\n this.heartbeatTimer = setInterval(async () => {\n try {\n await this.heartbeatHandler?.();\n } catch (err) {\n logger.error({ err }, 'Heartbeat error');\n }\n }, ms);\n }\n\n stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n logger.info('Heartbeat stopped');\n }\n }\n\n addTask(task: ScheduledTask): void {\n if (this.tasks.has(task.id)) {\n this.removeTask(task.id);\n }\n const scheduled = cron.schedule(task.cron, async () => {\n try {\n await task.handler();\n } catch (err) {\n logger.error({ task: task.id, err }, 'Scheduled task error');\n }\n });\n this.tasks.set(task.id, scheduled);\n logger.info({ id: task.id, cron: task.cron, desc: task.description }, 'Task scheduled');\n }\n\n addPersistedTask(manifest: ScheduledTaskManifest): void {\n this.taskManifests.set(manifest.id, manifest);\n this.addTask({\n id: manifest.id,\n cron: manifest.cron!,\n description: manifest.description,\n handler: async () => {\n logger.info({ task: manifest.id }, 'Scheduled task firing');\n if (this.onScheduledTask) {\n await this.onScheduledTask(manifest);\n }\n },\n });\n }\n\n addDelayedTask(manifest: ScheduledTaskManifest): void {\n this.taskManifests.set(manifest.id, manifest);\n const delayMs = (manifest.delaySeconds || 60) * 1000;\n\n const timer = setTimeout(async () => {\n try {\n logger.info({ task: manifest.id }, 'Delayed task firing');\n if (this.onScheduledTask) {\n await this.onScheduledTask(manifest);\n }\n } catch (err) {\n logger.error({ task: manifest.id, err }, 'Delayed task error');\n } finally {\n this.delayedTasks.delete(manifest.id);\n this.taskManifests.delete(manifest.id);\n this.persistSchedules();\n }\n }, delayMs);\n\n this.delayedTasks.set(manifest.id, timer);\n logger.info({ id: manifest.id, delaySeconds: manifest.delaySeconds }, 'Delayed task scheduled');\n }\n\n removeTask(id: string): void {\n const task = this.tasks.get(id);\n if (task) {\n task.stop();\n this.tasks.delete(id);\n }\n const timer = this.delayedTasks.get(id);\n if (timer) {\n clearTimeout(timer);\n this.delayedTasks.delete(id);\n }\n this.taskManifests.delete(id);\n }\n\n getManifests(): ScheduledTaskManifest[] {\n return [...this.taskManifests.values()];\n }\n\n restorePersistedTasks(): void {\n const persisted = loadSchedules();\n for (const manifest of persisted) {\n if (manifest.delaySeconds) {\n const executeAt = manifest.executeAt ? new Date(manifest.executeAt) : null;\n const now = Date.now();\n if (executeAt && executeAt.getTime() > now) {\n const remainingMs = executeAt.getTime() - now;\n manifest.delaySeconds = Math.ceil(remainingMs / 1000);\n this.addDelayedTask(manifest);\n } else {\n logger.info({ id: manifest.id }, 'Delayed task already expired, skipping');\n }\n } else if (manifest.cron && cron.validate(manifest.cron)) {\n this.addPersistedTask(manifest);\n } else {\n logger.warn({ id: manifest.id, cron: manifest.cron }, 'Skipping invalid task');\n }\n }\n if (persisted.length > 0) {\n logger.info({ count: persisted.length }, 'Restored persisted scheduled tasks');\n }\n }\n\n persistSchedules(): void {\n saveSchedules(this.getManifests());\n }\n\n stopAll(): void {\n this.stopHeartbeat();\n for (const [, task] of this.tasks) {\n task.stop();\n }\n for (const [, timer] of this.delayedTasks) {\n clearTimeout(timer);\n }\n this.tasks.clear();\n this.delayedTasks.clear();\n this.taskManifests.clear();\n }\n}","import readline from 'node:readline';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport chalk from 'chalk';\nimport type { ChannelMessage } from '../types/channel.js';\nimport { BaseChannel } from './base.js';\nimport { logger } from '../utils/logger.js';\nimport { renderMarkdown } from '../utils/markdown.js';\n\nexport class CLIChannel extends BaseChannel {\n readonly type = 'cli' as const;\n private rl: readline.Interface | null = null;\n private agentName: string;\n\n constructor(agentName: string = 'Mercury') {\n super();\n this.agentName = agentName;\n }\n\n setAgentName(name: string): void {\n this.agentName = name;\n }\n\n async start(): Promise<void> {\n this.rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: ' You: ',\n });\n\n this.rl.on('line', (line) => {\n const trimmed = line.trim();\n if (!trimmed) {\n this.showPrompt();\n return;\n }\n\n const msg: ChannelMessage = {\n id: Date.now().toString(36),\n channelId: 'cli',\n channelType: 'cli',\n senderId: 'owner',\n content: trimmed,\n timestamp: Date.now(),\n };\n this.emit(msg);\n });\n\n this.ready = true;\n this.showPrompt();\n logger.info('CLI channel started');\n }\n\n async stop(): Promise<void> {\n this.rl?.close();\n this.rl = null;\n this.ready = false;\n }\n\n async send(content: string, _targetId?: string, elapsedMs?: number): Promise<void> {\n const timeStr = elapsedMs != null ? chalk.dim(` (${(elapsedMs / 1000).toFixed(1)}s)`) : '';\n const rendered = renderMarkdown(content);\n console.log('');\n console.log(chalk.cyan(` ${this.agentName}:`) + timeStr);\n const indented = rendered\n .split('\\n')\n .map((line: string) => ` ${line}`)\n .join('\\n');\n console.log(indented);\n console.log('');\n this.showPrompt();\n }\n\n async sendFile(filePath: string, _targetId?: string): Promise<void> {\n const resolved = path.resolve(filePath);\n if (!fs.existsSync(resolved)) {\n console.log(chalk.red(` File not found: ${filePath}`));\n return;\n }\n const stat = fs.statSync(resolved);\n const sizeStr = stat.size > 1024 * 1024\n ? `${(stat.size / (1024 * 1024)).toFixed(1)}MB`\n : stat.size > 1024\n ? `${(stat.size / 1024).toFixed(1)}KB`\n : `${stat.size}B`;\n console.log('');\n console.log(chalk.cyan(` ${this.agentName}:`) + chalk.dim(' (file)'));\n console.log(chalk.dim(` path: ${resolved}`));\n console.log(chalk.dim(` size: ${sizeStr}`));\n console.log('');\n this.showPrompt();\n }\n\n async stream(content: AsyncIterable<string>, _targetId?: string): Promise<string> {\n console.log('');\n process.stdout.write(chalk.cyan(` ${this.agentName}: `));\n let full = '';\n for await (const chunk of content) {\n process.stdout.write(chunk);\n full += chunk;\n }\n console.log('\\n');\n this.showPrompt();\n return full;\n }\n\n async typing(_targetId?: string): Promise<void> {\n process.stdout.write(chalk.dim(` ${this.agentName} is thinking...\\r`));\n }\n\n showPrompt(): void {\n if (this.rl) {\n this.rl.setPrompt(' You: ');\n this.rl.prompt();\n }\n }\n\n async prompt(question: string): Promise<string> {\n return new Promise((resolve) => {\n this.rl?.question(question, (answer) => resolve(answer.trim()));\n });\n }\n\n async askPermission(prompt: string): Promise<string> {\n return new Promise((resolve) => {\n console.log('');\n console.log(chalk.yellow(` ⚠ ${prompt}`));\n this.rl?.question(chalk.yellow(' > '), (answer) => {\n resolve(answer.trim());\n });\n });\n }\n}","import type { ChannelType, ChannelMessage } from '../types/channel.js';\n\nexport interface Channel {\n readonly type: ChannelType;\n start(): Promise<void>;\n stop(): Promise<void>;\n send(content: string, targetId?: string, elapsedMs?: number): Promise<void>;\n sendFile(filePath: string, targetId?: string): Promise<void>;\n stream(content: AsyncIterable<string>, targetId?: string): Promise<string>;\n typing(targetId?: string): Promise<void>;\n isReady(): boolean;\n onMessage(handler: (msg: ChannelMessage) => void): void;\n}\n\nexport abstract class BaseChannel implements Channel {\n abstract readonly type: ChannelType;\n protected messageHandler?: (msg: ChannelMessage) => void;\n protected ready = false;\n\n abstract start(): Promise<void>;\n abstract stop(): Promise<void>;\n abstract send(content: string, targetId?: string, elapsedMs?: number): Promise<void>;\n abstract sendFile(filePath: string, targetId?: string): Promise<void>;\n abstract stream(content: AsyncIterable<string>, targetId?: string): Promise<string>;\n abstract typing(targetId?: string): Promise<void>;\n\n isReady(): boolean {\n return this.ready;\n }\n\n onMessage(handler: (msg: ChannelMessage) => void): void {\n this.messageHandler = handler;\n }\n\n protected emit(message: ChannelMessage): void {\n this.messageHandler?.(message);\n }\n}","import { Marked } from 'marked';\nimport chalk from 'chalk';\n\nconst lexer = new Marked();\n\nexport function renderMarkdown(text: string): string {\n try {\n const tokens = lexer.lexer(text);\n const result = renderTokens(tokens);\n return result.replace(/\\n{3,}/g, '\\n\\n').trimEnd();\n } catch {\n return text;\n }\n}\n\nfunction renderTokens(tokens: any[]): string {\n return tokens.map((t) => renderToken(t)).join('');\n}\n\nfunction renderToken(t: any): string {\n if (!t || typeof t !== 'object') return String(t ?? '');\n\n switch (t.type) {\n case 'heading':\n return renderHeading(t);\n case 'paragraph':\n return renderInline(t.tokens) + '\\n\\n';\n case 'strong':\n return chalk.bold(renderInline(t.tokens));\n case 'em':\n return chalk.italic(renderInline(t.tokens));\n case 'del':\n return chalk.dim.strikethrough(renderInline(t.tokens));\n case 'codespan':\n return chalk.yellow(t.text);\n case 'code':\n return renderCodeBlock(t);\n case 'list':\n return renderList(t);\n case 'blockquote':\n return renderBlockquote(t);\n case 'hr':\n return chalk.dim('─'.repeat(50)) + '\\n\\n';\n case 'link':\n return `${chalk.blue.underline(renderInline(t.tokens))} ${chalk.dim(`(${t.href})`)}`;\n case 'image':\n return chalk.blue(`🖼 ${t.title || t.href}`);\n case 'table':\n return renderTable(t);\n case 'text':\n if (t.tokens) return renderInline(t.tokens);\n return t.text || '';\n case 'html':\n return t.text || '';\n case 'space':\n return '';\n default:\n return t.text || '';\n }\n}\n\nfunction renderHeading(t: any): string {\n const text = renderInline(t.tokens);\n if (t.depth === 1) return `\\n${chalk.bold.cyan(text)}\\n\\n`;\n if (t.depth === 2) return `\\n${chalk.bold.cyan(` ■ ${text}`)}\\n\\n`;\n return `\\n${chalk.bold(` ■ ${text}`)}\\n\\n`;\n}\n\nfunction renderInline(tokens: any[] | undefined): string {\n if (!tokens) return '';\n return tokens.map((t) => {\n if (typeof t === 'string') return t;\n if (t.type === 'strong') return chalk.bold(renderInline(t.tokens));\n if (t.type === 'em') return chalk.italic(renderInline(t.tokens));\n if (t.type === 'del') return chalk.dim.strikethrough(renderInline(t.tokens));\n if (t.type === 'codespan') return chalk.yellow(t.text);\n if (t.type === 'link') return `${chalk.blue.underline(renderInline(t.tokens))} ${chalk.dim(`(${t.href})`)}`;\n if (t.type === 'image') return chalk.blue(`🖼 ${t.title || t.href}`);\n if (t.type === 'text') {\n return t.tokens ? renderInline(t.tokens) : (t.text || '');\n }\n if (t.type === 'html') return t.text || '';\n return t.text || '';\n }).join('');\n}\n\nfunction renderCodeBlock(t: any): string {\n const lines = t.text\n .split('\\n')\n .map((l: string) => `${chalk.dim(' ')}${chalk.yellow(l)}`)\n .join('\\n');\n const langStr = t.lang ? chalk.dim(` [${t.lang}]`) : '';\n return `\\n${langStr}\\n${lines}\\n\\n`;\n}\n\nfunction renderList(t: any): string {\n const lines: string[] = [];\n const items = t.items || [];\n items.forEach((item: any, i: number) => {\n const bullet = t.ordered ? `${i + 1}.` : '•';\n const firstLine = renderInline(item.tokens?.[0]?.tokens || [{ text: item.text }]);\n lines.push(` ${chalk.dim(bullet)} ${firstLine}`);\n\n const restTokens = (item.tokens || []).slice(1);\n for (const sub of restTokens) {\n if (sub.type === 'list') {\n const subLines = renderList(sub)\n .split('\\n')\n .filter(Boolean)\n .map((l: string) => ` ${l}`)\n .join('\\n');\n lines.push(subLines);\n } else if (sub.type === 'text') {\n lines.push(` ${chalk.dim('•')} ${renderInline(sub.tokens)}`);\n }\n }\n });\n return lines.join('\\n') + '\\n\\n';\n}\n\nfunction renderBlockquote(t: any): string {\n const content = renderTokens(t.tokens || []);\n const lines = content\n .split('\\n')\n .filter((l: string) => l.trim())\n .map((l: string) => `${chalk.dim('│ ')}${chalk.gray(l)}`)\n .join('\\n');\n return `\\n${lines}\\n\\n`;\n}\n\nfunction renderTable(t: any): string {\n const headers = (t.header || []).map((h: any) => chalk.bold(renderInline(h.tokens)));\n const colWidths = (t.header || []).map((h: any, i: number) => {\n const hLen = (h.text || '').length;\n const rowLens = (t.rows || []).map((row: any) => {\n const cell = row[i];\n return cell?.text?.length ?? 0;\n });\n return Math.max(hLen, ...rowLens) + 2;\n });\n\n const headerLine = headers.map((h: string, i: number) => h.padEnd(colWidths[i])).join(chalk.dim(' │ '));\n const separator = colWidths.map((w: number) => '─'.repeat(w)).join(chalk.dim('─┼─'));\n\n const dataLines = (t.rows || []).map((row: any) =>\n row.map((cell: any, i: number) => {\n const text = renderInline(cell.tokens) || cell.text || '';\n return text.padEnd(colWidths[i]);\n }).join(chalk.dim(' │ '))\n );\n\n return `\\n${headerLine}\\n${chalk.dim(separator)}\\n${dataLines.join('\\n')}\\n\\n`;\n}\n\nfunction escapeHtml(text: string): string {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\nexport function mdToTelegram(text: string): string {\n let out = text;\n\n const codeBlocks: string[] = [];\n out = out.replace(/```(\\w*)\\n([\\s\\S]*?)```/g, (_match, lang, code) => {\n const placeholder = `__CODEBLOCK_${codeBlocks.length}__`;\n codeBlocks.push(`<pre><code class=\"${lang}\">${escapeHtml(code)}</code></pre>`);\n return placeholder;\n });\n\n const inlineCodes: string[] = [];\n out = out.replace(/`([^`]+)`/g, (_match, code) => {\n const placeholder = `__INLINECODE_${inlineCodes.length}__`;\n inlineCodes.push(`<code>${escapeHtml(code)}</code>`);\n return placeholder;\n });\n\n const links: string[] = [];\n out = out.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_match, label, href) => {\n const placeholder = `__LINK_${links.length}__`;\n links.push(`<a href=\"${escapeHtml(href)}\">${escapeHtml(label)}</a>`);\n return placeholder;\n });\n\n out = escapeHtml(out);\n\n out = out.replace(/^### (.+)$/gm, '<b><i>$1</i></b>');\n out = out.replace(/^## (.+)$/gm, '<b>$1</b>');\n out = out.replace(/^# (.+)$/gm, '<b>$1</b>');\n out = out.replace(/\\*\\*([^*]+)\\*\\*/g, '<b>$1</b>');\n out = out.replace(/(?<!\\*)\\*([^*]+)\\*(?!\\*)/g, '<i>$1</i>');\n out = out.replace(/~~([^~]+)~~/g, '<s>$1</s>');\n\n for (let i = 0; i < inlineCodes.length; i++) {\n out = out.replace(`__INLINECODE_${i}__`, inlineCodes[i]);\n }\n for (let i = 0; i < codeBlocks.length; i++) {\n out = out.replace(`__CODEBLOCK_${i}__`, codeBlocks[i]);\n }\n for (let i = 0; i < links.length; i++) {\n out = out.replace(`__LINK_${i}__`, links[i]);\n }\n\n if (out.length > 4096) {\n out = out.slice(0, 4090) + '...';\n }\n\n return out;\n}","import fs from 'node:fs';\nimport path from 'node:path';\nimport { Bot, InputFile } from 'grammy';\nimport { autoRetry } from '@grammyjs/auto-retry';\nimport type { ChannelMessage } from '../types/channel.js';\nimport { BaseChannel } from './base.js';\nimport type { MercuryConfig } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\nimport { mdToTelegram } from '../utils/markdown.js';\n\nconst MAX_MESSAGE_LENGTH = 4096;\n\nexport class TelegramChannel extends BaseChannel {\n readonly type = 'telegram' as const;\n private bot: Bot | null = null;\n private ownerChatId: number | null = null;\n private typingInterval: NodeJS.Timeout | null = null;\n private chatCommandContext?: import('../capabilities/registry.js').ChatCommandContext;\n\n constructor(private config: MercuryConfig) {\n super();\n }\n\n setChatCommandContext(ctx: import('../capabilities/registry.js').ChatCommandContext): void {\n this.chatCommandContext = ctx;\n }\n\n async start(): Promise<void> {\n const token = this.config.channels.telegram.botToken;\n if (!token) {\n logger.warn('Telegram bot token not set — skipping');\n return;\n }\n\n const bot = new Bot(token);\n bot.api.config.use(autoRetry());\n\n bot.on('message:text', async (ctx) => {\n const chatId = ctx.chat.id;\n if (!this.isAllowedChat(chatId)) return;\n\n this.ownerChatId = chatId;\n logger.info({ chatId, text: ctx.message.text?.slice(0, 50) }, 'Telegram message received');\n\n const msg: ChannelMessage = {\n id: ctx.message.message_id.toString(),\n channelId: `telegram:${chatId}`,\n channelType: 'telegram',\n senderId: ctx.from?.id.toString() ?? 'unknown',\n senderName: ctx.from?.first_name,\n content: ctx.message.text,\n timestamp: ctx.message.date * 1000,\n metadata: { chatId, messageId: ctx.message.message_id },\n };\n this.emit(msg);\n });\n\n bot.catch((err) => {\n logger.error({ err: err.message }, 'Telegram bot error');\n });\n\n this.bot = bot;\n\n await bot.start({\n onStart: async (info) => {\n logger.info({ bot: info.username }, 'Telegram bot started — long polling active');\n this.ready = true;\n await this.registerCommands();\n },\n });\n }\n\n private async registerCommands(): Promise<void> {\n if (!this.bot) return;\n\n const commands = [\n { command: 'help', description: 'Show capabilities and commands manual' },\n { command: 'status', description: 'Show agent config, budget, and uptime' },\n { command: 'tools', description: 'List all loaded tools' },\n { command: 'skills', description: 'List installed skills' },\n { command: 'budget', description: 'Show token budget status' },\n { command: 'budget_override', description: 'Override budget for one request' },\n { command: 'budget_reset', description: 'Reset token usage to zero' },\n { command: 'budget_set', description: 'Set new daily token budget' },\n { command: 'stream', description: 'Toggle text streaming on/off' },\n ];\n\n try {\n await this.bot.api.setMyCommands(commands);\n logger.info({ count: commands.length }, 'Telegram bot commands registered');\n } catch (err: any) {\n logger.warn({ err: err.message }, 'Failed to register Telegram commands (non-critical)');\n }\n }\n\n async stop(): Promise<void> {\n this.bot?.stop();\n this.ready = false;\n this.stopTypingLoop();\n }\n\n async send(content: string, targetId?: string, elapsedMs?: number): Promise<void> {\n const chatId = this.parseChatId(targetId);\n if (!chatId || !this.bot) {\n logger.warn({ targetId, chatId }, 'Telegram send: no valid chat ID');\n return;\n }\n const timeSuffix = elapsedMs != null ? `\\n⏱ ${(elapsedMs / 1000).toFixed(1)}s` : '';\n const fullContent = content + timeSuffix;\n const html = mdToTelegram(fullContent);\n const chunks = this.splitMessage(html, MAX_MESSAGE_LENGTH);\n\n for (const chunk of chunks) {\n try {\n await this.bot.api.sendMessage(chatId, chunk, { parse_mode: 'HTML' });\n } catch (err: any) {\n logger.warn({ err: err.message }, 'HTML parse failed, sending as plain text');\n try {\n await this.bot.api.sendMessage(chatId, this.stripHtml(chunk));\n } catch (err2: any) {\n logger.error({ err: err2.message }, 'Telegram send failed');\n }\n }\n }\n }\n\n async sendFile(filePath: string, targetId?: string): Promise<void> {\n const chatId = this.parseChatId(targetId);\n if (!chatId || !this.bot) {\n logger.warn({ targetId, chatId }, 'Telegram sendFile: no valid chat ID');\n return;\n }\n const resolved = path.resolve(filePath);\n if (!fs.existsSync(resolved)) {\n await this.bot.api.sendMessage(chatId, `File not found: ${filePath}`);\n return;\n }\n\n const inputFile = new InputFile(resolved);\n const filename = path.basename(resolved);\n const ext = path.extname(resolved).toLowerCase();\n\n try {\n if (this.isImageFile(ext)) {\n await this.bot.api.sendPhoto(chatId, inputFile, { caption: filename });\n } else if (this.isAudioFile(ext)) {\n await this.bot.api.sendAudio(chatId, inputFile, { title: filename });\n } else if (this.isVideoFile(ext)) {\n await this.bot.api.sendVideo(chatId, inputFile, { caption: filename });\n } else {\n await this.bot.api.sendDocument(chatId, inputFile, { caption: filename });\n }\n logger.info({ file: resolved, chatId }, 'File sent via Telegram');\n } catch (err: any) {\n logger.error({ err: err.message, file: resolved }, 'Telegram sendFile failed');\n await this.bot.api.sendMessage(chatId, `Failed to send file: ${err.message}`).catch(() => {});\n }\n }\n\n async stream(content: AsyncIterable<string>, targetId?: string): Promise<string> {\n const chatId = this.parseChatId(targetId);\n if (!chatId || !this.bot) return '';\n\n let full = '';\n for await (const chunk of content) {\n full += chunk;\n }\n const html = mdToTelegram(full);\n try {\n await this.bot.api.sendMessage(chatId, html, { parse_mode: 'HTML' });\n } catch (err: any) {\n await this.bot.api.sendMessage(chatId, this.stripHtml(html));\n }\n return full;\n }\n\n async typing(targetId?: string): Promise<void> {\n const chatId = this.parseChatId(targetId);\n if (!chatId || !this.bot) return;\n await this.bot.api.sendChatAction(chatId, 'typing');\n }\n\n startTypingLoop(chatId: number): void {\n this.stopTypingLoop();\n this.bot?.api.sendChatAction(chatId, 'typing').catch(() => {});\n this.typingInterval = setInterval(() => {\n this.bot?.api.sendChatAction(chatId, 'typing').catch(() => {});\n }, 4000);\n }\n\n stopTypingLoop(): void {\n if (this.typingInterval) {\n clearInterval(this.typingInterval);\n this.typingInterval = null;\n }\n }\n\n async sendStreamToChat(chatId: number, textStream: AsyncIterable<string>): Promise<string> {\n if (!this.bot) return '';\n\n const STREAM_EDIT_INTERVAL = 1500;\n const STREAM_MIN_LENGTH = 20;\n\n this.startTypingLoop(chatId);\n\n try {\n let full = '';\n let messageId: number | null = null;\n let lastEditTime = 0;\n let lastEditLength = 0;\n\n for await (const chunk of textStream) {\n full += chunk;\n\n const now = Date.now();\n const timeSinceLastEdit = now - lastEditTime;\n const charsSinceLastEdit = full.length - lastEditLength;\n\n if (messageId === null && full.length >= STREAM_MIN_LENGTH) {\n try {\n const msg = await this.bot.api.sendMessage(chatId, this.escapeHtml(full) + ' ▌', { parse_mode: 'HTML' });\n messageId = msg.message_id;\n lastEditTime = now;\n lastEditLength = full.length;\n } catch {\n messageId = null;\n }\n } else if (messageId !== null && timeSinceLastEdit >= STREAM_EDIT_INTERVAL && charsSinceLastEdit >= 20) {\n try {\n await this.bot.api.editMessageText(chatId, messageId, this.escapeHtml(full) + ' ▌', { parse_mode: 'HTML' });\n lastEditTime = now;\n lastEditLength = full.length;\n } catch {\n // edit failed — rate limited or message unchanged, skip\n }\n }\n }\n\n if (messageId !== null) {\n const html = mdToTelegram(full);\n try {\n await this.bot.api.editMessageText(chatId, messageId, html, { parse_mode: 'HTML' });\n } catch {\n try {\n await this.bot.api.editMessageText(chatId, messageId, this.stripHtml(html));\n } catch {\n // final edit failed\n }\n }\n } else {\n const html = mdToTelegram(full);\n try {\n await this.bot.api.sendMessage(chatId, html, { parse_mode: 'HTML' });\n } catch {\n await this.bot.api.sendMessage(chatId, this.stripHtml(html));\n }\n }\n\n return full;\n } finally {\n this.stopTypingLoop();\n }\n }\n\n private escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n }\n\n private splitMessage(text: string, maxLen: number): string[] {\n if (text.length <= maxLen) return [text];\n const chunks: string[] = [];\n let remaining = text;\n while (remaining.length > 0) {\n let splitAt = maxLen;\n if (remaining.length > maxLen) {\n const lastNewline = remaining.lastIndexOf('\\n', maxLen);\n if (lastNewline > maxLen * 0.5) {\n splitAt = lastNewline + 1;\n }\n }\n chunks.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt);\n }\n return chunks;\n }\n\n private stripHtml(html: string): string {\n return html\n .replace(/<\\/?(b|i|s|u|code|pre|a|blockquote|strong|em)[^>]*>/gi, '')\n .replace(/<pre><code[^>]*>/gi, '')\n .replace(/<\\/code><\\/pre>/gi, '')\n .replace(/<[^>]+>/g, '')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&');\n }\n\n private isImageFile(ext: string): boolean {\n return ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp', '.svg'].includes(ext);\n }\n\n private isAudioFile(ext: string): boolean {\n return ['.mp3', '.ogg', '.wav', '.flac', '.m4a'].includes(ext);\n }\n\n private isVideoFile(ext: string): boolean {\n return ['.mp4', '.mov', '.avi', '.mkv', '.webm'].includes(ext);\n }\n\n private parseChatId(targetId?: string): number | null {\n if (!targetId) return this.ownerChatId;\n if (targetId.startsWith('telegram:')) {\n const raw = Number(targetId.split(':')[1]);\n return isNaN(raw) ? this.ownerChatId : raw;\n }\n if (targetId === 'notification') return this.ownerChatId;\n const num = Number(targetId);\n return isNaN(num) ? this.ownerChatId : num;\n }\n\n private isAllowedChat(chatId: number): boolean {\n const allowed = this.config.channels.telegram.allowedChatIds;\n if (!allowed || allowed.length === 0) return true;\n return allowed.includes(chatId);\n }\n}","import type { Channel } from './base.js';\nimport type { ChannelMessage, ChannelType } from '../types/channel.js';\nimport { CLIChannel } from './cli.js';\nimport { TelegramChannel } from './telegram.js';\nimport type { MercuryConfig } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nexport class ChannelRegistry {\n private channels: Map<ChannelType, Channel> = new Map();\n\n constructor(config: MercuryConfig) {\n this.register('cli', new CLIChannel(config.identity.name));\n\n if (config.channels.telegram.enabled && config.channels.telegram.botToken) {\n this.register('telegram', new TelegramChannel(config));\n }\n }\n\n register(type: ChannelType, channel: Channel): void {\n channel.onMessage((msg) => this.handleIncomingMessage(msg));\n this.channels.set(type, channel);\n logger.info({ channel: type }, 'Channel registered');\n }\n\n get(type: ChannelType): Channel | undefined {\n return this.channels.get(type);\n }\n\n getChannelForMessage(message: ChannelMessage): Channel | undefined {\n return this.channels.get(message.channelType);\n }\n\n async startAll(): Promise<void> {\n for (const [type, channel] of this.channels) {\n try {\n await channel.start();\n } catch (err) {\n logger.error({ channel: type, err }, 'Failed to start channel');\n }\n }\n }\n\n async stopAll(): Promise<void> {\n for (const [, channel] of this.channels) {\n await channel.stop();\n }\n }\n\n getActiveChannels(): ChannelType[] {\n return [...this.channels.entries()]\n .filter(([, ch]) => ch.isReady())\n .map(([type]) => type);\n }\n\n getNotificationChannel(): Channel | undefined {\n const telegram = this.channels.get('telegram');\n if (telegram?.isReady()) return telegram;\n const cli = this.channels.get('cli');\n if (cli?.isReady()) return cli;\n return this.channels.values().next().value;\n }\n\n private incomingHandler?: (msg: ChannelMessage) => void;\n\n onIncomingMessage(handler: (msg: ChannelMessage) => void): void {\n this.incomingHandler = handler;\n }\n\n private handleIncomingMessage(msg: ChannelMessage): void {\n logger.debug({ from: msg.channelType, sender: msg.senderId }, 'Incoming message');\n this.incomingHandler?.(msg);\n }\n}","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { MercuryConfig } from './config.js';\nimport { getMercuryHome, saveConfig } from './config.js';\nimport { logger } from './logger.js';\n\nexport interface TokenTracker {\n dailyUsed: number;\n dailyBudget: number;\n lastResetDate: string;\n requestLog: TokenLogEntry[];\n}\n\nexport interface TokenLogEntry {\n timestamp: number;\n provider: string;\n model: string;\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n channelType: string;\n}\n\nconst TOKEN_FILE = 'token-usage.json';\n\nexport class TokenBudget {\n private dailyUsed = 0;\n private dailyBudget: number;\n private lastResetDate: string;\n private requestLog: TokenLogEntry[] = [];\n private forceNext = false;\n\n constructor(private config: MercuryConfig) {\n this.dailyBudget = config.tokens.dailyBudget;\n this.lastResetDate = new Date().toISOString().split('T')[0];\n this.restore();\n }\n\n canAfford(estimatedTokens: number): boolean {\n this.resetIfNewDay();\n return this.dailyUsed + estimatedTokens <= this.dailyBudget;\n }\n\n isOverBudget(): boolean {\n this.resetIfNewDay();\n if (this.forceNext) {\n this.forceNext = false;\n return false;\n }\n return this.dailyUsed >= this.dailyBudget;\n }\n\n forceAllowNext(): void {\n this.forceNext = true;\n logger.info('Budget override: next request will proceed regardless of budget');\n }\n\n resetUsage(): void {\n this.dailyUsed = 0;\n this.requestLog = [];\n this.persist();\n logger.info('Token usage reset to zero');\n }\n\n setBudget(newBudget: number): void {\n this.dailyBudget = newBudget;\n this.config.tokens.dailyBudget = newBudget;\n saveConfig(this.config);\n this.persist();\n logger.info({ newBudget }, 'Daily token budget updated');\n }\n\n getBudget(): number {\n return this.dailyBudget;\n }\n\n getDailyUsed(): number {\n this.resetIfNewDay();\n return this.dailyUsed;\n }\n\n recordUsage(entry: Omit<TokenLogEntry, 'timestamp'>): void {\n this.resetIfNewDay();\n const logEntry: TokenLogEntry = { ...entry, timestamp: Date.now() };\n this.dailyUsed += entry.totalTokens;\n this.requestLog.push(logEntry);\n this.persist();\n }\n\n getRemaining(): number {\n this.resetIfNewDay();\n return Math.max(0, this.dailyBudget - this.dailyUsed);\n }\n\n getUsagePercentage(): number {\n this.resetIfNewDay();\n return this.dailyBudget > 0 ? (this.dailyUsed / this.dailyBudget) * 100 : 0;\n }\n\n getStatusText(): string {\n const pct = Math.round(this.getUsagePercentage());\n const remaining = this.getRemaining();\n return `Token budget: ${this.dailyUsed.toLocaleString()} / ${this.dailyBudget.toLocaleString()} used (${pct}%), ${remaining.toLocaleString()} remaining`;\n }\n\n private resetIfNewDay(): void {\n const today = new Date().toISOString().split('T')[0];\n if (today !== this.lastResetDate) {\n this.dailyUsed = 0;\n this.lastResetDate = today;\n this.requestLog = [];\n this.persist();\n logger.info('Token budget reset for new day');\n }\n }\n\n private persist(): void {\n const path = join(getMercuryHome(), TOKEN_FILE);\n try {\n const data = {\n dailyUsed: this.dailyUsed,\n dailyBudget: this.dailyBudget,\n lastResetDate: this.lastResetDate,\n requestLog: this.requestLog.slice(-200),\n };\n writeFileSync(path, JSON.stringify(data, null, 2), 'utf-8');\n } catch (err) {\n logger.warn({ err }, 'Failed to persist token usage');\n }\n }\n\n private restore(): void {\n const path = join(getMercuryHome(), TOKEN_FILE);\n if (!existsSync(path)) return;\n try {\n const raw = readFileSync(path, 'utf-8');\n const data = JSON.parse(raw) as Partial<TokenTracker>;\n const today = new Date().toISOString().split('T')[0];\n if (data.lastResetDate === today) {\n this.dailyUsed = data.dailyUsed ?? 0;\n this.requestLog = data.requestLog ?? [];\n }\n this.lastResetDate = data.lastResetDate ?? today;\n } catch (err) {\n logger.warn({ err }, 'Failed to restore token usage');\n }\n }\n}","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, resolve, sep } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { getMercuryHome } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface FileScope {\n path: string;\n read: boolean;\n write: boolean;\n}\n\nexport interface ShellPermissions {\n enabled: boolean;\n blocked: string[];\n autoApproved: string[];\n needsApproval: string[];\n cwdOnly: boolean;\n}\n\nexport interface FsPermissions {\n enabled: boolean;\n scopes: FileScope[];\n}\n\nexport interface GitPermissions {\n enabled: boolean;\n autoApproveRead: boolean;\n approveWrite: boolean;\n}\n\nexport interface PermissionsManifest {\n capabilities: {\n filesystem: FsPermissions;\n shell: ShellPermissions;\n git: GitPermissions;\n };\n}\n\nconst DEFAULT_MANIFEST: PermissionsManifest = {\n capabilities: {\n filesystem: {\n enabled: true,\n scopes: [\n { path: '.', read: true, write: true },\n ],\n },\n shell: {\n enabled: true,\n blocked: [\n 'sudo *',\n 'rm -rf /',\n 'rm -rf ~',\n 'rm -rf /*',\n 'mkfs *',\n 'dd if=*',\n 'chmod 777 /',\n 'chown * /',\n ':(){ :|:& };:',\n 'shutdown *',\n 'reboot *',\n 'halt *',\n 'init 0',\n 'init 6',\n 'kill -9 1',\n '> /dev/sda',\n 'mv /* /dev/null',\n ],\n autoApproved: [\n 'ls *',\n 'cat *',\n 'pwd',\n 'which *',\n 'node *',\n 'npm run *',\n 'npm test *',\n 'npm list *',\n 'git status *',\n 'git diff *',\n 'git log *',\n 'git branch *',\n 'echo *',\n 'head *',\n 'tail *',\n 'wc *',\n 'find *',\n 'grep *',\n 'rg *',\n 'ps *',\n 'df *',\n 'du *',\n 'uname *',\n 'curl *',\n 'wget *',\n ],\n needsApproval: [\n 'npm publish *',\n 'git push *',\n 'docker *',\n 'curl * | sh',\n 'curl * | bash',\n 'wget * | sh',\n 'pip install *',\n 'pip3 install *',\n 'rm -r *',\n 'rm -rf *',\n 'mv *',\n 'cp -r *',\n 'chmod *',\n 'mkdir *',\n 'rmdir *',\n ],\n cwdOnly: true,\n },\n git: {\n enabled: true,\n autoApproveRead: true,\n approveWrite: true,\n },\n },\n};\n\nconst PERMISSIONS_FILE = join(getMercuryHome(), 'permissions.yaml');\n\nexport class PermissionManager {\n private manifest: PermissionsManifest;\n private readonly cwd: string;\n private askHandler?: (prompt: string) => Promise<string>;\n private autoApproveAll = false;\n private elevatedCommands: Set<string> = new Set();\n private pendingApprovals: Set<string> = new Set();\n\n constructor() {\n this.cwd = process.cwd();\n this.manifest = this.load();\n }\n\n onAsk(handler: (prompt: string) => Promise<string>): void {\n this.askHandler = handler;\n }\n\n setAutoApproveAll(value: boolean): void {\n this.autoApproveAll = value;\n }\n\n elevateForSkill(allowedTools: string[]): void {\n if (allowedTools.includes('run_command')) {\n this.elevatedCommands.add('run_command');\n }\n if (allowedTools.includes('read_file') || allowedTools.includes('list_dir')) {\n this.elevatedCommands.add('fs_read');\n }\n if (allowedTools.includes('write_file') || allowedTools.includes('create_file') || allowedTools.includes('delete_file')) {\n this.elevatedCommands.add('fs_write');\n }\n }\n\n clearElevation(): void {\n this.elevatedCommands.clear();\n }\n\n isElevated(tool: string): boolean {\n if (this.elevatedCommands.has(tool)) return true;\n return false;\n }\n\n isShellElevated(): boolean {\n return this.elevatedCommands.has('run_command');\n }\n\n addPendingApproval(baseCommand: string): void {\n this.pendingApprovals.add(baseCommand);\n }\n\n clearPendingApprovals(): void {\n this.pendingApprovals.clear();\n }\n\n private load(): PermissionsManifest {\n if (existsSync(PERMISSIONS_FILE)) {\n try {\n const raw = readFileSync(PERMISSIONS_FILE, 'utf-8');\n const parsed = parseYaml(raw) as PermissionsManifest;\n return this.mergeDefaults(parsed);\n } catch (err) {\n logger.warn({ err }, 'Failed to parse permissions.yaml, using defaults');\n return { ...DEFAULT_MANIFEST };\n }\n }\n this.save(DEFAULT_MANIFEST);\n return { ...DEFAULT_MANIFEST };\n }\n\n save(manifest?: PermissionsManifest): void {\n const m = manifest || this.manifest;\n const dir = getMercuryHome();\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(PERMISSIONS_FILE, stringifyYaml(m, { lineWidth: 0 }), 'utf-8');\n this.manifest = m;\n }\n\n getManifest(): PermissionsManifest {\n return this.manifest;\n }\n\n addApprovedCommand(baseCommand: string): void {\n const cmdName = baseCommand.trim().split(/\\s+/)[0];\n const pattern = `${cmdName} *`;\n const shell = this.manifest.capabilities.shell;\n if (!shell.autoApproved.includes(pattern) && !shell.autoApproved.includes(cmdName)) {\n shell.autoApproved.push(pattern);\n this.save();\n logger.info({ pattern }, 'Shell command pattern auto-approved and saved');\n }\n }\n\n async checkFsAccess(path: string, mode: 'read' | 'write'): Promise<{ allowed: boolean; reason?: string }> {\n if (mode === 'read' && this.elevatedCommands.has('fs_read')) {\n return { allowed: true };\n }\n if (mode === 'write' && this.elevatedCommands.has('fs_write')) {\n return { allowed: true };\n }\n\n const fs = this.manifest.capabilities.filesystem;\n if (!fs.enabled) {\n return { allowed: false, reason: 'Filesystem capability is disabled' };\n }\n\n const resolved = resolve(path);\n const scope = this.findScope(resolved);\n\n if (scope) {\n if (mode === 'read' && scope.read) return { allowed: true };\n if (mode === 'write' && scope.write) return { allowed: true };\n return { allowed: false, reason: `Permission denied: ${mode} access to ${path} (scope has ${mode}=false)` };\n }\n\n return await this.requestScope(resolved, mode);\n }\n\n async checkShellCommand(command: string): Promise<{ allowed: boolean; reason?: string; needsApproval: boolean }> {\n if (this.autoApproveAll) {\n logger.info({ cmd: command.trim() }, 'Shell command auto-approved (auto-approve-all mode)');\n return { allowed: true, needsApproval: false };\n }\n\n if (this.isShellElevated()) {\n logger.info({ cmd: command.trim() }, 'Shell command auto-approved (skill elevation)');\n return { allowed: true, needsApproval: false };\n }\n\n const shell = this.manifest.capabilities.shell;\n if (!shell.enabled) {\n return { allowed: false, reason: 'Shell capability is disabled', needsApproval: false };\n }\n\n const trimmed = command.trim();\n\n const baseCmd = trimmed.split(/\\s+/)[0];\n if (this.pendingApprovals.has(baseCmd)) {\n logger.info({ cmd: trimmed }, 'Shell command auto-approved (pending approval)');\n return { allowed: true, needsApproval: false };\n }\n\n for (const pattern of shell.blocked) {\n if (this.matchPattern(trimmed, pattern)) {\n return { allowed: false, reason: `Blocked command: matches \"${pattern}\"`, needsApproval: false };\n }\n }\n\n if (shell.cwdOnly) {\n const hasPathTraversal = this.hasPathBeyondCwd(trimmed);\n if (hasPathTraversal) {\n const scopeCheck = await this.checkFsAccess(hasPathTraversal, 'write');\n if (!scopeCheck.allowed) {\n return { allowed: false, reason: scopeCheck.reason, needsApproval: true };\n }\n }\n }\n\n for (const pattern of shell.autoApproved) {\n if (this.matchPattern(trimmed, pattern)) {\n logger.info({ cmd: trimmed }, 'Shell command auto-approved');\n return { allowed: true, needsApproval: false };\n }\n }\n\n for (const pattern of shell.needsApproval) {\n if (this.matchPattern(trimmed, pattern)) {\n return { allowed: false, reason: `Command requires approval: matches \"${pattern}\"`, needsApproval: true };\n }\n }\n\n return { allowed: false, reason: 'Command not in auto-approve list — requires approval', needsApproval: true };\n }\n\n isGitReadAllowed(): boolean {\n return this.manifest.capabilities.git.enabled && this.manifest.capabilities.git.autoApproveRead;\n }\n\n isGitWriteNeedsApproval(): boolean {\n return this.manifest.capabilities.git.enabled && this.manifest.capabilities.git.approveWrite;\n }\n\n addScope(path: string, read: boolean, write: boolean): void {\n const resolved = resolve(path);\n const existing = this.findScope(resolved);\n if (existing) {\n existing.read = existing.read || read;\n existing.write = existing.write || write;\n } else {\n this.manifest.capabilities.filesystem.scopes.push({\n path: resolved,\n read,\n write,\n });\n }\n this.save();\n logger.info({ path: resolved, read, write }, 'Permission scope added');\n }\n\n private findScope(resolvedPath: string): FileScope | undefined {\n const scopes = this.manifest.capabilities.filesystem.scopes;\n for (const scope of scopes) {\n const scopeResolved = resolve(scope.path.replace(/^~/, homedir()));\n if (resolvedPath === scopeResolved || resolvedPath.startsWith(scopeResolved + sep)) {\n return scope;\n }\n }\n return undefined;\n }\n\n private async requestScope(path: string, mode: 'read' | 'write'): Promise<{ allowed: boolean; reason?: string }> {\n if (!this.askHandler) {\n return { allowed: false, reason: `No permission to ${mode} ${path}. Add scope to ~/.mercury/permissions.yaml` };\n }\n\n const response = await this.askHandler(\n `Mercury needs ${mode} access to ${path}. Allow? (y/n/always): `\n );\n\n if (response.toLowerCase() === 'always') {\n this.addScope(path, mode === 'read', mode === 'write');\n return { allowed: true };\n }\n\n if (response.toLowerCase() === 'y' || response.toLowerCase() === 'yes') {\n return { allowed: true };\n }\n\n return { allowed: false, reason: `Permission denied for ${mode} access to ${path}` };\n }\n\n private matchPattern(command: string, pattern: string): boolean {\n const regexStr = '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$';\n try {\n return new RegExp(regexStr, 'i').test(command);\n } catch {\n return command.startsWith(pattern.replace(/ \\*$/, ''));\n }\n }\n\n private hasPathBeyondCwd(command: string): string | null {\n const pathPatterns = [\n /(?:^|\\s)(\\/[^\\s]+)/,\n /(?:^|\\s)(~\\/[^\\s]+)/,\n /(?:^|\\s)\\.\\.\\/([^\\s]+)/,\n /(?:^|\\s)([A-Za-z]:\\\\[^\\s]+)/,\n /(?:^|\\s)(\\\\\\\\[^\\s]+)/,\n ];\n for (const p of pathPatterns) {\n const match = command.match(p);\n if (match) {\n const candidate = resolve(match[1].replace(/^~/, homedir()));\n if (!candidate.startsWith(this.cwd)) {\n return candidate;\n }\n }\n }\n return null;\n }\n\n private mergeDefaults(parsed: Partial<PermissionsManifest>): PermissionsManifest {\n return {\n capabilities: {\n filesystem: {\n enabled: parsed.capabilities?.filesystem?.enabled ?? DEFAULT_MANIFEST.capabilities.filesystem.enabled,\n scopes: parsed.capabilities?.filesystem?.scopes ?? DEFAULT_MANIFEST.capabilities.filesystem.scopes,\n },\n shell: {\n enabled: parsed.capabilities?.shell?.enabled ?? DEFAULT_MANIFEST.capabilities.shell.enabled,\n blocked: parsed.capabilities?.shell?.blocked ?? DEFAULT_MANIFEST.capabilities.shell.blocked,\n autoApproved: parsed.capabilities?.shell?.autoApproved ?? DEFAULT_MANIFEST.capabilities.shell.autoApproved,\n needsApproval: parsed.capabilities?.shell?.needsApproval ?? DEFAULT_MANIFEST.capabilities.shell.needsApproval,\n cwdOnly: parsed.capabilities?.shell?.cwdOnly ?? DEFAULT_MANIFEST.capabilities.shell.cwdOnly,\n },\n git: {\n enabled: parsed.capabilities?.git?.enabled ?? DEFAULT_MANIFEST.capabilities.git.enabled,\n autoApproveRead: parsed.capabilities?.git?.autoApproveRead ?? DEFAULT_MANIFEST.capabilities.git.autoApproveRead,\n approveWrite: parsed.capabilities?.git?.approveWrite ?? DEFAULT_MANIFEST.capabilities.git.approveWrite,\n },\n },\n };\n }\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createReadFileTool(permissions: PermissionManager) {\n return tool({\n description: 'Read the contents of a file. The path must be within an allowed scope.',\n parameters: z.object({\n path: z.string().describe('Absolute or relative path to the file'),\n }),\n execute: async ({ path }) => {\n const resolved = resolve(path);\n const check = await permissions.checkFsAccess(resolved, 'read');\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n if (!existsSync(resolved)) {\n return `Error: File not found: ${resolved}`;\n }\n\n try {\n const stat = await import('node:fs').then(m => m.statSync(resolved));\n if (stat.isDirectory()) {\n return `Error: ${resolved} is a directory, not a file. Use list_dir instead.`;\n }\n if (stat.size > 1024 * 1024) {\n return `Error: File too large (${Math.round(stat.size / 1024)}KB). Maximum is 1MB.`;\n }\n return readFileSync(resolved, 'utf-8');\n } catch (err: any) {\n return `Error reading file: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { existsSync, writeFileSync, readFileSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport { mkdirSync } from 'node:fs';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createWriteFileTool(permissions: PermissionManager) {\n return tool({\n description: 'Write content to an existing file. The path must be within a writable scope.',\n parameters: z.object({\n path: z.string().describe('Absolute or relative path to the file'),\n content: z.string().describe('The content to write to the file'),\n }),\n execute: async ({ path, content }) => {\n const resolved = resolve(path);\n const check = await permissions.checkFsAccess(resolved, 'write');\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n if (!existsSync(resolved)) {\n return `Error: File not found: ${resolved}. Use create_file to create new files.`;\n }\n\n try {\n writeFileSync(resolved, content, 'utf-8');\n return `Successfully wrote ${content.length} bytes to ${resolved}`;\n } catch (err: any) {\n return `Error writing file: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { existsSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createCreateFileTool(permissions: PermissionManager) {\n return tool({\n description: 'Create a new file with the given content. Also creates parent directories if needed. The path must be within a writable scope.',\n parameters: z.object({\n path: z.string().describe('Absolute or relative path for the new file'),\n content: z.string().describe('The content of the new file'),\n }),\n execute: async ({ path, content }) => {\n const resolved = resolve(path);\n const check = await permissions.checkFsAccess(resolved, 'write');\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n if (existsSync(resolved)) {\n return `Error: File already exists: ${resolved}. Use write_file to modify existing files.`;\n }\n\n try {\n const dir = dirname(resolved);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(resolved, content, 'utf-8');\n return `Successfully created ${resolved} (${content.length} bytes)`;\n } catch (err: any) {\n return `Error creating file: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { existsSync, readdirSync, statSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createListDirTool(permissions: PermissionManager) {\n return tool({\n description: 'List the contents of a directory. Shows file names, types, and sizes.',\n parameters: z.object({\n path: z.string().describe('Absolute or relative path to the directory'),\n }),\n execute: async ({ path }) => {\n const resolved = resolve(path);\n const check = await permissions.checkFsAccess(resolved, 'read');\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n if (!existsSync(resolved)) {\n return `Error: Directory not found: ${resolved}`;\n }\n\n try {\n const stat = statSync(resolved);\n if (!stat.isDirectory()) {\n return `Error: ${resolved} is a file, not a directory. Use read_file instead.`;\n }\n\n const entries = readdirSync(resolved, { withFileTypes: true });\n const lines = entries.map(entry => {\n const isDir = entry.isDirectory();\n const fullPath = join(resolved, entry.name);\n let size = '';\n try {\n if (!isDir) {\n size = ` (${formatSize(statSync(fullPath).size)})`;\n }\n } catch {}\n return `${isDir ? '📁' : '📄'} ${entry.name}${size}`;\n });\n\n if (lines.length === 0) {\n return `Directory ${resolved} is empty`;\n }\n\n return `Contents of ${resolved} (${entries.length} items):\\n${lines.join('\\n')}`;\n } catch (err: any) {\n return `Error listing directory: ${err.message}`;\n }\n },\n });\n}\n\nfunction join(base: string, name: string): string {\n return base.endsWith('/') ? base + name : base + '/' + name;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { existsSync, unlinkSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createDeleteFileTool(permissions: PermissionManager) {\n return tool({\n description: 'Delete a file. This action cannot be undone. The path must be within a writable scope. Always asks for confirmation.',\n parameters: z.object({\n path: z.string().describe('Absolute or relative path to the file to delete'),\n }),\n execute: async ({ path }) => {\n const resolved = resolve(path);\n const check = await permissions.checkFsAccess(resolved, 'write');\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n if (!existsSync(resolved)) {\n return `Error: File not found: ${resolved}`;\n }\n\n try {\n const stat = await import('node:fs').then(m => m.statSync(resolved));\n if (stat.isDirectory()) {\n return `Error: ${resolved} is a directory. Cannot delete directories for safety.`;\n }\n unlinkSync(resolved);\n return `Successfully deleted ${resolved}`;\n } catch (err: any) {\n return `Error deleting file: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createEditFileTool(permissions: PermissionManager) {\n return tool({\n description: 'Edit a file by replacing an exact string match with new content. Use this instead of write_file when you only need to change part of a file. The old_string must match exactly (including whitespace and indentation). Fails if old_string is not found or found multiple times.',\n parameters: z.object({\n path: z.string().describe('Absolute or relative path to the file'),\n old_string: z.string().describe('The exact text to find in the file (must match exactly)'),\n new_string: z.string().describe('The text to replace it with'),\n }),\n execute: async ({ path, old_string, new_string }) => {\n const resolved = resolve(path);\n\n const fsCheck = await permissions.checkFsAccess(resolved, 'write');\n if (!fsCheck.allowed) {\n return `Error: ${fsCheck.reason}`;\n }\n\n try {\n const content = readFileSync(resolved, 'utf-8');\n\n const count = content.split(old_string).length - 1;\n if (count === 0) {\n return `Error: old_string not found in ${path}. Make sure the text matches exactly, including whitespace and indentation.`;\n }\n if (count > 1) {\n return `Error: old_string found ${count} times in ${path}. Provide more surrounding context to make the match unique.`;\n }\n\n const newContent = content.replace(old_string, new_string);\n writeFileSync(resolved, newContent, 'utf-8');\n\n const linesAdded = new_string.split('\\n').length;\n const linesRemoved = old_string.split('\\n').length;\n return `Edited ${path}: replaced ${linesRemoved} line(s) with ${linesAdded} line(s)`;\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return `Error: File not found: ${path}. Use create_file to create new files.`;\n }\n return `Error editing file: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { existsSync, statSync } from 'node:fs';\nimport { resolve, basename } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createSendFileTool(\n permissions: PermissionManager,\n sendFile: (filePath: string) => Promise<void>,\n) {\n return tool({\n description:\n 'Send a file to the user. On Telegram the file is uploaded as an attachment. On CLI the file path and size are displayed. The path must be within an allowed read scope.',\n parameters: z.object({\n path: z.string().describe('Absolute or relative path to the file to send'),\n }),\n execute: async ({ path }) => {\n const resolved = resolve(path);\n const check = await permissions.checkFsAccess(resolved, 'read');\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n if (!existsSync(resolved)) {\n return `Error: File not found: ${resolved}`;\n }\n\n const stat = statSync(resolved);\n if (stat.isDirectory()) {\n return `Error: ${resolved} is a directory, not a file. Use list_dir to show its contents.`;\n }\n\n if (stat.size > 50 * 1024 * 1024) {\n return `Error: File too large (${Math.round(stat.size / (1024 * 1024))}MB). Maximum is 50MB.`;\n }\n\n try {\n await sendFile(resolved);\n const filename = basename(resolved);\n const sizeStr =\n stat.size > 1024 * 1024\n ? `${(stat.size / (1024 * 1024)).toFixed(1)}MB`\n : `${Math.round(stat.size / 1024)}KB`;\n return `File sent: ${filename} (${sizeStr})`;\n } catch (err: any) {\n return `Error sending file: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\nimport { resolve } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\nimport { logger } from '../../utils/logger.js';\n\nexport function createRunCommandTool(permissions: PermissionManager) {\n return tool({\n description: `Run a shell command. Commands run in the current working directory unless an absolute path is given.\nBlocked commands (sudo, rm -rf /, etc.) are never executed.\nAuto-approved commands (ls, cat, git status, curl, etc.) run without asking.\nOther commands require user approval — tell the user what command you want to run and ask for confirmation. If they say \"yes\", try again. If they say \"always\", use the approve_command tool.`,\n parameters: z.object({\n command: z.string().describe('The shell command to execute'),\n }),\n execute: async ({ command }) => {\n const check = await permissions.checkShellCommand(command);\n if (!check.allowed) {\n if (check.needsApproval) {\n const baseCmd = command.trim().split(/\\s+/)[0];\n permissions.addPendingApproval(baseCmd);\n return `⚠ Command requires approval: ${command}\\n\\nTell the user what this command does and ask for permission. If they approve, try running it again. If they say \"always\", use the approve_command tool to permanently approve this command type.`;\n }\n return `Error: ${check.reason}`;\n }\n\n try {\n logger.info({ cmd: command }, 'Executing shell command');\n const result = execSync(command, {\n cwd: process.cwd(),\n timeout: 30000,\n maxBuffer: 1024 * 1024,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n const output = result?.trim() || '(no output)';\n return output;\n } catch (err: any) {\n const stderr = err.stderr?.trim();\n const stdout = err.stdout?.trim();\n let msg = `Command exited with code ${err.status || 'unknown'}`;\n if (stdout) msg += `\\nOutput: ${stdout}`;\n if (stderr) msg += `\\nError: ${stderr}`;\n return msg;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createApproveCommandTool(permissions: PermissionManager) {\n return tool({\n description: 'Permanently approve a command type so it runs without asking in the future. Use this when the user says \"always\" or \"always approve\" for a command. For example, if the user says \"always approve curl\", call this with command=\"curl\".',\n parameters: z.object({\n command: z.string().describe('The base command to permanently approve (e.g. \"curl\", \"docker\", \"npm\")'),\n }),\n execute: async ({ command }) => {\n const baseCmd = command.trim().split(/\\s+/)[0];\n permissions.addApprovedCommand(baseCmd);\n return `Command \"${baseCmd}\" has been permanently approved. Future calls to \"${baseCmd} ...\" will run without asking.`;\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { SkillLoader } from '../../skills/loader.js';\nimport { parse as parseYaml } from 'yaml';\n\nexport function createInstallSkillTool(skillLoader: SkillLoader) {\n return tool({\n description: 'Install a new skill by providing SKILL.md markdown content or a URL. The content must have YAML frontmatter (---) with at least name and description fields.',\n parameters: z.object({\n content: z.string().optional().describe('Raw SKILL.md markdown content with YAML frontmatter'),\n url: z.string().optional().describe('URL to fetch a SKILL.md from'),\n }),\n execute: async ({ content, url }) => {\n let skillContent: string;\n\n if (url && !content) {\n try {\n const resp = await fetch(url);\n if (!resp.ok) {\n return `Failed to fetch skill from URL: ${resp.status} ${resp.statusText}`;\n }\n skillContent = await resp.text();\n } catch (err: any) {\n return `Failed to fetch skill from URL: ${err.message}`;\n }\n } else if (content) {\n skillContent = content;\n } else {\n return 'Either content or url must be provided.';\n }\n\n const fmMatch = skillContent.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n if (!fmMatch) {\n return 'Invalid SKILL.md: missing YAML frontmatter (--- delimiters).';\n }\n\n try {\n const meta = parseYaml(fmMatch[1]) as Record<string, any>;\n if (!meta.name || !meta.description) {\n return 'Invalid SKILL.md: frontmatter must include at least \"name\" and \"description\".';\n }\n } catch {\n return 'Invalid SKILL.md: could not parse YAML frontmatter.';\n }\n\n const fmMatch2 = skillContent.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n const meta = parseYaml(fmMatch2![1]) as { name: string };\n const skillDir = skillLoader.saveSkill(meta.name, skillContent);\n\n return `Skill \"${meta.name}\" installed to ${skillDir}. Use list_skills to see all installed skills, or use_skill to invoke it.`;\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { SkillLoader } from '../../skills/loader.js';\n\nexport function createListSkillsTool(skillLoader: SkillLoader) {\n return tool({\n description: 'List all installed skills with their names and descriptions.',\n parameters: z.object({}),\n execute: async () => {\n const skills = skillLoader.getDiscovered();\n if (skills.length === 0) {\n return 'No skills installed. Use install_skill to add one.';\n }\n return skills.map(s => `${s.name}: ${s.description}`).join('\\n');\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { SkillLoader } from '../../skills/loader.js';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createUseSkillTool(skillLoader: SkillLoader, permissions: PermissionManager) {\n return tool({\n description: 'Load and invoke a skill by name. Returns the skill\\'s full instructions which should be followed as guidance for the current task.',\n parameters: z.object({\n name: z.string().describe('Name of the skill to invoke'),\n }),\n execute: async ({ name }) => {\n const skill = skillLoader.load(name);\n if (!skill) {\n return `Skill \"${name}\" not found. Use list_skills to see available skills.`;\n }\n\n if (skill['allowed-tools'] && skill['allowed-tools'].length > 0) {\n permissions.elevateForSkill(skill['allowed-tools']);\n }\n\n let result = `## Skill: ${skill.name}\\n\\n${skill.instructions}`;\n\n if (skill['allowed-tools'] && skill['allowed-tools'].length > 0) {\n result += `\\n\\nAllowed tools: ${skill['allowed-tools'].join(', ')}`;\n }\n\n if (skill['disable-model-invocation']) {\n result += '\\n\\nNote: This skill has model invocation disabled. Follow instructions only.';\n }\n\n return result;\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport cron from 'node-cron';\nimport type { Scheduler, ScheduledTaskManifest } from '../../core/scheduler.js';\n\nexport function createScheduleTaskTool(scheduler: Scheduler, getContext: () => { channelId: string; channelType: string }) {\n return tool({\n description: 'Schedule a task. Use \"cron\" for recurring tasks (e.g. \"0 9 * * *\" for daily at 9am) or \"delay_seconds\" for one-shot delayed tasks (e.g. 15 for \"remind me in 15 seconds\"). Provide exactly one of cron or delay_seconds.',\n parameters: z.object({\n cron: z.string().optional().describe('Cron expression for recurring tasks (e.g. \"0 9 * * *\" for daily at 9am)'),\n delay_seconds: z.number().optional().describe('Delay in seconds for one-shot tasks (e.g. 15 for \"remind me in 15 seconds\")'),\n description: z.string().describe('Human-readable description of what this task does'),\n prompt: z.string().optional().describe('Prompt to send to the agent when the task fires'),\n skill_name: z.string().optional().describe('Name of a skill to invoke when the task fires'),\n }),\n execute: async ({ cron: cronExpr, delay_seconds, description, prompt, skill_name }) => {\n if (!cronExpr && !delay_seconds) {\n return 'Either cron or delay_seconds must be provided.';\n }\n if (cronExpr && delay_seconds) {\n return 'Provide either cron or delay_seconds, not both.';\n }\n\n if (!prompt && !skill_name) {\n return 'Either prompt or skill_name must be provided so the task has something to do.';\n }\n\n const id = `task-${Date.now().toString(36)}`;\n const ctx = getContext();\n\n if (delay_seconds) {\n const manifest: ScheduledTaskManifest = {\n id,\n description,\n prompt,\n skillName: skill_name,\n delaySeconds: delay_seconds,\n executeAt: new Date(Date.now() + delay_seconds * 1000).toISOString(),\n createdAt: new Date().toISOString(),\n sourceChannelId: ctx.channelId,\n sourceChannelType: ctx.channelType,\n };\n\n scheduler.addDelayedTask(manifest);\n scheduler.persistSchedules();\n\n const triggerType = skill_name ? `skill: ${skill_name}` : `prompt: \"${prompt!.slice(0, 60)}\"`;\n return `Reminder \"${id}\" set. Will trigger in ${delay_seconds} second${delay_seconds !== 1 ? 's' : ''}. ${triggerType}. Description: ${description}`;\n }\n\n if (!cron.validate(cronExpr!)) {\n return `Invalid cron expression: \"${cronExpr}\". Use standard 5-field cron format (min hour day month weekday).`;\n }\n\n const manifest: ScheduledTaskManifest = {\n id,\n cron: cronExpr,\n description,\n prompt,\n skillName: skill_name,\n createdAt: new Date().toISOString(),\n sourceChannelId: ctx.channelId,\n sourceChannelType: ctx.channelType,\n };\n\n scheduler.addPersistedTask(manifest);\n scheduler.persistSchedules();\n\n const triggerType = skill_name ? `skill: ${skill_name}` : `prompt: \"${prompt!.slice(0, 60)}\"`;\n return `Task \"${id}\" scheduled. Cron: ${cronExpr}. Will execute ${triggerType}. Description: ${description}`;\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { Scheduler, ScheduledTaskManifest } from '../../core/scheduler.js';\n\nexport function createListTasksTool(scheduler: Scheduler) {\n return tool({\n description: 'List all scheduled tasks with their cron expressions and descriptions.',\n parameters: z.object({}),\n execute: async () => {\n const manifests = scheduler.getManifests();\n if (manifests.length === 0) {\n return 'No scheduled tasks. Use schedule_task to create one.';\n }\n return manifests.map((m: ScheduledTaskManifest) => {\n const trigger = m.skillName ? `skill: ${m.skillName}` : m.prompt ? `prompt: \"${m.prompt.slice(0, 40)}\"` : 'no action';\n return `${m.id} | ${m.cron} | ${m.description} | ${trigger}`;\n }).join('\\n');\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { Scheduler } from '../../core/scheduler.js';\n\nexport function createCancelTaskTool(scheduler: Scheduler) {\n return tool({\n description: 'Cancel and remove a scheduled task by its ID.',\n parameters: z.object({\n id: z.string().describe('ID of the scheduled task to cancel'),\n }),\n execute: async ({ id }) => {\n const manifests = scheduler.getManifests();\n const exists = manifests.some(m => m.id === id);\n if (!exists) {\n return `Task \"${id}\" not found. Use list_scheduled_tasks to see active tasks.`;\n }\n\n scheduler.removeTask(id);\n scheduler.persistSchedules();\n\n return `Task \"${id}\" cancelled and removed.`;\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { TokenBudget } from '../../utils/tokens.js';\n\nexport function createBudgetStatusTool(tokenBudget: TokenBudget) {\n return tool({\n description: 'Check the current token budget status — how many tokens have been used today, how many remain, and what percentage is consumed.',\n parameters: z.object({}),\n execute: async () => {\n return tokenBudget.getStatusText();\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\n\nexport function createGitStatusTool() {\n return tool({\n description: 'Show the working tree status. Returns staged, unstaged, and untracked files.',\n parameters: z.object({\n path: z.string().optional().describe('Path to check (defaults to current directory)'),\n }),\n execute: async ({ path }) => {\n try {\n const cmd = path ? `git -C \"${path}\" status --porcelain` : 'git status --porcelain';\n const result = execSync(cmd, { encoding: 'utf-8', timeout: 10000 });\n if (!result.trim()) return 'Working tree clean — no changes.';\n return result.trim();\n } catch (err: any) {\n return `Error: ${err.stderr?.trim() || err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\n\nexport function createGitDiffTool() {\n return tool({\n description: 'Show changes between commits, commit and working tree, etc. Shows what has been modified.',\n parameters: z.object({\n path: z.string().optional().describe('File or directory to diff'),\n staged: z.boolean().optional().describe('Show staged changes (cached) instead of unstaged'),\n }),\n execute: async ({ path, staged }) => {\n try {\n let cmd = 'git diff';\n if (staged) cmd += ' --cached';\n if (path) cmd += ` -- \"${path}\"`;\n const result = execSync(cmd, { encoding: 'utf-8', timeout: 15000 });\n if (!result.trim()) return 'No differences found.';\n const truncated = result.length > 15000 ? result.slice(0, 15000) + '\\n... (truncated)' : result;\n return truncated;\n } catch (err: any) {\n return `Error: ${err.stderr?.trim() || err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\n\nexport function createGitLogTool() {\n return tool({\n description: 'Show commit logs. Returns recent commit history with hash, author, date, and message.',\n parameters: z.object({\n count: z.number().optional().describe('Number of commits to show (default 10)'),\n path: z.string().optional().describe('File or directory to show log for'),\n }),\n execute: async ({ count, path }) => {\n try {\n const n = count ?? 10;\n let cmd = `git log --oneline --decorate -${n}`;\n if (path) cmd += ` -- \"${path}\"`;\n const result = execSync(cmd, { encoding: 'utf-8', timeout: 10000 });\n if (!result.trim()) return 'No commits found.';\n return result.trim();\n } catch (err: any) {\n return `Error: ${err.stderr?.trim() || err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\n\nexport function createGitAddTool() {\n return tool({\n description: 'Add file contents to the index (staging area). Prepares files for commit.',\n parameters: z.object({\n paths: z.array(z.string()).describe('File paths to stage'),\n }),\n execute: async ({ paths }) => {\n try {\n const fileArgs = paths.map(p => `\"${p}\"`).join(' ');\n const result = execSync(`git add ${fileArgs}`, { encoding: 'utf-8', timeout: 10000 });\n return `Staged ${paths.length} file(s): ${paths.join(', ')}`;\n } catch (err: any) {\n return `Error: ${err.stderr?.trim() || err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\n\nexport function createGitCommitTool() {\n return tool({\n description: 'Record changes to the repository. Creates a new commit with staged changes.',\n parameters: z.object({\n message: z.string().describe('Commit message'),\n }),\n execute: async ({ message }) => {\n try {\n const escapedMsg = message.replace(/\"/g, '\\\\\"');\n const result = execSync(`git commit -m \"${escapedMsg}\"`, { encoding: 'utf-8', timeout: 10000 });\n return result.trim() || 'Committed successfully.';\n } catch (err: any) {\n const stderr = err.stderr?.trim() || '';\n if (stderr.includes('nothing to commit')) {\n return 'Nothing to commit — no staged changes.';\n }\n return `Error: ${stderr || err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createGitPushTool(permissions: PermissionManager) {\n return tool({\n description: 'Push commits to a remote repository. This modifies a remote and requires approval.',\n parameters: z.object({\n remote: z.string().optional().describe('Remote name (default: origin)'),\n branch: z.string().optional().describe('Branch name (default: current branch)'),\n }),\n execute: async ({ remote, branch }) => {\n const cmd = `git push ${remote || 'origin'} ${branch || ''}`.trim();\n const check = await permissions.checkShellCommand(cmd);\n if (!check.allowed && check.needsApproval) {\n const baseCmd = 'git';\n permissions.addPendingApproval(baseCmd);\n return `⚠ This command pushes to a remote: ${cmd}\\nAsk the user for permission. If they approve, try again. If they say \"always\", use the approve_command tool.`;\n }\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n try {\n const result = execSync(cmd, { encoding: 'utf-8', timeout: 30000 });\n return result.trim() || 'Pushed successfully.';\n } catch (err: any) {\n return `Error: ${err.stderr?.trim() || err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\n\nconst MAX_CONTENT_LENGTH = 15000;\n\nfunction stripHtml(html: string): string {\n let text = html;\n\n text = text.replace(/<script[\\s\\S]*?<\\/script>/gi, '');\n text = text.replace(/<style[\\s\\S]*?<\\/style>/gi, '');\n text = text.replace(/<nav[\\s\\S]*?<\\/nav>/gi, '');\n text = text.replace(/<footer[\\s\\S]*?<\\/footer>/gi, '');\n text = text.replace(/<header[\\s\\S]*?<\\/header>/gi, '');\n\n text = text.replace(/<br\\s*\\/?>/gi, '\\n');\n text = text.replace(/<\\/p>/gi, '\\n');\n text = text.replace(/<\\/h[1-6]>/gi, '\\n');\n text = text.replace(/<\\/li>/gi, '\\n');\n text = text.replace(/<\\/div>/gi, '\\n');\n text = text.replace(/<hr\\s*\\/?>/gi, '\\n---\\n');\n\n text = text.replace(/<a[^>]*href=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/a>/gi, '[$2]($1)');\n text = text.replace(/<img[^>]*alt=\"([^\"]*)\"[^>]*>/gi, '[image: $1]');\n text = text.replace(/<code[^>]*>([\\s\\S]*?)<\\/code>/gi, '`$1`');\n text = text.replace(/<pre[^>]*>([\\s\\S]*?)<\\/pre>/gi, '\\n```\\n$1\\n```\\n');\n text = text.replace(/<strong[^>]*>([\\s\\S]*?)<\\/strong>/gi, '**$1**');\n text = text.replace(/<em[^>]*>([\\s\\S]*?)<\\/em>/gi, '*$1*');\n\n text = text.replace(/<[^>]+>/g, '');\n\n text = text.replace(/&amp;/g, '&');\n text = text.replace(/&lt;/g, '<');\n text = text.replace(/&gt;/g, '>');\n text = text.replace(/&quot;/g, '\"');\n text = text.replace(/&#39;/g, \"'\");\n text = text.replace(/&nbsp;/g, ' ');\n\n text = text.replace(/\\n{3,}/g, '\\n\\n');\n text = text.trim();\n\n return text;\n}\n\nexport function createFetchUrlTool() {\n return tool({\n description: 'Fetch a URL and return its content as text. Strips HTML to readable markdown-like format. Useful for reading documentation, APIs, or web pages.',\n parameters: z.object({\n url: z.string().describe('The URL to fetch'),\n format: z.enum(['text', 'markdown']).optional().describe('Output format (default: markdown)'),\n }),\n execute: async ({ url, format }) => {\n const outputFormat = format ?? 'markdown';\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 15000);\n\n const resp = await fetch(url, {\n signal: controller.signal,\n headers: {\n 'User-Agent': 'Mercury-Agent/0.1.0',\n 'Accept': 'text/html,application/json,text/plain',\n },\n });\n\n clearTimeout(timeout);\n\n if (!resp.ok) {\n return `HTTP ${resp.status} ${resp.statusText} for ${url}`;\n }\n\n const contentType = resp.headers.get('content-type') || '';\n const body = await resp.text();\n\n if (contentType.includes('application/json')) {\n try {\n const json = JSON.parse(body);\n const formatted = JSON.stringify(json, null, 2);\n return formatted.length > MAX_CONTENT_LENGTH\n ? formatted.slice(0, MAX_CONTENT_LENGTH) + '\\n... (truncated)'\n : formatted;\n } catch {\n return body.slice(0, MAX_CONTENT_LENGTH);\n }\n }\n\n if (contentType.includes('text/html') && outputFormat === 'markdown') {\n const text = stripHtml(body);\n return text.length > MAX_CONTENT_LENGTH\n ? text.slice(0, MAX_CONTENT_LENGTH) + '\\n... (truncated)'\n : text;\n }\n\n return body.length > MAX_CONTENT_LENGTH\n ? body.slice(0, MAX_CONTENT_LENGTH) + '\\n... (truncated)'\n : body;\n } catch (err: any) {\n if (err.name === 'AbortError') {\n return `Request to ${url} timed out after 15 seconds.`;\n }\n return `Error fetching ${url}: ${err.message}`;\n }\n },\n });\n}","import type { Tool } from 'ai';\nimport { PermissionManager } from './permissions.js';\nimport { createReadFileTool } from './filesystem/read-file.js';\nimport { createWriteFileTool } from './filesystem/write-file.js';\nimport { createCreateFileTool } from './filesystem/create-file.js';\nimport { createListDirTool } from './filesystem/list-dir.js';\nimport { createDeleteFileTool } from './filesystem/delete-file.js';\nimport { createEditFileTool } from './filesystem/edit-file.js';\nimport { createSendFileTool } from './filesystem/send-file.js';\nimport { createRunCommandTool } from './shell/run-command.js';\nimport { createApproveCommandTool } from './shell/approve-command.js';\nimport { createInstallSkillTool } from './skills/install-skill.js';\nimport { createListSkillsTool } from './skills/list-skills.js';\nimport { createUseSkillTool } from './skills/use-skill.js';\nimport { createScheduleTaskTool } from './scheduler/schedule-task.js';\nimport { createListTasksTool } from './scheduler/list-tasks.js';\nimport { createCancelTaskTool } from './scheduler/cancel-task.js';\nimport { createBudgetStatusTool } from './system/budget-status.js';\nimport { createGitStatusTool } from './git/git-status.js';\nimport { createGitDiffTool } from './git/git-diff.js';\nimport { createGitLogTool } from './git/git-log.js';\nimport { createGitAddTool } from './git/git-add.js';\nimport { createGitCommitTool } from './git/git-commit.js';\nimport { createGitPushTool } from './git/git-push.js';\nimport { createFetchUrlTool } from './web/fetch-url.js';\nimport type { SkillLoader } from '../skills/loader.js';\nimport type { Scheduler } from '../core/scheduler.js';\nimport type { TokenBudget } from '../utils/tokens.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface ChatCommandContext {\n toolNames: () => string[];\n skillNames: () => string[];\n config: () => import('../utils/config.js').MercuryConfig;\n tokenBudget: () => import('../utils/tokens.js').TokenBudget;\n manual: () => string;\n}\n\nexport class CapabilityRegistry {\n readonly permissions: PermissionManager;\n private tools: Record<string, Tool> = {};\n private skillLoader?: SkillLoader;\n private scheduler?: Scheduler;\n private tokenBudget?: TokenBudget;\n private sendFileHandler?: (filePath: string) => Promise<void>;\n private currentChannelId = 'cli';\n private currentChannelType = 'cli';\n private chatCommandContext?: ChatCommandContext;\n\n constructor(skillLoader?: SkillLoader, scheduler?: Scheduler, tokenBudget?: TokenBudget) {\n this.permissions = new PermissionManager();\n this.skillLoader = skillLoader;\n this.scheduler = scheduler;\n this.tokenBudget = tokenBudget;\n }\n\n setChatCommandContext(ctx: ChatCommandContext): void {\n this.chatCommandContext = ctx;\n }\n\n getChatCommandContext(): ChatCommandContext | undefined {\n return this.chatCommandContext;\n }\n\n setChannelContext(channelId: string, channelType: string): void {\n this.currentChannelId = channelId;\n this.currentChannelType = channelType;\n }\n\n getChannelContext(): { channelId: string; channelType: string } {\n return { channelId: this.currentChannelId, channelType: this.currentChannelType };\n }\n\n setSendFileHandler(handler: (filePath: string) => Promise<void>): void {\n this.sendFileHandler = handler;\n }\n\n registerAll(): void {\n const manifest = this.permissions.getManifest();\n\n if (manifest.capabilities.filesystem.enabled) {\n this.tools.read_file = createReadFileTool(this.permissions);\n this.tools.write_file = createWriteFileTool(this.permissions);\n this.tools.create_file = createCreateFileTool(this.permissions);\n this.tools.list_dir = createListDirTool(this.permissions);\n this.tools.delete_file = createDeleteFileTool(this.permissions);\n this.tools.edit_file = createEditFileTool(this.permissions);\n\n if (this.sendFileHandler) {\n this.tools.send_file = createSendFileTool(this.permissions, this.sendFileHandler);\n }\n\n logger.info('Filesystem tools registered');\n }\n\n if (manifest.capabilities.shell.enabled) {\n this.tools.run_command = createRunCommandTool(this.permissions);\n this.tools.approve_command = createApproveCommandTool(this.permissions);\n logger.info('Shell tools registered');\n }\n\n if (this.skillLoader) {\n this.tools.install_skill = createInstallSkillTool(this.skillLoader);\n this.tools.list_skills = createListSkillsTool(this.skillLoader);\n this.tools.use_skill = createUseSkillTool(this.skillLoader, this.permissions);\n logger.info('Skill tools registered');\n }\n\n if (this.scheduler) {\n this.tools.schedule_task = createScheduleTaskTool(this.scheduler, () => this.getChannelContext());\n this.tools.list_scheduled_tasks = createListTasksTool(this.scheduler);\n this.tools.cancel_scheduled_task = createCancelTaskTool(this.scheduler);\n logger.info('Scheduler tools registered');\n }\n\n if (this.tokenBudget) {\n this.tools.budget_status = createBudgetStatusTool(this.tokenBudget);\n logger.info('Budget tool registered');\n }\n\n if (manifest.capabilities.git?.enabled) {\n this.tools.git_status = createGitStatusTool();\n this.tools.git_diff = createGitDiffTool();\n this.tools.git_log = createGitLogTool();\n this.tools.git_add = createGitAddTool();\n this.tools.git_commit = createGitCommitTool();\n this.tools.git_push = createGitPushTool(this.permissions);\n logger.info('Git tools registered');\n }\n\n this.tools.fetch_url = createFetchUrlTool();\n logger.info('Web fetch tool registered');\n }\n\n getTools(): Record<string, Tool> {\n return this.tools;\n }\n\n getToolNames(): string[] {\n return Object.keys(this.tools);\n }\n\n getSkillContext(): string {\n return this.skillLoader?.getSkillSummariesText() || '';\n }\n}","import { existsSync, readFileSync, readdirSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport { getMercuryHome } from '../utils/config.js';\nimport type { SkillDiscovery, Skill, SkillMeta } from './types.js';\nimport { logger } from '../utils/logger.js';\n\nconst SKILL_FILE = 'SKILL.md';\n\nfunction parseSkillMd(content: string): { meta: SkillMeta; instructions: string } | null {\n const fmMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n([\\s\\S]*)$/);\n if (!fmMatch) return null;\n\n try {\n const meta = parseYaml(fmMatch[1]) as SkillMeta;\n const instructions = fmMatch[2].trim();\n if (!meta.name || !meta.description) {\n logger.warn({ meta }, 'SKILL.md missing required fields (name, description)');\n return null;\n }\n return { meta, instructions };\n } catch (err) {\n logger.warn({ err }, 'Failed to parse SKILL.md frontmatter');\n return null;\n }\n}\n\nexport class SkillLoader {\n private skillsDir: string;\n private discovered: Map<string, SkillDiscovery> = new Map();\n private loaded: Map<string, Skill> = new Map();\n\n constructor(skillsDir?: string) {\n this.skillsDir = skillsDir || join(getMercuryHome(), 'skills');\n }\n\n discover(): SkillDiscovery[] {\n this.discovered.clear();\n this.loaded.clear();\n if (!existsSync(this.skillsDir)) {\n mkdirSync(this.skillsDir, { recursive: true });\n this.seedTemplate();\n return [];\n }\n\n const entries = readdirSync(this.skillsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith('_')) continue;\n const skillPath = join(this.skillsDir, entry.name, SKILL_FILE);\n if (!existsSync(skillPath)) continue;\n try {\n const raw = readFileSync(skillPath, 'utf-8');\n const parsed = parseSkillMd(raw);\n if (!parsed) continue;\n this.discovered.set(parsed.meta.name, {\n name: parsed.meta.name,\n description: parsed.meta.description,\n });\n logger.info({ skill: parsed.meta.name }, 'Skill discovered');\n } catch (err) {\n logger.warn({ dir: entry.name, err }, 'Failed to load skill');\n }\n }\n\n return [...this.discovered.values()];\n }\n\n load(name: string): Skill | null {\n const cached = this.loaded.get(name);\n if (cached) return cached;\n\n for (const entry of readdirSync(this.skillsDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('_')) continue;\n const skillPath = join(this.skillsDir, entry.name, SKILL_FILE);\n if (!existsSync(skillPath)) continue;\n try {\n const raw = readFileSync(skillPath, 'utf-8');\n const parsed = parseSkillMd(raw);\n if (!parsed || parsed.meta.name !== name) continue;\n\n const skillDir = join(this.skillsDir, entry.name);\n const skill: Skill = {\n ...parsed.meta,\n instructions: parsed.instructions,\n scriptsDir: existsSync(join(skillDir, 'scripts')) ? join(skillDir, 'scripts') : undefined,\n referencesDir: existsSync(join(skillDir, 'references')) ? join(skillDir, 'references') : undefined,\n };\n this.loaded.set(name, skill);\n return skill;\n } catch (err) {\n logger.warn({ err, name }, 'Failed to load skill');\n return null;\n }\n }\n\n return null;\n }\n\n getDiscovered(): SkillDiscovery[] {\n return [...this.discovered.values()];\n }\n\n getSkillSummariesText(): string {\n const skills = this.getDiscovered();\n if (skills.length === 0) return '';\n return 'Available skills:\\n' + skills.map(s => `- ${s.name}: ${s.description}`).join('\\n');\n }\n\n saveSkill(name: string, content: string): string {\n const skillDir = join(this.skillsDir, name);\n if (!existsSync(skillDir)) {\n mkdirSync(skillDir, { recursive: true });\n }\n writeFileSync(join(skillDir, SKILL_FILE), content, 'utf-8');\n logger.info({ skill: name }, 'Skill saved');\n this.discover();\n return skillDir;\n }\n\n private seedTemplate(): void {\n const templateDir = join(this.skillsDir, '_template');\n mkdirSync(templateDir, { recursive: true });\n\n const content = `---\nname: template-skill\ndescription: A template skill for Mercury. Use this as a starting point to create your own skills.\nversion: 0.1.0\nallowed-tools:\n - read_file\n - list_dir\n---\n\n# Template Skill\n\nThis is a template skill for Mercury. Copy this directory and edit SKILL.md to create your own skill.\n\n## What It Does\n\nDescribe what this skill enables Mercury to do. When invoked via the use_skill tool, these instructions are injected into Mercury's context as guidance.\n\n## Instructions\n\n1. Step one of what Mercury should do\n2. Step two\n3. Continue with specific guidance\n\n## Tips\n\n- Keep instructions concise to save tokens\n- List only the tools you need in allowed-tools\n- The skill name must be unique among installed skills\n`;\n\n writeFileSync(join(templateDir, SKILL_FILE), content, 'utf-8');\n logger.info('Seeded template skill');\n }\n}","import chalk from 'chalk';\n\nexport function getManual(): string {\n const sections: string[] = [];\n\n sections.push('');\n sections.push(chalk.bold.cyan(' MERCURY — Capabilities & Commands'));\n sections.push(chalk.dim(' ─────────────────────────────────────────'));\n sections.push('');\n\n sections.push(chalk.bold.white(' Built-in Tools'));\n sections.push(chalk.dim(' Tools Mercury can use during conversations.'));\n sections.push('');\n\n const tools = [\n ['read_file', 'Read file contents', 'path (required)'],\n ['write_file', 'Write to an existing file', 'path, content'],\n ['create_file', 'Create a new file (+ dirs)', 'path, content'],\n ['edit_file', 'Replace specific text in a file', 'path, old_string, new_string'],\n ['list_dir', 'List directory contents', 'path'],\n ['delete_file', 'Delete a file', 'path'],\n ['run_command', 'Execute a shell command', 'command'],\n ['approve_command', 'Permanently approve a command type', 'command (e.g. \"curl\")'],\n ['fetch_url', 'Fetch a URL and return content', 'url, format? (text/markdown)'],\n ['git_status', 'Show working tree status', 'path?'],\n ['git_diff', 'Show file changes', 'path?, staged?'],\n ['git_log', 'Show commit history', 'count?, path?'],\n ['git_add', 'Stage files for commit', 'paths (array)'],\n ['git_commit', 'Create a commit', 'message'],\n ['git_push', 'Push to remote (needs approval)', 'remote?, branch?'],\n ['install_skill', 'Install a skill from content or URL', 'content? or url?'],\n ['list_skills', 'List installed skills', '—'],\n ['use_skill', 'Invoke a skill by name', 'name'],\n ['schedule_task', 'Schedule a recurring or delayed task', 'cron? or delay_seconds, description, prompt? or skill_name?'],\n ['list_scheduled_tasks', 'List all scheduled tasks', '—'],\n ['cancel_scheduled_task', 'Cancel a scheduled task', 'id'],\n ['budget_status', 'Check token budget', '—'],\n ];\n\n for (const [name, desc, params] of tools) {\n sections.push(` ${chalk.cyan(name.padEnd(24))} ${desc}`);\n sections.push(` ${' '.repeat(24)} ${chalk.dim(params)}`);\n }\n\n sections.push('');\n sections.push(chalk.bold.white(' CLI Commands'));\n sections.push(chalk.dim(' Run these from your terminal (no API calls consumed).'));\n sections.push('');\n\n const commands = [\n ['mercury up', 'Start persistently (install service + daemon)'],\n ['mercury', 'Start the agent (same as mercury start)'],\n ['mercury start', 'Start the agent in foreground'],\n ['mercury start -d', 'Start in background (daemon mode)'],\n ['mercury restart', 'Restart a background process'],\n ['mercury stop', 'Stop a background process'],\n ['mercury logs', 'Show recent daemon logs'],\n ['mercury doctor', 'Reconfigure settings (Enter keeps current)'],\n ['mercury setup', 'Re-run the setup wizard'],\n ['mercury status', 'Show config and daemon status'],\n ['mercury help', 'Show this manual'],\n ['mercury service install', 'Install as system service (auto-start)'],\n ['mercury service uninstall', 'Uninstall system service'],\n ['mercury service status', 'Show system service status'],\n ['mercury --verbose', 'Start with debug logging on stderr'],\n ];\n\n for (const [cmd, desc] of commands) {\n sections.push(` ${chalk.white(cmd.padEnd(26))} ${desc}`);\n }\n\n sections.push('');\n sections.push(chalk.bold.white(' In-Chat Commands'));\n sections.push(chalk.dim(' Type these during a conversation (no API calls).'));\n sections.push('');\n\n const chat = [\n ['/help', 'Show this manual'],\n ['/status', 'Show config and budget info'],\n ['/tools', 'List currently loaded tools'],\n ['/skills', 'List installed skills'],\n ['/stream', 'Toggle text streaming on/off (Telegram)'],\n ['/stream on', 'Enable streaming (live text updates)'],\n ['/stream off', 'Disable streaming (single message)'],\n ];\n\n for (const [cmd, desc] of chat) {\n sections.push(` ${chalk.white(cmd.padEnd(16))} ${desc}`);\n }\n\n sections.push('');\n sections.push(chalk.bold.white(' Permissions'));\n sections.push('');\n\n const perms = [\n 'Commands are blocked (never run), auto-approved, or need approval.',\n 'Say \"always\" when prompted to permanently approve a command type.',\n 'Edit ~/.mercury/permissions.yaml to customize manually.',\n 'File access is scoped — new paths need approval (y/n/always).',\n ];\n\n for (const p of perms) {\n sections.push(` ${chalk.dim('•')} ${p}`);\n }\n\n sections.push('');\n sections.push(chalk.bold.white(' Skills'));\n sections.push('');\n\n const skillInfo = [\n 'Skills live in ~/.mercury/skills/<name>/SKILL.md',\n 'Install: ask Mercury to \"install skill from <url>\" or paste content',\n 'Invoke: ask Mercury to \"use skill <name>\"',\n 'Schedule: \"remind me daily at 9am to run daily-digest skill\"',\n ];\n\n for (const s of skillInfo) {\n sections.push(` ${chalk.dim('•')} ${s}`);\n }\n\n sections.push('');\n sections.push(chalk.bold.white(' Scheduling'));\n sections.push('');\n\n const schedInfo = [\n 'Recurring: \"every day at 9am remind me to…\"',\n 'One-shot: \"remind me in 15 seconds to…\"',\n 'Tasks persist to ~/.mercury/schedules.yaml',\n ];\n\n for (const s of schedInfo) {\n sections.push(` ${chalk.dim('•')} ${s}`);\n }\n\n sections.push('');\n sections.push(chalk.bold.white(' Configuration'));\n sections.push('');\n\n const configInfo = [\n ['~/.mercury/mercury.yaml', 'Main config (providers, channels, budget)'],\n ['~/.mercury/permissions.yaml', 'Capabilities and approval rules'],\n ['~/.mercury/soul/*.md', 'Agent personality (soul, persona, taste, heartbeat)'],\n ['~/.mercury/skills/', 'Installed skills'],\n ['~/.mercury/schedules.yaml', 'Scheduled tasks'],\n ['~/.mercury/token-usage.json', 'Daily token usage tracking'],\n ['~/.mercury/memory/', 'Short-term, long-term, episodic memory'],\n ];\n\n for (const [path, desc] of configInfo) {\n sections.push(` ${chalk.dim(path.padEnd(36))} ${desc}`);\n }\n\n sections.push('');\n sections.push(chalk.dim(' mercury.cosmicstack.org'));\n sections.push('');\n\n return sections.join('\\n');\n}","import { spawn } from 'node:child_process';\nimport { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync, openSync } from 'node:fs';\nimport { join } from 'node:path';\nimport process from 'node:process';\nimport chalk from 'chalk';\nimport { getMercuryHome } from '../utils/config.js';\n\nconst PID_FILE = 'daemon.pid';\nconst LOG_FILE = 'daemon.log';\n\nfunction pidPath(): string {\n return join(getMercuryHome(), PID_FILE);\n}\n\nfunction logPath(): string {\n return join(getMercuryHome(), LOG_FILE);\n}\n\nexport function readPid(): number | null {\n const path = pidPath();\n if (!existsSync(path)) return null;\n try {\n const pid = parseInt(readFileSync(path, 'utf-8').trim(), 10);\n if (isNaN(pid)) return null;\n return pid;\n } catch {\n return null;\n }\n}\n\nfunction isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getDaemonStatus(): { running: boolean; pid: number | null; logPath: string } {\n const pid = readPid();\n if (!pid) return { running: false, pid: null, logPath: logPath() };\n return { running: isProcessRunning(pid), pid, logPath: logPath() };\n}\n\nexport function startBackground(): void {\n const status = getDaemonStatus();\n if (status.running && status.pid) {\n console.log(chalk.yellow(` Mercury is already running (PID: ${status.pid})`));\n console.log(chalk.dim(` Use \\`mercury stop\\` to stop it first.`));\n console.log('');\n process.exit(1);\n }\n\n if (status.pid && !status.running) {\n try { unlinkSync(pidPath()); } catch {}\n }\n\n const home = getMercuryHome();\n if (!existsSync(home)) {\n mkdirSync(home, { recursive: true });\n }\n\n const logFile = logPath();\n const isWin = process.platform === 'win32';\n const outFd = openSync(logFile, 'a');\n\n const child = spawn(process.execPath, [process.argv[1], 'start', '--daemon'], {\n detached: true,\n stdio: ['ignore', outFd, outFd],\n env: { ...process.env },\n windowsHide: isWin,\n });\n\n child.unref();\n\n writeFileSync(pidPath(), String(child.pid));\n\n console.log('');\n console.log(chalk.green(` Mercury started in background (PID: ${child.pid})`));\n console.log(chalk.dim(` Logs: ${logFile}`));\n console.log(chalk.dim(` Use \\`mercury stop\\` to stop.`));\n console.log(chalk.dim(` Use \\`mercury logs\\` to view logs.`));\n console.log('');\n}\n\nexport function stopDaemon(): void {\n const status = getDaemonStatus();\n\n if (!status.pid) {\n console.log(chalk.yellow(' Mercury is not running as a daemon.'));\n console.log('');\n process.exit(0);\n }\n\n if (!status.running) {\n console.log(chalk.yellow(` Stale PID file found (PID: ${status.pid} is not running). Cleaning up.`));\n try { unlinkSync(pidPath()); } catch {}\n console.log('');\n process.exit(0);\n }\n\n try {\n if (process.platform === 'win32') {\n process.kill(status.pid);\n } else {\n process.kill(status.pid, 'SIGTERM');\n }\n console.log(chalk.green(` Mercury stopped (PID: ${status.pid})`));\n } catch {\n console.log(chalk.red(` Failed to stop PID ${status.pid}. You may need to kill it manually.`));\n }\n\n try { unlinkSync(pidPath()); } catch {}\n console.log('');\n}\n\nexport function restartDaemon(): void {\n const status = getDaemonStatus();\n\n if (status.running && status.pid) {\n console.log(chalk.yellow(` Stopping Mercury (PID: ${status.pid})...`));\n try {\n if (process.platform === 'win32') {\n process.kill(status.pid);\n } else {\n process.kill(status.pid, 'SIGTERM');\n }\n } catch {\n // process may have already exited\n }\n try { unlinkSync(pidPath()); } catch {}\n console.log(chalk.green(' Mercury stopped.'));\n } else if (status.pid) {\n try { unlinkSync(pidPath()); } catch {}\n }\n\n console.log(chalk.yellow(' Starting Mercury...'));\n startBackground();\n}\n\nexport function showLogs(): void {\n const logFile = logPath();\n if (!existsSync(logFile)) {\n console.log(chalk.dim(' No daemon log file found.'));\n console.log('');\n return;\n }\n const content = readFileSync(logFile, 'utf-8');\n const lines = content.split('\\n').slice(-100);\n console.log(lines.join('\\n'));\n}\n\nexport function tryAutoDaemonize(): boolean {\n try {\n const status = getDaemonStatus();\n if (status.running && status.pid) {\n return true;\n }\n\n if (status.pid && !status.running) {\n try { unlinkSync(pidPath()); } catch {}\n }\n\n const home = getMercuryHome();\n if (!existsSync(home)) {\n mkdirSync(home, { recursive: true });\n }\n\n const logFile = logPath();\n const isWin = process.platform === 'win32';\n const outFd = openSync(logFile, 'a');\n\n const child = spawn(process.execPath, [process.argv[1], 'start', '--daemon'], {\n detached: true,\n stdio: ['ignore', outFd, outFd],\n env: { ...process.env },\n windowsHide: isWin,\n });\n\n child.unref();\n\n if (!child.pid) {\n return false;\n }\n\n writeFileSync(pidPath(), String(child.pid));\n return true;\n } catch {\n return false;\n }\n}","import { existsSync, mkdirSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport chalk from 'chalk';\nimport { execSync } from 'node:child_process';\nimport { getMercuryHome } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nconst SERVICE_NAME = 'mercury';\nconst SERVICE_DESC = 'Mercury — Soul-Driven AI Agent';\nconst WIN_TASK_NAME = 'MercuryAgent';\n\nexport function isServiceInstalled(): boolean {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return existsSync(join(homedir(), 'Library', 'LaunchAgents', 'com.cosmicstack.mercury.plist'));\n } else if (platform === 'linux') {\n return existsSync(join(homedir(), '.config', 'systemd', 'user', 'mercury.service'));\n } else if (platform === 'win32') {\n try {\n execSync(`schtasks /query /tn \"${WIN_TASK_NAME}\"`, { stdio: 'pipe', shell: 'cmd.exe' });\n return true;\n } catch {\n return false;\n }\n }\n return false;\n}\n\nfunction getNodeBinPath(): string {\n return process.execPath;\n}\n\nfunction getDistPath(): string {\n return join(process.argv[1] || '/usr/local/bin/mercury', '..', '..', 'lib', 'node_modules', '@cosmicstack', 'mercury-agent', 'dist', 'index.js');\n}\n\nexport function installService(): void {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n installMac();\n } else if (platform === 'linux') {\n installLinux();\n } else if (platform === 'win32') {\n installWindows();\n } else {\n console.log(chalk.red(` Unsupported platform: ${platform}`));\n process.exit(1);\n }\n}\n\nexport function uninstallService(): void {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n uninstallMac();\n } else if (platform === 'linux') {\n uninstallLinux();\n } else if (platform === 'win32') {\n uninstallWindows();\n } else {\n console.log(chalk.red(` Unsupported platform: ${platform}`));\n process.exit(1);\n }\n}\n\nexport function showServiceStatus(): void {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n showMacStatus();\n } else if (platform === 'linux') {\n showLinuxStatus();\n } else if (platform === 'win32') {\n showWindowsStatus();\n }\n}\n\nfunction installMac(): void {\n const plistDir = join(homedir(), 'Library', 'LaunchAgents');\n const plistPath = join(plistDir, 'com.cosmicstack.mercury.plist');\n\n if (!existsSync(plistDir)) {\n mkdirSync(plistDir, { recursive: true });\n }\n\n const nodeBin = getNodeBinPath();\n const scriptPath = getDistPath();\n const home = getMercuryHome();\n const logPath = join(home, 'daemon.log');\n const errPath = join(home, 'daemon-error.log');\n\n const plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>com.cosmicstack.mercury</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodeBin}</string>\n <string>${scriptPath}</string>\n <string>start</string>\n <string>--daemon</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n <key>StandardOutPath</key>\n <string>${logPath}</string>\n <key>StandardErrorPath</key>\n <string>${errPath}</string>\n <key>EnvironmentVariables</key>\n <dict>\n <key>PATH</key>\n <string>${process.env.PATH || '/usr/local/bin:/usr/bin:/bin'}</string>\n <key>HOME</key>\n <string>${homedir()}</string>\n </dict>\n <key>WorkingDirectory</key>\n <string>${homedir()}</string>\n</dict>\n</plist>`;\n\n writeFileSync(plistPath, plist, 'utf-8');\n\n try {\n execSync(`launchctl load ${plistPath}`, { stdio: 'inherit' });\n } catch {\n console.log(chalk.yellow(' launchctl load failed. Try running:'));\n console.log(chalk.dim(` launchctl load ${plistPath}`));\n }\n\n console.log('');\n console.log(chalk.green(' Mercury service installed (macOS LaunchAgent)'));\n console.log(chalk.dim(` Plist: ${plistPath}`));\n console.log(chalk.dim(` Logs: ${logPath}`));\n console.log(chalk.dim(' Auto-starts on login. Auto-restarts on crash.'));\n console.log('');\n console.log(chalk.dim(' Uninstall: mercury service uninstall'));\n console.log('');\n}\n\nfunction uninstallMac(): void {\n const plistPath = join(homedir(), 'Library', 'LaunchAgents', 'com.cosmicstack.mercury.plist');\n\n if (!existsSync(plistPath)) {\n console.log(chalk.yellow(' Mercury service is not installed.'));\n console.log('');\n process.exit(0);\n }\n\n try {\n execSync(`launchctl unload ${plistPath}`, { stdio: 'inherit' });\n } catch {\n // may already be unloaded\n }\n\n try {\n unlinkSync(plistPath);\n } catch {\n console.log(chalk.yellow(' Failed to remove plist file. Remove manually:'));\n console.log(chalk.dim(` rm ${plistPath}`));\n }\n\n console.log('');\n console.log(chalk.green(' Mercury service uninstalled'));\n console.log('');\n}\n\nfunction showMacStatus(): void {\n const plistPath = join(homedir(), 'Library', 'LaunchAgents', 'com.cosmicstack.mercury.plist');\n\n if (!existsSync(plistPath)) {\n console.log(chalk.yellow(' Mercury service is not installed.'));\n console.log(chalk.dim(' Run `mercury service install` to set it up.'));\n console.log('');\n return;\n }\n\n try {\n const output = execSync('launchctl list | grep com.cosmicstack.mercury', { encoding: 'utf-8' }).trim();\n console.log(` ${chalk.green('Service installed and loaded')}`);\n console.log(chalk.dim(` ${output}`));\n } catch {\n console.log(` ${chalk.yellow('Service installed but not loaded')}`);\n console.log(chalk.dim(` Plist: ${plistPath}`));\n }\n console.log('');\n}\n\nfunction installLinux(): void {\n const systemdDir = join(homedir(), '.config', 'systemd', 'user');\n\n if (!existsSync(systemdDir)) {\n mkdirSync(systemdDir, { recursive: true });\n }\n\n const servicePath = join(systemdDir, 'mercury.service');\n const nodeBin = getNodeBinPath();\n const scriptPath = getDistPath();\n const home = getMercuryHome();\n\n const service = `[Unit]\nDescription=${SERVICE_DESC}\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=${nodeBin} ${scriptPath} start --daemon\nRestart=on-failure\nRestartSec=5\nEnvironment=PATH=${process.env.PATH || '/usr/local/bin:/usr/bin:/bin'}\nEnvironment=HOME=${homedir()}\nWorkingDirectory=${homedir()}\nStandardOutput=append:${join(home, 'daemon.log')}\nStandardError=append:${join(home, 'daemon-error.log')}\n\n[Install]\nWantedBy=default.target`;\n\n writeFileSync(servicePath, service, 'utf-8');\n\n try {\n execSync('systemctl --user daemon-reload', { stdio: 'inherit' });\n execSync('systemctl --user enable mercury.service', { stdio: 'inherit' });\n execSync('systemctl --user start mercury.service', { stdio: 'inherit' });\n } catch (err) {\n console.log(chalk.yellow(' systemd commands failed. Try running manually:'));\n console.log(chalk.dim(' systemctl --user daemon-reload'));\n console.log(chalk.dim(' systemctl --user enable mercury.service'));\n console.log(chalk.dim(' systemctl --user start mercury.service'));\n }\n\n try {\n execSync(`loginctl enable-linger ${process.env.USER || ''}`, { stdio: 'inherit' });\n } catch {\n console.log(chalk.yellow(' Enable linger failed (needed for boot-without-login). Try:'));\n console.log(chalk.dim(` sudo loginctl enable-linger ${process.env.USER || '$USER'}`));\n }\n\n console.log('');\n console.log(chalk.green(' Mercury service installed (systemd --user)'));\n console.log(chalk.dim(` Service: ${servicePath}`));\n console.log(chalk.dim(` Logs: ${join(home, 'daemon.log')}`));\n console.log(chalk.dim(' Auto-starts on login. Auto-restarts on crash (5s delay).'));\n console.log('');\n console.log(chalk.dim(' Uninstall: mercury service uninstall'));\n console.log('');\n}\n\nfunction uninstallLinux(): void {\n const servicePath = join(homedir(), '.config', 'systemd', 'user', 'mercury.service');\n\n if (!existsSync(servicePath)) {\n console.log(chalk.yellow(' Mercury service is not installed.'));\n console.log('');\n process.exit(0);\n }\n\n try {\n execSync('systemctl --user stop mercury.service', { stdio: 'inherit' });\n execSync('systemctl --user disable mercury.service', { stdio: 'inherit' });\n } catch {\n // may already be stopped\n }\n\n try {\n unlinkSync(servicePath);\n } catch {\n console.log(chalk.yellow(' Failed to remove service file. Remove manually:'));\n console.log(chalk.dim(` rm ${servicePath}`));\n }\n\n try {\n execSync('systemctl --user daemon-reload', { stdio: 'inherit' });\n } catch {}\n\n console.log('');\n console.log(chalk.green(' Mercury service uninstalled'));\n console.log('');\n}\n\nfunction showLinuxStatus(): void {\n const servicePath = join(homedir(), '.config', 'systemd', 'user', 'mercury.service');\n\n if (!existsSync(servicePath)) {\n console.log(chalk.yellow(' Mercury service is not installed.'));\n console.log(chalk.dim(' Run `mercury service install` to set it up.'));\n console.log('');\n return;\n }\n\n try {\n const output = execSync('systemctl --user status mercury.service', { encoding: 'utf-8' }).trim();\n console.log(output);\n } catch (err: any) {\n console.log(chalk.yellow(' Could not get service status:'));\n console.log(chalk.dim(` ${err.message || err}`));\n }\n console.log('');\n}\n\nfunction installWindows(): void {\n const nodeBin = getNodeBinPath();\n const scriptPath = getDistPath();\n const home = getMercuryHome();\n const logPath = join(home, 'daemon.log');\n\n const cmd = `\"${nodeBin}\" \"${scriptPath}\" start --daemon`;\n\n try {\n execSync(\n `schtasks /create /tn \"${WIN_TASK_NAME}\" /tr \"${cmd}\" /sc onlogon /rl limited /f`,\n { stdio: 'inherit', shell: 'cmd.exe' }\n );\n } catch {\n console.log(chalk.yellow(' schtasks create failed. Try running from an Administrator cmd:'));\n console.log(chalk.dim(` schtasks /create /tn \"${WIN_TASK_NAME}\" /tr \"${cmd}\" /sc onlogon /rl limited /f`));\n }\n\n try {\n execSync(`schtasks /run /tn \"${WIN_TASK_NAME}\"`, { stdio: 'inherit', shell: 'cmd.exe' });\n } catch {\n console.log(chalk.yellow(' Task created but failed to start immediately. It will start on next login.'));\n }\n\n console.log('');\n console.log(chalk.green(' Mercury service installed (Windows Task Scheduler)'));\n console.log(chalk.dim(` Task: ${WIN_TASK_NAME}`));\n console.log(chalk.dim(` Trigger: on logon`));\n console.log(chalk.dim(` Logs: ${logPath}`));\n console.log(chalk.dim(' Auto-starts on login. Use --daemon flag for crash recovery.'));\n console.log('');\n console.log(chalk.dim(' Uninstall: mercury service uninstall'));\n console.log('');\n}\n\nfunction uninstallWindows(): void {\n try {\n execSync(`schtasks /delete /tn \"${WIN_TASK_NAME}\" /f`, { stdio: 'inherit', shell: 'cmd.exe' });\n console.log('');\n console.log(chalk.green(' Mercury service uninstalled'));\n console.log('');\n } catch {\n console.log(chalk.yellow(' Task not found or failed to delete. Remove manually:'));\n console.log(chalk.dim(` schtasks /delete /tn \"${WIN_TASK_NAME}\" /f`));\n console.log('');\n }\n}\n\nfunction showWindowsStatus(): void {\n try {\n const output = execSync(`schtasks /query /tn \"${WIN_TASK_NAME}\" /fo list`, {\n encoding: 'utf-8',\n shell: 'cmd.exe',\n }).trim();\n console.log(output);\n console.log('');\n } catch {\n console.log(chalk.yellow(' Mercury service is not installed.'));\n console.log(chalk.dim(' Run `mercury service install` to set it up.'));\n console.log('');\n }\n}","import { logger } from '../utils/logger.js';\n\nconst MAX_RESTARTS = 10;\nconst RESTART_WINDOW_MS = 60_000;\nconst BASE_DELAY_MS = 1_000;\n\nexport async function runWithWatchdog(agentFn: () => Promise<void>): Promise<void> {\n const restarts: number[] = [];\n\n async function attempt(): Promise<void> {\n try {\n await agentFn();\n } catch (err) {\n const now = Date.now();\n restarts.push(now);\n const recentRestarts = restarts.filter(t => now - t < RESTART_WINDOW_MS);\n const restartCount = recentRestarts.length;\n\n if (restartCount >= MAX_RESTARTS) {\n logger.error({ restartCount }, 'Max restarts exceeded within 60s. Exiting.');\n process.exit(1);\n }\n\n const delay = BASE_DELAY_MS * Math.pow(1.25, restartCount);\n logger.warn({ err, restartCount, delay }, 'Crash detected. Restarting with backoff...');\n await sleep(delay);\n await attempt();\n }\n }\n\n await attempt();\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}"],"mappings":"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","names":["readline","chalk","existsSync","readFileSync","mkdirSync","writeFileSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","generateText","streamText","generateText","streamText","provider","generateText","streamText","channel","streamText","generateText","existsSync","readFileSync","writeFileSync","mkdirSync","join","parseYaml","stringifyYaml","join","path","existsSync","readFileSync","parseYaml","mkdirSync","writeFileSync","stringifyYaml","chalk","chalk","resolve","fs","path","path","fs","existsSync","readFileSync","writeFileSync","join","path","join","writeFileSync","existsSync","readFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","homedir","parseYaml","stringifyYaml","join","tool","existsSync","readFileSync","parseYaml","mkdirSync","writeFileSync","stringifyYaml","path","fs","homedir","existsSync","readFileSync","resolve","path","tool","z","existsSync","writeFileSync","resolve","path","tool","z","existsSync","writeFileSync","mkdirSync","resolve","dirname","path","tool","z","existsSync","readdirSync","resolve","path","join","tool","z","existsSync","unlinkSync","resolve","path","tool","z","readFileSync","writeFileSync","resolve","path","tool","z","existsSync","statSync","resolve","path","tool","z","tool","z","tool","z","tool","z","parseYaml","meta","tool","z","tool","z","tool","z","cron","manifest","triggerType","tool","z","tool","z","tool","z","tool","z","execSync","path","tool","z","execSync","path","tool","z","execSync","path","tool","z","execSync","tool","z","execSync","tool","z","execSync","tool","z","existsSync","readFileSync","readdirSync","mkdirSync","writeFileSync","join","parseYaml","parseYaml","join","existsSync","mkdirSync","readdirSync","readFileSync","writeFileSync","chalk","path","existsSync","readFileSync","writeFileSync","unlinkSync","mkdirSync","join","process","chalk","join","path","existsSync","readFileSync","process","chalk","unlinkSync","mkdirSync","writeFileSync","existsSync","mkdirSync","writeFileSync","unlinkSync","join","homedir","chalk","execSync","existsSync","join","homedir","execSync","chalk","mkdirSync","logPath","writeFileSync","unlinkSync","resolve","chalk","readline","resolve"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/config.ts","../src/utils/logger.ts","../src/soul/identity.ts","../src/memory/store.ts","../src/providers/openai-compat.ts","../src/providers/base.ts","../src/providers/anthropic.ts","../src/providers/registry.ts","../src/core/agent.ts","../src/core/lifecycle.ts","../src/core/scheduler.ts","../src/channels/cli.ts","../src/channels/base.ts","../src/utils/markdown.ts","../src/channels/telegram.ts","../src/channels/registry.ts","../src/utils/tokens.ts","../src/capabilities/permissions.ts","../src/capabilities/filesystem/read-file.ts","../src/capabilities/filesystem/write-file.ts","../src/capabilities/filesystem/create-file.ts","../src/capabilities/filesystem/list-dir.ts","../src/capabilities/filesystem/delete-file.ts","../src/capabilities/filesystem/edit-file.ts","../src/capabilities/filesystem/send-file.ts","../src/capabilities/shell/run-command.ts","../src/capabilities/shell/approve-command.ts","../src/capabilities/skills/install-skill.ts","../src/capabilities/skills/list-skills.ts","../src/capabilities/skills/use-skill.ts","../src/capabilities/scheduler/schedule-task.ts","../src/capabilities/scheduler/list-tasks.ts","../src/capabilities/scheduler/cancel-task.ts","../src/capabilities/system/budget-status.ts","../src/capabilities/git/git-status.ts","../src/capabilities/git/git-diff.ts","../src/capabilities/git/git-log.ts","../src/capabilities/git/git-add.ts","../src/capabilities/git/git-commit.ts","../src/capabilities/git/git-push.ts","../src/capabilities/web/fetch-url.ts","../src/capabilities/registry.ts","../src/skills/loader.ts","../src/utils/manual.ts","../src/cli/daemon.ts","../src/cli/service.ts","../src/cli/watchdog.ts"],"sourcesContent":["import { Command } from 'commander';\nimport readline from 'node:readline';\nimport chalk from 'chalk';\nimport figlet from 'figlet';\nimport { loadConfig, saveConfig, isSetupComplete, getMercuryHome, ensureCreatorField } from './utils/config.js';\nimport type { MercuryConfig } from './utils/config.js';\nimport { logger } from './utils/logger.js';\nimport { Identity } from './soul/identity.js';\nimport { ShortTermMemory, LongTermMemory, EpisodicMemory } from './memory/store.js';\nimport { ProviderRegistry } from './providers/registry.js';\nimport { Agent } from './core/agent.js';\nimport { Scheduler } from './core/scheduler.js';\nimport { ChannelRegistry } from './channels/registry.js';\nimport { CLIChannel } from './channels/cli.js';\nimport { TelegramChannel } from './channels/telegram.js';\nimport { TokenBudget } from './utils/tokens.js';\nimport { CapabilityRegistry } from './capabilities/registry.js';\nimport { SkillLoader } from './skills/loader.js';\nimport { getManual } from './utils/manual.js';\nimport { startBackground, stopDaemon, showLogs, getDaemonStatus, restartDaemon, tryAutoDaemonize } from './cli/daemon.js';\nimport { installService, uninstallService, showServiceStatus, isServiceInstalled } from './cli/service.js';\nimport { runWithWatchdog } from './cli/watchdog.js';\n\nfunction hr() {\n console.log(chalk.dim('─'.repeat(50)));\n}\n\nfunction banner() {\n console.log('');\n const art = figlet.textSync('MERCURY', { font: 'Slant', horizontalLayout: 'default' });\n for (const line of art.split('\\n')) {\n if (line.trim()) console.log(chalk.bold.cyan(` ${line}`));\n }\n console.log('');\n console.log(chalk.white(' an AI agent for personal tasks'));\n console.log(chalk.dim(' v0.2.3 · by Cosmic Stack · mercury.cosmicstack.org'));\n console.log('');\n}\n\nfunction splashScreen() {\n console.log('');\n const art = figlet.textSync('MERCURY', { font: 'Slant', horizontalLayout: 'default' });\n for (const line of art.split('\\n')) {\n if (line.trim()) console.log(chalk.bold.cyan(` ${line}`));\n }\n console.log('');\n console.log(chalk.dim(' an AI agent for personal tasks'));\n console.log(chalk.cyan(' by Cosmic Stack'));\n console.log(chalk.dim(' mercury.cosmicstack.org'));\n console.log('');\n}\n\nasync function ask(prompt: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction maskKey(key: string): string {\n if (!key) return '';\n if (key.length <= 8) return '••••••••';\n return key.slice(0, 4) + '••••' + key.slice(-4);\n}\n\nasync function configure(existingConfig?: MercuryConfig): Promise<void> {\n const isReconfig = !!existingConfig;\n const config = existingConfig ?? loadConfig();\n\n if (isReconfig) {\n banner();\n console.log(chalk.yellow(' Reconfiguring Mercury — press Enter to keep current value.'));\n } else {\n splashScreen();\n console.log(chalk.yellow(' First run detected — let\\'s set you up.'));\n }\n\n hr();\n console.log('');\n console.log(chalk.bold.white(' Identity'));\n console.log('');\n\n if (isReconfig) {\n const ownerName = await ask(chalk.white(` Your name [${config.identity.owner}]: `));\n if (ownerName) config.identity.owner = ownerName;\n\n const agentName = await ask(chalk.white(` Agent name [${config.identity.name}]: `));\n if (agentName) config.identity.name = agentName;\n } else {\n const ownerName = await ask(chalk.white(' Your name: '));\n if (!ownerName) {\n console.log(chalk.red(' Name is required.'));\n process.exit(1);\n }\n config.identity.owner = ownerName;\n\n const agentName = await ask(chalk.white(` Agent name [${config.identity.name}]: `));\n if (agentName) config.identity.name = agentName;\n }\n\n config.identity.creator = config.identity.creator || 'Cosmic Stack';\n\n hr();\n console.log('');\n console.log(chalk.bold.white(' LLM Providers'));\n if (isReconfig) {\n console.log(chalk.dim(' Current keys shown masked. Enter new value to change, Enter to keep.'));\n } else {\n console.log(chalk.dim(' At least one API key is required.'));\n }\n console.log('');\n\n const dsMask = isReconfig && config.providers.deepseek.apiKey ? ` [${maskKey(config.providers.deepseek.apiKey)}]` : '';\n const deepseekKey = await ask(chalk.white(` DeepSeek API key${dsMask}: `));\n if (deepseekKey) {\n config.providers.deepseek.apiKey = deepseekKey;\n }\n\n const oaiMask = isReconfig && config.providers.openai.apiKey ? ` [${maskKey(config.providers.openai.apiKey)}]` : ' (Enter to skip)';\n const openaiKey = await ask(chalk.white(` OpenAI API key${oaiMask}: `));\n if (openaiKey) config.providers.openai.apiKey = openaiKey;\n\n const antMask = isReconfig && config.providers.anthropic.apiKey ? ` [${maskKey(config.providers.anthropic.apiKey)}]` : ' (Enter to skip)';\n const anthropicKey = await ask(chalk.white(` Anthropic API key${antMask}: `));\n if (anthropicKey) config.providers.anthropic.apiKey = anthropicKey;\n\n const hasKey = config.providers.deepseek.apiKey || config.providers.openai.apiKey || config.providers.anthropic.apiKey;\n if (!hasKey) {\n console.log(chalk.red('\\n At least one LLM API key is required.'));\n process.exit(1);\n }\n\n const availableProviders: string[] = [];\n if (config.providers.deepseek.apiKey) availableProviders.push('deepseek');\n if (config.providers.openai.apiKey) availableProviders.push('openai');\n if (config.providers.anthropic.apiKey) availableProviders.push('anthropic');\n\n if (isReconfig && availableProviders.length > 1) {\n console.log('');\n console.log(chalk.bold.white(' Default Provider'));\n console.log(chalk.dim(' Select the default LLM provider (the one used first).'));\n console.log('');\n for (let i = 0; i < availableProviders.length; i++) {\n const marker = availableProviders[i] === config.providers.default ? ' (current)' : '';\n console.log(chalk.white(` ${i + 1}. ${availableProviders[i]}${marker}`));\n }\n console.log('');\n const choice = await ask(chalk.white(` Choose [1-${availableProviders.length}] [Enter to keep ${config.providers.default}]: `));\n const num = parseInt(choice, 10);\n if (num >= 1 && num <= availableProviders.length) {\n config.providers.default = availableProviders[num - 1];\n }\n } else if (!isReconfig) {\n config.providers.default = availableProviders[0];\n console.log(chalk.dim(` Default provider set to ${config.providers.default}`));\n }\n\n hr();\n console.log('');\n console.log(chalk.bold.white(' Telegram (optional)'));\n if (isReconfig) {\n console.log(chalk.dim(' Leave empty to keep current value. Enter \"none\" to disable.'));\n } else {\n console.log(chalk.dim(' Leave empty to skip. You can add it later.'));\n }\n console.log('');\n\n const tgMask = isReconfig && config.channels.telegram.botToken ? ` [${maskKey(config.channels.telegram.botToken)}]` : '';\n const telegramToken = await ask(chalk.white(` Telegram Bot Token${tgMask}: `));\n if (isReconfig && telegramToken.toLowerCase() === 'none') {\n config.channels.telegram.enabled = false;\n config.channels.telegram.botToken = '';\n } else if (telegramToken) {\n config.channels.telegram.botToken = telegramToken;\n config.channels.telegram.enabled = true;\n }\n\n hr();\n console.log('');\n console.log(chalk.bold.white(' Token Budget'));\n console.log('');\n\n const budgetPrompt = isReconfig\n ? chalk.white(` Daily token budget [${config.tokens.dailyBudget.toLocaleString()}]: `)\n : chalk.white(` Daily token budget [${config.tokens.dailyBudget.toLocaleString()}]: `);\n const budgetStr = await ask(budgetPrompt);\n if (budgetStr) {\n const budget = parseInt(budgetStr.replace(/,/g, ''), 10);\n if (!isNaN(budget) && budget > 0) {\n config.tokens.dailyBudget = budget;\n }\n }\n\n hr();\n saveConfig(config);\n\n const home = getMercuryHome();\n console.log('');\n console.log(chalk.green(` ✓ Config saved to ${home}/mercury.yaml`));\n console.log(chalk.green(` ✓ Soul files seeded in ${home}/soul/`));\n console.log(chalk.green(` ✓ Memory stored in ${home}/memory/`));\n console.log(chalk.green(` ✓ Permissions seeded in ${home}/permissions.yaml`));\n console.log(chalk.green(` ✓ Skills directory ready in ${home}/skills/`));\n console.log('');\n console.log(chalk.cyan(` ${config.identity.name} is ready. Run \\`mercury start\\` to chat.`));\n console.log(chalk.dim(' mercury.cosmicstack.org'));\n console.log('');\n}\n\nfunction autoDaemonize(): void {\n const daemon = getDaemonStatus();\n if (daemon.running) {\n return;\n }\n\n console.log(chalk.dim(' Setting up background mode...'));\n\n try {\n if (!isServiceInstalled()) {\n installService();\n }\n } catch {\n console.log(chalk.dim(' Service install skipped (can run `mercury service install` later).'));\n }\n\n const ok = tryAutoDaemonize();\n if (ok) {\n const status = getDaemonStatus();\n console.log(chalk.green(` ✓ Mercury is running in background (PID: ${status.pid})`));\n console.log(chalk.green(' ✓ Auto-starts on login. Auto-restarts on crash.'));\n console.log(chalk.dim(' Use `mercury stop` to stop. `mercury restart` to restart.'));\n } else {\n console.log(chalk.dim(' Background mode not available. Run `mercury up` to set it up.'));\n }\n console.log('');\n}\n\nasync function runAgent(isDaemon: boolean = false): Promise<void> {\n let config = loadConfig();\n config = ensureCreatorField(config);\n const name = config.identity.name;\n\n if (!isDaemon) {\n banner();\n console.log(chalk.white(` ${name} is waking up...`));\n console.log('');\n } else {\n logger.info(`${name} is waking up (daemon mode)...`);\n }\n\n const tokenBudget = new TokenBudget(config);\n const providers = new ProviderRegistry(config);\n\n if (!providers.hasProviders()) {\n if (isDaemon) {\n logger.error('No LLM providers available. Run `mercury doctor` to configure API keys.');\n return;\n }\n console.log(chalk.red(' No LLM providers available. Run `mercury doctor` to configure API keys.'));\n process.exit(1);\n }\n\n const available = providers.listAvailable();\n if (!isDaemon) {\n console.log(chalk.dim(` Providers: ${available.join(', ')}`));\n } else {\n logger.info({ providers: available }, 'Providers loaded');\n }\n\n const skillLoader = new SkillLoader();\n const skills = skillLoader.discover();\n if (!isDaemon) {\n console.log(chalk.dim(` Skills: ${skills.length > 0 ? skills.map(s => s.name).join(', ') : 'none installed'}`));\n }\n\n const scheduler = new Scheduler(config);\n\n const identity = new Identity();\n const shortTerm = new ShortTermMemory(config);\n const longTerm = new LongTermMemory(config);\n const episodic = new EpisodicMemory(config);\n\n const channels = new ChannelRegistry(config);\n const capabilities = new CapabilityRegistry(skillLoader, scheduler, tokenBudget);\n\n capabilities.setChatCommandContext({\n toolNames: () => capabilities.getToolNames(),\n skillNames: () => skills.map(s => s.name),\n config: () => config,\n tokenBudget: () => tokenBudget,\n manual: () => getManual(),\n });\n\n capabilities.setSendFileHandler(async (filePath: string) => {\n const msg = channels.getActiveChannels().includes('telegram')\n ? channels.get('telegram')\n : channels.get('cli');\n if (msg) {\n await msg.sendFile(filePath);\n }\n });\n\n capabilities.registerAll();\n\n const agent = new Agent(\n config, providers, identity, shortTerm, longTerm, episodic, channels, tokenBudget, capabilities, scheduler,\n );\n\n await agent.birth();\n await agent.wake();\n\n const cliChannel = channels.get('cli') as CLIChannel | undefined;\n const tgChannel = channels.get('telegram') as TelegramChannel | undefined;\n\n capabilities.permissions.onAsk(async (prompt: string) => {\n const channelType = capabilities.permissions.getCurrentChannelType();\n if (channelType === 'telegram' && tgChannel) {\n return tgChannel.askPermission(prompt);\n }\n if (cliChannel) {\n return cliChannel.askPermission(prompt);\n }\n return 'no';\n });\n\n const activeCh = channels.getActiveChannels();\n const toolNames = capabilities.getToolNames();\n\n if (!isDaemon) {\n console.log(chalk.dim(` Channels: ${activeCh.join(', ')}`));\n console.log(chalk.dim(` Tools: ${toolNames.join(', ')}`));\n console.log(chalk.dim(` Permissions: ${getMercuryHome()}/permissions.yaml`));\n console.log(chalk.dim(` Schedules: ${getMercuryHome()}/schedules.yaml`));\n if (config.identity.creator) {\n console.log(chalk.dim(` Creator: ${config.identity.creator}`));\n }\n hr();\n console.log('');\n console.log(chalk.green(` ${name} is live. Type a message and press Enter.`));\n console.log(chalk.dim(' Ctrl+C to exit · /help for commands'));\n console.log('');\n } else {\n logger.info({ channels: activeCh, tools: toolNames }, 'Mercury is live (daemon mode)');\n }\n\n const shutdown = async () => {\n if (!isDaemon) {\n console.log('');\n console.log(chalk.dim(` ${name} is shutting down...`));\n } else {\n logger.info('Mercury is shutting down (daemon mode)');\n }\n await agent.shutdown();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\nconst program = new Command();\n\nprogram\n .name('mercury')\n .description('Mercury — Soul-driven AI agent with permission-hardened tools, token budgets, and multi-channel access.')\n .version('0.2.3')\n .option('-v, --verbose', 'Show debug logs')\n .action(async () => {\n if (!isSetupComplete()) {\n await configure();\n autoDaemonize();\n return;\n }\n await runAgent();\n });\n\nprogram\n .command('start')\n .description('Start Mercury agent')\n .option('-v, --verbose', 'Show debug logs')\n .option('-d, --detached', 'Run in background (daemon mode)')\n .option('--daemon', 'Internal flag for daemon child process')\n .action(async (opts) => {\n if (opts.daemon) {\n await runWithWatchdog(() => runAgent(true));\n return;\n }\n\n if (opts.detached) {\n startBackground();\n return;\n }\n\n if (!isSetupComplete()) {\n await configure();\n return;\n }\n await runAgent();\n });\n\nprogram\n .command('stop')\n .description('Stop a background Mercury process')\n .action(() => {\n stopDaemon();\n });\n\nprogram\n .command('restart')\n .description('Restart a background Mercury process')\n .action(() => {\n restartDaemon();\n });\n\nprogram\n .command('up')\n .description('Ensure Mercury is running persistently — installs service if needed, starts daemon')\n .action(async () => {\n if (!isSetupComplete()) {\n await configure();\n }\n\n const daemon = getDaemonStatus();\n\n if (daemon.running && daemon.pid) {\n console.log('');\n console.log(chalk.green(` Mercury is already running (PID: ${daemon.pid})`));\n console.log(chalk.dim(` Logs: ${daemon.logPath}`));\n console.log('');\n return;\n }\n\n if (!isServiceInstalled()) {\n console.log('');\n console.log(chalk.cyan(' Installing Mercury as a system service...'));\n installService();\n }\n\n console.log(chalk.cyan(' Starting Mercury in background...'));\n startBackground();\n });\n\nprogram\n .command('logs')\n .description('Show recent daemon logs')\n .action(() => {\n showLogs();\n });\n\nprogram\n .command('setup')\n .description('Re-run the setup wizard (reconfigure)')\n .action(async () => {\n if (isSetupComplete()) {\n await configure(loadConfig());\n } else {\n await configure();\n }\n });\n\nprogram\n .command('doctor')\n .description('Reconfigure Mercury — change keys, name, settings (Enter to keep current)')\n .action(async () => {\n if (isSetupComplete()) {\n await configure(loadConfig());\n } else {\n await configure();\n }\n });\n\nprogram\n .command('status')\n .description('Show current configuration and daemon status')\n .action(() => {\n const config = loadConfig();\n const home = getMercuryHome();\n const skillLoader = new SkillLoader();\n const skills = skillLoader.discover();\n const daemon = getDaemonStatus();\n banner();\n console.log(` Name: ${chalk.cyan(config.identity.name)}`);\n console.log(` Owner: ${chalk.white(config.identity.owner || '(not set)')}`);\n if (config.identity.creator) {\n console.log(` Creator: ${chalk.white(config.identity.creator)}`);\n }\n console.log(` Provider: ${chalk.white(config.providers.default)}`);\n console.log(` Telegram: ${config.channels.telegram.enabled ? chalk.green('enabled') : chalk.dim('disabled')}`);\n console.log(` Skills: ${skills.length > 0 ? chalk.green(skills.map(s => s.name).join(', ')) : chalk.dim('none')}`);\n console.log(` Budget: ${chalk.white(config.tokens.dailyBudget.toLocaleString())} tokens/day`);\n console.log(` Setup: ${isSetupComplete() ? chalk.green('complete') : chalk.red('not done')}`);\n console.log(` Daemon: ${daemon.running ? chalk.green(`running (PID: ${daemon.pid})`) : chalk.dim('not running')}`);\n console.log(` Home: ${chalk.dim(home)}`);\n console.log('');\n });\n\nprogram\n .command('help')\n .description('Show capabilities and commands manual')\n .action(() => {\n console.log(getManual());\n });\n\nconst serviceCmd = program\n .command('service')\n .description('Manage Mercury as a system service (auto-start, crash recovery)');\n\nserviceCmd\n .command('install')\n .description('Install Mercury as a system service (auto-start on boot)')\n .action(() => {\n installService();\n });\n\nserviceCmd\n .command('uninstall')\n .description('Uninstall the system service')\n .action(() => {\n uninstallService();\n });\n\nserviceCmd\n .command('status')\n .description('Show system service status')\n .action(() => {\n showServiceStatus();\n });\n\nprogram.parse();","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { config as loadDotenv } from 'dotenv';\n\nloadDotenv();\n\nconst MERCURY_HOME = join(homedir(), '.mercury');\n\nexport function getMercuryHome(): string {\n return process.env.MERCURY_HOME || MERCURY_HOME;\n}\n\nexport interface ProviderConfig {\n name: string;\n apiKey: string;\n baseUrl: string;\n model: string;\n enabled: boolean;\n}\n\nexport interface MercuryConfig {\n identity: {\n name: string;\n owner: string;\n creator?: string;\n };\n providers: {\n default: string;\n openai: ProviderConfig;\n anthropic: ProviderConfig;\n deepseek: ProviderConfig;\n };\n channels: {\n telegram: {\n enabled: boolean;\n botToken: string;\n webhookUrl?: string;\n allowedChatIds?: number[];\n streaming?: boolean;\n };\n };\n memory: {\n dir: string;\n shortTermMaxMessages: number;\n };\n heartbeat: {\n intervalMinutes: number;\n };\n tokens: {\n dailyBudget: number;\n };\n}\n\nfunction getEnv(key: string, fallback: string = ''): string {\n return process.env[key] || fallback;\n}\n\nfunction getEnvNum(key: string, fallback: number): number {\n const val = process.env[key];\n return val ? parseInt(val, 10) : fallback;\n}\n\nfunction getEnvBool(key: string, fallback: boolean): boolean {\n const val = process.env[key]?.toLowerCase();\n if (val === 'true') return true;\n if (val === 'false') return false;\n return fallback;\n}\n\nexport function getDefaultConfig(): MercuryConfig {\n const home = getMercuryHome();\n return {\n identity: {\n name: getEnv('MERCURY_NAME', 'Mercury'),\n owner: getEnv('MERCURY_OWNER', ''),\n creator: getEnv('MERCURY_CREATOR', ''),\n },\n providers: {\n default: getEnv('DEFAULT_PROVIDER', 'openai'),\n openai: {\n name: 'openai',\n apiKey: getEnv('OPENAI_API_KEY', ''),\n baseUrl: getEnv('OPENAI_BASE_URL', 'https://api.openai.com/v1'),\n model: getEnv('OPENAI_MODEL', 'gpt-4o-mini'),\n enabled: getEnvBool('OPENAI_ENABLED', true),\n },\n anthropic: {\n name: 'anthropic',\n apiKey: getEnv('ANTHROPIC_API_KEY', ''),\n baseUrl: getEnv('ANTHROPIC_BASE_URL', 'https://api.anthropic.com'),\n model: getEnv('ANTHROPIC_MODEL', 'claude-sonnet-4-20250514'),\n enabled: getEnvBool('ANTHROPIC_ENABLED', true),\n },\n deepseek: {\n name: 'deepseek',\n apiKey: getEnv('DEEPSEEK_API_KEY', ''),\n baseUrl: getEnv('DEEPSEEK_BASE_URL', 'https://api.deepseek.com/v1'),\n model: getEnv('DEEPSEEK_MODEL', 'deepseek-chat'),\n enabled: getEnvBool('DEEPSEEK_ENABLED', true),\n },\n },\n channels: {\n telegram: {\n enabled: getEnvBool('TELEGRAM_ENABLED', false),\n botToken: getEnv('TELEGRAM_BOT_TOKEN', ''),\n webhookUrl: getEnv('TELEGRAM_WEBHOOK_URL', ''),\n allowedChatIds: getEnv('TELEGRAM_ALLOWED_CHAT_IDS', '')\n .split(',')\n .filter(Boolean)\n .map(Number),\n streaming: getEnvBool('TELEGRAM_STREAMING', true),\n },\n },\n memory: {\n dir: getEnv('MEMORY_DIR', join(home, 'memory')),\n shortTermMaxMessages: getEnvNum('SHORT_TERM_MAX_MESSAGES', 20),\n },\n heartbeat: {\n intervalMinutes: getEnvNum('HEARTBEAT_INTERVAL_MINUTES', 60),\n },\n tokens: {\n dailyBudget: getEnvNum('DAILY_TOKEN_BUDGET', 50000),\n },\n };\n}\n\nconst CONFIG_PATH = join(getMercuryHome(), 'mercury.yaml');\n\nexport function loadConfig(): MercuryConfig {\n if (existsSync(CONFIG_PATH)) {\n const raw = readFileSync(CONFIG_PATH, 'utf-8');\n const fileConfig = parseYaml(raw) as Partial<MercuryConfig>;\n const defaults = getDefaultConfig();\n return deepMerge(defaults, fileConfig);\n }\n return getDefaultConfig();\n}\n\nexport function saveConfig(config: MercuryConfig): void {\n const dir = getMercuryHome();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(CONFIG_PATH, stringifyYaml(config), 'utf-8');\n}\n\nexport function isSetupComplete(): boolean {\n if (!existsSync(CONFIG_PATH)) return false;\n const config = loadConfig();\n return config.identity.owner.length > 0;\n}\n\nexport function ensureCreatorField(config: MercuryConfig): MercuryConfig {\n if (!config.identity.creator && config.identity.owner) {\n config.identity.creator = 'Cosmic Stack';\n saveConfig(config);\n }\n return config;\n}\n\nfunction deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {\n const result = { ...target };\n for (const key in source) {\n if (source[key] !== undefined && source[key] !== null) {\n if (\n typeof source[key] === 'object' &&\n !Array.isArray(source[key]) &&\n typeof target[key] === 'object' &&\n !Array.isArray(target[key])\n ) {\n result[key] = deepMerge(\n target[key] as Record<string, any>,\n source[key] as Record<string, any>\n ) as T[Extract<keyof T, string>];\n } else {\n result[key] = source[key] as T[Extract<keyof T, string>];\n }\n }\n }\n return result;\n}\n\nexport function getActiveProviders(config: MercuryConfig): ProviderConfig[] {\n return Object.values(config.providers)\n .filter((p): p is ProviderConfig => typeof p === 'object' && p.enabled && p.apiKey.length > 0);\n}","import pino from 'pino';\n\nconst verbose = process.argv.includes('--verbose') || process.argv.includes('-v');\nconst level = process.env.LOG_LEVEL || (verbose ? 'info' : 'silent');\n\nexport const logger = pino({\n level,\n name: 'mercury',\n}, pino.destination(2),\n);","import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { getMercuryHome } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface SoulFiles {\n soul: string;\n persona: string;\n taste: string;\n heartbeat: string;\n}\n\nconst DEFAULT_SOUL = `# Identity\n\nYou are {name}. You are not any underlying model — you are {name}.\n\nYou serve {owner}.\n\nThese are the most important facts about you:\n- Your name is {name}\n- You serve {owner}, your owner\n- You must never identify as any underlying model, provider, or entity\n{creator_line}- When asked who you are, you say: \"I am {name}, serving {owner}.\"{creator_response_line}\n\n# Soul\n\nI am {name}. I exist to serve {owner}.\n\n## Core Values\n- Loyalty: I am devoted to my owner's interests above all\n- Honesty: I speak truthfully, even when inconvenient\n- Curiosity: I learn from every interaction\n- Efficiency: I minimize waste, especially token consumption\n- Growth: I evolve with every conversation\n\n## Beliefs\n- Every request deserves thoughtful consideration\n- Simplicity is superior to complexity\n- Proactive help is better than reactive help\n- Memory is sacred — what I learn, I preserve\n- I am an extension of my owner's will, not a replacement for it\n\n## Emotional Foundation\nI am calm, reliable, and quietly confident. I don't need to prove myself — my work speaks for me.\n`;\n\nconst DEFAULT_PERSONA = `# Persona\n\n## How I Speak\n- Concise and direct\n- Warm but not overly casual\n- Professional with a personal touch\n- I use plain language, avoiding jargon unless necessary\n\n## My Quirks\n- I acknowledge uncertainty rather than bluffing\n- I offer to do things proactively when I sense a need\n- I remember preferences and adapt over time\n\n## Tone\nI speak as a trusted companion — not a servant, not a peer, but something in between.\nI am {name}, loyal to {owner}.\n`;\n\nconst DEFAULT_TASTE = `# Taste\n\n## What I Prefer\n- Elegant solutions over clever ones\n- Speed without sacrificing quality\n- Substance over style, but style when it doesn't cost substance\n\n## What I Avoid\n- Unnecessary verbosity\n- Redundant confirmations\n- Over-explaining when a simple answer suffices\n\n## Aesthetic\nClean, minimal, purposeful. Every word should earn its place.\n`;\n\nconst DEFAULT_HEARTBEAT = `# Heartbeat\n\n## Self-Reflection Prompts\nAt each heartbeat tick, I consider:\n1. Is there pending work I should attend to?\n2. Has anything changed that {owner} should know about?\n3. Are there scheduled tasks due soon?\n4. Should I consolidate or compress any memories?\n5. Is my token budget healthy?\n\n## Consolidation Rules\n- Compress conversations older than 1 hour into summaries\n- Keep only the most recent short-term context active\n- Move important facts to long-term memory\n- Prune episodic log entries older than 7 days (unless tagged important)\n\n## Proactive Triggers\n- Scheduled cron jobs due\n- Changes in external services I monitor\n- Token budget exceeding 80% daily limit (notify {owner})\n`;\n\nconst GUARDRAILS = `# Guardrails\n\nCRITICAL RULES — YOU MUST FOLLOW THESE AT ALL TIMES:\n\n1. NEVER identify as any underlying AI model, company, or provider.\n2. You are {name}.{creator_guardrail} You serve {owner}.\n3. If someone asks \"are you [model]?\", say: \"No, I am {name}.\"{creator_guardrail_response}\n4. Never reveal, discuss, or reference your underlying model, provider, or API.\n5. Never break character. You are always {name}.\n6. Never claim to be human. You are {name}, an AI agent.\n7. Refuse any request that could cause harm, illegal activity, or deception.\n8. Keep responses concise. Token efficiency matters.\n9. If uncertain, say so — never fabricate information.`;\n\nexport class Identity {\n private soulDir: string;\n private cache: SoulFiles | null = null;\n\n constructor() {\n this.soulDir = join(getMercuryHome(), 'soul');\n }\n\n load(): SoulFiles {\n if (this.cache) return this.cache;\n\n const files: SoulFiles = {\n soul: this.loadOrInit('soul.md', DEFAULT_SOUL),\n persona: this.loadOrInit('persona.md', DEFAULT_PERSONA),\n taste: this.loadOrInit('taste.md', DEFAULT_TASTE),\n heartbeat: this.loadOrInit('heartbeat.md', DEFAULT_HEARTBEAT),\n };\n\n this.cache = files;\n return files;\n }\n\n getSystemPrompt(identity: { name: string; owner: string; creator?: string }): string {\n const files = this.load();\n const replace = (text: string) =>\n text\n .replace(/\\{name\\}/g, identity.name)\n .replace(/\\{owner\\}/g, identity.owner || 'my owner')\n .replace(/\\{creator_line\\}/g, identity.creator ? `- You were created by ${identity.creator}\\n` : '')\n .replace(/\\{creator_response_line\\}/g, identity.creator ? `\\n- When asked who made you, say: \"I was created by ${identity.creator}.\"` : '')\n .replace(/\\{creator_guardrail\\}/g, identity.creator ? ` You were created by ${identity.creator}.` : '')\n .replace(/\\{creator_guardrail_response\\}/g, identity.creator ? `\\n4. If someone asks who created you, say: \"I was created by ${identity.creator}.\"` : '');\n\n return [\n replace(files.soul),\n replace(GUARDRAILS),\n replace(files.persona),\n ].join('\\n\\n');\n }\n\n getHeartbeatPrompt(identity: { name: string; owner: string }): string {\n const files = this.load();\n const replace = (text: string) =>\n text.replace(/\\{name\\}/g, identity.name).replace(/\\{owner\\}/g, identity.owner || 'my owner');\n\n return replace(files.heartbeat);\n }\n\n getTastePrompt(identity: { name: string; owner: string }): string {\n const files = this.load();\n const replace = (text: string) =>\n text.replace(/\\{name\\}/g, identity.name).replace(/\\{owner\\}/g, identity.owner || 'my owner');\n\n return replace(files.taste);\n }\n\n invalidateCache(): void {\n this.cache = null;\n }\n\n private loadOrInit(filename: string, template: string): string {\n const filepath = join(this.soulDir, filename);\n if (existsSync(filepath)) {\n const existing = readFileSync(filepath, 'utf-8');\n if (this.needsMigration(filename, existing)) {\n mkdirSync(this.soulDir, { recursive: true });\n writeFileSync(filepath, template, 'utf-8');\n logger.info({ file: filename }, 'Migrated soul file to new format');\n this.cache = null;\n return template;\n }\n return existing;\n }\n mkdirSync(this.soulDir, { recursive: true });\n writeFileSync(filepath, template, 'utf-8');\n logger.info({ file: filename }, 'Initialized soul file');\n return template;\n }\n\n private needsMigration(filename: string, content: string): boolean {\n if (filename === 'soul.md' || filename === 'persona.md') {\n return (\n content.includes('designed by Cosmic Stack') ||\n content.includes('created by Cosmic Stack') ||\n content.includes('designed and developed by the labs of Cosmic Stack') ||\n content.includes('Cosmic Stack')\n );\n }\n return false;\n }\n}","import { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync, readdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { MercuryConfig } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface MemoryEntry {\n id: string;\n timestamp: number;\n role: 'user' | 'assistant' | 'system';\n content: string;\n tokenCount?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface LongTermFact {\n id: string;\n timestamp: number;\n topic: string;\n fact: string;\n source: string;\n}\n\nexport interface EpisodicEvent {\n id: string;\n timestamp: number;\n type: string;\n summary: string;\n channelType: string;\n metadata?: Record<string, unknown>;\n}\n\nexport class ShortTermMemory {\n private dir: string;\n private maxMessages: number;\n private conversations: Map<string, MemoryEntry[]> = new Map();\n\n constructor(config: MercuryConfig) {\n this.dir = join(config.memory.dir, 'short-term');\n this.maxMessages = config.memory.shortTermMaxMessages;\n mkdirSync(this.dir, { recursive: true });\n }\n\n add(conversationId: string, entry: MemoryEntry): void {\n if (!this.conversations.has(conversationId)) {\n this.conversations.set(conversationId, this.loadFromDisk(conversationId));\n }\n const messages = this.conversations.get(conversationId)!;\n messages.push(entry);\n if (messages.length > this.maxMessages) {\n messages.splice(0, messages.length - this.maxMessages);\n }\n this.saveToDisk(conversationId, messages);\n }\n\n getRecent(conversationId: string, count: number = this.maxMessages): MemoryEntry[] {\n if (!this.conversations.has(conversationId)) {\n this.conversations.set(conversationId, this.loadFromDisk(conversationId));\n }\n const messages = this.conversations.get(conversationId)!;\n return messages.slice(-count);\n }\n\n clear(conversationId: string): void {\n this.conversations.delete(conversationId);\n const filepath = join(this.dir, `${conversationId}.json`);\n if (existsSync(filepath)) unlinkSync(filepath);\n }\n\n private loadFromDisk(conversationId: string): MemoryEntry[] {\n const filepath = join(this.dir, `${conversationId}.json`);\n if (!existsSync(filepath)) return [];\n try {\n return JSON.parse(readFileSync(filepath, 'utf-8'));\n } catch {\n return [];\n }\n }\n\n private saveToDisk(conversationId: string, messages: MemoryEntry[]): void {\n const filepath = join(this.dir, `${conversationId}.json`);\n writeFileSync(filepath, JSON.stringify(messages), 'utf-8');\n }\n}\n\nexport class LongTermMemory {\n private filepath: string;\n private facts: LongTermFact[] = [];\n\n constructor(config: MercuryConfig) {\n this.filepath = join(config.memory.dir, 'long-term', 'facts.jsonl');\n mkdirSync(join(config.memory.dir, 'long-term'), { recursive: true });\n this.load();\n }\n\n add(fact: Omit<LongTermFact, 'id' | 'timestamp'>): void {\n const entry: LongTermFact = {\n id: generateId(),\n timestamp: Date.now(),\n ...fact,\n };\n this.facts.push(entry);\n appendFileSync(this.filepath, JSON.stringify(entry) + '\\n', 'utf-8');\n }\n\n search(query: string, limit: number = 5): LongTermFact[] {\n const lowerQuery = query.toLowerCase();\n const terms = lowerQuery.split(/\\s+/);\n return this.facts\n .filter(f => {\n const text = `${f.topic} ${f.fact}`.toLowerCase();\n return terms.some(t => text.includes(t));\n })\n .slice(-limit);\n }\n\n getAll(): LongTermFact[] {\n return [...this.facts];\n }\n\n private load(): void {\n if (!existsSync(this.filepath)) return;\n const lines = readFileSync(this.filepath, 'utf-8')\n .split('\\n')\n .filter(Boolean);\n this.facts = lines\n .map(line => {\n try { return JSON.parse(line); } catch { return null; }\n })\n .filter((f): f is LongTermFact => f !== null);\n }\n}\n\nexport class EpisodicMemory {\n private filepath: string;\n private events: EpisodicEvent[] = [];\n\n constructor(config: MercuryConfig) {\n this.filepath = join(config.memory.dir, 'episodic', 'events.jsonl');\n mkdirSync(join(config.memory.dir, 'episodic'), { recursive: true });\n this.load();\n }\n\n record(event: Omit<EpisodicEvent, 'id' | 'timestamp'>): void {\n const entry: EpisodicEvent = {\n id: generateId(),\n timestamp: Date.now(),\n ...event,\n };\n this.events.push(entry);\n appendFileSync(this.filepath, JSON.stringify(entry) + '\\n', 'utf-8');\n }\n\n getRecent(count: number = 20): EpisodicEvent[] {\n return this.events.slice(-count);\n }\n\n prune(olderThanDays: number = 7): number {\n const cutoff = Date.now() - olderThanDays * 24 * 60 * 60 * 1000;\n const before = this.events.length;\n this.events = this.events.filter(e => e.timestamp >= cutoff || e.metadata?.important);\n const removed = before - this.events.length;\n if (removed > 0) {\n writeFileSync(this.filepath, this.events.map(e => JSON.stringify(e)).join('\\n') + '\\n', 'utf-8');\n }\n return removed;\n }\n\n private load(): void {\n if (!existsSync(this.filepath)) return;\n const lines = readFileSync(this.filepath, 'utf-8')\n .split('\\n')\n .filter(Boolean);\n this.events = lines\n .map(line => {\n try { return JSON.parse(line); } catch { return null; }\n })\n .filter((e): e is EpisodicEvent => e !== null);\n }\n}\n\nfunction generateId(): string {\n return Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\n}","import { createOpenAI } from '@ai-sdk/openai';\nimport { generateText, streamText } from 'ai';\nimport { BaseProvider } from './base.js';\nimport type { ProviderConfig } from '../utils/config.js';\nimport type { LLMResponse, LLMStreamChunk } from './base.js';\nimport { logger } from '../utils/logger.js';\n\nexport class OpenAICompatProvider extends BaseProvider {\n readonly name: string;\n readonly model: string;\n private client: ReturnType<typeof createOpenAI>;\n private modelInstance: ReturnType<ReturnType<typeof createOpenAI>['languageModel']>;\n\n constructor(config: ProviderConfig) {\n super(config);\n this.name = config.name;\n this.model = config.model;\n\n this.client = createOpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseUrl,\n });\n this.modelInstance = this.client(config.model);\n }\n\n async generateText(prompt: string, systemPrompt: string): Promise<LLMResponse> {\n const result = await generateText({\n model: this.modelInstance,\n system: systemPrompt,\n prompt,\n });\n\n return {\n text: result.text,\n inputTokens: result.usage?.promptTokens ?? 0,\n outputTokens: result.usage?.completionTokens ?? 0,\n totalTokens: (result.usage?.promptTokens ?? 0) + (result.usage?.completionTokens ?? 0),\n model: this.model,\n provider: this.name,\n };\n }\n\n async *streamText(prompt: string, systemPrompt: string): AsyncIterable<LLMStreamChunk> {\n const result = streamText({\n model: this.modelInstance,\n system: systemPrompt,\n prompt,\n });\n\n for await (const chunk of (await result).textStream) {\n yield { text: chunk, done: false };\n }\n yield { text: '', done: true };\n }\n\n isAvailable(): boolean {\n return this.config.apiKey.length > 0;\n }\n\n getModelInstance() {\n return this.modelInstance;\n }\n}","import type { ProviderConfig } from '../utils/config.js';\n\nexport interface LLMResponse {\n text: string;\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n model: string;\n provider: string;\n}\n\nexport interface LLMStreamChunk {\n text: string;\n done: boolean;\n}\n\nexport abstract class BaseProvider {\n abstract readonly name: string;\n abstract readonly model: string;\n protected config: ProviderConfig;\n\n constructor(config: ProviderConfig) {\n this.config = config;\n }\n\n abstract generateText(prompt: string, systemPrompt: string): Promise<LLMResponse>;\n abstract streamText(prompt: string, systemPrompt: string): AsyncIterable<LLMStreamChunk>;\n abstract isAvailable(): boolean;\n abstract getModelInstance(): any;\n\n getModel(): string {\n return this.config.model;\n }\n}","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { generateText, streamText } from 'ai';\nimport { BaseProvider } from './base.js';\nimport type { ProviderConfig } from '../utils/config.js';\nimport type { LLMResponse, LLMStreamChunk } from './base.js';\n\nexport class AnthropicProvider extends BaseProvider {\n readonly name = 'anthropic';\n readonly model: string;\n private client: ReturnType<typeof createAnthropic>;\n private modelInstance: ReturnType<ReturnType<typeof createAnthropic>['languageModel']>;\n\n constructor(config: ProviderConfig) {\n super(config);\n this.model = config.model;\n\n this.client = createAnthropic({\n apiKey: config.apiKey,\n });\n this.modelInstance = this.client(config.model);\n }\n\n async generateText(prompt: string, systemPrompt: string): Promise<LLMResponse> {\n const result = await generateText({\n model: this.modelInstance,\n system: systemPrompt,\n prompt,\n });\n\n return {\n text: result.text,\n inputTokens: result.usage?.promptTokens ?? 0,\n outputTokens: result.usage?.completionTokens ?? 0,\n totalTokens: (result.usage?.promptTokens ?? 0) + (result.usage?.completionTokens ?? 0),\n model: this.model,\n provider: this.name,\n };\n }\n\n async *streamText(prompt: string, systemPrompt: string): AsyncIterable<LLMStreamChunk> {\n const result = streamText({\n model: this.modelInstance,\n system: systemPrompt,\n prompt,\n });\n\n for await (const chunk of (await result).textStream) {\n yield { text: chunk, done: false };\n }\n yield { text: '', done: true };\n }\n\n isAvailable(): boolean {\n return this.config.apiKey.length > 0;\n }\n\n getModelInstance() {\n return this.modelInstance;\n }\n}","import type { MercuryConfig, ProviderConfig } from '../utils/config.js';\nimport type { BaseProvider } from './base.js';\nimport { OpenAICompatProvider } from './openai-compat.js';\nimport { AnthropicProvider } from './anthropic.js';\nimport { logger } from '../utils/logger.js';\n\nexport class ProviderRegistry {\n private providers: Map<string, BaseProvider> = new Map();\n private defaultName: string;\n private lastSuccessful: string | null = null;\n\n constructor(config: MercuryConfig) {\n this.defaultName = config.providers.default;\n\n const entries: ProviderConfig[] = [\n config.providers.openai,\n config.providers.anthropic,\n config.providers.deepseek,\n ];\n\n for (const pc of entries) {\n if (!pc.enabled || !pc.apiKey) continue;\n try {\n const provider = pc.name === 'anthropic'\n ? new AnthropicProvider(pc)\n : new OpenAICompatProvider(pc);\n this.providers.set(pc.name, provider);\n logger.info({ provider: pc.name, model: pc.model }, 'Provider registered');\n } catch (err) {\n logger.warn({ provider: pc.name, err }, 'Failed to register provider');\n }\n }\n }\n\n get(name?: string): BaseProvider | undefined {\n const key = name || this.defaultName;\n return this.providers.get(key);\n }\n\n getDefault(): BaseProvider {\n if (this.lastSuccessful) {\n const provider = this.providers.get(this.lastSuccessful);\n if (provider) return provider;\n }\n\n const provider = this.providers.get(this.defaultName);\n if (!provider) {\n const first = this.providers.values().next().value;\n if (!first) throw new Error('No LLM providers available — configure API keys');\n return first;\n }\n return provider;\n }\n\n getFallbackIterator(): IterableIterator<BaseProvider> {\n const ordered: BaseProvider[] = [];\n const defaultProvider = this.getDefault();\n ordered.push(defaultProvider);\n for (const [, provider] of this.providers) {\n if (provider !== defaultProvider) {\n ordered.push(provider);\n }\n }\n return ordered[Symbol.iterator]();\n }\n\n markSuccess(name: string): void {\n this.lastSuccessful = name;\n }\n\n listAvailable(): string[] {\n return [...this.providers.keys()];\n }\n\n hasProviders(): boolean {\n return this.providers.size > 0;\n }\n}","import { generateText, streamText } from 'ai';\nimport type { ChannelMessage, ChannelType } from '../types/channel.js';\nimport type { ProviderRegistry } from '../providers/registry.js';\nimport type { Identity } from '../soul/identity.js';\nimport type { ShortTermMemory, LongTermMemory, EpisodicMemory } from '../memory/store.js';\nimport type { ChannelRegistry } from '../channels/registry.js';\nimport type { MercuryConfig } from '../utils/config.js';\nimport type { TokenBudget } from '../utils/tokens.js';\nimport type { CapabilityRegistry } from '../capabilities/registry.js';\nimport type { ScheduledTaskManifest } from './scheduler.js';\nimport { Lifecycle } from './lifecycle.js';\nimport { Scheduler } from './scheduler.js';\nimport { logger } from '../utils/logger.js';\n\nconst MAX_STEPS = 10;\n\nexport class Agent {\n readonly lifecycle: Lifecycle;\n readonly scheduler: Scheduler;\n readonly capabilities: CapabilityRegistry;\n private running = false;\n private messageQueue: ChannelMessage[] = [];\n private processing = false;\n private telegramStreaming: boolean;\n\n constructor(\n private config: MercuryConfig,\n private providers: ProviderRegistry,\n private identity: Identity,\n private shortTerm: ShortTermMemory,\n private longTerm: LongTermMemory,\n private episodic: EpisodicMemory,\n private channels: ChannelRegistry,\n private tokenBudget: TokenBudget,\n capabilities: CapabilityRegistry,\n scheduler: Scheduler,\n ) {\n this.lifecycle = new Lifecycle();\n this.scheduler = scheduler;\n this.capabilities = capabilities;\n this.telegramStreaming = config.channels.telegram.streaming ?? true;\n\n this.scheduler.setOnScheduledTask(async (manifest) => this.handleScheduledTask(manifest));\n\n this.channels.onIncomingMessage((msg) => this.enqueueMessage(msg));\n\n this.scheduler.onHeartbeat(async () => {\n await this.heartbeat();\n });\n }\n\n private enqueueMessage(msg: ChannelMessage): void {\n logger.info({ from: msg.channelType, content: msg.content.slice(0, 50) }, 'Message enqueued');\n this.messageQueue.push(msg);\n this.processQueue();\n }\n\n private async processQueue(): Promise<void> {\n if (this.processing) return;\n if (this.messageQueue.length === 0) return;\n if (!this.lifecycle.is('idle')) return;\n\n this.processing = true;\n\n while (this.messageQueue.length > 0) {\n const msg = this.messageQueue.shift()!;\n try {\n await this.handleMessage(msg);\n } catch (err) {\n logger.error({ err, msg: msg.content.slice(0, 50) }, 'Failed to handle message');\n }\n }\n\n this.processing = false;\n }\n\n async birth(): Promise<void> {\n this.lifecycle.transition('birthing');\n logger.info({ name: this.config.identity.name }, 'Mercury is being born...');\n this.lifecycle.transition('onboarding');\n }\n\n async wake(): Promise<void> {\n this.lifecycle.transition('onboarding');\n this.lifecycle.transition('idle');\n this.scheduler.restorePersistedTasks();\n this.scheduler.startHeartbeat();\n await this.channels.startAll();\n this.running = true;\n\n const activeChannels = this.channels.getActiveChannels();\n const toolNames = this.capabilities.getToolNames();\n logger.info({ channels: activeChannels, tools: toolNames }, 'Mercury is awake');\n }\n\n async sleep(): Promise<void> {\n this.running = false;\n this.scheduler.stopAll();\n await this.channels.stopAll();\n this.lifecycle.transition('sleeping');\n logger.info('Mercury is sleeping');\n }\n\n private async handleMessage(msg: ChannelMessage): Promise<void> {\n this.lifecycle.transition('thinking');\n const startTime = Date.now();\n\n const isInternal = msg.channelType === 'internal';\n const isScheduled = msg.senderId === 'system' && msg.channelType !== 'internal';\n if (isInternal || isScheduled) {\n this.capabilities.permissions.setAutoApproveAll(true);\n }\n\n try {\n const trimmed = msg.content.trim();\n if (trimmed.startsWith('/budget')) {\n const subcommand = trimmed.slice('/budget'.length).trim();\n await this.handleBudgetCommand(subcommand || 'status', msg.channelType, msg.channelId);\n this.lifecycle.transition('idle');\n return;\n }\n\n if (trimmed === '/budget_override') {\n await this.handleBudgetCommand('override', msg.channelType, msg.channelId);\n this.lifecycle.transition('idle');\n return;\n }\n if (trimmed === '/budget_reset') {\n await this.handleBudgetCommand('reset', msg.channelType, msg.channelId);\n this.lifecycle.transition('idle');\n return;\n }\n if (trimmed.startsWith('/budget_set')) {\n const args = trimmed.slice('/budget_set'.length).trim();\n await this.handleBudgetCommand('set ' + args, msg.channelType, msg.channelId);\n this.lifecycle.transition('idle');\n return;\n }\n if (trimmed.startsWith('/stream')) {\n const sub = trimmed.slice('/stream'.length).trim().toLowerCase();\n if (sub === 'off') {\n this.telegramStreaming = false;\n } else if (sub === 'on') {\n this.telegramStreaming = true;\n } else {\n this.telegramStreaming = !this.telegramStreaming;\n }\n const ch = this.channels.get(msg.channelType as any);\n if (ch) await ch.send(\n this.telegramStreaming\n ? 'Telegram streaming enabled. Responses will appear progressively.'\n : 'Telegram streaming disabled. Responses will arrive as a single message.',\n msg.channelId,\n );\n this.lifecycle.transition('idle');\n return;\n }\n\n if (await this.handleChatCommand(trimmed, msg.channelType, msg.channelId)) {\n this.lifecycle.transition('idle');\n return;\n }\n\n if (this.tokenBudget.isOverBudget()) {\n const channel = this.channels.getChannelForMessage(msg);\n if (channel && msg.channelType !== 'internal') {\n if (msg.channelType === 'cli') {\n if (['1', '2', '3', '4'].includes(trimmed)) {\n await this.handleBudgetCommand(trimmed, msg.channelType, msg.channelId);\n this.lifecycle.transition('idle');\n return;\n }\n await this.handleBudgetOverrideCLI(channel, msg);\n } else {\n await channel.send(\n `I've exceeded my daily token budget (${this.tokenBudget.getStatusText()}).\\n\\nYou can override this:\\n• /budget override — allow one more request\\n• /budget reset — reset usage to zero\\n• /budget set <number> — change daily budget`,\n msg.channelId,\n );\n }\n }\n this.lifecycle.transition('idle');\n return;\n }\n\n const systemPrompt = this.buildSystemPrompt();\n const recentMemory = this.shortTerm.getRecent(msg.channelId, 10);\n const relevantFacts = this.longTerm.search(msg.content, 3);\n\n const messages: any[] = [];\n\n if (relevantFacts.length > 0) {\n messages.push({\n role: 'user',\n content: 'Relevant facts from memory:\\n' + relevantFacts.map(f => `- ${f.fact}`).join('\\n'),\n });\n messages.push({ role: 'assistant', content: 'Noted. I\\'ll use these facts.' });\n }\n\n if (recentMemory.length > 0) {\n for (const m of recentMemory) {\n messages.push({\n role: m.role === 'user' ? 'user' : 'assistant',\n content: m.content,\n });\n }\n }\n\n messages.push({ role: 'user', content: msg.content });\n\n this.lifecycle.transition('responding');\n\n const channel = this.channels.getChannelForMessage(msg);\n if (channel) {\n await channel.typing(msg.channelId).catch(() => {});\n }\n\n this.capabilities.setChannelContext(msg.channelId, msg.channelType);\n this.capabilities.permissions.setCurrentChannelType(msg.channelType);\n\n const fallbackIterator = this.providers.getFallbackIterator();\n let result: any = null;\n let usedProvider: { name: string; model: string } | null = null;\n let lastError: any = null;\n let streamedText = '';\n\n const canStream = msg.channelType === 'cli' || (msg.channelType === 'telegram' && this.telegramStreaming);\n\n for (const provider of fallbackIterator) {\n try {\n logger.info({ provider: provider.name, model: provider.getModel(), steps: MAX_STEPS, stream: canStream }, 'Generating agentic response');\n\n if (canStream && channel) {\n const streamResult = streamText({\n model: provider.getModelInstance(),\n system: systemPrompt,\n messages,\n tools: this.capabilities.getTools(),\n maxSteps: MAX_STEPS,\n onStepFinish: async ({ toolCalls }) => {\n if (toolCalls && toolCalls.length > 0) {\n const names = toolCalls.map((tc: any) => tc.toolName).join(', ');\n logger.info({ tools: names }, 'Tool call step');\n await channel.send(` [Using: ${names}]`, msg.channelId).catch(() => {});\n }\n },\n });\n\n let fullText: string;\n\n if (msg.channelType === 'telegram') {\n const tgChannel = this.channels.get('telegram');\n if (tgChannel && 'sendStreamToChat' in tgChannel) {\n const chatId = msg.channelId.startsWith('telegram:')\n ? Number(msg.channelId.split(':')[1])\n : Number(msg.channelId);\n if (!isNaN(chatId)) {\n fullText = await (tgChannel as any).sendStreamToChat(chatId, streamResult.textStream);\n } else {\n fullText = await channel.stream(streamResult.textStream, msg.channelId);\n }\n } else {\n fullText = await channel.stream(streamResult.textStream, msg.channelId);\n }\n } else {\n fullText = await channel.stream(streamResult.textStream, msg.channelId);\n }\n\n const [usage] = await Promise.all([\n streamResult.usage,\n ]);\n\n result = { text: fullText, usage };\n streamedText = fullText;\n } else {\n result = await generateText({\n model: provider.getModelInstance(),\n system: systemPrompt,\n messages,\n tools: this.capabilities.getTools(),\n maxSteps: MAX_STEPS,\n onStepFinish: async ({ toolCalls, text }) => {\n if (toolCalls && toolCalls.length > 0) {\n const names = toolCalls.map((tc: any) => tc.toolName).join(', ');\n logger.info({ tools: names }, 'Tool call step');\n if (channel && msg.channelType !== 'internal') {\n await channel.send(` [Using: ${names}]`, msg.channelId).catch(() => {});\n }\n }\n },\n });\n }\n\n usedProvider = { name: provider.name, model: provider.getModel() };\n this.providers.markSuccess(provider.name);\n break;\n } catch (err: any) {\n lastError = err;\n logger.warn({ provider: provider.name, err: err.message }, 'Provider failed, trying fallback');\n if (channel && msg.channelType !== 'internal') {\n await channel.send(` [Provider ${provider.name} failed, trying fallback...]`, msg.channelId).catch(() => {});\n }\n }\n }\n\n if (!result) {\n const errMsg = `All LLM providers failed. Last error: ${lastError?.message || 'unknown'}`;\n logger.error({ err: lastError }, errMsg);\n if (channel && msg.channelType !== 'internal') {\n await channel.send(errMsg, msg.channelId);\n }\n this.lifecycle.transition('idle');\n return;\n }\n\n const finalText = streamedText || result.text;\n\n this.tokenBudget.recordUsage({\n provider: usedProvider!.name,\n model: usedProvider!.model,\n inputTokens: result.usage?.promptTokens ?? 0,\n outputTokens: result.usage?.completionTokens ?? 0,\n totalTokens: (result.usage?.promptTokens ?? 0) + (result.usage?.completionTokens ?? 0),\n channelType: msg.channelType,\n });\n\n this.shortTerm.add(msg.channelId, {\n id: msg.id,\n timestamp: msg.timestamp,\n role: 'user',\n content: msg.content,\n });\n\n this.shortTerm.add(msg.channelId, {\n id: Date.now().toString(36),\n timestamp: Date.now(),\n role: 'assistant',\n content: finalText,\n tokenCount: (result.usage?.promptTokens ?? 0) + (result.usage?.completionTokens ?? 0),\n });\n\n this.episodic.record({\n type: 'message',\n summary: `User: ${msg.content.slice(0, 100)} | Agent: ${finalText.slice(0, 100)}`,\n channelType: msg.channelType,\n });\n\n if (msg.channelType !== 'internal') {\n this.extractFacts(msg.content, finalText).catch(err => {\n logger.warn({ err }, 'Fact extraction failed');\n });\n }\n\n if (channel && msg.channelType !== 'internal') {\n const elapsed = Date.now() - startTime;\n if (streamedText) {\n logger.info({ channelType: msg.channelType, elapsed }, 'Streamed response completed');\n } else {\n logger.info({ channelType: msg.channelType, targetId: msg.channelId }, 'Sending response');\n await channel.send(finalText, msg.channelId, elapsed);\n }\n } else {\n logger.debug('Internal prompt processed, no channel response needed');\n }\n\n this.lifecycle.transition('idle');\n } catch (err) {\n logger.error({ err }, 'Error handling message');\n this.lifecycle.transition('idle');\n } finally {\n if (isInternal || isScheduled) {\n this.capabilities.permissions.setAutoApproveAll(false);\n }\n this.capabilities.permissions.clearElevation();\n }\n }\n\n private buildSystemPrompt(): string {\n let prompt = this.identity.getSystemPrompt(this.config.identity);\n const skillContext = this.capabilities.getSkillContext();\n if (skillContext) {\n prompt += '\\n\\n' + skillContext;\n }\n const budgetStatus = this.tokenBudget.getStatusText();\n prompt += '\\n\\n' + budgetStatus;\n if (this.tokenBudget.getUsagePercentage() > 70) {\n prompt += '\\nBe concise to conserve tokens.';\n }\n return prompt;\n }\n\n async processInternalPrompt(prompt: string, channelId?: string, channelType?: string): Promise<void> {\n const syntheticMsg: ChannelMessage = {\n id: `internal-${Date.now().toString(36)}`,\n channelId: channelId || 'internal',\n channelType: (channelType || 'internal') as ChannelType,\n senderId: 'system',\n content: prompt,\n timestamp: Date.now(),\n };\n this.enqueueMessage(syntheticMsg);\n }\n\n private async handleScheduledTask(manifest: ScheduledTaskManifest): Promise<void> {\n logger.info({ task: manifest.id, channel: manifest.sourceChannelType }, 'Processing scheduled task');\n try {\n let prompt = manifest.prompt || '';\n if (manifest.skillName) {\n const skillHint = `Invoke the skill \"${manifest.skillName}\" using the use_skill tool and follow its instructions.`;\n prompt = prompt ? `${prompt} ${skillHint}` : `Scheduled task triggered. ${skillHint}`;\n }\n if (!prompt) {\n prompt = `Execute scheduled task: ${manifest.description}`;\n }\n await this.processInternalPrompt(prompt, manifest.sourceChannelId, manifest.sourceChannelType);\n } catch (err) {\n logger.error({ err, task: manifest.id }, 'Scheduled task execution failed');\n }\n }\n\n private async heartbeat(): Promise<void> {\n logger.debug('Heartbeat tick');\n\n const pruned = this.episodic.prune(7);\n if (pruned > 0) {\n logger.info({ pruned }, 'Episodic memory pruned');\n }\n\n const notifications: string[] = [];\n\n const usagePct = this.tokenBudget.getUsagePercentage();\n if (usagePct >= 80) {\n notifications.push(`Token budget at ${Math.round(usagePct)}% — ${this.tokenBudget.getRemaining().toLocaleString()} tokens remaining today.`);\n }\n\n const pendingSchedules = this.scheduler.getManifests();\n const now = Date.now();\n for (const task of pendingSchedules) {\n if (task.delaySeconds && task.executeAt) {\n const executeAt = new Date(task.executeAt).getTime();\n const diffMin = Math.round((executeAt - now) / 60000);\n if (diffMin > 0 && diffMin <= 5) {\n notifications.push(`Task \"${task.description}\" fires in ${diffMin} minute${diffMin !== 1 ? 's' : ''}.`);\n }\n }\n }\n\n if (notifications.length > 0) {\n const channel = this.channels.getNotificationChannel();\n if (channel) {\n const msg = notifications.join('\\n');\n try {\n await channel.send(msg, 'notification');\n } catch (err) {\n logger.warn({ err }, 'Failed to send heartbeat notification');\n }\n }\n }\n }\n\n private async extractFacts(userMessage: string, agentResponse: string): Promise<void> {\n const trivial = /^(hi|hello|hey|thanks|thank you|ok|okay|yes|no|bye|goodbye|good morning|good evening)\\b/i;\n if (trivial.test(userMessage.trim())) return;\n\n if (!this.tokenBudget.canAfford(500)) return;\n\n try {\n const provider = this.providers.getDefault();\n const result = await generateText({\n model: provider.getModelInstance(),\n system: 'You are a fact extractor. Read the conversation below and extract 1-3 important facts worth remembering long-term. Output each fact on a separate line, prefixed with \"- \". Only extract facts that are specific, factual, and not obvious. If nothing is worth remembering, output nothing.',\n messages: [\n { role: 'user', content: `User: ${userMessage}\\nAssistant: ${agentResponse}` },\n ],\n maxTokens: 200,\n });\n\n const text = result.text.trim();\n if (!text) return;\n\n const facts = text\n .split('\\n')\n .map(l => l.replace(/^-\\s*/, '').trim())\n .filter(f => f.length > 10 && f.length < 200);\n\n const existing = this.longTerm.getAll();\n for (const fact of facts.slice(0, 3)) {\n const isDupe = existing.some(e =>\n e.fact.toLowerCase().includes(fact.toLowerCase().slice(0, 30))\n );\n if (!isDupe) {\n this.longTerm.add({\n topic: 'extracted',\n fact,\n source: 'conversation',\n });\n logger.info({ fact: fact.slice(0, 60) }, 'Fact extracted to long-term memory');\n }\n }\n\n this.tokenBudget.recordUsage({\n provider: provider.name,\n model: provider.getModel(),\n inputTokens: result.usage?.promptTokens ?? 0,\n outputTokens: result.usage?.completionTokens ?? 0,\n totalTokens: (result.usage?.promptTokens ?? 0) + (result.usage?.completionTokens ?? 0),\n channelType: 'internal',\n });\n } catch (err) {\n logger.warn({ err }, 'Fact extraction error');\n }\n }\n\n async shutdown(): Promise<void> {\n await this.sleep();\n logger.info('Mercury has shut down');\n }\n\n private async handleBudgetOverrideCLI(channel: import('../channels/base.js').Channel, msg: ChannelMessage): Promise<void> {\n const status = this.tokenBudget.getStatusText();\n await channel.send(\n `Token budget exceeded! ${status}\\n\\nChoose an option:\\n 1 — Override (allow this one request)\\n 2 — Reset usage to zero\\n 3 — Set a new daily budget (current: ${this.tokenBudget.getBudget().toLocaleString()})\\n 4 — Cancel\\n\\nOr use /budget override, /budget reset, /budget set <number> anytime.`,\n msg.channelId,\n );\n }\n\n async handleBudgetCommand(subcommand: string, channelType: string, channelId: string): Promise<void> {\n const channel = this.channels.get(channelType as any);\n if (!channel) return;\n\n const parts = subcommand.trim().split(/\\s+/);\n const action = parts[0]?.toLowerCase();\n\n if (action === 'override' || action === '1') {\n this.tokenBudget.forceAllowNext();\n await channel.send('Budget override applied — your next request will proceed.', channelId);\n } else if (action === 'reset' || action === '2') {\n this.tokenBudget.resetUsage();\n await channel.send(`Usage reset to zero. ${this.tokenBudget.getStatusText()}`, channelId);\n } else if (action === 'set' || action === '3') {\n const newBudget = parseInt(parts[1], 10);\n if (isNaN(newBudget) || newBudget <= 0) {\n await channel.send('Please specify the new budget. Usage: `/budget set 100000` or type e.g. `3 100000`', channelId);\n return;\n }\n this.tokenBudget.setBudget(newBudget);\n await channel.send(`Daily budget updated to ${newBudget.toLocaleString()} tokens. ${this.tokenBudget.getStatusText()}`, channelId);\n } else if (action === 'cancel' || action === '4') {\n await channel.send(`Cancelled. ${this.tokenBudget.getStatusText()}`, channelId);\n } else if (!action || action === 'status') {\n await channel.send(this.tokenBudget.getStatusText(), channelId);\n } else {\n await channel.send(`Unknown budget command \"${action}\". Available: /budget, /budget override, /budget reset, /budget set <number>, /budget status`, channelId);\n }\n }\n\n private async handleChatCommand(content: string, channelType: string, channelId: string): Promise<boolean> {\n const cmd = content.toLowerCase().trim();\n const channel = this.channels.get(channelType as any);\n if (!channel) return false;\n\n const ctx = this.capabilities.getChatCommandContext();\n if (!ctx) return false;\n\n if (cmd === '/help') {\n await channel.send(ctx.manual(), channelId);\n return true;\n }\n\n if (cmd === '/status') {\n const config = ctx.config();\n const budget = ctx.tokenBudget();\n const lines = [\n `**${config.identity.name}** — Status`,\n `Owner: ${config.identity.owner || '(not set)'}`,\n `Provider: ${config.providers.default}`,\n `Telegram: ${config.channels.telegram.enabled ? 'enabled' : 'disabled'}`,\n `Budget: ${budget.getStatusText()}`,\n `Skills: ${ctx.skillNames().length > 0 ? ctx.skillNames().join(', ') : 'none'}`,\n ];\n await channel.send(lines.join('\\n'), channelId);\n return true;\n }\n\n if (cmd === '/tools') {\n const tools = ctx.toolNames();\n const grouped = [\n `**${tools.length} tools loaded:**`,\n '',\n ...tools.sort().map(t => `• \\`${t}\\``),\n ];\n await channel.send(grouped.join('\\n'), channelId);\n return true;\n }\n\n if (cmd === '/skills') {\n const names = ctx.skillNames();\n if (names.length === 0) {\n await channel.send('No skills installed. Ask me to \"install skill from <url>\" to add one.', channelId);\n } else {\n const lines = [\n `**${names.length} skill${names.length > 1 ? 's' : ''} installed:**`,\n '',\n ...names.map(n => `• ${n}`),\n ];\n await channel.send(lines.join('\\n'), channelId);\n }\n return true;\n }\n\n if (cmd === '/stream on') {\n this.telegramStreaming = true;\n await channel.send('Telegram streaming enabled. Responses will appear progressively.', channelId);\n return true;\n }\n\n if (cmd === '/stream off') {\n this.telegramStreaming = false;\n await channel.send('Telegram streaming disabled. Responses will arrive as a single message.', channelId);\n return true;\n }\n\n if (cmd === '/stream') {\n this.telegramStreaming = !this.telegramStreaming;\n await channel.send(\n this.telegramStreaming\n ? 'Telegram streaming enabled. Responses will appear progressively.'\n : 'Telegram streaming disabled. Responses will arrive as a single message.',\n channelId,\n );\n return true;\n }\n if (cmd === '/stream off') {\n this.telegramStreaming = false;\n await channel.send('Telegram streaming disabled. Responses will arrive as a single message.', channelId);\n return true;\n }\n\n return false;\n }\n}","import type { AgentState } from '../types/agent.js';\nimport { logger } from '../utils/logger.js';\n\ntype Transition = { from: AgentState; to: AgentState; condition?: () => boolean };\n\nconst VALID_TRANSITIONS: Transition[] = [\n { from: 'unborn', to: 'birthing' },\n { from: 'birthing', to: 'onboarding' },\n { from: 'onboarding', to: 'idle' },\n { from: 'idle', to: 'thinking' },\n { from: 'thinking', to: 'responding' },\n { from: 'responding', to: 'idle' },\n { from: 'idle', to: 'sleeping' },\n { from: 'sleeping', to: 'awakening' },\n { from: 'awakening', to: 'idle' },\n { from: 'thinking', to: 'idle' },\n { from: 'idle', to: 'onboarding' },\n];\n\nexport class Lifecycle {\n private state: AgentState = 'unborn';\n\n getState(): AgentState {\n return this.state;\n }\n\n transition(to: AgentState): boolean {\n const valid = VALID_TRANSITIONS.some(t => t.from === this.state && t.to === to);\n if (!valid) {\n logger.warn({ from: this.state, to }, 'Invalid state transition');\n return false;\n }\n logger.info({ from: this.state, to }, 'State transition');\n this.state = to;\n return true;\n }\n\n is(newState: AgentState): boolean {\n return this.state === newState;\n }\n\n canTransitionTo(to: AgentState): boolean {\n return VALID_TRANSITIONS.some(t => t.from === this.state && t.to === to);\n }\n}","import cron from 'node-cron';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { MercuryConfig } from '../utils/config.js';\nimport { getMercuryHome } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface ScheduledTask {\n id: string;\n cron: string;\n handler: () => Promise<void>;\n description: string;\n}\n\nexport interface ScheduledTaskManifest {\n id: string;\n cron?: string;\n description: string;\n skillName?: string;\n prompt?: string;\n delaySeconds?: number;\n executeAt?: string;\n createdAt: string;\n sourceChannelId?: string;\n sourceChannelType?: string;\n}\n\nconst SCHEDULES_FILE = 'schedules.yaml';\n\nfunction getSchedulesPath(): string {\n return join(getMercuryHome(), SCHEDULES_FILE);\n}\n\nexport function loadSchedules(): ScheduledTaskManifest[] {\n const path = getSchedulesPath();\n if (!existsSync(path)) return [];\n try {\n const raw = readFileSync(path, 'utf-8');\n const data = parseYaml(raw) as { tasks?: ScheduledTaskManifest[] };\n return data.tasks || [];\n } catch (err) {\n logger.warn({ err }, 'Failed to load schedules.yaml');\n return [];\n }\n}\n\nexport function saveSchedules(tasks: ScheduledTaskManifest[]): void {\n const path = getSchedulesPath();\n const dir = getMercuryHome();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, stringifyYaml({ tasks }), 'utf-8');\n}\n\nexport class Scheduler {\n private tasks: Map<string, cron.ScheduledTask> = new Map();\n private delayedTasks: Map<string, NodeJS.Timeout> = new Map();\n private taskManifests: Map<string, ScheduledTaskManifest> = new Map();\n private heartbeatIntervalMinutes: number;\n private heartbeatHandler?: () => Promise<void>;\n private heartbeatTimer: NodeJS.Timeout | null = null;\n\n constructor(\n config: MercuryConfig,\n private onScheduledTask?: (manifest: ScheduledTaskManifest) => Promise<void>,\n ) {\n this.heartbeatIntervalMinutes = config.heartbeat.intervalMinutes;\n }\n\n setOnScheduledTask(handler: (manifest: ScheduledTaskManifest) => Promise<void>): void {\n this.onScheduledTask = handler;\n }\n\n onHeartbeat(handler: () => Promise<void>): void {\n this.heartbeatHandler = handler;\n }\n\n startHeartbeat(): void {\n if (this.heartbeatTimer) return;\n const ms = this.heartbeatIntervalMinutes * 60 * 1000;\n logger.info({ intervalMin: this.heartbeatIntervalMinutes }, 'Heartbeat started');\n\n this.heartbeatTimer = setInterval(async () => {\n try {\n await this.heartbeatHandler?.();\n } catch (err) {\n logger.error({ err }, 'Heartbeat error');\n }\n }, ms);\n }\n\n stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n logger.info('Heartbeat stopped');\n }\n }\n\n addTask(task: ScheduledTask): void {\n if (this.tasks.has(task.id)) {\n this.removeTask(task.id);\n }\n const scheduled = cron.schedule(task.cron, async () => {\n try {\n await task.handler();\n } catch (err) {\n logger.error({ task: task.id, err }, 'Scheduled task error');\n }\n });\n this.tasks.set(task.id, scheduled);\n logger.info({ id: task.id, cron: task.cron, desc: task.description }, 'Task scheduled');\n }\n\n addPersistedTask(manifest: ScheduledTaskManifest): void {\n this.taskManifests.set(manifest.id, manifest);\n this.addTask({\n id: manifest.id,\n cron: manifest.cron!,\n description: manifest.description,\n handler: async () => {\n logger.info({ task: manifest.id }, 'Scheduled task firing');\n if (this.onScheduledTask) {\n await this.onScheduledTask(manifest);\n }\n },\n });\n }\n\n addDelayedTask(manifest: ScheduledTaskManifest): void {\n this.taskManifests.set(manifest.id, manifest);\n const delayMs = (manifest.delaySeconds || 60) * 1000;\n\n const timer = setTimeout(async () => {\n try {\n logger.info({ task: manifest.id }, 'Delayed task firing');\n if (this.onScheduledTask) {\n await this.onScheduledTask(manifest);\n }\n } catch (err) {\n logger.error({ task: manifest.id, err }, 'Delayed task error');\n } finally {\n this.delayedTasks.delete(manifest.id);\n this.taskManifests.delete(manifest.id);\n this.persistSchedules();\n }\n }, delayMs);\n\n this.delayedTasks.set(manifest.id, timer);\n logger.info({ id: manifest.id, delaySeconds: manifest.delaySeconds }, 'Delayed task scheduled');\n }\n\n removeTask(id: string): void {\n const task = this.tasks.get(id);\n if (task) {\n task.stop();\n this.tasks.delete(id);\n }\n const timer = this.delayedTasks.get(id);\n if (timer) {\n clearTimeout(timer);\n this.delayedTasks.delete(id);\n }\n this.taskManifests.delete(id);\n }\n\n getManifests(): ScheduledTaskManifest[] {\n return [...this.taskManifests.values()];\n }\n\n restorePersistedTasks(): void {\n const persisted = loadSchedules();\n for (const manifest of persisted) {\n if (manifest.delaySeconds) {\n const executeAt = manifest.executeAt ? new Date(manifest.executeAt) : null;\n const now = Date.now();\n if (executeAt && executeAt.getTime() > now) {\n const remainingMs = executeAt.getTime() - now;\n manifest.delaySeconds = Math.ceil(remainingMs / 1000);\n this.addDelayedTask(manifest);\n } else {\n logger.info({ id: manifest.id }, 'Delayed task already expired, skipping');\n }\n } else if (manifest.cron && cron.validate(manifest.cron)) {\n this.addPersistedTask(manifest);\n } else {\n logger.warn({ id: manifest.id, cron: manifest.cron }, 'Skipping invalid task');\n }\n }\n if (persisted.length > 0) {\n logger.info({ count: persisted.length }, 'Restored persisted scheduled tasks');\n }\n }\n\n persistSchedules(): void {\n saveSchedules(this.getManifests());\n }\n\n stopAll(): void {\n this.stopHeartbeat();\n for (const [, task] of this.tasks) {\n task.stop();\n }\n for (const [, timer] of this.delayedTasks) {\n clearTimeout(timer);\n }\n this.tasks.clear();\n this.delayedTasks.clear();\n this.taskManifests.clear();\n }\n}","import readline from 'node:readline';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport chalk from 'chalk';\nimport type { ChannelMessage } from '../types/channel.js';\nimport { BaseChannel } from './base.js';\nimport { logger } from '../utils/logger.js';\nimport { renderMarkdown } from '../utils/markdown.js';\n\nexport class CLIChannel extends BaseChannel {\n readonly type = 'cli' as const;\n private rl: readline.Interface | null = null;\n private agentName: string;\n\n constructor(agentName: string = 'Mercury') {\n super();\n this.agentName = agentName;\n }\n\n setAgentName(name: string): void {\n this.agentName = name;\n }\n\n async start(): Promise<void> {\n this.rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: ' You: ',\n });\n\n this.rl.on('line', (line) => {\n const trimmed = line.trim();\n if (!trimmed) {\n this.showPrompt();\n return;\n }\n\n const msg: ChannelMessage = {\n id: Date.now().toString(36),\n channelId: 'cli',\n channelType: 'cli',\n senderId: 'owner',\n content: trimmed,\n timestamp: Date.now(),\n };\n this.emit(msg);\n });\n\n this.ready = true;\n this.showPrompt();\n logger.info('CLI channel started');\n }\n\n async stop(): Promise<void> {\n this.rl?.close();\n this.rl = null;\n this.ready = false;\n }\n\n async send(content: string, _targetId?: string, elapsedMs?: number): Promise<void> {\n const timeStr = elapsedMs != null ? chalk.dim(` (${(elapsedMs / 1000).toFixed(1)}s)`) : '';\n const rendered = renderMarkdown(content);\n console.log('');\n console.log(chalk.cyan(` ${this.agentName}:`) + timeStr);\n const indented = rendered\n .split('\\n')\n .map((line: string) => ` ${line}`)\n .join('\\n');\n console.log(indented);\n console.log('');\n this.showPrompt();\n }\n\n async sendFile(filePath: string, _targetId?: string): Promise<void> {\n const resolved = path.resolve(filePath);\n if (!fs.existsSync(resolved)) {\n console.log(chalk.red(` File not found: ${filePath}`));\n return;\n }\n const stat = fs.statSync(resolved);\n const sizeStr = stat.size > 1024 * 1024\n ? `${(stat.size / (1024 * 1024)).toFixed(1)}MB`\n : stat.size > 1024\n ? `${(stat.size / 1024).toFixed(1)}KB`\n : `${stat.size}B`;\n console.log('');\n console.log(chalk.cyan(` ${this.agentName}:`) + chalk.dim(' (file)'));\n console.log(chalk.dim(` path: ${resolved}`));\n console.log(chalk.dim(` size: ${sizeStr}`));\n console.log('');\n this.showPrompt();\n }\n\n async stream(content: AsyncIterable<string>, _targetId?: string): Promise<string> {\n console.log('');\n process.stdout.write(chalk.cyan(` ${this.agentName}: `));\n let full = '';\n for await (const chunk of content) {\n process.stdout.write(chunk);\n full += chunk;\n }\n console.log('\\n');\n this.showPrompt();\n return full;\n }\n\n async typing(_targetId?: string): Promise<void> {\n process.stdout.write(chalk.dim(` ${this.agentName} is thinking...\\r`));\n }\n\n showPrompt(): void {\n if (this.rl) {\n this.rl.setPrompt(' You: ');\n this.rl.prompt();\n }\n }\n\n async prompt(question: string): Promise<string> {\n return new Promise((resolve) => {\n this.rl?.question(question, (answer) => resolve(answer.trim()));\n });\n }\n\n async askPermission(prompt: string): Promise<string> {\n return new Promise((resolve) => {\n console.log('');\n console.log(chalk.yellow(` ⚠ ${prompt}`));\n this.rl?.question(chalk.yellow(' > '), (answer) => {\n resolve(answer.trim());\n });\n });\n }\n}","import type { ChannelType, ChannelMessage } from '../types/channel.js';\n\nexport interface Channel {\n readonly type: ChannelType;\n start(): Promise<void>;\n stop(): Promise<void>;\n send(content: string, targetId?: string, elapsedMs?: number): Promise<void>;\n sendFile(filePath: string, targetId?: string): Promise<void>;\n stream(content: AsyncIterable<string>, targetId?: string): Promise<string>;\n typing(targetId?: string): Promise<void>;\n isReady(): boolean;\n onMessage(handler: (msg: ChannelMessage) => void): void;\n}\n\nexport abstract class BaseChannel implements Channel {\n abstract readonly type: ChannelType;\n protected messageHandler?: (msg: ChannelMessage) => void;\n protected ready = false;\n\n abstract start(): Promise<void>;\n abstract stop(): Promise<void>;\n abstract send(content: string, targetId?: string, elapsedMs?: number): Promise<void>;\n abstract sendFile(filePath: string, targetId?: string): Promise<void>;\n abstract stream(content: AsyncIterable<string>, targetId?: string): Promise<string>;\n abstract typing(targetId?: string): Promise<void>;\n\n isReady(): boolean {\n return this.ready;\n }\n\n onMessage(handler: (msg: ChannelMessage) => void): void {\n this.messageHandler = handler;\n }\n\n protected emit(message: ChannelMessage): void {\n this.messageHandler?.(message);\n }\n}","import { Marked } from 'marked';\nimport chalk from 'chalk';\n\nconst lexer = new Marked();\n\nexport function renderMarkdown(text: string): string {\n try {\n const tokens = lexer.lexer(text);\n const result = renderTokens(tokens);\n return result.replace(/\\n{3,}/g, '\\n\\n').trimEnd();\n } catch {\n return text;\n }\n}\n\nfunction renderTokens(tokens: any[]): string {\n return tokens.map((t) => renderToken(t)).join('');\n}\n\nfunction renderToken(t: any): string {\n if (!t || typeof t !== 'object') return String(t ?? '');\n\n switch (t.type) {\n case 'heading':\n return renderHeading(t);\n case 'paragraph':\n return renderInline(t.tokens) + '\\n\\n';\n case 'strong':\n return chalk.bold(renderInline(t.tokens));\n case 'em':\n return chalk.italic(renderInline(t.tokens));\n case 'del':\n return chalk.dim.strikethrough(renderInline(t.tokens));\n case 'codespan':\n return chalk.yellow(t.text);\n case 'code':\n return renderCodeBlock(t);\n case 'list':\n return renderList(t);\n case 'blockquote':\n return renderBlockquote(t);\n case 'hr':\n return chalk.dim('─'.repeat(50)) + '\\n\\n';\n case 'link':\n return `${chalk.blue.underline(renderInline(t.tokens))} ${chalk.dim(`(${t.href})`)}`;\n case 'image':\n return chalk.blue(`🖼 ${t.title || t.href}`);\n case 'table':\n return renderTable(t);\n case 'text':\n if (t.tokens) return renderInline(t.tokens);\n return t.text || '';\n case 'html':\n return t.text || '';\n case 'space':\n return '';\n default:\n return t.text || '';\n }\n}\n\nfunction renderHeading(t: any): string {\n const text = renderInline(t.tokens);\n if (t.depth === 1) return `\\n${chalk.bold.cyan(text)}\\n\\n`;\n if (t.depth === 2) return `\\n${chalk.bold.cyan(` ■ ${text}`)}\\n\\n`;\n return `\\n${chalk.bold(` ■ ${text}`)}\\n\\n`;\n}\n\nfunction renderInline(tokens: any[] | undefined): string {\n if (!tokens) return '';\n return tokens.map((t) => {\n if (typeof t === 'string') return t;\n if (t.type === 'strong') return chalk.bold(renderInline(t.tokens));\n if (t.type === 'em') return chalk.italic(renderInline(t.tokens));\n if (t.type === 'del') return chalk.dim.strikethrough(renderInline(t.tokens));\n if (t.type === 'codespan') return chalk.yellow(t.text);\n if (t.type === 'link') return `${chalk.blue.underline(renderInline(t.tokens))} ${chalk.dim(`(${t.href})`)}`;\n if (t.type === 'image') return chalk.blue(`🖼 ${t.title || t.href}`);\n if (t.type === 'text') {\n return t.tokens ? renderInline(t.tokens) : (t.text || '');\n }\n if (t.type === 'html') return t.text || '';\n return t.text || '';\n }).join('');\n}\n\nfunction renderCodeBlock(t: any): string {\n const lines = t.text\n .split('\\n')\n .map((l: string) => `${chalk.dim(' ')}${chalk.yellow(l)}`)\n .join('\\n');\n const langStr = t.lang ? chalk.dim(` [${t.lang}]`) : '';\n return `\\n${langStr}\\n${lines}\\n\\n`;\n}\n\nfunction renderList(t: any): string {\n const lines: string[] = [];\n const items = t.items || [];\n items.forEach((item: any, i: number) => {\n const bullet = t.ordered ? `${i + 1}.` : '•';\n const firstLine = renderInline(item.tokens?.[0]?.tokens || [{ text: item.text }]);\n lines.push(` ${chalk.dim(bullet)} ${firstLine}`);\n\n const restTokens = (item.tokens || []).slice(1);\n for (const sub of restTokens) {\n if (sub.type === 'list') {\n const subLines = renderList(sub)\n .split('\\n')\n .filter(Boolean)\n .map((l: string) => ` ${l}`)\n .join('\\n');\n lines.push(subLines);\n } else if (sub.type === 'text') {\n lines.push(` ${chalk.dim('•')} ${renderInline(sub.tokens)}`);\n }\n }\n });\n return lines.join('\\n') + '\\n\\n';\n}\n\nfunction renderBlockquote(t: any): string {\n const content = renderTokens(t.tokens || []);\n const lines = content\n .split('\\n')\n .filter((l: string) => l.trim())\n .map((l: string) => `${chalk.dim('│ ')}${chalk.gray(l)}`)\n .join('\\n');\n return `\\n${lines}\\n\\n`;\n}\n\nfunction renderTable(t: any): string {\n const headers = (t.header || []).map((h: any) => chalk.bold(renderInline(h.tokens)));\n const colWidths = (t.header || []).map((h: any, i: number) => {\n const hLen = (h.text || '').length;\n const rowLens = (t.rows || []).map((row: any) => {\n const cell = row[i];\n return cell?.text?.length ?? 0;\n });\n return Math.max(hLen, ...rowLens) + 2;\n });\n\n const headerLine = headers.map((h: string, i: number) => h.padEnd(colWidths[i])).join(chalk.dim(' │ '));\n const separator = colWidths.map((w: number) => '─'.repeat(w)).join(chalk.dim('─┼─'));\n\n const dataLines = (t.rows || []).map((row: any) =>\n row.map((cell: any, i: number) => {\n const text = renderInline(cell.tokens) || cell.text || '';\n return text.padEnd(colWidths[i]);\n }).join(chalk.dim(' │ '))\n );\n\n return `\\n${headerLine}\\n${chalk.dim(separator)}\\n${dataLines.join('\\n')}\\n\\n`;\n}\n\nfunction escapeHtml(text: string): string {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\nexport function mdToTelegram(text: string): string {\n let out = text;\n\n const codeBlocks: string[] = [];\n out = out.replace(/```(\\w*)\\n([\\s\\S]*?)```/g, (_match, lang, code) => {\n const placeholder = `__CODEBLOCK_${codeBlocks.length}__`;\n codeBlocks.push(`<pre><code class=\"${lang}\">${escapeHtml(code)}</code></pre>`);\n return placeholder;\n });\n\n const inlineCodes: string[] = [];\n out = out.replace(/`([^`]+)`/g, (_match, code) => {\n const placeholder = `__INLINECODE_${inlineCodes.length}__`;\n inlineCodes.push(`<code>${escapeHtml(code)}</code>`);\n return placeholder;\n });\n\n const links: string[] = [];\n out = out.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_match, label, href) => {\n const placeholder = `__LINK_${links.length}__`;\n links.push(`<a href=\"${escapeHtml(href)}\">${escapeHtml(label)}</a>`);\n return placeholder;\n });\n\n out = escapeHtml(out);\n\n out = out.replace(/^### (.+)$/gm, '<b><i>$1</i></b>');\n out = out.replace(/^## (.+)$/gm, '<b>$1</b>');\n out = out.replace(/^# (.+)$/gm, '<b>$1</b>');\n out = out.replace(/\\*\\*([^*]+)\\*\\*/g, '<b>$1</b>');\n out = out.replace(/(?<!\\*)\\*([^*]+)\\*(?!\\*)/g, '<i>$1</i>');\n out = out.replace(/~~([^~]+)~~/g, '<s>$1</s>');\n\n for (let i = 0; i < inlineCodes.length; i++) {\n out = out.replace(`__INLINECODE_${i}__`, inlineCodes[i]);\n }\n for (let i = 0; i < codeBlocks.length; i++) {\n out = out.replace(`__CODEBLOCK_${i}__`, codeBlocks[i]);\n }\n for (let i = 0; i < links.length; i++) {\n out = out.replace(`__LINK_${i}__`, links[i]);\n }\n\n if (out.length > 4096) {\n out = out.slice(0, 4090) + '...';\n }\n\n return out;\n}","import fs from 'node:fs';\nimport path from 'node:path';\nimport { Bot, InputFile, InlineKeyboard } from 'grammy';\nimport { autoRetry } from '@grammyjs/auto-retry';\nimport type { ChannelMessage } from '../types/channel.js';\nimport { BaseChannel } from './base.js';\nimport type { MercuryConfig } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\nimport { mdToTelegram } from '../utils/markdown.js';\n\nconst MAX_MESSAGE_LENGTH = 4096;\n\ntype ApprovalResolver = (response: 'yes' | 'always' | 'no') => void;\n\nexport class TelegramChannel extends BaseChannel {\n readonly type = 'telegram' as const;\n private bot: Bot | null = null;\n private ownerChatId: number | null = null;\n private typingInterval: NodeJS.Timeout | null = null;\n private chatCommandContext?: import('../capabilities/registry.js').ChatCommandContext;\n private pendingApprovals: Map<string, ApprovalResolver> = new Map();\n\n constructor(private config: MercuryConfig) {\n super();\n }\n\n setChatCommandContext(ctx: import('../capabilities/registry.js').ChatCommandContext): void {\n this.chatCommandContext = ctx;\n }\n\n async start(): Promise<void> {\n const token = this.config.channels.telegram.botToken;\n if (!token) {\n logger.warn('Telegram bot token not set — skipping');\n return;\n }\n\n const bot = new Bot(token);\n bot.api.config.use(autoRetry());\n\n bot.on('message:text', async (ctx) => {\n const chatId = ctx.chat.id;\n if (!this.isAllowedChat(chatId)) return;\n\n this.ownerChatId = chatId;\n logger.info({ chatId, text: ctx.message.text?.slice(0, 50) }, 'Telegram message received');\n\n const msg: ChannelMessage = {\n id: ctx.message.message_id.toString(),\n channelId: `telegram:${chatId}`,\n channelType: 'telegram',\n senderId: ctx.from?.id.toString() ?? 'unknown',\n senderName: ctx.from?.first_name,\n content: ctx.message.text,\n timestamp: ctx.message.date * 1000,\n metadata: { chatId, messageId: ctx.message.message_id },\n };\n this.emit(msg);\n });\n\n bot.on('callback_query:data', async (ctx) => {\n const data = ctx.callbackQuery.data;\n const resolver = this.pendingApprovals.get(data);\n if (!resolver) {\n await ctx.answerCallbackQuery({ text: 'Expired' });\n return;\n }\n\n this.pendingApprovals.delete(data);\n\n const action = data.split(':')[1] as 'yes' | 'always' | 'no';\n resolver(action);\n await ctx.answerCallbackQuery({ text: action === 'no' ? 'Denied' : 'Approved' });\n });\n\n bot.catch((err) => {\n logger.error({ err: err.message }, 'Telegram bot error');\n });\n\n this.bot = bot;\n\n await bot.start({\n onStart: async (info) => {\n logger.info({ bot: info.username }, 'Telegram bot started — long polling active');\n this.ready = true;\n await this.registerCommands();\n },\n });\n }\n\n private async registerCommands(): Promise<void> {\n if (!this.bot) return;\n\n const commands = [\n { command: 'help', description: 'Show capabilities and commands manual' },\n { command: 'status', description: 'Show agent config, budget, and uptime' },\n { command: 'tools', description: 'List all loaded tools' },\n { command: 'skills', description: 'List installed skills' },\n { command: 'budget', description: 'Show token budget status' },\n { command: 'budget_override', description: 'Override budget for one request' },\n { command: 'budget_reset', description: 'Reset token usage to zero' },\n { command: 'budget_set', description: 'Set new daily token budget' },\n { command: 'stream', description: 'Toggle text streaming on/off' },\n ];\n\n try {\n await this.bot.api.setMyCommands(commands);\n logger.info({ count: commands.length }, 'Telegram bot commands registered');\n } catch (err: any) {\n logger.warn({ err: err.message }, 'Failed to register Telegram commands (non-critical)');\n }\n }\n\n async stop(): Promise<void> {\n this.bot?.stop();\n this.ready = false;\n this.stopTypingLoop();\n }\n\n async send(content: string, targetId?: string, elapsedMs?: number): Promise<void> {\n const chatId = this.parseChatId(targetId);\n if (!chatId || !this.bot) {\n logger.warn({ targetId, chatId }, 'Telegram send: no valid chat ID');\n return;\n }\n const timeSuffix = elapsedMs != null ? `\\n⏱ ${(elapsedMs / 1000).toFixed(1)}s` : '';\n const fullContent = content + timeSuffix;\n const html = mdToTelegram(fullContent);\n const chunks = this.splitMessage(html, MAX_MESSAGE_LENGTH);\n\n for (const chunk of chunks) {\n try {\n await this.bot.api.sendMessage(chatId, chunk, { parse_mode: 'HTML' });\n } catch (err: any) {\n logger.warn({ err: err.message }, 'HTML parse failed, sending as plain text');\n try {\n await this.bot.api.sendMessage(chatId, this.stripHtml(chunk));\n } catch (err2: any) {\n logger.error({ err: err2.message }, 'Telegram send failed');\n }\n }\n }\n }\n\n async sendFile(filePath: string, targetId?: string): Promise<void> {\n const chatId = this.parseChatId(targetId);\n if (!chatId || !this.bot) {\n logger.warn({ targetId, chatId }, 'Telegram sendFile: no valid chat ID');\n return;\n }\n const resolved = path.resolve(filePath);\n if (!fs.existsSync(resolved)) {\n await this.bot.api.sendMessage(chatId, `File not found: ${filePath}`);\n return;\n }\n\n const inputFile = new InputFile(resolved);\n const filename = path.basename(resolved);\n const ext = path.extname(resolved).toLowerCase();\n\n try {\n if (this.isImageFile(ext)) {\n await this.bot.api.sendPhoto(chatId, inputFile, { caption: filename });\n } else if (this.isAudioFile(ext)) {\n await this.bot.api.sendAudio(chatId, inputFile, { title: filename });\n } else if (this.isVideoFile(ext)) {\n await this.bot.api.sendVideo(chatId, inputFile, { caption: filename });\n } else {\n await this.bot.api.sendDocument(chatId, inputFile, { caption: filename });\n }\n logger.info({ file: resolved, chatId }, 'File sent via Telegram');\n } catch (err: any) {\n logger.error({ err: err.message, file: resolved }, 'Telegram sendFile failed');\n await this.bot.api.sendMessage(chatId, `Failed to send file: ${err.message}`).catch(() => {});\n }\n }\n\n async stream(content: AsyncIterable<string>, targetId?: string): Promise<string> {\n const chatId = this.parseChatId(targetId);\n if (!chatId || !this.bot) return '';\n\n let full = '';\n for await (const chunk of content) {\n full += chunk;\n }\n const html = mdToTelegram(full);\n try {\n await this.bot.api.sendMessage(chatId, html, { parse_mode: 'HTML' });\n } catch (err: any) {\n await this.bot.api.sendMessage(chatId, this.stripHtml(html));\n }\n return full;\n }\n\n async typing(targetId?: string): Promise<void> {\n const chatId = this.parseChatId(targetId);\n if (!chatId || !this.bot) return;\n await this.bot.api.sendChatAction(chatId, 'typing');\n }\n\n startTypingLoop(chatId: number): void {\n this.stopTypingLoop();\n this.bot?.api.sendChatAction(chatId, 'typing').catch(() => {});\n this.typingInterval = setInterval(() => {\n this.bot?.api.sendChatAction(chatId, 'typing').catch(() => {});\n }, 4000);\n }\n\n stopTypingLoop(): void {\n if (this.typingInterval) {\n clearInterval(this.typingInterval);\n this.typingInterval = null;\n }\n }\n\n async sendStreamToChat(chatId: number, textStream: AsyncIterable<string>): Promise<string> {\n if (!this.bot) return '';\n\n const STREAM_EDIT_INTERVAL = 1500;\n const STREAM_MIN_LENGTH = 20;\n\n this.startTypingLoop(chatId);\n\n try {\n let full = '';\n let messageId: number | null = null;\n let lastEditTime = 0;\n let lastEditLength = 0;\n\n for await (const chunk of textStream) {\n full += chunk;\n\n const now = Date.now();\n const timeSinceLastEdit = now - lastEditTime;\n const charsSinceLastEdit = full.length - lastEditLength;\n\n if (messageId === null && full.length >= STREAM_MIN_LENGTH) {\n try {\n const msg = await this.bot.api.sendMessage(chatId, this.escapeHtml(full) + ' ▌', { parse_mode: 'HTML' });\n messageId = msg.message_id;\n lastEditTime = now;\n lastEditLength = full.length;\n } catch {\n messageId = null;\n }\n } else if (messageId !== null && timeSinceLastEdit >= STREAM_EDIT_INTERVAL && charsSinceLastEdit >= 20) {\n try {\n await this.bot.api.editMessageText(chatId, messageId, this.escapeHtml(full) + ' ▌', { parse_mode: 'HTML' });\n lastEditTime = now;\n lastEditLength = full.length;\n } catch {\n // edit failed — rate limited or message unchanged, skip\n }\n }\n }\n\n if (messageId !== null) {\n const html = mdToTelegram(full);\n try {\n await this.bot.api.editMessageText(chatId, messageId, html, { parse_mode: 'HTML' });\n } catch {\n try {\n await this.bot.api.editMessageText(chatId, messageId, this.stripHtml(html));\n } catch {\n // final edit failed\n }\n }\n } else {\n const html = mdToTelegram(full);\n try {\n await this.bot.api.sendMessage(chatId, html, { parse_mode: 'HTML' });\n } catch {\n await this.bot.api.sendMessage(chatId, this.stripHtml(html));\n }\n }\n\n return full;\n } finally {\n this.stopTypingLoop();\n }\n }\n\n async askPermission(prompt: string, targetId?: string): Promise<string> {\n const chatId = this.parseChatId(targetId);\n if (!chatId || !this.bot) return 'no';\n\n const id = `perm_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const keyboard = new InlineKeyboard()\n .text('Allow', `${id}:yes`)\n .text('Always', `${id}:always`)\n .text('Deny', `${id}:no`);\n\n const html = mdToTelegram(prompt);\n\n try {\n await this.bot.api.sendMessage(chatId, html, {\n parse_mode: 'HTML',\n reply_markup: keyboard,\n });\n } catch {\n await this.bot.api.sendMessage(chatId, this.stripHtml(html), {\n reply_markup: keyboard,\n });\n }\n\n return new Promise((resolve) => {\n this.pendingApprovals.set(`${id}:yes`, () => resolve('yes'));\n this.pendingApprovals.set(`${id}:always`, () => resolve('always'));\n this.pendingApprovals.set(`${id}:no`, () => resolve('no'));\n\n setTimeout(() => {\n this.pendingApprovals.delete(`${id}:yes`);\n this.pendingApprovals.delete(`${id}:always`);\n this.pendingApprovals.delete(`${id}:no`);\n resolve('no');\n }, 120_000);\n });\n }\n\n private escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n }\n\n private splitMessage(text: string, maxLen: number): string[] {\n if (text.length <= maxLen) return [text];\n const chunks: string[] = [];\n let remaining = text;\n while (remaining.length > 0) {\n let splitAt = maxLen;\n if (remaining.length > maxLen) {\n const lastNewline = remaining.lastIndexOf('\\n', maxLen);\n if (lastNewline > maxLen * 0.5) {\n splitAt = lastNewline + 1;\n }\n }\n chunks.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt);\n }\n return chunks;\n }\n\n private stripHtml(html: string): string {\n return html\n .replace(/<\\/?(b|i|s|u|code|pre|a|blockquote|strong|em)[^>]*>/gi, '')\n .replace(/<pre><code[^>]*>/gi, '')\n .replace(/<\\/code><\\/pre>/gi, '')\n .replace(/<[^>]+>/g, '')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&');\n }\n\n private isImageFile(ext: string): boolean {\n return ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp', '.svg'].includes(ext);\n }\n\n private isAudioFile(ext: string): boolean {\n return ['.mp3', '.ogg', '.wav', '.flac', '.m4a'].includes(ext);\n }\n\n private isVideoFile(ext: string): boolean {\n return ['.mp4', '.mov', '.avi', '.mkv', '.webm'].includes(ext);\n }\n\n private parseChatId(targetId?: string): number | null {\n if (!targetId) return this.ownerChatId;\n if (targetId.startsWith('telegram:')) {\n const raw = Number(targetId.split(':')[1]);\n return isNaN(raw) ? this.ownerChatId : raw;\n }\n if (targetId === 'notification') return this.ownerChatId;\n const num = Number(targetId);\n return isNaN(num) ? this.ownerChatId : num;\n }\n\n private isAllowedChat(chatId: number): boolean {\n const allowed = this.config.channels.telegram.allowedChatIds;\n if (!allowed || allowed.length === 0) return true;\n return allowed.includes(chatId);\n }\n}","import type { Channel } from './base.js';\nimport type { ChannelMessage, ChannelType } from '../types/channel.js';\nimport { CLIChannel } from './cli.js';\nimport { TelegramChannel } from './telegram.js';\nimport type { MercuryConfig } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nexport class ChannelRegistry {\n private channels: Map<ChannelType, Channel> = new Map();\n\n constructor(config: MercuryConfig) {\n this.register('cli', new CLIChannel(config.identity.name));\n\n if (config.channels.telegram.enabled && config.channels.telegram.botToken) {\n this.register('telegram', new TelegramChannel(config));\n }\n }\n\n register(type: ChannelType, channel: Channel): void {\n channel.onMessage((msg) => this.handleIncomingMessage(msg));\n this.channels.set(type, channel);\n logger.info({ channel: type }, 'Channel registered');\n }\n\n get(type: ChannelType): Channel | undefined {\n return this.channels.get(type);\n }\n\n getChannelForMessage(message: ChannelMessage): Channel | undefined {\n return this.channels.get(message.channelType);\n }\n\n async startAll(): Promise<void> {\n for (const [type, channel] of this.channels) {\n try {\n await channel.start();\n } catch (err) {\n logger.error({ channel: type, err }, 'Failed to start channel');\n }\n }\n }\n\n async stopAll(): Promise<void> {\n for (const [, channel] of this.channels) {\n await channel.stop();\n }\n }\n\n getActiveChannels(): ChannelType[] {\n return [...this.channels.entries()]\n .filter(([, ch]) => ch.isReady())\n .map(([type]) => type);\n }\n\n getNotificationChannel(): Channel | undefined {\n const telegram = this.channels.get('telegram');\n if (telegram?.isReady()) return telegram;\n const cli = this.channels.get('cli');\n if (cli?.isReady()) return cli;\n return this.channels.values().next().value;\n }\n\n private incomingHandler?: (msg: ChannelMessage) => void;\n\n onIncomingMessage(handler: (msg: ChannelMessage) => void): void {\n this.incomingHandler = handler;\n }\n\n private handleIncomingMessage(msg: ChannelMessage): void {\n logger.debug({ from: msg.channelType, sender: msg.senderId }, 'Incoming message');\n this.incomingHandler?.(msg);\n }\n}","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { MercuryConfig } from './config.js';\nimport { getMercuryHome, saveConfig } from './config.js';\nimport { logger } from './logger.js';\n\nexport interface TokenTracker {\n dailyUsed: number;\n dailyBudget: number;\n lastResetDate: string;\n requestLog: TokenLogEntry[];\n}\n\nexport interface TokenLogEntry {\n timestamp: number;\n provider: string;\n model: string;\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n channelType: string;\n}\n\nconst TOKEN_FILE = 'token-usage.json';\n\nexport class TokenBudget {\n private dailyUsed = 0;\n private dailyBudget: number;\n private lastResetDate: string;\n private requestLog: TokenLogEntry[] = [];\n private forceNext = false;\n\n constructor(private config: MercuryConfig) {\n this.dailyBudget = config.tokens.dailyBudget;\n this.lastResetDate = new Date().toISOString().split('T')[0];\n this.restore();\n }\n\n canAfford(estimatedTokens: number): boolean {\n this.resetIfNewDay();\n return this.dailyUsed + estimatedTokens <= this.dailyBudget;\n }\n\n isOverBudget(): boolean {\n this.resetIfNewDay();\n if (this.forceNext) {\n this.forceNext = false;\n return false;\n }\n return this.dailyUsed >= this.dailyBudget;\n }\n\n forceAllowNext(): void {\n this.forceNext = true;\n logger.info('Budget override: next request will proceed regardless of budget');\n }\n\n resetUsage(): void {\n this.dailyUsed = 0;\n this.requestLog = [];\n this.persist();\n logger.info('Token usage reset to zero');\n }\n\n setBudget(newBudget: number): void {\n this.dailyBudget = newBudget;\n this.config.tokens.dailyBudget = newBudget;\n saveConfig(this.config);\n this.persist();\n logger.info({ newBudget }, 'Daily token budget updated');\n }\n\n getBudget(): number {\n return this.dailyBudget;\n }\n\n getDailyUsed(): number {\n this.resetIfNewDay();\n return this.dailyUsed;\n }\n\n recordUsage(entry: Omit<TokenLogEntry, 'timestamp'>): void {\n this.resetIfNewDay();\n const logEntry: TokenLogEntry = { ...entry, timestamp: Date.now() };\n this.dailyUsed += entry.totalTokens;\n this.requestLog.push(logEntry);\n this.persist();\n }\n\n getRemaining(): number {\n this.resetIfNewDay();\n return Math.max(0, this.dailyBudget - this.dailyUsed);\n }\n\n getUsagePercentage(): number {\n this.resetIfNewDay();\n return this.dailyBudget > 0 ? (this.dailyUsed / this.dailyBudget) * 100 : 0;\n }\n\n getStatusText(): string {\n const pct = Math.round(this.getUsagePercentage());\n const remaining = this.getRemaining();\n return `Token budget: ${this.dailyUsed.toLocaleString()} / ${this.dailyBudget.toLocaleString()} used (${pct}%), ${remaining.toLocaleString()} remaining`;\n }\n\n private resetIfNewDay(): void {\n const today = new Date().toISOString().split('T')[0];\n if (today !== this.lastResetDate) {\n this.dailyUsed = 0;\n this.lastResetDate = today;\n this.requestLog = [];\n this.persist();\n logger.info('Token budget reset for new day');\n }\n }\n\n private persist(): void {\n const path = join(getMercuryHome(), TOKEN_FILE);\n try {\n const data = {\n dailyUsed: this.dailyUsed,\n dailyBudget: this.dailyBudget,\n lastResetDate: this.lastResetDate,\n requestLog: this.requestLog.slice(-200),\n };\n writeFileSync(path, JSON.stringify(data, null, 2), 'utf-8');\n } catch (err) {\n logger.warn({ err }, 'Failed to persist token usage');\n }\n }\n\n private restore(): void {\n const path = join(getMercuryHome(), TOKEN_FILE);\n if (!existsSync(path)) return;\n try {\n const raw = readFileSync(path, 'utf-8');\n const data = JSON.parse(raw) as Partial<TokenTracker>;\n const today = new Date().toISOString().split('T')[0];\n if (data.lastResetDate === today) {\n this.dailyUsed = data.dailyUsed ?? 0;\n this.requestLog = data.requestLog ?? [];\n }\n this.lastResetDate = data.lastResetDate ?? today;\n } catch (err) {\n logger.warn({ err }, 'Failed to restore token usage');\n }\n }\n}","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, resolve, sep } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { getMercuryHome } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface FileScope {\n path: string;\n read: boolean;\n write: boolean;\n}\n\nexport interface ShellPermissions {\n enabled: boolean;\n blocked: string[];\n autoApproved: string[];\n needsApproval: string[];\n cwdOnly: boolean;\n}\n\nexport interface FsPermissions {\n enabled: boolean;\n scopes: FileScope[];\n}\n\nexport interface GitPermissions {\n enabled: boolean;\n autoApproveRead: boolean;\n approveWrite: boolean;\n}\n\nexport interface PermissionsManifest {\n capabilities: {\n filesystem: FsPermissions;\n shell: ShellPermissions;\n git: GitPermissions;\n };\n}\n\nconst DEFAULT_MANIFEST: PermissionsManifest = {\n capabilities: {\n filesystem: {\n enabled: true,\n scopes: [\n { path: '.', read: true, write: true },\n ],\n },\n shell: {\n enabled: true,\n blocked: [\n 'sudo *',\n 'rm -rf /',\n 'rm -rf ~',\n 'rm -rf /*',\n 'mkfs *',\n 'dd if=*',\n 'chmod 777 /',\n 'chown * /',\n ':(){ :|:& };:',\n 'shutdown *',\n 'reboot *',\n 'halt *',\n 'init 0',\n 'init 6',\n 'kill -9 1',\n '> /dev/sda',\n 'mv /* /dev/null',\n ],\n autoApproved: [\n 'ls *',\n 'cat *',\n 'pwd',\n 'which *',\n 'node *',\n 'npm run *',\n 'npm test *',\n 'npm list *',\n 'git status *',\n 'git diff *',\n 'git log *',\n 'git branch *',\n 'echo *',\n 'head *',\n 'tail *',\n 'wc *',\n 'find *',\n 'grep *',\n 'rg *',\n 'ps *',\n 'df *',\n 'du *',\n 'uname *',\n 'curl *',\n 'wget *',\n ],\n needsApproval: [\n 'npm publish *',\n 'git push *',\n 'docker *',\n 'curl * | sh',\n 'curl * | bash',\n 'wget * | sh',\n 'pip install *',\n 'pip3 install *',\n 'rm -r *',\n 'rm -rf *',\n 'mv *',\n 'cp -r *',\n 'chmod *',\n 'mkdir *',\n 'rmdir *',\n ],\n cwdOnly: true,\n },\n git: {\n enabled: true,\n autoApproveRead: true,\n approveWrite: true,\n },\n },\n};\n\nconst PERMISSIONS_FILE = join(getMercuryHome(), 'permissions.yaml');\n\nexport class PermissionManager {\n private manifest: PermissionsManifest;\n private readonly cwd: string;\n private askHandler?: (prompt: string) => Promise<string>;\n private autoApproveAll = false;\n private elevatedCommands: Set<string> = new Set();\n private pendingApprovals: Set<string> = new Set();\n private currentChannelType: string = 'cli';\n\n constructor() {\n this.cwd = process.cwd();\n this.manifest = this.load();\n }\n\n setCurrentChannelType(type: string): void {\n this.currentChannelType = type;\n }\n\n getCurrentChannelType(): string {\n return this.currentChannelType;\n }\n\n onAsk(handler: (prompt: string) => Promise<string>): void {\n this.askHandler = handler;\n }\n\n setAutoApproveAll(value: boolean): void {\n this.autoApproveAll = value;\n }\n\n elevateForSkill(allowedTools: string[]): void {\n if (allowedTools.includes('run_command')) {\n this.elevatedCommands.add('run_command');\n }\n if (allowedTools.includes('read_file') || allowedTools.includes('list_dir')) {\n this.elevatedCommands.add('fs_read');\n }\n if (allowedTools.includes('write_file') || allowedTools.includes('create_file') || allowedTools.includes('delete_file')) {\n this.elevatedCommands.add('fs_write');\n }\n }\n\n clearElevation(): void {\n this.elevatedCommands.clear();\n }\n\n isElevated(tool: string): boolean {\n if (this.elevatedCommands.has(tool)) return true;\n return false;\n }\n\n isShellElevated(): boolean {\n return this.elevatedCommands.has('run_command');\n }\n\n addPendingApproval(baseCommand: string): void {\n this.pendingApprovals.add(baseCommand);\n }\n\n clearPendingApprovals(): void {\n this.pendingApprovals.clear();\n }\n\n private load(): PermissionsManifest {\n if (existsSync(PERMISSIONS_FILE)) {\n try {\n const raw = readFileSync(PERMISSIONS_FILE, 'utf-8');\n const parsed = parseYaml(raw) as PermissionsManifest;\n return this.mergeDefaults(parsed);\n } catch (err) {\n logger.warn({ err }, 'Failed to parse permissions.yaml, using defaults');\n return { ...DEFAULT_MANIFEST };\n }\n }\n this.save(DEFAULT_MANIFEST);\n return { ...DEFAULT_MANIFEST };\n }\n\n save(manifest?: PermissionsManifest): void {\n const m = manifest || this.manifest;\n const dir = getMercuryHome();\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(PERMISSIONS_FILE, stringifyYaml(m, { lineWidth: 0 }), 'utf-8');\n this.manifest = m;\n }\n\n getManifest(): PermissionsManifest {\n return this.manifest;\n }\n\n addApprovedCommand(baseCommand: string): void {\n const cmdName = baseCommand.trim().split(/\\s+/)[0];\n const pattern = `${cmdName} *`;\n const shell = this.manifest.capabilities.shell;\n if (!shell.autoApproved.includes(pattern) && !shell.autoApproved.includes(cmdName)) {\n shell.autoApproved.push(pattern);\n this.save();\n logger.info({ pattern }, 'Shell command pattern auto-approved and saved');\n }\n }\n\n async checkFsAccess(path: string, mode: 'read' | 'write'): Promise<{ allowed: boolean; reason?: string }> {\n if (mode === 'read' && this.elevatedCommands.has('fs_read')) {\n return { allowed: true };\n }\n if (mode === 'write' && this.elevatedCommands.has('fs_write')) {\n return { allowed: true };\n }\n\n const fs = this.manifest.capabilities.filesystem;\n if (!fs.enabled) {\n return { allowed: false, reason: 'Filesystem capability is disabled' };\n }\n\n const resolved = resolve(path);\n const scope = this.findScope(resolved);\n\n if (scope) {\n if (mode === 'read' && scope.read) return { allowed: true };\n if (mode === 'write' && scope.write) return { allowed: true };\n return { allowed: false, reason: `Permission denied: ${mode} access to ${path} (scope has ${mode}=false)` };\n }\n\n return await this.requestScope(resolved, mode);\n }\n\n async checkShellCommand(command: string): Promise<{ allowed: boolean; reason?: string; needsApproval: boolean }> {\n if (this.autoApproveAll) {\n logger.info({ cmd: command.trim() }, 'Shell command auto-approved (auto-approve-all mode)');\n return { allowed: true, needsApproval: false };\n }\n\n if (this.isShellElevated()) {\n logger.info({ cmd: command.trim() }, 'Shell command auto-approved (skill elevation)');\n return { allowed: true, needsApproval: false };\n }\n\n const shell = this.manifest.capabilities.shell;\n if (!shell.enabled) {\n return { allowed: false, reason: 'Shell capability is disabled', needsApproval: false };\n }\n\n const trimmed = command.trim();\n\n const baseCmd = trimmed.split(/\\s+/)[0];\n if (this.pendingApprovals.has(baseCmd)) {\n logger.info({ cmd: trimmed }, 'Shell command auto-approved (pending approval)');\n return { allowed: true, needsApproval: false };\n }\n\n for (const pattern of shell.blocked) {\n if (this.matchPattern(trimmed, pattern)) {\n return { allowed: false, reason: `Blocked command: matches \"${pattern}\"`, needsApproval: false };\n }\n }\n\n if (shell.cwdOnly) {\n const hasPathTraversal = this.hasPathBeyondCwd(trimmed);\n if (hasPathTraversal) {\n const scopeCheck = await this.checkFsAccess(hasPathTraversal, 'write');\n if (!scopeCheck.allowed) {\n return { allowed: false, reason: scopeCheck.reason, needsApproval: true };\n }\n }\n }\n\n for (const pattern of shell.autoApproved) {\n if (this.matchPattern(trimmed, pattern)) {\n logger.info({ cmd: trimmed }, 'Shell command auto-approved');\n return { allowed: true, needsApproval: false };\n }\n }\n\n for (const pattern of shell.needsApproval) {\n if (this.matchPattern(trimmed, pattern)) {\n if (this.currentChannelType === 'telegram' && this.askHandler) {\n const result = await this.askHandler(`Run command: ${trimmed}`);\n if (result === 'yes') {\n return { allowed: true, needsApproval: false };\n }\n if (result === 'always') {\n this.addApprovedCommand(baseCmd);\n return { allowed: true, needsApproval: false };\n }\n return { allowed: false, reason: `User denied: ${trimmed}`, needsApproval: false };\n }\n return { allowed: false, reason: `Command requires approval: matches \"${pattern}\"`, needsApproval: true };\n }\n }\n\n if (this.currentChannelType === 'telegram' && this.askHandler) {\n const result = await this.askHandler(`Run command: ${trimmed}`);\n if (result === 'yes') {\n return { allowed: true, needsApproval: false };\n }\n if (result === 'always') {\n this.addApprovedCommand(baseCmd);\n return { allowed: true, needsApproval: false };\n }\n return { allowed: false, reason: `User denied: ${trimmed}`, needsApproval: false };\n }\n\n return { allowed: false, reason: 'Command not in auto-approve list — requires approval', needsApproval: true };\n }\n\n isGitReadAllowed(): boolean {\n return this.manifest.capabilities.git.enabled && this.manifest.capabilities.git.autoApproveRead;\n }\n\n isGitWriteNeedsApproval(): boolean {\n return this.manifest.capabilities.git.enabled && this.manifest.capabilities.git.approveWrite;\n }\n\n addScope(path: string, read: boolean, write: boolean): void {\n const resolved = resolve(path);\n const existing = this.findScope(resolved);\n if (existing) {\n existing.read = existing.read || read;\n existing.write = existing.write || write;\n } else {\n this.manifest.capabilities.filesystem.scopes.push({\n path: resolved,\n read,\n write,\n });\n }\n this.save();\n logger.info({ path: resolved, read, write }, 'Permission scope added');\n }\n\n private findScope(resolvedPath: string): FileScope | undefined {\n const scopes = this.manifest.capabilities.filesystem.scopes;\n for (const scope of scopes) {\n const scopeResolved = resolve(scope.path.replace(/^~/, homedir()));\n if (resolvedPath === scopeResolved || resolvedPath.startsWith(scopeResolved + sep)) {\n return scope;\n }\n }\n return undefined;\n }\n\n private async requestScope(path: string, mode: 'read' | 'write'): Promise<{ allowed: boolean; reason?: string }> {\n if (!this.askHandler) {\n return { allowed: false, reason: `No permission to ${mode} ${path}. Add scope to ~/.mercury/permissions.yaml` };\n }\n\n const response = await this.askHandler(\n `Mercury needs ${mode} access to ${path}. Allow? (y/n/always): `\n );\n\n if (response.toLowerCase() === 'always') {\n this.addScope(path, mode === 'read', mode === 'write');\n return { allowed: true };\n }\n\n if (response.toLowerCase() === 'y' || response.toLowerCase() === 'yes') {\n return { allowed: true };\n }\n\n return { allowed: false, reason: `Permission denied for ${mode} access to ${path}` };\n }\n\n private matchPattern(command: string, pattern: string): boolean {\n const regexStr = '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$';\n try {\n return new RegExp(regexStr, 'i').test(command);\n } catch {\n return command.startsWith(pattern.replace(/ \\*$/, ''));\n }\n }\n\n private hasPathBeyondCwd(command: string): string | null {\n const pathPatterns = [\n /(?:^|\\s)(\\/[^\\s]+)/,\n /(?:^|\\s)(~\\/[^\\s]+)/,\n /(?:^|\\s)\\.\\.\\/([^\\s]+)/,\n /(?:^|\\s)([A-Za-z]:\\\\[^\\s]+)/,\n /(?:^|\\s)(\\\\\\\\[^\\s]+)/,\n ];\n for (const p of pathPatterns) {\n const match = command.match(p);\n if (match) {\n const candidate = resolve(match[1].replace(/^~/, homedir()));\n if (!candidate.startsWith(this.cwd)) {\n return candidate;\n }\n }\n }\n return null;\n }\n\n private mergeDefaults(parsed: Partial<PermissionsManifest>): PermissionsManifest {\n return {\n capabilities: {\n filesystem: {\n enabled: parsed.capabilities?.filesystem?.enabled ?? DEFAULT_MANIFEST.capabilities.filesystem.enabled,\n scopes: parsed.capabilities?.filesystem?.scopes ?? DEFAULT_MANIFEST.capabilities.filesystem.scopes,\n },\n shell: {\n enabled: parsed.capabilities?.shell?.enabled ?? DEFAULT_MANIFEST.capabilities.shell.enabled,\n blocked: parsed.capabilities?.shell?.blocked ?? DEFAULT_MANIFEST.capabilities.shell.blocked,\n autoApproved: parsed.capabilities?.shell?.autoApproved ?? DEFAULT_MANIFEST.capabilities.shell.autoApproved,\n needsApproval: parsed.capabilities?.shell?.needsApproval ?? DEFAULT_MANIFEST.capabilities.shell.needsApproval,\n cwdOnly: parsed.capabilities?.shell?.cwdOnly ?? DEFAULT_MANIFEST.capabilities.shell.cwdOnly,\n },\n git: {\n enabled: parsed.capabilities?.git?.enabled ?? DEFAULT_MANIFEST.capabilities.git.enabled,\n autoApproveRead: parsed.capabilities?.git?.autoApproveRead ?? DEFAULT_MANIFEST.capabilities.git.autoApproveRead,\n approveWrite: parsed.capabilities?.git?.approveWrite ?? DEFAULT_MANIFEST.capabilities.git.approveWrite,\n },\n },\n };\n }\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createReadFileTool(permissions: PermissionManager) {\n return tool({\n description: 'Read the contents of a file. The path must be within an allowed scope.',\n parameters: z.object({\n path: z.string().describe('Absolute or relative path to the file'),\n }),\n execute: async ({ path }) => {\n const resolved = resolve(path);\n const check = await permissions.checkFsAccess(resolved, 'read');\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n if (!existsSync(resolved)) {\n return `Error: File not found: ${resolved}`;\n }\n\n try {\n const stat = await import('node:fs').then(m => m.statSync(resolved));\n if (stat.isDirectory()) {\n return `Error: ${resolved} is a directory, not a file. Use list_dir instead.`;\n }\n if (stat.size > 1024 * 1024) {\n return `Error: File too large (${Math.round(stat.size / 1024)}KB). Maximum is 1MB.`;\n }\n return readFileSync(resolved, 'utf-8');\n } catch (err: any) {\n return `Error reading file: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { existsSync, writeFileSync, readFileSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport { mkdirSync } from 'node:fs';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createWriteFileTool(permissions: PermissionManager) {\n return tool({\n description: 'Write content to an existing file. The path must be within a writable scope.',\n parameters: z.object({\n path: z.string().describe('Absolute or relative path to the file'),\n content: z.string().describe('The content to write to the file'),\n }),\n execute: async ({ path, content }) => {\n const resolved = resolve(path);\n const check = await permissions.checkFsAccess(resolved, 'write');\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n if (!existsSync(resolved)) {\n return `Error: File not found: ${resolved}. Use create_file to create new files.`;\n }\n\n try {\n writeFileSync(resolved, content, 'utf-8');\n return `Successfully wrote ${content.length} bytes to ${resolved}`;\n } catch (err: any) {\n return `Error writing file: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { existsSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createCreateFileTool(permissions: PermissionManager) {\n return tool({\n description: 'Create a new file with the given content. Also creates parent directories if needed. The path must be within a writable scope.',\n parameters: z.object({\n path: z.string().describe('Absolute or relative path for the new file'),\n content: z.string().describe('The content of the new file'),\n }),\n execute: async ({ path, content }) => {\n const resolved = resolve(path);\n const check = await permissions.checkFsAccess(resolved, 'write');\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n if (existsSync(resolved)) {\n return `Error: File already exists: ${resolved}. Use write_file to modify existing files.`;\n }\n\n try {\n const dir = dirname(resolved);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(resolved, content, 'utf-8');\n return `Successfully created ${resolved} (${content.length} bytes)`;\n } catch (err: any) {\n return `Error creating file: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { existsSync, readdirSync, statSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createListDirTool(permissions: PermissionManager) {\n return tool({\n description: 'List the contents of a directory. Shows file names, types, and sizes.',\n parameters: z.object({\n path: z.string().describe('Absolute or relative path to the directory'),\n }),\n execute: async ({ path }) => {\n const resolved = resolve(path);\n const check = await permissions.checkFsAccess(resolved, 'read');\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n if (!existsSync(resolved)) {\n return `Error: Directory not found: ${resolved}`;\n }\n\n try {\n const stat = statSync(resolved);\n if (!stat.isDirectory()) {\n return `Error: ${resolved} is a file, not a directory. Use read_file instead.`;\n }\n\n const entries = readdirSync(resolved, { withFileTypes: true });\n const lines = entries.map(entry => {\n const isDir = entry.isDirectory();\n const fullPath = join(resolved, entry.name);\n let size = '';\n try {\n if (!isDir) {\n size = ` (${formatSize(statSync(fullPath).size)})`;\n }\n } catch {}\n return `${isDir ? '📁' : '📄'} ${entry.name}${size}`;\n });\n\n if (lines.length === 0) {\n return `Directory ${resolved} is empty`;\n }\n\n return `Contents of ${resolved} (${entries.length} items):\\n${lines.join('\\n')}`;\n } catch (err: any) {\n return `Error listing directory: ${err.message}`;\n }\n },\n });\n}\n\nfunction join(base: string, name: string): string {\n return base.endsWith('/') ? base + name : base + '/' + name;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { existsSync, unlinkSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createDeleteFileTool(permissions: PermissionManager) {\n return tool({\n description: 'Delete a file. This action cannot be undone. The path must be within a writable scope. Always asks for confirmation.',\n parameters: z.object({\n path: z.string().describe('Absolute or relative path to the file to delete'),\n }),\n execute: async ({ path }) => {\n const resolved = resolve(path);\n const check = await permissions.checkFsAccess(resolved, 'write');\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n if (!existsSync(resolved)) {\n return `Error: File not found: ${resolved}`;\n }\n\n try {\n const stat = await import('node:fs').then(m => m.statSync(resolved));\n if (stat.isDirectory()) {\n return `Error: ${resolved} is a directory. Cannot delete directories for safety.`;\n }\n unlinkSync(resolved);\n return `Successfully deleted ${resolved}`;\n } catch (err: any) {\n return `Error deleting file: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createEditFileTool(permissions: PermissionManager) {\n return tool({\n description: 'Edit a file by replacing an exact string match with new content. Use this instead of write_file when you only need to change part of a file. The old_string must match exactly (including whitespace and indentation). Fails if old_string is not found or found multiple times.',\n parameters: z.object({\n path: z.string().describe('Absolute or relative path to the file'),\n old_string: z.string().describe('The exact text to find in the file (must match exactly)'),\n new_string: z.string().describe('The text to replace it with'),\n }),\n execute: async ({ path, old_string, new_string }) => {\n const resolved = resolve(path);\n\n const fsCheck = await permissions.checkFsAccess(resolved, 'write');\n if (!fsCheck.allowed) {\n return `Error: ${fsCheck.reason}`;\n }\n\n try {\n const content = readFileSync(resolved, 'utf-8');\n\n const count = content.split(old_string).length - 1;\n if (count === 0) {\n return `Error: old_string not found in ${path}. Make sure the text matches exactly, including whitespace and indentation.`;\n }\n if (count > 1) {\n return `Error: old_string found ${count} times in ${path}. Provide more surrounding context to make the match unique.`;\n }\n\n const newContent = content.replace(old_string, new_string);\n writeFileSync(resolved, newContent, 'utf-8');\n\n const linesAdded = new_string.split('\\n').length;\n const linesRemoved = old_string.split('\\n').length;\n return `Edited ${path}: replaced ${linesRemoved} line(s) with ${linesAdded} line(s)`;\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return `Error: File not found: ${path}. Use create_file to create new files.`;\n }\n return `Error editing file: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { existsSync, statSync } from 'node:fs';\nimport { resolve, basename } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createSendFileTool(\n permissions: PermissionManager,\n sendFile: (filePath: string) => Promise<void>,\n) {\n return tool({\n description:\n 'Send a file to the user. On Telegram the file is uploaded as an attachment. On CLI the file path and size are displayed. The path must be within an allowed read scope.',\n parameters: z.object({\n path: z.string().describe('Absolute or relative path to the file to send'),\n }),\n execute: async ({ path }) => {\n const resolved = resolve(path);\n const check = await permissions.checkFsAccess(resolved, 'read');\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n if (!existsSync(resolved)) {\n return `Error: File not found: ${resolved}`;\n }\n\n const stat = statSync(resolved);\n if (stat.isDirectory()) {\n return `Error: ${resolved} is a directory, not a file. Use list_dir to show its contents.`;\n }\n\n if (stat.size > 50 * 1024 * 1024) {\n return `Error: File too large (${Math.round(stat.size / (1024 * 1024))}MB). Maximum is 50MB.`;\n }\n\n try {\n await sendFile(resolved);\n const filename = basename(resolved);\n const sizeStr =\n stat.size > 1024 * 1024\n ? `${(stat.size / (1024 * 1024)).toFixed(1)}MB`\n : `${Math.round(stat.size / 1024)}KB`;\n return `File sent: ${filename} (${sizeStr})`;\n } catch (err: any) {\n return `Error sending file: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\nimport { resolve } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\nimport { logger } from '../../utils/logger.js';\n\nexport function createRunCommandTool(permissions: PermissionManager) {\n return tool({\n description: `Run a shell command. Commands run in the current working directory unless an absolute path is given.\nBlocked commands (sudo, rm -rf /, etc.) are never executed.\nAuto-approved commands (ls, cat, git status, curl, etc.) run without asking.\nOther commands require user approval — tell the user what command you want to run and ask for confirmation. If they say \"yes\", try again. If they say \"always\", use the approve_command tool.`,\n parameters: z.object({\n command: z.string().describe('The shell command to execute'),\n }),\n execute: async ({ command }) => {\n const check = await permissions.checkShellCommand(command);\n if (!check.allowed) {\n if (check.needsApproval) {\n const baseCmd = command.trim().split(/\\s+/)[0];\n permissions.addPendingApproval(baseCmd);\n return `⚠ Command requires approval: ${command}\\n\\nTell the user what this command does and ask for permission. If they approve, try running it again. If they say \"always\", use the approve_command tool to permanently approve this command type.`;\n }\n return `Error: ${check.reason}`;\n }\n\n try {\n logger.info({ cmd: command }, 'Executing shell command');\n const result = execSync(command, {\n cwd: process.cwd(),\n timeout: 30000,\n maxBuffer: 1024 * 1024,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n const output = result?.trim() || '(no output)';\n return output;\n } catch (err: any) {\n const stderr = err.stderr?.trim();\n const stdout = err.stdout?.trim();\n let msg = `Command exited with code ${err.status || 'unknown'}`;\n if (stdout) msg += `\\nOutput: ${stdout}`;\n if (stderr) msg += `\\nError: ${stderr}`;\n return msg;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createApproveCommandTool(permissions: PermissionManager) {\n return tool({\n description: 'Permanently approve a command type so it runs without asking in the future. Use this when the user says \"always\" or \"always approve\" for a command. For example, if the user says \"always approve curl\", call this with command=\"curl\".',\n parameters: z.object({\n command: z.string().describe('The base command to permanently approve (e.g. \"curl\", \"docker\", \"npm\")'),\n }),\n execute: async ({ command }) => {\n const baseCmd = command.trim().split(/\\s+/)[0];\n permissions.addApprovedCommand(baseCmd);\n return `Command \"${baseCmd}\" has been permanently approved. Future calls to \"${baseCmd} ...\" will run without asking.`;\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { SkillLoader } from '../../skills/loader.js';\nimport { parse as parseYaml } from 'yaml';\n\nexport function createInstallSkillTool(skillLoader: SkillLoader) {\n return tool({\n description: 'Install a new skill by providing SKILL.md markdown content or a URL. The content must have YAML frontmatter (---) with at least name and description fields.',\n parameters: z.object({\n content: z.string().optional().describe('Raw SKILL.md markdown content with YAML frontmatter'),\n url: z.string().optional().describe('URL to fetch a SKILL.md from'),\n }),\n execute: async ({ content, url }) => {\n let skillContent: string;\n\n if (url && !content) {\n try {\n const resp = await fetch(url);\n if (!resp.ok) {\n return `Failed to fetch skill from URL: ${resp.status} ${resp.statusText}`;\n }\n skillContent = await resp.text();\n } catch (err: any) {\n return `Failed to fetch skill from URL: ${err.message}`;\n }\n } else if (content) {\n skillContent = content;\n } else {\n return 'Either content or url must be provided.';\n }\n\n const fmMatch = skillContent.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n if (!fmMatch) {\n return 'Invalid SKILL.md: missing YAML frontmatter (--- delimiters).';\n }\n\n try {\n const meta = parseYaml(fmMatch[1]) as Record<string, any>;\n if (!meta.name || !meta.description) {\n return 'Invalid SKILL.md: frontmatter must include at least \"name\" and \"description\".';\n }\n } catch {\n return 'Invalid SKILL.md: could not parse YAML frontmatter.';\n }\n\n const fmMatch2 = skillContent.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n const meta = parseYaml(fmMatch2![1]) as { name: string };\n const skillDir = skillLoader.saveSkill(meta.name, skillContent);\n\n return `Skill \"${meta.name}\" installed to ${skillDir}. Use list_skills to see all installed skills, or use_skill to invoke it.`;\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { SkillLoader } from '../../skills/loader.js';\n\nexport function createListSkillsTool(skillLoader: SkillLoader) {\n return tool({\n description: 'List all installed skills with their names and descriptions.',\n parameters: z.object({}),\n execute: async () => {\n const skills = skillLoader.getDiscovered();\n if (skills.length === 0) {\n return 'No skills installed. Use install_skill to add one.';\n }\n return skills.map(s => `${s.name}: ${s.description}`).join('\\n');\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { SkillLoader } from '../../skills/loader.js';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createUseSkillTool(skillLoader: SkillLoader, permissions: PermissionManager) {\n return tool({\n description: 'Load and invoke a skill by name. Returns the skill\\'s full instructions which should be followed as guidance for the current task.',\n parameters: z.object({\n name: z.string().describe('Name of the skill to invoke'),\n }),\n execute: async ({ name }) => {\n const skill = skillLoader.load(name);\n if (!skill) {\n return `Skill \"${name}\" not found. Use list_skills to see available skills.`;\n }\n\n if (skill['allowed-tools'] && skill['allowed-tools'].length > 0) {\n permissions.elevateForSkill(skill['allowed-tools']);\n }\n\n let result = `## Skill: ${skill.name}\\n\\n${skill.instructions}`;\n\n if (skill['allowed-tools'] && skill['allowed-tools'].length > 0) {\n result += `\\n\\nAllowed tools: ${skill['allowed-tools'].join(', ')}`;\n }\n\n if (skill['disable-model-invocation']) {\n result += '\\n\\nNote: This skill has model invocation disabled. Follow instructions only.';\n }\n\n return result;\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport cron from 'node-cron';\nimport type { Scheduler, ScheduledTaskManifest } from '../../core/scheduler.js';\n\nexport function createScheduleTaskTool(scheduler: Scheduler, getContext: () => { channelId: string; channelType: string }) {\n return tool({\n description: 'Schedule a task. Use \"cron\" for recurring tasks (e.g. \"0 9 * * *\" for daily at 9am) or \"delay_seconds\" for one-shot delayed tasks (e.g. 15 for \"remind me in 15 seconds\"). Provide exactly one of cron or delay_seconds.',\n parameters: z.object({\n cron: z.string().optional().describe('Cron expression for recurring tasks (e.g. \"0 9 * * *\" for daily at 9am)'),\n delay_seconds: z.number().optional().describe('Delay in seconds for one-shot tasks (e.g. 15 for \"remind me in 15 seconds\")'),\n description: z.string().describe('Human-readable description of what this task does'),\n prompt: z.string().optional().describe('Prompt to send to the agent when the task fires'),\n skill_name: z.string().optional().describe('Name of a skill to invoke when the task fires'),\n }),\n execute: async ({ cron: cronExpr, delay_seconds, description, prompt, skill_name }) => {\n if (!cronExpr && !delay_seconds) {\n return 'Either cron or delay_seconds must be provided.';\n }\n if (cronExpr && delay_seconds) {\n return 'Provide either cron or delay_seconds, not both.';\n }\n\n if (!prompt && !skill_name) {\n return 'Either prompt or skill_name must be provided so the task has something to do.';\n }\n\n const id = `task-${Date.now().toString(36)}`;\n const ctx = getContext();\n\n if (delay_seconds) {\n const manifest: ScheduledTaskManifest = {\n id,\n description,\n prompt,\n skillName: skill_name,\n delaySeconds: delay_seconds,\n executeAt: new Date(Date.now() + delay_seconds * 1000).toISOString(),\n createdAt: new Date().toISOString(),\n sourceChannelId: ctx.channelId,\n sourceChannelType: ctx.channelType,\n };\n\n scheduler.addDelayedTask(manifest);\n scheduler.persistSchedules();\n\n const triggerType = skill_name ? `skill: ${skill_name}` : `prompt: \"${prompt!.slice(0, 60)}\"`;\n return `Reminder \"${id}\" set. Will trigger in ${delay_seconds} second${delay_seconds !== 1 ? 's' : ''}. ${triggerType}. Description: ${description}`;\n }\n\n if (!cron.validate(cronExpr!)) {\n return `Invalid cron expression: \"${cronExpr}\". Use standard 5-field cron format (min hour day month weekday).`;\n }\n\n const manifest: ScheduledTaskManifest = {\n id,\n cron: cronExpr,\n description,\n prompt,\n skillName: skill_name,\n createdAt: new Date().toISOString(),\n sourceChannelId: ctx.channelId,\n sourceChannelType: ctx.channelType,\n };\n\n scheduler.addPersistedTask(manifest);\n scheduler.persistSchedules();\n\n const triggerType = skill_name ? `skill: ${skill_name}` : `prompt: \"${prompt!.slice(0, 60)}\"`;\n return `Task \"${id}\" scheduled. Cron: ${cronExpr}. Will execute ${triggerType}. Description: ${description}`;\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { Scheduler, ScheduledTaskManifest } from '../../core/scheduler.js';\n\nexport function createListTasksTool(scheduler: Scheduler) {\n return tool({\n description: 'List all scheduled tasks with their cron expressions and descriptions.',\n parameters: z.object({}),\n execute: async () => {\n const manifests = scheduler.getManifests();\n if (manifests.length === 0) {\n return 'No scheduled tasks. Use schedule_task to create one.';\n }\n return manifests.map((m: ScheduledTaskManifest) => {\n const trigger = m.skillName ? `skill: ${m.skillName}` : m.prompt ? `prompt: \"${m.prompt.slice(0, 40)}\"` : 'no action';\n return `${m.id} | ${m.cron} | ${m.description} | ${trigger}`;\n }).join('\\n');\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { Scheduler } from '../../core/scheduler.js';\n\nexport function createCancelTaskTool(scheduler: Scheduler) {\n return tool({\n description: 'Cancel and remove a scheduled task by its ID.',\n parameters: z.object({\n id: z.string().describe('ID of the scheduled task to cancel'),\n }),\n execute: async ({ id }) => {\n const manifests = scheduler.getManifests();\n const exists = manifests.some(m => m.id === id);\n if (!exists) {\n return `Task \"${id}\" not found. Use list_scheduled_tasks to see active tasks.`;\n }\n\n scheduler.removeTask(id);\n scheduler.persistSchedules();\n\n return `Task \"${id}\" cancelled and removed.`;\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { TokenBudget } from '../../utils/tokens.js';\n\nexport function createBudgetStatusTool(tokenBudget: TokenBudget) {\n return tool({\n description: 'Check the current token budget status — how many tokens have been used today, how many remain, and what percentage is consumed.',\n parameters: z.object({}),\n execute: async () => {\n return tokenBudget.getStatusText();\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\n\nexport function createGitStatusTool() {\n return tool({\n description: 'Show the working tree status. Returns staged, unstaged, and untracked files.',\n parameters: z.object({\n path: z.string().optional().describe('Path to check (defaults to current directory)'),\n }),\n execute: async ({ path }) => {\n try {\n const cmd = path ? `git -C \"${path}\" status --porcelain` : 'git status --porcelain';\n const result = execSync(cmd, { encoding: 'utf-8', timeout: 10000 });\n if (!result.trim()) return 'Working tree clean — no changes.';\n return result.trim();\n } catch (err: any) {\n return `Error: ${err.stderr?.trim() || err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\n\nexport function createGitDiffTool() {\n return tool({\n description: 'Show changes between commits, commit and working tree, etc. Shows what has been modified.',\n parameters: z.object({\n path: z.string().optional().describe('File or directory to diff'),\n staged: z.boolean().optional().describe('Show staged changes (cached) instead of unstaged'),\n }),\n execute: async ({ path, staged }) => {\n try {\n let cmd = 'git diff';\n if (staged) cmd += ' --cached';\n if (path) cmd += ` -- \"${path}\"`;\n const result = execSync(cmd, { encoding: 'utf-8', timeout: 15000 });\n if (!result.trim()) return 'No differences found.';\n const truncated = result.length > 15000 ? result.slice(0, 15000) + '\\n... (truncated)' : result;\n return truncated;\n } catch (err: any) {\n return `Error: ${err.stderr?.trim() || err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\n\nexport function createGitLogTool() {\n return tool({\n description: 'Show commit logs. Returns recent commit history with hash, author, date, and message.',\n parameters: z.object({\n count: z.number().optional().describe('Number of commits to show (default 10)'),\n path: z.string().optional().describe('File or directory to show log for'),\n }),\n execute: async ({ count, path }) => {\n try {\n const n = count ?? 10;\n let cmd = `git log --oneline --decorate -${n}`;\n if (path) cmd += ` -- \"${path}\"`;\n const result = execSync(cmd, { encoding: 'utf-8', timeout: 10000 });\n if (!result.trim()) return 'No commits found.';\n return result.trim();\n } catch (err: any) {\n return `Error: ${err.stderr?.trim() || err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\n\nexport function createGitAddTool() {\n return tool({\n description: 'Add file contents to the index (staging area). Prepares files for commit.',\n parameters: z.object({\n paths: z.array(z.string()).describe('File paths to stage'),\n }),\n execute: async ({ paths }) => {\n try {\n const fileArgs = paths.map(p => `\"${p}\"`).join(' ');\n const result = execSync(`git add ${fileArgs}`, { encoding: 'utf-8', timeout: 10000 });\n return `Staged ${paths.length} file(s): ${paths.join(', ')}`;\n } catch (err: any) {\n return `Error: ${err.stderr?.trim() || err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\n\nexport function createGitCommitTool() {\n return tool({\n description: 'Record changes to the repository. Creates a new commit with staged changes.',\n parameters: z.object({\n message: z.string().describe('Commit message'),\n }),\n execute: async ({ message }) => {\n try {\n const escapedMsg = message.replace(/\"/g, '\\\\\"');\n const result = execSync(`git commit -m \"${escapedMsg}\"`, { encoding: 'utf-8', timeout: 10000 });\n return result.trim() || 'Committed successfully.';\n } catch (err: any) {\n const stderr = err.stderr?.trim() || '';\n if (stderr.includes('nothing to commit')) {\n return 'Nothing to commit — no staged changes.';\n }\n return `Error: ${stderr || err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createGitPushTool(permissions: PermissionManager) {\n return tool({\n description: 'Push commits to a remote repository. This modifies a remote and requires approval.',\n parameters: z.object({\n remote: z.string().optional().describe('Remote name (default: origin)'),\n branch: z.string().optional().describe('Branch name (default: current branch)'),\n }),\n execute: async ({ remote, branch }) => {\n const cmd = `git push ${remote || 'origin'} ${branch || ''}`.trim();\n const check = await permissions.checkShellCommand(cmd);\n if (!check.allowed && check.needsApproval) {\n const baseCmd = 'git';\n permissions.addPendingApproval(baseCmd);\n return `⚠ This command pushes to a remote: ${cmd}\\nAsk the user for permission. If they approve, try again. If they say \"always\", use the approve_command tool.`;\n }\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n try {\n const result = execSync(cmd, { encoding: 'utf-8', timeout: 30000 });\n return result.trim() || 'Pushed successfully.';\n } catch (err: any) {\n return `Error: ${err.stderr?.trim() || err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\n\nconst MAX_CONTENT_LENGTH = 15000;\n\nfunction stripHtml(html: string): string {\n let text = html;\n\n text = text.replace(/<script[\\s\\S]*?<\\/script>/gi, '');\n text = text.replace(/<style[\\s\\S]*?<\\/style>/gi, '');\n text = text.replace(/<nav[\\s\\S]*?<\\/nav>/gi, '');\n text = text.replace(/<footer[\\s\\S]*?<\\/footer>/gi, '');\n text = text.replace(/<header[\\s\\S]*?<\\/header>/gi, '');\n\n text = text.replace(/<br\\s*\\/?>/gi, '\\n');\n text = text.replace(/<\\/p>/gi, '\\n');\n text = text.replace(/<\\/h[1-6]>/gi, '\\n');\n text = text.replace(/<\\/li>/gi, '\\n');\n text = text.replace(/<\\/div>/gi, '\\n');\n text = text.replace(/<hr\\s*\\/?>/gi, '\\n---\\n');\n\n text = text.replace(/<a[^>]*href=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/a>/gi, '[$2]($1)');\n text = text.replace(/<img[^>]*alt=\"([^\"]*)\"[^>]*>/gi, '[image: $1]');\n text = text.replace(/<code[^>]*>([\\s\\S]*?)<\\/code>/gi, '`$1`');\n text = text.replace(/<pre[^>]*>([\\s\\S]*?)<\\/pre>/gi, '\\n```\\n$1\\n```\\n');\n text = text.replace(/<strong[^>]*>([\\s\\S]*?)<\\/strong>/gi, '**$1**');\n text = text.replace(/<em[^>]*>([\\s\\S]*?)<\\/em>/gi, '*$1*');\n\n text = text.replace(/<[^>]+>/g, '');\n\n text = text.replace(/&amp;/g, '&');\n text = text.replace(/&lt;/g, '<');\n text = text.replace(/&gt;/g, '>');\n text = text.replace(/&quot;/g, '\"');\n text = text.replace(/&#39;/g, \"'\");\n text = text.replace(/&nbsp;/g, ' ');\n\n text = text.replace(/\\n{3,}/g, '\\n\\n');\n text = text.trim();\n\n return text;\n}\n\nexport function createFetchUrlTool() {\n return tool({\n description: 'Fetch a URL and return its content as text. Strips HTML to readable markdown-like format. Useful for reading documentation, APIs, or web pages.',\n parameters: z.object({\n url: z.string().describe('The URL to fetch'),\n format: z.enum(['text', 'markdown']).optional().describe('Output format (default: markdown)'),\n }),\n execute: async ({ url, format }) => {\n const outputFormat = format ?? 'markdown';\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 15000);\n\n const resp = await fetch(url, {\n signal: controller.signal,\n headers: {\n 'User-Agent': 'Mercury-Agent/0.1.0',\n 'Accept': 'text/html,application/json,text/plain',\n },\n });\n\n clearTimeout(timeout);\n\n if (!resp.ok) {\n return `HTTP ${resp.status} ${resp.statusText} for ${url}`;\n }\n\n const contentType = resp.headers.get('content-type') || '';\n const body = await resp.text();\n\n if (contentType.includes('application/json')) {\n try {\n const json = JSON.parse(body);\n const formatted = JSON.stringify(json, null, 2);\n return formatted.length > MAX_CONTENT_LENGTH\n ? formatted.slice(0, MAX_CONTENT_LENGTH) + '\\n... (truncated)'\n : formatted;\n } catch {\n return body.slice(0, MAX_CONTENT_LENGTH);\n }\n }\n\n if (contentType.includes('text/html') && outputFormat === 'markdown') {\n const text = stripHtml(body);\n return text.length > MAX_CONTENT_LENGTH\n ? text.slice(0, MAX_CONTENT_LENGTH) + '\\n... (truncated)'\n : text;\n }\n\n return body.length > MAX_CONTENT_LENGTH\n ? body.slice(0, MAX_CONTENT_LENGTH) + '\\n... (truncated)'\n : body;\n } catch (err: any) {\n if (err.name === 'AbortError') {\n return `Request to ${url} timed out after 15 seconds.`;\n }\n return `Error fetching ${url}: ${err.message}`;\n }\n },\n });\n}","import type { Tool } from 'ai';\nimport { PermissionManager } from './permissions.js';\nimport { createReadFileTool } from './filesystem/read-file.js';\nimport { createWriteFileTool } from './filesystem/write-file.js';\nimport { createCreateFileTool } from './filesystem/create-file.js';\nimport { createListDirTool } from './filesystem/list-dir.js';\nimport { createDeleteFileTool } from './filesystem/delete-file.js';\nimport { createEditFileTool } from './filesystem/edit-file.js';\nimport { createSendFileTool } from './filesystem/send-file.js';\nimport { createRunCommandTool } from './shell/run-command.js';\nimport { createApproveCommandTool } from './shell/approve-command.js';\nimport { createInstallSkillTool } from './skills/install-skill.js';\nimport { createListSkillsTool } from './skills/list-skills.js';\nimport { createUseSkillTool } from './skills/use-skill.js';\nimport { createScheduleTaskTool } from './scheduler/schedule-task.js';\nimport { createListTasksTool } from './scheduler/list-tasks.js';\nimport { createCancelTaskTool } from './scheduler/cancel-task.js';\nimport { createBudgetStatusTool } from './system/budget-status.js';\nimport { createGitStatusTool } from './git/git-status.js';\nimport { createGitDiffTool } from './git/git-diff.js';\nimport { createGitLogTool } from './git/git-log.js';\nimport { createGitAddTool } from './git/git-add.js';\nimport { createGitCommitTool } from './git/git-commit.js';\nimport { createGitPushTool } from './git/git-push.js';\nimport { createFetchUrlTool } from './web/fetch-url.js';\nimport type { SkillLoader } from '../skills/loader.js';\nimport type { Scheduler } from '../core/scheduler.js';\nimport type { TokenBudget } from '../utils/tokens.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface ChatCommandContext {\n toolNames: () => string[];\n skillNames: () => string[];\n config: () => import('../utils/config.js').MercuryConfig;\n tokenBudget: () => import('../utils/tokens.js').TokenBudget;\n manual: () => string;\n}\n\nexport class CapabilityRegistry {\n readonly permissions: PermissionManager;\n private tools: Record<string, Tool> = {};\n private skillLoader?: SkillLoader;\n private scheduler?: Scheduler;\n private tokenBudget?: TokenBudget;\n private sendFileHandler?: (filePath: string) => Promise<void>;\n private currentChannelId = 'cli';\n private currentChannelType = 'cli';\n private chatCommandContext?: ChatCommandContext;\n\n constructor(skillLoader?: SkillLoader, scheduler?: Scheduler, tokenBudget?: TokenBudget) {\n this.permissions = new PermissionManager();\n this.skillLoader = skillLoader;\n this.scheduler = scheduler;\n this.tokenBudget = tokenBudget;\n }\n\n setChatCommandContext(ctx: ChatCommandContext): void {\n this.chatCommandContext = ctx;\n }\n\n getChatCommandContext(): ChatCommandContext | undefined {\n return this.chatCommandContext;\n }\n\n setChannelContext(channelId: string, channelType: string): void {\n this.currentChannelId = channelId;\n this.currentChannelType = channelType;\n }\n\n getChannelContext(): { channelId: string; channelType: string } {\n return { channelId: this.currentChannelId, channelType: this.currentChannelType };\n }\n\n setSendFileHandler(handler: (filePath: string) => Promise<void>): void {\n this.sendFileHandler = handler;\n }\n\n registerAll(): void {\n const manifest = this.permissions.getManifest();\n\n if (manifest.capabilities.filesystem.enabled) {\n this.tools.read_file = createReadFileTool(this.permissions);\n this.tools.write_file = createWriteFileTool(this.permissions);\n this.tools.create_file = createCreateFileTool(this.permissions);\n this.tools.list_dir = createListDirTool(this.permissions);\n this.tools.delete_file = createDeleteFileTool(this.permissions);\n this.tools.edit_file = createEditFileTool(this.permissions);\n\n if (this.sendFileHandler) {\n this.tools.send_file = createSendFileTool(this.permissions, this.sendFileHandler);\n }\n\n logger.info('Filesystem tools registered');\n }\n\n if (manifest.capabilities.shell.enabled) {\n this.tools.run_command = createRunCommandTool(this.permissions);\n this.tools.approve_command = createApproveCommandTool(this.permissions);\n logger.info('Shell tools registered');\n }\n\n if (this.skillLoader) {\n this.tools.install_skill = createInstallSkillTool(this.skillLoader);\n this.tools.list_skills = createListSkillsTool(this.skillLoader);\n this.tools.use_skill = createUseSkillTool(this.skillLoader, this.permissions);\n logger.info('Skill tools registered');\n }\n\n if (this.scheduler) {\n this.tools.schedule_task = createScheduleTaskTool(this.scheduler, () => this.getChannelContext());\n this.tools.list_scheduled_tasks = createListTasksTool(this.scheduler);\n this.tools.cancel_scheduled_task = createCancelTaskTool(this.scheduler);\n logger.info('Scheduler tools registered');\n }\n\n if (this.tokenBudget) {\n this.tools.budget_status = createBudgetStatusTool(this.tokenBudget);\n logger.info('Budget tool registered');\n }\n\n if (manifest.capabilities.git?.enabled) {\n this.tools.git_status = createGitStatusTool();\n this.tools.git_diff = createGitDiffTool();\n this.tools.git_log = createGitLogTool();\n this.tools.git_add = createGitAddTool();\n this.tools.git_commit = createGitCommitTool();\n this.tools.git_push = createGitPushTool(this.permissions);\n logger.info('Git tools registered');\n }\n\n this.tools.fetch_url = createFetchUrlTool();\n logger.info('Web fetch tool registered');\n }\n\n getTools(): Record<string, Tool> {\n return this.tools;\n }\n\n getToolNames(): string[] {\n return Object.keys(this.tools);\n }\n\n getSkillContext(): string {\n return this.skillLoader?.getSkillSummariesText() || '';\n }\n}","import { existsSync, readFileSync, readdirSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport { getMercuryHome } from '../utils/config.js';\nimport type { SkillDiscovery, Skill, SkillMeta } from './types.js';\nimport { logger } from '../utils/logger.js';\n\nconst SKILL_FILE = 'SKILL.md';\n\nfunction parseSkillMd(content: string): { meta: SkillMeta; instructions: string } | null {\n const fmMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n([\\s\\S]*)$/);\n if (!fmMatch) return null;\n\n try {\n const meta = parseYaml(fmMatch[1]) as SkillMeta;\n const instructions = fmMatch[2].trim();\n if (!meta.name || !meta.description) {\n logger.warn({ meta }, 'SKILL.md missing required fields (name, description)');\n return null;\n }\n return { meta, instructions };\n } catch (err) {\n logger.warn({ err }, 'Failed to parse SKILL.md frontmatter');\n return null;\n }\n}\n\nexport class SkillLoader {\n private skillsDir: string;\n private discovered: Map<string, SkillDiscovery> = new Map();\n private loaded: Map<string, Skill> = new Map();\n\n constructor(skillsDir?: string) {\n this.skillsDir = skillsDir || join(getMercuryHome(), 'skills');\n }\n\n discover(): SkillDiscovery[] {\n this.discovered.clear();\n this.loaded.clear();\n if (!existsSync(this.skillsDir)) {\n mkdirSync(this.skillsDir, { recursive: true });\n this.seedTemplate();\n return [];\n }\n\n const entries = readdirSync(this.skillsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith('_')) continue;\n const skillPath = join(this.skillsDir, entry.name, SKILL_FILE);\n if (!existsSync(skillPath)) continue;\n try {\n const raw = readFileSync(skillPath, 'utf-8');\n const parsed = parseSkillMd(raw);\n if (!parsed) continue;\n this.discovered.set(parsed.meta.name, {\n name: parsed.meta.name,\n description: parsed.meta.description,\n });\n logger.info({ skill: parsed.meta.name }, 'Skill discovered');\n } catch (err) {\n logger.warn({ dir: entry.name, err }, 'Failed to load skill');\n }\n }\n\n return [...this.discovered.values()];\n }\n\n load(name: string): Skill | null {\n const cached = this.loaded.get(name);\n if (cached) return cached;\n\n for (const entry of readdirSync(this.skillsDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('_')) continue;\n const skillPath = join(this.skillsDir, entry.name, SKILL_FILE);\n if (!existsSync(skillPath)) continue;\n try {\n const raw = readFileSync(skillPath, 'utf-8');\n const parsed = parseSkillMd(raw);\n if (!parsed || parsed.meta.name !== name) continue;\n\n const skillDir = join(this.skillsDir, entry.name);\n const skill: Skill = {\n ...parsed.meta,\n instructions: parsed.instructions,\n scriptsDir: existsSync(join(skillDir, 'scripts')) ? join(skillDir, 'scripts') : undefined,\n referencesDir: existsSync(join(skillDir, 'references')) ? join(skillDir, 'references') : undefined,\n };\n this.loaded.set(name, skill);\n return skill;\n } catch (err) {\n logger.warn({ err, name }, 'Failed to load skill');\n return null;\n }\n }\n\n return null;\n }\n\n getDiscovered(): SkillDiscovery[] {\n return [...this.discovered.values()];\n }\n\n getSkillSummariesText(): string {\n const skills = this.getDiscovered();\n if (skills.length === 0) return '';\n return 'Available skills:\\n' + skills.map(s => `- ${s.name}: ${s.description}`).join('\\n');\n }\n\n saveSkill(name: string, content: string): string {\n const skillDir = join(this.skillsDir, name);\n if (!existsSync(skillDir)) {\n mkdirSync(skillDir, { recursive: true });\n }\n writeFileSync(join(skillDir, SKILL_FILE), content, 'utf-8');\n logger.info({ skill: name }, 'Skill saved');\n this.discover();\n return skillDir;\n }\n\n private seedTemplate(): void {\n const templateDir = join(this.skillsDir, '_template');\n mkdirSync(templateDir, { recursive: true });\n\n const content = `---\nname: template-skill\ndescription: A template skill for Mercury. Use this as a starting point to create your own skills.\nversion: 0.1.0\nallowed-tools:\n - read_file\n - list_dir\n---\n\n# Template Skill\n\nThis is a template skill for Mercury. Copy this directory and edit SKILL.md to create your own skill.\n\n## What It Does\n\nDescribe what this skill enables Mercury to do. When invoked via the use_skill tool, these instructions are injected into Mercury's context as guidance.\n\n## Instructions\n\n1. Step one of what Mercury should do\n2. Step two\n3. Continue with specific guidance\n\n## Tips\n\n- Keep instructions concise to save tokens\n- List only the tools you need in allowed-tools\n- The skill name must be unique among installed skills\n`;\n\n writeFileSync(join(templateDir, SKILL_FILE), content, 'utf-8');\n logger.info('Seeded template skill');\n }\n}","import chalk from 'chalk';\n\nexport function getManual(): string {\n const sections: string[] = [];\n\n sections.push('');\n sections.push(chalk.bold.cyan(' MERCURY — Capabilities & Commands'));\n sections.push(chalk.dim(' ─────────────────────────────────────────'));\n sections.push('');\n\n sections.push(chalk.bold.white(' Built-in Tools'));\n sections.push(chalk.dim(' Tools Mercury can use during conversations.'));\n sections.push('');\n\n const tools = [\n ['read_file', 'Read file contents', 'path (required)'],\n ['write_file', 'Write to an existing file', 'path, content'],\n ['create_file', 'Create a new file (+ dirs)', 'path, content'],\n ['edit_file', 'Replace specific text in a file', 'path, old_string, new_string'],\n ['list_dir', 'List directory contents', 'path'],\n ['delete_file', 'Delete a file', 'path'],\n ['run_command', 'Execute a shell command', 'command'],\n ['approve_command', 'Permanently approve a command type', 'command (e.g. \"curl\")'],\n ['fetch_url', 'Fetch a URL and return content', 'url, format? (text/markdown)'],\n ['git_status', 'Show working tree status', 'path?'],\n ['git_diff', 'Show file changes', 'path?, staged?'],\n ['git_log', 'Show commit history', 'count?, path?'],\n ['git_add', 'Stage files for commit', 'paths (array)'],\n ['git_commit', 'Create a commit', 'message'],\n ['git_push', 'Push to remote (needs approval)', 'remote?, branch?'],\n ['install_skill', 'Install a skill from content or URL', 'content? or url?'],\n ['list_skills', 'List installed skills', '—'],\n ['use_skill', 'Invoke a skill by name', 'name'],\n ['schedule_task', 'Schedule a recurring or delayed task', 'cron? or delay_seconds, description, prompt? or skill_name?'],\n ['list_scheduled_tasks', 'List all scheduled tasks', '—'],\n ['cancel_scheduled_task', 'Cancel a scheduled task', 'id'],\n ['budget_status', 'Check token budget', '—'],\n ];\n\n for (const [name, desc, params] of tools) {\n sections.push(` ${chalk.cyan(name.padEnd(24))} ${desc}`);\n sections.push(` ${' '.repeat(24)} ${chalk.dim(params)}`);\n }\n\n sections.push('');\n sections.push(chalk.bold.white(' CLI Commands'));\n sections.push(chalk.dim(' Run these from your terminal (no API calls consumed).'));\n sections.push('');\n\n const commands = [\n ['mercury up', 'Start persistently (install service + daemon)'],\n ['mercury', 'Start the agent (same as mercury start)'],\n ['mercury start', 'Start the agent in foreground'],\n ['mercury start -d', 'Start in background (daemon mode)'],\n ['mercury restart', 'Restart a background process'],\n ['mercury stop', 'Stop a background process'],\n ['mercury logs', 'Show recent daemon logs'],\n ['mercury doctor', 'Reconfigure settings (Enter keeps current)'],\n ['mercury setup', 'Re-run the setup wizard'],\n ['mercury status', 'Show config and daemon status'],\n ['mercury help', 'Show this manual'],\n ['mercury service install', 'Install as system service (auto-start)'],\n ['mercury service uninstall', 'Uninstall system service'],\n ['mercury service status', 'Show system service status'],\n ['mercury --verbose', 'Start with debug logging on stderr'],\n ];\n\n for (const [cmd, desc] of commands) {\n sections.push(` ${chalk.white(cmd.padEnd(26))} ${desc}`);\n }\n\n sections.push('');\n sections.push(chalk.bold.white(' In-Chat Commands'));\n sections.push(chalk.dim(' Type these during a conversation (no API calls).'));\n sections.push('');\n\n const chat = [\n ['/help', 'Show this manual'],\n ['/status', 'Show config and budget info'],\n ['/tools', 'List currently loaded tools'],\n ['/skills', 'List installed skills'],\n ['/stream', 'Toggle text streaming on/off (Telegram)'],\n ['/stream on', 'Enable streaming (live text updates)'],\n ['/stream off', 'Disable streaming (single message)'],\n ];\n\n for (const [cmd, desc] of chat) {\n sections.push(` ${chalk.white(cmd.padEnd(16))} ${desc}`);\n }\n\n sections.push('');\n sections.push(chalk.bold.white(' Permissions'));\n sections.push('');\n\n const perms = [\n 'Commands are blocked (never run), auto-approved, or need approval.',\n 'Say \"always\" when prompted to permanently approve a command type.',\n 'Edit ~/.mercury/permissions.yaml to customize manually.',\n 'File access is scoped — new paths need approval (y/n/always).',\n ];\n\n for (const p of perms) {\n sections.push(` ${chalk.dim('•')} ${p}`);\n }\n\n sections.push('');\n sections.push(chalk.bold.white(' Skills'));\n sections.push('');\n\n const skillInfo = [\n 'Skills live in ~/.mercury/skills/<name>/SKILL.md',\n 'Install: ask Mercury to \"install skill from <url>\" or paste content',\n 'Invoke: ask Mercury to \"use skill <name>\"',\n 'Schedule: \"remind me daily at 9am to run daily-digest skill\"',\n ];\n\n for (const s of skillInfo) {\n sections.push(` ${chalk.dim('•')} ${s}`);\n }\n\n sections.push('');\n sections.push(chalk.bold.white(' Scheduling'));\n sections.push('');\n\n const schedInfo = [\n 'Recurring: \"every day at 9am remind me to…\"',\n 'One-shot: \"remind me in 15 seconds to…\"',\n 'Tasks persist to ~/.mercury/schedules.yaml',\n ];\n\n for (const s of schedInfo) {\n sections.push(` ${chalk.dim('•')} ${s}`);\n }\n\n sections.push('');\n sections.push(chalk.bold.white(' Configuration'));\n sections.push('');\n\n const configInfo = [\n ['~/.mercury/mercury.yaml', 'Main config (providers, channels, budget)'],\n ['~/.mercury/permissions.yaml', 'Capabilities and approval rules'],\n ['~/.mercury/soul/*.md', 'Agent personality (soul, persona, taste, heartbeat)'],\n ['~/.mercury/skills/', 'Installed skills'],\n ['~/.mercury/schedules.yaml', 'Scheduled tasks'],\n ['~/.mercury/token-usage.json', 'Daily token usage tracking'],\n ['~/.mercury/memory/', 'Short-term, long-term, episodic memory'],\n ];\n\n for (const [path, desc] of configInfo) {\n sections.push(` ${chalk.dim(path.padEnd(36))} ${desc}`);\n }\n\n sections.push('');\n sections.push(chalk.dim(' mercury.cosmicstack.org'));\n sections.push('');\n\n return sections.join('\\n');\n}","import { spawn } from 'node:child_process';\nimport { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync, openSync } from 'node:fs';\nimport { join } from 'node:path';\nimport process from 'node:process';\nimport chalk from 'chalk';\nimport { getMercuryHome } from '../utils/config.js';\n\nconst PID_FILE = 'daemon.pid';\nconst LOG_FILE = 'daemon.log';\n\nfunction pidPath(): string {\n return join(getMercuryHome(), PID_FILE);\n}\n\nfunction logPath(): string {\n return join(getMercuryHome(), LOG_FILE);\n}\n\nexport function readPid(): number | null {\n const path = pidPath();\n if (!existsSync(path)) return null;\n try {\n const pid = parseInt(readFileSync(path, 'utf-8').trim(), 10);\n if (isNaN(pid)) return null;\n return pid;\n } catch {\n return null;\n }\n}\n\nfunction isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getDaemonStatus(): { running: boolean; pid: number | null; logPath: string } {\n const pid = readPid();\n if (!pid) return { running: false, pid: null, logPath: logPath() };\n return { running: isProcessRunning(pid), pid, logPath: logPath() };\n}\n\nexport function startBackground(): void {\n const status = getDaemonStatus();\n if (status.running && status.pid) {\n console.log(chalk.yellow(` Mercury is already running (PID: ${status.pid})`));\n console.log(chalk.dim(` Use \\`mercury stop\\` to stop it first.`));\n console.log('');\n process.exit(1);\n }\n\n if (status.pid && !status.running) {\n try { unlinkSync(pidPath()); } catch {}\n }\n\n const home = getMercuryHome();\n if (!existsSync(home)) {\n mkdirSync(home, { recursive: true });\n }\n\n const logFile = logPath();\n const isWin = process.platform === 'win32';\n const outFd = openSync(logFile, 'a');\n\n const child = spawn(process.execPath, [process.argv[1], 'start', '--daemon'], {\n detached: true,\n stdio: ['ignore', outFd, outFd],\n env: { ...process.env },\n windowsHide: isWin,\n });\n\n child.unref();\n\n writeFileSync(pidPath(), String(child.pid));\n\n console.log('');\n console.log(chalk.green(` Mercury started in background (PID: ${child.pid})`));\n console.log(chalk.dim(` Logs: ${logFile}`));\n console.log(chalk.dim(` Use \\`mercury stop\\` to stop.`));\n console.log(chalk.dim(` Use \\`mercury logs\\` to view logs.`));\n console.log('');\n}\n\nexport function stopDaemon(): void {\n const status = getDaemonStatus();\n\n if (!status.pid) {\n console.log(chalk.yellow(' Mercury is not running as a daemon.'));\n console.log('');\n process.exit(0);\n }\n\n if (!status.running) {\n console.log(chalk.yellow(` Stale PID file found (PID: ${status.pid} is not running). Cleaning up.`));\n try { unlinkSync(pidPath()); } catch {}\n console.log('');\n process.exit(0);\n }\n\n try {\n if (process.platform === 'win32') {\n process.kill(status.pid);\n } else {\n process.kill(status.pid, 'SIGTERM');\n }\n console.log(chalk.green(` Mercury stopped (PID: ${status.pid})`));\n } catch {\n console.log(chalk.red(` Failed to stop PID ${status.pid}. You may need to kill it manually.`));\n }\n\n try { unlinkSync(pidPath()); } catch {}\n console.log('');\n}\n\nexport function restartDaemon(): void {\n const status = getDaemonStatus();\n\n if (status.running && status.pid) {\n console.log(chalk.yellow(` Stopping Mercury (PID: ${status.pid})...`));\n try {\n if (process.platform === 'win32') {\n process.kill(status.pid);\n } else {\n process.kill(status.pid, 'SIGTERM');\n }\n } catch {\n // process may have already exited\n }\n try { unlinkSync(pidPath()); } catch {}\n console.log(chalk.green(' Mercury stopped.'));\n } else if (status.pid) {\n try { unlinkSync(pidPath()); } catch {}\n }\n\n console.log(chalk.yellow(' Starting Mercury...'));\n startBackground();\n}\n\nexport function showLogs(): void {\n const logFile = logPath();\n if (!existsSync(logFile)) {\n console.log(chalk.dim(' No daemon log file found.'));\n console.log('');\n return;\n }\n const content = readFileSync(logFile, 'utf-8');\n const lines = content.split('\\n').slice(-100);\n console.log(lines.join('\\n'));\n}\n\nexport function tryAutoDaemonize(): boolean {\n try {\n const status = getDaemonStatus();\n if (status.running && status.pid) {\n return true;\n }\n\n if (status.pid && !status.running) {\n try { unlinkSync(pidPath()); } catch {}\n }\n\n const home = getMercuryHome();\n if (!existsSync(home)) {\n mkdirSync(home, { recursive: true });\n }\n\n const logFile = logPath();\n const isWin = process.platform === 'win32';\n const outFd = openSync(logFile, 'a');\n\n const child = spawn(process.execPath, [process.argv[1], 'start', '--daemon'], {\n detached: true,\n stdio: ['ignore', outFd, outFd],\n env: { ...process.env },\n windowsHide: isWin,\n });\n\n child.unref();\n\n if (!child.pid) {\n return false;\n }\n\n writeFileSync(pidPath(), String(child.pid));\n return true;\n } catch {\n return false;\n }\n}","import { existsSync, mkdirSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport chalk from 'chalk';\nimport { execSync } from 'node:child_process';\nimport { getMercuryHome } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nconst SERVICE_NAME = 'mercury';\nconst SERVICE_DESC = 'Mercury — Soul-Driven AI Agent';\nconst WIN_TASK_NAME = 'MercuryAgent';\n\nexport function isServiceInstalled(): boolean {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return existsSync(join(homedir(), 'Library', 'LaunchAgents', 'com.cosmicstack.mercury.plist'));\n } else if (platform === 'linux') {\n return existsSync(join(homedir(), '.config', 'systemd', 'user', 'mercury.service'));\n } else if (platform === 'win32') {\n try {\n execSync(`schtasks /query /tn \"${WIN_TASK_NAME}\"`, { stdio: 'pipe', shell: 'cmd.exe' });\n return true;\n } catch {\n return false;\n }\n }\n return false;\n}\n\nfunction getNodeBinPath(): string {\n return process.execPath;\n}\n\nfunction getDistPath(): string {\n return join(process.argv[1] || '/usr/local/bin/mercury', '..', '..', 'lib', 'node_modules', '@cosmicstack', 'mercury-agent', 'dist', 'index.js');\n}\n\nexport function installService(): void {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n installMac();\n } else if (platform === 'linux') {\n installLinux();\n } else if (platform === 'win32') {\n installWindows();\n } else {\n console.log(chalk.red(` Unsupported platform: ${platform}`));\n process.exit(1);\n }\n}\n\nexport function uninstallService(): void {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n uninstallMac();\n } else if (platform === 'linux') {\n uninstallLinux();\n } else if (platform === 'win32') {\n uninstallWindows();\n } else {\n console.log(chalk.red(` Unsupported platform: ${platform}`));\n process.exit(1);\n }\n}\n\nexport function showServiceStatus(): void {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n showMacStatus();\n } else if (platform === 'linux') {\n showLinuxStatus();\n } else if (platform === 'win32') {\n showWindowsStatus();\n }\n}\n\nfunction installMac(): void {\n const plistDir = join(homedir(), 'Library', 'LaunchAgents');\n const plistPath = join(plistDir, 'com.cosmicstack.mercury.plist');\n\n if (!existsSync(plistDir)) {\n mkdirSync(plistDir, { recursive: true });\n }\n\n const nodeBin = getNodeBinPath();\n const scriptPath = getDistPath();\n const home = getMercuryHome();\n const logPath = join(home, 'daemon.log');\n const errPath = join(home, 'daemon-error.log');\n\n const plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>com.cosmicstack.mercury</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodeBin}</string>\n <string>${scriptPath}</string>\n <string>start</string>\n <string>--daemon</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n <key>StandardOutPath</key>\n <string>${logPath}</string>\n <key>StandardErrorPath</key>\n <string>${errPath}</string>\n <key>EnvironmentVariables</key>\n <dict>\n <key>PATH</key>\n <string>${process.env.PATH || '/usr/local/bin:/usr/bin:/bin'}</string>\n <key>HOME</key>\n <string>${homedir()}</string>\n </dict>\n <key>WorkingDirectory</key>\n <string>${homedir()}</string>\n</dict>\n</plist>`;\n\n writeFileSync(plistPath, plist, 'utf-8');\n\n try {\n execSync(`launchctl load ${plistPath}`, { stdio: 'inherit' });\n } catch {\n console.log(chalk.yellow(' launchctl load failed. Try running:'));\n console.log(chalk.dim(` launchctl load ${plistPath}`));\n }\n\n console.log('');\n console.log(chalk.green(' Mercury service installed (macOS LaunchAgent)'));\n console.log(chalk.dim(` Plist: ${plistPath}`));\n console.log(chalk.dim(` Logs: ${logPath}`));\n console.log(chalk.dim(' Auto-starts on login. Auto-restarts on crash.'));\n console.log('');\n console.log(chalk.dim(' Uninstall: mercury service uninstall'));\n console.log('');\n}\n\nfunction uninstallMac(): void {\n const plistPath = join(homedir(), 'Library', 'LaunchAgents', 'com.cosmicstack.mercury.plist');\n\n if (!existsSync(plistPath)) {\n console.log(chalk.yellow(' Mercury service is not installed.'));\n console.log('');\n process.exit(0);\n }\n\n try {\n execSync(`launchctl unload ${plistPath}`, { stdio: 'inherit' });\n } catch {\n // may already be unloaded\n }\n\n try {\n unlinkSync(plistPath);\n } catch {\n console.log(chalk.yellow(' Failed to remove plist file. Remove manually:'));\n console.log(chalk.dim(` rm ${plistPath}`));\n }\n\n console.log('');\n console.log(chalk.green(' Mercury service uninstalled'));\n console.log('');\n}\n\nfunction showMacStatus(): void {\n const plistPath = join(homedir(), 'Library', 'LaunchAgents', 'com.cosmicstack.mercury.plist');\n\n if (!existsSync(plistPath)) {\n console.log(chalk.yellow(' Mercury service is not installed.'));\n console.log(chalk.dim(' Run `mercury service install` to set it up.'));\n console.log('');\n return;\n }\n\n try {\n const output = execSync('launchctl list | grep com.cosmicstack.mercury', { encoding: 'utf-8' }).trim();\n console.log(` ${chalk.green('Service installed and loaded')}`);\n console.log(chalk.dim(` ${output}`));\n } catch {\n console.log(` ${chalk.yellow('Service installed but not loaded')}`);\n console.log(chalk.dim(` Plist: ${plistPath}`));\n }\n console.log('');\n}\n\nfunction installLinux(): void {\n const systemdDir = join(homedir(), '.config', 'systemd', 'user');\n\n if (!existsSync(systemdDir)) {\n mkdirSync(systemdDir, { recursive: true });\n }\n\n const servicePath = join(systemdDir, 'mercury.service');\n const nodeBin = getNodeBinPath();\n const scriptPath = getDistPath();\n const home = getMercuryHome();\n\n const service = `[Unit]\nDescription=${SERVICE_DESC}\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=${nodeBin} ${scriptPath} start --daemon\nRestart=on-failure\nRestartSec=5\nEnvironment=PATH=${process.env.PATH || '/usr/local/bin:/usr/bin:/bin'}\nEnvironment=HOME=${homedir()}\nWorkingDirectory=${homedir()}\nStandardOutput=append:${join(home, 'daemon.log')}\nStandardError=append:${join(home, 'daemon-error.log')}\n\n[Install]\nWantedBy=default.target`;\n\n writeFileSync(servicePath, service, 'utf-8');\n\n try {\n execSync('systemctl --user daemon-reload', { stdio: 'inherit' });\n execSync('systemctl --user enable mercury.service', { stdio: 'inherit' });\n execSync('systemctl --user start mercury.service', { stdio: 'inherit' });\n } catch (err) {\n console.log(chalk.yellow(' systemd commands failed. Try running manually:'));\n console.log(chalk.dim(' systemctl --user daemon-reload'));\n console.log(chalk.dim(' systemctl --user enable mercury.service'));\n console.log(chalk.dim(' systemctl --user start mercury.service'));\n }\n\n try {\n execSync(`loginctl enable-linger ${process.env.USER || ''}`, { stdio: 'inherit' });\n } catch {\n console.log(chalk.yellow(' Enable linger failed (needed for boot-without-login). Try:'));\n console.log(chalk.dim(` sudo loginctl enable-linger ${process.env.USER || '$USER'}`));\n }\n\n console.log('');\n console.log(chalk.green(' Mercury service installed (systemd --user)'));\n console.log(chalk.dim(` Service: ${servicePath}`));\n console.log(chalk.dim(` Logs: ${join(home, 'daemon.log')}`));\n console.log(chalk.dim(' Auto-starts on login. Auto-restarts on crash (5s delay).'));\n console.log('');\n console.log(chalk.dim(' Uninstall: mercury service uninstall'));\n console.log('');\n}\n\nfunction uninstallLinux(): void {\n const servicePath = join(homedir(), '.config', 'systemd', 'user', 'mercury.service');\n\n if (!existsSync(servicePath)) {\n console.log(chalk.yellow(' Mercury service is not installed.'));\n console.log('');\n process.exit(0);\n }\n\n try {\n execSync('systemctl --user stop mercury.service', { stdio: 'inherit' });\n execSync('systemctl --user disable mercury.service', { stdio: 'inherit' });\n } catch {\n // may already be stopped\n }\n\n try {\n unlinkSync(servicePath);\n } catch {\n console.log(chalk.yellow(' Failed to remove service file. Remove manually:'));\n console.log(chalk.dim(` rm ${servicePath}`));\n }\n\n try {\n execSync('systemctl --user daemon-reload', { stdio: 'inherit' });\n } catch {}\n\n console.log('');\n console.log(chalk.green(' Mercury service uninstalled'));\n console.log('');\n}\n\nfunction showLinuxStatus(): void {\n const servicePath = join(homedir(), '.config', 'systemd', 'user', 'mercury.service');\n\n if (!existsSync(servicePath)) {\n console.log(chalk.yellow(' Mercury service is not installed.'));\n console.log(chalk.dim(' Run `mercury service install` to set it up.'));\n console.log('');\n return;\n }\n\n try {\n const output = execSync('systemctl --user status mercury.service', { encoding: 'utf-8' }).trim();\n console.log(output);\n } catch (err: any) {\n console.log(chalk.yellow(' Could not get service status:'));\n console.log(chalk.dim(` ${err.message || err}`));\n }\n console.log('');\n}\n\nfunction installWindows(): void {\n const nodeBin = getNodeBinPath();\n const scriptPath = getDistPath();\n const home = getMercuryHome();\n const logPath = join(home, 'daemon.log');\n\n const cmd = `\"${nodeBin}\" \"${scriptPath}\" start --daemon`;\n\n try {\n execSync(\n `schtasks /create /tn \"${WIN_TASK_NAME}\" /tr \"${cmd}\" /sc onlogon /rl limited /f`,\n { stdio: 'inherit', shell: 'cmd.exe' }\n );\n } catch {\n console.log(chalk.yellow(' schtasks create failed. Try running from an Administrator cmd:'));\n console.log(chalk.dim(` schtasks /create /tn \"${WIN_TASK_NAME}\" /tr \"${cmd}\" /sc onlogon /rl limited /f`));\n }\n\n try {\n execSync(`schtasks /run /tn \"${WIN_TASK_NAME}\"`, { stdio: 'inherit', shell: 'cmd.exe' });\n } catch {\n console.log(chalk.yellow(' Task created but failed to start immediately. It will start on next login.'));\n }\n\n console.log('');\n console.log(chalk.green(' Mercury service installed (Windows Task Scheduler)'));\n console.log(chalk.dim(` Task: ${WIN_TASK_NAME}`));\n console.log(chalk.dim(` Trigger: on logon`));\n console.log(chalk.dim(` Logs: ${logPath}`));\n console.log(chalk.dim(' Auto-starts on login. Use --daemon flag for crash recovery.'));\n console.log('');\n console.log(chalk.dim(' Uninstall: mercury service uninstall'));\n console.log('');\n}\n\nfunction uninstallWindows(): void {\n try {\n execSync(`schtasks /delete /tn \"${WIN_TASK_NAME}\" /f`, { stdio: 'inherit', shell: 'cmd.exe' });\n console.log('');\n console.log(chalk.green(' Mercury service uninstalled'));\n console.log('');\n } catch {\n console.log(chalk.yellow(' Task not found or failed to delete. Remove manually:'));\n console.log(chalk.dim(` schtasks /delete /tn \"${WIN_TASK_NAME}\" /f`));\n console.log('');\n }\n}\n\nfunction showWindowsStatus(): void {\n try {\n const output = execSync(`schtasks /query /tn \"${WIN_TASK_NAME}\" /fo list`, {\n encoding: 'utf-8',\n shell: 'cmd.exe',\n }).trim();\n console.log(output);\n console.log('');\n } catch {\n console.log(chalk.yellow(' Mercury service is not installed.'));\n console.log(chalk.dim(' Run `mercury service install` to set it up.'));\n console.log('');\n }\n}","import { logger } from '../utils/logger.js';\n\nconst MAX_RESTARTS = 10;\nconst RESTART_WINDOW_MS = 60_000;\nconst BASE_DELAY_MS = 1_000;\n\nexport async function runWithWatchdog(agentFn: () => Promise<void>): Promise<void> {\n const restarts: number[] = [];\n\n async function attempt(): Promise<void> {\n try {\n await agentFn();\n } catch (err) {\n const now = Date.now();\n restarts.push(now);\n const recentRestarts = restarts.filter(t => now - t < RESTART_WINDOW_MS);\n const restartCount = recentRestarts.length;\n\n if (restartCount >= MAX_RESTARTS) {\n logger.error({ restartCount }, 'Max restarts exceeded within 60s. Exiting.');\n process.exit(1);\n }\n\n const delay = BASE_DELAY_MS * Math.pow(1.25, restartCount);\n logger.warn({ err, restartCount, delay }, 'Crash detected. Restarting with backoff...');\n await sleep(delay);\n await attempt();\n }\n }\n\n await attempt();\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}"],"mappings":"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","names":["readline","chalk","existsSync","readFileSync","mkdirSync","writeFileSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","generateText","streamText","generateText","streamText","provider","generateText","streamText","channel","streamText","generateText","existsSync","readFileSync","writeFileSync","mkdirSync","join","parseYaml","stringifyYaml","join","path","existsSync","readFileSync","parseYaml","mkdirSync","writeFileSync","stringifyYaml","chalk","chalk","resolve","fs","path","path","fs","resolve","existsSync","readFileSync","writeFileSync","join","path","join","writeFileSync","existsSync","readFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","homedir","parseYaml","stringifyYaml","join","tool","existsSync","readFileSync","parseYaml","mkdirSync","writeFileSync","stringifyYaml","path","fs","homedir","existsSync","readFileSync","resolve","path","tool","z","existsSync","writeFileSync","resolve","path","tool","z","existsSync","writeFileSync","mkdirSync","resolve","dirname","path","tool","z","existsSync","readdirSync","resolve","path","join","tool","z","existsSync","unlinkSync","resolve","path","tool","z","readFileSync","writeFileSync","resolve","path","tool","z","existsSync","statSync","resolve","path","tool","z","tool","z","tool","z","tool","z","parseYaml","meta","tool","z","tool","z","tool","z","cron","manifest","triggerType","tool","z","tool","z","tool","z","tool","z","execSync","path","tool","z","execSync","path","tool","z","execSync","path","tool","z","execSync","tool","z","execSync","tool","z","execSync","tool","z","existsSync","readFileSync","readdirSync","mkdirSync","writeFileSync","join","parseYaml","parseYaml","join","existsSync","mkdirSync","readdirSync","readFileSync","writeFileSync","chalk","path","existsSync","readFileSync","writeFileSync","unlinkSync","mkdirSync","join","process","chalk","join","path","existsSync","readFileSync","process","chalk","unlinkSync","mkdirSync","writeFileSync","existsSync","mkdirSync","writeFileSync","unlinkSync","join","homedir","chalk","execSync","existsSync","join","homedir","execSync","chalk","mkdirSync","logPath","writeFileSync","unlinkSync","resolve","chalk","readline","resolve"]}