@cosmicstack/mercury-agent 1.1.5 → 1.1.6

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/memory/second-brain-db.ts","../src/memory/user-memory.ts","../src/providers/openai-compat.ts","../src/providers/base.ts","../src/providers/anthropic.ts","../src/providers/deepseek.ts","../src/providers/ollama.ts","../src/providers/mimo.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/channels/telegram.ts","../src/core/scheduler.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, migrateLegacyMemory } from './memory/store.js';\nimport { UserMemoryStore } from './memory/user-memory.js';\nimport { isBetterSqlite3Available } from './memory/second-brain-db.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 { key: 'openaiCompat', label: 'OpenAI Compilations' },\n { key: 'mimo', label: 'MiMo (Xiaomi)' },\n { key: 'mimoTokenPlan', label: 'MiMo Token Plan (Xiaomi)' },\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 if (provider === 'mimo') {\n return /^sk-[A-Za-z0-9_-]{16,}$/i.test(value)\n ? null\n : 'MiMo keys must start with `sk-`.';\n }\n\n if (provider === 'mimoTokenPlan') {\n return /^tp-[A-Za-z0-9_-]{16,}$/i.test(value)\n ? null\n : 'MiMo Token Plan keys must start with `tp-`.';\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}.`;\n console.log(chalk.yellow(` ${message}`));\n console.log(chalk.dim(' The API key looks valid but Mercury could not reach the provider.'));\n console.log(chalk.dim(` You can enter a model name manually, or skip ${providerLabel} for now.`));\n\n const manualModel = await ask(chalk.white(` ${providerLabel} model name (Enter to skip ${providerLabel} for now): `));\n if (!manualModel) {\n if (isReconfig && existingConfig.apiKey) {\n return { apiKey: existingConfig.apiKey, model: existingConfig.model, skipped: true };\n }\n return { skipped: true };\n }\n\n const modelError = validateModelName(manualModel);\n if (modelError) {\n console.log(chalk.red(` ${modelError}`));\n continue;\n }\n\n return { apiKey: value, model: manualModel, skipped: false };\n }\n }\n}\n\nasync function promptOllamaLocalModelSelection(config: MercuryConfig, isReconfig: boolean): Promise<{ baseUrl?: string; model?: string; skipped: boolean }> {\n const existingConfig = config.providers.ollamaLocal;\n\n const baseUrlPrompt = isReconfig && existingConfig.baseUrl\n ? chalk.white(` Ollama Local base URL [${existingConfig.baseUrl}]: `)\n : chalk.white(' Ollama Local base URL (Enter to skip, or \"none\" to skip): ');\n const baseUrlInput = await ask(baseUrlPrompt);\n if (!baseUrlInput || baseUrlInput.toLowerCase() === 'none') {\n if (isReconfig && existingConfig.baseUrl) {\n return { baseUrl: existingConfig.baseUrl, model: existingConfig.model, skipped: true };\n }\n return { skipped: true };\n }\n const baseUrlError = validateBaseUrl(baseUrlInput);\n if (baseUrlError) {\n console.log(chalk.red(` ${baseUrlError}`));\n if (isReconfig && existingConfig.baseUrl) {\n return { baseUrl: existingConfig.baseUrl, model: existingConfig.model, skipped: true };\n }\n return { skipped: true };\n }\n const baseUrl = baseUrlInput;\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.';\n console.log(chalk.yellow(` ${message}`));\n console.log(chalk.dim(' Make sure Ollama is running locally, or enter the model name manually.'));\n console.log(chalk.dim(' You can run `mercury doctor` later to configure Ollama after starting it.'));\n\n const manualModel = await ask(chalk.white(` Ollama Local model name (Enter to skip Ollama Local for now): `));\n if (!manualModel) {\n return { skipped: true };\n }\n\n const modelError = validateModelName(manualModel);\n if (modelError) {\n console.log(chalk.red(` ${modelError}`));\n return { skipped: true };\n }\n\n return { baseUrl, model: manualModel, skipped: false };\n }\n}\n\nasync function promptOpenAICompatSetup(config: MercuryConfig, isReconfig: boolean): Promise<{ baseUrl?: string; apiKey?: string; model?: string; skipped: boolean }> {\n const existingConfig = config.providers.openaiCompat;\n\n const baseUrl = (await promptValidatedValue(\n chalk.white(` Server base URL${isReconfig && existingConfig.baseUrl ? ` [${existingConfig.baseUrl}]` : ''}: `),\n validateBaseUrl,\n existingConfig.baseUrl,\n ))!;\n if (!baseUrl) return { skipped: true };\n\n const apiKeyPrompt = isReconfig && existingConfig.apiKey\n ? chalk.white(` API key (optional, press Enter to keep current) [${maskKey(existingConfig.apiKey)}]: `)\n : chalk.white(' API key (optional, press Enter to skip): ');\n const apiKey = await ask(apiKeyPrompt);\n const resolvedApiKey = apiKey || existingConfig.apiKey || '';\n\n console.log(chalk.dim(' Fetching models from server...'));\n try {\n const catalog = await fetchProviderModelCatalog('openaiCompat', {\n ...existingConfig,\n baseUrl,\n apiKey: resolvedApiKey,\n });\n const model = await chooseProviderModel(\n 'OpenAI Compilations',\n catalog.recommendedModel,\n catalog.models,\n );\n return { baseUrl, apiKey: resolvedApiKey, model, skipped: false };\n } catch {\n console.log(chalk.yellow(' Could not fetch models from this server. You can enter the model name manually.'));\n const model = (await promptValidatedValue(\n chalk.white(' Model name: '),\n validateModelName,\n ))!;\n if (!model) return { baseUrl, apiKey: resolvedApiKey, model: existingConfig.model, skipped: false };\n return { baseUrl, apiKey: resolvedApiKey, model, skipped: false };\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 } catch (err: any) {\n console.log(chalk.red(`\\n ✗ ${err.message || err}`));\n console.log('');\n await telegram.stop();\n return;\n }\n\n try {\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. You can skip any provider by pressing Enter.'));\n console.log(chalk.dim(' Press Enter to configure DeepSeek by default (free at platform.deepseek.com).'));\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, isReconfig);\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 continue;\n }\n\n if (provider === 'openaiCompat') {\n const result = await promptOpenAICompatSetup(config, isReconfig);\n if (!result.skipped && result.baseUrl && result.model) {\n config.providers.openaiCompat.baseUrl = result.baseUrl;\n config.providers.openaiCompat.model = result.model;\n config.providers.openaiCompat.enabled = true;\n if (result.apiKey) {\n config.providers.openaiCompat.apiKey = result.apiKey;\n }\n }\n continue;\n }\n\n if (provider === 'mimo') {\n const mask = isReconfig && config.providers.mimo.apiKey ? ` [${maskKey(config.providers.mimo.apiKey)}]` : '';\n const result = await promptApiKeyWithModelSelection(\n config,\n 'mimo',\n 'MiMo',\n chalk.white(` MiMo API key${mask}${isReconfig ? '' : ' (Enter to skip)'}: `),\n isReconfig,\n );\n if (!result.skipped && result.apiKey && result.model) {\n config.providers.mimo.apiKey = result.apiKey;\n config.providers.mimo.model = result.model;\n config.providers.mimo.enabled = true;\n }\n continue;\n }\n\n if (provider === 'mimoTokenPlan') {\n const mask = isReconfig && config.providers.mimoTokenPlan.apiKey ? ` [${maskKey(config.providers.mimoTokenPlan.apiKey)}]` : '';\n const result = await promptApiKeyWithModelSelection(\n config,\n 'mimoTokenPlan',\n 'MiMo Token Plan',\n chalk.white(` MiMo Token Plan API key${mask}${isReconfig ? '' : ' (Enter to skip)'}: `),\n isReconfig,\n );\n if (!result.skipped && result.apiKey && result.model) {\n config.providers.mimoTokenPlan.apiKey = result.apiKey;\n config.providers.mimoTokenPlan.model = result.model;\n config.providers.mimoTokenPlan.enabled = true;\n }\n }\n }\n\n const configuredProviders = getConfiguredProviderNames(config);\n if (configuredProviders.length === 0) {\n console.log('');\n console.log(chalk.yellow(' No LLM providers were configured.'));\n console.log(chalk.dim(' Mercury needs at least one provider to work.'));\n console.log(chalk.dim(' DeepSeek offers a free API key at platform.deepseek.com'));\n console.log('');\n console.log(chalk.white(' Options:'));\n console.log(chalk.white(' 1. Try again — choose a provider and enter an API key'));\n console.log(chalk.white(' 2. Skip for now — you can run `mercury doctor` later'));\n console.log('');\n\n const skipChoice = await ask(chalk.white(' Press Enter to try again, or type \"skip\" to exit setup: '));\n if (skipChoice.toLowerCase() === 'skip') {\n saveConfig(config);\n const home = getMercuryHome();\n console.log('');\n console.log(chalk.green(` ✓ Config saved to ${home}/mercury.yaml`));\n console.log(chalk.yellow(' No providers configured yet. Run `mercury doctor` when ready.'));\n console.log('');\n process.exit(0);\n }\n\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 && daemon.pid) {\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(` \\u2713 Mercury is running in background (PID: ${status.pid})`));\n console.log(chalk.green(' \\u2713 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.yellow(' Background mode not available. Run `mercury start` 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 defaultProvider = config.providers.default;\n const defaultModel = config.providers[defaultProvider]?.model ?? 'unknown';\n\n if (!isDaemon) {\n const providerSummary = available.map((provider) => {\n const key = provider as ProviderName;\n const label = getProviderLabel(key);\n const model = config.providers[key]?.model ?? '?';\n const marker = key === defaultProvider ? ' ← default' : '';\n return `${label}: ${model}${marker}`;\n });\n\n console.log('');\n console.log(chalk.bgMagenta.black.bold(` ⚡ ${getProviderLabel(defaultProvider)} · ${defaultModel} `));\n console.log(chalk.dim(` Providers: ${providerSummary.join(' · ')}`));\n } else {\n logger.info({ providers: available, default: defaultProvider }, '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 migrateLegacyMemory();\n const shortTerm = new ShortTermMemory(config);\n const longTerm = new LongTermMemory(config);\n const episodic = new EpisodicMemory(config);\n\n let userMemory: UserMemoryStore | null = null;\n if (config.memory.secondBrain?.enabled !== false && isBetterSqlite3Available()) {\n try {\n userMemory = new UserMemoryStore(config);\n if (!isDaemon) {\n console.log(chalk.dim(` Second brain: enabled (${userMemory.getSummary().total} existing memories)`));\n } else {\n logger.info({ total: userMemory.getSummary().total }, 'Second brain loaded');\n }\n } catch (err) {\n logger.warn({ err }, 'Second brain initialization failed, continuing without it');\n userMemory = null;\n }\n } else if (config.memory.secondBrain?.enabled !== false && !isBetterSqlite3Available()) {\n logger.warn(\n 'better-sqlite3 is not available — second brain memory is disabled. ' +\n 'To enable it, install build tools (make, gcc/g++, python3) and ensure Node >= 20, then reinstall.'\n );\n }\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 memorySummary: () => userMemory ? userMemory.getSummary() : { total: 0, byType: {}, learningPaused: false },\n memoryRecent: (limit?: number) => userMemory ? userMemory.getRecent(limit) : [],\n memorySearch: (query: string, limit?: number) => userMemory ? userMemory.search(query, limit) : [],\n memorySetLearningPaused: (paused: boolean) => { if (userMemory) userMemory.setLearningPaused(paused); },\n memoryClear: () => userMemory ? userMemory.clear() : 0,\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, userMemory, 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 if (tgChannel) {\n tgChannel.setChatCommandContext(capabilities.getChatCommandContext()!);\n }\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 if (tgChannel) {\n tgChannel.setOnPermissionMode((mode, chatId) => {\n if (mode === 'allow-all') {\n capabilities.permissions.setAutoApproveAll(true);\n capabilities.permissions.addTempScope('/', true, true);\n logger.info({ chatId }, 'Telegram: Allow All mode set for session');\n }\n });\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\n const mode = cliChannel && await cliChannel.askPermissionMode?.();\n if (mode === 'allow-all') {\n capabilities.permissions.setAutoApproveAll(true);\n capabilities.permissions.addTempScope('/', true, true);\n }\n\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 if (userMemory) {\n try {\n userMemory.consolidate();\n userMemory.close();\n } catch {}\n }\n await agent.shutdown();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n if (!isDaemon && process.platform !== 'win32') {\n process.on('SIGHUP', () => {\n logger.info('SIGHUP received — terminal closed. Daemonizing.');\n try {\n const result = tryAutoDaemonize();\n if (result) {\n logger.info(`Forked daemon. Foreground process exiting.`);\n } else {\n logger.warn('SIGHUP received but daemonization failed. Shutting down.');\n }\n } catch {\n logger.warn('SIGHUP received but daemonization failed. Shutting down.');\n }\n process.exit(0);\n });\n }\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 autoDaemonize();\n await runAgent();\n });\n\nprogram\n .command('start')\n .description('Start Mercury — runs as a daemon by default, use --foreground to attach to terminal')\n .option('-v, --verbose', 'Show debug logs')\n .option('-f, --foreground', 'Run in foreground (attached to terminal)')\n .option('-d, --detached', 'Run in background (daemon mode) — same as default')\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 (!isSetupComplete()) {\n await configure();\n autoDaemonize();\n return;\n }\n\n if (opts.foreground) {\n await runAgent();\n return;\n }\n\n startBackground();\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('Start Mercury as a persistent daemon (same as `mercury start`)')\n .action(async () => {\n if (!isSetupComplete()) {\n await configure();\n autoDaemonize();\n return;\n }\n\n const daemon = getDaemonStatus();\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 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\n .command('upgrade')\n .description('Upgrade Mercury to the latest version from npm')\n .action(async () => {\n console.log('');\n console.log(chalk.cyan(` Mercury ${chalk.white(`v${pkgVersion}`)}`));\n console.log('');\n\n const daemon = getDaemonStatus();\n if (daemon.running) {\n console.log(chalk.dim(' Stopping background daemon...'));\n stopDaemon();\n await new Promise((r) => setTimeout(r, 1000));\n console.log(chalk.green(' ✓ Daemon stopped'));\n }\n\n console.log(chalk.dim(' Checking for latest version...'));\n const { execSync } = await import('node:child_process');\n\n let latestVersion = '';\n try {\n latestVersion = execSync('npm view @cosmicstack/mercury-agent version', { encoding: 'utf-8' }).trim();\n } catch {\n console.log(chalk.red(' ✗ Failed to fetch latest version from npm'));\n console.log('');\n return;\n }\n\n console.log(chalk.dim(` Latest: v${latestVersion}`));\n\n if (latestVersion === pkgVersion) {\n console.log(chalk.green(` ✓ Already on the latest version (v${pkgVersion})`));\n console.log('');\n return;\n }\n\n console.log(chalk.dim(` Upgrading v${pkgVersion} → v${latestVersion}...`));\n console.log('');\n\n try {\n execSync('npm rm -g @cosmicstack/mercury-agent', { stdio: 'pipe' });\n } catch {\n // ignore — old package may not exist or ENOTEMPTY\n try {\n const globalDir = execSync('npm root -g', { encoding: 'utf-8' }).trim();\n const pkgDir = join(globalDir, '@cosmicstack', 'mercury-agent');\n const { rmSync } = await import('node:fs');\n try { rmSync(pkgDir, { recursive: true, force: true }); } catch {}\n } catch {}\n }\n\n try {\n execSync('npm i -g @cosmicstack/mercury-agent@latest', { stdio: 'inherit' });\n console.log('');\n console.log(chalk.green(` ✓ Upgraded to v${latestVersion}`));\n console.log(chalk.dim(' Run `mercury` to start the new version.'));\n } catch {\n console.log('');\n console.log(chalk.red(' ✗ Upgrade failed. Try manually:'));\n console.log(chalk.dim(' npm rm -g @cosmicstack/mercury-agent && npm i -g @cosmicstack/mercury-agent'));\n }\n\n console.log('');\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 function getMemoryDir(): string {\n return join(getMercuryHome(), 'memory');\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 | 'openaiCompat'\n | 'mimo'\n | 'mimoTokenPlan';\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 openaiCompat: ProviderConfig;\n mimo: ProviderConfig;\n mimoTokenPlan: 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 shortTermMaxMessages: number;\n secondBrain: {\n enabled: boolean;\n maxRecords: number;\n };\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/v1'),\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', ''),\n enabled: getEnvBool('OLLAMA_LOCAL_ENABLED', false),\n },\n openaiCompat: {\n name: 'openaiCompat',\n apiKey: getEnv('OPENAI_COMPAT_API_KEY', ''),\n baseUrl: getEnv('OPENAI_COMPAT_BASE_URL', ''),\n model: getEnv('OPENAI_COMPAT_MODEL', ''),\n enabled: getEnvBool('OPENAI_COMPAT_ENABLED', false),\n },\n mimo: {\n name: 'mimo',\n apiKey: getEnv('MIMO_API_KEY', ''),\n baseUrl: getEnv('MIMO_BASE_URL', 'https://api.xiaomimimo.com/v1'),\n model: getEnv('MIMO_MODEL', 'mimo-v2.5-pro'),\n enabled: getEnvBool('MIMO_ENABLED', true),\n },\n mimoTokenPlan: {\n name: 'mimoTokenPlan',\n apiKey: getEnv('MIMO_TOKEN_PLAN_API_KEY', ''),\n baseUrl: getEnv('MIMO_TOKEN_PLAN_BASE_URL', 'https://token-plan-cn.xiaomimimo.com/v1'),\n model: getEnv('MIMO_TOKEN_PLAN_MODEL', 'mimo-v2.5-pro'),\n enabled: getEnvBool('MIMO_TOKEN_PLAN_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 shortTermMaxMessages: getEnvNum('SHORT_TERM_MAX_MESSAGES', 20),\n secondBrain: {\n enabled: getEnvBool('SECOND_BRAIN_ENABLED', true),\n maxRecords: getEnvNum('SECOND_BRAIN_MAX_RECORDS', 50),\n },\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 migrateLegacyOllamaCloudBaseUrl(\n migrateLegacyTelegramAccess(deepMerge(defaults, fileConfig)),\n );\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 if (provider.name === 'ollamaCloud') {\n return provider.apiKey.length > 0 && provider.baseUrl.length > 0;\n }\n if (provider.name === 'openaiCompat') {\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\nexport function migrateLegacyOllamaCloudBaseUrl(config: MercuryConfig): MercuryConfig {\n if (config.providers.ollamaCloud.baseUrl === 'https://ollama.com/api') {\n config.providers.ollamaCloud.baseUrl = 'https://ollama.com/v1';\n saveConfig(config);\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, cpSync, rmSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { MercuryConfig } from '../utils/config.js';\nimport { getMemoryDir, getMercuryHome } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nexport function migrateLegacyMemory(): void {\n const legacyDir = resolve('memory');\n const newDir = getMemoryDir();\n if (!existsSync(legacyDir) || legacyDir === newDir) return;\n if (!existsSync(join(legacyDir, 'short-term')) && !existsSync(join(legacyDir, 'long-term')) && !existsSync(join(legacyDir, 'episodic')) && !existsSync(join(legacyDir, 'second-brain'))) return;\n logger.info({ from: legacyDir, to: newDir }, 'Migrating memory from legacy ./memory to ~/.mercury/memory');\n mkdirSync(newDir, { recursive: true });\n for (const sub of ['short-term', 'long-term', 'episodic', 'second-brain']) {\n const src = join(legacyDir, sub);\n const dest = join(newDir, sub);\n if (existsSync(src)) {\n cpSync(src, dest, { recursive: true });\n }\n }\n try {\n rmSync(legacyDir, { recursive: true, force: true });\n logger.info('Legacy memory directory removed');\n } catch {\n logger.warn('Could not remove legacy memory directory — please delete ./memory manually');\n }\n}\n\nexport interface MemoryEntry {\n id: string;\n timestamp: number;\n role: 'user' | 'assistant' | 'system';\n content: string;\n tokenCount?: number;\n reasoning?: string;\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(getMemoryDir(), '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(getMemoryDir(), 'long-term', 'facts.jsonl');\n mkdirSync(join(getMemoryDir(), '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(/\\r?\\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(getMemoryDir(), 'episodic', 'events.jsonl');\n mkdirSync(join(getMemoryDir(), '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(/\\r?\\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 { existsSync, mkdirSync, rmSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { createRequire } from 'node:module';\nimport { logger } from '../utils/logger.js';\n\ntype BetterSqlite3Database = import('better-sqlite3').Database;\n\nconst require = createRequire(import.meta.url);\n\nlet syncDatabaseClass: typeof import('better-sqlite3') | null = null;\nlet availabilityChecked = false;\nlet available = false;\n\ntry {\n const mod = require('better-sqlite3');\n const probeDir = join(tmpdir(), `mercury-sqlite3-probe-${process.pid}`);\n try {\n mkdirSync(probeDir, { recursive: true });\n const probeDb = new mod(join(probeDir, 'probe.db'));\n probeDb.close();\n rmSync(probeDir, { recursive: true, force: true });\n syncDatabaseClass = mod;\n } catch {\n syncDatabaseClass = null;\n }\n} catch {\n syncDatabaseClass = null;\n}\n\nexport function isBetterSqlite3Available(): boolean {\n return syncDatabaseClass !== null;\n}\n\nexport interface MemoryRow {\n id: string;\n user_key: string;\n type: string;\n summary: string;\n detail: string | null;\n scope: string;\n evidence_kind: string;\n source: string;\n confidence: number;\n importance: number;\n durability: number;\n evidence_count: number;\n provenance: string | null;\n dismissed: number;\n superseded_by: string | null;\n created_at: number;\n updated_at: number;\n last_seen_at: number;\n last_used_at: number | null;\n last_used_query: string | null;\n}\n\nexport class SecondBrainDB {\n private db: BetterSqlite3Database;\n\n constructor(dbPath: string) {\n if (!syncDatabaseClass) {\n throw new Error(\n 'better-sqlite3 is not available — second brain memory requires it. ' +\n 'Install build tools (make, gcc/g++, python3) or upgrade to Node >= 20. ' +\n 'See: https://github.com/WiseLibs/better-sqlite3/blob/master/docs/compilation.md'\n );\n }\n const dir = dirname(dbPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n this.db = new syncDatabaseClass(dbPath);\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('synchronous = NORMAL');\n }\n\n init(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS memories (\n id TEXT PRIMARY KEY,\n user_key TEXT NOT NULL,\n type TEXT NOT NULL,\n summary TEXT NOT NULL,\n detail TEXT,\n scope TEXT NOT NULL DEFAULT 'durable',\n evidence_kind TEXT NOT NULL DEFAULT 'inferred',\n source TEXT NOT NULL DEFAULT 'conversation',\n confidence REAL NOT NULL,\n importance REAL NOT NULL,\n durability REAL NOT NULL,\n evidence_count INTEGER NOT NULL DEFAULT 1,\n provenance TEXT,\n dismissed INTEGER NOT NULL DEFAULT 0,\n superseded_by TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n last_seen_at INTEGER NOT NULL,\n last_used_at INTEGER,\n last_used_query TEXT\n );\n\n CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(\n summary, detail, content=memories, content_rowid=rowid\n );\n\n CREATE TABLE IF NOT EXISTS second_brain_meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_memories_user_type ON memories(user_key, type);\n CREATE INDEX IF NOT EXISTS idx_memories_user_dismissed ON memories(user_key, dismissed);\n CREATE INDEX IF NOT EXISTS idx_memories_user_updated ON memories(user_key, updated_at);\n CREATE INDEX IF NOT EXISTS idx_memories_user_scope ON memories(user_key, scope);\n CREATE INDEX IF NOT EXISTS idx_memories_user_evidence_kind ON memories(user_key, evidence_kind);\n\n CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN\n INSERT INTO memories_fts(rowid, summary, detail) VALUES (new.rowid, new.summary, new.detail);\n END;\n\n CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN\n INSERT INTO memories_fts(memories_fts, rowid, summary, detail) VALUES('delete', old.rowid, old.summary, old.detail);\n END;\n\n CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN\n INSERT INTO memories_fts(memories_fts, rowid, summary, detail) VALUES('delete', old.rowid, old.summary, old.detail);\n INSERT INTO memories_fts(rowid, summary, detail) VALUES (new.rowid, new.summary, new.detail);\n END;\n `);\n\n this.db.pragma('foreign_keys = ON');\n logger.info('Second brain database initialized');\n }\n\n insert(row: Omit<MemoryRow, 'rowid'> & { rowid?: never }): void {\n const stmt = this.db.prepare(`\n INSERT INTO memories (\n id, user_key, type, summary, detail, scope, evidence_kind, source,\n confidence, importance, durability, evidence_count, provenance,\n dismissed, superseded_by, created_at, updated_at,\n last_seen_at, last_used_at, last_used_query\n ) VALUES (\n @id, @user_key, @type, @summary, @detail, @scope, @evidence_kind, @source,\n @confidence, @importance, @durability, @evidence_count, @provenance,\n @dismissed, @superseded_by, @created_at, @updated_at,\n @last_seen_at, @last_used_at, @last_used_query\n )\n `);\n stmt.run({\n id: row.id,\n user_key: row.user_key,\n type: row.type,\n summary: row.summary,\n detail: row.detail ?? null,\n scope: row.scope ?? 'durable',\n evidence_kind: row.evidence_kind ?? 'inferred',\n source: row.source ?? 'conversation',\n confidence: row.confidence,\n importance: row.importance,\n durability: row.durability,\n evidence_count: row.evidence_count ?? 1,\n provenance: row.provenance ?? null,\n dismissed: row.dismissed ?? 0,\n superseded_by: row.superseded_by ?? null,\n created_at: row.created_at,\n updated_at: row.updated_at,\n last_seen_at: row.last_seen_at,\n last_used_at: row.last_used_at ?? null,\n last_used_query: row.last_used_query ?? null,\n });\n }\n\n update(row: Partial<MemoryRow> & { id: string }): void {\n const fields: string[] = [];\n const values: Record<string, unknown> = { id: row.id };\n\n const allowedFields = [\n 'summary', 'detail', 'scope', 'evidence_kind', 'source',\n 'confidence', 'importance', 'durability', 'evidence_count',\n 'provenance', 'dismissed', 'superseded_by',\n 'updated_at', 'last_seen_at', 'last_used_at', 'last_used_query',\n ] as const;\n\n for (const field of allowedFields) {\n if (row[field] !== undefined) {\n fields.push(`${field} = @${field}`);\n values[field] = row[field];\n }\n }\n\n if (fields.length === 0) return;\n\n const stmt = this.db.prepare(`UPDATE memories SET ${fields.join(', ')} WHERE id = @id`);\n stmt.run(values);\n }\n\n getActive(userKey: string): MemoryRow[] {\n const stmt = this.db.prepare('SELECT * FROM memories WHERE user_key = ? AND dismissed = 0 ORDER BY updated_at DESC');\n return stmt.all(userKey) as MemoryRow[];\n }\n\n getById(id: string): MemoryRow | undefined {\n const stmt = this.db.prepare('SELECT * FROM memories WHERE id = ?');\n return stmt.get(id) as MemoryRow | undefined;\n }\n\n getByType(userKey: string, type: string): MemoryRow[] {\n const stmt = this.db.prepare('SELECT * FROM memories WHERE user_key = ? AND type = ? AND dismissed = 0 ORDER BY updated_at DESC');\n return stmt.all(userKey, type) as MemoryRow[];\n }\n\n findMergeCandidate(userKey: string, type: string, normalizedTerms: string[]): MemoryRow | undefined {\n const stmt = this.db.prepare(`\n SELECT * FROM memories WHERE user_key = ? AND type = ? AND dismissed = 0\n AND (summary LIKE ? OR ${normalizedTerms.map(() => 'summary LIKE ?').join(' OR ')})\n LIMIT 5\n `);\n const likeAny = normalizedTerms.map(t => `%${t}%`);\n const rows = stmt.all(userKey, type, `%${normalizedTerms.slice(0, 3).join('%')}%`, ...likeAny) as MemoryRow[];\n return rows.find(row => !this.rowHasNegationMismatch(row.summary, normalizedTerms));\n }\n\n findConflictCandidate(userKey: string, type: string, summaryTerms: string[]): MemoryRow | undefined {\n const stmt = this.db.prepare(`\n SELECT * FROM memories WHERE user_key = ? AND type = ? AND dismissed = 0\n AND (${summaryTerms.map(() => 'summary LIKE ?').join(' OR ')})\n LIMIT 5\n `);\n const likes = summaryTerms.map(t => `%${t}%`);\n const rows = stmt.all(userKey, type, ...likes) as MemoryRow[];\n return rows.find(row => this.rowHasNegationMismatch(row.summary, summaryTerms));\n }\n\n private rowHasNegationMismatch(existingSummary: string, incomingTerms: string[]): boolean {\n const lower = existingSummary.toLowerCase();\n const negationWords = ['not', 'never', 'no longer', 'avoid', 'against', 'disabled'];\n const hasNegation = negationWords.some(w => lower.includes(w));\n const incomingLower = incomingTerms.join(' ');\n const incomingHasNegation = negationWords.some(w => incomingLower.includes(w));\n return hasNegation !== incomingHasNegation;\n }\n\n searchRelevant(userKey: string, query: string, limit: number = 10): MemoryRow[] {\n const tokens = query.split(/\\s+/).filter(t => t.length > 0).map(t => t.replace(/\"/g, '\"\"'));\n if (tokens.length === 0) {\n const stmt = this.db.prepare('SELECT * FROM memories WHERE user_key = ? AND dismissed = 0 ORDER BY updated_at DESC LIMIT ?');\n return stmt.all(userKey, limit) as MemoryRow[];\n }\n const ftsQuery = tokens.join(' OR ');\n const ftsStmt = this.db.prepare(`\n SELECT m.* FROM memories m\n JOIN memories_fts fts ON m.rowid = fts.rowid\n WHERE memories_fts MATCH ? AND m.user_key = ? AND m.dismissed = 0\n ORDER BY rank\n LIMIT ?\n `);\n try {\n return ftsStmt.all(ftsQuery, userKey, limit) as MemoryRow[];\n } catch {\n const likeClauses = tokens.map(() => '(summary LIKE ? OR detail LIKE ?)').join(' OR ');\n const stmt = this.db.prepare(`SELECT * FROM memories WHERE user_key = ? AND dismissed = 0 AND (${likeClauses}) ORDER BY updated_at DESC LIMIT ?`);\n const likes = tokens.flatMap(t => [`%${t}%`, `%${t}%`]);\n return stmt.all(userKey, ...likes, limit) as MemoryRow[];\n }\n }\n\n searchFTS(userKey: string, query: string, limit: number = 10): MemoryRow[] {\n return this.searchRelevant(userKey, query, limit);\n }\n\n softDelete(id: string): boolean {\n const stmt = this.db.prepare('UPDATE memories SET dismissed = 1, updated_at = ? WHERE id = ?');\n const result = stmt.run(Date.now(), id);\n return result.changes > 0;\n }\n\n clearByType(userKey: string, type?: string): number {\n if (type) {\n const stmt = this.db.prepare('UPDATE memories SET dismissed = 1, updated_at = ? WHERE user_key = ? AND type = ? AND dismissed = 0');\n const result = stmt.run(Date.now(), userKey, type);\n return result.changes;\n }\n const stmt = this.db.prepare('UPDATE memories SET dismissed = 1, updated_at = ? WHERE user_key = ? AND dismissed = 0');\n const result = stmt.run(Date.now(), userKey);\n return result.changes;\n }\n\n hardDeleteDismissed(userKey: string): number {\n const stmt = this.db.prepare('DELETE FROM memories WHERE user_key = ? AND dismissed = 1');\n const result = stmt.run(userKey);\n return result.changes;\n }\n\n promoteToDurable(userKey: string): number {\n const stmt = this.db.prepare(`\n UPDATE memories SET scope = 'durable', updated_at = ?\n WHERE user_key = ? AND scope = 'active' AND dismissed = 0\n AND evidence_count >= 3 AND evidence_kind IN ('direct', 'manual')\n `);\n const result = stmt.run(Date.now(), userKey);\n return result.changes;\n }\n\n pruneStale(userKey: string): { activePruned: number; durablePruned: number } {\n const now = Date.now();\n const twentyOneDays = 21 * 24 * 60 * 60 * 1000;\n const fortyTwoDays = 42 * 24 * 60 * 60 * 1000;\n const oneHundredTwentyDays = 120 * 24 * 60 * 60 * 1000;\n\n const activeInferred = this.db.prepare(`\n UPDATE memories SET dismissed = 1, updated_at = ?\n WHERE user_key = ? AND scope = 'active' AND evidence_kind = 'inferred' AND dismissed = 0\n AND last_seen_at < ? AND last_seen_at > 0\n `);\n const activeInferredResult = activeInferred.run(now, userKey, now - twentyOneDays);\n\n const activeDirect = this.db.prepare(`\n UPDATE memories SET dismissed = 1, updated_at = ?\n WHERE user_key = ? AND scope = 'active' AND evidence_kind = 'direct' AND dismissed = 0\n AND last_seen_at < ? AND last_seen_at > 0\n `);\n const activeDirectResult = activeDirect.run(now, userKey, now - fortyTwoDays);\n\n const activePruned = activeInferredResult.changes + activeDirectResult.changes;\n\n const durableInferred = this.db.prepare(`\n UPDATE memories SET confidence = MAX(0.15, confidence - 0.15), updated_at = ?\n WHERE user_key = ? AND scope = 'durable' AND evidence_kind = 'inferred' AND dismissed = 0\n AND last_seen_at < ? AND last_seen_at > 0\n `);\n durableInferred.run(now, userKey, now - oneHundredTwentyDays);\n\n const durablePruned = this.db.prepare(`\n UPDATE memories SET dismissed = 1, updated_at = ?\n WHERE user_key = ? AND scope = 'durable' AND dismissed = 0\n AND confidence < 0.3 AND last_seen_at < ? AND last_seen_at > 0\n `);\n const durablePrunedResult = durablePruned.run(now, userKey, now - oneHundredTwentyDays);\n\n return { activePruned, durablePruned: durablePrunedResult.changes };\n }\n\n setMeta(key: string, value: string): void {\n const stmt = this.db.prepare('INSERT OR REPLACE INTO second_brain_meta (key, value) VALUES (@key, @value)');\n stmt.run({ key, value });\n }\n\n getMeta(key: string): string | null {\n const stmt = this.db.prepare('SELECT value FROM second_brain_meta WHERE key = ?');\n const row = stmt.get(key) as { value: string } | undefined;\n return row?.value ?? null;\n }\n\n deleteMeta(key: string): void {\n const stmt = this.db.prepare('DELETE FROM second_brain_meta WHERE key = ?');\n stmt.run(key);\n }\n\n countByType(userKey: string): Record<string, number> {\n const stmt = this.db.prepare(\"SELECT type, COUNT(*) as count FROM memories WHERE user_key = ? AND dismissed = 0 GROUP BY type\");\n const rows = stmt.all(userKey) as Array<{ type: string; count: number }>;\n const result: Record<string, number> = {};\n for (const row of rows) {\n result[row.type] = row.count;\n }\n return result;\n }\n\n totalActive(userKey: string): number {\n const stmt = this.db.prepare('SELECT COUNT(*) as count FROM memories WHERE user_key = ? AND dismissed = 0');\n const row = stmt.get(userKey) as { count: number };\n return row.count;\n }\n\n close(): void {\n this.db.close();\n }\n}","import type { MercuryConfig } from '../utils/config.js';\nimport { getMemoryDir } from '../utils/config.js';\nimport { SecondBrainDB, type MemoryRow } from './second-brain-db.js';\nimport { join } from 'node:path';\nimport { logger } from '../utils/logger.js';\n\nexport type UserMemoryType =\n | 'identity'\n | 'preference'\n | 'goal'\n | 'project'\n | 'habit'\n | 'decision'\n | 'constraint'\n | 'relationship'\n | 'episode'\n | 'reflection';\n\nexport interface UserMemoryRecord {\n id: string;\n type: UserMemoryType;\n summary: string;\n detail?: string | null;\n scope: 'durable' | 'active';\n evidenceKind: 'direct' | 'inferred' | 'manual' | 'system';\n source: 'conversation' | 'system';\n confidence: number;\n importance: number;\n durability: number;\n evidenceCount: number;\n provenance?: string | null;\n dismissed: boolean;\n supersededBy?: string | null;\n createdAt: number;\n updatedAt: number;\n lastSeenAt: number;\n lastUsedAt?: number | null;\n lastUsedQuery?: string | null;\n}\n\nexport interface UserMemoryCandidate {\n type: UserMemoryType;\n summary: string;\n detail?: string;\n evidenceKind?: 'direct' | 'inferred';\n confidence: number;\n importance: number;\n durability: number;\n}\n\nexport interface UserMemorySummary {\n total: number;\n byType: Partial<Record<UserMemoryType, number>>;\n learningPaused: boolean;\n profileSummary?: string;\n activeSummary?: string;\n}\n\nexport interface RetrievedUserMemory {\n records: UserMemoryRecord[];\n context: string;\n}\n\nconst MIN_CONFIDENCE = 0.55;\n\nexport class UserMemoryStore {\n private db: SecondBrainDB;\n private maxRecords: number;\n private userKey: string;\n private consolidateThrottleMs: number;\n private lastConsolidateAt: number = 0;\n\n constructor(config: MercuryConfig, userKey: string = 'user:owner', dbPath?: string) {\n this.userKey = userKey;\n this.maxRecords = config.memory.secondBrain?.maxRecords ?? 50;\n this.consolidateThrottleMs = 5 * 60 * 1000;\n const resolvedDbPath = dbPath ?? join(getMemoryDir(), 'second-brain', 'second-brain.db');\n this.db = new SecondBrainDB(resolvedDbPath);\n this.db.init();\n }\n\n getSummary(): UserMemorySummary {\n const byType = this.db.countByType(this.userKey) as Partial<Record<UserMemoryType, number>>;\n return {\n total: this.db.totalActive(this.userKey),\n byType,\n learningPaused: this.isLearningPaused(),\n profileSummary: this.db.getMeta(`${this.userKey}:profile_summary`) ?? undefined,\n activeSummary: this.db.getMeta(`${this.userKey}:active_summary`) ?? undefined,\n };\n }\n\n getProfile(): string {\n return this.db.getMeta(`${this.userKey}:profile_summary`) || '';\n }\n\n getActiveSummary(): string {\n return this.db.getMeta(`${this.userKey}:active_summary`) || '';\n }\n\n getRecent(limit: number = 10): UserMemoryRecord[] {\n const stmt = this.db.getActive(this.userKey).slice(0, limit);\n return stmt.map(row => this.toRecord(row));\n }\n\n search(query: string, limit: number = 10): UserMemoryRecord[] {\n const rows = this.db.searchFTS(this.userKey, query, limit);\n return rows.map(row => this.toRecord(row));\n }\n\n getByType(type: UserMemoryType): UserMemoryRecord[] {\n const rows = this.db.getByType(this.userKey, type);\n return rows.map(row => this.toRecord(row));\n }\n\n retrieveRelevant(\n query: string,\n options?: { maxRecords?: number; maxChars?: number },\n ): RetrievedUserMemory {\n const maxRecords = options?.maxRecords ?? 5;\n const maxChars = options?.maxChars ?? 900;\n\n const ftsResults = this.db.searchRelevant(this.userKey, query, Math.max(maxRecords * 2, 10));\n const ranked = this.scoreAndRank(ftsResults, query);\n\n const selected: MemoryRow[] = [];\n let currentLength = 0;\n for (const row of ranked) {\n const line = `- [${row.type}] ${row.summary}`;\n if (selected.length >= maxRecords) break;\n if (selected.length > 0 && currentLength + line.length > maxChars) break;\n selected.push(row);\n currentLength += line.length + 1;\n }\n\n if (selected.length === 0) {\n const profile = this.getProfile().trim();\n if (!profile) {\n return { records: [], context: '' };\n }\n return {\n records: [],\n context: [\n this.getActiveSummary() ? `User active state:\\n- ${this.getActiveSummary()}` : '',\n `User profile summary:\\n- ${profile}`,\n ].filter(Boolean).join('\\n\\n'),\n };\n }\n\n const contextLines: string[] = [];\n const activeSummary = this.getActiveSummary();\n if (activeSummary) {\n contextLines.push('User active state:');\n contextLines.push(`- ${activeSummary}`);\n contextLines.push('');\n }\n const profileSummary = this.getProfile();\n if (profileSummary) {\n contextLines.push('User profile summary:');\n contextLines.push(`- ${profileSummary}`);\n contextLines.push('');\n }\n contextLines.push('Relevant user memory:');\n contextLines.push(...selected.map(row => `- [${row.type}] ${row.summary}`));\n\n this.markUsed(selected.map(r => r.id), query);\n return { records: selected.map(r => this.toRecord(r)), context: contextLines.join('\\n') };\n }\n\n remember(\n candidates: UserMemoryCandidate[],\n source: UserMemoryRecord['source'] = 'conversation',\n ): UserMemoryRecord[] {\n if (this.isLearningPaused()) return [];\n\n const remembered: UserMemoryRecord[] = [];\n\n for (const candidate of candidates) {\n if (!shouldStoreCandidate(candidate)) continue;\n\n const terms = normalize(candidate.summary).split(/\\s+/).filter(t => t.length > 2);\n\n const mergeTarget = this.db.findMergeCandidate(this.userKey, candidate.type, terms);\n if (mergeTarget && overlapScore(normalize(mergeTarget.summary), normalize(candidate.summary)) >= 0.74) {\n const merged = this.mergeRecord(mergeTarget, candidate);\n if (merged) remembered.push(merged);\n continue;\n }\n\n const conflictTarget = this.db.findConflictCandidate(this.userKey, candidate.type, terms);\n if (conflictTarget) {\n const conflictWinner = this.resolveConflict(conflictTarget, candidate);\n if (conflictWinner === 'existing') continue;\n }\n\n const record = this.insertRecord(candidate, source);\n if (record) remembered.push(record);\n }\n\n this.enforceMaxRecords();\n\n return remembered;\n }\n\n setLearningPaused(paused: boolean): void {\n this.db.setMeta(`${this.userKey}:learning_paused`, paused ? '1' : '0');\n }\n\n isLearningPaused(): boolean {\n return this.db.getMeta(`${this.userKey}:learning_paused`) === '1';\n }\n\n clear(): number {\n return this.db.clearByType(this.userKey);\n }\n\n consolidate(): { profileUpdated: boolean; reflectionCount: number } {\n const now = Date.now();\n if (now - this.lastConsolidateAt < this.consolidateThrottleMs && this.lastConsolidateAt > 0) {\n return { profileUpdated: false, reflectionCount: 0 };\n }\n this.lastConsolidateAt = now;\n\n const allActive = this.db.getActive(this.userKey);\n const nonReflection = allActive.filter(r => r.type !== 'reflection');\n\n const profileSummary = buildProfileSummary(nonReflection);\n const activeSummary = buildActiveSummary(nonReflection);\n\n const oldProfile = this.db.getMeta(`${this.userKey}:profile_summary`) || '';\n const oldActive = this.db.getMeta(`${this.userKey}:active_summary`) || '';\n const profileUpdated = profileSummary !== oldProfile || activeSummary !== oldActive;\n\n this.db.setMeta(`${this.userKey}:profile_summary`, profileSummary);\n this.db.setMeta(`${this.userKey}:active_summary`, activeSummary);\n\n const reflections = buildReflectionCandidates(nonReflection);\n let reflectionCount = 0;\n for (const reflection of reflections) {\n const sameType = this.db.getByType(this.userKey, 'reflection');\n const existing = findMergeTarget(sameType, reflection);\n if (existing) {\n this.db.update({\n id: existing.id,\n summary: reflection.summary,\n detail: reflection.detail || existing.detail,\n confidence: clamp(Math.max(existing.confidence, reflection.confidence), 0, 1),\n importance: clamp(Math.max(existing.importance, reflection.importance), 0, 1),\n durability: clamp(Math.max(existing.durability, reflection.durability), 0, 1),\n updated_at: Date.now(),\n last_seen_at: Date.now(),\n });\n } else {\n this.insertReflection(reflection);\n }\n reflectionCount += 1;\n }\n\n return { profileUpdated, reflectionCount };\n }\n\n prune(): { activePruned: number; durablePruned: number; promoted: number } {\n const promoted = this.db.promoteToDurable(this.userKey);\n const { activePruned, durablePruned } = this.db.pruneStale(this.userKey);\n const hardDeleted = this.db.hardDeleteDismissed(this.userKey);\n if (hardDeleted > 0) {\n logger.debug({ hardDeleted, userKey: this.userKey }, 'Hard deleted dismissed memories');\n }\n return { activePruned, durablePruned, promoted };\n }\n\n close(): void {\n this.db.close();\n }\n\n private insertRecord(candidate: UserMemoryCandidate, source: UserMemoryRecord['source']): UserMemoryRecord | null {\n const now = Date.now();\n const id = generateId('mem');\n const scope = inferScope(candidate);\n\n this.db.insert({\n id,\n user_key: this.userKey,\n type: candidate.type,\n summary: candidate.summary.trim(),\n detail: candidate.detail?.trim() ?? null,\n scope,\n evidence_kind: candidate.evidenceKind || (source === 'conversation' ? 'inferred' : 'system'),\n source,\n confidence: clamp(candidate.confidence, 0, 1),\n importance: clamp(candidate.importance, 0, 1),\n durability: clamp(candidate.durability, 0, 1),\n evidence_count: 1,\n provenance: candidate.detail?.trim() ?? null,\n dismissed: 0,\n superseded_by: null,\n created_at: now,\n updated_at: now,\n last_seen_at: now,\n last_used_at: null,\n last_used_query: null,\n });\n\n const row = this.db.getById(id);\n return row ? this.toRecord(row) : null;\n }\n\n private insertReflection(candidate: UserMemoryCandidate): void {\n const now = Date.now();\n const id = generateId('mem');\n\n this.db.insert({\n id,\n user_key: this.userKey,\n type: 'reflection',\n summary: candidate.summary,\n detail: candidate.detail ?? null,\n scope: 'durable',\n evidence_kind: 'system',\n source: 'system',\n confidence: candidate.confidence,\n importance: candidate.importance,\n durability: candidate.durability,\n evidence_count: 1,\n provenance: null,\n dismissed: 0,\n superseded_by: null,\n created_at: now,\n updated_at: now,\n last_seen_at: now,\n last_used_at: null,\n last_used_query: null,\n });\n }\n\n private mergeRecord(existing: MemoryRow, candidate: UserMemoryCandidate): UserMemoryRecord | null {\n const updatedAt = Date.now();\n this.db.update({\n id: existing.id,\n summary: pickBetterSummary(existing.summary, candidate.summary),\n detail: candidate.detail || existing.detail,\n provenance: candidate.detail || existing.provenance,\n evidence_kind: candidate.evidenceKind || existing.evidence_kind,\n confidence: clamp(Math.max(existing.confidence, candidate.confidence), 0, 1),\n importance: clamp(Math.max(existing.importance, candidate.importance), 0, 1),\n durability: clamp(Math.max(existing.durability, candidate.durability), 0, 1),\n evidence_count: existing.evidence_count + 1,\n updated_at: updatedAt,\n last_seen_at: updatedAt,\n });\n\n const row = this.db.getById(existing.id);\n return row ? this.toRecord(row) : null;\n }\n\n private resolveConflict(existing: MemoryRow, candidate: UserMemoryCandidate): 'incoming' | 'existing' {\n const incomingConfidence = candidate.confidence;\n const existingConfidence = existing.confidence;\n\n if (incomingConfidence > existingConfidence) {\n this.db.update({\n id: existing.id,\n dismissed: 1,\n superseded_by: 'auto_resolved',\n updated_at: Date.now(),\n });\n logger.debug(\n { existingId: existing.id, existingConfidence, incomingConfidence, type: candidate.type },\n 'Auto-resolved conflict: incoming wins',\n );\n return 'incoming';\n }\n\n if (incomingConfidence < existingConfidence) {\n logger.debug(\n { existingId: existing.id, existingConfidence, incomingConfidence, type: candidate.type },\n 'Auto-resolved conflict: existing wins',\n );\n return 'existing';\n }\n\n this.db.update({\n id: existing.id,\n dismissed: 1,\n superseded_by: 'auto_resolved',\n updated_at: Date.now(),\n });\n logger.debug(\n { existingId: existing.id, type: candidate.type },\n 'Auto-resolved conflict: equal confidence, newer wins',\n );\n return 'incoming';\n }\n\n private enforceMaxRecords(): void {\n const total = this.db.totalActive(this.userKey);\n if (total <= this.maxRecords) return;\n\n const allActive = this.db.getActive(this.userKey);\n const toDismiss = allActive\n .sort((a, b) => memoryHealthScore(b) - memoryHealthScore(a))\n .slice(this.maxRecords);\n\n for (const row of toDismiss) {\n this.db.softDelete(row.id);\n }\n\n if (toDismiss.length > 0) {\n logger.debug({ dismissed: toDismiss.length, userKey: this.userKey }, 'Enforced max records limit');\n }\n }\n\n private markUsed(ids: string[], query?: string): void {\n const now = Date.now();\n for (const id of ids) {\n this.db.update({\n id,\n last_used_at: now,\n last_used_query: query || undefined,\n updated_at: now,\n });\n }\n }\n\n private scoreAndRank(rows: MemoryRow[], query: string): MemoryRow[] {\n const now = Date.now();\n const tokens = query.toLowerCase().split(/\\s+/).filter(t => t.length > 0);\n return rows\n .map(row => {\n let score = 0;\n score += row.confidence * 0.3;\n score += row.importance * 0.25;\n score += row.durability * 0.15;\n const ageDays = (now - row.updated_at) / (1000 * 60 * 60 * 24);\n score += Math.max(0, 0.2 - ageDays * 0.005);\n const lower = (row.summary + ' ' + (row.detail ?? '')).toLowerCase();\n const matchCount = tokens.filter(t => lower.includes(t)).length;\n score += (matchCount / Math.max(tokens.length, 1)) * 0.1;\n return { row, score };\n })\n .sort((a, b) => b.score - a.score)\n .map(r => r.row);\n }\n\n private toRecord(row: MemoryRow): UserMemoryRecord {\n return {\n id: row.id,\n type: row.type as UserMemoryType,\n summary: row.summary,\n detail: row.detail,\n scope: row.scope as 'durable' | 'active',\n evidenceKind: row.evidence_kind as UserMemoryRecord['evidenceKind'],\n source: row.source as UserMemoryRecord['source'],\n confidence: row.confidence,\n importance: row.importance,\n durability: row.durability,\n evidenceCount: row.evidence_count,\n provenance: row.provenance,\n dismissed: row.dismissed === 1,\n supersededBy: row.superseded_by,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n lastSeenAt: row.last_seen_at,\n lastUsedAt: row.last_used_at,\n lastUsedQuery: row.last_used_query,\n };\n }\n}\n\nfunction shouldStoreCandidate(candidate: UserMemoryCandidate): boolean {\n const summary = candidate.summary.trim();\n if (summary.length < 12 || summary.length > 220) return false;\n if (candidate.confidence < MIN_CONFIDENCE) return false;\n if (candidate.durability < 0.4 && candidate.importance < 0.7) return false;\n return true;\n}\n\nfunction findMergeTarget(rows: MemoryRow[], candidate: UserMemoryCandidate): MemoryRow | undefined {\n const normalizedCandidate = normalize(candidate.summary);\n return rows.find(row => {\n if (row.type !== candidate.type) return false;\n if (hasConflict(row.summary, candidate.summary)) return false;\n const normalizedRow = normalize(row.summary);\n if (normalizedRow === normalizedCandidate) return true;\n return overlapScore(normalizedRow, normalizedCandidate) >= 0.74;\n });\n}\n\nfunction memoryHealthScore(row: MemoryRow): number {\n return (row.importance * 0.35)\n + (row.durability * 0.25)\n + (effectiveConfidence(row) * 0.25)\n + (Math.min(row.evidence_count, 5) / 5 * 0.15)\n + (row.scope === 'active' ? 0.08 : 0)\n - (row.superseded_by ? 0.3 : 0)\n - (isRowStale(row) ? 0.12 : 0);\n}\n\nfunction effectiveConfidence(row: MemoryRow): number {\n const ageDays = (Date.now() - row.updated_at) / (1000 * 60 * 60 * 24);\n let confidence = row.confidence;\n\n if (row.evidence_kind === 'inferred') {\n confidence -= Math.min(0.2, ageDays / 365);\n } else if (row.evidence_kind === 'manual') {\n confidence += 0.06;\n } else if (row.evidence_kind === 'direct') {\n confidence += 0.03;\n }\n\n if (row.scope === 'active') {\n confidence -= Math.min(0.18, ageDays / 120);\n }\n\n return clamp(confidence, 0, 1);\n}\n\nfunction isRowStale(row: MemoryRow): boolean {\n const ageDays = (Date.now() - row.updated_at) / (1000 * 60 * 60 * 24);\n if (row.scope === 'active') {\n return ageDays > 21;\n }\n if (row.evidence_kind === 'inferred') {\n return ageDays > 120;\n }\n return ageDays > 365;\n}\n\nfunction tokenize(input: string): string[] {\n return input\n .toLowerCase()\n .split(/[^a-z0-9]+/i)\n .map(term => term.trim())\n .filter(term => term.length >= 3);\n}\n\nfunction normalize(input: string): string {\n return tokenize(input).join(' ');\n}\n\nfunction overlapScore(a: string, b: string): number {\n const aTerms = new Set(a.split(' ').filter(Boolean));\n const bTerms = new Set(b.split(' ').filter(Boolean));\n if (aTerms.size === 0 || bTerms.size === 0) return 0;\n\n let overlap = 0;\n for (const term of aTerms) {\n if (bTerms.has(term)) overlap += 1;\n }\n return overlap / Math.max(aTerms.size, bTerms.size);\n}\n\nfunction pickBetterSummary(existing: string, incoming: string): string {\n return incoming.length > existing.length && incoming.length <= 220 ? incoming.trim() : existing.trim();\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction generateId(prefix: string): string {\n return `${prefix}_${Date.now().toString(36)}${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction inferScope(candidate: UserMemoryCandidate): 'durable' | 'active' {\n if (['goal', 'project', 'decision', 'episode'].includes(candidate.type)) {\n return 'active';\n }\n return 'durable';\n}\n\nfunction hasConflict(a: string, b: string): boolean {\n const left = a.toLowerCase();\n const right = b.toLowerCase();\n if (left === right) return false;\n\n const polarityPairs = [\n ['prefers', 'does not prefer'],\n ['likes', 'does not like'],\n ['wants', 'does not want'],\n ['is building', 'is not building'],\n ['uses', 'does not use'],\n ['enabled', 'disabled'],\n ];\n\n for (const [positive, negative] of polarityPairs) {\n const leftPosRightNeg = left.includes(positive) && right.includes(negative);\n const leftNegRightPos = left.includes(negative) && right.includes(positive);\n if (leftPosRightNeg || leftNegRightPos) {\n return overlapScore(\n normalize(left.replace(positive, '').replace(negative, '')),\n normalize(right.replace(positive, '').replace(negative, '')),\n ) >= 0.5;\n }\n }\n\n const leftHasNegation = /\\b(not|never|no longer|avoid|against|disabled)\\b/.test(left);\n const rightHasNegation = /\\b(not|never|no longer|avoid|against|disabled)\\b/.test(right);\n if (leftHasNegation !== rightHasNegation) {\n return overlapScore(normalize(left), normalize(right)) >= 0.7;\n }\n\n return false;\n}\n\nfunction buildProfileSummary(records: MemoryRow[]): string {\n const selected: string[] = [];\n const preferredTypes: string[] = ['identity', 'preference', 'goal', 'project', 'constraint', 'habit'];\n\n for (const type of preferredTypes) {\n const match = records\n .filter(r => r.type === type)\n .sort((a, b) => memoryHealthScore(b) - memoryHealthScore(a))[0];\n if (match && !selected.includes(match.summary)) {\n selected.push(match.summary);\n }\n if (selected.length >= 4) break;\n }\n\n return selected.join(' ').slice(0, 420).trim();\n}\n\nfunction buildActiveSummary(records: MemoryRow[]): string {\n const cutoff = Date.now() - (14 * 24 * 60 * 60 * 1000);\n const activeCandidates = records\n .filter(r => !r.superseded_by)\n .filter(r => !isRowStale(r))\n .filter(r => r.updated_at >= cutoff)\n .filter(r => ['goal', 'project', 'decision', 'episode'].includes(r.type))\n .sort((a, b) => {\n const byUpdated = b.updated_at - a.updated_at;\n if (byUpdated !== 0) return byUpdated;\n return memoryHealthScore(b) - memoryHealthScore(a);\n })\n .slice(0, 3)\n .map(r => r.summary);\n return activeCandidates.join(' ').slice(0, 360).trim();\n}\n\nfunction buildReflectionCandidates(records: MemoryRow[]): UserMemoryCandidate[] {\n const candidates: UserMemoryCandidate[] = [];\n const groups = new Map<string, MemoryRow[]>();\n\n for (const record of records) {\n if (!groups.has(record.type)) groups.set(record.type, []);\n groups.get(record.type)!.push(record);\n }\n\n const prefGroup = groups.get('preference') || [];\n if (prefGroup.length >= 2) {\n const top = prefGroup\n .sort((a, b) => memoryHealthScore(b) - memoryHealthScore(a))\n .slice(0, 2)\n .map(r => r.summary);\n candidates.push({\n type: 'reflection',\n summary: `User consistently shows these preferences: ${top.join(' ')}`.slice(0, 220),\n detail: top.join('\\n'),\n confidence: 0.86,\n importance: 0.86,\n durability: 0.9,\n });\n }\n\n const goalProjectGroup = [...(groups.get('goal') || []), ...(groups.get('project') || [])];\n if (goalProjectGroup.length >= 2) {\n const top = goalProjectGroup\n .sort((a, b) => memoryHealthScore(b) - memoryHealthScore(a))\n .slice(0, 2)\n .map(r => r.summary);\n candidates.push({\n type: 'reflection',\n summary: `Current long-term direction: ${top.join(' ')}`.slice(0, 220),\n detail: top.join('\\n'),\n confidence: 0.84,\n importance: 0.9,\n durability: 0.86,\n });\n }\n\n const habitConstraintGroup = [...(groups.get('habit') || []), ...(groups.get('constraint') || [])];\n if (habitConstraintGroup.length >= 2) {\n const top = habitConstraintGroup\n .sort((a, b) => memoryHealthScore(b) - memoryHealthScore(a))\n .slice(0, 2)\n .map(r => r.summary);\n candidates.push({\n type: 'reflection',\n summary: `Working style pattern: ${top.join(' ')}`.slice(0, 220),\n detail: top.join('\\n'),\n confidence: 0.82,\n importance: 0.8,\n durability: 0.82,\n });\n }\n\n return candidates;\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, { useChatApi }: { useChatApi?: boolean } = {}) {\n super(config);\n this.name = config.name;\n this.model = config.model;\n\n this.client = createOpenAI({\n apiKey: config.apiKey || 'no-key',\n baseURL: config.baseUrl,\n });\n this.modelInstance = useChatApi\n ? this.client.chat(config.model)\n : 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?.inputTokens ?? 0,\n outputTokens: result.usage?.outputTokens ?? 0,\n totalTokens: (result.usage?.inputTokens ?? 0) + (result.usage?.outputTokens ?? 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(): any {\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?.inputTokens ?? 0,\n outputTokens: result.usage?.outputTokens ?? 0,\n totalTokens: (result.usage?.inputTokens ?? 0) + (result.usage?.outputTokens ?? 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(): any {\n return this.modelInstance;\n }\n}","import { createDeepSeek } from '@ai-sdk/deepseek';\nimport { BaseProvider } from './base.js';\nimport type { ProviderConfig } from '../utils/config.js';\n\nexport class DeepSeekProvider extends BaseProvider {\n readonly name: string;\n readonly model: string;\n private modelInstance: any;\n readonly isReasoner: boolean;\n\n constructor(config: ProviderConfig) {\n super(config);\n this.name = config.name;\n this.model = config.model;\n this.isReasoner = config.model === 'deepseek-reasoner';\n\n const client = createDeepSeek({\n apiKey: config.apiKey,\n baseURL: config.baseUrl,\n });\n this.modelInstance = 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 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 && this.config.baseUrl.length > 0;\n }\n\n getModelInstance() {\n return this.modelInstance;\n }\n}\n","import { createOpenAI } from '@ai-sdk/openai';\nimport { BaseProvider } from './base.js';\nimport type { ProviderConfig } from '../utils/config.js';\n\nexport class MiMoProvider extends BaseProvider {\n readonly name: string;\n readonly model: string;\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 client = createOpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseUrl,\n });\n this.modelInstance = client.chat(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 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 { DeepSeekProvider } from './deepseek.js';\nimport { OllamaProvider } from './ollama.js';\nimport { MiMoProvider } from './mimo.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 config.providers.openaiCompat,\n config.providers.mimo,\n config.providers.mimoTokenPlan,\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 === 'deepseek') {\n provider = new DeepSeekProvider(pc);\n } else if (pc.name === 'ollamaLocal') {\n provider = new OllamaProvider(pc);\n } else if (pc.name === 'ollamaCloud') {\n provider = new OpenAICompatProvider(pc, { useChatApi: true });\n } else if (pc.name === 'openaiCompat') {\n provider = new OpenAICompatProvider(pc, { useChatApi: true });\n } else if (pc.name === 'mimo' || pc.name === 'mimoTokenPlan') {\n provider = new MiMoProvider(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, stepCountIs } 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 { UserMemoryStore } from '../memory/user-memory.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 { DeepSeekProvider } from '../providers/deepseek.js';\nimport { Lifecycle } from './lifecycle.js';\nimport { Scheduler } from './scheduler.js';\nimport { logger } from '../utils/logger.js';\nimport { CLIChannel } from '../channels/cli.js';\nimport { TelegramChannel } from '../channels/telegram.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; failed: boolean }> = [];\n private totalCalls = 0;\n private hardAborted = false;\n private recentStepTexts: Array<string> = [];\n private consecutiveNoActionSteps = 0;\n\n private static readonly ABSOLUTE_MAX = 25;\n private static readonly FAILED_ABSOLUTE_MAX = 12;\n private static readonly NO_ACTION_MAX = 5;\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 ]);\n\n private static readonly IDENTICAL_THRESHOLD = 3;\n private static readonly SIMILAR_THRESHOLD = 4;\n private static readonly TEXT_REPEAT_THRESHOLD = 3;\n private static readonly MAX_STEP_TEXTS = 12;\n\n private static getSameToolThreshold(toolName: string, failingCount: number): number {\n const baseHigh = 5;\n const baseNormal = 3;\n const isHigh = ToolCallLoopDetector.HIGH_TOLERANCE_TOOLS.has(toolName);\n let threshold = isHigh ? baseHigh : baseNormal;\n if (failingCount >= 3) {\n threshold = Math.min(threshold, isHigh ? 3 : 2);\n }\n return threshold;\n }\n\n record(toolName: string, params: Record<string, any>, failed: boolean = false): void {\n const paramsKey = JSON.stringify(params).slice(0, 200);\n this.recentCalls.push({ tool: toolName, params: paramsKey, failed });\n this.totalCalls++;\n this.consecutiveNoActionSteps = 0;\n if (this.recentCalls.length > 30) {\n this.recentCalls.shift();\n }\n }\n\n recordNoActionResult(): boolean {\n this.consecutiveNoActionSteps++;\n return this.consecutiveNoActionSteps >= ToolCallLoopDetector.NO_ACTION_MAX;\n }\n\n recordStepText(text: string): void {\n if (!text || text.length < 10) return;\n const normalized = text.toLowerCase().replace(/\\s+/g, ' ').trim().slice(0, 200);\n if (!normalized) return;\n this.recentStepTexts.push(normalized);\n if (this.recentStepTexts.length > ToolCallLoopDetector.MAX_STEP_TEXTS) {\n this.recentStepTexts.shift();\n }\n }\n\n detectAbsoluteLimit(): boolean {\n if (this.totalCalls >= ToolCallLoopDetector.ABSOLUTE_MAX) return true;\n const failCount = this.recentCalls.filter(c => c.failed).length;\n if (failCount >= ToolCallLoopDetector.FAILED_ABSOLUTE_MAX) return true;\n return false;\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.IDENTICAL_THRESHOLD) {\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 detectSimilarLoop(): { tool: string; count: number; message: string } | null {\n if (this.recentCalls.length < 4) return null;\n\n const last = this.recentCalls[this.recentCalls.length - 1];\n let similarCount = 0;\n\n for (let i = this.recentCalls.length - 1; i >= 0; i--) {\n const call = this.recentCalls[i];\n if (call.tool !== last.tool) break;\n if (call.failed || last.failed) {\n similarCount++;\n } else {\n break;\n }\n }\n\n if (similarCount >= ToolCallLoopDetector.SIMILAR_THRESHOLD) {\n this.hardAborted = true;\n return {\n tool: last.tool,\n count: similarCount,\n message: `[SYSTEM] You called \"${last.tool}\" ${similarCount} times with different params but all are failing. This is a failing loop — stop immediately. Tell the user you cannot complete this task.`,\n };\n }\n\n return null;\n }\n\n detectTextRepetition(): { pattern: string; count: number } | null {\n if (this.recentStepTexts.length < ToolCallLoopDetector.TEXT_REPEAT_THRESHOLD) return null;\n\n const texts = this.recentStepTexts;\n const last = texts[texts.length - 1];\n\n let repeatCount = 0;\n for (let i = texts.length - 1; i >= 0; i--) {\n const similarity = this.textSimilarity(last, texts[i]);\n if (similarity >= 0.7) {\n repeatCount++;\n } else {\n break;\n }\n }\n\n if (repeatCount >= ToolCallLoopDetector.TEXT_REPEAT_THRESHOLD) {\n return {\n pattern: last.slice(0, 60),\n count: repeatCount,\n };\n }\n\n return null;\n }\n\n private textSimilarity(a: string, b: string): number {\n if (a === b) return 1;\n if (!a || !b) return 0;\n\n const setA = new Set(a.split(' '));\n const setB = new Set(b.split(' '));\n const intersection = [...setA].filter(w => setB.has(w)).length;\n const union = new Set([...setA, ...setB]).size;\n return union === 0 ? 0 : intersection / union;\n }\n\n detectSameTool(): { tool: string; count: number } | null {\n if (this.recentCalls.length < 3) return null;\n\n const last = this.recentCalls[this.recentCalls.length - 1];\n\n let consecutiveCount = 0;\n let failingConsecutive = 0;\n for (let i = this.recentCalls.length - 1; i >= 0; i--) {\n if (this.recentCalls[i].tool === last.tool) {\n consecutiveCount++;\n if (this.recentCalls[i].failed) failingConsecutive++;\n } else {\n break;\n }\n }\n\n const threshold = ToolCallLoopDetector.getSameToolThreshold(last.tool, failingConsecutive);\n if (consecutiveCount >= threshold) {\n return { tool: last.tool, count: consecutiveCount };\n }\n\n if (this.recentCalls.length >= 6) {\n const lastN = this.recentCalls.slice(-6);\n const toolCounts: Record<string, number> = {};\n for (const call of lastN) {\n toolCounts[call.tool] = (toolCounts[call.tool] || 0) + 1;\n }\n for (const [tool, count] of Object.entries(toolCounts)) {\n if (count >= 5) {\n return { tool, count };\n }\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.totalCalls = 0;\n this.hardAborted = false;\n this.recentStepTexts = [];\n this.consecutiveNoActionSteps = 0;\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 userMemory: UserMemoryStore | null,\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 this.capabilities.permissions.addTempScope('/', true, 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\n const messages: any[] = [];\n\n const recentSteps = this.shortTerm.getRecent(msg.channelId, 6);\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 if (!loopWarning) {\n const assistantMessages = recentSteps.filter(m => m.role === 'assistant' && m.content.length > 20);\n if (assistantMessages.length >= 3) {\n const last3 = assistantMessages.slice(-3);\n const normalizeText = (t: string) => t.toLowerCase().replace(/[^\\w\\s]/g, '').replace(/\\s+/g, ' ').trim().slice(0, 150);\n const normalized = last3.map(m => normalizeText(m.content));\n const words0 = new Set(normalized[0].split(' '));\n const overlap01 = normalized[0] && normalized[1] ? [...words0].filter(w => new Set(normalized[1].split(' ')).has(w)).length / Math.max(words0.size, 1) : 0;\n const overlap12 = normalized[1] && normalized[2] ? [...new Set(normalized[1].split(' '))].filter(w => new Set(normalized[2].split(' ')).has(w)).length / Math.max(new Set(normalized[1].split(' ')).size, 1) : 0;\n if (overlap01 > 0.75 && overlap12 > 0.75) {\n loopWarning = `[SYSTEM WARNING] Your last 3 responses are nearly identical. You are stuck in a text repetition loop. Stop immediately and give a completely different response. If you cannot complete the task, tell the user clearly why.`;\n }\n }\n }\n }\n\n if (loopWarning) {\n messages.push({ role: 'user', content: loopWarning });\n messages.push({ role: 'assistant', content: 'Acknowledged. I will stop repeating and respond differently, or clearly state if the task cannot be completed.' });\n }\n\n if (this.userMemory) {\n const memoryContext = this.userMemory.retrieveRelevant(msg.content, { maxRecords: 5, maxChars: 900 });\n if (memoryContext.context) {\n messages.push({\n role: 'user',\n content: memoryContext.context,\n });\n messages.push({ role: 'assistant', content: 'Noted. I\\'ll keep this in mind.' });\n }\n } else {\n const relevantFacts = this.longTerm.search(msg.content, 3);\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\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 const tgChannel = this.channels.get('telegram');\n if (msg.channelType === 'telegram' && tgChannel) {\n (tgChannel as TelegramChannel).resetStepCounter(msg.channelId);\n }\n\n for (const provider of fallbackIterator) {\n try {\n const deepseekProviderOptions = provider instanceof DeepSeekProvider && provider.isReasoner\n ? { deepseek: { thinking: { type: 'enabled' as const } } }\n : undefined;\n\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 stopWhen: stepCountIs(MAX_STEPS),\n abortSignal: loopAbortController.signal,\n ...(deepseekProviderOptions ? { providerOptions: deepseekProviderOptions } : {}),\n onStepFinish: async ({ toolCalls, toolResults }) => {\n if (toolCalls && toolResults && toolCalls.length > 0) {\n const names = toolCalls.map((tc: any) => tc.toolName).join(', ');\n logger.info({ tools: names }, 'Tool call step');\n for (let i = 0; i < toolCalls.length; i++) {\n const tc = toolCalls[i];\n const tr = toolResults[i] as any;\n const resultStr = typeof tr?.result === 'string' ? tr.result : JSON.stringify(tr?.result ?? '');\n const failed = resultStr.length < 5000 && (\n resultStr.startsWith('Error:') ||\n resultStr.startsWith('⚠') ||\n resultStr.includes('exited with code') ||\n resultStr.includes('Command failed') ||\n resultStr.startsWith('Command exited with code')\n );\n loopDetector.record(tc.toolName, tc.input as Record<string, any>, failed);\n }\n if (loopDetector.detectAbsoluteLimit()) {\n logger.warn('Absolute tool call limit reached — aborting');\n if (channel && msg.channelType !== 'internal') {\n await channel.send('⚠ Tool call limit reached (25 calls). Stopping to prevent runaway loop.', msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\n return;\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 return;\n }\n const similarLoop = loopDetector.detectSimilarLoop();\n if (similarLoop) {\n logger.warn({ tool: similarLoop.tool, count: similarLoop.count }, 'Failing loop detected — aborting');\n if (!loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n await channel.send(`⚠ Failing loop detected — ${similarLoop.tool} called ${similarLoop.count}x, all failing. Stopping.`, msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\n return;\n }\n const softLoop = loopDetector.detectSameTool();\n if (softLoop && !loopWarningSent && channel && msg.channelType !== 'internal') {\n if (this.capabilities.permissions.isAutoApproveAll()) {\n loopDetector.reset();\n loopWarningSent = false;\n } else {\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 }\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.input as Record<string, any>).catch(() => {});\n }\n if (toolResults) {\n for (let i = 0; i < toolResults.length; i++) {\n const tr = toolResults[i] as any;\n const tcName = toolCalls[i]?.toolName as string | undefined;\n if (tcName) {\n (channel as CLIChannel).sendStepDone(tcName, tr.result ?? tr);\n }\n }\n }\n } else if (channel instanceof TelegramChannel) {\n const tgCh = channel as TelegramChannel;\n for (const tc of toolCalls) {\n await tgCh.sendToolFeedback(tc.toolName, tc.input as Record<string, any>, msg.channelId).catch(() => {});\n }\n if (toolResults) {\n for (let i = 0; i < toolResults.length; i++) {\n const tr = toolResults[i] as any;\n const tcName = toolCalls[i]?.toolName as string | undefined;\n if (tcName) {\n await tgCh.sendStepDone(tcName, tr.result ?? tr, msg.channelId).catch(() => {});\n }\n }\n }\n } else {\n await channel.send(` [Using: ${names}]`, msg.channelId).catch(() => {});\n }\n }\n } else if (toolResults === undefined || (toolCalls === undefined)) {\n const stepText = (toolResults as any)?.text ?? '';\n if (stepText) {\n loopDetector.recordStepText(String(stepText));\n }\n const noActionLoop = loopDetector.recordNoActionResult();\n if (noActionLoop) {\n logger.warn('Reasoning loop detected — model keeps thinking without acting, aborting');\n if (!loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n await channel.send('⚠ I\\'m stuck in a reasoning loop (thinking without taking action). Stopping.', msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\n return;\n }\n const textRepeat = loopDetector.detectTextRepetition();\n if (textRepeat) {\n logger.warn({ pattern: textRepeat.pattern, count: textRepeat.count }, 'Text repetition loop detected — aborting');\n if (!loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n await channel.send('⚠ I keep generating the same response. Stopping to prevent repetition.', msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\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 const streamReasoning = await streamResult.reasoning;\n\n result = { text: fullText, usage, reasoning: streamReasoning };\n streamedText = fullText;\n loopDetector.recordStepText(fullText);\n } else {\n result = await generateText({\n model: provider.getModelInstance(),\n system: systemPrompt,\n messages,\n tools: this.capabilities.getTools(),\n stopWhen: stepCountIs(MAX_STEPS),\n abortSignal: loopAbortController.signal,\n ...(deepseekProviderOptions ? { providerOptions: deepseekProviderOptions } : {}),\n onStepFinish: async ({ toolCalls, toolResults }) => {\n if (toolCalls && toolResults && toolCalls.length > 0) {\n const names = toolCalls.map((tc: any) => tc.toolName).join(', ');\n logger.info({ tools: names }, 'Tool call step');\n for (let i = 0; i < toolCalls.length; i++) {\n const tc = toolCalls[i];\n const tr = toolResults[i] as any;\n const resultStr = typeof tr?.result === 'string' ? tr.result : JSON.stringify(tr?.result ?? '');\n const failed = resultStr.length < 5000 && (\n resultStr.startsWith('Error:') ||\n resultStr.startsWith('⚠') ||\n resultStr.includes('exited with code') ||\n resultStr.includes('Command failed') ||\n resultStr.startsWith('Command exited with code')\n );\n loopDetector.record(tc.toolName, tc.input as Record<string, any>, failed);\n }\n if (loopDetector.detectAbsoluteLimit()) {\n logger.warn('Absolute tool call limit reached — aborting');\n if (channel && msg.channelType !== 'internal') {\n await channel.send('⚠ Tool call limit reached (25 calls). Stopping to prevent runaway loop.', msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\n return;\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 return;\n }\n const similarLoop = loopDetector.detectSimilarLoop();\n if (similarLoop) {\n logger.warn({ tool: similarLoop.tool, count: similarLoop.count }, 'Failing loop detected — aborting');\n if (!loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n await channel.send(`⚠ Failing loop detected — ${similarLoop.tool} called ${similarLoop.count}x, all failing. Stopping.`, msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\n return;\n }\n const softLoop = loopDetector.detectSameTool();\n if (softLoop && !loopWarningSent && channel && msg.channelType !== 'internal') {\n if (this.capabilities.permissions.isAutoApproveAll()) {\n loopDetector.reset();\n loopWarningSent = false;\n } else {\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 }\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.input as Record<string, any>).catch(() => {});\n }\n if (toolResults) {\n for (let i = 0; i < toolResults.length; i++) {\n const tr = toolResults[i] as any;\n const tcName = toolCalls[i]?.toolName as string | undefined;\n if (tcName) {\n (channel as CLIChannel).sendStepDone(tcName, tr.result ?? tr);\n }\n }\n }\n } else if (channel instanceof TelegramChannel) {\n const tgCh = channel as TelegramChannel;\n for (const tc of toolCalls) {\n await tgCh.sendToolFeedback(tc.toolName, tc.input as Record<string, any>, msg.channelId).catch(() => {});\n }\n if (toolResults) {\n for (let i = 0; i < toolResults.length; i++) {\n const tr = toolResults[i] as any;\n const tcName = toolCalls[i]?.toolName as string | undefined;\n if (tcName) {\n await tgCh.sendStepDone(tcName, tr.result ?? tr, msg.channelId).catch(() => {});\n }\n }\n }\n } else {\n await channel.send(` [Using: ${names}]`, msg.channelId).catch(() => {});\n }\n }\n } else if (toolResults === undefined || (toolCalls === undefined)) {\n const stepText = (toolResults as any)?.text ?? '';\n if (stepText) {\n loopDetector.recordStepText(String(stepText));\n }\n const noActionLoop = loopDetector.recordNoActionResult();\n if (noActionLoop) {\n logger.warn('Reasoning loop detected — model keeps thinking without acting, aborting');\n if (!loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n await channel.send('⚠ I\\'m stuck in a reasoning loop (thinking without taking action). Stopping.', msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\n return;\n }\n const textRepeat = loopDetector.detectTextRepetition();\n if (textRepeat) {\n logger.warn({ pattern: textRepeat.pattern, count: textRepeat.count }, 'Text repetition loop detected — aborting');\n if (!loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n await channel.send('⚠ I keep generating the same response. Stopping to prevent repetition.', msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\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 detected I was stuck in a loop (repeating the same action without progress). I cannot complete this task as requested. Please let me know if you\\'d like me to try a completely different approach, or if there\\'s something else I can help with.', 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 || '').trim() || '(no text response)';\n\n this.tokenBudget.recordUsage({\n provider: usedProvider!.name,\n model: usedProvider!.model,\n inputTokens: result.usage?.inputTokens ?? 0,\n outputTokens: result.usage?.outputTokens ?? 0,\n totalTokens: (result.usage?.inputTokens ?? 0) + (result.usage?.outputTokens ?? 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?.inputTokens ?? 0) + (result.usage?.outputTokens ?? 0),\n reasoning: result.reasoning || undefined,\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.extractMemory(msg.content, finalText).catch(err => {\n logger.warn({ err }, 'Memory extraction failed');\n });\n }\n\n if (channel && msg.channelType !== 'internal') {\n const elapsed = Date.now() - startTime;\n if (streamedText && streamedText.trim()) {\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 if (this.userMemory) {\n const summary = this.userMemory.getSummary();\n prompt += `\\n\\nSecond Brain is ENABLED. You have a persistent, structured memory of ${summary.total} facts about this user.`;\n prompt += `\\nMemory types: identity, preference, goal, project, habit, decision, constraint, relationship, episode, reflection.`;\n prompt += `\\nRelevant memories are automatically injected before each message. You can reference them naturally (e.g. \"I remember you prefer TypeScript\").`;\n prompt += `\\nUsers can manage memory with: /memory (overview, search, pause learning, clear).`;\n if (summary.learningPaused) {\n prompt += `\\nLearning is currently PAUSED — no new memories will be extracted from conversations until resumed.`;\n }\n } else {\n prompt += '\\n\\nSecond Brain is DISABLED. Basic long-term memory (text search over facts) is still active.';\n }\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 const channel = manifest.sourceChannelType\n ? this.channels.get(manifest.sourceChannelType as ChannelType)\n : this.channels.getNotificationChannel();\n\n if (channel && manifest.sourceChannelType !== 'internal') {\n const skillInfo = manifest.skillName ? ` (${manifest.skillName})` : '';\n await channel.send(\n ` Scheduled task started${skillInfo}: ${manifest.description}\\nAll actions auto-approved for this run.`,\n manifest.sourceChannelId,\n ).catch(() => {});\n }\n\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 if (this.userMemory) {\n try {\n const consolidation = this.userMemory.consolidate();\n if (consolidation.profileUpdated || consolidation.reflectionCount > 0) {\n logger.info({ consolidation }, 'Second brain consolidated');\n }\n\n const pruning = this.userMemory.prune();\n if (pruning.activePruned > 0 || pruning.durablePruned > 0 || pruning.promoted > 0) {\n logger.info({ pruning }, 'Second brain pruned');\n }\n } catch (err) {\n logger.warn({ err }, 'Second brain heartbeat error');\n }\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 extractMemory(userMessage: string, agentResponse: string): Promise<void> {\n if (!this.userMemory) return;\n if (this.userMemory.isLearningPaused()) return;\n\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(800)) return;\n\n try {\n const provider = this.providers.getDefault();\n const result = await generateText({\n model: provider.getModelInstance(),\n system: `You extract structured memory from conversations. Read the conversation and output a JSON array of memory candidates. Each candidate has: type (one of: identity, preference, goal, project, habit, decision, constraint, relationship, episode), summary (concise fact, 12-220 chars), detail (optional longer explanation), evidenceKind (direct for explicitly stated facts, inferred for patterns you notice), confidence (0.0-1.0), importance (0.0-1.0), durability (0.0-1.0). Extract 0-3 candidates. Only extract specific, durable, user-specific information. Do NOT extract trivial observations, greetings, or assistant behavior. Output pure JSON array, no markdown.`,\n messages: [\n { role: 'user', content: `User: ${userMessage}\\nAssistant: ${agentResponse}` },\n ],\n maxOutputTokens: 400,\n });\n\n this.tokenBudget.recordUsage({\n provider: provider.name,\n model: provider.getModel(),\n inputTokens: result.usage?.inputTokens ?? 0,\n outputTokens: result.usage?.outputTokens ?? 0,\n totalTokens: (result.usage?.inputTokens ?? 0) + (result.usage?.outputTokens ?? 0),\n channelType: 'internal',\n });\n\n const text = result.text.trim();\n if (!text) return;\n\n let candidates: Array<{\n type: string;\n summary: string;\n detail?: string;\n evidenceKind?: string;\n confidence: number;\n importance: number;\n durability: number;\n }>;\n\n try {\n const jsonStr = text.replace(/^```(?:json)?\\s*/i, '').replace(/\\s*```$/, '');\n candidates = JSON.parse(jsonStr);\n } catch {\n const facts = text\n .split('\\n')\n .map(l => l.replace(/^-\\s*/, '').trim())\n .filter(f => f.length > 10 && f.length < 200);\n candidates = facts.slice(0, 3).map(f => ({\n type: 'preference',\n summary: f,\n confidence: 0.75,\n importance: 0.7,\n durability: 0.7,\n evidenceKind: 'inferred',\n }));\n }\n\n const validTypes = ['identity', 'preference', 'goal', 'project', 'habit', 'decision', 'constraint', 'relationship', 'episode'];\n const typed = candidates\n .filter(c => c.summary && c.summary.length >= 12 && c.summary.length <= 220)\n .filter(c => validTypes.includes(c.type))\n .map(c => ({\n type: c.type as any,\n summary: c.summary,\n detail: c.detail,\n evidenceKind: (c.evidenceKind === 'direct' ? 'direct' : 'inferred') as 'direct' | 'inferred',\n confidence: Math.min(1, Math.max(0, c.confidence ?? 0.7)),\n importance: Math.min(1, Math.max(0, c.importance ?? 0.7)),\n durability: Math.min(1, Math.max(0, c.durability ?? 0.7)),\n }));\n\n if (typed.length > 0) {\n const remembered = this.userMemory.remember(typed, 'conversation');\n if (remembered.length > 0) {\n logger.info({ count: remembered.length, types: remembered.map(r => r.type) }, 'Second brain memories stored');\n }\n }\n } catch (err) {\n logger.warn({ err }, 'Memory 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 === '/exit' || cmd === '/quit') {\n await channel.send('Goodbye! Shutting down Mercury...', channelId);\n this.shutdown();\n return true;\n }\n\n if (cmd === '/permissions') {\n if (channelType === 'cli' && channel instanceof CLIChannel) {\n const mode = await channel.askPermissionMode?.();\n if (mode === 'allow-all') {\n this.capabilities.permissions.setAutoApproveAll(true);\n this.capabilities.permissions.addTempScope('/', true, true);\n await channel.send('Allow All mode active for this session. All scopes, commands, and loops auto-approved. Resets on restart.', channelId);\n } else {\n this.capabilities.permissions.setAutoApproveAll(false);\n await channel.send('Ask Me mode active. Risky actions will prompt for confirmation.', channelId);\n }\n return true;\n }\n await channel.send('Use /permissions in CLI to switch permission mode. On Telegram, use the /permissions button or command.', 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 === '/memory') {\n if (!this.userMemory) {\n await channel.send('Second brain is not enabled.', channelId);\n return true;\n }\n\n if (channelType === 'cli' && channel instanceof CLIChannel) {\n await this.openCliMemoryMenu(channel, channelId);\n return true;\n }\n\n await this.sendMemoryOverview(channel, 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 permLabel = this.capabilities.permissions.isAutoApproveAll() ? 'Switch to Ask Me' : 'Switch to Allow All';\n const action = await select('Mercury Commands', [\n { value: 'status', label: 'Status' },\n { value: 'memory', label: 'Memory' },\n { value: 'permissions', label: permLabel },\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 === 'memory') {\n if (this.userMemory) {\n await this.openCliMemoryMenu(channel, channelId, select);\n } else {\n await channel.send('Second brain is not enabled.', channelId);\n }\n continue;\n }\n\n if (action === 'permissions') {\n await this.handleChatCommand('/permissions', '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 sendMemoryOverview(channel: any, channelId: string): Promise<void> {\n if (!this.userMemory) return;\n const summary = this.userMemory.getSummary();\n const lines = [\n `**Memory Overview**`,\n `Total memories: ${summary.total}`,\n `Learning: ${summary.learningPaused ? 'PAUSED' : 'ACTIVE'}`,\n ];\n if (summary.profileSummary) {\n lines.push(`Profile: ${summary.profileSummary}`);\n }\n if (summary.activeSummary) {\n lines.push(`Active: ${summary.activeSummary}`);\n }\n const typeEntries = Object.entries(summary.byType);\n if (typeEntries.length > 0) {\n lines.push('');\n lines.push('By type:');\n for (const [type, count] of typeEntries) {\n lines.push(` ${type}: ${count}`);\n }\n }\n await channel.send(lines.join('\\n'), channelId);\n }\n\n private async openCliMemoryMenu(channel: CLIChannel, channelId: string, select?: (title: string, options: ArrowSelectOption[]) => Promise<string>): Promise<void> {\n if (!this.userMemory) return;\n\n const runMenu = async (sel: (title: string, options: ArrowSelectOption[]) => Promise<string>) => {\n while (true) {\n const learningLabel = this.userMemory!.isLearningPaused() ? 'Resume Learning' : 'Pause Learning';\n const action = await sel('Memory', [\n { value: 'overview', label: 'Overview' },\n { value: 'recent', label: 'Recent Memories' },\n { value: 'search', label: 'Search' },\n { value: 'toggle', label: learningLabel },\n { value: 'clear', label: 'Clear All Memories' },\n { value: 'back', label: 'Back' },\n ]);\n\n if (action === 'back') return;\n\n if (action === 'overview') {\n await this.sendMemoryOverview(channel, channelId);\n continue;\n }\n\n if (action === 'recent') {\n const recent = this.userMemory!.getRecent(10);\n if (recent.length === 0) {\n await channel.send('No memories yet.', channelId);\n continue;\n }\n const lines = ['**Recent Memories:**', ''];\n for (const r of recent) {\n const scope = r.scope === 'active' ? '⏳' : '📌';\n const kind = r.evidenceKind === 'direct' ? 'direct' : r.evidenceKind === 'inferred' ? 'inferred' : r.evidenceKind;\n lines.push(`${scope} [${r.type}] ${r.summary}`);\n lines.push(` Confidence: ${r.confidence.toFixed(2)} | Evidence: ${kind} | Seen: ${r.evidenceCount}x`);\n }\n await channel.send(lines.join('\\n'), channelId);\n continue;\n }\n\n if (action === 'search') {\n const query = await channel.prompt('Search memories: ');\n if (!query) continue;\n const results = this.userMemory!.search(query, 10);\n if (results.length === 0) {\n await channel.send(`No memories found matching \"${query}\".`, channelId);\n continue;\n }\n const lines = [`**Search results for \"${query}\":**`, ''];\n for (const r of results) {\n const scope = r.scope === 'active' ? '⏳' : '📌';\n lines.push(`${scope} [${r.type}] ${r.summary}`);\n lines.push(` Confidence: ${r.confidence.toFixed(2)} | Evidence: ${r.evidenceKind} | Seen: ${r.evidenceCount}x`);\n }\n await channel.send(lines.join('\\n'), channelId);\n continue;\n }\n\n if (action === 'toggle') {\n const currentlyPaused = this.userMemory!.isLearningPaused();\n this.userMemory!.setLearningPaused(!currentlyPaused);\n await channel.send(currentlyPaused ? 'Learning resumed. Mercury will remember new things from conversations.' : 'Learning paused. Mercury will not store new memories until resumed.', channelId);\n continue;\n }\n\n if (action === 'clear') {\n const confirm = await sel('Clear all memories?', [\n { value: 'cancel', label: 'Cancel' },\n { value: 'confirm', label: 'Clear everything' },\n ]);\n if (confirm === 'confirm') {\n const cleared = this.userMemory!.clear();\n await channel.send(`Cleared ${cleared} memories.`, channelId);\n }\n continue;\n }\n }\n };\n\n if (select) {\n await runMenu(select);\n } else {\n await channel.withMenu(runMenu);\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, type PermissionMode } from './base.js';\nimport { logger } from '../utils/logger.js';\nimport { renderMarkdown } from '../utils/markdown.js';\nimport { formatToolStep, formatToolResult } 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 SPINNER_FRAMES = ['⠋','⠙','⠹','⠸','⠼','⠴','⠦','⠧','⠇','⠏'];\n\nfunction agentName(name: string, suffix?: string): string {\n return chalk.cyan(` ${name}:`) + (suffix ?? '');\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 turnHeaderPrinted = false;\n private stepCount = 0;\n private stepStartTime = 0;\n private spinnerFrame = 0;\n private spinnerTimer: ReturnType<typeof setInterval> | null = null;\n private spinnerLine = '';\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(USER_PROMPT);\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 this.turnHeaderPrinted = false;\n const timeStr = elapsedMs != null ? chalk.dim(` (${(elapsedMs / 1000).toFixed(1)}s)`) : '';\n\n const block = this.formatBlock(this.agentName, timeStr, content);\n for (const line of block) {\n console.log(line);\n }\n\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\n const block = this.formatBlock(this.agentName, chalk.dim(' (file)'), [\n chalk.dim(`path: ${resolved}`),\n chalk.dim(`size: ${sizeStr}`),\n ].join('\\n'));\n for (const line of block) {\n console.log(line);\n }\n\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 this.stopSpinner();\n if (!this.turnHeaderPrinted) {\n this.turnHeaderPrinted = true;\n console.log('');\n console.log(agentName(this.agentName, ''));\n console.log('');\n }\n this.stepCount += 1;\n this.stepStartTime = Date.now();\n const stepPrefix = chalk.dim(` ${this.stepCount}.`);\n console.log(`${stepPrefix} ${chalk.dim(label)}`);\n this.startSpinner();\n }\n }\n\n sendStepDone(toolName: string, result: unknown): void {\n if (this.streamActive) {\n const summary = formatToolResult(toolName, result);\n if (summary) {\n process.stdout.write(chalk.dim(` ${summary}\\n`));\n this.streamToolLines++;\n }\n return;\n }\n this.stopSpinner();\n const elapsed = ((Date.now() - this.stepStartTime) / 1000).toFixed(1);\n const summary = formatToolResult(toolName, result);\n if (summary) {\n console.log(chalk.dim(` ${summary} (${elapsed}s)`));\n } else {\n process.stdout.write(chalk.dim(` ${elapsed}s\\n`));\n }\n }\n\n private startSpinner(): void {\n if (!process.stdout.isTTY) return;\n this.spinnerFrame = 0;\n this.spinnerLine = '';\n this.spinnerTimer = setInterval(() => {\n const frame = SPINNER_FRAMES[this.spinnerFrame % SPINNER_FRAMES.length];\n const elapsed = ((Date.now() - this.stepStartTime) / 1000).toFixed(0);\n this.spinnerLine = chalk.dim(` ${frame} Step ${this.stepCount} · ${elapsed}s`);\n process.stdout.write(`\\x1b[2K\\r${this.spinnerLine}`);\n this.spinnerFrame++;\n }, 80);\n }\n\n private stopSpinner(): void {\n if (this.spinnerTimer) {\n clearInterval(this.spinnerTimer);\n this.spinnerTimer = null;\n }\n if (this.spinnerLine) {\n process.stdout.write('\\x1b[2K\\r');\n this.spinnerLine = '';\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 this.stepCount = 0;\n this.turnHeaderPrinted = false;\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 const startTime = Date.now();\n const headerLines = ['', chalk.cyan(` ${this.agentName}:`), ''];\n for (const line of headerLines) {\n console.log(line);\n }\n\n const indent = ' ';\n const cols = process.stdout.columns || 80;\n const contentCols = Math.max(1, cols - indent.length);\n let visualLines = headerLines.length;\n let pendingIndent = true;\n let lineLen = 0;\n\n let full = '';\n for await (const chunk of content) {\n full += chunk;\n for (let i = 0; i < chunk.length; i++) {\n const ch = chunk[i];\n if (ch === '\\n') {\n visualLines += Math.max(1, Math.ceil((lineLen + indent.length) / cols));\n process.stdout.write('\\n');\n lineLen = 0;\n pendingIndent = true;\n } else {\n if (pendingIndent) {\n process.stdout.write(indent);\n pendingIndent = false;\n }\n process.stdout.write(ch);\n lineLen++;\n }\n }\n }\n if (lineLen > 0) {\n visualLines += Math.max(1, Math.ceil((lineLen + indent.length) / cols));\n process.stdout.write('\\n');\n } else {\n visualLines += 1;\n }\n this.streamActive = false;\n\n process.stdout.write(`\\x1b[${visualLines}A`);\n process.stdout.write('\\x1b[J');\n\n if (full.trim()) {\n const block = this.formatBlock(this.agentName, '', full);\n for (const line of block) {\n console.log(line);\n }\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n console.log(chalk.dim(' ' + '─'.repeat(50 - elapsed.length - 4) + ' ' + elapsed + 's'));\n }\n\n this.endOutput();\n return full;\n }\n\n async typing(_targetId?: string): Promise<void> {\n this.stopSpinner();\n if (process.stdout.isTTY) {\n process.stdout.write(chalk.dim(` ${this.agentName} is thinking...\\r`));\n }\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 private formatBlock(name: string, suffix: string, content: string): string[] {\n const header = agentName(name, suffix);\n const body = renderMarkdown(content)\n .split('\\n')\n .map((line: string) => ` ${line}`)\n .join('\\n');\n return ['', header, '', body, ''];\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 askPermissionMode(): Promise<PermissionMode> {\n if (!process.stdout.isTTY) return 'ask-me';\n\n this.suspendPrompt();\n\n console.log('');\n console.log(chalk.bold(' Permission Mode'));\n console.log(chalk.dim(' Choose how Mercury handles risky actions this session.'));\n console.log('');\n\n const options: ArrowSelectOption[] = [\n { value: 'ask-me', label: 'Ask Me — confirm before file writes, shell commands, and scope changes' },\n { value: 'allow-all', label: 'Allow All — auto-approve everything (scopes, commands, loop continuation)' },\n ];\n\n try {\n const selected = await selectWithArrowKeys('Select permission mode:', options, {\n helperText: '↑↓ to move, Enter to select',\n });\n\n if (selected === 'allow-all') {\n console.log('');\n console.log(chalk.yellow(' ⚠ Allow All active for this session:'));\n console.log(chalk.dim(' • All directory scopes auto-approved'));\n console.log(chalk.dim(' • All shell commands auto-approved (except blocked)'));\n console.log(chalk.dim(' • Loop detection will auto-continue'));\n console.log(chalk.dim(' • Resets on restart'));\n console.log('');\n } else {\n console.log('');\n console.log(chalk.dim(' Confirm-before-act mode active.'));\n console.log('');\n }\n\n return selected as PermissionMode;\n } catch {\n return 'ask-me';\n } finally {\n this.resumePrompt();\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 type PermissionMode = 'allow-all' | 'ask-me';\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 askPermissionMode?(): Promise<PermissionMode>;\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 tokens = lexer.lexer(text);\n const result = renderTokens(tokens);\n return decodeHtmlEntities(result.replace(/\\n{3,}/g, '\\n\\n').trimEnd());\n } catch {\n return decodeHtmlEntities(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}\n\nexport function formatToolResult(toolName: string, result: unknown): string {\n if (result == null) return '';\n const str = typeof result === 'string' ? result : JSON.stringify(result);\n if (!str) return '';\n\n if (str.startsWith('Error') || str.startsWith('⚠')) {\n const first = str.split('\\n')[0];\n return first.length > 80 ? first.slice(0, 77) + '…' : first;\n }\n\n const RESULT_HINTS: Record<string, (s: string) => string> = {\n read_file: (s) => `${s.split('\\n').length} lines`,\n write_file: (s) => s.startsWith('Success') ? 'saved' : trimFirst(s),\n create_file: (s) => s.startsWith('Success') ? 'created' : trimFirst(s),\n edit_file: (s) => s.startsWith('Success') ? 'edited' : trimFirst(s),\n delete_file: (s) => s.startsWith('Success') ? 'deleted' : trimFirst(s),\n list_dir: (s) => {\n const entries = s.split('\\n').filter(Boolean).length;\n return `${entries} entries`;\n },\n run_command: (s) => {\n if (s.includes('exited with code')) return s.split('\\n')[0];\n const lines = s.split('\\n').filter(Boolean).length;\n return lines <= 1 ? trimFirst(s) : `${lines} lines output`;\n },\n fetch_url: () => 'fetched',\n git_status: (s) => `${s.split('\\n').filter(Boolean).length} lines`,\n git_diff: (s) => `${s.split('\\n').filter(Boolean).length} lines`,\n git_log: (s) => `${s.split('\\n').filter(Boolean).length} commits`,\n git_add: () => 'staged',\n git_commit: () => 'committed',\n git_push: () => 'pushed',\n create_pr: (s) => s.includes('created') ? 'created' : trimFirst(s),\n review_pr: (s) => `${s.split('\\n').filter(Boolean).length} lines`,\n list_issues: (s) => `${s.split('\\n').filter(Boolean).length} issues`,\n create_issue: (s) => s.includes('created') ? 'created' : trimFirst(s),\n github_api: (s) => `${s.split('\\n').filter(Boolean).length} lines`,\n send_message: () => 'sent',\n send_file: () => 'sent',\n use_skill: (s) => trimFirst(s),\n schedule_task: (s) => trimFirst(s),\n cancel_task: () => 'cancelled',\n list_tasks: (s) => `${s.split('\\n').filter(Boolean).length} tasks`,\n budget_status: () => 'reported',\n approve_scope: () => 'approved',\n approve_command: () => 'approved',\n cd: () => 'changed',\n list_skills: (s) => `${s.split('\\n').filter(Boolean).length} skills`,\n install_skill: (s) => trimFirst(s),\n };\n\n const hint = RESULT_HINTS[toolName];\n if (hint) return hint(str);\n return trimFirst(str);\n}\n\nfunction trimFirst(s: string): string {\n const first = s.split('\\n')[0];\n return first.length > 80 ? first.slice(0, 77) + '…' : first;\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 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, type PermissionMode } 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';\nimport { formatToolStep, formatToolResult } from '../utils/tool-label.js';\n\nconst MAX_MESSAGE_LENGTH = 4096;\nconst ACCESS_ACTION_PREFIX = 'tg_access';\nconst MEMORY_ACTION_PREFIX = 'tg_memory';\n\ntype ApprovalResolver = () => 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 private permissionModes = new Map<number, PermissionMode>();\n private onPermissionMode?: (mode: PermissionMode, chatId: number) => void;\n private statusMessageIds = new Map<string, number>();\n private stepCounters = new Map<string, number>();\n private statusText = new Map<string, string>();\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 setOnPermissionMode(handler: (mode: PermissionMode, chatId: number) => void): void {\n this.onPermissionMode = handler;\n }\n\n getPermissionMode(chatId: number): PermissionMode {\n return this.permissionModes.get(chatId) ?? 'ask-me';\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 if (command === '/memory') {\n if (!this.chatCommandContext) {\n await this.sendDirectMessage(chatId, 'Memory not available.');\n return;\n }\n await this.sendMemoryKeyboard(chatId);\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 (!this.permissionModes.has(chatId) && this.onPermissionMode) {\n this.askPermissionMode(`telegram:${chatId}`).then((mode) => {\n this.permissionModes.set(chatId, mode);\n if (this.onPermissionMode) {\n this.onPermissionMode(mode, chatId);\n }\n }).catch(() => {});\n this.permissionModes.set(chatId, 'ask-me');\n }\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 if (command === '/permissions') {\n this.askPermissionMode(`telegram:${chatId}`).then((mode) => {\n this.permissionModes.set(chatId, mode);\n if (this.onPermissionMode) {\n this.onPermissionMode(mode, chatId);\n }\n }).catch(() => {});\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 if (data.startsWith(`${MEMORY_ACTION_PREFIX}:`)) {\n await this.handleMemoryCallback(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 resolver();\n const action = data.split(':')[1];\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 const message = err?.description || err?.message || String(err);\n if (err?.error_code === 401) {\n reject(new Error(`Telegram bot token is invalid. Get a fresh token from @BotFather via /token.\\n Details: ${message}`));\n } else if (err?.error_code === 404) {\n reject(new Error(`Telegram bot not found — the token may be wrong or the bot was deleted. Verify with @BotFather.\\n Details: ${message}`));\n } else if (err?.error_code === 429) {\n reject(new Error(`Telegram is rate-limiting this bot. Wait a minute and try again.\\n Details: ${message}`));\n } else if (err?.error_code === 403) {\n reject(new Error(`Telegram bot lacks permission for this action. Check bot scopes with @BotFather.\\n Details: ${message}`));\n } else {\n reject(new Error(`Telegram bot failed to start: ${message}`));\n }\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: 'memory', description: 'View and manage second brain memory' },\n { command: 'permissions', description: 'Change permission mode (Ask Me / Allow All)' },\n { command: 'tasks', description: 'List scheduled tasks' },\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 if (!fullContent.trim()) {\n logger.info({ targetId }, 'Telegram send: skipping empty message');\n return;\n }\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 this.deleteStatusMessage(targetId);\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 sendToolFeedback(toolName: string, args: Record<string, any>, targetId?: string): Promise<void> {\n const key = targetId || 'notification';\n this.stepCounters.set(key, (this.stepCounters.get(key) || 0) + 1);\n const step = this.stepCounters.get(key)!;\n const label = formatToolStep(toolName, args);\n await this.updateStatusMessage(`**Step ${step}.** ${label}`, targetId);\n }\n\n async sendStepDone(toolName: string, result: unknown, targetId?: string): Promise<void> {\n const key = targetId || 'notification';\n const step = this.stepCounters.get(key) || 0;\n const summary = formatToolResult(toolName, result);\n const current = this.statusText.get(key) || '';\n const line = summary ? `✓ ${summary}` : '✓ done';\n await this.updateStatusMessage(`${current}\\n${line}`, targetId);\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 if (full.trim()) {\n const html = mdToTelegram(full);\n const stripped = this.stripHtml(html);\n try {\n await this.bot.api.sendMessage(chatId, html, { parse_mode: 'HTML' });\n } catch {\n if (stripped.trim()) {\n try {\n await this.bot.api.sendMessage(chatId, stripped);\n } catch {\n // plain text send also failed\n }\n }\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 async askPermissionMode(targetId?: string): Promise<PermissionMode> {\n const chatIds = this.resolveTargetChatIds(targetId);\n const chatId = chatIds[0];\n if (!chatId || !this.bot) return 'ask-me';\n\n const id = `perm_mode_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const keyboard = new InlineKeyboard()\n .text('🔒 Ask Me', `${id}:ask-me`)\n .text('✅ Allow All', `${id}:allow-all`);\n\n const html = `<b>Permission Mode</b>\\nHow should Mercury handle risky actions this session?\\n\\n🔒 <b>Ask Me</b> — confirm before file writes, commands, and scope changes\\n✅ <b>Allow All</b> — auto-approve everything (scopes, commands, loops)`;\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}:ask-me`, () => resolve('ask-me'));\n this.pendingApprovals.set(`${id}:allow-all`, () => resolve('allow-all'));\n\n setTimeout(() => {\n this.pendingApprovals.delete(`${id}:ask-me`);\n this.pendingApprovals.delete(`${id}:allow-all`);\n resolve('ask-me');\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 async sendMemoryKeyboard(chatId: number): Promise<void> {\n if (!this.bot || !this.chatCommandContext) return;\n\n const summary = this.chatCommandContext.memorySummary();\n const lines = [\n `<b>Memory Overview</b>`,\n `Total memories: ${summary.total}`,\n `Learning: ${summary.learningPaused ? '⏸ PAUSED' : '✅ ACTIVE'}`,\n ];\n if (summary.profileSummary) {\n lines.push(`\\n<i>Profile: ${this.escapeHtml(summary.profileSummary)}</i>`);\n }\n const typeEntries = Object.entries(summary.byType);\n if (typeEntries.length > 0) {\n lines.push('\\n<b>By type:</b>');\n for (const [type, count] of typeEntries) {\n lines.push(` ${type}: ${count}`);\n }\n }\n\n const learningLabel = summary.learningPaused ? '▶ Resume' : '⏸ Pause';\n const keyboard = new InlineKeyboard()\n .text('📋 Overview', `${MEMORY_ACTION_PREFIX}:overview`)\n .text('🔍 Recent', `${MEMORY_ACTION_PREFIX}:recent`)\n .row()\n .text(learningLabel, `${MEMORY_ACTION_PREFIX}:toggle_learning`)\n .text('🗑 Clear All', `${MEMORY_ACTION_PREFIX}:clear_confirm`);\n\n await this.bot.api.sendMessage(chatId, lines.join('\\n'), {\n parse_mode: 'HTML',\n reply_markup: keyboard,\n }).catch(async () => {\n await this.bot!.api.sendMessage(chatId, lines.join('\\n'), { reply_markup: keyboard });\n });\n }\n\n private async handleMemoryCallback(ctx: any, data: string): Promise<void> {\n if (!this.bot || !this.chatCommandContext) {\n await ctx.answerCallbackQuery({ text: 'Not available' });\n return;\n }\n\n const action = data.slice(`${MEMORY_ACTION_PREFIX}:`.length);\n const chatId = ctx.callbackQuery.message?.chat?.id;\n if (!chatId) {\n await ctx.answerCallbackQuery({ text: 'Error' });\n return;\n }\n\n if (action === 'overview') {\n await ctx.answerCallbackQuery({ text: 'Overview' });\n const summary = this.chatCommandContext.memorySummary();\n const lines = [\n `<b>Memory Overview</b>`,\n `Total memories: ${summary.total}`,\n `Learning: ${summary.learningPaused ? '⏸ PAUSED' : '✅ ACTIVE'}`,\n ];\n if (summary.profileSummary) {\n lines.push(`\\n<i>Profile: ${this.escapeHtml(summary.profileSummary)}</i>`);\n }\n if (summary.activeSummary) {\n lines.push(`<i>Active: ${this.escapeHtml(summary.activeSummary)}</i>`);\n }\n const typeEntries = Object.entries(summary.byType);\n if (typeEntries.length > 0) {\n lines.push('\\n<b>By type:</b>');\n for (const [type, count] of typeEntries) {\n lines.push(` ${type}: ${count}`);\n }\n }\n await this.bot.api.sendMessage(chatId, lines.join('\\n'), { parse_mode: 'HTML' }).catch(async () => {\n await this.bot!.api.sendMessage(chatId, lines.join('\\n'));\n });\n return;\n }\n\n if (action === 'recent') {\n await ctx.answerCallbackQuery({ text: 'Recent memories' });\n const recent = this.chatCommandContext.memoryRecent(10);\n if (recent.length === 0) {\n await this.bot.api.sendMessage(chatId, 'No memories yet.').catch(() => {});\n return;\n }\n const lines = ['<b>Recent Memories:</b>\\n'];\n for (const r of recent) {\n const scope = r.scope === 'active' ? '⏳' : '📌';\n lines.push(`${scope} [${r.type}] ${this.escapeHtml(r.summary)}`);\n lines.push(` Confidence: ${r.confidence.toFixed(2)} | Evidence: ${r.evidenceKind} | Seen: ${r.evidenceCount}x`);\n }\n await this.bot.api.sendMessage(chatId, lines.join('\\n'), { parse_mode: 'HTML' }).catch(async () => {\n await this.bot!.api.sendMessage(chatId, lines.join('\\n'));\n });\n return;\n }\n\n if (action === 'toggle_learning') {\n const currentSummary = this.chatCommandContext.memorySummary();\n const currentlyPaused = currentSummary.learningPaused;\n this.chatCommandContext.memorySetLearningPaused(!currentlyPaused);\n const label = currentlyPaused ? '▶ Learning resumed' : '⏸ Learning paused';\n await ctx.answerCallbackQuery({ text: label });\n await this.bot.api.sendMessage(chatId, currentlyPaused\n ? 'Learning resumed. Mercury will remember new things from conversations.'\n : 'Learning paused. Mercury will not store new memories until resumed.',\n ).catch(() => {});\n await this.sendMemoryKeyboard(chatId);\n return;\n }\n\n if (action === 'clear_confirm') {\n const keyboard = new InlineKeyboard()\n .text('🗑 Yes, clear everything', `${MEMORY_ACTION_PREFIX}:clear_yes`)\n .text('✖ Cancel', `${MEMORY_ACTION_PREFIX}:clear_no`);\n await ctx.answerCallbackQuery({});\n await this.bot.api.sendMessage(chatId, '⚠️ Are you sure you want to clear <b>all</b> memories? This cannot be undone.', {\n parse_mode: 'HTML',\n reply_markup: keyboard,\n }).catch(async () => {\n await this.bot!.api.sendMessage(chatId, '⚠️ Are you sure you want to clear all memories?', { reply_markup: keyboard });\n });\n return;\n }\n\n if (action === 'clear_yes') {\n const cleared = this.chatCommandContext.memoryClear();\n await ctx.answerCallbackQuery({ text: `Cleared ${cleared} memories` });\n await this.bot.api.sendMessage(chatId, `Cleared ${cleared} memories.`).catch(() => {});\n return;\n }\n\n if (action === 'clear_no') {\n await ctx.answerCallbackQuery({ text: 'Cancelled' });\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 async updateStatusMessage(text: string, targetId?: string): Promise<void> {\n const chatIds = this.resolveTargetChatIds(targetId);\n if (chatIds.length === 0 || !this.bot) return;\n\n const key = targetId || 'notification';\n this.statusText.set(key, text);\n const html = mdToTelegram(text);\n\n for (const chatId of chatIds) {\n const existingMsgId = this.statusMessageIds.get(key);\n if (existingMsgId) {\n try {\n await this.bot.api.editMessageText(chatId, existingMsgId, html, { parse_mode: 'HTML' });\n return;\n } catch {\n this.statusMessageIds.delete(key);\n }\n }\n\n try {\n const msg = await this.bot.api.sendMessage(chatId, html, { parse_mode: 'HTML' });\n this.statusMessageIds.set(key, msg.message_id);\n } catch {\n try {\n const msg = await this.bot.api.sendMessage(chatId, this.stripHtml(html));\n this.statusMessageIds.set(key, msg.message_id);\n } catch {\n logger.warn({ chatId }, 'Failed to send status message');\n }\n }\n }\n }\n\n private async deleteStatusMessage(targetId?: string): Promise<void> {\n const key = targetId || 'notification';\n const msgId = this.statusMessageIds.get(key);\n if (msgId && this.bot) {\n const chatIds = this.resolveTargetChatIds(targetId);\n for (const chatId of chatIds) {\n await this.bot.api.deleteMessage(chatId, msgId).catch(() => {});\n }\n this.statusMessageIds.delete(key);\n this.statusText.delete(key);\n this.stepCounters.delete(key);\n }\n }\n\n resetStepCounter(targetId?: string): void {\n const key = targetId || 'notification';\n this.stepCounters.delete(key);\n this.statusText.delete(key);\n this.deleteStatusMessage(targetId);\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 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 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\nfunction safeNumber(value: any): number {\n if (value === null || value === undefined) return 0;\n const n = Number(value);\n return isNaN(n) ? 0 : n;\n}\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 safeNumber(this.dailyUsed) + estimatedTokens <= safeNumber(this.dailyBudget);\n }\n\n isOverBudget(): boolean {\n this.resetIfNewDay();\n if (this.forceNext) {\n this.forceNext = false;\n return false;\n }\n return safeNumber(this.dailyUsed) >= safeNumber(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 inputTokens = safeNumber(entry.inputTokens);\n const outputTokens = safeNumber(entry.outputTokens);\n const totalTokens = safeNumber(entry.totalTokens) || inputTokens + outputTokens;\n const safeEntry = { ...entry, inputTokens, outputTokens, totalTokens };\n const logEntry: TokenLogEntry = { ...safeEntry, timestamp: Date.now() };\n this.dailyUsed += totalTokens;\n this.requestLog.push(logEntry);\n this.persist();\n }\n\n getRemaining(): number {\n this.resetIfNewDay();\n return Math.max(0, safeNumber(this.dailyBudget) - safeNumber(this.dailyUsed));\n }\n\n getUsagePercentage(): number {\n this.resetIfNewDay();\n const budget = safeNumber(this.dailyBudget);\n const used = safeNumber(this.dailyUsed);\n return budget > 0 ? (used / budget) * 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 const restored = safeNumber(data.dailyUsed);\n if (!isNaN(restored)) {\n this.dailyUsed = restored;\n }\n this.requestLog = (data.requestLog ?? []).map((entry: any) => ({\n ...entry,\n inputTokens: safeNumber(entry.inputTokens),\n outputTokens: safeNumber(entry.outputTokens),\n totalTokens: safeNumber(entry.totalTokens),\n }));\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 'del /s /q C:\\\\*',\n 'rmdir /s /q C:\\\\*',\n 'format *',\n 'icacls * C:\\\\* /grant',\n 'net user *',\n 'netsh *',\n 'reg delete *',\n 'cmd /c rd /s /q *',\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 'dir *',\n 'type *',\n 'cd *',\n 'where *',\n 'tree *',\n 'findstr *',\n 'tasklist *',\n 'systeminfo *',\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 'xcopy *',\n 'robocopy *',\n 'del *',\n 'rd /s *',\n 'powershell *',\n 'cmd /c *',\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 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 isAutoApproveAll(): boolean {\n return this.autoApproveAll;\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 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 if (!this.autoApproveAll && this.askHandler && this.currentChannelType !== 'internal') {\n return this.requestScopeExternal(path, mode);\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 const baseCmd = trimmed.split(/\\s+/)[0];\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.askHandler && this.currentChannelType !== 'internal') {\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.askHandler && this.currentChannelType !== 'internal') {\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 const mergeArray = (existing: string[] | undefined, defaults: string[]): string[] => {\n if (!existing) return [...defaults];\n const combined = new Set([...defaults, ...existing]);\n return [...combined];\n };\n\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: mergeArray(parsed.capabilities?.shell?.blocked, DEFAULT_MANIFEST.capabilities.shell.blocked),\n autoApproved: mergeArray(parsed.capabilities?.shell?.autoApproved, DEFAULT_MANIFEST.capabilities.shell.autoApproved),\n needsApproval: mergeArray(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } from 'ai';\nimport { z } from 'zod';\nimport { existsSync, readdirSync, statSync } from 'node:fs';\nimport { resolve, isAbsolute, join } 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 inputSchema: zodSchema(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 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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\nimport { resolve, isAbsolute } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\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 prompt the user for approval before execution.`,\n inputSchema: zodSchema(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 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(/^~/, homedir());\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(/^~/, homedir());\n const resolved = isAbsolute(target) ? target : resolve(currentCwd, target);\n if (existsSync(resolved)) {\n setCwd(resolved);\n }\n }\n}","import { tool, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(z.object({})),\n execute: async () => {\n return tokenBudget.getStatusText();\n },\n });\n}","import { tool, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\nimport { writeFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\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 inputSchema: zodSchema(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 cwd = getCwd();\n const msgFilePath = join(cwd, '.git', 'MERCU_MSG');\n writeFileSync(msgFilePath, fullMessage, 'utf-8');\n const result = execSync(`git commit -F \"${msgFilePath}\"`, {\n encoding: 'utf-8',\n timeout: 10000,\n cwd,\n });\n try { unlinkSync(msgFilePath); } catch {}\n return result.trim() || 'Committed successfully.';\n } catch (err: any) {\n try { unlinkSync(join(getCwd(), '.git', 'MERCU_MSG')); } catch {}\n const stderr = err.stderr?.trim() || '';\n if (stderr.includes('nothing to commit')) {\n return 'Nothing to commit \\u2014 no staged changes.';\n }\n return `Error: ${stderr || err.message}`;\n }\n },\n });\n}","import { tool, zodSchema } 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 inputSchema: zodSchema(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) {\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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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 memorySummary: () => import('../memory/user-memory.js').UserMemorySummary;\n memoryRecent: (limit?: number) => import('../memory/user-memory.js').UserMemoryRecord[];\n memorySearch: (query: string, limit?: number) => import('../memory/user-memory.js').UserMemoryRecord[];\n memorySetLearningPaused: (paused: boolean) => void;\n memoryClear: () => number;\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 ['/permissions', 'Change permission mode (Ask Me / Allow All)'],\n ['/tasks', 'List scheduled tasks'],\n ['/memory', 'View and manage second brain memory'],\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 'At session start, choose \"Ask Me\" (confirm each action) or \"Allow All\" (auto-approve everything).',\n 'Scheduled tasks always run in Allow All mode.',\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 const running = isProcessRunning(pid);\n if (!running) {\n try { unlinkSync(pidPath()); } catch {}\n return { running: false, pid: null, logPath: logPath() };\n }\n return { running, pid, logPath: logPath() };\n}\n\nexport function ensureDaemonRunning(): { pid: number; fresh: boolean } {\n const status = getDaemonStatus();\n if (status.running && status.pid) {\n return { pid: status.pid, fresh: false };\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 throw new Error('Failed to spawn daemon process');\n }\n\n writeFileSync(pidPath(), String(child.pid));\n return { pid: child.pid, fresh: true };\n}\n\nexport function startBackground(): void {\n try {\n const result = ensureDaemonRunning();\n console.log('');\n console.log(chalk.green(` Mercury started in background (PID: ${result.pid})`));\n console.log(chalk.dim(` Logs: ${logPath()}`));\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 } catch (err: any) {\n console.log(chalk.red(` Failed to start: ${err.message}`));\n process.exit(1);\n }\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 }\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(/\\r?\\n/).slice(-100);\n console.log(lines.join('\\n'));\n}\n\nexport function tryAutoDaemonize(): boolean {\n try {\n const result = ensureDaemonRunning();\n return result.pid > 0;\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 if (!process.argv[1]) {\n return join(homedir(), '.nvm', 'versions', 'node', `v${process.version.slice(1)}`, 'lib', 'node_modules', '@cosmicstack', 'mercury-agent', 'dist', 'index.js');\n }\n return join(process.argv[1], '..', '..', '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 'llama3.2',\n 'llama3.1',\n 'llama3',\n 'mistral',\n 'codellama',\n 'gemma2',\n 'phi3',\n 'qwen2',\n 'deepseek-r1',\n 'deepseek-coder-v2',\n] as const;\n\nconst MIMO_PREFERRED_MODELS = [\n 'mimo-v2.5-pro',\n 'mimo-v2.5',\n 'mimo-v2-pro',\n 'mimo-v2-omni',\n 'mimo-v2-flash',\n] as const;\n\nconst MIMO_TOKEN_PLAN_PREFERRED_MODELS = MIMO_PREFERRED_MODELS;\n\nconst OPENAI_COMPAT_PREFERRED_MODELS = [] 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 openaiCompat: OPENAI_COMPAT_PREFERRED_MODELS,\n mimo: MIMO_PREFERRED_MODELS,\n mimoTokenPlan: MIMO_TOKEN_PLAN_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 openaiCompat: OPENAI_COMPAT_PREFERRED_MODELS,\n mimo: MIMO_PREFERRED_MODELS,\n mimoTokenPlan: MIMO_TOKEN_PLAN_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 headers: Record<string, string> = {};\n if (config.apiKey) {\n headers['Authorization'] = `Bearer ${config.apiKey}`;\n }\n\n let errorMessage: string;\n if (provider === 'grok') {\n errorMessage = 'Mercury could not fetch models for this Grok key. Please re-enter it.';\n } else if (provider === 'deepseek') {\n errorMessage = 'Mercury could not fetch models for this DeepSeek key. Please re-enter it.';\n } else if (provider === 'openaiCompat') {\n errorMessage = 'Mercury could not fetch models from this server. Please check the base URL and try again.';\n } else {\n errorMessage = 'Mercury could not fetch models for this OpenAI key. Please re-enter it.';\n }\n\n const data = await fetchJson<OpenAIModelResponse>(\n `${trimTrailingSlash(config.baseUrl)}/models`,\n { headers },\n errorMessage,\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 if (provider === 'openaiCompat') {\n return id.length > 0;\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 fetchOllamaCloudModels(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 Ollama Cloud key. Please re-enter it.',\n );\n\n const ids = (data.data ?? [])\n .map((model) => model.id?.trim() ?? '')\n .filter(Boolean);\n\n return buildModelCatalog('ollamaCloud', ids, config.model);\n}\n\nasync function fetchOllamaLocalModels(config: ProviderConfig): Promise<ProviderModelCatalog> {\n const data = await fetchJson<OllamaTagsResponse>(\n `${trimTrailingSlash(config.baseUrl)}/tags`,\n {},\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('ollamaLocal', ids, config.model);\n}\n\nasync function fetchMiMoModels(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 MiMo key. Please re-enter it.',\n );\n\n const ids = (data.data ?? [])\n .map((model) => model.id?.trim() ?? '')\n .filter((id) => {\n const lower = id.toLowerCase();\n return lower.startsWith('mimo-') && !lower.includes('tts');\n });\n\n return buildModelCatalog('mimo', ids, config.model);\n}\n\nasync function fetchMiMoTokenPlanModels(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 MiMo Token Plan key. Please re-enter it.',\n );\n\n const ids = (data.data ?? [])\n .map((model) => model.id?.trim() ?? '')\n .filter((id) => {\n const lower = id.toLowerCase();\n return lower.startsWith('mimo-') && !lower.includes('tts');\n });\n\n return buildModelCatalog('mimoTokenPlan', 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') {\n return fetchOllamaCloudModels(config);\n }\n\n if (provider === 'ollamaLocal') {\n return fetchOllamaLocalModels(config);\n }\n\n if (provider === 'openaiCompat') {\n return fetchOpenAICompatModels(provider, config);\n }\n\n if (provider === 'mimo') {\n return fetchMiMoModels(config);\n }\n\n if (provider === 'mimoTokenPlan') {\n return fetchMiMoTokenPlanModels(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","resolve","resolve","existsSync","join","mkdirSync","readFileSync","writeFileSync","existsSync","mkdirSync","rmSync","join","require","require","join","mkdirSync","rmSync","existsSync","stmt","result","join","join","generateId","generateText","streamText","generateText","streamText","createOpenAI","createOpenAI","provider","generateText","streamText","readline","chalk","chalk","resolve","chalk","agentName","readline","summary","full","resolve","fs","path","resolve","path","fs","tool","channel","streamText","tgChannel","generateText","formatTelegramUser","existsSync","readFileSync","writeFileSync","mkdirSync","join","parseYaml","stringifyYaml","join","path","existsSync","readFileSync","parseYaml","mkdirSync","writeFileSync","stringifyYaml","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","zodSchema","z","existsSync","writeFileSync","resolve","isAbsolute","path","tool","zodSchema","z","existsSync","writeFileSync","mkdirSync","resolve","dirname","isAbsolute","path","tool","zodSchema","z","existsSync","readdirSync","resolve","isAbsolute","join","path","tool","zodSchema","z","existsSync","unlinkSync","resolve","isAbsolute","path","tool","zodSchema","z","readFileSync","writeFileSync","resolve","isAbsolute","path","tool","zodSchema","z","existsSync","statSync","resolve","basename","isAbsolute","path","tool","zodSchema","z","tool","zodSchema","z","resolve","isAbsolute","path","tool","zodSchema","z","resolve","isAbsolute","existsSync","homedir","tool","zodSchema","z","homedir","isAbsolute","resolve","existsSync","tool","zodSchema","z","resolve","isAbsolute","existsSync","statSync","path","tool","zodSchema","z","tool","zodSchema","z","parseYaml","meta","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","cron","manifest","triggerType","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","execSync","path","tool","zodSchema","z","execSync","path","tool","zodSchema","z","execSync","path","tool","zodSchema","z","execSync","tool","zodSchema","z","execSync","writeFileSync","unlinkSync","join","tool","zodSchema","z","execSync","tool","zodSchema","z","path","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","path","tool","zodSchema","z","tool","zodSchema","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","unlinkSync","mkdirSync","writeFileSync","chalk","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","agentName","home","approved","execSync","rmSync"]}
1
+ {"version":3,"sources":["../src/spotify/ui.ts","../src/utils/arrow-select.ts","../src/index.ts","../src/utils/config.ts","../src/utils/logger.ts","../src/soul/identity.ts","../src/memory/store.ts","../src/memory/second-brain-db.ts","../src/memory/user-memory.ts","../src/providers/openai-compat.ts","../src/providers/base.ts","../src/providers/anthropic.ts","../src/providers/deepseek.ts","../src/providers/ollama.ts","../src/providers/mimo.ts","../src/providers/registry.ts","../src/core/agent.ts","../src/core/lifecycle.ts","../src/core/programming-mode.ts","../src/core/background-tasks.ts","../src/channels/cli.ts","../src/channels/base.ts","../src/utils/tool-label.ts","../src/ui/App.tsx","../src/utils/markdown.ts","../src/channels/telegram.ts","../src/capabilities/interaction/ask-user.ts","../src/core/scheduler.ts","../src/core/sub-agent.ts","../src/core/file-lock.ts","../src/core/task-board.ts","../src/core/resource-manager.ts","../src/core/supervisor.ts","../src/spotify/client.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/spotify/index.ts","../src/capabilities/subagents/delegate-task.ts","../src/capabilities/subagents/list-agents.ts","../src/capabilities/subagents/stop-agent.ts","../src/capabilities/registry.ts","../src/skills/loader.ts","../src/skills/default-skills.ts","../src/utils/manual.ts","../src/cli/daemon.ts","../src/cli/service.ts","../src/cli/watchdog.ts","../src/utils/provider-models.ts"],"sourcesContent":["import type { SpotifyClient } from './client.js';\n\nexport function formatNowPlaying(data: any): string {\n if (!data || !data.item) return 'Nothing playing';\n const track = data.item;\n const artists = track.artists?.map((a: any) => a.name).join(', ') || 'Unknown';\n const name = track.name || 'Unknown';\n const progress = data.progress_ms ? Math.floor(data.progress_ms / 1000) : 0;\n const duration = track.duration_ms ? Math.floor(track.duration_ms / 1000) : 0;\n const pct = duration ? Math.floor((progress / duration) * 20) : 0;\n const bar = `[${'█'.repeat(pct)}${'░'.repeat(20 - pct)}]`;\n const status = data.is_playing ? '▶' : '⏸';\n const shuffle = data.shuffle_state ? '🔀' : '';\n const repeat: Record<string, string> = { off: '', track: '🔂', context: '🔁' };\n const repeatIcon = repeat[data.repeat_state] || '';\n const albumArt = track.album?.images?.[0]?.url;\n let text = `${status} ${name} by ${artists}\\n`;\n text += `${bar} ${formatTime(progress)}/${formatTime(duration)}\\n`;\n text += `${shuffle}${repeatIcon}`;\n if (albumArt) text += ` | Album: ${track.album?.name}`;\n return text;\n}\n\nexport function formatTime(seconds: number): string {\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${m}:${s.toString().padStart(2, '0')}`;\n}\n\nexport const PLAYER_CONTROLS = [\n { value: 'play', label: '▶ Play / Resume' },\n { value: 'pause', label: '⏸ Pause' },\n { value: 'next', label: '⏭ Next Track' },\n { value: 'prev', label: '⏮ Previous Track' },\n { value: 'shuffle', label: '🔀 Toggle Shuffle' },\n { value: 'repeat', label: '🔁 Cycle Repeat' },\n { value: 'now', label: '🎵 Now Playing' },\n { value: 'devices', label: '📱 Devices' },\n { value: 'search', label: '🔍 Search & Play' },\n { value: 'volume_up', label: '🔊 Volume +10%' },\n { value: 'volume_down', label: '🔉 Volume -10%' },\n { value: 'queue', label: '📋 Add to Queue' },\n { value: 'like', label: '❤️ Like Current Track' },\n { value: 'exit', label: '✕ Exit Player' },\n];\n\nexport async function handlePlayerAction(\n action: string,\n spotify: SpotifyClient,\n): Promise<string> {\n switch (action) {\n case 'play':\n return await spotify.play();\n case 'pause':\n return await spotify.pause();\n case 'next':\n return await spotify.next();\n case 'prev':\n return await spotify.previous();\n case 'shuffle': {\n const state = await spotify.getPlaybackState();\n const newState = !(state?.shuffle_state);\n return await spotify.setShuffle(newState);\n }\n case 'repeat': {\n const state = await spotify.getPlaybackState();\n const cycle: Record<string, string> = { off: 'track', track: 'context', context: 'off' };\n const next = cycle[state?.repeat_state || 'off'] || 'off';\n return await spotify.setRepeat(next);\n }\n case 'now':\n return await spotify.getNowPlayingText();\n case 'devices': {\n const data = await spotify.getDevices();\n if (!data?.devices?.length) return 'No active devices. Open Spotify on a device.';\n return data.devices.map((d: any) =>\n `${d.is_active ? '▶' : '○'} ${d.name} (${d.type}) — ${d.id}`\n ).join('\\n');\n }\n case 'like': {\n const data = await spotify.getCurrentlyPlaying();\n if (!data?.item?.id) return 'Nothing playing to like.';\n return await spotify.likeTrack(data.item.id);\n }\n case 'volume_up': {\n const state = await spotify.getPlaybackState();\n const current = typeof state?.device?.volume_percent === 'number' ? state.device.volume_percent : 50;\n const next = Math.min(100, current + 10);\n return await spotify.setVolume(next);\n }\n case 'volume_down': {\n const state = await spotify.getPlaybackState();\n const current = typeof state?.device?.volume_percent === 'number' ? state.device.volume_percent : 50;\n const next = Math.max(0, current - 10);\n return await spotify.setVolume(next);\n }\n case 'queue':\n return 'Use `/spotify queue <track name>` to choose what to add.';\n case 'search':\n return 'Use `/spotify search <track name>` to search and play.';\n default:\n return 'Unknown action';\n }\n}\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 { 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, migrateLegacyMemory } from './memory/store.js';\nimport { UserMemoryStore } from './memory/user-memory.js';\nimport { isBetterSqlite3Available } from './memory/second-brain-db.js';\nimport { ProviderRegistry } from './providers/registry.js';\nimport { Agent } from './core/agent.js';\nimport { Scheduler } from './core/scheduler.js';\nimport { SubAgentSupervisor } from './core/supervisor.js';\nimport { SpotifyClient } from './spotify/client.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 ' =( o.o )= ',\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.bold.cyan(' MERCURY'));\n console.log(chalk.white(' Your soul-driven AI agent'));\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.bold.cyan(' MERCURY'));\n console.log(chalk.dim(' Your soul-driven AI agent'));\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 { key: 'openaiCompat', label: 'OpenAI Compilations' },\n { key: 'mimo', label: 'MiMo (Xiaomi)' },\n { key: 'mimoTokenPlan', label: 'MiMo Token Plan (Xiaomi)' },\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 if (provider === 'mimo') {\n return /^sk-[A-Za-z0-9_-]{16,}$/i.test(value)\n ? null\n : 'MiMo keys must start with `sk-`.';\n }\n\n if (provider === 'mimoTokenPlan') {\n return /^tp-[A-Za-z0-9_-]{16,}$/i.test(value)\n ? null\n : 'MiMo Token Plan keys must start with `tp-`.';\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}.`;\n console.log(chalk.yellow(` ${message}`));\n console.log(chalk.dim(' The API key looks valid but Mercury could not reach the provider.'));\n console.log(chalk.dim(` You can enter a model name manually, or skip ${providerLabel} for now.`));\n\n const manualModel = await ask(chalk.white(` ${providerLabel} model name (Enter to skip ${providerLabel} for now): `));\n if (!manualModel) {\n if (isReconfig && existingConfig.apiKey) {\n return { apiKey: existingConfig.apiKey, model: existingConfig.model, skipped: true };\n }\n return { skipped: true };\n }\n\n const modelError = validateModelName(manualModel);\n if (modelError) {\n console.log(chalk.red(` ${modelError}`));\n continue;\n }\n\n return { apiKey: value, model: manualModel, skipped: false };\n }\n }\n}\n\nasync function promptOllamaLocalModelSelection(config: MercuryConfig, isReconfig: boolean): Promise<{ baseUrl?: string; model?: string; skipped: boolean }> {\n const existingConfig = config.providers.ollamaLocal;\n\n const baseUrlPrompt = isReconfig && existingConfig.baseUrl\n ? chalk.white(` Ollama Local base URL [${existingConfig.baseUrl}]: `)\n : chalk.white(' Ollama Local base URL (Enter to skip, or \"none\" to skip): ');\n const baseUrlInput = await ask(baseUrlPrompt);\n if (!baseUrlInput || baseUrlInput.toLowerCase() === 'none') {\n if (isReconfig && existingConfig.baseUrl) {\n return { baseUrl: existingConfig.baseUrl, model: existingConfig.model, skipped: true };\n }\n return { skipped: true };\n }\n const baseUrlError = validateBaseUrl(baseUrlInput);\n if (baseUrlError) {\n console.log(chalk.red(` ${baseUrlError}`));\n if (isReconfig && existingConfig.baseUrl) {\n return { baseUrl: existingConfig.baseUrl, model: existingConfig.model, skipped: true };\n }\n return { skipped: true };\n }\n const baseUrl = baseUrlInput;\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.';\n console.log(chalk.yellow(` ${message}`));\n console.log(chalk.dim(' Make sure Ollama is running locally, or enter the model name manually.'));\n console.log(chalk.dim(' You can run `mercury doctor` later to configure Ollama after starting it.'));\n\n const manualModel = await ask(chalk.white(` Ollama Local model name (Enter to skip Ollama Local for now): `));\n if (!manualModel) {\n return { skipped: true };\n }\n\n const modelError = validateModelName(manualModel);\n if (modelError) {\n console.log(chalk.red(` ${modelError}`));\n return { skipped: true };\n }\n\n return { baseUrl, model: manualModel, skipped: false };\n }\n}\n\nasync function promptOpenAICompatSetup(config: MercuryConfig, isReconfig: boolean): Promise<{ baseUrl?: string; apiKey?: string; model?: string; skipped: boolean }> {\n const existingConfig = config.providers.openaiCompat;\n\n const baseUrl = (await promptValidatedValue(\n chalk.white(` Server base URL${isReconfig && existingConfig.baseUrl ? ` [${existingConfig.baseUrl}]` : ''}: `),\n validateBaseUrl,\n existingConfig.baseUrl,\n ))!;\n if (!baseUrl) return { skipped: true };\n\n const apiKeyPrompt = isReconfig && existingConfig.apiKey\n ? chalk.white(` API key (optional, press Enter to keep current) [${maskKey(existingConfig.apiKey)}]: `)\n : chalk.white(' API key (optional, press Enter to skip): ');\n const apiKey = await ask(apiKeyPrompt);\n const resolvedApiKey = apiKey || existingConfig.apiKey || '';\n\n console.log(chalk.dim(' Fetching models from server...'));\n try {\n const catalog = await fetchProviderModelCatalog('openaiCompat', {\n ...existingConfig,\n baseUrl,\n apiKey: resolvedApiKey,\n });\n const model = await chooseProviderModel(\n 'OpenAI Compilations',\n catalog.recommendedModel,\n catalog.models,\n );\n return { baseUrl, apiKey: resolvedApiKey, model, skipped: false };\n } catch {\n console.log(chalk.yellow(' Could not fetch models from this server. You can enter the model name manually.'));\n const model = (await promptValidatedValue(\n chalk.white(' Model name: '),\n validateModelName,\n ))!;\n if (!model) return { baseUrl, apiKey: resolvedApiKey, model: existingConfig.model, skipped: false };\n return { baseUrl, apiKey: resolvedApiKey, model, skipped: false };\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 } catch (err: any) {\n console.log(chalk.red(`\\n ✗ ${err.message || err}`));\n console.log('');\n await telegram.stop();\n return;\n }\n\n try {\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. You can skip any provider by pressing Enter.'));\n console.log(chalk.dim(' Press Enter to configure DeepSeek by default (free at platform.deepseek.com).'));\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, isReconfig);\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 continue;\n }\n\n if (provider === 'openaiCompat') {\n const result = await promptOpenAICompatSetup(config, isReconfig);\n if (!result.skipped && result.baseUrl && result.model) {\n config.providers.openaiCompat.baseUrl = result.baseUrl;\n config.providers.openaiCompat.model = result.model;\n config.providers.openaiCompat.enabled = true;\n if (result.apiKey) {\n config.providers.openaiCompat.apiKey = result.apiKey;\n }\n }\n continue;\n }\n\n if (provider === 'mimo') {\n const mask = isReconfig && config.providers.mimo.apiKey ? ` [${maskKey(config.providers.mimo.apiKey)}]` : '';\n const result = await promptApiKeyWithModelSelection(\n config,\n 'mimo',\n 'MiMo',\n chalk.white(` MiMo API key${mask}${isReconfig ? '' : ' (Enter to skip)'}: `),\n isReconfig,\n );\n if (!result.skipped && result.apiKey && result.model) {\n config.providers.mimo.apiKey = result.apiKey;\n config.providers.mimo.model = result.model;\n config.providers.mimo.enabled = true;\n }\n continue;\n }\n\n if (provider === 'mimoTokenPlan') {\n const mask = isReconfig && config.providers.mimoTokenPlan.apiKey ? ` [${maskKey(config.providers.mimoTokenPlan.apiKey)}]` : '';\n const result = await promptApiKeyWithModelSelection(\n config,\n 'mimoTokenPlan',\n 'MiMo Token Plan',\n chalk.white(` MiMo Token Plan API key${mask}${isReconfig ? '' : ' (Enter to skip)'}: `),\n isReconfig,\n );\n if (!result.skipped && result.apiKey && result.model) {\n config.providers.mimoTokenPlan.apiKey = result.apiKey;\n config.providers.mimoTokenPlan.model = result.model;\n config.providers.mimoTokenPlan.enabled = true;\n }\n }\n }\n\n const configuredProviders = getConfiguredProviderNames(config);\n if (configuredProviders.length === 0) {\n console.log('');\n console.log(chalk.yellow(' No LLM providers were configured.'));\n console.log(chalk.dim(' Mercury needs at least one provider to work.'));\n console.log(chalk.dim(' DeepSeek offers a free API key at platform.deepseek.com'));\n console.log('');\n console.log(chalk.white(' Options:'));\n console.log(chalk.white(' 1. Try again — choose a provider and enter an API key'));\n console.log(chalk.white(' 2. Skip for now — you can run `mercury doctor` later'));\n console.log('');\n\n const skipChoice = await ask(chalk.white(' Press Enter to try again, or type \"skip\" to exit setup: '));\n if (skipChoice.toLowerCase() === 'skip') {\n saveConfig(config);\n const home = getMercuryHome();\n console.log('');\n console.log(chalk.green(` ✓ Config saved to ${home}/mercury.yaml`));\n console.log(chalk.yellow(' No providers configured yet. Run `mercury doctor` when ready.'));\n console.log('');\n process.exit(0);\n }\n\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(' You can add it later with mercury doctor.'));\n console.log('');\n\n const ghSetup = await ask(chalk.white(' Configure GitHub? (y/N): '));\n if (ghSetup.toLowerCase() === 'y' || ghSetup.toLowerCase() === 'yes') {\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\n hr();\n console.log('');\n console.log(chalk.bold.white(' Spotify Integration (optional)'));\n console.log(chalk.dim(' Connect Mercury to your Spotify so it can play music,'));\n console.log(chalk.dim(' manage playlists, and act as your DJ on any of your devices.'));\n console.log(chalk.dim(' You can add it later with mercury doctor.'));\n console.log('');\n\n const spotifySetup = await ask(chalk.white(' Configure Spotify? (y/N): '));\n if (spotifySetup.toLowerCase() === 'y' || spotifySetup.toLowerCase() === 'yes') {\n console.log('');\n console.log(chalk.dim(' 1. Go to developer.spotify.com/dashboard'));\n console.log(chalk.dim(' 2. Click \"Create app\" — set name: Mercury'));\n console.log(chalk.dim(' 3. Set redirect URI: http://127.0.0.1:8888/callback'));\n console.log(chalk.dim(' 4. Copy the Client ID and Client Secret'));\n console.log('');\n\n const spotifyIdCurrent = isReconfig && config.spotify.clientId ? ` [${maskKey(config.spotify.clientId)}]` : '';\n const spotifyClientId = await ask(chalk.white(` 1. Spotify Client ID${spotifyIdCurrent}: `));\n if (spotifyClientId) {\n config.spotify.clientId = spotifyClientId;\n appendToEnv('SPOTIFY_CLIENT_ID', spotifyClientId);\n }\n\n const spotifySecretCurrent = isReconfig && config.spotify.clientSecret ? ` [${maskKey(config.spotify.clientSecret)}]` : '';\n const spotifyClientSecret = await ask(chalk.white(` 2. Spotify Client Secret${spotifySecretCurrent}: `));\n if (spotifyClientSecret) {\n config.spotify.clientSecret = spotifyClientSecret;\n appendToEnv('SPOTIFY_CLIENT_SECRET', spotifyClientSecret);\n }\n\n if (spotifyClientId || spotifyClientSecret) {\n config.spotify.enabled = true;\n console.log('');\n console.log(chalk.dim(' After Mercury starts, run /spotify auth to connect your account.'));\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 if (config.spotify.clientId) {\n console.log(chalk.green(` ✓ Spotify configured — run /spotify auth to connect your account`));\n }\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 && daemon.pid) {\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(` \\u2713 Mercury is running in background (PID: ${status.pid})`));\n console.log(chalk.green(' \\u2713 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.yellow(' Background mode not available. Run `mercury start` to set it up.'));\n }\n console.log('');\n}\n\nfunction runPlatformDoctor(): void {\n const daemon = getDaemonStatus();\n const termProgram = process.env.TERM_PROGRAM || 'unknown';\n const term = process.env.TERM || 'unknown';\n const isTTY = Boolean(process.stdin.isTTY && process.stdout.isTTY);\n const rawModeSupported = Boolean(process.stdin.isTTY && typeof (process.stdin as NodeJS.ReadStream).setRawMode === 'function');\n const sshSession = Boolean(process.env.SSH_CONNECTION || process.env.SSH_TTY);\n const ci = process.env.CI === 'true';\n const canInlineArt = termProgram === 'iTerm.app' && !sshSession && !ci;\n\n console.log('');\n console.log(chalk.bold.cyan(' Mercury Platform Doctor'));\n console.log(chalk.dim(' Cross-platform runtime compatibility report'));\n console.log('');\n console.log(` OS: ${chalk.white(process.platform)} (${process.arch})`);\n console.log(` Node.js: ${chalk.white(process.version)} (required >= 20)`);\n console.log(` Terminal program: ${chalk.white(termProgram)}`);\n console.log(` TERM: ${chalk.white(term)}`);\n console.log(` Interactive TTY: ${isTTY ? chalk.green('yes') : chalk.yellow('no')}`);\n console.log(` Raw mode support: ${rawModeSupported ? chalk.green('yes') : chalk.yellow('no')}`);\n console.log(` SSH session: ${sshSession ? chalk.yellow('yes') : chalk.green('no')}`);\n console.log(` CI environment: ${ci ? chalk.yellow('yes') : chalk.green('no')}`);\n console.log(` Daemon: ${daemon.running ? chalk.green(`running (PID: ${daemon.pid})`) : chalk.dim('not running')}`);\n console.log(` Spotify inline art: ${canInlineArt ? chalk.green('supported (iTerm local)') : chalk.dim('disabled/fallback mode')}`);\n console.log('');\n console.log(chalk.bold.white(' Keybinding Notes'));\n console.log(` • View toggle: ${chalk.white('Ctrl+V')} (fallback: ${chalk.white('/view')})`);\n console.log(` • Workspace exit: ${chalk.white('Esc')} or ${chalk.white('Ctrl+Q')} (fallback: ${chalk.white('/ws exit')})`);\n console.log(` • Code mode switch: ${chalk.white('Ctrl+P')} plan, ${chalk.white('Ctrl+X')} execute`);\n console.log('');\n\n if (!rawModeSupported) {\n console.log(chalk.yellow(' Warning: Raw mode is unavailable; interactive Ink input may be limited in this terminal.'));\n console.log(chalk.dim(' Try a local terminal session with TTY support for the best experience.'));\n console.log('');\n }\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 logger.info(`${name} is waking up...`);\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 defaultProvider = config.providers.default;\n const defaultModel = config.providers[defaultProvider]?.model ?? 'unknown';\n\n if (!isDaemon) {\n const providerSummary = available.map((provider) => {\n const key = provider as ProviderName;\n const label = getProviderLabel(key);\n const model = config.providers[key]?.model ?? '?';\n const marker = key === defaultProvider ? ' ← default' : '';\n return `${label}: ${model}${marker}`;\n });\n logger.info({ providers: providerSummary, default: getProviderLabel(defaultProvider) }, 'Providers loaded');\n } else {\n logger.info({ providers: available, default: defaultProvider }, 'Providers loaded');\n }\n\n const skillLoader = new SkillLoader();\n const skills = skillLoader.discover();\n if (!isDaemon) {\n logger.info(`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 migrateLegacyMemory();\n const shortTerm = new ShortTermMemory(config);\n const longTerm = new LongTermMemory(config);\n const episodic = new EpisodicMemory(config);\n\n let userMemory: UserMemoryStore | null = null;\n if (config.memory.secondBrain?.enabled !== false && isBetterSqlite3Available()) {\n try {\n userMemory = new UserMemoryStore(config);\n if (!isDaemon) {\n logger.info(`Second brain: enabled (${userMemory.getSummary().total} existing memories)`);\n } else {\n logger.info({ total: userMemory.getSummary().total }, 'Second brain loaded');\n }\n } catch (err) {\n logger.warn({ err }, 'Second brain initialization failed, continuing without it');\n userMemory = null;\n }\n } else if (config.memory.secondBrain?.enabled !== false && !isBetterSqlite3Available()) {\n logger.warn(\n 'better-sqlite3 is not available — second brain memory is disabled. ' +\n 'To enable it, install build tools (make, gcc/g++, python3) and ensure Node >= 20, then reinstall.'\n );\n }\n\n const channels = new ChannelRegistry(config);\n const capabilities = new CapabilityRegistry(skillLoader, scheduler, tokenBudget);\n\n let supervisor: SubAgentSupervisor | undefined;\n if (config.subagents.enabled) {\n supervisor = new SubAgentSupervisor({\n agentConfig: config,\n providers,\n identity,\n shortTerm,\n longTerm,\n episodic,\n userMemory,\n capabilities,\n tokenBudget,\n channels,\n });\n if (config.subagents.mode === 'manual' && config.subagents.maxConcurrent > 0) {\n supervisor.setMaxConcurrent(config.subagents.maxConcurrent);\n }\n capabilities.setSupervisor(supervisor);\n }\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 memorySummary: () => userMemory ? userMemory.getSummary() : { total: 0, byType: {}, learningPaused: false },\n memoryRecent: (limit?: number) => userMemory ? userMemory.getRecent(limit) : [],\n memorySearch: (query: string, limit?: number) => userMemory ? userMemory.search(query, limit) : [],\n memorySetLearningPaused: (paused: boolean) => { if (userMemory) userMemory.setLearningPaused(paused); },\n memoryClear: () => userMemory ? userMemory.clear() : 0,\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, userMemory, channels, tokenBudget, capabilities, scheduler,\n );\n\n if (supervisor) {\n agent.setSupervisor(supervisor);\n }\n\n let spotifyClient: SpotifyClient | undefined;\n if (config.spotify.clientId && config.spotify.clientSecret) {\n spotifyClient = new SpotifyClient(config);\n capabilities.setSpotifyClient(spotifyClient);\n capabilities.registerSpotifyTools();\n agent.setSpotifyClient(spotifyClient);\n\n if (spotifyClient.isAuthenticated()) {\n if (!spotifyClient.getAccountName()) {\n spotifyClient.saveAccountInfo().catch(() => {});\n }\n spotifyClient.checkPremium().catch(() => {});\n\n const accountName = spotifyClient.getAccountName();\n const label = accountName ? ` as ${accountName}` : '';\n logger.info(`Spotify connected${label} (token available)`);\n } else {\n logger.info('Spotify: not connected — run /spotify auth to link your account');\n }\n }\n\n if (!isDaemon) {\n const bootCli = channels.getCliChannel();\n if (bootCli) {\n await channels.startAll();\n const skillInfos = skills.map((s) => ({ name: s.name, description: s.description, loaded: true }));\n bootCli.initSplash(name, pkgVersion);\n bootCli.setSkills(skillInfos);\n bootCli.setProvider(getProviderLabel(defaultProvider), defaultModel);\n bootCli.setTokenInfo(tokenBudget.getDailyUsed(), tokenBudget.getBudget(), Math.round(tokenBudget.getUsagePercentage()));\n bootCli.mountTUI((inputText: string) => {\n bootCli.sendUserMessage(inputText);\n }, spotifyClient, () => {\n process.exit(0);\n });\n } else {\n await channels.startAll();\n }\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 if (tgChannel) {\n tgChannel.setChatCommandContext(capabilities.getChatCommandContext()!);\n }\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 if (tgChannel) {\n tgChannel.setOnPermissionMode((mode, chatId) => {\n if (mode === 'allow-all') {\n capabilities.permissions.setAutoApproveAll(true);\n capabilities.permissions.addTempScope('/', true, true);\n logger.info({ chatId }, 'Telegram: Allow All mode set for session');\n }\n });\n }\n\n const activeCh = channels.getActiveChannels();\n const toolNames = capabilities.getToolNames();\n\n if (!isDaemon) {\n if (config.identity.creator) {\n logger.info(`Creator: ${config.identity.creator}`);\n }\n\n const mode = cliChannel && await cliChannel.askPermissionMode?.();\n if (mode === 'allow-all') {\n capabilities.permissions.setAutoApproveAll(true);\n capabilities.permissions.addTempScope('/', true, true);\n }\n } else {\n await channels.startAll();\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 if (userMemory) {\n try {\n userMemory.consolidate();\n userMemory.close();\n } catch {}\n }\n await agent.shutdown();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n if (!isDaemon && process.platform !== 'win32') {\n process.on('SIGHUP', () => {\n logger.info('SIGHUP received — terminal closed. Daemonizing.');\n try {\n const result = tryAutoDaemonize();\n if (result) {\n logger.info(`Forked daemon. Foreground process exiting.`);\n } else {\n logger.warn('SIGHUP received but daemonization failed. Shutting down.');\n }\n } catch {\n logger.warn('SIGHUP received but daemonization failed. Shutting down.');\n }\n process.exit(0);\n });\n }\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 autoDaemonize();\n await runAgent();\n });\n\nprogram\n .command('start')\n .description('Start Mercury — runs as a daemon by default, use --foreground to attach to terminal')\n .option('-v, --verbose', 'Show debug logs')\n .option('-f, --foreground', 'Run in foreground (attached to terminal)')\n .option('-d, --detached', 'Run in background (daemon mode) — same as default')\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 (!isSetupComplete()) {\n await configure();\n autoDaemonize();\n return;\n }\n\n if (opts.foreground) {\n await runAgent();\n return;\n }\n\n startBackground();\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('Start Mercury as a persistent daemon (same as `mercury start`)')\n .action(async () => {\n if (!isSetupComplete()) {\n await configure();\n autoDaemonize();\n return;\n }\n\n const daemon = getDaemonStatus();\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 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 setup (name, providers, channels, permissions defaults)')\n .option('--platform', 'Show platform compatibility diagnostics')\n .action(async (opts) => {\n if (opts.platform) {\n runPlatformDoctor();\n return;\n }\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 const spotify = config.spotify;\n if (spotify.clientId && spotify.clientSecret) {\n if (spotify.enabled && (spotify.accessToken || spotify.refreshToken)) {\n const label = spotify.accountName ? ` as ${spotify.accountName}` : '';\n const plan = spotify.product ? ` (${spotify.product})` : '';\n console.log(` Spotify: ${chalk.green(`connected${label}`)}${plan}`);\n } else {\n console.log(` Spotify: ${chalk.dim('not connected')} — run /spotify auth`);\n }\n } else {\n console.log(` Spotify: ${chalk.dim('not configured')}`);\n }\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\n .command('upgrade')\n .description('Upgrade Mercury to the latest version from npm')\n .action(async () => {\n console.log('');\n console.log(chalk.cyan(` Mercury ${chalk.white(`v${pkgVersion}`)}`));\n console.log('');\n\n const daemon = getDaemonStatus();\n if (daemon.running) {\n console.log(chalk.dim(' Stopping background daemon...'));\n stopDaemon();\n await new Promise((r) => setTimeout(r, 1000));\n console.log(chalk.green(' ✓ Daemon stopped'));\n }\n\n console.log(chalk.dim(' Checking for latest version...'));\n const { execSync } = await import('node:child_process');\n\n let latestVersion = '';\n try {\n latestVersion = execSync('npm view @cosmicstack/mercury-agent version', { encoding: 'utf-8' }).trim();\n } catch {\n console.log(chalk.red(' ✗ Failed to fetch latest version from npm'));\n console.log('');\n return;\n }\n\n console.log(chalk.dim(` Latest: v${latestVersion}`));\n\n if (latestVersion === pkgVersion) {\n console.log(chalk.green(` ✓ Already on the latest version (v${pkgVersion})`));\n console.log('');\n return;\n }\n\n console.log(chalk.dim(` Upgrading v${pkgVersion} → v${latestVersion}...`));\n console.log('');\n\n try {\n execSync('npm rm -g @cosmicstack/mercury-agent', { stdio: 'pipe' });\n } catch {\n // ignore — old package may not exist or ENOTEMPTY\n try {\n const globalDir = execSync('npm root -g', { encoding: 'utf-8' }).trim();\n const pkgDir = join(globalDir, '@cosmicstack', 'mercury-agent');\n const { rmSync } = await import('node:fs');\n try { rmSync(pkgDir, { recursive: true, force: true }); } catch {}\n } catch {}\n }\n\n try {\n execSync('npm i -g @cosmicstack/mercury-agent@latest', { stdio: 'inherit' });\n console.log('');\n console.log(chalk.green(` ✓ Upgraded to v${latestVersion}`));\n console.log(chalk.dim(' Run `mercury` to start the new version.'));\n } catch {\n console.log('');\n console.log(chalk.red(' ✗ Upgrade failed. Try manually:'));\n console.log(chalk.dim(' npm rm -g @cosmicstack/mercury-agent && npm i -g @cosmicstack/mercury-agent'));\n }\n\n console.log('');\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 function getMemoryDir(): string {\n return join(getMercuryHome(), 'memory');\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 | 'openaiCompat'\n | 'mimo'\n | 'mimoTokenPlan';\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 openaiCompat: ProviderConfig;\n mimo: ProviderConfig;\n mimoTokenPlan: 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 shortTermMaxMessages: number;\n secondBrain: {\n enabled: boolean;\n maxRecords: number;\n };\n };\n heartbeat: {\n intervalMinutes: number;\n };\n tokens: {\n dailyBudget: number;\n };\n subagents: {\n enabled: boolean;\n maxConcurrent: number;\n mode: 'auto' | 'manual';\n };\n spotify: {\n enabled: boolean;\n clientId: string;\n clientSecret: string;\n redirectUri: string;\n accessToken: string;\n refreshToken: string;\n expiresAt: string;\n scopes: string[];\n deviceId: string;\n accountName: string;\n accountId: string;\n product: string;\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/v1'),\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', ''),\n enabled: getEnvBool('OLLAMA_LOCAL_ENABLED', false),\n },\n openaiCompat: {\n name: 'openaiCompat',\n apiKey: getEnv('OPENAI_COMPAT_API_KEY', ''),\n baseUrl: getEnv('OPENAI_COMPAT_BASE_URL', ''),\n model: getEnv('OPENAI_COMPAT_MODEL', ''),\n enabled: getEnvBool('OPENAI_COMPAT_ENABLED', false),\n },\n mimo: {\n name: 'mimo',\n apiKey: getEnv('MIMO_API_KEY', ''),\n baseUrl: getEnv('MIMO_BASE_URL', 'https://api.xiaomimimo.com/v1'),\n model: getEnv('MIMO_MODEL', 'mimo-v2.5-pro'),\n enabled: getEnvBool('MIMO_ENABLED', true),\n },\n mimoTokenPlan: {\n name: 'mimoTokenPlan',\n apiKey: getEnv('MIMO_TOKEN_PLAN_API_KEY', ''),\n baseUrl: getEnv('MIMO_TOKEN_PLAN_BASE_URL', 'https://token-plan-cn.xiaomimimo.com/v1'),\n model: getEnv('MIMO_TOKEN_PLAN_MODEL', 'mimo-v2.5-pro'),\n enabled: getEnvBool('MIMO_TOKEN_PLAN_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 shortTermMaxMessages: getEnvNum('SHORT_TERM_MAX_MESSAGES', 20),\n secondBrain: {\n enabled: getEnvBool('SECOND_BRAIN_ENABLED', true),\n maxRecords: getEnvNum('SECOND_BRAIN_MAX_RECORDS', 50),\n },\n },\n heartbeat: {\n intervalMinutes: getEnvNum('HEARTBEAT_INTERVAL_MINUTES', 60),\n },\n tokens: {\n dailyBudget: getEnvNum('DAILY_TOKEN_BUDGET', 1_000_000),\n },\n subagents: {\n enabled: getEnvBool('SUBAGENTS_ENABLED', true),\n maxConcurrent: getEnvNum('SUBAGENTS_MAX_CONCURRENT', 0),\n mode: (process.env.SUBAGENTS_MODE as 'auto' | 'manual') || 'auto',\n },\n spotify: {\n enabled: getEnvBool('SPOTIFY_ENABLED', false),\n clientId: getEnv('SPOTIFY_CLIENT_ID'),\n clientSecret: getEnv('SPOTIFY_CLIENT_SECRET'),\n redirectUri: getEnv('SPOTIFY_REDIRECT_URI', 'http://127.0.0.1:8888/callback'),\n accessToken: '',\n refreshToken: '',\n expiresAt: '',\n scopes: [],\n deviceId: '',\n accountName: '',\n accountId: '',\n product: '',\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 migrateLegacyOllamaCloudBaseUrl(\n migrateLegacyTelegramAccess(deepMerge(defaults, fileConfig)),\n );\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 if (provider.name === 'ollamaCloud') {\n return provider.apiKey.length > 0 && provider.baseUrl.length > 0;\n }\n if (provider.name === 'openaiCompat') {\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\nexport function migrateLegacyOllamaCloudBaseUrl(config: MercuryConfig): MercuryConfig {\n if (config.providers.ollamaCloud.baseUrl === 'https://ollama.com/api') {\n config.providers.ollamaCloud.baseUrl = 'https://ollama.com/v1';\n saveConfig(config);\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, cpSync, rmSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { MercuryConfig } from '../utils/config.js';\nimport { getMemoryDir, getMercuryHome } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nexport function migrateLegacyMemory(): void {\n const legacyDir = resolve('memory');\n const newDir = getMemoryDir();\n if (!existsSync(legacyDir) || legacyDir === newDir) return;\n if (!existsSync(join(legacyDir, 'short-term')) && !existsSync(join(legacyDir, 'long-term')) && !existsSync(join(legacyDir, 'episodic')) && !existsSync(join(legacyDir, 'second-brain'))) return;\n logger.info({ from: legacyDir, to: newDir }, 'Migrating memory from legacy ./memory to ~/.mercury/memory');\n mkdirSync(newDir, { recursive: true });\n for (const sub of ['short-term', 'long-term', 'episodic', 'second-brain']) {\n const src = join(legacyDir, sub);\n const dest = join(newDir, sub);\n if (existsSync(src)) {\n cpSync(src, dest, { recursive: true });\n }\n }\n try {\n rmSync(legacyDir, { recursive: true, force: true });\n logger.info('Legacy memory directory removed');\n } catch {\n logger.warn('Could not remove legacy memory directory — please delete ./memory manually');\n }\n}\n\nexport interface MemoryEntry {\n id: string;\n timestamp: number;\n role: 'user' | 'assistant' | 'system';\n content: string;\n tokenCount?: number;\n reasoning?: string;\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(getMemoryDir(), '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 clearAll(): void {\n for (const conversationId of this.conversations.keys()) {\n const filepath = join(this.dir, `${conversationId}.json`);\n if (existsSync(filepath)) unlinkSync(filepath);\n }\n this.conversations.clear();\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(getMemoryDir(), 'long-term', 'facts.jsonl');\n mkdirSync(join(getMemoryDir(), '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(/\\r?\\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(getMemoryDir(), 'episodic', 'events.jsonl');\n mkdirSync(join(getMemoryDir(), '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(/\\r?\\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 { existsSync, mkdirSync, rmSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { createRequire } from 'node:module';\nimport { logger } from '../utils/logger.js';\n\ntype BetterSqlite3Database = import('better-sqlite3').Database;\n\nconst require = createRequire(import.meta.url);\n\nlet syncDatabaseClass: typeof import('better-sqlite3') | null = null;\nlet availabilityChecked = false;\nlet available = false;\n\ntry {\n const mod = require('better-sqlite3');\n const probeDir = join(tmpdir(), `mercury-sqlite3-probe-${process.pid}`);\n try {\n mkdirSync(probeDir, { recursive: true });\n const probeDb = new mod(join(probeDir, 'probe.db'));\n probeDb.close();\n rmSync(probeDir, { recursive: true, force: true });\n syncDatabaseClass = mod;\n } catch {\n syncDatabaseClass = null;\n }\n} catch {\n syncDatabaseClass = null;\n}\n\nexport function isBetterSqlite3Available(): boolean {\n return syncDatabaseClass !== null;\n}\n\nexport interface MemoryRow {\n id: string;\n user_key: string;\n type: string;\n summary: string;\n detail: string | null;\n scope: string;\n evidence_kind: string;\n source: string;\n confidence: number;\n importance: number;\n durability: number;\n evidence_count: number;\n provenance: string | null;\n dismissed: number;\n superseded_by: string | null;\n created_at: number;\n updated_at: number;\n last_seen_at: number;\n last_used_at: number | null;\n last_used_query: string | null;\n}\n\nexport class SecondBrainDB {\n private db: BetterSqlite3Database;\n\n constructor(dbPath: string) {\n if (!syncDatabaseClass) {\n throw new Error(\n 'better-sqlite3 is not available — second brain memory requires it. ' +\n 'Install build tools (make, gcc/g++, python3) or upgrade to Node >= 20. ' +\n 'See: https://github.com/WiseLibs/better-sqlite3/blob/master/docs/compilation.md'\n );\n }\n const dir = dirname(dbPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n this.db = new syncDatabaseClass(dbPath);\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('synchronous = NORMAL');\n }\n\n init(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS memories (\n id TEXT PRIMARY KEY,\n user_key TEXT NOT NULL,\n type TEXT NOT NULL,\n summary TEXT NOT NULL,\n detail TEXT,\n scope TEXT NOT NULL DEFAULT 'durable',\n evidence_kind TEXT NOT NULL DEFAULT 'inferred',\n source TEXT NOT NULL DEFAULT 'conversation',\n confidence REAL NOT NULL,\n importance REAL NOT NULL,\n durability REAL NOT NULL,\n evidence_count INTEGER NOT NULL DEFAULT 1,\n provenance TEXT,\n dismissed INTEGER NOT NULL DEFAULT 0,\n superseded_by TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n last_seen_at INTEGER NOT NULL,\n last_used_at INTEGER,\n last_used_query TEXT\n );\n\n CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(\n summary, detail, content=memories, content_rowid=rowid\n );\n\n CREATE TABLE IF NOT EXISTS second_brain_meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_memories_user_type ON memories(user_key, type);\n CREATE INDEX IF NOT EXISTS idx_memories_user_dismissed ON memories(user_key, dismissed);\n CREATE INDEX IF NOT EXISTS idx_memories_user_updated ON memories(user_key, updated_at);\n CREATE INDEX IF NOT EXISTS idx_memories_user_scope ON memories(user_key, scope);\n CREATE INDEX IF NOT EXISTS idx_memories_user_evidence_kind ON memories(user_key, evidence_kind);\n\n CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN\n INSERT INTO memories_fts(rowid, summary, detail) VALUES (new.rowid, new.summary, new.detail);\n END;\n\n CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN\n INSERT INTO memories_fts(memories_fts, rowid, summary, detail) VALUES('delete', old.rowid, old.summary, old.detail);\n END;\n\n CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN\n INSERT INTO memories_fts(memories_fts, rowid, summary, detail) VALUES('delete', old.rowid, old.summary, old.detail);\n INSERT INTO memories_fts(rowid, summary, detail) VALUES (new.rowid, new.summary, new.detail);\n END;\n `);\n\n this.db.pragma('foreign_keys = ON');\n logger.info('Second brain database initialized');\n }\n\n insert(row: Omit<MemoryRow, 'rowid'> & { rowid?: never }): void {\n const stmt = this.db.prepare(`\n INSERT INTO memories (\n id, user_key, type, summary, detail, scope, evidence_kind, source,\n confidence, importance, durability, evidence_count, provenance,\n dismissed, superseded_by, created_at, updated_at,\n last_seen_at, last_used_at, last_used_query\n ) VALUES (\n @id, @user_key, @type, @summary, @detail, @scope, @evidence_kind, @source,\n @confidence, @importance, @durability, @evidence_count, @provenance,\n @dismissed, @superseded_by, @created_at, @updated_at,\n @last_seen_at, @last_used_at, @last_used_query\n )\n `);\n stmt.run({\n id: row.id,\n user_key: row.user_key,\n type: row.type,\n summary: row.summary,\n detail: row.detail ?? null,\n scope: row.scope ?? 'durable',\n evidence_kind: row.evidence_kind ?? 'inferred',\n source: row.source ?? 'conversation',\n confidence: row.confidence,\n importance: row.importance,\n durability: row.durability,\n evidence_count: row.evidence_count ?? 1,\n provenance: row.provenance ?? null,\n dismissed: row.dismissed ?? 0,\n superseded_by: row.superseded_by ?? null,\n created_at: row.created_at,\n updated_at: row.updated_at,\n last_seen_at: row.last_seen_at,\n last_used_at: row.last_used_at ?? null,\n last_used_query: row.last_used_query ?? null,\n });\n }\n\n update(row: Partial<MemoryRow> & { id: string }): void {\n const fields: string[] = [];\n const values: Record<string, unknown> = { id: row.id };\n\n const allowedFields = [\n 'summary', 'detail', 'scope', 'evidence_kind', 'source',\n 'confidence', 'importance', 'durability', 'evidence_count',\n 'provenance', 'dismissed', 'superseded_by',\n 'updated_at', 'last_seen_at', 'last_used_at', 'last_used_query',\n ] as const;\n\n for (const field of allowedFields) {\n if (row[field] !== undefined) {\n fields.push(`${field} = @${field}`);\n values[field] = row[field];\n }\n }\n\n if (fields.length === 0) return;\n\n const stmt = this.db.prepare(`UPDATE memories SET ${fields.join(', ')} WHERE id = @id`);\n stmt.run(values);\n }\n\n getActive(userKey: string): MemoryRow[] {\n const stmt = this.db.prepare('SELECT * FROM memories WHERE user_key = ? AND dismissed = 0 ORDER BY updated_at DESC');\n return stmt.all(userKey) as MemoryRow[];\n }\n\n getById(id: string): MemoryRow | undefined {\n const stmt = this.db.prepare('SELECT * FROM memories WHERE id = ?');\n return stmt.get(id) as MemoryRow | undefined;\n }\n\n getByType(userKey: string, type: string): MemoryRow[] {\n const stmt = this.db.prepare('SELECT * FROM memories WHERE user_key = ? AND type = ? AND dismissed = 0 ORDER BY updated_at DESC');\n return stmt.all(userKey, type) as MemoryRow[];\n }\n\n findMergeCandidate(userKey: string, type: string, normalizedTerms: string[]): MemoryRow | undefined {\n const stmt = this.db.prepare(`\n SELECT * FROM memories WHERE user_key = ? AND type = ? AND dismissed = 0\n AND (summary LIKE ? OR ${normalizedTerms.map(() => 'summary LIKE ?').join(' OR ')})\n LIMIT 5\n `);\n const likeAny = normalizedTerms.map(t => `%${t}%`);\n const rows = stmt.all(userKey, type, `%${normalizedTerms.slice(0, 3).join('%')}%`, ...likeAny) as MemoryRow[];\n return rows.find(row => !this.rowHasNegationMismatch(row.summary, normalizedTerms));\n }\n\n findConflictCandidate(userKey: string, type: string, summaryTerms: string[]): MemoryRow | undefined {\n const stmt = this.db.prepare(`\n SELECT * FROM memories WHERE user_key = ? AND type = ? AND dismissed = 0\n AND (${summaryTerms.map(() => 'summary LIKE ?').join(' OR ')})\n LIMIT 5\n `);\n const likes = summaryTerms.map(t => `%${t}%`);\n const rows = stmt.all(userKey, type, ...likes) as MemoryRow[];\n return rows.find(row => this.rowHasNegationMismatch(row.summary, summaryTerms));\n }\n\n private rowHasNegationMismatch(existingSummary: string, incomingTerms: string[]): boolean {\n const lower = existingSummary.toLowerCase();\n const negationWords = ['not', 'never', 'no longer', 'avoid', 'against', 'disabled'];\n const hasNegation = negationWords.some(w => lower.includes(w));\n const incomingLower = incomingTerms.join(' ');\n const incomingHasNegation = negationWords.some(w => incomingLower.includes(w));\n return hasNegation !== incomingHasNegation;\n }\n\n searchRelevant(userKey: string, query: string, limit: number = 10): MemoryRow[] {\n const tokens = query.split(/\\s+/).filter(t => t.length > 0).map(t => t.replace(/\"/g, '\"\"'));\n if (tokens.length === 0) {\n const stmt = this.db.prepare('SELECT * FROM memories WHERE user_key = ? AND dismissed = 0 ORDER BY updated_at DESC LIMIT ?');\n return stmt.all(userKey, limit) as MemoryRow[];\n }\n const ftsQuery = tokens.join(' OR ');\n const ftsStmt = this.db.prepare(`\n SELECT m.* FROM memories m\n JOIN memories_fts fts ON m.rowid = fts.rowid\n WHERE memories_fts MATCH ? AND m.user_key = ? AND m.dismissed = 0\n ORDER BY rank\n LIMIT ?\n `);\n try {\n return ftsStmt.all(ftsQuery, userKey, limit) as MemoryRow[];\n } catch {\n const likeClauses = tokens.map(() => '(summary LIKE ? OR detail LIKE ?)').join(' OR ');\n const stmt = this.db.prepare(`SELECT * FROM memories WHERE user_key = ? AND dismissed = 0 AND (${likeClauses}) ORDER BY updated_at DESC LIMIT ?`);\n const likes = tokens.flatMap(t => [`%${t}%`, `%${t}%`]);\n return stmt.all(userKey, ...likes, limit) as MemoryRow[];\n }\n }\n\n searchFTS(userKey: string, query: string, limit: number = 10): MemoryRow[] {\n return this.searchRelevant(userKey, query, limit);\n }\n\n softDelete(id: string): boolean {\n const stmt = this.db.prepare('UPDATE memories SET dismissed = 1, updated_at = ? WHERE id = ?');\n const result = stmt.run(Date.now(), id);\n return result.changes > 0;\n }\n\n clearByType(userKey: string, type?: string): number {\n if (type) {\n const stmt = this.db.prepare('UPDATE memories SET dismissed = 1, updated_at = ? WHERE user_key = ? AND type = ? AND dismissed = 0');\n const result = stmt.run(Date.now(), userKey, type);\n return result.changes;\n }\n const stmt = this.db.prepare('UPDATE memories SET dismissed = 1, updated_at = ? WHERE user_key = ? AND dismissed = 0');\n const result = stmt.run(Date.now(), userKey);\n return result.changes;\n }\n\n hardDeleteDismissed(userKey: string): number {\n const stmt = this.db.prepare('DELETE FROM memories WHERE user_key = ? AND dismissed = 1');\n const result = stmt.run(userKey);\n return result.changes;\n }\n\n promoteToDurable(userKey: string): number {\n const stmt = this.db.prepare(`\n UPDATE memories SET scope = 'durable', updated_at = ?\n WHERE user_key = ? AND scope = 'active' AND dismissed = 0\n AND evidence_count >= 3 AND evidence_kind IN ('direct', 'manual')\n `);\n const result = stmt.run(Date.now(), userKey);\n return result.changes;\n }\n\n pruneStale(userKey: string): { activePruned: number; durablePruned: number } {\n const now = Date.now();\n const twentyOneDays = 21 * 24 * 60 * 60 * 1000;\n const fortyTwoDays = 42 * 24 * 60 * 60 * 1000;\n const oneHundredTwentyDays = 120 * 24 * 60 * 60 * 1000;\n\n const activeInferred = this.db.prepare(`\n UPDATE memories SET dismissed = 1, updated_at = ?\n WHERE user_key = ? AND scope = 'active' AND evidence_kind = 'inferred' AND dismissed = 0\n AND last_seen_at < ? AND last_seen_at > 0\n `);\n const activeInferredResult = activeInferred.run(now, userKey, now - twentyOneDays);\n\n const activeDirect = this.db.prepare(`\n UPDATE memories SET dismissed = 1, updated_at = ?\n WHERE user_key = ? AND scope = 'active' AND evidence_kind = 'direct' AND dismissed = 0\n AND last_seen_at < ? AND last_seen_at > 0\n `);\n const activeDirectResult = activeDirect.run(now, userKey, now - fortyTwoDays);\n\n const activePruned = activeInferredResult.changes + activeDirectResult.changes;\n\n const durableInferred = this.db.prepare(`\n UPDATE memories SET confidence = MAX(0.15, confidence - 0.15), updated_at = ?\n WHERE user_key = ? AND scope = 'durable' AND evidence_kind = 'inferred' AND dismissed = 0\n AND last_seen_at < ? AND last_seen_at > 0\n `);\n durableInferred.run(now, userKey, now - oneHundredTwentyDays);\n\n const durablePruned = this.db.prepare(`\n UPDATE memories SET dismissed = 1, updated_at = ?\n WHERE user_key = ? AND scope = 'durable' AND dismissed = 0\n AND confidence < 0.3 AND last_seen_at < ? AND last_seen_at > 0\n `);\n const durablePrunedResult = durablePruned.run(now, userKey, now - oneHundredTwentyDays);\n\n return { activePruned, durablePruned: durablePrunedResult.changes };\n }\n\n setMeta(key: string, value: string): void {\n const stmt = this.db.prepare('INSERT OR REPLACE INTO second_brain_meta (key, value) VALUES (@key, @value)');\n stmt.run({ key, value });\n }\n\n getMeta(key: string): string | null {\n const stmt = this.db.prepare('SELECT value FROM second_brain_meta WHERE key = ?');\n const row = stmt.get(key) as { value: string } | undefined;\n return row?.value ?? null;\n }\n\n deleteMeta(key: string): void {\n const stmt = this.db.prepare('DELETE FROM second_brain_meta WHERE key = ?');\n stmt.run(key);\n }\n\n countByType(userKey: string): Record<string, number> {\n const stmt = this.db.prepare(\"SELECT type, COUNT(*) as count FROM memories WHERE user_key = ? AND dismissed = 0 GROUP BY type\");\n const rows = stmt.all(userKey) as Array<{ type: string; count: number }>;\n const result: Record<string, number> = {};\n for (const row of rows) {\n result[row.type] = row.count;\n }\n return result;\n }\n\n totalActive(userKey: string): number {\n const stmt = this.db.prepare('SELECT COUNT(*) as count FROM memories WHERE user_key = ? AND dismissed = 0');\n const row = stmt.get(userKey) as { count: number };\n return row.count;\n }\n\n close(): void {\n this.db.close();\n }\n}","import type { MercuryConfig } from '../utils/config.js';\nimport { getMemoryDir } from '../utils/config.js';\nimport { SecondBrainDB, type MemoryRow } from './second-brain-db.js';\nimport { join } from 'node:path';\nimport { logger } from '../utils/logger.js';\n\nexport type UserMemoryType =\n | 'identity'\n | 'preference'\n | 'goal'\n | 'project'\n | 'habit'\n | 'decision'\n | 'constraint'\n | 'relationship'\n | 'episode'\n | 'reflection';\n\nexport interface UserMemoryRecord {\n id: string;\n type: UserMemoryType;\n summary: string;\n detail?: string | null;\n scope: 'durable' | 'active';\n evidenceKind: 'direct' | 'inferred' | 'manual' | 'system';\n source: 'conversation' | 'system';\n confidence: number;\n importance: number;\n durability: number;\n evidenceCount: number;\n provenance?: string | null;\n dismissed: boolean;\n supersededBy?: string | null;\n createdAt: number;\n updatedAt: number;\n lastSeenAt: number;\n lastUsedAt?: number | null;\n lastUsedQuery?: string | null;\n}\n\nexport interface UserMemoryCandidate {\n type: UserMemoryType;\n summary: string;\n detail?: string;\n evidenceKind?: 'direct' | 'inferred';\n confidence: number;\n importance: number;\n durability: number;\n}\n\nexport interface UserMemorySummary {\n total: number;\n byType: Partial<Record<UserMemoryType, number>>;\n learningPaused: boolean;\n profileSummary?: string;\n activeSummary?: string;\n}\n\nexport interface RetrievedUserMemory {\n records: UserMemoryRecord[];\n context: string;\n}\n\nconst MIN_CONFIDENCE = 0.55;\n\nexport class UserMemoryStore {\n private db: SecondBrainDB;\n private maxRecords: number;\n private userKey: string;\n private consolidateThrottleMs: number;\n private lastConsolidateAt: number = 0;\n\n constructor(config: MercuryConfig, userKey: string = 'user:owner', dbPath?: string) {\n this.userKey = userKey;\n this.maxRecords = config.memory.secondBrain?.maxRecords ?? 50;\n this.consolidateThrottleMs = 5 * 60 * 1000;\n const resolvedDbPath = dbPath ?? join(getMemoryDir(), 'second-brain', 'second-brain.db');\n this.db = new SecondBrainDB(resolvedDbPath);\n this.db.init();\n }\n\n getSummary(): UserMemorySummary {\n const byType = this.db.countByType(this.userKey) as Partial<Record<UserMemoryType, number>>;\n return {\n total: this.db.totalActive(this.userKey),\n byType,\n learningPaused: this.isLearningPaused(),\n profileSummary: this.db.getMeta(`${this.userKey}:profile_summary`) ?? undefined,\n activeSummary: this.db.getMeta(`${this.userKey}:active_summary`) ?? undefined,\n };\n }\n\n getProfile(): string {\n return this.db.getMeta(`${this.userKey}:profile_summary`) || '';\n }\n\n getActiveSummary(): string {\n return this.db.getMeta(`${this.userKey}:active_summary`) || '';\n }\n\n getRecent(limit: number = 10): UserMemoryRecord[] {\n const stmt = this.db.getActive(this.userKey).slice(0, limit);\n return stmt.map(row => this.toRecord(row));\n }\n\n search(query: string, limit: number = 10): UserMemoryRecord[] {\n const rows = this.db.searchFTS(this.userKey, query, limit);\n return rows.map(row => this.toRecord(row));\n }\n\n getByType(type: UserMemoryType): UserMemoryRecord[] {\n const rows = this.db.getByType(this.userKey, type);\n return rows.map(row => this.toRecord(row));\n }\n\n retrieveRelevant(\n query: string,\n options?: { maxRecords?: number; maxChars?: number },\n ): RetrievedUserMemory {\n const maxRecords = options?.maxRecords ?? 5;\n const maxChars = options?.maxChars ?? 900;\n\n const ftsResults = this.db.searchRelevant(this.userKey, query, Math.max(maxRecords * 2, 10));\n const ranked = this.scoreAndRank(ftsResults, query);\n\n const selected: MemoryRow[] = [];\n let currentLength = 0;\n for (const row of ranked) {\n const line = `- [${row.type}] ${row.summary}`;\n if (selected.length >= maxRecords) break;\n if (selected.length > 0 && currentLength + line.length > maxChars) break;\n selected.push(row);\n currentLength += line.length + 1;\n }\n\n if (selected.length === 0) {\n const profile = this.getProfile().trim();\n if (!profile) {\n return { records: [], context: '' };\n }\n return {\n records: [],\n context: [\n this.getActiveSummary() ? `User active state:\\n- ${this.getActiveSummary()}` : '',\n `User profile summary:\\n- ${profile}`,\n ].filter(Boolean).join('\\n\\n'),\n };\n }\n\n const contextLines: string[] = [];\n const activeSummary = this.getActiveSummary();\n if (activeSummary) {\n contextLines.push('User active state:');\n contextLines.push(`- ${activeSummary}`);\n contextLines.push('');\n }\n const profileSummary = this.getProfile();\n if (profileSummary) {\n contextLines.push('User profile summary:');\n contextLines.push(`- ${profileSummary}`);\n contextLines.push('');\n }\n contextLines.push('Relevant user memory:');\n contextLines.push(...selected.map(row => `- [${row.type}] ${row.summary}`));\n\n this.markUsed(selected.map(r => r.id), query);\n return { records: selected.map(r => this.toRecord(r)), context: contextLines.join('\\n') };\n }\n\n remember(\n candidates: UserMemoryCandidate[],\n source: UserMemoryRecord['source'] = 'conversation',\n ): UserMemoryRecord[] {\n if (this.isLearningPaused()) return [];\n\n const remembered: UserMemoryRecord[] = [];\n\n for (const candidate of candidates) {\n if (!shouldStoreCandidate(candidate)) continue;\n\n const terms = normalize(candidate.summary).split(/\\s+/).filter(t => t.length > 2);\n\n const mergeTarget = this.db.findMergeCandidate(this.userKey, candidate.type, terms);\n if (mergeTarget && overlapScore(normalize(mergeTarget.summary), normalize(candidate.summary)) >= 0.74) {\n const merged = this.mergeRecord(mergeTarget, candidate);\n if (merged) remembered.push(merged);\n continue;\n }\n\n const conflictTarget = this.db.findConflictCandidate(this.userKey, candidate.type, terms);\n if (conflictTarget) {\n const conflictWinner = this.resolveConflict(conflictTarget, candidate);\n if (conflictWinner === 'existing') continue;\n }\n\n const record = this.insertRecord(candidate, source);\n if (record) remembered.push(record);\n }\n\n this.enforceMaxRecords();\n\n return remembered;\n }\n\n setLearningPaused(paused: boolean): void {\n this.db.setMeta(`${this.userKey}:learning_paused`, paused ? '1' : '0');\n }\n\n isLearningPaused(): boolean {\n return this.db.getMeta(`${this.userKey}:learning_paused`) === '1';\n }\n\n clear(): number {\n return this.db.clearByType(this.userKey);\n }\n\n consolidate(): { profileUpdated: boolean; reflectionCount: number } {\n const now = Date.now();\n if (now - this.lastConsolidateAt < this.consolidateThrottleMs && this.lastConsolidateAt > 0) {\n return { profileUpdated: false, reflectionCount: 0 };\n }\n this.lastConsolidateAt = now;\n\n const allActive = this.db.getActive(this.userKey);\n const nonReflection = allActive.filter(r => r.type !== 'reflection');\n\n const profileSummary = buildProfileSummary(nonReflection);\n const activeSummary = buildActiveSummary(nonReflection);\n\n const oldProfile = this.db.getMeta(`${this.userKey}:profile_summary`) || '';\n const oldActive = this.db.getMeta(`${this.userKey}:active_summary`) || '';\n const profileUpdated = profileSummary !== oldProfile || activeSummary !== oldActive;\n\n this.db.setMeta(`${this.userKey}:profile_summary`, profileSummary);\n this.db.setMeta(`${this.userKey}:active_summary`, activeSummary);\n\n const reflections = buildReflectionCandidates(nonReflection);\n let reflectionCount = 0;\n for (const reflection of reflections) {\n const sameType = this.db.getByType(this.userKey, 'reflection');\n const existing = findMergeTarget(sameType, reflection);\n if (existing) {\n this.db.update({\n id: existing.id,\n summary: reflection.summary,\n detail: reflection.detail || existing.detail,\n confidence: clamp(Math.max(existing.confidence, reflection.confidence), 0, 1),\n importance: clamp(Math.max(existing.importance, reflection.importance), 0, 1),\n durability: clamp(Math.max(existing.durability, reflection.durability), 0, 1),\n updated_at: Date.now(),\n last_seen_at: Date.now(),\n });\n } else {\n this.insertReflection(reflection);\n }\n reflectionCount += 1;\n }\n\n return { profileUpdated, reflectionCount };\n }\n\n prune(): { activePruned: number; durablePruned: number; promoted: number } {\n const promoted = this.db.promoteToDurable(this.userKey);\n const { activePruned, durablePruned } = this.db.pruneStale(this.userKey);\n const hardDeleted = this.db.hardDeleteDismissed(this.userKey);\n if (hardDeleted > 0) {\n logger.debug({ hardDeleted, userKey: this.userKey }, 'Hard deleted dismissed memories');\n }\n return { activePruned, durablePruned, promoted };\n }\n\n close(): void {\n this.db.close();\n }\n\n private insertRecord(candidate: UserMemoryCandidate, source: UserMemoryRecord['source']): UserMemoryRecord | null {\n const now = Date.now();\n const id = generateId('mem');\n const scope = inferScope(candidate);\n\n this.db.insert({\n id,\n user_key: this.userKey,\n type: candidate.type,\n summary: candidate.summary.trim(),\n detail: candidate.detail?.trim() ?? null,\n scope,\n evidence_kind: candidate.evidenceKind || (source === 'conversation' ? 'inferred' : 'system'),\n source,\n confidence: clamp(candidate.confidence, 0, 1),\n importance: clamp(candidate.importance, 0, 1),\n durability: clamp(candidate.durability, 0, 1),\n evidence_count: 1,\n provenance: candidate.detail?.trim() ?? null,\n dismissed: 0,\n superseded_by: null,\n created_at: now,\n updated_at: now,\n last_seen_at: now,\n last_used_at: null,\n last_used_query: null,\n });\n\n const row = this.db.getById(id);\n return row ? this.toRecord(row) : null;\n }\n\n private insertReflection(candidate: UserMemoryCandidate): void {\n const now = Date.now();\n const id = generateId('mem');\n\n this.db.insert({\n id,\n user_key: this.userKey,\n type: 'reflection',\n summary: candidate.summary,\n detail: candidate.detail ?? null,\n scope: 'durable',\n evidence_kind: 'system',\n source: 'system',\n confidence: candidate.confidence,\n importance: candidate.importance,\n durability: candidate.durability,\n evidence_count: 1,\n provenance: null,\n dismissed: 0,\n superseded_by: null,\n created_at: now,\n updated_at: now,\n last_seen_at: now,\n last_used_at: null,\n last_used_query: null,\n });\n }\n\n private mergeRecord(existing: MemoryRow, candidate: UserMemoryCandidate): UserMemoryRecord | null {\n const updatedAt = Date.now();\n this.db.update({\n id: existing.id,\n summary: pickBetterSummary(existing.summary, candidate.summary),\n detail: candidate.detail || existing.detail,\n provenance: candidate.detail || existing.provenance,\n evidence_kind: candidate.evidenceKind || existing.evidence_kind,\n confidence: clamp(Math.max(existing.confidence, candidate.confidence), 0, 1),\n importance: clamp(Math.max(existing.importance, candidate.importance), 0, 1),\n durability: clamp(Math.max(existing.durability, candidate.durability), 0, 1),\n evidence_count: existing.evidence_count + 1,\n updated_at: updatedAt,\n last_seen_at: updatedAt,\n });\n\n const row = this.db.getById(existing.id);\n return row ? this.toRecord(row) : null;\n }\n\n private resolveConflict(existing: MemoryRow, candidate: UserMemoryCandidate): 'incoming' | 'existing' {\n const incomingConfidence = candidate.confidence;\n const existingConfidence = existing.confidence;\n\n if (incomingConfidence > existingConfidence) {\n this.db.update({\n id: existing.id,\n dismissed: 1,\n superseded_by: 'auto_resolved',\n updated_at: Date.now(),\n });\n logger.debug(\n { existingId: existing.id, existingConfidence, incomingConfidence, type: candidate.type },\n 'Auto-resolved conflict: incoming wins',\n );\n return 'incoming';\n }\n\n if (incomingConfidence < existingConfidence) {\n logger.debug(\n { existingId: existing.id, existingConfidence, incomingConfidence, type: candidate.type },\n 'Auto-resolved conflict: existing wins',\n );\n return 'existing';\n }\n\n this.db.update({\n id: existing.id,\n dismissed: 1,\n superseded_by: 'auto_resolved',\n updated_at: Date.now(),\n });\n logger.debug(\n { existingId: existing.id, type: candidate.type },\n 'Auto-resolved conflict: equal confidence, newer wins',\n );\n return 'incoming';\n }\n\n private enforceMaxRecords(): void {\n const total = this.db.totalActive(this.userKey);\n if (total <= this.maxRecords) return;\n\n const allActive = this.db.getActive(this.userKey);\n const toDismiss = allActive\n .sort((a, b) => memoryHealthScore(b) - memoryHealthScore(a))\n .slice(this.maxRecords);\n\n for (const row of toDismiss) {\n this.db.softDelete(row.id);\n }\n\n if (toDismiss.length > 0) {\n logger.debug({ dismissed: toDismiss.length, userKey: this.userKey }, 'Enforced max records limit');\n }\n }\n\n private markUsed(ids: string[], query?: string): void {\n const now = Date.now();\n for (const id of ids) {\n this.db.update({\n id,\n last_used_at: now,\n last_used_query: query || undefined,\n updated_at: now,\n });\n }\n }\n\n private scoreAndRank(rows: MemoryRow[], query: string): MemoryRow[] {\n const now = Date.now();\n const tokens = query.toLowerCase().split(/\\s+/).filter(t => t.length > 0);\n return rows\n .map(row => {\n let score = 0;\n score += row.confidence * 0.3;\n score += row.importance * 0.25;\n score += row.durability * 0.15;\n const ageDays = (now - row.updated_at) / (1000 * 60 * 60 * 24);\n score += Math.max(0, 0.2 - ageDays * 0.005);\n const lower = (row.summary + ' ' + (row.detail ?? '')).toLowerCase();\n const matchCount = tokens.filter(t => lower.includes(t)).length;\n score += (matchCount / Math.max(tokens.length, 1)) * 0.1;\n return { row, score };\n })\n .sort((a, b) => b.score - a.score)\n .map(r => r.row);\n }\n\n private toRecord(row: MemoryRow): UserMemoryRecord {\n return {\n id: row.id,\n type: row.type as UserMemoryType,\n summary: row.summary,\n detail: row.detail,\n scope: row.scope as 'durable' | 'active',\n evidenceKind: row.evidence_kind as UserMemoryRecord['evidenceKind'],\n source: row.source as UserMemoryRecord['source'],\n confidence: row.confidence,\n importance: row.importance,\n durability: row.durability,\n evidenceCount: row.evidence_count,\n provenance: row.provenance,\n dismissed: row.dismissed === 1,\n supersededBy: row.superseded_by,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n lastSeenAt: row.last_seen_at,\n lastUsedAt: row.last_used_at,\n lastUsedQuery: row.last_used_query,\n };\n }\n}\n\nfunction shouldStoreCandidate(candidate: UserMemoryCandidate): boolean {\n const summary = candidate.summary.trim();\n if (summary.length < 12 || summary.length > 220) return false;\n if (candidate.confidence < MIN_CONFIDENCE) return false;\n if (candidate.durability < 0.4 && candidate.importance < 0.7) return false;\n return true;\n}\n\nfunction findMergeTarget(rows: MemoryRow[], candidate: UserMemoryCandidate): MemoryRow | undefined {\n const normalizedCandidate = normalize(candidate.summary);\n return rows.find(row => {\n if (row.type !== candidate.type) return false;\n if (hasConflict(row.summary, candidate.summary)) return false;\n const normalizedRow = normalize(row.summary);\n if (normalizedRow === normalizedCandidate) return true;\n return overlapScore(normalizedRow, normalizedCandidate) >= 0.74;\n });\n}\n\nfunction memoryHealthScore(row: MemoryRow): number {\n return (row.importance * 0.35)\n + (row.durability * 0.25)\n + (effectiveConfidence(row) * 0.25)\n + (Math.min(row.evidence_count, 5) / 5 * 0.15)\n + (row.scope === 'active' ? 0.08 : 0)\n - (row.superseded_by ? 0.3 : 0)\n - (isRowStale(row) ? 0.12 : 0);\n}\n\nfunction effectiveConfidence(row: MemoryRow): number {\n const ageDays = (Date.now() - row.updated_at) / (1000 * 60 * 60 * 24);\n let confidence = row.confidence;\n\n if (row.evidence_kind === 'inferred') {\n confidence -= Math.min(0.2, ageDays / 365);\n } else if (row.evidence_kind === 'manual') {\n confidence += 0.06;\n } else if (row.evidence_kind === 'direct') {\n confidence += 0.03;\n }\n\n if (row.scope === 'active') {\n confidence -= Math.min(0.18, ageDays / 120);\n }\n\n return clamp(confidence, 0, 1);\n}\n\nfunction isRowStale(row: MemoryRow): boolean {\n const ageDays = (Date.now() - row.updated_at) / (1000 * 60 * 60 * 24);\n if (row.scope === 'active') {\n return ageDays > 21;\n }\n if (row.evidence_kind === 'inferred') {\n return ageDays > 120;\n }\n return ageDays > 365;\n}\n\nfunction tokenize(input: string): string[] {\n return input\n .toLowerCase()\n .split(/[^a-z0-9]+/i)\n .map(term => term.trim())\n .filter(term => term.length >= 3);\n}\n\nfunction normalize(input: string): string {\n return tokenize(input).join(' ');\n}\n\nfunction overlapScore(a: string, b: string): number {\n const aTerms = new Set(a.split(' ').filter(Boolean));\n const bTerms = new Set(b.split(' ').filter(Boolean));\n if (aTerms.size === 0 || bTerms.size === 0) return 0;\n\n let overlap = 0;\n for (const term of aTerms) {\n if (bTerms.has(term)) overlap += 1;\n }\n return overlap / Math.max(aTerms.size, bTerms.size);\n}\n\nfunction pickBetterSummary(existing: string, incoming: string): string {\n return incoming.length > existing.length && incoming.length <= 220 ? incoming.trim() : existing.trim();\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction generateId(prefix: string): string {\n return `${prefix}_${Date.now().toString(36)}${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction inferScope(candidate: UserMemoryCandidate): 'durable' | 'active' {\n if (['goal', 'project', 'decision', 'episode'].includes(candidate.type)) {\n return 'active';\n }\n return 'durable';\n}\n\nfunction hasConflict(a: string, b: string): boolean {\n const left = a.toLowerCase();\n const right = b.toLowerCase();\n if (left === right) return false;\n\n const polarityPairs = [\n ['prefers', 'does not prefer'],\n ['likes', 'does not like'],\n ['wants', 'does not want'],\n ['is building', 'is not building'],\n ['uses', 'does not use'],\n ['enabled', 'disabled'],\n ];\n\n for (const [positive, negative] of polarityPairs) {\n const leftPosRightNeg = left.includes(positive) && right.includes(negative);\n const leftNegRightPos = left.includes(negative) && right.includes(positive);\n if (leftPosRightNeg || leftNegRightPos) {\n return overlapScore(\n normalize(left.replace(positive, '').replace(negative, '')),\n normalize(right.replace(positive, '').replace(negative, '')),\n ) >= 0.5;\n }\n }\n\n const leftHasNegation = /\\b(not|never|no longer|avoid|against|disabled)\\b/.test(left);\n const rightHasNegation = /\\b(not|never|no longer|avoid|against|disabled)\\b/.test(right);\n if (leftHasNegation !== rightHasNegation) {\n return overlapScore(normalize(left), normalize(right)) >= 0.7;\n }\n\n return false;\n}\n\nfunction buildProfileSummary(records: MemoryRow[]): string {\n const selected: string[] = [];\n const preferredTypes: string[] = ['identity', 'preference', 'goal', 'project', 'constraint', 'habit'];\n\n for (const type of preferredTypes) {\n const match = records\n .filter(r => r.type === type)\n .sort((a, b) => memoryHealthScore(b) - memoryHealthScore(a))[0];\n if (match && !selected.includes(match.summary)) {\n selected.push(match.summary);\n }\n if (selected.length >= 4) break;\n }\n\n return selected.join(' ').slice(0, 420).trim();\n}\n\nfunction buildActiveSummary(records: MemoryRow[]): string {\n const cutoff = Date.now() - (14 * 24 * 60 * 60 * 1000);\n const activeCandidates = records\n .filter(r => !r.superseded_by)\n .filter(r => !isRowStale(r))\n .filter(r => r.updated_at >= cutoff)\n .filter(r => ['goal', 'project', 'decision', 'episode'].includes(r.type))\n .sort((a, b) => {\n const byUpdated = b.updated_at - a.updated_at;\n if (byUpdated !== 0) return byUpdated;\n return memoryHealthScore(b) - memoryHealthScore(a);\n })\n .slice(0, 3)\n .map(r => r.summary);\n return activeCandidates.join(' ').slice(0, 360).trim();\n}\n\nfunction buildReflectionCandidates(records: MemoryRow[]): UserMemoryCandidate[] {\n const candidates: UserMemoryCandidate[] = [];\n const groups = new Map<string, MemoryRow[]>();\n\n for (const record of records) {\n if (!groups.has(record.type)) groups.set(record.type, []);\n groups.get(record.type)!.push(record);\n }\n\n const prefGroup = groups.get('preference') || [];\n if (prefGroup.length >= 2) {\n const top = prefGroup\n .sort((a, b) => memoryHealthScore(b) - memoryHealthScore(a))\n .slice(0, 2)\n .map(r => r.summary);\n candidates.push({\n type: 'reflection',\n summary: `User consistently shows these preferences: ${top.join(' ')}`.slice(0, 220),\n detail: top.join('\\n'),\n confidence: 0.86,\n importance: 0.86,\n durability: 0.9,\n });\n }\n\n const goalProjectGroup = [...(groups.get('goal') || []), ...(groups.get('project') || [])];\n if (goalProjectGroup.length >= 2) {\n const top = goalProjectGroup\n .sort((a, b) => memoryHealthScore(b) - memoryHealthScore(a))\n .slice(0, 2)\n .map(r => r.summary);\n candidates.push({\n type: 'reflection',\n summary: `Current long-term direction: ${top.join(' ')}`.slice(0, 220),\n detail: top.join('\\n'),\n confidence: 0.84,\n importance: 0.9,\n durability: 0.86,\n });\n }\n\n const habitConstraintGroup = [...(groups.get('habit') || []), ...(groups.get('constraint') || [])];\n if (habitConstraintGroup.length >= 2) {\n const top = habitConstraintGroup\n .sort((a, b) => memoryHealthScore(b) - memoryHealthScore(a))\n .slice(0, 2)\n .map(r => r.summary);\n candidates.push({\n type: 'reflection',\n summary: `Working style pattern: ${top.join(' ')}`.slice(0, 220),\n detail: top.join('\\n'),\n confidence: 0.82,\n importance: 0.8,\n durability: 0.82,\n });\n }\n\n return candidates;\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, { useChatApi }: { useChatApi?: boolean } = {}) {\n super(config);\n this.name = config.name;\n this.model = config.model;\n\n this.client = createOpenAI({\n apiKey: config.apiKey || 'no-key',\n baseURL: config.baseUrl,\n });\n this.modelInstance = useChatApi\n ? this.client.chat(config.model)\n : 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?.inputTokens ?? 0,\n outputTokens: result.usage?.outputTokens ?? 0,\n totalTokens: (result.usage?.inputTokens ?? 0) + (result.usage?.outputTokens ?? 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(): any {\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?.inputTokens ?? 0,\n outputTokens: result.usage?.outputTokens ?? 0,\n totalTokens: (result.usage?.inputTokens ?? 0) + (result.usage?.outputTokens ?? 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(): any {\n return this.modelInstance;\n }\n}","import { createDeepSeek } from '@ai-sdk/deepseek';\nimport { BaseProvider } from './base.js';\nimport type { ProviderConfig } from '../utils/config.js';\n\nexport class DeepSeekProvider extends BaseProvider {\n readonly name: string;\n readonly model: string;\n private modelInstance: any;\n readonly isReasoner: boolean;\n\n constructor(config: ProviderConfig) {\n super(config);\n this.name = config.name;\n this.model = config.model;\n this.isReasoner = config.model === 'deepseek-reasoner';\n\n const client = createDeepSeek({\n apiKey: config.apiKey,\n baseURL: config.baseUrl,\n });\n this.modelInstance = 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 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 && this.config.baseUrl.length > 0;\n }\n\n getModelInstance() {\n return this.modelInstance;\n }\n}\n","import { createOpenAI } from '@ai-sdk/openai';\nimport { BaseProvider } from './base.js';\nimport type { ProviderConfig } from '../utils/config.js';\n\nexport class MiMoProvider extends BaseProvider {\n readonly name: string;\n readonly model: string;\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 client = createOpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseUrl,\n });\n this.modelInstance = client.chat(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 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 { DeepSeekProvider } from './deepseek.js';\nimport { OllamaProvider } from './ollama.js';\nimport { MiMoProvider } from './mimo.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 config.providers.openaiCompat,\n config.providers.mimo,\n config.providers.mimoTokenPlan,\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 === 'deepseek') {\n provider = new DeepSeekProvider(pc);\n } else if (pc.name === 'ollamaLocal') {\n provider = new OllamaProvider(pc);\n } else if (pc.name === 'ollamaCloud') {\n provider = new OpenAICompatProvider(pc, { useChatApi: true });\n } else if (pc.name === 'openaiCompat') {\n provider = new OpenAICompatProvider(pc, { useChatApi: true });\n } else if (pc.name === 'mimo' || pc.name === 'mimoTokenPlan') {\n provider = new MiMoProvider(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, stepCountIs } from 'ai';\nimport path from 'node:path';\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 { UserMemoryStore } from '../memory/user-memory.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 { DeepSeekProvider } from '../providers/deepseek.js';\nimport { ProviderRegistry as ProviderRegistryImpl } from '../providers/registry.js';\nimport { Lifecycle } from './lifecycle.js';\nimport { Scheduler } from './scheduler.js';\nimport { ProgrammingMode } from './programming-mode.js';\nimport { BackgroundTaskManager } from './background-tasks.js';\nimport { logger } from '../utils/logger.js';\nimport { CLIChannel } from '../channels/cli.js';\nimport { TelegramChannel } from '../channels/telegram.js';\nimport { formatToolStep } from '../utils/tool-label.js';\nimport type { ArrowSelectOption } from '../utils/arrow-select.js';\nimport { setAskUserHandler } from '../capabilities/interaction/ask-user.js';\nimport type { SpotifyClient } from '../spotify/client.js';\nimport { PLAYER_CONTROLS, handlePlayerAction, formatNowPlaying } from '../spotify/ui.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 getActiveProviders,\n} from '../utils/config.js';\n\nclass ToolCallLoopDetector {\n private recentCalls: Array<{ tool: string; params: string; failed: boolean }> = [];\n private totalCalls = 0;\n private hardAborted = false;\n private recentStepTexts: Array<string> = [];\n private consecutiveNoActionSteps = 0;\n\n private static readonly ABSOLUTE_MAX = 25;\n private static readonly FAILED_ABSOLUTE_MAX = 12;\n private static readonly NO_ACTION_MAX = 5;\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 ]);\n\n private static readonly IDENTICAL_THRESHOLD = 3;\n private static readonly SIMILAR_THRESHOLD = 4;\n private static readonly TEXT_REPEAT_THRESHOLD = 3;\n private static readonly MAX_STEP_TEXTS = 12;\n\n private static getSameToolThreshold(toolName: string, failingCount: number): number {\n const baseHigh = 5;\n const baseNormal = 3;\n const isHigh = ToolCallLoopDetector.HIGH_TOLERANCE_TOOLS.has(toolName);\n let threshold = isHigh ? baseHigh : baseNormal;\n if (failingCount >= 3) {\n threshold = Math.min(threshold, isHigh ? 3 : 2);\n }\n return threshold;\n }\n\n record(toolName: string, params: Record<string, any>, failed: boolean = false): void {\n const paramsKey = JSON.stringify(params).slice(0, 200);\n this.recentCalls.push({ tool: toolName, params: paramsKey, failed });\n this.totalCalls++;\n this.consecutiveNoActionSteps = 0;\n if (this.recentCalls.length > 30) {\n this.recentCalls.shift();\n }\n }\n\n recordNoActionResult(): boolean {\n this.consecutiveNoActionSteps++;\n return this.consecutiveNoActionSteps >= ToolCallLoopDetector.NO_ACTION_MAX;\n }\n\n recordStepText(text: string): void {\n if (!text || text.length < 10) return;\n const normalized = text.toLowerCase().replace(/\\s+/g, ' ').trim().slice(0, 200);\n if (!normalized) return;\n this.recentStepTexts.push(normalized);\n if (this.recentStepTexts.length > ToolCallLoopDetector.MAX_STEP_TEXTS) {\n this.recentStepTexts.shift();\n }\n }\n\n detectAbsoluteLimit(): boolean {\n if (this.totalCalls >= ToolCallLoopDetector.ABSOLUTE_MAX) return true;\n const failCount = this.recentCalls.filter(c => c.failed).length;\n if (failCount >= ToolCallLoopDetector.FAILED_ABSOLUTE_MAX) return true;\n return false;\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.IDENTICAL_THRESHOLD) {\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 detectSimilarLoop(): { tool: string; count: number; message: string } | null {\n if (this.recentCalls.length < 4) return null;\n\n const last = this.recentCalls[this.recentCalls.length - 1];\n let similarCount = 0;\n\n for (let i = this.recentCalls.length - 1; i >= 0; i--) {\n const call = this.recentCalls[i];\n if (call.tool !== last.tool) break;\n if (call.failed || last.failed) {\n similarCount++;\n } else {\n break;\n }\n }\n\n if (similarCount >= ToolCallLoopDetector.SIMILAR_THRESHOLD) {\n this.hardAborted = true;\n return {\n tool: last.tool,\n count: similarCount,\n message: `[SYSTEM] You called \"${last.tool}\" ${similarCount} times with different params but all are failing. This is a failing loop — stop immediately. Tell the user you cannot complete this task.`,\n };\n }\n\n return null;\n }\n\n detectTextRepetition(): { pattern: string; count: number } | null {\n if (this.recentStepTexts.length < ToolCallLoopDetector.TEXT_REPEAT_THRESHOLD) return null;\n\n const texts = this.recentStepTexts;\n const last = texts[texts.length - 1];\n\n let repeatCount = 0;\n for (let i = texts.length - 1; i >= 0; i--) {\n const similarity = this.textSimilarity(last, texts[i]);\n if (similarity >= 0.7) {\n repeatCount++;\n } else {\n break;\n }\n }\n\n if (repeatCount >= ToolCallLoopDetector.TEXT_REPEAT_THRESHOLD) {\n return {\n pattern: last.slice(0, 60),\n count: repeatCount,\n };\n }\n\n return null;\n }\n\n private textSimilarity(a: string, b: string): number {\n if (a === b) return 1;\n if (!a || !b) return 0;\n\n const setA = new Set(a.split(' '));\n const setB = new Set(b.split(' '));\n const intersection = [...setA].filter(w => setB.has(w)).length;\n const union = new Set([...setA, ...setB]).size;\n return union === 0 ? 0 : intersection / union;\n }\n\n detectSameTool(): { tool: string; count: number } | null {\n if (this.recentCalls.length < 3) return null;\n\n const last = this.recentCalls[this.recentCalls.length - 1];\n\n let consecutiveCount = 0;\n let failingConsecutive = 0;\n for (let i = this.recentCalls.length - 1; i >= 0; i--) {\n if (this.recentCalls[i].tool === last.tool) {\n consecutiveCount++;\n if (this.recentCalls[i].failed) failingConsecutive++;\n } else {\n break;\n }\n }\n\n const threshold = ToolCallLoopDetector.getSameToolThreshold(last.tool, failingConsecutive);\n if (consecutiveCount >= threshold) {\n return { tool: last.tool, count: consecutiveCount };\n }\n\n if (this.recentCalls.length >= 6) {\n const lastN = this.recentCalls.slice(-6);\n const toolCounts: Record<string, number> = {};\n for (const call of lastN) {\n toolCounts[call.tool] = (toolCounts[call.tool] || 0) + 1;\n }\n for (const [tool, count] of Object.entries(toolCounts)) {\n if (count >= 5) {\n return { tool, count };\n }\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.totalCalls = 0;\n this.hardAborted = false;\n this.recentStepTexts = [];\n this.consecutiveNoActionSteps = 0;\n }\n}\n\nconst MAX_STEPS = 10;\nconst MAX_RESPONSE_TOKENS = 1600;\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 private currentMessage: ChannelMessage | null = null;\n private currentAbort: AbortController | null = null;\n private autoBackgroundHandoff = false;\n private supervisor?: import('../core/supervisor.js').SubAgentSupervisor;\n readonly programmingMode: ProgrammingMode;\n private spotifyClient?: SpotifyClient;\n readonly backgroundTasks: BackgroundTaskManager;\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 userMemory: UserMemoryStore | null,\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 this.programmingMode = new ProgrammingMode();\n this.backgroundTasks = new BackgroundTaskManager();\n\n this.backgroundTasks.onGlobalComplete((task) => {\n this.notifyBackgroundTaskComplete(task);\n });\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 setAskUserHandler(async (question, choices, channelId, channelType) => {\n return this.presentChoice(question, choices, channelId, channelType);\n });\n }\n\n setSupervisor(supervisor: import('../core/supervisor.js').SubAgentSupervisor): void {\n this.supervisor = supervisor;\n supervisor.setNotifyCallback(async (channelType, channelId, message) => {\n const channel = this.channels.get(channelType as any);\n if (channel) {\n await channel.send(message, channelId).catch(() => {});\n }\n });\n supervisor.setLifecycleCallback((event) => {\n const bgTask = this.backgroundTasks.getByAgentId(event.agentId);\n if (!bgTask) return;\n\n if (event.type === 'progress' && event.progress) {\n this.backgroundTasks.updateAgentProgress(bgTask.id, event.progress);\n this.syncBgTasksToTui();\n return;\n }\n\n if (event.type === 'complete' && event.result) {\n const result = event.result;\n const status = result.status === 'completed' ? 'completed' : result.status === 'halted' ? 'cancelled' : 'failed';\n this.backgroundTasks.completeAgentTask(bgTask.id, status === 'completed' ? 0 : 1, status, result.output);\n this.syncBgTasksToTui();\n }\n });\n }\n\n private enqueueMessage(msg: ChannelMessage): void {\n logger.info({ from: msg.channelType, content: msg.content.slice(0, 50) }, 'Message enqueued');\n\n const trimmed = msg.content.trim();\n\n if (\n this.processing &&\n !trimmed.startsWith('/') &&\n msg.channelType !== 'internal' &&\n this.supervisor &&\n this.currentMessage &&\n this.currentAbort &&\n !this.currentAbort.signal.aborted &&\n !this.autoBackgroundHandoff &&\n this.currentMessage.channelType === msg.channelType &&\n this.currentMessage.channelId === msg.channelId\n ) {\n void this.autoBackgroundCurrentTask(msg).catch((err) => {\n logger.warn({ err }, 'Auto-background handoff failed');\n });\n }\n\n if (this.processing && trimmed.startsWith('/')) {\n this.handleFastPathCommand(msg).catch((err) => {\n logger.error({ err, content: trimmed.slice(0, 50) }, 'Fast-path command failed');\n });\n return;\n }\n\n this.messageQueue.push(msg);\n this.processQueue();\n }\n\n private async autoBackgroundCurrentTask(interruptMsg: ChannelMessage): Promise<void> {\n if (!this.currentMessage || !this.currentAbort || !this.supervisor) return;\n if (this.currentAbort.signal.aborted || this.autoBackgroundHandoff) return;\n this.autoBackgroundHandoff = true;\n try {\n const taskDescription = this.currentMessage.content.trim();\n if (!taskDescription) return;\n\n this.currentAbort.abort();\n\n const agentId = await this.supervisor.spawn({\n task: taskDescription,\n sourceChannelId: this.currentMessage.channelId,\n sourceChannelType: this.currentMessage.channelType as any,\n workingDirectory: this.capabilities.getCwd(),\n });\n const bgId = this.backgroundTasks.spawnAgent(taskDescription, this.capabilities.getCwd(), agentId);\n this.syncBgTasksToTui();\n\n const channel = this.channels.getChannelForMessage(interruptMsg);\n if (channel) {\n await channel.send(\n `📋 I moved the in-progress task to background (${bgId}) so I can respond now. Use /bg ${bgId} or /bg list for progress.`,\n interruptMsg.channelId,\n ).catch(() => {});\n }\n } finally {\n this.autoBackgroundHandoff = false;\n }\n }\n\n private async handleFastPathCommand(msg: ChannelMessage): Promise<void> {\n const trimmed = msg.content.trim();\n const channel = this.channels.getChannelForMessage(msg);\n if (!channel) return;\n\n const activeAgents = this.supervisor ? this.supervisor.getActiveAgents() : [];\n const hasActiveAgents = activeAgents.length > 0;\n const busyPrefix = hasActiveAgents ? '' : '';\n\n if (trimmed === '/agents' || trimmed === '/status') {\n if (this.supervisor) {\n const agents = this.supervisor.getActiveAgents();\n if (agents.length === 0) {\n await channel.send('No active sub-agents.', msg.channelId);\n } else {\n let text = '**Sub-Agents:**\\n\\n';\n for (const a of agents) {\n const icon = a.status === 'running' ? '🔄' : a.status === 'pending' ? '⏳' : a.status === 'completed' ? '✅' : '❌';\n text += `${icon} **${a.id}**: ${a.task.slice(0, 60)}${a.task.length > 60 ? '...' : ''} — ${a.status}${a.progress ? ` (${a.progress})` : ''}\\n`;\n }\n await channel.send(text, msg.channelId);\n }\n } else {\n await channel.send('Sub-agents not enabled.', msg.channelId);\n }\n return;\n }\n\n if (trimmed === '/halt' || trimmed === '/stop') {\n if (this.supervisor) {\n await this.supervisor.haltAll();\n if (trimmed === '/stop') {\n this.supervisor.clearTaskBoard();\n }\n await channel.send(trimmed === '/halt' ? 'All sub-agents halted.' : 'All agents stopped, locks released, task board cleared.', msg.channelId);\n }\n return;\n }\n\n if (trimmed.startsWith('/bg')) {\n await this.handleBgCommand(trimmed, msg, channel);\n return;\n }\n\n if (trimmed === '/help') {\n await channel.send('Agent is busy. Available: /agents, /halt, /stop, /spotify, /code, /memory, /bg', msg.channelId);\n return;\n }\n\n if (trimmed.startsWith('/spotify')) {\n await this.handleFastPathSpotify(trimmed, msg, channel);\n return;\n }\n\n if (trimmed.startsWith('/code')) {\n await this.handleFastPathCode(trimmed, msg, channel);\n return;\n }\n\n if (trimmed === '/memory') {\n await channel.send('Agent is busy. Memory management will be available after current task completes.', msg.channelId);\n return;\n }\n\n if (hasActiveAgents) {\n const agentList = activeAgents.map(a => `**${a.id}**: ${a.task.slice(0, 40)}`).join(', ');\n await channel.send(`I'm busy working on sub-agent tasks (${agentList}). Your message has been queued — I'll respond once I'm free. Use /agents to check status.`, msg.channelId);\n } else {\n await channel.send(\"I'm busy processing. Use /bg current to move this task to the background, or wait for it to finish.\", msg.channelId);\n }\n\n this.messageQueue.push(msg);\n }\n\n private async handleFastPathSpotify(trimmed: string, msg: ChannelMessage, channel: any): Promise<void> {\n if (!this.spotifyClient) {\n await channel.send('Spotify is not connected.', msg.channelId);\n return;\n }\n const rawArgs = trimmed.slice('/spotify'.length).trim().toLowerCase();\n if (!rawArgs || rawArgs === 'status') {\n const auth = this.spotifyClient.isAuthenticated() ? 'Connected' : 'Not connected';\n const accountName = this.spotifyClient.getAccountName();\n const product = this.spotifyClient.getProduct();\n let status = `Spotify: **${auth}**`;\n if (accountName) status += `\\nAccount: **${accountName}**`;\n if (product) status += `\\nPlan: ${product}`;\n status += `\\nDevice: ${this.spotifyClient.getDeviceId() || 'none selected'}`;\n await channel.send(status, msg.channelId);\n return;\n }\n if (rawArgs === 'logout') {\n this.spotifyClient.logout();\n await channel.send('Spotify disconnected. Run `/spotify auth` to reconnect.', msg.channelId);\n return;\n }\n if (rawArgs === 'now' || rawArgs === 'playing' || rawArgs === 'np') {\n try {\n const text = await this.spotifyClient.getNowPlayingText();\n await channel.send(text, msg.channelId);\n } catch (err: any) {\n await channel.send(`Failed: ${err.message}`, msg.channelId);\n }\n return;\n }\n await channel.send('Agent is busy. Full Spotify controls will be available after current task completes.', msg.channelId);\n }\n\n private async handleFastPathCode(trimmed: string, msg: ChannelMessage, channel: any): Promise<void> {\n const rawArgs = trimmed.slice('/code'.length).trim().toLowerCase();\n if (rawArgs === 'status') {\n await channel.send(this.programmingMode.getStatusText(), msg.channelId);\n return;\n }\n await channel.send('Agent is busy. Programming mode changes will be available after current task completes.', msg.channelId);\n }\n\n private async handleBgCommand(trimmed: string, msg: ChannelMessage, channel: any): Promise<void> {\n const parts = trimmed.split(/\\s+/);\n const sub = parts.length > 1 ? parts[1] : '';\n const args = parts.slice(1).join(' ');\n\n if (sub === 'current') {\n if (!this.processing || !this.currentMessage) {\n await channel.send('No active task to background.', msg.channelId);\n return;\n }\n const taskDescription = this.currentMessage.content.trim();\n const sourceChannelId = this.currentMessage.channelId;\n const sourceChannelType = this.currentMessage.channelType as any;\n\n if (this.currentAbort) {\n this.currentAbort.abort();\n }\n\n if (this.supervisor) {\n const agentId = await this.supervisor.spawn({\n task: taskDescription,\n sourceChannelId,\n sourceChannelType,\n });\n const bgId = this.backgroundTasks.spawnAgent(taskDescription, this.capabilities.getCwd(), agentId);\n await channel.send(`📋 Active task moved to background as ${bgId}. I'll notify you when it completes.`, msg.channelId);\n } else {\n await channel.send('Cannot background: sub-agents not available. The active task has been aborted.', msg.channelId);\n }\n\n this.syncBgTasksToTui();\n return;\n }\n\n if (sub === 'list' || sub === '' || sub === 'ls') {\n const tasks = this.backgroundTasks.getAllSummaries();\n if (tasks.length === 0) {\n await channel.send('No background tasks.', msg.channelId);\n return;\n }\n const lines = tasks.map((t) => {\n const icon = t.status === 'running' ? '⏳' : t.status === 'completed' ? '✅' : t.status === 'failed' ? '❌' : t.status === 'timed_out' ? '⏱' : '⛔';\n const label = t.command || t.task || t.id;\n const elapsed = t.runningMs ? ` (${Math.round(t.runningMs / 1000)}s)` : t.completedAt ? ` (${((t.completedAt - t.startedAt) / 1000).toFixed(1)}s)` : '';\n const short = label.length > 60 ? label.slice(0, 57) + '...' : label;\n return `${icon} ${t.id}: ${short}${elapsed} — ${t.status}`;\n });\n await channel.send(`**Background Tasks:**\\n${lines.join('\\n')}\\n\\nUse /bg <id> for details, /bg cancel <id> to cancel, /bg clear to prune completed tasks.`, msg.channelId);\n return;\n }\n\n if (sub === 'clear') {\n const cleared = this.backgroundTasks.clearCompleted();\n await channel.send(`Cleared ${cleared} completed task(s).`, msg.channelId);\n this.syncBgTasksToTui();\n return;\n }\n\n if (sub === 'cancel') {\n const taskId = parts[2];\n if (!taskId) {\n await channel.send('Usage: /bg cancel <id>', msg.channelId);\n return;\n }\n const cancelled = this.backgroundTasks.cancel(taskId);\n if (cancelled) {\n await channel.send(`⛔ Cancelled background task ${taskId}.`, msg.channelId);\n } else {\n await channel.send(`Task ${taskId} not found or not running.`, msg.channelId);\n }\n this.syncBgTasksToTui();\n return;\n }\n\n const specificTask = this.backgroundTasks.getSummary(sub);\n if (specificTask) {\n const task = this.backgroundTasks.get(sub)!;\n const label = task.command || task.task || task.id;\n const elapsed = task.status === 'running'\n ? `Running for ${Math.round((Date.now() - task.startedAt) / 1000)}s`\n : task.completedAt\n ? `Completed in ${((task.completedAt - task.startedAt) / 1000).toFixed(1)}s`\n : task.status;\n const output = (task.stdout + '\\n' + task.stderr).trim();\n const preview = output.length > 2000 ? output.slice(-2000) : output;\n await channel.send(`**${specificTask.id}**: ${label}\\nStatus: ${elapsed}\\nExit code: ${task.exitCode ?? 'N/A'}\\n\\n${preview || '(no output)'}`, msg.channelId);\n return;\n }\n\n const colonIdx = trimmed.indexOf(':');\n if (sub.startsWith('cancel')) {\n const taskId2 = parts[2];\n if (!taskId2) {\n await channel.send('Usage: /bg cancel <id>', msg.channelId);\n return;\n }\n const cancelled = this.backgroundTasks.cancel(taskId2);\n if (cancelled) {\n await channel.send(`⛔ Cancelled background task ${taskId2}.`, msg.channelId);\n } else {\n await channel.send(`Task ${taskId2} not found or not running.`, msg.channelId);\n }\n this.syncBgTasksToTui();\n return;\n }\n\n if (colonIdx !== -1 && trimmed[colonIdx + 1] === ' ') {\n const taskDescription = trimmed.slice(colonIdx + 1).trim();\n if (!taskDescription) {\n await channel.send('Usage: /bg: <natural language task> or /bg <shell command>', msg.channelId);\n return;\n }\n if (!this.supervisor) {\n await channel.send('Sub-agents are not available. Use /bg <command> for shell commands.', msg.channelId);\n return;\n }\n const agentId = await this.supervisor.spawn({\n task: taskDescription,\n sourceChannelId: msg.channelId,\n sourceChannelType: msg.channelType as any,\n });\n const bgId = this.backgroundTasks.spawnAgent(taskDescription, this.capabilities.getCwd(), agentId);\n this.backgroundTasks.registerComplete(bgId, (task) => {\n if (task.status === 'running') return;\n });\n await channel.send(`📋 Background agent ${bgId} started: \"${taskDescription.slice(0, 50)}${taskDescription.length > 50 ? '...' : ''}\"`, msg.channelId);\n this.syncBgTasksToTui();\n return;\n }\n\n const command = args || '';\n if (!command) {\n await channel.send('Usage:\\n• /bg <command> — run a shell command in the background\\n• /bg: <task> — delegate an LLM task to the background\\n• /bg current — move the active task to the background\\n• /bg list — show all background tasks\\n• /bg <id> — show task details\\n• /bg cancel <id> — cancel a running task\\n• /bg clear — prune completed tasks', msg.channelId);\n return;\n }\n\n const cwd = this.capabilities.getCwd();\n const bgId = this.backgroundTasks.spawnShell(command, cwd);\n await channel.send(`📋 Background task ${bgId} started: \"${command.slice(0, 50)}${command.length > 50 ? '...' : ''}\"`, msg.channelId);\n this.syncBgTasksToTui();\n }\n\n private syncBgTasksToTui(): void {\n const cliChannel = this.channels.get('cli');\n if (cliChannel && cliChannel instanceof CLIChannel) {\n (cliChannel as CLIChannel).updateBackgroundTasks(this.backgroundTasks.getAllSummaries());\n }\n }\n\n private notifyBackgroundTaskComplete(task: import('./background-tasks.js').BackgroundTask): void {\n const label = task.command || task.task || task.id;\n const duration = task.completedAt ? ` in ${((task.completedAt - task.startedAt) / 1000).toFixed(1)}s` : '';\n let message: string;\n\n if (task.status === 'completed') {\n message = `✅ Background task ${task.id} completed${duration}: \"${label}\"`;\n } else if (task.status === 'failed') {\n message = `❌ Background task ${task.id} failed${duration}: \"${label}\" (exit code ${task.exitCode ?? 'unknown'})`;\n } else if (task.status === 'timed_out') {\n message = `⏱ Background task ${task.id} timed out: \"${label}\"`;\n } else if (task.status === 'cancelled') {\n message = `⛔ Background task ${task.id} cancelled: \"${label}\"`;\n } else {\n message = `Background task ${task.id}: ${task.status} — \"${label}\"`;\n }\n\n const output = (task.stdout + '\\n' + task.stderr).trim();\n if (output) {\n const preview = output.length > 500 ? '\\n' + output.slice(-500) : '\\n' + output;\n message += preview;\n }\n\n const cliCh = this.channels.get('cli');\n if (cliCh) {\n (cliCh as CLIChannel).send(message).catch(() => {});\n }\n const tgCh = this.channels.get('telegram');\n if (tgCh) {\n tgCh.send(message).catch(() => {});\n }\n\n this.syncBgTasksToTui();\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 private switchSessionProvider(providerName: string): { ok: boolean; message: string } {\n const active = getActiveProviders(this.config).map((p) => p.name);\n if (!active.includes(providerName)) {\n return { ok: false, message: `Provider \\`${providerName}\\` is not configured. Run \\`mercury doctor\\` to add/configure models.` };\n }\n\n this.config.providers.default = providerName as any;\n this.providers = new ProviderRegistryImpl(this.config);\n const selected = this.providers.getDefault();\n const model = selected.getModel();\n\n const cliChannel = this.channels.get('cli');\n if (cliChannel && cliChannel instanceof CLIChannel) {\n cliChannel.setProvider(providerName, model);\n }\n\n return { ok: true, message: `Session model switched to **${providerName}** · **${model}**.` };\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 if (this.supervisor && msg.channelType !== 'internal') {\n const activeAgents = this.supervisor.getActiveAgents();\n const runningAgents = activeAgents.filter(a => a.status === 'running');\n if (runningAgents.length > 0) {\n const channel = this.channels.getChannelForMessage(msg);\n if (channel) {\n const agentLines = runningAgents.map(a => ` 🔄 ${a.id}: ${a.task.slice(0, 45)}${a.task.length > 45 ? '...' : ''}`);\n await channel.send(`**Multi-agent mode** — ${runningAgents.length} agent${runningAgents.length > 1 ? 's' : ''} active:\\n${agentLines.join('\\n')}`, msg.channelId).catch(() => {});\n }\n }\n }\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 this.capabilities.permissions.addTempScope('/', true, 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 (await this.handleWorkspaceNaturalLanguage(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\n const messages: any[] = [];\n\n const recentSteps = this.shortTerm.getRecent(msg.channelId, 6);\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 if (!loopWarning) {\n const assistantMessages = recentSteps.filter(m => m.role === 'assistant' && m.content.length > 20);\n if (assistantMessages.length >= 3) {\n const last3 = assistantMessages.slice(-3);\n const normalizeText = (t: string) => t.toLowerCase().replace(/[^\\w\\s]/g, '').replace(/\\s+/g, ' ').trim().slice(0, 150);\n const normalized = last3.map(m => normalizeText(m.content));\n const words0 = new Set(normalized[0].split(' '));\n const overlap01 = normalized[0] && normalized[1] ? [...words0].filter(w => new Set(normalized[1].split(' ')).has(w)).length / Math.max(words0.size, 1) : 0;\n const overlap12 = normalized[1] && normalized[2] ? [...new Set(normalized[1].split(' '))].filter(w => new Set(normalized[2].split(' ')).has(w)).length / Math.max(new Set(normalized[1].split(' ')).size, 1) : 0;\n if (overlap01 > 0.75 && overlap12 > 0.75) {\n loopWarning = `[SYSTEM WARNING] Your last 3 responses are nearly identical. You are stuck in a text repetition loop. Stop immediately and give a completely different response. If you cannot complete the task, tell the user clearly why.`;\n }\n }\n }\n }\n\n if (loopWarning) {\n messages.push({ role: 'user', content: loopWarning });\n messages.push({ role: 'assistant', content: 'Acknowledged. I will stop repeating and respond differently, or clearly state if the task cannot be completed.' });\n }\n\n if (this.userMemory) {\n const memoryContext = this.userMemory.retrieveRelevant(msg.content, { maxRecords: 5, maxChars: 900 });\n if (memoryContext.context) {\n messages.push({\n role: 'user',\n content: memoryContext.context,\n });\n messages.push({ role: 'assistant', content: 'Noted. I\\'ll keep this in mind.' });\n }\n } else {\n const relevantFacts = this.longTerm.search(msg.content, 3);\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\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 this.currentMessage = msg;\n this.currentAbort = loopAbortController;\n\n const canStream = msg.channelType === 'cli' || (msg.channelType === 'telegram' && this.telegramStreaming);\n\n const tgChannel = this.channels.get('telegram');\n if (msg.channelType === 'telegram' && tgChannel) {\n (tgChannel as TelegramChannel).resetStepCounter(msg.channelId);\n }\n\n for (const provider of fallbackIterator) {\n try {\n const deepseekProviderOptions = provider instanceof DeepSeekProvider && provider.isReasoner\n ? { deepseek: { thinking: { type: 'enabled' as const } } }\n : undefined;\n\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 maxOutputTokens: MAX_RESPONSE_TOKENS,\n stopWhen: stepCountIs(MAX_STEPS),\n abortSignal: loopAbortController.signal,\n ...(deepseekProviderOptions ? { providerOptions: deepseekProviderOptions } : {}),\n onStepFinish: async ({ toolCalls, toolResults }) => {\n if (toolCalls && toolResults && toolCalls.length > 0) {\n const names = toolCalls.map((tc: any) => tc.toolName).join(', ');\n logger.info({ tools: names }, 'Tool call step');\n for (let i = 0; i < toolCalls.length; i++) {\n const tc = toolCalls[i];\n const tr = toolResults[i] as any;\n const resultStr = typeof tr?.result === 'string' ? tr.result : JSON.stringify(tr?.result ?? '');\n const failed = resultStr.length < 5000 && (\n resultStr.startsWith('Error:') ||\n resultStr.startsWith('⚠') ||\n resultStr.includes('exited with code') ||\n resultStr.includes('Command failed') ||\n resultStr.startsWith('Command exited with code')\n );\n loopDetector.record(tc.toolName, tc.input as Record<string, any>, failed);\n }\n if (loopDetector.detectAbsoluteLimit()) {\n logger.warn('Absolute tool call limit reached — aborting');\n if (channel && msg.channelType !== 'internal') {\n await channel.send('⚠ Tool call limit reached (25 calls). Stopping to prevent runaway loop.', msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\n return;\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 return;\n }\n const similarLoop = loopDetector.detectSimilarLoop();\n if (similarLoop) {\n logger.warn({ tool: similarLoop.tool, count: similarLoop.count }, 'Failing loop detected — aborting');\n if (!loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n await channel.send(`⚠ Failing loop detected — ${similarLoop.tool} called ${similarLoop.count}x, all failing. Stopping.`, msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\n return;\n }\n const softLoop = loopDetector.detectSameTool();\n if (softLoop && !loopWarningSent && channel && msg.channelType !== 'internal') {\n if (this.capabilities.permissions.isAutoApproveAll()) {\n loopDetector.reset();\n loopWarningSent = false;\n } else {\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 }\n if (channel && msg.channelType !== 'internal') {\n if (channel instanceof CLIChannel) {\n for (const tc of toolCalls) {\n void (channel as CLIChannel).sendToolFeedback(tc.toolName, tc.input as Record<string, any>).catch(() => {});\n }\n if (toolResults) {\n for (let i = 0; i < toolResults.length; i++) {\n const tr = toolResults[i] as any;\n const tcName = toolCalls[i]?.toolName as string | undefined;\n if (tcName) {\n (channel as CLIChannel).sendStepDone(tcName, tr.result ?? tr);\n }\n }\n }\n } else if (channel instanceof TelegramChannel) {\n const tgCh = channel as TelegramChannel;\n for (const tc of toolCalls) {\n void tgCh.sendToolFeedback(tc.toolName, tc.input as Record<string, any>, msg.channelId).catch(() => {});\n }\n if (toolResults) {\n for (let i = 0; i < toolResults.length; i++) {\n const tr = toolResults[i] as any;\n const tcName = toolCalls[i]?.toolName as string | undefined;\n if (tcName) {\n await tgCh.sendStepDone(tcName, tr.result ?? tr, msg.channelId).catch(() => {});\n }\n }\n }\n } else {\n await channel.send(` [Using: ${names}]`, msg.channelId).catch(() => {});\n }\n }\n } else if (toolResults === undefined || (toolCalls === undefined)) {\n const stepText = (toolResults as any)?.text ?? '';\n if (stepText) {\n loopDetector.recordStepText(String(stepText));\n }\n const noActionLoop = loopDetector.recordNoActionResult();\n if (noActionLoop) {\n logger.warn('Reasoning loop detected — model keeps thinking without acting, aborting');\n if (!loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n await channel.send('⚠ I\\'m stuck in a reasoning loop (thinking without taking action). Stopping.', msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\n return;\n }\n const textRepeat = loopDetector.detectTextRepetition();\n if (textRepeat) {\n logger.warn({ pattern: textRepeat.pattern, count: textRepeat.count }, 'Text repetition loop detected — aborting');\n if (!loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n await channel.send('⚠ I keep generating the same response. Stopping to prevent repetition.', msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\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 const streamReasoning = await streamResult.reasoning;\n\n result = { text: fullText, usage, reasoning: streamReasoning };\n streamedText = fullText;\n loopDetector.recordStepText(fullText);\n } else {\n result = await generateText({\n model: provider.getModelInstance(),\n system: systemPrompt,\n messages,\n tools: this.capabilities.getTools(),\n maxOutputTokens: MAX_RESPONSE_TOKENS,\n stopWhen: stepCountIs(MAX_STEPS),\n abortSignal: loopAbortController.signal,\n ...(deepseekProviderOptions ? { providerOptions: deepseekProviderOptions } : {}),\n onStepFinish: async ({ toolCalls, toolResults }) => {\n if (toolCalls && toolResults && toolCalls.length > 0) {\n const names = toolCalls.map((tc: any) => tc.toolName).join(', ');\n logger.info({ tools: names }, 'Tool call step');\n for (let i = 0; i < toolCalls.length; i++) {\n const tc = toolCalls[i];\n const tr = toolResults[i] as any;\n const resultStr = typeof tr?.result === 'string' ? tr.result : JSON.stringify(tr?.result ?? '');\n const failed = resultStr.length < 5000 && (\n resultStr.startsWith('Error:') ||\n resultStr.startsWith('⚠') ||\n resultStr.includes('exited with code') ||\n resultStr.includes('Command failed') ||\n resultStr.startsWith('Command exited with code')\n );\n loopDetector.record(tc.toolName, tc.input as Record<string, any>, failed);\n }\n if (loopDetector.detectAbsoluteLimit()) {\n logger.warn('Absolute tool call limit reached — aborting');\n if (channel && msg.channelType !== 'internal') {\n await channel.send('⚠ Tool call limit reached (25 calls). Stopping to prevent runaway loop.', msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\n return;\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 return;\n }\n const similarLoop = loopDetector.detectSimilarLoop();\n if (similarLoop) {\n logger.warn({ tool: similarLoop.tool, count: similarLoop.count }, 'Failing loop detected — aborting');\n if (!loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n await channel.send(`⚠ Failing loop detected — ${similarLoop.tool} called ${similarLoop.count}x, all failing. Stopping.`, msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\n return;\n }\n const softLoop = loopDetector.detectSameTool();\n if (softLoop && !loopWarningSent && channel && msg.channelType !== 'internal') {\n if (this.capabilities.permissions.isAutoApproveAll()) {\n loopDetector.reset();\n loopWarningSent = false;\n } else {\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 }\n if (channel && msg.channelType !== 'internal') {\n if (channel instanceof CLIChannel) {\n for (const tc of toolCalls) {\n void (channel as CLIChannel).sendToolFeedback(tc.toolName, tc.input as Record<string, any>).catch(() => {});\n }\n if (toolResults) {\n for (let i = 0; i < toolResults.length; i++) {\n const tr = toolResults[i] as any;\n const tcName = toolCalls[i]?.toolName as string | undefined;\n if (tcName) {\n (channel as CLIChannel).sendStepDone(tcName, tr.result ?? tr);\n }\n }\n }\n } else if (channel instanceof TelegramChannel) {\n const tgCh = channel as TelegramChannel;\n for (const tc of toolCalls) {\n void tgCh.sendToolFeedback(tc.toolName, tc.input as Record<string, any>, msg.channelId).catch(() => {});\n }\n if (toolResults) {\n for (let i = 0; i < toolResults.length; i++) {\n const tr = toolResults[i] as any;\n const tcName = toolCalls[i]?.toolName as string | undefined;\n if (tcName) {\n await tgCh.sendStepDone(tcName, tr.result ?? tr, msg.channelId).catch(() => {});\n }\n }\n }\n } else {\n await channel.send(` [Using: ${names}]`, msg.channelId).catch(() => {});\n }\n }\n } else if (toolResults === undefined || (toolCalls === undefined)) {\n const stepText = (toolResults as any)?.text ?? '';\n if (stepText) {\n loopDetector.recordStepText(String(stepText));\n }\n const noActionLoop = loopDetector.recordNoActionResult();\n if (noActionLoop) {\n logger.warn('Reasoning loop detected — model keeps thinking without acting, aborting');\n if (!loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n await channel.send('⚠ I\\'m stuck in a reasoning loop (thinking without taking action). Stopping.', msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\n return;\n }\n const textRepeat = loopDetector.detectTextRepetition();\n if (textRepeat) {\n logger.warn({ pattern: textRepeat.pattern, count: textRepeat.count }, 'Text repetition loop detected — aborting');\n if (!loopWarningSent && channel && msg.channelType !== 'internal') {\n loopWarningSent = true;\n await channel.send('⚠ I keep generating the same response. Stopping to prevent repetition.', msg.channelId).catch(() => {});\n }\n loopAbortController.abort();\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 detected I was stuck in a loop (repeating the same action without progress). I cannot complete this task as requested. Please let me know if you\\'d like me to try a completely different approach, or if there\\'s something else I can help with.', 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 || '').trim() || '(no text response)';\n\n this.tokenBudget.recordUsage({\n provider: usedProvider!.name,\n model: usedProvider!.model,\n inputTokens: result.usage?.inputTokens ?? 0,\n outputTokens: result.usage?.outputTokens ?? 0,\n totalTokens: (result.usage?.inputTokens ?? 0) + (result.usage?.outputTokens ?? 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?.inputTokens ?? 0) + (result.usage?.outputTokens ?? 0),\n reasoning: result.reasoning || undefined,\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.extractMemory(msg.content, finalText).catch(err => {\n logger.warn({ err }, 'Memory extraction failed');\n });\n }\n\n if (channel && msg.channelType !== 'internal') {\n const elapsed = Date.now() - startTime;\n if (streamedText && streamedText.trim()) {\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 this.currentMessage = null;\n this.currentAbort = null;\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 programmingSuffix = this.programmingMode.getSystemPromptSuffix();\n if (programmingSuffix) {\n prompt += programmingSuffix;\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 if (this.userMemory) {\n const summary = this.userMemory.getSummary();\n prompt += `\\n\\nSecond Brain is ENABLED. You have a persistent, structured memory of ${summary.total} facts about this user.`;\n prompt += `\\nMemory types: identity, preference, goal, project, habit, decision, constraint, relationship, episode, reflection.`;\n prompt += `\\nRelevant memories are automatically injected before each message. You can reference them naturally (e.g. \"I remember you prefer TypeScript\").`;\n prompt += `\\nUsers can manage memory with: /memory (overview, search, pause learning, clear).`;\n if (summary.learningPaused) {\n prompt += `\\nLearning is currently PAUSED — no new memories will be extracted from conversations until resumed.`;\n }\n } else {\n prompt += '\\n\\nSecond Brain is DISABLED. Basic long-term memory (text search over facts) is still active.';\n }\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 const channel = manifest.sourceChannelType\n ? this.channels.get(manifest.sourceChannelType as ChannelType)\n : this.channels.getNotificationChannel();\n\n if (channel && manifest.sourceChannelType !== 'internal') {\n const skillInfo = manifest.skillName ? ` (${manifest.skillName})` : '';\n await channel.send(\n ` Scheduled task started${skillInfo}: ${manifest.description}\\nAll actions auto-approved for this run.`,\n manifest.sourceChannelId,\n ).catch(() => {});\n }\n\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 if (this.userMemory) {\n try {\n const consolidation = this.userMemory.consolidate();\n if (consolidation.profileUpdated || consolidation.reflectionCount > 0) {\n logger.info({ consolidation }, 'Second brain consolidated');\n }\n\n const pruning = this.userMemory.prune();\n if (pruning.activePruned > 0 || pruning.durablePruned > 0 || pruning.promoted > 0) {\n logger.info({ pruning }, 'Second brain pruned');\n }\n } catch (err) {\n logger.warn({ err }, 'Second brain heartbeat error');\n }\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 extractMemory(userMessage: string, agentResponse: string): Promise<void> {\n if (!this.userMemory) return;\n if (this.userMemory.isLearningPaused()) return;\n\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(800)) return;\n\n try {\n const provider = this.providers.getDefault();\n const result = await generateText({\n model: provider.getModelInstance(),\n system: `You extract structured memory from conversations. Read the conversation and output a JSON array of memory candidates. Each candidate has: type (one of: identity, preference, goal, project, habit, decision, constraint, relationship, episode), summary (concise fact, 12-220 chars), detail (optional longer explanation), evidenceKind (direct for explicitly stated facts, inferred for patterns you notice), confidence (0.0-1.0), importance (0.0-1.0), durability (0.0-1.0). Extract 0-3 candidates. Only extract specific, durable, user-specific information. Do NOT extract trivial observations, greetings, or assistant behavior. Output pure JSON array, no markdown.`,\n messages: [\n { role: 'user', content: `User: ${userMessage}\\nAssistant: ${agentResponse}` },\n ],\n maxOutputTokens: 400,\n });\n\n this.tokenBudget.recordUsage({\n provider: provider.name,\n model: provider.getModel(),\n inputTokens: result.usage?.inputTokens ?? 0,\n outputTokens: result.usage?.outputTokens ?? 0,\n totalTokens: (result.usage?.inputTokens ?? 0) + (result.usage?.outputTokens ?? 0),\n channelType: 'internal',\n });\n\n const text = result.text.trim();\n if (!text) return;\n\n let candidates: Array<{\n type: string;\n summary: string;\n detail?: string;\n evidenceKind?: string;\n confidence: number;\n importance: number;\n durability: number;\n }>;\n\n try {\n const jsonStr = text.replace(/^```(?:json)?\\s*/i, '').replace(/\\s*```$/, '');\n candidates = JSON.parse(jsonStr);\n } catch {\n const facts = text\n .split('\\n')\n .map(l => l.replace(/^-\\s*/, '').trim())\n .filter(f => f.length > 10 && f.length < 200);\n candidates = facts.slice(0, 3).map(f => ({\n type: 'preference',\n summary: f,\n confidence: 0.75,\n importance: 0.7,\n durability: 0.7,\n evidenceKind: 'inferred',\n }));\n }\n\n const validTypes = ['identity', 'preference', 'goal', 'project', 'habit', 'decision', 'constraint', 'relationship', 'episode'];\n const typed = candidates\n .filter(c => c.summary && c.summary.length >= 12 && c.summary.length <= 220)\n .filter(c => validTypes.includes(c.type))\n .map(c => ({\n type: c.type as any,\n summary: c.summary,\n detail: c.detail,\n evidenceKind: (c.evidenceKind === 'direct' ? 'direct' : 'inferred') as 'direct' | 'inferred',\n confidence: Math.min(1, Math.max(0, c.confidence ?? 0.7)),\n importance: Math.min(1, Math.max(0, c.importance ?? 0.7)),\n durability: Math.min(1, Math.max(0, c.durability ?? 0.7)),\n }));\n\n if (typed.length > 0) {\n const remembered = this.userMemory.remember(typed, 'conversation');\n if (remembered.length > 0) {\n logger.info({ count: remembered.length, types: remembered.map(r => r.type) }, 'Second brain memories stored');\n }\n }\n } catch (err) {\n logger.warn({ err }, 'Memory extraction error');\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.supervisor) {\n await this.supervisor.haltAll();\n }\n this.backgroundTasks.destroy();\n await this.sleep();\n logger.info('Mercury has shut down');\n }\n\n setSpotifyClient(client: SpotifyClient): void {\n this.spotifyClient = client;\n }\n\n async presentChoice(question: string, choices: string[], channelId: string, channelType: string): Promise<string> {\n const channel = this.channels.get(channelType as any);\n\n if (channelType === 'cli' && channel instanceof CLIChannel) {\n const options: ArrowSelectOption[] = choices.map((label, i) => ({\n value: String(i),\n label,\n }));\n\n try {\n const selected = await channel.withMenu(async (select) => {\n return select(question, options);\n });\n if (selected === undefined) return choices[0];\n const index = parseInt(selected, 10);\n return isNaN(index) ? choices[0] : choices[index];\n } catch {\n return choices[0];\n }\n }\n\n if (channelType === 'telegram' && channel instanceof TelegramChannel) {\n const { InlineKeyboard } = await import('grammy');\n const kb = new InlineKeyboard();\n for (let i = 0; i < choices.length; i++) {\n const callbackData = `choice_${Date.now()}_${i}`;\n kb.text(choices[i].slice(0, 60), callbackData);\n if (i < choices.length - 1 && (i + 1) % 2 === 0) {\n kb.row();\n }\n }\n\n return new Promise<string>((resolve) => {\n const timeout = setTimeout(() => {\n (channel as any).pendingApprovals?.delete(`choice_timeout_${question}`);\n resolve(choices[0]);\n }, 120000);\n\n channel.send(question, channelId).catch(() => {});\n\n const tgBot = (channel as any).bot;\n if (tgBot) {\n const chatId = channelId.startsWith('telegram:')\n ? Number(channelId.split(':')[1])\n : Number(channelId);\n\n tgBot.api.sendMessage(chatId, question, { reply_markup: kb }).catch(() => {});\n\n const handler = async (ctx: any) => {\n const data = ctx.callbackQuery?.data;\n if (!data || !data.startsWith('choice_')) return;\n const parts = data.split('_');\n if (parts.length < 3) return;\n const index = parseInt(parts[2], 10);\n if (isNaN(index)) return;\n clearTimeout(timeout);\n try { await ctx.answerCallbackQuery(); } catch {}\n resolve(choices[index]);\n };\n\n if ((channel as any).pendingCallbacks) {\n (channel as any).pendingCallbacks.push(handler);\n }\n }\n });\n }\n\n await channel?.send(`${question}\\n${choices.map((c, i) => ` ${i + 1}. ${c}`).join('\\n')}`, channelId).catch(() => {});\n return choices[0];\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.startsWith('/bg')) {\n const args = trimmed.slice('/bg'.length).trim();\n await this.handleBgCommand(args, { content: trimmed, channelId, channelType: channelType as any, id: Date.now().toString(36), senderId: 'user', timestamp: Date.now() }, channel);\n return true;\n }\n\n if (cmd === '/exit' || cmd === '/quit') {\n await channel.send('Goodbye! Shutting down Mercury...', channelId);\n this.shutdown();\n return true;\n }\n\n if (cmd === '/permissions') {\n if (channelType === 'cli' && channel instanceof CLIChannel) {\n const mode = await channel.askPermissionMode?.();\n if (mode === 'allow-all') {\n this.capabilities.permissions.setAutoApproveAll(true);\n this.capabilities.permissions.addTempScope('/', true, true);\n await channel.send('Allow All mode active for this session. All scopes, commands, and loops auto-approved. Resets on restart.', channelId);\n } else {\n this.capabilities.permissions.setAutoApproveAll(false);\n await channel.send('Ask Me mode active. Risky actions will prompt for confirmation.', channelId);\n }\n return true;\n }\n await channel.send('Use /permissions in CLI to switch permission mode. On Telegram, use the /permissions button or command.', 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 === '/models' || cmd === '/model' || cmd.startsWith('/models ') || cmd.startsWith('/model ')) {\n const base = cmd.startsWith('/model ') || cmd === '/model' ? '/model' : '/models';\n const rawArgs = trimmed.slice(base.length).trim();\n const activeProviders = getActiveProviders(this.config);\n const current = this.providers.getDefault();\n\n if (!rawArgs) {\n const lines = [\n '**Session Models**',\n '',\n ...activeProviders.map((p) => {\n const marker = p.name === current.name ? ' ← current' : '';\n return `• ${p.name} · ${p.model}${marker}`;\n }),\n '',\n 'Use `/models use <provider>` to switch for this session.',\n 'Use `mercury doctor` to add/configure models.',\n ];\n await channel.send(lines.join('\\n'), channelId);\n\n if (channelType === 'cli' && channel instanceof CLIChannel && activeProviders.length > 1) {\n const choices = [\n ...activeProviders.map((p) => `${p.name} · ${p.model}${p.name === current.name ? ' (current)' : ''}`),\n 'Open doctor instructions',\n 'Keep current model',\n ];\n const picked = await this.presentChoice('Switch session model?', choices, channelId, channelType);\n if (picked === 'Open doctor instructions') {\n await channel.send('Run `mercury doctor` and update provider/model settings. Then restart Mercury to persist defaults.', channelId);\n return true;\n }\n if (picked === 'Keep current model') return true;\n const providerName = picked.split(' · ')[0].trim();\n if (providerName && providerName !== current.name) {\n const switched = this.switchSessionProvider(providerName);\n await channel.send(switched.message, channelId);\n }\n }\n return true;\n }\n\n if (rawArgs === 'doctor' || rawArgs === 'add') {\n await channel.send('Use `mercury doctor` to add/configure models. Then use `/models` to switch active session model.', channelId);\n return true;\n }\n\n const target = rawArgs.replace(/^use\\s+/i, '').trim();\n if (!target) {\n await channel.send('Usage: `/models` or `/models use <provider>`', channelId);\n return true;\n }\n\n const switched = this.switchSessionProvider(target);\n await channel.send(switched.message, channelId);\n return true;\n }\n\n if (cmd === '/memory') {\n if (!this.userMemory) {\n await channel.send('Second brain is not enabled.', channelId);\n return true;\n }\n\n if (channelType === 'cli' && channel instanceof CLIChannel) {\n await this.openCliMemoryMenu(channel, channelId);\n return true;\n }\n\n await this.sendMemoryOverview(channel, 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.startsWith('/code')) {\n const rawArgs = trimmed.slice('/code'.length).trim().toLowerCase();\n const cliChannel = channelType === 'cli' && channel instanceof CLIChannel ? channel : null;\n\n if (!rawArgs) {\n if (cliChannel) {\n const choice = await this.presentChoice(\n 'Code mode: open workspace IDE now?',\n ['Yes, open current workspace', 'No, keep classic coding mode'],\n channelId,\n channelType,\n );\n if (choice.toLowerCase().startsWith('yes')) {\n const current = this.capabilities.getCwd();\n const opened = cliChannel.openWorkspace(current);\n if (opened.ok) {\n this.capabilities.permissions.addTempScope(current, true, true);\n this.programmingMode.setExecute();\n this.programmingMode.setProjectContext(current);\n cliChannel.setProgrammingStatus(this.programmingMode.getState(), this.programmingMode.getProjectContext());\n await channel.send(`${opened.message}\\nWorkspace IDE mode enabled.`, channelId);\n return true;\n }\n await channel.send(opened.message, channelId);\n return true;\n }\n }\n await channel.send(this.programmingMode.getStatusText(), channelId);\n return true;\n }\n\n if (rawArgs === 'status') {\n await channel.send(this.programmingMode.getStatusText(), channelId);\n return true;\n }\n\n if (rawArgs === 'workspace' || rawArgs === 'ws') {\n if (!cliChannel) {\n await channel.send('Workspace IDE mode is currently available in CLI only.', channelId);\n return true;\n }\n const current = this.capabilities.getCwd();\n const opened = cliChannel.openWorkspace(current);\n if (opened.ok) {\n this.programmingMode.setExecute();\n cliChannel.setProgrammingStatus(this.programmingMode.getState(), this.programmingMode.getProjectContext());\n await channel.send(`${opened.message}\\nWorkspace IDE mode enabled.`, channelId);\n } else {\n await channel.send(opened.message, channelId);\n }\n return true;\n }\n\n if (rawArgs === 'plan') {\n this.programmingMode.setPlan();\n if (cliChannel) cliChannel.setProgrammingStatus(this.programmingMode.getState(), this.programmingMode.getProjectContext());\n await channel.send('Programming mode: **Plan**\\nI will explore, analyze, and present a plan before writing any code. Use `/code execute` to switch to execution.', channelId);\n return true;\n }\n\n if (rawArgs === 'execute' || rawArgs === 'exec') {\n this.programmingMode.setExecute();\n if (cliChannel) cliChannel.setProgrammingStatus(this.programmingMode.getState(), this.programmingMode.getProjectContext());\n await channel.send('Programming mode: **Execute**\\nI will implement the plan step by step, verifying with builds/tests. Use `/code off` to exit.', channelId);\n return true;\n }\n\n if (rawArgs === 'build') {\n this.programmingMode.setExecute();\n if (cliChannel) cliChannel.setProgrammingStatus(this.programmingMode.getState(), this.programmingMode.getProjectContext());\n await channel.send('Programming mode: **Build**\\nExecution mode is active for implementation/build tasks.', channelId);\n return true;\n }\n\n if (rawArgs.startsWith('agent ') || rawArgs.startsWith('delegate ')) {\n if (!this.supervisor) {\n await channel.send('Sub-agents are not enabled in this environment.', channelId);\n return true;\n }\n const taskDescription = rawArgs.replace(/^(agent|delegate)\\s+/, '').trim();\n if (!taskDescription) {\n await channel.send('Usage: `/code agent <task>`', channelId);\n return true;\n }\n const cwd = this.capabilities.getCwd();\n const agentId = await this.supervisor.spawn({\n task: taskDescription,\n sourceChannelId: channelId,\n sourceChannelType: channelType as any,\n workingDirectory: cwd,\n });\n const bgId = this.backgroundTasks.spawnAgent(taskDescription, cwd, agentId);\n this.syncBgTasksToTui();\n await channel.send(`Started coding sub-agent ${agentId} in background task ${bgId}. Use /bg ${bgId} for progress.`, channelId);\n return true;\n }\n\n if (rawArgs === 'off' || rawArgs === 'exit') {\n this.programmingMode.setOff();\n if (cliChannel) cliChannel.setProgrammingStatus(this.programmingMode.getState(), this.programmingMode.getProjectContext());\n await channel.send('Programming mode: **Off**\\nBack to normal conversation mode.', channelId);\n return true;\n }\n\n if (rawArgs === 'toggle') {\n const newState = this.programmingMode.toggle();\n const labels: Record<string, string> = { off: 'Off', plan: 'Plan', execute: 'Execute' };\n if (cliChannel) cliChannel.setProgrammingStatus(this.programmingMode.getState(), this.programmingMode.getProjectContext());\n await channel.send(`Programming mode: **${labels[newState]}**`, channelId);\n return true;\n }\n\n await channel.send('Unknown /code command. Available: /code, /code plan, /code execute, /code build, /code workspace, /code agent <task>, /code off, /code toggle', channelId);\n return true;\n }\n\n if (cmd.startsWith('/ws') || cmd.startsWith('/workspace')) {\n const cliChannel = channelType === 'cli' && channel instanceof CLIChannel ? channel : null;\n if (!cliChannel) {\n await channel.send('Workspace IDE mode is currently available in CLI only.', channelId);\n return true;\n }\n\n const base = cmd.startsWith('/workspace') ? '/workspace' : '/ws';\n const rawArgs = trimmed.slice(base.length).trim();\n const rawLower = rawArgs.toLowerCase();\n\n if (!rawArgs || rawLower === 'status') {\n const ws = cliChannel.getWorkspace();\n await channel.send(ws?.active ? `Workspace active: ${ws.rootPath}` : 'No active workspace. Use `/ws open <path>`.', channelId);\n return true;\n }\n\n if (rawLower.startsWith('open ')) {\n const target = rawArgs.slice(5).trim();\n const opened = cliChannel.openWorkspace(target);\n if (opened.ok) {\n this.capabilities.setCwd(path.resolve(target.replace(/^~(?=$|\\/)/, process.env.HOME || '~')));\n this.capabilities.permissions.addTempScope(this.capabilities.getCwd(), true, true);\n this.programmingMode.setExecute();\n this.programmingMode.setProjectContext(this.capabilities.getCwd());\n cliChannel.setProgrammingStatus(this.programmingMode.getState(), this.programmingMode.getProjectContext());\n await channel.send(`${opened.message}\\nWorkspace IDE is ready.`, channelId);\n } else {\n await channel.send(opened.message, channelId);\n }\n return true;\n }\n\n if (rawLower === 'refresh') {\n cliChannel.refreshWorkspace();\n await channel.send('Workspace refreshed.', channelId);\n return true;\n }\n\n if (rawLower.startsWith('stage ')) {\n const fileArg = rawArgs.slice(6).trim();\n const result = cliChannel.stageWorkspaceFile(fileArg || 'all');\n await channel.send(result.message, channelId);\n return true;\n }\n\n if (rawLower.startsWith('commit ')) {\n const message = rawArgs.slice(7).trim();\n const result = cliChannel.commitWorkspace(message);\n await channel.send(result.message, channelId);\n return true;\n }\n\n if (rawLower.startsWith('undo ')) {\n const fileArg = rawArgs.slice(5).trim();\n const result = cliChannel.undoWorkspaceFile(fileArg);\n await channel.send(result.message, channelId);\n return true;\n }\n\n if (rawLower === 'help') {\n await channel.send('Workspace commands:\\n`/ws open <path>`\\n`/ws refresh`\\n`/ws stage <file|all>`\\n`/ws commit <message>`\\n`/ws undo <file>`\\n`/ws status`', channelId);\n return true;\n }\n\n await channel.send('Unknown workspace command. Use `/ws help`.', channelId);\n return true;\n }\n\n if (cmd.startsWith('/spotify')) {\n if (!this.spotifyClient) {\n await channel.send('Spotify is not connected. Set SPOTIFY_CLIENT_ID and SPOTIFY_CLIENT_SECRET in your config, then run /spotify auth.', channelId);\n return true;\n }\n const rawArgs = trimmed.slice('/spotify'.length).trim().toLowerCase();\n\n if (!rawArgs || rawArgs === 'status') {\n const auth = this.spotifyClient.isAuthenticated() ? 'Connected' : 'Not connected';\n const device = this.spotifyClient.getDeviceId() || 'none';\n\n let accountName = this.spotifyClient.getAccountName();\n let accountId = this.spotifyClient.getAccountId();\n let product = this.spotifyClient.getProduct();\n let accountError = '';\n\n if (!accountName) {\n try {\n await this.spotifyClient.saveAccountInfo();\n accountName = this.spotifyClient.getAccountName();\n accountId = this.spotifyClient.getAccountId();\n product = this.spotifyClient.getProduct();\n } catch (err: any) {\n accountError = err.message;\n logger.warn({ err: err.message }, 'Failed to fetch Spotify account info');\n }\n }\n\n let premium = this.spotifyClient.getPremiumStatus();\n if (premium === null) {\n premium = await this.spotifyClient.checkPremium();\n }\n\n let status = `Spotify: **${auth}**`;\n if (accountName) status += `\\nAccount: **${accountName}**`;\n if (accountId) status += `\\nUser ID: ${accountId}`;\n if (product) status += `\\nPlan: ${product}`;\n if (premium === true) {\n status += ' — all features available';\n } else if (premium === false) {\n status += ' — playback control requires Premium';\n }\n if (accountError) status += `\\n⚠ Could not verify account: ${accountError}`;\n status += `\\nDevice: ${device !== 'none' ? device : 'none selected'}`;\n await channel.send(status, channelId);\n return true;\n }\n\n if (rawArgs === 'auth') {\n if (channelType === 'cli' && channel instanceof CLIChannel) {\n try {\n const choice = await channel.withMenu(async (select) => {\n return select('Spotify Authorization', [\n { value: 'browser', label: 'Open browser (recommended)' },\n { value: 'manual', label: 'Paste authorization code manually' },\n { value: 'cancel', label: 'Cancel' },\n ]);\n });\n if (!choice || choice === 'cancel') {\n await channel.send('Spotify auth cancelled.', channelId);\n return true;\n }\n if (choice === 'manual') {\n const authUrl = this.spotifyClient.getAuthUrl();\n await channel.send('1. Open this URL in your browser:\\n' + authUrl + '\\n\\n2. After authorizing, you will be redirected to localhost — it may show an error page, that is OK.\\n3. Copy the `code` parameter from the URL in your browser address bar.\\n4. Paste it below:', channelId);\n const code = await channel.prompt('Authorization code: ');\n if (!code || !code.trim()) {\n await channel.send('No code provided. Auth cancelled.', channelId);\n return true;\n }\n await this.spotifyClient.authenticateWithCode(code.trim());\n await channel.send('Spotify connected successfully! Try: play some music', channelId);\n } else {\n await channel.send('Opening browser for Spotify authorization...', channelId);\n await this.spotifyClient.authenticate();\n await channel.send('Spotify connected successfully! Try: play some music', channelId);\n }\n } catch (err: any) {\n await channel.send(`Spotify auth failed: ${err.message}`, channelId);\n }\n } else {\n const authUrl = this.spotifyClient.getAuthUrl();\n await channel.send(\n '**Connect Spotify**\\n\\n1. Open this URL on any device with a browser:\\n' + authUrl + '\\n\\n2. After authorizing, you will be redirected to localhost — that page may show an error, that is OK.\\n3. Copy the `code` from the URL, then type:\\n`/spotify code <paste-code-here>`',\n channelId\n );\n }\n return true;\n }\n\n if (rawArgs.startsWith('code ')) {\n const code = rawArgs.slice('code '.length).trim();\n if (!code) {\n await channel.send('Usage: /spotify code <authorization-code>', channelId);\n return true;\n }\n try {\n await this.spotifyClient.authenticateWithCode(code);\n await channel.send('Spotify connected successfully! Try: play some music', channelId);\n } catch (err: any) {\n await channel.send(`Spotify auth failed: ${err.message}`, channelId);\n }\n return true;\n }\n\n if (rawArgs === 'devices') {\n try {\n const data = await this.spotifyClient.getDevices();\n if (!data?.devices?.length) { await channel.send('No active devices. Open Spotify on a device first.', channelId); return true; }\n const lines = ['**Spotify Devices:**\\n'];\n for (const d of data.devices) {\n lines.push(`${d.is_active ? '▶' : '○'} **${d.name}** (${d.type}) — \\`${d.id}\\`${d.is_active ? ' [active]' : ''}`);\n }\n await channel.send(lines.join('\\n'), channelId);\n } catch (err: any) { await channel.send(`Failed: ${err.message}`, channelId); }\n return true;\n }\n\n if (rawArgs.startsWith('device ')) {\n const id = rawArgs.slice('device '.length).trim();\n this.spotifyClient.setDevice(id);\n await channel.send(`Active device set to: ${id}`, channelId);\n return true;\n }\n\n if (rawArgs === 'player' && channelType === 'cli' && channel instanceof CLIChannel) {\n await channel.withMenu(async (select) => {\n while (true) {\n try {\n const np = await this.spotifyClient!.getCurrentlyPlaying();\n if (np) {\n await channel.send(formatNowPlaying(np), channelId);\n }\n } catch {}\n const action = await select('Spotify Player', PLAYER_CONTROLS);\n if (action === 'exit' || !action) return;\n if (action === 'search') {\n const query = await channel.prompt('Search: ');\n if (!query) continue;\n try {\n const results = await this.spotifyClient!.search(query, 'track', 5);\n const tracks = results?.tracks?.items || [];\n if (tracks.length === 0) { await channel.send('No results found.', channelId); continue; }\n const trackOptions = tracks.map((t: any, i: number) => ({\n value: t.uri,\n label: `${t.artists?.map((a: any) => a.name).join(', ')} — ${t.name}`,\n }));\n const picked = await select('Play which track?', [...trackOptions, { value: 'back', label: 'Back' }]);\n if (picked && picked !== 'back') {\n await this.spotifyClient!.play([picked]);\n }\n } catch (err: any) { await channel.send(`Search failed: ${err.message}`, channelId); }\n continue;\n }\n if (action === 'volume') {\n const vol = await channel.prompt('Volume (0-100): ');\n const n = parseInt(vol, 10);\n if (!isNaN(n) && n >= 0 && n <= 100) {\n await this.spotifyClient!.setVolume(n);\n await channel.send(`Volume: ${n}%`, channelId);\n }\n continue;\n }\n if (action === 'queue') {\n const query = await channel.prompt('Search track to queue: ');\n if (!query) continue;\n try {\n const results = await this.spotifyClient!.search(query, 'track', 5);\n const tracks = results?.tracks?.items || [];\n if (tracks.length === 0) { await channel.send('No results.', channelId); continue; }\n const trackOptions = tracks.map((t: any) => ({\n value: t.uri,\n label: `${t.artists?.map((a: any) => a.name).join(', ')} — ${t.name}`,\n }));\n const picked = await select('Queue which track?', [...trackOptions, { value: 'back', label: 'Back' }]);\n if (picked && picked !== 'back') {\n await this.spotifyClient!.addToQueue(picked);\n await channel.send('Added to queue.', channelId);\n }\n } catch (err: any) { await channel.send(`Failed: ${err.message}`, channelId); }\n continue;\n }\n try {\n const result = await handlePlayerAction(action, this.spotifyClient!);\n await channel.send(result, channelId);\n } catch (err: any) {\n await channel.send(`Failed: ${err.message}`, channelId);\n }\n }\n });\n return true;\n }\n\n if (rawArgs === 'now' || rawArgs === 'playing' || rawArgs === 'np') {\n try {\n const text = await this.spotifyClient.getNowPlayingText();\n await channel.send(text, channelId);\n } catch (err: any) { await channel.send(`Failed: ${err.message}`, channelId); }\n return true;\n }\n\n if (rawArgs === 'logout') {\n this.spotifyClient.logout();\n await channel.send('Spotify disconnected. Run `/spotify auth` to reconnect.', channelId);\n return true;\n }\n\n await channel.send('Unknown /spotify command. Available: /spotify, /spotify auth, /spotify code <code>, /spotify logout, /spotify player, /spotify devices, /spotify device <id>, /spotify now', channelId);\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 if (cmd.startsWith('/agents')) {\n if (!this.supervisor) {\n await channel.send('Sub-agents are not available.', channelId);\n return true;\n }\n const rawArgs = trimmed.slice('/agents'.length).trim();\n\n if (!rawArgs) {\n const agents = this.supervisor.getActiveAgents();\n const resourceInfo = this.supervisor.getResourceUsage();\n if (agents.length === 0) {\n await channel.send(`No active sub-agents.\\nMax concurrent: ${resourceInfo.maxConcurrentAgents} (auto) | CPU: ${resourceInfo.cpuCores} cores`, channelId);\n return true;\n }\n const statusIcons: Record<string, string> = { pending: '🔵', running: '🟢', paused: '🟡', completed: '✅', failed: '❌', halted: '⛔' };\n const lines = [`**Sub-Agents** (${agents.length})`, ''];\n for (const agent of agents) {\n const icon = statusIcons[agent.status] || '❓';\n const taskPreview = agent.task.length > 40 ? agent.task.slice(0, 40) + '...' : agent.task;\n lines.push(`${icon} **${agent.id}** ${taskPreview}`);\n if (agent.progress) lines.push(` ${agent.progress}`);\n }\n lines.push('');\n lines.push(`Max concurrent: ${resourceInfo.maxConcurrentAgents} (auto) | CPU: ${resourceInfo.cpuCores} cores`);\n lines.push(`Active: ${resourceInfo.activeAgents} | Queued: ${resourceInfo.queuedAgents}`);\n await channel.send(lines.join('\\n'), channelId);\n return true;\n }\n\n const parts = rawArgs.split(/\\s+/);\n const action = parts[0]?.toLowerCase();\n\n if (action === 'stop') {\n const target = parts[1]?.toLowerCase();\n if (!target) {\n await channel.send('Usage: /agents stop <id> or /agents stop all', channelId);\n return true;\n }\n if (target === 'all') {\n await this.supervisor.haltAll();\n await channel.send('All sub-agents halted. They will finish their current tool step before stopping.', channelId);\n } else {\n const halted = await this.supervisor.halt(target);\n if (!halted) {\n await channel.send(`No active agent found with ID \"${target}\".`, channelId);\n } else {\n await channel.send(`Agent ${target} halt signal sent. It will finish its current step then stop.`, channelId);\n }\n }\n return true;\n }\n\n if (action === 'pause') {\n const target = parts[1]?.toLowerCase();\n if (!target) {\n await channel.send('Usage: /agents pause <id>', channelId);\n return true;\n }\n const paused = await this.supervisor.pause(target);\n await channel.send(paused ? `Agent ${target} paused. Use /agents resume ${target} to continue.` : `No running agent found with ID \"${target}\".`, channelId);\n return true;\n }\n\n if (action === 'resume') {\n const target = parts[1]?.toLowerCase();\n if (!target) {\n await channel.send('Usage: /agents resume <id>', channelId);\n return true;\n }\n const resumed = await this.supervisor.resume(target);\n await channel.send(resumed ? `Agent ${target} resumed.` : `No paused agent found with ID \"${target}\".`, channelId);\n return true;\n }\n\n if (action === 'config') {\n const info = this.supervisor.getResourceUsage();\n const lines = [\n '**Sub-Agent Configuration**',\n `CPU cores: ${info.cpuCores}`,\n `System RAM: ${info.systemMemoryMB}MB`,\n `Available RAM: ${info.availableMemoryMB}MB`,\n `Max concurrent: ${info.maxConcurrentAgents}`,\n `Active agents: ${info.activeAgents}`,\n `Queued agents: ${info.queuedAgents}`,\n `Token budget remaining: ${info.tokenBudgetRemaining.toLocaleString()}`,\n ];\n await channel.send(lines.join('\\n'), channelId);\n return true;\n }\n\n if (action === 'set' && parts[1]?.toLowerCase() === 'max') {\n const n = parseInt(parts[2], 10);\n if (isNaN(n) || n < 1) {\n await channel.send('Usage: /agents set max <number>', channelId);\n return true;\n }\n this.supervisor.setMaxConcurrent(n);\n await channel.send(`Max concurrent sub-agents set to ${n}.`, channelId);\n return true;\n }\n\n await channel.send(`Unknown /agents command \"${action}\". Available: /agents, /agents stop <id|all>, /agents pause <id>, /agents resume <id>, /agents config, /agents set max <n>`, channelId);\n return true;\n }\n\n if (cmd === '/halt') {\n if (!this.supervisor) {\n await channel.send('Sub-agents are not available.', channelId);\n return true;\n }\n await this.supervisor.haltAll();\n await channel.send('All sub-agents halted and queue cleared.', channelId);\n return true;\n }\n\n if (cmd === '/stop') {\n if (!this.supervisor) {\n await channel.send('Sub-agents are not available.', channelId);\n return true;\n }\n await this.supervisor.haltAll();\n this.supervisor.clearTaskBoard();\n this.lifecycle.transition('idle');\n await channel.send('All sub-agents stopped, queue cleared, locks released, task board cleared. Short-term memory preserved.', channelId);\n return true;\n }\n\n if (cmd === '/reset') {\n if (channelType === 'cli' && channel instanceof CLIChannel) {\n const confirmed = await channel.askToContinue(\n '⚠ /reset will halt ALL agents, clear queues, release locks, clear task board, and wipe conversation context. Continue? (y/n)',\n channelId,\n ).catch(() => false);\n if (!confirmed) {\n await channel.send('Reset cancelled.', channelId);\n return true;\n }\n }\n if (this.supervisor) {\n await this.supervisor.haltAll();\n this.supervisor.clearTaskBoard();\n }\n this.shortTerm.clearAll();\n this.lifecycle.transition('idle');\n await channel.send('Mercury reset. All agents stopped, all state cleared. Long-term memory preserved. Ready for a fresh start.', channelId);\n return true;\n }\n\n return false;\n }\n\n private async handleWorkspaceNaturalLanguage(content: string, channelType: string, channelId: string): Promise<boolean> {\n const channel = this.channels.get(channelType as any);\n if (!channel || channelType !== 'cli' || !(channel instanceof CLIChannel)) return false;\n\n const trimmed = content.trim();\n const commandMatch = trimmed.match(/^(?:open|use|enter)\\s+workspace(?:\\s+(.+))?$/i);\n if (!commandMatch) return false;\n\n const targetRaw = (commandMatch[1] || '').trim();\n const target = targetRaw || this.capabilities.getCwd();\n const opened = channel.openWorkspace(target);\n if (!opened.ok) {\n await channel.send(opened.message, channelId);\n return true;\n }\n\n const resolved = path.resolve(target.replace(/^~(?=$|\\/)/, process.env.HOME || '~'));\n this.capabilities.setCwd(resolved);\n this.capabilities.permissions.addTempScope(resolved, true, true);\n this.programmingMode.setExecute();\n this.programmingMode.setProjectContext(resolved);\n channel.setProgrammingStatus(this.programmingMode.getState(), this.programmingMode.getProjectContext());\n await channel.send(`Workspace opened from conversation intent: ${resolved}`, channelId);\n return true;\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 permLabel = this.capabilities.permissions.isAutoApproveAll() ? 'Switch to Ask Me' : 'Switch to Allow All';\n const action = await select('Mercury Commands', [\n { value: 'status', label: 'Status' },\n { value: 'memory', label: 'Memory' },\n { value: 'permissions', label: permLabel },\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 === 'memory') {\n if (this.userMemory) {\n await this.openCliMemoryMenu(channel, channelId, select);\n } else {\n await channel.send('Second brain is not enabled.', channelId);\n }\n continue;\n }\n\n if (action === 'permissions') {\n await this.handleChatCommand('/permissions', '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 sendMemoryOverview(channel: any, channelId: string): Promise<void> {\n if (!this.userMemory) return;\n const summary = this.userMemory.getSummary();\n const lines = [\n `**Memory Overview**`,\n `Total memories: ${summary.total}`,\n `Learning: ${summary.learningPaused ? 'PAUSED' : 'ACTIVE'}`,\n ];\n if (summary.profileSummary) {\n lines.push(`Profile: ${summary.profileSummary}`);\n }\n if (summary.activeSummary) {\n lines.push(`Active: ${summary.activeSummary}`);\n }\n const typeEntries = Object.entries(summary.byType);\n if (typeEntries.length > 0) {\n lines.push('');\n lines.push('By type:');\n for (const [type, count] of typeEntries) {\n lines.push(` ${type}: ${count}`);\n }\n }\n await channel.send(lines.join('\\n'), channelId);\n }\n\n private async openCliMemoryMenu(channel: CLIChannel, channelId: string, select?: (title: string, options: ArrowSelectOption[]) => Promise<string>): Promise<void> {\n if (!this.userMemory) return;\n\n const runMenu = async (sel: (title: string, options: ArrowSelectOption[]) => Promise<string>) => {\n while (true) {\n const learningLabel = this.userMemory!.isLearningPaused() ? 'Resume Learning' : 'Pause Learning';\n const action = await sel('Memory', [\n { value: 'overview', label: 'Overview' },\n { value: 'recent', label: 'Recent Memories' },\n { value: 'search', label: 'Search' },\n { value: 'toggle', label: learningLabel },\n { value: 'clear', label: 'Clear All Memories' },\n { value: 'back', label: 'Back' },\n ]);\n\n if (action === 'back') return;\n\n if (action === 'overview') {\n await this.sendMemoryOverview(channel, channelId);\n continue;\n }\n\n if (action === 'recent') {\n const recent = this.userMemory!.getRecent(10);\n if (recent.length === 0) {\n await channel.send('No memories yet.', channelId);\n continue;\n }\n const lines = ['**Recent Memories:**', ''];\n for (const r of recent) {\n const scope = r.scope === 'active' ? '⏳' : '📌';\n const kind = r.evidenceKind === 'direct' ? 'direct' : r.evidenceKind === 'inferred' ? 'inferred' : r.evidenceKind;\n lines.push(`${scope} [${r.type}] ${r.summary}`);\n lines.push(` Confidence: ${r.confidence.toFixed(2)} | Evidence: ${kind} | Seen: ${r.evidenceCount}x`);\n }\n await channel.send(lines.join('\\n'), channelId);\n continue;\n }\n\n if (action === 'search') {\n const query = await channel.prompt('Search memories: ');\n if (!query) continue;\n const results = this.userMemory!.search(query, 10);\n if (results.length === 0) {\n await channel.send(`No memories found matching \"${query}\".`, channelId);\n continue;\n }\n const lines = [`**Search results for \"${query}\":**`, ''];\n for (const r of results) {\n const scope = r.scope === 'active' ? '⏳' : '📌';\n lines.push(`${scope} [${r.type}] ${r.summary}`);\n lines.push(` Confidence: ${r.confidence.toFixed(2)} | Evidence: ${r.evidenceKind} | Seen: ${r.evidenceCount}x`);\n }\n await channel.send(lines.join('\\n'), channelId);\n continue;\n }\n\n if (action === 'toggle') {\n const currentlyPaused = this.userMemory!.isLearningPaused();\n this.userMemory!.setLearningPaused(!currentlyPaused);\n await channel.send(currentlyPaused ? 'Learning resumed. Mercury will remember new things from conversations.' : 'Learning paused. Mercury will not store new memories until resumed.', channelId);\n continue;\n }\n\n if (action === 'clear') {\n const confirm = await sel('Clear all memories?', [\n { value: 'cancel', label: 'Cancel' },\n { value: 'confirm', label: 'Clear everything' },\n ]);\n if (confirm === 'confirm') {\n const cleared = this.userMemory!.clear();\n await channel.send(`Cleared ${cleared} memories.`, channelId);\n }\n continue;\n }\n }\n };\n\n if (select) {\n await runMenu(select);\n } else {\n await channel.withMenu(runMenu);\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 { from: 'idle', to: 'delegating' },\n { from: 'delegating', to: 'idle' },\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 { logger } from '../utils/logger.js';\n\nexport type ProgrammingModeState = 'off' | 'plan' | 'execute';\n\nexport class ProgrammingMode {\n private state: ProgrammingModeState = 'off';\n private projectContext: string | null = null;\n\n getState(): ProgrammingModeState {\n return this.state;\n }\n\n isActive(): boolean {\n return this.state !== 'off';\n }\n\n isPlan(): boolean {\n return this.state === 'plan';\n }\n\n isExecute(): boolean {\n return this.state === 'execute';\n }\n\n setPlan(): void {\n this.state = 'plan';\n logger.info('Programming mode: plan');\n }\n\n setExecute(): void {\n this.state = 'execute';\n logger.info('Programming mode: execute');\n }\n\n setOff(): void {\n this.state = 'off';\n this.projectContext = null;\n logger.info('Programming mode: off');\n }\n\n toggle(): ProgrammingModeState {\n if (this.state === 'off') {\n this.state = 'plan';\n } else if (this.state === 'plan') {\n this.state = 'execute';\n } else {\n this.state = 'off';\n }\n logger.info({ state: this.state }, 'Programming mode toggled');\n return this.state;\n }\n\n setProjectContext(context: string): void {\n this.projectContext = context;\n }\n\n getProjectContext(): string | null {\n return this.projectContext;\n }\n\n getStatusText(): string {\n const stateLabels: Record<ProgrammingModeState, string> = {\n off: 'Off',\n plan: 'Plan',\n execute: 'Execute',\n };\n let text = `Programming mode: ${stateLabels[this.state]}`;\n if (this.projectContext) {\n text += ` | Project: ${this.projectContext}`;\n }\n return text;\n }\n\n getSystemPromptSuffix(): string {\n if (this.state === 'off') return '';\n\n let suffix = '\\n\\n**PROGRAMMING MODE IS ACTIVE**';\n\n if (this.state === 'plan') {\n suffix += '\\nMode: PLAN';\n suffix += '\\nYou are in planning mode. Explore the codebase, analyze the problem, and present a step-by-step implementation plan.';\n suffix += '\\nDo NOT write code yet. Present your plan using numbered steps.';\n suffix += '\\nWhen multiple approaches exist, use the ask_user tool to present choices.';\n suffix += '\\nWait for user approval before switching to execution.';\n } else if (this.state === 'execute') {\n suffix += '\\nMode: EXECUTE';\n suffix += '\\nYou are in execution mode. Implement the plan step by step.';\n suffix += '\\nRun builds/tests after each significant change.';\n suffix += '\\nCommit at logical checkpoints.';\n suffix += '\\nDelegate independent subtasks to sub-agents when possible.';\n }\n\n if (this.projectContext) {\n suffix += `\\nProject context: ${this.projectContext}`;\n }\n\n return suffix;\n }\n}","import { spawn, type ChildProcess } from 'node:child_process';\nimport { logger } from '../utils/logger.js';\n\nexport type BgTaskType = 'shell' | 'agent';\nexport type BgTaskStatus = 'running' | 'completed' | 'failed' | 'timed_out' | 'cancelled';\n\nexport interface BackgroundTask {\n id: string;\n type: BgTaskType;\n command?: string;\n task?: string;\n cwd: string;\n status: BgTaskStatus;\n pid?: number;\n agentId?: string;\n startedAt: number;\n completedAt?: number;\n exitCode: number | null;\n stdout: string;\n stderr: string;\n timeoutMs: number;\n}\n\nexport interface BackgroundTaskSummary {\n id: string;\n type: BgTaskType;\n command?: string;\n task?: string;\n status: BgTaskStatus;\n startedAt: number;\n completedAt?: number;\n exitCode: number | null;\n outputPreview: string;\n runningMs?: number;\n}\n\nconst MAX_OUTPUT = 1024 * 1024;\nconst MAX_TASKS = 20;\nconst PRUNE_AGE_MS = 60 * 60 * 1000;\nconst SIGTERM_GRACE_MS = 3000;\nconst MAX_PREVIEW = 200;\nconst DEFAULT_SHELL_TIMEOUT_MS = 0;\n\nlet taskCounter = 0;\n\nfunction nextId(): string {\n return `bg-${++taskCounter}`;\n}\n\nfunction tailTruncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n return str.slice(str.length - maxLen);\n}\n\nexport type TaskCompleteCallback = (task: BackgroundTask) => void;\n\nexport class BackgroundTaskManager {\n private tasks: Map<string, BackgroundTask> = new Map();\n private processes: Map<string, ChildProcess> = new Map();\n private timeouts: Map<string, ReturnType<typeof setTimeout>> = new Map();\n private sigkillTimeouts: Map<string, ReturnType<typeof setTimeout>> = new Map();\n private onCompleteCallbacks: Map<string, TaskCompleteCallback> = new Map();\n private globalOnComplete?: TaskCompleteCallback;\n private pruneInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor() {\n this.pruneInterval = setInterval(() => this.prune(), 5 * 60 * 1000);\n }\n\n destroy(): void {\n if (this.pruneInterval) {\n clearInterval(this.pruneInterval);\n this.pruneInterval = null;\n }\n for (const [id, child] of this.processes) {\n try { child.kill('SIGTERM'); } catch {}\n }\n for (const [, t] of this.timeouts) {\n clearTimeout(t);\n }\n for (const [, t] of this.sigkillTimeouts) {\n clearTimeout(t);\n }\n }\n\n onGlobalComplete(cb: TaskCompleteCallback): void {\n this.globalOnComplete = cb;\n }\n\n spawnShell(command: string, cwd: string, timeoutMs: number = DEFAULT_SHELL_TIMEOUT_MS): string {\n this.enforceTaskLimit();\n\n const id = nextId();\n const task: BackgroundTask = {\n id,\n type: 'shell',\n command,\n cwd,\n status: 'running',\n pid: undefined,\n startedAt: Date.now(),\n exitCode: null,\n stdout: '',\n stderr: '',\n timeoutMs,\n };\n this.tasks.set(id, task);\n\n try {\n const child = spawn(command, [], {\n cwd,\n shell: true,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n task.pid = child.pid ?? undefined;\n this.processes.set(id, child);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n task.stdout += chunk.toString();\n if (task.stdout.length > MAX_OUTPUT) {\n task.stdout = tailTruncate(task.stdout, MAX_OUTPUT);\n }\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n task.stderr += chunk.toString();\n if (task.stderr.length > MAX_OUTPUT) {\n task.stderr = tailTruncate(task.stderr, MAX_OUTPUT);\n }\n });\n\n child.on('error', (err) => {\n task.stderr += `\\nProcess error: ${err.message}`;\n this.completeTask(id, null, 'failed');\n });\n\n child.on('exit', (code) => {\n this.completeTask(id, code, code === 0 ? 'completed' : 'failed');\n });\n\n if (timeoutMs > 0) {\n const timeout = setTimeout(() => {\n this.killTask(id, 'SIGTERM');\n const sigkillTimeout = setTimeout(() => {\n this.killTask(id, 'SIGKILL');\n }, SIGTERM_GRACE_MS);\n this.sigkillTimeouts.set(id, sigkillTimeout);\n\n if (task.status === 'running') {\n task.status = 'timed_out';\n this.completeTask(id, null, 'timed_out');\n }\n }, timeoutMs);\n this.timeouts.set(id, timeout);\n }\n\n logger.info({ taskId: id, command, cwd }, 'Background shell task started');\n } catch (err: any) {\n task.status = 'failed';\n task.stderr = `Failed to spawn: ${err.message}`;\n task.completedAt = Date.now();\n task.exitCode = null;\n }\n\n return id;\n }\n\n spawnAgent(taskDescription: string, cwd: string, agentId: string): string {\n this.enforceTaskLimit();\n\n const id = nextId();\n const task: BackgroundTask = {\n id,\n type: 'agent',\n task: taskDescription,\n cwd,\n status: 'running',\n agentId,\n startedAt: Date.now(),\n exitCode: null,\n stdout: '',\n stderr: '',\n timeoutMs: 0,\n };\n this.tasks.set(id, task);\n logger.info({ taskId: id, agentId, task: taskDescription }, 'Background agent task started');\n return id;\n }\n\n updateAgentProgress(bgTaskId: string, progress: string): void {\n const task = this.tasks.get(bgTaskId);\n if (!task || task.type !== 'agent') return;\n task.stdout += progress + '\\n';\n if (task.stdout.length > MAX_OUTPUT) {\n task.stdout = tailTruncate(task.stdout, MAX_OUTPUT);\n }\n }\n\n completeAgentTask(bgTaskId: string, exitCode: number | null, status: BgTaskStatus, output?: string): void {\n const task = this.tasks.get(bgTaskId);\n if (!task) return;\n if (output) {\n task.stdout = output;\n }\n this.completeTask(bgTaskId, exitCode, status);\n }\n\n cancel(taskId: string): boolean {\n const task = this.tasks.get(taskId);\n if (!task) return false;\n if (task.status !== 'running') return false;\n\n if (task.type === 'shell') {\n this.killTask(taskId, 'SIGTERM');\n const sigkill = setTimeout(() => {\n this.killTask(taskId, 'SIGKILL');\n }, SIGTERM_GRACE_MS);\n this.sigkillTimeouts.set(taskId, sigkill);\n }\n\n task.status = 'cancelled';\n task.completedAt = Date.now();\n task.exitCode = null;\n this.clearTimeouts(taskId);\n this.notifyComplete(task);\n logger.info({ taskId }, 'Background task cancelled');\n return true;\n }\n\n get(taskId: string): BackgroundTask | undefined {\n return this.tasks.get(taskId);\n }\n\n getSummary(taskId: string): BackgroundTaskSummary | undefined {\n const task = this.tasks.get(taskId);\n if (!task) return undefined;\n return this.toSummary(task);\n }\n\n getAll(): BackgroundTask[] {\n return [...this.tasks.values()];\n }\n\n getAllSummaries(): BackgroundTaskSummary[] {\n return [...this.tasks.values()].map(this.toSummary);\n }\n\n getRunning(): BackgroundTask[] {\n return [...this.tasks.values()].filter(t => t.status === 'running');\n }\n\n getRunningSummaries(): BackgroundTaskSummary[] {\n return this.getRunning().map(this.toSummary);\n }\n\n registerComplete(taskId: string, cb: TaskCompleteCallback): void {\n this.onCompleteCallbacks.set(taskId, cb);\n }\n\n prune(): number {\n const now = Date.now();\n let pruned = 0;\n for (const [id, task] of this.tasks) {\n if (task.status === 'running') continue;\n if (task.completedAt && (now - task.completedAt) > PRUNE_AGE_MS) {\n this.tasks.delete(id);\n pruned++;\n }\n }\n if (pruned > 0) {\n logger.info({ pruned }, 'Pruned completed background tasks');\n }\n return pruned;\n }\n\n clearCompleted(): number {\n let cleared = 0;\n for (const [id, task] of this.tasks) {\n if (task.status !== 'running') {\n this.tasks.delete(id);\n cleared++;\n }\n }\n return cleared;\n }\n\n getByAgentId(agentId: string): BackgroundTask | undefined {\n for (const task of this.tasks.values()) {\n if (task.agentId === agentId) return task;\n }\n return undefined;\n }\n\n private completeTask(id: string, exitCode: number | null, status: BgTaskStatus): void {\n const task = this.tasks.get(id);\n if (!task) return;\n if (task.status !== 'running' && task.status !== 'timed_out') return;\n\n task.exitCode = exitCode;\n task.status = status;\n task.completedAt = Date.now();\n this.clearTimeouts(id);\n this.processes.delete(id);\n\n logger.info({ taskId: id, status, exitCode }, 'Background task completed');\n this.notifyComplete(task);\n }\n\n private notifyComplete(task: BackgroundTask): void {\n const cb = this.onCompleteCallbacks.get(task.id);\n if (cb) {\n try { cb(task); } catch {}\n this.onCompleteCallbacks.delete(task.id);\n }\n if (this.globalOnComplete) {\n try { this.globalOnComplete(task); } catch {}\n }\n }\n\n private killTask(id: string, signal: NodeJS.Signals): void {\n const child = this.processes.get(id);\n if (child) {\n try { child.kill(signal); } catch {}\n }\n }\n\n private clearTimeouts(id: string): void {\n const t = this.timeouts.get(id);\n if (t) { clearTimeout(t); this.timeouts.delete(id); }\n const s = this.sigkillTimeouts.get(id);\n if (s) { clearTimeout(s); this.sigkillTimeouts.delete(id); }\n }\n\n private enforceTaskLimit(): void {\n const completed = [...this.tasks.values()]\n .filter(t => t.status !== 'running')\n .sort((a, b) => (a.completedAt ?? 0) - (b.completedAt ?? 0));\n\n while (this.tasks.size >= MAX_TASKS && completed.length > 0) {\n const oldest = completed.shift();\n if (oldest) {\n this.tasks.delete(oldest.id);\n }\n }\n }\n\n private toSummary(task: BackgroundTask): BackgroundTaskSummary {\n const combined = task.stdout + '\\n' + task.stderr;\n const preview = combined.trim().slice(-MAX_PREVIEW);\n return {\n id: task.id,\n type: task.type,\n command: task.command,\n task: task.task,\n status: task.status,\n startedAt: task.startedAt,\n completedAt: task.completedAt,\n exitCode: task.exitCode,\n outputPreview: preview,\n runningMs: task.status === 'running' ? Date.now() - task.startedAt : undefined,\n };\n }\n}","import React from 'react';\nimport { render } from 'ink';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport type { ChannelMessage } from '../types/channel.js';\nimport { BaseChannel, type PermissionMode } from './base.js';\nimport { logger } from '../utils/logger.js';\nimport { formatToolStep, formatToolResult } from '../utils/tool-label.js';\nimport type { ChatMessage, ToolStep, PermissionPromptState, SidebarSection, SkillInfo, SubAgentInfo, ProviderInfo, TokenInfo, AppMode, WorkspaceState, WorkspaceTreeNode, WorkspaceGitFile, BackgroundTaskInfo } from '../ui/types.js';\nimport { TuiApp } from '../ui/App.js';\n\nexport interface TuiState {\n mode: AppMode;\n viewMode: 'balanced' | 'detailed';\n chatMessages: ChatMessage[];\n toolSteps: ToolStep[];\n isThinking: boolean;\n permissionPrompt: PermissionPromptState | null;\n agentName: string;\n version: string;\n provider: ProviderInfo | null;\n tokenInfo: TokenInfo | null;\n skills: SkillInfo[];\n subAgents: SubAgentInfo[];\n sidebarSections: SidebarSection[];\n programmingMode: import('../core/programming-mode.js').ProgrammingModeState;\n projectContext: string | null;\n permissionMode: PermissionMode;\n workspace: WorkspaceState | null;\n backgroundTasks: BackgroundTaskInfo[];\n}\n\nconst defaultState: TuiState = {\n mode: 'splash',\n viewMode: 'balanced',\n chatMessages: [],\n toolSteps: [],\n isThinking: false,\n permissionPrompt: null,\n agentName: 'Mercury',\n version: '1.1.5',\n provider: null,\n tokenInfo: null,\n skills: [],\n subAgents: [],\n sidebarSections: [],\n programmingMode: 'off',\n projectContext: null,\n permissionMode: 'ask-me',\n workspace: null,\n backgroundTasks: [],\n};\n\nexport class CLIChannel extends BaseChannel {\n readonly type = 'cli' as const;\n private agentName: string;\n private inkInstance: ReturnType<typeof render> | null = null;\n private inputHandler: ((text: string) => void) | null = null;\n private exitHandler: (() => void) | null = null;\n private permissionResolver: ((value: string | boolean) => void) | null = null;\n private menuDepth = 0;\n private menuAbortController: AbortController | null = null;\n private stepCount = 0;\n private stepStartTime = 0;\n private state: TuiState = { ...defaultState };\n private spotifyClient: any = null;\n private rawModeWatchdog: NodeJS.Timeout | null = null;\n\n constructor(agentName: string = 'Mercury') {\n super();\n this.agentName = agentName;\n this.state.agentName = agentName;\n }\n\n setAgentName(name: string): void {\n this.agentName = name;\n this.update({ agentName: name });\n }\n\n async start(): Promise<void> {\n this.ready = true;\n logger.info('CLI channel started (Ink TUI)');\n }\n\n async stop(): Promise<void> {\n this.stopRawModeWatchdog();\n this.inkInstance?.unmount();\n this.inkInstance = null;\n this.releaseRawMode();\n this.ready = false;\n }\n\n private ensureRawMode(): void {\n if (!process.stdin.isTTY) return;\n const stdin = process.stdin as NodeJS.ReadStream;\n if (typeof stdin.setRawMode !== 'function') return;\n try {\n stdin.setRawMode(true);\n stdin.resume();\n } catch {\n // Ignore transient raw mode failures.\n }\n }\n\n private releaseRawMode(): void {\n if (!process.stdin.isTTY) return;\n const stdin = process.stdin as NodeJS.ReadStream;\n if (typeof stdin.setRawMode !== 'function') return;\n try {\n stdin.setRawMode(false);\n } catch {\n // Ignore teardown failures.\n }\n }\n\n private startRawModeWatchdog(): void {\n this.stopRawModeWatchdog();\n this.ensureRawMode();\n this.rawModeWatchdog = setInterval(() => {\n if (!this.inkInstance) return;\n this.ensureRawMode();\n }, 250);\n }\n\n private stopRawModeWatchdog(): void {\n if (this.rawModeWatchdog) {\n clearInterval(this.rawModeWatchdog);\n this.rawModeWatchdog = null;\n }\n }\n\n private update(partial: Partial<TuiState>): void {\n this.state = { ...this.state, ...partial };\n this.rerender();\n }\n\n private rerender(): void {\n if (!this.inkInstance) return;\n this.inkInstance.rerender(\n React.createElement(TuiApp, {\n state: this.state,\n onInput: (text: string) => { this.inputHandler?.(text); },\n onPermissionResolve: (value: string | boolean) => {\n if (this.permissionResolver) {\n this.permissionResolver(value);\n this.permissionResolver = null;\n }\n this.update({ permissionPrompt: null });\n },\n onExit: () => {\n this.stopRawModeWatchdog();\n this.inkInstance?.unmount();\n this.inkInstance = null;\n this.releaseRawMode();\n this.exitHandler?.();\n },\n spotifyClient: this.spotifyClient,\n }),\n );\n }\n\n mountTUI(onInput: (text: string) => void, spotifyClient?: any, onExit?: () => void): void {\n this.spotifyClient = spotifyClient ?? null;\n this.exitHandler = onExit ?? null;\n\n this.inputHandler = (text: string) => {\n const trimmed = text.trim();\n if (trimmed === '/chat' || trimmed === '/c') {\n this.update({ mode: 'chat' });\n return;\n }\n if (trimmed === '/coding') {\n this.update({ mode: 'coding' });\n return;\n }\n if (trimmed === '/workspace' || trimmed === '/ws') {\n this.update({ mode: this.state.workspace?.active ? 'workspace' : 'coding' });\n return;\n }\n if (trimmed === '/ws up') {\n this.moveWorkspaceSelection(-1);\n return;\n }\n if (trimmed === '/ws down') {\n this.moveWorkspaceSelection(1);\n return;\n }\n if (trimmed === '/ws open-selected') {\n this.toggleOrSelectWorkspaceNode();\n return;\n }\n if (trimmed === '/ws exit' || trimmed === '/workspace exit' || trimmed === '/general') {\n this.exitWorkspaceToChat();\n return;\n }\n if (trimmed === '/ws close-file') {\n this.closeWorkspaceFile();\n return;\n }\n if (trimmed === '/ws collapse') {\n this.collapseWorkspaceNode();\n return;\n }\n if (trimmed === '/ws expand') {\n this.expandWorkspaceNode();\n return;\n }\n if (trimmed === '/menu' || trimmed === '/m') {\n this.update({ mode: 'menu' });\n return;\n }\n if (trimmed === '/spotify' || trimmed === '/s') {\n this.update({ mode: 'spotify' });\n return;\n }\n if (trimmed === '/splash') {\n this.update({ mode: 'splash' });\n return;\n }\n if (trimmed === '/view balanced') {\n this.update({ viewMode: 'balanced' });\n return;\n }\n if (trimmed === '/view detailed') {\n this.update({ viewMode: 'detailed' });\n return;\n }\n if (trimmed === '/view toggle' || trimmed === '/view') {\n this.update({ viewMode: this.state.viewMode === 'balanced' ? 'detailed' : 'balanced' });\n return;\n }\n onInput(trimmed);\n };\n\n this.inkInstance = render(\n React.createElement(TuiApp, {\n state: this.state,\n onInput: (text: string) => { this.inputHandler?.(text); },\n onPermissionResolve: (value: string | boolean) => {\n if (this.permissionResolver) {\n this.permissionResolver(value);\n this.permissionResolver = null;\n }\n this.update({ permissionPrompt: null });\n },\n onExit: () => {\n this.stopRawModeWatchdog();\n this.inkInstance?.unmount();\n this.inkInstance = null;\n this.releaseRawMode();\n this.exitHandler?.();\n },\n spotifyClient: this.spotifyClient,\n }),\n { exitOnCtrlC: false, patchConsole: false },\n );\n\n this.startRawModeWatchdog();\n }\n\n async send(content: string, _targetId?: string, _elapsedMs?: number): Promise<void> {\n const msg: ChatMessage = {\n id: Date.now().toString(36) + Math.random().toString(36).slice(2, 6),\n role: 'agent',\n content,\n timestamp: Date.now(),\n };\n this.update({\n chatMessages: [...this.state.chatMessages, msg],\n isThinking: false,\n });\n }\n\n async sendFile(filePath: string, _targetId?: string): Promise<void> {\n const fs = await import('node:fs');\n const path = await import('node:path');\n const resolved = path.resolve(filePath);\n let content = '';\n if (!fs.existsSync(resolved)) {\n content = `File not found: ${filePath}`;\n } else {\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 content = `path: ${resolved}\\nsize: ${sizeStr}`;\n }\n const msg: ChatMessage = {\n id: Date.now().toString(36) + Math.random().toString(36).slice(2, 6),\n role: 'agent',\n content,\n timestamp: Date.now(),\n };\n this.update({\n chatMessages: [...this.state.chatMessages, msg],\n });\n }\n\n async sendToolFeedback(toolName: string, args: Record<string, any>): Promise<void> {\n const label = formatToolStep(toolName, args);\n const step: ToolStep = {\n id: `step-${Date.now()}-${this.stepCount}`,\n toolName,\n label,\n status: 'running',\n };\n this.stepCount += 1;\n this.stepStartTime = Date.now();\n this.update({\n toolSteps: [...this.state.toolSteps, step],\n isThinking: true,\n });\n }\n\n sendStepDone(toolName: string, result: unknown): void {\n const toolSteps = this.state.toolSteps.map((step) => {\n if (step.status === 'running') {\n const elapsed = this.stepStartTime ? (Date.now() - this.stepStartTime) / 1000 : 0;\n const summary = formatToolResult(toolName, result);\n return { ...step, status: 'done' as const, elapsed, result: summary || undefined };\n }\n return step;\n });\n this.update({ toolSteps });\n }\n\n async stream(content: AsyncIterable<string>, _targetId?: string): Promise<string> {\n const msgId = Date.now().toString(36) + Math.random().toString(36).slice(2, 6);\n let full = '';\n let lastRender = 0;\n\n const initialMsg: ChatMessage = {\n id: msgId,\n role: 'agent',\n content: '',\n timestamp: Date.now(),\n streaming: true,\n };\n\n this.update({\n chatMessages: [...this.state.chatMessages, initialMsg],\n isThinking: true,\n });\n\n for await (const chunk of content) {\n full += chunk;\n const now = Date.now();\n if (now - lastRender >= 16) {\n this.update({\n chatMessages: this.state.chatMessages.map((m) =>\n m.id === msgId ? { ...m, content: full, streaming: true } : m,\n ),\n });\n lastRender = now;\n }\n }\n\n this.update({\n chatMessages: this.state.chatMessages.map((m) =>\n m.id === msgId ? { ...m, content: full, streaming: false } : m,\n ),\n isThinking: false,\n });\n\n return full;\n }\n\n async typing(_targetId?: string): Promise<void> {\n this.update({ isThinking: true });\n }\n\n showPrompt(): void {}\n\n async withMenu<T>(runner: (select: (title: string, options: Array<{ value: string; label: string }>) => Promise<string>) => Promise<T>): Promise<T | undefined> {\n this.menuDepth += 1;\n const { selectWithArrowKeys } = await import('../utils/arrow-select.js');\n this.menuAbortController = new AbortController();\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 Error && error.name === '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 this.ensureRawMode();\n }\n }\n\n private closeActiveMenu(): void {\n if (!this.menuAbortController?.signal.aborted) {\n this.menuAbortController?.abort();\n }\n }\n\n async prompt(question: string): Promise<string> {\n return new Promise((resolve) => {\n this.permissionResolver = (val) => resolve(String(val));\n this.update({\n permissionPrompt: {\n type: 'ask',\n message: question,\n resolve: () => {},\n },\n });\n });\n }\n\n async askPermissionMode(): Promise<PermissionMode> {\n if (!process.stdout.isTTY) return 'ask-me';\n\n return new Promise((resolve) => {\n this.permissionResolver = (val) => resolve(val as PermissionMode);\n this.update({\n permissionPrompt: {\n type: 'mode',\n message: 'Choose how Mercury handles risky actions this session.',\n options: [\n { value: 'allow-all', label: 'Allow All — auto-approve everything (scopes, commands, loop continuation)' },\n { value: 'ask-me', label: 'Ask Me — confirm before file writes, shell commands, and scope changes' },\n ],\n resolve: () => {},\n },\n });\n });\n }\n\n async askPermission(prompt: string): Promise<string> {\n return new Promise((resolve) => {\n this.permissionResolver = (val) => resolve(String(val));\n this.update({\n permissionPrompt: {\n type: 'ask',\n message: prompt,\n options: [\n { value: 'yes', label: 'Yes — approve once' },\n { value: 'always', label: 'Always — remember this permission' },\n { value: 'no', label: 'No — deny' },\n ],\n resolve: () => {},\n },\n });\n });\n }\n\n async askToContinue(question: string, _targetId?: string): Promise<boolean> {\n return new Promise((resolve) => {\n this.permissionResolver = (val) => {\n const normalized = typeof val === 'string' ? val.trim().toLowerCase() : val;\n resolve(normalized === true || normalized === 'yes' || normalized === 'y');\n };\n this.update({\n permissionPrompt: {\n type: 'continue',\n message: question,\n options: [\n { value: 'yes', label: 'Yes — continue' },\n { value: 'no', label: 'No — stop' },\n ],\n resolve: () => {},\n },\n });\n });\n }\n\n clearPermissionPrompt(): void {\n this.update({ permissionPrompt: null });\n }\n\n setSkills(skills: SkillInfo[]): void {\n this.update({ skills });\n }\n\n setProvider(name: string, model: string, badge?: string): void {\n this.update({ provider: { name, model, badge } });\n }\n\n setTokenInfo(used: number, budget: number, percentage: number): void {\n this.update({ tokenInfo: { used, budget, percentage } });\n }\n\n setSubAgents(agents: SubAgentInfo[]): void {\n this.update({ subAgents: agents });\n }\n\n updateBackgroundTasks(tasks: BackgroundTaskInfo[]): void {\n this.update({ backgroundTasks: tasks });\n }\n\n setSidebarSections(sections: SidebarSection[]): void {\n this.update({ sidebarSections: sections });\n }\n\n setMode(mode: AppMode): void {\n this.update({ mode });\n }\n\n setProgrammingStatus(mode: import('../core/programming-mode.js').ProgrammingModeState, projectContext: string | null): void {\n this.update({ programmingMode: mode, projectContext });\n }\n\n openWorkspace(rawPath: string): { ok: boolean; message: string } {\n const target = path.resolve(rawPath.replace(/^~(?=$|\\/)/, process.env.HOME || '~'));\n if (!fs.existsSync(target)) return { ok: false, message: `Workspace path does not exist: ${target}` };\n if (!fs.statSync(target).isDirectory()) return { ok: false, message: `Workspace path is not a directory: ${target}` };\n\n const workspace = this.buildWorkspaceState(target, undefined, 'Workspace opened');\n this.update({ workspace, mode: 'workspace', projectContext: target });\n return { ok: true, message: `Workspace opened: ${target}` };\n }\n\n refreshWorkspace(): void {\n if (!this.state.workspace?.active) return;\n const selectedPath = this.state.workspace.selectedPath ?? undefined;\n const workspace = this.buildWorkspaceState(this.state.workspace.rootPath, selectedPath, 'Workspace refreshed');\n this.update({ workspace });\n }\n\n stageWorkspaceFile(filePath: string): { ok: boolean; message: string } {\n if (!this.state.workspace?.active) return { ok: false, message: 'No active workspace.' };\n const root = this.state.workspace.rootPath;\n try {\n const rel = filePath === 'all' ? '.' : filePath;\n execSync(`git add ${this.quoteArg(rel)}`, { cwd: root, stdio: 'pipe' });\n this.refreshWorkspace();\n return { ok: true, message: rel === '.' ? 'Staged all changes.' : `Staged: ${rel}` };\n } catch (err: any) {\n return { ok: false, message: `Stage failed: ${err?.message || String(err)}` };\n }\n }\n\n undoWorkspaceFile(filePath: string): { ok: boolean; message: string } {\n if (!this.state.workspace?.active) return { ok: false, message: 'No active workspace.' };\n const root = this.state.workspace.rootPath;\n try {\n execSync(`git checkout -- ${this.quoteArg(filePath)}`, { cwd: root, stdio: 'pipe' });\n this.refreshWorkspace();\n return { ok: true, message: `Reverted: ${filePath}` };\n } catch (err: any) {\n return { ok: false, message: `Undo failed: ${err?.message || String(err)}` };\n }\n }\n\n commitWorkspace(message: string): { ok: boolean; message: string } {\n if (!this.state.workspace?.active) return { ok: false, message: 'No active workspace.' };\n const root = this.state.workspace.rootPath;\n if (!message.trim()) return { ok: false, message: 'Commit message is required.' };\n const body = `${message.trim()}\\n\\nCo-authored-by: Mercury <mercury@cosmicstack.org>`;\n try {\n execSync(`git commit -m ${this.quoteArg(body)}`, { cwd: root, stdio: 'pipe' });\n this.refreshWorkspace();\n return { ok: true, message: 'Commit created with Mercury co-author.' };\n } catch (err: any) {\n return { ok: false, message: `Commit failed: ${err?.message || String(err)}` };\n }\n }\n\n getWorkspace(): WorkspaceState | null {\n return this.state.workspace;\n }\n\n private quoteArg(v: string): string {\n return `'${v.replace(/'/g, `'\\\\''`)}'`;\n }\n\n private moveWorkspaceSelection(delta: number): void {\n if (!this.state.workspace?.active) return;\n const next = Math.max(0, Math.min(this.state.workspace.nodes.length - 1, this.state.workspace.selectedIndex + delta));\n const node = this.state.workspace.nodes[next];\n this.update({\n workspace: {\n ...this.state.workspace,\n selectedIndex: next,\n selectedPath: node?.path || null,\n },\n });\n }\n\n private toggleOrSelectWorkspaceNode(): void {\n const ws = this.state.workspace;\n if (!ws?.active) return;\n const node = ws.nodes[ws.selectedIndex];\n if (!node) return;\n if (!node.isDir) {\n const preview = this.readFilePreview(node.path);\n this.update({ workspace: { ...ws, selectedPath: node.path, openedFilePath: node.path, openedFilePreview: preview, lastAction: `Opened file: ${node.path}` } });\n return;\n }\n const expanded = !node.expanded;\n this.rebuildWorkspaceWithExpansion(node.path, expanded);\n }\n\n private collapseWorkspaceNode(): void {\n const ws = this.state.workspace;\n if (!ws?.active) return;\n const node = ws.nodes[ws.selectedIndex];\n if (!node?.isDir) return;\n if (!node.expanded) return;\n this.rebuildWorkspaceWithExpansion(node.path, false);\n }\n\n private expandWorkspaceNode(): void {\n const ws = this.state.workspace;\n if (!ws?.active) return;\n const node = ws.nodes[ws.selectedIndex];\n if (!node?.isDir) return;\n if (node.expanded) return;\n this.rebuildWorkspaceWithExpansion(node.path, true);\n }\n\n private rebuildWorkspaceWithExpansion(nodePath: string, expand: boolean): void {\n const ws = this.state.workspace;\n if (!ws) return;\n const expandedSet = new Set(ws.nodes.filter((n) => n.isDir && n.expanded).map((n) => n.path));\n if (expand) expandedSet.add(nodePath);\n else expandedSet.delete(nodePath);\n const workspace = this.buildWorkspaceState(ws.rootPath, ws.selectedPath || undefined, ws.lastAction, expandedSet);\n this.update({ workspace });\n }\n\n private buildWorkspaceState(rootPath: string, selectedPath?: string, lastAction = '', preExpanded?: Set<string>): WorkspaceState {\n const expanded = preExpanded || new Set<string>([rootPath]);\n const nodes = this.buildTreeNodes(rootPath, expanded, 0);\n const selectedIndex = Math.max(0, nodes.findIndex((n) => n.path === selectedPath));\n const selectedNode = nodes[selectedIndex] || nodes[0] || null;\n const { files, branch, stagedCount, unstagedCount } = this.readGitState(rootPath);\n return {\n active: true,\n rootPath,\n nodes,\n selectedIndex,\n selectedPath: selectedNode?.path || null,\n openedFilePath: this.state.workspace?.openedFilePath || null,\n openedFilePreview: this.state.workspace?.openedFilePreview || [],\n gitFiles: files,\n stagedCount,\n unstagedCount,\n branch,\n lastAction,\n };\n }\n\n closeWorkspaceFile(): void {\n const ws = this.state.workspace;\n if (!ws?.active) return;\n this.update({ workspace: { ...ws, openedFilePath: null, openedFilePreview: [], lastAction: 'Closed file preview' } });\n }\n\n private exitWorkspaceToChat(): void {\n const ws = this.state.workspace;\n const nextWorkspace = ws ? { ...ws, active: false, lastAction: 'Exited workspace mode' } : null;\n this.update({\n mode: 'chat',\n workspace: nextWorkspace,\n programmingMode: 'off',\n projectContext: null,\n });\n }\n\n private readFilePreview(filePath: string): string[] {\n try {\n const raw = fs.readFileSync(filePath, 'utf-8');\n return raw.split('\\n').slice(0, 80);\n } catch {\n return ['(Unable to read file preview)'];\n }\n }\n\n private buildTreeNodes(dir: string, expanded: Set<string>, depth: number): WorkspaceTreeNode[] {\n const nodes: WorkspaceTreeNode[] = [];\n const id = `${dir}:${depth}`;\n const isExpanded = expanded.has(dir);\n nodes.push({ id, name: depth === 0 ? path.basename(dir) || dir : path.basename(dir), path: dir, depth, isDir: true, expanded: isExpanded });\n if (!isExpanded) return nodes;\n let entries: fs.Dirent[] = [];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return nodes;\n }\n const sorted = entries\n .filter((e) => e.name !== '.git' && e.name !== 'node_modules')\n .sort((a, b) => Number(b.isDirectory()) - Number(a.isDirectory()) || a.name.localeCompare(b.name));\n for (const entry of sorted.slice(0, 200)) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n nodes.push(...this.buildTreeNodes(full, expanded, depth + 1));\n } else {\n nodes.push({ id: `${full}:${depth + 1}`, name: entry.name, path: full, depth: depth + 1, isDir: false });\n }\n }\n return nodes;\n }\n\n private readGitState(rootPath: string): { files: WorkspaceGitFile[]; branch: string; stagedCount: number; unstagedCount: number } {\n try {\n const branch = execSync('git branch --show-current', { cwd: rootPath, stdio: 'pipe' }).toString().trim() || 'detached';\n const out = execSync('git status --porcelain', { cwd: rootPath, stdio: 'pipe' }).toString();\n const files: WorkspaceGitFile[] = out\n .split('\\n')\n .map((line) => line.trimEnd())\n .filter(Boolean)\n .map((line) => {\n const x = line[0] || ' ';\n const y = line[1] || ' ';\n const rel = line.slice(3).trim();\n const staged = x !== ' ' && x !== '?';\n const status = `${x}${y}`.trim() || '??';\n return { path: rel, staged, status };\n });\n const stagedCount = files.filter((f) => f.staged).length;\n const unstagedCount = files.length - stagedCount;\n return { files, branch, stagedCount, unstagedCount };\n } catch {\n return { files: [], branch: 'not-a-git-repo', stagedCount: 0, unstagedCount: 0 };\n }\n }\n\n initSplash(agentName: string, version: string): void {\n this.update({ agentName, version, mode: 'splash' });\n }\n\n sendUserMessage(content: string): void {\n const userMsg: ChatMessage = {\n id: Date.now().toString(36) + Math.random().toString(36).slice(2, 6),\n role: 'user',\n content,\n timestamp: Date.now(),\n };\n this.update({ chatMessages: [...this.state.chatMessages, userMsg] });\n this.emit({\n id: userMsg.id,\n channelId: 'cli',\n channelType: 'cli',\n senderId: 'owner',\n content,\n timestamp: userMsg.timestamp,\n });\n }\n}\n","import type { ChannelType, ChannelMessage } from '../types/channel.js';\n\nexport type PermissionMode = 'allow-all' | 'ask-me';\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 askPermissionMode?(): Promise<PermissionMode>;\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 { 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}\n\nexport function formatToolResult(toolName: string, result: unknown): string {\n if (result == null) return '';\n const str = typeof result === 'string' ? result : JSON.stringify(result);\n if (!str) return '';\n\n if (str.startsWith('Error') || str.startsWith('⚠')) {\n const first = str.split('\\n')[0];\n return first.length > 80 ? first.slice(0, 77) + '…' : first;\n }\n\n const RESULT_HINTS: Record<string, (s: string) => string> = {\n read_file: (s) => `${s.split('\\n').length} lines`,\n write_file: (s) => s.startsWith('Success') ? 'saved' : trimFirst(s),\n create_file: (s) => s.startsWith('Success') ? 'created' : trimFirst(s),\n edit_file: (s) => s.startsWith('Success') ? 'edited' : trimFirst(s),\n delete_file: (s) => s.startsWith('Success') ? 'deleted' : trimFirst(s),\n list_dir: (s) => {\n const entries = s.split('\\n').filter(Boolean).length;\n return `${entries} entries`;\n },\n run_command: (s) => {\n if (s.includes('exited with code')) return s.split('\\n')[0];\n const lines = s.split('\\n').filter(Boolean).length;\n return lines <= 1 ? trimFirst(s) : `${lines} lines output`;\n },\n fetch_url: () => 'fetched',\n git_status: (s) => `${s.split('\\n').filter(Boolean).length} lines`,\n git_diff: (s) => `${s.split('\\n').filter(Boolean).length} lines`,\n git_log: (s) => `${s.split('\\n').filter(Boolean).length} commits`,\n git_add: () => 'staged',\n git_commit: () => 'committed',\n git_push: () => 'pushed',\n create_pr: (s) => s.includes('created') ? 'created' : trimFirst(s),\n review_pr: (s) => `${s.split('\\n').filter(Boolean).length} lines`,\n list_issues: (s) => `${s.split('\\n').filter(Boolean).length} issues`,\n create_issue: (s) => s.includes('created') ? 'created' : trimFirst(s),\n github_api: (s) => `${s.split('\\n').filter(Boolean).length} lines`,\n send_message: () => 'sent',\n send_file: () => 'sent',\n use_skill: (s) => trimFirst(s),\n schedule_task: (s) => trimFirst(s),\n cancel_task: () => 'cancelled',\n list_tasks: (s) => `${s.split('\\n').filter(Boolean).length} tasks`,\n budget_status: () => 'reported',\n approve_scope: () => 'approved',\n approve_command: () => 'approved',\n cd: () => 'changed',\n list_skills: (s) => `${s.split('\\n').filter(Boolean).length} skills`,\n install_skill: (s) => trimFirst(s),\n };\n\n const hint = RESULT_HINTS[toolName];\n if (hint) return hint(str);\n return trimFirst(str);\n}\n\nfunction trimFirst(s: string): string {\n const first = s.split('\\n')[0];\n return first.length > 80 ? first.slice(0, 77) + '…' : first;\n}","import React from 'react';\nimport { Box, Text, useApp, useInput } from 'ink';\nimport type { TuiState } from '../channels/cli.js';\nimport type { AppMode, ChatMessage, ToolStep, SubAgentInfo, PermissionPromptState, SidebarSection, BackgroundTaskInfo } from './types.js';\nimport type { PermissionMode } from '../channels/base.js';\nimport type { ProgrammingModeState } from '../core/programming-mode.js';\nimport { renderMarkdown } from '../utils/markdown.js';\nimport { PLAYER_CONTROLS, formatNowPlaying } from '../spotify/ui.js';\nimport type { SpotifyClient } from '../spotify/client.js';\nimport type { SubAgentStatus } from '../types/agent.js';\n\nconst MERCURY_LOGO = [\n ' __ _____________ ________ ________ __',\n ' / |/ / ____/ __ \\\\/ ____/ / / / __ \\\\/ < /',\n ' / /|_/ / __/ / /_/ / / / / / / /_/ /\\\\ / ',\n ' / / / / /___/ _, _/ /___/ /_/ / _, _/ / / ',\n '/_/ /_/_____/_/ |_|\\\\____/\\\\____/_/ |_| /_/ ',\n];\n\nconst MERCURY_MARK = [\n ' ╭─╮ ╭─╮',\n ' ╭─╯ ╰─────╯ ╰─╮',\n ' ╭─╯ ╰─╮',\n ' │ ● ● │',\n ' │ ◡ │',\n ' │ │',\n ' ╰─╮ ╭─╯',\n ' ╰─────╮ ╭─────╯',\n ' │ │',\n ' ─┼───┼─',\n ' │ │',\n];\n\nconst IS_LIGHT_BG = (() => {\n const fgBg = process.env.COLORFGBG;\n if (!fgBg) return false;\n const parts = fgBg.split(';');\n const bgCode = Number(parts[parts.length - 1]);\n if (Number.isNaN(bgCode)) return false;\n return bgCode >= 10;\n})();\n\nconst BRAND = IS_LIGHT_BG\n ? { logo: 'blue', title: 'blue', subtitle: 'gray', accent: 'magenta' }\n : { logo: 'cyan', title: 'cyan', subtitle: 'gray', accent: 'magenta' };\n\nconst STATUS_ICONS: Record<string, { icon: string; color: string }> = {\n pending: { icon: '🔵', color: 'blue' },\n running: { icon: '🟢', color: 'green' },\n paused: { icon: '🟡', color: 'yellow' },\n completed: { icon: '✅', color: 'green' },\n failed: { icon: '❌', color: 'red' },\n halted: { icon: '⛔', color: 'red' },\n};\n\nfunction canRenderInlineAlbumArt(): boolean {\n if (process.env.MERCURY_SPOTIFY_ART !== '1') return false;\n if (process.env.CI === 'true') return false;\n if (process.env.SSH_CONNECTION || process.env.SSH_TTY) return false;\n return process.env.TERM_PROGRAM === 'iTerm.app';\n}\n\nasync function buildItermInlineImage(url: string): Promise<string> {\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Album art fetch failed: ${response.status}`);\n const contentType = response.headers.get('content-type') || 'image/jpeg';\n const data = Buffer.from(await response.arrayBuffer()).toString('base64');\n return `\\u001b]1337;File=inline=1;width=24;height=12;preserveAspectRatio=1;type=${contentType}:${data}\\u0007`;\n}\n\nexport interface TuiAppProps {\n state: TuiState;\n onInput: (text: string) => void;\n onPermissionResolve: (value: string | boolean) => void;\n onExit: () => void;\n spotifyClient?: SpotifyClient | null;\n}\n\nexport function TuiApp({ state, onInput, onPermissionResolve, onExit, spotifyClient }: TuiAppProps) {\n const { exit } = useApp();\n const [input, setInput] = React.useState('');\n const [permIdx, setPermIdx] = React.useState(0);\n const permIdxRef = React.useRef(0);\n const [menuIdx, setMenuIdx] = React.useState(0);\n const [spotifyIdx, setSpotifyIdx] = React.useState(6);\n const [splashPhase, setSplashPhase] = React.useState<'logo' | 'skills' | 'provider' | 'ready'>('logo');\n const [skillsLoaded, setSkillsLoaded] = React.useState(0);\n const [showStartupDetails, setShowStartupDetails] = React.useState(false);\n const [spotifyNow, setSpotifyNow] = React.useState('');\n const [spotifyStatus, setSpotifyStatus] = React.useState('');\n const [spotifyVolume, setSpotifyVolume] = React.useState<number | null>(null);\n const [spotifyArtUrl, setSpotifyArtUrl] = React.useState<string | null>(null);\n const [spotifyArtAnsi, setSpotifyArtAnsi] = React.useState<string>('');\n const albumArtCache = React.useRef<Map<string, string>>(new Map());\n const [inputHistory, setInputHistory] = React.useState<string[]>([]);\n const [historyIndex, setHistoryIndex] = React.useState<number>(-1);\n const [historyDraft, setHistoryDraft] = React.useState<string>('');\n const [workspacePane, setWorkspacePane] = React.useState<'files' | 'details' | 'git'>('files');\n const [detailCursor, setDetailCursor] = React.useState(0);\n const [gitCursor, setGitCursor] = React.useState(0);\n\n const slashCommands = React.useMemo(() => [\n '/help',\n '/status',\n '/menu',\n '/chat',\n '/code',\n '/code plan',\n '/code execute',\n '/code build',\n '/code workspace',\n '/code off',\n '/spotify',\n '/budget',\n '/permissions',\n '/memory',\n '/models',\n '/models use ',\n '/agents',\n '/bg',\n '/bg current',\n '/bg list',\n '/bg cancel ',\n '/bg clear',\n '/view',\n '/view balanced',\n '/view detailed',\n '/ws',\n '/ws open ',\n '/ws exit',\n '/ws refresh',\n '/ws stage all',\n '/ws commit ',\n '/ws help',\n ], []);\n\n const slashSuggestions = React.useMemo(() => {\n if (!input.startsWith('/')) return [];\n const q = input.toLowerCase();\n return slashCommands.filter((cmd) => cmd.startsWith(q)).slice(0, 5);\n }, [input, slashCommands]);\n \n\n React.useEffect(() => {\n if (state.mode !== 'splash') return;\n if (splashPhase === 'logo') {\n const t = setTimeout(() => setSplashPhase('skills'), 80);\n return () => clearTimeout(t);\n }\n }, [state.mode, splashPhase]);\n\n React.useEffect(() => {\n if (state.mode !== 'splash') return;\n if (splashPhase === 'skills') {\n if (skillsLoaded >= state.skills.length) {\n const t = setTimeout(() => setSplashPhase('provider'), 60);\n return () => clearTimeout(t);\n }\n const t = setTimeout(() => setSkillsLoaded((i) => i + 1), 20);\n return () => clearTimeout(t);\n }\n }, [state.mode, splashPhase, skillsLoaded, state.skills.length]);\n\n React.useEffect(() => {\n if (state.mode !== 'splash') return;\n if (splashPhase === 'provider') {\n const t = setTimeout(() => setSplashPhase('ready'), 80);\n return () => clearTimeout(t);\n }\n }, [state.mode, splashPhase]);\n\n React.useEffect(() => {\n if (state.mode === 'spotify' && spotifyClient) {\n const refresh = async () => {\n try {\n const data = await spotifyClient.getCurrentlyPlaying();\n setSpotifyNow(formatNowPlaying(data));\n setSpotifyVolume(typeof data?.device?.volume_percent === 'number' ? data.device.volume_percent : null);\n setSpotifyArtUrl(data?.item?.album?.images?.[0]?.url || null);\n } catch {\n setSpotifyNow('Nothing playing');\n setSpotifyVolume(null);\n setSpotifyArtUrl(null);\n }\n };\n refresh();\n const interval = setInterval(refresh, 5000);\n return () => clearInterval(interval);\n }\n }, [state.mode, spotifyClient]);\n\n React.useEffect(() => {\n if (state.mode !== 'spotify') return;\n if (!spotifyArtUrl) {\n setSpotifyArtAnsi('');\n return;\n }\n if (!canRenderInlineAlbumArt()) {\n setSpotifyArtAnsi('');\n return;\n }\n\n const cached = albumArtCache.current.get(spotifyArtUrl);\n if (cached) {\n setSpotifyArtAnsi(cached);\n return;\n }\n\n let cancelled = false;\n buildItermInlineImage(spotifyArtUrl)\n .then((ansi) => {\n if (cancelled) return;\n albumArtCache.current.set(spotifyArtUrl, ansi);\n setSpotifyArtAnsi(ansi);\n })\n .catch(() => {\n if (cancelled) return;\n setSpotifyArtAnsi('');\n });\n\n return () => {\n cancelled = true;\n };\n }, [state.mode, spotifyArtUrl]);\n\n const runSpotifyAction = React.useCallback(async (action: string) => {\n if (!spotifyClient || action === 'exit') return;\n try {\n if (action === 'volume_up') {\n const current = typeof spotifyVolume === 'number' ? spotifyVolume : 50;\n const next = Math.min(100, current + 10);\n const result = await spotifyClient.setVolume(next);\n setSpotifyStatus(result);\n } else if (action === 'volume_down') {\n const current = typeof spotifyVolume === 'number' ? spotifyVolume : 50;\n const next = Math.max(0, current - 10);\n const result = await spotifyClient.setVolume(next);\n setSpotifyStatus(result);\n } else {\n const { handlePlayerAction } = await import('../spotify/ui.js');\n const result = await handlePlayerAction(action, spotifyClient);\n setSpotifyStatus(result);\n }\n\n const data = await spotifyClient.getCurrentlyPlaying();\n setSpotifyNow(formatNowPlaying(data));\n setSpotifyVolume(typeof data?.device?.volume_percent === 'number' ? data.device.volume_percent : null);\n setSpotifyArtUrl(data?.item?.album?.images?.[0]?.url || null);\n } catch (err: any) {\n setSpotifyStatus(err?.message || 'Spotify action failed');\n }\n }, [spotifyClient, spotifyVolume]);\n\n React.useEffect(() => {\n if (state.permissionPrompt) {\n setPermIdx(0);\n permIdxRef.current = 0;\n }\n }, [state.permissionPrompt]);\n\n useInput((ch, key) => {\n const keyChar = (ch || (key as any)?.name || '').toLowerCase();\n const isEnter = key.return || (key as any)?.name === 'enter';\n const resolvePermissionAndMaybeContinue = (value: string | boolean) => {\n const shouldAutoEnterChat = state.mode === 'splash' && state.permissionPrompt?.type === 'mode';\n onPermissionResolve(value);\n if (shouldAutoEnterChat) {\n onInput('/chat');\n }\n };\n\n if (ch === '\\u0003' || (key.ctrl && ((key as any).name === 'c' || ch?.toLowerCase?.() === 'c'))) {\n onExit();\n return;\n }\n\n if (state.mode === 'splash') {\n if (ch === 'd' || ch === 'D') {\n setShowStartupDetails((v) => !v);\n return;\n }\n if (!state.permissionPrompt && isEnter) {\n onInput('/chat');\n return;\n }\n }\n\n if (state.permissionPrompt) {\n const options = state.permissionPrompt.options || [];\n if (options.length > 0) {\n const lower = ch?.toLowerCase?.();\n if (lower === 'y') {\n const yes = options.find((opt) => opt.value === 'yes');\n if (yes) {\n resolvePermissionAndMaybeContinue(yes.value);\n return;\n }\n }\n if (lower === 'n') {\n const no = options.find((opt) => opt.value === 'no');\n if (no) {\n resolvePermissionAndMaybeContinue(no.value);\n return;\n }\n }\n if (lower === 'a') {\n const always = options.find((opt) => opt.value === 'always');\n if (always) {\n resolvePermissionAndMaybeContinue(always.value);\n return;\n }\n }\n\n if (key.upArrow) {\n const next = Math.max(0, permIdxRef.current - 1);\n permIdxRef.current = next;\n setPermIdx(next);\n }\n else if (key.downArrow) {\n const next = Math.min(options.length - 1, permIdxRef.current + 1);\n permIdxRef.current = next;\n setPermIdx(next);\n }\n else if (isEnter) {\n const selected = options[permIdxRef.current] || options[0];\n if (selected) resolvePermissionAndMaybeContinue(selected.value);\n } else if (key.escape) {\n resolvePermissionAndMaybeContinue(state.permissionPrompt.type === 'mode' ? 'ask-me' : 'no');\n }\n return;\n }\n\n if (state.permissionPrompt.type === 'continue') {\n if (ch === 'y' || ch === 'Y') resolvePermissionAndMaybeContinue(true);\n else if (ch === 'n' || ch === 'N') resolvePermissionAndMaybeContinue(false);\n return;\n }\n if (state.permissionPrompt.type === 'ask') {\n if (isEnter) resolvePermissionAndMaybeContinue('');\n return;\n }\n return;\n }\n\n if (state.mode === 'menu') {\n if (key.upArrow) setMenuIdx((i) => Math.max(0, i - 1));\n else if (key.downArrow) setMenuIdx((i) => Math.min(5, i + 1));\n else if (key.return) {\n const modes: AppMode[] = ['menu', 'coding', 'chat', 'spotify', 'chat', 'chat'];\n onInput('/' + modes[menuIdx]);\n setMenuIdx(0);\n }\n else if (key.escape) onInput('/chat');\n return;\n }\n\n if (state.mode === 'spotify') {\n if (ch === 'n' || ch === 'N') {\n runSpotifyAction('next');\n return;\n }\n if (ch === 'p' || ch === 'P') {\n runSpotifyAction('prev');\n return;\n }\n if (ch === ' ') {\n runSpotifyAction('play');\n return;\n }\n if (ch === '+' || ch === '=') {\n runSpotifyAction('volume_up');\n return;\n }\n if (ch === '-') {\n runSpotifyAction('volume_down');\n return;\n }\n if (ch === 'z' || ch === 'Z') {\n runSpotifyAction('now');\n return;\n }\n\n if (key.upArrow) setSpotifyIdx((i) => Math.max(0, i - 1));\n else if (key.downArrow) setSpotifyIdx((i) => Math.min(PLAYER_CONTROLS.length - 1, i + 1));\n else if (key.return) {\n const action = PLAYER_CONTROLS[spotifyIdx];\n if (action && action.value !== 'exit') runSpotifyAction(action.value);\n if (action?.value === 'exit') onInput('/chat');\n } else if (key.escape) onInput('/chat');\n return;\n }\n\n if (isEnter) {\n const trimmed = input.trim();\n if (trimmed) {\n onInput(trimmed);\n setInputHistory((prev) => {\n if (prev[prev.length - 1] === trimmed) return prev;\n return [...prev.slice(-99), trimmed];\n });\n setHistoryIndex(-1);\n setHistoryDraft('');\n setInput('');\n return;\n }\n }\n\n if (state.mode === 'workspace') {\n if (key.escape || (key.ctrl && (ch === 'q' || ch === 'Q'))) {\n onInput('/ws exit');\n return;\n }\n\n if (key.ctrl && (ch === 'p' || ch === 'P')) {\n onInput('/code plan');\n return;\n }\n if (key.ctrl && (ch === 'x' || ch === 'X')) {\n onInput('/code execute');\n return;\n }\n\n if (key.ctrl && (ch === 'e' || ch === 'E')) {\n setWorkspacePane('files');\n return;\n }\n if (key.ctrl && (ch === 'g' || ch === 'G')) {\n setWorkspacePane('git');\n return;\n }\n\n const navMode = input.trim().length === 0;\n\n if (navMode && key.upArrow) {\n if (workspacePane === 'files') onInput('/ws up');\n else if (workspacePane === 'details') setDetailCursor((i) => Math.max(0, i - 1));\n else setGitCursor((i) => Math.max(0, i - 1));\n return;\n }\n if (navMode && key.downArrow) {\n if (workspacePane === 'files') onInput('/ws down');\n else if (workspacePane === 'details') setDetailCursor((i) => Math.min(3, i + 1));\n else setGitCursor((i) => Math.min((state.workspace?.gitFiles.length || 1) - 1, i + 1));\n return;\n }\n if (navMode && key.leftArrow) {\n if (workspacePane === 'files') onInput('/ws collapse');\n return;\n }\n if (navMode && key.rightArrow) {\n if (workspacePane === 'files') onInput('/ws expand');\n return;\n }\n if (navMode && isEnter) {\n if (workspacePane === 'files') onInput('/ws open-selected');\n else if (workspacePane === 'git') {\n const picked = state.workspace?.gitFiles[gitCursor];\n if (picked) onInput(`/ws stage ${picked.path}`);\n }\n return;\n }\n }\n\n if (state.mode === 'splash') return;\n\n if ((state.mode === 'coding' || state.mode === 'workspace') && !state.permissionPrompt) {\n if (key.ctrl && (ch === 'p' || ch === 'P')) {\n onInput('/code plan');\n return;\n }\n if (key.ctrl && (ch === 'x' || ch === 'X')) {\n onInput('/code execute');\n return;\n }\n }\n\n if (key.ctrl && (ch === 'v' || ch === 'V') && !state.permissionPrompt) {\n onInput('/view toggle');\n return;\n }\n\n if (key.ctrl && (ch === 'b' || ch === 'B') && !state.permissionPrompt) {\n onInput(state.isThinking ? '/bg current' : '/bg list');\n return;\n }\n\n if (key.escape) {\n if (state.mode === 'coding') {\n onInput('/chat');\n }\n return;\n }\n\n if (isEnter) return;\n\n if (key.tab) {\n if (input.startsWith('/') && slashSuggestions.length > 0) {\n const exactIdx = slashSuggestions.findIndex((cmd) => cmd === input);\n const nextIdx = exactIdx >= 0 ? (exactIdx + 1) % slashSuggestions.length : 0;\n setInput(slashSuggestions[nextIdx]);\n }\n return;\n }\n\n if (key.upArrow) {\n if (inputHistory.length === 0) return;\n if (historyIndex === -1) {\n setHistoryDraft(input);\n const next = inputHistory.length - 1;\n setHistoryIndex(next);\n setInput(inputHistory[next] ?? '');\n return;\n }\n const next = Math.max(0, historyIndex - 1);\n setHistoryIndex(next);\n setInput(inputHistory[next] ?? '');\n return;\n }\n\n if (key.downArrow) {\n if (historyIndex === -1) return;\n const next = historyIndex + 1;\n if (next >= inputHistory.length) {\n setHistoryIndex(-1);\n setInput(historyDraft);\n return;\n }\n setHistoryIndex(next);\n setInput(inputHistory[next] ?? '');\n return;\n }\n\n if (key.backspace || key.delete) {\n setInput((prev) => prev.slice(0, -1));\n return;\n }\n\n if (key.ctrl || key.meta) return;\n\n if (ch && ch.length === 1 && !key.escape) {\n setInput((prev) => prev + ch);\n }\n });\n\n if (state.mode === 'splash') {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"row\" flexGrow={1} paddingX={1}>\n <Box flexDirection=\"column\" width={34} paddingRight={2}>\n {MERCURY_MARK.map((line, i) => (\n <Text key={i} color={BRAND.logo}>{line}</Text>\n ))}\n <Text bold color={BRAND.title}>MERCURY</Text>\n <Text color={BRAND.subtitle}>Your soul-driven AI agent</Text>\n <Text color=\"gray\">{'─'.repeat(30)}</Text>\n <Text color=\"green\">● Core {splashPhase === 'ready' ? 'ready' : 'booting'}</Text>\n <Text color={state.provider ? 'green' : 'yellow'}>{state.provider ? '●' : '◐'} Provider {state.provider ? 'ready' : 'loading'}</Text>\n <Text color={skillsLoaded >= state.skills.length ? 'green' : 'yellow'}>{skillsLoaded >= state.skills.length ? '●' : '◐'} Skills {skillsLoaded}/{state.skills.length}</Text>\n <Text color=\"gray\">{'─'.repeat(30)}</Text>\n <Text dimColor>Press Enter to open chat</Text>\n <Text dimColor>Press D for startup details</Text>\n </Box>\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text bold color=\"white\">Session</Text>\n <Text color=\"gray\">{'─'.repeat(56)}</Text>\n <Text>Version: <Text color=\"cyan\">{state.version}</Text></Text>\n <Text>Provider: <Text color={BRAND.accent}>{state.provider ? `${state.provider.name} · ${state.provider.model}` : 'Detecting...'}</Text></Text>\n <Text>Mode: <Text color=\"yellow\">Startup</Text></Text>\n {state.tokenInfo && (\n <Text>Budget: <Text color=\"green\">{state.tokenInfo.used.toLocaleString()}/{state.tokenInfo.budget.toLocaleString()} ({state.tokenInfo.percentage}%)</Text></Text>\n )}\n <Text color=\"gray\">{'─'.repeat(56)}</Text>\n <Text bold color=\"white\">Capabilities</Text>\n <Text>Skills loaded: <Text color=\"cyan\">{skillsLoaded}</Text> / {state.skills.length}</Text>\n {showStartupDetails ? (\n <Box flexDirection=\"column\" marginTop={1}>\n {state.skills.slice(0, skillsLoaded).map((skill, i) => (\n <Text key={i} dimColor>- {skill.name}</Text>\n ))}\n </Box>\n ) : (\n <Text dimColor>Details hidden (press D)</Text>\n )}\n <Text color=\"gray\">{'─'.repeat(56)}</Text>\n <Text>{splashPhase === 'ready' ? 'Mercury is live.' : 'Initializing Mercury...'}</Text>\n {splashPhase === 'ready' && <Text color=\"green\">Ready. Enter to open chat.</Text>}\n {!state.provider && <Text color=\"yellow\">Waiting for provider handshake...</Text>}\n {state.provider && <Text color=\"green\">Provider connected.</Text>}\n </Box>\n </Box>\n {state.permissionPrompt && (\n <PermPromptView prompt={state.permissionPrompt} activeIdx={permIdx} />\n )}\n </Box>\n );\n }\n\n const showInput = !state.permissionPrompt && (state.mode === 'chat' || state.mode === 'coding' || state.mode === 'workspace');\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <StatusBarView state={state} />\n {state.backgroundTasks.length > 0 && <BackgroundBarView tasks={state.backgroundTasks} />}\n {state.mode === 'spotify' ? <SpotifyBody activeIdx={spotifyIdx} nowPlaying={spotifyNow} status={spotifyStatus} volume={spotifyVolume} albumArtAnsi={spotifyArtAnsi} /> : null}\n {state.mode === 'menu' ? <MenuBody menuIdx={menuIdx} /> : null}\n {state.mode === 'coding' ? <CodingBody state={state} /> : null}\n {state.mode === 'workspace' ? <WorkspaceBody state={state} workspacePane={workspacePane} detailCursor={detailCursor} gitCursor={gitCursor} /> : null}\n {state.mode === 'chat' ? (\n <ChatBody state={state} />\n ) : null}\n {state.permissionPrompt && (\n <PermPromptView prompt={state.permissionPrompt} activeIdx={permIdx} />\n )}\n {showInput && (\n <InputBox\n input={input}\n mode={state.mode}\n programmingMode={state.programmingMode}\n projectContext={state.projectContext}\n />\n )}\n {showInput && slashSuggestions.length > 0 && (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text dimColor>Suggestions (Tab to complete):</Text>\n {slashSuggestions.map((cmd, idx) => (\n <Text key={cmd} color={idx === 0 ? 'cyan' : 'gray'}>{idx === 0 ? '›' : ' '} {cmd}</Text>\n ))}\n </Box>\n )}\n </Box>\n );\n}\n\nfunction BackgroundBarView({ tasks }: { tasks: BackgroundTaskInfo[] }) {\n if (tasks.length === 0) return null;\n\n const statusIcons: Record<string, string> = {\n running: '⏳',\n completed: '✅',\n failed: '❌',\n timed_out: '⏱',\n cancelled: '⛔',\n };\n\n const visible = tasks.slice(0, 3);\n const more = tasks.length > 3 ? ` +${tasks.length - 3} more` : '';\n\n return (\n <Box paddingX={1} paddingBottom={0}>\n <Text color=\"gray\">{'─'.repeat(50)}</Text>\n <Box flexDirection=\"column\" width=\"100%\">\n <Box>\n <Text dimColor>⏥ Background:</Text>\n <Text> {visible.map((t) => {\n const icon = statusIcons[t.status] || '·';\n const label = t.command || t.task || t.id;\n const short = label.length > 25 ? label.slice(0, 22) + '...' : label;\n const elapsed = t.runningMs ? ` (${Math.round(t.runningMs / 1000)}s)` : '';\n return `${icon} ${t.id}: ${short}${elapsed}`;\n }).join(' · ')}{more}</Text>\n </Box>\n </Box>\n </Box>\n );\n}\n\nfunction StatusBarView({ state }: { state: TuiState }) {\n const modeColor = state.programmingMode === 'execute' ? 'green' : state.programmingMode === 'plan' ? 'yellow' : 'gray';\n const modeLabel = state.programmingMode === 'off' ? '' : ` ${state.programmingMode.toUpperCase()}`;\n let tokenBar = '';\n if (state.tokenInfo) {\n const filled = Math.min(20, Math.round(state.tokenInfo.percentage / 5));\n tokenBar = `[${'█'.repeat(filled)}${'░'.repeat(20 - filled)}] ${state.tokenInfo.percentage}%`;\n }\n const providerBadge = state.provider ? `⚡ ${state.provider.name} · ${state.provider.model}` : '⚡ No provider';\n const viewLabel = state.viewMode === 'balanced' ? 'minimal' : 'detailed';\n\n return (\n <Box flexDirection=\"column\">\n <Box paddingX={1}>\n <Text color={BRAND.logo}>☿</Text>\n <Text> </Text>\n <Text bold color={BRAND.title}>MERCURY</Text>\n <Text color={BRAND.subtitle}> · Your soul-driven AI agent</Text>\n </Box>\n <Box paddingX={1} paddingBottom={0}>\n <Box flexGrow={1}>\n <Text bold color=\"cyan\">{state.agentName}</Text>\n {state.programmingMode !== 'off' && <Text> <Text color={modeColor} bold>{modeLabel}</Text></Text>}\n {state.projectContext && <Text> <Text color=\"gray\">|</Text> <Text color=\"blue\">{state.projectContext}</Text></Text>}\n <Text> <Text color=\"gray\">|</Text> <Text color=\"yellow\">View: {viewLabel}</Text></Text>\n <Text> <Text color=\"gray\">|</Text> <Text color=\"green\">{state.permissionMode === 'allow-all' ? '🔓' : '🔒'}</Text></Text>\n </Box>\n <Text color=\"magenta\">{providerBadge}</Text>\n </Box>\n <Box paddingX={1}>\n <Text color=\"gray\">{'─'.repeat(50)}</Text>\n </Box>\n {state.tokenInfo && (\n <Box paddingX={1}>\n <Text color=\"cyan\">Tokens </Text>\n <Text>{tokenBar}</Text>\n <Text color=\"gray\"> {state.tokenInfo.used.toLocaleString()}/{state.tokenInfo.budget.toLocaleString()}</Text>\n </Box>\n )}\n </Box>\n );\n}\n\nfunction ChatBody({ state }: { state: TuiState }) {\n return (\n <Box flexDirection=\"row\" flexGrow={1}>\n {state.sidebarSections.length > 0 && <SidebarView sections={state.sidebarSections} />}\n <Box flexDirection=\"column\" flexGrow={1}>\n <ChatMessagesView messages={state.chatMessages} agentName={state.agentName} />\n {state.toolSteps.length > 0 && <ToolStepsView steps={state.toolSteps} viewMode={state.viewMode} />}\n {state.isThinking && <ThinkingIndicator agentName={state.agentName} steps={state.toolSteps} mode={state.mode} />}\n {state.subAgents.length > 0 && <AgentPanelView agents={state.subAgents} />}\n </Box>\n </Box>\n );\n}\n\nfunction CodingBody({ state }: { state: TuiState }) {\n const modeLabels: Record<ProgrammingModeState, { label: string; color: string }> = {\n off: { label: 'OFF', color: 'gray' },\n plan: { label: 'PLAN', color: 'yellow' },\n execute: { label: 'EXECUTE', color: 'green' },\n };\n const modeInfo = modeLabels[state.programmingMode];\n const fileSection = state.sidebarSections.find((s) => s.title === 'Files');\n\n return (\n <Box flexDirection=\"row\" flexGrow={1}>\n <Box flexDirection=\"column\" width={26} paddingX={1}>\n <Text color=\"gray\">{'─'.repeat(24)}</Text>\n <Text bold color=\"cyan\">Workspace</Text>\n <Box marginTop={1}>\n <Text color={modeInfo.color} bold>{modeInfo.label}</Text>\n <Text> mode</Text>\n </Box>\n {state.projectContext && <Box><Text dimColor>Project: {state.projectContext}</Text></Box>}\n {fileSection && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"cyan\">{fileSection.title}</Text>\n {fileSection.items.slice(0, 10).map((item, i) => (\n <Box key={i}><Text>{item.icon} </Text><Text color={item.active ? 'white' : 'gray'}>{item.label}</Text></Box>\n ))}\n </Box>\n )}\n {state.subAgents.length > 0 && <AgentPanelView agents={state.subAgents} />}\n </Box>\n <Box flexDirection=\"column\" flexGrow={1}>\n <ChatMessagesView messages={state.chatMessages} agentName={state.agentName} />\n {state.toolSteps.length > 0 && <ToolStepsView steps={state.toolSteps} viewMode={state.viewMode} />}\n {state.isThinking && <ThinkingIndicator agentName={state.agentName} steps={state.toolSteps} mode={state.mode} />}\n <Box paddingX={1} marginTop={1}>\n <Text dimColor>Mode shortcuts: Ctrl+P Plan · Ctrl+X Execute</Text>\n </Box>\n </Box>\n </Box>\n );\n}\n\nfunction WorkspaceBody({ state, workspacePane, detailCursor, gitCursor }: { state: TuiState; workspacePane: 'files' | 'details' | 'git'; detailCursor: number; gitCursor: number }) {\n const ws = state.workspace;\n if (!ws?.active) {\n return (\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n <Text color=\"yellow\">Workspace mode is not active.</Text>\n <Text dimColor>Use /ws open &lt;path&gt; or type: open workspace /path/to/project</Text>\n </Box>\n );\n }\n\n const selectedNode = ws.nodes[ws.selectedIndex];\n const selectedRel = selectedNode ? selectedNode.path.replace(ws.rootPath + '/', '') : '';\n const explorerWindow = 12;\n const explorerStart = Math.max(0, Math.min(ws.selectedIndex - Math.floor(explorerWindow / 2), Math.max(0, ws.nodes.length - explorerWindow)));\n const visibleExplorerNodes = ws.nodes.slice(explorerStart, explorerStart + explorerWindow);\n const gitWindow = 12;\n const gitStart = Math.max(0, Math.min(gitCursor - Math.floor(gitWindow / 2), Math.max(0, ws.gitFiles.length - gitWindow)));\n const visibleGitFiles = ws.gitFiles.slice(gitStart, gitStart + gitWindow);\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box paddingX={1}>\n <Text color=\"gray\">Workspace: </Text><Text color=\"cyan\">{ws.rootPath}</Text>\n <Text color=\"gray\"> | Branch: </Text><Text color=\"magenta\">{ws.branch}</Text>\n <Text color=\"gray\"> | Pane: </Text><Text color=\"white\">{workspacePane.toUpperCase()}</Text>\n <Text color=\"gray\"> | </Text><Text color=\"green\" bold>CODING IDE</Text>\n </Box>\n <Box paddingX={1}><Text color=\"gray\">{'═'.repeat(118)}</Text></Box>\n <Box flexDirection=\"row\" height={16}>\n <Box flexDirection=\"column\" width={36} paddingX={1}>\n <Text bold color={workspacePane === 'files' ? 'white' : 'cyan'}>EXPLORER {workspacePane === 'files' ? '●' : '○'}</Text>\n <Text color=\"gray\">{'─'.repeat(34)}</Text>\n {visibleExplorerNodes.map((node, localIdx) => {\n const idx = explorerStart + localIdx;\n const isSelected = idx === ws.selectedIndex;\n const prefix = node.isDir ? (node.expanded ? '▾' : '▸') : ' ';\n const indent = ' '.repeat(Math.max(0, node.depth * 2));\n return (\n <Text key={node.id} color={isSelected ? 'white' : 'gray'}>\n {isSelected ? '›' : ' '} {indent}{prefix} {node.name}\n </Text>\n );\n })}\n <Text dimColor>{ws.nodes.length > explorerWindow ? `Showing ${explorerStart + 1}-${Math.min(ws.nodes.length, explorerStart + explorerWindow)} of ${ws.nodes.length}` : `${ws.nodes.length} items`}</Text>\n </Box>\n <Box><Text color=\"gray\">│</Text></Box>\n <Box flexDirection=\"column\" width={52} paddingX={1}>\n {workspacePane === 'files' ? (\n <>\n <Text bold color=\"cyan\">PREVIEW</Text>\n <Text color=\"gray\">{'─'.repeat(50)}</Text>\n <Text>{selectedRel || ws.rootPath}</Text>\n {ws.openedFilePath ? (\n ws.openedFilePreview.slice(0, 10).map((line, i) => (\n <Text key={`${i}:${line.slice(0, 10)}`} dimColor>{String(i + 1).padStart(3, ' ')} {line}</Text>\n ))\n ) : (\n <Text dimColor>Select a file and press Enter</Text>\n )}\n </>\n ) : workspacePane === 'git' ? (\n <>\n <Text bold color=\"cyan\">GIT INSPECTOR</Text>\n <Text color=\"gray\">{'─'.repeat(50)}</Text>\n <Text>Staged: <Text color=\"green\">{ws.stagedCount}</Text> · Unstaged: <Text color=\"yellow\">{ws.unstagedCount}</Text></Text>\n {visibleGitFiles.length === 0 ? <Text dimColor>Clean working tree</Text> : visibleGitFiles.map((f, localIdx) => {\n const idx = gitStart + localIdx;\n return <Text key={f.path} color={idx === gitCursor ? 'white' : (f.staged ? 'green' : 'yellow')}>{idx === gitCursor ? '›' : ' '} {f.staged ? '●' : '○'} {f.status} {f.path}</Text>;\n })}\n <Text dimColor>{ws.gitFiles.length > gitWindow ? `Showing ${gitStart + 1}-${Math.min(ws.gitFiles.length, gitStart + gitWindow)} of ${ws.gitFiles.length}` : `${ws.gitFiles.length} files`}</Text>\n </>\n ) : (\n <>\n <Text bold color=\"cyan\">DETAILS</Text>\n <Text color=\"gray\">{'─'.repeat(50)}</Text>\n <Text>Selected: <Text color=\"yellow\">{selectedRel || ws.rootPath}</Text></Text>\n <Text>Mode: <Text color={state.programmingMode === 'execute' ? 'green' : 'yellow'}>{state.programmingMode.toUpperCase()}</Text></Text>\n {state.subAgents.length > 0 && <AgentPanelView agents={state.subAgents} />}\n </>\n )}\n </Box>\n <Box><Text color=\"gray\">│</Text></Box>\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n <Text bold color={workspacePane === 'git' ? 'white' : 'cyan'}>SOURCE CONTROL {workspacePane === 'git' ? '●' : '○'}</Text>\n <Text color=\"gray\">{'─'.repeat(26)}</Text>\n <Text>Branch: <Text color=\"magenta\">{ws.branch}</Text></Text>\n <Text>Staged: <Text color=\"green\">{ws.stagedCount}</Text></Text>\n <Text>Unstaged: <Text color=\"yellow\">{ws.unstagedCount}</Text></Text>\n <Text color=\"gray\">{'─'.repeat(26)}</Text>\n {visibleGitFiles.length === 0 ? <Text dimColor>Clean working tree</Text> : visibleGitFiles.map((f, localIdx) => {\n const idx = gitStart + localIdx;\n return <Text key={`side-${f.path}`} color={idx === gitCursor ? 'white' : (f.staged ? 'green' : 'yellow')}>{idx === gitCursor ? '›' : ' '} {f.status} {f.path}</Text>;\n })}\n <Text dimColor>Enter stages selected file</Text>\n <Text dimColor>/ws stage all · /ws commit &lt;msg&gt;</Text>\n </Box>\n </Box>\n <Box paddingX={1}><Text color=\"gray\">{'═'.repeat(118)}</Text></Box>\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n <Text bold color=\"cyan\">Chat · Workspace Coding Session</Text>\n <Text dimColor>Ask implementation questions, refactors, tests, and git actions for this project context.</Text>\n <ChatMessagesView messages={state.chatMessages} agentName={state.agentName} />\n {state.toolSteps.length > 0 && <ToolStepsView steps={state.toolSteps} viewMode={state.viewMode} />}\n {state.isThinking && <ThinkingIndicator agentName={state.agentName} steps={state.toolSteps} mode={state.mode} />}\n </Box>\n <Box paddingX={1}>\n <Text dimColor>Esc/Ctrl+Q Exit Workspace · Ctrl+P Plan · Ctrl+X Execute · Ctrl+E Explorer · Ctrl+G Git</Text>\n </Box>\n </Box>\n );\n}\n\nfunction MenuBody({ menuIdx }: { menuIdx: number }) {\n const menuOptions: Array<{ label: string; mode: AppMode; icon: string }> = [\n { label: 'Status', mode: 'menu', icon: '📊' },\n { label: 'Coding Mode', mode: 'coding', icon: '💻' },\n { label: 'Memory', mode: 'chat', icon: '🧠' },\n { label: 'Spotify Player', mode: 'spotify', icon: '🎵' },\n { label: 'Permissions', mode: 'chat', icon: '🔒' },\n { label: 'Back to Chat', mode: 'chat', icon: '💬' },\n ];\n\n return (\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n <Text bold color=\"cyan\">Menu</Text>\n {menuOptions.map((opt, i) => (\n <Box key={i}>\n <Text>{i === menuIdx ? '●' : '·'} </Text>\n <Text color={i === menuIdx ? 'cyan' : 'gray'}>{opt.icon} {opt.label}</Text>\n </Box>\n ))}\n <Box marginTop={1}><Text dimColor>↑↓ navigate · Enter select · Esc back</Text></Box>\n </Box>\n );\n}\n\nfunction SpotifyBody({ activeIdx, nowPlaying, status, volume, albumArtAnsi }: { activeIdx: number; nowPlaying: string; status: string; volume: number | null; albumArtAnsi: string }) {\n const volumeBar = volume == null\n ? '[unknown]'\n : `[${'█'.repeat(Math.max(0, Math.min(10, Math.round(volume / 10))))}${'░'.repeat(Math.max(0, 10 - Math.round(volume / 10)))}] ${volume}%`;\n return (\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n <Box paddingX={1} marginBottom={1} flexDirection=\"column\">\n <Text color=\"green\">╭────────────────── Spotify Deck ──────────────────╮</Text>\n <Text color=\"green\">│</Text><Text> </Text><Text bold color=\"green\">Now Playing</Text>\n {(nowPlaying || 'Nothing playing').split('\\n').map((line, idx) => (\n <Box key={`np-${idx}`}>\n <Text color=\"green\">│</Text><Text> </Text><Text>{line}</Text>\n </Box>\n ))}\n <Box>\n <Text color=\"green\">│</Text><Text> </Text><Text color=\"yellow\">Volume:</Text><Text> </Text><Text>{volumeBar}</Text>\n </Box>\n {albumArtAnsi ? (\n <Box>\n <Text color=\"green\">│</Text><Text> </Text><Text>{albumArtAnsi}</Text>\n </Box>\n ) : null}\n {status ? (\n <Box>\n <Text color=\"green\">│</Text><Text> </Text><Text color=\"cyan\">Last action:</Text><Text> </Text><Text>{status}</Text>\n </Box>\n ) : null}\n <Text color=\"green\">╰───────────────────────────────────────────────────╯</Text>\n </Box>\n <Box flexDirection=\"column\">\n <Text bold color=\"cyan\">Controls</Text>\n {PLAYER_CONTROLS.map((control, i) => (\n <Box key={control.value}>\n <Text>{i === activeIdx ? '●' : '·'} </Text>\n <Text color={i === activeIdx ? 'green' : 'gray'}>{control.label}</Text>\n </Box>\n ))}\n </Box>\n <Box marginTop={1}>\n <Text dimColor>↑↓ navigate · Enter select · N next · P previous · +/- volume · Z now playing · Esc exit</Text>\n </Box>\n </Box>\n );\n}\n\nfunction ChatMessagesView({ messages, agentName }: { messages: ChatMessage[]; agentName: string }) {\n if (messages.length === 0) return null;\n const visible = messages.slice(-50);\n const cache = React.useRef<Map<string, string>>(new Map());\n return (\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n {visible.map((msg) => {\n const roleColor = msg.role === 'user' ? 'yellow' : msg.role === 'system' ? 'gray' : 'cyan';\n const prefix = msg.role === 'user' ? 'You' : msg.role === 'system' ? 'System' : agentName;\n let rendered: string;\n if (msg.streaming) {\n rendered = renderMarkdown(msg.content);\n cache.current.set(msg.id, rendered);\n } else {\n rendered = cache.current.get(msg.id) ?? renderMarkdown(msg.content);\n cache.current.set(msg.id, rendered);\n }\n return (\n <Box key={msg.id} flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text bold color={roleColor}>{prefix}:</Text>\n </Box>\n <Box marginLeft={2} flexDirection=\"column\">\n {rendered.split('\\n').map((line, idx) => (\n <Text key={`${msg.id}:${idx}`}>{line.length > 0 ? line : ' '}</Text>\n ))}\n </Box>\n </Box>\n );\n })}\n </Box>\n );\n}\n\nfunction ToolStepsView({ steps, viewMode }: { steps: ToolStep[]; viewMode: 'balanced' | 'detailed' }) {\n const visible = viewMode === 'detailed' ? steps.slice(-20) : steps.slice(-1);\n const runningCount = visible.filter((s) => s.status === 'running').length;\n const doneCount = visible.filter((s) => s.status === 'done').length;\n return (\n <Box flexDirection=\"column\" marginLeft={2} marginTop={1}>\n <Text color=\"gray\">Activity · {viewMode === 'balanced' ? 'minimal' : 'detailed'} · {runningCount > 0 ? `${runningCount} running` : `${doneCount} completed`}</Text>\n {visible.map((step) => (\n <Box key={step.id}>\n <Text>\n {step.status === 'running' ? '⏳' : step.status === 'done' ? '✅' : '❌'}\n </Text>\n <Text> </Text>\n <Text dimColor>{step.label}</Text>\n {step.status === 'running' && <Text color=\"yellow\"> …</Text>}\n {step.status === 'done' && step.elapsed != null && <Text dimColor> ({step.elapsed.toFixed(1)}s)</Text>}\n {viewMode === 'detailed' && step.result && <Text dimColor> · {step.result}</Text>}\n </Box>\n ))}\n <Text dimColor>Ctrl+V toggles Minimal/Detailed (or use /view)</Text>\n </Box>\n );\n}\n\nfunction ThinkingIndicator({ agentName, steps, mode }: { agentName: string; steps: ToolStep[]; mode: AppMode }) {\n const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n const codingPhases = ['indexing symbols', 'building plan', 'running checks', 'linking context'];\n const chatPhases = ['reading your message', 'gathering context', 'drafting response', 'polishing answer'];\n const phases = (mode === 'coding' || mode === 'workspace') ? codingPhases : chatPhases;\n const [frame, setFrame] = React.useState(0);\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setFrame((v) => (v + 1) % (frames.length * phases.length));\n }, 90);\n return () => clearInterval(timer);\n }, []);\n\n const spinner = frames[frame % frames.length];\n const phase = phases[Math.floor(frame / frames.length) % phases.length];\n const pulse = '.'.repeat((frame % 3) + 1);\n const runningStep = [...steps].reverse().find((s) => s.status === 'running');\n const livePhase = runningStep ? `running: ${runningStep.label}` : phase;\n\n return (\n <Box marginTop={1} marginLeft={2} flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\">{spinner}</Text>\n <Text> </Text>\n <Text color=\"cyan\" bold>{agentName}</Text>\n <Text dimColor> is thinking{pulse}</Text>\n </Box>\n <Box marginLeft={2}>\n <Text color=\"gray\">↳ {livePhase}</Text>\n </Box>\n </Box>\n );\n}\n\nfunction AgentPanelView({ agents }: { agents: SubAgentInfo[] }) {\n if (agents.length === 0) return null;\n return (\n <Box flexDirection=\"column\" marginTop={1} paddingX={1}>\n <Text color=\"gray\">{'─'.repeat(30)}</Text>\n <Text bold color=\"cyan\">Agents</Text>\n {agents.map((agent) => {\n const cfg = STATUS_ICONS[agent.status] || STATUS_ICONS.pending;\n const elapsed = ((Date.now() - agent.startedAt) / 1000).toFixed(0);\n const taskPreview = agent.task.length > 40 ? agent.task.slice(0, 37) + '...' : agent.task;\n return (\n <Box key={agent.id} flexDirection=\"column\">\n <Box><Text>{cfg.icon} </Text><Text bold color={cfg.color}>{agent.id}</Text><Text dimColor> {taskPreview}</Text></Box>\n <Box marginLeft={3}><Text dimColor>{agent.status} · {elapsed}s</Text></Box>\n </Box>\n );\n })}\n </Box>\n );\n}\n\nfunction SidebarView({ sections }: { sections: SidebarSection[] }) {\n if (sections.length === 0) return null;\n return (\n <Box flexDirection=\"column\" width={24} paddingX={1}>\n <Text color=\"gray\">{'─'.repeat(22)}</Text>\n {sections.map((section, si) => (\n <Box key={si} flexDirection=\"column\" marginBottom={si < sections.length - 1 ? 1 : 0}>\n <Text bold color=\"cyan\">{section.title}</Text>\n {section.items.map((item, ii) => (\n <Box key={ii}><Text>{item.icon} </Text><Text color={item.active ? 'white' : 'gray'}>{item.label}</Text></Box>\n ))}\n </Box>\n ))}\n </Box>\n );\n}\n\nfunction PermPromptView({ prompt, activeIdx }: { prompt: PermissionPromptState; activeIdx: number }) {\n const options = prompt.options || [];\n\n if (options.length > 0) {\n const hasAlways = options.some((opt) => opt.value === 'always');\n return (\n <Box flexDirection=\"column\" marginTop={1} paddingX={1}>\n <Box><Text bold color=\"yellow\">⚠ {prompt.message}</Text></Box>\n {options.map((opt, i) => (\n <Box key={opt.value}>\n <Text>{i === activeIdx ? '●' : '·'} </Text>\n <Text color={i === activeIdx ? 'cyan' : 'gray'}>{opt.label}</Text>\n </Box>\n ))}\n <Text dimColor>{hasAlways ? ' ↑↓ choose · Enter confirm · Y/N/A shortcuts · Esc cancel' : ' ↑↓ choose · Enter confirm · Y/N shortcuts · Esc cancel'}</Text>\n </Box>\n );\n }\n\n if (prompt.type === 'continue') {\n return (\n <Box flexDirection=\"column\" marginTop={1} paddingX={1}>\n <Box><Text color=\"yellow\">⚠ </Text><Text>{prompt.message}</Text></Box>\n <Text dimColor> [y/N]</Text>\n </Box>\n );\n }\n\n if (prompt.type === 'ask') {\n return (\n <Box flexDirection=\"column\" marginTop={1} paddingX={1}>\n <Box><Text color=\"yellow\">⚠ </Text><Text>{prompt.message}</Text></Box>\n <Text dimColor> Type your answer and press Enter</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" marginTop={1} paddingX={1}>\n <Box><Text bold color=\"yellow\">⚠ {prompt.message}</Text></Box>\n {options.map((opt, i) => (\n <Box key={opt.value}>\n <Text>{i === activeIdx ? '●' : '·'} </Text>\n <Text color={i === activeIdx ? 'cyan' : 'gray'}>{opt.label}</Text>\n </Box>\n ))}\n <Text dimColor> ↑↓ to navigate, Enter to select</Text>\n </Box>\n );\n}\n\nfunction InputBox({\n input,\n mode,\n programmingMode,\n projectContext,\n}: {\n input: string;\n mode: AppMode;\n programmingMode: ProgrammingModeState;\n projectContext: string | null;\n}) {\n const inWorkspace = mode === 'workspace';\n const inCoding = mode === 'coding' || inWorkspace;\n const promptColor = inWorkspace ? 'cyan' : inCoding ? 'green' : 'yellow';\n const label = inWorkspace ? '[IDE CHAT]' : inCoding ? '[CODING]' : '[CHAT]';\n const contextLabel = projectContext && projectContext.length > 52\n ? `...${projectContext.slice(-49)}`\n : (projectContext || 'No project context');\n\n return (\n <Box flexDirection=\"column\">\n <Text color=\"dim\">{'─'.repeat(60)}</Text>\n <Box paddingX={1}>\n <Text color={promptColor} bold>{label}</Text>\n <Text dimColor> {contextLabel} </Text>\n <Text color={programmingMode === 'execute' ? 'green' : programmingMode === 'plan' ? 'yellow' : 'gray'}>\n mode={programmingMode.toUpperCase()}\n </Text>\n </Box>\n <Box paddingX={1}>\n <Text color={promptColor} bold>{'>'} </Text>\n <Text>{input}</Text>\n <Text dimColor>█</Text>\n </Box>\n <Box paddingX={1}>\n <Text dimColor>{inWorkspace ? 'IDE chat active. Esc exits workspace. Ctrl+P Plan · Ctrl+X Execute.' : inCoding ? 'Coding chat active. Ctrl+P Plan · Ctrl+X Execute.' : 'Type a prompt, then Enter.'}</Text>\n </Box>\n </Box>\n );\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 tokens = lexer.lexer(text);\n const result = renderTokens(tokens);\n return decodeHtmlEntities(result.replace(/\\n{3,}/g, '\\n\\n').trimEnd());\n } catch {\n return decodeHtmlEntities(text);\n }\n}\n\nfunction renderTokens(tokens: any[]): string {\n return tokens.map((t) => renderToken(t)).join('');\n}\n\nfunction renderToken(t: any): string {\n if (!t || typeof t !== 'object') return String(t ?? '');\n\n switch (t.type) {\n case 'heading':\n return renderHeading(t);\n case 'paragraph':\n return renderInline(t.tokens) + '\\n\\n';\n case 'strong':\n return chalk.bold(renderInline(t.tokens));\n case 'em':\n return chalk.italic(renderInline(t.tokens));\n case 'del':\n return chalk.dim.strikethrough(renderInline(t.tokens));\n case 'codespan':\n return chalk.yellow(t.text);\n case 'code':\n return renderCodeBlock(t);\n case 'list':\n return renderList(t);\n case 'blockquote':\n return renderBlockquote(t);\n case 'hr':\n return chalk.dim('─'.repeat(50)) + '\\n\\n';\n case 'link':\n return `${chalk.blue.underline(renderInline(t.tokens))} ${chalk.dim(`(${t.href})`)}`;\n case 'image':\n return chalk.blue(`🖼 ${t.title || t.href}`);\n case 'table':\n return renderTable(t);\n case 'text':\n if (t.tokens) return renderInline(t.tokens);\n return t.text || '';\n case 'html':\n return t.text || '';\n case 'space':\n return '';\n default:\n return t.text || '';\n }\n}\n\nfunction renderHeading(t: any): string {\n const text = renderInline(t.tokens);\n if (t.depth === 1) return `\\n${chalk.bold.cyan(text)}\\n\\n`;\n if (t.depth === 2) return `\\n${chalk.bold.cyan(` ■ ${text}`)}\\n\\n`;\n return `\\n${chalk.bold(` ■ ${text}`)}\\n\\n`;\n}\n\nfunction renderInline(tokens: any[] | undefined): string {\n if (!tokens) return '';\n return tokens.map((t) => {\n if (typeof t === 'string') return t;\n if (t.type === 'strong') return chalk.bold(renderInline(t.tokens));\n if (t.type === 'em') return chalk.italic(renderInline(t.tokens));\n if (t.type === 'del') return chalk.dim.strikethrough(renderInline(t.tokens));\n if (t.type === 'codespan') return chalk.yellow(t.text);\n if (t.type === 'link') return `${chalk.blue.underline(renderInline(t.tokens))} ${chalk.dim(`(${t.href})`)}`;\n if (t.type === 'image') return chalk.blue(`🖼 ${t.title || t.href}`);\n if (t.type === 'text') {\n return t.tokens ? renderInline(t.tokens) : (t.text || '');\n }\n if (t.type === 'html') return t.text || '';\n return t.text || '';\n }).join('');\n}\n\nfunction renderCodeBlock(t: any): string {\n const lines = t.text\n .split('\\n')\n .map((l: string) => `${chalk.dim(' ')}${chalk.yellow(l)}`)\n .join('\\n');\n const langStr = t.lang ? chalk.dim(` [${t.lang}]`) : '';\n return `\\n${langStr}\\n${lines}\\n\\n`;\n}\n\nfunction renderList(t: any): string {\n const lines: string[] = [];\n const items = t.items || [];\n items.forEach((item: any, i: number) => {\n const bullet = t.ordered ? `${i + 1}.` : '•';\n const firstLine = renderInline(item.tokens?.[0]?.tokens || [{ text: item.text }]);\n lines.push(` ${chalk.dim(bullet)} ${firstLine}`);\n\n const restTokens = (item.tokens || []).slice(1);\n for (const sub of restTokens) {\n if (sub.type === 'list') {\n const subLines = renderList(sub)\n .split('\\n')\n .filter(Boolean)\n .map((l: string) => ` ${l}`)\n .join('\\n');\n lines.push(subLines);\n } else if (sub.type === 'text') {\n lines.push(` ${chalk.dim('•')} ${renderInline(sub.tokens)}`);\n }\n }\n });\n return lines.join('\\n') + '\\n\\n';\n}\n\nfunction renderBlockquote(t: any): string {\n const content = renderTokens(t.tokens || []);\n const lines = content\n .split('\\n')\n .filter((l: string) => l.trim())\n .map((l: string) => `${chalk.dim('│ ')}${chalk.gray(l)}`)\n .join('\\n');\n return `\\n${lines}\\n\\n`;\n}\n\nfunction renderTable(t: any): string {\n const headers = (t.header || []).map((h: any) => chalk.bold(renderInline(h.tokens)));\n const colWidths = (t.header || []).map((h: any, i: number) => {\n const hLen = (h.text || '').length;\n const rowLens = (t.rows || []).map((row: any) => {\n const cell = row[i];\n return cell?.text?.length ?? 0;\n });\n return Math.max(hLen, ...rowLens) + 2;\n });\n\n const headerLine = headers.map((h: string, i: number) => h.padEnd(colWidths[i])).join(chalk.dim(' │ '));\n const separator = colWidths.map((w: number) => '─'.repeat(w)).join(chalk.dim('─┼─'));\n\n const dataLines = (t.rows || []).map((row: any) =>\n row.map((cell: any, i: number) => {\n const text = renderInline(cell.tokens) || cell.text || '';\n return text.padEnd(colWidths[i]);\n }).join(chalk.dim(' │ '))\n );\n\n return `\\n${headerLine}\\n${chalk.dim(separator)}\\n${dataLines.join('\\n')}\\n\\n`;\n}\n\nfunction escapeHtml(text: string): string {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\nexport function mdToTelegram(text: string): string {\n let out = text;\n\n const codeBlocks: string[] = [];\n out = out.replace(/```(\\w*)\\n([\\s\\S]*?)```/g, (_match, lang, code) => {\n const placeholder = `__CODEBLOCK_${codeBlocks.length}__`;\n codeBlocks.push(`<pre><code class=\"${lang}\">${escapeHtml(code)}</code></pre>`);\n return placeholder;\n });\n\n const inlineCodes: string[] = [];\n out = out.replace(/`([^`]+)`/g, (_match, code) => {\n const placeholder = `__INLINECODE_${inlineCodes.length}__`;\n inlineCodes.push(`<code>${escapeHtml(code)}</code>`);\n return placeholder;\n });\n\n const links: string[] = [];\n out = out.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_match, label, href) => {\n const placeholder = `__LINK_${links.length}__`;\n links.push(`<a href=\"${escapeHtml(href)}\">${escapeHtml(label)}</a>`);\n return placeholder;\n });\n\n out = escapeHtml(out);\n\n out = out.replace(/^### (.+)$/gm, '<b><i>$1</i></b>');\n out = out.replace(/^## (.+)$/gm, '<b>$1</b>');\n out = out.replace(/^# (.+)$/gm, '<b>$1</b>');\n out = out.replace(/\\*\\*([^*]+)\\*\\*/g, '<b>$1</b>');\n out = out.replace(/(?<!\\*)\\*([^*]+)\\*(?!\\*)/g, '<i>$1</i>');\n out = out.replace(/~~([^~]+)~~/g, '<s>$1</s>');\n\n for (let i = 0; i < inlineCodes.length; i++) {\n out = out.replace(`__INLINECODE_${i}__`, inlineCodes[i]);\n }\n for (let i = 0; i < codeBlocks.length; i++) {\n out = out.replace(`__CODEBLOCK_${i}__`, codeBlocks[i]);\n }\n for (let i = 0; i < links.length; i++) {\n out = out.replace(`__LINK_${i}__`, links[i]);\n }\n\n if (out.length > 4096) {\n out = out.slice(0, 4090) + '...';\n }\n\n return out;\n}","import fs from 'node:fs';\nimport path from 'node:path';\nimport { Bot, InputFile, InlineKeyboard } from 'grammy';\nimport { autoRetry } from '@grammyjs/auto-retry';\nimport type { ChannelMessage } from '../types/channel.js';\nimport { BaseChannel, type PermissionMode } 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';\nimport { formatToolStep, formatToolResult } from '../utils/tool-label.js';\n\nconst MAX_MESSAGE_LENGTH = 4096;\nconst ACCESS_ACTION_PREFIX = 'tg_access';\nconst MEMORY_ACTION_PREFIX = 'tg_memory';\n\ntype ApprovalResolver = () => 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 private permissionModes = new Map<number, PermissionMode>();\n private onPermissionMode?: (mode: PermissionMode, chatId: number) => void;\n private statusMessageIds = new Map<string, number>();\n private stepCounters = new Map<string, number>();\n private statusText = new Map<string, string>();\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 setOnPermissionMode(handler: (mode: PermissionMode, chatId: number) => void): void {\n this.onPermissionMode = handler;\n }\n\n getPermissionMode(chatId: number): PermissionMode {\n return this.permissionModes.get(chatId) ?? 'ask-me';\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 if (command === '/memory') {\n if (!this.chatCommandContext) {\n await this.sendDirectMessage(chatId, 'Memory not available.');\n return;\n }\n await this.sendMemoryKeyboard(chatId);\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 (!this.permissionModes.has(chatId) && this.onPermissionMode) {\n this.askPermissionMode(`telegram:${chatId}`).then((mode) => {\n this.permissionModes.set(chatId, mode);\n if (this.onPermissionMode) {\n this.onPermissionMode(mode, chatId);\n }\n }).catch(() => {});\n this.permissionModes.set(chatId, 'ask-me');\n }\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 if (command === '/permissions') {\n this.askPermissionMode(`telegram:${chatId}`).then((mode) => {\n this.permissionModes.set(chatId, mode);\n if (this.onPermissionMode) {\n this.onPermissionMode(mode, chatId);\n }\n }).catch(() => {});\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 if (data.startsWith(`${MEMORY_ACTION_PREFIX}:`)) {\n await this.handleMemoryCallback(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 resolver();\n const action = data.split(':')[1];\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 const message = err?.description || err?.message || String(err);\n if (err?.error_code === 401) {\n reject(new Error(`Telegram bot token is invalid. Get a fresh token from @BotFather via /token.\\n Details: ${message}`));\n } else if (err?.error_code === 404) {\n reject(new Error(`Telegram bot not found — the token may be wrong or the bot was deleted. Verify with @BotFather.\\n Details: ${message}`));\n } else if (err?.error_code === 429) {\n reject(new Error(`Telegram is rate-limiting this bot. Wait a minute and try again.\\n Details: ${message}`));\n } else if (err?.error_code === 403) {\n reject(new Error(`Telegram bot lacks permission for this action. Check bot scopes with @BotFather.\\n Details: ${message}`));\n } else {\n reject(new Error(`Telegram bot failed to start: ${message}`));\n }\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: 'memory', description: 'View and manage second brain memory' },\n { command: 'permissions', description: 'Change permission mode (Ask Me / Allow All)' },\n { command: 'tasks', description: 'List scheduled tasks' },\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 if (!fullContent.trim()) {\n logger.info({ targetId }, 'Telegram send: skipping empty message');\n return;\n }\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 this.deleteStatusMessage(targetId);\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 sendToolFeedback(toolName: string, args: Record<string, any>, targetId?: string): Promise<void> {\n const key = targetId || 'notification';\n this.stepCounters.set(key, (this.stepCounters.get(key) || 0) + 1);\n const step = this.stepCounters.get(key)!;\n const label = formatToolStep(toolName, args);\n await this.updateStatusMessage(`**Step ${step}.** ${label}`, targetId);\n }\n\n async sendStepDone(toolName: string, result: unknown, targetId?: string): Promise<void> {\n const key = targetId || 'notification';\n const step = this.stepCounters.get(key) || 0;\n const summary = formatToolResult(toolName, result);\n const current = this.statusText.get(key) || '';\n const line = summary ? `✓ ${summary}` : '✓ done';\n await this.updateStatusMessage(`${current}\\n${line}`, targetId);\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 if (full.trim()) {\n const html = mdToTelegram(full);\n const stripped = this.stripHtml(html);\n try {\n await this.bot.api.sendMessage(chatId, html, { parse_mode: 'HTML' });\n } catch {\n if (stripped.trim()) {\n try {\n await this.bot.api.sendMessage(chatId, stripped);\n } catch {\n // plain text send also failed\n }\n }\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 async askPermissionMode(targetId?: string): Promise<PermissionMode> {\n const chatIds = this.resolveTargetChatIds(targetId);\n const chatId = chatIds[0];\n if (!chatId || !this.bot) return 'ask-me';\n\n const id = `perm_mode_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const keyboard = new InlineKeyboard()\n .text('🔒 Ask Me', `${id}:ask-me`)\n .text('✅ Allow All', `${id}:allow-all`);\n\n const html = `<b>Permission Mode</b>\\nHow should Mercury handle risky actions this session?\\n\\n🔒 <b>Ask Me</b> — confirm before file writes, commands, and scope changes\\n✅ <b>Allow All</b> — auto-approve everything (scopes, commands, loops)`;\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}:ask-me`, () => resolve('ask-me'));\n this.pendingApprovals.set(`${id}:allow-all`, () => resolve('allow-all'));\n\n setTimeout(() => {\n this.pendingApprovals.delete(`${id}:ask-me`);\n this.pendingApprovals.delete(`${id}:allow-all`);\n resolve('ask-me');\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 async sendMemoryKeyboard(chatId: number): Promise<void> {\n if (!this.bot || !this.chatCommandContext) return;\n\n const summary = this.chatCommandContext.memorySummary();\n const lines = [\n `<b>Memory Overview</b>`,\n `Total memories: ${summary.total}`,\n `Learning: ${summary.learningPaused ? '⏸ PAUSED' : '✅ ACTIVE'}`,\n ];\n if (summary.profileSummary) {\n lines.push(`\\n<i>Profile: ${this.escapeHtml(summary.profileSummary)}</i>`);\n }\n const typeEntries = Object.entries(summary.byType);\n if (typeEntries.length > 0) {\n lines.push('\\n<b>By type:</b>');\n for (const [type, count] of typeEntries) {\n lines.push(` ${type}: ${count}`);\n }\n }\n\n const learningLabel = summary.learningPaused ? '▶ Resume' : '⏸ Pause';\n const keyboard = new InlineKeyboard()\n .text('📋 Overview', `${MEMORY_ACTION_PREFIX}:overview`)\n .text('🔍 Recent', `${MEMORY_ACTION_PREFIX}:recent`)\n .row()\n .text(learningLabel, `${MEMORY_ACTION_PREFIX}:toggle_learning`)\n .text('🗑 Clear All', `${MEMORY_ACTION_PREFIX}:clear_confirm`);\n\n await this.bot.api.sendMessage(chatId, lines.join('\\n'), {\n parse_mode: 'HTML',\n reply_markup: keyboard,\n }).catch(async () => {\n await this.bot!.api.sendMessage(chatId, lines.join('\\n'), { reply_markup: keyboard });\n });\n }\n\n private async handleMemoryCallback(ctx: any, data: string): Promise<void> {\n if (!this.bot || !this.chatCommandContext) {\n await ctx.answerCallbackQuery({ text: 'Not available' });\n return;\n }\n\n const action = data.slice(`${MEMORY_ACTION_PREFIX}:`.length);\n const chatId = ctx.callbackQuery.message?.chat?.id;\n if (!chatId) {\n await ctx.answerCallbackQuery({ text: 'Error' });\n return;\n }\n\n if (action === 'overview') {\n await ctx.answerCallbackQuery({ text: 'Overview' });\n const summary = this.chatCommandContext.memorySummary();\n const lines = [\n `<b>Memory Overview</b>`,\n `Total memories: ${summary.total}`,\n `Learning: ${summary.learningPaused ? '⏸ PAUSED' : '✅ ACTIVE'}`,\n ];\n if (summary.profileSummary) {\n lines.push(`\\n<i>Profile: ${this.escapeHtml(summary.profileSummary)}</i>`);\n }\n if (summary.activeSummary) {\n lines.push(`<i>Active: ${this.escapeHtml(summary.activeSummary)}</i>`);\n }\n const typeEntries = Object.entries(summary.byType);\n if (typeEntries.length > 0) {\n lines.push('\\n<b>By type:</b>');\n for (const [type, count] of typeEntries) {\n lines.push(` ${type}: ${count}`);\n }\n }\n await this.bot.api.sendMessage(chatId, lines.join('\\n'), { parse_mode: 'HTML' }).catch(async () => {\n await this.bot!.api.sendMessage(chatId, lines.join('\\n'));\n });\n return;\n }\n\n if (action === 'recent') {\n await ctx.answerCallbackQuery({ text: 'Recent memories' });\n const recent = this.chatCommandContext.memoryRecent(10);\n if (recent.length === 0) {\n await this.bot.api.sendMessage(chatId, 'No memories yet.').catch(() => {});\n return;\n }\n const lines = ['<b>Recent Memories:</b>\\n'];\n for (const r of recent) {\n const scope = r.scope === 'active' ? '⏳' : '📌';\n lines.push(`${scope} [${r.type}] ${this.escapeHtml(r.summary)}`);\n lines.push(` Confidence: ${r.confidence.toFixed(2)} | Evidence: ${r.evidenceKind} | Seen: ${r.evidenceCount}x`);\n }\n await this.bot.api.sendMessage(chatId, lines.join('\\n'), { parse_mode: 'HTML' }).catch(async () => {\n await this.bot!.api.sendMessage(chatId, lines.join('\\n'));\n });\n return;\n }\n\n if (action === 'toggle_learning') {\n const currentSummary = this.chatCommandContext.memorySummary();\n const currentlyPaused = currentSummary.learningPaused;\n this.chatCommandContext.memorySetLearningPaused(!currentlyPaused);\n const label = currentlyPaused ? '▶ Learning resumed' : '⏸ Learning paused';\n await ctx.answerCallbackQuery({ text: label });\n await this.bot.api.sendMessage(chatId, currentlyPaused\n ? 'Learning resumed. Mercury will remember new things from conversations.'\n : 'Learning paused. Mercury will not store new memories until resumed.',\n ).catch(() => {});\n await this.sendMemoryKeyboard(chatId);\n return;\n }\n\n if (action === 'clear_confirm') {\n const keyboard = new InlineKeyboard()\n .text('🗑 Yes, clear everything', `${MEMORY_ACTION_PREFIX}:clear_yes`)\n .text('✖ Cancel', `${MEMORY_ACTION_PREFIX}:clear_no`);\n await ctx.answerCallbackQuery({});\n await this.bot.api.sendMessage(chatId, '⚠️ Are you sure you want to clear <b>all</b> memories? This cannot be undone.', {\n parse_mode: 'HTML',\n reply_markup: keyboard,\n }).catch(async () => {\n await this.bot!.api.sendMessage(chatId, '⚠️ Are you sure you want to clear all memories?', { reply_markup: keyboard });\n });\n return;\n }\n\n if (action === 'clear_yes') {\n const cleared = this.chatCommandContext.memoryClear();\n await ctx.answerCallbackQuery({ text: `Cleared ${cleared} memories` });\n await this.bot.api.sendMessage(chatId, `Cleared ${cleared} memories.`).catch(() => {});\n return;\n }\n\n if (action === 'clear_no') {\n await ctx.answerCallbackQuery({ text: 'Cancelled' });\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 async updateStatusMessage(text: string, targetId?: string): Promise<void> {\n const chatIds = this.resolveTargetChatIds(targetId);\n if (chatIds.length === 0 || !this.bot) return;\n\n const key = targetId || 'notification';\n this.statusText.set(key, text);\n const html = mdToTelegram(text);\n\n for (const chatId of chatIds) {\n const existingMsgId = this.statusMessageIds.get(key);\n if (existingMsgId) {\n try {\n await this.bot.api.editMessageText(chatId, existingMsgId, html, { parse_mode: 'HTML' });\n return;\n } catch {\n this.statusMessageIds.delete(key);\n }\n }\n\n try {\n const msg = await this.bot.api.sendMessage(chatId, html, { parse_mode: 'HTML' });\n this.statusMessageIds.set(key, msg.message_id);\n } catch {\n try {\n const msg = await this.bot.api.sendMessage(chatId, this.stripHtml(html));\n this.statusMessageIds.set(key, msg.message_id);\n } catch {\n logger.warn({ chatId }, 'Failed to send status message');\n }\n }\n }\n }\n\n private async deleteStatusMessage(targetId?: string): Promise<void> {\n const key = targetId || 'notification';\n const msgId = this.statusMessageIds.get(key);\n if (msgId && this.bot) {\n const chatIds = this.resolveTargetChatIds(targetId);\n for (const chatId of chatIds) {\n await this.bot.api.deleteMessage(chatId, msgId).catch(() => {});\n }\n this.statusMessageIds.delete(key);\n this.statusText.delete(key);\n this.stepCounters.delete(key);\n }\n }\n\n resetStepCounter(targetId?: string): void {\n const key = targetId || 'notification';\n this.stepCounters.delete(key);\n this.statusText.delete(key);\n this.deleteStatusMessage(targetId);\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 { tool } from 'ai';\nimport { z } from 'zod';\nimport { zodSchema } from 'ai';\n\ntype AskUserCallback = (question: string, choices: string[], channelId: string, channelType: string) => Promise<string>;\n\nlet askUserHandler: AskUserCallback | null = null;\n\nexport function setAskUserHandler(handler: AskUserCallback): void {\n askUserHandler = handler;\n}\n\nexport function createAskUserTool(getContext: () => { channelId: string; channelType: string }) {\n return tool({\n description: 'Ask the user a question with multiple choice options. Use this when there are multiple viable approaches and you need the user to decide. Also use for confirmation before proceeding with important actions. The user selects from the choices you provide.',\n inputSchema: zodSchema(z.object({\n question: z.string().describe('The question to ask the user'),\n choices: z.array(z.string()).min(2).describe('List of choices for the user to pick from (minimum 2). Each choice should be a short, clear option label.'),\n })),\n execute: async ({ question, choices }) => {\n if (!askUserHandler) {\n return 'Unable to ask user: no handler available. Proceed with your best judgment.';\n }\n try {\n const ctx = getContext();\n const answer = await askUserHandler(question, choices, ctx.channelId, ctx.channelType);\n return answer;\n } catch (err: any) {\n return `User did not respond: ${err.message}. Proceed with your best judgment.`;\n }\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 { generateText, stepCountIs } from 'ai';\nimport type { ChannelMessage } from '../types/channel.js';\nimport type { SubAgentConfig, SubAgentResult, SubAgentStatus } from '../types/agent.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 { UserMemoryStore } from '../memory/user-memory.js';\nimport type { MercuryConfig } from '../utils/config.js';\nimport type { TokenBudget } from '../utils/tokens.js';\nimport type { CapabilityRegistry } from '../capabilities/registry.js';\nimport type { FileLockManager } from './file-lock.js';\nimport type { TaskBoard } from './task-board.js';\nimport { logger } from '../utils/logger.js';\n\nexport type ProgressCallback = (agentId: string, progress: string) => void;\nexport type CompletionCallback = (result: SubAgentResult) => void;\n\nexport class SubAgent {\n readonly config: SubAgentConfig;\n private status: SubAgentStatus = 'pending';\n private abortController: AbortController;\n private startTime: number = 0;\n private result: SubAgentResult | null = null;\n private filesModified: string[] = [];\n\n private agentConfig: MercuryConfig;\n private providers: ProviderRegistry;\n private identity: Identity;\n private shortTerm: ShortTermMemory;\n private longTerm: LongTermMemory;\n private episodic: EpisodicMemory;\n private userMemory: UserMemoryStore | null;\n private capabilities: CapabilityRegistry;\n private tokenBudget: TokenBudget;\n private fileLockManager: FileLockManager;\n private taskBoard: TaskBoard;\n\n private onProgress?: ProgressCallback;\n private onComplete?: CompletionCallback;\n\n constructor(\n config: SubAgentConfig,\n dependencies: {\n agentConfig: MercuryConfig;\n providers: ProviderRegistry;\n identity: Identity;\n shortTerm: ShortTermMemory;\n longTerm: LongTermMemory;\n episodic: EpisodicMemory;\n userMemory: UserMemoryStore | null;\n capabilities: CapabilityRegistry;\n tokenBudget: TokenBudget;\n fileLockManager: FileLockManager;\n taskBoard: TaskBoard;\n },\n ) {\n this.config = config;\n this.abortController = new AbortController();\n\n this.agentConfig = dependencies.agentConfig;\n this.providers = dependencies.providers;\n this.identity = dependencies.identity;\n this.shortTerm = dependencies.shortTerm;\n this.longTerm = dependencies.longTerm;\n this.episodic = dependencies.episodic;\n this.userMemory = dependencies.userMemory;\n this.capabilities = dependencies.capabilities;\n this.tokenBudget = dependencies.tokenBudget;\n this.fileLockManager = dependencies.fileLockManager;\n this.taskBoard = dependencies.taskBoard;\n }\n\n getStatus(): SubAgentStatus {\n return this.status;\n }\n\n abort(): void {\n this.abortController.abort();\n logger.info({ agentId: this.config.id }, 'Sub-agent abort signal sent');\n }\n\n isAborted(): boolean {\n return this.abortController.signal.aborted;\n }\n\n setProgressCallback(cb: ProgressCallback): void {\n this.onProgress = cb;\n }\n\n setCompletionCallback(cb: CompletionCallback): void {\n this.onComplete = cb;\n }\n\n async run(): Promise<SubAgentResult> {\n this.status = 'running';\n this.startTime = Date.now();\n\n this.taskBoard.update(this.config.id, {\n status: 'running',\n startedAt: this.startTime,\n progress: 'Starting task...',\n });\n\n logger.info({ agentId: this.config.id, task: this.config.task.slice(0, 80) }, 'Sub-agent starting');\n\n try {\n const systemPrompt = this.buildSystemPrompt();\n const messages: any[] = [];\n\n messages.push({\n role: 'user',\n content: this.config.task,\n });\n\n this.taskBoard.update(this.config.id, { progress: 'Processing...' });\n\n const originalCwd = this.capabilities.getCwd();\n if (this.config.workingDirectory) {\n this.capabilities.setCwd(this.config.workingDirectory);\n }\n\n this.capabilities.permissions.setAutoApproveAll(true);\n this.capabilities.permissions.addTempScope('/', true, true);\n\n this.capabilities.setChannelContext(\n this.config.sourceChannelId || 'internal',\n this.config.sourceChannelType || 'internal',\n );\n\n try {\n const provider = this.providers.getDefault();\n const maxSteps = this.config.maxSteps || 10;\n\n logger.info({ agentId: this.config.id, provider: provider.name, maxSteps }, 'Sub-agent generating response');\n\n if (this.onProgress) {\n this.onProgress(this.config.id, 'Calling LLM provider...');\n }\n\n const result = await generateText({\n model: provider.getModelInstance(),\n system: systemPrompt,\n messages,\n tools: this.capabilities.getTools(),\n stopWhen: stepCountIs(maxSteps),\n abortSignal: this.abortController.signal,\n onStepFinish: async ({ toolCalls, toolResults }) => {\n if (this.abortController.signal.aborted) return;\n\n if (toolCalls && toolResults && toolCalls.length > 0) {\n const names = toolCalls.map((tc: any) => tc.toolName).join(', ');\n logger.info({ agentId: this.config.id, tools: names }, 'Sub-agent tool step');\n\n for (let i = 0; i < toolCalls.length; i++) {\n const tc = toolCalls[i];\n const toolName = tc.toolName as string;\n\n if (['write_file', 'edit_file', 'create_file', 'delete_file'].includes(toolName)) {\n const filePath = (tc.input as any)?.path || (tc.input as any)?.filePath;\n if (filePath) {\n const acquired = this.fileLockManager.acquire(filePath, this.config.id, 'write');\n if (!acquired) {\n this.filesModified.push(filePath);\n }\n }\n }\n\n if (['read_file', 'list_dir'].includes(toolName)) {\n const filePath = (tc.input as any)?.path || (tc.input as any)?.filePath;\n if (filePath) {\n this.fileLockManager.acquire(filePath, this.config.id, 'read');\n }\n }\n }\n\n if (this.onProgress) {\n this.onProgress(this.config.id, `Using: ${names}`);\n }\n }\n },\n });\n\n if (this.abortController.signal.aborted) {\n this.status = 'halted';\n const duration = Date.now() - this.startTime;\n this.result = {\n agentId: this.config.id,\n task: this.config.task,\n status: 'halted',\n output: 'Task was halted by user.',\n filesModified: this.filesModified,\n duration,\n tokenUsage: {\n input: result.usage?.inputTokens ?? 0,\n output: result.usage?.outputTokens ?? 0,\n },\n };\n\n this.taskBoard.update(this.config.id, {\n status: 'halted',\n completedAt: Date.now(),\n result: this.result.output,\n });\n\n return this.result;\n }\n\n const finalText = (result.text || '').trim() || '(no text response)';\n\n this.tokenBudget.recordUsage({\n provider: provider.name,\n model: provider.getModel(),\n inputTokens: result.usage?.inputTokens ?? 0,\n outputTokens: result.usage?.outputTokens ?? 0,\n totalTokens: (result.usage?.inputTokens ?? 0) + (result.usage?.outputTokens ?? 0),\n channelType: 'internal',\n });\n\n this.episodic.record({\n type: 'message',\n summary: `Sub-agent ${this.config.id}: ${this.config.task.slice(0, 60)} → ${finalText.slice(0, 60)}`,\n channelType: 'internal',\n });\n\n this.status = 'completed';\n const duration = Date.now() - this.startTime;\n this.result = {\n agentId: this.config.id,\n task: this.config.task,\n status: 'completed',\n output: finalText,\n filesModified: this.filesModified,\n duration,\n tokenUsage: {\n input: result.usage?.inputTokens ?? 0,\n output: result.usage?.outputTokens ?? 0,\n },\n };\n\n this.taskBoard.update(this.config.id, {\n status: 'completed',\n completedAt: Date.now(),\n result: finalText,\n progress: 'Task completed',\n });\n\n logger.info({ agentId: this.config.id, duration }, 'Sub-agent completed');\n\n return this.result;\n } finally {\n if (this.config.workingDirectory) {\n this.capabilities.setCwd(originalCwd);\n }\n this.capabilities.permissions.setAutoApproveAll(false);\n this.capabilities.permissions.clearElevation();\n this.fileLockManager.releaseAll(this.config.id);\n }\n } catch (err: any) {\n if (this.abortController.signal.aborted) {\n this.status = 'halted';\n const duration = Date.now() - this.startTime;\n this.result = {\n agentId: this.config.id,\n task: this.config.task,\n status: 'halted',\n output: 'Task was halted by user.',\n filesModified: this.filesModified,\n duration,\n tokenUsage: { input: 0, output: 0 },\n };\n\n this.taskBoard.update(this.config.id, {\n status: 'halted',\n completedAt: Date.now(),\n result: this.result.output,\n });\n\n return this.result;\n }\n\n this.status = 'failed';\n const duration = Date.now() - this.startTime;\n this.result = {\n agentId: this.config.id,\n task: this.config.task,\n status: 'failed',\n output: `Task failed: ${err.message}`,\n error: err.message,\n filesModified: this.filesModified,\n duration,\n tokenUsage: { input: 0, output: 0 },\n };\n\n this.taskBoard.update(this.config.id, {\n status: 'failed',\n completedAt: Date.now(),\n result: this.result.output,\n error: err.message,\n });\n\n logger.error({ agentId: this.config.id, err }, 'Sub-agent failed');\n\n return this.result;\n }\n }\n\n private buildSystemPrompt(): string {\n let prompt = this.identity.getSystemPrompt(this.agentConfig.identity);\n\n prompt += `\\n\\nYou are a sub-agent (ID: ${this.config.id}) working independently on a specific task.`;\n prompt += `\\nTask: ${this.config.task}`;\n prompt += `\\nYou have full permissions for this task. Focus only on completing this task efficiently.`;\n if (this.config.workingDirectory) {\n prompt += `\\nWorking directory: ${this.config.workingDirectory}`;\n }\n if (this.config.allowedTools && this.config.allowedTools.length > 0) {\n prompt += `\\nAllowed tools: ${this.config.allowedTools.join(', ')}`;\n }\n prompt += `\\nWhen done, provide a clear summary of what you accomplished.`;\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 toolsList = this.config.allowedTools\n ? toolNames.filter(t => this.config.allowedTools!.includes(t))\n : toolNames;\n prompt += `\\n\\nAvailable tools: ${toolsList.join(', ')}`;\n\n return prompt;\n }\n}","import { resolve, dirname } from 'node:path';\nimport { logger } from '../utils/logger.js';\nimport type { FileLock } from '../types/agent.js';\n\nexport class FileLockManager {\n private locks: Map<string, FileLock[]> = new Map();\n\n acquire(filePath: string, agentId: string, mode: 'read' | 'write'): boolean {\n const normalizedPath = resolve(filePath);\n const existing = this.locks.get(normalizedPath) || [];\n\n if (mode === 'read') {\n const writeLock = existing.find(l => l.mode === 'write');\n if (writeLock && writeLock.agentId !== agentId) {\n logger.debug({ path: normalizedPath, lockedBy: writeLock.agentId }, 'File locked for writing, cannot acquire read lock');\n return false;\n }\n const existingLock = existing.find(l => l.agentId === agentId && l.mode === 'read');\n if (existingLock) return true;\n const lock: FileLock = {\n filePath: normalizedPath,\n agentId,\n mode: 'read',\n acquiredAt: Date.now(),\n };\n existing.push(lock);\n this.locks.set(normalizedPath, existing);\n logger.debug({ path: normalizedPath, agentId, mode: 'read' }, 'Read lock acquired');\n return true;\n }\n\n if (mode === 'write') {\n const conflictingLock = existing.find(l => l.agentId !== agentId);\n if (conflictingLock) {\n logger.debug({ path: normalizedPath, lockedBy: conflictingLock.agentId, lockMode: conflictingLock.mode }, 'File locked, cannot acquire write lock');\n return false;\n }\n const existingWriteLock = existing.find(l => l.agentId === agentId && l.mode === 'write');\n if (existingWriteLock) return true;\n\n this.releaseAllFor(agentId, normalizedPath);\n\n const lock: FileLock = {\n filePath: normalizedPath,\n agentId,\n mode: 'write',\n acquiredAt: Date.now(),\n };\n this.locks.set(normalizedPath, [lock]);\n logger.debug({ path: normalizedPath, agentId, mode: 'write' }, 'Write lock acquired');\n return true;\n }\n\n return false;\n }\n\n release(filePath: string, agentId: string): void {\n const normalizedPath = resolve(filePath);\n const existing = this.locks.get(normalizedPath);\n if (!existing) return;\n\n const updated = existing.filter(l => !(l.agentId === agentId));\n if (updated.length === 0) {\n this.locks.delete(normalizedPath);\n } else {\n this.locks.set(normalizedPath, updated);\n }\n logger.debug({ path: normalizedPath, agentId }, 'Lock released');\n }\n\n private releaseAllFor(agentId: string, normalizedPath: string): void {\n const existing = this.locks.get(normalizedPath);\n if (!existing) return;\n\n const updated = existing.filter(l => l.agentId !== agentId);\n if (updated.length === 0) {\n this.locks.delete(normalizedPath);\n } else {\n this.locks.set(normalizedPath, updated);\n }\n }\n\n releaseAll(agentId: string): void {\n for (const [normalizedPath, locks] of this.locks.entries()) {\n const updated = locks.filter(l => l.agentId !== agentId);\n if (updated.length === 0) {\n this.locks.delete(normalizedPath);\n } else {\n this.locks.set(normalizedPath, updated);\n }\n }\n logger.debug({ agentId }, 'All locks released for agent');\n }\n\n isLocked(filePath: string): boolean {\n const normalizedPath = resolve(filePath);\n return (this.locks.get(normalizedPath)?.length ?? 0) > 0;\n }\n\n isWriteLockedByOther(filePath: string, agentId: string): boolean {\n const normalizedPath = resolve(filePath);\n const existing = this.locks.get(normalizedPath) || [];\n return existing.some(l => l.mode === 'write' && l.agentId !== agentId);\n }\n\n getLocksFor(agentId: string): FileLock[] {\n const result: FileLock[] = [];\n for (const locks of this.locks.values()) {\n for (const lock of locks) {\n if (lock.agentId === agentId) {\n result.push(lock);\n }\n }\n }\n return result;\n }\n\n getAllLocks(): FileLock[] {\n const result: FileLock[] = [];\n for (const locks of this.locks.values()) {\n result.push(...locks);\n }\n return result;\n }\n\n clearAll(): void {\n this.locks.clear();\n logger.info('All file locks cleared');\n }\n\n detectDeadlock(): string[] | null {\n const allLocks = this.getAllLocks();\n const writeLocks = allLocks.filter(l => l.mode === 'write');\n if (writeLocks.length < 2) return null;\n\n const agentLocks = new Map<string, Set<string>>();\n for (const lock of allLocks) {\n if (!agentLocks.has(lock.agentId)) {\n agentLocks.set(lock.agentId, new Set());\n }\n agentLocks.get(lock.agentId)!.add(lock.filePath);\n }\n\n const agentIds = [...agentLocks.keys()];\n for (let i = 0; i < agentIds.length; i++) {\n for (let j = i + 1; j < agentIds.length; j++) {\n const a = agentIds[i];\n const b = agentIds[j];\n const locksA = agentLocks.get(a)!;\n const locksB = agentLocks.get(b)!;\n\n const aWantsBHas = [...locksB].some(p => this.isWriteLockedByOther(p, a));\n const bWantsAHas = [...locksA].some(p => this.isWriteLockedByOther(p, b));\n\n if (aWantsBHas && bWantsAHas) {\n return [a, b];\n }\n }\n }\n\n return null;\n }\n}","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { getMercuryHome } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\nimport type { TaskBoardEntry, SubAgentStatus } from '../types/agent.js';\n\nconst TASK_BOARD_FILE = 'task-board.json';\n\nexport class TaskBoard {\n private entries: Map<string, TaskBoardEntry> = new Map();\n\n load(): void {\n const filePath = this.getFilePath();\n if (existsSync(filePath)) {\n try {\n const data = readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(data);\n for (const entry of parsed) {\n this.entries.set(entry.agentId, entry);\n }\n logger.info({ count: this.entries.size }, 'Task board loaded');\n } catch (err) {\n logger.warn({ err }, 'Failed to load task board, starting fresh');\n this.entries.clear();\n }\n }\n }\n\n save(): void {\n const filePath = this.getFilePath();\n const dir = join(getMercuryHome(), 'memory');\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, JSON.stringify([...this.entries.values()], null, 2), 'utf-8');\n }\n\n create(entry: TaskBoardEntry): void {\n this.entries.set(entry.agentId, entry);\n this.save();\n logger.info({ agentId: entry.agentId, task: entry.task.slice(0, 50) }, 'Task board entry created');\n }\n\n update(agentId: string, partial: Partial<TaskBoardEntry>): void {\n const existing = this.entries.get(agentId);\n if (!existing) {\n logger.warn({ agentId }, 'Task board entry not found for update');\n return;\n }\n this.entries.set(agentId, { ...existing, ...partial });\n this.save();\n }\n\n get(agentId: string): TaskBoardEntry | undefined {\n return this.entries.get(agentId);\n }\n\n getAll(): TaskBoardEntry[] {\n return [...this.entries.values()];\n }\n\n getByStatus(status: SubAgentStatus): TaskBoardEntry[] {\n return [...this.entries.values()].filter(e => e.status === status);\n }\n\n remove(agentId: string): void {\n this.entries.delete(agentId);\n this.save();\n logger.info({ agentId }, 'Task board entry removed');\n }\n\n clear(): void {\n this.entries.clear();\n this.save();\n logger.info('Task board cleared');\n }\n\n getActiveCount(): number {\n let count = 0;\n for (const entry of this.entries.values()) {\n if (entry.status === 'running' || entry.status === 'pending' || entry.status === 'paused') {\n count++;\n }\n }\n return count;\n }\n\n getRunningCount(): number {\n return this.getByStatus('running').length;\n }\n\n nextId(): string {\n const existing = [...this.entries.keys()].filter(k => k.startsWith('a'));\n let max = 0;\n for (const id of existing) {\n const num = parseInt(id.slice(1), 10);\n if (!isNaN(num) && num > max) max = num;\n }\n return `a${max + 1}`;\n }\n\n private getFilePath(): string {\n return join(getMercuryHome(), 'memory', TASK_BOARD_FILE);\n }\n}","import { cpus, totalmem, freemem } from 'node:os';\nimport { logger } from '../utils/logger.js';\nimport type { ResourceUsage } from '../types/agent.js';\n\nconst MB = 1024 * 1024;\nconst RAM_PER_AGENT_MB = 2048;\nconst MIN_FREE_RAM_MB = 1024;\n\nexport class ResourceManager {\n private maxConcurrent: number;\n private userOverride: number | null = null;\n\n constructor() {\n this.maxConcurrent = this.calculateMaxConcurrent();\n logger.info(\n { cpuCores: cpus().length, maxConcurrent: this.maxConcurrent, totalRAM: `${Math.round(totalmem() / MB)}MB` },\n 'ResourceManager initialized',\n );\n }\n\n private calculateMaxConcurrent(): number {\n const cpuCount = cpus().length;\n const availableMB = freemem() / MB;\n const totalMB = totalmem() / MB;\n\n const cpuBasedMax = Math.max(1, cpuCount - 1);\n const ramBasedMax = Math.max(1, Math.floor((availableMB - MIN_FREE_RAM_MB) / RAM_PER_AGENT_MB));\n const systemMax = Math.max(1, Math.floor((totalMB / 2) / RAM_PER_AGENT_MB));\n\n let max = Math.min(cpuBasedMax, ramBasedMax, systemMax);\n\n if (max < 1) max = 1;\n if (availableMB < MIN_FREE_RAM_MB * 2) max = 1;\n\n return max;\n }\n\n getMaxConcurrent(): number {\n return this.userOverride ?? this.maxConcurrent;\n }\n\n setMaxConcurrent(n: number): void {\n this.userOverride = Math.max(1, n);\n logger.info({ max: this.userOverride }, 'User override set for max concurrent sub-agents');\n }\n\n clearOverride(): void {\n this.userOverride = null;\n logger.info('User override cleared, using auto-detected max concurrent');\n }\n\n canSpawn(): boolean {\n this.maxConcurrent = this.calculateMaxConcurrent();\n const effective = this.userOverride ?? this.maxConcurrent;\n return effective > 0;\n }\n\n getResourceUsage(activeAgents: number, queuedAgents: number, tokenBudgetRemaining: number): ResourceUsage {\n this.maxConcurrent = this.calculateMaxConcurrent();\n return {\n cpuCores: cpus().length,\n maxConcurrentAgents: this.userOverride ?? this.maxConcurrent,\n activeAgents,\n queuedAgents,\n systemMemoryMB: Math.round(totalmem() / MB),\n availableMemoryMB: Math.round(freemem() / MB),\n tokenBudgetRemaining,\n };\n }\n\n refresh(): void {\n this.maxConcurrent = this.calculateMaxConcurrent();\n logger.debug({ maxConcurrent: this.maxConcurrent }, 'Resource limits refreshed');\n }\n}","import type { MercuryConfig } from '../utils/config.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 { UserMemoryStore } from '../memory/user-memory.js';\nimport type { TokenBudget } from '../utils/tokens.js';\nimport type { CapabilityRegistry } from '../capabilities/registry.js';\nimport type { SubAgentConfig, SubAgentResult, SubAgentStatus, ResourceUsage } from '../types/agent.js';\nimport type { ChannelRegistry } from '../channels/registry.js';\nimport { SubAgent } from './sub-agent.js';\nimport { FileLockManager } from './file-lock.js';\nimport { TaskBoard } from './task-board.js';\nimport { ResourceManager } from './resource-manager.js';\nimport { logger } from '../utils/logger.js';\n\nexport type NotifyCallback = (channelType: string, channelId: string, message: string) => Promise<void>;\nexport type AgentLifecycleCallback = (event: { type: 'progress' | 'complete'; agentId: string; progress?: string; result?: SubAgentResult }) => void;\n\nexport class SubAgentSupervisor {\n private activeAgents: Map<string, SubAgent> = new Map();\n private waitQueue: SubAgentConfig[] = [];\n private fileLockManager: FileLockManager;\n private taskBoard: TaskBoard;\n private resourceManager: ResourceManager;\n\n private agentConfig: MercuryConfig;\n private providers: ProviderRegistry;\n private identity: Identity;\n private shortTerm: ShortTermMemory;\n private longTerm: LongTermMemory;\n private episodic: EpisodicMemory;\n private userMemory: UserMemoryStore | null;\n private capabilities: CapabilityRegistry;\n private tokenBudget: TokenBudget;\n private channels: ChannelRegistry;\n\n private notifyCallback?: NotifyCallback;\n private lifecycleCallback?: AgentLifecycleCallback;\n private pausedAgents: Set<string> = new Set();\n private pauseResolvers: Map<string, () => void> = new Map();\n\n constructor(\n dependencies: {\n agentConfig: MercuryConfig;\n providers: ProviderRegistry;\n identity: Identity;\n shortTerm: ShortTermMemory;\n longTerm: LongTermMemory;\n episodic: EpisodicMemory;\n userMemory: UserMemoryStore | null;\n capabilities: CapabilityRegistry;\n tokenBudget: TokenBudget;\n channels: ChannelRegistry;\n },\n ) {\n this.agentConfig = dependencies.agentConfig;\n this.providers = dependencies.providers;\n this.identity = dependencies.identity;\n this.shortTerm = dependencies.shortTerm;\n this.longTerm = dependencies.longTerm;\n this.episodic = dependencies.episodic;\n this.userMemory = dependencies.userMemory;\n this.capabilities = dependencies.capabilities;\n this.tokenBudget = dependencies.tokenBudget;\n this.channels = dependencies.channels;\n\n this.fileLockManager = new FileLockManager();\n this.taskBoard = new TaskBoard();\n this.taskBoard.load();\n this.resourceManager = new ResourceManager();\n }\n\n setNotifyCallback(cb: NotifyCallback): void {\n this.notifyCallback = cb;\n }\n\n setLifecycleCallback(cb: AgentLifecycleCallback): void {\n this.lifecycleCallback = cb;\n }\n\n private async notify(channelType: string, channelId: string, message: string): Promise<void> {\n if (this.notifyCallback) {\n await this.notifyCallback(channelType, channelId, message);\n }\n }\n\n async spawn(config: Omit<SubAgentConfig, 'id'>): Promise<string> {\n const id = this.taskBoard.nextId();\n const fullConfig: SubAgentConfig = { ...config, id };\n\n if (!this.resourceManager.canSpawn()) {\n logger.info({ task: config.task.slice(0, 50) }, 'No resources available, queuing sub-agent task');\n this.waitQueue.push(fullConfig);\n this.taskBoard.create({\n agentId: id,\n task: config.task,\n status: 'pending',\n priority: config.priority || 'normal',\n startedAt: Date.now(),\n filesLocked: [],\n progress: 'Queued — waiting for resources',\n sourceChannelId: config.sourceChannelId,\n sourceChannelType: config.sourceChannelType,\n });\n return id;\n }\n\n const running = this.getRunningCount();\n const max = this.resourceManager.getMaxConcurrent();\n if (running >= max) {\n logger.info({ task: config.task.slice(0, 50), running, max }, 'Max concurrent agents reached, queuing');\n this.waitQueue.push(fullConfig);\n this.taskBoard.create({\n agentId: id,\n task: config.task,\n status: 'pending',\n priority: config.priority || 'normal',\n startedAt: Date.now(),\n filesLocked: [],\n progress: 'Queued — waiting for slot',\n sourceChannelId: config.sourceChannelId,\n sourceChannelType: config.sourceChannelType,\n });\n return id;\n }\n\n this.taskBoard.create({\n agentId: id,\n task: config.task,\n status: 'pending',\n priority: config.priority || 'normal',\n startedAt: Date.now(),\n filesLocked: [],\n progress: 'Initializing...',\n sourceChannelId: config.sourceChannelId,\n sourceChannelType: config.sourceChannelType,\n });\n\n this.startAgentInBackground(fullConfig);\n return id;\n }\n\n private startAgentInBackground(config: SubAgentConfig): void {\n const subAgent = new SubAgent(config, {\n agentConfig: this.agentConfig,\n providers: this.providers,\n identity: this.identity,\n shortTerm: this.shortTerm,\n longTerm: this.longTerm,\n episodic: this.episodic,\n userMemory: this.userMemory,\n capabilities: this.capabilities,\n tokenBudget: this.tokenBudget,\n fileLockManager: this.fileLockManager,\n taskBoard: this.taskBoard,\n });\n\n this.activeAgents.set(config.id, subAgent);\n\n subAgent.setProgressCallback((agentId, progress) => {\n this.taskBoard.update(agentId, { progress });\n this.lifecycleCallback?.({ type: 'progress', agentId, progress });\n\n const entry = this.taskBoard.get(agentId);\n if (entry) {\n const channelType = entry.sourceChannelType || 'cli';\n const channelId = entry.sourceChannelId || 'cli';\n this.notify(channelType, channelId, `🔄 Agent ${agentId}: ${progress}`).catch(() => {});\n }\n });\n\n logger.info({ agentId: config.id, task: config.task.slice(0, 60) }, 'Starting sub-agent');\n\n subAgent.run().then(async (result) => {\n await this.onAgentComplete(config.id, result);\n }).catch(async (err) => {\n logger.error({ agentId: config.id, err }, 'Sub-agent threw unexpected error');\n this.taskBoard.update(config.id, {\n status: 'failed',\n completedAt: Date.now(),\n error: String(err),\n progress: 'Failed unexpectedly',\n });\n this.activeAgents.delete(config.id);\n this.fileLockManager.releaseAll(config.id);\n this.pausedAgents.delete(config.id);\n await this.processWaitQueue();\n });\n }\n\n private async onAgentComplete(agentId: string, result: SubAgentResult): Promise<void> {\n this.activeAgents.delete(agentId);\n this.fileLockManager.releaseAll(agentId);\n this.pausedAgents.delete(agentId);\n\n logger.info({ agentId, status: result.status, duration: result.duration }, 'Sub-agent completed');\n this.lifecycleCallback?.({ type: 'complete', agentId, result });\n\n const entry = this.taskBoard.get(agentId);\n if (entry) {\n const channelType = entry.sourceChannelType || 'cli';\n const channelId = entry.sourceChannelId || 'cli';\n\n if (result.status === 'completed') {\n const duration = result.duration ? `${(result.duration / 1000).toFixed(1)}s` : 'unknown';\n const output = result.output.length > 500 ? result.output.slice(0, 500) + '...' : result.output;\n await this.notify(channelType, channelId, `✅ **Agent ${agentId}** completed (${duration}): \"${entry.task.slice(0, 40)}\"\\n\\n${output}\\n\\nType a message to continue.`);\n } else if (result.status === 'halted') {\n await this.notify(channelType, channelId, `⛔ **Agent ${agentId}** halted: \"${entry.task.slice(0, 40)}\"`);\n } else if (result.status === 'failed') {\n await this.notify(channelType, channelId, `❌ **Agent ${agentId}** failed: \"${entry.task.slice(0, 40)}\"\\nError: ${result.error || 'unknown'}`);\n }\n }\n\n await this.processWaitQueue();\n }\n\n private async processWaitQueue(): Promise<void> {\n while (this.waitQueue.length > 0) {\n const running = this.getRunningCount();\n if (running >= this.resourceManager.getMaxConcurrent()) break;\n\n const nextConfig = this.waitQueue.shift()!;\n this.taskBoard.update(nextConfig.id, { status: 'running', progress: 'Starting...' });\n this.startAgentInBackground(nextConfig);\n }\n }\n\n async halt(agentId: string): Promise<boolean> {\n const agent = this.activeAgents.get(agentId);\n if (!agent) {\n logger.warn({ agentId }, 'Cannot halt — agent not found');\n return false;\n }\n\n agent.abort();\n\n this.waitQueue = this.waitQueue.filter(c => c.id !== agentId);\n\n const entry = this.taskBoard.get(agentId);\n if (entry && entry.status === 'pending') {\n this.taskBoard.update(agentId, {\n status: 'halted',\n completedAt: Date.now(),\n progress: 'Halted while queued',\n });\n }\n\n return true;\n }\n\n async haltAll(): Promise<void> {\n for (const [agentId, agent] of this.activeAgents.entries()) {\n agent.abort();\n }\n\n for (const config of this.waitQueue) {\n this.taskBoard.update(config.id, {\n status: 'halted',\n completedAt: Date.now(),\n progress: 'Halted while queued',\n });\n }\n this.waitQueue = [];\n }\n\n async pause(agentId: string): Promise<boolean> {\n const agent = this.activeAgents.get(agentId);\n if (!agent) return false;\n\n this.pausedAgents.add(agentId);\n this.taskBoard.update(agentId, { status: 'paused', progress: 'Paused — waiting to resume' });\n\n logger.info({ agentId }, 'Sub-agent paused (will stop after current step)');\n return true;\n }\n\n async resume(agentId: string): Promise<boolean> {\n if (!this.pausedAgents.has(agentId)) return false;\n\n this.pausedAgents.delete(agentId);\n this.taskBoard.update(agentId, { status: 'running', progress: 'Resumed' });\n\n const resolve = this.pauseResolvers.get(agentId);\n if (resolve) {\n resolve();\n this.pauseResolvers.delete(agentId);\n }\n\n logger.info({ agentId }, 'Sub-agent resumed');\n return true;\n }\n\n clearTaskBoard(): void {\n this.fileLockManager.clearAll();\n this.taskBoard.clear();\n }\n\n getResourceUsage(): ResourceUsage {\n return this.resourceManager.getResourceUsage(\n this.getRunningCount(),\n this.waitQueue.length,\n this.tokenBudget.getRemaining(),\n );\n }\n\n getActiveAgents(): Array<{ id: string; task: string; status: SubAgentStatus; progress?: string }> {\n const agents: Array<{ id: string; task: string; status: SubAgentStatus; progress?: string }> = [];\n\n for (const [id, agent] of this.activeAgents.entries()) {\n const entry = this.taskBoard.get(id);\n agents.push({\n id,\n task: agent.config.task,\n status: entry?.status || agent.getStatus(),\n progress: entry?.progress,\n });\n }\n\n for (const config of this.waitQueue) {\n agents.push({\n id: config.id,\n task: config.task,\n status: 'pending',\n progress: 'Queued',\n });\n }\n\n return agents;\n }\n\n getTaskBoard(): TaskBoard {\n return this.taskBoard;\n }\n\n getFileLockManager(): FileLockManager {\n return this.fileLockManager;\n }\n\n getResourceManager(): ResourceManager {\n return this.resourceManager;\n }\n\n setMaxConcurrent(n: number): void {\n this.resourceManager.setMaxConcurrent(n);\n }\n\n clearMaxConcurrentOverride(): void {\n this.resourceManager.clearOverride();\n }\n\n private getRunningCount(): number {\n let count = 0;\n for (const agent of this.activeAgents.values()) {\n const status = agent.getStatus();\n if (status === 'running' || status === 'paused') count++;\n }\n return count;\n }\n}\n","import { readFileSync, writeFileSync, existsSync } from 'node:fs';\nimport { createServer, IncomingMessage, ServerResponse } from 'node:http';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { getMercuryHome, saveConfig } from '../utils/config.js';\nimport type { MercuryConfig } from '../utils/config.js';\nimport { logger } from '../utils/logger.js';\n\nconst execAsync = promisify(exec);\n\nconst SPOTIFY_AUTH_URL = 'https://accounts.spotify.com/authorize';\nconst SPOTIFY_TOKEN_URL = 'https://accounts.spotify.com/api/token';\nconst SPOTIFY_API_BASE = 'https://api.spotify.com/v1';\n\nconst REQUIRED_SCOPES = [\n 'user-read-playback-state',\n 'user-modify-playback-state',\n 'user-read-currently-playing',\n 'user-library-read',\n 'user-library-modify',\n 'playlist-read-private',\n 'playlist-modify-private',\n 'playlist-modify-public',\n 'user-top-read',\n 'user-read-recently-played',\n];\n\nexport class SpotifyClient {\n private config: MercuryConfig;\n private accessToken: string;\n private refreshToken: string;\n private expiresAt: number;\n private deviceId: string;\n private isPremium: boolean | null = null;\n\n constructor(config: MercuryConfig) {\n this.config = config;\n this.accessToken = config.spotify.accessToken;\n this.refreshToken = config.spotify.refreshToken;\n this.expiresAt = config.spotify.expiresAt ? new Date(config.spotify.expiresAt).getTime() : 0;\n this.deviceId = config.spotify.deviceId;\n }\n\n isAuthenticated(): boolean {\n return !!(this.accessToken || this.refreshToken);\n }\n\n async authenticate(): Promise<string> {\n const clientId = this.config.spotify.clientId;\n const constClientSecret = this.config.spotify.clientSecret;\n const redirectUri = this.config.spotify.redirectUri;\n\n if (!clientId || !constClientSecret) {\n throw new Error('Spotify Client ID and Secret must be configured. Set SPOTIFY_CLIENT_ID and SPOTIFY_CLIENT_SECRET.');\n }\n\n const scope = REQUIRED_SCOPES.join(' ');\n const state = Math.random().toString(36).substring(2, 15);\n const authUrl = `${SPOTIFY_AUTH_URL}?response_type=code&client_id=${clientId}&scope=${encodeURIComponent(scope)}&redirect_uri=${encodeURIComponent(redirectUri)}&state=${state}`;\n\n return new Promise((resolve, reject) => {\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url || '/', `http://localhost`);\n\n if (url.pathname === '/' || url.pathname === '/login') {\n res.writeHead(302, { Location: authUrl });\n res.end();\n return;\n }\n\n if (url.pathname === '/callback') {\n const code = url.searchParams.get('code');\n const error = url.searchParams.get('error');\n const returnedState = url.searchParams.get('state');\n\n if (error) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(`<!DOCTYPE html><html><head><title>Mercury — Spotify Auth</title><style>body{font-family:system-ui;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#1a1a2e;color:#eee;text-align:center;}h1{color:#e74c3c;}p{color:#aaa;}</style></head><body><div><h1>Authorization Failed</h1><p>Spotify authorization was denied or cancelled.</p><p>You can close this tab.</p></div></body></html>`);\n server.close();\n reject(new Error(`Spotify auth error: ${error}`));\n return;\n }\n\n if (returnedState !== state) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(`<!DOCTYPE html><html><head><title>Mercury — Spotify Auth</title><style>body{font-family:system-ui;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#1a1a2e;color:#eee;text-align:center;}h1{color:#e74c3c;}p{color:#aaa;}</style></head><body><div><h1>Security Error</h1><p>State mismatch. Please try again.</p></div></body></html>`);\n server.close();\n reject(new Error('Spotify auth state mismatch'));\n return;\n }\n\n try {\n const tokenResponse: any = await this.exchangeCode(code!, redirectUri);\n this.accessToken = tokenResponse.access_token;\n this.refreshToken = tokenResponse.refresh_token;\n this.expiresAt = Date.now() + tokenResponse.expires_in * 1000;\n\n this.config.spotify.accessToken = this.accessToken;\n this.config.spotify.refreshToken = this.refreshToken;\n this.config.spotify.expiresAt = new Date(this.expiresAt).toISOString();\n this.config.spotify.scopes = REQUIRED_SCOPES;\n this.config.spotify.enabled = true;\n saveConfig(this.config);\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`<!DOCTYPE html><html><head><title>Mercury — Spotify Connected</title><style>body{font-family:system-ui;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#1a1a2e;color:#eee;text-align:center;}h1{color:#1db954;font-size:2em;}p{color:#aaa;max-width:400px;margin:0 auto;}.logo{font-size:3em;margin-bottom:0.3em;}</style></head><body><div><div class=\"logo\">&#x266B;</div><h1>Mercury x Spotify</h1><p>Your Spotify account is now connected!</p><p>You can close this tab and return to Mercury.</p><p style=\"margin-top:2em;color:#666;\">Try saying: \"play some chill music\"</p></div></body></html>`);\n server.close();\n logger.info('Spotify authentication successful');\n\n this.saveAccountInfo().catch(() => {});\n this.checkPremium().then((premium) => {\n if (!premium) {\n logger.warn('Spotify account is not Premium — playback control will be unavailable');\n }\n }).catch(() => {});\n\n resolve(this.accessToken);\n } catch (err) {\n res.writeHead(500, { 'Content-Type': 'text/html' });\n res.end(`<!DOCTYPE html><html><head><title>Mercury — Spotify Auth</title><style>body{font-family:system-ui;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#1a1a2e;color:#eee;text-align:center;}h1{color:#e74c3c;}p{color:#aaa;}</style></head><body><div><h1>Token Exchange Failed</h1><p>Could not exchange authorization code for tokens.</p><p>Please run /spotify auth again.</p></div></body></html>`);\n server.close();\n reject(err);\n }\n } else {\n res.writeHead(404);\n res.end('Not found');\n }\n });\n\n const port = new URL(redirectUri).port || '8888';\n server.listen(parseInt(port, 10), () => {\n logger.info({ port }, 'Spotify OAuth server listening');\n const callbackUrl = `http://127.0.0.1:${port}/login`;\n console.log(`\\n ${'─'.repeat(50)}`);\n console.log(` Spotify Authorization`);\n console.log(` ${'─'.repeat(50)}`);\n console.log(` Opening browser for Spotify login...`);\n console.log(` If browser doesn't open, visit:\\n ${callbackUrl}\\n`);\n console.log(` ${'─'.repeat(50)}\\n`);\n const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';\n execAsync(`${cmd} \"${callbackUrl}\"`).catch(() => {\n console.log(` Could not auto-open browser. Visit:\\n ${callbackUrl}\\n`);\n });\n });\n\n server.setTimeout(300000, () => {\n server.close();\n reject(new Error('Spotify auth timed out after 5 minutes'));\n });\n });\n }\n\n getAuthUrl(): string {\n const clientId = this.config.spotify.clientId;\n const redirectUri = this.config.spotify.redirectUri;\n const scope = REQUIRED_SCOPES.join(' ');\n const state = Math.random().toString(36).substring(2, 15);\n return `${SPOTIFY_AUTH_URL}?response_type=code&client_id=${clientId}&scope=${encodeURIComponent(scope)}&redirect_uri=${encodeURIComponent(redirectUri)}&state=${state}`;\n }\n\n async authenticateWithCode(code: string): Promise<string> {\n const redirectUri = this.config.spotify.redirectUri;\n const tokenResponse: any = await this.exchangeCode(code, redirectUri);\n this.accessToken = tokenResponse.access_token;\n this.refreshToken = tokenResponse.refresh_token;\n this.expiresAt = Date.now() + tokenResponse.expires_in * 1000;\n\n this.config.spotify.accessToken = this.accessToken;\n this.config.spotify.refreshToken = this.refreshToken;\n this.config.spotify.expiresAt = new Date(this.expiresAt).toISOString();\n this.config.spotify.scopes = REQUIRED_SCOPES;\n this.config.spotify.enabled = true;\n saveConfig(this.config);\n\n logger.info('Spotify authentication successful (manual code)');\n\n this.saveAccountInfo().catch(() => {});\n this.checkPremium().then((premium) => {\n if (!premium) {\n logger.warn('Spotify account is not Premium — playback control will be unavailable');\n }\n }).catch(() => {});\n\n return this.accessToken;\n }\n\n private async exchangeCode(code: string, redirectUri: string): Promise<any> {\n const response = await fetch(SPOTIFY_TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Authorization': 'Basic ' + Buffer.from(`${this.config.spotify.clientId}:${this.config.spotify.clientSecret}`).toString('base64'),\n },\n body: new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n redirect_uri: redirectUri,\n }).toString(),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Spotify token exchange failed: ${response.status} ${text}`);\n }\n\n return response.json();\n }\n\n private async ensureToken(): Promise<string> {\n if (this.accessToken && Date.now() < this.expiresAt - 60000) {\n return this.accessToken;\n }\n\n if (!this.refreshToken) {\n throw new Error('Spotify not authenticated. Run /spotify auth to connect.');\n }\n\n logger.info('Refreshing Spotify access token');\n const response = await fetch(SPOTIFY_TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Authorization': 'Basic ' + Buffer.from(`${this.config.spotify.clientId}:${this.config.spotify.clientSecret}`).toString('base64'),\n },\n body: new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: this.refreshToken,\n }).toString(),\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n this.accessToken = '';\n this.refreshToken = '';\n this.config.spotify.accessToken = '';\n this.config.spotify.refreshToken = '';\n saveConfig(this.config);\n throw new Error('Spotify refresh token expired. Run /spotify auth again.');\n }\n const text = await response.text();\n throw new Error(`Spotify token refresh failed: ${response.status} ${text}`);\n }\n\n const data: any = await response.json();\n this.accessToken = data.access_token;\n this.expiresAt = Date.now() + data.expires_in * 1000;\n if (data.refresh_token) {\n this.refreshToken = data.refresh_token;\n }\n\n this.config.spotify.accessToken = this.accessToken;\n this.config.spotify.refreshToken = this.refreshToken;\n this.config.spotify.expiresAt = new Date(this.expiresAt).toISOString();\n saveConfig(this.config);\n\n return this.accessToken;\n }\n\n private async apiRequest(endpoint: string, options: RequestInit = {}): Promise<any> {\n const token = await this.ensureToken();\n const url = endpoint.startsWith('http') ? endpoint : `${SPOTIFY_API_BASE}${endpoint}`;\n\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n if (response.status === 204) return null;\n if (response.status === 401) {\n this.accessToken = '';\n throw new Error('Spotify token expired. Retrying...');\n }\n if (response.status === 403) {\n const isPlaybackEndpoint = endpoint.includes('/me/player') && !endpoint.includes('/me/player/devices') && !endpoint.includes('/me/player/currently-playing') && !endpoint.includes('/me/player/queue');\n if (isPlaybackEndpoint) {\n throw new Error('Spotify Premium is required for playback control (play, pause, skip, volume, etc.). Read-only features like search, playlists, and liked songs work on free accounts.');\n }\n const text = await response.text();\n throw new Error(`Spotify API error 403: ${text.slice(0, 200)}`);\n }\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Spotify API error ${response.status}: ${text.slice(0, 200)}`);\n }\n\n return response.json();\n }\n\n async search(query: string, type: string = 'track', limit: number = 20): Promise<any> {\n return this.apiRequest(`/search?q=${encodeURIComponent(query)}&type=${type}&limit=${limit}`);\n }\n\n async getDevices(): Promise<any> {\n return this.apiRequest('/me/player/devices');\n }\n\n async play(uris?: string[], contextUri?: string, deviceId?: string): Promise<string> {\n const id = deviceId || this.deviceId;\n const endpoint = id ? `/me/player/play?device_id=${id}` : '/me/player/play';\n const body: any = {};\n if (contextUri) body.context_uri = contextUri;\n if (uris) body.uris = uris;\n if (!contextUri && !uris) {\n // Resume playback\n }\n\n await this.apiRequest(endpoint, { method: 'PUT', body: JSON.stringify(body) });\n return contextUri\n ? `Playing context: ${contextUri}${id ? ` on device ${id}` : ''}`\n : uris\n ? `Playing ${uris.length} track(s)${id ? ` on device ${id}` : ''}`\n : 'Playback resumed';\n }\n\n async pause(deviceId?: string): Promise<string> {\n const id = deviceId || this.deviceId;\n const endpoint = id ? `/me/player/pause?device_id=${id}` : '/me/player/pause';\n await this.apiRequest(endpoint, { method: 'PUT' });\n return 'Playback paused';\n }\n\n async next(deviceId?: string): Promise<string> {\n const id = deviceId || this.deviceId;\n const endpoint = id ? `/me/player/next?device_id=${id}` : '/me/player/next';\n await this.apiRequest(endpoint, { method: 'POST' });\n return 'Skipped to next track';\n }\n\n async previous(deviceId?: string): Promise<string> {\n const id = deviceId || this.deviceId;\n const endpoint = id ? `/me/player/previous?device_id=${id}` : '/me/player/previous';\n await this.apiRequest(endpoint, { method: 'POST' });\n return 'Skipped to previous track';\n }\n\n async seek(positionMs: number, deviceId?: string): Promise<string> {\n const id = deviceId || this.deviceId;\n const endpoint = id ? `/me/player/seek?position_ms=${positionMs}&device_id=${id}` : `/me/player/seek?position_ms=${positionMs}`;\n await this.apiRequest(endpoint, { method: 'PUT' });\n return `Seeked to ${Math.floor(positionMs / 1000)}s`;\n }\n\n async setRepeat(state: string, deviceId?: string): Promise<string> {\n const id = deviceId || this.deviceId;\n const endpoint = id ? `/me/player/repeat?state=${state}&device_id=${id}` : `/me/player/repeat?state=${state}`;\n await this.apiRequest(endpoint, { method: 'PUT' });\n const labels: Record<string, string> = { off: 'off', track: 'repeat one', context: 'repeat all' };\n return `Repeat mode: ${labels[state] || state}`;\n }\n\n async setShuffle(state: boolean, deviceId?: string): Promise<string> {\n const id = deviceId || this.deviceId;\n const endpoint = id ? `/me/player/shuffle?state=${state}&device_id=${id}` : `/me/player/shuffle?state=${state}`;\n await this.apiRequest(endpoint, { method: 'PUT' });\n return `Shuffle ${state ? 'on' : 'off'}`;\n }\n\n async setVolume(percent: number, deviceId?: string): Promise<string> {\n const id = deviceId || this.deviceId;\n const endpoint = id ? `/me/player/volume?volume_percent=${percent}&device_id=${id}` : `/me/player/volume?volume_percent=${percent}`;\n await this.apiRequest(endpoint, { method: 'PUT' });\n return `Volume set to ${percent}%`;\n }\n\n async addToQueue(uri: string, deviceId?: string): Promise<string> {\n const id = deviceId || this.deviceId;\n const endpoint = id ? `/me/player/queue?uri=${encodeURIComponent(uri)}&device_id=${id}` : `/me/player/queue?uri=${encodeURIComponent(uri)}`;\n await this.apiRequest(endpoint, { method: 'POST' });\n return 'Added to queue';\n }\n\n async getCurrentlyPlaying(): Promise<any> {\n return this.apiRequest('/me/player/currently-playing');\n }\n\n async getPlaybackState(): Promise<any> {\n return this.apiRequest('/me/player');\n }\n\n async getQueue(): Promise<any> {\n return this.apiRequest('/me/player/queue');\n }\n\n async getLikedTracks(limit: number = 50, offset: number = 0): Promise<any> {\n return this.apiRequest(`/me/tracks?limit=${limit}&offset=${offset}`);\n }\n\n async likeTrack(ids: string): Promise<string> {\n await this.apiRequest('/me/tracks', { method: 'PUT', body: JSON.stringify({ ids: [ids] }) });\n return 'Track saved to library';\n }\n\n async unlikeTrack(ids: string): Promise<string> {\n await this.apiRequest(`/me/tracks?ids=${ids}`, { method: 'DELETE' });\n return 'Track removed from library';\n }\n\n async getTopTracks(timeRange: string = 'medium_term', limit: number = 20): Promise<any> {\n return this.apiRequest(`/me/top/tracks?time_range=${timeRange}&limit=${limit}`);\n }\n\n async getTopArtists(timeRange: string = 'medium_term', limit: number = 20): Promise<any> {\n return this.apiRequest(`/me/top/artists?time_range=${timeRange}&limit=${limit}`);\n }\n\n async getPlaylists(limit: number = 50): Promise<any> {\n return this.apiRequest(`/me/playlists?limit=${limit}`);\n }\n\n async getPlaylist(playlistId: string): Promise<any> {\n return this.apiRequest(`/playlists/${playlistId}`);\n }\n\n async createPlaylist(name: string, description: string = '', isPublic: boolean = false): Promise<any> {\n const userId = await this.getMe();\n return this.apiRequest(`/users/${userId.id}/playlists`, {\n method: 'POST',\n body: JSON.stringify({ name, description, public: isPublic }),\n });\n }\n\n async addTracksToPlaylist(playlistId: string, uris: string[]): Promise<any> {\n return this.apiRequest(`/playlists/${playlistId}/tracks`, {\n method: 'POST',\n body: JSON.stringify({ uris }),\n });\n }\n\n async getMe(): Promise<any> {\n return this.apiRequest('/me');\n }\n\n async checkPremium(): Promise<boolean | null> {\n if (this.isPremium !== null) return this.isPremium;\n try {\n const me = await this.getMe();\n this.isPremium = me.product === 'premium';\n this.config.spotify.product = me.product || '';\n saveConfig(this.config);\n return this.isPremium;\n } catch (err: any) {\n logger.warn({ err: err.message }, 'Failed to check Spotify premium status');\n return null;\n }\n }\n\n getPremiumStatus(): boolean | null {\n return this.isPremium;\n }\n\n setDevice(deviceId: string): void {\n this.deviceId = deviceId;\n this.config.spotify.deviceId = deviceId;\n saveConfig(this.config);\n }\n\n getDeviceId(): string {\n return this.deviceId;\n }\n\n async saveAccountInfo(): Promise<void> {\n try {\n const me = await this.getMe();\n this.config.spotify.accountName = me.display_name || '';\n this.config.spotify.accountId = me.id || '';\n this.config.spotify.product = me.product || '';\n this.isPremium = me.product === 'premium';\n saveConfig(this.config);\n } catch {\n logger.warn('Could not fetch Spotify account info');\n }\n }\n\n getAccountName(): string {\n return this.config.spotify.accountName;\n }\n\n getAccountId(): string {\n return this.config.spotify.accountId;\n }\n\n getProduct(): string {\n return this.config.spotify.product;\n }\n\n logout(): void {\n this.accessToken = '';\n this.refreshToken = '';\n this.expiresAt = 0;\n this.isPremium = null;\n this.deviceId = '';\n this.config.spotify.accessToken = '';\n this.config.spotify.refreshToken = '';\n this.config.spotify.expiresAt = '';\n this.config.spotify.scopes = [];\n this.config.spotify.deviceId = '';\n this.config.spotify.accountName = '';\n this.config.spotify.accountId = '';\n this.config.spotify.product = '';\n this.config.spotify.enabled = false;\n saveConfig(this.config);\n logger.info('Spotify logged out');\n }\n\n async getNowPlayingText(): Promise<string> {\n try {\n const data = await this.getCurrentlyPlaying();\n if (!data || !data.item) return 'Nothing playing';\n\n const track = data.item;\n const artists = track.artists?.map((a: any) => a.name).join(', ') || 'Unknown';\n const name = track.name || 'Unknown';\n const progress = data.progress_ms ? Math.floor(data.progress_ms / 1000) : 0;\n const duration = track.duration_ms ? Math.floor(track.duration_ms / 1000) : 0;\n const bar = this.formatProgressBar(progress, duration);\n\n return `${artists} — ${name} ${bar}`;\n } catch {\n return 'Could not fetch playback state';\n }\n }\n\n private formatProgressBar(progress: number, duration: number): string {\n if (!duration) return '';\n const pct = Math.floor((progress / duration) * 20);\n const filled = '█'.repeat(pct);\n const empty = '░'.repeat(20 - pct);\n return `[${filled}${empty}] ${this.formatTime(progress)}/${this.formatTime(duration)}`;\n }\n\n private formatTime(seconds: number): string {\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${m}:${s.toString().padStart(2, '0')}`;\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 getCliChannel(): CLIChannel | undefined {\n return this.channels.get('cli') as CLIChannel | undefined;\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 agentId?: string;\n}\n\nconst TOKEN_FILE = 'token-usage.json';\n\nfunction safeNumber(value: any): number {\n if (value === null || value === undefined) return 0;\n const n = Number(value);\n return isNaN(n) ? 0 : n;\n}\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 private perAgentUsage: Map<string, number> = new Map();\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 safeNumber(this.dailyUsed) + estimatedTokens <= safeNumber(this.dailyBudget);\n }\n\n isOverBudget(): boolean {\n this.resetIfNewDay();\n if (this.forceNext) {\n this.forceNext = false;\n return false;\n }\n return safeNumber(this.dailyUsed) >= safeNumber(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.perAgentUsage.clear();\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 inputTokens = safeNumber(entry.inputTokens);\n const outputTokens = safeNumber(entry.outputTokens);\n const totalTokens = safeNumber(entry.totalTokens) || inputTokens + outputTokens;\n const safeEntry = { ...entry, inputTokens, outputTokens, totalTokens };\n const logEntry: TokenLogEntry = { ...safeEntry, timestamp: Date.now() };\n this.dailyUsed += totalTokens;\n this.requestLog.push(logEntry);\n\n if (entry.agentId) {\n const agentUsed = this.perAgentUsage.get(entry.agentId) ?? 0;\n this.perAgentUsage.set(entry.agentId, agentUsed + totalTokens);\n }\n\n this.persist();\n }\n\n getUsageByAgent(agentId: string): { used: number; percentage: number } {\n this.resetIfNewDay();\n const used = this.perAgentUsage.get(agentId) ?? 0;\n const budget = safeNumber(this.dailyBudget);\n return { used, percentage: budget > 0 ? (used / budget) * 100 : 0 };\n }\n\n getRemaining(): number {\n this.resetIfNewDay();\n return Math.max(0, safeNumber(this.dailyBudget) - safeNumber(this.dailyUsed));\n }\n\n getUsagePercentage(): number {\n this.resetIfNewDay();\n const budget = safeNumber(this.dailyBudget);\n const used = safeNumber(this.dailyUsed);\n return budget > 0 ? (used / budget) * 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.perAgentUsage.clear();\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 const restored = safeNumber(data.dailyUsed);\n if (!isNaN(restored)) {\n this.dailyUsed = restored;\n }\n this.requestLog = (data.requestLog ?? []).map((entry: any) => ({\n ...entry,\n inputTokens: safeNumber(entry.inputTokens),\n outputTokens: safeNumber(entry.outputTokens),\n totalTokens: safeNumber(entry.totalTokens),\n }));\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 'del /s /q C:\\\\*',\n 'rmdir /s /q C:\\\\*',\n 'format *',\n 'icacls * C:\\\\* /grant',\n 'net user *',\n 'netsh *',\n 'reg delete *',\n 'cmd /c rd /s /q *',\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 'dir *',\n 'type *',\n 'cd *',\n 'where *',\n 'tree *',\n 'findstr *',\n 'tasklist *',\n 'systeminfo *',\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 'xcopy *',\n 'robocopy *',\n 'del *',\n 'rd /s *',\n 'powershell *',\n 'cmd /c *',\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 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 isAutoApproveAll(): boolean {\n return this.autoApproveAll;\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 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 if (!this.autoApproveAll && this.askHandler && this.currentChannelType !== 'internal') {\n return this.requestScopeExternal(path, mode);\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 const baseCmd = trimmed.split(/\\s+/)[0];\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.askHandler && this.currentChannelType !== 'internal') {\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.askHandler && this.currentChannelType !== 'internal') {\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 const mergeArray = (existing: string[] | undefined, defaults: string[]): string[] => {\n if (!existing) return [...defaults];\n const combined = new Set([...defaults, ...existing]);\n return [...combined];\n };\n\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: mergeArray(parsed.capabilities?.shell?.blocked, DEFAULT_MANIFEST.capabilities.shell.blocked),\n autoApproved: mergeArray(parsed.capabilities?.shell?.autoApproved, DEFAULT_MANIFEST.capabilities.shell.autoApproved),\n needsApproval: mergeArray(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } from 'ai';\nimport { z } from 'zod';\nimport { existsSync, readdirSync, statSync } from 'node:fs';\nimport { resolve, isAbsolute, join } 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 inputSchema: zodSchema(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 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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } from 'ai';\nimport { z } from 'zod';\nimport { spawn } from 'node:child_process';\nimport { resolve, isAbsolute } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport type { PermissionManager } from '../permissions.js';\nimport { logger } from '../../utils/logger.js';\n\nconst DEFAULT_TIMEOUT_MS = 120_000;\nconst MAX_BUFFER = 1024 * 1024;\nconst SIGTERM_GRACE_MS = 5_000;\n\ninterface ExecResult {\n stdout: string;\n stderr: string;\n exitCode: number | null;\n timedOut: boolean;\n}\n\nfunction executeCommand(command: string, cwd: string, timeoutMs: number): Promise<ExecResult> {\n return new Promise((resolve) => {\n let stdout = '';\n let stderr = '';\n let settled = false;\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n let sigkillHandle: ReturnType<typeof setTimeout> | undefined;\n\n const child = spawn(command, [], {\n cwd,\n shell: true,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n const finish = (exitCode: number | null, timedOut: boolean) => {\n if (settled) return;\n settled = true;\n if (timeoutHandle) clearTimeout(timeoutHandle);\n if (sigkillHandle) clearTimeout(sigkillHandle);\n resolve({ stdout, stderr, exitCode, timedOut });\n };\n\n child.stdout.on('data', (chunk: Buffer) => {\n if (stdout.length < MAX_BUFFER) {\n stdout += chunk.toString();\n if (stdout.length > MAX_BUFFER) {\n stdout = stdout.slice(stdout.length - MAX_BUFFER);\n }\n }\n });\n\n child.stderr.on('data', (chunk: Buffer) => {\n if (stderr.length < MAX_BUFFER) {\n stderr += chunk.toString();\n if (stderr.length > MAX_BUFFER) {\n stderr = stderr.slice(stderr.length - MAX_BUFFER);\n }\n }\n });\n\n child.on('error', (err) => {\n stderr += `\\nProcess error: ${err.message}`;\n finish(null, false);\n });\n\n child.on('exit', (code) => {\n finish(code, false);\n });\n\n if (timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n if (!settled) {\n child.kill('SIGTERM');\n sigkillHandle = setTimeout(() => {\n if (!settled) {\n child.kill('SIGKILL');\n }\n }, SIGTERM_GRACE_MS);\n finish(null, true);\n }\n }, timeoutMs);\n }\n });\n}\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 prompt the user for approval before execution.\nThe optional timeout parameter sets how long (in seconds) the command can run before being killed (default 120, max 600). For very long builds or test suites, set a higher timeout or use /bg to run the command in the background.`,\n inputSchema: zodSchema(z.object({\n command: z.string().describe('The shell command to execute'),\n timeout: z.number().min(10).max(600).default(120).optional().describe('Timeout in seconds (default 120, max 600). Increase for long-running commands like builds or test suites.'),\n })),\n execute: async ({ command, timeout }) => {\n const check = await permissions.checkShellCommand(command);\n if (!check.allowed) {\n return `Error: ${check.reason}`;\n }\n\n const cwd = getCwd();\n const timeoutMs = (timeout ?? 120) * 1000;\n\n try {\n logger.info({ cmd: command, cwd, timeoutMs }, 'Executing shell command');\n const result = await executeCommand(command, cwd, timeoutMs);\n\n if (result.stdout || result.stderr) {\n detectCd(command, cwd, setCwd);\n }\n\n if (result.timedOut) {\n const partial = result.stdout?.trim();\n let msg = `⏱ Command timed out after ${timeoutMs / 1000}s.`;\n if (partial) {\n const lines = partial.split('\\n');\n const preview = lines.length > 30 ? lines.slice(-30).join('\\n') : partial;\n msg += `\\nPartial output:\\n${preview}`;\n }\n msg += '\\n\\nTo run long commands in the background, use /bg <command>.';\n return msg;\n }\n\n const trimmedOutput = result.stdout?.trim() || '(no output)';\n if (result.exitCode !== 0 && result.exitCode !== null) {\n let msg = `Command exited with code ${result.exitCode}`;\n if (trimmedOutput && trimmedOutput !== '(no output)') msg += `\\nOutput: ${trimmedOutput}`;\n if (result.stderr?.trim()) msg += `\\nError: ${result.stderr.trim()}`;\n return msg;\n }\n\n detectCd(command, cwd, setCwd);\n return trimmedOutput;\n } catch (err: any) {\n let msg = `Command failed: ${err.message || String(err)}`;\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(/^~/, homedir());\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(/^~/, homedir());\n const resolved = isAbsolute(target) ? target : resolve(currentCwd, target);\n if (existsSync(resolved)) {\n setCwd(resolved);\n }\n }\n}","import { tool, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(z.object({})),\n execute: async () => {\n return tokenBudget.getStatusText();\n },\n });\n}","import { tool, zodSchema } 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 inputSchema: zodSchema(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: 20000, 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, zodSchema } 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 inputSchema: zodSchema(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: 30000, 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, zodSchema } 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 inputSchema: zodSchema(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: 20000, 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, zodSchema } 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 inputSchema: zodSchema(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: 20000, 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, zodSchema } from 'ai';\nimport { z } from 'zod';\nimport { execSync } from 'node:child_process';\nimport { writeFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\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 inputSchema: zodSchema(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 cwd = getCwd();\n const msgFilePath = join(cwd, '.git', 'MERCU_MSG');\n writeFileSync(msgFilePath, fullMessage, 'utf-8');\n const result = execSync(`git commit -F \"${msgFilePath}\"`, {\n encoding: 'utf-8',\n timeout: 20000,\n cwd,\n });\n try { unlinkSync(msgFilePath); } catch {}\n return result.trim() || 'Committed successfully.';\n } catch (err: any) {\n try { unlinkSync(join(getCwd(), '.git', 'MERCU_MSG')); } catch {}\n const stderr = err.stderr?.trim() || '';\n if (stderr.includes('nothing to commit')) {\n return 'Nothing to commit \\u2014 no staged changes.';\n }\n return `Error: ${stderr || err.message}`;\n }\n },\n });\n}","import { tool, zodSchema } 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 inputSchema: zodSchema(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) {\n return `Error: ${check.reason}`;\n }\n\n try {\n const result = execSync(cmd, { encoding: 'utf-8', timeout: 60000, 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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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, zodSchema } 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 inputSchema: zodSchema(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(), 30000);\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 30 seconds.`;\n }\n return `Error fetching ${url}: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { zodSchema } from 'ai';\nimport type { SpotifyClient } from '../../spotify/client.js';\n\nexport function createSpotifySearchTool(spotify: SpotifyClient) {\n return tool({\n description: 'Search Spotify for tracks, artists, albums, or playlists. Returns matching items with Spotify URIs that can be used with play/queue commands.',\n inputSchema: zodSchema(z.object({\n query: z.string().describe('Search query (song name, artist, album, etc.)'),\n type: z.enum(['track', 'artist', 'album', 'playlist']).optional().default('track').describe('Type of item to search for'),\n limit: z.number().optional().default(10).describe('Maximum number of results (1-50)'),\n })),\n execute: async ({ query, type, limit }) => {\n try {\n const data = await spotify.search(query, type, limit);\n if (!data) return 'No results found.';\n\n const items = data[`${type}s`]?.items || [];\n if (items.length === 0) return `No ${type}s found for \"${query}\".`;\n\n const lines = [`**Search results for \"${query}\"** (${type}s):\\n`];\n for (const item of items.slice(0, 10)) {\n if (type === 'track') {\n const artists = item.artists?.map((a: any) => a.name).join(', ');\n lines.push(`• ${artists} — ${item.name} [${item.album?.name || ''}] (uri: ${item.uri})`);\n } else if (type === 'artist') {\n lines.push(`• ${item.name} (${item.followers?.total?.toLocaleString() || '?'} followers) (uri: ${item.uri})`);\n } else if (type === 'album') {\n const artists = item.artists?.map((a: any) => a.name).join(', ');\n lines.push(`• ${artists} — ${item.name} (${item.release_date?.slice(0, 4) || '?'}) (uri: ${item.uri})`);\n } else if (type === 'playlist') {\n lines.push(`• ${item.name} by ${item.owner?.display_name || '?'} (${item.tracks?.total || '?'} tracks) (uri: ${item.uri})`);\n }\n }\n return lines.join('\\n');\n } catch (err: any) {\n return `Search failed: ${err.message}`;\n }\n },\n });\n}\n\nexport function createSpotifyPlayTool(spotify: SpotifyClient) {\n return tool({\n description: 'Play a track, album, or playlist on Spotify. Use URIs from search results. Resumes playback if no URI provided.',\n inputSchema: zodSchema(z.object({\n uri: z.string().optional().describe('Spotify URI to play (e.g. spotify:track:xxx, spotify:album:xxx, spotify:playlist:xxx)'),\n deviceId: z.string().optional().describe('Specific device ID to play on (use list_devices to see available)'),\n })),\n execute: async ({ uri, deviceId }) => {\n try {\n if (uri) {\n const isContext = uri.startsWith('spotify:album:') || uri.startsWith('spotify:playlist:');\n if (isContext) {\n return await spotify.play(undefined, uri, deviceId);\n }\n return await spotify.play([uri], undefined, deviceId);\n }\n return await spotify.play(undefined, undefined, deviceId);\n } catch (err: any) {\n return `Play failed: ${err.message}`;\n }\n },\n });\n}\n\nexport function createSpotifyPauseTool(spotify: SpotifyClient) {\n return tool({\n description: 'Pause the current Spotify playback.',\n inputSchema: zodSchema(z.object({\n deviceId: z.string().optional().describe('Device ID to pause on'),\n })),\n execute: async ({ deviceId }) => {\n try {\n return await spotify.pause(deviceId);\n } catch (err: any) {\n return `Pause failed: ${err.message}`;\n }\n },\n });\n}\n\nexport function createSpotifyNextTool(spotify: SpotifyClient) {\n return tool({\n description: 'Skip to the next track on Spotify.',\n inputSchema: zodSchema(z.object({})),\n execute: async () => {\n try { return await spotify.next(); } catch (err: any) { return `Next failed: ${err.message}`; }\n },\n });\n}\n\nexport function createSpotifyPreviousTool(spotify: SpotifyClient) {\n return tool({\n description: 'Skip to the previous track on Spotify.',\n inputSchema: zodSchema(z.object({})),\n execute: async () => {\n try { return await spotify.previous(); } catch (err: any) { return `Previous failed: ${err.message}`; }\n },\n });\n}\n\nexport function createSpotifyNowPlayingTool(spotify: SpotifyClient) {\n return tool({\n description: 'Get information about what is currently playing on Spotify, including track name, artist, progress, and duration.',\n inputSchema: zodSchema(z.object({})),\n execute: async () => {\n try {\n const data = await spotify.getCurrentlyPlaying();\n if (!data || !data.item) return 'Nothing is currently playing.';\n\n const track = data.item;\n const artists = track.artists?.map((a: any) => a.name).join(', ') || 'Unknown';\n const progress = data.progress_ms ? Math.floor(data.progress_ms / 1000) : 0;\n const duration = track.duration_ms ? Math.floor(track.duration_ms / 1000) : 0;\n const pct = duration ? Math.floor((progress / duration) * 100) : 0;\n const shuffle = data.shuffle_state ? 'Shuffle on' : 'Shuffle off';\n const repeat = data.repeat_state || 'off';\n const isPlaying = data.is_playing ? '▶ Playing' : '⏸ Paused';\n\n const bar = formatBar(progress, duration);\n const lines = [\n `${isPlaying} — **${track.name}** by ${artists}`,\n `${bar} ${formatTime(progress)}/${formatTime(duration)} (${pct}%)`,\n `Album: ${track.album?.name || 'Unknown'} | ${shuffle} | Repeat: ${repeat}`,\n ];\n return lines.join('\\n');\n } catch (err: any) {\n return `Now playing check failed: ${err.message}`;\n }\n },\n });\n}\n\nexport function createSpotifyDevicesTool(spotify: SpotifyClient) {\n return tool({\n description: 'List available Spotify devices the user can play music on.',\n inputSchema: zodSchema(z.object({})),\n execute: async () => {\n try {\n const data = await spotify.getDevices();\n if (!data?.devices || data.devices.length === 0) return 'No active Spotify devices found. Open Spotify on a device first.';\n\n const lines = ['**Available Spotify devices:**\\n'];\n for (const device of data.devices) {\n const icon = device.is_active ? '▶' : '○';\n const type = device.type || 'Unknown';\n lines.push(`${icon} **${device.name}** (${type}) — id: \\`${device.id}\\`${device.is_active ? ' [active]' : ''}`);\n }\n lines.push('\\nUse `/spotify device <id>` to switch the active device.');\n return lines.join('\\n');\n } catch (err: any) {\n return `Device listing failed: ${err.message}`;\n }\n },\n });\n}\n\nexport function createSpotifyQueueTool(spotify: SpotifyClient) {\n return tool({\n description: 'Add a track to the Spotify playback queue by URI. Use URIs from search results.',\n inputSchema: zodSchema(z.object({\n uri: z.string().describe('Spotify track URI to add to queue (e.g. spotify:track:xxx)'),\n })),\n execute: async ({ uri }) => {\n try { return await spotify.addToQueue(uri); } catch (err: any) { return `Queue add failed: ${err.message}`; }\n },\n });\n}\n\nexport function createSpotifyLikeTool(spotify: SpotifyClient) {\n return tool({\n description: 'Like (save) a Spotify track to the user\\'s library.',\n inputSchema: zodSchema(z.object({\n trackId: z.string().describe('Spotify track ID (not the full URI, just the ID part)'),\n })),\n execute: async ({ trackId }) => {\n try { return await spotify.likeTrack(trackId); } catch (err: any) { return `Like failed: ${err.message}`; }\n },\n });\n}\n\nexport function createSpotifyVolumeTool(spotify: SpotifyClient) {\n return tool({\n description: 'Set Spotify playback volume percentage.',\n inputSchema: zodSchema(z.object({\n percent: z.number().min(0).max(100).describe('Volume percentage (0-100)'),\n })),\n execute: async ({ percent }) => {\n try { return await spotify.setVolume(percent); } catch (err: any) { return `Volume change failed: ${err.message}`; }\n },\n });\n}\n\nexport function createSpotifyShuffleTool(spotify: SpotifyClient) {\n return tool({\n description: 'Toggle Spotify shuffle on or off.',\n inputSchema: zodSchema(z.object({\n state: z.boolean().describe('true to enable shuffle, false to disable'),\n })),\n execute: async ({ state }) => {\n try { return await spotify.setShuffle(state); } catch (err: any) { return `Shuffle toggle failed: ${err.message}`; }\n },\n });\n}\n\nexport function createSpotifyRepeatTool(spotify: SpotifyClient) {\n return tool({\n description: 'Set Spotify repeat mode.',\n inputSchema: zodSchema(z.object({\n state: z.enum(['off', 'track', 'context']).describe('off = no repeat, track = repeat one, context = repeat all'),\n })),\n execute: async ({ state }) => {\n try { return await spotify.setRepeat(state); } catch (err: any) { return `Repeat change failed: ${err.message}`; }\n },\n });\n}\n\nexport function createSpotifyTopTracksTool(spotify: SpotifyClient) {\n return tool({\n description: 'Get the user\\'s top tracks on Spotify.',\n inputSchema: zodSchema(z.object({\n timeRange: z.enum(['short_term', 'medium_term', 'long_term']).optional().default('medium_term').describe('Time range: short_term (~4 weeks), medium_term (~6 months), long_term (years)'),\n limit: z.number().optional().default(20).describe('Number of tracks (1-50)'),\n })),\n execute: async ({ timeRange, limit }) => {\n try {\n const data = await spotify.getTopTracks(timeRange, limit);\n if (!data?.items?.length) return 'No top tracks found.';\n const lines = ['**Your Top Tracks:**\\n'];\n for (let i = 0; i < data.items.length; i++) {\n const t = data.items[i];\n const artists = t.artists?.map((a: any) => a.name).join(', ');\n lines.push(`${i + 1}. ${artists} — ${t.name} (uri: ${t.uri})`);\n }\n return lines.join('\\n');\n } catch (err: any) { return `Top tracks failed: ${err.message}`; }\n },\n });\n}\n\nexport function createSpotifyPlaylistsTool(spotify: SpotifyClient) {\n return tool({\n description: 'Get the user\\'s Spotify playlists.',\n inputSchema: zodSchema(z.object({})),\n execute: async () => {\n try {\n const data = await spotify.getPlaylists();\n if (!data?.items?.length) return 'No playlists found.';\n const lines = ['**Your Playlists:**\\n'];\n for (const p of data.items) {\n lines.push(`• **${p.name}** (${p.tracks?.total || '?'} tracks) — uri: ${p.uri}`);\n }\n return lines.join('\\n');\n } catch (err: any) { return `Playlists failed: ${err.message}`; }\n },\n });\n}\n\nfunction formatBar(progress: number, duration: number): string {\n if (!duration) return '';\n const pct = Math.floor((progress / duration) * 20);\n return `[${'█'.repeat(pct)}${'░'.repeat(20 - pct)}]`;\n}\n\nfunction formatTime(seconds: number): string {\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${m}:${s.toString().padStart(2, '0')}`;\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { zodSchema } from 'ai';\nimport type { SubAgentSupervisor } from '../../core/supervisor.js';\nimport type { CapabilityRegistry } from '../registry.js';\nimport { logger } from '../../utils/logger.js';\n\nexport function createDelegateTaskTool(supervisor: SubAgentSupervisor, capabilities: CapabilityRegistry) {\n return tool({\n description: 'Delegate a task to a sub-agent worker. Use this for complex, multi-step tasks that can run in parallel. The sub-agent works independently — you will be notified when it completes. You can continue handling other messages while sub-agents work.',\n inputSchema: zodSchema(z.object({\n task: z.string().describe('Clear description of the task for the sub-agent to complete'),\n workingDirectory: z.string().optional().describe('Working directory for the sub-agent (defaults to current directory)'),\n priority: z.enum(['low', 'normal', 'high']).optional().describe('Task priority (default: normal)'),\n allowedTools: z.array(z.string()).optional().describe('Optional list of tool names this sub-agent is allowed to use. If not specified, all tools are available.'),\n })),\n execute: async ({ task, workingDirectory, priority, allowedTools }) => {\n try {\n logger.info({ task: task.slice(0, 50) }, 'Delegating task to sub-agent');\n\n const { channelId, channelType } = capabilities.getChannelContext();\n\n const agentId = await supervisor.spawn({\n task,\n workingDirectory,\n priority: priority || 'normal',\n allowedTools,\n sourceChannelId: channelId,\n sourceChannelType: channelType,\n });\n\n const resourceInfo = supervisor.getResourceUsage();\n\n let response = `🤖 Multi-agent mode activated.\\n\\n`;\n response += `**Agent ${agentId}** is now working on: \"${task.slice(0, 80)}${task.length > 80 ? '...' : ''}\"\\n`;\n response += `Active agents: ${resourceInfo.activeAgents}/${resourceInfo.maxConcurrentAgents}\\n\\n`;\n response += `You can continue chatting while the agent works. I'll notify you when it's done.\\n`;\n response += `Use /agents to check status.`;\n\n return response;\n } catch (err: any) {\n logger.error({ err }, 'Failed to delegate task');\n return `Failed to delegate task: ${err.message}`;\n }\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { zodSchema } from 'ai';\nimport type { SubAgentSupervisor } from '../../core/supervisor.js';\n\nexport function createListAgentsTool(supervisor: SubAgentSupervisor) {\n return tool({\n description: 'List all active and queued sub-agents with their status, task, and progress. Use this to check what sub-agents are currently working on.',\n inputSchema: zodSchema(z.object({})),\n execute: async () => {\n const agents = supervisor.getActiveAgents();\n const resourceInfo = supervisor.getResourceUsage();\n\n if (agents.length === 0) {\n return `No active sub-agents.\\nMax concurrent: ${resourceInfo.maxConcurrentAgents} (auto) | CPU: ${resourceInfo.cpuCores} cores`;\n }\n\n const statusIcons: Record<string, string> = {\n pending: '\\u{1f535}',\n running: '\\u{1f7e2}',\n paused: '\\u{1f7e1}',\n completed: '\\u2705',\n failed: '\\u274c',\n halted: '\\u26d4',\n };\n\n const lines = [\n `**Sub-Agents** (${agents.length})`,\n '',\n ];\n\n for (const agent of agents) {\n const icon = statusIcons[agent.status] || '\\u2753';\n const taskPreview = agent.task.length > 40 ? agent.task.slice(0, 40) + '...' : agent.task;\n lines.push(`${icon} **${agent.id}** ${taskPreview}`);\n if (agent.progress) {\n lines.push(` ${agent.progress}`);\n }\n }\n\n lines.push('');\n lines.push(`Max concurrent: ${resourceInfo.maxConcurrentAgents} (auto) | CPU: ${resourceInfo.cpuCores} cores`);\n lines.push(`Active: ${resourceInfo.activeAgents} | Queued: ${resourceInfo.queuedAgents}`);\n\n return lines.join('\\n');\n },\n });\n}","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { zodSchema } from 'ai';\nimport type { SubAgentSupervisor } from '../../core/supervisor.js';\nimport { logger } from '../../utils/logger.js';\n\nexport function createStopAgentTool(supervisor: SubAgentSupervisor) {\n return tool({\n description: 'Stop a running or queued sub-agent, or stop all sub-agents. The agent will finish its current tool step before halting.',\n inputSchema: zodSchema(z.object({\n agentId: z.string().describe('ID of the sub-agent to stop (e.g. \"a1\"), or \"all\" to stop every agent'),\n })),\n execute: async ({ agentId }) => {\n try {\n if (agentId.toLowerCase() === 'all') {\n await supervisor.haltAll();\n logger.info('All sub-agents halted via stop_agent tool');\n return 'All sub-agents have been halted. Any agents currently executing a tool step will finish that step before stopping.';\n }\n\n const halted = await supervisor.halt(agentId);\n if (!halted) {\n return `No active agent found with ID \"${agentId}\". Use the list_agents tool to see active agents.`;\n }\n\n logger.info({ agentId }, 'Sub-agent halted via stop_agent tool');\n return `Agent ${agentId} halt signal sent. It will finish its current tool step and then stop. File locks will be released automatically.`;\n } catch (err: any) {\n logger.error({ err }, 'Failed to stop agent');\n return `Failed to stop agent: ${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 {\n createSpotifySearchTool,\n createSpotifyPlayTool,\n createSpotifyPauseTool,\n createSpotifyNextTool,\n createSpotifyPreviousTool,\n createSpotifyNowPlayingTool,\n createSpotifyDevicesTool,\n createSpotifyQueueTool,\n createSpotifyLikeTool,\n createSpotifyVolumeTool,\n createSpotifyShuffleTool,\n createSpotifyRepeatTool,\n createSpotifyTopTracksTool,\n createSpotifyPlaylistsTool,\n} from './spotify/index.js';\nimport { createAskUserTool, setAskUserHandler } from './interaction/index.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 type { SubAgentSupervisor } from '../core/supervisor.js';\nimport type { SpotifyClient } from '../spotify/client.js';\nimport { createDelegateTaskTool, createListAgentsTool, createStopAgentTool } from './subagents/index.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 memorySummary: () => import('../memory/user-memory.js').UserMemorySummary;\n memoryRecent: (limit?: number) => import('../memory/user-memory.js').UserMemoryRecord[];\n memorySearch: (query: string, limit?: number) => import('../memory/user-memory.js').UserMemoryRecord[];\n memorySetLearningPaused: (paused: boolean) => void;\n memoryClear: () => number;\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 supervisor?: SubAgentSupervisor;\n private spotifyClient?: SpotifyClient;\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, supervisor?: SubAgentSupervisor) {\n this.permissions = new PermissionManager();\n this.skillLoader = skillLoader;\n this.scheduler = scheduler;\n this.tokenBudget = tokenBudget;\n this.supervisor = supervisor;\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 setSupervisor(supervisor: SubAgentSupervisor): void {\n this.supervisor = supervisor;\n }\n\n setSpotifyClient(client: SpotifyClient): void {\n this.spotifyClient = client;\n }\n\n registerSpotifyTools(): void {\n if (!this.spotifyClient) return;\n this.tools.spotify_search = createSpotifySearchTool(this.spotifyClient);\n this.tools.spotify_play = createSpotifyPlayTool(this.spotifyClient);\n this.tools.spotify_pause = createSpotifyPauseTool(this.spotifyClient);\n this.tools.spotify_next = createSpotifyNextTool(this.spotifyClient);\n this.tools.spotify_previous = createSpotifyPreviousTool(this.spotifyClient);\n this.tools.spotify_now_playing = createSpotifyNowPlayingTool(this.spotifyClient);\n this.tools.spotify_devices = createSpotifyDevicesTool(this.spotifyClient);\n this.tools.spotify_queue = createSpotifyQueueTool(this.spotifyClient);\n this.tools.spotify_like = createSpotifyLikeTool(this.spotifyClient);\n this.tools.spotify_volume = createSpotifyVolumeTool(this.spotifyClient);\n this.tools.spotify_shuffle = createSpotifyShuffleTool(this.spotifyClient);\n this.tools.spotify_repeat = createSpotifyRepeatTool(this.spotifyClient);\n this.tools.spotify_top_tracks = createSpotifyTopTracksTool(this.spotifyClient);\n this.tools.spotify_playlists = createSpotifyPlaylistsTool(this.spotifyClient);\n logger.info('Spotify tools registered');\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 if (this.supervisor) {\n this.tools.delegate_task = createDelegateTaskTool(this.supervisor, this);\n this.tools.list_agents = createListAgentsTool(this.supervisor);\n this.tools.stop_agent = createStopAgentTool(this.supervisor);\n logger.info('Sub-agent tools registered');\n }\n\n this.tools.ask_user = createAskUserTool(() => this.getChannelContext());\n logger.info('Interaction tools 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';\nimport { DEFAULT_SKILL_SEEDS } from './default-skills.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 }\n\n this.ensureDefaultSkills();\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\n private ensureDefaultSkills(): void {\n for (const seed of DEFAULT_SKILL_SEEDS) {\n const skillDir = join(this.skillsDir, seed.dirName);\n const skillFile = join(skillDir, seed.fileName);\n if (existsSync(skillFile)) continue;\n\n mkdirSync(skillDir, { recursive: true });\n writeFileSync(skillFile, seed.content, 'utf-8');\n logger.info({ skill: seed.dirName }, 'Seeded default skill');\n }\n }\n}\n","export interface DefaultSkillSeed {\n dirName: string;\n fileName: string;\n content: string;\n}\n\nexport const DEFAULT_SKILL_SEEDS: DefaultSkillSeed[] = [\n {\n dirName: 'web-search',\n fileName: 'SKILL.md',\n content: `---\nname: web-search\ndescription: Perform web searches using DuckDuckGo HTML and summarize sources.\nversion: 1.0.0\nallowed-tools:\n - fetch_url\n---\n\n# Web Search\n\nUse this skill when the user asks for current events, external facts, or web research.\n\n## Workflow\n\n1. Build a DuckDuckGo HTML search URL:\n - https://html.duckduckgo.com/html/?q=<query>\n2. Use fetch_url with markdown format to retrieve result page content.\n3. Extract likely source links and open the top relevant pages with fetch_url.\n4. Cross-check key facts across at least 2 sources when possible.\n5. Return a concise answer with source links and clear caveats.\n\n## Rules\n\n- Prefer reliable sources (official docs, primary sources, reputable publications).\n- If information is uncertain or conflicting, say so explicitly.\n- Include source URLs in the response.\n- Avoid fabricated citations.\n`,\n },\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 ['delegate_task', 'Delegate a task to a sub-agent', 'task, workingDirectory?, priority?, allowedTools?'],\n ['list_agents', 'List active sub-agents', '—'],\n ['stop_agent', 'Stop a sub-agent (or all)', 'agentId (\"a1\" or \"all\")'],\n ['ask_user', 'Ask user a question with choices', 'question, choices[]'],\n ['spotify_search', 'Search Spotify for tracks/artists/albums/playlists', 'query, type?, limit?'],\n ['spotify_play', 'Play a track/album/playlist on Spotify', 'uri?, deviceId?'],\n ['spotify_pause', 'Pause Spotify playback', 'deviceId?'],\n ['spotify_next', 'Skip to next track', '—'],\n ['spotify_previous', 'Skip to previous track', '—'],\n ['spotify_now_playing', 'Show currently playing track info', '—'],\n ['spotify_devices', 'List available Spotify devices', '—'],\n ['spotify_queue', 'Add track to playback queue', 'uri'],\n ['spotify_like', 'Like (save) a track to library', 'trackId'],\n ['spotify_volume', 'Set playback volume', 'percent (0-100)'],\n ['spotify_shuffle', 'Toggle shuffle on/off', 'state (boolean)'],\n ['spotify_repeat', 'Set repeat mode', 'state (off/track/context)'],\n ['spotify_top_tracks', 'Get user\\'s top tracks', 'timeRange?, limit?'],\n ['spotify_playlists', 'Get user\\'s playlists', '—'],\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 doctor --platform', 'Show cross-platform terminal/daemon compatibility diagnostics'],\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 ['/permissions', 'Change permission mode (Ask Me / Allow All)'],\n ['/view', 'Toggle progress view (balanced/detailed)'],\n ['/view balanced', 'Set compact progress view'],\n ['/view detailed', 'Set full progress view'],\n ['/tasks', 'List scheduled tasks'],\n ['/memory', 'View and manage second brain memory'],\n ['/stream', 'Toggle text streaming on/off (Telegram)'],\n ['/stream on', 'Enable streaming (live text updates)'],\n ['/stream off', 'Disable streaming (single message)'],\n ['/agents', 'List all sub-agents and their status'],\n ['/agents stop <id|all>', 'Stop a sub-agent or all sub-agents'],\n ['/agents pause <id>', 'Pause a running sub-agent'],\n ['/agents resume <id>', 'Resume a paused sub-agent'],\n ['/agents config', 'Show sub-agent resource allocation'],\n ['/agents set max <n>', 'Set max concurrent sub-agents'],\n ['/code', 'Show programming mode status'],\n ['/code plan', 'Switch to plan mode (analyze, present options, no coding)'],\n ['/code execute', 'Switch to execute mode (implement plan step by step)'],\n ['/code build', 'Alias of execute mode for build-focused coding'],\n ['/code workspace', 'Open current directory in workspace IDE mode'],\n ['/code agent <task>', 'Delegate a coding task to a sub-agent in background'],\n ['/code off', 'Exit programming mode'],\n ['/code toggle', 'Cycle through: off → plan → execute → off'],\n ['/ws exit', 'Exit workspace IDE mode back to general chat'],\n ['/ws open <path>', 'Open a workspace directory in IDE mode'],\n ['/ws refresh', 'Refresh file tree + git status panel'],\n ['/ws stage <file|all>', 'Stage a file or all changes'],\n ['/ws commit <message>', 'Commit staged changes (Mercury co-authored)'],\n ['/ws undo <file>', 'Revert file changes with git checkout -- <file>'],\n ['/halt', 'Emergency: stop all agents + clear queue'],\n ['/stop', 'Stop all agents + clear queue + release locks + clear task board'],\n ['/reset', 'Full reset: stop all + clear context (requires confirmation)'],\n ['/spotify', 'Show Spotify connection status'],\n ['/spotify auth', 'Connect Spotify (browser or manual code flow)'],\n ['/spotify code <code>', 'Complete auth with a pasted authorization code (for SSH/Telegram)'],\n ['/spotify player', 'Interactive music player (CLI only: arrow-key controls, search, queue)'],\n ['/spotify devices', 'List available Spotify devices'],\n ['/spotify device <id>', 'Set active Spotify device'],\n ['/spotify now', 'Show what is currently playing'],\n ['/spotify logout', 'Disconnect Spotify and clear saved tokens'],\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 'Use interactive approval prompts: ↑/↓ + Enter (or Y/N/A shortcuts).',\n 'Choose \"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 (Yes/No/Always).',\n 'At session start, choose \"Ask Me\" (confirm each action) or \"Allow All\" (auto-approve everything).',\n 'Scheduled tasks always run in Allow All mode.',\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 const running = isProcessRunning(pid);\n if (!running) {\n try { unlinkSync(pidPath()); } catch {}\n return { running: false, pid: null, logPath: logPath() };\n }\n return { running, pid, logPath: logPath() };\n}\n\nexport function ensureDaemonRunning(): { pid: number; fresh: boolean } {\n const status = getDaemonStatus();\n if (status.running && status.pid) {\n return { pid: status.pid, fresh: false };\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 throw new Error('Failed to spawn daemon process');\n }\n\n writeFileSync(pidPath(), String(child.pid));\n return { pid: child.pid, fresh: true };\n}\n\nexport function startBackground(): void {\n try {\n const result = ensureDaemonRunning();\n console.log('');\n console.log(chalk.green(` Mercury started in background (PID: ${result.pid})`));\n console.log(chalk.dim(` Logs: ${logPath()}`));\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 } catch (err: any) {\n console.log(chalk.red(` Failed to start: ${err.message}`));\n process.exit(1);\n }\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 }\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(/\\r?\\n/).slice(-100);\n console.log(lines.join('\\n'));\n}\n\nexport function tryAutoDaemonize(): boolean {\n try {\n const result = ensureDaemonRunning();\n return result.pid > 0;\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 if (!process.argv[1]) {\n return join(homedir(), '.nvm', 'versions', 'node', `v${process.version.slice(1)}`, 'lib', 'node_modules', '@cosmicstack', 'mercury-agent', 'dist', 'index.js');\n }\n return join(process.argv[1], '..', '..', '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 'llama3.2',\n 'llama3.1',\n 'llama3',\n 'mistral',\n 'codellama',\n 'gemma2',\n 'phi3',\n 'qwen2',\n 'deepseek-r1',\n 'deepseek-coder-v2',\n] as const;\n\nconst MIMO_PREFERRED_MODELS = [\n 'mimo-v2.5-pro',\n 'mimo-v2.5',\n 'mimo-v2-pro',\n 'mimo-v2-omni',\n 'mimo-v2-flash',\n] as const;\n\nconst MIMO_TOKEN_PLAN_PREFERRED_MODELS = MIMO_PREFERRED_MODELS;\n\nconst OPENAI_COMPAT_PREFERRED_MODELS = [] 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 openaiCompat: OPENAI_COMPAT_PREFERRED_MODELS,\n mimo: MIMO_PREFERRED_MODELS,\n mimoTokenPlan: MIMO_TOKEN_PLAN_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 openaiCompat: OPENAI_COMPAT_PREFERRED_MODELS,\n mimo: MIMO_PREFERRED_MODELS,\n mimoTokenPlan: MIMO_TOKEN_PLAN_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 headers: Record<string, string> = {};\n if (config.apiKey) {\n headers['Authorization'] = `Bearer ${config.apiKey}`;\n }\n\n let errorMessage: string;\n if (provider === 'grok') {\n errorMessage = 'Mercury could not fetch models for this Grok key. Please re-enter it.';\n } else if (provider === 'deepseek') {\n errorMessage = 'Mercury could not fetch models for this DeepSeek key. Please re-enter it.';\n } else if (provider === 'openaiCompat') {\n errorMessage = 'Mercury could not fetch models from this server. Please check the base URL and try again.';\n } else {\n errorMessage = 'Mercury could not fetch models for this OpenAI key. Please re-enter it.';\n }\n\n const data = await fetchJson<OpenAIModelResponse>(\n `${trimTrailingSlash(config.baseUrl)}/models`,\n { headers },\n errorMessage,\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 if (provider === 'openaiCompat') {\n return id.length > 0;\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 fetchOllamaCloudModels(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 Ollama Cloud key. Please re-enter it.',\n );\n\n const ids = (data.data ?? [])\n .map((model) => model.id?.trim() ?? '')\n .filter(Boolean);\n\n return buildModelCatalog('ollamaCloud', ids, config.model);\n}\n\nasync function fetchOllamaLocalModels(config: ProviderConfig): Promise<ProviderModelCatalog> {\n const data = await fetchJson<OllamaTagsResponse>(\n `${trimTrailingSlash(config.baseUrl)}/tags`,\n {},\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('ollamaLocal', ids, config.model);\n}\n\nasync function fetchMiMoModels(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 MiMo key. Please re-enter it.',\n );\n\n const ids = (data.data ?? [])\n .map((model) => model.id?.trim() ?? '')\n .filter((id) => {\n const lower = id.toLowerCase();\n return lower.startsWith('mimo-') && !lower.includes('tts');\n });\n\n return buildModelCatalog('mimo', ids, config.model);\n}\n\nasync function fetchMiMoTokenPlanModels(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 MiMo Token Plan key. Please re-enter it.',\n );\n\n const ids = (data.data ?? [])\n .map((model) => model.id?.trim() ?? '')\n .filter((id) => {\n const lower = id.toLowerCase();\n return lower.startsWith('mimo-') && !lower.includes('tts');\n });\n\n return buildModelCatalog('mimoTokenPlan', 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') {\n return fetchOllamaCloudModels(config);\n }\n\n if (provider === 'ollamaLocal') {\n return fetchOllamaLocalModels(config);\n }\n\n if (provider === 'openaiCompat') {\n return fetchOpenAICompatModels(provider, config);\n }\n\n if (provider === 'mimo') {\n return fetchMiMoModels(config);\n }\n\n if (provider === 'mimoTokenPlan') {\n return fetchMiMoTokenPlanModels(config);\n }\n\n return fetchOpenAICompatModels(provider, config);\n}\n"],"mappings":"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","names":["chalk","render","resolve","readFileSync","writeFileSync","existsSync","dirname","join","readline","chalk","existsSync","readFileSync","mkdirSync","writeFileSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","resolve","resolve","existsSync","join","mkdirSync","readFileSync","writeFileSync","existsSync","mkdirSync","rmSync","join","require","require","join","mkdirSync","rmSync","existsSync","stmt","result","join","join","generateId","generateText","streamText","generateText","streamText","createOpenAI","createOpenAI","provider","generateText","streamText","path","React","t","handlePlayerAction","next","React","fs","path","selectWithArrowKeys","resolve","fs","path","resolve","path","fs","tool","bgId","channel","streamText","tgChannel","generateText","InlineKeyboard","resolve","switched","formatTelegramUser","path","existsSync","readFileSync","writeFileSync","mkdirSync","join","parseYaml","stringifyYaml","join","path","existsSync","readFileSync","parseYaml","mkdirSync","writeFileSync","stringifyYaml","generateText","stepCountIs","generateText","stepCountIs","duration","resolve","resolve","readFileSync","writeFileSync","existsSync","mkdirSync","join","existsSync","readFileSync","join","mkdirSync","writeFileSync","resolve","resolve","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","tool","zodSchema","z","existsSync","readFileSync","resolve","path","tool","zodSchema","z","existsSync","writeFileSync","resolve","isAbsolute","path","tool","zodSchema","z","existsSync","writeFileSync","mkdirSync","resolve","dirname","isAbsolute","path","tool","zodSchema","z","existsSync","readdirSync","resolve","isAbsolute","join","path","tool","zodSchema","z","existsSync","unlinkSync","resolve","isAbsolute","path","tool","zodSchema","z","readFileSync","writeFileSync","resolve","isAbsolute","path","tool","zodSchema","z","existsSync","statSync","resolve","basename","isAbsolute","path","tool","zodSchema","z","tool","zodSchema","z","resolve","isAbsolute","path","tool","zodSchema","z","spawn","resolve","isAbsolute","existsSync","homedir","SIGTERM_GRACE_MS","resolve","spawn","tool","zodSchema","z","homedir","isAbsolute","existsSync","tool","zodSchema","z","resolve","isAbsolute","existsSync","statSync","path","tool","zodSchema","z","tool","zodSchema","z","parseYaml","meta","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","cron","manifest","triggerType","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","execSync","path","tool","zodSchema","z","execSync","path","tool","zodSchema","z","execSync","path","tool","zodSchema","z","execSync","tool","zodSchema","z","execSync","writeFileSync","unlinkSync","join","tool","zodSchema","z","execSync","tool","zodSchema","z","path","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","tool","zodSchema","z","path","tool","zodSchema","z","tool","zodSchema","z","tool","z","zodSchema","formatTime","tool","z","zodSchema","tool","zodSchema","z","tool","z","zodSchema","tool","z","zodSchema","tool","zodSchema","z","existsSync","readFileSync","readdirSync","mkdirSync","writeFileSync","join","parseYaml","parseYaml","join","existsSync","mkdirSync","readdirSync","readFileSync","writeFileSync","chalk","path","spawn","existsSync","readFileSync","writeFileSync","unlinkSync","mkdirSync","join","process","chalk","join","path","existsSync","readFileSync","process","unlinkSync","mkdirSync","spawn","writeFileSync","chalk","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","home","approved","execSync","rmSync"]}