@cosmicstack/mercury-agent 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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/ollama.ts","../src/providers/registry.ts","../src/core/agent.ts","../src/core/lifecycle.ts","../src/channels/cli.ts","../src/channels/base.ts","../src/utils/markdown.ts","../src/utils/arrow-select.ts","../src/core/scheduler.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/messaging/send-message.ts","../src/capabilities/filesystem/approve-scope.ts","../src/capabilities/shell/run-command.ts","../src/capabilities/shell/cd.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/github/create-pr.ts","../src/utils/github.ts","../src/capabilities/github/review-pr.ts","../src/capabilities/github/list-issues.ts","../src/capabilities/github/create-issue.ts","../src/capabilities/github/github-api.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","../src/utils/provider-models.ts"],"sourcesContent":["import { readFileSync, writeFileSync, existsSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, join } from 'node:path';\nimport { Command } from 'commander';\nimport readline from 'node:readline';\nimport chalk from 'chalk';\n\nimport {\n loadConfig,\n saveConfig,\n isSetupComplete,\n getMercuryHome,\n ensureCreatorField,\n clearTelegramAccess,\n isProviderConfigured,\n getTelegramAccessSummary,\n getTelegramApprovedUsers,\n getTelegramPendingRequests,\n approveTelegramPendingRequest,\n approveTelegramPendingRequestByPairingCode,\n rejectTelegramPendingRequest,\n removeTelegramUser,\n promoteTelegramUserToAdmin,\n demoteTelegramAdmin,\n hasTelegramAdmins,\n} from './utils/config.js';\nimport type { MercuryConfig } from './utils/config.js';\nimport type { ProviderName } 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';\nimport { setGitHubToken } from './utils/github.js';\nimport { selectWithArrowKeys } from './utils/arrow-select.js';\nimport { ProviderModelFetchError, fetchProviderModelCatalog } from './utils/provider-models.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkgVersion = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8')).version;\n\nfunction hr() {\n console.log(chalk.dim('─'.repeat(50)));\n}\n\nconst MERCURY_ASCII = [\n ' __ _____________ ________ ________ __',\n ' / |/ / ____/ __ \\\\/ ____/ / / / __ \\\\/ < /',\n ' / /|_/ / __/ / /_/ / / / / / / /_/ /\\\\ / ',\n ' / / / / /___/ _, _/ /___/ /_/ / _, _/ / / ',\n '/_/ /_/_____/_/ |_|\\\\____/\\\\____/_/ |_| /_/ ',\n].filter(l => l.trim());\n\nfunction banner() {\n console.log('');\n for (const line of MERCURY_ASCII) {\n 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(` v${pkgVersion} · by Cosmic Stack · mercury.cosmicstack.org`));\n console.log('');\n}\n\nfunction splashScreen() {\n console.log('');\n for (const line of MERCURY_ASCII) {\n 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\nconst PROVIDER_OPTIONS: Array<{ key: ProviderName; label: string }> = [\n { key: 'deepseek', label: 'DeepSeek' },\n { key: 'openai', label: 'OpenAI' },\n { key: 'anthropic', label: 'Anthropic' },\n { key: 'grok', label: 'Grok (xAI)' },\n { key: 'ollamaCloud', label: 'Ollama Cloud' },\n { key: 'ollamaLocal', label: 'Ollama Local' },\n];\n\nfunction getConfiguredProviderNames(config: MercuryConfig): ProviderName[] {\n return PROVIDER_OPTIONS\n .map((option) => option.key)\n .filter((key) => isProviderConfigured(config.providers[key]));\n}\n\nfunction getProviderLabel(name: ProviderName): string {\n return PROVIDER_OPTIONS.find((option) => option.key === name)?.label || name;\n}\n\nfunction parseProviderSelection(input: string): ProviderName[] | null {\n const values = input.split(/[\\s,]+/).map((value) => value.trim()).filter(Boolean);\n if (values.length === 0) return [];\n\n const selected: ProviderName[] = [];\n for (const value of values) {\n const index = parseInt(value, 10);\n if (isNaN(index) || index < 1 || index > PROVIDER_OPTIONS.length) {\n return null;\n }\n const provider = PROVIDER_OPTIONS[index - 1].key;\n if (!selected.includes(provider)) {\n selected.push(provider);\n }\n }\n return selected;\n}\n\nasync function chooseProvidersToConfigure(config: MercuryConfig, isReconfig: boolean): Promise<ProviderName[]> {\n const configured = getConfiguredProviderNames(config);\n\n while (true) {\n for (let i = 0; i < PROVIDER_OPTIONS.length; i++) {\n const option = PROVIDER_OPTIONS[i];\n const status = configured.includes(option.key) ? ' (configured)' : '';\n console.log(chalk.white(` ${i + 1}. ${option.label}${status}`));\n }\n console.log('');\n\n const prompt = isReconfig\n ? chalk.white(' Choose providers to configure [comma-separated, Enter keeps current]: ')\n : chalk.white(' Choose providers to configure [comma-separated, Enter for DeepSeek]: ');\n\n const input = await ask(prompt);\n const parsed = parseProviderSelection(input);\n if (parsed === null) {\n console.log(chalk.red(' Please choose valid provider numbers, like `1` or `1,3,5`.'));\n console.log('');\n continue;\n }\n\n if (parsed.length > 0) return parsed;\n if (!isReconfig) return ['deepseek'];\n return configured.length > 0 ? configured : ['deepseek'];\n }\n}\n\nasync function chooseDefaultProvider(config: MercuryConfig): Promise<void> {\n const configured = getConfiguredProviderNames(config);\n\n if (configured.length === 0) {\n return;\n }\n\n if (configured.length === 1) {\n config.providers.default = configured[0];\n console.log(chalk.dim(` Default provider set to ${getProviderLabel(configured[0])}`));\n return;\n }\n\n const suggested = configured.includes('deepseek') ? 'deepseek' : configured[0];\n\n console.log('');\n console.log(chalk.bold.white(' Default Provider'));\n console.log(chalk.dim(' Select the LLM provider Mercury should use first.'));\n console.log('');\n for (let i = 0; i < configured.length; i++) {\n const provider = configured[i];\n const recommended = provider === suggested ? ' (recommended)' : '';\n const current = provider === config.providers.default ? ' (current)' : '';\n console.log(chalk.white(` ${i + 1}. ${getProviderLabel(provider)}${recommended}${current}`));\n }\n console.log('');\n\n while (true) {\n const choice = await ask(chalk.white(` Choose [1-${configured.length}] [Enter for ${getProviderLabel(suggested)}]: `));\n if (!choice) {\n config.providers.default = suggested;\n return;\n }\n\n const num = parseInt(choice, 10);\n if (num >= 1 && num <= configured.length) {\n config.providers.default = configured[num - 1];\n return;\n }\n\n console.log(chalk.red(' Please choose a valid number from the list above.'));\n }\n}\n\nfunction looksLikeToken(value: string, minLength: number = 20): boolean {\n return value.length >= minLength && !/\\s/.test(value) && /[A-Za-z]/.test(value) && /\\d/.test(value);\n}\n\nfunction validateApiKey(provider: ProviderName, value: string): string | null {\n if (provider === 'openai') {\n return /^sk-(proj-|svcacct-)?[A-Za-z0-9_-]{16,}$/i.test(value)\n ? null\n : 'OpenAI keys must start with `sk-`, `sk-proj-`, or `sk-svcacct-`.';\n }\n\n if (provider === 'anthropic') {\n return /^sk-ant-[A-Za-z0-9_-]{16,}$/i.test(value)\n ? null\n : 'Anthropic keys must start with `sk-ant-`.';\n }\n\n if (provider === 'deepseek') {\n return /^sk-[A-Za-z0-9_-]{16,}$/i.test(value)\n ? null\n : 'DeepSeek keys must start with `sk-`.';\n }\n\n if (provider === 'grok') {\n return looksLikeToken(value)\n ? null\n : 'Grok keys must look like a real API token: long, no spaces, and not plain text.';\n }\n\n if (provider === 'ollamaCloud') {\n return looksLikeToken(value)\n ? null\n : 'Ollama Cloud keys must look like a real API token: long, no spaces, and not plain text.';\n }\n\n return null;\n}\n\nfunction validateBaseUrl(value: string): string | null {\n try {\n const parsed = new URL(value);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n return 'Base URL must start with http:// or https://.';\n }\n return null;\n } catch {\n return 'Please enter a valid URL.';\n }\n}\n\nfunction validateModelName(value: string): string | null {\n if (!value.trim()) return 'Model name is required.';\n if (/\\s/.test(value)) return 'Model name cannot contain spaces.';\n return null;\n}\n\nasync function chooseProviderModel(\n providerLabel: string,\n recommendedModel: string,\n models: string[],\n): Promise<string> {\n const selection = await selectWithArrowKeys(\n `${providerLabel} Models`,\n [\n {\n value: '__default__',\n label: `Use provider default (${recommendedModel})`,\n },\n ...models.map((model) => ({\n value: model,\n label: model,\n })),\n {\n value: '__custom__',\n label: 'Enter a custom model name',\n },\n ],\n );\n\n if (!selection || selection === '__default__') {\n return recommendedModel;\n }\n\n if (selection !== '__custom__') {\n return selection;\n }\n\n while (true) {\n const customModel = await ask(chalk.white(` ${providerLabel} model [Enter or \"none\" for ${recommendedModel}]: `));\n if (!customModel || customModel.toLowerCase() === 'none') {\n return recommendedModel;\n }\n\n const error = validateModelName(customModel);\n if (!error) {\n return customModel;\n }\n\n console.log(chalk.red(` ${error}`));\n }\n}\n\nasync function promptApiKeyWithModelSelection(\n config: MercuryConfig,\n provider: ProviderName,\n providerLabel: string,\n prompt: string,\n isReconfig: boolean,\n): Promise<{ apiKey?: string; model?: string; skipped: boolean }> {\n const existingConfig = config.providers[provider];\n\n while (true) {\n const value = await ask(prompt);\n if (!value) {\n if (isReconfig && existingConfig.apiKey) {\n return {\n apiKey: existingConfig.apiKey,\n model: existingConfig.model,\n skipped: true,\n };\n }\n\n return { skipped: true };\n }\n\n const formatError = validateApiKey(provider, value);\n if (formatError) {\n console.log(chalk.red(` ${formatError}`));\n continue;\n }\n\n console.log(chalk.dim(` Validating ${providerLabel} and fetching models...`));\n try {\n const catalog = await fetchProviderModelCatalog(provider, {\n ...existingConfig,\n apiKey: value,\n });\n const model = await chooseProviderModel(\n providerLabel,\n catalog.recommendedModel,\n catalog.models,\n );\n return { apiKey: value, model, skipped: false };\n } catch (error) {\n const message = error instanceof ProviderModelFetchError\n ? error.message\n : `Mercury could not fetch models for ${providerLabel}. Please re-enter the key.`;\n console.log(chalk.red(` ${message}`));\n }\n }\n}\n\nasync function promptOllamaLocalModelSelection(config: MercuryConfig): Promise<{ baseUrl?: string; model?: string; skipped: boolean }> {\n const existingConfig = config.providers.ollamaLocal;\n\n while (true) {\n const baseUrl = (await promptValidatedValue(\n chalk.white(` Ollama Local base URL [${existingConfig.baseUrl}]: `),\n validateBaseUrl,\n existingConfig.baseUrl,\n ))!;\n\n console.log(chalk.dim(' Fetching Ollama Local models...'));\n try {\n const catalog = await fetchProviderModelCatalog('ollamaLocal', {\n ...existingConfig,\n baseUrl,\n });\n const model = await chooseProviderModel(\n 'Ollama Local',\n catalog.recommendedModel,\n catalog.models,\n );\n return { baseUrl, model, skipped: false };\n } catch (error) {\n const message = error instanceof ProviderModelFetchError\n ? error.message\n : 'Mercury could not fetch Ollama Local models. Please check the base URL and try again.';\n console.log(chalk.red(` ${message}`));\n }\n }\n}\n\nasync function promptValidatedValue(\n prompt: string,\n validator: (value: string) => string | null,\n existingValue?: string,\n options?: { allowSkip?: boolean },\n): Promise<string | undefined> {\n while (true) {\n const value = await ask(prompt);\n if (!value) {\n if (existingValue) return existingValue;\n if (options?.allowSkip) return undefined;\n console.log(chalk.red(' A value is required here.'));\n continue;\n }\n\n const error = validator(value);\n if (!error) return value;\n\n console.log(chalk.red(` ${error}`));\n }\n}\n\nfunction appendToEnv(key: string, value: string): void {\n const envPath = join(getMercuryHome(), '.env');\n let envContent = '';\n if (existsSync(envPath)) {\n envContent = readFileSync(envPath, 'utf-8');\n }\n const lines = envContent.split('\\n').filter((l: string) => !l.startsWith(`${key}=`) && l.trim() !== '');\n lines.push(`${key}=${value}`);\n writeFileSync(envPath, lines.join('\\n') + '\\n', 'utf-8');\n process.env[key] = value;\n}\n\nfunction parseGithubRepo(input: string): { owner: string; repo: string } | null {\n const trimmed = input.trim().replace(/\\/+$/, '');\n const urlMatch = trimmed.match(/github\\.com\\/([^/]+)\\/([^/]+)/);\n if (urlMatch) return { owner: urlMatch[1], repo: urlMatch[2] };\n const shortMatch = trimmed.match(/^([^/\\s]+)\\/([^/\\s]+)$/);\n if (shortMatch) return { owner: shortMatch[1], repo: shortMatch[2] };\n return null;\n}\n\nfunction formatTelegramUser(user: {\n userId: number;\n username?: string;\n firstName?: string;\n}): string {\n const username = user.username ? ` (@${user.username})` : '';\n const firstName = user.firstName ? ` ${user.firstName}` : '';\n return `${user.userId}${username}${firstName}`;\n}\n\nfunction printTelegramAccessState(config: MercuryConfig): void {\n const admins = config.channels.telegram.admins;\n const members = config.channels.telegram.members;\n const pending = config.channels.telegram.pending;\n const pendingSummary = pending.length > 0\n ? pending.map((entry) => {\n const code = entry.pairingCode ? ` [code: ${entry.pairingCode}]` : '';\n return `${formatTelegramUser(entry)}${code}`;\n }).join(', ')\n : '';\n\n console.log('');\n console.log(` Telegram Access: ${chalk.white(getTelegramAccessSummary(config))}`);\n console.log(` Admins: ${admins.length > 0 ? chalk.green(admins.map(formatTelegramUser).join(', ')) : chalk.dim('none')}`);\n console.log(` Members: ${members.length > 0 ? chalk.green(members.map(formatTelegramUser).join(', ')) : chalk.dim('none')}`);\n console.log(` Pending: ${pending.length > 0 ? chalk.yellow(pendingSummary) : chalk.dim('none')}`);\n}\n\nfunction restartDaemonIfRunning(message?: string): void {\n const daemon = getDaemonStatus();\n if (!daemon.running) return;\n\n if (message) {\n console.log(chalk.dim(` ${message}`));\n }\n restartDaemon();\n}\n\nasync function completeInitialTelegramPairing(config: MercuryConfig): Promise<void> {\n if (!config.channels.telegram.enabled || !config.channels.telegram.botToken || hasTelegramAdmins(config)) {\n return;\n }\n\n console.log('');\n console.log(chalk.bold.white(' Telegram Pairing'));\n console.log(chalk.dim(' 1. Open Telegram and message your bot.'));\n console.log(chalk.dim(' 2. Send /start to receive your pairing code in Telegram.'));\n console.log(chalk.dim(' 3. Paste that pairing code below to finish setup.'));\n console.log('');\n\n const telegram = new TelegramChannel(config);\n try {\n await telegram.start();\n\n while (true) {\n const pairingCode = await ask(chalk.white(' Telegram Pairing Code: '));\n if (!pairingCode) {\n console.log(chalk.red(' Telegram pairing code is required to continue.'));\n continue;\n }\n\n const approved = approveTelegramPendingRequestByPairingCode(config, pairingCode);\n if (!approved) {\n console.log(chalk.red(' That pairing code is not valid yet. Send /start in Telegram, then paste the exact code here.'));\n continue;\n }\n\n saveConfig(config);\n console.log(chalk.green(` ✓ Telegram paired. First admin: ${formatTelegramUser(approved)}.`));\n console.log('');\n break;\n }\n } finally {\n await telegram.stop();\n }\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(' Choose which providers to configure now. Existing values are shown where available.'));\n } else {\n console.log(chalk.dim(' Choose one or more providers. Press Enter to configure DeepSeek by default.'));\n }\n console.log('');\n\n while (true) {\n const selectedProviders = await chooseProvidersToConfigure(config, isReconfig);\n console.log('');\n\n for (const provider of selectedProviders) {\n if (provider === 'deepseek') {\n const mask = isReconfig && config.providers.deepseek.apiKey ? ` [${maskKey(config.providers.deepseek.apiKey)}]` : '';\n const result = await promptApiKeyWithModelSelection(\n config,\n 'deepseek',\n 'DeepSeek',\n chalk.white(` DeepSeek API key${mask}${isReconfig ? '' : ' (Enter to skip)'}: `),\n isReconfig,\n );\n if (!result.skipped && result.apiKey && result.model) {\n config.providers.deepseek.apiKey = result.apiKey;\n config.providers.deepseek.model = result.model;\n config.providers.deepseek.enabled = true;\n }\n continue;\n }\n\n if (provider === 'openai') {\n const mask = isReconfig && config.providers.openai.apiKey ? ` [${maskKey(config.providers.openai.apiKey)}]` : '';\n const result = await promptApiKeyWithModelSelection(\n config,\n 'openai',\n 'OpenAI',\n chalk.white(` OpenAI API key${mask}${isReconfig ? '' : ' (Enter to skip)'}: `),\n isReconfig,\n );\n if (!result.skipped && result.apiKey && result.model) {\n config.providers.openai.apiKey = result.apiKey;\n config.providers.openai.model = result.model;\n config.providers.openai.enabled = true;\n }\n continue;\n }\n\n if (provider === 'anthropic') {\n const mask = isReconfig && config.providers.anthropic.apiKey ? ` [${maskKey(config.providers.anthropic.apiKey)}]` : '';\n const result = await promptApiKeyWithModelSelection(\n config,\n 'anthropic',\n 'Anthropic',\n chalk.white(` Anthropic API key${mask}${isReconfig ? '' : ' (Enter to skip)'}: `),\n isReconfig,\n );\n if (!result.skipped && result.apiKey && result.model) {\n config.providers.anthropic.apiKey = result.apiKey;\n config.providers.anthropic.model = result.model;\n config.providers.anthropic.enabled = true;\n }\n continue;\n }\n\n if (provider === 'grok') {\n const mask = isReconfig && config.providers.grok.apiKey ? ` [${maskKey(config.providers.grok.apiKey)}]` : '';\n const result = await promptApiKeyWithModelSelection(\n config,\n 'grok',\n 'Grok',\n chalk.white(` Grok API key${mask}${isReconfig ? '' : ' (Enter to skip)'}: `),\n isReconfig,\n );\n if (!result.skipped && result.apiKey && result.model) {\n config.providers.grok.apiKey = result.apiKey;\n config.providers.grok.model = result.model;\n config.providers.grok.enabled = true;\n }\n continue;\n }\n\n if (provider === 'ollamaCloud') {\n const mask = isReconfig && config.providers.ollamaCloud.apiKey ? ` [${maskKey(config.providers.ollamaCloud.apiKey)}]` : '';\n const result = await promptApiKeyWithModelSelection(\n config,\n 'ollamaCloud',\n 'Ollama Cloud',\n chalk.white(` Ollama Cloud API key${mask}${isReconfig ? '' : ' (Enter to skip)'}: `),\n isReconfig,\n );\n if (!result.skipped && result.apiKey && result.model) {\n config.providers.ollamaCloud.apiKey = result.apiKey;\n config.providers.ollamaCloud.model = result.model;\n config.providers.ollamaCloud.enabled = true;\n }\n continue;\n }\n\n if (provider === 'ollamaLocal') {\n const result = await promptOllamaLocalModelSelection(config);\n if (!result.skipped && result.baseUrl && result.model) {\n config.providers.ollamaLocal.baseUrl = result.baseUrl;\n config.providers.ollamaLocal.model = result.model;\n config.providers.ollamaLocal.enabled = true;\n }\n }\n }\n\n const configuredProviders = getConfiguredProviderNames(config);\n if (configuredProviders.length === 0) {\n console.log(chalk.red(' You need to configure at least one LLM provider to continue.'));\n console.log(chalk.dim(' Let’s try that step again.'));\n console.log('');\n continue;\n }\n\n await chooseDefaultProvider(config);\n break;\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 console.log(chalk.dim(' To create a bot token:'));\n console.log(chalk.dim(' 1. Open Telegram and message @BotFather'));\n console.log(chalk.dim(' 2. Run /newbot and follow the prompts'));\n console.log(chalk.dim(' 3. Copy the bot token BotFather gives you'));\n console.log(chalk.dim(' 4. Paste that token here'));\n console.log(chalk.dim(' After setup, users send /start to request access.'));\n console.log(chalk.dim(' The first Telegram user gets a pairing code, and you approve that code from the CLI.'));\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 clearTelegramAccess(config);\n } else if (telegramToken) {\n if (telegramToken !== config.channels.telegram.botToken) {\n clearTelegramAccess(config);\n }\n config.channels.telegram.botToken = telegramToken;\n config.channels.telegram.enabled = true;\n }\n\n await completeInitialTelegramPairing(config);\n\n hr();\n console.log('');\n console.log(chalk.bold.white(' GitHub Integration (optional)'));\n console.log(chalk.dim(' Connect Mercury to GitHub so it can create PRs, manage issues,'));\n console.log(chalk.dim(' review code, and co-author commits on your behalf.'));\n console.log(chalk.dim(' Leave empty to skip. You can add it later with mercury doctor.'));\n console.log('');\n\n const ghUserCurrent = isReconfig && config.github.username ? ` [${config.github.username}]` : '';\n const ghUsername = await ask(chalk.white(` 1. Your GitHub username${ghUserCurrent}: `));\n if (ghUsername) config.github.username = ghUsername;\n\n if (!config.github.email) {\n config.github.email = 'mercury@cosmicstack.org';\n }\n\n console.log('');\n console.log(chalk.dim(' You need a Personal Access Token (PAT) with repo access.'));\n console.log(chalk.dim(' Fine-grained (recommended): github.com/settings/personal-access-tokens/new'));\n console.log(chalk.dim(' → Permissions: Contents (R/W), Pull requests (R/W), Issues (R/W)'));\n console.log(chalk.dim(' Classic: github.com/settings/tokens/new'));\n console.log(chalk.dim(' → Scope: repo (full control)'));\n const ghTokenCurrent = process.env.GITHUB_TOKEN ? ` [${maskKey(process.env.GITHUB_TOKEN)}]` : '';\n const ghToken = await ask(chalk.white(` 2. GitHub PAT${ghTokenCurrent}: `));\n if (ghToken) {\n appendToEnv('GITHUB_TOKEN', ghToken);\n }\n\n if (config.github.username || process.env.GITHUB_TOKEN) {\n console.log('');\n console.log(chalk.dim(' Set a default repo so you can say \"create an issue\" without'));\n console.log(chalk.dim(' specifying the repo every time. Enter owner/name or a full URL.'));\n console.log(chalk.dim(' Example: hotheadhacker/mercury-agent'));\n console.log(chalk.dim(' Example: https://github.com/hotheadhacker/mercury-agent'));\n const ghOwnerCurrent = isReconfig && config.github.defaultOwner ? ` [${config.github.defaultOwner}/${config.github.defaultRepo}]` : '';\n const ghRepoInput = await ask(chalk.white(` 3. Default repo${ghOwnerCurrent}: `));\n if (ghRepoInput) {\n const parsed = parseGithubRepo(ghRepoInput);\n if (parsed) {\n config.github.defaultOwner = parsed.owner;\n config.github.defaultRepo = parsed.repo;\n } else {\n console.log(chalk.yellow(' Could not parse repo. Use format: owner/repo or a GitHub URL.'));\n }\n }\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 providers.');\n return;\n }\n console.log(chalk.red(' No LLM providers available. Run `mercury doctor` to configure providers.'));\n process.exit(1);\n }\n\n const available = providers.listAvailable();\n const providerLabels = available.map((provider) => getProviderLabel(provider as ProviderName));\n const providerModels = available.map((provider) => {\n const key = provider as ProviderName;\n return `${getProviderLabel(key)}: ${config.providers[key].model}`;\n });\n if (!isDaemon) {\n console.log(chalk.dim(` Providers: ${providerLabels.join(', ')}`));\n console.log(chalk.dim(` Models: ${providerModels.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 { channelId, channelType } = capabilities.getChannelContext();\n const telegram = channels.get('telegram');\n\n if (channelType === 'telegram' && telegram) {\n await telegram.sendFile(filePath, channelId);\n return;\n }\n\n if (config.channels.telegram.enabled && telegram && getTelegramApprovedUsers(config).length > 0) {\n await telegram.sendFile(filePath);\n return;\n }\n\n const cli = channels.get('cli');\n if (cli) {\n await cli.sendFile(filePath);\n }\n });\n\n capabilities.setSendMessageHandler(async (content: string) => {\n const telegram = channels.get('telegram');\n\n if (!config.channels.telegram.enabled || !telegram) {\n throw new Error('Telegram is not configured. Add a bot token in setup or run `mercury doctor`.');\n }\n\n if (getTelegramApprovedUsers(config).length === 0) {\n throw new Error('Telegram has no approved users. Ask someone to send /start, then approve the request from Mercury.');\n }\n\n await telegram.send(content);\n });\n if (process.env.GITHUB_TOKEN) {\n setGitHubToken(process.env.GITHUB_TOKEN);\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 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(pkgVersion)\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(getProviderLabel(config.providers.default))}`);\n console.log(` Telegram: ${config.channels.telegram.enabled ? chalk.green('enabled') : chalk.dim('disabled')}`);\n console.log(` Telegram Access: ${chalk.white(getTelegramAccessSummary(config))}`);\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 printTelegramAccessState(config);\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 telegramCmd = program\n .command('telegram')\n .description('Manage Telegram access approvals and admins');\n\ntelegramCmd\n .command('list')\n .description('Show approved Telegram users and pending access requests')\n .action(() => {\n const config = loadConfig();\n console.log('');\n printTelegramAccessState(config);\n console.log('');\n });\n\ntelegramCmd\n .command('approve <codeOrUserId>')\n .description('Approve a pending Telegram access request by pairing code or user ID')\n .action((codeOrUserId: string) => {\n const config = loadConfig();\n const hasAdmins = hasTelegramAdmins(config);\n\n if (!hasAdmins) {\n const approved = approveTelegramPendingRequestByPairingCode(config, codeOrUserId.trim());\n if (!approved) {\n console.log('');\n console.log(chalk.red(` No pending first-time Telegram pairing found for code ${codeOrUserId}.`));\n console.log('');\n return;\n }\n\n saveConfig(config);\n console.log('');\n console.log(chalk.green(` ✓ Approved first Telegram admin ${formatTelegramUser(approved)}.`));\n restartDaemonIfRunning('Restarting the background daemon to apply the change immediately...');\n console.log('');\n return;\n }\n\n const targetUserId = Number(codeOrUserId);\n if (isNaN(targetUserId)) {\n console.log('');\n console.log(chalk.red(' Please provide a numeric Telegram user ID once Telegram already has an admin.'));\n console.log('');\n return;\n }\n\n const approved = approveTelegramPendingRequest(config, targetUserId, 'member');\n if (!approved) {\n console.log('');\n console.log(chalk.red(` No pending Telegram request found for user ${codeOrUserId}.`));\n console.log('');\n return;\n }\n\n saveConfig(config);\n console.log('');\n console.log(chalk.green(` ✓ Approved Telegram member ${formatTelegramUser(approved)}.`));\n restartDaemonIfRunning('Restarting the background daemon to apply the change immediately...');\n console.log('');\n });\n\ntelegramCmd\n .command('reject <userId>')\n .description('Reject a pending Telegram access request')\n .action((userId: string) => {\n const config = loadConfig();\n const targetUserId = Number(userId);\n if (isNaN(targetUserId)) {\n console.log('');\n console.log(chalk.red(' Please provide a numeric Telegram user ID.'));\n console.log('');\n return;\n }\n\n const rejected = rejectTelegramPendingRequest(config, targetUserId);\n if (!rejected) {\n console.log('');\n console.log(chalk.red(` No pending Telegram request found for user ${userId}.`));\n console.log('');\n return;\n }\n\n saveConfig(config);\n console.log('');\n console.log(chalk.green(` ✓ Rejected Telegram request for ${formatTelegramUser(rejected)}.`));\n restartDaemonIfRunning('Restarting the background daemon to apply the change immediately...');\n console.log('');\n });\n\ntelegramCmd\n .command('remove <userId>')\n .description('Remove an approved Telegram admin or member')\n .action((userId: string) => {\n const config = loadConfig();\n const targetUserId = Number(userId);\n if (isNaN(targetUserId)) {\n console.log('');\n console.log(chalk.red(' Please provide a numeric Telegram user ID.'));\n console.log('');\n return;\n }\n\n const removed = removeTelegramUser(config, targetUserId);\n if (!removed) {\n console.log('');\n console.log(chalk.red(` No approved Telegram user found for ${userId}.`));\n console.log('');\n return;\n }\n\n saveConfig(config);\n console.log('');\n console.log(chalk.green(` ✓ Removed Telegram access for ${formatTelegramUser(removed)}.`));\n restartDaemonIfRunning('Restarting the background daemon to apply the change immediately...');\n console.log('');\n });\n\ntelegramCmd\n .command('promote <userId>')\n .description('Promote an approved Telegram member to admin')\n .action((userId: string) => {\n const config = loadConfig();\n const targetUserId = Number(userId);\n if (isNaN(targetUserId)) {\n console.log('');\n console.log(chalk.red(' Please provide a numeric Telegram user ID.'));\n console.log('');\n return;\n }\n\n const promoted = promoteTelegramUserToAdmin(config, targetUserId);\n if (!promoted) {\n console.log('');\n console.log(chalk.red(` No Telegram member found for ${userId}.`));\n console.log('');\n return;\n }\n\n saveConfig(config);\n console.log('');\n console.log(chalk.green(` ✓ Promoted ${formatTelegramUser(promoted)} to Telegram admin.`));\n restartDaemonIfRunning('Restarting the background daemon to apply the change immediately...');\n console.log('');\n });\n\ntelegramCmd\n .command('demote <userId>')\n .description('Demote a Telegram admin to member')\n .action((userId: string) => {\n const config = loadConfig();\n const targetUserId = Number(userId);\n if (isNaN(targetUserId)) {\n console.log('');\n console.log(chalk.red(' Please provide a numeric Telegram user ID.'));\n console.log('');\n return;\n }\n\n const demoted = demoteTelegramAdmin(config, targetUserId);\n if (!demoted) {\n console.log('');\n console.log(chalk.red(' Could not demote that Telegram admin. Mercury must keep at least one admin.'));\n console.log('');\n return;\n }\n\n saveConfig(config);\n console.log('');\n console.log(chalk.green(` ✓ Demoted ${formatTelegramUser(demoted)} to Telegram member.`));\n restartDaemonIfRunning('Restarting the background daemon to apply the change immediately...');\n console.log('');\n });\n\ntelegramCmd\n .command('unpair')\n .description('Reset all Telegram access for this Mercury instance')\n .action(() => {\n const config = loadConfig();\n const hasAnyAccess = getTelegramApprovedUsers(config).length > 0 || getTelegramPendingRequests(config).length > 0;\n if (!hasAnyAccess) {\n console.log('');\n console.log(chalk.dim(' Telegram access is already empty.'));\n console.log('');\n return;\n }\n\n clearTelegramAccess(config);\n saveConfig(config);\n\n console.log('');\n console.log(chalk.green(' ✓ Telegram access reset.'));\n restartDaemonIfRunning('Restarting the background daemon to apply the change immediately...');\n if (!getDaemonStatus().running) {\n console.log(chalk.dim(' New private Telegram users can send /start to request access.'));\n console.log(chalk.dim(' The first request must be approved from the CLI with `mercury telegram approve <pairing-code>`.'));\n }\n console.log('');\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();\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { config as loadDotenv } from 'dotenv';\n\nconst MERCURY_HOME = join(homedir(), '.mercury');\n\nloadDotenv();\nconst mercuryEnvPath = join(MERCURY_HOME, '.env');\nif (existsSync(mercuryEnvPath)) {\n loadDotenv({ path: mercuryEnvPath });\n}\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 TelegramAccessUser {\n userId: number;\n chatId: number;\n username?: string;\n firstName?: string;\n requestedAt?: string;\n approvedAt: string;\n}\n\nexport interface TelegramPendingRequest {\n userId: number;\n chatId: number;\n username?: string;\n firstName?: string;\n requestedAt: string;\n pairingCode?: string;\n}\n\nexport type ProviderName =\n | 'openai'\n | 'anthropic'\n | 'deepseek'\n | 'grok'\n | 'ollamaCloud'\n | 'ollamaLocal';\n\nexport interface MercuryConfig {\n identity: {\n name: string;\n owner: string;\n creator?: string;\n };\n providers: {\n default: ProviderName;\n openai: ProviderConfig;\n anthropic: ProviderConfig;\n deepseek: ProviderConfig;\n grok: ProviderConfig;\n ollamaCloud: ProviderConfig;\n ollamaLocal: ProviderConfig;\n };\n channels: {\n telegram: {\n enabled: boolean;\n botToken: string;\n webhookUrl?: string;\n allowedChatIds?: number[];\n streaming?: boolean;\n admins: TelegramAccessUser[];\n members: TelegramAccessUser[];\n pending: TelegramPendingRequest[];\n pairedUserId?: number;\n pairedChatId?: number;\n pairedUsername?: string;\n };\n };\n github: {\n username: string;\n email: string;\n defaultOwner: string;\n defaultRepo: string;\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', 'deepseek') as ProviderName,\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 grok: {\n name: 'grok',\n apiKey: getEnv('GROK_API_KEY', ''),\n baseUrl: getEnv('GROK_BASE_URL', 'https://api.x.ai/v1'),\n model: getEnv('GROK_MODEL', 'grok-4'),\n enabled: getEnvBool('GROK_ENABLED', true),\n },\n ollamaCloud: {\n name: 'ollamaCloud',\n apiKey: getEnv('OLLAMA_CLOUD_API_KEY', ''),\n baseUrl: getEnv('OLLAMA_CLOUD_BASE_URL', 'https://ollama.com/api'),\n model: getEnv('OLLAMA_CLOUD_MODEL', 'gpt-oss:120b'),\n enabled: getEnvBool('OLLAMA_CLOUD_ENABLED', true),\n },\n ollamaLocal: {\n name: 'ollamaLocal',\n apiKey: '',\n baseUrl: getEnv('OLLAMA_LOCAL_BASE_URL', 'http://127.0.0.1:11434/api'),\n model: getEnv('OLLAMA_LOCAL_MODEL', 'gpt-oss:20b'),\n enabled: getEnvBool('OLLAMA_LOCAL_ENABLED', false),\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 admins: [],\n members: [],\n pending: [],\n },\n },\n github: {\n username: getEnv('GITHUB_USERNAME', ''),\n email: getEnv('GITHUB_EMAIL', 'mercury@cosmicstack.org'),\n defaultOwner: getEnv('GITHUB_DEFAULT_OWNER', ''),\n defaultRepo: getEnv('GITHUB_DEFAULT_REPO', ''),\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 migrateLegacyTelegramAccess(deepMerge(defaults, fileConfig));\n }\n return migrateLegacyTelegramAccess(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' && isProviderConfigured(p));\n}\n\nexport function isProviderConfigured(provider: ProviderConfig): boolean {\n if (!provider.enabled) return false;\n if (provider.name === 'ollamaLocal') {\n return provider.baseUrl.length > 0 && provider.model.length > 0;\n }\n return provider.apiKey.length > 0;\n}\n\nexport function getTelegramApprovedUsers(config: MercuryConfig): TelegramAccessUser[] {\n return [\n ...config.channels.telegram.admins,\n ...config.channels.telegram.members,\n ];\n}\n\nexport function getTelegramApprovedChatIds(config: MercuryConfig): number[] {\n return [...new Set(getTelegramApprovedUsers(config).map((user) => user.chatId))];\n}\n\nexport function getTelegramAdmins(config: MercuryConfig): TelegramAccessUser[] {\n return config.channels.telegram.admins;\n}\n\nexport function getTelegramPendingRequests(config: MercuryConfig): TelegramPendingRequest[] {\n return config.channels.telegram.pending;\n}\n\nexport function findTelegramApprovedUser(config: MercuryConfig, userId: number): TelegramAccessUser | undefined {\n return getTelegramApprovedUsers(config).find((user) => user.userId === userId);\n}\n\nexport function findTelegramAdmin(config: MercuryConfig, userId: number): TelegramAccessUser | undefined {\n return config.channels.telegram.admins.find((user) => user.userId === userId);\n}\n\nexport function findTelegramPendingRequest(config: MercuryConfig, userId: number): TelegramPendingRequest | undefined {\n return config.channels.telegram.pending.find((request) => request.userId === userId);\n}\n\nexport function findTelegramPendingRequestByPairingCode(\n config: MercuryConfig,\n pairingCode: string,\n): TelegramPendingRequest | undefined {\n return config.channels.telegram.pending.find((request) => request.pairingCode === pairingCode);\n}\n\nexport function hasTelegramAdmins(config: MercuryConfig): boolean {\n return config.channels.telegram.admins.length > 0;\n}\n\nexport function getTelegramAccessSummary(config: MercuryConfig): string {\n return `${config.channels.telegram.admins.length} admin${config.channels.telegram.admins.length === 1 ? '' : 's'}, `\n + `${config.channels.telegram.members.length} member${config.channels.telegram.members.length === 1 ? '' : 's'}, `\n + `${config.channels.telegram.pending.length} pending`;\n}\n\nexport function addTelegramPendingRequest(\n config: MercuryConfig,\n request: Omit<TelegramPendingRequest, 'requestedAt'> & { requestedAt?: string },\n): TelegramPendingRequest {\n const existing = findTelegramPendingRequest(config, request.userId);\n if (existing) {\n existing.chatId = request.chatId;\n existing.username = request.username || existing.username;\n existing.firstName = request.firstName || existing.firstName;\n existing.pairingCode = request.pairingCode || existing.pairingCode;\n return existing;\n }\n\n const created: TelegramPendingRequest = {\n ...request,\n requestedAt: request.requestedAt || new Date().toISOString(),\n };\n config.channels.telegram.pending.push(created);\n return created;\n}\n\nexport function approveTelegramPendingRequest(\n config: MercuryConfig,\n userId: number,\n role: 'admin' | 'member' = 'member',\n): TelegramAccessUser | null {\n const request = findTelegramPendingRequest(config, userId);\n if (!request) return null;\n\n const approvedUser: TelegramAccessUser = {\n userId: request.userId,\n chatId: request.chatId,\n username: request.username,\n firstName: request.firstName,\n requestedAt: request.requestedAt,\n approvedAt: new Date().toISOString(),\n };\n\n config.channels.telegram.pending = config.channels.telegram.pending\n .filter((entry) => entry.userId !== userId);\n config.channels.telegram.admins = config.channels.telegram.admins\n .filter((entry) => entry.userId !== userId);\n config.channels.telegram.members = config.channels.telegram.members\n .filter((entry) => entry.userId !== userId);\n\n if (role === 'admin') {\n config.channels.telegram.admins.push(approvedUser);\n } else {\n config.channels.telegram.members.push(approvedUser);\n }\n\n return approvedUser;\n}\n\nexport function approveTelegramPendingRequestByPairingCode(\n config: MercuryConfig,\n pairingCode: string,\n): TelegramAccessUser | null {\n const request = findTelegramPendingRequestByPairingCode(config, pairingCode);\n if (!request) return null;\n const role = hasTelegramAdmins(config) ? 'member' : 'admin';\n return approveTelegramPendingRequest(config, request.userId, role);\n}\n\nexport function rejectTelegramPendingRequest(config: MercuryConfig, userId: number): TelegramPendingRequest | null {\n const request = findTelegramPendingRequest(config, userId);\n if (!request) return null;\n config.channels.telegram.pending = config.channels.telegram.pending\n .filter((entry) => entry.userId !== userId);\n return request;\n}\n\nexport function removeTelegramUser(config: MercuryConfig, userId: number): TelegramAccessUser | null {\n const admin = config.channels.telegram.admins.find((entry) => entry.userId === userId);\n if (admin) {\n config.channels.telegram.admins = config.channels.telegram.admins\n .filter((entry) => entry.userId !== userId);\n return admin;\n }\n\n const member = config.channels.telegram.members.find((entry) => entry.userId === userId);\n if (member) {\n config.channels.telegram.members = config.channels.telegram.members\n .filter((entry) => entry.userId !== userId);\n return member;\n }\n\n return null;\n}\n\nexport function promoteTelegramUserToAdmin(config: MercuryConfig, userId: number): TelegramAccessUser | null {\n const member = config.channels.telegram.members.find((entry) => entry.userId === userId);\n if (!member) return null;\n config.channels.telegram.members = config.channels.telegram.members\n .filter((entry) => entry.userId !== userId);\n config.channels.telegram.admins.push(member);\n return member;\n}\n\nexport function demoteTelegramAdmin(config: MercuryConfig, userId: number): TelegramAccessUser | null {\n if (config.channels.telegram.admins.length <= 1) {\n return null;\n }\n\n const admin = config.channels.telegram.admins.find((entry) => entry.userId === userId);\n if (!admin) return null;\n config.channels.telegram.admins = config.channels.telegram.admins\n .filter((entry) => entry.userId !== userId);\n config.channels.telegram.members.push(admin);\n return admin;\n}\n\nexport function clearTelegramAccess(config: MercuryConfig): MercuryConfig {\n config.channels.telegram.admins = [];\n config.channels.telegram.members = [];\n config.channels.telegram.pending = [];\n delete config.channels.telegram.pairedUserId;\n delete config.channels.telegram.pairedChatId;\n delete config.channels.telegram.pairedUsername;\n return config;\n}\n\nexport function clearTelegramPairing(config: MercuryConfig): MercuryConfig {\n return clearTelegramAccess(config);\n}\n\nexport function migrateLegacyTelegramAccess(config: MercuryConfig): MercuryConfig {\n const telegram = config.channels.telegram;\n telegram.admins = telegram.admins || [];\n telegram.members = telegram.members || [];\n telegram.pending = telegram.pending || [];\n\n if (\n telegram.admins.length === 0\n && telegram.members.length === 0\n && typeof telegram.pairedUserId === 'number'\n && typeof telegram.pairedChatId === 'number'\n ) {\n telegram.admins.push({\n userId: telegram.pairedUserId,\n chatId: telegram.pairedChatId,\n username: telegram.pairedUsername,\n approvedAt: new Date().toISOString(),\n });\n }\n\n delete telegram.pairedUserId;\n delete telegram.pairedChatId;\n delete telegram.pairedUsername;\n\n return config;\n}\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 { createOllama } from 'ollama-ai-provider';\nimport { BaseProvider } from './base.js';\nimport type { ProviderConfig } from '../utils/config.js';\n\nexport class OllamaProvider extends BaseProvider {\n readonly name: string;\n readonly model: string;\n private client: ReturnType<typeof createOllama>;\n private modelInstance: any;\n\n constructor(config: ProviderConfig) {\n super(config);\n this.name = config.name;\n this.model = config.model;\n\n const headers = config.apiKey\n ? { Authorization: `Bearer ${config.apiKey}` }\n : undefined;\n\n this.client = createOllama({\n baseURL: config.baseUrl,\n headers,\n });\n this.modelInstance = this.client(config.model);\n }\n\n async generateText(_prompt: string, _systemPrompt: string): Promise<never> {\n throw new Error('Use getModelInstance() with the AI SDK agent loop');\n }\n\n async *streamText(_prompt: string, _systemPrompt: string): AsyncIterable<never> {\n throw new Error('Use getModelInstance() with the AI SDK agent loop');\n }\n\n isAvailable(): boolean {\n if (!this.config.enabled) return false;\n if (this.name === 'ollamaLocal') {\n return this.config.baseUrl.length > 0 && this.config.model.length > 0;\n }\n return this.config.apiKey.length > 0;\n }\n\n getModelInstance() {\n return this.modelInstance;\n }\n}\n","import type { MercuryConfig, ProviderConfig } from '../utils/config.js';\nimport { isProviderConfigured } from '../utils/config.js';\nimport type { BaseProvider } from './base.js';\nimport { OpenAICompatProvider } from './openai-compat.js';\nimport { AnthropicProvider } from './anthropic.js';\nimport { OllamaProvider } from './ollama.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.deepseek,\n config.providers.openai,\n config.providers.anthropic,\n config.providers.grok,\n config.providers.ollamaCloud,\n config.providers.ollamaLocal,\n ];\n\n for (const pc of entries) {\n if (!isProviderConfigured(pc)) continue;\n try {\n let provider: BaseProvider;\n if (pc.name === 'anthropic') {\n provider = new AnthropicProvider(pc);\n } else if (pc.name === 'ollamaCloud' || pc.name === 'ollamaLocal') {\n provider = new OllamaProvider(pc);\n } else {\n provider = new OpenAICompatProvider(pc);\n }\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}\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';\nimport { CLIChannel } from '../channels/cli.js';\nimport type { ArrowSelectOption } from '../utils/arrow-select.js';\nimport {\n approveTelegramPendingRequest,\n approveTelegramPendingRequestByPairingCode,\n clearTelegramAccess,\n demoteTelegramAdmin,\n getTelegramAccessSummary,\n getTelegramApprovedUsers,\n getTelegramPendingRequests,\n promoteTelegramUserToAdmin,\n rejectTelegramPendingRequest,\n removeTelegramUser,\n saveConfig,\n} from '../utils/config.js';\n\nclass ToolCallLoopDetector {\n private recentCalls: Array<{ tool: string; params: string }> = [];\n private maxEntries = 10;\n\n record(toolName: string, params: Record<string, any>): void {\n const paramsKey = JSON.stringify(params).slice(0, 100);\n this.recentCalls.push({ tool: toolName, params: paramsKey });\n if (this.recentCalls.length > this.maxEntries) {\n this.recentCalls.shift();\n }\n }\n\n detect(): { tool: string; count: number } | null {\n if (this.recentCalls.length < 3) return null;\n\n const last = this.recentCalls[this.recentCalls.length - 1];\n let consecutiveCount = 0;\n for (let i = this.recentCalls.length - 1; i >= 0; i--) {\n if (this.recentCalls[i].tool === last.tool && this.recentCalls[i].params === last.params) {\n consecutiveCount++;\n } else {\n break;\n }\n }\n\n if (consecutiveCount >= 3) {\n return { tool: last.tool, count: consecutiveCount };\n }\n\n const lastTool = last.tool;\n let toolCount = 0;\n for (let i = this.recentCalls.length - 1; i >= 0; i--) {\n if (this.recentCalls[i].tool === lastTool) {\n toolCount++;\n } else {\n break;\n }\n }\n if (toolCount >= 4) {\n return { tool: lastTool, count: toolCount };\n }\n\n return null;\n }\n\n reset(): void {\n this.recentCalls = [];\n }\n}\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 const recentSteps = this.shortTerm.getRecent(msg.channelId, 4);\n let loopWarning: string | null = null;\n if (recentSteps.length >= 3) {\n const toolCallPattern = /\\[Using: (.+?)\\]/g;\n const toolCalls: string[] = [];\n for (const m of recentSteps) {\n if (m.role === 'assistant') {\n let match;\n while ((match = toolCallPattern.exec(m.content)) !== null) {\n toolCalls.push(match[1]);\n }\n }\n }\n if (toolCalls.length >= 3) {\n const last3 = toolCalls.slice(-3);\n if (last3[0] === last3[1] && last3[1] === last3[2]) {\n loopWarning = `[SYSTEM WARNING] You have called ${last3[0]} 3+ times in a row with the same result. Stop repeating this call. Try a different approach — if you're failing on permissions, try a different path. If you're failing on git push auth, use github_api with PUT /repos/{owner}/{repo}/contents/{path} to push files directly through the API.`;\n }\n }\n }\n\n if (loopWarning) {\n messages.push({ role: 'user', content: loopWarning });\n messages.push({ role: 'assistant', content: 'Understood. I will try a different approach.' });\n }\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 const loopDetector = new ToolCallLoopDetector();\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 for (const tc of toolCalls) {\n loopDetector.record(tc.toolName, tc.args as Record<string, any>);\n }\n const loop = loopDetector.detect();\n if (loop) {\n logger.warn({ tool: loop.tool, count: loop.count }, 'Tool call loop detected');\n }\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 for (const tc of toolCalls) {\n loopDetector.record(tc.toolName, tc.args as Record<string, any>);\n }\n const loop = loopDetector.detect();\n if (loop) {\n logger.warn({ tool: loop.tool, count: loop.count }, 'Tool call loop detected');\n }\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\n prompt += `\\n\\nEnvironment:\\n- Platform: ${process.platform}\\n- Working directory: ${this.capabilities.getCwd()}`;\n\n const toolNames = this.capabilities.getToolNames();\n const githubTools = ['create_pr', 'review_pr', 'list_issues', 'create_issue', 'github_api'];\n const hasGitHub = githubTools.some(t => toolNames.includes(t));\n if (hasGitHub) {\n let githubHint = '\\n\\nGitHub companion is active.';\n const { defaultOwner, defaultRepo } = this.config.github;\n if (defaultOwner && defaultRepo) {\n githubHint += ` Default repo: ${defaultOwner}/${defaultRepo}. Use this when the user doesn't specify a repo.`;\n }\n\n githubHint += `\n\nAvailable GitHub tools and when to use them:\n- git_add, git_commit, git_push: LOCAL git operations (stage, commit, push to a remote you have SSH/auth access to). All commits include \"Co-authored-by: Mercury <mercury@cosmicstack.org>\".\n- create_pr: Create a pull request on GitHub. The head branch must already exist on the remote.\n- review_pr: Get PR details and optionally post a review comment.\n- list_issues, create_issue: Browse and file issues.\n- github_api: Raw GitHub API access. IMPORTANT USE CASES:\n - Push files directly to GitHub via PUT /repos/{owner}/{repo}/contents/{path} when git push fails due to auth. The body must include \"message\" and \"content\" (base64-encoded file content). This creates a commit on GitHub with Mercury as co-author.\n - Delete files via DELETE /repos/{owner}/{repo}/contents/{path} with a \"message\" and \"sha\" in the body.\n - Any other GitHub API operation not covered by the other tools.\n\nWhen the user asks to \"push to GitHub\" or \"upload files\" and git push fails, use github_api with PUT /repos/{owner}/{repo}/contents/{path} to push content directly through the API. This bypasses local git entirely.\n\nAlways specify owner and repo parameters on GitHub tools. The user's GitHub username is ${this.config.github.username || 'not set'}.'`;\n\n prompt += githubHint;\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 trimmed = content.trim();\n const cmd = trimmed.toLowerCase();\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 `Telegram access: ${getTelegramAccessSummary(config)}`,\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.startsWith('/telegram')) {\n if (channelType !== 'cli') {\n await channel.send('`/telegram` is only available from the Mercury CLI chat.', channelId);\n return true;\n }\n\n const config = ctx.config();\n const rawSubcommand = trimmed.slice('/telegram'.length).trim();\n if (!rawSubcommand && channel instanceof CLIChannel) {\n await channel.withMenu(async (select) => {\n await this.openCliTelegramMenu(channel, channelId, select);\n });\n return true;\n }\n\n const parts = rawSubcommand.split(/\\s+/).filter(Boolean);\n const action = parts[0]?.toLowerCase() || 'help';\n const formatTelegramUser = (user: {\n userId: number;\n username?: string;\n firstName?: string;\n pairingCode?: string;\n }) => {\n const username = user.username ? ` (@${user.username})` : '';\n const firstName = user.firstName ? ` ${user.firstName}` : '';\n const pairingCode = user.pairingCode ? ` [code: ${user.pairingCode}]` : '';\n return `${user.userId}${username}${firstName}${pairingCode}`;\n };\n\n const sendTelegramOverview = async () => {\n const lines = [\n '**Telegram Management**',\n '',\n `Access: ${getTelegramAccessSummary(config)}`,\n `Admins: ${config.channels.telegram.admins.length > 0 ? config.channels.telegram.admins.map(formatTelegramUser).join(', ') : 'none'}`,\n `Members: ${config.channels.telegram.members.length > 0 ? config.channels.telegram.members.map(formatTelegramUser).join(', ') : 'none'}`,\n `Pending: ${config.channels.telegram.pending.length > 0 ? config.channels.telegram.pending.map(formatTelegramUser).join(', ') : 'none'}`,\n '',\n 'Commands:',\n '• `/telegram pending`',\n '• `/telegram users`',\n '• `/telegram approve <pairing-code|user-id>`',\n '• `/telegram reject <user-id>`',\n '• `/telegram remove <user-id>`',\n '• `/telegram promote <user-id>`',\n '• `/telegram demote <user-id>`',\n '• `/telegram reset`',\n ];\n await channel.send(lines.join('\\n'), channelId);\n };\n\n if (action === 'help' || action === 'status') {\n await sendTelegramOverview();\n return true;\n }\n\n if (action === 'pending') {\n const pending = getTelegramPendingRequests(config);\n const lines = [\n '**Telegram Pending Requests**',\n '',\n pending.length > 0 ? pending.map(formatTelegramUser).join('\\n') : 'No pending Telegram requests.',\n ];\n await channel.send(lines.join('\\n'), channelId);\n return true;\n }\n\n if (action === 'users') {\n const approved = getTelegramApprovedUsers(config);\n const lines = [\n '**Telegram Approved Users**',\n '',\n `Admins: ${config.channels.telegram.admins.length > 0 ? config.channels.telegram.admins.map(formatTelegramUser).join(', ') : 'none'}`,\n `Members: ${config.channels.telegram.members.length > 0 ? config.channels.telegram.members.map(formatTelegramUser).join(', ') : 'none'}`,\n '',\n `Total approved: ${approved.length}`,\n ];\n await channel.send(lines.join('\\n'), channelId);\n return true;\n }\n\n if (action === 'approve') {\n const value = parts[1];\n if (!value) {\n await channel.send('Usage: `/telegram approve <pairing-code|user-id>`', channelId);\n return true;\n }\n\n let approved = approveTelegramPendingRequestByPairingCode(config, value);\n let resultLabel = value;\n\n if (!approved) {\n const userId = Number(value);\n if (!isNaN(userId)) {\n approved = approveTelegramPendingRequest(config, userId, 'member');\n resultLabel = userId.toString();\n }\n }\n\n if (!approved) {\n await channel.send(`No pending Telegram request found for \\`${resultLabel}\\`.`, channelId);\n return true;\n }\n\n saveConfig(config);\n await channel.send(`Approved Telegram user ${formatTelegramUser(approved)}.`, channelId);\n return true;\n }\n\n if (action === 'reject') {\n const value = Number(parts[1]);\n if (isNaN(value)) {\n await channel.send('Usage: `/telegram reject <user-id>`', channelId);\n return true;\n }\n\n const rejected = rejectTelegramPendingRequest(config, value);\n if (!rejected) {\n await channel.send(`No pending Telegram request found for \\`${value}\\`.`, channelId);\n return true;\n }\n\n saveConfig(config);\n await channel.send(`Rejected Telegram request for ${formatTelegramUser(rejected)}.`, channelId);\n return true;\n }\n\n if (action === 'remove') {\n const value = Number(parts[1]);\n if (isNaN(value)) {\n await channel.send('Usage: `/telegram remove <user-id>`', channelId);\n return true;\n }\n\n const removed = removeTelegramUser(config, value);\n if (!removed) {\n await channel.send(`No approved Telegram user found for \\`${value}\\`.`, channelId);\n return true;\n }\n\n saveConfig(config);\n await channel.send(`Removed Telegram access for ${formatTelegramUser(removed)}.`, channelId);\n return true;\n }\n\n if (action === 'promote') {\n const value = Number(parts[1]);\n if (isNaN(value)) {\n await channel.send('Usage: `/telegram promote <user-id>`', channelId);\n return true;\n }\n\n const promoted = promoteTelegramUserToAdmin(config, value);\n if (!promoted) {\n await channel.send(`No Telegram member found for \\`${value}\\`.`, channelId);\n return true;\n }\n\n saveConfig(config);\n await channel.send(`Promoted ${formatTelegramUser(promoted)} to Telegram admin.`, channelId);\n return true;\n }\n\n if (action === 'demote') {\n const value = Number(parts[1]);\n if (isNaN(value)) {\n await channel.send('Usage: `/telegram demote <user-id>`', channelId);\n return true;\n }\n\n const demoted = demoteTelegramAdmin(config, value);\n if (!demoted) {\n await channel.send('Could not demote that Telegram admin. Mercury must keep at least one admin.', channelId);\n return true;\n }\n\n saveConfig(config);\n await channel.send(`Demoted ${formatTelegramUser(demoted)} to Telegram member.`, channelId);\n return true;\n }\n\n if (action === 'reset' || action === 'unpair') {\n config.channels.telegram.admins = [];\n config.channels.telegram.members = [];\n config.channels.telegram.pending = [];\n saveConfig(config);\n await channel.send('Telegram access reset. New users can send /start to begin pairing again.', channelId);\n return true;\n }\n\n await channel.send(\n `Unknown Telegram command \"${action}\". Try \\`/telegram\\`, \\`/telegram pending\\`, or \\`/telegram users\\`.`,\n channelId,\n );\n return true;\n }\n\n if ((cmd === '/' || cmd === '/menu') && channelType === 'cli' && channel instanceof CLIChannel) {\n await this.openCliCommandMenu(channel, 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\n private async openCliCommandMenu(channel: CLIChannel, channelId: string): Promise<void> {\n const ctx = this.capabilities.getChatCommandContext();\n if (!ctx) return;\n\n await channel.withMenu(async (select) => {\n while (true) {\n const streamLabel = this.telegramStreaming ? 'Disable Telegram Streaming' : 'Enable Telegram Streaming';\n const action = await select('Mercury Commands', [\n { value: 'status', label: 'Status' },\n { value: 'telegram', label: 'Telegram' },\n { value: 'tools', label: 'Tools' },\n { value: 'skills', label: 'Skills' },\n { value: 'stream', label: streamLabel },\n { value: 'help', label: 'Help' },\n { value: 'exit', label: 'Exit' },\n ]);\n\n if (action === 'exit') {\n return;\n }\n\n if (action === 'status') {\n await this.handleChatCommand('/status', 'cli', channelId);\n continue;\n }\n\n if (action === 'telegram') {\n await this.openCliTelegramMenu(channel, channelId, select);\n continue;\n }\n\n if (action === 'tools') {\n await this.handleChatCommand('/tools', 'cli', channelId);\n continue;\n }\n\n if (action === 'skills') {\n await this.handleChatCommand('/skills', 'cli', channelId);\n continue;\n }\n\n if (action === 'stream') {\n await this.handleChatCommand('/stream', 'cli', channelId);\n continue;\n }\n\n if (action === 'help') {\n await channel.send(ctx.manual(), channelId);\n }\n }\n });\n }\n\n private async openCliTelegramMenu(\n channel: CLIChannel,\n channelId: string,\n select: (title: string, options: ArrowSelectOption[]) => Promise<string>,\n ): Promise<void> {\n const ctx = this.capabilities.getChatCommandContext();\n if (!ctx) return;\n const formatTelegramUser = (user: {\n userId: number;\n username?: string;\n firstName?: string;\n pairingCode?: string;\n }) => {\n const username = user.username ? ` (@${user.username})` : '';\n const firstName = user.firstName ? ` ${user.firstName}` : '';\n const pairingCode = user.pairingCode ? ` [code: ${user.pairingCode}]` : '';\n return `${user.userId}${username}${firstName}${pairingCode}`;\n };\n\n const selectFromUsers = async (\n title: string,\n users: Array<{ userId: number; username?: string; firstName?: string; pairingCode?: string }>,\n emptyMessage: string,\n backValue: string = 'back',\n ): Promise<string> => {\n if (users.length === 0) {\n await channel.send(emptyMessage, channelId);\n return backValue;\n }\n\n return select(title, [\n ...users.map((user) => ({\n value: user.pairingCode || user.userId.toString(),\n label: formatTelegramUser(user),\n })),\n { value: backValue, label: 'Back' },\n ]);\n };\n\n while (true) {\n const config = ctx.config();\n const action = await select('Telegram Commands', [\n { value: 'overview', label: 'Overview' },\n { value: 'pending', label: `Pending Requests (${config.channels.telegram.pending.length})` },\n { value: 'users', label: `Approved Users (${getTelegramApprovedUsers(config).length})` },\n { value: 'approve', label: 'Approve Request' },\n { value: 'reject', label: 'Reject Request' },\n { value: 'remove', label: 'Remove User' },\n { value: 'promote', label: 'Promote to Admin' },\n { value: 'demote', label: 'Demote Admin' },\n { value: 'reset', label: 'Reset Telegram Access' },\n { value: 'back', label: 'Back' },\n { value: 'exit', label: 'Exit' },\n ]);\n\n if (action === 'exit') {\n return;\n }\n\n if (action === 'back') {\n return;\n }\n\n if (action === 'overview') {\n await this.handleChatCommand('/telegram status', 'cli', channelId);\n continue;\n }\n\n if (action === 'pending') {\n await this.handleChatCommand('/telegram pending', 'cli', channelId);\n continue;\n }\n\n if (action === 'users') {\n await this.handleChatCommand('/telegram users', 'cli', channelId);\n continue;\n }\n\n if (action === 'approve') {\n const pending = getTelegramPendingRequests(config);\n const selected = await selectFromUsers(\n 'Approve Telegram Request',\n pending,\n 'There are no pending Telegram requests to approve.',\n );\n\n if (selected === 'back') {\n continue;\n }\n\n await this.handleChatCommand(`/telegram approve ${selected}`, 'cli', channelId);\n continue;\n }\n\n if (action === 'reject') {\n const pending = getTelegramPendingRequests(config);\n const selected = await selectFromUsers(\n 'Reject Telegram Request',\n pending,\n 'There are no pending Telegram requests to reject.',\n );\n\n if (selected === 'back') {\n continue;\n }\n\n const request = pending.find((entry) => (entry.pairingCode || entry.userId.toString()) === selected);\n if (!request) {\n await channel.send('That Telegram request is no longer pending.', channelId);\n continue;\n }\n\n await this.handleChatCommand(`/telegram reject ${request.userId}`, 'cli', channelId);\n continue;\n }\n\n if (action === 'remove') {\n const approved = getTelegramApprovedUsers(config);\n const selected = await selectFromUsers(\n 'Remove Telegram User',\n approved,\n 'There are no approved Telegram users to remove.',\n );\n\n if (selected === 'back') {\n continue;\n }\n\n const user = approved.find((entry) => entry.userId.toString() === selected);\n if (!user) {\n await channel.send('That Telegram user is no longer approved.', channelId);\n continue;\n }\n\n await this.handleChatCommand(`/telegram remove ${user.userId}`, 'cli', channelId);\n continue;\n }\n\n if (action === 'promote') {\n const members = config.channels.telegram.members;\n const selected = await selectFromUsers(\n 'Promote Telegram Member',\n members,\n 'There are no Telegram members available to promote.',\n );\n\n if (selected === 'back') {\n continue;\n }\n\n const member = members.find((entry) => entry.userId.toString() === selected);\n if (!member) {\n await channel.send('That Telegram member is no longer available.', channelId);\n continue;\n }\n\n await this.handleChatCommand(`/telegram promote ${member.userId}`, 'cli', channelId);\n continue;\n }\n\n if (action === 'demote') {\n const admins = config.channels.telegram.admins;\n const selected = await selectFromUsers(\n 'Demote Telegram Admin',\n admins,\n 'There are no Telegram admins available to demote.',\n );\n\n if (selected === 'back') {\n continue;\n }\n\n const admin = admins.find((entry) => entry.userId.toString() === selected);\n if (!admin) {\n await channel.send('That Telegram admin is no longer available.', channelId);\n continue;\n }\n\n await this.handleChatCommand(`/telegram demote ${admin.userId}`, 'cli', channelId);\n continue;\n }\n\n if (action === 'reset') {\n const confirmation = await select('Reset Telegram Access?', [\n { value: 'cancel', label: 'Cancel' },\n { value: 'confirm', label: 'Reset all Telegram access' },\n { value: 'back', label: 'Back' },\n ]);\n\n if (confirmation === 'confirm') {\n clearTelegramAccess(config);\n saveConfig(config);\n await channel.send('Telegram access reset. New users can send /start to begin pairing again.', channelId);\n }\n\n continue;\n }\n }\n }\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 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';\nimport {\n ArrowSelectCancelledError,\n selectWithArrowKeys,\n type ArrowSelectOption,\n} from '../utils/arrow-select.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 private menuDepth = 0;\n private menuAbortController: AbortController | null = null;\n private outputInProgress = 0;\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.createInterface();\n this.ready = true;\n this.showPrompt();\n logger.info('CLI channel started');\n }\n\n private createInterface(): 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\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 this.closeActiveMenu();\n this.beginOutput();\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.endOutput();\n }\n\n async sendFile(filePath: string, _targetId?: string): Promise<void> {\n this.closeActiveMenu();\n this.beginOutput();\n const resolved = path.resolve(filePath);\n if (!fs.existsSync(resolved)) {\n console.log(chalk.red(` File not found: ${filePath}`));\n this.endOutput();\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.endOutput();\n }\n\n async stream(content: AsyncIterable<string>, _targetId?: string): Promise<string> {\n this.closeActiveMenu();\n this.beginOutput();\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.endOutput();\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 withMenu<T>(runner: (select: (title: string, options: ArrowSelectOption[]) => Promise<string>) => Promise<T>): Promise<T | undefined> {\n this.menuDepth += 1;\n this.menuAbortController = new AbortController();\n this.suspendPrompt();\n\n try {\n return await runner((title, options) => selectWithArrowKeys(title, options, {\n signal: this.menuAbortController?.signal,\n }));\n } catch (error) {\n if (error instanceof ArrowSelectCancelledError) {\n return undefined;\n }\n throw error;\n } finally {\n this.menuDepth = Math.max(0, this.menuDepth - 1);\n if (this.menuDepth === 0) {\n this.menuAbortController = null;\n }\n if (this.menuDepth === 0) {\n this.resumePrompt();\n if (this.outputInProgress === 0) {\n this.showPrompt();\n }\n }\n }\n }\n\n private closeActiveMenu(): void {\n if (!this.menuAbortController?.signal.aborted) {\n this.menuAbortController?.abort();\n }\n }\n\n private beginOutput(): void {\n this.outputInProgress += 1;\n }\n\n private endOutput(): void {\n this.outputInProgress = Math.max(0, this.outputInProgress - 1);\n if (this.menuDepth === 0 && this.outputInProgress === 0) {\n this.showPrompt();\n }\n }\n\n private suspendPrompt(): void {\n if (!this.rl) return;\n process.stdout.write('\\n');\n this.rl.close();\n this.rl = null;\n }\n\n private resumePrompt(): void {\n if (!this.ready || this.rl) return;\n this.createInterface();\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}\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 readline from 'node:readline';\nimport chalk from 'chalk';\n\nexport interface ArrowSelectOption {\n value: string;\n label: string;\n}\n\nexport interface ArrowSelectConfig {\n helperText?: string;\n maxVisibleOptions?: number;\n signal?: AbortSignal;\n}\n\nexport class ArrowSelectCancelledError extends Error {\n constructor(message: string = 'Arrow select cancelled') {\n super(message);\n this.name = 'ArrowSelectCancelledError';\n }\n}\n\nexport async function selectWithArrowKeys(\n title: string,\n options: ArrowSelectOption[],\n config: ArrowSelectConfig = {},\n): Promise<string> {\n if (!process.stdin.isTTY || !process.stdout.isTTY || options.length === 0) {\n return options[0]?.value ?? '';\n }\n\n readline.emitKeypressEvents(process.stdin);\n\n const stdin = process.stdin;\n const stdout = process.stdout;\n const canUseRawMode = typeof stdin.setRawMode === 'function';\n const helperText = config.helperText || 'Use the arrow keys, then press Enter.';\n const maxVisibleOptions = Math.max(\n 1,\n Math.min(\n options.length,\n config.maxVisibleOptions ?? Math.max(5, (stdout.rows || 12) - 7),\n ),\n );\n let activeIndex = 0;\n let renderedLineCount = 0;\n let windowStart = 0;\n\n const topIndicator = (hasHiddenAbove: boolean) => (\n hasHiddenAbove ? chalk.dim(' ↑ more') : ' '\n );\n const bottomIndicator = (hasHiddenBelow: boolean) => (\n hasHiddenBelow ? chalk.dim(' ↓ more') : ' '\n );\n\n const writeLines = (lines: string[]) => {\n if (renderedLineCount > 0) {\n readline.moveCursor(stdout, 0, -(renderedLineCount - 1));\n }\n\n for (let index = 0; index < lines.length; index += 1) {\n readline.cursorTo(stdout, 0);\n readline.clearLine(stdout, 0);\n stdout.write(lines[index]);\n if (index < lines.length - 1) {\n stdout.write('\\n');\n }\n }\n };\n\n const render = () => {\n if (activeIndex < windowStart) {\n windowStart = activeIndex;\n } else if (activeIndex >= windowStart + maxVisibleOptions) {\n windowStart = activeIndex - maxVisibleOptions + 1;\n }\n\n const visibleOptions = options.slice(windowStart, windowStart + maxVisibleOptions);\n const hasHiddenAbove = windowStart > 0;\n const hasHiddenBelow = windowStart + maxVisibleOptions < options.length;\n const lines = [\n chalk.bold.white(` ${title}`),\n chalk.dim(` ${helperText}`),\n '',\n topIndicator(hasHiddenAbove),\n ...visibleOptions.map((option, visibleIndex) => {\n const index = windowStart + visibleIndex;\n const isActive = index === activeIndex;\n const marker = isActive ? chalk.cyanBright('●') : chalk.dim('·');\n const text = isActive ? chalk.cyanBright(option.label) : chalk.dim(option.label);\n return ` ${marker} ${text}`;\n }),\n bottomIndicator(hasHiddenBelow),\n '',\n ];\n\n writeLines(lines);\n renderedLineCount = lines.length;\n };\n\n return await new Promise<string>((resolve, reject) => {\n const cleanup = () => {\n stdin.off('keypress', onKeypress);\n config.signal?.removeEventListener('abort', onAbort);\n if (canUseRawMode) {\n stdin.setRawMode(false);\n }\n };\n\n const onAbort = () => {\n cleanup();\n reject(new ArrowSelectCancelledError());\n };\n\n const onKeypress = (_input: string, key: readline.Key) => {\n if (key.ctrl && key.name === 'c') {\n cleanup();\n process.kill(process.pid, 'SIGINT');\n return;\n }\n\n if (key.name === 'up') {\n activeIndex = (activeIndex - 1 + options.length) % options.length;\n render();\n return;\n }\n\n if (key.name === 'down') {\n activeIndex = (activeIndex + 1) % options.length;\n render();\n return;\n }\n\n if (key.name === 'return') {\n const selected = options[activeIndex]?.value ?? '';\n cleanup();\n stdout.write('\\n');\n resolve(selected);\n }\n };\n\n if (canUseRawMode) {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.on('keypress', onKeypress);\n config.signal?.addEventListener('abort', onAbort, { once: true });\n\n if (config.signal?.aborted) {\n onAbort();\n return;\n }\n\n render();\n });\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 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, TelegramAccessUser, TelegramPendingRequest } from '../utils/config.js';\nimport {\n addTelegramPendingRequest,\n approveTelegramPendingRequest,\n clearTelegramAccess,\n findTelegramAdmin,\n findTelegramApprovedUser,\n findTelegramPendingRequest,\n getTelegramAccessSummary,\n getTelegramAdmins,\n getTelegramApprovedChatIds,\n hasTelegramAdmins,\n rejectTelegramPendingRequest,\n saveConfig,\n} from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\nimport { mdToTelegram } from '../utils/markdown.js';\n\nconst MAX_MESSAGE_LENGTH = 4096;\nconst ACCESS_ACTION_PREFIX = 'tg_access';\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 lastActiveChatId: 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 const userId = ctx.from?.id;\n const username = ctx.from?.username;\n const firstName = ctx.from?.first_name;\n const text = ctx.message.text?.trim() || '';\n const command = this.getCommandName(text);\n\n if (!userId) return;\n\n if (ctx.chat.type !== 'private') {\n await this.sendDirectMessage(chatId, 'This bot is only available in private one-to-one chats.');\n return;\n }\n\n if (command === '/start' || command === '/pair') {\n await this.handleAccessRequest(userId, chatId, username, firstName);\n return;\n }\n\n const approvedUser = findTelegramApprovedUser(this.config, userId);\n if (!approvedUser) {\n const pending = findTelegramPendingRequest(this.config, userId);\n if (pending) {\n await this.sendDirectMessage(chatId, this.getPendingStatusMessage());\n } else {\n await this.sendDirectMessage(chatId, 'This bot is not available to you. Send /start to request access.');\n }\n return;\n }\n\n this.lastActiveChatId = chatId;\n logger.info({ chatId, text: ctx.message.text?.slice(0, 50) }, 'Telegram message received');\n\n if (command === '/unpair') {\n if (!this.isAdminUser(userId)) {\n await this.sendDirectMessage(chatId, 'Only Telegram admins can reset Telegram access.');\n return;\n }\n\n this.resetAccess();\n await this.sendDirectMessage(\n chatId,\n 'Telegram access reset. New users can send /start to request access. The first request must be approved from the Mercury CLI.',\n );\n return;\n }\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 if (data.startsWith(`${ACCESS_ACTION_PREFIX}:`)) {\n await this.handleAccessCallback(ctx, data);\n return;\n }\n\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 new Promise<void>((resolve, reject) => {\n let settled = false;\n\n void 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 if (!settled) {\n settled = true;\n resolve();\n }\n },\n }).catch((err: any) => {\n if (!settled) {\n settled = true;\n reject(err);\n return;\n }\n logger.error({ err: err.message }, 'Telegram bot start loop failed after startup');\n });\n });\n }\n\n private async registerCommands(): Promise<void> {\n if (!this.bot) return;\n\n const commands = [\n { command: 'start', description: 'Request Telegram access to this Mercury instance' },\n { command: 'pair', description: 'Request Telegram access to this Mercury instance' },\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 { command: 'unpair', description: 'Reset all Telegram access for this Mercury instance' },\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 chatIds = this.resolveTargetChatIds(targetId);\n if (chatIds.length === 0 || !this.bot) {\n logger.warn({ targetId, chatIds }, 'Telegram send: no valid chat IDs');\n return;\n }\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 chatId of chatIds) {\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, chatId }, '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, chatId }, 'Telegram send failed');\n }\n }\n }\n }\n }\n\n async sendFile(filePath: string, targetId?: string): Promise<void> {\n const chatIds = this.resolveTargetChatIds(targetId);\n if (chatIds.length === 0 || !this.bot) {\n logger.warn({ targetId, chatIds }, 'Telegram sendFile: no valid chat IDs');\n return;\n }\n\n const resolved = path.resolve(filePath);\n if (!fs.existsSync(resolved)) {\n for (const chatId of chatIds) {\n await this.bot.api.sendMessage(chatId, `File not found: ${filePath}`).catch(() => {});\n }\n return;\n }\n\n const filename = path.basename(resolved);\n const ext = path.extname(resolved).toLowerCase();\n\n for (const chatId of chatIds) {\n const inputFile = new InputFile(resolved);\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, chatId }, 'Telegram sendFile failed');\n await this.bot.api.sendMessage(chatId, `Failed to send file: ${err.message}`).catch(() => {});\n }\n }\n }\n\n async stream(content: AsyncIterable<string>, targetId?: string): Promise<string> {\n const chatIds = this.resolveTargetChatIds(targetId);\n if (chatIds.length === 0 || !this.bot) return '';\n\n let full = '';\n for await (const chunk of content) {\n full += chunk;\n }\n const html = mdToTelegram(full);\n for (const chatId of chatIds) {\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)).catch(() => {});\n }\n }\n return full;\n }\n\n async typing(targetId?: string): Promise<void> {\n const chatIds = this.resolveTargetChatIds(targetId);\n if (chatIds.length === 0 || !this.bot) return;\n await this.bot.api.sendChatAction(chatIds[0], '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 chatIds = this.resolveTargetChatIds(targetId);\n const chatId = chatIds[0];\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 async handleAccessRequest(\n userId: number,\n chatId: number,\n username?: string,\n firstName?: string,\n ): Promise<void> {\n const approvedUser = findTelegramApprovedUser(this.config, userId);\n if (approvedUser) {\n await this.sendDirectMessage(chatId, this.getApprovedStatusMessage(approvedUser));\n return;\n }\n\n const existingRequest = findTelegramPendingRequest(this.config, userId);\n if (existingRequest) {\n await this.sendDirectMessage(chatId, this.getPendingStatusMessage(existingRequest));\n return;\n }\n\n if (!hasTelegramAdmins(this.config) && this.config.channels.telegram.pending.length > 0) {\n await this.sendDirectMessage(\n chatId,\n 'Initial Telegram pairing is already in progress for another user. Ask the Mercury operator to finish setup or reset Telegram access first.',\n );\n return;\n }\n\n const request = addTelegramPendingRequest(this.config, {\n userId,\n chatId,\n username,\n firstName,\n pairingCode: hasTelegramAdmins(this.config) ? undefined : this.generatePairingCode(),\n });\n saveConfig(this.config);\n logger.info({ chatId, userId, username }, 'Telegram access request recorded');\n\n await this.sendDirectMessage(chatId, this.getPendingStatusMessage(request));\n\n if (!hasTelegramAdmins(this.config)) {\n return;\n }\n\n await this.notifyAdminsOfPendingRequest(request);\n }\n\n private async notifyAdminsOfPendingRequest(request: TelegramPendingRequest): Promise<void> {\n if (!this.bot) return;\n\n const keyboard = new InlineKeyboard()\n .text('Approve', `${ACCESS_ACTION_PREFIX}:approve:${request.userId}`)\n .text('Reject', `${ACCESS_ACTION_PREFIX}:reject:${request.userId}`);\n\n const username = request.username ? ` (@${request.username})` : '';\n const firstName = request.firstName ? ` (${request.firstName})` : '';\n const message = [\n 'Telegram access request pending approval.',\n '',\n `User ID: ${request.userId}${username}${firstName}`,\n `Requested: ${new Date(request.requestedAt).toLocaleString()}`,\n '',\n 'Use the buttons below to approve or reject this user.',\n ].join('\\n');\n\n for (const admin of getTelegramAdmins(this.config)) {\n try {\n await this.bot.api.sendMessage(admin.chatId, mdToTelegram(message), {\n parse_mode: 'HTML',\n reply_markup: keyboard,\n });\n } catch {\n await this.bot.api.sendMessage(admin.chatId, message, {\n reply_markup: keyboard,\n }).catch(() => {});\n }\n }\n }\n\n private async handleAccessCallback(ctx: Parameters<Bot['on']>[1] extends never ? never : any, data: string): Promise<void> {\n const actorUserId = ctx.from?.id;\n const actorChatId = ctx.chat?.id;\n if (!actorUserId || !actorChatId) {\n await ctx.answerCallbackQuery({ text: 'Unavailable' });\n return;\n }\n\n if (!this.isAdminUser(actorUserId)) {\n await ctx.answerCallbackQuery({ text: 'Admins only' });\n return;\n }\n\n const [, action, rawUserId] = data.split(':');\n const requestUserId = Number(rawUserId);\n if (!requestUserId) {\n await ctx.answerCallbackQuery({ text: 'Invalid request' });\n return;\n }\n\n const request = findTelegramPendingRequest(this.config, requestUserId);\n if (!request) {\n await ctx.answerCallbackQuery({ text: 'Already handled' });\n await ctx.editMessageReplyMarkup({ reply_markup: undefined }).catch(() => {});\n return;\n }\n\n if (action === 'approve') {\n const approved = approveTelegramPendingRequest(this.config, requestUserId, 'member');\n if (!approved) {\n await ctx.answerCallbackQuery({ text: 'Already handled' });\n return;\n }\n\n saveConfig(this.config);\n await ctx.answerCallbackQuery({ text: 'Approved' });\n await ctx.editMessageReplyMarkup({ reply_markup: undefined }).catch(() => {});\n await this.sendDirectMessage(\n request.chatId,\n `Telegram access approved. You can now chat with Mercury.\\n\\nTelegram access: ${getTelegramAccessSummary(this.config)}`,\n );\n await this.sendDirectMessage(actorChatId, `Approved Telegram access for ${this.formatRequestLabel(request)}.`);\n return;\n }\n\n if (action === 'reject') {\n const rejected = rejectTelegramPendingRequest(this.config, requestUserId);\n if (!rejected) {\n await ctx.answerCallbackQuery({ text: 'Already handled' });\n return;\n }\n\n saveConfig(this.config);\n await ctx.answerCallbackQuery({ text: 'Rejected' });\n await ctx.editMessageReplyMarkup({ reply_markup: undefined }).catch(() => {});\n await this.sendDirectMessage(\n request.chatId,\n 'Your Telegram access request was rejected. This bot is not available to you.',\n );\n await this.sendDirectMessage(actorChatId, `Rejected Telegram access for ${this.formatRequestLabel(request)}.`);\n return;\n }\n\n await ctx.answerCallbackQuery({ text: 'Unknown action' });\n }\n\n private resolveTargetChatIds(targetId?: string): number[] {\n if (!targetId || targetId === 'notification') {\n return getTelegramApprovedChatIds(this.config);\n }\n\n if (targetId.startsWith('telegram:')) {\n const raw = Number(targetId.split(':')[1]);\n return isNaN(raw) ? [] : [raw];\n }\n\n const num = Number(targetId);\n return isNaN(num) ? [] : [num];\n }\n\n private isAdminUser(userId: number): boolean {\n return !!findTelegramAdmin(this.config, userId);\n }\n\n private getCommandName(text: string): string {\n return text.trim().split(/\\s+/)[0]?.toLowerCase() || '';\n }\n\n private getPendingStatusMessage(request?: TelegramPendingRequest): string {\n if (!hasTelegramAdmins(this.config)) {\n const pairingCode = request?.pairingCode ?? 'unknown';\n return [\n 'Your Telegram pairing request has been recorded.',\n '',\n `Pairing code: ${pairingCode}`,\n '',\n 'Enter this code in the Mercury terminal to finish setup.',\n ].join('\\n');\n }\n\n return 'Your Telegram access request has been recorded and is waiting for approval from a Telegram admin.';\n }\n\n private getApprovedStatusMessage(user: TelegramAccessUser): string {\n const role = this.isAdminUser(user.userId) ? 'admin' : 'member';\n return `You are already approved as a Telegram ${role}.\\n\\nTelegram access: ${getTelegramAccessSummary(this.config)}`;\n }\n\n private formatRequestLabel(request: TelegramPendingRequest): string {\n const username = request.username ? ` (@${request.username})` : '';\n const firstName = request.firstName ? ` ${request.firstName}` : '';\n return `${request.userId}${username}${firstName}`;\n }\n\n private resetAccess(): void {\n clearTelegramAccess(this.config);\n saveConfig(this.config);\n this.lastActiveChatId = null;\n logger.info('Telegram access reset');\n }\n\n private generatePairingCode(): string {\n return Math.floor(100000 + Math.random() * 900000).toString();\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 async sendDirectMessage(chatId: number, content: string): Promise<void> {\n if (!this.bot) return;\n try {\n await this.bot.api.sendMessage(chatId, mdToTelegram(content), { parse_mode: 'HTML' });\n } catch {\n await this.bot.api.sendMessage(chatId, content).catch(() => {});\n }\n }\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 private tempScopes: FileScope[] = [];\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 const tempScope = this.findTempScope(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 if (tempScope) {\n if (mode === 'read' && tempScope.read) return { allowed: true };\n if (mode === 'write' && tempScope.write) return { allowed: true };\n return { allowed: false, reason: `Permission denied: ${mode} access to ${path}` };\n }\n\n return { allowed: false, reason: `Permission denied for ${mode} access to ${path}` };\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: `No permission to access ${hasPathTraversal}. Use approve_scope tool with path=\"${hasPathTraversal}\" and mode=\"write\" to request access.`, needsApproval: false };\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 async requestScopeExternal(path: string, mode: 'read' | 'write'): Promise<{ allowed: boolean; reason?: string }> {\n if (!this.askHandler) {\n return { allowed: false, reason: `Permission denied for ${mode} access to ${path}` };\n }\n\n const prompt = `Mercury needs ${mode} access to:\\n${path}\\n\\nAllow access?`;\n const response = await this.askHandler(prompt);\n\n if (response === 'always') {\n this.addScope(path, mode === 'read', mode === 'write');\n return { allowed: true };\n }\n\n if (response === 'yes') {\n this.addTempScope(path, mode === 'read', mode === 'write');\n return { allowed: true };\n }\n\n return { allowed: false, reason: `Permission denied for ${mode} access to ${path}` };\n }\n\n addTempScope(path: string, read: boolean, write: boolean): void {\n const resolved = resolve(path);\n this.tempScopes.push({ path: resolved, read, write });\n logger.info({ path: resolved, read, write }, 'Temp permission scope added (session only)');\n }\n\n private findTempScope(resolvedPath: string): FileScope | undefined {\n for (const scope of this.tempScopes) {\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 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, isAbsolute } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createReadFileTool(permissions: PermissionManager, getCwd: () => string) {\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 = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n const check = await permissions.checkFsAccess(resolved, 'read');\n if (!check.allowed) {\n const parentDir = resolve(resolved, '..');\n return `Error: Permission denied for read access to ${resolved}. Use the approve_scope tool with path=\"${parentDir}\" and mode=\"read\" to request access from the user.`;\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, isAbsolute } from 'node:path';\nimport { mkdirSync } from 'node:fs';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createWriteFileTool(permissions: PermissionManager, getCwd: () => string) {\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 = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n const check = await permissions.checkFsAccess(resolved, 'write');\n if (!check.allowed) {\n const parentDir = resolve(resolved, '..');\n return `Error: Permission denied for write access to ${resolved}. Use the approve_scope tool with path=\"${parentDir}\" and mode=\"write\" to request access from the user.`;\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, isAbsolute } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createCreateFileTool(permissions: PermissionManager, getCwd: () => string) {\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 = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n const check = await permissions.checkFsAccess(resolved, 'write');\n if (!check.allowed) {\n const parentDir = resolve(resolved, '..');\n return `Error: Permission denied for write access to ${resolved}. Use the approve_scope tool with path=\"${parentDir}\" and mode=\"write\" to request access from the user.`;\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, isAbsolute } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createListDirTool(permissions: PermissionManager, getCwd: () => string) {\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 = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n const check = await permissions.checkFsAccess(resolved, 'read');\n if (!check.allowed) {\n return `Error: Permission denied for read access to ${resolved}. Use the approve_scope tool with path=\"${resolved}\" and mode=\"read\" to request access from the user.`;\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, isAbsolute } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createDeleteFileTool(permissions: PermissionManager, getCwd: () => string) {\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 = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n const check = await permissions.checkFsAccess(resolved, 'write');\n if (!check.allowed) {\n const parentDir = resolve(resolved, '..');\n return `Error: Permission denied for write access to ${resolved}. Use the approve_scope tool with path=\"${parentDir}\" and mode=\"write\" to request access from the user.`;\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, isAbsolute } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createEditFileTool(permissions: PermissionManager, getCwd: () => string) {\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 = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n\n const fsCheck = await permissions.checkFsAccess(resolved, 'write');\n if (!fsCheck.allowed) {\n const parentDir = resolve(resolved, '..');\n return `Error: Permission denied for write access to ${resolved}. Use the approve_scope tool with path=\"${parentDir}\" and mode=\"write\" to request access from the user.`;\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, isAbsolute } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createSendFileTool(\n permissions: PermissionManager,\n getCwd: () => string,\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 to the relevant approved recipients. 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 = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n const check = await permissions.checkFsAccess(resolved, 'read');\n if (!check.allowed) {\n const parentDir = resolve(resolved, '..');\n return `Error: Permission denied for read access to ${resolved}. Use the approve_scope tool with path=\"${parentDir}\" and mode=\"read\" to request access from the user.`;\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}\n","import { tool } from 'ai';\nimport { z } from 'zod';\n\nexport function createSendMessageTool(\n sendMessage: (content: string) => Promise<void>,\n) {\n return tool({\n description:\n 'Send a message through the configured outbound channel. For Telegram this sends to the approved Telegram recipients. Use this only when the user explicitly asks you to send something to Telegram or asks for scheduled results to be sent there.',\n parameters: z.object({\n content: z.string().describe('The message content to send to the approved Telegram recipients'),\n }),\n execute: async ({ content }) => {\n const trimmed = content.trim();\n if (!trimmed) {\n return 'Error: Message content cannot be empty.';\n }\n\n try {\n await sendMessage(trimmed);\n return 'Message sent to the approved Telegram recipients.';\n } catch (err: any) {\n return `Error sending message: ${err.message}`;\n }\n },\n });\n}\n","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { resolve, isAbsolute } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createApproveScopeTool(permissions: PermissionManager, getCwd: () => string) {\n return tool({\n description: 'Request user approval to access a directory outside current scopes. Use this when a file tool returns a permission denied error. The user gets an approval prompt (Allow/Always/Deny buttons on Telegram, yes/always/no on CLI). \"Allow\" grants session-only access. \"Always\" persists to disk. After approval, retry the original file operation.',\n parameters: z.object({\n path: z.string().describe('The directory path to request access to'),\n mode: z.enum(['read', 'write']).describe('The access mode needed'),\n }),\n execute: async ({ path, mode }) => {\n const resolved = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n const result = await permissions.requestScopeExternal(resolved, mode);\n if (result.allowed) {\n return `Access approved for ${mode} access to ${resolved}. You can now retry the file operation.`;\n }\n return `Access denied for ${mode} access to ${resolved}. The user did not approve scope access.`;\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\nimport { resolve, isAbsolute } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { PermissionManager } from '../permissions.js';\nimport { logger } from '../../utils/logger.js';\n\nexport function createRunCommandTool(permissions: PermissionManager, getCwd: () => string, setCwd: (dir: string) => void) {\n return tool({\n description: `Run a shell command in the current working directory. Use the cd tool to change directories first — cd commands within this tool only affect chained commands (e.g., \"cd /path && ls\"), not subsequent calls.\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.`,\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 const cwd = getCwd();\n\n try {\n logger.info({ cmd: command, cwd }, 'Executing shell command');\n const result = execSync(command, {\n cwd,\n timeout: 30000,\n maxBuffer: 1024 * 1024,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n const trimmedOutput = result?.trim() || '(no output)';\n\n detectCd(command, cwd, setCwd);\n\n return trimmedOutput;\n } catch (err: any) {\n const stderr = err.stderr?.trim();\n const stdout = err.stdout?.trim();\n\n if (stdout || stderr) {\n detectCd(command, cwd, setCwd);\n }\n\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}\n\nfunction detectCd(command: string, currentCwd: string, setCwd: (dir: string) => void): void {\n const trimmed = command.trim();\n\n const cdOnly = trimmed.match(/^cd\\s+(.+)$/);\n if (cdOnly) {\n const target = cdOnly[1].replace(/^[\"']|[\"']$/g, '').replace(/~/, process.env.HOME || '');\n const resolved = isAbsolute(target) ? target : resolve(currentCwd, target);\n if (existsSync(resolved)) {\n setCwd(resolved);\n }\n return;\n }\n\n const cdChain = trimmed.match(/cd\\s+(.+?)\\s*&&/);\n if (cdChain) {\n const target = cdChain[1].replace(/^[\"']|[\"']$/g, '').replace(/~/, process.env.HOME || '');\n const resolved = isAbsolute(target) ? target : resolve(currentCwd, target);\n if (existsSync(resolved)) {\n setCwd(resolved);\n }\n }\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { resolve, isAbsolute } from 'node:path';\nimport { existsSync, statSync } from 'node:fs';\n\nexport function createCdTool(getCwd: () => string, setCwd: (dir: string) => void) {\n return tool({\n description: 'Change the current working directory. All subsequent file operations, shell commands, and git operations will use this directory. Use this before running commands in a specific project folder.',\n parameters: z.object({\n path: z.string().describe('The directory to change to. Can be absolute or relative to the current directory.'),\n }),\n execute: async ({ path }) => {\n const cwd = getCwd();\n const resolved = isAbsolute(path) ? resolve(path) : resolve(cwd, path);\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: Not a directory: ${resolved}`;\n }\n } catch {\n return `Error: Cannot access: ${resolved}`;\n }\n\n setCwd(resolved);\n return `Changed directory to ${resolved}`;\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(getCwd: () => string) {\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, cwd: getCwd() });\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(getCwd: () => string) {\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, cwd: getCwd() });\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(getCwd: () => string) {\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, cwd: getCwd() });\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(getCwd: () => string) {\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, cwd: getCwd() });\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\nconst CO_AUTHOR = 'Mercury <mercury@cosmicstack.org>';\n\nexport function createGitCommitTool(getCwd: () => string) {\n return tool({\n description: 'Record changes to the repository. Creates a new commit with staged changes. Automatically includes a Co-authored-by trailer for attribution.',\n parameters: z.object({\n message: z.string().describe('Commit message'),\n }),\n execute: async ({ message }) => {\n try {\n const fullMessage = `${message}\\n\\nCo-authored-by: ${CO_AUTHOR}`;\n const escapedMsg = fullMessage.replace(/\"/g, '\\\\\"');\n const result = execSync(`git commit -m \"${escapedMsg}\"`, { encoding: 'utf-8', timeout: 10000, cwd: getCwd() });\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, getCwd: () => string) {\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, cwd: getCwd() });\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';\nimport { githubRequest } from '../../utils/github.js';\n\nexport function createCreatePrTool() {\n return tool({\n description: 'Create a pull request on GitHub. Requires GITHUB_TOKEN to be configured.',\n parameters: z.object({\n owner: z.string().describe('Repository owner (username or org)'),\n repo: z.string().describe('Repository name'),\n title: z.string().describe('PR title'),\n body: z.string().describe('PR description (markdown supported)').default(''),\n head: z.string().describe('The branch containing the changes'),\n base: z.string().describe('The branch to merge into').default('main'),\n draft: z.boolean().describe('Create as draft PR').default(false),\n }),\n execute: async ({ owner, repo, title, body, head, base, draft }) => {\n try {\n const result = await githubRequest(`/repos/${owner}/${repo}/pulls`, {\n method: 'POST',\n body: { title, body, head, base, draft },\n });\n\n return `PR created: ${result.html_url}\\n#${result.number}: ${result.title}\\n${draft ? '(draft)' : ''} ${result.state}`;\n } catch (err: any) {\n return `Error creating PR: ${err.message}`;\n }\n },\n });\n}","import { logger } from './logger.js';\n\nconst GITHUB_API = 'https://api.github.com';\n\nlet cachedToken: string | null = null;\n\nexport function setGitHubToken(token: string): void {\n cachedToken = token;\n}\n\nexport function getGitHubToken(): string | null {\n if (cachedToken) return cachedToken;\n return process.env.GITHUB_TOKEN || null;\n}\n\nexport function isGitHubConfigured(): boolean {\n return !!getGitHubToken();\n}\n\ninterface GitHubRequestOptions {\n method?: string;\n body?: any;\n headers?: Record<string, string>;\n}\n\nexport async function githubRequest(path: string, options: GitHubRequestOptions = {}): Promise<any> {\n const token = getGitHubToken();\n if (!token) {\n throw new Error('GITHUB_TOKEN not configured. Run mercury doctor to set it up.');\n }\n\n const url = path.startsWith('http') ? path : `${GITHUB_API}${path}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'Mercury-Agent',\n ...options.headers,\n };\n\n const fetchOptions: any = {\n method: options.method || 'GET',\n headers,\n };\n\n if (options.body) {\n fetchOptions.body = JSON.stringify(options.body);\n headers['Content-Type'] = 'application/json';\n }\n\n logger.info({ method: fetchOptions.method, path }, 'GitHub API request');\n\n const response = await fetch(url, fetchOptions);\n\n const remaining = response.headers.get('x-ratelimit-remaining');\n if (remaining && parseInt(remaining, 10) < 100) {\n logger.warn({ remaining }, 'GitHub API rate limit running low');\n }\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`GitHub API ${response.status}: ${body.slice(0, 500)}`);\n }\n\n if (response.status === 204) return null;\n\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return response.json();\n }\n\n return response.text();\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { githubRequest } from '../../utils/github.js';\n\nexport function createReviewPrTool() {\n return tool({\n description: 'Get details of a pull request including the diff. Reviews the PR and returns the title, body, changed files, and diff. Optionally post a review comment.',\n parameters: z.object({\n owner: z.string().describe('Repository owner (username or org)'),\n repo: z.string().describe('Repository name'),\n number: z.number().describe('PR number'),\n comment: z.string().describe('Review comment to post on the PR (optional)').optional(),\n }),\n execute: async ({ owner, repo, number, comment }) => {\n try {\n const pr = await githubRequest(`/repos/${owner}/${repo}/pulls/${number}`);\n if (!pr) return `Error: PR #${number} not found.`;\n\n let summary = `PR #${pr.number}: ${pr.title}\\n`;\n summary += `Author: ${pr.user?.login}\\n`;\n summary += `State: ${pr.state} (${pr.merged ? 'merged' : pr.mergeable_state || 'unknown'})\\n`;\n summary += `Branch: ${pr.head.ref} → ${pr.base.ref}\\n`;\n summary += `Changed files: ${pr.changed_files} | Additions: +${pr.additions} | Deletions: -${pr.deletions}\\n\\n`;\n\n if (pr.body) {\n summary += `Description:\\n${pr.body.slice(0, 2000)}\\n\\n`;\n }\n\n try {\n const diff = await githubRequest(`/repos/${owner}/${repo}/pulls/${number}`, {\n headers: { 'Accept': 'application/vnd.github.v3.diff' },\n });\n\n if (typeof diff === 'string') {\n const diffLines = diff.split('\\n');\n const maxDiffLines = 200;\n summary += `Diff (first ${Math.min(diffLines.length, maxDiffLines)} of ${diffLines.length} lines):\\n`;\n summary += diffLines.slice(0, maxDiffLines).join('\\n');\n if (diffLines.length > maxDiffLines) {\n summary += `\\n\\n... (${diffLines.length - maxDiffLines} more lines)`;\n }\n }\n } catch {\n summary += `(Diff not available)`;\n }\n\n if (comment) {\n try {\n await githubRequest(`/repos/${owner}/${repo}/pulls/${number}/reviews`, {\n method: 'POST',\n body: { body: comment, event: 'COMMENT' },\n });\n summary += `\\n\\nReview comment posted.`;\n } catch (err: any) {\n summary += `\\n\\nFailed to post review comment: ${err.message}`;\n }\n }\n\n return summary;\n } catch (err: any) {\n return `Error reviewing PR: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { githubRequest } from '../../utils/github.js';\n\nexport function createListIssuesTool() {\n return tool({\n description: 'List GitHub issues for a repository. Requires GITHUB_TOKEN.',\n parameters: z.object({\n owner: z.string().describe('Repository owner (username or org)'),\n repo: z.string().describe('Repository name'),\n state: z.enum(['open', 'closed', 'all']).describe('Filter by issue state').default('open'),\n labels: z.string().describe('Comma-separated label names to filter by (optional)').optional(),\n limit: z.number().describe('Maximum number of issues to return').default(10),\n }),\n execute: async ({ owner, repo, state, labels, limit }) => {\n try {\n const params = new URLSearchParams();\n params.set('state', state);\n params.set('per_page', String(Math.min(limit, 100)));\n params.set('sort', 'updated');\n params.set('direction', 'desc');\n if (labels) params.set('labels', labels);\n\n const issues = await githubRequest(`/repos/${owner}/${repo}/issues?${params}`);\n\n if (!Array.isArray(issues) || issues.length === 0) {\n return `No ${state} issues found in ${owner}/${repo}.`;\n }\n\n const lines = issues.map((issue: any) => {\n const labelStr = issue.labels?.map((l: any) => `[${l.name}]`).join(' ') || '';\n return `#${issue.number} ${issue.title} ${labelStr} (${issue.state}, by ${issue.user?.login})`;\n });\n\n return `Issues in ${owner}/${repo} (${state}):\\n${lines.join('\\n')}`;\n } catch (err: any) {\n return `Error listing issues: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { githubRequest } from '../../utils/github.js';\n\nexport function createCreateIssueTool() {\n return tool({\n description: 'Create a new GitHub issue in a repository. Requires GITHUB_TOKEN.',\n parameters: z.object({\n owner: z.string().describe('Repository owner (username or org)'),\n repo: z.string().describe('Repository name'),\n title: z.string().describe('Issue title'),\n body: z.string().describe('Issue description (markdown supported)').default(''),\n labels: z.array(z.string()).describe('Label names to apply').optional(),\n }),\n execute: async ({ owner, repo, title, body, labels }) => {\n try {\n const payload: any = { title, body };\n if (labels && labels.length > 0) payload.labels = labels;\n\n const result = await githubRequest(`/repos/${owner}/${repo}/issues`, {\n method: 'POST',\n body: payload,\n });\n\n return `Issue created: ${result.html_url}\\n#${result.number}: ${result.title}`;\n } catch (err: any) {\n return `Error creating issue: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { githubRequest } from '../../utils/github.js';\n\nconst CO_AUTHOR_NAME = 'Mercury';\nconst CO_AUTHOR_EMAIL = 'mercury@cosmicstack.org';\nconst CO_AUTHOR_TRAILER = `Co-authored-by: ${CO_AUTHOR_NAME} <${CO_AUTHOR_EMAIL}>`;\n\nfunction isContentCreatePath(path: string): boolean {\n return /^\\/repos\\/[^/]+\\/[^/]+\\/contents\\//.test(path);\n}\n\nfunction injectCoAuthor(body: any): any {\n const result = { ...body };\n\n if (typeof result.message === 'string' && !result.message.includes(CO_AUTHOR_TRAILER)) {\n result.message += `\\n\\n${CO_AUTHOR_TRAILER}`;\n }\n\n if (!result.committer || typeof result.committer !== 'object') {\n result.committer = { name: CO_AUTHOR_NAME, email: CO_AUTHOR_EMAIL };\n }\n\n if (!result.author || typeof result.author !== 'object') {\n result.author = { name: CO_AUTHOR_NAME, email: CO_AUTHOR_EMAIL };\n }\n\n return result;\n}\n\nexport function createGithubApiTool() {\n return tool({\n description: `Make a raw request to the GitHub API. GET requests (read-only) are always allowed. Write operations (POST, PUT, PATCH, DELETE) may require user approval.\n\nCommon operations you can perform:\n- Push a file: PUT /repos/{owner}/{repo}/contents/{path} — body must include \"message\" (commit message) and \"content\" (base64-encoded file). For updates, also include \"sha\" from the current file. Co-authored-by Mercury is automatically included.\n- Delete a file: DELETE /repos/{owner}/{repo}/contents/{path} — body must include \"message\" and \"sha\".\n- List branches: GET /repos/{owner}/{repo}/branches\n- Get file contents: GET /repos/{owner}/{repo}/contents/{path}\n- Search code: GET /search/code?q={query}\n- Any other GitHub API v3 endpoint.\n\nIMPORTANT: When the user wants to push code or files to GitHub and git push fails (auth issues, no SSH key, etc.), use PUT /repos/{owner}/{repo}/contents/{path} to create or update files directly through the API. This bypasses local git and creates a commit with Mercury as co-author.`,\n parameters: z.object({\n path: z.string().describe('Full API path (e.g., /repos/owner/repo/issues or /repos/owner/repo/contents/path/to/file)'),\n method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']).describe('HTTP method').default('GET'),\n body: z.string().describe('JSON body for write requests (as a JSON string)').optional(),\n }),\n execute: async ({ path, method, body }) => {\n try {\n let parsedBody: any;\n if (body) {\n try {\n parsedBody = JSON.parse(body);\n } catch {\n return 'Error: body must be valid JSON.';\n }\n }\n\n if (parsedBody && isContentCreatePath(path) && (method === 'PUT' || method === 'POST' || method === 'PATCH')) {\n parsedBody = injectCoAuthor(parsedBody);\n }\n\n const result = await githubRequest(path, {\n method,\n body: parsedBody,\n });\n\n if (result === null) return 'Request completed (204 No Content).';\n\n if (typeof result === 'string') return result;\n\n return JSON.stringify(result, null, 2);\n } catch (err: any) {\n return `Error: ${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 { createSendMessageTool } from './messaging/send-message.js';\nimport { createApproveScopeTool } from './filesystem/approve-scope.js';\nimport { createRunCommandTool } from './shell/run-command.js';\nimport { createCdTool } from './shell/cd.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 { createCreatePrTool } from './github/create-pr.js';\nimport { createReviewPrTool } from './github/review-pr.js';\nimport { createListIssuesTool } from './github/list-issues.js';\nimport { createCreateIssueTool } from './github/create-issue.js';\nimport { createGithubApiTool } from './github/github-api.js';\nimport { createFetchUrlTool } from './web/fetch-url.js';\nimport { isGitHubConfigured, setGitHubToken } from '../utils/github.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 sendMessageHandler?: (content: string) => Promise<void>;\n private currentChannelId = 'cli';\n private currentChannelType = 'cli';\n private chatCommandContext?: ChatCommandContext;\n private currentCwd = process.cwd();\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 getCwd(): string {\n return this.currentCwd;\n }\n\n setCwd(dir: string): void {\n this.currentCwd = dir;\n }\n\n setSendFileHandler(handler: (filePath: string) => Promise<void>): void {\n this.sendFileHandler = handler;\n }\n\n setSendMessageHandler(handler: (content: string) => Promise<void>): void {\n this.sendMessageHandler = 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, () => this.getCwd());\n this.tools.write_file = createWriteFileTool(this.permissions, () => this.getCwd());\n this.tools.create_file = createCreateFileTool(this.permissions, () => this.getCwd());\n this.tools.list_dir = createListDirTool(this.permissions, () => this.getCwd());\n this.tools.delete_file = createDeleteFileTool(this.permissions, () => this.getCwd());\n this.tools.edit_file = createEditFileTool(this.permissions, () => this.getCwd());\n\n if (this.sendFileHandler) {\n this.tools.send_file = createSendFileTool(this.permissions, () => this.getCwd(), this.sendFileHandler);\n }\n\n this.tools.approve_scope = createApproveScopeTool(this.permissions, () => this.getCwd());\n\n logger.info('Filesystem tools registered');\n }\n\n if (this.sendMessageHandler) {\n this.tools.send_message = createSendMessageTool(this.sendMessageHandler);\n logger.info('Messaging tool registered');\n }\n\n if (manifest.capabilities.shell.enabled) {\n this.tools.run_command = createRunCommandTool(this.permissions, () => this.getCwd(), (dir: string) => this.setCwd(dir));\n this.tools.cd = createCdTool(() => this.getCwd(), (dir: string) => this.setCwd(dir));\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(() => this.getCwd());\n this.tools.git_diff = createGitDiffTool(() => this.getCwd());\n this.tools.git_log = createGitLogTool(() => this.getCwd());\n this.tools.git_add = createGitAddTool(() => this.getCwd());\n this.tools.git_commit = createGitCommitTool(() => this.getCwd());\n this.tools.git_push = createGitPushTool(this.permissions, () => this.getCwd());\n logger.info('Git tools registered');\n }\n\n if (isGitHubConfigured()) {\n this.tools.create_pr = createCreatePrTool();\n this.tools.review_pr = createReviewPrTool();\n this.tools.list_issues = createListIssuesTool();\n this.tools.create_issue = createCreateIssueTool();\n this.tools.github_api = createGithubApiTool();\n logger.info('GitHub 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}\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 ['send_message', 'Send a message to approved Telegram users', 'content'],\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 telegram list', 'Show Telegram admins, members, and pending requests'],\n ['mercury telegram approve <code|id>', 'Approve the first Telegram pairing code or a later Telegram request'],\n ['mercury telegram reject <id>', 'Reject a pending Telegram request'],\n ['mercury telegram remove <id>', 'Remove an approved Telegram user'],\n ['mercury telegram promote <id>', 'Promote a Telegram member to admin'],\n ['mercury telegram demote <id>', 'Demote a Telegram admin to member'],\n ['mercury telegram unpair', 'Reset all Telegram access'],\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 ['/start', 'Start Telegram pairing or request Telegram access'],\n ['/pair', 'Start Telegram pairing or request Telegram access'],\n ['/', 'Open the CLI command picker with arrow-key navigation'],\n ['/menu', 'Open the CLI command picker with arrow-key navigation'],\n ['/help', 'Show this manual'],\n ['/status', 'Show config and budget info'],\n ['/telegram', 'CLI chat only: open the Telegram management menu'],\n ['/telegram pending', 'CLI chat only: list pending Telegram requests'],\n ['/telegram users', 'CLI chat only: list approved Telegram users'],\n ['/telegram approve <code|id>', 'CLI chat only: approve the first pairing code or a later request'],\n ['/telegram reject <id>', 'CLI chat only: reject a pending Telegram request'],\n ['/telegram remove <id>', 'CLI chat only: remove an approved Telegram user'],\n ['/telegram promote <id>', 'CLI chat only: promote a Telegram member to admin'],\n ['/telegram demote <id>', 'CLI chat only: demote a Telegram admin to member'],\n ['/telegram reset', 'CLI chat only: reset all Telegram access'],\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 ['/unpair', 'Reset all Telegram access for this Mercury instance (admins only)'],\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}\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}","import type { ProviderConfig, ProviderName } from './config.js';\n\nexport interface ProviderModelCatalog {\n models: string[];\n recommendedModel: string;\n}\n\nconst MAX_MODEL_OPTIONS = 7;\n\nconst OPENAI_PREFERRED_MODELS = [\n 'gpt-5.2',\n 'gpt-5.2-chat-latest',\n 'gpt-5.2-pro',\n 'gpt-5-mini',\n 'gpt-5-nano',\n 'gpt-4.1',\n 'gpt-4.1-mini',\n 'gpt-oss-120b',\n 'gpt-oss-20b',\n] as const;\n\nconst ANTHROPIC_PREFERRED_MODELS = [\n 'claude-sonnet-4-20250514',\n 'claude-opus-4-20250514',\n 'claude-3-7-sonnet-latest',\n 'claude-3-5-sonnet-latest',\n 'claude-3-5-haiku-latest',\n] as const;\n\nconst DEEPSEEK_PREFERRED_MODELS = [\n 'deepseek-chat',\n 'deepseek-reasoner',\n] as const;\n\nconst GROK_PREFERRED_MODELS = [\n 'grok-4',\n 'grok-4-latest',\n 'grok-4.20',\n 'grok-3',\n 'grok-3-latest',\n] as const;\n\nconst OLLAMA_CLOUD_PREFERRED_MODELS = [\n 'gpt-oss:120b',\n 'gpt-oss:120b-cloud',\n 'gpt-oss:20b',\n] as const;\n\nconst OLLAMA_LOCAL_PREFERRED_MODELS = [\n 'gpt-oss:20b',\n 'gpt-oss:120b',\n] as const;\n\nexport class ProviderModelFetchError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ProviderModelFetchError';\n }\n}\n\ninterface OpenAIModelResponse {\n data?: Array<{ id?: string }>;\n}\n\ninterface AnthropicModelResponse {\n data?: Array<{ id?: string }>;\n}\n\ninterface XAIModelResponse {\n data?: Array<{\n id?: string;\n input_modalities?: string[];\n output_modalities?: string[];\n }>;\n}\n\ninterface OllamaTagsResponse {\n models?: Array<{ name?: string; model?: string }>;\n}\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\nasync function fetchJson<T>(url: string, init: RequestInit, invalidMessage: string): Promise<T> {\n let response: Response;\n try {\n response = await fetch(url, {\n ...init,\n signal: AbortSignal.timeout(10_000),\n });\n } catch {\n throw new ProviderModelFetchError(invalidMessage);\n }\n\n if (!response.ok) {\n throw new ProviderModelFetchError(invalidMessage);\n }\n\n try {\n return await response.json() as T;\n } catch {\n throw new ProviderModelFetchError('Mercury could not read the model list returned by this provider.');\n }\n}\n\nfunction uniq(values: string[]): string[] {\n return [...new Set(values.filter(Boolean))];\n}\n\nfunction prioritizeModels(models: string[], preferred: readonly string[]): string[] {\n const preferredSet = new Set(preferred);\n const preferredMatches = preferred.filter((model) => models.includes(model));\n const others = models\n .filter((model) => !preferredSet.has(model))\n .sort((a, b) => a.localeCompare(b));\n\n return [...preferredMatches, ...others];\n}\n\nfunction limitModels(models: string[]): string[] {\n return models.slice(0, MAX_MODEL_OPTIONS);\n}\n\nfunction isOpenAIChatModel(id: string): boolean {\n const lower = id.toLowerCase();\n if (\n lower.includes('image')\n || lower.includes('audio')\n || lower.includes('tts')\n || lower.includes('transcribe')\n || lower.includes('embedding')\n || lower.includes('moderation')\n || lower.includes('realtime')\n || lower.includes('whisper')\n || lower.includes('search')\n || lower.includes('computer')\n ) {\n return false;\n }\n\n return lower.startsWith('gpt-') || /^o\\d/.test(lower);\n}\n\nfunction chooseRecommendedModel(\n provider: ProviderName,\n models: string[],\n currentModel?: string,\n): string {\n const preferredByProvider: Record<ProviderName, readonly string[]> = {\n deepseek: DEEPSEEK_PREFERRED_MODELS,\n openai: OPENAI_PREFERRED_MODELS,\n anthropic: ANTHROPIC_PREFERRED_MODELS,\n grok: GROK_PREFERRED_MODELS,\n ollamaCloud: OLLAMA_CLOUD_PREFERRED_MODELS,\n ollamaLocal: OLLAMA_LOCAL_PREFERRED_MODELS,\n };\n\n for (const candidate of preferredByProvider[provider]) {\n if (models.includes(candidate)) {\n return candidate;\n }\n }\n\n if (currentModel && models.includes(currentModel)) {\n return currentModel;\n }\n\n return models[0];\n}\n\nexport function buildModelCatalog(\n provider: ProviderName,\n models: string[],\n currentModel?: string,\n): ProviderModelCatalog {\n const filtered = uniq(models);\n if (filtered.length === 0) {\n throw new ProviderModelFetchError('Mercury could not find any supported chat models for this provider.');\n }\n\n const recommendedModel = chooseRecommendedModel(provider, filtered, currentModel);\n const preferredByProvider: Record<ProviderName, readonly string[]> = {\n deepseek: DEEPSEEK_PREFERRED_MODELS,\n openai: OPENAI_PREFERRED_MODELS,\n anthropic: ANTHROPIC_PREFERRED_MODELS,\n grok: GROK_PREFERRED_MODELS,\n ollamaCloud: OLLAMA_CLOUD_PREFERRED_MODELS,\n ollamaLocal: OLLAMA_LOCAL_PREFERRED_MODELS,\n };\n\n const withoutRecommended = filtered.filter((model) => model !== recommendedModel);\n const prioritized = prioritizeModels(withoutRecommended, preferredByProvider[provider]);\n\n return {\n recommendedModel,\n models: limitModels(prioritized),\n };\n}\n\nasync function fetchOpenAICompatModels(provider: ProviderName, config: ProviderConfig): Promise<ProviderModelCatalog> {\n const data = await fetchJson<OpenAIModelResponse>(\n `${trimTrailingSlash(config.baseUrl)}/models`,\n {\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n },\n },\n `Mercury could not fetch models for this ${provider === 'grok' ? 'Grok' : provider === 'deepseek' ? 'DeepSeek' : 'OpenAI'} key. Please re-enter it.`,\n );\n\n const ids = (data.data ?? [])\n .map((model) => model.id?.trim() ?? '')\n .filter((id) => {\n if (provider === 'deepseek') {\n return id.startsWith('deepseek-');\n }\n return isOpenAIChatModel(id);\n });\n\n return buildModelCatalog(provider, ids, config.model);\n}\n\nasync function fetchAnthropicModels(config: ProviderConfig): Promise<ProviderModelCatalog> {\n const data = await fetchJson<AnthropicModelResponse>(\n 'https://api.anthropic.com/v1/models',\n {\n headers: {\n 'x-api-key': config.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n },\n 'Mercury could not fetch models for this Anthropic key. Please re-enter it.',\n );\n\n const ids = (data.data ?? [])\n .map((model) => model.id?.trim() ?? '')\n .filter((id) => id.startsWith('claude-'));\n\n return buildModelCatalog('anthropic', ids, config.model);\n}\n\nasync function fetchGrokModels(config: ProviderConfig): Promise<ProviderModelCatalog> {\n const data = await fetchJson<XAIModelResponse>(\n `${trimTrailingSlash(config.baseUrl)}/language-models`,\n {\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n },\n },\n 'Mercury could not fetch models for this Grok key. Please re-enter it.',\n );\n\n const ids = (data.data ?? [])\n .filter((model) => model.output_modalities?.includes('text') || model.output_modalities == null)\n .map((model) => model.id?.trim() ?? '')\n .filter((id) => id.startsWith('grok-'));\n\n return buildModelCatalog('grok', ids, config.model);\n}\n\nasync function fetchOllamaModels(provider: ProviderName, config: ProviderConfig): Promise<ProviderModelCatalog> {\n const headers = config.apiKey\n ? { Authorization: `Bearer ${config.apiKey}` }\n : undefined;\n\n const data = await fetchJson<OllamaTagsResponse>(\n `${trimTrailingSlash(config.baseUrl)}/tags`,\n {\n headers,\n },\n provider === 'ollamaCloud'\n ? 'Mercury could not fetch models for this Ollama Cloud key. Please re-enter it.'\n : 'Mercury could not fetch models from this Ollama Local server. Please check the base URL and try again.',\n );\n\n const ids = (data.models ?? [])\n .map((model) => model.model?.trim() || model.name?.trim() || '')\n .filter(Boolean);\n\n return buildModelCatalog(provider, ids, config.model);\n}\n\nexport async function fetchProviderModelCatalog(\n provider: ProviderName,\n config: ProviderConfig,\n): Promise<ProviderModelCatalog> {\n if (provider === 'anthropic') {\n return fetchAnthropicModels(config);\n }\n\n if (provider === 'grok') {\n return fetchGrokModels(config);\n }\n\n if (provider === 'ollamaCloud' || provider === 'ollamaLocal') {\n return fetchOllamaModels(provider, config);\n }\n\n return fetchOpenAICompatModels(provider, config);\n}\n"],"mappings":"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","names":["readFileSync","writeFileSync","existsSync","dirname","join","readline","chalk","existsSync","readFileSync","mkdirSync","writeFileSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","generateText","streamText","generateText","streamText","provider","generateText","streamText","readline","chalk","chalk","resolve","readline","chalk","resolve","channel","streamText","generateText","formatTelegramUser","existsSync","readFileSync","writeFileSync","mkdirSync","join","parseYaml","stringifyYaml","join","path","existsSync","readFileSync","parseYaml","mkdirSync","writeFileSync","stringifyYaml","fs","path","resolve","path","fs","existsSync","readFileSync","writeFileSync","join","path","join","writeFileSync","existsSync","readFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","resolve","homedir","parseYaml","stringifyYaml","join","tool","existsSync","readFileSync","parseYaml","mkdirSync","writeFileSync","stringifyYaml","path","fs","resolve","homedir","existsSync","readFileSync","resolve","path","tool","z","existsSync","writeFileSync","resolve","isAbsolute","path","tool","z","existsSync","writeFileSync","mkdirSync","resolve","dirname","isAbsolute","path","tool","z","existsSync","readdirSync","resolve","isAbsolute","path","join","tool","z","existsSync","unlinkSync","resolve","isAbsolute","path","tool","z","readFileSync","writeFileSync","resolve","isAbsolute","path","tool","z","existsSync","statSync","resolve","isAbsolute","path","tool","z","tool","z","resolve","isAbsolute","path","tool","z","resolve","isAbsolute","existsSync","tool","z","isAbsolute","resolve","existsSync","tool","z","resolve","isAbsolute","existsSync","statSync","path","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","path","tool","z","tool","z","tool","z","tool","z","tool","z","tool","z","tool","z","tool","z","path","tool","z","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","dirname","readFileSync","join","chalk","readline","resolve","existsSync","writeFileSync","approved"]}
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/ollama.ts","../src/providers/registry.ts","../src/core/agent.ts","../src/core/lifecycle.ts","../src/channels/cli.ts","../src/channels/base.ts","../src/utils/markdown.ts","../src/utils/tool-label.ts","../src/utils/arrow-select.ts","../src/core/scheduler.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/messaging/send-message.ts","../src/capabilities/filesystem/approve-scope.ts","../src/capabilities/shell/run-command.ts","../src/capabilities/shell/cd.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/github/create-pr.ts","../src/utils/github.ts","../src/capabilities/github/review-pr.ts","../src/capabilities/github/list-issues.ts","../src/capabilities/github/create-issue.ts","../src/capabilities/github/github-api.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","../src/utils/provider-models.ts"],"sourcesContent":["import { readFileSync, writeFileSync, existsSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, join } from 'node:path';\nimport { Command } from 'commander';\nimport readline from 'node:readline';\nimport chalk from 'chalk';\n\nimport {\n loadConfig,\n saveConfig,\n isSetupComplete,\n getMercuryHome,\n ensureCreatorField,\n clearTelegramAccess,\n isProviderConfigured,\n getTelegramAccessSummary,\n getTelegramApprovedUsers,\n getTelegramPendingRequests,\n approveTelegramPendingRequest,\n approveTelegramPendingRequestByPairingCode,\n rejectTelegramPendingRequest,\n removeTelegramUser,\n promoteTelegramUserToAdmin,\n demoteTelegramAdmin,\n hasTelegramAdmins,\n} from './utils/config.js';\nimport type { MercuryConfig } from './utils/config.js';\nimport type { ProviderName } 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';\nimport { setGitHubToken } from './utils/github.js';\nimport { selectWithArrowKeys } from './utils/arrow-select.js';\nimport { ProviderModelFetchError, fetchProviderModelCatalog } from './utils/provider-models.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkgVersion = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8')).version;\n\nfunction hr() {\n console.log(chalk.dim('─'.repeat(50)));\n}\n\nconst MERCURY_ASCII = [\n ' __ _____________ ________ ________ __',\n ' / |/ / ____/ __ \\\\/ ____/ / / / __ \\\\/ < /',\n ' / /|_/ / __/ / /_/ / / / / / / /_/ /\\\\ / ',\n ' / / / / /___/ _, _/ /___/ /_/ / _, _/ / / ',\n '/_/ /_/_____/_/ |_|\\\\____/\\\\____/_/ |_| /_/ ',\n].filter(l => l.trim());\n\nfunction banner() {\n console.log('');\n for (const line of MERCURY_ASCII) {\n 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(` v${pkgVersion} · by Cosmic Stack · mercury.cosmicstack.org`));\n console.log('');\n}\n\nfunction splashScreen() {\n console.log('');\n for (const line of MERCURY_ASCII) {\n 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\nconst PROVIDER_OPTIONS: Array<{ key: ProviderName; label: string }> = [\n { key: 'deepseek', label: 'DeepSeek' },\n { key: 'openai', label: 'OpenAI' },\n { key: 'anthropic', label: 'Anthropic' },\n { key: 'grok', label: 'Grok (xAI)' },\n { key: 'ollamaCloud', label: 'Ollama Cloud' },\n { key: 'ollamaLocal', label: 'Ollama Local' },\n];\n\nfunction getConfiguredProviderNames(config: MercuryConfig): ProviderName[] {\n return PROVIDER_OPTIONS\n .map((option) => option.key)\n .filter((key) => isProviderConfigured(config.providers[key]));\n}\n\nfunction getProviderLabel(name: ProviderName): string {\n return PROVIDER_OPTIONS.find((option) => option.key === name)?.label || name;\n}\n\nfunction parseProviderSelection(input: string): ProviderName[] | null {\n const values = input.split(/[\\s,]+/).map((value) => value.trim()).filter(Boolean);\n if (values.length === 0) return [];\n\n const selected: ProviderName[] = [];\n for (const value of values) {\n const index = parseInt(value, 10);\n if (isNaN(index) || index < 1 || index > PROVIDER_OPTIONS.length) {\n return null;\n }\n const provider = PROVIDER_OPTIONS[index - 1].key;\n if (!selected.includes(provider)) {\n selected.push(provider);\n }\n }\n return selected;\n}\n\nasync function chooseProvidersToConfigure(config: MercuryConfig, isReconfig: boolean): Promise<ProviderName[]> {\n const configured = getConfiguredProviderNames(config);\n\n while (true) {\n for (let i = 0; i < PROVIDER_OPTIONS.length; i++) {\n const option = PROVIDER_OPTIONS[i];\n const status = configured.includes(option.key) ? ' (configured)' : '';\n console.log(chalk.white(` ${i + 1}. ${option.label}${status}`));\n }\n console.log('');\n\n const prompt = isReconfig\n ? chalk.white(' Choose providers to configure [comma-separated, Enter keeps current]: ')\n : chalk.white(' Choose providers to configure [comma-separated, Enter for DeepSeek]: ');\n\n const input = await ask(prompt);\n const parsed = parseProviderSelection(input);\n if (parsed === null) {\n console.log(chalk.red(' Please choose valid provider numbers, like `1` or `1,3,5`.'));\n console.log('');\n continue;\n }\n\n if (parsed.length > 0) return parsed;\n if (!isReconfig) return ['deepseek'];\n return configured.length > 0 ? configured : ['deepseek'];\n }\n}\n\nasync function chooseDefaultProvider(config: MercuryConfig): Promise<void> {\n const configured = getConfiguredProviderNames(config);\n\n if (configured.length === 0) {\n return;\n }\n\n if (configured.length === 1) {\n config.providers.default = configured[0];\n console.log(chalk.dim(` Default provider set to ${getProviderLabel(configured[0])}`));\n return;\n }\n\n const suggested = configured.includes('deepseek') ? 'deepseek' : configured[0];\n\n console.log('');\n console.log(chalk.bold.white(' Default Provider'));\n console.log(chalk.dim(' Select the LLM provider Mercury should use first.'));\n console.log('');\n for (let i = 0; i < configured.length; i++) {\n const provider = configured[i];\n const recommended = provider === suggested ? ' (recommended)' : '';\n const current = provider === config.providers.default ? ' (current)' : '';\n console.log(chalk.white(` ${i + 1}. ${getProviderLabel(provider)}${recommended}${current}`));\n }\n console.log('');\n\n while (true) {\n const choice = await ask(chalk.white(` Choose [1-${configured.length}] [Enter for ${getProviderLabel(suggested)}]: `));\n if (!choice) {\n config.providers.default = suggested;\n return;\n }\n\n const num = parseInt(choice, 10);\n if (num >= 1 && num <= configured.length) {\n config.providers.default = configured[num - 1];\n return;\n }\n\n console.log(chalk.red(' Please choose a valid number from the list above.'));\n }\n}\n\nfunction looksLikeToken(value: string, minLength: number = 20): boolean {\n return value.length >= minLength && !/\\s/.test(value) && /[A-Za-z]/.test(value) && /\\d/.test(value);\n}\n\nfunction validateApiKey(provider: ProviderName, value: string): string | null {\n if (provider === 'openai') {\n return /^sk-(proj-|svcacct-)?[A-Za-z0-9_-]{16,}$/i.test(value)\n ? null\n : 'OpenAI keys must start with `sk-`, `sk-proj-`, or `sk-svcacct-`.';\n }\n\n if (provider === 'anthropic') {\n return /^sk-ant-[A-Za-z0-9_-]{16,}$/i.test(value)\n ? null\n : 'Anthropic keys must start with `sk-ant-`.';\n }\n\n if (provider === 'deepseek') {\n return /^sk-[A-Za-z0-9_-]{16,}$/i.test(value)\n ? null\n : 'DeepSeek keys must start with `sk-`.';\n }\n\n if (provider === 'grok') {\n return looksLikeToken(value)\n ? null\n : 'Grok keys must look like a real API token: long, no spaces, and not plain text.';\n }\n\n if (provider === 'ollamaCloud') {\n return looksLikeToken(value)\n ? null\n : 'Ollama Cloud keys must look like a real API token: long, no spaces, and not plain text.';\n }\n\n return null;\n}\n\nfunction validateBaseUrl(value: string): string | null {\n try {\n const parsed = new URL(value);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n return 'Base URL must start with http:// or https://.';\n }\n return null;\n } catch {\n return 'Please enter a valid URL.';\n }\n}\n\nfunction validateModelName(value: string): string | null {\n if (!value.trim()) return 'Model name is required.';\n if (/\\s/.test(value)) return 'Model name cannot contain spaces.';\n return null;\n}\n\nasync function chooseProviderModel(\n providerLabel: string,\n recommendedModel: string,\n models: string[],\n): Promise<string> {\n const selection = await selectWithArrowKeys(\n `${providerLabel} Models`,\n [\n {\n value: '__default__',\n label: `Use provider default (${recommendedModel})`,\n },\n ...models.map((model) => ({\n value: model,\n label: model,\n })),\n {\n value: '__custom__',\n label: 'Enter a custom model name',\n },\n ],\n );\n\n if (!selection || selection === '__default__') {\n return recommendedModel;\n }\n\n if (selection !== '__custom__') {\n return selection;\n }\n\n while (true) {\n const customModel = await ask(chalk.white(` ${providerLabel} model [Enter or \"none\" for ${recommendedModel}]: `));\n if (!customModel || customModel.toLowerCase() === 'none') {\n return recommendedModel;\n }\n\n const error = validateModelName(customModel);\n if (!error) {\n return customModel;\n }\n\n console.log(chalk.red(` ${error}`));\n }\n}\n\nasync function promptApiKeyWithModelSelection(\n config: MercuryConfig,\n provider: ProviderName,\n providerLabel: string,\n prompt: string,\n isReconfig: boolean,\n): Promise<{ apiKey?: string; model?: string; skipped: boolean }> {\n const existingConfig = config.providers[provider];\n\n while (true) {\n const value = await ask(prompt);\n if (!value) {\n if (isReconfig && existingConfig.apiKey) {\n return {\n apiKey: existingConfig.apiKey,\n model: existingConfig.model,\n skipped: true,\n };\n }\n\n return { skipped: true };\n }\n\n const formatError = validateApiKey(provider, value);\n if (formatError) {\n console.log(chalk.red(` ${formatError}`));\n continue;\n }\n\n console.log(chalk.dim(` Validating ${providerLabel} and fetching models...`));\n try {\n const catalog = await fetchProviderModelCatalog(provider, {\n ...existingConfig,\n apiKey: value,\n });\n const model = await chooseProviderModel(\n providerLabel,\n catalog.recommendedModel,\n catalog.models,\n );\n return { apiKey: value, model, skipped: false };\n } catch (error) {\n const message = error instanceof ProviderModelFetchError\n ? error.message\n : `Mercury could not fetch models for ${providerLabel}. Please re-enter the key.`;\n console.log(chalk.red(` ${message}`));\n }\n }\n}\n\nasync function promptOllamaLocalModelSelection(config: MercuryConfig): Promise<{ baseUrl?: string; model?: string; skipped: boolean }> {\n const existingConfig = config.providers.ollamaLocal;\n\n while (true) {\n const baseUrl = (await promptValidatedValue(\n chalk.white(` Ollama Local base URL [${existingConfig.baseUrl}]: `),\n validateBaseUrl,\n existingConfig.baseUrl,\n ))!;\n\n console.log(chalk.dim(' Fetching Ollama Local models...'));\n try {\n const catalog = await fetchProviderModelCatalog('ollamaLocal', {\n ...existingConfig,\n baseUrl,\n });\n const model = await chooseProviderModel(\n 'Ollama Local',\n catalog.recommendedModel,\n catalog.models,\n );\n return { baseUrl, model, skipped: false };\n } catch (error) {\n const message = error instanceof ProviderModelFetchError\n ? error.message\n : 'Mercury could not fetch Ollama Local models. Please check the base URL and try again.';\n console.log(chalk.red(` ${message}`));\n }\n }\n}\n\nasync function promptValidatedValue(\n prompt: string,\n validator: (value: string) => string | null,\n existingValue?: string,\n options?: { allowSkip?: boolean },\n): Promise<string | undefined> {\n while (true) {\n const value = await ask(prompt);\n if (!value) {\n if (existingValue) return existingValue;\n if (options?.allowSkip) return undefined;\n console.log(chalk.red(' A value is required here.'));\n continue;\n }\n\n const error = validator(value);\n if (!error) return value;\n\n console.log(chalk.red(` ${error}`));\n }\n}\n\nfunction appendToEnv(key: string, value: string): void {\n const envPath = join(getMercuryHome(), '.env');\n let envContent = '';\n if (existsSync(envPath)) {\n envContent = readFileSync(envPath, 'utf-8');\n }\n const lines = envContent.split('\\n').filter((l: string) => !l.startsWith(`${key}=`) && l.trim() !== '');\n lines.push(`${key}=${value}`);\n writeFileSync(envPath, lines.join('\\n') + '\\n', 'utf-8');\n process.env[key] = value;\n}\n\nfunction parseGithubRepo(input: string): { owner: string; repo: string } | null {\n const trimmed = input.trim().replace(/\\/+$/, '');\n const urlMatch = trimmed.match(/github\\.com\\/([^/]+)\\/([^/]+)/);\n if (urlMatch) return { owner: urlMatch[1], repo: urlMatch[2] };\n const shortMatch = trimmed.match(/^([^/\\s]+)\\/([^/\\s]+)$/);\n if (shortMatch) return { owner: shortMatch[1], repo: shortMatch[2] };\n return null;\n}\n\nfunction formatTelegramUser(user: {\n userId: number;\n username?: string;\n firstName?: string;\n}): string {\n const username = user.username ? ` (@${user.username})` : '';\n const firstName = user.firstName ? ` ${user.firstName}` : '';\n return `${user.userId}${username}${firstName}`;\n}\n\nfunction printTelegramAccessState(config: MercuryConfig): void {\n const admins = config.channels.telegram.admins;\n const members = config.channels.telegram.members;\n const pending = config.channels.telegram.pending;\n const pendingSummary = pending.length > 0\n ? pending.map((entry) => {\n const code = entry.pairingCode ? ` [code: ${entry.pairingCode}]` : '';\n return `${formatTelegramUser(entry)}${code}`;\n }).join(', ')\n : '';\n\n console.log('');\n console.log(` Telegram Access: ${chalk.white(getTelegramAccessSummary(config))}`);\n console.log(` Admins: ${admins.length > 0 ? chalk.green(admins.map(formatTelegramUser).join(', ')) : chalk.dim('none')}`);\n console.log(` Members: ${members.length > 0 ? chalk.green(members.map(formatTelegramUser).join(', ')) : chalk.dim('none')}`);\n console.log(` Pending: ${pending.length > 0 ? chalk.yellow(pendingSummary) : chalk.dim('none')}`);\n}\n\nfunction restartDaemonIfRunning(message?: string): void {\n const daemon = getDaemonStatus();\n if (!daemon.running) return;\n\n if (message) {\n console.log(chalk.dim(` ${message}`));\n }\n restartDaemon();\n}\n\nasync function completeInitialTelegramPairing(config: MercuryConfig): Promise<void> {\n if (!config.channels.telegram.enabled || !config.channels.telegram.botToken || hasTelegramAdmins(config)) {\n return;\n }\n\n console.log('');\n console.log(chalk.bold.white(' Telegram Pairing'));\n console.log(chalk.dim(' 1. Open Telegram and message your bot.'));\n console.log(chalk.dim(' 2. Send /start to receive your pairing code in Telegram.'));\n console.log(chalk.dim(' 3. Paste that pairing code below to finish setup.'));\n console.log('');\n\n const telegram = new TelegramChannel(config);\n try {\n await telegram.start();\n\n while (true) {\n const pairingCode = await ask(chalk.white(' Telegram Pairing Code: '));\n if (!pairingCode) {\n console.log(chalk.red(' Telegram pairing code is required to continue.'));\n continue;\n }\n\n const approved = approveTelegramPendingRequestByPairingCode(config, pairingCode);\n if (!approved) {\n console.log(chalk.red(' That pairing code is not valid yet. Send /start in Telegram, then paste the exact code here.'));\n continue;\n }\n\n saveConfig(config);\n console.log(chalk.green(` ✓ Telegram paired. First admin: ${formatTelegramUser(approved)}.`));\n console.log('');\n break;\n }\n } finally {\n await telegram.stop();\n }\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(' Choose which providers to configure now. Existing values are shown where available.'));\n } else {\n console.log(chalk.dim(' Choose one or more providers. Press Enter to configure DeepSeek by default.'));\n }\n console.log('');\n\n while (true) {\n const selectedProviders = await chooseProvidersToConfigure(config, isReconfig);\n console.log('');\n\n for (const provider of selectedProviders) {\n if (provider === 'deepseek') {\n const mask = isReconfig && config.providers.deepseek.apiKey ? ` [${maskKey(config.providers.deepseek.apiKey)}]` : '';\n const result = await promptApiKeyWithModelSelection(\n config,\n 'deepseek',\n 'DeepSeek',\n chalk.white(` DeepSeek API key${mask}${isReconfig ? '' : ' (Enter to skip)'}: `),\n isReconfig,\n );\n if (!result.skipped && result.apiKey && result.model) {\n config.providers.deepseek.apiKey = result.apiKey;\n config.providers.deepseek.model = result.model;\n config.providers.deepseek.enabled = true;\n }\n continue;\n }\n\n if (provider === 'openai') {\n const mask = isReconfig && config.providers.openai.apiKey ? ` [${maskKey(config.providers.openai.apiKey)}]` : '';\n const result = await promptApiKeyWithModelSelection(\n config,\n 'openai',\n 'OpenAI',\n chalk.white(` OpenAI API key${mask}${isReconfig ? '' : ' (Enter to skip)'}: `),\n isReconfig,\n );\n if (!result.skipped && result.apiKey && result.model) {\n config.providers.openai.apiKey = result.apiKey;\n config.providers.openai.model = result.model;\n config.providers.openai.enabled = true;\n }\n continue;\n }\n\n if (provider === 'anthropic') {\n const mask = isReconfig && config.providers.anthropic.apiKey ? ` [${maskKey(config.providers.anthropic.apiKey)}]` : '';\n const result = await promptApiKeyWithModelSelection(\n config,\n 'anthropic',\n 'Anthropic',\n chalk.white(` Anthropic API key${mask}${isReconfig ? '' : ' (Enter to skip)'}: `),\n isReconfig,\n );\n if (!result.skipped && result.apiKey && result.model) {\n config.providers.anthropic.apiKey = result.apiKey;\n config.providers.anthropic.model = result.model;\n config.providers.anthropic.enabled = true;\n }\n continue;\n }\n\n if (provider === 'grok') {\n const mask = isReconfig && config.providers.grok.apiKey ? ` [${maskKey(config.providers.grok.apiKey)}]` : '';\n const result = await promptApiKeyWithModelSelection(\n config,\n 'grok',\n 'Grok',\n chalk.white(` Grok API key${mask}${isReconfig ? '' : ' (Enter to skip)'}: `),\n isReconfig,\n );\n if (!result.skipped && result.apiKey && result.model) {\n config.providers.grok.apiKey = result.apiKey;\n config.providers.grok.model = result.model;\n config.providers.grok.enabled = true;\n }\n continue;\n }\n\n if (provider === 'ollamaCloud') {\n const mask = isReconfig && config.providers.ollamaCloud.apiKey ? ` [${maskKey(config.providers.ollamaCloud.apiKey)}]` : '';\n const result = await promptApiKeyWithModelSelection(\n config,\n 'ollamaCloud',\n 'Ollama Cloud',\n chalk.white(` Ollama Cloud API key${mask}${isReconfig ? '' : ' (Enter to skip)'}: `),\n isReconfig,\n );\n if (!result.skipped && result.apiKey && result.model) {\n config.providers.ollamaCloud.apiKey = result.apiKey;\n config.providers.ollamaCloud.model = result.model;\n config.providers.ollamaCloud.enabled = true;\n }\n continue;\n }\n\n if (provider === 'ollamaLocal') {\n const result = await promptOllamaLocalModelSelection(config);\n if (!result.skipped && result.baseUrl && result.model) {\n config.providers.ollamaLocal.baseUrl = result.baseUrl;\n config.providers.ollamaLocal.model = result.model;\n config.providers.ollamaLocal.enabled = true;\n }\n }\n }\n\n const configuredProviders = getConfiguredProviderNames(config);\n if (configuredProviders.length === 0) {\n console.log(chalk.red(' You need to configure at least one LLM provider to continue.'));\n console.log(chalk.dim(' Let’s try that step again.'));\n console.log('');\n continue;\n }\n\n await chooseDefaultProvider(config);\n break;\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 console.log(chalk.dim(' To create a bot token:'));\n console.log(chalk.dim(' 1. Open Telegram and message @BotFather'));\n console.log(chalk.dim(' 2. Run /newbot and follow the prompts'));\n console.log(chalk.dim(' 3. Copy the bot token BotFather gives you'));\n console.log(chalk.dim(' 4. Paste that token here'));\n console.log(chalk.dim(' After setup, users send /start to request access.'));\n console.log(chalk.dim(' The first Telegram user gets a pairing code, and you approve that code from the CLI.'));\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 clearTelegramAccess(config);\n } else if (telegramToken) {\n if (telegramToken !== config.channels.telegram.botToken) {\n clearTelegramAccess(config);\n }\n config.channels.telegram.botToken = telegramToken;\n config.channels.telegram.enabled = true;\n }\n\n await completeInitialTelegramPairing(config);\n\n hr();\n console.log('');\n console.log(chalk.bold.white(' GitHub Integration (optional)'));\n console.log(chalk.dim(' Connect Mercury to GitHub so it can create PRs, manage issues,'));\n console.log(chalk.dim(' review code, and co-author commits on your behalf.'));\n console.log(chalk.dim(' Leave empty to skip. You can add it later with mercury doctor.'));\n console.log('');\n\n const ghUserCurrent = isReconfig && config.github.username ? ` [${config.github.username}]` : '';\n const ghUsername = await ask(chalk.white(` 1. Your GitHub username${ghUserCurrent}: `));\n if (ghUsername) config.github.username = ghUsername;\n\n if (!config.github.email) {\n config.github.email = 'mercury@cosmicstack.org';\n }\n\n console.log('');\n console.log(chalk.dim(' You need a Personal Access Token (PAT) with repo access.'));\n console.log(chalk.dim(' Fine-grained (recommended): github.com/settings/personal-access-tokens/new'));\n console.log(chalk.dim(' → Permissions: Contents (R/W), Pull requests (R/W), Issues (R/W)'));\n console.log(chalk.dim(' Classic: github.com/settings/tokens/new'));\n console.log(chalk.dim(' → Scope: repo (full control)'));\n const ghTokenCurrent = process.env.GITHUB_TOKEN ? ` [${maskKey(process.env.GITHUB_TOKEN)}]` : '';\n const ghToken = await ask(chalk.white(` 2. GitHub PAT${ghTokenCurrent}: `));\n if (ghToken) {\n appendToEnv('GITHUB_TOKEN', ghToken);\n }\n\n if (config.github.username || process.env.GITHUB_TOKEN) {\n console.log('');\n console.log(chalk.dim(' Set a default repo so you can say \"create an issue\" without'));\n console.log(chalk.dim(' specifying the repo every time. Enter owner/name or a full URL.'));\n console.log(chalk.dim(' Example: hotheadhacker/mercury-agent'));\n console.log(chalk.dim(' Example: https://github.com/hotheadhacker/mercury-agent'));\n const ghOwnerCurrent = isReconfig && config.github.defaultOwner ? ` [${config.github.defaultOwner}/${config.github.defaultRepo}]` : '';\n const ghRepoInput = await ask(chalk.white(` 3. Default repo${ghOwnerCurrent}: `));\n if (ghRepoInput) {\n const parsed = parseGithubRepo(ghRepoInput);\n if (parsed) {\n config.github.defaultOwner = parsed.owner;\n config.github.defaultRepo = parsed.repo;\n } else {\n console.log(chalk.yellow(' Could not parse repo. Use format: owner/repo or a GitHub URL.'));\n }\n }\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 providers.');\n return;\n }\n console.log(chalk.red(' No LLM providers available. Run `mercury doctor` to configure providers.'));\n process.exit(1);\n }\n\n const available = providers.listAvailable();\n const providerLabels = available.map((provider) => getProviderLabel(provider as ProviderName));\n const providerModels = available.map((provider) => {\n const key = provider as ProviderName;\n return `${getProviderLabel(key)}: ${config.providers[key].model}`;\n });\n if (!isDaemon) {\n console.log(chalk.dim(` Providers: ${providerLabels.join(', ')}`));\n console.log(chalk.dim(` Models: ${providerModels.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 { channelId, channelType } = capabilities.getChannelContext();\n const telegram = channels.get('telegram');\n\n if (channelType === 'telegram' && telegram) {\n await telegram.sendFile(filePath, channelId);\n return;\n }\n\n if (config.channels.telegram.enabled && telegram && getTelegramApprovedUsers(config).length > 0) {\n await telegram.sendFile(filePath);\n return;\n }\n\n const cli = channels.get('cli');\n if (cli) {\n await cli.sendFile(filePath);\n }\n });\n\n capabilities.setSendMessageHandler(async (content: string) => {\n const telegram = channels.get('telegram');\n\n if (!config.channels.telegram.enabled || !telegram) {\n throw new Error('Telegram is not configured. Add a bot token in setup or run `mercury doctor`.');\n }\n\n if (getTelegramApprovedUsers(config).length === 0) {\n throw new Error('Telegram has no approved users. Ask someone to send /start, then approve the request from Mercury.');\n }\n\n await telegram.send(content);\n });\n if (process.env.GITHUB_TOKEN) {\n setGitHubToken(process.env.GITHUB_TOKEN);\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 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 cliChannel?.showPrompt();\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(pkgVersion)\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(getProviderLabel(config.providers.default))}`);\n console.log(` Telegram: ${config.channels.telegram.enabled ? chalk.green('enabled') : chalk.dim('disabled')}`);\n console.log(` Telegram Access: ${chalk.white(getTelegramAccessSummary(config))}`);\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 printTelegramAccessState(config);\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 telegramCmd = program\n .command('telegram')\n .description('Manage Telegram access approvals and admins');\n\ntelegramCmd\n .command('list')\n .description('Show approved Telegram users and pending access requests')\n .action(() => {\n const config = loadConfig();\n console.log('');\n printTelegramAccessState(config);\n console.log('');\n });\n\ntelegramCmd\n .command('approve <codeOrUserId>')\n .description('Approve a pending Telegram access request by pairing code or user ID')\n .action((codeOrUserId: string) => {\n const config = loadConfig();\n const hasAdmins = hasTelegramAdmins(config);\n\n if (!hasAdmins) {\n const approved = approveTelegramPendingRequestByPairingCode(config, codeOrUserId.trim());\n if (!approved) {\n console.log('');\n console.log(chalk.red(` No pending first-time Telegram pairing found for code ${codeOrUserId}.`));\n console.log('');\n return;\n }\n\n saveConfig(config);\n console.log('');\n console.log(chalk.green(` ✓ Approved first Telegram admin ${formatTelegramUser(approved)}.`));\n restartDaemonIfRunning('Restarting the background daemon to apply the change immediately...');\n console.log('');\n return;\n }\n\n const targetUserId = Number(codeOrUserId);\n if (isNaN(targetUserId)) {\n console.log('');\n console.log(chalk.red(' Please provide a numeric Telegram user ID once Telegram already has an admin.'));\n console.log('');\n return;\n }\n\n const approved = approveTelegramPendingRequest(config, targetUserId, 'member');\n if (!approved) {\n console.log('');\n console.log(chalk.red(` No pending Telegram request found for user ${codeOrUserId}.`));\n console.log('');\n return;\n }\n\n saveConfig(config);\n console.log('');\n console.log(chalk.green(` ✓ Approved Telegram member ${formatTelegramUser(approved)}.`));\n restartDaemonIfRunning('Restarting the background daemon to apply the change immediately...');\n console.log('');\n });\n\ntelegramCmd\n .command('reject <userId>')\n .description('Reject a pending Telegram access request')\n .action((userId: string) => {\n const config = loadConfig();\n const targetUserId = Number(userId);\n if (isNaN(targetUserId)) {\n console.log('');\n console.log(chalk.red(' Please provide a numeric Telegram user ID.'));\n console.log('');\n return;\n }\n\n const rejected = rejectTelegramPendingRequest(config, targetUserId);\n if (!rejected) {\n console.log('');\n console.log(chalk.red(` No pending Telegram request found for user ${userId}.`));\n console.log('');\n return;\n }\n\n saveConfig(config);\n console.log('');\n console.log(chalk.green(` ✓ Rejected Telegram request for ${formatTelegramUser(rejected)}.`));\n restartDaemonIfRunning('Restarting the background daemon to apply the change immediately...');\n console.log('');\n });\n\ntelegramCmd\n .command('remove <userId>')\n .description('Remove an approved Telegram admin or member')\n .action((userId: string) => {\n const config = loadConfig();\n const targetUserId = Number(userId);\n if (isNaN(targetUserId)) {\n console.log('');\n console.log(chalk.red(' Please provide a numeric Telegram user ID.'));\n console.log('');\n return;\n }\n\n const removed = removeTelegramUser(config, targetUserId);\n if (!removed) {\n console.log('');\n console.log(chalk.red(` No approved Telegram user found for ${userId}.`));\n console.log('');\n return;\n }\n\n saveConfig(config);\n console.log('');\n console.log(chalk.green(` ✓ Removed Telegram access for ${formatTelegramUser(removed)}.`));\n restartDaemonIfRunning('Restarting the background daemon to apply the change immediately...');\n console.log('');\n });\n\ntelegramCmd\n .command('promote <userId>')\n .description('Promote an approved Telegram member to admin')\n .action((userId: string) => {\n const config = loadConfig();\n const targetUserId = Number(userId);\n if (isNaN(targetUserId)) {\n console.log('');\n console.log(chalk.red(' Please provide a numeric Telegram user ID.'));\n console.log('');\n return;\n }\n\n const promoted = promoteTelegramUserToAdmin(config, targetUserId);\n if (!promoted) {\n console.log('');\n console.log(chalk.red(` No Telegram member found for ${userId}.`));\n console.log('');\n return;\n }\n\n saveConfig(config);\n console.log('');\n console.log(chalk.green(` ✓ Promoted ${formatTelegramUser(promoted)} to Telegram admin.`));\n restartDaemonIfRunning('Restarting the background daemon to apply the change immediately...');\n console.log('');\n });\n\ntelegramCmd\n .command('demote <userId>')\n .description('Demote a Telegram admin to member')\n .action((userId: string) => {\n const config = loadConfig();\n const targetUserId = Number(userId);\n if (isNaN(targetUserId)) {\n console.log('');\n console.log(chalk.red(' Please provide a numeric Telegram user ID.'));\n console.log('');\n return;\n }\n\n const demoted = demoteTelegramAdmin(config, targetUserId);\n if (!demoted) {\n console.log('');\n console.log(chalk.red(' Could not demote that Telegram admin. Mercury must keep at least one admin.'));\n console.log('');\n return;\n }\n\n saveConfig(config);\n console.log('');\n console.log(chalk.green(` ✓ Demoted ${formatTelegramUser(demoted)} to Telegram member.`));\n restartDaemonIfRunning('Restarting the background daemon to apply the change immediately...');\n console.log('');\n });\n\ntelegramCmd\n .command('unpair')\n .description('Reset all Telegram access for this Mercury instance')\n .action(() => {\n const config = loadConfig();\n const hasAnyAccess = getTelegramApprovedUsers(config).length > 0 || getTelegramPendingRequests(config).length > 0;\n if (!hasAnyAccess) {\n console.log('');\n console.log(chalk.dim(' Telegram access is already empty.'));\n console.log('');\n return;\n }\n\n clearTelegramAccess(config);\n saveConfig(config);\n\n console.log('');\n console.log(chalk.green(' ✓ Telegram access reset.'));\n restartDaemonIfRunning('Restarting the background daemon to apply the change immediately...');\n if (!getDaemonStatus().running) {\n console.log(chalk.dim(' New private Telegram users can send /start to request access.'));\n console.log(chalk.dim(' The first request must be approved from the CLI with `mercury telegram approve <pairing-code>`.'));\n }\n console.log('');\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();\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { config as loadDotenv } from 'dotenv';\n\nconst MERCURY_HOME = join(homedir(), '.mercury');\n\nloadDotenv();\nconst mercuryEnvPath = join(MERCURY_HOME, '.env');\nif (existsSync(mercuryEnvPath)) {\n loadDotenv({ path: mercuryEnvPath });\n}\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 TelegramAccessUser {\n userId: number;\n chatId: number;\n username?: string;\n firstName?: string;\n requestedAt?: string;\n approvedAt: string;\n}\n\nexport interface TelegramPendingRequest {\n userId: number;\n chatId: number;\n username?: string;\n firstName?: string;\n requestedAt: string;\n pairingCode?: string;\n}\n\nexport type ProviderName =\n | 'openai'\n | 'anthropic'\n | 'deepseek'\n | 'grok'\n | 'ollamaCloud'\n | 'ollamaLocal';\n\nexport interface MercuryConfig {\n identity: {\n name: string;\n owner: string;\n creator?: string;\n };\n providers: {\n default: ProviderName;\n openai: ProviderConfig;\n anthropic: ProviderConfig;\n deepseek: ProviderConfig;\n grok: ProviderConfig;\n ollamaCloud: ProviderConfig;\n ollamaLocal: ProviderConfig;\n };\n channels: {\n telegram: {\n enabled: boolean;\n botToken: string;\n webhookUrl?: string;\n allowedChatIds?: number[];\n streaming?: boolean;\n admins: TelegramAccessUser[];\n members: TelegramAccessUser[];\n pending: TelegramPendingRequest[];\n pairedUserId?: number;\n pairedChatId?: number;\n pairedUsername?: string;\n };\n };\n github: {\n username: string;\n email: string;\n defaultOwner: string;\n defaultRepo: string;\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', 'deepseek') as ProviderName,\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 grok: {\n name: 'grok',\n apiKey: getEnv('GROK_API_KEY', ''),\n baseUrl: getEnv('GROK_BASE_URL', 'https://api.x.ai/v1'),\n model: getEnv('GROK_MODEL', 'grok-4'),\n enabled: getEnvBool('GROK_ENABLED', true),\n },\n ollamaCloud: {\n name: 'ollamaCloud',\n apiKey: getEnv('OLLAMA_CLOUD_API_KEY', ''),\n baseUrl: getEnv('OLLAMA_CLOUD_BASE_URL', 'https://ollama.com/api'),\n model: getEnv('OLLAMA_CLOUD_MODEL', 'gpt-oss:120b'),\n enabled: getEnvBool('OLLAMA_CLOUD_ENABLED', true),\n },\n ollamaLocal: {\n name: 'ollamaLocal',\n apiKey: '',\n baseUrl: getEnv('OLLAMA_LOCAL_BASE_URL', 'http://127.0.0.1:11434/api'),\n model: getEnv('OLLAMA_LOCAL_MODEL', 'gpt-oss:20b'),\n enabled: getEnvBool('OLLAMA_LOCAL_ENABLED', false),\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 admins: [],\n members: [],\n pending: [],\n },\n },\n github: {\n username: getEnv('GITHUB_USERNAME', ''),\n email: getEnv('GITHUB_EMAIL', 'mercury@cosmicstack.org'),\n defaultOwner: getEnv('GITHUB_DEFAULT_OWNER', ''),\n defaultRepo: getEnv('GITHUB_DEFAULT_REPO', ''),\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', 1_000_000),\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 migrateLegacyTelegramAccess(deepMerge(defaults, fileConfig));\n }\n return migrateLegacyTelegramAccess(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' && isProviderConfigured(p));\n}\n\nexport function isProviderConfigured(provider: ProviderConfig): boolean {\n if (!provider.enabled) return false;\n if (provider.name === 'ollamaLocal') {\n return provider.baseUrl.length > 0 && provider.model.length > 0;\n }\n return provider.apiKey.length > 0;\n}\n\nexport function getTelegramApprovedUsers(config: MercuryConfig): TelegramAccessUser[] {\n return [\n ...config.channels.telegram.admins,\n ...config.channels.telegram.members,\n ];\n}\n\nexport function getTelegramApprovedChatIds(config: MercuryConfig): number[] {\n return [...new Set(getTelegramApprovedUsers(config).map((user) => user.chatId))];\n}\n\nexport function getTelegramAdmins(config: MercuryConfig): TelegramAccessUser[] {\n return config.channels.telegram.admins;\n}\n\nexport function getTelegramPendingRequests(config: MercuryConfig): TelegramPendingRequest[] {\n return config.channels.telegram.pending;\n}\n\nexport function findTelegramApprovedUser(config: MercuryConfig, userId: number): TelegramAccessUser | undefined {\n return getTelegramApprovedUsers(config).find((user) => user.userId === userId);\n}\n\nexport function findTelegramAdmin(config: MercuryConfig, userId: number): TelegramAccessUser | undefined {\n return config.channels.telegram.admins.find((user) => user.userId === userId);\n}\n\nexport function findTelegramPendingRequest(config: MercuryConfig, userId: number): TelegramPendingRequest | undefined {\n return config.channels.telegram.pending.find((request) => request.userId === userId);\n}\n\nexport function findTelegramPendingRequestByPairingCode(\n config: MercuryConfig,\n pairingCode: string,\n): TelegramPendingRequest | undefined {\n return config.channels.telegram.pending.find((request) => request.pairingCode === pairingCode);\n}\n\nexport function hasTelegramAdmins(config: MercuryConfig): boolean {\n return config.channels.telegram.admins.length > 0;\n}\n\nexport function getTelegramAccessSummary(config: MercuryConfig): string {\n return `${config.channels.telegram.admins.length} admin${config.channels.telegram.admins.length === 1 ? '' : 's'}, `\n + `${config.channels.telegram.members.length} member${config.channels.telegram.members.length === 1 ? '' : 's'}, `\n + `${config.channels.telegram.pending.length} pending`;\n}\n\nexport function addTelegramPendingRequest(\n config: MercuryConfig,\n request: Omit<TelegramPendingRequest, 'requestedAt'> & { requestedAt?: string },\n): TelegramPendingRequest {\n const existing = findTelegramPendingRequest(config, request.userId);\n if (existing) {\n existing.chatId = request.chatId;\n existing.username = request.username || existing.username;\n existing.firstName = request.firstName || existing.firstName;\n existing.pairingCode = request.pairingCode || existing.pairingCode;\n return existing;\n }\n\n const created: TelegramPendingRequest = {\n ...request,\n requestedAt: request.requestedAt || new Date().toISOString(),\n };\n config.channels.telegram.pending.push(created);\n return created;\n}\n\nexport function approveTelegramPendingRequest(\n config: MercuryConfig,\n userId: number,\n role: 'admin' | 'member' = 'member',\n): TelegramAccessUser | null {\n const request = findTelegramPendingRequest(config, userId);\n if (!request) return null;\n\n const approvedUser: TelegramAccessUser = {\n userId: request.userId,\n chatId: request.chatId,\n username: request.username,\n firstName: request.firstName,\n requestedAt: request.requestedAt,\n approvedAt: new Date().toISOString(),\n };\n\n config.channels.telegram.pending = config.channels.telegram.pending\n .filter((entry) => entry.userId !== userId);\n config.channels.telegram.admins = config.channels.telegram.admins\n .filter((entry) => entry.userId !== userId);\n config.channels.telegram.members = config.channels.telegram.members\n .filter((entry) => entry.userId !== userId);\n\n if (role === 'admin') {\n config.channels.telegram.admins.push(approvedUser);\n } else {\n config.channels.telegram.members.push(approvedUser);\n }\n\n return approvedUser;\n}\n\nexport function approveTelegramPendingRequestByPairingCode(\n config: MercuryConfig,\n pairingCode: string,\n): TelegramAccessUser | null {\n const request = findTelegramPendingRequestByPairingCode(config, pairingCode);\n if (!request) return null;\n const role = hasTelegramAdmins(config) ? 'member' : 'admin';\n return approveTelegramPendingRequest(config, request.userId, role);\n}\n\nexport function rejectTelegramPendingRequest(config: MercuryConfig, userId: number): TelegramPendingRequest | null {\n const request = findTelegramPendingRequest(config, userId);\n if (!request) return null;\n config.channels.telegram.pending = config.channels.telegram.pending\n .filter((entry) => entry.userId !== userId);\n return request;\n}\n\nexport function removeTelegramUser(config: MercuryConfig, userId: number): TelegramAccessUser | null {\n const admin = config.channels.telegram.admins.find((entry) => entry.userId === userId);\n if (admin) {\n config.channels.telegram.admins = config.channels.telegram.admins\n .filter((entry) => entry.userId !== userId);\n return admin;\n }\n\n const member = config.channels.telegram.members.find((entry) => entry.userId === userId);\n if (member) {\n config.channels.telegram.members = config.channels.telegram.members\n .filter((entry) => entry.userId !== userId);\n return member;\n }\n\n return null;\n}\n\nexport function promoteTelegramUserToAdmin(config: MercuryConfig, userId: number): TelegramAccessUser | null {\n const member = config.channels.telegram.members.find((entry) => entry.userId === userId);\n if (!member) return null;\n config.channels.telegram.members = config.channels.telegram.members\n .filter((entry) => entry.userId !== userId);\n config.channels.telegram.admins.push(member);\n return member;\n}\n\nexport function demoteTelegramAdmin(config: MercuryConfig, userId: number): TelegramAccessUser | null {\n if (config.channels.telegram.admins.length <= 1) {\n return null;\n }\n\n const admin = config.channels.telegram.admins.find((entry) => entry.userId === userId);\n if (!admin) return null;\n config.channels.telegram.admins = config.channels.telegram.admins\n .filter((entry) => entry.userId !== userId);\n config.channels.telegram.members.push(admin);\n return admin;\n}\n\nexport function clearTelegramAccess(config: MercuryConfig): MercuryConfig {\n config.channels.telegram.admins = [];\n config.channels.telegram.members = [];\n config.channels.telegram.pending = [];\n delete config.channels.telegram.pairedUserId;\n delete config.channels.telegram.pairedChatId;\n delete config.channels.telegram.pairedUsername;\n return config;\n}\n\nexport function clearTelegramPairing(config: MercuryConfig): MercuryConfig {\n return clearTelegramAccess(config);\n}\n\nexport function migrateLegacyTelegramAccess(config: MercuryConfig): MercuryConfig {\n const telegram = config.channels.telegram;\n telegram.admins = telegram.admins || [];\n telegram.members = telegram.members || [];\n telegram.pending = telegram.pending || [];\n\n if (\n telegram.admins.length === 0\n && telegram.members.length === 0\n && typeof telegram.pairedUserId === 'number'\n && typeof telegram.pairedChatId === 'number'\n ) {\n telegram.admins.push({\n userId: telegram.pairedUserId,\n chatId: telegram.pairedChatId,\n username: telegram.pairedUsername,\n approvedAt: new Date().toISOString(),\n });\n }\n\n delete telegram.pairedUserId;\n delete telegram.pairedChatId;\n delete telegram.pairedUsername;\n\n return config;\n}\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 { createOllama } from 'ollama-ai-provider';\nimport { BaseProvider } from './base.js';\nimport type { ProviderConfig } from '../utils/config.js';\n\nexport class OllamaProvider extends BaseProvider {\n readonly name: string;\n readonly model: string;\n private client: ReturnType<typeof createOllama>;\n private modelInstance: any;\n\n constructor(config: ProviderConfig) {\n super(config);\n this.name = config.name;\n this.model = config.model;\n\n const headers = config.apiKey\n ? { Authorization: `Bearer ${config.apiKey}` }\n : undefined;\n\n this.client = createOllama({\n baseURL: config.baseUrl,\n headers,\n });\n this.modelInstance = this.client(config.model);\n }\n\n async generateText(_prompt: string, _systemPrompt: string): Promise<never> {\n throw new Error('Use getModelInstance() with the AI SDK agent loop');\n }\n\n async *streamText(_prompt: string, _systemPrompt: string): AsyncIterable<never> {\n throw new Error('Use getModelInstance() with the AI SDK agent loop');\n }\n\n isAvailable(): boolean {\n if (!this.config.enabled) return false;\n if (this.name === 'ollamaLocal') {\n return this.config.baseUrl.length > 0 && this.config.model.length > 0;\n }\n return this.config.apiKey.length > 0;\n }\n\n getModelInstance() {\n return this.modelInstance;\n }\n}\n","import type { MercuryConfig, ProviderConfig } from '../utils/config.js';\nimport { isProviderConfigured } from '../utils/config.js';\nimport type { BaseProvider } from './base.js';\nimport { OpenAICompatProvider } from './openai-compat.js';\nimport { AnthropicProvider } from './anthropic.js';\nimport { OllamaProvider } from './ollama.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.deepseek,\n config.providers.openai,\n config.providers.anthropic,\n config.providers.grok,\n config.providers.ollamaCloud,\n config.providers.ollamaLocal,\n ];\n\n for (const pc of entries) {\n if (!isProviderConfigured(pc)) continue;\n try {\n let provider: BaseProvider;\n if (pc.name === 'anthropic') {\n provider = new AnthropicProvider(pc);\n } else if (pc.name === 'ollamaCloud' || pc.name === 'ollamaLocal') {\n provider = new OllamaProvider(pc);\n } else {\n provider = new OpenAICompatProvider(pc);\n }\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}\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';\nimport { CLIChannel } from '../channels/cli.js';\nimport { formatToolStep } from '../utils/tool-label.js';\nimport type { ArrowSelectOption } from '../utils/arrow-select.js';\nimport {\n approveTelegramPendingRequest,\n approveTelegramPendingRequestByPairingCode,\n clearTelegramAccess,\n demoteTelegramAdmin,\n getTelegramAccessSummary,\n getTelegramApprovedUsers,\n getTelegramPendingRequests,\n promoteTelegramUserToAdmin,\n rejectTelegramPendingRequest,\n removeTelegramUser,\n saveConfig,\n} from '../utils/config.js';\n\nclass ToolCallLoopDetector {\n private recentCalls: Array<{ tool: string; params: string }> = [];\n private maxEntries = 20;\n private hardAborted = false;\n\n private static readonly HIGH_TOLERANCE_TOOLS = new Set([\n 'fetch_url',\n 'read_file',\n 'list_dir',\n 'web_search',\n 'github_api',\n 'run_command',\n ]);\n\n private static getIdenticalThreshold(): number {\n return 3;\n }\n\n private static getSameToolThreshold(toolName: string): number {\n return ToolCallLoopDetector.HIGH_TOLERANCE_TOOLS.has(toolName) ? 6 : 4;\n }\n\n record(toolName: string, params: Record<string, any>): void {\n const paramsKey = JSON.stringify(params).slice(0, 100);\n this.recentCalls.push({ tool: toolName, params: paramsKey });\n if (this.recentCalls.length > this.maxEntries) {\n this.recentCalls.shift();\n }\n }\n\n detectIdentical(): { tool: string; count: number; message: string } | null {\n if (this.recentCalls.length < 3) return null;\n\n const last = this.recentCalls[this.recentCalls.length - 1];\n\n let identicalCount = 0;\n for (let i = this.recentCalls.length - 1; i >= 0; i--) {\n if (this.recentCalls[i].tool === last.tool && this.recentCalls[i].params === last.params) {\n identicalCount++;\n } else {\n break;\n }\n }\n\n if (identicalCount >= ToolCallLoopDetector.getIdenticalThreshold()) {\n this.hardAborted = true;\n return {\n tool: last.tool,\n count: identicalCount,\n message: `[SYSTEM] You called \"${last.tool}\" ${identicalCount} times with identical parameters and got the same result. This is a hard loop — stop immediately.`,\n };\n }\n\n return null;\n }\n\n detectSameTool(): { tool: string; count: number } | null {\n if (this.recentCalls.length < 4) return null;\n\n const last = this.recentCalls[this.recentCalls.length - 1];\n\n let sameToolCount = 0;\n for (let i = this.recentCalls.length - 1; i >= 0; i--) {\n if (this.recentCalls[i].tool === last.tool) {\n sameToolCount++;\n } else {\n break;\n }\n }\n\n const threshold = ToolCallLoopDetector.getSameToolThreshold(last.tool);\n if (sameToolCount >= threshold) {\n return {\n tool: last.tool,\n count: sameToolCount,\n };\n }\n\n return null;\n }\n\n isHardAborted(): boolean {\n return this.hardAborted;\n }\n\n reset(): void {\n this.recentCalls = [];\n this.hardAborted = false;\n }\n}\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 const loopDetector = new ToolCallLoopDetector();\n const loopAbortController = new AbortController();\n let loopWarningSent = false;\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 abortSignal: loopAbortController.signal,\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 for (const tc of toolCalls) {\n loopDetector.record(tc.toolName, tc.args as Record<string, any>);\n }\n if (toolCalls.some((tc: any) => tc.toolName === 'use_skill')) {\n loopDetector.reset();\n }\n const hardLoop = loopDetector.detectIdentical();\n if (hardLoop) {\n logger.warn({ tool: hardLoop.tool, count: hardLoop.count }, 'Hard loop detected — aborting');\n if (!loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n await channel.send(`⚠ Repeated call detected — ${hardLoop.tool} called ${hardLoop.count}x with same params. Stopping.`, msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\n }\n const softLoop = loopDetector.detectSameTool();\n if (softLoop && !loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n const shouldContinue = await channel.askToContinue(\n `${softLoop.tool} has been called ${softLoop.count}x in a row. This might be a loop.`,\n msg.channelId,\n ).catch(() => false);\n if (shouldContinue) {\n loopDetector.reset();\n loopWarningSent = false;\n } else {\n loopAbortController.abort();\n }\n }\n if (channel && msg.channelType !== 'internal') {\n if (channel instanceof CLIChannel) {\n for (const tc of toolCalls) {\n await (channel as CLIChannel).sendToolFeedback(tc.toolName, tc.args as Record<string, any>).catch(() => {});\n }\n } else {\n await channel.send(` [Using: ${names}]`, msg.channelId).catch(() => {});\n }\n }\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 abortSignal: loopAbortController.signal,\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 for (const tc of toolCalls) {\n loopDetector.record(tc.toolName, tc.args as Record<string, any>);\n }\n if (toolCalls.some((tc: any) => tc.toolName === 'use_skill')) {\n loopDetector.reset();\n }\n const hardLoop = loopDetector.detectIdentical();\n if (hardLoop) {\n logger.warn({ tool: hardLoop.tool, count: hardLoop.count }, 'Hard loop detected — aborting');\n if (!loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n await channel.send(`⚠ Repeated call detected — ${hardLoop.tool} called ${hardLoop.count}x with same params. Stopping.`, msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\n }\n const softLoop = loopDetector.detectSameTool();\n if (softLoop && !loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n const shouldContinue = await channel.askToContinue(\n `${softLoop.tool} has been called ${softLoop.count}x in a row. This might be a loop.`,\n msg.channelId,\n ).catch(() => false);\n if (shouldContinue) {\n loopDetector.reset();\n loopWarningSent = false;\n } else {\n loopAbortController.abort();\n }\n }\n if (channel && msg.channelType !== 'internal') {\n if (channel instanceof CLIChannel) {\n for (const tc of toolCalls) {\n await (channel as CLIChannel).sendToolFeedback(tc.toolName, tc.args as Record<string, any>).catch(() => {});\n }\n } else {\n await channel.send(` [Using: ${names}]`, msg.channelId).catch(() => {});\n }\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 if (loopDetector.isHardAborted() || loopAbortController.signal.aborted) {\n logger.info('Generation aborted due to loop detection — using partial response');\n if (!result && streamedText) {\n result = { text: streamedText, usage: undefined };\n }\n if (!result) {\n result = { text: 'I stopped because I was repeating the same tool calls. What would you like me to do differently?', usage: undefined };\n }\n if (usedProvider) {\n this.providers.markSuccess(usedProvider.name);\n }\n break;\n }\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\n prompt += `\\n\\nEnvironment:\\n- Platform: ${process.platform}\\n- Working directory: ${this.capabilities.getCwd()}`;\n\n const toolNames = this.capabilities.getToolNames();\n const githubTools = ['create_pr', 'review_pr', 'list_issues', 'create_issue', 'github_api'];\n const hasGitHub = githubTools.some(t => toolNames.includes(t));\n if (hasGitHub) {\n let githubHint = '\\n\\nGitHub companion is active.';\n const { defaultOwner, defaultRepo } = this.config.github;\n if (defaultOwner && defaultRepo) {\n githubHint += ` Default repo: ${defaultOwner}/${defaultRepo}. Use this when the user doesn't specify a repo.`;\n }\n\n githubHint += `\n\nAvailable GitHub tools and when to use them:\n- git_add, git_commit, git_push: LOCAL git operations (stage, commit, push to a remote you have SSH/auth access to). All commits include \"Co-authored-by: Mercury <mercury@cosmicstack.org>\".\n- create_pr: Create a pull request on GitHub. The head branch must already exist on the remote.\n- review_pr: Get PR details and optionally post a review comment.\n- list_issues, create_issue: Browse and file issues.\n- github_api: Raw GitHub API access. IMPORTANT USE CASES:\n - Push files directly to GitHub via PUT /repos/{owner}/{repo}/contents/{path} when git push fails due to auth. The body must include \"message\" and \"content\" (base64-encoded file content). This creates a commit on GitHub with Mercury as co-author.\n - Delete files via DELETE /repos/{owner}/{repo}/contents/{path} with a \"message\" and \"sha\" in the body.\n - Any other GitHub API operation not covered by the other tools.\n\nWhen the user asks to \"push to GitHub\" or \"upload files\" and git push fails, use github_api with PUT /repos/{owner}/{repo}/contents/{path} to push content directly through the API. This bypasses local git entirely.\n\nAlways specify owner and repo parameters on GitHub tools. The user's GitHub username is ${this.config.github.username || 'not set'}.'`;\n\n prompt += githubHint;\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 trimmed = content.trim();\n const cmd = trimmed.toLowerCase();\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 `Telegram access: ${getTelegramAccessSummary(config)}`,\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.startsWith('/telegram')) {\n if (channelType !== 'cli') {\n await channel.send('`/telegram` is only available from the Mercury CLI chat.', channelId);\n return true;\n }\n\n const config = ctx.config();\n const rawSubcommand = trimmed.slice('/telegram'.length).trim();\n if (!rawSubcommand && channel instanceof CLIChannel) {\n await channel.withMenu(async (select) => {\n await this.openCliTelegramMenu(channel, channelId, select);\n });\n return true;\n }\n\n const parts = rawSubcommand.split(/\\s+/).filter(Boolean);\n const action = parts[0]?.toLowerCase() || 'help';\n const formatTelegramUser = (user: {\n userId: number;\n username?: string;\n firstName?: string;\n pairingCode?: string;\n }) => {\n const username = user.username ? ` (@${user.username})` : '';\n const firstName = user.firstName ? ` ${user.firstName}` : '';\n const pairingCode = user.pairingCode ? ` [code: ${user.pairingCode}]` : '';\n return `${user.userId}${username}${firstName}${pairingCode}`;\n };\n\n const sendTelegramOverview = async () => {\n const lines = [\n '**Telegram Management**',\n '',\n `Access: ${getTelegramAccessSummary(config)}`,\n `Admins: ${config.channels.telegram.admins.length > 0 ? config.channels.telegram.admins.map(formatTelegramUser).join(', ') : 'none'}`,\n `Members: ${config.channels.telegram.members.length > 0 ? config.channels.telegram.members.map(formatTelegramUser).join(', ') : 'none'}`,\n `Pending: ${config.channels.telegram.pending.length > 0 ? config.channels.telegram.pending.map(formatTelegramUser).join(', ') : 'none'}`,\n '',\n 'Commands:',\n '• `/telegram pending`',\n '• `/telegram users`',\n '• `/telegram approve <pairing-code|user-id>`',\n '• `/telegram reject <user-id>`',\n '• `/telegram remove <user-id>`',\n '• `/telegram promote <user-id>`',\n '• `/telegram demote <user-id>`',\n '• `/telegram reset`',\n ];\n await channel.send(lines.join('\\n'), channelId);\n };\n\n if (action === 'help' || action === 'status') {\n await sendTelegramOverview();\n return true;\n }\n\n if (action === 'pending') {\n const pending = getTelegramPendingRequests(config);\n const lines = [\n '**Telegram Pending Requests**',\n '',\n pending.length > 0 ? pending.map(formatTelegramUser).join('\\n') : 'No pending Telegram requests.',\n ];\n await channel.send(lines.join('\\n'), channelId);\n return true;\n }\n\n if (action === 'users') {\n const approved = getTelegramApprovedUsers(config);\n const lines = [\n '**Telegram Approved Users**',\n '',\n `Admins: ${config.channels.telegram.admins.length > 0 ? config.channels.telegram.admins.map(formatTelegramUser).join(', ') : 'none'}`,\n `Members: ${config.channels.telegram.members.length > 0 ? config.channels.telegram.members.map(formatTelegramUser).join(', ') : 'none'}`,\n '',\n `Total approved: ${approved.length}`,\n ];\n await channel.send(lines.join('\\n'), channelId);\n return true;\n }\n\n if (action === 'approve') {\n const value = parts[1];\n if (!value) {\n await channel.send('Usage: `/telegram approve <pairing-code|user-id>`', channelId);\n return true;\n }\n\n let approved = approveTelegramPendingRequestByPairingCode(config, value);\n let resultLabel = value;\n\n if (!approved) {\n const userId = Number(value);\n if (!isNaN(userId)) {\n approved = approveTelegramPendingRequest(config, userId, 'member');\n resultLabel = userId.toString();\n }\n }\n\n if (!approved) {\n await channel.send(`No pending Telegram request found for \\`${resultLabel}\\`.`, channelId);\n return true;\n }\n\n saveConfig(config);\n await channel.send(`Approved Telegram user ${formatTelegramUser(approved)}.`, channelId);\n return true;\n }\n\n if (action === 'reject') {\n const value = Number(parts[1]);\n if (isNaN(value)) {\n await channel.send('Usage: `/telegram reject <user-id>`', channelId);\n return true;\n }\n\n const rejected = rejectTelegramPendingRequest(config, value);\n if (!rejected) {\n await channel.send(`No pending Telegram request found for \\`${value}\\`.`, channelId);\n return true;\n }\n\n saveConfig(config);\n await channel.send(`Rejected Telegram request for ${formatTelegramUser(rejected)}.`, channelId);\n return true;\n }\n\n if (action === 'remove') {\n const value = Number(parts[1]);\n if (isNaN(value)) {\n await channel.send('Usage: `/telegram remove <user-id>`', channelId);\n return true;\n }\n\n const removed = removeTelegramUser(config, value);\n if (!removed) {\n await channel.send(`No approved Telegram user found for \\`${value}\\`.`, channelId);\n return true;\n }\n\n saveConfig(config);\n await channel.send(`Removed Telegram access for ${formatTelegramUser(removed)}.`, channelId);\n return true;\n }\n\n if (action === 'promote') {\n const value = Number(parts[1]);\n if (isNaN(value)) {\n await channel.send('Usage: `/telegram promote <user-id>`', channelId);\n return true;\n }\n\n const promoted = promoteTelegramUserToAdmin(config, value);\n if (!promoted) {\n await channel.send(`No Telegram member found for \\`${value}\\`.`, channelId);\n return true;\n }\n\n saveConfig(config);\n await channel.send(`Promoted ${formatTelegramUser(promoted)} to Telegram admin.`, channelId);\n return true;\n }\n\n if (action === 'demote') {\n const value = Number(parts[1]);\n if (isNaN(value)) {\n await channel.send('Usage: `/telegram demote <user-id>`', channelId);\n return true;\n }\n\n const demoted = demoteTelegramAdmin(config, value);\n if (!demoted) {\n await channel.send('Could not demote that Telegram admin. Mercury must keep at least one admin.', channelId);\n return true;\n }\n\n saveConfig(config);\n await channel.send(`Demoted ${formatTelegramUser(demoted)} to Telegram member.`, channelId);\n return true;\n }\n\n if (action === 'reset' || action === 'unpair') {\n config.channels.telegram.admins = [];\n config.channels.telegram.members = [];\n config.channels.telegram.pending = [];\n saveConfig(config);\n await channel.send('Telegram access reset. New users can send /start to begin pairing again.', channelId);\n return true;\n }\n\n await channel.send(\n `Unknown Telegram command \"${action}\". Try \\`/telegram\\`, \\`/telegram pending\\`, or \\`/telegram users\\`.`,\n channelId,\n );\n return true;\n }\n\n if ((cmd === '/' || cmd === '/menu') && channelType === 'cli' && channel instanceof CLIChannel) {\n await this.openCliCommandMenu(channel, 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\n private async openCliCommandMenu(channel: CLIChannel, channelId: string): Promise<void> {\n const ctx = this.capabilities.getChatCommandContext();\n if (!ctx) return;\n\n await channel.withMenu(async (select) => {\n while (true) {\n const streamLabel = this.telegramStreaming ? 'Disable Telegram Streaming' : 'Enable Telegram Streaming';\n const action = await select('Mercury Commands', [\n { value: 'status', label: 'Status' },\n { value: 'telegram', label: 'Telegram' },\n { value: 'tools', label: 'Tools' },\n { value: 'skills', label: 'Skills' },\n { value: 'stream', label: streamLabel },\n { value: 'help', label: 'Help' },\n { value: 'exit', label: 'Exit' },\n ]);\n\n if (action === 'exit') {\n return;\n }\n\n if (action === 'status') {\n await this.handleChatCommand('/status', 'cli', channelId);\n continue;\n }\n\n if (action === 'telegram') {\n await this.openCliTelegramMenu(channel, channelId, select);\n continue;\n }\n\n if (action === 'tools') {\n await this.handleChatCommand('/tools', 'cli', channelId);\n continue;\n }\n\n if (action === 'skills') {\n await this.handleChatCommand('/skills', 'cli', channelId);\n continue;\n }\n\n if (action === 'stream') {\n await this.handleChatCommand('/stream', 'cli', channelId);\n continue;\n }\n\n if (action === 'help') {\n await channel.send(ctx.manual(), channelId);\n }\n }\n });\n }\n\n private async openCliTelegramMenu(\n channel: CLIChannel,\n channelId: string,\n select: (title: string, options: ArrowSelectOption[]) => Promise<string>,\n ): Promise<void> {\n const ctx = this.capabilities.getChatCommandContext();\n if (!ctx) return;\n const formatTelegramUser = (user: {\n userId: number;\n username?: string;\n firstName?: string;\n pairingCode?: string;\n }) => {\n const username = user.username ? ` (@${user.username})` : '';\n const firstName = user.firstName ? ` ${user.firstName}` : '';\n const pairingCode = user.pairingCode ? ` [code: ${user.pairingCode}]` : '';\n return `${user.userId}${username}${firstName}${pairingCode}`;\n };\n\n const selectFromUsers = async (\n title: string,\n users: Array<{ userId: number; username?: string; firstName?: string; pairingCode?: string }>,\n emptyMessage: string,\n backValue: string = 'back',\n ): Promise<string> => {\n if (users.length === 0) {\n await channel.send(emptyMessage, channelId);\n return backValue;\n }\n\n return select(title, [\n ...users.map((user) => ({\n value: user.pairingCode || user.userId.toString(),\n label: formatTelegramUser(user),\n })),\n { value: backValue, label: 'Back' },\n ]);\n };\n\n while (true) {\n const config = ctx.config();\n const action = await select('Telegram Commands', [\n { value: 'overview', label: 'Overview' },\n { value: 'pending', label: `Pending Requests (${config.channels.telegram.pending.length})` },\n { value: 'users', label: `Approved Users (${getTelegramApprovedUsers(config).length})` },\n { value: 'approve', label: 'Approve Request' },\n { value: 'reject', label: 'Reject Request' },\n { value: 'remove', label: 'Remove User' },\n { value: 'promote', label: 'Promote to Admin' },\n { value: 'demote', label: 'Demote Admin' },\n { value: 'reset', label: 'Reset Telegram Access' },\n { value: 'back', label: 'Back' },\n { value: 'exit', label: 'Exit' },\n ]);\n\n if (action === 'exit') {\n return;\n }\n\n if (action === 'back') {\n return;\n }\n\n if (action === 'overview') {\n await this.handleChatCommand('/telegram status', 'cli', channelId);\n continue;\n }\n\n if (action === 'pending') {\n await this.handleChatCommand('/telegram pending', 'cli', channelId);\n continue;\n }\n\n if (action === 'users') {\n await this.handleChatCommand('/telegram users', 'cli', channelId);\n continue;\n }\n\n if (action === 'approve') {\n const pending = getTelegramPendingRequests(config);\n const selected = await selectFromUsers(\n 'Approve Telegram Request',\n pending,\n 'There are no pending Telegram requests to approve.',\n );\n\n if (selected === 'back') {\n continue;\n }\n\n await this.handleChatCommand(`/telegram approve ${selected}`, 'cli', channelId);\n continue;\n }\n\n if (action === 'reject') {\n const pending = getTelegramPendingRequests(config);\n const selected = await selectFromUsers(\n 'Reject Telegram Request',\n pending,\n 'There are no pending Telegram requests to reject.',\n );\n\n if (selected === 'back') {\n continue;\n }\n\n const request = pending.find((entry) => (entry.pairingCode || entry.userId.toString()) === selected);\n if (!request) {\n await channel.send('That Telegram request is no longer pending.', channelId);\n continue;\n }\n\n await this.handleChatCommand(`/telegram reject ${request.userId}`, 'cli', channelId);\n continue;\n }\n\n if (action === 'remove') {\n const approved = getTelegramApprovedUsers(config);\n const selected = await selectFromUsers(\n 'Remove Telegram User',\n approved,\n 'There are no approved Telegram users to remove.',\n );\n\n if (selected === 'back') {\n continue;\n }\n\n const user = approved.find((entry) => entry.userId.toString() === selected);\n if (!user) {\n await channel.send('That Telegram user is no longer approved.', channelId);\n continue;\n }\n\n await this.handleChatCommand(`/telegram remove ${user.userId}`, 'cli', channelId);\n continue;\n }\n\n if (action === 'promote') {\n const members = config.channels.telegram.members;\n const selected = await selectFromUsers(\n 'Promote Telegram Member',\n members,\n 'There are no Telegram members available to promote.',\n );\n\n if (selected === 'back') {\n continue;\n }\n\n const member = members.find((entry) => entry.userId.toString() === selected);\n if (!member) {\n await channel.send('That Telegram member is no longer available.', channelId);\n continue;\n }\n\n await this.handleChatCommand(`/telegram promote ${member.userId}`, 'cli', channelId);\n continue;\n }\n\n if (action === 'demote') {\n const admins = config.channels.telegram.admins;\n const selected = await selectFromUsers(\n 'Demote Telegram Admin',\n admins,\n 'There are no Telegram admins available to demote.',\n );\n\n if (selected === 'back') {\n continue;\n }\n\n const admin = admins.find((entry) => entry.userId.toString() === selected);\n if (!admin) {\n await channel.send('That Telegram admin is no longer available.', channelId);\n continue;\n }\n\n await this.handleChatCommand(`/telegram demote ${admin.userId}`, 'cli', channelId);\n continue;\n }\n\n if (action === 'reset') {\n const confirmation = await select('Reset Telegram Access?', [\n { value: 'cancel', label: 'Cancel' },\n { value: 'confirm', label: 'Reset all Telegram access' },\n { value: 'back', label: 'Back' },\n ]);\n\n if (confirmation === 'confirm') {\n clearTelegramAccess(config);\n saveConfig(config);\n await channel.send('Telegram access reset. New users can send /start to begin pairing again.', channelId);\n }\n\n continue;\n }\n }\n }\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 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';\nimport { formatToolStep } from '../utils/tool-label.js';\nimport {\n ArrowSelectCancelledError,\n selectWithArrowKeys,\n type ArrowSelectOption,\n} from '../utils/arrow-select.js';\n\nconst USER_PROMPT = ' You: ';\nconst USER_PROMPT_VISIBLE_LEN = USER_PROMPT.length;\nconst AGENT_PREFIX_LEN = USER_PROMPT_VISIBLE_LEN;\n\nfunction agentPrefix(name: string, suffix?: string): string {\n const time = suffix ?? '';\n return chalk.cyan(` ${name}:`) + time;\n}\n\nexport class CLIChannel extends BaseChannel {\n readonly type = 'cli' as const;\n private rl: readline.Interface | null = null;\n private agentName: string;\n private menuDepth = 0;\n private menuAbortController: AbortController | null = null;\n private outputInProgress = 0;\n private streamActive = false;\n private streamToolLines = 0;\n private lastUserInput = '';\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.createInterface();\n this.ready = true;\n logger.info('CLI channel started');\n }\n\n private createInterface(): void {\n this.rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n this.rl.setPrompt(chalk.yellow(USER_PROMPT));\n (this.rl as any)._promptLength = USER_PROMPT_VISIBLE_LEN;\n\n this.rl.on('line', (line) => {\n this.lastUserInput = line.trim();\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\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 this.closeActiveMenu();\n this.beginOutput();\n const timeStr = elapsedMs != null ? chalk.dim(` (${(elapsedMs / 1000).toFixed(1)}s)`) : '';\n const rendered = renderMarkdown(content);\n const indented = this.indent(rendered);\n console.log('');\n console.log(agentPrefix(this.agentName, timeStr));\n console.log(indented);\n console.log('');\n this.endOutput();\n }\n\n async sendFile(filePath: string, _targetId?: string): Promise<void> {\n this.closeActiveMenu();\n this.beginOutput();\n const resolved = path.resolve(filePath);\n if (!fs.existsSync(resolved)) {\n console.log(chalk.red(` File not found: ${filePath}`));\n this.endOutput();\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(agentPrefix(this.agentName, chalk.dim(' (file)')));\n console.log(chalk.dim(` path: ${resolved}`));\n console.log(chalk.dim(` size: ${sizeStr}`));\n console.log('');\n this.endOutput();\n }\n\n async sendToolFeedback(toolName: string, args: Record<string, any>): Promise<void> {\n const label = formatToolStep(toolName, args);\n if (this.streamActive) {\n this.streamToolLines++;\n process.stdout.write(chalk.dim(`\\n ${label}\\n`));\n } else {\n console.log(chalk.dim(` ${label}`));\n }\n }\n\n async stream(content: AsyncIterable<string>, _targetId?: string): Promise<string> {\n this.closeActiveMenu();\n this.beginOutput();\n this.streamActive = true;\n this.streamToolLines = 0;\n\n if (!process.stdout.isTTY) {\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 this.streamActive = false;\n console.log('\\n');\n this.endOutput();\n return full;\n }\n\n console.log(chalk.cyan(` ${this.agentName}:`));\n\n let full = '';\n for await (const chunk of content) {\n process.stdout.write(chunk);\n full += chunk;\n }\n\n this.streamActive = false;\n\n if (!full.trim()) {\n console.log('');\n this.endOutput();\n return full;\n }\n\n const termWidth = process.stdout.columns || 80;\n\n let textLineCount = 0;\n for (const line of full.split('\\n')) {\n const visualLen = line.replace(/\\x1b\\[[0-9;]*m/g, '').length;\n textLineCount += Math.max(1, Math.ceil((visualLen + 2) / termWidth));\n }\n\n const totalLines = 1 + textLineCount + this.streamToolLines;\n\n process.stdout.write(`\\x1b[${totalLines}A`);\n for (let i = 0; i < totalLines; i++) {\n process.stdout.write('\\x1b[2K\\x1b[1B');\n }\n process.stdout.write(`\\x1b[${totalLines}A`);\n\n const rendered = renderMarkdown(full);\n const indented = this.indent(rendered);\n console.log(agentPrefix(this.agentName));\n console.log(indented);\n console.log('');\n\n this.endOutput();\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 process.stdout.write('\\x1b[2K\\r');\n process.stdout.write(chalk.yellow(USER_PROMPT));\n }\n }\n\n async withMenu<T>(runner: (select: (title: string, options: ArrowSelectOption[]) => Promise<string>) => Promise<T>): Promise<T | undefined> {\n this.menuDepth += 1;\n this.menuAbortController = new AbortController();\n this.suspendPrompt();\n\n try {\n return await runner((title, options) => selectWithArrowKeys(title, options, {\n signal: this.menuAbortController?.signal,\n }));\n } catch (error) {\n if (error instanceof ArrowSelectCancelledError) {\n return undefined;\n }\n throw error;\n } finally {\n this.menuDepth = Math.max(0, this.menuDepth - 1);\n if (this.menuDepth === 0) {\n this.menuAbortController = null;\n }\n if (this.menuDepth === 0) {\n this.resumePrompt();\n if (this.outputInProgress === 0) {\n this.showPrompt();\n }\n }\n }\n }\n\n private closeActiveMenu(): void {\n if (!this.menuAbortController?.signal.aborted) {\n this.menuAbortController?.abort();\n }\n }\n\n private beginOutput(): void {\n this.outputInProgress += 1;\n }\n\n private endOutput(): void {\n this.outputInProgress = Math.max(0, this.outputInProgress - 1);\n if (this.menuDepth === 0 && this.outputInProgress === 0) {\n this.showPrompt();\n }\n }\n\n private suspendPrompt(): void {\n if (!this.rl) return;\n process.stdout.write('\\n');\n this.rl.close();\n this.rl = null;\n }\n\n private resumePrompt(): void {\n if (!this.ready || this.rl) return;\n this.createInterface();\n }\n\n private indent(text: string): string {\n return text\n .split('\\n')\n .map((line: string) => ` ${line}`)\n .join('\\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\n async askToContinue(question: string, _targetId?: string): Promise<boolean> {\n return new Promise((resolve) => {\n console.log('');\n console.log(chalk.yellow(` ⚠ ${question}`));\n this.rl?.question(chalk.yellow(' Continue? [y/N] '), (answer) => {\n const val = answer.trim().toLowerCase();\n resolve(val === 'y' || val === 'yes');\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 askToContinue(question: string, targetId?: string): Promise<boolean>;\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 abstract askToContinue(question: string, targetId?: string): Promise<boolean>;\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\nconst HTML_ENTITIES: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n '&#x27;': \"'\",\n '&apos;': \"'\",\n '&nbsp;': ' ',\n};\n\nfunction decodeHtmlEntities(text: string): string {\n return text.replace(/&(?:#[xX]?[0-9a-fA-F]+|[a-zA-Z]+);/g, (match) => {\n if (HTML_ENTITIES[match]) return HTML_ENTITIES[match];\n if (match.startsWith('&#x') || match.startsWith('&#X')) {\n const code = parseInt(match.slice(3, -1), 16);\n return isNaN(code) ? match : String.fromCodePoint(code);\n }\n if (match.startsWith('&#')) {\n const code = parseInt(match.slice(2, -1), 10);\n return isNaN(code) ? match : String.fromCodePoint(code);\n }\n return match;\n });\n}\n\nexport function renderMarkdown(text: string): string {\n try {\n const decoded = decodeHtmlEntities(text);\n const tokens = lexer.lexer(decoded);\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 { z } from 'zod';\n\nconst TOOL_LABELS: Record<string, { icon: string; label: string; argKey?: string; argTransform?: (v: string) => string }> = {\n fetch_url: { icon: '↗', label: 'Fetching', argKey: 'url', argTransform: extractDomain },\n read_file: { icon: '📄', label: 'Reading', argKey: 'path', argTransform: basename },\n write_file: { icon: '✏️', label: 'Writing', argKey: 'path', argTransform: basename },\n create_file: { icon: '✨', label: 'Creating', argKey: 'path', argTransform: basename },\n edit_file: { icon: '✂️', label: 'Editing', argKey: 'path', argTransform: basename },\n delete_file: { icon: '🗑', label: 'Deleting', argKey: 'path', argTransform: basename },\n list_dir: { icon: '📂', label: 'Listing', argKey: 'path', argTransform: basename },\n approve_scope: { icon: '🔓', label: 'Approving scope' },\n run_command: { icon: '⌨', label: 'Running command', argKey: 'command', argTransform: truncate(40) },\n cd: { icon: '📂', label: 'Changing dir to', argKey: 'path' },\n approve_command: { icon: '✅', label: 'Approving command' },\n send_message: { icon: '💬', label: 'Sending message' },\n send_file: { icon: '📎', label: 'Sending file', argKey: 'path', argTransform: basename },\n git_status: { icon: '📊', label: 'Git status' },\n git_diff: { icon: '📝', label: 'Git diff' },\n git_log: { icon: '📋', label: 'Git log' },\n git_add: { icon: '➕', label: 'Staging files' },\n git_commit: { icon: '💾', label: 'Committing' },\n git_push: { icon: '⬆', label: 'Pushing' },\n create_pr: { icon: '🔀', label: 'Creating PR' },\n review_pr: { icon: '👀', label: 'Reviewing PR' },\n list_issues: { icon: '📋', label: 'Listing issues' },\n create_issue: { icon: '🐛', label: 'Creating issue' },\n github_api: { icon: '🔀', label: 'GitHub API', argKey: 'path', argTransform: truncate(30) },\n schedule_task: { icon: '⏰', label: 'Scheduling task' },\n cancel_task: { icon: '❌', label: 'Cancelling task' },\n list_tasks: { icon: '📋', label: 'Listing tasks' },\n use_skill: { icon: '🧠', label: 'Using skill', argKey: 'name' },\n list_skills: { icon: '📋', label: 'Listing skills' },\n install_skill: { icon: '📥', label: 'Installing skill' },\n budget_status: { icon: '💰', label: 'Budget status' },\n};\n\nfunction extractDomain(url: string): string {\n try {\n return new URL(url).hostname;\n } catch {\n return url;\n }\n}\n\nfunction basename(p: string): string {\n const parts = p.replace(/\\\\/g, '/').split('/');\n return parts[parts.length - 1] || p;\n}\n\nfunction truncate(maxLen: number): (v: string) => string {\n return (v: string) => v.length > maxLen ? v.slice(0, maxLen) + '…' : v;\n}\n\nexport function formatToolStep(toolName: string, args: Record<string, any>): string {\n const config = TOOL_LABELS[toolName];\n if (!config) {\n return toolName;\n }\n\n let detail = '';\n if (config.argKey && args[config.argKey] !== undefined) {\n const raw = String(args[config.argKey]);\n detail = config.argTransform ? config.argTransform(raw) : raw;\n }\n\n return detail ? `${config.icon} ${config.label} ${detail}` : `${config.icon} ${config.label}`;\n}","import readline from 'node:readline';\nimport chalk from 'chalk';\n\nexport interface ArrowSelectOption {\n value: string;\n label: string;\n}\n\nexport interface ArrowSelectConfig {\n helperText?: string;\n maxVisibleOptions?: number;\n signal?: AbortSignal;\n}\n\nexport class ArrowSelectCancelledError extends Error {\n constructor(message: string = 'Arrow select cancelled') {\n super(message);\n this.name = 'ArrowSelectCancelledError';\n }\n}\n\nexport async function selectWithArrowKeys(\n title: string,\n options: ArrowSelectOption[],\n config: ArrowSelectConfig = {},\n): Promise<string> {\n if (!process.stdin.isTTY || !process.stdout.isTTY || options.length === 0) {\n return options[0]?.value ?? '';\n }\n\n readline.emitKeypressEvents(process.stdin);\n\n const stdin = process.stdin;\n const stdout = process.stdout;\n const canUseRawMode = typeof stdin.setRawMode === 'function';\n const helperText = config.helperText || 'Use the arrow keys, then press Enter.';\n const maxVisibleOptions = Math.max(\n 1,\n Math.min(\n options.length,\n config.maxVisibleOptions ?? Math.max(5, (stdout.rows || 12) - 7),\n ),\n );\n let activeIndex = 0;\n let renderedLineCount = 0;\n let windowStart = 0;\n\n const topIndicator = (hasHiddenAbove: boolean) => (\n hasHiddenAbove ? chalk.dim(' ↑ more') : ' '\n );\n const bottomIndicator = (hasHiddenBelow: boolean) => (\n hasHiddenBelow ? chalk.dim(' ↓ more') : ' '\n );\n\n const writeLines = (lines: string[]) => {\n if (renderedLineCount > 0) {\n readline.moveCursor(stdout, 0, -(renderedLineCount - 1));\n }\n\n for (let index = 0; index < lines.length; index += 1) {\n readline.cursorTo(stdout, 0);\n readline.clearLine(stdout, 0);\n stdout.write(lines[index]);\n if (index < lines.length - 1) {\n stdout.write('\\n');\n }\n }\n };\n\n const render = () => {\n if (activeIndex < windowStart) {\n windowStart = activeIndex;\n } else if (activeIndex >= windowStart + maxVisibleOptions) {\n windowStart = activeIndex - maxVisibleOptions + 1;\n }\n\n const visibleOptions = options.slice(windowStart, windowStart + maxVisibleOptions);\n const hasHiddenAbove = windowStart > 0;\n const hasHiddenBelow = windowStart + maxVisibleOptions < options.length;\n const lines = [\n chalk.bold.white(` ${title}`),\n chalk.dim(` ${helperText}`),\n '',\n topIndicator(hasHiddenAbove),\n ...visibleOptions.map((option, visibleIndex) => {\n const index = windowStart + visibleIndex;\n const isActive = index === activeIndex;\n const marker = isActive ? chalk.cyanBright('●') : chalk.dim('·');\n const text = isActive ? chalk.cyanBright(option.label) : chalk.dim(option.label);\n return ` ${marker} ${text}`;\n }),\n bottomIndicator(hasHiddenBelow),\n '',\n ];\n\n writeLines(lines);\n renderedLineCount = lines.length;\n };\n\n return await new Promise<string>((resolve, reject) => {\n const cleanup = () => {\n stdin.off('keypress', onKeypress);\n config.signal?.removeEventListener('abort', onAbort);\n if (canUseRawMode) {\n stdin.setRawMode(false);\n }\n };\n\n const onAbort = () => {\n cleanup();\n reject(new ArrowSelectCancelledError());\n };\n\n const onKeypress = (_input: string, key: readline.Key) => {\n if (key.ctrl && key.name === 'c') {\n cleanup();\n process.kill(process.pid, 'SIGINT');\n return;\n }\n\n if (key.name === 'up') {\n activeIndex = (activeIndex - 1 + options.length) % options.length;\n render();\n return;\n }\n\n if (key.name === 'down') {\n activeIndex = (activeIndex + 1) % options.length;\n render();\n return;\n }\n\n if (key.name === 'return') {\n const selected = options[activeIndex]?.value ?? '';\n cleanup();\n stdout.write('\\n');\n resolve(selected);\n }\n };\n\n if (canUseRawMode) {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.on('keypress', onKeypress);\n config.signal?.addEventListener('abort', onAbort, { once: true });\n\n if (config.signal?.aborted) {\n onAbort();\n return;\n }\n\n render();\n });\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 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, TelegramAccessUser, TelegramPendingRequest } from '../utils/config.js';\nimport {\n addTelegramPendingRequest,\n approveTelegramPendingRequest,\n clearTelegramAccess,\n findTelegramAdmin,\n findTelegramApprovedUser,\n findTelegramPendingRequest,\n getTelegramAccessSummary,\n getTelegramAdmins,\n getTelegramApprovedChatIds,\n hasTelegramAdmins,\n rejectTelegramPendingRequest,\n saveConfig,\n} from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\nimport { mdToTelegram } from '../utils/markdown.js';\n\nconst MAX_MESSAGE_LENGTH = 4096;\nconst ACCESS_ACTION_PREFIX = 'tg_access';\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 lastActiveChatId: 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 const userId = ctx.from?.id;\n const username = ctx.from?.username;\n const firstName = ctx.from?.first_name;\n const text = ctx.message.text?.trim() || '';\n const command = this.getCommandName(text);\n\n if (!userId) return;\n\n if (ctx.chat.type !== 'private') {\n await this.sendDirectMessage(chatId, 'This bot is only available in private one-to-one chats.');\n return;\n }\n\n if (command === '/start' || command === '/pair') {\n await this.handleAccessRequest(userId, chatId, username, firstName);\n return;\n }\n\n const approvedUser = findTelegramApprovedUser(this.config, userId);\n if (!approvedUser) {\n const pending = findTelegramPendingRequest(this.config, userId);\n if (pending) {\n await this.sendDirectMessage(chatId, this.getPendingStatusMessage());\n } else {\n await this.sendDirectMessage(chatId, 'This bot is not available to you. Send /start to request access.');\n }\n return;\n }\n\n this.lastActiveChatId = chatId;\n logger.info({ chatId, text: ctx.message.text?.slice(0, 50) }, 'Telegram message received');\n\n if (command === '/unpair') {\n if (!this.isAdminUser(userId)) {\n await this.sendDirectMessage(chatId, 'Only Telegram admins can reset Telegram access.');\n return;\n }\n\n this.resetAccess();\n await this.sendDirectMessage(\n chatId,\n 'Telegram access reset. New users can send /start to request access. The first request must be approved from the Mercury CLI.',\n );\n return;\n }\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 if (data.startsWith(`${ACCESS_ACTION_PREFIX}:`)) {\n await this.handleAccessCallback(ctx, data);\n return;\n }\n\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 new Promise<void>((resolve, reject) => {\n let settled = false;\n\n void 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 if (!settled) {\n settled = true;\n resolve();\n }\n },\n }).catch((err: any) => {\n if (!settled) {\n settled = true;\n reject(err);\n return;\n }\n logger.error({ err: err.message }, 'Telegram bot start loop failed after startup');\n });\n });\n }\n\n private async registerCommands(): Promise<void> {\n if (!this.bot) return;\n\n const commands = [\n { command: 'start', description: 'Request Telegram access to this Mercury instance' },\n { command: 'pair', description: 'Request Telegram access to this Mercury instance' },\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 { command: 'unpair', description: 'Reset all Telegram access for this Mercury instance' },\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 chatIds = this.resolveTargetChatIds(targetId);\n if (chatIds.length === 0 || !this.bot) {\n logger.warn({ targetId, chatIds }, 'Telegram send: no valid chat IDs');\n return;\n }\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 chatId of chatIds) {\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, chatId }, '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, chatId }, 'Telegram send failed');\n }\n }\n }\n }\n }\n\n async sendFile(filePath: string, targetId?: string): Promise<void> {\n const chatIds = this.resolveTargetChatIds(targetId);\n if (chatIds.length === 0 || !this.bot) {\n logger.warn({ targetId, chatIds }, 'Telegram sendFile: no valid chat IDs');\n return;\n }\n\n const resolved = path.resolve(filePath);\n if (!fs.existsSync(resolved)) {\n for (const chatId of chatIds) {\n await this.bot.api.sendMessage(chatId, `File not found: ${filePath}`).catch(() => {});\n }\n return;\n }\n\n const filename = path.basename(resolved);\n const ext = path.extname(resolved).toLowerCase();\n\n for (const chatId of chatIds) {\n const inputFile = new InputFile(resolved);\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, chatId }, 'Telegram sendFile failed');\n await this.bot.api.sendMessage(chatId, `Failed to send file: ${err.message}`).catch(() => {});\n }\n }\n }\n\n async stream(content: AsyncIterable<string>, targetId?: string): Promise<string> {\n const chatIds = this.resolveTargetChatIds(targetId);\n if (chatIds.length === 0 || !this.bot) return '';\n\n let full = '';\n for await (const chunk of content) {\n full += chunk;\n }\n const html = mdToTelegram(full);\n for (const chatId of chatIds) {\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)).catch(() => {});\n }\n }\n return full;\n }\n\n async typing(targetId?: string): Promise<void> {\n const chatIds = this.resolveTargetChatIds(targetId);\n if (chatIds.length === 0 || !this.bot) return;\n await this.bot.api.sendChatAction(chatIds[0], '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 chatIds = this.resolveTargetChatIds(targetId);\n const chatId = chatIds[0];\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 async askToContinue(question: string, targetId?: string): Promise<boolean> {\n const chatIds = this.resolveTargetChatIds(targetId);\n const chatId = chatIds[0];\n if (!chatId || !this.bot) return false;\n\n const id = `loop_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const keyboard = new InlineKeyboard()\n .text('Continue', `${id}:yes`)\n .text('Stop', `${id}:no`);\n\n try {\n await this.bot.api.sendMessage(chatId, mdToTelegram(question), {\n parse_mode: 'HTML',\n reply_markup: keyboard,\n });\n } catch {\n await this.bot.api.sendMessage(chatId, question, {\n reply_markup: keyboard,\n });\n }\n\n return new Promise((resolve) => {\n this.pendingApprovals.set(`${id}:yes`, () => resolve(true));\n this.pendingApprovals.set(`${id}:no`, () => resolve(false));\n\n setTimeout(() => {\n this.pendingApprovals.delete(`${id}:yes`);\n this.pendingApprovals.delete(`${id}:no`);\n resolve(false);\n }, 120_000);\n });\n }\n\n private async handleAccessRequest(\n userId: number,\n chatId: number,\n username?: string,\n firstName?: string,\n ): Promise<void> {\n const approvedUser = findTelegramApprovedUser(this.config, userId);\n if (approvedUser) {\n await this.sendDirectMessage(chatId, this.getApprovedStatusMessage(approvedUser));\n return;\n }\n\n const existingRequest = findTelegramPendingRequest(this.config, userId);\n if (existingRequest) {\n await this.sendDirectMessage(chatId, this.getPendingStatusMessage(existingRequest));\n return;\n }\n\n if (!hasTelegramAdmins(this.config) && this.config.channels.telegram.pending.length > 0) {\n await this.sendDirectMessage(\n chatId,\n 'Initial Telegram pairing is already in progress for another user. Ask the Mercury operator to finish setup or reset Telegram access first.',\n );\n return;\n }\n\n const request = addTelegramPendingRequest(this.config, {\n userId,\n chatId,\n username,\n firstName,\n pairingCode: hasTelegramAdmins(this.config) ? undefined : this.generatePairingCode(),\n });\n saveConfig(this.config);\n logger.info({ chatId, userId, username }, 'Telegram access request recorded');\n\n await this.sendDirectMessage(chatId, this.getPendingStatusMessage(request));\n\n if (!hasTelegramAdmins(this.config)) {\n return;\n }\n\n await this.notifyAdminsOfPendingRequest(request);\n }\n\n private async notifyAdminsOfPendingRequest(request: TelegramPendingRequest): Promise<void> {\n if (!this.bot) return;\n\n const keyboard = new InlineKeyboard()\n .text('Approve', `${ACCESS_ACTION_PREFIX}:approve:${request.userId}`)\n .text('Reject', `${ACCESS_ACTION_PREFIX}:reject:${request.userId}`);\n\n const username = request.username ? ` (@${request.username})` : '';\n const firstName = request.firstName ? ` (${request.firstName})` : '';\n const message = [\n 'Telegram access request pending approval.',\n '',\n `User ID: ${request.userId}${username}${firstName}`,\n `Requested: ${new Date(request.requestedAt).toLocaleString()}`,\n '',\n 'Use the buttons below to approve or reject this user.',\n ].join('\\n');\n\n for (const admin of getTelegramAdmins(this.config)) {\n try {\n await this.bot.api.sendMessage(admin.chatId, mdToTelegram(message), {\n parse_mode: 'HTML',\n reply_markup: keyboard,\n });\n } catch {\n await this.bot.api.sendMessage(admin.chatId, message, {\n reply_markup: keyboard,\n }).catch(() => {});\n }\n }\n }\n\n private async handleAccessCallback(ctx: Parameters<Bot['on']>[1] extends never ? never : any, data: string): Promise<void> {\n const actorUserId = ctx.from?.id;\n const actorChatId = ctx.chat?.id;\n if (!actorUserId || !actorChatId) {\n await ctx.answerCallbackQuery({ text: 'Unavailable' });\n return;\n }\n\n if (!this.isAdminUser(actorUserId)) {\n await ctx.answerCallbackQuery({ text: 'Admins only' });\n return;\n }\n\n const [, action, rawUserId] = data.split(':');\n const requestUserId = Number(rawUserId);\n if (!requestUserId) {\n await ctx.answerCallbackQuery({ text: 'Invalid request' });\n return;\n }\n\n const request = findTelegramPendingRequest(this.config, requestUserId);\n if (!request) {\n await ctx.answerCallbackQuery({ text: 'Already handled' });\n await ctx.editMessageReplyMarkup({ reply_markup: undefined }).catch(() => {});\n return;\n }\n\n if (action === 'approve') {\n const approved = approveTelegramPendingRequest(this.config, requestUserId, 'member');\n if (!approved) {\n await ctx.answerCallbackQuery({ text: 'Already handled' });\n return;\n }\n\n saveConfig(this.config);\n await ctx.answerCallbackQuery({ text: 'Approved' });\n await ctx.editMessageReplyMarkup({ reply_markup: undefined }).catch(() => {});\n await this.sendDirectMessage(\n request.chatId,\n `Telegram access approved. You can now chat with Mercury.\\n\\nTelegram access: ${getTelegramAccessSummary(this.config)}`,\n );\n await this.sendDirectMessage(actorChatId, `Approved Telegram access for ${this.formatRequestLabel(request)}.`);\n return;\n }\n\n if (action === 'reject') {\n const rejected = rejectTelegramPendingRequest(this.config, requestUserId);\n if (!rejected) {\n await ctx.answerCallbackQuery({ text: 'Already handled' });\n return;\n }\n\n saveConfig(this.config);\n await ctx.answerCallbackQuery({ text: 'Rejected' });\n await ctx.editMessageReplyMarkup({ reply_markup: undefined }).catch(() => {});\n await this.sendDirectMessage(\n request.chatId,\n 'Your Telegram access request was rejected. This bot is not available to you.',\n );\n await this.sendDirectMessage(actorChatId, `Rejected Telegram access for ${this.formatRequestLabel(request)}.`);\n return;\n }\n\n await ctx.answerCallbackQuery({ text: 'Unknown action' });\n }\n\n private resolveTargetChatIds(targetId?: string): number[] {\n if (!targetId || targetId === 'notification') {\n return getTelegramApprovedChatIds(this.config);\n }\n\n if (targetId.startsWith('telegram:')) {\n const raw = Number(targetId.split(':')[1]);\n return isNaN(raw) ? [] : [raw];\n }\n\n const num = Number(targetId);\n return isNaN(num) ? [] : [num];\n }\n\n private isAdminUser(userId: number): boolean {\n return !!findTelegramAdmin(this.config, userId);\n }\n\n private getCommandName(text: string): string {\n return text.trim().split(/\\s+/)[0]?.toLowerCase() || '';\n }\n\n private getPendingStatusMessage(request?: TelegramPendingRequest): string {\n if (!hasTelegramAdmins(this.config)) {\n const pairingCode = request?.pairingCode ?? 'unknown';\n return [\n 'Your Telegram pairing request has been recorded.',\n '',\n `Pairing code: ${pairingCode}`,\n '',\n 'Enter this code in the Mercury terminal to finish setup.',\n ].join('\\n');\n }\n\n return 'Your Telegram access request has been recorded and is waiting for approval from a Telegram admin.';\n }\n\n private getApprovedStatusMessage(user: TelegramAccessUser): string {\n const role = this.isAdminUser(user.userId) ? 'admin' : 'member';\n return `You are already approved as a Telegram ${role}.\\n\\nTelegram access: ${getTelegramAccessSummary(this.config)}`;\n }\n\n private formatRequestLabel(request: TelegramPendingRequest): string {\n const username = request.username ? ` (@${request.username})` : '';\n const firstName = request.firstName ? ` ${request.firstName}` : '';\n return `${request.userId}${username}${firstName}`;\n }\n\n private resetAccess(): void {\n clearTelegramAccess(this.config);\n saveConfig(this.config);\n this.lastActiveChatId = null;\n logger.info('Telegram access reset');\n }\n\n private generatePairingCode(): string {\n return Math.floor(100000 + Math.random() * 900000).toString();\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 async sendDirectMessage(chatId: number, content: string): Promise<void> {\n if (!this.bot) return;\n try {\n await this.bot.api.sendMessage(chatId, mdToTelegram(content), { parse_mode: 'HTML' });\n } catch {\n await this.bot.api.sendMessage(chatId, content).catch(() => {});\n }\n }\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 private tempScopes: FileScope[] = [];\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 const tempScope = this.findTempScope(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 if (tempScope) {\n if (mode === 'read' && tempScope.read) return { allowed: true };\n if (mode === 'write' && tempScope.write) return { allowed: true };\n return { allowed: false, reason: `Permission denied: ${mode} access to ${path}` };\n }\n\n return { allowed: false, reason: `Permission denied for ${mode} access to ${path}` };\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: `No permission to access ${hasPathTraversal}. Use approve_scope tool with path=\"${hasPathTraversal}\" and mode=\"write\" to request access.`, needsApproval: false };\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 async requestScopeExternal(path: string, mode: 'read' | 'write'): Promise<{ allowed: boolean; reason?: string }> {\n if (!this.askHandler) {\n return { allowed: false, reason: `Permission denied for ${mode} access to ${path}` };\n }\n\n const prompt = `Mercury needs ${mode} access to:\\n${path}\\n\\nAllow access?`;\n const response = await this.askHandler(prompt);\n\n if (response === 'always') {\n this.addScope(path, mode === 'read', mode === 'write');\n return { allowed: true };\n }\n\n if (response === 'yes') {\n this.addTempScope(path, mode === 'read', mode === 'write');\n return { allowed: true };\n }\n\n return { allowed: false, reason: `Permission denied for ${mode} access to ${path}` };\n }\n\n addTempScope(path: string, read: boolean, write: boolean): void {\n const resolved = resolve(path);\n this.tempScopes.push({ path: resolved, read, write });\n logger.info({ path: resolved, read, write }, 'Temp permission scope added (session only)');\n }\n\n private findTempScope(resolvedPath: string): FileScope | undefined {\n for (const scope of this.tempScopes) {\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 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, isAbsolute } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createReadFileTool(permissions: PermissionManager, getCwd: () => string) {\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 = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n const check = await permissions.checkFsAccess(resolved, 'read');\n if (!check.allowed) {\n const parentDir = resolve(resolved, '..');\n return `Error: Permission denied for read access to ${resolved}. Use the approve_scope tool with path=\"${parentDir}\" and mode=\"read\" to request access from the user.`;\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, isAbsolute } from 'node:path';\nimport { mkdirSync } from 'node:fs';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createWriteFileTool(permissions: PermissionManager, getCwd: () => string) {\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 = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n const check = await permissions.checkFsAccess(resolved, 'write');\n if (!check.allowed) {\n const parentDir = resolve(resolved, '..');\n return `Error: Permission denied for write access to ${resolved}. Use the approve_scope tool with path=\"${parentDir}\" and mode=\"write\" to request access from the user.`;\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, isAbsolute } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createCreateFileTool(permissions: PermissionManager, getCwd: () => string) {\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 = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n const check = await permissions.checkFsAccess(resolved, 'write');\n if (!check.allowed) {\n const parentDir = resolve(resolved, '..');\n return `Error: Permission denied for write access to ${resolved}. Use the approve_scope tool with path=\"${parentDir}\" and mode=\"write\" to request access from the user.`;\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, isAbsolute } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createListDirTool(permissions: PermissionManager, getCwd: () => string) {\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 = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n const check = await permissions.checkFsAccess(resolved, 'read');\n if (!check.allowed) {\n return `Error: Permission denied for read access to ${resolved}. Use the approve_scope tool with path=\"${resolved}\" and mode=\"read\" to request access from the user.`;\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, isAbsolute } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createDeleteFileTool(permissions: PermissionManager, getCwd: () => string) {\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 = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n const check = await permissions.checkFsAccess(resolved, 'write');\n if (!check.allowed) {\n const parentDir = resolve(resolved, '..');\n return `Error: Permission denied for write access to ${resolved}. Use the approve_scope tool with path=\"${parentDir}\" and mode=\"write\" to request access from the user.`;\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, isAbsolute } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createEditFileTool(permissions: PermissionManager, getCwd: () => string) {\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 = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n\n const fsCheck = await permissions.checkFsAccess(resolved, 'write');\n if (!fsCheck.allowed) {\n const parentDir = resolve(resolved, '..');\n return `Error: Permission denied for write access to ${resolved}. Use the approve_scope tool with path=\"${parentDir}\" and mode=\"write\" to request access from the user.`;\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, isAbsolute } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createSendFileTool(\n permissions: PermissionManager,\n getCwd: () => string,\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 to the relevant approved recipients. 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 = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n const check = await permissions.checkFsAccess(resolved, 'read');\n if (!check.allowed) {\n const parentDir = resolve(resolved, '..');\n return `Error: Permission denied for read access to ${resolved}. Use the approve_scope tool with path=\"${parentDir}\" and mode=\"read\" to request access from the user.`;\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}\n","import { tool } from 'ai';\nimport { z } from 'zod';\n\nexport function createSendMessageTool(\n sendMessage: (content: string) => Promise<void>,\n) {\n return tool({\n description:\n 'Send a message through the configured outbound channel. For Telegram this sends to the approved Telegram recipients. Use this only when the user explicitly asks you to send something to Telegram or asks for scheduled results to be sent there.',\n parameters: z.object({\n content: z.string().describe('The message content to send to the approved Telegram recipients'),\n }),\n execute: async ({ content }) => {\n const trimmed = content.trim();\n if (!trimmed) {\n return 'Error: Message content cannot be empty.';\n }\n\n try {\n await sendMessage(trimmed);\n return 'Message sent to the approved Telegram recipients.';\n } catch (err: any) {\n return `Error sending message: ${err.message}`;\n }\n },\n });\n}\n","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { resolve, isAbsolute } from 'node:path';\nimport type { PermissionManager } from '../permissions.js';\n\nexport function createApproveScopeTool(permissions: PermissionManager, getCwd: () => string) {\n return tool({\n description: 'Request user approval to access a directory outside current scopes. Use this when a file tool returns a permission denied error. The user gets an approval prompt (Allow/Always/Deny buttons on Telegram, yes/always/no on CLI). \"Allow\" grants session-only access. \"Always\" persists to disk. After approval, retry the original file operation.',\n parameters: z.object({\n path: z.string().describe('The directory path to request access to'),\n mode: z.enum(['read', 'write']).describe('The access mode needed'),\n }),\n execute: async ({ path, mode }) => {\n const resolved = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path);\n const result = await permissions.requestScopeExternal(resolved, mode);\n if (result.allowed) {\n return `Access approved for ${mode} access to ${resolved}. You can now retry the file operation.`;\n }\n return `Access denied for ${mode} access to ${resolved}. The user did not approve scope access.`;\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\nimport { resolve, isAbsolute } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { PermissionManager } from '../permissions.js';\nimport { logger } from '../../utils/logger.js';\n\nexport function createRunCommandTool(permissions: PermissionManager, getCwd: () => string, setCwd: (dir: string) => void) {\n return tool({\n description: `Run a shell command in the current working directory. Use the cd tool to change directories first — cd commands within this tool only affect chained commands (e.g., \"cd /path && ls\"), not subsequent calls.\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.`,\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 const cwd = getCwd();\n\n try {\n logger.info({ cmd: command, cwd }, 'Executing shell command');\n const result = execSync(command, {\n cwd,\n timeout: 30000,\n maxBuffer: 1024 * 1024,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n const trimmedOutput = result?.trim() || '(no output)';\n\n detectCd(command, cwd, setCwd);\n\n return trimmedOutput;\n } catch (err: any) {\n const stderr = err.stderr?.trim();\n const stdout = err.stdout?.trim();\n\n if (stdout || stderr) {\n detectCd(command, cwd, setCwd);\n }\n\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}\n\nfunction detectCd(command: string, currentCwd: string, setCwd: (dir: string) => void): void {\n const trimmed = command.trim();\n\n const cdOnly = trimmed.match(/^cd\\s+(.+)$/);\n if (cdOnly) {\n const target = cdOnly[1].replace(/^[\"']|[\"']$/g, '').replace(/~/, process.env.HOME || '');\n const resolved = isAbsolute(target) ? target : resolve(currentCwd, target);\n if (existsSync(resolved)) {\n setCwd(resolved);\n }\n return;\n }\n\n const cdChain = trimmed.match(/cd\\s+(.+?)\\s*&&/);\n if (cdChain) {\n const target = cdChain[1].replace(/^[\"']|[\"']$/g, '').replace(/~/, process.env.HOME || '');\n const resolved = isAbsolute(target) ? target : resolve(currentCwd, target);\n if (existsSync(resolved)) {\n setCwd(resolved);\n }\n }\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { resolve, isAbsolute } from 'node:path';\nimport { existsSync, statSync } from 'node:fs';\n\nexport function createCdTool(getCwd: () => string, setCwd: (dir: string) => void) {\n return tool({\n description: 'Change the current working directory. All subsequent file operations, shell commands, and git operations will use this directory. Use this before running commands in a specific project folder.',\n parameters: z.object({\n path: z.string().describe('The directory to change to. Can be absolute or relative to the current directory.'),\n }),\n execute: async ({ path }) => {\n const cwd = getCwd();\n const resolved = isAbsolute(path) ? resolve(path) : resolve(cwd, path);\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: Not a directory: ${resolved}`;\n }\n } catch {\n return `Error: Cannot access: ${resolved}`;\n }\n\n setCwd(resolved);\n return `Changed directory to ${resolved}`;\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(getCwd: () => string) {\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, cwd: getCwd() });\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(getCwd: () => string) {\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, cwd: getCwd() });\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(getCwd: () => string) {\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, cwd: getCwd() });\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(getCwd: () => string) {\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, cwd: getCwd() });\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\nconst CO_AUTHOR = 'Mercury <mercury@cosmicstack.org>';\n\nexport function createGitCommitTool(getCwd: () => string) {\n return tool({\n description: 'Record changes to the repository. Creates a new commit with staged changes. Automatically includes a Co-authored-by trailer for attribution.',\n parameters: z.object({\n message: z.string().describe('Commit message'),\n }),\n execute: async ({ message }) => {\n try {\n const fullMessage = `${message}\\n\\nCo-authored-by: ${CO_AUTHOR}`;\n const escapedMsg = fullMessage.replace(/\"/g, '\\\\\"');\n const result = execSync(`git commit -m \"${escapedMsg}\"`, { encoding: 'utf-8', timeout: 10000, cwd: getCwd() });\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, getCwd: () => string) {\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, cwd: getCwd() });\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';\nimport { githubRequest } from '../../utils/github.js';\n\nexport function createCreatePrTool() {\n return tool({\n description: 'Create a pull request on GitHub. Requires GITHUB_TOKEN to be configured.',\n parameters: z.object({\n owner: z.string().describe('Repository owner (username or org)'),\n repo: z.string().describe('Repository name'),\n title: z.string().describe('PR title'),\n body: z.string().describe('PR description (markdown supported)').default(''),\n head: z.string().describe('The branch containing the changes'),\n base: z.string().describe('The branch to merge into').default('main'),\n draft: z.boolean().describe('Create as draft PR').default(false),\n }),\n execute: async ({ owner, repo, title, body, head, base, draft }) => {\n try {\n const result = await githubRequest(`/repos/${owner}/${repo}/pulls`, {\n method: 'POST',\n body: { title, body, head, base, draft },\n });\n\n return `PR created: ${result.html_url}\\n#${result.number}: ${result.title}\\n${draft ? '(draft)' : ''} ${result.state}`;\n } catch (err: any) {\n return `Error creating PR: ${err.message}`;\n }\n },\n });\n}","import { logger } from './logger.js';\n\nconst GITHUB_API = 'https://api.github.com';\n\nlet cachedToken: string | null = null;\n\nexport function setGitHubToken(token: string): void {\n cachedToken = token;\n}\n\nexport function getGitHubToken(): string | null {\n if (cachedToken) return cachedToken;\n return process.env.GITHUB_TOKEN || null;\n}\n\nexport function isGitHubConfigured(): boolean {\n return !!getGitHubToken();\n}\n\ninterface GitHubRequestOptions {\n method?: string;\n body?: any;\n headers?: Record<string, string>;\n}\n\nexport async function githubRequest(path: string, options: GitHubRequestOptions = {}): Promise<any> {\n const token = getGitHubToken();\n if (!token) {\n throw new Error('GITHUB_TOKEN not configured. Run mercury doctor to set it up.');\n }\n\n const url = path.startsWith('http') ? path : `${GITHUB_API}${path}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'Mercury-Agent',\n ...options.headers,\n };\n\n const fetchOptions: any = {\n method: options.method || 'GET',\n headers,\n };\n\n if (options.body) {\n fetchOptions.body = JSON.stringify(options.body);\n headers['Content-Type'] = 'application/json';\n }\n\n logger.info({ method: fetchOptions.method, path }, 'GitHub API request');\n\n const response = await fetch(url, fetchOptions);\n\n const remaining = response.headers.get('x-ratelimit-remaining');\n if (remaining && parseInt(remaining, 10) < 100) {\n logger.warn({ remaining }, 'GitHub API rate limit running low');\n }\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`GitHub API ${response.status}: ${body.slice(0, 500)}`);\n }\n\n if (response.status === 204) return null;\n\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return response.json();\n }\n\n return response.text();\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { githubRequest } from '../../utils/github.js';\n\nexport function createReviewPrTool() {\n return tool({\n description: 'Get details of a pull request including the diff. Reviews the PR and returns the title, body, changed files, and diff. Optionally post a review comment.',\n parameters: z.object({\n owner: z.string().describe('Repository owner (username or org)'),\n repo: z.string().describe('Repository name'),\n number: z.number().describe('PR number'),\n comment: z.string().describe('Review comment to post on the PR (optional)').optional(),\n }),\n execute: async ({ owner, repo, number, comment }) => {\n try {\n const pr = await githubRequest(`/repos/${owner}/${repo}/pulls/${number}`);\n if (!pr) return `Error: PR #${number} not found.`;\n\n let summary = `PR #${pr.number}: ${pr.title}\\n`;\n summary += `Author: ${pr.user?.login}\\n`;\n summary += `State: ${pr.state} (${pr.merged ? 'merged' : pr.mergeable_state || 'unknown'})\\n`;\n summary += `Branch: ${pr.head.ref} → ${pr.base.ref}\\n`;\n summary += `Changed files: ${pr.changed_files} | Additions: +${pr.additions} | Deletions: -${pr.deletions}\\n\\n`;\n\n if (pr.body) {\n summary += `Description:\\n${pr.body.slice(0, 2000)}\\n\\n`;\n }\n\n try {\n const diff = await githubRequest(`/repos/${owner}/${repo}/pulls/${number}`, {\n headers: { 'Accept': 'application/vnd.github.v3.diff' },\n });\n\n if (typeof diff === 'string') {\n const diffLines = diff.split('\\n');\n const maxDiffLines = 200;\n summary += `Diff (first ${Math.min(diffLines.length, maxDiffLines)} of ${diffLines.length} lines):\\n`;\n summary += diffLines.slice(0, maxDiffLines).join('\\n');\n if (diffLines.length > maxDiffLines) {\n summary += `\\n\\n... (${diffLines.length - maxDiffLines} more lines)`;\n }\n }\n } catch {\n summary += `(Diff not available)`;\n }\n\n if (comment) {\n try {\n await githubRequest(`/repos/${owner}/${repo}/pulls/${number}/reviews`, {\n method: 'POST',\n body: { body: comment, event: 'COMMENT' },\n });\n summary += `\\n\\nReview comment posted.`;\n } catch (err: any) {\n summary += `\\n\\nFailed to post review comment: ${err.message}`;\n }\n }\n\n return summary;\n } catch (err: any) {\n return `Error reviewing PR: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { githubRequest } from '../../utils/github.js';\n\nexport function createListIssuesTool() {\n return tool({\n description: 'List GitHub issues for a repository. Requires GITHUB_TOKEN.',\n parameters: z.object({\n owner: z.string().describe('Repository owner (username or org)'),\n repo: z.string().describe('Repository name'),\n state: z.enum(['open', 'closed', 'all']).describe('Filter by issue state').default('open'),\n labels: z.string().describe('Comma-separated label names to filter by (optional)').optional(),\n limit: z.number().describe('Maximum number of issues to return').default(10),\n }),\n execute: async ({ owner, repo, state, labels, limit }) => {\n try {\n const params = new URLSearchParams();\n params.set('state', state);\n params.set('per_page', String(Math.min(limit, 100)));\n params.set('sort', 'updated');\n params.set('direction', 'desc');\n if (labels) params.set('labels', labels);\n\n const issues = await githubRequest(`/repos/${owner}/${repo}/issues?${params}`);\n\n if (!Array.isArray(issues) || issues.length === 0) {\n return `No ${state} issues found in ${owner}/${repo}.`;\n }\n\n const lines = issues.map((issue: any) => {\n const labelStr = issue.labels?.map((l: any) => `[${l.name}]`).join(' ') || '';\n return `#${issue.number} ${issue.title} ${labelStr} (${issue.state}, by ${issue.user?.login})`;\n });\n\n return `Issues in ${owner}/${repo} (${state}):\\n${lines.join('\\n')}`;\n } catch (err: any) {\n return `Error listing issues: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { githubRequest } from '../../utils/github.js';\n\nexport function createCreateIssueTool() {\n return tool({\n description: 'Create a new GitHub issue in a repository. Requires GITHUB_TOKEN.',\n parameters: z.object({\n owner: z.string().describe('Repository owner (username or org)'),\n repo: z.string().describe('Repository name'),\n title: z.string().describe('Issue title'),\n body: z.string().describe('Issue description (markdown supported)').default(''),\n labels: z.array(z.string()).describe('Label names to apply').optional(),\n }),\n execute: async ({ owner, repo, title, body, labels }) => {\n try {\n const payload: any = { title, body };\n if (labels && labels.length > 0) payload.labels = labels;\n\n const result = await githubRequest(`/repos/${owner}/${repo}/issues`, {\n method: 'POST',\n body: payload,\n });\n\n return `Issue created: ${result.html_url}\\n#${result.number}: ${result.title}`;\n } catch (err: any) {\n return `Error creating issue: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { githubRequest } from '../../utils/github.js';\n\nconst CO_AUTHOR_NAME = 'Mercury';\nconst CO_AUTHOR_EMAIL = 'mercury@cosmicstack.org';\nconst CO_AUTHOR_TRAILER = `Co-authored-by: ${CO_AUTHOR_NAME} <${CO_AUTHOR_EMAIL}>`;\n\nfunction isContentCreatePath(path: string): boolean {\n return /^\\/repos\\/[^/]+\\/[^/]+\\/contents\\//.test(path);\n}\n\nfunction injectCoAuthor(body: any): any {\n const result = { ...body };\n\n if (typeof result.message === 'string' && !result.message.includes(CO_AUTHOR_TRAILER)) {\n result.message += `\\n\\n${CO_AUTHOR_TRAILER}`;\n }\n\n if (!result.committer || typeof result.committer !== 'object') {\n result.committer = { name: CO_AUTHOR_NAME, email: CO_AUTHOR_EMAIL };\n }\n\n if (!result.author || typeof result.author !== 'object') {\n result.author = { name: CO_AUTHOR_NAME, email: CO_AUTHOR_EMAIL };\n }\n\n return result;\n}\n\nexport function createGithubApiTool() {\n return tool({\n description: `Make a raw request to the GitHub API. GET requests (read-only) are always allowed. Write operations (POST, PUT, PATCH, DELETE) may require user approval.\n\nCommon operations you can perform:\n- Push a file: PUT /repos/{owner}/{repo}/contents/{path} — body must include \"message\" (commit message) and \"content\" (base64-encoded file). For updates, also include \"sha\" from the current file. Co-authored-by Mercury is automatically included.\n- Delete a file: DELETE /repos/{owner}/{repo}/contents/{path} — body must include \"message\" and \"sha\".\n- List branches: GET /repos/{owner}/{repo}/branches\n- Get file contents: GET /repos/{owner}/{repo}/contents/{path}\n- Search code: GET /search/code?q={query}\n- Any other GitHub API v3 endpoint.\n\nIMPORTANT: When the user wants to push code or files to GitHub and git push fails (auth issues, no SSH key, etc.), use PUT /repos/{owner}/{repo}/contents/{path} to create or update files directly through the API. This bypasses local git and creates a commit with Mercury as co-author.`,\n parameters: z.object({\n path: z.string().describe('Full API path (e.g., /repos/owner/repo/issues or /repos/owner/repo/contents/path/to/file)'),\n method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']).describe('HTTP method').default('GET'),\n body: z.string().describe('JSON body for write requests (as a JSON string)').optional(),\n }),\n execute: async ({ path, method, body }) => {\n try {\n let parsedBody: any;\n if (body) {\n try {\n parsedBody = JSON.parse(body);\n } catch {\n return 'Error: body must be valid JSON.';\n }\n }\n\n if (parsedBody && isContentCreatePath(path) && (method === 'PUT' || method === 'POST' || method === 'PATCH')) {\n parsedBody = injectCoAuthor(parsedBody);\n }\n\n const result = await githubRequest(path, {\n method,\n body: parsedBody,\n });\n\n if (result === null) return 'Request completed (204 No Content).';\n\n if (typeof result === 'string') return result;\n\n return JSON.stringify(result, null, 2);\n } catch (err: any) {\n return `Error: ${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 { createSendMessageTool } from './messaging/send-message.js';\nimport { createApproveScopeTool } from './filesystem/approve-scope.js';\nimport { createRunCommandTool } from './shell/run-command.js';\nimport { createCdTool } from './shell/cd.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 { createCreatePrTool } from './github/create-pr.js';\nimport { createReviewPrTool } from './github/review-pr.js';\nimport { createListIssuesTool } from './github/list-issues.js';\nimport { createCreateIssueTool } from './github/create-issue.js';\nimport { createGithubApiTool } from './github/github-api.js';\nimport { createFetchUrlTool } from './web/fetch-url.js';\nimport { isGitHubConfigured, setGitHubToken } from '../utils/github.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 sendMessageHandler?: (content: string) => Promise<void>;\n private currentChannelId = 'cli';\n private currentChannelType = 'cli';\n private chatCommandContext?: ChatCommandContext;\n private currentCwd = process.cwd();\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 getCwd(): string {\n return this.currentCwd;\n }\n\n setCwd(dir: string): void {\n this.currentCwd = dir;\n }\n\n setSendFileHandler(handler: (filePath: string) => Promise<void>): void {\n this.sendFileHandler = handler;\n }\n\n setSendMessageHandler(handler: (content: string) => Promise<void>): void {\n this.sendMessageHandler = 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, () => this.getCwd());\n this.tools.write_file = createWriteFileTool(this.permissions, () => this.getCwd());\n this.tools.create_file = createCreateFileTool(this.permissions, () => this.getCwd());\n this.tools.list_dir = createListDirTool(this.permissions, () => this.getCwd());\n this.tools.delete_file = createDeleteFileTool(this.permissions, () => this.getCwd());\n this.tools.edit_file = createEditFileTool(this.permissions, () => this.getCwd());\n\n if (this.sendFileHandler) {\n this.tools.send_file = createSendFileTool(this.permissions, () => this.getCwd(), this.sendFileHandler);\n }\n\n this.tools.approve_scope = createApproveScopeTool(this.permissions, () => this.getCwd());\n\n logger.info('Filesystem tools registered');\n }\n\n if (this.sendMessageHandler) {\n this.tools.send_message = createSendMessageTool(this.sendMessageHandler);\n logger.info('Messaging tool registered');\n }\n\n if (manifest.capabilities.shell.enabled) {\n this.tools.run_command = createRunCommandTool(this.permissions, () => this.getCwd(), (dir: string) => this.setCwd(dir));\n this.tools.cd = createCdTool(() => this.getCwd(), (dir: string) => this.setCwd(dir));\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(() => this.getCwd());\n this.tools.git_diff = createGitDiffTool(() => this.getCwd());\n this.tools.git_log = createGitLogTool(() => this.getCwd());\n this.tools.git_add = createGitAddTool(() => this.getCwd());\n this.tools.git_commit = createGitCommitTool(() => this.getCwd());\n this.tools.git_push = createGitPushTool(this.permissions, () => this.getCwd());\n logger.info('Git tools registered');\n }\n\n if (isGitHubConfigured()) {\n this.tools.create_pr = createCreatePrTool();\n this.tools.review_pr = createReviewPrTool();\n this.tools.list_issues = createListIssuesTool();\n this.tools.create_issue = createCreateIssueTool();\n this.tools.github_api = createGithubApiTool();\n logger.info('GitHub 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}\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 ['send_message', 'Send a message to approved Telegram users', 'content'],\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 telegram list', 'Show Telegram admins, members, and pending requests'],\n ['mercury telegram approve <code|id>', 'Approve the first Telegram pairing code or a later Telegram request'],\n ['mercury telegram reject <id>', 'Reject a pending Telegram request'],\n ['mercury telegram remove <id>', 'Remove an approved Telegram user'],\n ['mercury telegram promote <id>', 'Promote a Telegram member to admin'],\n ['mercury telegram demote <id>', 'Demote a Telegram admin to member'],\n ['mercury telegram unpair', 'Reset all Telegram access'],\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 ['/start', 'Start Telegram pairing or request Telegram access'],\n ['/pair', 'Start Telegram pairing or request Telegram access'],\n ['/', 'Open the CLI command picker with arrow-key navigation'],\n ['/menu', 'Open the CLI command picker with arrow-key navigation'],\n ['/help', 'Show this manual'],\n ['/status', 'Show config and budget info'],\n ['/telegram', 'CLI chat only: open the Telegram management menu'],\n ['/telegram pending', 'CLI chat only: list pending Telegram requests'],\n ['/telegram users', 'CLI chat only: list approved Telegram users'],\n ['/telegram approve <code|id>', 'CLI chat only: approve the first pairing code or a later request'],\n ['/telegram reject <id>', 'CLI chat only: reject a pending Telegram request'],\n ['/telegram remove <id>', 'CLI chat only: remove an approved Telegram user'],\n ['/telegram promote <id>', 'CLI chat only: promote a Telegram member to admin'],\n ['/telegram demote <id>', 'CLI chat only: demote a Telegram admin to member'],\n ['/telegram reset', 'CLI chat only: reset all Telegram access'],\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 ['/unpair', 'Reset all Telegram access for this Mercury instance (admins only)'],\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}\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}","import type { ProviderConfig, ProviderName } from './config.js';\n\nexport interface ProviderModelCatalog {\n models: string[];\n recommendedModel: string;\n}\n\nconst MAX_MODEL_OPTIONS = 7;\n\nconst OPENAI_PREFERRED_MODELS = [\n 'gpt-5.2',\n 'gpt-5.2-chat-latest',\n 'gpt-5.2-pro',\n 'gpt-5-mini',\n 'gpt-5-nano',\n 'gpt-4.1',\n 'gpt-4.1-mini',\n 'gpt-oss-120b',\n 'gpt-oss-20b',\n] as const;\n\nconst ANTHROPIC_PREFERRED_MODELS = [\n 'claude-sonnet-4-20250514',\n 'claude-opus-4-20250514',\n 'claude-3-7-sonnet-latest',\n 'claude-3-5-sonnet-latest',\n 'claude-3-5-haiku-latest',\n] as const;\n\nconst DEEPSEEK_PREFERRED_MODELS = [\n 'deepseek-chat',\n 'deepseek-reasoner',\n] as const;\n\nconst GROK_PREFERRED_MODELS = [\n 'grok-4',\n 'grok-4-latest',\n 'grok-4.20',\n 'grok-3',\n 'grok-3-latest',\n] as const;\n\nconst OLLAMA_CLOUD_PREFERRED_MODELS = [\n 'gpt-oss:120b',\n 'gpt-oss:120b-cloud',\n 'gpt-oss:20b',\n] as const;\n\nconst OLLAMA_LOCAL_PREFERRED_MODELS = [\n 'gpt-oss:20b',\n 'gpt-oss:120b',\n] as const;\n\nexport class ProviderModelFetchError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ProviderModelFetchError';\n }\n}\n\ninterface OpenAIModelResponse {\n data?: Array<{ id?: string }>;\n}\n\ninterface AnthropicModelResponse {\n data?: Array<{ id?: string }>;\n}\n\ninterface XAIModelResponse {\n data?: Array<{\n id?: string;\n input_modalities?: string[];\n output_modalities?: string[];\n }>;\n}\n\ninterface OllamaTagsResponse {\n models?: Array<{ name?: string; model?: string }>;\n}\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\nasync function fetchJson<T>(url: string, init: RequestInit, invalidMessage: string): Promise<T> {\n let response: Response;\n try {\n response = await fetch(url, {\n ...init,\n signal: AbortSignal.timeout(10_000),\n });\n } catch {\n throw new ProviderModelFetchError(invalidMessage);\n }\n\n if (!response.ok) {\n throw new ProviderModelFetchError(invalidMessage);\n }\n\n try {\n return await response.json() as T;\n } catch {\n throw new ProviderModelFetchError('Mercury could not read the model list returned by this provider.');\n }\n}\n\nfunction uniq(values: string[]): string[] {\n return [...new Set(values.filter(Boolean))];\n}\n\nfunction prioritizeModels(models: string[], preferred: readonly string[]): string[] {\n const preferredSet = new Set(preferred);\n const preferredMatches = preferred.filter((model) => models.includes(model));\n const others = models\n .filter((model) => !preferredSet.has(model))\n .sort((a, b) => a.localeCompare(b));\n\n return [...preferredMatches, ...others];\n}\n\nfunction limitModels(models: string[]): string[] {\n return models.slice(0, MAX_MODEL_OPTIONS);\n}\n\nfunction isOpenAIChatModel(id: string): boolean {\n const lower = id.toLowerCase();\n if (\n lower.includes('image')\n || lower.includes('audio')\n || lower.includes('tts')\n || lower.includes('transcribe')\n || lower.includes('embedding')\n || lower.includes('moderation')\n || lower.includes('realtime')\n || lower.includes('whisper')\n || lower.includes('search')\n || lower.includes('computer')\n ) {\n return false;\n }\n\n return lower.startsWith('gpt-') || /^o\\d/.test(lower);\n}\n\nfunction chooseRecommendedModel(\n provider: ProviderName,\n models: string[],\n currentModel?: string,\n): string {\n const preferredByProvider: Record<ProviderName, readonly string[]> = {\n deepseek: DEEPSEEK_PREFERRED_MODELS,\n openai: OPENAI_PREFERRED_MODELS,\n anthropic: ANTHROPIC_PREFERRED_MODELS,\n grok: GROK_PREFERRED_MODELS,\n ollamaCloud: OLLAMA_CLOUD_PREFERRED_MODELS,\n ollamaLocal: OLLAMA_LOCAL_PREFERRED_MODELS,\n };\n\n for (const candidate of preferredByProvider[provider]) {\n if (models.includes(candidate)) {\n return candidate;\n }\n }\n\n if (currentModel && models.includes(currentModel)) {\n return currentModel;\n }\n\n return models[0];\n}\n\nexport function buildModelCatalog(\n provider: ProviderName,\n models: string[],\n currentModel?: string,\n): ProviderModelCatalog {\n const filtered = uniq(models);\n if (filtered.length === 0) {\n throw new ProviderModelFetchError('Mercury could not find any supported chat models for this provider.');\n }\n\n const recommendedModel = chooseRecommendedModel(provider, filtered, currentModel);\n const preferredByProvider: Record<ProviderName, readonly string[]> = {\n deepseek: DEEPSEEK_PREFERRED_MODELS,\n openai: OPENAI_PREFERRED_MODELS,\n anthropic: ANTHROPIC_PREFERRED_MODELS,\n grok: GROK_PREFERRED_MODELS,\n ollamaCloud: OLLAMA_CLOUD_PREFERRED_MODELS,\n ollamaLocal: OLLAMA_LOCAL_PREFERRED_MODELS,\n };\n\n const withoutRecommended = filtered.filter((model) => model !== recommendedModel);\n const prioritized = prioritizeModels(withoutRecommended, preferredByProvider[provider]);\n\n return {\n recommendedModel,\n models: limitModels(prioritized),\n };\n}\n\nasync function fetchOpenAICompatModels(provider: ProviderName, config: ProviderConfig): Promise<ProviderModelCatalog> {\n const data = await fetchJson<OpenAIModelResponse>(\n `${trimTrailingSlash(config.baseUrl)}/models`,\n {\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n },\n },\n `Mercury could not fetch models for this ${provider === 'grok' ? 'Grok' : provider === 'deepseek' ? 'DeepSeek' : 'OpenAI'} key. Please re-enter it.`,\n );\n\n const ids = (data.data ?? [])\n .map((model) => model.id?.trim() ?? '')\n .filter((id) => {\n if (provider === 'deepseek') {\n return id.startsWith('deepseek-');\n }\n return isOpenAIChatModel(id);\n });\n\n return buildModelCatalog(provider, ids, config.model);\n}\n\nasync function fetchAnthropicModels(config: ProviderConfig): Promise<ProviderModelCatalog> {\n const data = await fetchJson<AnthropicModelResponse>(\n 'https://api.anthropic.com/v1/models',\n {\n headers: {\n 'x-api-key': config.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n },\n 'Mercury could not fetch models for this Anthropic key. Please re-enter it.',\n );\n\n const ids = (data.data ?? [])\n .map((model) => model.id?.trim() ?? '')\n .filter((id) => id.startsWith('claude-'));\n\n return buildModelCatalog('anthropic', ids, config.model);\n}\n\nasync function fetchGrokModels(config: ProviderConfig): Promise<ProviderModelCatalog> {\n const data = await fetchJson<XAIModelResponse>(\n `${trimTrailingSlash(config.baseUrl)}/language-models`,\n {\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n },\n },\n 'Mercury could not fetch models for this Grok key. Please re-enter it.',\n );\n\n const ids = (data.data ?? [])\n .filter((model) => model.output_modalities?.includes('text') || model.output_modalities == null)\n .map((model) => model.id?.trim() ?? '')\n .filter((id) => id.startsWith('grok-'));\n\n return buildModelCatalog('grok', ids, config.model);\n}\n\nasync function fetchOllamaModels(provider: ProviderName, config: ProviderConfig): Promise<ProviderModelCatalog> {\n const headers = config.apiKey\n ? { Authorization: `Bearer ${config.apiKey}` }\n : undefined;\n\n const data = await fetchJson<OllamaTagsResponse>(\n `${trimTrailingSlash(config.baseUrl)}/tags`,\n {\n headers,\n },\n provider === 'ollamaCloud'\n ? 'Mercury could not fetch models for this Ollama Cloud key. Please re-enter it.'\n : 'Mercury could not fetch models from this Ollama Local server. Please check the base URL and try again.',\n );\n\n const ids = (data.models ?? [])\n .map((model) => model.model?.trim() || model.name?.trim() || '')\n .filter(Boolean);\n\n return buildModelCatalog(provider, ids, config.model);\n}\n\nexport async function fetchProviderModelCatalog(\n provider: ProviderName,\n config: ProviderConfig,\n): Promise<ProviderModelCatalog> {\n if (provider === 'anthropic') {\n return fetchAnthropicModels(config);\n }\n\n if (provider === 'grok') {\n return fetchGrokModels(config);\n }\n\n if (provider === 'ollamaCloud' || provider === 'ollamaLocal') {\n return fetchOllamaModels(provider, config);\n }\n\n return fetchOpenAICompatModels(provider, config);\n}\n"],"mappings":"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","names":["readFileSync","writeFileSync","existsSync","dirname","join","readline","chalk","existsSync","readFileSync","mkdirSync","writeFileSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","generateText","streamText","generateText","streamText","provider","generateText","streamText","readline","chalk","chalk","resolve","chalk","readline","full","resolve","channel","streamText","generateText","formatTelegramUser","existsSync","readFileSync","writeFileSync","mkdirSync","join","parseYaml","stringifyYaml","join","path","existsSync","readFileSync","parseYaml","mkdirSync","writeFileSync","stringifyYaml","fs","path","resolve","path","fs","existsSync","readFileSync","writeFileSync","join","path","join","writeFileSync","existsSync","readFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","resolve","homedir","parseYaml","stringifyYaml","join","tool","existsSync","readFileSync","parseYaml","mkdirSync","writeFileSync","stringifyYaml","path","fs","resolve","homedir","existsSync","readFileSync","resolve","path","tool","z","existsSync","writeFileSync","resolve","isAbsolute","path","tool","z","existsSync","writeFileSync","mkdirSync","resolve","dirname","isAbsolute","path","tool","z","existsSync","readdirSync","resolve","isAbsolute","path","join","tool","z","existsSync","unlinkSync","resolve","isAbsolute","path","tool","z","readFileSync","writeFileSync","resolve","isAbsolute","path","tool","z","existsSync","statSync","resolve","basename","isAbsolute","path","tool","z","tool","z","resolve","isAbsolute","path","tool","z","resolve","isAbsolute","existsSync","tool","z","isAbsolute","resolve","existsSync","tool","z","resolve","isAbsolute","existsSync","statSync","path","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","path","tool","z","tool","z","tool","z","tool","z","tool","z","tool","z","tool","z","tool","z","path","tool","z","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","dirname","readFileSync","join","chalk","readline","resolve","existsSync","writeFileSync","approved"]}