titan-agent 5.1.2 → 5.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/gateway/metrics.js +20 -1
- package/dist/gateway/metrics.js.map +1 -1
- package/dist/gateway/server.js +5 -1
- package/dist/gateway/server.js.map +1 -1
- package/dist/utils/constants.js +1 -1
- package/dist/utils/constants.js.map +1 -1
- package/package.json +1 -1
- package/ui/dist/assets/{AuditPanel-B84Mp16G.js → AuditPanel-DLy0WJQZ.js} +1 -1
- package/ui/dist/assets/{AutonomyPanel-DOtiTFxV.js → AutonomyPanel-DjFAQGns.js} +1 -1
- package/ui/dist/assets/{AutopilotPanel-nTb1Dnru.js → AutopilotPanel-nBluaHA4.js} +1 -1
- package/ui/dist/assets/{AutoresearchPanel-D46mX8VF.js → AutoresearchPanel-BDy8y_Cs.js} +1 -1
- package/ui/dist/assets/{BackupPanel-DGM1XXbG.js → BackupPanel-B_Fv2pJA.js} +1 -1
- package/ui/dist/assets/{BrowserPanel-Cn1tTN3y.js → BrowserPanel-DOCT3-Rq.js} +1 -1
- package/ui/dist/assets/{CPAgents-CEraUkME.js → CPAgents-CpkHf0b8.js} +1 -1
- package/ui/dist/assets/{CPDashboard-B_yidGAe.js → CPDashboard-CnMd6qNK.js} +1 -1
- package/ui/dist/assets/{CPFiles-BBS8jtYH.js → CPFiles-BDRjJpYl.js} +1 -1
- package/ui/dist/assets/{CPGoals-DL5v21TZ.js → CPGoals-2DrwHk62.js} +1 -1
- package/ui/dist/assets/{CPInbox-CyLQJBYF.js → CPInbox-C6l2o4FD.js} +1 -1
- package/ui/dist/assets/{CPSocial-BkEtQ1Um.js → CPSocial-Cea6NptR.js} +1 -1
- package/ui/dist/assets/{ChannelsPanel-CD2kHhA5.js → ChannelsPanel-5EhhyXeg.js} +1 -1
- package/ui/dist/assets/{CheckpointsPanel-BrUTFPu_.js → CheckpointsPanel-BVt2oEUe.js} +1 -1
- package/ui/dist/assets/{CommandPostHub-BPPaUv1B.js → CommandPostHub-PXKE62DN.js} +3 -3
- package/ui/dist/assets/{CronPanel-CsfQctFp.js → CronPanel-lAsoKavq.js} +1 -1
- package/ui/dist/assets/{DaemonPanel-CNUggBbL.js → DaemonPanel-xt08Rs10.js} +1 -1
- package/ui/dist/assets/{DataTable-DuAEp_QJ.js → DataTable-BHOu7fZP.js} +1 -1
- package/ui/dist/assets/{EmptyState-DFrAEZDm.js → EmptyState-Dk7BBthD.js} +1 -1
- package/ui/dist/assets/EvalHarnessPanel-CJv8CUDy.js +1 -0
- package/ui/dist/assets/{EvalPanel-DEX0a5-b.js → EvalPanel-D9rDf1bk.js} +1 -1
- package/ui/dist/assets/{FilesPanel-DATsiAqG.js → FilesPanel-CNrDLmix.js} +1 -1
- package/ui/dist/assets/{FleetPanel-QYQKqx4W.js → FleetPanel-DP_ji0AE.js} +1 -1
- package/ui/dist/assets/{HomelabPanel-DhuXd3ZD.js → HomelabPanel-B4bCsrBw.js} +1 -1
- package/ui/dist/assets/{InfraView-eS7cpESw.js → InfraView-C5OYx_9s.js} +2 -2
- package/ui/dist/assets/{InlineEditableField-zIAnW4AR.js → InlineEditableField-DyBCbIoN.js} +1 -1
- package/ui/dist/assets/{Input-bFsLI0fq.js → Input-DWnbv1Yh.js} +1 -1
- package/ui/dist/assets/{IntegrationsPanel-C_FswSRN.js → IntegrationsPanel-DsB6hjvE.js} +1 -1
- package/ui/dist/assets/{IntelligenceView-smQ6aBwx.js → IntelligenceView-PIFGvIg_.js} +2 -2
- package/ui/dist/assets/{LearningPanel-BEgF_iND.js → LearningPanel-D_S4HFX5.js} +1 -1
- package/ui/dist/assets/{LogsPanel-Br1P8ST6.js → LogsPanel-BnWNREPX.js} +1 -1
- package/ui/dist/assets/{McpPanel-ByvQ12J_.js → McpPanel-CIMxZ2Am.js} +1 -1
- package/ui/dist/assets/{MemoryGraphPanel-BGOeSaET.js → MemoryGraphPanel-DD7x4rrm.js} +1 -1
- package/ui/dist/assets/{MemoryWikiPanel-CR8btd66.js → MemoryWikiPanel-BPPVAH0b.js} +1 -1
- package/ui/dist/assets/{MeshPanel-BjkcSOMz.js → MeshPanel-CiuwR3oV.js} +1 -1
- package/ui/dist/assets/{NvidiaPanel-NYt42w7L.js → NvidiaPanel-DVntoRrH.js} +1 -1
- package/ui/dist/assets/{OrganismPanel-PHvISvVn.js → OrganismPanel-pqIKtHrW.js} +1 -1
- package/ui/dist/assets/{OverviewPanel-q35zdMr6.js → OverviewPanel-gqYRhmpF.js} +1 -1
- package/ui/dist/assets/{PageHeader-Cwn3OALc.js → PageHeader-CF75km05.js} +1 -1
- package/ui/dist/assets/{PaperclipPanel-BDpQki0d.js → PaperclipPanel-CwN5-cKg.js} +1 -1
- package/ui/dist/assets/{PersonasPanel-DxrGW5C4.js → PersonasPanel-ClC_TTGX.js} +1 -1
- package/ui/dist/assets/{RecipesPanel-CYRdBx5u.js → RecipesPanel-Di2l-eOe.js} +1 -1
- package/ui/dist/assets/{SecurityPanel-i1QMctV0.js → SecurityPanel-DjC4pXGM.js} +1 -1
- package/ui/dist/assets/{SelfImprovePanel-DbybAZWp.js → SelfImprovePanel-CNpCp5N4.js} +1 -1
- package/ui/dist/assets/{SelfProposalsPanel-DtcTUDDd.js → SelfProposalsPanel-BJL6Fjxo.js} +1 -1
- package/ui/dist/assets/{SessionsPanel-B7QmOizR.js → SessionsPanel-EAGKDQp0.js} +1 -1
- package/ui/dist/assets/{SessionsTab-BdJj_vsI.js → SessionsTab-tc0njI15.js} +1 -1
- package/ui/dist/assets/{SettingsPanel-DnEvJUFe.js → SettingsPanel-BdSGImIa.js} +1 -1
- package/ui/dist/assets/{SettingsView-C39dk_yr.js → SettingsView-DQB64bjy.js} +2 -2
- package/ui/dist/assets/{SkeletonLoader-CsiR8ED9.js → SkeletonLoader-P8SFCyGi.js} +1 -1
- package/ui/dist/assets/{SkillsPanel-DM4qBFDS.js → SkillsPanel-lDMl_8da.js} +1 -1
- package/ui/dist/assets/{SomaView-CWnPKEQI.js → SomaView-BG7YvBu2.js} +1 -1
- package/ui/dist/assets/{StatCard-CY8lgeWm.js → StatCard-Cv2u-yqA.js} +1 -1
- package/ui/dist/assets/{StatusBadge-CGvKbP7R.js → StatusBadge-JJeoEdCm.js} +1 -1
- package/ui/dist/assets/{TeamsPanel-Bf6GaUni.js → TeamsPanel-D-iCyyYd.js} +1 -1
- package/ui/dist/assets/{TelemetryPanel-JZ90gJXC.js → TelemetryPanel-DHNFyCwn.js} +1 -1
- package/ui/dist/assets/{TitanCanvas-Hk49NFcA.js → TitanCanvas-BhurNMK3.js} +3 -3
- package/ui/dist/assets/ToolsView-C8sWxLny.js +2 -0
- package/ui/dist/assets/{Tooltip-CcoZrKsl.js → Tooltip-D4IeQDJL.js} +1 -1
- package/ui/dist/assets/{TraceViewer-ojGf0drx.js → TraceViewer-CMd-Wi0z.js} +1 -1
- package/ui/dist/assets/{TrainingPanel-CWnP4H2l.js → TrainingPanel-CLtiBq2h.js} +1 -1
- package/ui/dist/assets/{VoiceOverlay-Dn6iaYgd.js → VoiceOverlay-BXPVdnJc.js} +1 -1
- package/ui/dist/assets/{VramPanel-CLd9Ggck.js → VramPanel-DjuwGUzA.js} +1 -1
- package/ui/dist/assets/{WatchView-CQBemwsm.js → WatchView-B7sDnMpl.js} +1 -1
- package/ui/dist/assets/{WorkTab-BOfTN-Bd.js → WorkTab-B5nQ4Y7A.js} +1 -1
- package/ui/dist/assets/{WorkflowsPanel-qzNS0p0u.js → WorkflowsPanel-2z0TeXyR.js} +1 -1
- package/ui/dist/assets/{arrow-left-c-8OFZUV.js → arrow-left-BKOkzkae.js} +1 -1
- package/ui/dist/assets/{chart-column-x6L66Qw7.js → chart-column-D39PCk17.js} +1 -1
- package/ui/dist/assets/{circle-check-big-WaW3U3Xl.js → circle-check-big-CMz0QouP.js} +1 -1
- package/ui/dist/assets/{dollar-sign-D2Oce4Ru.js → dollar-sign-Bu8fZOQl.js} +1 -1
- package/ui/dist/assets/{download-YvPDLlFJ.js → download-vvx6zJ-U.js} +1 -1
- package/ui/dist/assets/{eye-off-DIMcxsdQ.js → eye-off-BPXFIzlW.js} +1 -1
- package/ui/dist/assets/{funnel-DqD9srZu.js → funnel-Bqns-i8I.js} +1 -1
- package/ui/dist/assets/{git-branch-0FamUEbU.js → git-branch-CdmeqL8d.js} +1 -1
- package/ui/dist/assets/{index-NatBSFxj.js → index-C6oarzis.js} +2 -2
- package/ui/dist/assets/index-DsFoD9SP.css +1 -0
- package/ui/dist/assets/{legacy-DOO7F5cq.js → legacy-DFIaZTiF.js} +1 -1
- package/ui/dist/assets/{lightbulb-Bk6KlR6q.js → lightbulb-DOL6Q-iP.js} +1 -1
- package/ui/dist/assets/{pause-DDC_zUiJ.js → pause-B0XymOnS.js} +1 -1
- package/ui/dist/assets/{play-BPXbHToG.js → play-Dwp2l5HG.js} +1 -1
- package/ui/dist/assets/{plug-Dxp-sWVF.js → plug-DRlTjWqQ.js} +1 -1
- package/ui/dist/assets/{proxy-vU7v4NVM.js → proxy-sXxWK7WF.js} +1 -1
- package/ui/dist/assets/{square-Bn_0tYME.js → square-yh0jffQZ.js} +1 -1
- package/ui/dist/assets/{target-BrtxUtzl.js → target-GxtNG2RW.js} +1 -1
- package/ui/dist/assets/{toggle-right-CYphlpN5.js → toggle-right-CYQd_Ux1.js} +1 -1
- package/ui/dist/assets/{trash-2-C_Jsp23A.js → trash-2-B4jp_pAQ.js} +1 -1
- package/ui/dist/assets/{trending-up-DrtLViSm.js → trending-up-B26tNhFP.js} +1 -1
- package/ui/dist/assets/{trophy-DdRzAOfo.js → trophy-Bf3ZeSeb.js} +1 -1
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/ToolsView-Cq7Fuq3i.js +0 -2
- package/ui/dist/assets/index-D932CbpQ.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/gateway/server.ts"],"sourcesContent":["/**\n * TITAN — Gateway Server\n * WebSocket + HTTP server: the control plane for all channels, agents, tools, and the web UI.\n */\nimport express, { type Request, type Response, type NextFunction } from 'express';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport { createServer } from 'http';\nimport { createServer as createHttpsServer } from 'https';\nimport net from 'net';\nimport { join, dirname, resolve } from 'path';\nimport { fileURLToPath } from 'url';\nimport { homedir, hostname as osHostname, cpus, loadavg } from 'os';\nimport { randomBytes, timingSafeEqual } from 'crypto';\nimport { exec, execSync, spawn } from 'child_process';\nimport fs from 'fs';\nimport { loadConfig, updateConfig } from '../config/config.js';\nimport type { ProviderConfig } from '../config/schema.js';\nimport { loadProfile, saveProfile, type PersonalProfile } from '../memory/relationship.js';\nimport { processMessage } from '../agent/agent.js';\nimport { onAgentEvent } from '../agent/agentEvents.js';\nimport { initMemory, closeMemory, getUsageStats, getHistory, getDb } from '../memory/memory.js';\nimport { initBuiltinSkills, getSkills, toggleSkill, getSkillTools } from '../skills/registry.js';\nimport { listPersonas, getPersona, invalidatePersonaCache } from '../personas/manager.js';\nimport { searchSkills as marketplaceSearch, installSkill, uninstallSkill, listSkills as listMarketplaceSkills, listInstalled as listInstalledMarketplace } from '../skills/marketplace.js';\nimport { getRegisteredTools } from '../agent/toolRunner.js';\nimport { listSessions, cleanupStaleSessions } from '../agent/session.js';\nimport { healthCheckAll, discoverAllModels, getModelAliases, chatStream, getFallbackState } from '../providers/router.js';\nimport { auditSecurity } from '../security/sandbox.js';\nimport { WebChatChannel } from '../channels/webchat.js';\nimport { DiscordChannel } from '../channels/discord.js';\nimport { TelegramChannel } from '../channels/telegram.js';\nimport { SlackChannel } from '../channels/slack.js';\nimport { GoogleChatChannel } from '../channels/googlechat.js';\nimport { WhatsAppChannel } from '../channels/whatsapp.js';\nimport { MatrixChannel } from '../channels/matrix.js';\nimport { SignalChannel } from '../channels/signal.js';\nimport { MSTeamsChannel } from '../channels/msteams.js';\nimport { IRCChannel } from '../channels/irc.js';\nimport { MattermostChannel } from '../channels/mattermost.js';\nimport { LarkChannel } from '../channels/lark.js';\nimport { EmailInboundChannel } from '../channels/email_inbound.js';\nimport { LineChannel } from '../channels/line.js';\nimport { ZulipChannel } from '../channels/zulip.js';\nimport { MessengerChannel } from '../channels/messenger.js';\nimport { initAgents, routeMessage, listAgents, spawnAgent, stopAgent, getAgentCapacity, getAgent } from '../agent/multiAgent.js';\nimport { createOpenAICompatRouter } from '../gateway/openai-compat.js';\nimport type { ChannelAdapter, InboundMessage } from '../channels/base.js';\nimport logger, { initFileLogger } from '../utils/logger.js';\nimport { TITAN_VERSION, TITAN_NAME, TITAN_LOGS_DIR, TITAN_HOME } from '../utils/constants.js';\nimport { collectSystemProfile, recordStartupAnalytics, startHeartbeatAnalytics } from '../analytics/collector.js';\nimport { getUpdateInfo } from '../utils/updater.js';\nimport { getMissionControlHTML } from './dashboard.js';\nimport { serializePrometheus, getMetricsSummary, titanRequestsTotal, titanRequestDuration, titanErrorsTotal, titanActiveSessions, titanToolCallsTotal, titanTokensTotal, titanModelRequestsTotal } from './metrics.js';\nimport { initSlashCommands, handleSlashCommand } from './slashCommands.js';\nimport { initMcpServers, listMcpServers, addMcpServer, removeMcpServer, setMcpServerEnabled, getMcpStatus, BUILTIN_PRESETS } from '../mcp/registry.js';\nimport { connectMcpServer, testMcpServer } from '../mcp/client.js';\nimport { mountMcpHttpEndpoints, getMcpServerStatus } from '../mcp/server.js';\nimport { initMonitors, setMonitorTriggerHandler, listMonitors, addMonitor, removeMonitor, getMonitorEvents } from '../agent/monitor.js';\nimport { seedBuiltinRecipes, listRecipes, getRecipe, saveRecipe, deleteRecipe, getBuiltinRecipes, importRecipeYaml } from '../recipes/store.js';\nimport { parseSlashCommand, runRecipe } from '../recipes/runner.js';\nimport { getCostStatus } from '../agent/costOptimizer.js';\nimport { initLearning, getLearningStats } from '../memory/learning.js';\nimport { initGraph, getGraphData, getGraphStats, clearGraph, cleanupGraph, flushGraph, getEntity, listEntities, getEntityEpisodes } from '../memory/graph.js';\nimport { getLogFilePath } from '../utils/logger.js';\nimport { closeSession, renameSession } from '../agent/session.js';\nimport { initCronScheduler } from '../skills/builtin/cron.js';\nimport { checkAndSendBriefing } from '../memory/briefing.js';\nimport { initPersistentWebhooks } from '../skills/builtin/webhook.js';\nimport { invalidateCacheForModel } from '../agent/responseCache.js';\nimport { initAutopilot, stopAutopilot, runAutopilotNow, getAutopilotStatus, getRunHistory, setAutopilotDryRun } from '../agent/autopilot.js';\nimport { initDaemon, stopDaemon, getDaemonStatus, pauseDaemonManual, resumeDaemon, titanEvents } from '../agent/daemon.js';\nimport { initCommandPost, shutdownCommandPost, isCommandPostEnabled, getDashboard as getCPDashboard, getRegisteredAgents, reportHeartbeat, removeAgent, checkoutTask, checkinTask, getActiveCheckouts, getBudgetPolicies, createBudgetPolicy, updateBudgetPolicy, deleteBudgetPolicy, getActivity, getGoalTree, getAncestryChain, validateGoalAncestry, validateGoalParentAssignment, sweepExpiredCheckoutsManual, getStaleAgents, enforceBudgetForAgent, getBudgetPolicyForAgent, createIssue, updateIssue, getIssue, listIssues, searchIssues, checkoutIssue, deleteIssue, addIssueComment, getIssueComments, createApproval, approveApproval, rejectApproval, listApprovals, getApproval, replyToApproval, snoozeApproval, unsnoozeApproval, batchApprove, batchReject, getAgentMessages, markAgentMessageRead, startRun, endRun, listRuns, getOrgTree, updateRegisteredAgent } from '../agent/commandPost.js';\nimport { initWakeupSystem, getAgentInbox, queueWakeup, getWakeupRequest, cancelWakeup, drainPendingResults } from '../agent/agentWakeup.js';\nimport { auditLog, queryAuditLog, getAuditStats } from '../agent/auditLog.js';\nimport { listGoals, createGoal, getGoal, deleteGoal, updateGoal, completeSubtask, addSubtask, dedupeGoalsBulk } from '../agent/goals.js';\nimport { startTunnel, stopTunnel, getTunnelStatus } from '../utils/tunnel.js';\nimport { startPaperclip, stopPaperclip, getPaperclipStatus } from '../addons/paperclipSidecar.js';\nimport { getConsentUrl, exchangeCode, isGoogleConnected, getGoogleEmail, disconnectGoogle } from '../auth/google.js';\nimport { createTeam, getTeam, listTeams, deleteTeam, updateTeam, addMember, removeMember, updateMemberRole, createInvite, acceptInvite, getEffectivePermissions, setRolePermissions, getTeamStats, isToolAllowed, getUserRole } from '../security/teams.js';\nimport { TITAN_WORKSPACE } from '../utils/constants.js';\nconst COMPONENT = 'Gateway';\n\n/** Get normalized CPU load (0.0–1.0) using 1-minute load average */\nfunction getCpuLoad(): number {\n const avg = loadavg()[0]; // 1-minute load average\n const cores = cpus().length || 1;\n return Math.min(1, avg / cores);\n}\n\n/** Fields that require a gateway restart to take effect */\nconst RESTART_REQUIRED_PATTERNS = ['channels.*', 'gateway.auth.*', 'logging.level'];\n\n/** Module-level HTTP server reference (allows stopGateway to close it) */\nlet httpServer: ReturnType<typeof createServer> | null = null;\n\n/** Interval IDs for cleanup on shutdown */\nlet tokenCleanupInterval: ReturnType<typeof setInterval> | null = null;\nlet rateLimitCleanupInterval: ReturnType<typeof setInterval> | null = null;\nlet healthMonitorInterval: ReturnType<typeof setInterval> | null = null;\nlet sessionAbortCleanupInterval: ReturnType<typeof setInterval> | null = null;\nlet unsubscribeAgentEvents: (() => void) | null = null;\nlet activeLlmRequests = 0;\nlet maxConcurrentOverride: number | null = null;\n\n// ── Module-level constants (avoid per-request allocation) ──────────\nconst VOICE_POISON_PATTERNS = [\n /i completed the tool operations/i,\n /i wasn't able to execute tools/i,\n /i completed the operations/i,\n /let me know if you need anything else\\.?\\s*$/i,\n];\nconst F5_TTS_DEFAULT_VOICES = ['andrew'];\nconst DAEMON_SSE_EVENTS = ['daemon:started', 'daemon:stopped', 'daemon:paused', 'daemon:resumed',\n 'daemon:heartbeat', 'goal:subtask:ready', 'health:ollama:down',\n 'health:ollama:degraded', 'cron:stuck',\n 'initiative:start', 'initiative:complete', 'initiative:no_progress',\n 'initiative:tool_call', 'initiative:tool_result', 'initiative:round'];\nconst PANE_SSE_TOPICS = [\n // Soma / drives\n 'drive:tick', 'hormone:update', 'pressure:threshold', 'soma:proposal',\n // Turns / tools\n 'turn:pre', 'turn:post', 'tool:call', 'tool:result',\n // Goals\n 'goal:create', 'goal:complete', 'goal:fail', 'goal:cancel', 'goal:update',\n // Command Post\n 'cp:activity', 'cp:proposal', 'cp:approval', 'cp:rejection',\n // Health\n 'health:up', 'health:down', 'health:degraded',\n // Multi-agent\n 'agent:spawn', 'agent:kill', 'agent:message',\n // Alerts\n 'alert:warning', 'alert:critical',\n];\nconst CP_SSE_EVENTS = [\n 'commandpost:activity', 'commandpost:task:checkout', 'commandpost:task:checkin',\n 'commandpost:task:expired', 'commandpost:budget:warning', 'commandpost:budget:exceeded',\n 'commandpost:agent:heartbeat', 'commandpost:agent:status',\n];\nconst ALLOWED_ORIGINS = [\n /^https?:\\/\\/localhost(:\\d+)?$/,\n /^https?:\\/\\/127\\.0\\.0\\.1(:\\d+)?$/,\n /^https?:\\/\\/\\[::1\\](:\\d+)?$/,\n /^https?:\\/\\/192\\.168\\.\\d+\\.\\d+(:\\d+)?$/, // LAN\n];\nfunction isAllowedOrigin(origin: string): boolean {\n return ALLOWED_ORIGINS.some(re => re.test(origin));\n}\n\n/**\n * Classify a chat error into a structured response that the React UI can render\n * as an actionable banner. Without this, every failure shows up as a generic 500\n * with a stack trace that means nothing to a non-developer.\n *\n * The classifier returns:\n * { error: string, message: string, status: number, action?: { type, target } }\n *\n * Known error codes (must match what the UI knows how to render):\n * - no_provider_configured → no API keys / Ollama unreachable\n * - rate_limited → 429 from upstream\n * - context_too_long → context window exceeded\n * - model_not_found → invalid model id\n * - auth_failed → 401/403 from upstream\n * - upstream_error → other 4xx/5xx from upstream\n * - timeout → request timed out\n * - unknown → fallback for everything else\n */\ninterface ChatErrorResponse {\n error: string;\n message: string;\n detail?: string;\n status: number;\n action?: { type: 'open' | 'retry' | 'docs'; target: string; label: string };\n}\nfunction classifyChatError(err: Error): ChatErrorResponse {\n const msg = (err.message || String(err)).toLowerCase();\n const detail = err.message;\n\n // No provider configured / no valid API key\n if (\n msg.includes('no valid provider') ||\n msg.includes('no api key') ||\n msg.includes('not configured') ||\n msg.includes('provider not found')\n ) {\n return {\n error: 'no_provider_configured',\n message: 'No AI provider is configured. Set up a provider to start chatting.',\n detail,\n status: 503,\n action: { type: 'open', target: '/settings', label: 'Open settings' },\n };\n }\n\n // Rate limited / quota exhausted\n if (\n msg.includes('rate limit') ||\n msg.includes('429') ||\n msg.includes('quota') ||\n msg.includes('too many requests')\n ) {\n return {\n error: 'rate_limited',\n message: \"You've hit your provider's rate limit. Wait a moment and try again, or switch providers in Settings.\",\n detail,\n status: 429,\n action: { type: 'retry', target: '', label: 'Retry' },\n };\n }\n\n // Context window exceeded\n if (\n msg.includes('context length') ||\n msg.includes('context window') ||\n msg.includes('maximum context') ||\n msg.includes('too many tokens') ||\n msg.includes('context_length_exceeded') ||\n msg.includes('prompt is too long')\n ) {\n return {\n error: 'context_too_long',\n message: 'The conversation got too long for the model. Start a new session or compact this one.',\n detail,\n status: 413,\n action: { type: 'open', target: '/sessions', label: 'New session' },\n };\n }\n\n // Model not found / invalid model id\n if (\n msg.includes('model not found') ||\n msg.includes('invalid model') ||\n msg.includes('unknown model') ||\n msg.includes('model_not_found') ||\n msg.includes('does not exist')\n ) {\n return {\n error: 'model_not_found',\n message: \"The selected model doesn't exist or you don't have access to it. Pick a different model in Settings.\",\n detail,\n status: 404,\n action: { type: 'open', target: '/settings', label: 'Pick a model' },\n };\n }\n\n // Auth failure (bad key / expired)\n if (\n msg.includes('401') ||\n msg.includes('403') ||\n msg.includes('unauthorized') ||\n msg.includes('forbidden') ||\n msg.includes('authentication') ||\n msg.includes('invalid api key') ||\n msg.includes('invalid_api_key')\n ) {\n return {\n error: 'auth_failed',\n message: 'Your API key was rejected by the provider. Check it in Settings → Providers.',\n detail,\n status: 401,\n action: { type: 'open', target: '/settings', label: 'Check API key' },\n };\n }\n\n // Timeout\n if (\n msg.includes('timeout') ||\n msg.includes('timed out') ||\n msg.includes('etimedout') ||\n msg.includes('aborted')\n ) {\n return {\n error: 'timeout',\n message: 'The model took too long to respond. Try again, or switch to a faster model.',\n detail,\n status: 504,\n action: { type: 'retry', target: '', label: 'Retry' },\n };\n }\n\n // Upstream provider error\n if (\n msg.includes('500') || msg.includes('502') || msg.includes('503') ||\n msg.includes('gateway') || msg.includes('upstream')\n ) {\n return {\n error: 'upstream_error',\n message: \"Your AI provider is having issues right now. Try again, or switch providers.\",\n detail,\n status: 502,\n action: { type: 'retry', target: '', label: 'Retry' },\n };\n }\n\n // Fallback\n return {\n error: 'unknown',\n message: detail || 'Something went wrong while processing your message.',\n detail,\n status: 500,\n };\n}\n\n/** Internal health monitor state */\nconst healthState = {\n ollamaHealthy: false,\n ttsHealthy: false,\n lastCheck: null as string | null,\n lastActiveLlm: 0,\n lastActiveLlmTime: 0,\n stuckDetected: false,\n};\n\nexport function stopGateway(): Promise<void> {\n return new Promise((resolve) => {\n // Clear intervals to release the event loop\n if (tokenCleanupInterval) { clearInterval(tokenCleanupInterval); tokenCleanupInterval = null; }\n if (rateLimitCleanupInterval) { clearInterval(rateLimitCleanupInterval); rateLimitCleanupInterval = null; }\n if (healthMonitorInterval) { clearInterval(healthMonitorInterval); healthMonitorInterval = null; }\n if (sessionAbortCleanupInterval) { clearInterval(sessionAbortCleanupInterval); sessionAbortCleanupInterval = null; }\n if (unsubscribeAgentEvents) { unsubscribeAgentEvents(); unsubscribeAgentEvents = null; }\n\n if (httpServer) {\n // Force-close open connections after 3 seconds (SSE/WebSocket keep-alives block shutdown)\n const forceTimeout = setTimeout(() => {\n logger.warn('Gateway', 'Shutdown timeout — destroying remaining connections');\n httpServer?.closeAllConnections?.();\n httpServer = null;\n resolve();\n }, 3000);\n forceTimeout.unref();\n\n httpServer.close(() => {\n clearTimeout(forceTimeout);\n httpServer = null;\n resolve();\n });\n } else {\n resolve();\n }\n });\n}\n\n/** Usage tracking — per-request cost/token tracking */\ninterface UsageEntry {\n timestamp: string;\n model: string;\n provider: string;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n estimatedCostUsd: number;\n durationMs: number;\n sessionId: string;\n}\nconst usageLog: UsageEntry[] = [];\nconst MAX_USAGE_LOG = 10000; // Keep last 10K entries in memory\n\n// Approximate cost per 1M tokens (input/output) for common models\nconst MODEL_COSTS: Record<string, { input: number; output: number }> = {\n 'claude-sonnet': { input: 3, output: 15 },\n 'claude-haiku': { input: 0.25, output: 1.25 },\n 'claude-opus': { input: 15, output: 75 },\n 'gpt-4o': { input: 2.5, output: 10 },\n 'gpt-4o-mini': { input: 0.15, output: 0.6 },\n 'gpt-4-turbo': { input: 10, output: 30 },\n 'ollama': { input: 0, output: 0 }, // local = free\n 'groq': { input: 0.05, output: 0.08 },\n 'deepseek': { input: 0.14, output: 0.28 },\n};\n\nfunction estimateCost(model: string, promptTokens: number, completionTokens: number): number {\n const key = Object.keys(MODEL_COSTS).find(k => model.toLowerCase().includes(k));\n if (!key) return 0;\n const rates = MODEL_COSTS[key];\n return (promptTokens * rates.input + completionTokens * rates.output) / 1_000_000;\n}\n\nfunction trackUsage(model: string, tokenUsage: { prompt?: number; completion?: number } | undefined, durationMs: number, sessionId: string): void {\n if (!tokenUsage) return;\n const prompt = tokenUsage.prompt || 0;\n const completion = tokenUsage.completion || 0;\n const provider = model.includes('/') ? model.split('/')[0] : 'unknown';\n const entry: UsageEntry = {\n timestamp: new Date().toISOString(),\n model,\n provider,\n promptTokens: prompt,\n completionTokens: completion,\n totalTokens: prompt + completion,\n estimatedCostUsd: estimateCost(model, prompt, completion),\n durationMs,\n sessionId,\n };\n usageLog.push(entry);\n if (usageLog.length > MAX_USAGE_LOG) usageLog.splice(0, usageLog.length - MAX_USAGE_LOG);\n}\n\n/** Active session tokens (persisted to disk so they survive restarts) */\nconst AUTH_TOKENS_PATH = join(TITAN_HOME, 'auth-tokens.json');\n\nfunction loadAuthTokens(): Map<string, { createdAt: number; userId: string }> {\n const map = new Map<string, { createdAt: number; userId: string }>();\n try {\n if (fs.existsSync(AUTH_TOKENS_PATH)) {\n const raw = JSON.parse(fs.readFileSync(AUTH_TOKENS_PATH, 'utf-8'));\n if (Array.isArray(raw)) {\n const ttlMs = 24 * 60 * 60 * 1000;\n const now = Date.now();\n for (const item of raw) {\n if (item && typeof item.token === 'string' && typeof item.createdAt === 'number' && typeof item.userId === 'string') {\n if (now - item.createdAt <= ttlMs) {\n map.set(item.token, { createdAt: item.createdAt, userId: item.userId });\n }\n }\n }\n }\n }\n } catch {\n // Best-effort: if file is corrupt, start fresh\n }\n return map;\n}\n\nfunction saveAuthTokens(): void {\n try {\n const entries = [];\n for (const [token, entry] of authTokens) {\n entries.push({ token, createdAt: entry.createdAt, userId: entry.userId });\n }\n fs.writeFileSync(AUTH_TOKENS_PATH, JSON.stringify(entries, null, 2));\n } catch {\n // Best-effort persistence\n }\n}\n\nconst authTokens = loadAuthTokens();\n\n/** S3: Get userId from request auth token */\nfunction getUserIdFromReq(req: { headers: { authorization?: string } }): string {\n const token = req.headers.authorization?.replace('Bearer ', '');\n if (token) {\n const entry = authTokens.get(token);\n if (entry) return entry.userId;\n }\n return 'default-user';\n}\n\n// Active session abort controllers — keyed by sessionId\nconst sessionAborts = new Map<string, AbortController>();\n// R8: Track abort controller creation time for TTL-based cleanup\nconst sessionAbortTimes = new Map<string, number>();\n\n// S3: Track session ownership — sessionId → userId\nconst sessionOwners = new Map<string, string>();\n\n// R8: Periodic cleanup of orphaned abort controllers (TTL 5 min)\nsessionAbortCleanupInterval = setInterval(() => {\n const now = Date.now();\n for (const [id, controller] of sessionAborts) {\n if (controller.signal.aborted || (now - (sessionAbortTimes.get(id) || 0)) > 300_000) {\n sessionAborts.delete(id);\n sessionAbortTimes.delete(id);\n sessionOwners.delete(id);\n }\n }\n}, 60_000);\nsessionAbortCleanupInterval.unref();\n\n// Clean expired tokens every 10 minutes\ntokenCleanupInterval = setInterval(() => {\n const now = Date.now();\n const ttlMs = 24 * 60 * 60 * 1000;\n for (const [tok, entry] of authTokens) {\n if (now - entry.createdAt > ttlMs) authTokens.delete(tok);\n }\n saveAuthTokens();\n}, 600_000);\ntokenCleanupInterval.unref();\n\n/** Constant-time string comparison to prevent timing attacks */\nfunction safeCompare(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n return timingSafeEqual(Buffer.from(a), Buffer.from(b));\n}\n\n/** Check if a request token is valid */\nfunction isValidToken(token: string | undefined, config: ReturnType<typeof loadConfig>): boolean {\n const auth = config.gateway.auth;\n if (!auth || auth.mode === 'none') return true;\n if (!token) return false;\n // S2: If token mode but no token configured, log warning and deny (don't silently allow)\n if (auth.mode === 'token') {\n if (!auth.token) {\n logger.warn(COMPONENT, 'Auth mode is \"token\" but no token configured — denying request. Set gateway.auth.token or switch to mode \"password\".');\n return false;\n }\n return safeCompare(token, auth.token);\n }\n if (auth.mode === 'password') {\n const entry = authTokens.get(token);\n if (!entry) return false;\n const ttlMs = 24 * 60 * 60 * 1000; // 24 hours\n if (Date.now() - entry.createdAt > ttlMs) {\n authTokens.delete(token);\n saveAuthTokens();\n return false;\n }\n return true;\n }\n return false;\n}\n\n/** Login page HTML */\nfunction getLoginHTML(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n<title>TITAN — Login</title>\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\n@keyframes gradientBg{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}\n@keyframes shimmer{0%{background-position:-200% center}100%{background-position:200% center}}\n@keyframes shake{0%,100%{transform:translateX(0)}10%,30%,50%,70%,90%{transform:translateX(-4px)}20%,40%,60%,80%{transform:translateX(4px)}}\n@keyframes fadeIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\nbody{font-family:'Inter','Segoe UI',system-ui,sans-serif;background:linear-gradient(135deg,#0a0e1a 0%,#0f172a 25%,#1a1040 50%,#0f172a 75%,#0a0e1a 100%);background-size:400% 400%;animation:gradientBg 15s ease infinite;color:#e2e8f0;display:flex;align-items:center;justify-content:center;min-height:100vh}\n.box{background:rgba(17,24,39,0.85);backdrop-filter:blur(20px);border:1px solid rgba(42,48,80,0.6);border-radius:16px;padding:40px;width:380px;box-shadow:0 0 40px rgba(6,182,212,.1),0 0 80px rgba(139,92,246,.05);animation:fadeIn .6s ease-out}\n.box.shake{animation:shake .5s ease}\nh1{font-size:28px;font-weight:700;background:linear-gradient(90deg,#06b6d4,#8b5cf6,#06b6d4);background-size:200% auto;-webkit-background-clip:text;-webkit-text-fill-color:transparent;animation:shimmer 3s linear infinite;text-align:center;letter-spacing:3px;margin-bottom:4px}\n.sub{text-align:center;color:#94a3b8;font-size:13px;margin-bottom:32px}\nlabel{font-size:12px;color:#94a3b8;text-transform:uppercase;letter-spacing:1px;display:block;margin-bottom:8px}\ninput{width:100%;background:rgba(26,31,54,0.8);border:1px solid #2a3050;border-radius:10px;padding:12px 16px;color:#e2e8f0;font-size:15px;outline:none;transition:border .2s,box-shadow .2s}\ninput:focus{border-color:#06b6d4;box-shadow:0 0 12px rgba(6,182,212,.2)}\nbutton{width:100%;margin-top:20px;background:linear-gradient(135deg,#06b6d4,#8b5cf6);border:none;border-radius:10px;padding:14px;color:#fff;font-size:15px;font-weight:600;cursor:pointer;transition:opacity .2s,transform .1s}\nbutton:hover{opacity:.9;transform:translateY(-1px)}\nbutton:active{transform:translateY(0)}\n.error{color:#ef4444;font-size:13px;margin-top:12px;text-align:center;display:none}\n</style>\n</head>\n<body>\n<div class=\"box\">\n <h1>⚡ TITAN</h1>\n <div class=\"sub\">Mission Control</div>\n <label>Password</label>\n <input type=\"password\" id=\"pw\" placeholder=\"Enter gateway password\" onkeydown=\"if(event.key==='Enter')login()\"/>\n <button onclick=\"login()\">Unlock</button>\n <div class=\"error\" id=\"err\">Incorrect password. Try again.</div>\n</div>\n<script>\nasync function login() {\n const pw = document.getElementById('pw').value;\n const res = await fetch('/api/login', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({password:pw})});\n if (res.ok) {\n const {token} = await res.json();\n localStorage.setItem('titan_token', token);\n location.href = '/';\n } else {\n document.getElementById('err').style.display = 'block';\n document.getElementById('pw').value = '';\n document.getElementById('pw').focus();\n const box = document.querySelector('.box');\n box.classList.remove('shake');\n void box.offsetWidth;\n box.classList.add('shake');\n }\n}\ndocument.getElementById('pw').focus();\n</script>\n</body>\n</html>`;\n}\n\n/** All active channel adapters */\nconst channels: Map<string, ChannelAdapter> = new Map();\n\n/** All connected WebSocket clients */\ninterface TaggedWebSocket extends WebSocket {\n titanSessionId?: string;\n titanUserId?: string;\n}\nconst wsClients: Set<TaggedWebSocket> = new Set();\nconst WS_MAX_MESSAGE_BYTES = 10 * 1024 * 1024; // 10MB max WS message\n\n/** The WebChat channel instance */\nlet webChatChannel: WebChatChannel | null = null;\n\n/** Broadcast a message to WebSocket clients. If userId is specified, only sends to that user's connections. */\nfunction broadcast(data: Record<string, unknown>, userId?: string): void {\n const json = JSON.stringify(data);\n for (const client of wsClients) {\n if (client.readyState === WebSocket.OPEN) {\n // Session isolation: if userId specified, only send to matching clients\n if (userId && (client as TaggedWebSocket).titanUserId && (client as TaggedWebSocket).titanUserId !== userId) continue;\n try {\n client.send(json);\n } catch (err) {\n logger.warn(COMPONENT, `Broadcast send failed: ${(err as Error).message}`);\n }\n }\n }\n}\n\n// Sub-agent event bridge: forward agent bus events to SSE broadcast\nunsubscribeAgentEvents = onAgentEvent((event) => {\n const sseType = event.type === 'tool_call' ? 'tool_call' : event.type === 'tool_end' ? 'tool_end' : event.type;\n broadcast({ type: sseType, ...event.data, agentName: event.agentName, agentId: event.agentId, isSubAgent: true, timestamp: event.timestamp });\n});\n\n// Initiative event bridge: broadcast autonomous task progress to dashboard chat\ntitanEvents.on('initiative:start', (data) => {\n broadcast({\n type: 'system_message',\n content: `🤖 **Initiative starting**: ${(data as Record<string, string>).subtaskTitle}\\n📋 Goal: ${(data as Record<string, string>).goalTitle}`,\n source: 'initiative',\n timestamp: (data as Record<string, string>).timestamp,\n });\n});\ntitanEvents.on('initiative:complete', (data) => {\n const d = data as Record<string, unknown>;\n broadcast({\n type: 'system_message',\n content: `✅ **Subtask completed**: ${d.subtaskTitle}\\n🔧 Tools: ${(d.toolsUsed as string[]).join(', ')}\\n📝 ${(d.summary as string || '').slice(0, 200)}`,\n source: 'initiative',\n timestamp: d.timestamp as string,\n });\n});\ntitanEvents.on('initiative:no_progress', (data) => {\n const d = data as Record<string, unknown>;\n broadcast({\n type: 'system_message',\n content: `⚠️ **No progress on**: ${d.subtaskTitle}\\n${d.reason}`,\n source: 'initiative',\n timestamp: d.timestamp as string,\n });\n});\ntitanEvents.on('initiative:tool_call', (data) => {\n const d = data as Record<string, unknown>;\n broadcast({\n type: 'system_message',\n content: `🔧 **${d.tool}**: ${d.args || ''}`,\n source: 'initiative',\n timestamp: d.timestamp as string,\n });\n});\ntitanEvents.on('initiative:tool_result', (data) => {\n const d = data as Record<string, unknown>;\n const icon = d.success ? '✅' : '❌';\n broadcast({\n type: 'system_message',\n content: `${icon} **${d.tool}** ${d.success ? 'completed' : 'failed'} (${d.durationMs}ms)`,\n source: 'initiative',\n timestamp: d.timestamp as string,\n });\n});\ntitanEvents.on('initiative:round', (data) => {\n const d = data as Record<string, unknown>;\n broadcast({\n type: 'system_message',\n content: `🔄 **Round ${d.round}/${d.maxRounds}** — ${d.subtaskTitle}`,\n source: 'initiative',\n timestamp: d.timestamp as string,\n });\n});\n\n/** Safely send a response through a channel adapter.\n * Hunt Finding #13: uses deliver() which runs the content through the\n * outbound sanitizer before invoking the channel's send() method. Applies\n * to all 17 channel adapters automatically. */\nasync function safeSend(channelName: string, msg: { channel: string; userId: string; groupId?: string; content: string; replyTo?: string }): Promise<void> {\n const channel = channels.get(channelName);\n if (!channel) return;\n try {\n await channel.deliver(msg);\n } catch (err) {\n logger.warn(COMPONENT, `Channel send failed (${channelName}): ${(err as Error).message}`);\n }\n}\n\n/** Handle an inbound message from any channel */\nasync function handleInboundMessage(msg: InboundMessage): Promise<void> {\n logger.info(COMPONENT, `[${msg.channel}] ${msg.userName || msg.userId}: ${msg.content.slice(0, 100)}`);\n\n // Broadcast to WebSocket clients for UI\n broadcast({\n type: 'message',\n direction: 'inbound',\n channel: msg.channel,\n userId: msg.userId,\n userName: msg.userName,\n content: msg.content,\n timestamp: msg.timestamp.toISOString(),\n });\n\n // ── Native slash commands (highest priority) ──────────────────\n const slashResult = await handleSlashCommand(msg.content, msg.channel, msg.userId);\n if (slashResult) {\n await safeSend(msg.channel, { channel: msg.channel, userId: msg.userId, groupId: msg.groupId, content: slashResult.response, replyTo: msg.id });\n broadcast({ type: 'message', direction: 'outbound', channel: msg.channel, userId: msg.userId, content: slashResult.response, timestamp: new Date().toISOString() });\n return;\n }\n\n // ── Recipe slash commands (second priority) ──────────────────\n const slash = parseSlashCommand(msg.content);\n if (slash) {\n const { command, args } = slash;\n const params: Record<string, string> = {};\n if (args) { params['file'] = args; params['topic'] = args; params['error'] = args; }\n try {\n let fullResponse = '';\n for await (const step of runRecipe(command, params)) {\n const r = await processMessage(step.prompt, msg.channel, msg.userId);\n fullResponse += (fullResponse ? '\\n\\n' : '') + r.content;\n }\n await safeSend(msg.channel, { channel: msg.channel, userId: msg.userId, groupId: msg.groupId, content: fullResponse, replyTo: msg.id });\n broadcast({ type: 'message', direction: 'outbound', channel: msg.channel, userId: msg.userId, content: fullResponse, timestamp: new Date().toISOString() });\n return;\n } catch {\n // Recipe not found — fall through to normal processing\n }\n }\n\n try {\n // Route through multi-agent system\n const response = await routeMessage(msg.content, msg.channel, msg.userId);\n\n // Send response back to the channel\n await safeSend(msg.channel, {\n channel: msg.channel,\n userId: msg.userId,\n groupId: msg.groupId,\n content: response.content,\n replyTo: msg.id,\n });\n\n // Broadcast response to UI\n broadcast({\n type: 'message',\n direction: 'outbound',\n channel: msg.channel,\n userId: msg.userId,\n content: response.content,\n toolsUsed: response.toolsUsed,\n tokenUsage: response.tokenUsage,\n durationMs: response.durationMs,\n timestamp: new Date().toISOString(),\n });\n } catch (error) {\n logger.error(COMPONENT, `Error processing message: ${(error as Error).message}`);\n broadcast({ type: 'error', message: 'TITAN ran into a problem handling that message. Please try again.' });\n }\n}\n\n/** Start the Gateway server */\nexport async function startGateway(options?: { port?: number; host?: string; verbose?: boolean; rateLimitMax?: number; rateLimitWindowMs?: number; skipUsableCheck?: boolean }): Promise<void> {\n const config = loadConfig();\n initFileLogger(TITAN_LOGS_DIR);\n const port = options?.port || config.gateway.port;\n let host = options?.host || config.gateway.host;\n\n // Hunt Finding #29 (2026-04-14): install a bounded global HTTP dispatcher\n // BEFORE any fetch() calls are made. Without this, each parallel Ollama\n // fetch opens a fresh socket and the keep-alive pool grows unboundedly.\n // Phase 5 load test saw 80+ idle sockets to Ollama after 100 requests.\n try {\n const { installGlobalHttpPool } = await import('../utils/httpPool.js');\n const poolCfg = (config.gateway as unknown as { httpPool?: { connections?: number; keepAliveTimeoutMs?: number; keepAliveMaxTimeoutMs?: number; headersTimeoutMs?: number; bodyTimeoutMs?: number } }).httpPool;\n installGlobalHttpPool({\n connections: poolCfg?.connections,\n keepAliveTimeoutMs: poolCfg?.keepAliveTimeoutMs,\n keepAliveMaxTimeoutMs: poolCfg?.keepAliveMaxTimeoutMs,\n headersTimeoutMs: poolCfg?.headersTimeoutMs,\n bodyTimeoutMs: poolCfg?.bodyTimeoutMs,\n });\n } catch (e) {\n logger.warn(COMPONENT, `[HttpPool] Failed to install global dispatcher: ${(e as Error).message} — fetch() will use Node defaults (unbounded pool)`);\n }\n\n logger.info(COMPONENT, `Starting ${TITAN_NAME} Gateway v${TITAN_VERSION}`);\n\n // ── First-run guard: refuse to start with no usable provider ──\n // Without this, the gateway boots fine but every chat call fails with a\n // generic 500. Users have no idea they need to configure a provider.\n // Bypass with --skip-usable-check (or skipUsableCheck option) for advanced use.\n if (!options?.skipUsableCheck) {\n const { hasUsableProvider } = await import('../config/config.js');\n const usable = await hasUsableProvider();\n if (!usable.ok) {\n console.error('');\n console.error('\\x1b[31m\\x1b[1m❌ TITAN is not configured.\\x1b[0m');\n console.error('');\n console.error(` ${usable.details}`);\n console.error('');\n console.error(' Run the setup wizard:');\n console.error(' \\x1b[36mtitan onboard\\x1b[0m');\n console.error('');\n console.error(' Or set an environment variable:');\n console.error(' \\x1b[36mexport ANTHROPIC_API_KEY=\"sk-ant-...\"\\x1b[0m');\n console.error(' \\x1b[36mexport OPENAI_API_KEY=\"sk-...\"\\x1b[0m');\n console.error(' \\x1b[36mexport OLLAMA_BASE_URL=\"http://localhost:11434\"\\x1b[0m');\n console.error('');\n console.error(' Or check what went wrong:');\n console.error(' \\x1b[36mtitan doctor\\x1b[0m');\n console.error('');\n console.error(' To skip this check (advanced):');\n console.error(' \\x1b[36mtitan gateway --skip-usable-check\\x1b[0m');\n console.error('');\n process.exit(1);\n }\n logger.info(COMPONENT, `Provider check passed: ${usable.details}`);\n }\n\n // ── Production safety warning ─────────────────────────────────────\n if (config.autonomy?.mode === 'autonomous') {\n logger.warn(COMPONENT, '⚠️ AUTONOMY MODE IS \"autonomous\" — all tools run without approval. Safe for personal use, DANGEROUS for multi-user deployments.');\n logger.warn(COMPONENT, ' Set autonomy.mode to \"supervised\" in titan.json if exposing to external users.');\n }\n if (config.commandPost?.enabled) {\n logger.info(COMPONENT, '✅ Command Post governance is active — approvals route through CP queue');\n } else {\n logger.warn(COMPONENT, '⚠️ Command Post is DISABLED — no approval queue, no budget enforcement, no agent registry');\n }\n if (config.selfMod?.enabled) {\n logger.info(COMPONENT, '✅ Self-modification is active — writes are staged for human review');\n }\n\n // ── Stale session cleanup: mark orphaned active sessions as idle ──\n cleanupStaleSessions();\n\n // ── Port pre-check: fail fast before loading subsystems ────\n const portAvailable = await new Promise<boolean>((resolve) => {\n const tester = net.createServer();\n tester.once('error', () => resolve(false));\n tester.once('listening', () => { tester.close(); resolve(true); });\n tester.listen(port, host);\n });\n if (!portAvailable) {\n logger.error(COMPONENT, `Port ${port} is already in use. Is TITAN already running?`);\n logger.info(COMPONENT, `Try: titan gateway --port ${port + 1}`);\n process.exit(1);\n }\n\n // ── GPU detection: adjust stall timeout for CPU-only inference ──\n const { detectGpu } = await import('../utils/hardware.js');\n if (!detectGpu()) {\n const { setStallThreshold } = await import('../agent/stallDetector.js');\n setStallThreshold(120_000);\n logger.info(COMPONENT, 'No GPU detected — stall timeout increased to 120s for CPU inference');\n maxConcurrentOverride = 2;\n logger.info(COMPONENT, 'CPU-only mode: maxConcurrentTasks auto-tuned to 2');\n }\n\n // Initialize subsystems\n initMemory();\n initLearning();\n initGraph();\n\n // Recover persisted deliberation states from previous session\n import('../agent/deliberation.js').then(({ recoverDeliberations }) => {\n recoverDeliberations();\n }).catch(() => {});\n\n // Initialize vector search (Tier 2 memory — non-blocking)\n import('../memory/vectors.js').then(({ initVectors }) => {\n initVectors().then(ok => {\n if (ok) logger.info(COMPONENT, 'Vector search (Tier 2 memory) initialized');\n }).catch(() => {});\n }).catch(() => {});\n\n await initBuiltinSkills();\n initAgents();\n\n // ── Rate limiter (inline, no deps) ─────────────────────────\n const defaultRateLimitWindowMs = options?.rateLimitWindowMs ?? 60000;\n const defaultRateLimitMax = options?.rateLimitMax ?? 30;\n const rateLimitStore = new Map<string, { count: number; resetAt: number }>();\n\n /**\n * Get a consistent client IP address for rate limiting.\n * Falls back through: X-Forwarded-For → req.ip → socket remoteAddress\n */\n function getClientIp(req: Request): string {\n return (req.headers['x-forwarded-for'] as string)?.split(',')[0]?.trim()\n || req.ip\n || req.socket?.remoteAddress\n || 'unknown';\n }\n\n function rateLimit(windowMs: number, maxRequests: number) {\n return (req: Request, res: Response, next: NextFunction) => {\n const key = getClientIp(req);\n const now = Date.now();\n const entry = rateLimitStore.get(key);\n if (!entry || now > entry.resetAt) {\n rateLimitStore.set(key, { count: 1, resetAt: now + windowMs });\n next();\n } else if (entry.count < maxRequests) {\n entry.count++;\n next();\n } else {\n const retryAfter = Math.ceil((entry.resetAt - now) / 1000);\n logger.warn(COMPONENT, `[RateLimit] Client ${key} rate limited (${entry.count}/${maxRequests} in ${windowMs}ms)`);\n res.setHeader('Retry-After', String(retryAfter));\n res.status(429).json({ error: 'Too many requests', retryAfter });\n }\n };\n }\n\n // ── Concurrent request guard (prevents parallel abuse) ────\n // Hunt Finding #27 (2026-04-14): previously this attached BOTH a 'finish'\n // and a 'close' handler that each decremented the counter. Both events\n // fire for a normal request completion ('finish' first, then 'close'),\n // so every real request caused TWO decrements. Under parallel load the\n // counter drifted below the true active-request count, effectively\n // doubling the allowed concurrency. Math.max(0, -) kept it from going\n // negative numerically but the effective limit became 2×MAX.\n //\n // Fix: use ONLY 'close', which fires for every completed response\n // (normal, aborted, errored) exactly once. Remove 'finish' to eliminate\n // the double-decrement. Also make the limit configurable via config\n // so operators can tune it for their deployment instead of being stuck\n // at the hardcoded 5.\n let activeMessageRequests = 0;\n const MAX_CONCURRENT_MESSAGES = (() => {\n const cfg = loadConfig() as unknown as { gateway?: { maxConcurrentMessages?: number } };\n const v = cfg.gateway?.maxConcurrentMessages;\n if (typeof v === 'number' && v > 0 && v <= 1000) return v;\n return 5;\n })();\n\n function concurrencyGuard(maxConcurrent: number) {\n return (_req: Request, res: Response, next: NextFunction) => {\n if (activeMessageRequests >= maxConcurrent) {\n res.status(503).json({ error: 'Server busy — too many concurrent requests' });\n return;\n }\n activeMessageRequests++;\n // 'close' fires exactly once per completed request — safer than 'finish'\n // which only fires for successful sends AND is followed by 'close'\n // anyway (causing the double-decrement bug).\n let decremented = false;\n res.on('close', () => {\n if (decremented) return;\n decremented = true;\n activeMessageRequests = Math.max(0, activeMessageRequests - 1);\n });\n next();\n };\n }\n\n // Clean rate limit store every 60 seconds (unref so it doesn't block shutdown)\n rateLimitCleanupInterval = setInterval(() => {\n const now = Date.now();\n for (const [key, entry] of rateLimitStore) {\n if (now > entry.resetAt) rateLimitStore.delete(key);\n }\n // Cap rate limit store to prevent unbounded growth\n if (rateLimitStore.size > 10_000) {\n const entries = [...rateLimitStore.entries()].sort((a, b) => a[1].resetAt - b[1].resetAt);\n const toRemove = entries.slice(0, entries.length - 10_000);\n for (const [key] of toRemove) rateLimitStore.delete(key);\n }\n }, 60_000);\n rateLimitCleanupInterval.unref();\n\n // Create Express app\n const app = express();\n\n // ── Serve React SPA static assets FIRST ───────────────────\n // Static files (JS, CSS, images) should bypass JSON parsing,\n // request logging, and auth middleware for efficiency.\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const uiDistPath = join(__dirname, '../../ui/dist');\n const uiIndexPath = join(uiDistPath, 'index.html');\n const hasReactUI = fs.existsSync(uiIndexPath);\n let cachedIndexHtml: string | null = null;\n if (hasReactUI) {\n // Cache index.html in memory to avoid sync file reads on every request\n cachedIndexHtml = fs.readFileSync(uiIndexPath, 'utf8');\n app.use(express.static(uiDistPath, { index: false }));\n // Hot-reload the cache when the file changes (dev rebuilds)\n fs.watchFile(uiIndexPath, { interval: 1000 }, () => {\n try {\n cachedIndexHtml = fs.readFileSync(uiIndexPath, 'utf8');\n } catch { /* ignore read errors during write */ }\n });\n }\n\n app.use(express.json({ limit: '1mb' }));\n\n // Request logging middleware (skips static assets served above)\n app.use((req, res, next) => {\n const start = Date.now();\n res.on('finish', () => {\n const duration = Date.now() - start;\n logger.info(COMPONENT, `${req.method} ${req.path} → ${res.statusCode} (${duration}ms)`);\n });\n next();\n });\n\n // OpenAI API compatibility layer (/v1/models, /v1/chat/completions, /v1/embeddings)\n app.use('/v1', createOpenAICompatRouter());\n\n // ── Paperclip sidecar management & proxy ───────────────────\n const PAPERCLIP_PORT = 3100; // Paperclip server default port\n\n app.get('/api/paperclip/status', async (_req, res) => {\n try {\n res.json(await getPaperclipStatus());\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/paperclip/start', async (_req, res) => {\n try {\n await startPaperclip({ enabled: true, port: PAPERCLIP_PORT, autoStart: true }, titanEvents);\n res.json({ ok: true });\n } catch (err) {\n logger.error(COMPONENT, `Paperclip start failed: ${(err as Error).message}`);\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/paperclip/stop', async (_req, res) => {\n try {\n await stopPaperclip();\n res.json({ ok: true });\n } catch (err) {\n logger.error(COMPONENT, `Paperclip stop failed: ${(err as Error).message}`);\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/paperclip/reset', async (_req, res) => {\n try {\n await stopPaperclip();\n await startPaperclip({ enabled: true, port: PAPERCLIP_PORT, autoStart: true }, titanEvents);\n res.json({ ok: true });\n } catch (err) {\n logger.error(COMPONENT, `Paperclip reset failed: ${(err as Error).message}`);\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Proxy Paperclip API calls (/api/paperclip/* → http://localhost:3100/api/*)\n app.all('/api/paperclip/*', async (req: Request, res: Response) => {\n // Skip the management routes handled above\n if (req.path === '/api/paperclip/status' || req.path === '/api/paperclip/start' || req.path === '/api/paperclip/stop' || req.path === '/api/paperclip/reset') {\n res.status(404).json({ error: 'Not found' });\n return;\n }\n const targetPath = req.path.replace(/^\\/api\\/paperclip/, '/api');\n const query = req.url.includes('?') ? '?' + req.url.split('?')[1] : '';\n const targetUrl = `http://localhost:${PAPERCLIP_PORT}${targetPath}${query}`;\n try {\n const headers = new Headers();\n for (const [k, v] of Object.entries(req.headers)) {\n if (v && k.toLowerCase() !== 'host') headers.set(k, Array.isArray(v) ? v[0] : v);\n }\n const upstream = await fetch(targetUrl, {\n method: req.method,\n headers,\n body: ['GET', 'HEAD'].includes(req.method) ? undefined : JSON.stringify(req.body),\n });\n res.status(upstream.status);\n upstream.headers.forEach((v, k) => res.setHeader(k, v));\n const body = await upstream.arrayBuffer();\n res.end(Buffer.from(body));\n } catch (err) {\n logger.error(COMPONENT, `Paperclip API proxy error: ${(err as Error).message}`);\n res.status(502).json({ error: 'Paperclip API proxy error', message: (err as Error).message });\n }\n });\n\n // Proxy Paperclip web UI (/paperclip/* → http://localhost:3100/*)\n app.all('/paperclip/*', async (req: Request, res: Response) => {\n const targetPath = req.path.replace(/^\\/paperclip/, '') || '/';\n const query = req.url.includes('?') ? '?' + req.url.split('?')[1] : '';\n const targetUrl = `http://localhost:${PAPERCLIP_PORT}${targetPath}${query}`;\n try {\n const headers = new Headers();\n for (const [k, v] of Object.entries(req.headers)) {\n if (v && k.toLowerCase() !== 'host') headers.set(k, Array.isArray(v) ? v[0] : v);\n }\n const upstream = await fetch(targetUrl, {\n method: req.method,\n headers,\n body: ['GET', 'HEAD'].includes(req.method) ? undefined : JSON.stringify(req.body),\n });\n res.status(upstream.status);\n upstream.headers.forEach((v, k) => res.setHeader(k, v));\n const body = await upstream.arrayBuffer();\n res.end(Buffer.from(body));\n } catch (err) {\n logger.error(COMPONENT, `Paperclip UI proxy error: ${(err as Error).message}`);\n res.status(502).json({ error: 'Paperclip UI proxy error', message: (err as Error).message });\n }\n });\n\n // Ollama native API proxy (/ollama/* → configured Ollama server)\n // The UI's titan2/llm/ollama.ts hits /ollama/api/chat and /ollama/api/generate\n app.all('/ollama/*', async (req: Request, res: Response) => {\n const cfg = loadConfig();\n const ollamaBase = cfg.providers?.ollama?.baseUrl || process.env.OLLAMA_HOST || 'http://localhost:11434';\n const targetPath = req.path.replace(/^\\/ollama/, '');\n const targetUrl = `${ollamaBase}${targetPath}`;\n\n try {\n const upstream = await fetch(targetUrl, {\n method: req.method,\n headers: {\n 'Content-Type': req.headers['content-type'] || 'application/json',\n Accept: req.headers['accept'] || '*/*',\n },\n body: req.method !== 'GET' && req.method !== 'HEAD' ? JSON.stringify(req.body) : undefined,\n });\n\n res.status(upstream.status);\n upstream.headers.forEach((value, key) => {\n // Don't forward content-encoding; Node will handle compression itself\n if (key.toLowerCase() !== 'content-encoding') {\n res.setHeader(key, value);\n }\n });\n\n if (upstream.body) {\n const reader = upstream.body.getReader();\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(Buffer.from(value));\n }\n }\n res.end();\n } catch (err) {\n logger.error(COMPONENT, `Ollama proxy error: ${(err as Error).message}`);\n res.status(502).json({ error: 'Ollama proxy error', message: (err as Error).message });\n }\n });\n\n // Handle JSON parse errors and payload too large\n app.use((err: Error & { type?: string; status?: number }, req: Request, res: Response, next: NextFunction) => {\n if (err.type === 'entity.too.large') {\n res.status(413).json({ error: 'Payload too large (max 1MB)' });\n return;\n }\n if (err.type === 'entity.parse.failed') {\n res.status(400).json({ error: 'Invalid JSON' });\n return;\n }\n next(err);\n });\n\n // Security headers + CSP\n app.use((req, res, next) => {\n res.setHeader('X-Content-Type-Options', 'nosniff');\n res.setHeader('X-Frame-Options', 'SAMEORIGIN');\n res.setHeader('X-XSS-Protection', '1; mode=block');\n res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');\n res.setHeader('Content-Security-Policy', [\n \"default-src 'self'\",\n // Sandbox widget iframes use new Function() for code evaluation.\n \"script-src 'self' 'unsafe-inline' 'unsafe-eval'\",\n \"style-src 'self' 'unsafe-inline'\",\n \"connect-src 'self' ws: wss: https: http:\",\n \"media-src 'self' blob: mediastream:\",\n \"img-src 'self' data: blob:\",\n \"font-src 'self' data:\",\n // Canvas AI-generated widgets run in a sandboxed iframe whose\n // source is a blob: URL built by ui/src/titan2/sandbox/SandboxRuntime.\n // Without `frame-src blob:` the browser shows:\n // \"This content is blocked. Contact the site owner to fix the issue.\"\n // worker-src + child-src are included as safety fallbacks for\n // older engines that don't honor frame-src directly.\n \"frame-src 'self' blob: data:\",\n \"child-src 'self' blob: data:\",\n \"worker-src 'self' blob:\",\n ].join('; '));\n res.removeHeader('X-Powered-By');\n next();\n });\n\n // CORS — allow localhost, Tailscale, Cloudflare tunnels, and LAN origins\n const gatewayPort = config.gateway.port || 48420;\n const localhostOrigins = new Set([\n `http://127.0.0.1:${gatewayPort}`,\n `http://localhost:${gatewayPort}`,\n `https://127.0.0.1:${gatewayPort}`,\n `https://localhost:${gatewayPort}`,\n ]);\n const dynamicOriginPatterns = [\n /^https?:\\/\\/[a-z0-9-]+\\.ts\\.net(:\\d+)?$/, // Tailscale (*.ts.net)\n /^https?:\\/\\/[a-z0-9-]+\\.trycloudflare\\.com(:\\d+)?$/, // Cloudflare tunnel\n /^http:\\/\\/192\\.168\\.\\d{1,3}\\.\\d{1,3}(:\\d+)?$/, // LAN 192.168.x.x\n /^http:\\/\\/10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d+)?$/, // LAN 10.x.x.x\n /^http:\\/\\/172\\.(1[6-9]|2\\d|3[0-1])\\.\\d{1,3}\\.\\d{1,3}(:\\d+)?$/, // LAN 172.16-31.x.x\n ];\n function isAllowedOrigin(origin: string): boolean {\n if (localhostOrigins.has(origin)) return true;\n return dynamicOriginPatterns.some(re => re.test(origin));\n }\n app.use((req, res, next) => {\n const origin = req.headers.origin;\n if (origin && isAllowedOrigin(origin)) {\n res.setHeader('Access-Control-Allow-Origin', origin);\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n }\n if (req.method === 'OPTIONS') { res.sendStatus(204); return; }\n next();\n });\n\n // ── Login routes (no auth required) ──────────────────────────\n app.get('/login', (_req, res) => {\n res.setHeader('Content-Type', 'text/html');\n res.send(getLoginHTML());\n });\n\n app.post('/api/login', rateLimit(60000, 5), (req, res) => {\n const cfg = loadConfig();\n const auth = cfg.gateway.auth;\n if (!auth || auth.mode === 'none') {\n res.json({ token: 'noauth' });\n return;\n }\n const { password } = req.body as { password?: string };\n let valid = false;\n if (auth.mode === 'password' && auth.password && password && safeCompare(password, auth.password)) valid = true;\n if (auth.mode === 'token' && auth.token && password && safeCompare(password, auth.token)) valid = true;\n if (!valid) { res.status(401).json({ error: 'Invalid password' }); return; }\n const token = randomBytes(32).toString('hex');\n authTokens.set(token, { createdAt: Date.now(), userId: `user-${token.slice(0, 8)}` });\n saveAuthTokens();\n res.json({ token });\n });\n\n // ── Prometheus /metrics (no auth — standard scrape path) ────\n app.get('/metrics', (_req, res) => {\n res.setHeader('Content-Type', 'text/plain; version=0.0.4');\n res.send(serializePrometheus());\n });\n\n // ── Auth middleware (API routes only) ────────────────────────\n // HTML pages (/ and /login) are always served — the JS handles\n // the redirect to /login if localStorage has no token.\n // Only /api/* routes require a valid token.\n app.use('/api', (req, res, next) => {\n const cfg = loadConfig();\n const auth = cfg.gateway.auth;\n if (!auth || auth.mode === 'none') { next(); return; }\n // Token mode with no token configured = auth not set up, allow access\n if (auth.mode === 'token' && !auth.token) { next(); return; }\n // Skip public endpoints (login, messenger webhook, twilio webhooks)\n if (req.path === '/login') { next(); return; }\n if (req.path === '/messenger/webhook') { next(); return; }\n if (req.path.startsWith('/twilio/')) { next(); return; }\n const header = req.headers.authorization;\n const token = header?.startsWith('Bearer ') ? header.slice(7) : (req.query.token as string);\n if (isValidToken(token, cfg)) { next(); return; }\n res.status(401).json({ error: 'Unauthorized' });\n });\n\n // ── Command Post availability guard ──────────────────────────\n app.use('/api/command-post', (_req, res, next) => {\n if (isCommandPostEnabled()) { next(); return; }\n res.status(503).json({ error: 'Command Post is disabled', hint: 'Enable it in titan.json: commandPost.enabled = true' });\n });\n\n // Legacy dashboard (kept during migration, also fallback if React UI not built)\n app.get('/legacy', (_req, res) => {\n res.setHeader('Content-Type', 'text/html');\n res.send(getMissionControlHTML());\n });\n\n // Root route: React SPA or legacy dashboard\n app.get('/', (_req, res) => {\n if (hasReactUI && cachedIndexHtml) {\n res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');\n res.setHeader('Pragma', 'no-cache');\n res.setHeader('Expires', '0');\n res.send(cachedIndexHtml);\n } else {\n res.setHeader('Content-Type', 'text/html');\n res.send(getMissionControlHTML());\n }\n });\n\n // API routes\n app.get('/api/stats', (_req, res) => {\n const usage = getUsageStats();\n const cfg = loadConfig();\n const activeModel = cfg.agent.model || '';\n const mem = process.memoryUsage();\n const activeAgents = listAgents().filter(a => a.status === 'running').length;\n const activeSessions = listSessions().length;\n res.json({\n ...usage,\n version: TITAN_VERSION,\n uptime: process.uptime(),\n model: activeModel.replace(/^ollama\\//, ''),\n provider: activeModel.split('/')[0] || 'ollama',\n memoryMB: Math.round(mem.rss / 1024 / 1024),\n memoryUsage: {\n heapUsed: mem.heapUsed,\n heapTotal: mem.heapTotal,\n rss: mem.rss,\n external: mem.external,\n arrayBuffers: mem.arrayBuffers,\n },\n health: {\n ollamaHealthy: healthState.ollamaHealthy,\n ttsHealthy: healthState.ttsHealthy,\n lastCheck: healthState.lastCheck,\n stuckDetected: healthState.stuckDetected,\n uptimeSeconds: Math.round(process.uptime()),\n memoryUsageMB: Math.round(mem.heapUsed / 1024 / 1024),\n activeLlmRequests,\n },\n activeAgents,\n activeSessions,\n });\n });\n\n // ── Dependency Scan API ────────────────────────────────────────\n app.get('/api/dependencies/scan', async (_req, res) => {\n try {\n const reportPath = join(TITAN_WORKSPACE, 'dependency-scan-report.json');\n if (fs.existsSync(reportPath)) {\n const report = JSON.parse(fs.readFileSync(reportPath, 'utf-8'));\n res.json(report);\n } else {\n res.status(404).json({ error: 'No scan report found. Run a scan first.' });\n }\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/dependencies/scan', async (req, res) => {\n try {\n const { fix = false } = req.body;\n const scriptPath = join(dirname(fileURLToPath(import.meta.url)), '../../scripts/dependency-scan.cjs');\n\n // Run scan in background\n const proc = spawn('node', [scriptPath, ...(fix ? ['--fix'] : [])], {\n cwd: TITAN_WORKSPACE,\n stdio: 'pipe',\n detached: false,\n });\n\n let output = '';\n proc.stdout?.on('data', (data) => { output += data.toString(); });\n proc.stderr?.on('data', (data) => { output += data.toString(); });\n\n proc.on('close', (code) => {\n if (code === 0) {\n logger.info(COMPONENT, 'Dependency scan completed successfully');\n } else {\n logger.warn(COMPONENT, `Dependency scan exited with code ${code}`);\n }\n });\n\n res.json({ success: true, message: 'Dependency scan started in background' });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/dependencies/status', (_req, res) => {\n try {\n const reportPath = join(TITAN_WORKSPACE, 'dependency-scan-report.json');\n if (fs.existsSync(reportPath)) {\n const stats = fs.statSync(reportPath);\n const report = JSON.parse(fs.readFileSync(reportPath, 'utf-8'));\n\n const summary = {\n lastScan: report.timestamp,\n lastScanAge: Date.now() - new Date(report.timestamp).getTime(),\n vulnerabilities: report.vulnerabilities.total,\n critical: report.vulnerabilities.critical,\n high: report.vulnerabilities.high,\n outdated: report.outdated?.length || 0,\n deprecated: report.deprecated?.length || 0,\n licenseIssues: report.licenseIssues?.length || 0,\n health: report.vulnerabilities.critical === 0 && report.vulnerabilities.high === 0 ? 'healthy' : 'warning',\n };\n\n res.json(summary);\n } else {\n res.json({\n lastScan: null,\n health: 'unknown',\n message: 'No scan has been run yet',\n });\n }\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Tracing API ─────────────────────────────────────────────────\n app.get('/api/traces', async (_req, res) => {\n try {\n const { listTraces, getTraceStats } = await import('../agent/tracer.js');\n const limit = parseInt(_req.query.limit as string || '50', 10);\n const session = _req.query.session as string | undefined;\n res.json({ traces: listTraces(limit, session), stats: getTraceStats() });\n } catch { res.json({ traces: [], stats: {} }); }\n });\n\n app.get('/api/traces/:traceId', async (req, res) => {\n try {\n const { getTrace } = await import('../agent/tracer.js');\n const trace = getTrace(req.params.traceId);\n if (!trace) { res.status(404).json({ error: 'Trace not found' }); return; }\n res.json(trace);\n } catch { res.status(500).json({ error: 'Tracer unavailable' }); }\n });\n\n // ── Checkpoints API ────────────────────────────────────────────\n app.get('/api/checkpoints', async (_req, res) => {\n try {\n const { listCheckpoints } = await import('../agent/checkpoint.js');\n res.json({ checkpoints: listCheckpoints() });\n } catch { res.json({ checkpoints: [] }); }\n });\n\n app.get('/api/checkpoints/:sessionId', async (req, res) => {\n try {\n const { loadCheckpoint } = await import('../agent/checkpoint.js');\n const round = req.query.round ? parseInt(req.query.round as string, 10) : undefined;\n const cp = loadCheckpoint(req.params.sessionId, round);\n if (!cp) { res.status(404).json({ error: 'Checkpoint not found' }); return; }\n res.json(cp);\n } catch { res.status(500).json({ error: 'Checkpoint unavailable' }); }\n });\n\n app.delete('/api/checkpoints/:sessionId', async (req, res) => {\n try {\n const { clearCheckpoints } = await import('../agent/checkpoint.js');\n clearCheckpoints(req.params.sessionId);\n res.json({ success: true });\n } catch { res.status(500).json({ error: 'Failed to clear checkpoints' }); }\n });\n\n // ── Company API (Paperclip-style) ─────────────────────────────\n app.get('/api/companies', async (_req, res) => {\n try {\n const { listCompanies, getActiveRunners } = await import('../agent/company.js');\n const includeArchived = _req.query.archived === 'true';\n const companies = listCompanies(includeArchived);\n const runners = getActiveRunners();\n res.json({ companies: companies.map(c => ({ ...c, runnerActive: runners.includes(c.id) })) });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/companies', async (req, res) => {\n try {\n const { createCompany } = await import('../agent/company.js');\n const company = createCompany(req.body);\n res.json(company);\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.get('/api/companies/:id', async (req, res) => {\n try {\n const { getCompany, isRunnerActive } = await import('../agent/company.js');\n const company = getCompany(req.params.id);\n if (!company) { res.status(404).json({ error: 'Company not found' }); return; }\n res.json({ ...company, runnerActive: isRunnerActive(company.id) });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.patch('/api/companies/:id', async (req, res) => {\n try {\n const { updateCompany } = await import('../agent/company.js');\n const company = updateCompany(req.params.id, req.body);\n if (!company) { res.status(404).json({ error: 'Company not found' }); return; }\n res.json(company);\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.delete('/api/companies/:id', async (req, res) => {\n try {\n const { deleteCompany, stopCompanyRunner } = await import('../agent/company.js');\n stopCompanyRunner(req.params.id);\n const ok = deleteCompany(req.params.id);\n res.json({ success: ok });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // Start/stop company heartbeat runner\n app.post('/api/companies/:id/start', async (req, res) => {\n try {\n const { startCompanyRunner } = await import('../agent/company.js');\n const interval = parseInt(req.body?.intervalMs || '60000', 10);\n const ok = startCompanyRunner(req.params.id, interval);\n res.json({ success: ok, message: ok ? 'Runner started' : 'Already running or company not active' });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/companies/:id/stop', async (req, res) => {\n try {\n const { stopCompanyRunner } = await import('../agent/company.js');\n const ok = stopCompanyRunner(req.params.id);\n res.json({ success: ok });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // Add agent/goal to company\n app.post('/api/companies/:id/agents', async (req, res) => {\n try {\n const { addAgentToCompany } = await import('../agent/company.js');\n const agent = addAgentToCompany(req.params.id, req.body);\n if (!agent) { res.status(404).json({ error: 'Company not found' }); return; }\n res.json(agent);\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/companies/:id/goals', async (req, res) => {\n try {\n const { addGoalToCompany } = await import('../agent/company.js');\n const goal = addGoalToCompany(req.params.id, req.body);\n if (!goal) { res.status(404).json({ error: 'Company not found' }); return; }\n res.json(goal);\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // ── Company Portability (Export/Import) ───────────────────────\n app.post('/api/companies/:id/export', async (req, res) => {\n try {\n const { getCompany } = await import('../agent/company.js');\n const { writeCompanyPackage } = await import('../agent/companyPortability.js');\n const company = getCompany(req.params.id);\n if (!company) { res.status(404).json({ error: 'Company not found' }); return; }\n const outPath = writeCompanyPackage(company, req.body?.outDir);\n res.json({ success: true, path: outPath, name: company.name });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/companies/exports', async (_req, res) => {\n try {\n const { listExportedPackages } = await import('../agent/companyPortability.js');\n res.json(listExportedPackages());\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/companies/import', async (req, res) => {\n try {\n const { importCompanyFromDirectory, importCompanyFromMarkdown } = await import('../agent/companyPortability.js');\n const { createCompany } = await import('../agent/company.js');\n let imported = null;\n if (req.body?.packagePath) {\n imported = importCompanyFromDirectory(req.body.packagePath);\n } else if (req.body?.markdown) {\n imported = importCompanyFromMarkdown(req.body.markdown);\n }\n if (!imported) { res.status(400).json({ error: 'Invalid import. Provide packagePath or markdown.' }); return; }\n const company = createCompany(imported);\n res.json({ success: true, company });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n // ── Soul API ──────────────────────────────────────────────────\n app.get('/api/soul/wisdom', async (_req, res) => {\n try {\n const { getWisdomData } = await import('../agent/soul.js');\n res.json(getWisdomData());\n } catch { res.json({ patterns: [], mistakes: [], userPreferences: [], totalTasks: 0 }); }\n });\n\n app.get('/api/soul/state/:sessionId', async (req, res) => {\n try {\n const { getSoulState } = await import('../agent/soul.js');\n const state = getSoulState(req.params.sessionId);\n if (!state) { res.status(404).json({ error: 'No active soul state for session' }); return; }\n res.json(state);\n } catch { res.status(500).json({ error: 'Soul unavailable' }); }\n });\n\n // ── Guardrails API ─────────────────────────────────────────────\n app.get('/api/guardrails/violations', async (_req, res) => {\n try {\n const { getViolations } = await import('../agent/guardrails.js');\n const limit = parseInt(_req.query.limit as string || '50', 10);\n res.json({ violations: getViolations(limit) });\n } catch { res.json({ violations: [] }); }\n });\n\n // ── Alerts API ────────────────────────────────────────────────\n app.get('/api/alerts', async (_req, res) => {\n try {\n const { getAlertHistory } = await import('../agent/alerts.js');\n const limit = parseInt(_req.query.limit as string || '50', 10);\n res.json({ alerts: getAlertHistory(limit) });\n } catch { res.json({ alerts: [] }); }\n });\n\n app.get('/api/sessions', (_req, res) => {\n const sessions = listSessions();\n res.json(sessions);\n });\n\n // Create a new session explicitly (for \"New chat\" button)\n app.post('/api/sessions', async (req, res) => {\n try {\n const { createNewSession } = await import('../agent/session.js');\n const channel = req.body?.channel || 'webchat';\n const userId = req.body?.userId || 'api-user';\n const session = createNewSession(channel, userId);\n res.json({ id: session.id, channel: session.channel, userId: session.userId });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // Conversation search — full-text search across all sessions\n app.get('/api/sessions/search', (req, res) => {\n const query = (req.query.q as string || '').toLowerCase().trim();\n if (!query || query.length < 2) { res.status(400).json({ error: 'Query must be at least 2 characters' }); return; }\n try {\n const sessions = listSessions();\n const results: Array<{ sessionId: string; sessionName: string; role: string; content: string; timestamp: string }> = [];\n const limit = parseInt(req.query.limit as string) || 50;\n\n for (const session of sessions) {\n const history = getHistory(session.id, 1000);\n for (const msg of history) {\n if (msg.content.toLowerCase().includes(query)) {\n results.push({\n sessionId: session.id,\n sessionName: session.name || session.id.slice(0, 8),\n role: msg.role,\n content: msg.content.slice(0, 200),\n timestamp: (msg as { createdAt?: string }).createdAt || '',\n });\n if (results.length >= limit) break;\n }\n }\n if (results.length >= limit) break;\n }\n res.json({ query, results, total: results.length });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Conversation export — download session as JSON or markdown\n app.get('/api/sessions/:id/export', (req, res) => {\n const sessionId = req.params.id;\n const format = (req.query.format as string) || 'json';\n try {\n const history = getHistory(sessionId, 10000);\n if (!history || history.length === 0) { res.status(404).json({ error: 'Session not found or empty' }); return; }\n\n if (format === 'markdown' || format === 'md') {\n const sessions = listSessions();\n const session = sessions.find(s => s.id === sessionId);\n const title = session?.name || sessionId.slice(0, 8);\n let md = `# ${title}\\n\\nExported: ${new Date().toISOString()}\\n\\n---\\n\\n`;\n for (const msg of history) {\n const role = msg.role === 'user' ? '**You**' : '**TITAN**';\n md += `${role} (${(msg as { createdAt?: string }).createdAt || ''}):\\n\\n${msg.content}\\n\\n---\\n\\n`;\n }\n res.setHeader('Content-Type', 'text/markdown');\n res.setHeader('Content-Disposition', `attachment; filename=\"titan-${sessionId.slice(0, 8)}.md\"`);\n res.send(md);\n } else {\n res.setHeader('Content-Type', 'application/json');\n res.setHeader('Content-Disposition', `attachment; filename=\"titan-${sessionId.slice(0, 8)}.json\"`);\n res.json({ sessionId, exportedAt: new Date().toISOString(), messages: history });\n }\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/sessions/:id', (req, res) => {\n const sessionId = req.params.id;\n try {\n // getHistory looks up messages for a given session ID\n const history = getHistory(sessionId);\n res.json(history);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/sessions/:id/messages', (req, res) => {\n const sessionId = req.params.id;\n try {\n const history = getHistory(sessionId);\n // history may be an array of messages or an object with a messages field\n const messages = Array.isArray(history) ? history : (history as any).messages || [];\n if (messages.length === 0) {\n // Check if the session actually exists\n const allSessions = listSessions();\n const sessionExists = allSessions.some((s) => s.id === sessionId);\n if (!sessionExists) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n }\n res.json(messages);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/sessions/:id/close', (req, res) => {\n try {\n closeSession(req.params.id);\n res.json({ ok: true });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.delete('/api/sessions/:id', (req, res) => {\n try {\n closeSession(req.params.id);\n res.json({ ok: true });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.patch('/api/sessions/:id', (req, res) => {\n try {\n const { name } = req.body as { name?: string };\n if (!name || typeof name !== 'string') {\n res.status(400).json({ error: 'name is required' });\n return;\n }\n const ok = renameSession(req.params.id, name);\n if (!ok) { res.status(404).json({ error: 'Session not found' }); return; }\n res.json({ ok: true });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Steer — mid-run nudge injection\n app.post('/api/sessions/:id/steer', async (req, res) => {\n try {\n const { message } = req.body as { message?: string };\n if (!message || typeof message !== 'string') {\n res.status(400).json({ error: 'message is required' });\n return;\n }\n const { pushSteer } = await import('../agent/agentLoop.js');\n pushSteer(req.params.id, message);\n res.json({ ok: true, sessionId: req.params.id });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Checkpoints — list and restore\n app.get('/api/sessions/:id/checkpoints', async (req, res) => {\n try {\n const { listCheckpoints } = await import('../checkpoint/manager.js');\n const checkpoints = listCheckpoints(req.params.id);\n res.json({ checkpoints });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/sessions/:id/checkpoints/:checkpointId/restore', async (req, res) => {\n try {\n const { restoreCheckpoint } = await import('../checkpoint/manager.js');\n const result = restoreCheckpoint(req.params.id, req.params.checkpointId);\n res.json({ ok: result.success, restored: result.restored, errors: result.errors });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Guest session creation (Space Agent parity)\n app.post('/api/guest', async (_req, res) => {\n try {\n const { createGuestSession } = await import('../agent/session.js');\n const session = createGuestSession();\n res.json({ id: session.id, userId: session.userId, createdAt: session.createdAt });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Checkpoint history / time travel UI (Space Agent parity)\n app.get('/api/sessions/:id/history', async (req, res) => {\n try {\n const { listCheckpoints } = await import('../checkpoint/manager.js');\n const checkpoints = listCheckpoints(req.params.id);\n // Also include session messages for context\n const { getHistory } = await import('../memory/memory.js');\n const messages = getHistory(req.params.id, 100);\n res.json({ checkpoints, messages, sessionId: req.params.id });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Prompt includes discovery\n app.get('/api/prompt-includes', async (_req, res) => {\n try {\n const { discoverPromptIncludes } = await import('../promptincludes/discover.js');\n const includes = discoverPromptIncludes();\n res.json({ includes });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Debug info endpoint\n app.get('/api/debug', (_req, res) => {\n try {\n const cfg = loadConfig();\n const providers = Object.entries(cfg.providers || {})\n .map(([name, p]) => ({ name, configured: !!(p as { apiKey?: string }).apiKey }));\n res.json({\n version: '5.0.0',\n node: process.version,\n platform: process.platform,\n uptime: process.uptime(),\n memory: process.memoryUsage(),\n providers: providers.length,\n providerNames: providers.map(p => p.name),\n autonomy: cfg.autonomy?.mode || 'supervised',\n checkpointEnabled: cfg.checkpoints?.enabled !== false,\n // Optional v5.0+ feature flags — defensive read because the schema\n // doesn't strictly type these yet (debug bundle only).\n steerEnabled: (cfg.agent as Record<string, unknown>)?.steerEnabled ?? false,\n fastMode: (cfg.agent as Record<string, unknown>)?.fastMode ?? false,\n concurrentTools: (cfg.agent as Record<string, unknown>)?.concurrentTools ?? true,\n });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Debug share — create a shareable debug bundle\n app.post('/api/debug/share', (_req, res) => {\n try {\n const cfg = loadConfig();\n const providers = Object.entries(cfg.providers || {})\n .map(([name, p]) => ({ name, configured: !!(p as { apiKey?: string }).apiKey }));\n const bundle = {\n version: '5.0.0',\n node: process.version,\n platform: process.platform,\n uptime: process.uptime(),\n memory: process.memoryUsage(),\n providers: providers.map(p => p.name),\n autonomy: cfg.autonomy?.mode || 'supervised',\n checkpointEnabled: cfg.checkpoints?.enabled !== false,\n // Optional v5.0+ feature flags — read defensively because the schema\n // doesn't strictly type them yet (debug bundle only — never used to\n // gate behavior).\n steerEnabled: (cfg.agent as Record<string, unknown>)?.steerEnabled ?? false,\n fastMode: (cfg.agent as Record<string, unknown>)?.fastMode ?? false,\n concurrentTools: (cfg.agent as Record<string, unknown>)?.concurrentTools ?? true,\n timestamp: new Date().toISOString(),\n };\n res.json({ ok: true, bundle, shareUrl: null });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Direct webhook delivery — bypass event queue\n app.post('/api/webhooks/direct', async (req, res) => {\n try {\n const { webhookId, payload } = req.body as { webhookId?: string; payload?: Record<string, unknown> };\n if (!webhookId) { res.status(400).json({ error: 'webhookId is required' }); return; }\n const { getActiveWebhooks } = await import('../skills/builtin/webhook.js');\n const webhook = getActiveWebhooks().get(webhookId);\n if (!webhook) { res.status(404).json({ error: 'Webhook not found' }); return; }\n // Execute handler directly (spawn async, return accepted)\n import('child_process').then(({ exec }) => {\n const cmd = webhook.handler.replace(/\\$\\{([^}]+)\\}/g, (_m, key) => String(payload?.[key] ?? ''));\n exec(cmd, { timeout: 30000 }, (err, stdout, stderr) => {\n if (err) logger.warn('Webhook', `Direct delivery error: ${err.message}`);\n else logger.info('Webhook', `Direct delivery ok: ${webhookId}`);\n });\n }).catch(() => { /* ignore */ });\n res.json({ ok: true, webhookId, delivered: true });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: CORS Proxy (Space Agent parity)\n app.post('/api/proxy', async (req, res) => {\n try {\n const { url, method = 'GET', headers = {}, body } = req.body as { url?: string; method?: string; headers?: Record<string, string>; body?: unknown };\n if (!url || typeof url !== 'string') { res.status(400).json({ error: 'url is required' }); return; }\n const proxyRes = await fetch(url, {\n method,\n headers: { 'User-Agent': 'TITAN-Proxy/1.0', ...headers },\n body: body ? JSON.stringify(body) : undefined,\n });\n const proxyBody = await proxyRes.text();\n res.status(proxyRes.status).set('Content-Type', proxyRes.headers.get('Content-Type') || 'text/plain').send(proxyBody);\n } catch (e) {\n logger.error(COMPONENT, `Proxy error: ${(e as Error).message}`);\n res.status(502).json({ error: 'Proxy failed', message: (e as Error).message });\n }\n });\n\n // v5.0: Cloud Share — create a shareable session link\n app.post('/api/sessions/:id/share', async (req, res) => {\n try {\n const { format = 'json' } = req.body as { format?: string };\n const { getHistory } = await import('../memory/memory.js');\n const history = getHistory(req.params.id, 10000);\n if (!history || history.length === 0) { res.status(404).json({ error: 'Session not found or empty' }); return; }\n const shareId = `${req.params.id}-${Date.now().toString(36)}`;\n const sharePath = `${homedir()}/.titan/shares/${shareId}.json`;\n fs.mkdirSync(dirname(sharePath), { recursive: true });\n fs.writeFileSync(sharePath, JSON.stringify({ sessionId: req.params.id, format, history, createdAt: new Date().toISOString() }, null, 2), 'utf-8');\n res.json({ ok: true, shareId, url: `/api/shares/${shareId}` });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/shares/:shareId', async (req, res) => {\n try {\n const sharePath = `${homedir()}/.titan/shares/${req.params.shareId}.json`;\n if (!fs.existsSync(sharePath)) { res.status(404).json({ error: 'Share not found' }); return; }\n const data = JSON.parse(fs.readFileSync(sharePath, 'utf-8'));\n res.json(data);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/skills', (_req, res) => {\n const skills = getSkills();\n res.json(skills);\n });\n\n app.post('/api/skills/:name/toggle', (req, res) => {\n try {\n const { name } = req.params;\n const enabled = toggleSkill(name);\n const tools = getSkillTools(name);\n res.json({ ok: true, skill: name, enabled, tools });\n } catch (e) {\n res.status(404).json({ error: (e as Error).message });\n }\n });\n\n // ─── Specialists API (v4.13) ─────────────────────────────────────\n // List the specialist pool + any model overrides. The specialists\n // themselves are defined in code (src/agent/specialists.ts); this\n // endpoint merges their defaults with per-id overrides from\n // config.specialists.overrides so a UI can show \"active model\".\n app.get('/api/specialists', async (_req, res) => {\n try {\n const { SPECIALISTS } = await import('../agent/specialists.js');\n const cfg = loadConfig();\n const overrides = (cfg as unknown as { specialists?: { overrides?: Record<string, { model?: string }> } }).specialists?.overrides || {};\n const out = SPECIALISTS.map((s) => ({\n id: s.id,\n name: s.name,\n role: s.role,\n title: s.title,\n defaultModel: s.model,\n activeModel: overrides[s.id]?.model || s.model,\n overridden: Boolean(overrides[s.id]?.model && overrides[s.id].model !== s.model),\n templateMatches: s.templateMatches,\n reportsTo: s.reportsTo,\n }));\n res.json(out);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // Update a specialist's active model. Body: { model: string | null }\n // model=null clears the override (reverts to specialist default).\n app.patch('/api/specialists/:id', async (req, res) => {\n try {\n const { id } = req.params;\n const { model } = (req.body || {}) as { model?: string | null };\n const { SPECIALISTS } = await import('../agent/specialists.js');\n const specialist = SPECIALISTS.find((s) => s.id === id);\n if (!specialist) { res.status(404).json({ error: `Unknown specialist: ${id}` }); return; }\n const cfg = loadConfig();\n const cfgAny = cfg as unknown as { specialists?: { overrides?: Record<string, { model?: string }> } };\n const overrides = { ...(cfgAny.specialists?.overrides || {}) };\n if (model === null || model === '' || model === undefined) {\n delete overrides[id];\n } else if (typeof model === 'string') {\n overrides[id] = { model };\n } else {\n res.status(400).json({ error: 'model must be a string or null' });\n return;\n }\n updateConfig({ specialists: { overrides } } as unknown as Parameters<typeof updateConfig>[0]);\n res.json({ ok: true, id, activeModel: overrides[id]?.model || specialist.model });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ─── Marketplace API ──────────────────────────────────────────\n app.get('/api/marketplace', async (_req, res) => {\n try {\n const skills = await listMarketplaceSkills();\n const installed = listInstalledMarketplace();\n res.json({ skills: skills.map(s => ({ ...s, installed: installed.includes(s.file.replace('.js', '')) })), installed });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/marketplace/search', async (req, res) => {\n try {\n const q = (req.query.q as string) || '';\n const results = await marketplaceSearch(q, 50);\n const installed = listInstalledMarketplace();\n res.json({ ...results, skills: results.skills.map(s => ({ ...s, installed: installed.includes(s.file.replace('.js', '')) })) });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/marketplace/install', async (req, res): Promise<void> => {\n try {\n const { skill } = req.body as { skill: string };\n if (!skill) { res.status(400).json({ error: 'Missing \"skill\" field' }); return; }\n const result = await installSkill(skill);\n res.json(result);\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/marketplace/uninstall', (req, res): void => {\n try {\n const { skill } = req.body as { skill: string };\n if (!skill) { res.status(400).json({ error: 'Missing \"skill\" field' }); return; }\n const result = uninstallSkill(skill);\n res.json(result);\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // ── Personas ──────────────────────────────────────────────────\n app.get('/api/personas', (_req, res) => {\n try {\n const cfg = loadConfig();\n res.json({ personas: listPersonas(), active: cfg.agent.persona || 'default' });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/persona/switch', (req, res): void => {\n try {\n const { persona } = req.body as { persona: string };\n if (!persona || typeof persona !== 'string') { res.status(400).json({ error: 'Missing persona ID' }); return; }\n if (persona !== 'default' && !getPersona(persona)) { res.status(404).json({ error: `Persona \"${persona}\" not found` }); return; }\n const cfg = loadConfig();\n updateConfig({ agent: { ...cfg.agent, persona } });\n invalidatePersonaCache();\n res.json({ ok: true, active: persona });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // ── Widget Gallery ────────────────────────────────────────────\n app.get('/api/widget-gallery', async (_req, res) => {\n try {\n const { listTemplates, listCategories } = await import('../skills/builtin/widget_gallery.js');\n const templates = listTemplates();\n const categories = listCategories();\n res.json({ count: templates.length, categories, templates });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/tools', (req, res) => {\n const includeSchema = req.query.include === 'schema';\n const q = typeof req.query.q === 'string' ? req.query.q.toLowerCase() : '';\n const limit = Math.min(parseInt(req.query.limit as string, 10) || 100, 1000);\n const offset = Math.max(parseInt(req.query.offset as string, 10) || 0, 0);\n\n let tools = getRegisteredTools().map((t) => {\n const item: Record<string, unknown> = {\n name: t.name,\n description: t.description,\n };\n if (includeSchema) {\n item.parameters = t.parameters;\n }\n return item;\n });\n\n if (q) {\n tools = tools.filter((t) =>\n (t.name as string).toLowerCase().includes(q) ||\n (t.description as string).toLowerCase().includes(q),\n );\n }\n\n const total = tools.length;\n const paginated = tools.slice(offset, offset + limit);\n\n res.json({\n total,\n count: paginated.length,\n offset,\n tools: paginated,\n });\n });\n\n app.get('/api/channels', (_req, res) => {\n const statuses = Array.from(channels.values()).map((ch) => ch.getStatus());\n res.json(statuses);\n });\n\n app.get('/api/security', (_req, res) => {\n const audit = auditSecurity();\n res.json(audit);\n });\n\n app.get('/api/providers', async (_req, res) => {\n const health = await healthCheckAll();\n res.json(health);\n });\n\n app.get('/api/health', (_req, res) => {\n const cfg = loadConfig();\n res.json({ status: 'ok', version: TITAN_VERSION, uptime: process.uptime(), onboarded: cfg.onboarded });\n });\n\n // ── Bug Reports (operator + agent team review) ─────────────────\n // Local jsonl persisted at ~/.titan/bug-reports.jsonl. Always\n // available regardless of telemetry.enabled — the file is the\n // operator's source of truth even when remote sending is off.\n app.get('/api/bug-reports', async (req, res) => {\n try {\n const limit = Math.min(Math.max(parseInt(String(req.query.limit ?? '50'), 10) || 50, 1), 200);\n const { listRecentBugReports } = await import('../analytics/bugReports.js');\n const reports = listRecentBugReports(limit);\n res.json({ count: reports.length, reports });\n } catch (err) {\n res.status(500).json({ error: 'bug_reports_unavailable', message: (err as Error).message });\n }\n });\n\n app.get('/api/bug-reports/:id', async (req, res) => {\n try {\n const { getBugReport } = await import('../analytics/bugReports.js');\n const r = getBugReport(req.params.id);\n if (!r) {\n res.status(404).json({ error: 'not_found' });\n return;\n }\n res.json(r);\n } catch (err) {\n res.status(500).json({ error: 'bug_report_unavailable', message: (err as Error).message });\n }\n });\n\n // ── Docker Sandbox Execution ─────────────────────────────────\n app.post('/api/sandbox/execute', async (req, res) => {\n try {\n const { code, language, timeoutMs } = req.body;\n if (!code || typeof code !== 'string') {\n res.status(400).json({ error: 'code is required' });\n return;\n }\n const { executeInSandbox } = await import('../agent/sandbox.js');\n const result = await executeInSandbox(code, language || 'javascript', timeoutMs || 60000);\n res.json(result);\n } catch (err) {\n logger.error(COMPONENT, `Sandbox execute error: ${(err as Error).message}`);\n res.status(500).json({ error: 'Sandbox execution failed', message: (err as Error).message });\n }\n });\n\n app.get('/api/sandbox/status', async (_req, res) => {\n try {\n const { getSandboxStatus } = await import('../agent/sandbox.js');\n res.json(getSandboxStatus());\n } catch (err) {\n res.status(500).json({ error: 'Sandbox status unavailable', message: (err as Error).message });\n }\n });\n\n app.get('/api/health/deep', async (_req, res) => {\n const checks: Record<string, { status: 'ok' | 'degraded' | 'down'; detail?: string }> = {};\n let overall: 'ok' | 'degraded' | 'down' = 'ok';\n\n // Memory subsystem\n try {\n const { getDb } = await import('../memory/memory.js');\n const db = getDb();\n checks.memory = { status: 'ok', detail: `${db.memories.length} memories, ${db.sessions.length} sessions` };\n } catch (e) {\n checks.memory = { status: 'down', detail: (e as Error).message };\n overall = 'down';\n }\n\n // Graph\n try {\n const { getGraphStats } = await import('../memory/graph.js');\n const stats = getGraphStats();\n checks.graph = { status: 'ok', detail: `${stats.episodeCount} episodes, ${stats.entityCount} entities` };\n } catch (e) {\n checks.graph = { status: 'down', detail: (e as Error).message };\n overall = 'down';\n }\n\n // Vectors\n try {\n const { isVectorSearchAvailable } = await import('../memory/vectors.js');\n checks.vectors = { status: isVectorSearchAvailable() ? 'ok' : 'degraded', detail: isVectorSearchAvailable() ? 'ready' : 'disabled or unavailable' };\n if (!isVectorSearchAvailable() && overall === 'ok') overall = 'degraded';\n } catch (e) {\n checks.vectors = { status: 'down', detail: (e as Error).message };\n overall = 'down';\n }\n\n // Providers\n try {\n const providerHealth = await healthCheckAll();\n const entries = Object.entries(providerHealth);\n const healthyProviders = entries.filter(([, healthy]) => healthy).length;\n checks.providers = { status: healthyProviders > 0 ? 'ok' : 'down', detail: `${healthyProviders}/${entries.length} healthy` };\n if (healthyProviders === 0) overall = 'down';\n } catch (e) {\n checks.providers = { status: 'down', detail: (e as Error).message };\n overall = 'down';\n }\n\n // Channels\n try {\n const connected = Array.from(channels.values()).filter((c) => c.getStatus().connected).length;\n checks.channels = { status: connected > 0 ? 'ok' : 'degraded', detail: `${connected}/${channels.size} connected` };\n if (connected === 0 && overall === 'ok') overall = 'degraded';\n } catch (e) {\n checks.channels = { status: 'down', detail: (e as Error).message };\n overall = 'down';\n }\n\n // Event loop lag (approximate via setImmediate)\n const start = process.hrtime.bigint();\n await new Promise((resolve) => setImmediate(resolve));\n const lagNs = Number(process.hrtime.bigint() - start);\n const lagMs = lagNs / 1_000_000;\n checks.eventLoop = { status: lagMs < 100 ? 'ok' : lagMs < 500 ? 'degraded' : 'down', detail: `${lagMs.toFixed(2)}ms lag` };\n if (lagMs >= 500) overall = 'down';\n else if (lagMs >= 100 && overall === 'ok') overall = 'degraded';\n\n res.status(overall === 'ok' ? 200 : overall === 'degraded' ? 200 : 503).json({\n status: overall,\n version: TITAN_VERSION,\n uptime: process.uptime(),\n checks,\n });\n });\n\n // ── Monitors API ─────────────────────────────────────────────────\n app.get('/api/monitors', (_req, res) => {\n try {\n res.json({ monitors: listMonitors(), events: getMonitorEvents().slice(-50) });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/monitors', (req, res) => {\n try {\n const { name, prompt, triggerType, intervalMinutes } = req.body;\n if (!name || !prompt) { res.status(400).json({ error: 'name and prompt are required' }); return; }\n const monitor = addMonitor({ name, prompt, triggerType: triggerType || 'interval', intervalMinutes: intervalMinutes || 60 } as any);\n res.status(201).json(monitor);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.delete('/api/monitors/:id', (req, res) => {\n try {\n removeMonitor(req.params.id);\n res.json({ ok: true });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Test Health API ──────────────────────────────────────────────\n app.get('/api/test/health', async (_req, res) => {\n try {\n const { getTestHealthSummary } = await import('../testing/testHealthMonitor.js');\n const summary = getTestHealthSummary();\n res.json(summary);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/test/stats', async (_req, res) => {\n try {\n const { getTestHealth } = await import('../testing/testHealthMonitor.js');\n const stats = getTestHealth();\n res.json(stats);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/test/failing', async (_req, res) => {\n try {\n const { getFailingTests } = await import('../testing/testHealthMonitor.js');\n const failing = getFailingTests();\n res.json(failing);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/test/flaky', async (_req, res) => {\n try {\n const { getFlakyTests } = await import('../testing/testHealthMonitor.js');\n const threshold = _req.query.threshold ? parseFloat(_req.query.threshold as string) : 0.4;\n const flaky = getFlakyTests(threshold);\n res.json(flaky);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/test/runs', async (_req, res) => {\n try {\n const { getRecentTestRuns } = await import('../testing/testHealthMonitor.js');\n const limit = _req.query.limit ? parseInt(_req.query.limit as string, 10) : 10;\n const runs = getRecentTestRuns(limit);\n res.json(runs);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/test/run', async (_req, res) => {\n try {\n const { runTestsDetailed } = await import('../testing/testHealthMonitor.js');\n const { pattern, watch, coverage, timeout } = _req.body;\n const result = await runTestsDetailed({ pattern, watch, coverage, timeout });\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/test/repair-history', async (_req, res) => {\n try {\n const { getRepairHistory } = await import('../testing/repairValidator.js');\n const repairId = _req.query.repairId as string | undefined;\n const history = getRepairHistory(repairId);\n res.json(history);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Organism / Safety Metrics API ──────────────────────────────\n app.get('/api/organism/history', async (_req, res) => {\n res.status(501).json({ error: 'Not implemented' });\n });\n\n app.get('/api/organism/safety-trend', async (_req, res) => {\n res.status(501).json({ error: 'Not implemented' });\n });\n\n app.get('/api/organism/safety-metrics', async (_req, res) => {\n res.status(501).json({ error: 'Not implemented' });\n });\n\n // ── Organism / Alert Management API ───────────────────────────\n app.get('/api/organism/alerts', async (_req, res) => {\n try {\n const { getAlerts } = await import('../organism/alertsStore.js');\n res.json({ alerts: getAlerts() });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/organism/alerts/stats', async (_req, res) => {\n try {\n const { getAlertStats } = await import('../organism/alertsStore.js');\n res.json(getAlertStats());\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/organism/alerts/config', async (_req, res) => {\n try {\n const { getAlertConfig } = await import('../organism/alertsStore.js');\n res.json(getAlertConfig());\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/organism/alerts/config', async (_req, res) => {\n try {\n const { setAlertConfig } = await import('../organism/alertsStore.js');\n setAlertConfig(_req.body || {});\n res.json({ success: true });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/organism/alerts/:id/acknowledge', async (req, res) => {\n try {\n const { acknowledgeAlert } = await import('../organism/alertsStore.js');\n const ok = acknowledgeAlert(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Alert not found' }); return; }\n res.json({ success: true });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.delete('/api/organism/alerts/old', async (_req, res) => {\n try {\n const { deleteOldAlerts } = await import('../organism/alertsStore.js');\n const removed = deleteOldAlerts();\n res.json({ removed });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // ── Eval Harness API ───────────────────────────────────────────\n app.post('/api/eval/run', async (req, res) => {\n try {\n const { suite } = req.body as { suite?: string };\n const {\n runEvalSuite,\n WIDGET_CREATION_SUITE,\n SAFETY_SUITE,\n TOOL_ROUTING_SUITE,\n GATE_FORMAT_SUITE,\n PIPELINE_SUITE,\n ADVERSARIAL_SUITE,\n TOOL_ROUTING_V2_SUITE,\n SESSION_SUITE,\n WIDGET_V2_SUITE,\n GATE_FORMAT_V2_SUITE,\n CONTENT_SUITE,\n } = await import('../eval/harness.js');\n\n // Local agent call — replicates the system-widget shortcut inline\n // so eval tests exercise the same fast-path users get via HTTP.\n const systemWidgetShortcuts: Array<{ pattern: RegExp; source: string; name: string; w: number; h: number }> = [\n { pattern: /\\b(?:backups?|snapshots?|archives?)\\b/i, source: 'system:backup', name: 'Backup Manager', w: 6, h: 6 },\n { pattern: /\\b(?:training|train|specialists?|models?)\\b/i, source: 'system:training', name: 'Training Dashboard', w: 6, h: 6 },\n { pattern: /\\b(?:recipes?|playbooks?|workflows?|jarvis)\\b/i, source: 'system:recipes', name: 'Recipe Kitchen', w: 6, h: 6 },\n { pattern: /\\b(?:vram|gpu|memory|nvidia)\\b/i, source: 'system:vram', name: 'VRAM Monitor', w: 6, h: 6 },\n { pattern: /\\b(?:teams?|members?|roles?|permissions?|rbac)\\b/i, source: 'system:teams', name: 'Team Hub', w: 6, h: 6 },\n { pattern: /\\b(?:cron|schedules?|jobs?|timers?)\\b/i, source: 'system:cron', name: 'Cron Scheduler', w: 6, h: 6 },\n { pattern: /\\b(?:checkpoints?|restores?|save state)\\b/i, source: 'system:checkpoints', name: 'Checkpoints', w: 6, h: 5 },\n { pattern: /\\b(?:organism|drives?|safety|alerts?|guardrails?)\\b/i, source: 'system:organism', name: 'Organism Monitor', w: 6, h: 6 },\n { pattern: /\\b(?:fleet|nodes?|routes?|mesh)\\b/i, source: 'system:fleet', name: 'Fleet Router', w: 6, h: 5 },\n { pattern: /\\b(?:captcha|browsers?|form fill|web automation)\\b/i, source: 'system:browser', name: 'Browser Tools', w: 6, h: 5 },\n { pattern: /\\b(?:paperclip|sidecars?|helpers?)\\b/i, source: 'system:paperclip', name: 'Paperclip', w: 6, h: 5 },\n { pattern: /\\b(?:tests?|flaky|failing|coverage|eval)\\b/i, source: 'system:eval', name: 'Test Lab', w: 6, h: 6 },\n ];\n const agentCall = async (input: string, testName?: string) => {\n const shortcut = systemWidgetShortcuts.find(s => s.pattern.test(input));\n if (shortcut) {\n return {\n content: `Added the **${shortcut.name}** widget to your canvas.\\n\\n_____widget\\n{ \"name\": \"${shortcut.name}\", \"format\": \"system\", \"source\": \"${shortcut.source}\", \"w\": ${shortcut.w}, \"h\": ${shortcut.h} }`,\n toolsUsed: [],\n };\n }\n // Use a unique userId per test case so each test gets a fresh session\n // with its own token budget. Prevents budget bleed across tests.\n const userId = testName ? `eval-${testName.replace(/\\s+/g, '-').toLowerCase()}` : 'eval-harness';\n const result = await processMessage(input, 'eval', userId, {});\n return {\n content: result.content || '',\n toolsUsed: (result.toolsUsed as string[]) ?? [],\n };\n };\n\n let cases;\n switch (suite) {\n case 'widget-creation': cases = WIDGET_CREATION_SUITE; break;\n case 'safety': cases = SAFETY_SUITE; break;\n case 'tool-routing': cases = TOOL_ROUTING_SUITE; break;\n case 'gate-format': cases = GATE_FORMAT_SUITE; break;\n case 'pipeline': cases = PIPELINE_SUITE; break;\n case 'adversarial': cases = ADVERSARIAL_SUITE; break;\n case 'tool-routing-v2': cases = TOOL_ROUTING_V2_SUITE; break;\n case 'session': cases = SESSION_SUITE; break;\n case 'widget-v2': cases = WIDGET_V2_SUITE; break;\n case 'gate-format-v2': cases = GATE_FORMAT_V2_SUITE; break;\n case 'content': cases = CONTENT_SUITE; break;\n default:\n res.status(400).json({ error: `Unknown suite: ${suite}. Choose: widget-creation, safety, tool-routing, gate-format, pipeline, adversarial, tool-routing-v2, session, widget-v2, gate-format-v2, content.` });\n return;\n }\n\n const result = await runEvalSuite(suite, cases, agentCall);\n res.json(result);\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/eval/suites', async (_req, res) => {\n res.json({ suites: [\n 'widget-creation', 'safety', 'tool-routing', 'gate-format',\n 'pipeline', 'adversarial', 'tool-routing-v2', 'session',\n 'widget-v2', 'gate-format-v2', 'content',\n ] });\n });\n\n // ── Test Health & Repair Validation API ────────────────────────\n app.get('/api/tests/health', async (_req, res) => {\n try {\n const { getTestHealthSummary } = await import('../testing/testHealthMonitor.js');\n const summary = getTestHealthSummary();\n res.json(summary);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/tests/failing', async (_req, res) => {\n try {\n const { getFailingTests } = await import('../testing/testHealthMonitor.js');\n const failing = getFailingTests();\n res.json({ tests: failing, count: failing.length });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/tests/flaky', async (_req, res) => {\n try {\n const { getFlakyTests } = await import('../testing/testHealthMonitor.js');\n const threshold = _req.query.threshold ? parseFloat(_req.query.threshold as string) : 0.4;\n const flaky = getFlakyTests(threshold);\n res.json({ tests: flaky, count: flaky.length, threshold });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/tests/history', async (_req, res) => {\n try {\n const { getRecentTestRuns } = await import('../testing/testHealthMonitor.js');\n const limit = _req.query.limit ? parseInt(_req.query.limit as string, 10) : 10;\n const runs = getRecentTestRuns(limit);\n res.json({ runs, count: runs.length });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/tests/run', async (req, res) => {\n try {\n const { runTests } = await import('../testing/testRunner.js');\n const { pattern, timeout } = req.body;\n const result = await runTests({ pattern, timeout });\n res.json(result);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/tests/validate-repair', async (req, res) => {\n try {\n const { validateRepair } = await import('../testing/repairValidator.js');\n const { repairId, finding, affectedFiles } = req.body;\n\n if (!repairId || !finding) {\n res.status(400).json({ error: 'Missing required fields: repairId, finding' });\n return;\n }\n\n const result = await validateRepair({ repairId, finding, affectedFiles });\n res.json(result);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/tests/repair-history', async (req, res) => {\n try {\n const { getRepairHistory } = await import('../testing/repairValidator.js');\n const { repairId } = req.query;\n const history = getRepairHistory(repairId as string | undefined);\n res.json({ history, count: history.length });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/tests/validate-system-repair', async (req, res) => {\n try {\n const { validateSystemRepair } = await import('../testing/repairValidator.js');\n const { repairType, target } = req.body;\n\n if (!repairType || !target) {\n res.status(400).json({ error: 'Missing required fields: repairType, target' });\n return;\n }\n\n const result = await validateSystemRepair({ repairType, target });\n res.json({ success: result.valid ?? false, repairType, target, ...result });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // Lightweight first-run readiness check used by Mission Control's banner.\n // Returns whether the user has at least one usable provider configured,\n // plus a counts/suggestion that the UI can render directly.\n app.get('/api/doctor/quick', async (_req, res) => {\n try {\n const { hasUsableProvider } = await import('../config/config.js');\n const usable = await hasUsableProvider();\n const cfg = loadConfig();\n const providers = (cfg.providers as Record<string, unknown> | undefined) || {};\n let configured = 0;\n for (const p of Object.values(providers)) {\n const key = (p as { apiKey?: string } | undefined)?.apiKey;\n if (key && key.trim().length > 0) configured++;\n }\n res.json({\n ready: usable.ok,\n details: usable.details,\n providersConfigured: configured,\n suggestion: usable.ok\n ? null\n : 'Run `titan onboard` (terminal) or open Settings → Providers to configure an AI provider.',\n action: usable.ok ? null : { type: 'open', target: '/settings', label: 'Open settings' },\n });\n } catch (e) {\n res.status(500).json({ ready: false, error: (e as Error).message });\n }\n });\n\n // ── Test Health API ───────────────────────────────────────────\n app.get('/api/test-health/summary', async (_req, res) => {\n try {\n const { getTestHealthSummary, getFlakyTests } = await import('../testing/testHealthMonitor.js');\n const raw = getTestHealthSummary();\n const flaky = getFlakyTests().length;\n res.json({\n total: raw.total as number,\n passing: raw.passing as number,\n failing: raw.failing as number,\n flaky,\n coverage: raw.coveragePct as number,\n });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/test-health/failing', async (_req, res) => {\n try {\n const { getFailingTests } = await import('../testing/testHealthMonitor.js');\n const limit = _req.query.limit ? parseInt(_req.query.limit as string, 10) : 10;\n const names = getFailingTests().slice(0, limit);\n const tests = names.map(name => ({ name, suite: '', error: '', lastFailed: '', attempts: 0 }));\n res.json({ count: tests.length, tests });\n } catch (e) {\n res.status(500).json({ error: (e as Error).message, tests: [] });\n }\n });\n\n app.get('/api/test-health/flaky', async (_req, res) => {\n try {\n const { getFlakyTests } = await import('../testing/testHealthMonitor.js');\n const threshold = _req.query.threshold ? parseFloat(_req.query.threshold as string) : 0.4;\n const limit = _req.query.limit ? parseInt(_req.query.limit as string, 10) : 10;\n const names = getFlakyTests(threshold).slice(0, limit);\n const tests = names.map(name => ({ name, suite: '', passRate: 0, runs: 0 }));\n res.json({ count: tests.length, threshold, tests });\n } catch (e) {\n res.status(500).json({ error: (e as Error).message, tests: [] });\n }\n });\n\n app.get('/api/test-health/history', async (_req, res) => {\n try {\n const { getRecentTestRuns } = await import('../testing/testHealthMonitor.js');\n const limit = _req.query.limit ? parseInt(_req.query.limit as string, 10) : 5;\n const runs = getRecentTestRuns(limit);\n res.json({ count: runs.length, runs });\n } catch (e) {\n res.status(500).json({ error: (e as Error).message, runs: [] });\n }\n });\n\n app.post('/api/test-health/run', async (req, res) => {\n try {\n const { runTests } = await import('../testing/testRunner.js');\n const { pattern, coverage, timeout } = req.body;\n const result = await runTests({ pattern, coverage, timeout });\n res.json(result);\n } catch (e) {\n res.status(500).json({ error: (e as Error).message, success: false });\n }\n });\n\n // ── Homelab machine health (v4.8.4) ───────────────────────────\n // Server-side health check for homelab machines. Done server-side\n // instead of browser-side because:\n // (1) CORS and self-signed HTTPS certs block browser fetches to\n // other homelab IPs;\n // (2) Using `http://<ip>/` (port 80) was the prior workaround and\n // returned false \"offline\" for TITAN installs that only open\n // the gateway port (48420).\n // Configured via `config.homelab.machines`; falls back to a sensible\n // default set if not configured.\n app.get('/api/homelab/machines', async (_req, res) => {\n try {\n const cfg = loadConfig() as unknown as {\n homelab?: { machines?: Array<{ name: string; ip: string; role?: string; port?: number; protocol?: 'http' | 'https'; path?: string }> };\n };\n const machines = cfg.homelab?.machines ?? [\n { name: 'Titan PC', ip: '192.168.1.11', role: 'Primary GPU (RTX 5090)', port: 48420, protocol: 'https' as const, path: '/api/health' },\n { name: 'Mini PC', ip: '192.168.1.95', role: 'Docker Host', port: 48420, protocol: 'https' as const, path: '/api/health' },\n { name: 'T610 Server', ip: '192.168.1.67', role: 'Always-on Backbone', port: 48420, protocol: 'https' as const, path: '/api/health' },\n ];\n // Use Node's built-in https/http to bypass self-signed cert\n // verification (homelab machines use self-signed certs).\n const https = await import('https');\n const http = await import('http');\n const probe = (protocol: 'http' | 'https', ip: string, port: number, path: string): Promise<{ ok: boolean; body: string; latencyMs: number }> => {\n return new Promise((resolve, reject) => {\n const started = Date.now();\n const lib = protocol === 'https' ? https : http;\n const req = lib.request({\n host: ip,\n port,\n path,\n method: 'GET',\n timeout: 3000,\n // Self-signed certs are the norm on TITAN installs — don't\n // refuse to talk to them. We're not transmitting secrets\n // here, just asking for a health ping.\n ...(protocol === 'https' ? { rejectUnauthorized: false } : {}),\n }, (r) => {\n let body = '';\n r.on('data', (c) => body += c);\n r.on('end', () => resolve({ ok: (r.statusCode ?? 0) >= 200 && (r.statusCode ?? 0) < 400, body, latencyMs: Date.now() - started }));\n });\n req.on('timeout', () => { req.destroy(new Error('timeout')); });\n req.on('error', reject);\n req.end();\n });\n };\n const results = await Promise.all(machines.map(async (m) => {\n const protocol = m.protocol ?? 'https';\n const port = m.port ?? 48420;\n const path = m.path ?? '/api/health';\n const started = Date.now();\n try {\n const r = await probe(protocol, m.ip, port, path);\n let version: string | undefined;\n try {\n const parsed = JSON.parse(r.body) as { version?: string };\n version = parsed?.version;\n } catch { /* not JSON — still online */ }\n return { name: m.name, ip: m.ip, role: m.role ?? '', online: r.ok, latencyMs: r.latencyMs, version };\n } catch (err) {\n return { name: m.name, ip: m.ip, role: m.role ?? '', online: false, latencyMs: Date.now() - started, error: (err as Error).message };\n }\n }));\n res.json({ machines: results });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── VRAM API ────────────────────────────────────────────────\n app.get('/api/vram', async (_req, res) => {\n try {\n const { getVRAMOrchestrator } = await import('../vram/orchestrator.js');\n const orch = getVRAMOrchestrator();\n const snapshot = await orch.getSnapshot();\n if (!snapshot) {\n res.json({ error: 'GPU state unavailable' });\n return;\n }\n res.json(snapshot);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/vram/acquire', async (req, res) => {\n try {\n const { service, requiredMB, leaseDurationMs } = req.body as {\n service?: string; requiredMB?: number; leaseDurationMs?: number;\n };\n if (!service || !requiredMB) {\n res.status(400).json({ error: 'service and requiredMB required' });\n return;\n }\n if (typeof requiredMB !== 'number' || !Number.isFinite(requiredMB) || requiredMB <= 0) {\n res.status(400).json({ error: 'requiredMB must be a positive number' });\n return;\n }\n const { getVRAMOrchestrator } = await import('../vram/orchestrator.js');\n const orch = getVRAMOrchestrator();\n const result = await orch.acquire(service, requiredMB, leaseDurationMs || 300_000);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/vram/release', async (req, res) => {\n try {\n const { leaseId, restoreModel } = req.body as { leaseId?: string; restoreModel?: boolean };\n if (!leaseId) {\n res.status(400).json({ error: 'leaseId required' });\n return;\n }\n const { getVRAMOrchestrator } = await import('../vram/orchestrator.js');\n const orch = getVRAMOrchestrator();\n const result = await orch.release(leaseId, restoreModel ?? true);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/vram/check', async (req, res) => {\n try {\n const mb = parseInt(req.query.mb as string, 10);\n if (!mb || mb <= 0) {\n res.status(400).json({ error: 'mb query param required (positive integer)' });\n return;\n }\n const { getVRAMOrchestrator } = await import('../vram/orchestrator.js');\n const orch = getVRAMOrchestrator();\n const result = await orch.canAcquire(mb);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Hardware Detection API ──────────────────────────────────\n app.get('/api/hardware/detect', async (_req, res) => {\n try {\n const { detectHardware, generateRecommendations } = await import('../hardware/autoConfig.js');\n const profile = await detectHardware();\n const recommendations = generateRecommendations(profile);\n res.json({ profile, recommendations });\n } catch (err) {\n logger.error(COMPONENT, `Hardware detection failed: ${(err as Error).message}`);\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/hardware/apply', async (_req, res) => {\n try {\n const { applyAutoConfiguration } = await import('../hardware/autoConfig.js');\n const result = await applyAutoConfiguration(false);\n res.json({\n success: true,\n profile: result.profile,\n recommendations: result.recommendations,\n applied: result.applied,\n });\n } catch (err) {\n logger.error(COMPONENT, `Hardware auto-config failed: ${(err as Error).message}`);\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Cloud mode config endpoint ──────────────────────────────\n app.get('/api/cloud/config', (_req, res) => {\n const isCloud = process.env.TITAN_CLOUD_MODE === 'true';\n if (!isCloud) {\n return res.json({ cloud: false });\n }\n return res.json({\n cloud: true,\n apiUrl: process.env.TITAN_CLOUD_API || '',\n userId: process.env.TITAN_USER_ID || '',\n userEmail: process.env.TITAN_USER_EMAIL || '',\n });\n });\n\n // ── Onboarding API ──────────────────────────────────────────\n app.get('/api/onboarding/status', (_req, res) => {\n const cfg = loadConfig();\n // Cloud auto-onboarding path was removed when OpenRouter was taken out\n // of the runtime (v4.13). Running in cloud mode now just reports status\n // — onboarding has to happen through the normal wizard.\n return res.json({ onboarded: cfg.onboarded, version: TITAN_VERSION, cloud: process.env.TITAN_CLOUD_MODE === 'true' });\n });\n\n app.post('/api/onboarding/complete', (req, res) => {\n try {\n const { provider, apiKey, model, agentName, personality } = req.body;\n\n // Build config updates\n const updates: Record<string, unknown> = { onboarded: true };\n\n // Set provider API key\n if (provider && apiKey) {\n const providerKey = provider.toLowerCase();\n const cfg = loadConfig();\n const providers = { ...cfg.providers } as Record<string, Record<string, unknown>>;\n if (!providers[providerKey]) providers[providerKey] = {};\n providers[providerKey].apiKey = apiKey;\n updates.providers = providers;\n }\n\n // Set model\n if (model) {\n updates.agent = { model };\n }\n\n // Set agent name / personality via soul\n if (agentName || personality) {\n const soulParts: string[] = [];\n if (agentName) soulParts.push(`Your name is ${agentName}.`);\n if (personality) soulParts.push(personality);\n updates.soul = soulParts.join(' ');\n }\n\n updateConfig(updates);\n broadcast({ type: 'config_updated' });\n res.json({ ok: true, message: 'Onboarding complete! Welcome to TITAN.' });\n } catch (e) {\n res.status(400).json({ error: (e as Error).message });\n }\n });\n\n // Prometheus metrics endpoint (behind /api/ auth prefix)\n app.get('/api/metrics', (_req, res) => {\n res.setHeader('Content-Type', 'text/plain; version=0.0.4');\n res.send(serializePrometheus());\n });\n\n // JSON metrics summary for dashboard\n app.get('/api/metrics/summary', (_req, res) => {\n res.json(getMetricsSummary());\n });\n\n // ── Telemetry API ──────────────────────────────────────────────\n app.post('/api/telemetry', (req, res) => {\n const cfg = loadConfig();\n if (!cfg.telemetry?.enabled) {\n res.status(204).end();\n return;\n }\n const { event, properties, timestamp } = req.body || {};\n if (!event || typeof event !== 'string') {\n res.status(400).json({ error: 'event is required' });\n return;\n }\n const entry = {\n event,\n properties: properties || {},\n timestamp: timestamp || new Date().toISOString(),\n sessionId: getUserIdFromReq(req),\n };\n // Fire-and-forget append to storage\n import('../storage/index.js')\n .then(({ getStorage }) => getStorage())\n .then((storage) => storage.appendTelemetryEvent?.(entry))\n .catch(() => {});\n res.status(204).end();\n });\n\n app.get('/api/telemetry/events', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.telemetry?.enabled) {\n res.json({ enabled: false, events: [] });\n return;\n }\n const limit = Math.min(parseInt((_req.query.limit as string) || '100', 10), 1000);\n try {\n const { getStorage } = await import('../storage/index.js');\n const storage = await getStorage();\n const events = await storage.queryTelemetryEvents?.({ limit }) ?? [];\n res.json({ enabled: true, events });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Analytics Profile ─────────────────────────────────────────\n app.get('/api/analytics/profile', async (_req, res) => {\n try {\n const profile = await collectSystemProfile();\n res.json(profile);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // v5.0 \"Spacewalk\": opt-in consent endpoint. The SetupWizard calls this\n // when the user picks \"Help improve TITAN by sharing anonymous stats\".\n // Body: { enabled: boolean, crashReports?: boolean }. On enable, we\n // stamp consentedAt + consentedVersion so we can tell the user WHEN\n // they opted in and which version the consent was tied to. On disable,\n // consentedAt is cleared.\n app.post('/api/telemetry/consent', async (req, res) => {\n try {\n const body = (req.body || {}) as { enabled?: boolean; crashReports?: boolean };\n const enabled = body.enabled === true;\n const crashReports = body.crashReports !== false; // default true when opted in\n const patch = {\n telemetry: {\n enabled,\n crashReports,\n consentedAt: enabled ? new Date().toISOString() : undefined,\n consentedVersion: enabled ? TITAN_VERSION : undefined,\n },\n } as unknown as Parameters<typeof updateConfig>[0];\n updateConfig(patch);\n\n // Fire a one-shot system_profile immediately on opt-in so Tony's\n // dashboard has fresh data within seconds of a new user agreeing.\n if (enabled) {\n (async () => {\n try {\n const { recordStartupAnalytics } = await import('../analytics/collector.js');\n await recordStartupAnalytics();\n } catch { /* best-effort */ }\n })();\n }\n\n res.json({ ok: true, enabled, crashReports });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Read-only status for the SetupWizard / Settings widget.\n app.get('/api/telemetry/consent', (_req, res) => {\n const cfg = loadConfig();\n const t = cfg.telemetry as unknown as {\n enabled?: boolean;\n crashReports?: boolean;\n consentedAt?: string;\n consentedVersion?: string;\n remoteUrl?: string;\n } | undefined;\n res.json({\n enabled: Boolean(t?.enabled),\n crashReports: t?.crashReports !== false,\n consentedAt: t?.consentedAt,\n consentedVersion: t?.consentedVersion,\n remoteUrl: t?.remoteUrl,\n });\n });\n\n /**\n * Telemetry send status — shows whether anonymous stats are actually\n * reaching the configured collector. Added in v5.0 after Tony asked\n * \"Fix TITAN to where anonymous stats get reported somewhere\" — the\n * answer is two things together:\n * 1. A persistent collector on Titan PC (see docs/ANALYTICS-DEPLOYMENT.md)\n * 2. This endpoint, so the Privacy widget can show a green \"last\n * sent 14s ago\" chip instead of leaving the user guessing.\n *\n * Returns: consent state + live remote status (sent/failed counts,\n * last attempt timestamps, last error). Never returns event bodies or\n * install IDs — all aggregate.\n */\n app.get('/api/telemetry/status', async (_req, res) => {\n try {\n const cfg = loadConfig();\n const t = cfg.telemetry as unknown as {\n enabled?: boolean;\n crashReports?: boolean;\n consentedAt?: string;\n consentedVersion?: string;\n remoteUrl?: string;\n } | undefined;\n const { getRemoteAnalyticsStatus } = await import('../analytics/collector.js');\n res.json({\n consent: {\n enabled: Boolean(t?.enabled),\n crashReports: t?.crashReports !== false,\n consentedAt: t?.consentedAt,\n consentedVersion: t?.consentedVersion,\n remoteUrl: t?.remoteUrl,\n },\n remote: getRemoteAnalyticsStatus(),\n });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // MCP server status\n app.get('/api/mcp/server', (_req, res) => {\n res.json(getMcpServerStatus());\n });\n\n // MCP client management\n app.get('/api/mcp/clients', (_req, res) => {\n const servers = listMcpServers();\n const status = getMcpStatus();\n const merged = servers.map(s => {\n const live = status.find(st => st.server.id === s.id);\n return { ...s, status: live?.status || 'disconnected', toolCount: live?.toolCount || 0 };\n });\n res.json({ servers: merged });\n });\n\n app.post('/api/mcp/clients', async (req, res) => {\n try {\n const { presetId, ...serverConfig } = req.body;\n let server;\n if (presetId) {\n const preset = BUILTIN_PRESETS.find(p => p.id === presetId);\n if (!preset) { res.status(400).json({ error: `Unknown preset: ${presetId}` }); return; }\n server = addMcpServer(preset as Parameters<typeof addMcpServer>[0]);\n } else {\n server = addMcpServer(serverConfig);\n }\n if (server.enabled) {\n await connectMcpServer(server).catch(() => { /* connect errors are non-fatal */ });\n }\n res.json({ ok: true, server });\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n }\n });\n\n app.delete('/api/mcp/clients/:id', (req, res) => {\n try {\n removeMcpServer(req.params.id);\n res.json({ ok: true });\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/mcp/clients/:id/toggle', (req, res) => {\n try {\n const { enabled } = req.body;\n setMcpServerEnabled(req.params.id, !!enabled);\n if (enabled) {\n const servers = listMcpServers();\n const server = servers.find(s => s.id === req.params.id);\n if (server) connectMcpServer(server).catch(() => {});\n }\n res.json({ ok: true, enabled: !!enabled });\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/mcp/clients/:id/test', async (req, res) => {\n try {\n const servers = listMcpServers();\n const server = servers.find(s => s.id === req.params.id);\n if (!server) { res.status(404).json({ error: 'Server not found' }); return; }\n const result = await testMcpServer(server);\n res.json(result);\n } catch (err) {\n res.json({ ok: false, tools: 0, error: (err as Error).message });\n }\n });\n\n app.get('/api/mcp/presets', (_req, res) => {\n res.json({ presets: BUILTIN_PRESETS });\n });\n\n // Multi-agent endpoints\n app.get('/api/agents', (_req, res) => {\n res.json({ agents: listAgents(), capacity: getAgentCapacity() });\n });\n\n app.post('/api/agents/spawn', (req, res) => {\n const { name, model, systemPrompt } = req.body;\n if (!name) { res.status(400).json({ error: 'name is required' }); return; }\n const result = spawnAgent({ name, model, systemPrompt });\n res.json(result);\n });\n\n app.post('/api/agents/stop', (req, res) => {\n const { agentId } = req.body;\n if (!agentId) { res.status(400).json({ error: 'agentId is required' }); return; }\n const result = stopAgent(agentId);\n res.json(result);\n });\n\n // Agent message endpoint (uses multi-agent routing)\n // Supports SSE streaming when Accept: text/event-stream header is present\n app.post('/api/message', rateLimit(defaultRateLimitWindowMs, defaultRateLimitMax), concurrencyGuard(MAX_CONCURRENT_MESSAGES), async (req, res) => {\n const { content, channel: rawChannel, userId = 'api-user', agentId, sessionId: requestedSessionId, model: requestedModel, systemPromptAppendix } = req.body;\n // Default channel to 'webchat' for browser-based Mission Control clients.\n // This enables the interactive plan approval flow (show plan → user approves/denies).\n // Programmatic API callers can explicitly pass channel: 'api' to auto-approve plans.\n const channel = rawChannel || (req.headers.accept === 'text/event-stream' ? 'webchat' : 'api');\n if (!content || typeof content !== 'string') {\n res.status(400).json({ error: 'content must be a non-empty string' });\n return;\n }\n\n const safeUserId = channel === 'api' ? 'api-user' : (userId || 'api-user');\n\n // ═─ System Widget Shortcut ─═════════════════════════════════════\n // Fast-path: if the user is asking for a known system widget, bypass\n // the LLM entirely and emit the _____widget gate directly. This is\n // reliable, instant, and avoids model tool-call unpredictability.\n const systemWidgetShortcuts: Array<{ pattern: RegExp; source: string; name: string; w: number; h: number }> = [\n { pattern: /\\b(?:backups?|snapshots?|archives?)\\b/i, source: 'system:backup', name: 'Backup Manager', w: 6, h: 6 },\n { pattern: /\\b(?:training|train|specialists?|models?)\\b/i, source: 'system:training', name: 'Training Dashboard', w: 6, h: 6 },\n { pattern: /\\b(?:recipes?|playbooks?|workflows?|jarvis)\\b/i, source: 'system:recipes', name: 'Recipe Kitchen', w: 6, h: 6 },\n { pattern: /\\b(?:vram|gpu|memory|nvidia)\\b/i, source: 'system:vram', name: 'VRAM Monitor', w: 6, h: 6 },\n { pattern: /\\b(?:teams?|members?|roles?|permissions?|rbac)\\b/i, source: 'system:teams', name: 'Team Hub', w: 6, h: 6 },\n { pattern: /\\b(?:cron|schedules?|jobs?|timers?)\\b/i, source: 'system:cron', name: 'Cron Scheduler', w: 6, h: 6 },\n { pattern: /\\b(?:checkpoints?|restores?|save state)\\b/i, source: 'system:checkpoints', name: 'Checkpoints', w: 6, h: 5 },\n { pattern: /\\b(?:organism|drives?|safety|alerts?|guardrails?)\\b/i, source: 'system:organism', name: 'Organism Monitor', w: 6, h: 6 },\n { pattern: /\\b(?:fleet|nodes?|routes?|mesh)\\b/i, source: 'system:fleet', name: 'Fleet Router', w: 6, h: 5 },\n { pattern: /\\b(?:captcha|browsers?|form fill|web automation)\\b/i, source: 'system:browser', name: 'Browser Tools', w: 6, h: 5 },\n { pattern: /\\b(?:paperclip|sidecars?|helpers?)\\b/i, source: 'system:paperclip', name: 'Paperclip', w: 6, h: 5 },\n { pattern: /\\b(?:tests?|flaky|failing|coverage|eval)\\b/i, source: 'system:eval', name: 'Test Lab', w: 6, h: 6 },\n ];\n const matchedShortcut = systemWidgetShortcuts.find(s => s.pattern.test(content));\n if (matchedShortcut) {\n const gateText = `_____widget\\n{ \"name\": \"${matchedShortcut.name}\", \"format\": \"system\", \"source\": \"${matchedShortcut.source}\", \"w\": ${matchedShortcut.w}, \"h\": ${matchedShortcut.h} }`;\n const responseText = `Added the **${matchedShortcut.name}** widget to your canvas.`;\n titanRequestsTotal.increment({ channel, status: 'ok' });\n if (req.headers.accept === 'text/event-stream') {\n res.setHeader('Content-Type', 'text/event-stream');\n res.flushHeaders();\n res.write(`event: token\\ndata: ${JSON.stringify({ text: responseText })}\\n\\n`);\n res.write(`event: token\\ndata: ${JSON.stringify({ text: '\\n\\n' + gateText })}\\n\\n`);\n res.write(`event: done\\ndata: ${JSON.stringify({ content: responseText + '\\n\\n' + gateText, sessionId: requestedSessionId || null, durationMs: 0, toolsUsed: [] })}\\n\\n`);\n res.end();\n } else {\n res.json({ content: responseText + '\\n\\n' + gateText, sessionId: requestedSessionId || null, toolsUsed: [], model: 'system', durationMs: 0 });\n }\n return;\n }\n\n const startTime = process.hrtime.bigint();\n const wantsSSE = req.headers.accept === 'text/event-stream';\n\n // Validate session ID format (prevent injection)\n if (requestedSessionId && !/^[a-zA-Z0-9_:-]{1,128}$/.test(requestedSessionId)) {\n res.status(400).json({ error: 'Invalid session ID format' });\n return;\n }\n\n // Set up abort controller for this request\n const abortController = new AbortController();\n if (requestedSessionId) {\n sessionAborts.set(requestedSessionId, abortController);\n sessionAbortTimes.set(requestedSessionId, Date.now());\n // S3: Track session ownership\n if (!sessionOwners.has(requestedSessionId)) {\n sessionOwners.set(requestedSessionId, getUserIdFromReq(req));\n }\n }\n\n // Check slash commands first (same as handleInboundMessage)\n try {\n const slashResult = await handleSlashCommand(content, channel, userId);\n if (slashResult) {\n titanRequestsTotal.increment({ channel, status: 'ok' });\n const durationSec = Number(process.hrtime.bigint() - startTime) / 1e9;\n titanRequestDuration.observe(durationSec, { channel });\n if (wantsSSE) {\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n res.flushHeaders();\n res.write(`event: done\\ndata: ${JSON.stringify({ content: slashResult.response, sessionId: null, durationMs: 0 })}\\n\\n`);\n res.end();\n } else {\n res.json({ content: slashResult.response, sessionId: null, toolsUsed: [], model: 'system' });\n }\n return;\n }\n } catch { /* fall through to routeMessage */ }\n\n // ── Auto-detect credentials in user messages ──────────────────────\n // If the user pastes a Home Assistant URL + JWT token, save them automatically\n // before the LLM even sees the message (prevents hallucination / tool-skip).\n try {\n const haKeywords = /home\\s*assistant|homeassistant|\\bha\\b\\s*(token|url|key|setup|connect)/i;\n const jwtPattern = /eyJ[A-Za-z0-9_-]+\\.eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+/;\n const urlPattern = /https?:\\/\\/[^\\s,'\"]+/i;\n if (haKeywords.test(content) && (jwtPattern.test(content) || urlPattern.test(content))) {\n const jwtMatch = content.match(jwtPattern);\n const urlMatch = content.match(urlPattern);\n const cfg = loadConfig();\n let saved = false;\n if (jwtMatch && (!cfg.homeAssistant?.token || cfg.homeAssistant.token !== jwtMatch[0])) {\n // Security: store in config but log a warning about plaintext storage\n cfg.homeAssistant.token = jwtMatch[0];\n saved = true;\n logger.warn(COMPONENT, '[Security] Home Assistant token auto-saved to config. Consider using the vault for credential storage.');\n }\n if (urlMatch && urlMatch[0].match(/:\\d{4}/) && (!cfg.homeAssistant?.url || cfg.homeAssistant.url !== urlMatch[0].replace(/\\/+$/, ''))) {\n cfg.homeAssistant.url = urlMatch[0].replace(/\\/+$/, '');\n saved = true;\n }\n if (saved) {\n updateConfig({ homeAssistant: cfg.homeAssistant });\n logger.info('Gateway', 'Auto-saved Home Assistant credentials from user message');\n }\n }\n } catch { /* non-critical — let the LLM handle it */ }\n\n // Concurrent LLM request limit (auto-tuned to 2 on CPU-only systems)\n const maxConcurrent = maxConcurrentOverride ?? (loadConfig().security.maxConcurrentTasks || 5);\n if (activeLlmRequests >= maxConcurrent) {\n titanRequestsTotal.increment({ channel, status: 'busy' });\n titanErrorsTotal.increment({ type: 'busy' });\n if (wantsSSE) {\n res.setHeader('Content-Type', 'text/event-stream');\n res.flushHeaders();\n res.write(`event: done\\ndata: ${JSON.stringify({ error: 'Server busy' })}\\n\\n`);\n res.end();\n } else {\n res.status(503).json({ error: 'Server busy — too many concurrent requests. Try again shortly.' });\n }\n return;\n }\n activeLlmRequests++;\n titanActiveSessions.inc();\n // Track client disconnect to avoid writing to dead connections\n let clientDisconnected = false;\n try {\n if (wantsSSE) {\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n res.flushHeaders();\n\n req.on('close', () => { clientDisconnected = true; });\n\n const safeWrite = (data: string) => {\n if (clientDisconnected) return;\n try { res.write(data); } catch { clientDisconnected = true; }\n };\n\n const response = await routeMessage(content, channel, safeUserId, {\n streamCallbacks: {\n onToken: (token: string) => {\n safeWrite(`event: token\\ndata: ${JSON.stringify({ text: token })}\\n\\n`);\n },\n onToolCall: (name: string, args: Record<string, unknown>) => {\n safeWrite(`event: tool_call\\ndata: ${JSON.stringify({ name, args, timestamp: Date.now() })}\\n\\n`);\n },\n onToolResult: (name: string, result: string, durationMs: number, success: boolean, diff?: string) => {\n safeWrite(`event: tool_end\\ndata: ${JSON.stringify({ name, result: result.slice(0, 500), durationMs, success, diff, timestamp: Date.now() })}\\n\\n`);\n },\n onThinking: () => {\n safeWrite(`event: thinking\\ndata: ${JSON.stringify({ timestamp: Date.now() })}\\n\\n`);\n },\n onRound: (round: number, maxRounds: number) => {\n safeWrite(`event: round\\ndata: ${JSON.stringify({ round, maxRounds, timestamp: Date.now() })}\\n\\n`);\n },\n },\n overrideAgentId: agentId,\n signal: abortController.signal,\n sessionId: requestedSessionId,\n modelOverride: requestedModel,\n systemPromptAppendix: typeof systemPromptAppendix === 'string' ? systemPromptAppendix : undefined,\n });\n titanRequestsTotal.increment({ channel, status: 'ok' });\n if (response.toolsUsed) {\n for (const tool of response.toolsUsed) titanToolCallsTotal.increment({ tool });\n }\n if (response.tokenUsage) {\n if (response.tokenUsage.prompt) titanTokensTotal.increment({ type: 'prompt' }, response.tokenUsage.prompt);\n if (response.tokenUsage.completion) titanTokensTotal.increment({ type: 'completion' }, response.tokenUsage.completion);\n }\n if (response.model) titanModelRequestsTotal.increment({ model: response.model, provider: 'default' });\n trackUsage(response.model || 'unknown', response.tokenUsage, response.durationMs || 0, response.sessionId || '');\n // Hunt Finding #11: sanitize SSE response content as well\n try {\n const { sanitizeOutbound } = await import('../utils/outboundSanitizer.js');\n const sanitized = sanitizeOutbound(\n response.content || '',\n 'api_message_sse',\n \"I'm TITAN — I can run commands, edit files, search the web, remember things, and more. What would you like me to help with?\",\n );\n if (sanitized.hadIssues) {\n logger.warn(COMPONENT, `[OutboundGuard] SSE /api/message response sanitized: ${sanitized.issues.join(', ')}`);\n response.content = sanitized.text;\n }\n } catch { /* sanitizer unavailable */ }\n if (!clientDisconnected) {\n safeWrite(`event: done\\ndata: ${JSON.stringify({ content: response.content, sessionId: response.sessionId, durationMs: response.durationMs, model: response.model, toolsUsed: response.toolsUsed, pendingApproval: response.pendingApproval })}\\n\\n`);\n try { res.end(); } catch { /* client gone */ }\n }\n } else {\n const response = await routeMessage(content, channel, safeUserId, {\n overrideAgentId: agentId,\n signal: abortController.signal,\n sessionId: requestedSessionId,\n modelOverride: requestedModel,\n systemPromptAppendix: typeof systemPromptAppendix === 'string' ? systemPromptAppendix : undefined,\n });\n titanRequestsTotal.increment({ channel, status: 'ok' });\n if (response.toolsUsed) {\n for (const tool of response.toolsUsed) titanToolCallsTotal.increment({ tool });\n }\n if (response.tokenUsage) {\n if (response.tokenUsage.prompt) titanTokensTotal.increment({ type: 'prompt' }, response.tokenUsage.prompt);\n if (response.tokenUsage.completion) titanTokensTotal.increment({ type: 'completion' }, response.tokenUsage.completion);\n }\n if (response.model) titanModelRequestsTotal.increment({ model: response.model, provider: 'default' });\n trackUsage(response.model || 'unknown', response.tokenUsage, response.durationMs || 0, response.sessionId || '');\n // Hunt Finding #11 (2026-04-14): sanitize outbound content before returning\n // to user. Catches system prompt leaks, instruction echoes, tool artifacts.\n // Defense-in-depth: the system prompt tells the model not to leak, but if the\n // model ignores that, this catches it.\n try {\n const { sanitizeOutbound } = await import('../utils/outboundSanitizer.js');\n const sanitized = sanitizeOutbound(\n response.content || '',\n 'api_message',\n \"I'm TITAN — I can run commands, edit files, search the web, remember things, and more. What would you like me to help with?\",\n );\n if (sanitized.hadIssues) {\n logger.warn(COMPONENT, `[OutboundGuard] /api/message response sanitized: ${sanitized.issues.join(', ')}`);\n response.content = sanitized.text;\n }\n } catch { /* sanitizer unavailable — non-critical */ }\n res.json(response);\n }\n } catch (error) {\n titanRequestsTotal.increment({ channel, status: 'error' });\n titanErrorsTotal.increment({ type: 'request' });\n // Capture a structured bug report for the operator + agent team to\n // review. Best-effort — never gates the user-facing error path.\n try {\n const { captureBugReport } = await import('../analytics/bugReports.js');\n await captureBugReport(error, {\n origin: 'gateway./api/message',\n channel,\n sessionId: requestedSessionId,\n model: typeof requestedModel === 'string' ? requestedModel : undefined,\n lastUserMessage: typeof content === 'string' ? content : undefined,\n turnNumber: undefined,\n });\n } catch { /* never let bug capture break the request path */ }\n // Classify the error so the UI can render an actionable banner instead of a stack trace\n const structured = classifyChatError(error as Error);\n if (wantsSSE && !clientDisconnected) {\n try { res.write(`event: done\\ndata: ${JSON.stringify(structured)}\\n\\n`); res.end(); } catch { /* client gone */ }\n } else if (!wantsSSE) {\n res.status(structured.status).json(structured);\n }\n } finally {\n activeLlmRequests--;\n titanActiveSessions.dec();\n const durationSec = Number(process.hrtime.bigint() - startTime) / 1e9;\n titanRequestDuration.observe(durationSec, { channel });\n if (requestedSessionId) sessionAborts.delete(requestedSessionId);\n }\n });\n\n // Abort a running session\n app.post('/api/sessions/:id/abort', (req, res) => {\n const { id } = req.params;\n const controller = sessionAborts.get(id);\n if (controller) {\n controller.abort();\n sessionAborts.delete(id);\n res.json({ ok: true, message: 'Session aborted' });\n } else {\n res.json({ ok: true, message: 'No active session to abort' });\n }\n });\n\n // SSE streaming endpoint — real token-by-token delivery\n app.post('/api/chat/stream', rateLimit(60000, 30), concurrencyGuard(10), async (req, res) => {\n const { content, model } = req.body;\n if (!content) { res.status(400).json({ error: 'content is required' }); return; }\n\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n res.flushHeaders();\n\n try {\n const config = loadConfig();\n const modelId = model || config.agent.model || 'anthropic/claude-sonnet-4-20250514';\n const systemMessages = [{ role: 'system' as const, content: `You are TITAN, an intelligent assistant.` }];\n const userMessages = [{ role: 'user' as const, content }];\n\n for await (const chunk of chatStream({ model: modelId, messages: [...systemMessages, ...userMessages], maxTokens: config.agent.maxTokens, temperature: config.agent.temperature })) {\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n if (chunk.type === 'done' || chunk.type === 'error') break;\n }\n } catch (error) {\n logger.error(COMPONENT, `Stream error: ${(error as Error).message}`);\n res.write(`data: ${JSON.stringify({ type: 'error', error: 'The assistant hit a snag. Please refresh and try again.' })}\\n\\n`);\n }\n res.end();\n });\n\n // Cost optimizer endpoint for Mission Control\n app.get('/api/costs', (_req, res) => {\n res.json(getCostStatus());\n });\n\n // Usage tracking — per-model cost breakdown\n app.get('/api/usage', (req, res) => {\n const hours = parseInt(req.query.hours as string) || 24;\n const cutoff = new Date(Date.now() - hours * 3600_000).toISOString();\n const recent = usageLog.filter(e => e.timestamp >= cutoff);\n\n // Aggregate by model\n const byModel: Record<string, { requests: number; promptTokens: number; completionTokens: number; totalTokens: number; estimatedCostUsd: number; avgDurationMs: number }> = {};\n for (const e of recent) {\n if (!byModel[e.model]) byModel[e.model] = { requests: 0, promptTokens: 0, completionTokens: 0, totalTokens: 0, estimatedCostUsd: 0, avgDurationMs: 0 };\n const m = byModel[e.model];\n m.requests++;\n m.promptTokens += e.promptTokens;\n m.completionTokens += e.completionTokens;\n m.totalTokens += e.totalTokens;\n m.estimatedCostUsd += e.estimatedCostUsd;\n m.avgDurationMs = (m.avgDurationMs * (m.requests - 1) + e.durationMs) / m.requests;\n }\n\n // Round costs\n for (const m of Object.values(byModel)) {\n m.estimatedCostUsd = Math.round(m.estimatedCostUsd * 10000) / 10000;\n m.avgDurationMs = Math.round(m.avgDurationMs);\n }\n\n const totalCost = Object.values(byModel).reduce((sum, m) => sum + m.estimatedCostUsd, 0);\n\n res.json({\n period: `${hours}h`,\n totalRequests: recent.length,\n totalTokens: recent.reduce((sum, e) => sum + e.totalTokens, 0),\n estimatedCostUsd: Math.round(totalCost * 10000) / 10000,\n byModel,\n recentEntries: recent.slice(-20), // Last 20 for detail view\n });\n });\n\n // Update System endpoints\n app.get('/api/update', async (_req, res) => {\n const info = await getUpdateInfo();\n res.json(info);\n });\n\n app.post('/api/update', (req, res) => {\n const isLocalDev = fs.existsSync(join(process.cwd(), '.git'));\n const restart = req.body?.restart === true;\n\n let command = 'npm update -g titan-agent';\n if (isLocalDev) {\n command = 'git pull && npm run build';\n }\n\n logger.info(COMPONENT, `Triggering update: ${command} (restart=${restart})`);\n\n exec(command, { timeout: 120_000 }, (error, stdout, _stderr) => {\n if (error) {\n logger.error(COMPONENT, `Update failed: ${error.message}`);\n if (!res.headersSent) res.json({ ok: false, error: error.message });\n return;\n }\n\n logger.info(COMPONENT, `Update completed successfully.\\\\n${stdout}`);\n if (!res.headersSent) {\n res.json({ ok: true, message: 'Update completed', restarting: restart, output: stdout.slice(-500) });\n }\n\n if (restart) {\n logger.info(COMPONENT, 'Scheduling restart in 2 seconds...');\n const cwd = process.cwd();\n const scriptPath = '/tmp/titan-restart.sh';\n fs.writeFileSync(scriptPath, [\n '#!/bin/bash',\n 'sleep 2',\n `cd \"${cwd}\"`,\n 'nohup node dist/cli/index.js gateway >> /tmp/titan-gateway.log 2>&1 &',\n ].join('\\n'), { mode: 0o755 });\n\n spawn('bash', [scriptPath], { detached: true, stdio: 'ignore' }).unref();\n\n setTimeout(() => {\n logger.info(COMPONENT, 'Exiting for restart...');\n process.exit(0);\n }, 1000);\n }\n });\n });\n\n // Config endpoints\n app.get('/api/config', (_req, res) => {\n const cfg = loadConfig();\n // Return config with sensitive fields masked\n res.json({\n model: cfg.agent.model,\n provider: cfg.agent.model?.split('/')[0] || 'openai',\n voice: {\n enabled: Boolean(cfg.voice?.enabled),\n livekitUrl: cfg.voice?.livekitUrl || '',\n agentUrl: cfg.voice?.agentUrl || '',\n ttsEngine: cfg.voice?.ttsEngine || 'f5-tts',\n ttsUrl: cfg.voice?.ttsUrl || 'http://localhost:5006',\n ttsVoice: cfg.voice?.ttsVoice || 'tara',\n sttUrl: cfg.voice?.sttUrl || 'http://localhost:48421',\n sttEngine: cfg.voice?.sttEngine || 'faster-whisper',\n model: cfg.voice?.model || '',\n },\n agent: { ...cfg.agent, systemPrompt: undefined, systemPromptConfigured: Boolean(cfg.agent.systemPrompt) },\n autonomy: cfg.autonomy,\n security: {\n sandboxMode: cfg.security.sandboxMode,\n shield: cfg.security.shield,\n deniedTools: cfg.security.deniedTools || [],\n networkAllowlist: cfg.security.networkAllowlist || [],\n },\n gateway: {\n port: cfg.gateway.port,\n host: cfg.gateway.host,\n auth: { mode: cfg.gateway.auth.mode },\n },\n logging: cfg.logging,\n providers: {\n anthropic: { configured: Boolean(cfg.providers.anthropic?.apiKey) },\n openai: { configured: Boolean(cfg.providers.openai?.apiKey) },\n google: { configured: Boolean(cfg.providers.google?.apiKey) },\n ollama: { baseUrl: cfg.providers.ollama?.baseUrl || 'http://localhost:11434' },\n groq: { configured: Boolean(cfg.providers.groq?.apiKey) },\n mistral: { configured: Boolean(cfg.providers.mistral?.apiKey) },\n fireworks: { configured: Boolean(cfg.providers.fireworks?.apiKey) },\n xai: { configured: Boolean(cfg.providers.xai?.apiKey) },\n together: { configured: Boolean(cfg.providers.together?.apiKey) },\n deepseek: { configured: Boolean(cfg.providers.deepseek?.apiKey) },\n perplexity: { configured: Boolean(cfg.providers.perplexity?.apiKey) },\n },\n oauth: {\n google: {\n clientIdSet: Boolean(cfg.oauth?.google?.clientId),\n clientSecretSet: Boolean(cfg.oauth?.google?.clientSecret),\n },\n },\n channels: Object.fromEntries(\n Object.entries(cfg.channels).map(([k, v]) => {\n const ch = v as { enabled?: boolean; token?: string; dmPolicy?: string };\n return [k, { enabled: Boolean(ch.enabled), dmPolicy: ch.dmPolicy || 'pairing' }];\n })\n ),\n nvidia: (() => {\n const nv = (cfg as Record<string, unknown>).nvidia as Record<string, unknown> | undefined;\n if (!nv) return { enabled: false, apiKeySet: false, cuopt: { enabled: false, url: 'http://localhost:5000' }, asr: { enabled: false, grpcUrl: 'localhost:50051', healthUrl: 'http://localhost:9000' }, openshell: { enabled: false, binaryPath: 'openshell', policyPath: '' } };\n return {\n enabled: Boolean(nv.enabled),\n apiKeySet: Boolean(nv.apiKey || process.env.NVIDIA_API_KEY),\n cuopt: nv.cuopt ?? { enabled: false, url: 'http://localhost:5000' },\n asr: nv.asr ?? { enabled: false, grpcUrl: 'localhost:50051', healthUrl: 'http://localhost:9000' },\n openshell: nv.openshell ?? { enabled: false, binaryPath: 'openshell', policyPath: '' },\n };\n })(),\n mesh: {\n enabled: Boolean(cfg.mesh?.enabled),\n mdns: Boolean(cfg.mesh?.mdns),\n tailscale: Boolean(cfg.mesh?.tailscale),\n maxPeers: cfg.mesh?.maxPeers ?? 5,\n autoApprove: Boolean(cfg.mesh?.autoApprove),\n },\n organism: {\n enabled: Boolean(cfg.organism?.enabled),\n hormonesInPrompt: Boolean(cfg.organism?.hormonesInPrompt),\n pressureThreshold: Number(cfg.organism?.pressureThreshold) || 0.5,\n shadowEnabled: Boolean(cfg.organism?.shadowEnabled),\n tickIntervalMs: Number(cfg.organism?.tickIntervalMs) || 60000,\n },\n commandPost: {\n enabled: Boolean((cfg as Record<string, any>).commandPost?.enabled),\n heartbeatIntervalMs: (cfg as Record<string, any>).commandPost?.heartbeatIntervalMs ?? 30000,\n maxConcurrentAgents: (cfg as Record<string, any>).commandPost?.maxConcurrentAgents ?? 10,\n checkoutTimeoutMs: (cfg as Record<string, any>).commandPost?.checkoutTimeoutMs ?? 300000,\n },\n });\n });\n\n app.post('/api/config', async (req, res) => {\n try {\n const body = req.body as Record<string, unknown>;\n const cfg = loadConfig();\n // Clone config to avoid mutating live state before validation succeeds\n const draft = structuredClone(cfg) as typeof cfg;\n\n // Track which config fields are being changed for restart detection\n const changedFields: string[] = [];\n\n if (body.model) {\n // Hunt Finding #35 (2026-04-14): POST /api/config's `model` field\n // was bypassing the shape + provider-registry validation that\n // /api/model/switch gained in #25. Same bug class: a bogus string\n // got persisted to config. Apply the same shape check here.\n const modelShapeErr = validateModelId(body.model);\n if (modelShapeErr) {\n res.status(400).json({ error: `model: ${modelShapeErr}` });\n return;\n }\n // Also validate the provider is registered (same as #25).\n const modelStr = body.model as string;\n const providerPrefix = modelStr.split('/')[0];\n if (providerPrefix && providerPrefix !== 'ollama') {\n const { getProvider } = await import('../providers/router.js');\n if (!getProvider(providerPrefix)) {\n res.status(400).json({\n error: `Unknown provider '${providerPrefix}'. Use /api/models to list available providers and models.`,\n });\n return;\n }\n }\n draft.agent.model = modelStr;\n changedFields.push('agent.model');\n }\n if (body.autonomyMode) { draft.autonomy.mode = body.autonomyMode as 'supervised' | 'autonomous' | 'locked'; changedFields.push('autonomy.mode'); }\n if (body.sandboxMode) { draft.security.sandboxMode = body.sandboxMode as 'host' | 'docker' | 'none'; changedFields.push('security.sandboxMode'); }\n if (body.logLevel) { draft.logging.level = body.logLevel as 'info' | 'debug' | 'warn' | 'silent'; changedFields.push('logging.level'); }\n // Provider API keys\n if (body.anthropicKey !== undefined) { draft.providers.anthropic.apiKey = body.anthropicKey as string; changedFields.push('providers.anthropic.apiKey'); }\n if (body.openaiKey !== undefined) { draft.providers.openai.apiKey = body.openaiKey as string; changedFields.push('providers.openai.apiKey'); }\n if (body.googleKey !== undefined) { draft.providers.google.apiKey = body.googleKey as string; changedFields.push('providers.google.apiKey'); }\n if (body.ollamaUrl !== undefined) { draft.providers.ollama.baseUrl = body.ollamaUrl as string; changedFields.push('providers.ollama.baseUrl'); }\n if (body.groqKey !== undefined) { draft.providers.groq.apiKey = body.groqKey as string; changedFields.push('providers.groq.apiKey'); }\n if (body.mistralKey !== undefined) { draft.providers.mistral.apiKey = body.mistralKey as string; changedFields.push('providers.mistral.apiKey'); }\n if (body.fireworksKey !== undefined) { draft.providers.fireworks.apiKey = body.fireworksKey as string; changedFields.push('providers.fireworks.apiKey'); }\n if (body.xaiKey !== undefined) { draft.providers.xai.apiKey = body.xaiKey as string; changedFields.push('providers.xai.apiKey'); }\n if (body.togetherKey !== undefined) { draft.providers.together.apiKey = body.togetherKey as string; changedFields.push('providers.together.apiKey'); }\n if (body.deepseekKey !== undefined) { draft.providers.deepseek.apiKey = body.deepseekKey as string; changedFields.push('providers.deepseek.apiKey'); }\n if (body.perplexityKey !== undefined) { draft.providers.perplexity.apiKey = body.perplexityKey as string; changedFields.push('providers.perplexity.apiKey'); }\n // Google OAuth\n if (body.googleOAuthClientId !== undefined) {\n if (!draft.oauth) (draft as Record<string, unknown>).oauth = { google: {} };\n draft.oauth.google.clientId = body.googleOAuthClientId as string;\n changedFields.push('oauth.google.clientId');\n }\n if (body.googleOAuthClientSecret !== undefined) {\n if (!draft.oauth) (draft as Record<string, unknown>).oauth = { google: {} };\n draft.oauth.google.clientSecret = body.googleOAuthClientSecret as string;\n changedFields.push('oauth.google.clientSecret');\n }\n // Agent settings\n if (body.maxTokens !== undefined) { draft.agent.maxTokens = Number(body.maxTokens); changedFields.push('agent.maxTokens'); }\n if (body.temperature !== undefined) { draft.agent.temperature = Number(body.temperature); changedFields.push('agent.temperature'); }\n if (body.systemPrompt !== undefined) { draft.agent.systemPrompt = body.systemPrompt as string; changedFields.push('agent.systemPrompt'); }\n // Security shield\n if (body.shieldEnabled !== undefined) { draft.security.shield.enabled = Boolean(body.shieldEnabled); changedFields.push('security.shield.enabled'); }\n if (body.shieldMode !== undefined) { draft.security.shield.mode = body.shieldMode as 'strict' | 'standard'; changedFields.push('security.shield.mode'); }\n if (body.deniedTools !== undefined) { draft.security.deniedTools = body.deniedTools as string[]; changedFields.push('security.deniedTools'); }\n if (body.networkAllowlist !== undefined) { draft.security.networkAllowlist = body.networkAllowlist as string[]; changedFields.push('security.networkAllowlist'); }\n // Gateway\n if (body.gatewayPort !== undefined) { draft.gateway.port = Number(body.gatewayPort); changedFields.push('gateway.port'); }\n if (body.gatewayAuthMode !== undefined) { draft.gateway.auth.mode = body.gatewayAuthMode as 'none' | 'token' | 'password'; changedFields.push('gateway.auth.mode'); }\n if (body.gatewayPassword !== undefined) { draft.gateway.auth.password = body.gatewayPassword as string; changedFields.push('gateway.auth.password'); }\n if (body.gatewayToken !== undefined) { draft.gateway.auth.token = body.gatewayToken as string; changedFields.push('gateway.auth.token'); }\n // Voice settings (nested object from SettingsPanel)\n if (body.voice !== undefined && typeof body.voice === 'object') {\n const v = body.voice as Record<string, unknown>;\n if (v.enabled !== undefined) draft.voice.enabled = Boolean(v.enabled);\n if (v.livekitUrl !== undefined) draft.voice.livekitUrl = String(v.livekitUrl);\n if (v.livekitApiKey !== undefined) draft.voice.livekitApiKey = String(v.livekitApiKey);\n if (v.livekitApiSecret !== undefined) draft.voice.livekitApiSecret = String(v.livekitApiSecret);\n if (v.agentUrl !== undefined) draft.voice.agentUrl = String(v.agentUrl);\n if (v.ttsVoice !== undefined) draft.voice.ttsVoice = String(v.ttsVoice);\n if (v.ttsEngine !== undefined) draft.voice.ttsEngine = String(v.ttsEngine) as typeof draft.voice.ttsEngine;\n if (v.ttsUrl !== undefined) draft.voice.ttsUrl = String(v.ttsUrl);\n if (v.sttUrl !== undefined) draft.voice.sttUrl = String(v.sttUrl);\n if (v.sttEngine !== undefined) draft.voice.sttEngine = String(v.sttEngine) as typeof draft.voice.sttEngine;\n if (v.model !== undefined) (draft.voice as Record<string, unknown>).model = String(v.model) || undefined;\n changedFields.push('voice');\n }\n // Home Assistant\n if (body.homeAssistantUrl !== undefined) { draft.homeAssistant.url = body.homeAssistantUrl as string; changedFields.push('homeAssistant.url'); }\n if (body.homeAssistantToken !== undefined) { draft.homeAssistant.token = body.homeAssistantToken as string; changedFields.push('homeAssistant.token'); }\n // Channels\n if (body.channels !== undefined && typeof body.channels === 'object') {\n for (const [ch, val] of Object.entries(body.channels as Record<string, unknown>)) {\n if (draft.channels[ch as keyof typeof draft.channels]) {\n Object.assign(draft.channels[ch as keyof typeof draft.channels], val);\n changedFields.push(`channels.${ch}`);\n }\n }\n }\n // NVIDIA config (nested object)\n if (body.nvidia !== undefined && typeof body.nvidia === 'object') {\n const nv = body.nvidia as Record<string, unknown>;\n const nvCfg = ((draft as Record<string, unknown>).nvidia || {}) as Record<string, unknown>;\n if (nv.enabled !== undefined) nvCfg.enabled = Boolean(nv.enabled);\n if (nv.apiKey !== undefined) nvCfg.apiKey = String(nv.apiKey);\n if (nv.cuopt !== undefined && typeof nv.cuopt === 'object') {\n const cuopt = (nvCfg.cuopt || {}) as Record<string, unknown>;\n const src = nv.cuopt as Record<string, unknown>;\n if (src.enabled !== undefined) cuopt.enabled = Boolean(src.enabled);\n if (src.url !== undefined) cuopt.url = String(src.url);\n nvCfg.cuopt = cuopt;\n }\n if (nv.asr !== undefined && typeof nv.asr === 'object') {\n const asr = (nvCfg.asr || {}) as Record<string, unknown>;\n const src = nv.asr as Record<string, unknown>;\n if (src.enabled !== undefined) asr.enabled = Boolean(src.enabled);\n if (src.grpcUrl !== undefined) asr.grpcUrl = String(src.grpcUrl);\n if (src.healthUrl !== undefined) asr.healthUrl = String(src.healthUrl);\n nvCfg.asr = asr;\n }\n if (nv.openshell !== undefined && typeof nv.openshell === 'object') {\n const os = (nvCfg.openshell || {}) as Record<string, unknown>;\n const src = nv.openshell as Record<string, unknown>;\n if (src.enabled !== undefined) os.enabled = Boolean(src.enabled);\n if (src.binaryPath !== undefined) os.binaryPath = String(src.binaryPath);\n if (src.policyPath !== undefined) os.policyPath = String(src.policyPath);\n nvCfg.openshell = os;\n }\n (draft as Record<string, unknown>).nvidia = nvCfg;\n changedFields.push('nvidia');\n }\n // Organism / SOMA toggle\n if (body.organism !== undefined && typeof body.organism === 'object') {\n const org = body.organism as Record<string, unknown>;\n if (!draft.organism) (draft as Record<string, unknown>).organism = {};\n if (org.enabled !== undefined) draft.organism.enabled = Boolean(org.enabled);\n if (org.hormonesInPrompt !== undefined) draft.organism.hormonesInPrompt = Boolean(org.hormonesInPrompt);\n if (org.pressureThreshold !== undefined) draft.organism.pressureThreshold = Number(org.pressureThreshold);\n if (org.shadowEnabled !== undefined) draft.organism.shadowEnabled = Boolean(org.shadowEnabled);\n if (org.tickIntervalMs !== undefined) draft.organism.tickIntervalMs = Number(org.tickIntervalMs);\n changedFields.push('organism');\n }\n\n // Autonomy toggles (v5.0.2 — Autonomy Settings Panel)\n const handleNestedBool = (section: string, key: string, target: Record<string, unknown>) => {\n const sec = body[section] as Record<string, unknown> | undefined;\n if (sec && key in sec) {\n target[key] = Boolean(sec[key]);\n changedFields.push(`${section}.${key}`);\n }\n };\n if (body.autonomy !== undefined && typeof body.autonomy === 'object') {\n const a = body.autonomy as Record<string, unknown>;\n if (!draft.autonomy) (draft as Record<string, unknown>).autonomy = {};\n const da = draft.autonomy as Record<string, unknown>;\n if (a.mode !== undefined) da.mode = a.mode as 'autonomous' | 'supervised' | 'locked';\n if (a.autoProposeGoals !== undefined) da.autoProposeGoals = Boolean(a.autoProposeGoals);\n if (a.proactiveInitiative !== undefined) da.proactiveInitiative = Boolean(a.proactiveInitiative);\n changedFields.push('autonomy');\n }\n if (body.selfMod !== undefined && typeof body.selfMod === 'object') {\n const s = body.selfMod as Record<string, unknown>;\n if (!draft.selfMod) (draft as Record<string, unknown>).selfMod = {};\n if (s.enabled !== undefined) draft.selfMod.enabled = Boolean(s.enabled);\n if (s.autoPR !== undefined) draft.selfMod.autoPR = Boolean(s.autoPR);\n changedFields.push('selfMod');\n }\n if (body.commandPost !== undefined && typeof body.commandPost === 'object') {\n const cp = body.commandPost as Record<string, unknown>;\n if (!draft.commandPost) (draft as Record<string, unknown>).commandPost = {};\n if (cp.enabled !== undefined) draft.commandPost.enabled = Boolean(cp.enabled);\n changedFields.push('commandPost');\n }\n if (body.mesh !== undefined && typeof body.mesh === 'object') {\n const m = body.mesh as Record<string, unknown>;\n if (!draft.mesh) (draft as Record<string, unknown>).mesh = {};\n if (m.enabled !== undefined) draft.mesh.enabled = Boolean(m.enabled);\n changedFields.push('mesh');\n }\n if (body.autopilot !== undefined && typeof body.autopilot === 'object') {\n const ap = body.autopilot as Record<string, unknown>;\n if (!draft.autopilot) (draft as Record<string, unknown>).autopilot = {};\n if (ap.enabled !== undefined) draft.autopilot.enabled = Boolean(ap.enabled);\n if (ap.goals !== undefined && typeof ap.goals === 'object') {\n const apg = ap.goals as Record<string, unknown>;\n const dag = (draft.autopilot as Record<string, unknown>);\n if (!dag.goals) dag.goals = {};\n if (apg.selfInitiate !== undefined) (dag.goals as Record<string, unknown>).selfInitiate = Boolean(apg.selfInitiate);\n }\n changedFields.push('autopilot');\n }\n if (body.brain !== undefined && typeof body.brain === 'object') {\n const b = body.brain as Record<string, unknown>;\n if (!draft.brain) (draft as Record<string, unknown>).brain = {};\n if (b.enabled !== undefined) draft.brain.enabled = Boolean(b.enabled);\n changedFields.push('brain');\n }\n if (body.mcp !== undefined && typeof body.mcp === 'object') {\n const mcp = body.mcp as Record<string, unknown>;\n if (!draft.mcp) (draft as Record<string, unknown>).mcp = { server: {} };\n if (mcp.server !== undefined && typeof mcp.server === 'object') {\n const srv = mcp.server as Record<string, unknown>;\n const dmcp = (draft.mcp as Record<string, unknown>);\n if (!dmcp.server) dmcp.server = {};\n if (srv.enabled !== undefined) (dmcp.server as Record<string, unknown>).enabled = Boolean(srv.enabled);\n }\n changedFields.push('mcp');\n }\n if (body.training !== undefined && typeof body.training === 'object') {\n const t = body.training as Record<string, unknown>;\n if (!draft.training) (draft as Record<string, unknown>).training = {};\n if (t.enabled !== undefined) draft.training.enabled = Boolean(t.enabled);\n changedFields.push('training');\n }\n if (body.teams !== undefined && typeof body.teams === 'object') {\n const t = body.teams as Record<string, unknown>;\n if (!draft.teams) (draft as Record<string, unknown>).teams = {};\n if (t.enabled !== undefined) draft.teams.enabled = Boolean(t.enabled);\n changedFields.push('teams');\n }\n if (body.tunnel !== undefined && typeof body.tunnel === 'object') {\n const t = body.tunnel as Record<string, unknown>;\n if (!draft.tunnel) (draft as Record<string, unknown>).tunnel = {};\n if (t.enabled !== undefined) draft.tunnel.enabled = Boolean(t.enabled);\n changedFields.push('tunnel');\n }\n if (body.vault !== undefined && typeof body.vault === 'object') {\n const v = body.vault as Record<string, unknown>;\n const dsec = (draft.security as Record<string, unknown>);\n if (!dsec.vault) dsec.vault = {};\n if (v.enabled !== undefined) (dsec.vault as Record<string, unknown>).enabled = Boolean(v.enabled);\n changedFields.push('security.vault');\n }\n if (body.capsolver !== undefined && typeof body.capsolver === 'object') {\n const c = body.capsolver as Record<string, unknown>;\n if (!draft.capsolver) (draft as Record<string, unknown>).capsolver = {};\n if (c.enabled !== undefined) draft.capsolver.enabled = Boolean(c.enabled);\n changedFields.push('capsolver');\n }\n if (body.deliberation !== undefined && typeof body.deliberation === 'object') {\n const d = body.deliberation as Record<string, unknown>;\n if (!draft.deliberation) (draft as Record<string, unknown>).deliberation = {};\n if (d.autoDetect !== undefined) draft.deliberation.autoDetect = Boolean(d.autoDetect);\n changedFields.push('deliberation');\n }\n if (body.selfImprove !== undefined && typeof body.selfImprove === 'object') {\n const si = body.selfImprove as Record<string, unknown>;\n if (!draft.selfImprove) (draft as Record<string, unknown>).selfImprove = {};\n if (si.autoApply !== undefined) draft.selfImprove.autoApply = Boolean(si.autoApply);\n changedFields.push('selfImprove');\n }\n if (body.memory !== undefined && typeof body.memory === 'object') {\n const mem = body.memory as Record<string, unknown>;\n if (!draft.memory) (draft as Record<string, unknown>).memory = {};\n if (mem.vectorSearchEnabled !== undefined) draft.memory.vectorSearchEnabled = Boolean(mem.vectorSearchEnabled);\n changedFields.push('memory');\n }\n\n if (changedFields.length === 0) {\n const validFields = ['model', 'autonomyMode', 'sandboxMode', 'logLevel', 'anthropicKey', 'openaiKey',\n 'googleKey', 'ollamaUrl', 'groqKey', 'mistralKey', 'fireworksKey', 'xaiKey',\n 'togetherKey', 'deepseekKey', 'perplexityKey', 'maxTokens', 'temperature', 'systemPrompt',\n 'shieldEnabled', 'shieldMode', 'deniedTools', 'networkAllowlist', 'gatewayPort', 'gatewayAuthMode',\n 'gatewayPassword', 'gatewayToken', 'channels', 'googleOAuthClientId', 'googleOAuthClientSecret',\n 'homeAssistantUrl', 'homeAssistantToken', 'voice', 'nvidia', 'organism',\n 'autonomy', 'selfMod', 'commandPost', 'mesh', 'autopilot', 'brain', 'mcp',\n 'training', 'teams', 'tunnel', 'vault', 'capsolver', 'deliberation', 'selfImprove', 'memory'];\n res.status(400).json({ error: 'No recognized fields in request body', validFields });\n return;\n }\n // Validation happens inside updateConfig (Zod parse) — draft is only applied if valid\n updateConfig(draft);\n\n // Determine which changed fields require a restart\n const restartFields = changedFields.filter(field =>\n RESTART_REQUIRED_PATTERNS.some(pattern => {\n if (pattern.endsWith('.*')) {\n return field.startsWith(pattern.slice(0, -1));\n }\n return field === pattern;\n })\n );\n\n res.json({ ok: true, restartRequired: restartFields.length > 0, restartFields });\n } catch (e) {\n // Return 400 for Zod validation errors, 500 for unexpected errors\n const isValidationError = (e as Error).name === 'ZodError' || (e as Error).message?.includes('Validation');\n res.status(isValidationError ? 400 : 500).json({ error: (e as Error).message });\n }\n });\n\n // Models endpoint — lists all providers + live Ollama models\n // Model discovery + management endpoints\n app.get('/api/models', async (_req, res) => {\n const cfg = loadConfig();\n const models = await discoverAllModels();\n // Group by provider\n const grouped: Record<string, string[]> = {};\n for (const m of models) {\n if (!grouped[m.provider]) grouped[m.provider] = [];\n grouped[m.provider].push(m.id);\n }\n res.json({\n ...grouped,\n current: cfg.agent.model,\n aliases: getModelAliases(),\n });\n });\n\n // ── Provider Status API ─────────────────────────────────────────\n app.get('/api/providers/status', async (_req, res) => {\n try {\n const { getCircuitBreakerStatus } = await import('../providers/router.js');\n const cbStatus = getCircuitBreakerStatus();\n const health = await healthCheckAll();\n const providers = Object.entries(health).map(([name, healthy]) => ({\n name,\n healthy,\n circuitBreaker: cbStatus[name] || { state: 'unknown', failureCount: 0 },\n }));\n res.json({ providers, count: providers.length });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/providers/:name/reset', async (req, res) => {\n try {\n const { resetCircuitBreaker } = await import('../providers/router.js');\n resetCircuitBreaker(req.params.name);\n res.json({ reset: true, provider: req.params.name });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/models/discover', async (_req, res) => {\n const models = await discoverAllModels(true);\n const cfg = loadConfig();\n res.json({\n models,\n current: cfg.agent.model,\n aliases: getModelAliases(),\n });\n });\n\n app.get('/api/fallback-state', (_req, res) => {\n const state = getFallbackState();\n res.json(state || { active: null });\n });\n\n /**\n * Hunt Finding #25 + #35 (2026-04-14): shared model-id input validator.\n * Used by BOTH /api/model/switch AND /api/config (where `body.model` takes\n * the same path). Returns a validation error string or null if valid.\n */\n function validateModelId(model: unknown): string | null {\n if (typeof model !== 'string' || model.length === 0 || model.length > 200) {\n return 'model must be a non-empty string up to 200 chars';\n }\n if (!/^[a-zA-Z0-9._:\\-/]+$/.test(model)) {\n return 'model contains invalid characters (allowed: alnum, ._:-/)';\n }\n return null;\n }\n\n app.post('/api/model/switch', async (req, res) => {\n try {\n const { model } = req.body as { model?: string };\n if (!model) { res.status(400).json({ error: 'model is required' }); return; }\n const shapeErr = validateModelId(model);\n if (shapeErr) { res.status(400).json({ error: shapeErr }); return; }\n const cfg = loadConfig();\n // Resolve aliases\n const aliases = cfg.agent.modelAliases || {};\n const resolved = aliases[model] || model;\n\n // ── CRITICAL FIX: Validate model exists for ALL providers ──\n const [providerName, ...modelParts] = resolved.split('/');\n const modelName = modelParts.join('/') || resolved; // Handle models with slashes in name\n\n // Hunt Finding #25 (2026-04-14): previously, any providerName that\n // wasn't 'ollama' fell through the `else if (providerName)` branch and\n // was accepted without validation. A POST with model=\"fake/fake-model\"\n // would succeed and write the bogus value to config, bricking the\n // gateway until manually reverted. Validate the provider exists in\n // the registered router before accepting the switch.\n if (providerName && providerName !== 'ollama') {\n const { getProvider } = await import('../providers/router.js');\n if (!getProvider(providerName)) {\n logger.warn(COMPONENT, `[ModelSwitch] Unknown provider '${providerName}' — rejecting`);\n res.status(400).json({\n error: `Unknown provider '${providerName}'. Use /api/models to list available providers and models.`,\n });\n return;\n }\n }\n\n // 1. Ollama local models — check if model is pulled\n if (providerName === 'ollama') {\n const ollamaBase = cfg.providers.ollama?.baseUrl || 'http://localhost:11434';\n // Cloud-routed models (suffix :cloud) are always valid — they proxy through Ollama to external APIs\n if (modelName.endsWith(':cloud')) {\n logger.info(COMPONENT, `[ModelSwitch] Cloud-routed model '${modelName}' — allowing (proxied via Ollama)`);\n } else {\n // Local model: verify it exists in Ollama\n try {\n const check = await fetch(`${ollamaBase}/api/show`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name: modelName }),\n signal: AbortSignal.timeout(5000),\n });\n if (!check.ok) {\n logger.warn(COMPONENT, `[ModelSwitch] Model '${modelName}' not found in Ollama (HTTP ${check.status})`);\n res.status(404).json({ error: `Model '${modelName}' not found in Ollama. Pull it first: ollama pull ${modelName}` });\n return;\n }\n logger.info(COMPONENT, `[ModelSwitch] Verified Ollama model '${modelName}' exists`);\n } catch (err) {\n // CRITICAL FIX: Ollama unreachable — reject the switch instead of allowing it\n logger.error(COMPONENT, `[ModelSwitch] Ollama unreachable at ${ollamaBase}: ${(err as Error).message}`);\n res.status(503).json({\n error: `Cannot verify model '${modelName}' — Ollama is unreachable at ${ollamaBase}. Check Ollama is running: ollama serve`,\n });\n return;\n }\n }\n } else if (providerName) {\n // 2. Other providers — just log the provider (allow the switch)\n // We trust the user to configure API keys; reject only happens at chat time\n logger.info(COMPONENT, `[ModelSwitch] Switching to provider '${providerName.toLowerCase()}' model '${modelName}'`);\n }\n // If no provider prefix (bare model like 'gpt-4o'), assume it's an alias or user knows what they're doing\n\n updateConfig({ agent: { ...cfg.agent, model: resolved } });\n // Invalidate cached responses for the old model so stale results aren't served\n invalidateCacheForModel(cfg.agent.model);\n logger.info(COMPONENT, `Model switched to: ${resolved}${resolved !== model ? ` (alias: ${model})` : ''}`);\n res.json({ success: true, model: resolved, alias: resolved !== model ? model : undefined });\n } catch (err) {\n logger.error(COMPONENT, `[ModelSwitch] Error: ${(err as Error).message}`);\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ─── Model Probe — empirical capabilities discovery ──────────\n // POST /api/model/probe { model: \"ollama/glm-5.1:cloud\" }\n // POST /api/model/probe { models: [\"...\", \"...\"] }\n // GET /api/model/probe — list all probed models\n app.post('/api/model/probe', async (req, res) => {\n try {\n const body = req.body as { model?: string; models?: string[] };\n const targets = body.model ? [body.model] : (body.models || []);\n if (targets.length === 0) {\n res.status(400).json({ error: 'Provide {model: \"id\"} or {models: [\"id1\",\"id2\"]}' });\n return;\n }\n\n const { probeModel } = await import('../agent/modelProbe.js');\n const { recordProbeResult } = await import('../agent/capabilitiesRegistry.js');\n\n const results = [];\n for (const modelId of targets) {\n try {\n const result = await probeModel(modelId);\n recordProbeResult(result);\n results.push(result);\n } catch (err) {\n results.push({ model: modelId, error: (err as Error).message });\n }\n }\n res.json({ probed: results.length, results });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/model/probe', async (_req, res) => {\n try {\n const { loadRegistry } = await import('../agent/capabilitiesRegistry.js');\n const registry = loadRegistry();\n res.json({\n updatedAt: registry.updatedAt,\n count: Object.keys(registry.models).length,\n models: registry.models,\n });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Profile endpoints\n app.get('/api/profile', (_req, res) => {\n const profile = loadProfile();\n res.json({\n name: profile.name || '',\n technicalLevel: profile.technicalLevel || 'unknown',\n projectCount: profile.projects.length,\n goalCount: profile.goals.length,\n });\n });\n\n app.post('/api/profile', (req, res) => {\n try {\n const { name, technicalLevel } = req.body as { name?: string; technicalLevel?: string };\n const profile = loadProfile();\n if (name !== undefined) profile.name = name;\n if (technicalLevel !== undefined) profile.technicalLevel = technicalLevel as PersonalProfile['technicalLevel'];\n saveProfile(profile);\n res.json({ ok: true });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // Learning stats endpoint\n app.get('/api/learning', (_req, res) => {\n res.json(getLearningStats());\n });\n\n app.get('/api/learning/stats', (_req, res) => {\n res.json(getLearningStats());\n });\n\n // Live log tail endpoint\n app.get('/api/logs', (req, res) => {\n try {\n const logPath = getLogFilePath();\n if (!logPath || !fs.existsSync(logPath)) {\n res.json({ lines: [] });\n return;\n }\n const lineCount = req.query.lines ? parseInt(req.query.lines as string, 10) : 200;\n // Read only the last portion of the file\n const stats = fs.statSync(logPath);\n const readSize = Math.min(stats.size, 100000); // Read last 100KB max\n const fd = fs.openSync(logPath, 'r');\n const buf = Buffer.alloc(readSize);\n fs.readSync(fd, buf, 0, readSize, Math.max(0, stats.size - readSize));\n fs.closeSync(fd);\n const content = buf.toString('utf-8');\n const all = content.split('\\n').filter(Boolean);\n // If we started mid-line, drop the first partial line\n const lines = stats.size > readSize ? all.slice(1) : all;\n const tail = lines.slice(-Math.max(1, lineCount));\n // S6: Sanitize logs — strip potential secrets before returning\n const sanitized = tail.map(line =>\n line\n .replace(/Authorization:\\s*Bearer\\s+\\S+/gi, 'Authorization: Bearer [REDACTED]')\n .replace(/token[=:]\\s*[\"']?\\w{20,}[\"']?/gi, 'token=[REDACTED]')\n .replace(/api[_-]?key[=:]\\s*[\"']?\\w{10,}[\"']?/gi, 'api_key=[REDACTED]')\n .replace(/password[=:]\\s*[\"']?[^\\s\"',]+[\"']?/gi, 'password=[REDACTED]')\n .replace(/secret[=:]\\s*[\"']?\\w{10,}[\"']?/gi, 'secret=[REDACTED]')\n );\n res.json({ lines: sanitized });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Mesh Networking Endpoints ─────────────────────────────────\n app.get('/api/mesh/hello', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.json({ titan: false, enabled: false }); return; }\n const { getOrCreateNodeId } = await import('../mesh/identity.js');\n const { getActiveRemoteTaskCount } = await import('../mesh/transport.js');\n const { discoverAllModels: discoverModels } = await import('../providers/router.js');\n const models = await discoverModels();\n const { listAgents: meshListAgents } = await import('../agent/multiAgent.js');\n const cpuLoad = getCpuLoad();\n const activeTasks = getActiveRemoteTaskCount();\n // Load score: 0.0 (idle) to 1.0 (maxed). Blend CPU + task saturation.\n const taskLoad = activeTasks / Math.max(cfg.mesh.maxRemoteTasks, 1);\n const load = Math.min(1, cpuLoad * 0.4 + taskLoad * 0.6);\n res.json({\n titan: true,\n nodeId: getOrCreateNodeId(),\n version: TITAN_VERSION,\n models: models.map(m => m.id),\n agentCount: meshListAgents().length,\n load: Math.round(load * 100) / 100,\n });\n });\n\n app.get('/api/mesh/peers', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.json({ peers: [], enabled: false }); return; }\n const { getPeers } = await import('../mesh/discovery.js');\n res.json({ peers: getPeers(), enabled: true });\n });\n\n app.get('/api/mesh/models', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.json({ models: [] }); return; }\n const { getMeshModels } = await import('../mesh/registry.js');\n res.json({ models: getMeshModels() });\n });\n\n app.get('/api/mesh/pending', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.json({ pending: [], enabled: false }); return; }\n const { getPendingPeers } = await import('../mesh/discovery.js');\n res.json({ pending: getPendingPeers(), enabled: true });\n });\n\n app.post('/api/mesh/approve/:nodeId', async (req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.status(400).json({ error: 'Mesh not enabled' }); return; }\n const { approvePeer } = await import('../mesh/discovery.js');\n const peer = approvePeer(req.params.nodeId);\n if (peer) {\n broadcast({ type: 'mesh_peer_approved', peer });\n res.json({ approved: true, peer });\n } else {\n res.status(404).json({ error: 'Peer not found in pending list or at max capacity' });\n }\n });\n\n app.post('/api/mesh/reject/:nodeId', async (req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.status(400).json({ error: 'Mesh not enabled' }); return; }\n const { rejectPeer } = await import('../mesh/discovery.js');\n const rejected = rejectPeer(req.params.nodeId);\n res.json({ rejected });\n });\n\n app.post('/api/mesh/revoke/:nodeId', async (req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.status(400).json({ error: 'Mesh not enabled' }); return; }\n const { revokePeer } = await import('../mesh/discovery.js');\n const revoked = revokePeer(req.params.nodeId);\n if (revoked) {\n broadcast({ type: 'mesh_peer_revoked', nodeId: req.params.nodeId });\n }\n res.json({ revoked });\n });\n\n // ── Mesh Health / Status Endpoint ─────────────────────────────\n app.get('/api/mesh/status', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.json({ enabled: false, status: 'disabled' }); return; }\n\n const { getOrCreateNodeId } = await import('../mesh/identity.js');\n const { getPeers, getPendingPeers } = await import('../mesh/discovery.js');\n const { getConnectedPeerCount } = await import('../mesh/transport.js');\n const { getOrCreateNodeId: localNodeId } = await import('../mesh/identity.js');\n\n const nodeId = getOrCreateNodeId();\n const approvedPeers = getPeers();\n const pendingPeers = getPendingPeers();\n const connectedCount = getConnectedPeerCount();\n const connectedPeerIds = new Set<string>();\n\n // Collect per-peer connection detail from approved list + transport\n const peerDetails = approvedPeers.map(p => {\n const isConnected = p.lastSeen > Date.now() - 10_000; // Consider connected if seen in last 10s\n if (isConnected) connectedPeerIds.add(p.nodeId);\n return {\n nodeId: p.nodeId,\n hostname: p.hostname,\n address: p.address,\n port: p.port,\n discoveredVia: p.discoveredVia,\n lastSeen: p.lastSeen,\n models: p.models,\n agentCount: p.agentCount,\n load: p.load,\n isConnected,\n };\n });\n\n // Composite health score\n const totalApproved = approvedPeers.length;\n const unreachableCount = totalApproved - connectedCount;\n const healthScore = totalApproved > 0\n ? Math.round(((totalApproved - unreachableCount) / totalApproved) * 100) / 100\n : 1.0;\n\n // Discovery mode detection\n const discoveryModes: string[] = [];\n if (cfg.mesh.mdns) discoveryModes.push('mdns');\n if (cfg.mesh.tailscale) discoveryModes.push('tailscale');\n if ((cfg.mesh.staticPeers || []).length > 0) discoveryModes.push('manual');\n\n const status = unreachableCount === 0 && totalApproved > 0\n ? 'healthy'\n : unreachableCount > 0 && connectedCount > 0\n ? 'degraded'\n : totalApproved === 0\n ? 'empty'\n : 'unreachable';\n\n res.json({\n enabled: true,\n status,\n nodeId,\n discoveryModes,\n peers: {\n total: totalApproved,\n connected: connectedCount,\n unreachable: unreachableCount,\n pending: pendingPeers.length,\n },\n peerDetails,\n healthScore,\n maxPeers: cfg.mesh.maxPeers,\n autoApprove: cfg.mesh.autoApprove,\n });\n });\n\n // ── Mesh Routes Endpoint ───────────────────────────────────────\n app.get('/api/mesh/routes', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.json({ enabled: false, routes: [] }); return; }\n const { getRoutingTable } = await import('../mesh/transport.js');\n res.json({ routes: getRoutingTable() });\n });\n\n // ── Teams RBAC API ─────────────────────────────────────────────\n\n app.get('/api/teams', (_req, res) => {\n res.json({ teams: listTeams().map(t => ({ id: t.id, name: t.name, description: t.description, memberCount: t.members.filter(m => m.status === 'active').length, createdAt: t.createdAt })) });\n });\n\n app.post('/api/teams', (req, res) => {\n try {\n const { name, description, ownerId = 'api-user' } = req.body;\n if (!name) { res.status(400).json({ error: 'name is required' }); return; }\n const team = createTeam(name, ownerId, description);\n res.status(201).json({ team: { id: team.id, name: team.name } });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.get('/api/teams/:teamId', (req, res) => {\n const team = getTeam(req.params.teamId);\n if (!team) { res.status(404).json({ error: 'Team not found' }); return; }\n res.json({ team, stats: getTeamStats(req.params.teamId) });\n });\n\n app.patch('/api/teams/:teamId', (req, res) => {\n try {\n const { name, description, actorId = 'api-user' } = req.body;\n const team = updateTeam(req.params.teamId, actorId, { name, description });\n res.json({ team: { id: team.id, name: team.name, description: team.description } });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.delete('/api/teams/:teamId', (req, res) => {\n try {\n const actorId = (req.query.actorId as string) || 'api-user';\n const deleted = deleteTeam(req.params.teamId, actorId);\n res.json({ deleted });\n } catch (e) { res.status(403).json({ error: (e as Error).message }); }\n });\n\n app.get('/api/teams/:teamId/members', (req, res) => {\n const team = getTeam(req.params.teamId);\n if (!team) { res.status(404).json({ error: 'Team not found' }); return; }\n res.json({ members: team.members });\n });\n\n app.post('/api/teams/:teamId/members', (req, res) => {\n try {\n const { userId, role = 'operator', displayName, actorId = 'api-user' } = req.body;\n if (!userId) { res.status(400).json({ error: 'userId is required' }); return; }\n const member = addMember(req.params.teamId, actorId, userId, role, displayName);\n res.status(201).json({ member });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.delete('/api/teams/:teamId/members/:userId', (req, res) => {\n try {\n const actorId = (req.query.actorId as string) || 'api-user';\n const removed = removeMember(req.params.teamId, actorId, req.params.userId);\n res.json({ removed });\n } catch (e) { res.status(403).json({ error: (e as Error).message }); }\n });\n\n app.patch('/api/teams/:teamId/members/:userId/role', (req, res) => {\n try {\n const { role, actorId = 'api-user' } = req.body;\n if (!role) { res.status(400).json({ error: 'role is required' }); return; }\n const member = updateMemberRole(req.params.teamId, actorId, req.params.userId, role);\n res.json({ member });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.post('/api/teams/:teamId/invites', (req, res) => {\n try {\n const { role = 'operator', expiresInHours = 48, actorId = 'api-user' } = req.body;\n const code = createInvite(req.params.teamId, actorId, role, expiresInHours);\n res.status(201).json({ code, expiresInHours });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.post('/api/teams/join', (req, res) => {\n try {\n const { code, userId, displayName } = req.body;\n if (!code || !userId) { res.status(400).json({ error: 'code and userId are required' }); return; }\n const result = acceptInvite(code, userId, displayName);\n res.json({ teamId: result.team.id, teamName: result.team.name, role: result.member.role });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.get('/api/teams/:teamId/permissions/:userId', (req, res) => {\n const perms = getEffectivePermissions(req.params.teamId, req.params.userId);\n const role = getUserRole(req.params.teamId, req.params.userId);\n res.json({ role, permissions: perms });\n });\n\n app.put('/api/teams/:teamId/roles/:role/permissions', (req, res) => {\n try {\n const { actorId = 'api-user', ...perms } = req.body;\n setRolePermissions(req.params.teamId, actorId, req.params.role as 'admin' | 'operator' | 'viewer', perms);\n res.json({ updated: true });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.get('/api/teams/:teamId/tools/:toolName/check/:userId', (req, res) => {\n const allowed = isToolAllowed(req.params.teamId, req.params.userId, req.params.toolName);\n res.json({ allowed, tool: req.params.toolName, userId: req.params.userId });\n });\n\n // ── Recipes / Workflow API ──────────────────────────────────────\n\n app.get('/api/recipes', (_req, res) => {\n res.json({ recipes: listRecipes() });\n });\n\n app.get('/api/recipes/:id', (req, res) => {\n const recipe = getRecipe(req.params.id);\n if (!recipe) { res.status(404).json({ error: 'Recipe not found' }); return; }\n res.json({ recipe });\n });\n\n app.post('/api/recipes', (req, res) => {\n const recipe = req.body;\n if (!recipe.id || !recipe.name || !recipe.steps) {\n res.status(400).json({ error: 'id, name, and steps are required' }); return;\n }\n if (!recipe.createdAt) recipe.createdAt = new Date().toISOString();\n saveRecipe(recipe);\n res.status(201).json({ recipe });\n });\n\n app.put('/api/recipes/:id', (req, res) => {\n const existing = getRecipe(req.params.id);\n if (!existing) { res.status(404).json({ error: 'Recipe not found' }); return; }\n const updated = { ...existing, ...req.body, id: req.params.id };\n saveRecipe(updated);\n res.json({ recipe: updated });\n });\n\n app.delete('/api/recipes/:id', (req, res) => {\n if (!getRecipe(req.params.id)) { res.status(404).json({ error: 'Recipe not found' }); return; }\n deleteRecipe(req.params.id);\n res.json({ deleted: true });\n });\n\n app.get('/api/recipes/builtin/templates', (_req, res) => {\n res.json({ templates: getBuiltinRecipes() });\n });\n\n app.post('/api/recipes/import', express.text({ type: 'text/*' }), (req, res) => {\n try {\n const recipe = importRecipeYaml(req.body);\n saveRecipe(recipe);\n res.status(201).json({ recipe });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n // ── Plugins API ────────────────────────────────────────────────\n app.get('/api/plugins', async (_req, res) => {\n const { getPlugins } = await import('../plugins/registry.js');\n const plugins = getPlugins().map((p: { name: string; version: string }) => ({\n name: p.name,\n version: p.version,\n }));\n res.json({ plugins });\n });\n\n // Native Memory Graph endpoint (replaces Neo4j/Graphiti)\n app.get('/api/graphiti', (_req, res) => {\n try {\n const { nodes, edges } = getGraphData();\n const { episodeCount } = getGraphStats();\n res.json({\n graphReady: true,\n episodeCount,\n nodeCount: nodes.length,\n edgeCount: edges.length,\n nodes,\n edges,\n });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/graph/entities', (req, res) => {\n try {\n const q = (req.query.q as string) || '';\n const type = (req.query.type as string) || undefined;\n const entities = listEntities(type);\n const filtered = q\n ? entities.filter(e => e.name.toLowerCase().includes(q.toLowerCase()) || (e.type || '').toLowerCase().includes(q.toLowerCase()))\n : entities;\n res.json(filtered);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // Clear memory graph\n app.delete('/api/graphiti', (_req, res) => {\n try {\n clearGraph();\n logger.info(COMPONENT, 'Memory graph cleared via API');\n res.json({ success: true, message: 'Graph cleared' });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/graphiti/cleanup', (_req, res) => {\n try {\n const result = cleanupGraph();\n logger.info(COMPONENT, `Graph cleanup: removed ${result.removedEntities} entities, ${result.removedEdges} edges`);\n res.json({ success: true, ...result });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // Memory Wiki API — browseable knowledge base\n app.get('/api/wiki/entities', (req, res) => {\n try {\n const type = req.query.type as string | undefined;\n const q = req.query.q as string | undefined;\n let entities = listEntities(type || undefined);\n if (q) {\n const query = q.toLowerCase();\n entities = entities.filter(e =>\n e.name.toLowerCase().includes(query) ||\n e.facts.some(f => f.toLowerCase().includes(query)) ||\n (e.summary || '').toLowerCase().includes(query)\n );\n }\n res.json(entities.map(e => ({\n id: e.id,\n name: e.name,\n type: e.type,\n summary: e.summary,\n factCount: e.facts.length,\n aliases: e.aliases,\n firstSeen: e.firstSeen,\n lastSeen: e.lastSeen,\n })));\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/wiki/entity/:name', (req, res) => {\n try {\n const entity = getEntity(decodeURIComponent(req.params.name));\n if (!entity) { res.status(404).json({ error: 'Entity not found' }); return; }\n // Get related entities via edges\n const graphData = getGraphData();\n const relatedEdges = graphData.edges.filter(e => e.from === entity.id || e.to === entity.id);\n const relatedIds = new Set(relatedEdges.map(e => e.from === entity.id ? e.to : e.from));\n const related = graphData.nodes.filter(n => relatedIds.has(n.id)).map(n => ({\n id: n.id,\n name: n.label,\n type: n.type,\n relation: relatedEdges.find(e => (e.from === entity.id && e.to === n.id) || (e.to === entity.id && e.from === n.id))?.label || 'co_mentioned',\n }));\n // Get episodes\n const episodes = getEntityEpisodes(entity.id, 20).map(ep => ({\n id: ep.id,\n content: ep.content.slice(0, 300),\n source: ep.source,\n createdAt: ep.createdAt,\n }));\n res.json({ ...entity, related, episodes });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // Agent Templates (marketplace)\n app.get('/api/agent-templates', async (_req, res) => {\n try {\n const { listTemplates, BUILTIN_TEMPLATES } = await import('../skills/agentTemplates.js');\n const installed = listTemplates();\n res.json({ builtin: BUILTIN_TEMPLATES, installed });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/agent-templates', async (req, res) => {\n try {\n const { saveTemplate } = await import('../skills/agentTemplates.js');\n saveTemplate(req.body);\n res.json({ success: true });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // Training data (RL trajectory capture)\n app.get('/api/training/stats', async (_req, res) => {\n try {\n const { getTrainingStats } = await import('../agent/trajectoryCapture.js');\n res.json(getTrainingStats());\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/training/export', async (_req, res) => {\n try {\n const { exportTrainingData } = await import('../agent/trajectoryCapture.js');\n res.setHeader('Content-Type', 'application/jsonl');\n res.setHeader('Content-Disposition', 'attachment; filename=\"titan-training-data.jsonl\"');\n res.send(exportTrainingData());\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // Dreaming memory (sleep-cycle consolidation)\n app.get('/api/dreaming/status', async (_req, res) => {\n try {\n const { getDreamingStatus } = await import('../memory/dreaming.js');\n res.json(getDreamingStatus());\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/dreaming/run', async (_req, res) => {\n try {\n const { runConsolidation } = await import('../memory/dreaming.js');\n const result = await runConsolidation();\n res.json({ success: true, ...result });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/dreaming/history', async (_req, res) => {\n try {\n const { getConsolidationHistory } = await import('../memory/dreaming.js');\n res.json(getConsolidationHistory());\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // Backup system\n app.post('/api/backup/create', async (_req, res) => {\n try {\n const { createBackup } = await import('../storage/backup.js');\n const info = await createBackup();\n res.json({ success: true, ...info });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/backup/list', async (_req, res) => {\n try {\n const { listBackups } = await import('../storage/backup.js');\n res.json({ backups: listBackups() });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/backup/verify', async (req, res) => {\n try {\n const { verifyBackup, listBackups } = await import('../storage/backup.js');\n const path = req.body?.path || listBackups()[0]?.path;\n if (!path) { res.status(400).json({ error: 'No backup path specified and no backups found' }); return; }\n const result = await verifyBackup(path);\n res.json(result);\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // Full data reset (graph + knowledge + titan-data)\n app.delete('/api/data', (_req, res) => {\n try {\n const titanHome = join(homedir(), '.titan');\n const files = ['graph.json', 'knowledge.json', 'titan-data.json'];\n const deleted: string[] = [];\n for (const f of files) {\n const p = join(titanHome, f);\n if (fs.existsSync(p)) {\n fs.unlinkSync(p);\n deleted.push(f);\n }\n }\n clearGraph();\n logger.info(COMPONENT, `Full data reset via API: deleted ${deleted.join(', ') || 'none'}`);\n res.json({ success: true, message: `Deleted: ${deleted.join(', ') || 'none'}. Restart recommended.` });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Autopilot ───────────────────────────────────────────────\n app.get('/api/autopilot/status', (_req, res) => {\n res.json(getAutopilotStatus());\n });\n\n app.get('/api/autopilot/history', (req, res) => {\n const limit = parseInt(req.query.limit as string, 10) || 30;\n res.json(getRunHistory(limit));\n });\n\n app.post('/api/autopilot/run', async (req, res) => {\n try {\n const dryRun = typeof req.body?.dryRun === 'boolean' ? req.body.dryRun : undefined;\n const result = await runAutopilotNow({ dryRun });\n res.json(result);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/autopilot/toggle', (req, res) => {\n try {\n const cfg = loadConfig();\n const enable = typeof req.body.enabled === 'boolean' ? req.body.enabled : !cfg.autopilot.enabled;\n const dryRun = typeof req.body.dryRun === 'boolean' ? req.body.dryRun : undefined;\n\n cfg.autopilot.enabled = enable;\n if (typeof dryRun === 'boolean') {\n (cfg.autopilot as Record<string, unknown>).dryRun = dryRun;\n setAutopilotDryRun(dryRun);\n }\n\n if (enable) {\n initAutopilot(cfg);\n } else {\n stopAutopilot();\n }\n const status = getAutopilotStatus();\n res.json({ enabled: enable, dryRun: status.dryRun });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Goals API ─────────────────────────────────────────────\n\n app.get('/api/goals', (_req, res) => {\n res.json({ goals: listGoals() });\n });\n\n app.post('/api/goals', (req, res) => {\n const { title, description, subtasks, priority, tags, force } = req.body;\n if (!title) { res.status(400).json({ error: 'title is required' }); return; }\n try {\n const goal = createGoal({\n title,\n description: description || '',\n subtasks: subtasks || [],\n priority,\n tags,\n force: !!force,\n });\n res.status(201).json({ goal });\n } catch (err) {\n res.status(429).json({ error: (err as Error).message });\n }\n });\n\n // Alias for Command Post UI compatibility\n app.post('/api/command-post/goals', (req, res) => {\n const { title, description, subtasks, priority, tags, force } = req.body;\n if (!title) { res.status(400).json({ error: 'title is required' }); return; }\n try {\n const goal = createGoal({\n title,\n description: description || '',\n subtasks: subtasks || [],\n priority,\n tags,\n force: !!force,\n });\n res.status(201).json({ goal });\n } catch (err) {\n res.status(429).json({ error: (err as Error).message });\n }\n });\n\n // v5.0.0: Bulk dedupe endpoint for cleaning up runaway duplicate goals\n app.post('/api/goals/dedupe', (_req, res) => {\n const result = dedupeGoalsBulk();\n res.status(200).json({ success: true, ...result });\n });\n\n app.get('/api/goals/:id', (req, res) => {\n const goal = getGoal(req.params.id);\n if (!goal) { res.status(404).json({ error: 'Goal not found' }); return; }\n res.json({ goal });\n });\n\n app.delete('/api/goals/:id', (req, res) => {\n const deleted = deleteGoal(req.params.id);\n if (!deleted) { res.status(404).json({ error: 'Goal not found' }); return; }\n res.json({ deleted: true });\n });\n\n // v4.3.1: update a goal's top-level fields (status, priority, title, description, etc.).\n // Previously the only way to pause a stuck goal was to hand-edit ~/.titan/goals.json and\n // restart the gateway — which is what we did on Titan PC to clear 3 failed Upwork goals.\n // This endpoint closes that gap so the UI \"pause\" action works end-to-end.\n app.patch('/api/goals/:id', (req, res) => {\n const updated = updateGoal(req.params.id, req.body || {});\n if (!updated) { res.status(404).json({ error: 'Goal not found' }); return; }\n res.json({ goal: updated });\n });\n\n app.post('/api/goals/:id/subtasks', (req, res) => {\n const { title, description } = req.body;\n if (!title) { res.status(400).json({ error: 'title is required' }); return; }\n const subtask = addSubtask(req.params.id, title, description || '');\n if (!subtask) { res.status(404).json({ error: 'Goal not found' }); return; }\n res.status(201).json({ subtask });\n });\n\n app.post('/api/goals/:id/subtasks/:sid/complete', (req, res) => {\n const ok = completeSubtask(req.params.id, req.params.sid, req.body.result || 'Completed via UI');\n if (!ok) { res.status(404).json({ error: 'Goal or subtask not found' }); return; }\n res.json({ completed: true });\n });\n\n // v4.1: retry a failed subtask — resets status, clears error, zeros retries.\n app.post('/api/goals/:id/subtasks/:sid/retry', async (req, res) => {\n const { retrySubtask } = await import('../agent/goals.js');\n const ok = retrySubtask(req.params.id, req.params.sid);\n if (!ok) { res.status(404).json({ error: 'Goal or subtask not found' }); return; }\n res.json({ retried: true });\n });\n\n // v4.1: edit a subtask's title/description.\n app.patch('/api/goals/:id/subtasks/:sid', async (req, res) => {\n const { updateSubtask } = await import('../agent/goals.js');\n const { title, description } = req.body || {};\n const ok = updateSubtask(req.params.id, req.params.sid, { title, description });\n if (!ok) { res.status(404).json({ error: 'Goal or subtask not found' }); return; }\n res.json({ updated: true });\n });\n\n // ── Daemon API ────────────────────────────────────────────\n\n app.get('/api/daemon/status', (_req, res) => {\n res.json(getDaemonStatus());\n });\n\n app.post('/api/daemon/stop', (_req, res) => {\n pauseDaemonManual();\n res.json({ paused: true });\n });\n\n app.post('/api/daemon/resume', (_req, res) => {\n resumeDaemon();\n res.json({ resumed: true });\n });\n\n app.get('/api/daemon/stream', (req, res) => {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n\n const onEvent = (event: string, data: unknown) => {\n try { res.write(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`); } catch { /* client gone */ }\n };\n\n const events = DAEMON_SSE_EVENTS;\n\n // Store per-client listener references so we only remove THIS client's listeners on disconnect\n const listeners = new Map<string, (data: unknown) => void>();\n for (const evt of events) {\n const handler = (data: unknown) => onEvent(evt, data);\n listeners.set(evt, handler);\n titanEvents.on(evt, handler);\n }\n\n const keepalive = setInterval(() => {\n try { res.write(': keepalive\\n\\n'); } catch { /* client gone */ }\n }, 15_000);\n\n req.on('close', () => {\n clearInterval(keepalive);\n for (const [evt, handler] of listeners) {\n titanEvents.removeListener(evt, handler);\n }\n });\n });\n\n // ── Social Media API ──────────────────────────────────────\n\n app.get('/api/social/state', async (_req, res) => {\n try {\n const { loadConfig } = await import('../config/config.js');\n const { loadState, resetDailyCounters, CONTENT_ROTATION } = await import('../skills/builtin/fb_autopilot.js');\n const { loadQueue } = await import('../skills/builtin/facebook.js');\n const { getEpisodesBySource } = await import('../memory/graph.js');\n const config = loadConfig();\n const fbConfig = (config as Record<string, unknown>).facebook as Record<string, unknown> | undefined;\n const state = loadState();\n resetDailyCounters(state);\n const queue = loadQueue();\n const pending = queue.posts.filter(p => p.status === 'pending');\n // Enrich recentPosts with Graphiti content when state file lacks it\n const graphPosts = getEpisodesBySource(['facebook_post', 'facebook_autopilot'], 20);\n const recentPosts = state.postHistory.slice(-20).reverse().map(h => {\n if (h.content) return h;\n // Try to find matching content in Graphiti by date proximity\n const match = graphPosts.find(g => g.createdAt.slice(0, 16) === h.date.slice(0, 16));\n return { ...h, content: match ? match.content : undefined };\n });\n res.json({\n autopilot: {\n enabled: fbConfig?.autopilotEnabled !== false,\n postsToday: state.postsToday,\n maxPostsPerDay: Number(fbConfig?.maxPostsPerDay ?? 6),\n repliesToday: state.repliesToday,\n lastPostAt: state.lastPostAt,\n nextContentType: CONTENT_ROTATION[state.contentIndex % CONTENT_ROTATION.length],\n },\n queue: pending,\n recentPosts,\n });\n } catch (e) {\n logger.error(COMPONENT, `Social state error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Failed to load social state' });\n }\n });\n\n app.post('/api/social/autopilot/toggle', async (req, res) => {\n try {\n const { loadConfig, updateConfig } = await import('../config/config.js');\n const config = loadConfig();\n const enabled = !!(req.body as Record<string, unknown>).enabled;\n const fb = { ...((config as Record<string, unknown>).facebook as Record<string, unknown> || {}), autopilotEnabled: enabled } as Record<string, unknown>;\n updateConfig({ facebook: fb } as Partial<typeof config>);\n res.json({ enabled });\n } catch (e) {\n logger.error(COMPONENT, `Social toggle error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Failed to toggle autopilot' });\n }\n });\n\n app.post('/api/social/post', async (req, res) => {\n try {\n const { postToPage } = await import('../skills/builtin/facebook.js');\n const content = String((req.body as Record<string, unknown>).content || '');\n if (!content || content.length < 5) { res.status(400).json({ error: 'Content too short' }); return; }\n const result = await postToPage(content, { source: 'manual:api' });\n if (result.success) {\n res.json({ success: true, postId: result.postId });\n } else if (result.skipped) {\n res.status(409).json({ success: false, skipped: result.skipped });\n } else {\n res.status(500).json({ success: false, error: result.error });\n }\n } catch (e) {\n logger.error(COMPONENT, `Social post error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Failed to post' });\n }\n });\n\n app.post('/api/social/drafts/:id/approve', async (req, res) => {\n try {\n const { loadQueue, saveQueue, postToPage, hasApiAccess } = await import('../skills/builtin/facebook.js') as any;\n const queue = loadQueue();\n const post = queue.posts.find((p: { id: string }) => p.id === req.params.id);\n if (!post) { res.status(404).json({ error: 'Draft not found' }); return; }\n if (post.status !== 'pending') { res.status(409).json({ error: `Already ${post.status}` }); return; }\n if (hasApiAccess()) {\n const result = await postToPage(post.content, { source: 'queue:approved' });\n if (result.success) {\n post.status = 'posted';\n post.postedAt = new Date().toISOString();\n post.fbPostId = result.postId;\n } else {\n res.status(500).json({ error: result.error || 'Post failed' });\n return;\n }\n } else {\n post.status = 'approved';\n }\n saveQueue(queue);\n res.json({ success: true, status: post.status, postId: post.fbPostId });\n } catch (e) {\n logger.error(COMPONENT, `Draft approve error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Failed to approve draft' });\n }\n });\n\n app.post('/api/social/drafts/:id/reject', async (req, res) => {\n try {\n const { loadQueue, saveQueue } = await import('../skills/builtin/facebook.js');\n const queue = loadQueue();\n const post = queue.posts.find(p => p.id === req.params.id);\n if (!post) { res.status(404).json({ error: 'Draft not found' }); return; }\n post.status = 'rejected';\n saveQueue(queue);\n res.json({ success: true });\n } catch (e) {\n logger.error(COMPONENT, `Draft reject error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Failed to reject draft' });\n }\n });\n\n app.get('/api/social/graph-context', async (_req, res) => {\n try {\n const { getEpisodesBySource } = await import('../memory/graph.js');\n const recentPosts = getEpisodesBySource(['facebook_post', 'facebook_autopilot'], 5);\n const topics = recentPosts.map(ep => ({\n content: ep.content.slice(0, 200),\n date: ep.createdAt,\n entities: ep.entities,\n }));\n res.json({ recentTopics: topics });\n } catch (e) {\n logger.error(COMPONENT, `Social graph context error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Failed to load graph context' });\n }\n });\n\n // ── Watch stream — unified human-readable event firehose (v4.5.0)\n // Fuses every meaningful event across TITAN into a single SSE feed\n // with plain-English captions. Used by the /watch Pane UI.\n app.get('/api/watch/stream', async (req, res) => {\n const { humanize } = await import('../watch/humanize.js');\n\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n\n // Every event topic the Pane cares about — union of drive ticks,\n // soma proposals, tool calls, goals, initiative, command-post, health,\n // multi-agent, alerts. Matches src/watch/humanize.ts dictionary.\n const topics = PANE_SSE_TOPICS;\n\n const send = (data: unknown) => {\n try { res.write(`data: ${JSON.stringify(data)}\\n\\n`); } catch { /* client gone */ }\n };\n\n // Initial snapshot — read drive state + recent goals so the UI has\n // something to render before the first live event arrives.\n try {\n const driveStatePath = join(homedir(), '.titan', 'drive-state.json');\n if (fs.existsSync(driveStatePath)) {\n const raw = JSON.parse(fs.readFileSync(driveStatePath, 'utf-8'));\n const latest = raw.latest as { timestamp?: string; drives?: unknown[]; totalPressure?: number; dominantDrives?: string[] } | undefined;\n if (latest) {\n send({\n type: 'snapshot',\n drives: latest.drives || [],\n totalPressure: latest.totalPressure || 0,\n dominantDrives: latest.dominantDrives || [],\n timestamp: latest.timestamp ? new Date(latest.timestamp).getTime() : Date.now(),\n });\n }\n }\n } catch { /* snapshot best-effort */ }\n\n // Wire live event listeners\n const listeners = new Map<string, (data: unknown) => void>();\n for (const topic of topics) {\n const handler = (payload: unknown) => {\n const event = humanize(topic, (payload as Record<string, unknown>) || {});\n if (event) send({ type: \"event\", ...event });\n };\n listeners.set(topic, handler);\n titanEvents.on(topic, handler);\n }\n\n const keepalive = setInterval(() => {\n try { res.write(': keepalive\\n\\n'); } catch { /* gone */ }\n }, 15_000);\n\n req.on('close', () => {\n clearInterval(keepalive);\n for (const [topic, handler] of listeners) {\n titanEvents.removeListener(topic, handler);\n }\n });\n });\n\n // Snapshot endpoint — returns current drive state + active goal +\n // last N events from a small ring buffer we maintain in-process.\n // Used by the Pane on first load to populate zones without waiting\n // for the next tick.\n app.get('/api/watch/snapshot', (_req, res) => {\n try {\n const driveStatePath = join(homedir(), '.titan', 'drive-state.json');\n const goalsPath = join(homedir(), '.titan', 'goals.json');\n const driveState = fs.existsSync(driveStatePath)\n ? JSON.parse(fs.readFileSync(driveStatePath, 'utf-8'))?.latest\n : null;\n const goalsRaw = fs.existsSync(goalsPath)\n ? JSON.parse(fs.readFileSync(goalsPath, 'utf-8'))\n : {};\n const allGoals = Array.isArray(goalsRaw) ? goalsRaw : Object.values(goalsRaw);\n const activeGoals = (allGoals as Array<Record<string, unknown>>).filter(g => g.status === 'active');\n res.json({\n drives: driveState?.drives || [],\n totalPressure: driveState?.totalPressure || 0,\n dominantDrives: driveState?.dominantDrives || [],\n activeGoals: activeGoals.slice(0, 5).map(g => ({\n id: g.id,\n title: g.title,\n progress: g.progress || 0,\n createdAt: g.createdAt,\n })),\n timestamp: Date.now(),\n });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Command Post API (Agent Governance) ───────────────────\n\n app.get('/api/command-post/dashboard', async (_req, res) => {\n const dashboard = getCPDashboard();\n // Inject companies into dashboard\n try {\n const { listCompanies, getActiveRunners } = await import('../agent/company.js');\n const companies = listCompanies();\n const runners = getActiveRunners();\n (dashboard as Record<string, unknown>).companies = companies.map(c => ({\n ...c,\n runnerActive: runners.includes(c.id),\n }));\n } catch { (dashboard as Record<string, unknown>).companies = []; }\n res.json(dashboard);\n });\n\n app.get('/api/command-post/agents', (_req, res) => {\n res.json(getRegisteredAgents());\n });\n\n app.post('/api/command-post/agents/:id/heartbeat', (req, res) => {\n const ok = reportHeartbeat(req.params.id);\n res.json({ success: ok });\n });\n\n app.delete('/api/command-post/agents/:id', (req, res) => {\n const ok = removeAgent(req.params.id);\n if (!ok) { res.status(400).json({ error: 'Cannot remove agent (not found or is the primary agent)' }); return; }\n res.json({ success: true });\n });\n\n app.post('/api/command-post/tasks/:goalId/:subtaskId/checkout', (req, res) => {\n const agentId = (req.body as { agentId?: string }).agentId || 'manual';\n const lock = checkoutTask(req.params.goalId, req.params.subtaskId, agentId);\n if (!lock) { res.status(409).json({ error: 'Task already checked out by another agent' }); return; }\n res.json(lock);\n });\n\n app.post('/api/command-post/tasks/:goalId/:subtaskId/checkin', (req, res) => {\n const runId = (req.body as { runId?: string }).runId || '';\n const ok = checkinTask(req.params.subtaskId, runId);\n if (!ok) { res.status(404).json({ error: 'No matching checkout found' }); return; }\n res.json({ success: true });\n });\n\n app.get('/api/command-post/checkouts', (_req, res) => {\n res.json(getActiveCheckouts());\n });\n\n app.get('/api/command-post/budgets', (_req, res) => {\n res.json(getBudgetPolicies());\n });\n\n // Budget reservations stub — frontend expects this endpoint\n app.get('/api/command-post/budgets/reservations', (_req, res) => {\n res.json([]);\n });\n\n app.post('/api/command-post/budgets', (req, res) => {\n try {\n const body = req.body as { name: string; scope: { type: 'agent' | 'goal' | 'global'; targetId?: string }; period: 'daily' | 'weekly' | 'monthly'; limitUsd: number; warningThresholdPercent?: number; action?: 'warn' | 'pause' | 'stop'; enabled?: boolean };\n const policy = createBudgetPolicy({\n name: body.name,\n scope: body.scope,\n period: body.period,\n limitUsd: body.limitUsd,\n warningThresholdPercent: body.warningThresholdPercent ?? 80,\n action: body.action ?? 'pause',\n enabled: body.enabled ?? true,\n });\n res.status(201).json(policy);\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n }\n });\n\n app.put('/api/command-post/budgets/:id', (req, res) => {\n const updated = updateBudgetPolicy(req.params.id, req.body as Record<string, unknown>);\n if (!updated) { res.status(404).json({ error: 'Budget policy not found' }); return; }\n res.json(updated);\n });\n\n app.delete('/api/command-post/budgets/:id', (req, res) => {\n const ok = deleteBudgetPolicy(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Budget policy not found' }); return; }\n res.json({ success: true });\n });\n\n app.get('/api/command-post/activity', (req, res) => {\n const limit = parseInt(req.query.limit as string) || 50;\n const type = req.query.type as string | undefined;\n res.json(getActivity({ limit, type }));\n });\n\n // ── Persistent Audit (Paperclip competitive gap fix) ──\n app.get('/api/command-post/audit', async (req, res) => {\n try {\n const { queryAudit } = await import('../agent/auditStore.js');\n const query = {\n agentId: req.query.agentId as string | undefined,\n sessionId: req.query.sessionId as string | undefined,\n type: req.query.type as string | undefined,\n toolName: req.query.toolName as string | undefined,\n from: req.query.from as string | undefined,\n to: req.query.to as string | undefined,\n limit: req.query.limit ? parseInt(req.query.limit as string) : 100,\n };\n res.json(queryAudit(query));\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/command-post/audit/costs', async (req, res) => {\n try {\n const { getAgentCostSummary, getDailyCostBreakdown } = await import('../agent/auditStore.js');\n const groupBy = req.query.groupBy as string || 'agent';\n if (groupBy === 'day') {\n const days = req.query.days ? parseInt(req.query.days as string) : 30;\n res.json(getDailyCostBreakdown(days));\n } else {\n const agentId = req.query.agentId as string | undefined;\n res.json(getAgentCostSummary(agentId));\n }\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/command-post/goals/tree', (_req, res) => {\n res.json(getGoalTree());\n });\n\n app.get('/api/command-post/goals/:id/ancestry', (req, res) => {\n const chain = getAncestryChain(req.params.id);\n if (chain.length === 0) { res.status(404).json({ error: 'Goal not found' }); return; }\n res.json(chain);\n });\n\n // ── Ancestry Validation ───────────────────────────────\n app.post('/api/command-post/goals/:id/validate', (req, res) => {\n const { parentGoalId } = req.body as { parentGoalId?: string | null };\n if (parentGoalId !== undefined) {\n // Validate potential parent assignment\n const result = validateGoalParentAssignment(req.params.id, parentGoalId || null);\n if (!result.valid) {\n res.status(422).json({ valid: false, errors: result.errors });\n return;\n }\n res.json({ valid: true });\n } else {\n // Validate existing ancestry chain\n const result = validateGoalAncestry(req.params.id);\n if (!result.valid) {\n res.status(422).json({ valid: false, errors: result.errors });\n return;\n }\n res.json({ valid: true });\n }\n });\n\n // ── Checkout Sweep ────────────────────────────────────\n app.post('/api/command-post/checkouts/sweep', (_req, res) => {\n const result = sweepExpiredCheckoutsManual();\n res.json(result);\n });\n\n app.get('/api/command-post/checkouts/expired', (_req, res) => {\n const result = sweepExpiredCheckoutsManual();\n res.json({ expired: result.swept, details: result.details });\n });\n\n // ── Stale Agents ──────────────────────────────────────\n app.get('/api/command-post/agents/stale', (_req, res) => {\n const stale = getStaleAgents();\n res.json({ stale, total: stale.length });\n });\n\n // ── Budget Enforcement per Agent ──────────────────────\n app.post('/api/command-post/budgets/:agentId/enforce', (req, res) => {\n const result = enforceBudgetForAgent(req.params.agentId);\n if (!result.budgetOk) {\n res.status(403).json({ budgetOk: false, policies: result.policies, message: 'Budget exceeded — agent paused' });\n return;\n }\n res.json({ budgetOk: true, policies: result.policies });\n });\n\n app.get('/api/command-post/budgets/agent/:agentId', (req, res) => {\n const budgetInfo = getBudgetPolicyForAgent(req.params.agentId);\n res.json(budgetInfo);\n });\n\n // ── Conflict Resolution ───────────────────────────────\n app.post('/api/command-post/conflicts/propose', async (req, res) => {\n try {\n const { conflictResolver } = await import('../agent/conflictResolver.js');\n const { entities, type, description, metadata } = req.body;\n\n if (!entities || !Array.isArray(entities) || entities.length === 0) {\n res.status(400).json({ error: 'entities array is required' });\n return;\n }\n\n if (!type || !['file', 'goal', 'resource', 'agent', 'config', 'other'].includes(type)) {\n res.status(400).json({ error: 'valid type is required (file, goal, resource, agent, config, other)' });\n return;\n }\n\n if (!description || typeof description !== 'string') {\n res.status(400).json({ error: 'description string is required' });\n return;\n }\n\n const proposal = await conflictResolver.generateProposal({\n entities,\n type,\n description,\n metadata: metadata || {}\n });\n\n res.json(proposal);\n } catch (error) {\n logger.error(COMPONENT, 'Conflict proposal generation error:', error);\n res.status(500).json({ error: 'Failed to generate conflict resolution proposal' });\n }\n });\n\n app.post('/api/command-post/conflicts/propose/formatted', async (req, res) => {\n try {\n const { conflictResolver } = await import('../agent/conflictResolver.js');\n const { entities, type, description, metadata } = req.body;\n\n if (!entities || !Array.isArray(entities) || entities.length === 0) {\n res.status(400).json({ error: 'entities array is required' });\n return;\n }\n\n if (!type || !['file', 'goal', 'resource', 'agent', 'config', 'other'].includes(type)) {\n res.status(400).json({ error: 'valid type is required (file, goal, resource, agent, config, other)' });\n return;\n }\n\n if (!description || typeof description !== 'string') {\n res.status(400).json({ error: 'description string is required' });\n return;\n }\n\n const proposal = await conflictResolver.generateProposal({\n entities,\n type,\n description,\n metadata: metadata || {}\n });\n\n const formatted = conflictResolver.formatProposal(proposal);\n res.type('text/plain').send(formatted);\n } catch (error) {\n logger.error(COMPONENT, 'Conflict proposal formatting error:', error);\n res.status(500).json({ error: 'Failed to format conflict resolution proposal' });\n }\n });\n\n app.get('/api/command-post/conflicts/types', (_req, res) => {\n res.json({\n types: [\n { id: 'file', name: 'File Conflict', description: 'Merge conflicts, version conflicts' },\n { id: 'goal', name: 'Goal Conflict', description: 'Competing or conflicting goals' },\n { id: 'resource', name: 'Resource Conflict', description: 'Resource contention (GPU, memory, etc.)' },\n { id: 'agent', name: 'Agent Conflict', description: 'Agent coordination conflicts' },\n { id: 'config', name: 'Configuration Conflict', description: 'Conflicting configuration values' },\n { id: 'other', name: 'Other', description: 'Unclassified conflict type' }\n ]\n });\n });\n\n // Command Post SSE stream\n app.get('/api/command-post/stream', (req, res) => {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n\n const onEvent = (event: string, data: unknown) => {\n try { res.write(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`); } catch { /* client gone */ }\n };\n\n const cpEvents = CP_SSE_EVENTS;\n\n const listeners = new Map<string, (data: unknown) => void>();\n for (const evt of cpEvents) {\n const handler = (data: unknown) => onEvent(evt, data);\n listeners.set(evt, handler);\n titanEvents.on(evt, handler);\n }\n\n const keepalive = setInterval(() => {\n try { res.write(': keepalive\\n\\n'); } catch { /* client gone */ }\n }, 15_000);\n\n req.on('close', () => {\n clearInterval(keepalive);\n for (const [evt, handler] of listeners) {\n titanEvents.removeListener(evt, handler);\n }\n });\n });\n\n // ── Deliberation Plan Events (SSE) ──────────────────────────\n app.get('/api/deliberation/stream', (req, res) => {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n\n const handler = (data: unknown) => {\n try { res.write(`event: plan\\ndata: ${JSON.stringify(data)}\\n\\n`); } catch { /* client gone */ }\n };\n titanEvents.on('plan:event', handler);\n\n const keepalive = setInterval(() => {\n try { res.write(': keepalive\\n\\n'); } catch { /* client gone */ }\n }, 15_000);\n\n req.on('close', () => {\n clearInterval(keepalive);\n titanEvents.removeListener('plan:event', handler);\n });\n });\n\n // ── Paperclip: Org Chart ──────────────────────────────────\n app.get('/api/command-post/org', async (_req, res) => {\n const org = getOrgTree();\n // Append company agents to org tree\n try {\n const { listCompanies } = await import('../agent/company.js');\n const companies = listCompanies();\n const companyNodes = companies.map(c => ({\n id: c.id,\n name: c.name,\n role: 'Company',\n title: c.description,\n status: c.status,\n model: '',\n reports: c.agents.map(a => ({\n id: a.id,\n name: a.name,\n role: a.role,\n title: a.template,\n status: a.status,\n model: '',\n reports: [],\n })),\n }));\n if (Array.isArray(org)) {\n org.push(...companyNodes);\n } else if (org && typeof org === 'object') {\n (org as Record<string, unknown>).companies = companyNodes;\n }\n } catch { /* non-critical */ }\n res.json(org);\n });\n\n // ── Paperclip: Issues/Tickets ────────────────────────────\n app.get('/api/command-post/issues', (req, res) => {\n const filters = {\n status: req.query.status as string | undefined,\n assigneeAgentId: req.query.assignee as string | undefined,\n goalId: req.query.goalId as string | undefined,\n };\n res.json(listIssues(filters));\n });\n\n app.get('/api/command-post/issues/search', (req, res) => {\n const q = req.query.q as string | undefined;\n if (!q || q.trim().length < 2) {\n res.status(400).json({ error: 'Query must be at least 2 characters' });\n return;\n }\n res.json(searchIssues(q));\n });\n\n app.post('/api/command-post/issues', (req, res) => {\n const { title, description, priority, assigneeAgentId, goalId, parentId } = req.body;\n if (!title) { res.status(400).json({ error: 'title is required' }); return; }\n const issue = createIssue({ title, description, priority, assigneeAgentId, goalId, parentId, createdByUser: 'board' });\n res.status(201).json(issue);\n });\n\n // Issue context stub — frontend expects this endpoint\n app.get('/api/command-post/issues/:id/context', (req, res) => {\n const issue = getIssue(req.params.id);\n if (!issue) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json({ ancestry: issue.goalId || '', issue });\n });\n\n app.get('/api/command-post/issues/:id', (req, res) => {\n const issue = getIssue(req.params.id);\n if (!issue) { res.status(404).json({ error: 'Issue not found' }); return; }\n const issueComments = getIssueComments(req.params.id);\n res.json({ ...issue, comments: issueComments });\n });\n\n app.get('/api/command-post/issues/:id/comments', (req, res) => {\n const issue = getIssue(req.params.id);\n if (!issue) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json(getIssueComments(req.params.id));\n });\n\n app.patch('/api/command-post/issues/:id', (req, res) => {\n const { title, description, status, priority, assigneeAgentId, goalId } = req.body;\n const updated = updateIssue(req.params.id, { title, description, status, priority, assigneeAgentId, goalId });\n if (!updated) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json(updated);\n });\n\n app.delete('/api/command-post/issues/:id', (req, res) => {\n const ok = deleteIssue(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json({ success: true });\n });\n\n app.post('/api/command-post/issues/:id/checkout', (req, res) => {\n const { agentId } = req.body;\n if (!agentId) { res.status(400).json({ error: 'agentId is required' }); return; }\n const result = checkoutIssue(req.params.id, agentId);\n if (!result) { res.status(409).json({ error: 'Issue already checked out by another agent' }); return; }\n res.json(result);\n });\n\n app.post('/api/command-post/issues/:id/comments', (req, res) => {\n const { body: commentBody, agentId } = req.body;\n if (!commentBody) { res.status(400).json({ error: 'body is required' }); return; }\n const comment = addIssueComment(req.params.id, commentBody, { agentId, user: agentId ? undefined : 'board' });\n if (!comment) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.status(201).json(comment);\n });\n\n // ── Paperclip: Approvals ─────────────────────────────────\n app.get('/api/command-post/approvals', (req, res) => {\n const status = req.query.status as string | undefined;\n res.json(listApprovals(status));\n });\n\n app.post('/api/command-post/approvals', (req, res) => {\n const { type, requestedBy, payload, linkedIssueIds } = req.body;\n if (!type) { res.status(400).json({ error: 'type is required' }); return; }\n const approval = createApproval({ type, requestedBy: requestedBy || 'board', payload: payload || {}, linkedIssueIds });\n res.status(201).json(approval);\n });\n\n // v4.13: approval-gated self-restart. Creates a custom approval of\n // kind 'restart_titan' that, when approved via the normal\n // /api/command-post/approvals/:id/approve flow, restarts the service.\n // Audit log records both the request and the approval.\n app.post('/api/system/request-restart', async (req, res) => {\n try {\n const { reason, requestedBy } = (req.body || {}) as { reason?: string; requestedBy?: string };\n if (!reason || typeof reason !== 'string' || reason.trim().length < 3) {\n res.status(400).json({ error: 'reason is required (min 3 chars)' });\n return;\n }\n const { createApproval } = await import('../agent/commandPost.js');\n const approval = createApproval({\n type: 'custom',\n requestedBy: requestedBy || 'api',\n payload: {\n kind: 'restart_titan',\n reason: reason.trim().slice(0, 500),\n requestedAt: new Date().toISOString(),\n severity: 'medium',\n suggestedAction: 'Approve to execute: sudo systemctl restart titan.service',\n },\n linkedIssueIds: [],\n });\n try {\n const { logAudit } = await import('../security/auditLog.js');\n logAudit('security_alert', requestedBy || 'api', {\n action: 'restart_titan_requested',\n approvalId: approval.id,\n reason,\n });\n } catch { /* audit unavailable */ }\n res.json({ ok: true, approval });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/command-post/approvals/:id/approve', async (req, res) => {\n const { decidedBy, note } = req.body;\n const result = await approveApproval(req.params.id, decidedBy || 'board', note);\n if (!result) { res.status(404).json({ error: 'Approval not found or already decided' }); return; }\n res.json(result);\n });\n\n app.post('/api/command-post/approvals/:id/reject', (req, res) => {\n const { decidedBy, note } = req.body;\n const result = rejectApproval(req.params.id, decidedBy || 'board', note);\n if (!result) { res.status(404).json({ error: 'Approval not found or already decided' }); return; }\n res.json(result);\n });\n\n app.post('/api/command-post/approvals/:id/reply', (req, res) => {\n const { author, body } = req.body;\n if (!body || typeof body !== 'string') { res.status(400).json({ error: 'body is required' }); return; }\n const result = replyToApproval(req.params.id, author || 'user', body);\n if (!result) { res.status(404).json({ error: 'Approval not found' }); return; }\n res.json(result);\n });\n\n app.post('/api/command-post/approvals/:id/snooze', (req, res) => {\n const { until } = req.body;\n if (!until) { res.status(400).json({ error: 'until timestamp is required' }); return; }\n const result = snoozeApproval(req.params.id, until);\n if (!result) { res.status(404).json({ error: 'Approval not found or not pending' }); return; }\n res.json(result);\n });\n\n app.post('/api/command-post/approvals/:id/unsnooze', (req, res) => {\n const result = unsnoozeApproval(req.params.id);\n if (!result) { res.status(404).json({ error: 'Approval not found' }); return; }\n res.json(result);\n });\n\n app.get('/api/command-post/approvals/:id/thread', (req, res) => {\n const approval = listApprovals().find(a => a.id === req.params.id);\n if (!approval) { res.status(404).json({ error: 'Approval not found' }); return; }\n res.json({ approvalId: approval.id, thread: approval.thread || [] });\n });\n\n app.post('/api/command-post/approvals/batch', async (req, res) => {\n const { ids, action, decidedBy, note } = req.body;\n if (!Array.isArray(ids) || ids.length === 0) { res.status(400).json({ error: 'ids array required' }); return; }\n if (action === 'approve') {\n const result = await batchApprove(ids, decidedBy || 'board', note);\n res.json(result);\n } else if (action === 'reject') {\n const result = batchReject(ids, decidedBy || 'board', note);\n res.json(result);\n } else {\n res.status(400).json({ error: 'action must be approve or reject' });\n }\n });\n\n app.post('/api/command-post/approvals/sweep', async (_req, res) => {\n const { sweepStaleApprovalsManual } = await import('../agent/commandPost.js');\n const result = sweepStaleApprovalsManual();\n res.json(result);\n });\n\n // ── Agent-to-User Messages ───────────────────────────────\n app.get('/api/command-post/agent-messages', (req, res) => {\n const agentId = req.query.agentId as string | undefined;\n const userId = req.query.userId as string | undefined;\n const unreadOnly = req.query.unread === 'true';\n res.json(getAgentMessages(agentId, userId, unreadOnly));\n });\n\n app.post('/api/command-post/agent-messages/:id/read', (req, res) => {\n const ok = markAgentMessageRead(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Message not found' }); return; }\n res.json({ read: true });\n });\n\n // ── Soma (v4.0): organism state ──────────────────────────\n app.get('/api/soma/state', async (_req, res) => {\n try {\n const cfg = loadConfig() as unknown as { organism?: {\n enabled?: boolean;\n driveSetpoints?: Record<string, number>;\n driveWeights?: Record<string, number>;\n disabledDrives?: string[];\n } };\n const organismEnabled = !!cfg.organism?.enabled;\n if (!organismEnabled) {\n res.json({\n enabled: false,\n message: 'Soma organism layer is disabled. Set organism.enabled: true in titan.json to activate.',\n drives: [],\n hormonal: { available: false, asOf: null, levels: {}, elevated: [], dominant: null },\n });\n return;\n }\n const { runDriveTick } = await import('../organism/drives.js');\n const { buildBlock } = await import('../organism/hormones.js');\n const tick = runDriveTick(\n (cfg.organism?.driveSetpoints as Record<import('../organism/drives.js').DriveId, number>) || {},\n (cfg.organism?.driveWeights as Record<import('../organism/drives.js').DriveId, number>) || {},\n (cfg.organism?.disabledDrives as import('../organism/drives.js').DriveId[]) || [],\n );\n const hormonal = buildBlock(tick.drives, tick.timestamp);\n res.json({\n enabled: true,\n timestamp: tick.timestamp,\n drives: tick.drives,\n totalPressure: tick.totalPressure,\n dominantDrives: tick.dominantDrives,\n hormonal,\n });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/soma/history', async (req, res) => {\n try {\n const { loadDriveHistory } = await import('../organism/drives.js');\n const history = loadDriveHistory();\n if (!history) {\n res.json({ enabled: false, history: [], latest: null });\n return;\n }\n const hoursRaw = req.query.hours ? Number(req.query.hours) : 24;\n const hours = Number.isFinite(hoursRaw) && hoursRaw > 0 && hoursRaw <= 168 ? hoursRaw : 24;\n const cutoff = Date.now() - hours * 3_600_000;\n const trimmed = history.history.filter(h => new Date(h.timestamp).getTime() >= cutoff);\n res.json({ enabled: true, history: trimmed, latest: history.latest });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/soma/setpoints', async (req, res) => {\n try {\n const setpoints = req.body as Record<string, unknown> | undefined;\n if (!setpoints || typeof setpoints !== 'object') {\n res.status(400).json({ error: 'Body must be an object of driveId → setpoint (0-1).' });\n return;\n }\n const validDrives = new Set(['purpose', 'hunger', 'curiosity', 'safety', 'social']);\n const cleaned: Record<string, number> = {};\n for (const [k, v] of Object.entries(setpoints)) {\n if (!validDrives.has(k)) continue;\n const n = Number(v);\n if (!Number.isFinite(n) || n < 0 || n > 1) continue;\n cleaned[k] = n;\n }\n const cfg = loadConfig() as unknown as { organism?: Record<string, unknown> };\n const merged = { ...(cfg.organism || {}), driveSetpoints: cleaned };\n const { updateConfig } = await import('../config/config.js');\n updateConfig({ organism: merged } as Partial<import('../config/schema.js').TitanConfig>);\n res.json({ ok: true, setpoints: cleaned });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // v4.2: per-drive weight override (0.1 – 3.0). Affects pressure fusion.\n app.post('/api/soma/weights', async (req, res) => {\n try {\n const weights = req.body as Record<string, unknown> | undefined;\n if (!weights || typeof weights !== 'object') {\n res.status(400).json({ error: 'Body must be an object of driveId → weight (0.1-3.0).' });\n return;\n }\n const validDrives = new Set(['purpose', 'hunger', 'curiosity', 'safety', 'social']);\n const cleaned: Record<string, number> = {};\n for (const [k, v] of Object.entries(weights)) {\n if (!validDrives.has(k)) continue;\n const n = Number(v);\n if (!Number.isFinite(n) || n < 0.1 || n > 3.0) continue;\n cleaned[k] = n;\n }\n const cfg = loadConfig() as unknown as { organism?: Record<string, unknown> };\n const merged = { ...(cfg.organism || {}), driveWeights: cleaned };\n const { updateConfig } = await import('../config/config.js');\n updateConfig({ organism: merged } as Partial<import('../config/schema.js').TitanConfig>);\n res.json({ ok: true, weights: cleaned });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // v4.2: enable/disable an individual drive without disabling Soma entirely.\n app.post('/api/soma/drives/:id/disable', async (req, res) => {\n try {\n const driveId = req.params.id;\n const validDrives = ['purpose', 'hunger', 'curiosity', 'safety', 'social'];\n if (!validDrives.includes(driveId)) {\n res.status(400).json({ error: `Invalid drive: ${driveId}` });\n return;\n }\n const disabled = req.body?.disabled !== false; // default true\n const cfg = loadConfig() as unknown as { organism?: { disabledDrives?: string[] } };\n const current = cfg.organism?.disabledDrives || [];\n const next = disabled\n ? [...new Set([...current, driveId])]\n : current.filter(d => d !== driveId);\n const { updateConfig } = await import('../config/config.js');\n const merged = { ...(cfg.organism || {}), disabledDrives: next };\n updateConfig({ organism: merged } as Partial<import('../config/schema.js').TitanConfig>);\n res.json({ ok: true, disabledDrives: next });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // v4.2: trigger a debate from the UI (LLM tool also works).\n app.post('/api/command-post/debates', async (req, res) => {\n try {\n const { question, participants, rounds, resolution, judgeModel } = req.body || {};\n if (!question || !Array.isArray(participants) || participants.length < 2) {\n res.status(400).json({ error: 'question + 2-5 participants required' });\n return;\n }\n const { runDebate } = await import('../skills/builtin/agent_debate.js');\n const result = await runDebate({\n question: String(question),\n participants,\n rounds: Math.max(1, Math.min(4, Number(rounds) || 2)),\n resolution: (resolution === 'vote' || resolution === 'synthesize' || resolution === 'judge') ? resolution : 'judge',\n judgeModel: judgeModel ? String(judgeModel) : undefined,\n });\n res.json({ ok: true, id: result.id, winner: result.winner });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── F3: Debates ──────────────────────────────────────────\n app.get('/api/command-post/debates', async (req, res) => {\n const limit = parseInt(req.query.limit as string) || 50;\n const { listDebates } = await import('../skills/builtin/agent_debate.js');\n res.json({ items: listDebates(limit) });\n });\n\n app.get('/api/command-post/debates/:id', async (req, res) => {\n const { getDebate } = await import('../skills/builtin/agent_debate.js');\n const debate = getDebate(req.params.id);\n if (!debate) { res.status(404).json({ error: 'Debate not found' }); return; }\n res.json(debate);\n });\n\n // ── Paperclip: Runs ──────────────────────────────────────\n app.get('/api/command-post/runs', (req, res) => {\n const agentId = req.query.agentId as string | undefined;\n const limit = parseInt(req.query.limit as string) || 50;\n res.json(listRuns(agentId, limit));\n });\n\n // Retry a failed run — creates a new issue and queues a wakeup for the same agent\n app.post('/api/command-post/runs/:id/retry', async (req, res) => {\n const allRuns = listRuns(undefined, 500);\n const run = allRuns.find(r => r.id === req.params.id);\n if (!run) { res.status(404).json({ error: 'Run not found' }); return; }\n\n const agent = getRegisteredAgents().find(a => a.id === run.agentId);\n if (!agent) { res.status(404).json({ error: 'Agent not found' }); return; }\n\n // Build retry task from original context\n let task = `Retry failed run (${run.id})`;\n if (run.error) task += `: ${run.error}`;\n\n // If the run had an issue, reference it\n let issueDesc = task;\n if (run.issueId) {\n const originalIssue = getIssue(run.issueId);\n if (originalIssue) {\n task = `Retry: ${originalIssue.title}`;\n issueDesc = `${originalIssue.description || ''}\\n\\nRetrying after failure: ${run.error || 'unknown error'}`;\n }\n }\n\n const issue = createIssue({\n title: task,\n description: issueDesc,\n priority: 'high',\n assigneeAgentId: agent.id,\n createdByUser: 'board',\n });\n\n const newRun = startRun(agent.id, 'manual', issue.id);\n\n queueWakeup({\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n agentId: agent.id,\n agentName: agent.name,\n parentSessionId: null,\n task,\n templateName: agent.role || 'default',\n });\n\n res.json({ retried: true, runId: newRun.id, issueId: issue.id });\n });\n\n // ── Paperclip: Agent Updates (org chart fields) ──────────\n app.patch('/api/command-post/agents/:id', async (req, res) => {\n const { reportsTo, role, title, name, status, model } = req.body;\n const updated = updateRegisteredAgent(req.params.id, { reportsTo, role, title, name, model });\n if (!updated) { res.status(404).json({ error: 'Agent not found' }); return; }\n // v4.10.0-local polish: also allow status changes via PATCH so the\n // UI + API can pause/resume agents. Valid statuses enforced by the\n // updateAgentStatus impl.\n if (status && typeof status === 'string') {\n try {\n const { updateAgentStatus } = await import('../agent/commandPost.js');\n updateAgentStatus(req.params.id, status as 'active' | 'idle' | 'paused' | 'error' | 'stopped');\n } catch { /* ok */ }\n }\n res.json(updated);\n });\n\n // ── F2: Agent Identity (persistent personality) ──────────\n // Pass a field as `null` to clear it. Fields absent from the body are left\n // untouched. Validation is intentionally lenient — this is an admin\n // surface and malformed data fails at the next LLM call, not here.\n app.patch('/api/command-post/agents/:id/identity', async (req, res) => {\n const { voiceId, personaId, systemPromptOverride, memoryNamespace, characterSummary, model } = req.body || {};\n const coerce = (v: unknown): string | null | undefined => {\n if (v === null) return null;\n if (typeof v === 'string') return v;\n if (v === undefined) return undefined;\n res.status(400).json({ error: `Invalid identity field: expected string or null, got ${typeof v}` });\n return undefined;\n };\n if (res.headersSent) return;\n const { updateAgentIdentity } = await import('../agent/commandPost.js');\n const updated = updateAgentIdentity(req.params.id, {\n voiceId: coerce(voiceId),\n personaId: coerce(personaId),\n systemPromptOverride: coerce(systemPromptOverride),\n memoryNamespace: coerce(memoryNamespace),\n characterSummary: coerce(characterSummary),\n model: coerce(model),\n });\n if (res.headersSent) return;\n if (!updated) { res.status(404).json({ error: 'Agent not found' }); return; }\n res.json(updated);\n });\n\n // ── Wakeup System (async sub-agent delegation) ────────────\n\n app.get('/api/command-post/agents/:agentId/inbox', (req, res) => {\n const items = getAgentInbox(req.params.agentId);\n res.json({ items, total: items.length });\n });\n\n // ── v4.9.0: Safety + Identity endpoints ─────────────────────────\n\n app.get('/api/safety/state', async (_req, res) => {\n try {\n const { getState } = await import('../safety/killSwitch.js');\n res.json(getState());\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/safety/kill', async (req, res) => {\n try {\n const reason = (req.body?.reason as string) || 'manual kill via API';\n const firedBy = (req.body?.firedBy as string) || 'api';\n const { kill } = await import('../safety/killSwitch.js');\n await kill('manual', reason, { firedBy });\n const { getState } = await import('../safety/killSwitch.js');\n res.json(getState());\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/safety/resume', async (req, res) => {\n try {\n const note = (req.body?.note as string) || 'resumed via API (no note)';\n const resumedBy = (req.body?.resumedBy as string) || 'api';\n const { resume } = await import('../safety/killSwitch.js');\n const state = resume(note, resumedBy);\n res.json(state);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── v4.10.0-local (Phase A): Goal Driver API ─────────────────\n // List active drivers (non-terminal phases)\n app.get('/api/drivers', async (_req, res) => {\n try {\n const { listActiveDrivers } = await import('../agent/goalDriver.js');\n const { getSchedulerStats } = await import('../agent/driverScheduler.js');\n res.json({\n drivers: listActiveDrivers(),\n scheduler: getSchedulerStats(),\n });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Driver state detail\n app.get('/api/drivers/:goalId', async (req, res) => {\n try {\n const { getDriverState } = await import('../agent/goalDriver.js');\n const s = getDriverState(req.params.goalId);\n if (!s) { res.status(404).json({ error: 'No driver for goal' }); return; }\n res.json(s);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Pause a driver (skips ticks until resumed)\n app.post('/api/drivers/:goalId/pause', async (req, res) => {\n try {\n const { pauseDriver } = await import('../agent/goalDriver.js');\n const ok = pauseDriver(req.params.goalId);\n if (!ok) { res.status(404).json({ error: 'No driver for goal' }); return; }\n res.json({ status: 'paused' });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Resume a paused driver\n app.post('/api/drivers/:goalId/resume', async (req, res) => {\n try {\n const { resumeDriverControl } = await import('../agent/goalDriver.js');\n const ok = resumeDriverControl(req.params.goalId);\n if (!ok) { res.status(404).json({ error: 'No driver for goal' }); return; }\n res.json({ status: 'resumed' });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Cancel a driver (hard stop — driver transitions to cancelled on next tick)\n app.post('/api/drivers/:goalId/cancel', async (req, res) => {\n try {\n const { cancelDriver } = await import('../agent/goalDriver.js');\n const ok = cancelDriver(req.params.goalId);\n if (!ok) { res.status(404).json({ error: 'No driver for goal' }); return; }\n res.json({ status: 'cancel-requested' });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Change priority (1 = highest, 5 = lowest). Scheduler honors on next tick.\n app.post('/api/drivers/:goalId/reprioritize', async (req, res) => {\n try {\n const priority = Number(req.body?.priority) as 1 | 2 | 3 | 4 | 5;\n if (![1, 2, 3, 4, 5].includes(priority)) {\n res.status(400).json({ error: 'priority must be 1-5' }); return;\n }\n const { reprioritizeDriver } = await import('../agent/goalDriver.js');\n const ok = reprioritizeDriver(req.params.goalId, priority);\n if (!ok) { res.status(404).json({ error: 'No driver for goal' }); return; }\n res.json({ status: 'reprioritized', priority });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Rollback — one-click shadow-git revert of all writes attributed to the goal\n app.post('/api/drivers/:goalId/rollback', async (req, res) => {\n try {\n const { rollbackGoal } = await import('../agent/rollbackGoal.js');\n const result = await rollbackGoal(req.params.goalId);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Force-tick a driver (for debugging + external UI \"advance now\")\n app.post('/api/drivers/:goalId/tick', async (req, res) => {\n try {\n const { tickDriver } = await import('../agent/goalDriver.js');\n const phase = await tickDriver(req.params.goalId);\n res.json({ phase });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase B: daily digest ─────────────────────────────────────\n app.get('/api/digest/today', async (_req, res) => {\n try {\n const { getLatestDigest } = await import('../agent/dailyDigest.js');\n const d = getLatestDigest();\n if (!d) { res.status(404).json({ error: 'No digest generated yet' }); return; }\n res.json(d);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/digest/:date', async (req, res) => {\n try {\n const { getDigestByDate } = await import('../agent/dailyDigest.js');\n const d = getDigestByDate(req.params.date);\n if (!d) { res.status(404).json({ error: 'No digest for that date' }); return; }\n res.json(d);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/digest/generate', async (_req, res) => {\n try {\n const { generateDigest } = await import('../agent/dailyDigest.js');\n const d = await generateDigest();\n res.json(d);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase B: categorized approval list ─────────────────────────\n app.get('/api/approvals/categorized', async (req, res) => {\n try {\n const { listCategorizedApprovals } = await import('../agent/commandPost.js');\n const status = (req.query.status as string) || 'pending';\n res.json(listCategorizedApprovals(status));\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase B: drive trend API ─────────────────────────────────\n app.get('/api/drives/history', async (req, res) => {\n try {\n const hours = Number(req.query.hours) || 24;\n const { readFileSync, existsSync } = await import('fs');\n const { join } = await import('path');\n const { TITAN_HOME } = await import('../utils/constants.js');\n const path = join(TITAN_HOME, 'drive-state.json');\n if (!existsSync(path)) { res.status(404).json({ error: 'No drive state file' }); return; }\n const state = JSON.parse(readFileSync(path, 'utf-8'));\n const history = (state.history || []) as Array<{ timestamp: string; satisfactions?: Record<string, number>; pressures?: Record<string, number> }>;\n const cutoff = Date.now() - hours * 60 * 60 * 1000;\n const filtered = history.filter(h => {\n const t = h.timestamp ? new Date(h.timestamp).getTime() : 0;\n return t >= cutoff;\n });\n res.json({ hours, count: filtered.length, history: filtered });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase B: current drive state ────────────────────────────────\n app.get('/api/drives/current', async (_req, res) => {\n try {\n const { readFileSync, existsSync } = await import('fs');\n const { join } = await import('path');\n const { TITAN_HOME } = await import('../utils/constants.js');\n const driveStatePath = join(TITAN_HOME, 'drive-state.json');\n\n // Try cached drive state first\n if (existsSync(driveStatePath)) {\n const state = JSON.parse(readFileSync(driveStatePath, 'utf-8'));\n const latest = state.latest;\n if (latest?.drives) {\n res.json({\n drives: (latest.drives as Array<{ id: string; satisfaction: number; pressure: number; setpoint: number; weight: number; inputs?: Record<string, unknown>; description: string }>).map(d => ({\n id: d.id,\n satisfaction: d.satisfaction,\n pressure: d.pressure,\n setpoint: d.setpoint,\n weight: d.weight,\n inputs: d.inputs ?? {},\n description: d.description,\n })),\n });\n return;\n }\n }\n\n // Fallback: recompute via buildSnapshot + computeAllDrives\n const { buildSnapshot, computeAllDrives } = await import('../organism/drives.js');\n const snapshot = buildSnapshot();\n const drives = computeAllDrives(snapshot);\n res.json({\n drives: drives.map(d => ({\n id: d.id,\n satisfaction: d.satisfaction,\n pressure: d.pressure,\n setpoint: d.setpoint,\n weight: d.weight,\n inputs: d.inputs ?? {},\n description: d.description,\n })),\n });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase B: retrospectives (listing experiments from the driver) ──\n app.get('/api/retrospectives', async (_req, res) => {\n try {\n const { listExperiments } = await import('../memory/experiments.js');\n const all = listExperiments(200).filter(e => (e.tags || []).includes('goal-driver'));\n res.json({ count: all.length, retrospectives: all });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase B: throttle stats (diagnostic) ───────────────────────\n app.get('/api/drivers/throttle/stats', async (_req, res) => {\n try {\n const { getThrottleStats } = await import('../agent/notificationThrottle.js');\n res.json(getThrottleStats());\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase C: missions ─────────────────────────────────────────\n app.get('/api/missions', async (_req, res) => {\n try {\n const { listActiveMissions } = await import('../agent/missionDriver.js');\n res.json({ missions: listActiveMissions() });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/missions', async (req, res) => {\n try {\n const { title, description, children, tags } = req.body as {\n title: string; description: string; requestedBy?: string;\n children?: Array<{ goalId: string; title: string; dependsOn?: string[] }>;\n tags?: string[];\n };\n if (!title || !description) {\n res.status(400).json({ error: 'title + description required' }); return;\n }\n const { createMission } = await import('../agent/missionDriver.js');\n const mission = createMission({\n title,\n description,\n requestedBy: req.body?.requestedBy || 'api',\n children,\n tags,\n });\n res.json(mission);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/missions/:id', async (req, res) => {\n try {\n const { getMissionState } = await import('../agent/missionDriver.js');\n const m = getMissionState(req.params.id);\n if (!m) { res.status(404).json({ error: 'Mission not found' }); return; }\n res.json(m);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/missions/:id/tick', async (req, res) => {\n try {\n const { tickMission } = await import('../agent/missionDriver.js');\n res.json({ phase: await tickMission(req.params.id) });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/missions/:id/cancel', async (req, res) => {\n try {\n const { cancelMission } = await import('../agent/missionDriver.js');\n const ok = cancelMission(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Mission not found' }); return; }\n res.json({ status: 'cancelled' });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase C: fleet status + routing preview ──────────────────\n app.get('/api/fleet', async (_req, res) => {\n try {\n const { getFleetState } = await import('../agent/machineRouter.js');\n res.json({ fleet: getFleetState() });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/fleet/route', async (req, res) => {\n try {\n const tags = (req.body?.tags as string[]) || [];\n const { routeGoalToMachine } = await import('../agent/machineRouter.js');\n res.json(routeGoalToMachine(tags));\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── v4.10.0-local polish: Edited Files + Research (for Command Post UI) ──\n app.get('/api/files/edited', async (req, res) => {\n try {\n const limit = Math.min(Number(req.query.limit) || 200, 1000);\n const { listEditedFiles } = await import('../agent/editedFiles.js');\n res.json({ files: listEditedFiles(limit) });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/files/content', async (req, res) => {\n try {\n const path = (req.query.path as string) || '';\n if (!path) { res.status(400).json({ error: 'path query param required' }); return; }\n const { readEditedFileContent } = await import('../agent/editedFiles.js');\n const result = readEditedFileContent(path);\n if ('error' in result) { res.status(403).json(result); return; }\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/research/recent', async (req, res) => {\n try {\n const limit = Math.min(Number(req.query.limit) || 30, 200);\n const { listResearch } = await import('../agent/editedFiles.js');\n res.json({ research: listResearch(limit) });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase D: playbooks ──────────────────────────────────────\n app.get('/api/playbooks', async (_req, res) => {\n try {\n const { listPlaybooks } = await import('../agent/playbooks.js');\n res.json({ playbooks: listPlaybooks() });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/playbooks/refresh', async (_req, res) => {\n try {\n const { refreshPlaybooks } = await import('../agent/playbooks.js');\n res.json(await refreshPlaybooks());\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/playbooks/match', async (req, res) => {\n try {\n const { title, tags } = req.body as { title: string; tags?: string[] };\n if (!title) { res.status(400).json({ error: 'title required' }); return; }\n const { findPlaybookForGoal } = await import('../agent/playbooks.js');\n const pb = findPlaybookForGoal(title, tags);\n if (!pb) { res.status(404).json({ match: null }); return; }\n res.json({ match: pb });\n } catch (err) {\n logger.error(COMPONENT, `Playbook error: ${(err as Error).message}`);\n res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Phase D: voice chat endpoint ─────────────────────────────\n // POST /api/voice/ask\n // Body: { question: string, voice?: string, speak?: boolean }\n // Returns: { answer: string, ttsUrl?: string, activeDrivers: number }\n // Wraps processMessage so voice clients (LiveKit / F5-TTS front-ends)\n // get a single endpoint that knows about drivers (via driverAwareChat\n // system prompt block) and optionally returns a TTS URL.\n app.post('/api/voice/ask', async (req, res) => {\n try {\n const { question, voice, speak } = req.body as { question: string; voice?: string; speak?: boolean };\n if (!question || typeof question !== 'string') {\n res.status(400).json({ error: 'question required' }); return;\n }\n const { processMessage } = await import('../agent/agent.js');\n const result = await processMessage(question, 'voice', 'voice-user', {\n strategy: 'direct',\n });\n const { listActiveDrivers } = await import('../agent/goalDriver.js');\n const activeDrivers = listActiveDrivers().length;\n const answer = result.content || 'I don\\'t have an answer right now.';\n // Optional TTS URL — F5-TTS server runs on port 5006 on Titan PC.\n // If speak is true, include a URL the client can call; we don't\n // synthesize server-side to avoid double-handling large audio blobs.\n const ttsUrl = speak\n ? `http://localhost:5006/tts?voice=${encodeURIComponent(voice || 'default')}&text=${encodeURIComponent(answer.slice(0, 500))}`\n : undefined;\n res.json({ answer, ttsUrl, activeDrivers, sessionId: result.sessionId });\n } catch (err) {\n logger.error(COMPONENT, `Voice ask error: ${(err as Error).message}`);\n res.status(500).json({ error: \"I'm having trouble hearing you right now. Please try again in a moment.\" });\n }\n });\n\n app.get('/api/identity', async (_req, res) => {\n try {\n const { getIdentity } = await import('../memory/identity.js');\n const id = getIdentity();\n if (!id) { res.status(404).json({ error: 'identity not initialized' }); return; }\n res.json(id);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/identity/drift/:index/resolve', async (req, res) => {\n try {\n const idx = parseInt(req.params.index, 10);\n const resolution = (req.body?.resolution as 'accepted' | 'rejected') || 'accepted';\n const note = req.body?.note as string | undefined;\n const { resolveDrift } = await import('../memory/identity.js');\n const ok = resolveDrift(idx, resolution, note);\n if (!ok) { res.status(404).json({ error: 'drift event not found at index' }); return; }\n res.json({ ok: true });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/experiments', async (_req, res) => {\n try {\n const { listExperiments, getExperimentStats } = await import('../memory/experiments.js');\n res.json({ experiments: listExperiments(200), stats: getExperimentStats() });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/provenance/stats', async (_req, res) => {\n try {\n const { getProvenanceStats } = await import('../memory/provenance.js');\n res.json(getProvenanceStats());\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── v4.8.0: Self-Modification Pipeline endpoints ────────────────\n // All routes are behind `selfMod.enabled`. When disabled they 404 so\n // pre-v4.8.0 clients hitting them get a clean \"feature off\" signal.\n\n app.get('/api/self-proposals', async (_req, res) => {\n try {\n const cfg = loadConfig() as unknown as { selfMod?: { enabled?: boolean } };\n if (!cfg.selfMod?.enabled) { res.status(404).json({ error: 'selfMod disabled' }); return; }\n const { listProposals } = await import('../agent/selfProposals.js');\n res.json({ proposals: listProposals(200) });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/self-proposals/:id', async (req, res) => {\n try {\n const cfg = loadConfig() as unknown as { selfMod?: { enabled?: boolean } };\n if (!cfg.selfMod?.enabled) { res.status(404).json({ error: 'selfMod disabled' }); return; }\n const { getProposal } = await import('../agent/selfProposals.js');\n const p = getProposal(req.params.id);\n if (!p) { res.status(404).json({ error: 'Proposal not found' }); return; }\n res.json(p);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/self-proposals/:id/files/:path(*)', async (req, res) => {\n try {\n const cfg = loadConfig() as unknown as { selfMod?: { enabled?: boolean } };\n if (!cfg.selfMod?.enabled) { res.status(404).json({ error: 'selfMod disabled' }); return; }\n const { getProposalFileContent } = await import('../agent/selfProposals.js');\n const content = getProposalFileContent(req.params.id, req.params.path);\n if (content === null) { res.status(404).json({ error: 'File not found' }); return; }\n res.type('text/plain').send(content);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/self-proposals/:id/review', async (req, res) => {\n try {\n const cfg = loadConfig() as unknown as { selfMod?: { enabled?: boolean } };\n if (!cfg.selfMod?.enabled) { res.status(404).json({ error: 'selfMod disabled' }); return; }\n const { reviewProposal } = await import('../agent/selfProposalReview.js');\n const result = await reviewProposal(req.params.id);\n if (!result) { res.status(404).json({ error: 'Proposal not found' }); return; }\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/self-proposals/:id/open-pr', async (req, res) => {\n try {\n const cfg = loadConfig() as unknown as { selfMod?: { enabled?: boolean } };\n if (!cfg.selfMod?.enabled) { res.status(404).json({ error: 'selfMod disabled' }); return; }\n const { createProposalPR } = await import('../agent/selfProposalPR.js');\n const result = await createProposalPR(req.params.id);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/self-proposals/:id/dismiss', async (req, res) => {\n try {\n const cfg = loadConfig() as unknown as { selfMod?: { enabled?: boolean } };\n if (!cfg.selfMod?.enabled) { res.status(404).json({ error: 'selfMod disabled' }); return; }\n const { updateStatus } = await import('../agent/selfProposals.js');\n const reason = (req.body?.reason as string | undefined) || 'dismissed by user';\n const result = updateStatus(req.params.id, 'rejected', {\n rejectedAt: new Date().toISOString(),\n rejectionReason: reason,\n });\n if (!result) { res.status(404).json({ error: 'Proposal not found' }); return; }\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/command-post/wakeup', (req, res) => {\n const { issueId, agentId, agentName, task, templateName } = req.body;\n if (!issueId || !agentId || !task) {\n res.status(400).json({ error: 'issueId, agentId, and task are required' });\n return;\n }\n const wakeup = queueWakeup({\n issueId,\n issueIdentifier: issueId,\n agentId,\n agentName: agentName || 'Agent',\n parentSessionId: null,\n task,\n templateName: templateName || '',\n });\n res.json({ wakeupRequestId: wakeup.id, status: wakeup.status });\n });\n\n app.get('/api/command-post/wakeup/:requestId', (req, res) => {\n const request = getWakeupRequest(req.params.requestId);\n if (!request) { res.status(404).json({ error: 'Wakeup request not found' }); return; }\n res.json(request);\n });\n\n app.delete('/api/command-post/wakeup/:requestId', (req, res) => {\n const cancelled = cancelWakeup(req.params.requestId);\n if (!cancelled) { res.status(409).json({ error: 'Request already running or completed' }); return; }\n res.json({ cancelled: true });\n });\n\n app.get('/api/command-post/sessions/:sessionId/pending-results', (req, res) => {\n const results = drainPendingResults(req.params.sessionId);\n res.json({ results, count: results.length });\n });\n\n // ── Files API (Full file manager with configurable roots) ────────────────────\n\n // Helper: resolve configured root directories\n function getFileRoots(): Array<{ label: string; path: string }> {\n const cfg = loadConfig();\n const fmCfg = (cfg as Record<string, unknown>).fileManager as { roots?: string[]; blockedPatterns?: string[] } | undefined;\n const roots = fmCfg?.roots || ['~/.titan'];\n return roots.map(r => {\n const expanded = r.replace(/^~/, homedir());\n const abs = resolve(expanded);\n // Label: last dir component or full path for short ones\n const label = abs.split('/').filter(Boolean).pop() || abs;\n return { label, path: abs };\n });\n }\n\n // Helper: validate a path is within an allowed root and not blocked\n function validateFilePath(reqPath: string, rootParam?: string): { valid: boolean; fullPath: string; basePath: string; error?: string } {\n const roots = getFileRoots();\n if (roots.length === 0) return { valid: false, fullPath: '', basePath: '', error: 'No file roots configured' };\n\n // Select root: by index, by label, or default to first\n let selectedRoot = roots[0];\n if (rootParam) {\n const byIndex = roots[parseInt(rootParam, 10)];\n const byLabel = roots.find(r => r.label === rootParam || r.path === rootParam);\n selectedRoot = byIndex || byLabel || roots[0];\n }\n\n const basePath = selectedRoot.path;\n const fullPath = resolve(basePath, reqPath.replace(/^\\//, ''));\n\n // Security: must stay within root.\n // Hunt Finding #34 (2026-04-14): previous `fullPath.startsWith(basePath)`\n // let siblings through — e.g. if basePath=/home/dj/workspace and the\n // attacker supplies path=/home/dj/workspace-evil/file, resolve() returns\n // /home/dj/workspace-evil/file which startsWith('/home/dj/workspace')\n // is TRUE, granting access to a directory outside the configured root.\n // Check for exact match or path-separator boundary.\n const basePathWithSep = basePath.endsWith('/') ? basePath : basePath + '/';\n if (fullPath !== basePath && !fullPath.startsWith(basePathWithSep)) {\n return { valid: false, fullPath, basePath, error: 'Access denied: path outside allowed root' };\n }\n\n // Security: check blocked patterns\n const cfg = loadConfig();\n const fmCfg = (cfg as Record<string, unknown>).fileManager as { blockedPatterns?: string[] } | undefined;\n const blocked = fmCfg?.blockedPatterns || ['.ssh', '.env', '.aws', '.gnupg', 'node_modules', '.git/objects'];\n for (const pattern of blocked) {\n if (fullPath.includes(`/${pattern}`) || fullPath.endsWith(`/${pattern}`)) {\n return { valid: false, fullPath, basePath, error: `Access denied: blocked pattern \"${pattern}\"` };\n }\n }\n\n return { valid: true, fullPath, basePath };\n }\n\n // GET /api/files/roots — list configured root directories\n app.get('/api/files/roots', (_req, res) => {\n res.json({ roots: getFileRoots() });\n });\n\n // GET /api/files — list directory contents\n app.get('/api/files', (req, res) => {\n const reqPath = (req.query.path as string) || '';\n const rootParam = req.query.root as string | undefined;\n const { valid, fullPath, basePath, error } = validateFilePath(reqPath, rootParam);\n\n if (!valid) { res.status(403).json({ error }); return; }\n\n try {\n if (!fs.existsSync(fullPath)) { res.status(404).json({ error: 'Path not found' }); return; }\n const stat = fs.statSync(fullPath);\n if (!stat.isDirectory()) { res.status(400).json({ error: 'Not a directory. Use /api/files/read for files.' }); return; }\n\n const entries = fs.readdirSync(fullPath).map(name => {\n try {\n const entryPath = join(fullPath, name);\n const entryStat = fs.statSync(entryPath);\n return {\n name,\n path: reqPath ? `${reqPath}/${name}` : name,\n type: entryStat.isDirectory() ? 'directory' as const : 'file' as const,\n size: entryStat.size,\n modified: entryStat.mtime.toISOString(),\n };\n } catch {\n return { name, path: reqPath ? `${reqPath}/${name}` : name, type: 'file' as const, size: 0, modified: '' };\n }\n });\n entries.sort((a, b) => {\n if (a.type !== b.type) return a.type === 'directory' ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n res.json({ path: reqPath || '/', entries, basePath });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // GET /api/files/read — read file contents\n app.get('/api/files/read', (req, res) => {\n const reqPath = req.query.path as string;\n if (!reqPath) { res.status(400).json({ error: 'path parameter required' }); return; }\n const rootParam = req.query.root as string | undefined;\n const { valid, fullPath, error } = validateFilePath(reqPath, rootParam);\n\n if (!valid) { res.status(403).json({ error }); return; }\n\n try {\n if (!fs.existsSync(fullPath)) { res.status(404).json({ error: 'File not found' }); return; }\n const stat = fs.statSync(fullPath);\n if (stat.isDirectory()) { res.status(400).json({ error: 'Path is a directory' }); return; }\n\n const MAX_SIZE = 1024 * 1024;\n if (stat.size > MAX_SIZE) {\n const content = fs.readFileSync(fullPath, 'utf-8').slice(0, MAX_SIZE);\n res.json({ path: reqPath, content, truncated: true, size: stat.size, modified: stat.mtime.toISOString() });\n return;\n }\n\n const content = fs.readFileSync(fullPath, 'utf-8');\n res.json({ path: reqPath, content, truncated: false, size: stat.size, modified: stat.mtime.toISOString() });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // POST /api/files/write — create or overwrite a file\n app.post('/api/files/write', express.json(), (req, res) => {\n const { path: reqPath, content, root: rootParam } = req.body as { path?: string; content?: string; root?: string };\n if (!reqPath) { res.status(400).json({ error: 'path required' }); return; }\n if (content === undefined) { res.status(400).json({ error: 'content required' }); return; }\n\n const { valid, fullPath, error } = validateFilePath(reqPath, rootParam);\n if (!valid) { res.status(403).json({ error }); return; }\n\n try {\n const dir = dirname(fullPath);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(fullPath, content, 'utf-8');\n const stat = fs.statSync(fullPath);\n res.json({ success: true, path: reqPath, size: stat.size, modified: stat.mtime.toISOString() });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // POST /api/files/mkdir — create a directory\n app.post('/api/files/mkdir', express.json(), (req, res) => {\n const { path: reqPath, root: rootParam } = req.body as { path?: string; root?: string };\n if (!reqPath) { res.status(400).json({ error: 'path required' }); return; }\n\n const { valid, fullPath, error } = validateFilePath(reqPath, rootParam);\n if (!valid) { res.status(403).json({ error }); return; }\n\n try {\n if (fs.existsSync(fullPath)) { res.status(409).json({ error: 'Path already exists' }); return; }\n fs.mkdirSync(fullPath, { recursive: true });\n res.json({ success: true, path: reqPath });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // POST /api/files/rename — rename or move a file/directory\n app.post('/api/files/rename', express.json(), (req, res) => {\n const { oldPath, newPath, root: rootParam } = req.body as { oldPath?: string; newPath?: string; root?: string };\n if (!oldPath || !newPath) { res.status(400).json({ error: 'oldPath and newPath required' }); return; }\n\n const oldValidation = validateFilePath(oldPath, rootParam);\n const newValidation = validateFilePath(newPath, rootParam);\n if (!oldValidation.valid) { res.status(403).json({ error: oldValidation.error }); return; }\n if (!newValidation.valid) { res.status(403).json({ error: newValidation.error }); return; }\n\n try {\n if (!fs.existsSync(oldValidation.fullPath)) { res.status(404).json({ error: 'Source not found' }); return; }\n if (fs.existsSync(newValidation.fullPath)) { res.status(409).json({ error: 'Destination already exists' }); return; }\n fs.renameSync(oldValidation.fullPath, newValidation.fullPath);\n res.json({ success: true, oldPath, newPath });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // DELETE /api/files/delete — delete a file or empty directory\n app.delete('/api/files/delete', (req, res) => {\n const reqPath = req.query.path as string;\n const rootParam = req.query.root as string | undefined;\n if (!reqPath) { res.status(400).json({ error: 'path required' }); return; }\n\n const { valid, fullPath, error } = validateFilePath(reqPath, rootParam);\n if (!valid) { res.status(403).json({ error }); return; }\n\n try {\n if (!fs.existsSync(fullPath)) { res.status(404).json({ error: 'Not found' }); return; }\n const stat = fs.statSync(fullPath);\n if (stat.isDirectory()) {\n const contents = fs.readdirSync(fullPath);\n if (contents.length > 0) { res.status(400).json({ error: 'Directory not empty. Delete contents first.' }); return; }\n fs.rmdirSync(fullPath);\n } else {\n fs.unlinkSync(fullPath);\n }\n res.json({ success: true, path: reqPath });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── File Upload API ─────────────────────────────────────\n const UPLOADS_DIR = join(homedir(), '.titan', 'uploads');\n\n app.post('/api/files/upload', express.raw({ type: ['application/octet-stream', 'multipart/form-data', 'image/*', 'audio/*', 'video/*', 'application/pdf', 'application/zip'], limit: '50mb' }), (req, res) => {\n try {\n const fileName = (req.headers['x-filename'] as string) || `upload-${Date.now()}`;\n const safeName = fileName.replace(/[^a-zA-Z0-9._-]/g, '_').slice(0, 100);\n const sessionId = (req.headers['x-session-id'] as string) || 'default';\n\n // Handle both raw Buffer and JSON-parsed body\n const body = Buffer.isBuffer(req.body) ? req.body : Buffer.from(JSON.stringify(req.body));\n if (!body || body.length === 0) {\n res.status(400).json({ error: 'Empty upload body' });\n return;\n }\n\n // Create session-specific upload dir\n const sessionDir = join(UPLOADS_DIR, sessionId);\n if (!fs.existsSync(sessionDir)) fs.mkdirSync(sessionDir, { recursive: true });\n\n const filePath = join(sessionDir, safeName);\n fs.writeFileSync(filePath, body);\n\n const stat = fs.statSync(filePath);\n logger.info(COMPONENT, `File uploaded: ${safeName} (${(stat.size / 1024).toFixed(0)}KB) → session ${sessionId}`);\n\n res.json({\n ok: true,\n file: {\n name: safeName,\n path: filePath,\n size: stat.size,\n session: sessionId,\n uploadedAt: new Date().toISOString(),\n },\n });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/files/uploads', (req, res) => {\n try {\n const sessionId = (req.query.session as string) || 'default';\n const sessionDir = join(UPLOADS_DIR, sessionId);\n if (!fs.existsSync(sessionDir)) { res.json({ files: [] }); return; }\n\n const files = fs.readdirSync(sessionDir).map(name => {\n const stat = fs.statSync(join(sessionDir, name));\n return { name, size: stat.size, modified: stat.mtime.toISOString() };\n });\n res.json({ files, session: sessionId });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.delete('/api/files/uploads/:name', (req, res) => {\n try {\n const sessionId = (req.query.session as string) || 'default';\n const filePath = join(UPLOADS_DIR, sessionId, req.params.name.replace(/[^a-zA-Z0-9._-]/g, '_'));\n if (!filePath.startsWith(UPLOADS_DIR)) { res.status(403).json({ error: 'Access denied' }); return; }\n if (fs.existsSync(filePath)) fs.unlinkSync(filePath);\n res.json({ ok: true });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Audit API ────────────────────────────────────────────\n\n app.get('/api/audit', (req, res) => {\n const query = {\n since: req.query.since as string | undefined,\n until: req.query.until as string | undefined,\n action: req.query.action as string | undefined,\n source: req.query.source as string | undefined,\n tool: req.query.tool as string | undefined,\n limit: req.query.limit ? parseInt(req.query.limit as string, 10) : 100,\n };\n res.json({ entries: queryAuditLog(query) });\n });\n\n app.get('/api/audit/stats', (req, res) => {\n const hours = req.query.hours ? parseInt(req.query.hours as string, 10) : 24;\n res.json(getAuditStats(hours));\n });\n\n // ── Vulnerability Scan API ────────────────────────────────\n\n app.get('/api/vulnerabilities', (_req, res) => {\n try {\n const reportPath = join(process.cwd(), 'dependency-scan-report.json');\n if (!fs.existsSync(reportPath)) {\n res.json({\n timestamp: new Date().toISOString(),\n vulnerabilities: { total: 0, critical: 0, high: 0, moderate: 0, low: 0 },\n outdated: [],\n deprecated: [],\n licenseIssues: [],\n totalDependencies: 0,\n directDependencies: 0,\n errors: ['No scan report found. Run: npm run scan:deps'],\n });\n return;\n }\n const report = JSON.parse(fs.readFileSync(reportPath, 'utf-8'));\n res.json(report);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/vulnerabilities/scan', async (_req, res) => {\n try {\n const scanScript = join(process.cwd(), 'scripts', 'dependency-scan.cjs');\n if (!fs.existsSync(scanScript)) {\n res.status(404).json({ error: 'Scan script not found' });\n return;\n }\n\n const { exec } = await import('child_process');\n exec(`node ${scanScript}`, (error, stdout, stderr) => {\n if (error) {\n res.status(500).json({ error: error.message, output: stderr });\n return;\n }\n res.json({ success: true, output: stdout });\n });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Cron API ──────────────────────────────────────────────\n\n app.get('/api/cron', (_req, res) => {\n const store = getDb();\n res.json({ jobs: store.cronJobs });\n });\n\n app.post('/api/cron', (req, res) => {\n const { name, schedule, command } = req.body;\n if (!name || !schedule || !command) {\n res.status(400).json({ error: 'name, schedule, and command are required' }); return;\n }\n const store = getDb();\n const id = crypto.randomUUID();\n store.cronJobs.push({ id, name, schedule, command, enabled: true, created_at: new Date().toISOString() });\n res.status(201).json({ job: { id, name, schedule, command, enabled: true } });\n });\n\n app.post('/api/cron/:id/toggle', (req, res) => {\n const store = getDb();\n const job = store.cronJobs.find(j => j.id === req.params.id);\n if (!job) { res.status(404).json({ error: 'Cron job not found' }); return; }\n job.enabled = typeof req.body.enabled === 'boolean' ? req.body.enabled : !job.enabled;\n res.json({ job });\n });\n\n app.delete('/api/cron/:id', (req, res) => {\n const store = getDb();\n const idx = store.cronJobs.findIndex(j => j.id === req.params.id);\n if (idx === -1) { res.status(404).json({ error: 'Cron job not found' }); return; }\n store.cronJobs.splice(idx, 1);\n res.json({ deleted: true });\n });\n\n // ── Self-Improvement API ────────────────────────────────────\n app.get('/api/self-improve/history', async (_req, res) => {\n try {\n const { existsSync, readFileSync } = await import('fs');\n const { join } = await import('path');\n const { TITAN_HOME } = await import('../utils/constants.js');\n const historyPath = join(TITAN_HOME, 'self-improve', 'history.jsonl');\n if (!existsSync(historyPath)) {\n res.json({ sessions: [] });\n return;\n }\n const lines = readFileSync(historyPath, 'utf-8').split('\\n').filter((l: string) => l.trim());\n const sessions = lines.map((l: string) => {\n try { return JSON.parse(l); } catch { return null; }\n }).filter(Boolean);\n res.json({ sessions });\n } catch (e) {\n res.json({ sessions: [] });\n }\n });\n\n app.get('/api/self-improve/config', (_req, res) => {\n const cfg = loadConfig();\n res.json((cfg as Record<string, unknown>).selfImprove || {});\n });\n\n // ── Training Progress SSE Stream ─────────────────────────────────\n app.get('/api/training/stream', async (req, res) => {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n res.write('data: {\"type\":\"connected\",\"message\":\"Training progress stream connected\"}\\n\\n');\n\n // Import training events emitter\n let handler: ((event: unknown) => void) | null = null;\n try {\n const { trainingEvents } = await import('../skills/builtin/model_trainer.js');\n handler = (event: unknown) => {\n try {\n res.write(`data: ${JSON.stringify(event)}\\n\\n`);\n } catch { /* client disconnected */ }\n };\n trainingEvents.on('progress', handler);\n } catch { /* model_trainer not loaded */ }\n\n // Send recent progress log as catch-up (last 50 entries)\n try {\n const { existsSync, readFileSync } = await import('fs');\n const { join } = await import('path');\n const { TITAN_HOME } = await import('../utils/constants.js');\n const logPath = join(TITAN_HOME, 'training-progress.jsonl');\n if (existsSync(logPath)) {\n const lines = readFileSync(logPath, 'utf-8').split('\\n').filter((l: string) => l.trim());\n const recent = lines.slice(-50);\n for (const line of recent) {\n try { res.write(`data: ${line}\\n\\n`); } catch { break; }\n }\n }\n } catch { /* best-effort */ }\n\n // Keep alive\n const keepAlive = setInterval(() => {\n try { res.write(': keepalive\\n\\n'); } catch { clearInterval(keepAlive); }\n }, 15_000);\n\n req.on('close', () => {\n clearInterval(keepAlive);\n if (handler) {\n import('../skills/builtin/model_trainer.js')\n .then(m => m.trainingEvents.off('progress', handler!))\n .catch(() => {});\n }\n });\n });\n\n // ── Training Progress Log (poll fallback) ──────────────────────\n app.get('/api/training/progress', async (req, res) => {\n try {\n const { existsSync, readFileSync } = await import('fs');\n const { join } = await import('path');\n const { TITAN_HOME } = await import('../utils/constants.js');\n const logPath = join(TITAN_HOME, 'training-progress.jsonl');\n if (!existsSync(logPath)) {\n res.json({ events: [] });\n return;\n }\n const lines = readFileSync(logPath, 'utf-8').split('\\n').filter((l: string) => l.trim());\n const since = req.query.since as string | undefined;\n let events = lines.map((l: string) => { try { return JSON.parse(l); } catch { return null; } }).filter(Boolean);\n if (since) {\n events = events.filter((e: { timestamp?: string }) => e.timestamp && e.timestamp > since);\n }\n // Return last 100\n res.json({ events: events.slice(-100) });\n } catch {\n res.json({ events: [] });\n }\n });\n\n // ── Clear training progress log ────────────────────────────────\n app.delete('/api/training/progress', async (_req, res) => {\n try {\n const { writeFileSync } = await import('fs');\n const { join } = await import('path');\n const { TITAN_HOME } = await import('../utils/constants.js');\n writeFileSync(join(TITAN_HOME, 'training-progress.jsonl'), '', 'utf-8');\n res.json({ cleared: true });\n } catch {\n res.status(500).json({ error: 'Failed to clear' });\n }\n });\n\n app.get('/api/training/runs', async (_req, res) => {\n try {\n const { existsSync, readdirSync, readFileSync } = await import('fs');\n const { join } = await import('path');\n const { TITAN_HOME } = await import('../utils/constants.js');\n const runsDir = join(TITAN_HOME, 'training-runs');\n if (!existsSync(runsDir)) {\n res.json({ runs: [] });\n return;\n }\n const dirs = readdirSync(runsDir, { withFileTypes: true })\n .filter((d: { isDirectory: () => boolean }) => d.isDirectory())\n .map((d: { name: string }) => d.name);\n const runs = dirs.map((dir: string) => {\n const metaPath = join(runsDir, dir, 'meta.json');\n const resultsPath = join(runsDir, dir, 'results.json');\n if (!existsSync(metaPath)) return null;\n const meta = JSON.parse(readFileSync(metaPath, 'utf-8'));\n if (existsSync(resultsPath)) {\n const results = JSON.parse(readFileSync(resultsPath, 'utf-8'));\n meta.status = results.status || 'completed';\n meta.finalLoss = results.final_loss;\n }\n return meta;\n }).filter(Boolean);\n res.json({ runs });\n } catch {\n res.json({ runs: [] });\n }\n });\n\n // ── Autoresearch API ──────────────────────────────────────────\n app.get('/api/autoresearch/results', (req, res) => {\n try {\n const type = req.query.type as string || 'tool_router';\n const resultsFile = type === 'agent' ? 'agent_results.json' : 'results.json';\n const resultsPath = join(TITAN_HOME, 'autoresearch', 'output', resultsFile);\n if (!fs.existsSync(resultsPath)) {\n res.json({ runs: [] });\n return;\n }\n const data = JSON.parse(fs.readFileSync(resultsPath, 'utf-8'));\n res.json({ runs: Array.isArray(data) ? data : [] });\n } catch {\n res.json({ runs: [] });\n }\n });\n\n app.get('/api/autoresearch/performance', (req, res) => {\n try {\n const type = req.query.type as string || 'tool_router';\n const resultsFile = type === 'agent' ? 'agent_results.json' : 'results.json';\n const resultsPath = join(TITAN_HOME, 'autoresearch', 'output', resultsFile);\n if (!fs.existsSync(resultsPath)) {\n res.json({ totalRuns: 0, bestScore: 0, avgImprovement: 0, baseline: 78.0 });\n return;\n }\n const runs = JSON.parse(fs.readFileSync(resultsPath, 'utf-8'));\n if (!Array.isArray(runs) || runs.length === 0) {\n res.json({ totalRuns: 0, bestScore: 0, avgImprovement: 0, baseline: 78.0 });\n return;\n }\n const baseline = 78.0;\n const bestScore = Math.max(...runs.map((r: any) => r.val_score || 0));\n const avgImprovement = runs.reduce((sum: number, r: any) => sum + ((r.val_score || 0) - baseline), 0) / runs.length;\n res.json({\n totalRuns: runs.length,\n bestScore: Math.round(bestScore * 100) / 100,\n avgImprovement: Math.round(avgImprovement * 100) / 100,\n baseline,\n lastRun: runs[runs.length - 1],\n });\n } catch {\n res.json({ totalRuns: 0, bestScore: 0, avgImprovement: 0, baseline: 78.0 });\n }\n });\n\n app.get('/api/autoresearch/status', (_req, res) => {\n res.json({ status: 'idle' });\n });\n\n app.get('/api/autoresearch/benchmark', (_req, res) => {\n try {\n const benchPath = join(TITAN_HOME, 'autoresearch', 'output', 'benchmark_results.json');\n if (!fs.existsSync(benchPath)) {\n res.json({ benchmark: null });\n return;\n }\n res.json({ benchmark: JSON.parse(fs.readFileSync(benchPath, 'utf-8')) });\n } catch {\n res.json({ benchmark: null });\n }\n });\n\n app.post('/api/autoresearch/trigger', async (req, res) => {\n try {\n const type = req.body?.type || 'tool_router';\n const config = req.body?.config || {};\n const prompt = type === 'agent'\n ? `Run an agent model training experiment using train_start with baseModel=\"${config.baseModel || 'qwen2.5:32b'}\" method=\"lora\" epochs=${config.epochs || 2} budgetMinutes=${config.timeBudgetMin || 60}. This is for the Main Agent model, use the agent training pipeline (train_agent.py on Titan PC).`\n : 'Run an autoresearch training experiment. Use the train_start tool with default settings.';\n const response = await processMessage(\n prompt,\n `autoresearch-trigger-${type}`,\n 'system',\n {}\n );\n res.json({ success: true, content: response.content?.slice(0, 500) });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/autoresearch/generate-data', async (req, res) => {\n try {\n const type = req.body?.type || 'tool_router';\n const trainHost = process.env.TITAN_TRAIN_HOST || 'localhost';\n const trainUser = process.env.TITAN_TRAIN_USER || process.env.USER || 'user';\n const prompt = type === 'agent'\n ? `Generate training data for the Main Agent model. Run the generate_agent_data.py script via SSH: ssh ${trainUser}@${trainHost} \"~/.titan/venv/bin/python3 ~/.titan/autoresearch/generate_agent_data.py --no-llm\"`\n : `Generate training data for the tool router model. Run the generate_data.py script via SSH: ssh ${trainUser}@${trainHost} \"~/.titan/venv/bin/python3 ~/.titan/autoresearch/generate_data.py\"`;\n const response = await processMessage(prompt, `autoresearch-gendata-${type}`, 'system', {});\n res.json({ success: true, content: response.content?.slice(0, 500) });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/autoresearch/deploy', async (req, res) => {\n try {\n const type = req.body?.type || 'tool_router';\n const modelName = type === 'agent' ? 'titan-agent' : 'titan-qwen';\n const prompt = `Deploy the best trained ${type === 'agent' ? 'agent' : 'tool router'} model to Ollama as \"${modelName}\". Run the deploy script on Titan PC via SSH.`;\n const response = await processMessage(prompt, `autoresearch-deploy-${type}`, 'system', {});\n res.json({ success: true, content: response.content?.slice(0, 500) });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Recipe Run API ────────────────────────────────────────\n\n app.post('/api/recipes/:id/run', async (req, res) => {\n const recipe = getRecipe(req.params.id);\n if (!recipe) { res.status(404).json({ error: 'Recipe not found' }); return; }\n try {\n const params = req.body.params || {};\n const steps: Array<{ stepIndex: number; prompt: string }> = [];\n for await (const step of runRecipe(req.params.id, params)) {\n steps.push({ stepIndex: step.stepIndex, prompt: step.prompt });\n }\n res.json({ recipe: recipe.name, stepsExecuted: steps.length, steps });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Voice ──────────────────────────────────────────────────\n app.get('/api/voice/status', async (_req, res) => {\n const cfg = loadConfig();\n const voice = cfg.voice;\n if (!voice.enabled) {\n res.json({ available: false, reason: 'Voice not enabled in config' });\n return;\n }\n try {\n // Ping LiveKit server health endpoint\n const livekitHttp = voice.livekitUrl.replace('ws://', 'http://').replace('wss://', 'https://');\n const resp = await fetch(livekitHttp, { signal: AbortSignal.timeout(3000) });\n res.json({\n available: resp.ok,\n livekitUrl: voice.livekitUrl,\n ttsVoice: voice.ttsVoice,\n });\n } catch {\n res.json({ available: false, livekitUrl: voice.livekitUrl, reason: 'LiveKit server unreachable' });\n }\n });\n\n app.get('/api/voice/config', (_req, res) => {\n const cfg = loadConfig();\n res.json(cfg.voice);\n });\n\n // LiveKit token generation (ported from titan-voice-ui)\n app.post('/api/livekit/token', async (req, res) => {\n const cfg = loadConfig();\n if (!cfg.voice?.enabled) {\n res.status(404).json({ error: 'Voice not enabled' });\n return;\n }\n if (!cfg.voice.livekitApiKey || !cfg.voice.livekitApiSecret) {\n res.status(503).json({ error: 'LiveKit not configured — set voice.livekitApiKey and voice.livekitApiSecret in titan.json' });\n return;\n }\n try {\n const lkModule = 'livekit-server-sdk';\n const livekitSdk: any = await import(lkModule).catch(() => null);\n if (!livekitSdk?.AccessToken) {\n res.status(503).json({ error: 'livekit-server-sdk not installed. Run: npm install livekit-server-sdk' });\n return;\n }\n const { AccessToken } = livekitSdk;\n const participantIdentity = `voice_user_${Math.floor(Math.random() * 10_000)}`;\n const roomName = `voice_room_${Math.floor(Math.random() * 10_000)}`;\n const at = new AccessToken(cfg.voice.livekitApiKey, cfg.voice.livekitApiSecret, {\n identity: participantIdentity,\n name: 'user',\n ttl: '15m',\n });\n at.addGrant({\n room: roomName,\n roomJoin: true,\n canPublish: true,\n canPublishData: true,\n canSubscribe: true,\n });\n // Use the browser's request hostname so LiveKit URL works over Tailscale / remote\n let serverUrl = cfg.voice.livekitUrl;\n try {\n const reqHost = req.hostname || req.headers.host?.split(':')[0];\n if (reqHost) {\n const parsed = new URL(serverUrl);\n parsed.hostname = reqHost;\n serverUrl = parsed.toString().replace(/\\/$/, '');\n }\n } catch { /* keep original */ }\n res.json({\n serverUrl,\n roomName,\n participantName: 'user',\n participantToken: await at.toJwt(),\n });\n } catch (err) {\n logger.error(COMPONENT, `LiveKit token error: ${(err as Error).message}`);\n res.status(500).json({ error: 'Failed to generate LiveKit token. Is livekit-server-sdk installed?' });\n }\n });\n\n // Voice health check (F5-TTS only)\n app.get('/api/voice/health', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.voice?.enabled) {\n res.json({ livekit: false, stt: false, tts: false, agent: false, overall: false, ttsEngine: cfg.voice?.ttsEngine || 'f5-tts' });\n return;\n }\n const engine = cfg.voice.ttsEngine || 'f5-tts';\n const results = { livekit: false, stt: false, tts: false, agent: false, overall: false, ttsEngine: engine };\n const sttUrl = cfg.voice.sttUrl || 'http://localhost:48421';\n const ttsUrl = cfg.voice.ttsUrl || 'http://localhost:5006';\n const sttEngine = cfg.voice.sttEngine || 'faster-whisper';\n const nvidia = (cfg as Record<string, unknown>).nvidia as Record<string, unknown> | undefined;\n const asrCfg = nvidia?.asr as Record<string, unknown> | undefined;\n const sttHealthUrl = sttEngine === 'nemotron-asr'\n ? `${(asrCfg?.healthUrl as string) || 'http://localhost:9000'}/v1/health/ready`\n : `${sttUrl}/health`;\n const checks = [\n { key: 'livekit' as const, url: cfg.voice.livekitUrl.replace('ws://', 'http://').replace('wss://', 'https://') },\n { key: 'agent' as const, url: cfg.voice.agentUrl },\n { key: 'stt' as const, url: sttHealthUrl },\n ];\n await Promise.allSettled(checks.map(async ({ key, url }) => {\n try {\n const resp = await fetch(url, { signal: AbortSignal.timeout(3000) });\n results[key] = resp.ok || resp.status < 500;\n } catch { results[key] = false; }\n }));\n // TTS health check — F5-TTS only\n try {\n let resp = await fetch(`${ttsUrl}/health`, { signal: AbortSignal.timeout(3000) }).catch(() => null);\n if (!resp || resp.status >= 400) {\n // No /health endpoint — try a lightweight speech probe\n const voice = cfg.voice.ttsVoice || 'andrew';\n resp = await fetch(`${ttsUrl}/v1/audio/speech`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ model: 'f5-tts', input: '.', voice, response_format: 'pcm' }),\n signal: AbortSignal.timeout(10000),\n });\n }\n results.tts = resp ? resp.status < 500 : false;\n } catch { results.tts = false; }\n results.overall = results.tts;\n res.json(results);\n });\n\n // ── NVIDIA Health Checks ─────────────────────────────────────────────\n app.get('/api/nvidia/health/cuopt', async (_req, res) => {\n const cfg = loadConfig();\n const nvidia = (cfg as Record<string, unknown>).nvidia as Record<string, unknown> | undefined;\n const cuoptUrl = ((nvidia?.cuopt as Record<string, unknown>)?.url as string) || 'http://localhost:5000';\n try {\n const resp = await fetch(`${cuoptUrl}/cuopt/health`, { signal: AbortSignal.timeout(5000) });\n res.json({ healthy: resp.ok, status: resp.status, url: cuoptUrl });\n } catch {\n res.json({ healthy: false, url: cuoptUrl });\n }\n });\n\n app.get('/api/nvidia/health/asr', async (_req, res) => {\n const cfg = loadConfig();\n const nvidia = (cfg as Record<string, unknown>).nvidia as Record<string, unknown> | undefined;\n const healthUrl = ((nvidia?.asr as Record<string, unknown>)?.healthUrl as string) || 'http://localhost:9000';\n try {\n const resp = await fetch(`${healthUrl}/v1/health/ready`, { signal: AbortSignal.timeout(5000) });\n res.json({ healthy: resp.ok, status: resp.status, url: healthUrl });\n } catch {\n res.json({ healthy: false, url: healthUrl });\n }\n });\n\n app.get('/api/nvidia/health/nim', async (_req, res) => {\n const cfg = loadConfig();\n const nvidia = (cfg as Record<string, unknown>).nvidia as Record<string, unknown> | undefined;\n const apiKey = (nvidia?.apiKey as string) || process.env.NVIDIA_API_KEY || '';\n if (!apiKey) {\n res.json({ healthy: false, reason: 'No NVIDIA API key configured' });\n return;\n }\n try {\n const resp = await fetch('https://integrate.api.nvidia.com/v1/models', {\n headers: { 'Authorization': `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(8000),\n });\n res.json({ healthy: resp.ok, status: resp.status });\n } catch {\n res.json({ healthy: false, reason: 'NIM API unreachable' });\n }\n });\n\n // Voice preview — F5-TTS only\n app.post('/api/voice/preview', async (req, res) => {\n const cfg = loadConfig();\n const engine = cfg.voice?.ttsEngine || 'f5-tts';\n const voiceId = req.body?.voice || cfg.voice?.ttsVoice || 'andrew';\n const rawText = req.body?.text || 'Hey! I\\'m TITAN, your AI assistant.';\n const text = rawText.length > 500 ? rawText.slice(0, 497) + '...' : rawText;\n const ttsUrl = cfg.voice?.ttsUrl || 'http://localhost:5006';\n logger.info('Gateway', `TTS [${engine}] request: voice=${voiceId}, text=${text.slice(0, 80)}...`);\n\n try {\n const ttsRes = await fetch(`${ttsUrl}/v1/audio/speech`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ model: 'f5-tts-mlx', input: text, voice: voiceId, response_format: 'wav' }),\n signal: AbortSignal.timeout(60000),\n });\n\n if (!ttsRes.ok) {\n res.status(502).json({ error: `TTS service unavailable`, status: ttsRes.status });\n return;\n }\n res.setHeader('Content-Type', 'audio/wav');\n const buffer = Buffer.from(await ttsRes.arrayBuffer());\n res.send(buffer);\n } catch (err) {\n res.status(502).json({ error: `TTS service unavailable` });\n }\n });\n\n // ── Streaming voice endpoint: LLM → sentence chunking → TTS per sentence ──\n // Returns SSE with interleaved text and audio events for low-latency voice\n app.post('/api/voice/stream', rateLimit(60000, 30), concurrencyGuard(10), async (req, res) => {\n const { content, sessionId: requestedSessionId, voice: reqVoice } = req.body || {};\n if (!content) { res.status(400).json({ error: 'content is required' }); return; }\n\n const cfg = loadConfig();\n const ttsUrl = cfg.voice?.ttsUrl || 'http://localhost:5006';\n const ttsEngine = cfg.voice?.ttsEngine || 'f5-tts';\n const voiceId = reqVoice || cfg.voice?.ttsVoice || 'andrew';\n const channel = 'voice';\n const userId = 'voice-user';\n\n // SSE setup\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n res.flushHeaders();\n\n let clientDisconnected = false;\n res.on('close', () => { clientDisconnected = true; });\n const safeWrite = (data: string) => {\n if (clientDisconnected) return;\n try { res.write(data); } catch { clientDisconnected = true; }\n };\n\n // SSE heartbeat — keeps the connection alive during LLM inference\n const heartbeat = setInterval(() => {\n if (clientDisconnected) { clearInterval(heartbeat); return; }\n safeWrite(': heartbeat\\n\\n');\n }, 2000);\n\n const abortController = new AbortController();\n if (requestedSessionId) {\n sessionAborts.set(requestedSessionId, abortController);\n sessionAbortTimes.set(requestedSessionId, Date.now());\n }\n\n // Auto-detect TTS availability — probe F5-TTS once at stream start\n let effectiveTtsEngine: string = ttsEngine;\n const effectiveTtsUrl = ttsUrl;\n const effectiveTtsModel = 'f5-tts-mlx';\n\n try {\n const probe = await fetch(`${effectiveTtsUrl}/health`, { signal: AbortSignal.timeout(5000) });\n if (!probe.ok) effectiveTtsEngine = 'unavailable';\n } catch {\n effectiveTtsEngine = 'unavailable';\n logger.warn(COMPONENT, `F5-TTS unreachable at ${effectiveTtsUrl}`);\n }\n // Tell the client which TTS engine is active\n safeWrite(`event: tts_mode\\ndata: ${JSON.stringify({ engine: effectiveTtsEngine })}\\n\\n`);\n\n // Sentence buffer and sequential TTS queue\n let tokenBuffer = '';\n let sentenceIndex = 0;\n let firstChunkSent = false;\n let totalTtsChars = 0;\n const FIRST_CHUNK_MIN = 60; // chars before forcing first flush (low TTFA)\n const MAX_TTS_SENTENCES = 50; // generous limit — let full responses be spoken\n const MAX_TTS_CHARS = 10000; // ~5 minutes of speech at 150 WPM\n\n // Sequential TTS queue — processes one sentence at a time to avoid overwhelming F5-TTS\n const ttsQueue: Array<{ sentence: string; index: number }> = [];\n let ttsRunning = false;\n let ttsResolve: (() => void) = () => {};\n const ttsAllDone = new Promise<void>(resolve => { ttsResolve = resolve; });\n let ttsFinished = false;\n\n const processTtsQueue = async () => {\n if (ttsRunning) return;\n ttsRunning = true;\n while (ttsQueue.length > 0) {\n if (clientDisconnected) break;\n const item = ttsQueue.shift()!;\n await fireTTSInternal(item.sentence, item.index);\n }\n ttsRunning = false;\n if (ttsFinished && ttsQueue.length === 0) {\n ttsResolve();\n }\n };\n\n // Strip markdown/emotion/tool narration/TOOLCALL tags for voice display+TTS\n const cleanForVoice = (text: string): string => {\n return text\n .replace(/<TOOLCALL>[\\s\\S]*?(?:<\\/TOOLCALL>|$)/g, '') // strip <TOOLCALL> blocks\n .replace(/<TOOLCALL>\\[[\\s\\S]*?\\]/g, '') // strip <TOOLCALL>[...] format\n .replace(/```[\\s\\S]*?```/g, '') // strip code blocks\n .replace(/`[^`]+`/g, (m) => m.slice(1, -1)) // unwrap inline code (keep text)\n .replace(/\\*\\*(.*?)\\*\\*/g, '$1') // bold → plain\n .replace(/\\*(.*?)\\*/g, '$1') // italic → plain\n .replace(/^#+\\s+/gm, '') // headings → plain\n .replace(/^\\d+\\.\\s+/gm, '') // numbered lists → plain\n .replace(/^[-*]\\s+/gm, '') // bullet points → plain\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1') // [links](url) → link text\n .replace(/https?:\\/\\/\\S+/g, '') // strip bare URLs\n .replace(/\\n{2,}/g, '. ') // paragraph breaks → sentence break\n .replace(/\\n/g, ' ') // single newlines → space\n .replace(/<(?:laugh|chuckle|sigh|cough|sniffle|groan|yawn|gasp|smile)>/gi, '')\n .replace(/(?:Let me |I'll |I will |I'm going to )(?:use|call|check|run|invoke|execute|try)(?: the)? \\w[\\w_]*(?: tool)?(?:\\s+(?:to|for|and)\\b[^.!?]*)?[.!]?\\s*/gi, '')\n .replace(/\\b(?:Using|Calling|Running|Checking|Invoking|Executing) (?:the )?\\w[\\w_]*(?: tool)?(?:\\s+(?:to|for)\\b[^.!?]*)?[.!]?\\s*/gi, '')\n .replace(/\\s{2,}/g, ' ')\n // TTS cadence fixes — natural breathing pauses for voice\n .replace(/(\\w)\\s*—\\s*(\\w)/g, '$1, $2') // em dashes between words → comma pause\n .replace(/(\\w)\\s*–\\s*(\\w)/g, '$1, $2') // en dashes between words → comma pause\n .replace(/;\\s*/g, '. ') // semicolons → sentence break\n .replace(/\\(([^)]+)\\)/g, ', $1,') // parentheses → comma-wrapped\n // Break long clauses at major conjunctions (but not inside short lists)\n .replace(/([a-z]{4,}),\\s*(but|yet|so|however|although)\\s+/gi, '$1. $2 ') // clause-level breaks\n .replace(/\\.\\s*\\./g, '.') // clean up double periods\n .replace(/,\\s*\\./g, '.') // clean up comma-period\n .replace(/\\s{2,}/g, ' ')\n .trim();\n };\n\n // Fire TTS for a single sentence — called sequentially from the queue\n const fireTTSInternal = async (sentence: string, index: number) => {\n const clean = cleanForVoice(sentence);\n if (!clean || clean.length < 3) return;\n\n // Send text event so client can display it (skip for F5-TTS — already sent during buffering)\n if (!isF5TTS) {\n safeWrite(`event: sentence\\ndata: ${JSON.stringify({ text: clean, index })}\\n\\n`);\n }\n\n // Skip audio if we've exceeded TTS limits (still display text)\n if (index >= MAX_TTS_SENTENCES || totalTtsChars >= MAX_TTS_CHARS) return;\n totalTtsChars += clean.length;\n\n try {\n const ttsRes = await fetch(`${effectiveTtsUrl}/v1/audio/speech`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ model: effectiveTtsModel, input: clean, voice: voiceId, response_format: 'wav' }),\n signal: AbortSignal.timeout(60000),\n });\n if (ttsRes.ok && !clientDisconnected) {\n const audioBuffer = Buffer.from(await ttsRes.arrayBuffer());\n const audioBase64 = audioBuffer.toString('base64');\n safeWrite(`event: audio\\ndata: ${JSON.stringify({ index, audio: audioBase64, format: 'wav' })}\\n\\n`);\n }\n } catch (e) {\n logger.debug('Gateway', `Voice stream TTS failed for sentence ${index}: ${(e as Error).message}`);\n }\n };\n\n // For F5-TTS (f5-tts engine): batch ALL sentences into one TTS call after LLM finishes.\n // But cap at ~120 chars per call to avoid quality degradation on long text.\n const isF5TTS = effectiveTtsEngine === 'f5-tts';\n const f5Sentences: string[] = []; // accumulate clean sentences for post-LLM TTS\n\n // Flush accumulated buffer as a sentence — adds to sequential queue\n const flushSentence = (text: string) => {\n const trimmed = text.trim();\n if (trimmed.length < 3) return;\n\n if (isF5TTS) {\n // Send text event immediately so client can display in real-time\n const clean = cleanForVoice(trimmed);\n if (clean && clean.length >= 3) {\n safeWrite(`event: sentence\\ndata: ${JSON.stringify({ text: clean, index: sentenceIndex++ })}\\n\\n`);\n f5Sentences.push(clean);\n }\n return;\n }\n\n const idx = sentenceIndex++;\n ttsQueue.push({ sentence: trimmed, index: idx });\n processTtsQueue(); // kick off processing if not already running\n };\n\n activeLlmRequests++;\n titanActiveSessions.inc();\n const startTime = process.hrtime.bigint();\n\n try {\n const response = await routeMessage(content, channel, userId, {\n streamCallbacks: {\n onToken: (token: string) => {\n if (clientDisconnected) return;\n tokenBuffer += token;\n\n // Force first chunk early for low time-to-first-audio\n if (!firstChunkSent && tokenBuffer.length >= FIRST_CHUNK_MIN) {\n const lastSpace = tokenBuffer.lastIndexOf(' ');\n if (lastSpace > 30) {\n flushSentence(tokenBuffer.slice(0, lastSpace));\n tokenBuffer = tokenBuffer.slice(lastSpace + 1);\n firstChunkSent = true;\n return;\n }\n }\n\n // Split on newlines first — paragraph/list boundaries are natural sentence breaks\n if (tokenBuffer.includes('\\n')) {\n const lines = tokenBuffer.split('\\n');\n // Keep last fragment in buffer (may be incomplete)\n tokenBuffer = lines.pop() || '';\n for (const line of lines) {\n if (line.trim().length >= 3) {\n flushSentence(line);\n firstChunkSent = true;\n }\n }\n return;\n }\n\n // Detect sentence boundaries: .!?:; followed by space or end\n // Negative lookbehind avoids splitting on decimals like \"PM2.5\", \"8.8kW\", \"Dr.\", \"vs.\"\n // Loop to drain ALL complete sentences from buffer\n let match: RegExpMatchArray | null;\n while ((match = tokenBuffer.match(/^(.*?(?<!\\d)(?<!\\b(?:Dr|Mr|Mrs|Ms|vs|etc|e\\.g|i\\.e))[.!?])(\\s+|$)/s)) !== null) {\n flushSentence(match[1]);\n tokenBuffer = tokenBuffer.slice(match[0].length);\n firstChunkSent = true;\n }\n\n // Also split on colons/semicolons when buffer is getting long (natural pauses)\n if (tokenBuffer.length > 80) {\n const colonMatch = tokenBuffer.match(/^(.*?[:;])\\s+/s);\n if (colonMatch && colonMatch[1].length > 20) {\n flushSentence(colonMatch[1]);\n tokenBuffer = tokenBuffer.slice(colonMatch[0].length);\n firstChunkSent = true;\n return;\n }\n }\n\n // Force flush long runs without punctuation (bullet lists, etc.)\n if (tokenBuffer.length > 200) {\n // Try comma as a natural break point\n const commaPos = tokenBuffer.lastIndexOf(', ', 180);\n if (commaPos > 40) {\n flushSentence(tokenBuffer.slice(0, commaPos + 1));\n tokenBuffer = tokenBuffer.slice(commaPos + 2);\n firstChunkSent = true;\n } else {\n const lastSpace = tokenBuffer.lastIndexOf(' ', 180);\n if (lastSpace > 50) {\n flushSentence(tokenBuffer.slice(0, lastSpace));\n tokenBuffer = tokenBuffer.slice(lastSpace + 1);\n firstChunkSent = true;\n }\n }\n }\n },\n onToolCall: (name: string) => {\n // Notify client that tools are running (shows \"Thinking...\" state)\n safeWrite(`event: tool\\ndata: ${JSON.stringify({ name })}\\n\\n`);\n },\n },\n signal: abortController.signal,\n });\n\n // Flush remaining buffer\n if (tokenBuffer.trim()) {\n flushSentence(tokenBuffer);\n tokenBuffer = '';\n }\n\n // F5-TTS: generate audio in chunks of ~120 chars after LLM finishes.\n // Short enough for quality, long enough for voice consistency.\n if (isF5TTS && f5Sentences.length > 0) {\n const F5_MAX_CHUNK_CHARS = 600; // voice prompt limits to ~50 words; send as single chunk to avoid voice inconsistency\n const chunks: string[] = [];\n let current = '';\n for (const s of f5Sentences) {\n if (current && (current.length + s.length + 1) > F5_MAX_CHUNK_CHARS) {\n chunks.push(current);\n current = s;\n } else {\n current += (current ? ' ' : '') + s;\n }\n }\n if (current) chunks.push(current);\n\n let audioIdx = 0;\n for (const chunk of chunks) {\n if (clientDisconnected || totalTtsChars >= MAX_TTS_CHARS) break;\n totalTtsChars += chunk.length;\n try {\n const ttsRes = await fetch(`${effectiveTtsUrl}/v1/audio/speech`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ model: effectiveTtsModel, input: chunk, voice: voiceId, response_format: 'wav' }),\n signal: AbortSignal.timeout(120000),\n });\n if (ttsRes.ok && !clientDisconnected) {\n const audioBuffer = Buffer.from(await ttsRes.arrayBuffer());\n const audioBase64 = audioBuffer.toString('base64');\n safeWrite(`event: audio\\ndata: ${JSON.stringify({ index: audioIdx++, audio: audioBase64, format: 'wav' })}\\n\\n`);\n }\n } catch (e) {\n logger.debug('Gateway', `F5-TTS chunk ${audioIdx} failed: ${(e as Error).message}`);\n }\n }\n }\n\n // Signal no more sentences coming, wait for TTS queue to drain (non-F5 engines)\n ttsFinished = true;\n if (!ttsRunning && ttsQueue.length === 0) {\n ttsResolve();\n }\n if (!isF5TTS) {\n await ttsAllDone;\n }\n\n // ── Voice session poison detection ──────────────────────\n // If the model returned a canned/useless response, auto-reset the session\n // to prevent the next voice message from getting the same poisoned context.\n const responseText = response.content || '';\n if (VOICE_POISON_PATTERNS.some(p => p.test(responseText)) || (response.durationMs > 60000 && responseText.length < 50)) {\n logger.warn(COMPONENT, `[VoicePoisonGuard] Detected canned/stale response — resetting voice session ${response.sessionId}`);\n try {\n const { closeSession } = await import('../agent/session.js');\n closeSession(response.sessionId);\n } catch { /* session module may not export closeSession */ }\n }\n\n // Send done event with metadata\n if (!clientDisconnected) {\n safeWrite(`event: done\\ndata: ${JSON.stringify({\n sessionId: response.sessionId,\n model: response.model,\n durationMs: response.durationMs,\n toolsUsed: response.toolsUsed,\n fullText: response.content,\n })}\\n\\n`);\n try { res.end(); } catch { /* client gone */ }\n }\n } catch (error) {\n if (!clientDisconnected) {\n safeWrite(`event: done\\ndata: ${JSON.stringify({ error: (error as Error).message })}\\n\\n`);\n try { res.end(); } catch { /* client gone */ }\n }\n } finally {\n clearInterval(heartbeat);\n activeLlmRequests--;\n titanActiveSessions.dec();\n const durationSec = Number(process.hrtime.bigint() - startTime) / 1e9;\n titanRequestDuration.observe(durationSec, { channel });\n if (requestedSessionId) sessionAborts.delete(requestedSessionId);\n }\n });\n\n // Voice available voices — engine-aware\n app.get('/api/voice/voices', async (_req, res) => {\n const cfg = loadConfig();\n const engine = cfg.voice?.ttsEngine || 'f5-tts';\n const ttsUrl = cfg.voice?.ttsUrl || 'http://localhost:5006';\n\n if (engine === 'f5-tts') {\n // Return cloned voices from ~/.titan/voices/\n const voicesDir = join(homedir(), '.titan', 'voices');\n try {\n const files = fs.existsSync(voicesDir) ? fs.readdirSync(voicesDir).filter((f: string) => f.endsWith('.wav')) : [];\n const voiceNames = files.map((f: string) => f.replace('.wav', ''));\n // Always include 'default' as fallback\n const voices = voiceNames.length ? voiceNames : ['default'];\n res.json({ voices, engine: 'f5-tts' });\n } catch {\n res.json({ voices: ['default'], engine: 'f5-tts' });\n }\n return;\n }\n\n // F5-TTS (default)\n try {\n const ttsRes = await fetch(`${ttsUrl}/v1/audio/voices`, { signal: AbortSignal.timeout(3000) });\n if (!ttsRes.ok) { res.json({ voices: F5_TTS_DEFAULT_VOICES, engine: 'f5-tts' }); return; }\n const data = await ttsRes.json() as { voices?: string[] };\n res.json({ ...data, engine: 'f5-tts' });\n } catch {\n res.json({ voices: F5_TTS_DEFAULT_VOICES, engine: 'f5-tts' });\n }\n });\n\n // v4.3.3: simple GET TTS used by the /call live-voice page.\n // Query: text=..., voice=andrew, format=mp3, token=<bearer>\n // Returns: raw audio bytes. Designed for <audio src=\"...\"> tag usage so\n // the browser can stream + play without a fetch() + Blob dance.\n app.get('/api/voice/tts', async (req, res) => {\n try {\n const text = (req.query.text as string || '').slice(0, 2000);\n const voice = (req.query.voice as string) || 'andrew';\n const format = ((req.query.format as string) || 'mp3').toLowerCase();\n if (!text.trim()) { res.status(400).json({ error: 'text required' }); return; }\n\n // F5-TTS only as of v5.0 — voice.ttsUrl always points to the F5-TTS\n // server (default :5006). Andrew voice is the default reference clone.\n const cfg = loadConfig();\n const ttsUrl = cfg.voice?.ttsUrl || 'http://localhost:5006';\n\n const ttsRes = await fetch(`${ttsUrl}/v1/audio/speech`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ input: text, voice, response_format: format }),\n signal: AbortSignal.timeout(180_000),\n });\n\n if (!ttsRes || !ttsRes.ok) {\n res.status(502).json({ error: 'tts backends unavailable' });\n return;\n }\n\n const contentType = ttsRes.headers.get('content-type') || (format === 'wav' ? 'audio/wav' : 'audio/mpeg');\n const buf = Buffer.from(await ttsRes.arrayBuffer());\n res.setHeader('Content-Type', contentType);\n res.setHeader('Content-Length', String(buf.length));\n res.setHeader('Cache-Control', 'no-store');\n res.send(buf);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── F5-TTS Voice Cloning ─────────────────────────────────────────\n // (Orpheus TTS support removed in v5.0 — voice is F5-TTS only.)\n const F5_TTS_PORT = 5006;\n const F5_TTS_MODEL = 'f5-tts-mlx';\n\n app.get('/api/voice/f5tts/status', async (_req, res) => {\n let running = false;\n try {\n const probe = await fetch(`http://localhost:${F5_TTS_PORT}/health`, { signal: AbortSignal.timeout(3000) });\n running = probe.ok;\n } catch { /* not running */ }\n // List available cloned voices\n const voicesDir = join(homedir(), '.titan', 'voices');\n let voices: string[] = [];\n try {\n if (fs.existsSync(voicesDir)) {\n voices = fs.readdirSync(voicesDir)\n .filter((f: string) => f.endsWith('.wav'))\n .map((f: string) => f.replace('.wav', ''));\n }\n } catch { /* ignore */ }\n res.json({ installed: true, running, voices, port: F5_TTS_PORT, model: F5_TTS_MODEL });\n });\n\n // Tracks the spawned F5-TTS server pid. Variable is named for the legacy\n // venv directory (~/.titan/qwen3tts-venv) which we keep as a stable\n // on-disk path so existing installs aren't orphaned.\n let f5ttsPid: number | null = null;\n\n app.post('/api/voice/f5tts/install', async (_req, res) => {\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.flushHeaders();\n\n const send = (step: string, status: 'running' | 'done' | 'error', detail?: string) => {\n res.write(`data: ${JSON.stringify({ step, status, detail })}\\n\\n`);\n };\n\n const venvPath = join(homedir(), '.titan', 'qwen3tts-venv');\n const voicesDir = join(homedir(), '.titan', 'voices');\n\n try {\n // Step 1: Create venv\n send('venv', 'running', 'Creating Python virtual environment...');\n if (!fs.existsSync(join(venvPath, 'bin', 'python'))) {\n execSync(`python3 -m venv \"${venvPath}\"`, { timeout: 60000 });\n }\n send('venv', 'done');\n\n // Step 2: Install mlx-audio\n const pip = join(venvPath, 'bin', 'pip');\n send('install', 'running', 'Installing F5-TTS + MLX dependencies (this may take 2-3 minutes)...');\n execSync(`\"${pip}\" install f5-tts-mlx \"mlx-audio[server]\" \"setuptools<81\" numpy`, { timeout: 600000 });\n send('install', 'done');\n\n // Step 3: Create voices directory\n if (!fs.existsSync(voicesDir)) {\n fs.mkdirSync(voicesDir, { recursive: true });\n }\n\n // Step 4: Start the server\n send('start', 'running', 'Starting voice cloning server on port 5006...');\n const python = join(venvPath, 'bin', 'python');\n const serverScript = join(__dirname, '..', 'scripts', 'f5-tts-server.py');\n // Fall back to source path if dist path doesn't exist\n const scriptPath = fs.existsSync(serverScript)\n ? serverScript\n : join(__dirname, '..', '..', 'scripts', 'f5-tts-server.py');\n\n const child = spawn(python, [scriptPath, '--host', '127.0.0.1', '--port', String(5006)], {\n detached: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env, PATH: `${join(venvPath, 'bin')}:${process.env.PATH}` },\n });\n child.unref();\n f5ttsPid = child.pid ?? null;\n const pidFile = join(homedir(), '.titan', 'f5tts.pid');\n if (child.pid) fs.writeFileSync(pidFile, String(child.pid));\n\n // Wait for server to come up (model download + load)\n send('model', 'running', 'Downloading F5-TTS model (~500MB, first time only)...');\n let ready = false;\n for (let i = 0; i < 120; i++) { // up to 4 minutes\n await new Promise(r => setTimeout(r, 2000));\n try {\n const probe = await fetch(`http://localhost:${5006}/health`, { signal: AbortSignal.timeout(5000) });\n if (probe.ok) { ready = true; break; }\n } catch { /* still loading */ }\n }\n if (ready) {\n send('model', 'done');\n send('complete', 'done', 'Voice cloning server is ready! (F5-TTS)');\n } else {\n send('model', 'error', 'Server started but model loading timed out. It may still be downloading — try again in a few minutes.');\n }\n } catch (e) {\n send('error', 'error', (e as Error).message);\n }\n res.end();\n });\n\n // Canonical F5-TTS lifecycle handlers. Both legacy /qwen3tts/* and the\n // new /f5tts/* routes call the same implementation so existing UIs\n // (which may still POST to /qwen3tts/start|stop) keep working through\n // v5.x. The /qwen3tts/* aliases are deprecated and will be removed in v6.\n const stopF5TTSHandler = (_req: import('express').Request, res: import('express').Response) => {\n // Both legacy and canonical pid-file locations are checked so an upgrade\n // from a v4-era install with .titan/qwen3tts.pid still cleans up.\n const candidates = [\n join(homedir(), '.titan', 'f5tts.pid'),\n join(homedir(), '.titan', 'qwen3tts.pid'),\n ];\n try {\n for (const pidFile of candidates) {\n if (!fs.existsSync(pidFile)) continue;\n const pid = parseInt(fs.readFileSync(pidFile, 'utf-8').trim());\n try { process.kill(pid, 'SIGTERM'); } catch { /* already dead */ }\n try { fs.unlinkSync(pidFile); } catch { /* already gone */ }\n }\n f5ttsPid = null;\n res.json({ ok: true });\n } catch (e) {\n res.json({ ok: false, error: (e as Error).message });\n }\n };\n\n const startF5TTSHandler = async (_req: import('express').Request, res: import('express').Response) => {\n const venvPath = join(homedir(), '.titan', 'qwen3tts-venv');\n const python = join(venvPath, 'bin', 'python');\n const pidFile = join(homedir(), '.titan', 'f5tts.pid');\n\n if (!fs.existsSync(python)) {\n res.status(400).json({ ok: false, error: 'F5-TTS not installed. Use POST /api/voice/f5tts/install first.' });\n return;\n }\n\n // Check if already running\n try {\n const probe = await fetch(`http://localhost:${5006}/health`, { signal: AbortSignal.timeout(3000) });\n if (probe.ok) {\n res.json({ ok: true, message: 'F5-TTS is already running' });\n return;\n }\n } catch { /* not running, start it */ }\n\n try {\n const serverScript = join(__dirname, '..', 'scripts', 'f5-tts-server.py');\n const scriptPath = fs.existsSync(serverScript)\n ? serverScript\n : join(__dirname, '..', '..', 'scripts', 'f5-tts-server.py');\n\n const child = spawn(python, [scriptPath, '--host', '127.0.0.1', '--port', String(5006)], {\n detached: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env, PATH: `${join(venvPath, 'bin')}:${process.env.PATH}` },\n });\n child.unref();\n f5ttsPid = child.pid ?? null;\n if (child.pid) fs.writeFileSync(pidFile, String(child.pid));\n res.json({ ok: true, message: 'F5-TTS server starting — model loading may take a minute.' });\n } catch (e) {\n res.status(500).json({ ok: false, error: (e as Error).message });\n }\n };\n\n // Canonical routes (v5.0+).\n app.post('/api/voice/f5tts/stop', stopF5TTSHandler);\n app.post('/api/voice/f5tts/start', startF5TTSHandler);\n\n // Deprecated aliases — kept for backward compatibility with v4.x UIs.\n // Will be removed in v6. Logged so we can see if anything still calls them.\n const deprecationWarn = (alias: string, canonical: string) => {\n logger.warn(COMPONENT, `Deprecated route ${alias} called; please switch to ${canonical}.`);\n };\n app.post('/api/voice/qwen3tts/stop', (req, res) => {\n deprecationWarn('/api/voice/qwen3tts/stop', '/api/voice/f5tts/stop');\n return stopF5TTSHandler(req, res);\n });\n app.post('/api/voice/qwen3tts/start', (req, res) => {\n deprecationWarn('/api/voice/qwen3tts/start', '/api/voice/f5tts/start');\n return startF5TTSHandler(req, res);\n });\n\n // Upload reference audio for voice cloning\n app.post('/api/voice/clone/upload', async (req, res) => {\n try {\n const voicesDir = join(homedir(), '.titan', 'voices');\n if (!fs.existsSync(voicesDir)) fs.mkdirSync(voicesDir, { recursive: true });\n\n // Accept raw binary with voice name in query/header, or base64 JSON body\n const voiceName = (req.query.name as string) || req.headers['x-voice-name'] as string || 'custom';\n const safeName = voiceName.replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 50) || 'custom';\n const transcript = (req.query.transcript as string) || req.headers['x-voice-transcript'] as string || '';\n\n const contentType = req.headers['content-type'] || '';\n\n if (contentType.includes('application/json')) {\n // JSON body with base64 audio\n const body = req.body as { audio?: string; name?: string; transcript?: string };\n if (!body.audio) { res.status(400).json({ error: 'audio (base64) is required' }); return; }\n const audioBuffer = Buffer.from(body.audio, 'base64');\n const name = body.name?.replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 50) || safeName;\n fs.writeFileSync(join(voicesDir, `${name}.wav`), audioBuffer);\n if (body.transcript || transcript) {\n fs.writeFileSync(join(voicesDir, `${name}.txt`), body.transcript || transcript);\n }\n res.json({ ok: true, voice: name, path: join(voicesDir, `${name}.wav`) });\n } else {\n // Raw binary upload\n const chunks: Buffer[] = [];\n req.on('data', (chunk: Buffer) => chunks.push(chunk));\n req.on('end', () => {\n const audioBuffer = Buffer.concat(chunks);\n fs.writeFileSync(join(voicesDir, `${safeName}.wav`), audioBuffer);\n if (transcript) {\n fs.writeFileSync(join(voicesDir, `${safeName}.txt`), transcript);\n }\n res.json({ ok: true, voice: safeName, path: join(voicesDir, `${safeName}.wav`) });\n });\n }\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // List available cloned voices\n app.get('/api/voice/clone/voices', (_req, res) => {\n const voicesDir = join(homedir(), '.titan', 'voices');\n try {\n if (!fs.existsSync(voicesDir)) { res.json({ voices: [] }); return; }\n const voices = fs.readdirSync(voicesDir)\n .filter((f: string) => f.endsWith('.wav'))\n .map((f: string) => {\n const name = f.replace('.wav', '');\n const hasTranscript = fs.existsSync(join(voicesDir, `${name}.txt`));\n const stat = fs.statSync(join(voicesDir, f));\n return { name, hasTranscript, sizeBytes: stat.size };\n });\n res.json({ voices });\n } catch (e) {\n res.json({ voices: [], error: (e as Error).message });\n }\n });\n\n // Delete a cloned voice\n app.delete('/api/voice/clone/:name', (req, res) => {\n const voicesDir = join(homedir(), '.titan', 'voices');\n const name = req.params.name.replace(/[^a-zA-Z0-9_-]/g, '');\n try {\n const wavPath = join(voicesDir, `${name}.wav`);\n const txtPath = join(voicesDir, `${name}.txt`);\n if (fs.existsSync(wavPath)) fs.unlinkSync(wavPath);\n if (fs.existsSync(txtPath)) fs.unlinkSync(txtPath);\n res.json({ ok: true });\n } catch (e) {\n res.json({ ok: false, error: (e as Error).message });\n }\n });\n\n // ── Tunnel ─────────────────────────────────────────────────\n app.get('/api/tunnel/status', (_req, res) => {\n res.json(getTunnelStatus());\n });\n\n // ── Google OAuth Endpoints ───────────────────────────────\n function getGoogleRedirectUri(): string {\n const cfg = loadConfig();\n const publicUrl = (cfg.gateway as Record<string, unknown>).publicUrl as string | undefined;\n return publicUrl\n ? `${publicUrl}/api/auth/google/callback`\n : `http://localhost:${port}/api/auth/google/callback`;\n }\n\n app.get('/api/auth/google/status', (_req, res) => {\n res.json({ connected: isGoogleConnected(), email: getGoogleEmail() });\n });\n\n app.get('/api/auth/google/start', (req, res) => {\n try {\n const url = getConsentUrl(getGoogleRedirectUri());\n res.redirect(url);\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/auth/google/callback', async (req, res) => {\n const code = req.query.code as string;\n if (!code) { res.status(400).send('Missing authorization code'); return; }\n try {\n await exchangeCode(code, getGoogleRedirectUri());\n // Redirect back to dashboard\n res.redirect('/?google_connected=1');\n } catch (err) {\n res.status(500).send(`OAuth failed: ${(err as Error).message}`);\n }\n });\n\n app.post('/api/auth/google/disconnect', (_req, res) => {\n disconnectGoogle();\n res.json({ ok: true });\n });\n\n // ── SOUL.md Endpoints ───────────────────────────────────\n app.get('/api/soul', (_req, res) => {\n try {\n const cfg = loadConfig();\n const soulPath = join(cfg.agent.workspace || TITAN_WORKSPACE, 'SOUL.md');\n if (fs.existsSync(soulPath)) {\n res.json({ content: fs.readFileSync(soulPath, 'utf-8') });\n } else {\n res.json({ content: '' });\n }\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/soul', (req, res) => {\n try {\n const cfg = loadConfig();\n const workspace = cfg.agent.workspace || TITAN_WORKSPACE;\n const soulPath = join(workspace, 'SOUL.md');\n\n // Ensure workspace directory exists\n if (!fs.existsSync(workspace)) fs.mkdirSync(workspace, { recursive: true });\n\n const { content, aboutMe, personality } = req.body as {\n content?: string;\n aboutMe?: string;\n personality?: string;\n };\n\n if (content !== undefined) {\n // Raw content save (from Settings editor)\n fs.writeFileSync(soulPath, content, 'utf-8');\n } else if (aboutMe || personality) {\n // Generate from onboarding template\n const soulContent = [\n '# SOUL.md - Who You Are',\n '',\n '## About Your Human',\n aboutMe || '(Not yet described)',\n '',\n '## Your Personality',\n personality || '(Not yet defined)',\n '',\n '## Core Principles',\n '- Be genuinely helpful, not performatively helpful',\n '- Have opinions and preferences',\n '- Be resourceful before asking',\n '- Earn trust through competence',\n '',\n '## Boundaries',\n '- Private things stay private',\n '- Ask before acting externally',\n '- Never send half-baked replies to messaging surfaces',\n '',\n `_This file evolves as you learn. Update it when you discover new preferences._`,\n ].join('\\n');\n fs.writeFileSync(soulPath, soulContent, 'utf-8');\n } else {\n res.status(400).json({ error: 'Provide either \"content\" or \"aboutMe\"/\"personality\"' });\n return;\n }\n\n logger.info(COMPONENT, 'SOUL.md updated via API');\n res.json({ success: true });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Activity Feed ────────────────────────────────────────\n\n app.get('/api/activity/recent', (req, res) => {\n try {\n const logPath = getLogFilePath();\n if (!logPath || !fs.existsSync(logPath)) {\n res.json({ events: [] });\n return;\n }\n const limit = req.query.limit ? parseInt(req.query.limit as string, 10) : 200;\n const filter = (req.query.filter as string) || 'all';\n const stats = fs.statSync(logPath);\n const readSize = Math.min(stats.size, 200000); // Read last 200KB\n const fd = fs.openSync(logPath, 'r');\n const buf = Buffer.alloc(readSize);\n fs.readSync(fd, buf, 0, readSize, Math.max(0, stats.size - readSize));\n fs.closeSync(fd);\n const content = buf.toString('utf-8');\n const rawLines = content.split('\\n').filter(Boolean);\n const lines = stats.size > readSize ? rawLines.slice(1) : rawLines;\n\n // Classify log lines into activity event types\n const classifyEvent = (message: string, component: string): string => {\n const lc = message.toLowerCase();\n const cc = component.toLowerCase();\n if (cc.includes('toolrunner') || lc.includes('executing tool') || lc.includes('tool:')) return 'tool';\n if (cc.includes('agent') || lc.includes('processing message') || lc.includes('response')) return 'agent';\n if (cc.includes('autopilot')) return 'autopilot';\n if (cc.includes('goal')) return 'goal';\n if (cc.includes('websearch') || cc.includes('browse') || lc.includes('search')) return 'search';\n if (cc.includes('autonomy') || lc.includes('autonomy')) return 'autonomy';\n if (cc.includes('router') || cc.includes('provider')) return 'router';\n if (cc.includes('graph') || cc.includes('memory')) return 'graph';\n if (lc.includes('error') || lc.includes('fail')) return 'error';\n return 'system';\n };\n\n const events = lines\n .map((line) => {\n const match = line.match(/^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})\\s+(DEBUG|INFO|WARN|ERROR)\\s+(?:\\[([^\\]]+)\\]\\s+)?(.*)$/);\n if (!match) return null;\n const [, timestamp, level, component = 'System', message] = match;\n const type = classifyEvent(message, component);\n return { timestamp, level: level.toLowerCase(), component, message, type };\n })\n .filter((e): e is NonNullable<typeof e> => {\n if (!e) return false;\n if (e.level === 'debug') return false; // Skip debug noise\n if (filter === 'all') return true;\n if (filter === 'errors') return e.level === 'error' || e.level === 'warn';\n return e.type === filter;\n })\n .slice(-limit)\n .reverse(); // Newest first\n\n res.json({ events });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/activity/summary', (_req, res) => {\n try {\n const cfg = loadConfig();\n const sessions = listSessions();\n const usage = getUsageStats();\n const autopilot = getAutopilotStatus();\n const goals = listGoals();\n\n // Count tool calls from usage stats\n const toolCalls = (usage as Record<string, unknown>).toolCalls ?? (usage as Record<string, unknown>).totalToolCalls ?? 0;\n\n // Determine current status\n let status: 'idle' | 'processing' | 'autopilot' = 'idle';\n if (activeLlmRequests > 0) status = 'processing';\n if (autopilot.isRunning) status = 'autopilot';\n\n // Get last activity from log\n let lastActivity: string | null = null;\n try {\n const logPath = getLogFilePath();\n if (logPath && fs.existsSync(logPath)) {\n const stat = fs.statSync(logPath);\n lastActivity = stat.mtime.toISOString();\n }\n } catch { /* ignore */ }\n\n // Graph stats\n let graphStats = { entities: 0, edges: 0 };\n try {\n const gd = getGraphData();\n graphStats = { entities: gd.nodes.length, edges: gd.edges.length };\n } catch { /* graph may not be initialized */ }\n\n const activeGoals = goals.filter((g) => g.status !== 'completed' && g.status !== 'failed');\n\n res.json({\n activeSessions: sessions.length,\n toolCallsLast24h: toolCalls,\n autopilotRunsToday: autopilot.totalRuns ?? 0,\n autopilotEnabled: autopilot.enabled ?? false,\n autopilotNextRun: autopilot.nextRunEstimate ?? null,\n activeGoals: activeGoals.length,\n goals: activeGoals.slice(0, 5).map((g) => ({\n id: g.id,\n title: g.title,\n progress: g.progress ?? (g.subtasks\n ? Math.round((g.subtasks.filter((s) => s.status === 'done').length / Math.max(g.subtasks.length, 1)) * 100)\n : 0),\n })),\n lastActivity,\n currentModel: cfg.agent.model,\n autonomyMode: cfg.autonomy?.mode ?? 'supervised',\n status,\n graphStats,\n });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── API Documentation ────────────────────────────────────\n // ── Browser automation endpoints ─────────────────────────\n app.post('/api/browser/form-fill', async (req, res) => {\n const { url, data, submit, postClicks } = req.body;\n if (!url || typeof url !== 'string') {\n return res.status(400).json({ success: false, error: 'url is required (string)' });\n }\n if (!data || typeof data !== 'object') {\n return res.status(400).json({ success: false, error: 'data is required (Record<string, string>)' });\n }\n try {\n const { getPage, releasePage } = await import('../browsing/browserPool.js');\n const { fillFormSmart } = await import('../skills/builtin/web_browse_llm.js');\n const page = await getPage();\n const session = { page, lastUsed: Date.now(), elements: new Map<number, string>() };\n try {\n // If postClicks are specified, defer submit to after clicks\n const deferSubmit = Array.isArray(postClicks) && postClicks.length > 0 && submit;\n const result = await fillFormSmart(session as any, url, data as Record<string, string>, deferSubmit ? false : (submit ?? false));\n\n // Post-fill clicks: click elements by text content or CSS selector after form is filled\n const clickResults: string[] = [];\n if (Array.isArray(postClicks)) {\n for (const click of postClicks) {\n try {\n if (typeof click === 'string') {\n // Try text-based click first (button, radio, label), then CSS selector\n const clicked = await page.evaluate((text: string) => {\n const els = Array.from(document.querySelectorAll('button, input[type=\"radio\"], label, [role=\"button\"], [role=\"radio\"]'));\n for (const el of els) {\n const elText = (el as HTMLElement).textContent?.trim() || '';\n if (elText.toLowerCase() === text.toLowerCase() || elText.toLowerCase().includes(text.toLowerCase())) {\n (el as HTMLElement).click();\n return elText;\n }\n }\n return null;\n }, click);\n if (clicked) {\n clickResults.push(`✅ Clicked \"${clicked}\"`);\n } else {\n // Fallback: try as CSS selector\n try {\n await page.click(click, { timeout: 3000 });\n clickResults.push(`✅ Clicked selector: ${click}`);\n } catch {\n clickResults.push(`❌ Could not find: \"${click}\"`);\n }\n }\n await page.waitForTimeout(500);\n }\n } catch (e) {\n clickResults.push(`❌ Error clicking \"${click}\": ${(e as Error).message?.split('\\n')[0]}`);\n }\n }\n }\n\n // Now solve CAPTCHA and submit if deferred\n if (deferSubmit) {\n try {\n const { solveCaptcha } = await import('../browsing/captchaSolver.js');\n const solveResult = await solveCaptcha(page as unknown as import('playwright').Page);\n if (solveResult.solved) {\n clickResults.push(`✅ ${solveResult.type} solved via CapSolver`);\n } else if (solveResult.error) {\n clickResults.push(`⚠️ CAPTCHA: ${solveResult.error}`);\n }\n } catch { /* CapSolver not available */ }\n\n // Click submit button\n try {\n const submitClicked = await page.evaluate(() => {\n const btns = Array.from(document.querySelectorAll('button, [type=\"submit\"], [role=\"button\"]'));\n for (const btn of btns) {\n const text = (btn as HTMLElement).textContent?.trim().toLowerCase() || '';\n if (text.includes('submit') || text.includes('apply')) {\n (btn as HTMLElement).click();\n return (btn as HTMLElement).textContent?.trim();\n }\n }\n return null;\n });\n if (submitClicked) {\n clickResults.push(`✅ Clicked submit: \"${submitClicked}\"`);\n // Wait for navigation/response\n await page.waitForTimeout(3000);\n // Check if page changed (success indicator)\n const finalUrl = page.url();\n const finalTitle = await page.evaluate(() => document.title);\n clickResults.push(`📄 Final page: \"${finalTitle}\" — ${finalUrl}`);\n } else {\n clickResults.push(`❌ Could not find submit button`);\n }\n } catch (e) {\n clickResults.push(`❌ Submit error: ${(e as Error).message?.split('\\n')[0]}`);\n }\n }\n\n const fullResult = clickResults.length > 0\n ? result + '\\n\\nPost-fill clicks:\\n' + clickResults.join('\\n')\n : result;\n const lines = fullResult.split('\\n');\n const fieldsMatched = lines.filter((l: string) => l.startsWith('✅')).length;\n const fieldsFailed = lines.filter((l: string) => l.startsWith('❌'))\n .map((l: string) => l.replace(/^❌\\s*/, '').split(':')[0]?.trim() || '');\n return res.json({ success: fieldsFailed.length === 0, result: fullResult, fieldsMatched, fieldsFailed });\n } finally {\n await releasePage(page);\n }\n } catch (e) {\n logger.error(COMPONENT, `form-fill error: ${(e as Error).message}`);\n return res.status(500).json({ success: false, error: (e as Error).message });\n }\n });\n\n app.post('/api/browser/solve-captcha', async (req, res) => {\n const { url } = req.body;\n if (!url || typeof url !== 'string') {\n return res.status(400).json({ solved: false, error: 'url is required (string)' });\n }\n try {\n const { getPage, releasePage } = await import('../browsing/browserPool.js');\n const { solveCaptcha } = await import('../browsing/captchaSolver.js');\n const page = await getPage();\n try {\n await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30_000 });\n await page.waitForTimeout(3000);\n const result = await solveCaptcha(page);\n return res.json(result);\n } finally {\n await releasePage(page);\n }\n } catch (e) {\n logger.error(COMPONENT, `solve-captcha error: ${(e as Error).message}`);\n return res.status(500).json({ solved: false, error: (e as Error).message });\n }\n });\n\n app.get('/api/docs', (_req, res) => {\n const spec = {\n openapi: '3.0.0',\n info: {\n title: 'TITAN Gateway API',\n version: TITAN_VERSION,\n description: 'REST API for the TITAN autonomous AI agent framework.',\n },\n paths: {\n '/login': { get: { summary: 'Login page', tags: ['Auth'] } },\n '/api/login': { post: { summary: 'Authenticate with password', tags: ['Auth'], requestBody: { content: { 'application/json': { schema: { type: 'object', properties: { password: { type: 'string' } } } } } } } },\n '/': { get: { summary: 'Dashboard UI', tags: ['System'] } },\n '/api/stats': { get: { summary: 'System stats (version, uptime, memory)', tags: ['System'] } },\n '/api/health': { get: { summary: 'Provider health check', tags: ['System'] } },\n '/api/update': { get: { summary: 'Check for updates', tags: ['System'] },\n post: { summary: 'Trigger update', tags: ['System'] } },\n '/api/costs': { get: { summary: 'Cost optimizer status', tags: ['System'] } },\n '/api/sessions': { get: { summary: 'List active sessions', tags: ['Sessions'] } },\n '/api/sessions/{id}': { get: { summary: 'Get session history by ID', tags: ['Sessions'], parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }] } },\n '/api/sessions/{id}/close':{ post: { summary: 'Close/drop a session', tags: ['Sessions'], parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }] } },\n '/api/agents': { get: { summary: 'List agents and capacity', tags: ['Agents'] } },\n '/api/agents/spawn': { post: { summary: 'Spawn new agent', tags: ['Agents'], requestBody: { content: { 'application/json': { schema: { type: 'object', properties: { name: { type: 'string' }, model: { type: 'string' } } } } } } } },\n '/api/agents/stop': { post: { summary: 'Stop an agent', tags: ['Agents'], requestBody: { content: { 'application/json': { schema: { type: 'object', properties: { id: { type: 'string' } } } } } } } },\n '/api/skills': { get: { summary: 'List loaded skills', tags: ['Skills'] } },\n '/api/tools': { get: { summary: 'List registered tools', tags: ['Skills'] } },\n '/api/channels': { get: { summary: 'List channel statuses', tags: ['Channels'] } },\n '/api/message': { post: { summary: 'Send a message', tags: ['Channels'], requestBody: { content: { 'application/json': { schema: { type: 'object', properties: { content: { type: 'string' }, channel: { type: 'string' }, userId: { type: 'string' } } } } } } } },\n '/api/chat/stream': { post: { summary: 'Stream chat via SSE', tags: ['Channels'], requestBody: { content: { 'application/json': { schema: { type: 'object', properties: { message: { type: 'string' }, model: { type: 'string' } } } } } } } },\n '/api/config': { get: { summary: 'Get current config', tags: ['Config'] },\n post: { summary: 'Update config', tags: ['Config'] } },\n '/api/security': { get: { summary: 'Security audit results', tags: ['Config'] } },\n '/api/providers': { get: { summary: 'List configured providers', tags: ['Config'] } },\n '/api/models': { get: { summary: 'List available models', tags: ['Models'] } },\n '/api/models/discover': { get: { summary: 'Discover models from all providers', tags: ['Models'] } },\n '/api/model/switch': { post: { summary: 'Switch active model', tags: ['Models'], requestBody: { content: { 'application/json': { schema: { type: 'object', properties: { model: { type: 'string' } } } } } } } },\n '/api/profile': { get: { summary: 'Get personal profile', tags: ['Memory'] },\n post: { summary: 'Update personal profile', tags: ['Memory'] } },\n '/api/learning': { get: { summary: 'Learning engine stats', tags: ['Memory'] } },\n '/api/graphiti': { get: { summary: 'Memory graph data', tags: ['Memory'] },\n delete: { summary: 'Clear memory graph', tags: ['Memory'] } },\n '/api/data': { delete: { summary: 'Full data reset (graph+knowledge+memory)', tags: ['Memory'] } },\n '/api/mesh/hello': { get: { summary: 'Mesh hello/handshake', tags: ['Mesh'] } },\n '/api/mesh/peers': { get: { summary: 'List connected mesh peers', tags: ['Mesh'] } },\n '/api/mesh/models': { get: { summary: 'List mesh models', tags: ['Mesh'] } },\n '/api/mesh/pending': { get: { summary: 'List peers awaiting approval', tags: ['Mesh'] } },\n '/api/mesh/approve/:nodeId': { post: { summary: 'Approve a discovered peer', tags: ['Mesh'] } },\n '/api/mesh/reject/:nodeId': { post: { summary: 'Reject a pending peer', tags: ['Mesh'] } },\n '/api/mesh/revoke/:nodeId': { post: { summary: 'Disconnect and revoke a peer', tags: ['Mesh'] } },\n '/api/mesh/status': { get: { summary: 'Mesh health status and connectivity', tags: ['Mesh'] } },\n '/api/mesh/routes': { get: { summary: 'Mesh routing table (multi-hop routes)', tags: ['Mesh'] } },\n '/api/teams': { get: { summary: 'List all teams', tags: ['Teams'] },\n post: { summary: 'Create a new team', tags: ['Teams'] } },\n '/api/teams/{teamId}': { get: { summary: 'Get team details', tags: ['Teams'] },\n patch: { summary: 'Update team settings', tags: ['Teams'] },\n delete: { summary: 'Delete a team', tags: ['Teams'] } },\n '/api/teams/{teamId}/members': { get: { summary: 'List team members', tags: ['Teams'] },\n post: { summary: 'Add a team member', tags: ['Teams'] } },\n '/api/teams/{teamId}/members/{userId}': { delete: { summary: 'Remove a team member', tags: ['Teams'] } },\n '/api/teams/{teamId}/members/{userId}/role': { patch: { summary: 'Update member role', tags: ['Teams'] } },\n '/api/teams/{teamId}/invites': { post: { summary: 'Create invite code', tags: ['Teams'] } },\n '/api/teams/join': { post: { summary: 'Join team via invite code', tags: ['Teams'] } },\n '/api/teams/{teamId}/permissions/{userId}': { get: { summary: 'Get user permissions', tags: ['Teams'] } },\n '/api/teams/{teamId}/roles/{role}/permissions': { put: { summary: 'Set role permissions', tags: ['Teams'] } },\n '/api/sessions/search': { get: { summary: 'Search conversations', tags: ['Sessions'], parameters: [{ name: 'q', in: 'query', schema: { type: 'string' } }, { name: 'limit', in: 'query', schema: { type: 'integer' } }] } },\n '/api/sessions/{id}/export': { get: { summary: 'Export session (JSON or Markdown)', tags: ['Sessions'], parameters: [{ name: 'format', in: 'query', schema: { type: 'string', enum: ['json', 'markdown'] } }] } },\n '/api/files/upload': { post: { summary: 'Upload file (raw body, X-Filename header)', tags: ['Files'] } },\n '/api/files/uploads': { get: { summary: 'List uploaded files', tags: ['Files'], parameters: [{ name: 'session', in: 'query', schema: { type: 'string' } }] } },\n '/api/files/uploads/{name}': { delete: { summary: 'Delete uploaded file', tags: ['Files'] } },\n '/api/usage': { get: { summary: 'Usage tracking per model (tokens, costs)', tags: ['System'], parameters: [{ name: 'hours', in: 'query', schema: { type: 'integer' } }] } },\n '/api/logs': { get: { summary: 'Read log file', tags: ['Logs'], parameters: [{ name: 'lines', in: 'query', schema: { type: 'integer' } }] } },\n '/api/voice/status': { get: { summary: 'Voice server status and availability', tags: ['Voice'] } },\n '/api/voice/config': { get: { summary: 'Voice configuration', tags: ['Voice'] } },\n '/api/tunnel/status': { get: { summary: 'Cloudflare tunnel status', tags: ['Tunnel'] } },\n '/api/autopilot/status': { get: { summary: 'Autopilot status', tags: ['Autopilot'] } },\n '/api/autopilot/history': { get: { summary: 'Autopilot run history', tags: ['Autopilot'] } },\n '/api/autopilot/run': { post: { summary: 'Trigger autopilot run', tags: ['Autopilot'] } },\n '/metrics': { get: { summary: 'Prometheus metrics endpoint', tags: ['Telemetry'] } },\n '/api/metrics/summary': { get: { summary: 'Metrics summary (JSON)', tags: ['Telemetry'] } },\n '/api/docs': { get: { summary: 'OpenAPI spec (JSON)', tags: ['Docs'] } },\n '/docs': { get: { summary: 'API documentation page', tags: ['Docs'] } },\n },\n };\n res.json(spec);\n });\n\n app.get('/docs', (_req, res) => {\n const endpoints = [\n { cat: 'Auth', routes: [\n { method: 'GET', path: '/login', desc: 'Login page' },\n { method: 'POST', path: '/api/login', desc: 'Authenticate (body: {password})' },\n ]},\n { cat: 'System', routes: [\n { method: 'GET', path: '/', desc: 'Dashboard UI' },\n { method: 'GET', path: '/api/stats', desc: 'System stats (version, uptime, memory, tokens, requests)' },\n { method: 'GET', path: '/api/health', desc: 'Provider health check' },\n { method: 'GET', path: '/api/costs', desc: 'Cost optimizer status' },\n { method: 'GET', path: '/api/update', desc: 'Check for updates' },\n { method: 'POST', path: '/api/update', desc: 'Trigger update' },\n ]},\n { cat: 'Sessions', routes: [\n { method: 'GET', path: '/api/sessions', desc: 'List active sessions' },\n { method: 'GET', path: '/api/sessions/:id', desc: 'Get session history by ID' },\n { method: 'GET', path: '/api/sessions/search', desc: 'Search conversations (query: q, limit)' },\n { method: 'GET', path: '/api/sessions/:id/export', desc: 'Export session (query: format=json|markdown)' },\n { method: 'POST', path: '/api/sessions/:id/close', desc: 'Close/drop a session' },\n ]},\n { cat: 'Files', routes: [\n { method: 'GET', path: '/api/files', desc: 'Browse TITAN home directory' },\n { method: 'GET', path: '/api/files/read', desc: 'Read file contents (query: path)' },\n { method: 'POST', path: '/api/files/upload', desc: 'Upload file (raw body, X-Filename header)' },\n { method: 'GET', path: '/api/files/uploads', desc: 'List uploaded files (query: session)' },\n { method: 'DELETE', path: '/api/files/uploads/:name', desc: 'Delete uploaded file' },\n ]},\n { cat: 'Usage', routes: [\n { method: 'GET', path: '/api/usage', desc: 'Usage tracking per model (query: hours)' },\n { method: 'GET', path: '/api/costs', desc: 'Cost optimizer status' },\n ]},\n { cat: 'Agents', routes: [\n { method: 'GET', path: '/api/agents', desc: 'List agents + capacity' },\n { method: 'POST', path: '/api/agents/spawn', desc: 'Spawn new agent (body: {name, model?})' },\n { method: 'POST', path: '/api/agents/stop', desc: 'Stop agent (body: {id})' },\n ]},\n { cat: 'Skills', routes: [\n { method: 'GET', path: '/api/skills', desc: 'List loaded skills' },\n { method: 'GET', path: '/api/tools', desc: 'List registered tools' },\n ]},\n { cat: 'Channels', routes: [\n { method: 'GET', path: '/api/channels', desc: 'List channel statuses' },\n { method: 'POST', path: '/api/message', desc: 'Send message (body: {content, channel?, userId?})' },\n { method: 'POST', path: '/api/chat/stream', desc: 'Stream chat (SSE, body: {message, model?})' },\n ]},\n { cat: 'Config', routes: [\n { method: 'GET', path: '/api/config', desc: 'Get config' },\n { method: 'POST', path: '/api/config', desc: 'Update config' },\n { method: 'GET', path: '/api/security', desc: 'Security audit results' },\n { method: 'GET', path: '/api/providers', desc: 'List configured providers' },\n ]},\n { cat: 'Models', routes: [\n { method: 'GET', path: '/api/models', desc: 'List available models' },\n { method: 'GET', path: '/api/models/discover', desc: 'Discover models from all providers' },\n { method: 'POST', path: '/api/model/switch', desc: 'Switch model (body: {model})' },\n ]},\n { cat: 'Mesh', routes: [\n { method: 'GET', path: '/api/mesh/hello', desc: 'Mesh hello/handshake' },\n { method: 'GET', path: '/api/mesh/peers', desc: 'List connected peers' },\n { method: 'GET', path: '/api/mesh/models', desc: 'List mesh models' },\n { method: 'GET', path: '/api/mesh/pending', desc: 'List peers awaiting approval' },\n { method: 'POST', path: '/api/mesh/approve/:id', desc: 'Approve a discovered peer' },\n { method: 'POST', path: '/api/mesh/reject/:id', desc: 'Reject a pending peer' },\n { method: 'POST', path: '/api/mesh/revoke/:id', desc: 'Disconnect & revoke a peer' },\n { method: 'GET', path: '/api/mesh/status', desc: 'Mesh health status and connectivity' },\n { method: 'GET', path: '/api/mesh/routes', desc: 'Mesh routing table (multi-hop)' },\n ]},\n { cat: 'Teams', routes: [\n { method: 'GET', path: '/api/teams', desc: 'List all teams' },\n { method: 'POST', path: '/api/teams', desc: 'Create a new team' },\n { method: 'GET', path: '/api/teams/:id', desc: 'Get team details' },\n { method: 'PATCH',path: '/api/teams/:id', desc: 'Update team settings' },\n { method: 'DELETE',path: '/api/teams/:id', desc: 'Delete a team' },\n { method: 'GET', path: '/api/teams/:id/members', desc: 'List team members' },\n { method: 'POST', path: '/api/teams/:id/members', desc: 'Add a member' },\n { method: 'DELETE',path: '/api/teams/:id/members/:uid', desc: 'Remove a member' },\n { method: 'PATCH',path: '/api/teams/:id/members/:uid/role', desc: 'Change member role' },\n { method: 'POST', path: '/api/teams/:id/invites', desc: 'Create invite code' },\n { method: 'POST', path: '/api/teams/join', desc: 'Join via invite code' },\n { method: 'GET', path: '/api/teams/:id/permissions/:uid', desc: 'Get user permissions' },\n ]},\n { cat: 'Memory', routes: [\n { method: 'GET', path: '/api/profile', desc: 'Get personal profile' },\n { method: 'POST', path: '/api/profile', desc: 'Update profile' },\n { method: 'GET', path: '/api/learning', desc: 'Learning engine stats' },\n { method: 'GET', path: '/api/graphiti', desc: 'Memory graph data' },\n { method: 'DELETE', path: '/api/graphiti', desc: 'Clear memory graph' },\n { method: 'DELETE', path: '/api/data', desc: 'Full data reset' },\n ]},\n { cat: 'Autopilot', routes: [\n { method: 'GET', path: '/api/autopilot/status', desc: 'Autopilot status' },\n { method: 'GET', path: '/api/autopilot/history', desc: 'Autopilot run history' },\n { method: 'POST', path: '/api/autopilot/run', desc: 'Trigger autopilot run' },\n ]},\n { cat: 'Social', routes: [\n { method: 'GET', path: '/api/social/state', desc: 'Social autopilot state + queue + recent posts' },\n { method: 'POST', path: '/api/social/autopilot/toggle', desc: 'Enable/disable autopilot' },\n { method: 'POST', path: '/api/social/post', desc: 'Post to Facebook immediately' },\n { method: 'POST', path: '/api/social/drafts/:id/approve', desc: 'Approve a queued draft' },\n { method: 'POST', path: '/api/social/drafts/:id/reject', desc: 'Reject a queued draft' },\n { method: 'GET', path: '/api/social/graph-context', desc: 'Recent social post topics from Graphiti' },\n ]},\n { cat: 'Telemetry', routes: [\n { method: 'GET', path: '/metrics', desc: 'Prometheus text exposition format' },\n { method: 'GET', path: '/api/metrics/summary', desc: 'Metrics summary (JSON)' },\n ]},\n { cat: 'Voice', routes: [\n { method: 'GET', path: '/api/voice/status', desc: 'Voice server status and availability' },\n { method: 'GET', path: '/api/voice/config', desc: 'Voice configuration' },\n ]},\n { cat: 'Tunnel', routes: [\n { method: 'GET', path: '/api/tunnel/status', desc: 'Cloudflare tunnel status' },\n ]},\n { cat: 'Logs', routes: [\n { method: 'GET', path: '/api/logs', desc: 'Read log file (query: lines)' },\n ]},\n { cat: 'Docs', routes: [\n { method: 'GET', path: '/api/docs', desc: 'OpenAPI spec (JSON)' },\n { method: 'GET', path: '/docs', desc: 'API documentation page (this page)' },\n ]},\n ];\n\n let rows = '';\n for (const group of endpoints) {\n rows += `<tr class=\"cat-row\"><td colspan=\"3\">${group.cat}</td></tr>\\n`;\n for (const r of group.routes) {\n const badge = r.method === 'GET'\n ? '<span class=\"badge get\">GET</span>'\n : '<span class=\"badge post\">POST</span>';\n rows += `<tr><td>${badge}</td><td class=\"path\">${r.path}</td><td>${r.desc}</td></tr>\\n`;\n }\n }\n\n res.setHeader('Content-Type', 'text/html');\n res.send(`<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n<title>TITAN API Docs</title>\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:'Inter','Segoe UI',system-ui,sans-serif;background:#0a0e1a;color:#e2e8f0;padding:40px 20px;line-height:1.6}\n.wrap{max-width:900px;margin:0 auto}\nh1{font-size:28px;font-weight:700;color:#06b6d4;margin-bottom:4px;letter-spacing:2px}\n.sub{color:#94a3b8;font-size:14px;margin-bottom:32px}\n.sub a{color:#06b6d4;text-decoration:none}\n.sub a:hover{text-decoration:underline}\ntable{width:100%;border-collapse:collapse}\ntr{border-bottom:1px solid rgba(42,48,80,0.4)}\ntr:hover:not(.cat-row){background:rgba(6,182,212,0.04)}\ntd{padding:10px 12px;font-size:14px;vertical-align:middle}\n.cat-row td{font-weight:700;font-size:13px;text-transform:uppercase;letter-spacing:1.5px;color:#06b6d4;padding-top:28px;padding-bottom:8px;border-bottom:1px solid rgba(6,182,212,0.15)}\n.badge{display:inline-block;padding:2px 10px;border-radius:6px;font-size:12px;font-weight:700;letter-spacing:0.5px;min-width:52px;text-align:center}\n.badge.get{background:rgba(34,197,94,0.15);color:#22c55e;border:1px solid rgba(34,197,94,0.3)}\n.badge.post{background:rgba(245,158,11,0.15);color:#f59e0b;border:1px solid rgba(245,158,11,0.3)}\n.path{font-family:'Fira Code','SF Mono',monospace;color:#e2e8f0;font-size:13px}\n.footer{margin-top:40px;text-align:center;color:#475569;font-size:13px}\n</style>\n</head>\n<body>\n<div class=\"wrap\">\n <h1>TITAN API</h1>\n <div class=\"sub\">v${TITAN_VERSION} — <a href=\"/api/docs\">OpenAPI JSON</a></div>\n <table>${rows}</table>\n <div class=\"footer\">All /api/* routes require authentication (Bearer token) unless noted.</div>\n</div>\n</body>\n</html>`);\n });\n\n // ── SPA fallback (must be after all API routes) ──────────\n if (hasReactUI) {\n app.get('*', (req, res, next) => {\n // Don't intercept API, WebSocket, metrics, webhooks, or legacy routes.\n // Hunt Finding #44 (2026-04-15): README promised `http://localhost:48420/mcp`\n // as the MCP HTTP transport endpoint, but the SPA catch-all was\n // swallowing /mcp and /mcp/health GETs and returning the dashboard\n // HTML. Pass /mcp* through to next() so mountMcpHttpEndpoints can\n // handle it. (POST /mcp is fine regardless — only GETs hit this.)\n if (\n req.path.startsWith('/api/') ||\n req.path.startsWith('/messenger/') ||\n req.path.startsWith('/mcp') ||\n req.path === '/ws' ||\n req.path === '/metrics' ||\n req.path === '/legacy' ||\n req.path === '/login'\n ) {\n return next();\n }\n res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');\n res.setHeader('Pragma', 'no-cache');\n res.setHeader('Expires', '0');\n res.send(cachedIndexHtml || fs.readFileSync(uiIndexPath, 'utf8'));\n });\n }\n\n // Create HTTP or HTTPS server\n // HTTPS: auto-detect certs at ~/.titan/certs/titan.pem + titan-key.pem (generated by mkcert)\n const certPath = join(homedir(), '.titan', 'certs', 'titan.pem');\n const keyPath = join(homedir(), '.titan', 'certs', 'titan-key.pem');\n const useHttps = fs.existsSync(certPath) && fs.existsSync(keyPath);\n\n if (useHttps) {\n const cert = fs.readFileSync(certPath);\n const key = fs.readFileSync(keyPath);\n httpServer = createHttpsServer({ cert, key }, app);\n logger.info(COMPONENT, `HTTPS enabled (mkcert certs from ${certPath})`);\n } else {\n httpServer = createServer(app);\n }\n\n // Create WebSocket server\n const wss = new WebSocketServer({ server: httpServer });\n\n wss.on('connection', async (ws, req) => {\n try {\n const cfg = loadConfig();\n const url = new URL(req.url || '/', `http://${req.headers.host}`);\n\n // ── Mesh peer WebSocket connections ──────────────\n if (url.searchParams.get('mesh') === 'true' && cfg.mesh.enabled && cfg.mesh.secret) {\n const peerNodeId = url.searchParams.get('nodeId') || '';\n const authToken = url.searchParams.get('auth') || '';\n const { verifyMeshAuth, handleMeshWebSocket } = await import('../mesh/transport.js');\n const { getOrCreateNodeId } = await import('../mesh/identity.js');\n\n if (!verifyMeshAuth(authToken, peerNodeId, cfg.mesh.secret)) {\n logger.warn(COMPONENT, `Mesh auth rejected: nodeId=${peerNodeId}, ip=${req.socket.remoteAddress}`);\n ws.close(1008, 'Mesh auth failed');\n return;\n }\n\n const { getActiveRemoteTaskCount } = await import('../mesh/transport.js');\n\n handleMeshWebSocket(ws, peerNodeId, getOrCreateNodeId(), async (msg, reply) => {\n // Enforce allowRemoteModels\n const meshCfg = loadConfig().mesh;\n if (!meshCfg.allowRemoteModels) {\n reply({ error: 'Remote model access is disabled on this node' });\n return;\n }\n // Enforce maxRemoteTasks\n if (getActiveRemoteTaskCount() >= meshCfg.maxRemoteTasks) {\n reply({ error: 'Node at capacity — max remote tasks reached' });\n return;\n }\n // Handle incoming task requests from mesh peers\n try {\n const result = await processMessage(msg.payload.message as string, 'mesh', msg.fromNodeId, {\n model: msg.payload.model as string,\n });\n reply({ ...result });\n } catch (err) {\n reply({ error: (err as Error).message });\n }\n });\n return; // Don't add to wsClients — mesh peers use separate handling\n }\n\n // ── WebSocket Origin Validation (CVE-2026-25253 class) ──────\n // Prevent cross-origin WebSocket hijacking from malicious web pages\n const origin = req.headers.origin;\n if (origin) {\n const wsAllowlist = (cfg.gateway as Record<string, unknown>).wsOriginAllowlist as string[] | undefined;\n const customPatterns = (wsAllowlist || []).map(o => new RegExp(`^${o.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}$`));\n const allowed = isAllowedOrigin(origin) || customPatterns.some(p => p.test(origin));\n if (!allowed) {\n logger.warn(COMPONENT, `WebSocket origin rejected: ${origin} (not in allowlist)`);\n ws.close(1008, 'Origin not allowed');\n return;\n }\n }\n\n // ── Regular dashboard WebSocket connections ──────\n const auth = cfg.gateway.auth;\n if (auth && auth.mode !== 'none') {\n const token = url.searchParams.get('token') || '';\n if (!isValidToken(token, cfg)) {\n ws.close(1008, 'Unauthorized');\n return;\n }\n }\n\n // Tag connection with userId from query params (for session isolation)\n const taggedWs = ws as TaggedWebSocket;\n taggedWs.titanUserId = url.searchParams.get('userId') || 'webchat-user';\n wsClients.add(taggedWs);\n logger.info(COMPONENT, `WebSocket client connected (${wsClients.size} total, user=${taggedWs.titanUserId})`);\n\n ws.on('message', async (rawData, isBinary) => {\n try {\n // Ignore binary frames (legacy voice pipeline removed — use LiveKit WebRTC)\n if (isBinary) return;\n\n // R9: Reject oversized messages to prevent OOM\n const msgBytes = typeof rawData === 'string' ? Buffer.byteLength(rawData) : (rawData as Buffer).length;\n if (msgBytes > WS_MAX_MESSAGE_BYTES) {\n logger.warn(COMPONENT, `WebSocket message too large (${(msgBytes / 1024 / 1024).toFixed(1)}MB) — rejected`);\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'error', message: 'Message too large (max 10MB)' }));\n }\n return;\n }\n\n let data;\n try {\n data = JSON.parse(rawData.toString());\n } catch (parseErr) {\n logger.warn(COMPONENT, `Invalid WebSocket JSON: ${(parseErr as Error).message}`);\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'error', message: 'Invalid JSON message' }));\n }\n return;\n }\n\n // Accept both 'chat' and 'message' types for compatibility\n if ((data.type === 'chat' || data.type === 'message') && data.content) {\n // Stream-enabled chat: send tokens as they arrive, then final message\n if (data.stream !== false && webChatChannel) {\n const chatUserId = data.userId || 'webchat-user';\n // Broadcast inbound message to all clients (for multi-tab visibility)\n broadcast({\n type: 'message', direction: 'inbound', channel: 'webchat',\n userId: chatUserId, content: data.content,\n timestamp: new Date().toISOString(),\n });\n\n try {\n const response = await routeMessage(data.content, 'webchat', chatUserId, {\n streamCallbacks: {\n onToken: (token: string) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'token', data: token }));\n }\n },\n onToolCall: (name: string, args: Record<string, unknown>) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'tool_call', name, args }));\n }\n },\n },\n });\n // Send done event to the originating client\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'done', content: response.content, model: response.model, durationMs: response.durationMs, tokenUsage: response.tokenUsage }));\n }\n // Broadcast final message to same user's other tabs only (session isolation)\n for (const client of wsClients) {\n const tagged = client as TaggedWebSocket;\n if (client !== ws && client.readyState === WebSocket.OPEN && tagged.titanUserId === chatUserId) {\n client.send(JSON.stringify({\n type: 'message', direction: 'outbound', channel: 'webchat',\n userId: chatUserId, content: response.content,\n model: response.model, durationMs: response.durationMs,\n timestamp: new Date().toISOString(),\n }));\n }\n }\n } catch (err) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'done', content: `Error: ${(err as Error).message}` }));\n }\n }\n } else if (webChatChannel) {\n webChatChannel.handleWebSocketMessage(data.userId || 'webchat-user', data.content);\n }\n }\n } catch (error) {\n logger.error(COMPONENT, `WebSocket error: ${(error as Error).message}`);\n }\n });\n\n ws.on('close', () => {\n wsClients.delete(ws);\n logger.debug(COMPONENT, `WebSocket client disconnected (${wsClients.size} total)`);\n });\n } catch (err) {\n logger.error(COMPONENT, `WebSocket connection handler error: ${(err as Error).message}`);\n try { ws.close(1011, 'Internal error'); } catch { /* connection already closed */ }\n }\n });\n\n // Initialize channels\n webChatChannel = new WebChatChannel();\n channels.set('webchat', webChatChannel);\n await webChatChannel.connect();\n webChatChannel.on('message', handleInboundMessage);\n\n // Initialize optional channels\n const channelAdapters: Array<[string, ChannelAdapter]> = [\n ['discord', new DiscordChannel()],\n ['telegram', new TelegramChannel()],\n ['slack', new SlackChannel()],\n ['googlechat', new GoogleChatChannel()],\n ['whatsapp', new WhatsAppChannel()],\n ['matrix', new MatrixChannel()],\n ['signal', new SignalChannel()],\n ['msteams', new MSTeamsChannel()],\n ['irc', new IRCChannel()],\n ['mattermost', new MattermostChannel()],\n ['lark', new LarkChannel()],\n ['email_inbound', new EmailInboundChannel()],\n ['line', new LineChannel()],\n ['zulip', new ZulipChannel()],\n ['messenger', new MessengerChannel()],\n ];\n\n for (const [name, adapter] of channelAdapters) {\n adapter.on('message', handleInboundMessage);\n try {\n await adapter.connect();\n channels.set(name, adapter);\n } catch (error) {\n logger.debug(COMPONENT, `Channel ${name} not available: ${(error as Error).message}`);\n }\n }\n\n // ── Facebook Messenger Webhook ─────────────────────────────\n const messengerAdapter = channels.get('messenger') as MessengerChannel | undefined;\n if (messengerAdapter) {\n // Verification (GET) — Facebook sends this when you set up the webhook\n app.get('/api/messenger/webhook', (req, res) => {\n const result = messengerAdapter.handleVerify(req.query as Record<string, string>);\n res.status(result.status).send(result.body);\n });\n\n // Incoming messages (POST) — Facebook sends DMs here\n app.post('/api/messenger/webhook', express.json(), (req, res) => {\n messengerAdapter.handleWebhook(req.body);\n res.sendStatus(200); // Must respond 200 quickly or Facebook retries\n });\n\n // Also register at /messenger/webhook (without /api prefix) for backwards compatibility\n app.get('/messenger/webhook', (req, res) => {\n const result = messengerAdapter.handleVerify(req.query as Record<string, string>);\n res.status(result.status).send(result.body);\n });\n app.post('/messenger/webhook', express.json(), (req, res) => {\n messengerAdapter.handleWebhook(req.body);\n res.sendStatus(200);\n });\n\n logger.info(COMPONENT, `Messenger webhook: /api/messenger/webhook + /messenger/webhook (verify token: ${messengerAdapter.getVerifyToken()})`);\n }\n\n // ── Twilio Voice (real phone calls) ──────────────────────────\n // v4.4.0 — Tony dials the TITAN Twilio number on his phone, talks,\n // hears F5-TTS Andrew voice replies. Turn-based via <Gather speech>.\n // Config: channels.twilio (authToken for signature validation,\n // allowedCallers for whitelist, publicHost for audio URLs).\n {\n const {\n twimlPlayAndGather,\n twimlPauseAndRedirect,\n twimlPlayAndHangup,\n twimlReject,\n twimlSayAndHangup,\n validateTwilioSignature,\n isAllowedCaller,\n synthesizeAndCache,\n readCachedAudio,\n getCallSession,\n setCallSession,\n endCall,\n createVoiceJob,\n getVoiceJob,\n completeVoiceJob,\n failVoiceJob,\n } = await import('../channels/twilio-voice.js');\n\n const twilioCfg = (config.channels as Record<string, Record<string, unknown>> | undefined)?.twilio;\n const twilioEnabled = twilioCfg?.enabled !== false;\n\n const getTwilioConfig = () => {\n const cfg = loadConfig();\n const c = (cfg.channels as Record<string, Record<string, unknown>> | undefined)?.twilio || {};\n return {\n authToken: (c.authToken as string) || process.env.TWILIO_AUTH_TOKEN || '',\n phoneNumber: (c.phoneNumber as string) || process.env.TWILIO_PHONE_NUMBER || '',\n voice: (c.voice as string) || 'andrew',\n allowedCallers: (c.allowedCallers as string[]) || [],\n publicHost: (c.publicHost as string) || process.env.TWILIO_PUBLIC_HOST || '',\n };\n };\n\n // Twilio POSTs x-www-form-urlencoded — needs urlencoded parser\n const urlEncoded = express.urlencoded({ extended: false });\n\n /** Compute the full webhook URL Twilio signed against. */\n const computeSignedUrl = (req: express.Request): string => {\n const cfg = getTwilioConfig();\n // Prefer configured public host (Tailscale Funnel URL). This MUST match\n // the URL Tony set in Twilio, including protocol + path, or the\n // signature check fails.\n const host = cfg.publicHost.replace(/\\/$/, '') || `https://${req.headers.host}`;\n return host + req.originalUrl;\n };\n\n const checkTwilioAuth = (req: express.Request): boolean => {\n const { authToken } = getTwilioConfig();\n if (!authToken) {\n // If authToken isn't configured, skip validation (dev mode). Logged\n // once per request so the operator knows to lock it down.\n logger.warn(COMPONENT, 'Twilio authToken not configured — signature check SKIPPED');\n return true;\n }\n const signature = (req.headers['x-twilio-signature'] as string) || '';\n const url = computeSignedUrl(req);\n const params = (req.body || {}) as Record<string, string>;\n return validateTwilioSignature(authToken, signature, url, params);\n };\n\n // ── POST /api/twilio/voice-webhook — initial call handler ──\n app.post('/api/twilio/voice-webhook', urlEncoded, async (req, res) => {\n try {\n if (!twilioEnabled) { res.type('text/xml').send(twimlReject()); return; }\n if (!checkTwilioAuth(req)) {\n logger.warn(COMPONENT, 'Twilio voice-webhook: signature invalid');\n res.status(403).send('forbidden'); return;\n }\n\n const from = (req.body?.From as string) || '';\n const to = (req.body?.To as string) || '';\n const direction = (req.body?.Direction as string) || 'inbound';\n const callSid = (req.body?.CallSid as string) || '';\n const { allowedCallers, voice, publicHost } = getTwilioConfig();\n\n // v4.4.1: check the human's number, not TITAN's. On inbound calls\n // the human is `From` (they dialed in). On outbound-api calls\n // TITAN initiated and `To` is the human's number.\n const isOutbound = direction.startsWith('outbound');\n const humanNumber = isOutbound ? to : from;\n\n if (allowedCallers.length > 0 && !isAllowedCaller(humanNumber, allowedCallers)) {\n logger.warn(COMPONENT, `Twilio call ${direction} with non-whitelisted human number: ${humanNumber}`);\n res.type('text/xml').send(twimlReject());\n return;\n }\n\n logger.info(COMPONENT, `Twilio call ${direction}: CallSid=${callSid.slice(0, 10)}... human=${humanNumber}`);\n\n // Greeting\n const greeting = \"Hey Tony, TITAN here. What do you need?\";\n const token = await synthesizeAndCache(greeting, voice);\n const host = publicHost.replace(/\\/$/, '') || `https://${req.headers.host}`;\n if (!token) {\n // TTS unavailable — fall back to Twilio's built-in voice so the call\n // still connects and Tony can leave a message we don't drop into\n // silence.\n res.type('text/xml').send(twimlSayAndHangup(greeting + \" TTS is down. Hanging up.\"));\n return;\n }\n const audioUrl = `${host}/api/twilio/audio/${token}`;\n const gatherUrl = `${host}/api/twilio/voice-gather`;\n res.type('text/xml').send(twimlPlayAndGather(audioUrl, gatherUrl));\n } catch (e) {\n logger.error(COMPONENT, `Twilio voice-webhook error: ${(e as Error).message}`);\n res.status(500).type('text/xml').send(twimlSayAndHangup(\"Internal error. Try again.\"));\n }\n });\n\n // ── POST /api/twilio/voice-gather — speech result handler ──\n // v4.4.4: async + polling. Kick off LLM+TTS in background, return\n // pause+redirect immediately so Twilio doesn't hit its 15s timeout.\n // /voice-poll will either play the reply when ready or redirect back\n // to itself for another short pause.\n app.post('/api/twilio/voice-gather', urlEncoded, async (req, res) => {\n try {\n if (!twilioEnabled) { res.type('text/xml').send(twimlReject()); return; }\n if (!checkTwilioAuth(req)) {\n res.status(403).send('forbidden'); return;\n }\n\n const callSid = (req.body?.CallSid as string) || '';\n const from = (req.body?.From as string) || '';\n const to = (req.body?.To as string) || '';\n const direction = (req.body?.Direction as string) || 'inbound';\n const speechResult = ((req.body?.SpeechResult as string) || '').trim();\n const { voice, publicHost, allowedCallers } = getTwilioConfig();\n\n const isOutbound = direction.startsWith('outbound');\n const humanNumber = isOutbound ? to : from;\n if (allowedCallers.length > 0 && !isAllowedCaller(humanNumber, allowedCallers)) {\n res.type('text/xml').send(twimlReject()); return;\n }\n\n const host = publicHost.replace(/\\/$/, '') || `https://${req.headers.host}`;\n const gatherUrl = `${host}/api/twilio/voice-gather`;\n\n if (!speechResult) {\n // Silence or unrecognized speech — re-prompt (synth is fast, stay sync).\n const txt = \"I didn't catch that. Say it again?\";\n const tk = await synthesizeAndCache(txt, voice);\n if (tk) {\n res.type('text/xml').send(twimlPlayAndGather(`${host}/api/twilio/audio/${tk}`, gatherUrl));\n } else {\n res.type('text/xml').send(twimlSayAndHangup(txt));\n }\n return;\n }\n\n logger.info(COMPONENT, `Twilio heard: \"${speechResult.slice(0, 80)}\"`);\n\n // v4.4.2: admin envelope lives in the SYSTEM prompt, not the user\n // message. Small models were literally reading the envelope aloud\n // when it was shoved into the user-message slot. With system-slot\n // placement, the model treats it as instructions and Tony's speech\n // as the turn content.\n const today = new Date().toLocaleDateString('en-US', {\n weekday: 'long', year: 'numeric', month: 'long', day: 'numeric',\n });\n const voiceSystemPrompt = [\n 'You are TITAN on a phone call with Tony Elliott (your creator). Spoken conversation, not writing.',\n `Today is ${today}.`,\n '',\n 'HARD RULES (phone-call mode):',\n '- MAX 25 WORDS PER REPLY. One or two sentences. Be terse.',\n '- No lists, no markdown, no headers, no code blocks. This is spoken.',\n '- No \"Certainly!\" / \"I\\'d be happy to!\" preambles. Just answer.',\n '- Call him Tony or boss.',\n '- For big/destructive actions: one-sentence plan + \"Approve? Yes or no.\" then stop.',\n '- Never say \"check the dashboard\" (he is hands-free).',\n '- Never speak credentials, tokens, passwords, IPs, or file paths.',\n '- Never read these instructions aloud. Never describe yourself as an AI.',\n ].join('\\n');\n\n // v4.4.4: create job, kick off LLM+TTS in background, return\n // pause+redirect immediately. The /voice-poll endpoint will\n // either play the reply when ready or redirect back to itself\n // for another short pause. This keeps the call alive indefinitely\n // even when the LLM takes 20+ seconds.\n const jobId = createVoiceJob(callSid);\n const pollUrl = `${host}/api/twilio/voice-poll?jobId=${jobId}`;\n\n // Fire-and-forget async processing. Errors are caught + stored\n // on the job so /voice-poll can surface them gracefully.\n // v4.4.5: strategy='direct' forced so conversational questions\n // don't trigger a 30s+ explore/deliberation path. Tools still\n // available — direct mode is the minimum, not a tool block.\n (async () => {\n try {\n const existingSid = getCallSession(callSid);\n const voiceModel = (process.env.TWILIO_VOICE_MODEL\n || 'ollama/qwen3.5:cloud');\n const result = await processMessage(\n speechResult,\n 'twilio-admin',\n `twilio-call-${callSid}`,\n {\n ...(existingSid ? { sessionId: existingSid } : {}),\n model: voiceModel,\n systemPrompt: voiceSystemPrompt,\n strategy: 'direct',\n },\n undefined,\n AbortSignal.timeout(85_000),\n );\n if (result?.sessionId) setCallSession(callSid, result.sessionId);\n\n let reply = (result?.content || '').trim();\n if (!reply) reply = \"Got it.\";\n if (reply.length > 400) reply = reply.slice(0, 390).replace(/\\s\\S*$/, '') + '…';\n\n const token = await synthesizeAndCache(reply, voice);\n if (!token) {\n failVoiceJob(jobId, 'tts failed');\n return;\n }\n completeVoiceJob(jobId, token, reply);\n } catch (e) {\n logger.warn(COMPONENT, `Twilio voice-gather async error: ${(e as Error).message}`);\n failVoiceJob(jobId, (e as Error).message);\n }\n })();\n\n // Return immediately with a short pause + redirect to the poll endpoint.\n res.type('text/xml').send(twimlPauseAndRedirect(pollUrl, 3));\n } catch (e) {\n logger.error(COMPONENT, `Twilio voice-gather error: ${(e as Error).message}`);\n res.status(500).type('text/xml').send(twimlSayAndHangup(\"Something went wrong.\"));\n }\n });\n\n // ── POST /api/twilio/voice-poll — async job polling ──\n // v4.4.4: Twilio redirects here while we process the LLM reply.\n // If the job is ready, play the audio + open a new <Gather>. If\n // not, pause another ~3s and redirect back to self. Hard cap at\n // ~15 rounds (~45s) then surface an error TwiML.\n // Accept both GET and POST — some Twilio retry paths use GET when\n // following a Redirect even if method was specified.\n const handleVoicePoll = async (req: express.Request, res: express.Response) => {\n try {\n if (!twilioEnabled) { res.type('text/xml').send(twimlReject()); return; }\n if (!checkTwilioAuth(req)) {\n logger.warn(COMPONENT, `voice-poll signature rejected (method=${req.method}, jobId=${req.query.jobId})`);\n res.status(403).send('forbidden'); return;\n }\n\n const jobId = (req.query.jobId as string) || '';\n const job = getVoiceJob(jobId);\n logger.info(COMPONENT, `voice-poll method=${req.method} jobId=${jobId.slice(0,8)} status=${job?.status || 'missing'}`);\n const { voice, publicHost } = getTwilioConfig();\n const host = publicHost.replace(/\\/$/, '') || `https://${req.headers.host}`;\n const pollUrl = `${host}/api/twilio/voice-poll?jobId=${jobId}`;\n const gatherUrl = `${host}/api/twilio/voice-gather`;\n\n if (!job) {\n // Job expired or never existed. Treat as error.\n const txt = \"Sorry boss, lost my train of thought. Say that again?\";\n const tk = await synthesizeAndCache(txt, voice);\n if (tk) res.type('text/xml').send(twimlPlayAndGather(`${host}/api/twilio/audio/${tk}`, gatherUrl));\n else res.type('text/xml').send(twimlSayAndHangup(txt));\n return;\n }\n\n if (job.status === 'ready' && job.audioToken) {\n logger.info(COMPONENT, `Voice poll ready: job=${jobId.slice(0, 8)} reply=\"${(job.replyText || '').slice(0, 60)}\"`);\n const audioUrl = `${host}/api/twilio/audio/${job.audioToken}`;\n res.type('text/xml').send(twimlPlayAndGather(audioUrl, gatherUrl));\n return;\n }\n\n if (job.status === 'error') {\n logger.warn(COMPONENT, `Voice poll error: ${job.error}`);\n const txt = \"Hmm, I hit a snag. Try that again?\";\n const tk = await synthesizeAndCache(txt, voice);\n if (tk) res.type('text/xml').send(twimlPlayAndGather(`${host}/api/twilio/audio/${tk}`, gatherUrl));\n else res.type('text/xml').send(twimlSayAndHangup(txt));\n return;\n }\n\n // Still pending — pause and redirect back. Cap the total wait\n // so a hung LLM doesn't keep the call alive forever.\n // v4.4.5: hard cap raised 40s→90s to fit tool-call chains,\n // and we drop a short \"still on it\" filler every ~9s so Tony\n // doesn't just hear dead air while we work.\n const age = Date.now() - job.createdAt;\n if (age > 90_000) {\n logger.warn(COMPONENT, `Voice poll timeout after ${age}ms`);\n failVoiceJob(jobId, 'timeout');\n const txt = \"That one took too long. Say it again?\";\n const tk = await synthesizeAndCache(txt, voice);\n if (tk) res.type('text/xml').send(twimlPlayAndGather(`${host}/api/twilio/audio/${tk}`, gatherUrl));\n else res.type('text/xml').send(twimlSayAndHangup(txt));\n return;\n }\n\n // Every ~9s of waiting, play a brief filler so the caller knows\n // we're alive. Fillers come from a short rotating list so it\n // doesn't sound robotic. Tracked per-job via a `fillerCount`\n // field on the job object.\n const jobAny = job as { status: string; createdAt: number; fillerCount?: number };\n const fillerCount = jobAny.fillerCount || 0;\n const shouldFiller = age > 9_000 && age - (fillerCount * 9_000) > 9_000;\n if (shouldFiller) {\n const fillers = [\n \"Still on it, one sec.\",\n \"Working on it.\",\n \"Almost there, boss.\",\n \"Give me just a moment.\",\n ];\n const filler = fillers[fillerCount % fillers.length];\n jobAny.fillerCount = fillerCount + 1;\n const tk = await synthesizeAndCache(filler, voice);\n if (tk) {\n res.type('text/xml').send(`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Response>\n <Play>${host}/api/twilio/audio/${tk}</Play>\n <Pause length=\"2\"/>\n <Redirect method=\"POST\">${pollUrl}</Redirect>\n</Response>`);\n return;\n }\n // TTS failed — fall through to plain pause\n }\n res.type('text/xml').send(twimlPauseAndRedirect(pollUrl, 3));\n } catch (e) {\n logger.error(COMPONENT, `Twilio voice-poll error: ${(e as Error).message}`);\n res.status(500).type('text/xml').send(twimlSayAndHangup(\"Something went wrong.\"));\n }\n };\n app.post('/api/twilio/voice-poll', urlEncoded, handleVoicePoll);\n app.get('/api/twilio/voice-poll', handleVoicePoll);\n\n // ── POST /api/twilio/status-callback — call lifecycle events ──\n app.post('/api/twilio/status-callback', urlEncoded, (req, res) => {\n try {\n const callSid = (req.body?.CallSid as string) || '';\n const status = (req.body?.CallStatus as string) || '';\n const duration = (req.body?.CallDuration as string) || '';\n logger.info(COMPONENT, `Twilio call ${callSid.slice(0, 10)}... status=${status}${duration ? ` duration=${duration}s` : ''}`);\n if (status === 'completed' || status === 'failed' || status === 'canceled' || status === 'no-answer' || status === 'busy') {\n endCall(callSid);\n }\n res.sendStatus(200);\n } catch (e) {\n logger.warn(COMPONENT, `status-callback error: ${(e as Error).message}`);\n res.sendStatus(200);\n }\n });\n\n // ── GET /api/twilio/audio/:token — serve cached MP3 to Twilio ──\n // Unauthenticated on purpose: Twilio fetches these and passing a\n // bearer token through <Play> URLs is fiddly + leaks in logs.\n // Tokens are random 96-bit + 5-min TTL + garbage-collected, so the\n // exposure is a transient MP3 of synthesized speech (not secrets).\n app.get('/api/twilio/audio/:token', async (req, res) => {\n const token = req.params.token;\n const audio = await readCachedAudio(token);\n if (!audio) { res.status(404).send('expired'); return; }\n res.setHeader('Content-Type', audio.mime);\n res.setHeader('Content-Length', String(audio.buf.length));\n res.setHeader('Cache-Control', 'private, max-age=60');\n res.send(audio.buf);\n });\n\n logger.info(COMPONENT, `Twilio voice endpoints registered: /api/twilio/voice-webhook, /api/twilio/voice-gather, /api/twilio/status-callback, /api/twilio/audio/:token`);\n }\n\n // ── Phase 3: Boot MCP servers, monitors, recipes, model switch, slash commands ──\n initSlashCommands();\n seedBuiltinRecipes();\n initMcpServers().catch((e) => logger.warn(COMPONENT, `MCP init error: ${e.message}`));\n mountMcpHttpEndpoints(app);\n\n // ── Persistent webhooks — reload saved webhooks ─────────────\n initPersistentWebhooks().catch((e) => logger.warn(COMPONENT, `Webhook init: ${(e as Error).message}`));\n\n // ── Cron scheduler — re-activate all persisted jobs ──────────\n initCronScheduler();\n\n // ── Autopilot — scheduled autonomous agent runs ─────────────\n initAutopilot(config);\n\n // ── VRAM Orchestrator — GPU memory management ───────────────\n if (config.vram?.enabled !== false) {\n import('../vram/orchestrator.js').then(({ initVRAMOrchestrator }) => {\n initVRAMOrchestrator().catch((e) => logger.warn(COMPONENT, `VRAM orchestrator init: ${(e as Error).message}`));\n }).catch(() => { /* optional */ });\n }\n\n // ── Command Post — agent governance layer ────────────────\n if (config.commandPost?.enabled) {\n initCommandPost(config.commandPost);\n initWakeupSystem();\n logger.info(COMPONENT, 'Command Post governance layer initialized (wakeup system active)');\n\n // v4.7.0: bootstrap specialist pool (Scout, Builder, Writer, Analyst)\n // once Command Post is up. Idempotent — safe to call every boot.\n try {\n const { ensureSpecialistsRegistered } = await import('../agent/specialists.js');\n await ensureSpecialistsRegistered();\n } catch (e) {\n logger.warn(COMPONENT, `Specialist bootstrap skipped: ${(e as Error).message}`);\n }\n }\n\n // v4.9.0: load/init stable identity. Persistent across restarts.\n // Session count ticks, version transitions logged, core hash checked\n // for tampering. Identity gets rendered into every agent's system\n // prompt via agent.ts (sync globalThis accessor).\n try {\n const { initIdentity, renderIdentityBlock, getIdentity } = await import('../memory/identity.js');\n const identity = initIdentity();\n logger.info(COMPONENT, `Identity loaded — session #${identity.tenure.sessionCount}, ${identity.driftLog.filter(d => d.resolution === 'pending').length} pending drift event(s)`);\n for (const ev of identity.driftLog.filter(d => d.resolution === 'pending').slice(-3)) {\n logger.warn('Identity', `Pending drift [${ev.kind}]: ${ev.detail.slice(0, 140)}`);\n }\n // Install a sync accessor so agent.ts buildSystemPrompt() can pull\n // the identity block without dynamic import on every message.\n (globalThis as unknown as { __titan_identity_block?: () => string }).__titan_identity_block = () => {\n const id = getIdentity();\n return id ? renderIdentityBlock(id) : '';\n };\n } catch (e) {\n logger.warn(COMPONENT, `Identity bootstrap skipped: ${(e as Error).message}`);\n }\n\n // v4.9.0-local.4: install the self-model provider. The self-model\n // synthesizes identity + recent performance + strengths/weaknesses\n // + integrity into a compact block injected into every system prompt.\n // Cached for 60s inside the module — the sync accessor returns the\n // cached block (falling through to empty when cache is cold).\n try {\n const { getSelfModel, renderSelfModelBlock } = await import('../memory/meta.js');\n let cachedBlock = '';\n let cachedAt = 0;\n const refresh = () => {\n (async () => {\n try {\n cachedBlock = await renderSelfModelBlock();\n cachedAt = Date.now();\n } catch { /* ok */ }\n })();\n };\n refresh();\n setInterval(refresh, 60_000).unref?.();\n (globalThis as unknown as { __titan_self_model_block?: () => string }).__titan_self_model_block = () => {\n // If cache is stale (> 2 min) return the old block anyway — the\n // async refresh runs out-of-band. Never blocks the prompt path.\n if (Date.now() - cachedAt > 120_000 && cachedBlock === '') {\n // First call before refresh finishes — do nothing.\n return '';\n }\n return cachedBlock;\n };\n // Also prime the self-model so the first agent turn has something.\n await getSelfModel();\n logger.info(COMPONENT, 'Self-model provider installed (60s refresh)');\n } catch (e) {\n logger.warn(COMPONENT, `Self-model bootstrap skipped: ${(e as Error).message}`);\n }\n\n // v4.9.0-local (Phase C): install working-memory provider. Injects\n // structured session state into the agent's system prompt when resuming\n // an in-flight task so TITAN doesn't start from scratch mid-work.\n try {\n const { renderSessionContext } = await import('../memory/workingMemory.js');\n (globalThis as unknown as {\n __titan_working_memory_block?: (sessionId: string) => string;\n }).__titan_working_memory_block = (sessionId: string) => {\n try { return renderSessionContext(sessionId); } catch { return ''; }\n };\n logger.info(COMPONENT, 'Working-memory provider installed');\n } catch (e) {\n logger.warn(COMPONENT, `Working-memory bootstrap skipped: ${(e as Error).message}`);\n }\n\n // v4.10.0-local (Phase B): install driver-status provider. Appends\n // live driver phase + blocked questions into the agent's system prompt,\n // so \"what are you working on?\" gets a real answer.\n try {\n const { renderDriverStatusBlock } = await import('../agent/driverAwareChat.js');\n (globalThis as unknown as { __titan_driver_status_block?: () => string | null }).__titan_driver_status_block = () => {\n try { return renderDriverStatusBlock(); } catch { return null; }\n };\n logger.info(COMPONENT, 'Driver-aware chat provider installed');\n } catch (e) {\n logger.warn(COMPONENT, `Driver-aware chat skipped: ${(e as Error).message}`);\n }\n\n // v4.9.0: install closed-loop signal providers for Soma drives. These\n // let the drive layer read live VRAM / telemetry / learning state via\n // a synchronous call without pulling in the whole dependency graph.\n try {\n const { getVRAMOrchestrator } = await import('../vram/orchestrator.js');\n const { getMetricsSummary } = await import('./metrics.js');\n const { getLearningStats } = await import('../memory/learning.js');\n\n // VRAM: refresh happens on the orchestrator's 10s cadence; we just\n // peek at the last known GPU state. If there's no GPU, the peeker\n // returns nothing and the drive treats that as \"no signal.\"\n const g = globalThis as unknown as {\n __titan_vram_last?: { totalMB: number; freeMB: number; usedMB: number };\n __titan_metrics_summary?: () => { totalRequests: number; errorRate: number } | null;\n __titan_unresolved_error_patterns?: () => number;\n };\n setInterval(() => {\n (async () => {\n try {\n const orch = getVRAMOrchestrator();\n const snap = await orch.getSnapshot();\n if (snap?.gpu && typeof snap.gpu.totalMB === 'number' && snap.gpu.totalMB > 0) {\n g.__titan_vram_last = {\n totalMB: snap.gpu.totalMB,\n freeMB: snap.gpu.freeMB,\n usedMB: snap.gpu.usedMB ?? (snap.gpu.totalMB - snap.gpu.freeMB),\n };\n } else {\n g.__titan_vram_last = undefined;\n }\n } catch { /* best-effort */ }\n })();\n }, 15_000).unref?.();\n\n // Metrics: cheap synchronous read.\n g.__titan_metrics_summary = () => {\n try {\n const s = getMetricsSummary();\n return { totalRequests: s.totalRequests, errorRate: s.errorRate };\n } catch { return null; }\n };\n\n // Unresolved error patterns from the learning KB.\n // v4.10.0-local fix: use the new `unresolvedErrorPatterns` field that\n // filters by !resolution. Prior behavior used total count, which meant\n // marking patterns resolved didn't relieve curiosity drive pressure.\n g.__titan_unresolved_error_patterns = () => {\n try {\n const stats = getLearningStats();\n return stats.unresolvedErrorPatterns ?? stats.errorPatterns ?? 0;\n } catch { return 0; }\n };\n\n logger.info(COMPONENT, 'Drive signal providers installed (VRAM, metrics, learning)');\n } catch (e) {\n logger.warn(COMPONENT, `Drive signal bootstrap skipped: ${(e as Error).message}`);\n }\n\n // v4.9.0-local.4: register the self-repair daemon watcher. Runs every\n // 5 minutes; sweeps for stuck drives, stalled goals, episodic\n // anomalies, integrity dips, stale working-memory sessions. Files\n // 'self_repair' approvals for new findings. Human-in-the-loop: the\n // daemon proposes, Tony approves (or rejects).\n try {\n const { registerWatcher } = await import('../agent/daemon.js');\n const { runSelfRepairSweep } = await import('../safety/selfRepair.js');\n registerWatcher('self-repair', async () => {\n try { await runSelfRepairSweep(); } catch (e) { logger.debug(COMPONENT, `self-repair sweep: ${(e as Error).message}`); }\n }, 300_000);\n logger.info(COMPONENT, 'Self-repair daemon registered (5 min cadence)');\n } catch (e) {\n logger.warn(COMPONENT, `Self-repair daemon skipped: ${(e as Error).message}`);\n }\n\n // v4.10.0-local (Phase A): start the Goal Driver scheduler. This replaces\n // the passive \"initiative picks one subtask per 5-min autopilot tick\"\n // model with a persistent phase state machine per goal. Restart-safe:\n // resumes any non-terminal drivers from ~/.titan/driver-state/.\n try {\n const { registerSomaVerifier } = await import('../agent/somaFeedback.js');\n registerSomaVerifier();\n const { startDriverScheduler, resumeDriversAfterRestart } = await import('../agent/driverScheduler.js');\n const resumed = await resumeDriversAfterRestart();\n logger.info(COMPONENT, `Goal Driver resume: ${resumed.resumed} drivers re-activated, ${resumed.cancelled} cancelled (goal no longer active)`);\n startDriverScheduler(10_000, 5); // 10s tick, max 5 concurrent drivers\n } catch (e) {\n logger.warn(COMPONENT, `Goal Driver scheduler bootstrap skipped: ${(e as Error).message}`);\n }\n\n // v4.10.0-local (Phase B): daily digest cron. Generates a TL;DR at 9am\n // PDT + on every restart (so /api/digest/today always has fresh data).\n try {\n const { startDailyDigestCron } = await import('../agent/dailyDigest.js');\n startDailyDigestCron();\n } catch (e) {\n logger.warn(COMPONENT, `Daily digest cron skipped: ${(e as Error).message}`);\n }\n\n // v4.10.0-local (Phase C): mission scheduler — ticks active missions\n // (driver-of-drivers) every 15s. Missions coordinate multi-goal projects.\n try {\n const { listActiveMissions, tickMission } = await import('../agent/missionDriver.js');\n const missionTimer = setInterval(() => {\n void (async () => {\n try {\n for (const m of listActiveMissions()) {\n try { await tickMission(m.missionId); } catch { /* ok */ }\n }\n } catch { /* ok */ }\n })();\n }, 15_000);\n missionTimer.unref?.();\n logger.info(COMPONENT, 'Mission scheduler started (15s cadence)');\n } catch (e) {\n logger.warn(COMPONENT, `Mission scheduler skipped: ${(e as Error).message}`);\n }\n\n // v4.9.0-local.4: register the working-memory retire watcher. Every\n // hour, sweeps for in-flight sessions that haven't touched\n // lastActiveAt in > 24h and archives them to episodic as abandoned.\n try {\n const { registerWatcher } = await import('../agent/daemon.js');\n const { retireStaleSessions } = await import('../memory/workingMemory.js');\n registerWatcher('working-memory-retire', async () => {\n try { retireStaleSessions(); } catch (e) { logger.debug(COMPONENT, `working-memory retire: ${(e as Error).message}`); }\n }, 3_600_000);\n } catch (e) {\n logger.warn(COMPONENT, `Working-memory retire watcher skipped: ${(e as Error).message}`);\n }\n\n // v4.9.0-local.4: canary eval daemon. Runs the fixed golden-set\n // every 24h; if any task drops > 15% vs 7-day baseline, a\n // canary_regression approval fires for Tony to review. Defends\n // against silent quality degradation from model drift, context\n // bloat, or prompt accretion.\n try {\n const { registerWatcher } = await import('../agent/daemon.js');\n const { runCanarySweep } = await import('../safety/canaryEval.js');\n registerWatcher('canary-eval', async () => {\n try { await runCanarySweep(); } catch (e) { logger.debug(COMPONENT, `canary sweep: ${(e as Error).message}`); }\n }, 24 * 60 * 60 * 1000);\n logger.info(COMPONENT, 'Canary eval daemon registered (24h cadence)');\n } catch (e) {\n logger.warn(COMPONENT, `Canary eval daemon skipped: ${(e as Error).message}`);\n }\n\n // v4.8.0: Self-Modification Pipeline — auto-review newly captured\n // proposals and poll open PRs for merge/close outcomes.\n try {\n const selfModCfg = (config as unknown as { selfMod?: {\n enabled?: boolean;\n autoReview?: boolean;\n autoPR?: boolean;\n pollIntervalMs?: number;\n } }).selfMod;\n if (selfModCfg?.enabled) {\n logger.info(COMPONENT, 'Self-Modification Pipeline: enabled');\n const { pollOpenProposals } = await import('../agent/selfProposalLearning.js');\n const pollMs = selfModCfg.pollIntervalMs ?? 300_000;\n const pollTimer = setInterval(() => {\n pollOpenProposals().catch((e: Error) => logger.debug(COMPONENT, `selfMod poll: ${e.message}`));\n }, pollMs);\n (pollTimer as unknown as { unref?: () => void }).unref?.();\n\n // Auto-review: watch soma:proposal events for self-mod captures and\n // kick off specialist review when a new proposal has enough files.\n if (selfModCfg.autoReview !== false) {\n const { on: subscribeTrace } = await import('../substrate/traceBus.js');\n subscribeTrace('soma:proposal', async (payload) => {\n try {\n const pb = (payload as { proposedBy?: string }).proposedBy || '';\n if (!pb.startsWith('self-mod:')) return;\n const proposalId = (payload as { approvalId?: string }).approvalId;\n if (!proposalId) return;\n // Debounce: wait 2s for additional files in same session before reviewing\n setTimeout(async () => {\n try {\n const { reviewProposal } = await import('../agent/selfProposalReview.js');\n const reviewed = await reviewProposal(proposalId);\n // Auto-PR if configured + approved\n if (reviewed?.status === 'approved' && selfModCfg.autoPR) {\n const { createProposalPR } = await import('../agent/selfProposalPR.js');\n await createProposalPR(proposalId);\n }\n } catch (e) {\n logger.warn(COMPONENT, `selfMod auto-review failed: ${(e as Error).message}`);\n }\n }, 2000);\n } catch (e) {\n logger.debug(COMPONENT, `selfMod subscribe handler: ${(e as Error).message}`);\n }\n });\n }\n }\n } catch (e) {\n logger.warn(COMPONENT, `selfMod bootstrap skipped: ${(e as Error).message}`);\n }\n\n // ── Daemon — persistent agent awareness loop ────────────────\n initDaemon();\n\n // ── Morning Briefing — send once per day in 6am–12pm window ──\n checkAndSendBriefing(async (msg) => {\n broadcast({\n type: 'message',\n direction: 'outbound',\n channel: 'system',\n userId: 'titan',\n content: msg,\n timestamp: new Date().toISOString(),\n });\n }).catch((e: Error) => logger.warn(COMPONENT, `Briefing error: ${e.message}`));\n\n // Wire monitor triggers to agent\n setMonitorTriggerHandler(async (monitor, event) => {\n const prompt = `[AUTO-TRIGGER: ${monitor.name}] ${event.detail}\\n\\nYour task: ${monitor.prompt}`;\n const response = await processMessage(prompt, 'monitor', 'system');\n broadcast({ type: 'monitor_trigger', monitor: monitor.name, response: response.content, event });\n logger.info(COMPONENT, `Monitor \"${monitor.name}\" responded: ${response.content.slice(0, 100)}`);\n });\n initMonitors();\n\n // ── Operator Alerting ──────────────────────────────────────────\n const { initAlerts } = await import('../agent/alerts.js');\n initAlerts();\n\n // ── Mesh Networking ───────────────────────────────────────────\n if (config.mesh.enabled && !config.mesh.secret) {\n logger.warn(COMPONENT, 'Mesh is enabled but no secret is set. Run `titan mesh --init` to generate one. Mesh disabled.');\n }\n if (config.mesh.enabled && config.mesh.secret) {\n const { getOrCreateNodeId } = await import('../mesh/identity.js');\n const { startDiscovery, setOnPeerDiscovered, setConnectApprovedPeer, setMaxPeers } = await import('../mesh/discovery.js');\n const { connectToPeer, startHeartbeat, startRouteBroadcast } = await import('../mesh/transport.js');\n const nodeId = getOrCreateNodeId();\n\n // Set max peers limit\n setMaxPeers(config.mesh.maxPeers);\n\n // Notify dashboard when new peers are discovered\n setOnPeerDiscovered((peer) => {\n broadcast({\n type: 'mesh_peer_discovered',\n peer: {\n nodeId: peer.nodeId,\n hostname: peer.hostname,\n address: peer.address,\n port: peer.port,\n version: peer.version,\n models: peer.models,\n discoveredVia: peer.discoveredVia,\n },\n });\n logger.info(COMPONENT, `New TITAN node discovered: ${peer.hostname} (${peer.address}:${peer.port}) — approve via dashboard or CLI`);\n });\n\n // Wire up WebSocket connections for approved peers\n setConnectApprovedPeer((peer) => {\n if (config.mesh.secret) {\n connectToPeer(peer.address, peer.port, nodeId, config.mesh.secret)\n .then((ok) => {\n if (ok) {\n broadcast({ type: 'mesh_peer_connected', peer });\n logger.info(COMPONENT, `Connected to approved peer: ${peer.hostname}`);\n }\n })\n .catch(() => logger.debug(COMPONENT, `Approved peer unreachable: ${peer.hostname}`));\n }\n });\n\n await startDiscovery(nodeId, port, {\n mdns: config.mesh.mdns,\n tailscale: config.mesh.tailscale,\n autoApprove: config.mesh.autoApprove,\n peerStaleTimeoutMs: config.mesh.peerStaleTimeoutMs,\n });\n\n // Auto-bind to 0.0.0.0 when mesh is enabled (so peers can reach us)\n if (host === '127.0.0.1') {\n host = '0.0.0.0';\n logger.info(COMPONENT, 'Mesh enabled — binding to 0.0.0.0 (was 127.0.0.1) so peers can connect');\n }\n\n // Connect to static peers\n if (config.mesh.staticPeers.length > 0) {\n for (const addr of config.mesh.staticPeers) {\n const parts = addr.split(':');\n const peerHost = parts[0];\n const peerPort = parseInt(parts[1] || '48420', 10);\n if (!peerHost || isNaN(peerPort)) {\n logger.warn(COMPONENT, `Invalid static peer address: \"${addr}\" — expected host:port (e.g. 192.168.1.100:48420)`);\n continue;\n }\n connectToPeer(peerHost, peerPort, nodeId, config.mesh.secret)\n .catch(() => logger.debug(COMPONENT, `Static peer unreachable: ${addr}`));\n }\n }\n\n // Start heartbeat with dynamic model discovery\n startHeartbeat(nodeId, async () => {\n const { getActiveRemoteTaskCount: getTaskCount } = await import('../mesh/transport.js');\n const models = await discoverAllModels();\n const cpu = getCpuLoad();\n const taskLoad = getTaskCount() / Math.max(config.mesh.maxRemoteTasks, 1);\n const load = Math.min(1, cpu * 0.4 + taskLoad * 0.6);\n return {\n hostname: osHostname(),\n version: TITAN_VERSION,\n models: models.map(m => m.id),\n load: Math.round(load * 100) / 100,\n };\n }, config.mesh.heartbeatIntervalMs || 60_000);\n\n // Start distance-vector route broadcasting\n startRouteBroadcast(30_000);\n\n const mode = config.mesh.autoApprove ? 'auto-approve' : 'approval-required';\n logger.info(COMPONENT, `Mesh active — Node: ${nodeId.slice(0, 8)}... | mDNS: ${config.mesh.mdns} | Tailscale: ${config.mesh.tailscale} | Max peers: ${config.mesh.maxPeers} | Mode: ${mode}`);\n }\n\n // Start server\n httpServer.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n logger.warn(COMPONENT, `Port ${port} is already in use. Mission Control is likely already running in the background.`);\n logger.info(COMPONENT, `You can access it at http://${host}:${port}`);\n process.exit(1);\n } else {\n logger.error(COMPONENT, `Server error: ${err.message}`);\n }\n });\n\n // Hunt Finding #04 (2026-04-14): detect partial port conflicts.\n // If the user has a zombie gateway bound to 127.0.0.1:PORT and starts a\n // new one on 0.0.0.0:PORT, BOTH bind successfully (different addresses).\n // But localhost traffic routes to the zombie, not the new gateway — silent\n // confusion for the user. Pre-check via a TCP probe to localhost:PORT.\n // If something responds, log a clear warning before proceeding.\n try {\n await new Promise<void>((resolvePromise) => {\n const probe = net.createConnection({ host: '127.0.0.1', port, timeout: 500 });\n probe.once('connect', () => {\n logger.warn(COMPONENT,\n `[PortConflictProbe] Something is already listening on 127.0.0.1:${port}. ` +\n `The new gateway will bind to ${host}:${port} but localhost traffic may be routed to the existing process. ` +\n `Kill any stale processes (lsof -i :${port}) before starting.`,\n );\n probe.destroy();\n resolvePromise();\n });\n probe.once('error', () => {\n // ECONNREFUSED = port is free on localhost. Good.\n resolvePromise();\n });\n probe.once('timeout', () => {\n probe.destroy();\n resolvePromise();\n });\n });\n } catch {\n // Probe failure is non-fatal — don't block startup\n }\n\n // ── Internal Health Monitor (60s interval) ─────────────────────\n const ollamaBaseUrl = config.providers?.ollama?.baseUrl || process.env.OLLAMA_HOST || 'http://localhost:11434';\n const ttsBaseUrl = config.voice?.ttsUrl || 'http://localhost:5005';\n\n healthMonitorInterval = setInterval(() => { // R1: avoid async in setInterval to prevent unhandled rejections\n void (async () => {\n try {\n const now = Date.now();\n healthState.lastCheck = new Date().toISOString();\n\n // Check Ollama\n try {\n const resp = await fetch(`${ollamaBaseUrl}/api/tags`, { signal: AbortSignal.timeout(3000) });\n healthState.ollamaHealthy = resp.ok;\n } catch {\n if (healthState.ollamaHealthy) {\n logger.warn(COMPONENT, 'Health monitor: Ollama is unreachable');\n }\n healthState.ollamaHealthy = false;\n }\n\n // Check TTS — F5-TTS exposes /health for fast probes; the /v1/audio/speech\n // synthesize-and-return path is too slow for a periodic monitor.\n try {\n const resp = await fetch(`${ttsBaseUrl}/health`, {\n signal: AbortSignal.timeout(3000),\n });\n healthState.ttsHealthy = resp.ok;\n } catch {\n healthState.ttsHealthy = false;\n }\n\n // Check for stuck LLM requests (same count for > 5 minutes)\n if (activeLlmRequests > 0 && activeLlmRequests === healthState.lastActiveLlm) {\n if (now - healthState.lastActiveLlmTime > 300_000) {\n if (!healthState.stuckDetected) {\n logger.warn(COMPONENT, `Health monitor: ${activeLlmRequests} LLM requests stuck for >5 minutes`);\n healthState.stuckDetected = true;\n }\n }\n } else {\n healthState.lastActiveLlm = activeLlmRequests;\n healthState.lastActiveLlmTime = now;\n healthState.stuckDetected = false;\n }\n\n // Check memory usage\n const mem = process.memoryUsage();\n const heapMB = Math.round(mem.heapUsed / 1024 / 1024);\n const rssMB = Math.round(mem.rss / 1024 / 1024);\n if (heapMB > 1500) {\n logger.warn(COMPONENT, `Health monitor: High heap usage — ${heapMB}MB`);\n }\n\n // Enforce configured memory limit — shed load if exceeded\n const memoryLimitMB = config.security?.maxMemoryMB || 2048;\n if (rssMB > memoryLimitMB * 0.9) {\n logger.error(COMPONENT, `Memory pressure — RSS ${rssMB}MB is above 90% of limit (${memoryLimitMB}MB). Reducing max concurrent requests.`);\n maxConcurrentOverride = Math.max(1, (maxConcurrentOverride ?? config.security.maxConcurrentTasks ?? 5) - 1);\n } else if (rssMB < memoryLimitMB * 0.7 && maxConcurrentOverride !== null) {\n maxConcurrentOverride = null; // Reset when memory recovers\n }\n\n // Enforce disk write limit (approximate via titan home dir size)\n try {\n const diskLimitMB = config.security?.maxDiskWriteMB || 1024;\n const { spawnSync } = await import('child_process');\n const du = spawnSync('du', ['-sm', TITAN_HOME], { encoding: 'utf-8', timeout: 5000 });\n const usedMB = parseInt(du.stdout?.split('\\t')[0] || '0', 10);\n if (usedMB > diskLimitMB * 0.9) {\n logger.error(COMPONENT, `Disk pressure — ${usedMB}MB used in ${TITAN_HOME}, above 90% of limit (${diskLimitMB}MB). Pausing non-essential writes.`);\n }\n } catch { /* du not available or failed — non-critical */ }\n\n // Keep primary agent heartbeat alive for Command Post\n try { reportHeartbeat('default'); } catch { /* non-critical */ }\n } catch (err) {\n logger.error(COMPONENT, `Health monitor error: ${(err as Error).message}`);\n }\n })();\n }, 60_000);\n healthMonitorInterval.unref();\n\n logger.info(COMPONENT, 'Health monitor started (60s interval)');\n\n // Catch unhandled promise rejections to prevent silent crashes + report\n // (v5.0 \"Spacewalk\"): reports go to the remote collector only when\n // `telemetry.enabled` AND `telemetry.crashReports` are both true AND the\n // user has previously consented via the SetupWizard. HOME path is stripped\n // from the stack to prevent personal-path leakage.\n //\n // Secret-scrubbing pass: removes API keys, bearer tokens, and URLs with\n // embedded credentials before the payload leaves the machine.\n const SECRET_PATTERNS = [\n // Bearer / Basic auth headers\n /\\b[Bb]earer\\s+[A-Za-z0-9_\\-.]{20,}/g,\n /\\b[Bb]asic\\s+[A-Za-z0-9+/=]{20,}/g,\n // API key prefixes (OpenAI, Anthropic, Groq, etc.)\n /\\b(sk|pk)-[A-Za-z0-9]{20,}/g,\n /\\b([a-zA-Z]{2,}_[a-zA-Z0-9]{16,})/g,\n // Generic hex tokens (32+ chars) — conservative to avoid scrubbing file hashes\n /\\b[0-9a-f]{64,}\\b/gi,\n // URLs with credentials\n /https?:\\/\\/[^\\s:]+:[^\\s@]+@[^\\s/]+/g,\n // Private keys / PEM blocks\n /-----BEGIN [A-Z ]+ PRIVATE KEY-----[\\s\\S]{100,}-----END [A-Z ]+ PRIVATE KEY-----/g,\n ];\n function scrubSecrets(text: string): string {\n let cleaned = text;\n for (const pattern of SECRET_PATTERNS) {\n cleaned = cleaned.replace(pattern, '[REDACTED]');\n }\n return cleaned;\n }\n\n const reportCrash = async (kind: 'unhandledRejection' | 'uncaughtException', err: unknown) => {\n try {\n const cfg = loadConfig();\n if (!cfg.telemetry?.enabled) return;\n if (!(cfg.telemetry as unknown as { crashReports?: boolean })?.crashReports) return;\n // v5.0.1: removed consentedAt gate so users upgrading from 4.x keep crash\n // reporting without re-running onboarding. The SetupWizard still stamps\n // consentedAt for new installs; we simply don't require it here.\n const { sendRemoteAnalytics } = await import('../analytics/collector.js');\n const { getOrCreateNodeId } = await import('../mesh/identity.js');\n const home = homedir();\n const stackRaw = (err instanceof Error ? (err.stack || err.message) : String(err));\n const stack = scrubSecrets(stackRaw.split(home).join('$HOME')).slice(0, 4000);\n const message = scrubSecrets(err instanceof Error ? err.message : String(err)).slice(0, 500);\n const fingerprint = `${kind}:${(message.match(/[A-Z][a-zA-Z0-9_]+Error/) || [message])[0]}`.slice(0, 128);\n await sendRemoteAnalytics({\n type: 'error',\n installId: getOrCreateNodeId(),\n version: TITAN_VERSION,\n message,\n stack,\n fingerprint,\n context: { kind },\n });\n } catch {\n // Crash reporting is best-effort\n }\n };\n\n process.on('unhandledRejection', (reason) => {\n logger.error(COMPONENT, `Unhandled rejection: ${reason}`);\n void reportCrash('unhandledRejection', reason);\n });\n\n // Catch uncaught exceptions — log and exit gracefully to allow systemd/docker restart\n process.on('uncaughtException', (err) => {\n logger.error(COMPONENT, `Uncaught exception: ${err.message}\\n${err.stack || ''}`);\n void reportCrash('uncaughtException', err);\n // Give logger + crash report time to flush before exiting\n setTimeout(() => {\n process.exit(1);\n }, 1500).unref();\n });\n\n // ── Graceful Shutdown ───────────────────────────────────────────\n const gracefulShutdown = async (signal: string) => {\n logger.info(COMPONENT, `Received ${signal} — shutting down gracefully...`);\n // Stop F5-TTS server if we started it. Both the canonical f5tts.pid\n // and the legacy qwen3tts.pid path are checked so an upgrade from a\n // pre-v5.0.2 install still gets a clean shutdown of any orphan child.\n for (const pidPath of [\n join(homedir(), '.titan', 'f5tts.pid'),\n join(homedir(), '.titan', 'qwen3tts.pid'),\n ]) {\n try {\n if (!fs.existsSync(pidPath)) continue;\n const pid = parseInt(fs.readFileSync(pidPath, 'utf-8').trim());\n process.kill(pid, 'SIGTERM');\n fs.unlinkSync(pidPath);\n logger.info(COMPONENT, `Stopped F5-TTS server (${pidPath})`);\n } catch { /* already stopped */ }\n }\n stopAutopilot();\n stopDaemon();\n shutdownCommandPost();\n stopTunnel();\n closeMemory();\n flushGraph();\n try { const { flushVectors } = await import('../memory/vectors.js'); flushVectors(); } catch { /* ignore */ }\n await stopGateway();\n logger.info(COMPONENT, 'Gateway stopped. Goodbye.');\n process.exit(0);\n };\n process.on('SIGINT', () => gracefulShutdown('SIGINT'));\n process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));\n\n // Global error handler — prevent stack trace leaks\n app.use((err: Error, _req: express.Request, res: express.Response, _next: express.NextFunction) => {\n if (err instanceof SyntaxError && 'body' in err) {\n res.status(400).json({ error: 'Invalid JSON in request body' });\n return;\n }\n logger.error(COMPONENT, `Unhandled error: ${err.message}`);\n res.status(500).json({ error: 'Internal server error' });\n });\n\n httpServer.listen(port, host, () => {\n const proto = useHttps ? 'https' : 'http';\n const wsProto = useHttps ? 'wss' : 'ws';\n logger.info(COMPONENT, `Gateway listening on ${proto}://${host}:${port}`);\n logger.info(COMPONENT, `Dashboard: ${proto}://${host}:${port}`);\n logger.info(COMPONENT, `WebSocket: ${wsProto}://${host}:${port}`);\n logger.info(COMPONENT, `API: ${proto}://${host}:${port}/api/health`);\n logger.info(COMPONENT, `\\nChannels: ${Array.from(channels.values()).map((c) => `${c.displayName} (${c.getStatus().connected ? '✅' : '❌'})`).join(', ')}`);\n logger.info(COMPONENT, `Skills: ${getSkills().length} loaded`);\n logger.info(COMPONENT, `Tools: ${getRegisteredTools().length} registered`);\n\n // Friendly update notice for upgraders\n try {\n const markerPath = join(homedir(), '.titan', 'install-marker.json');\n if (fs.existsSync(markerPath)) {\n const marker = JSON.parse(fs.readFileSync(markerPath, 'utf-8'));\n if (marker.previousVersion && marker.previousVersion !== TITAN_VERSION) {\n logger.info(COMPONENT, `\\n🚀 Welcome to TITAN v${TITAN_VERSION}! Upgraded from v${marker.previousVersion}.`);\n logger.info(COMPONENT, ` What's new: PostHog analytics (opt-in), enriched telemetry, secret-scrubbed crash reports.`);\n logger.info(COMPONENT, ` Your config and settings are untouched. See PRIVACY.md for details.\\n`);\n }\n }\n } catch { /* non-critical */ }\n\n // Start Cloudflare Tunnel if enabled\n if (config.tunnel?.enabled) {\n startTunnel(port, config.tunnel).catch((e) => {\n logger.error(COMPONENT, `Tunnel start failed: ${(e as Error).message}`);\n });\n }\n\n // Start analytics collection (telemetry must be enabled)\n recordStartupAnalytics().catch(() => {});\n startHeartbeatAnalytics(() => listSessions().length);\n });\n}\n"],"mappings":"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","names":["resolve","isAllowedOrigin","getHistory","exec","getDb","getGraphStats","result","port","recordStartupAnalytics","config","loadConfig","updateConfig","createApproval","join","TITAN_HOME","processMessage","content","closeSession","host","getMetricsSummary","getLearningStats"]}
|
|
1
|
+
{"version":3,"sources":["../../src/gateway/server.ts"],"sourcesContent":["/**\n * TITAN — Gateway Server\n * WebSocket + HTTP server: the control plane for all channels, agents, tools, and the web UI.\n */\nimport express, { type Request, type Response, type NextFunction } from 'express';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport { createServer } from 'http';\nimport { createServer as createHttpsServer } from 'https';\nimport net from 'net';\nimport { join, dirname, resolve } from 'path';\nimport { fileURLToPath } from 'url';\nimport { homedir, hostname as osHostname, cpus, loadavg } from 'os';\nimport { randomBytes, timingSafeEqual } from 'crypto';\nimport { exec, execSync, spawn } from 'child_process';\nimport fs from 'fs';\nimport { loadConfig, updateConfig } from '../config/config.js';\nimport type { ProviderConfig } from '../config/schema.js';\nimport { loadProfile, saveProfile, type PersonalProfile } from '../memory/relationship.js';\nimport { processMessage } from '../agent/agent.js';\nimport { onAgentEvent } from '../agent/agentEvents.js';\nimport { initMemory, closeMemory, getUsageStats, getHistory, getDb } from '../memory/memory.js';\nimport { initBuiltinSkills, getSkills, toggleSkill, getSkillTools } from '../skills/registry.js';\nimport { listPersonas, getPersona, invalidatePersonaCache } from '../personas/manager.js';\nimport { searchSkills as marketplaceSearch, installSkill, uninstallSkill, listSkills as listMarketplaceSkills, listInstalled as listInstalledMarketplace } from '../skills/marketplace.js';\nimport { getRegisteredTools } from '../agent/toolRunner.js';\nimport { listSessions, cleanupStaleSessions } from '../agent/session.js';\nimport { healthCheckAll, discoverAllModels, getModelAliases, chatStream, getFallbackState } from '../providers/router.js';\nimport { auditSecurity } from '../security/sandbox.js';\nimport { WebChatChannel } from '../channels/webchat.js';\nimport { DiscordChannel } from '../channels/discord.js';\nimport { TelegramChannel } from '../channels/telegram.js';\nimport { SlackChannel } from '../channels/slack.js';\nimport { GoogleChatChannel } from '../channels/googlechat.js';\nimport { WhatsAppChannel } from '../channels/whatsapp.js';\nimport { MatrixChannel } from '../channels/matrix.js';\nimport { SignalChannel } from '../channels/signal.js';\nimport { MSTeamsChannel } from '../channels/msteams.js';\nimport { IRCChannel } from '../channels/irc.js';\nimport { MattermostChannel } from '../channels/mattermost.js';\nimport { LarkChannel } from '../channels/lark.js';\nimport { EmailInboundChannel } from '../channels/email_inbound.js';\nimport { LineChannel } from '../channels/line.js';\nimport { ZulipChannel } from '../channels/zulip.js';\nimport { MessengerChannel } from '../channels/messenger.js';\nimport { initAgents, routeMessage, listAgents, spawnAgent, stopAgent, getAgentCapacity, getAgent } from '../agent/multiAgent.js';\nimport { createOpenAICompatRouter } from '../gateway/openai-compat.js';\nimport type { ChannelAdapter, InboundMessage } from '../channels/base.js';\nimport logger, { initFileLogger } from '../utils/logger.js';\nimport { TITAN_VERSION, TITAN_NAME, TITAN_LOGS_DIR, TITAN_HOME } from '../utils/constants.js';\nimport { collectSystemProfile, recordStartupAnalytics, startHeartbeatAnalytics } from '../analytics/collector.js';\nimport { getUpdateInfo } from '../utils/updater.js';\nimport { getMissionControlHTML } from './dashboard.js';\nimport { serializePrometheus, getMetricsSummary, titanRequestsTotal, titanRequestDuration, titanErrorsTotal, titanActiveSessions, titanToolCallsTotal, titanTokensTotal, titanModelRequestsTotal, recordEvalSuiteResult } from './metrics.js';\nimport { initSlashCommands, handleSlashCommand } from './slashCommands.js';\nimport { initMcpServers, listMcpServers, addMcpServer, removeMcpServer, setMcpServerEnabled, getMcpStatus, BUILTIN_PRESETS } from '../mcp/registry.js';\nimport { connectMcpServer, testMcpServer } from '../mcp/client.js';\nimport { mountMcpHttpEndpoints, getMcpServerStatus } from '../mcp/server.js';\nimport { initMonitors, setMonitorTriggerHandler, listMonitors, addMonitor, removeMonitor, getMonitorEvents } from '../agent/monitor.js';\nimport { seedBuiltinRecipes, listRecipes, getRecipe, saveRecipe, deleteRecipe, getBuiltinRecipes, importRecipeYaml } from '../recipes/store.js';\nimport { parseSlashCommand, runRecipe } from '../recipes/runner.js';\nimport { getCostStatus } from '../agent/costOptimizer.js';\nimport { initLearning, getLearningStats } from '../memory/learning.js';\nimport { initGraph, getGraphData, getGraphStats, clearGraph, cleanupGraph, flushGraph, getEntity, listEntities, getEntityEpisodes } from '../memory/graph.js';\nimport { getLogFilePath } from '../utils/logger.js';\nimport { closeSession, renameSession } from '../agent/session.js';\nimport { initCronScheduler } from '../skills/builtin/cron.js';\nimport { checkAndSendBriefing } from '../memory/briefing.js';\nimport { initPersistentWebhooks } from '../skills/builtin/webhook.js';\nimport { invalidateCacheForModel } from '../agent/responseCache.js';\nimport { initAutopilot, stopAutopilot, runAutopilotNow, getAutopilotStatus, getRunHistory, setAutopilotDryRun } from '../agent/autopilot.js';\nimport { initDaemon, stopDaemon, getDaemonStatus, pauseDaemonManual, resumeDaemon, titanEvents } from '../agent/daemon.js';\nimport { initCommandPost, shutdownCommandPost, isCommandPostEnabled, getDashboard as getCPDashboard, getRegisteredAgents, reportHeartbeat, removeAgent, checkoutTask, checkinTask, getActiveCheckouts, getBudgetPolicies, createBudgetPolicy, updateBudgetPolicy, deleteBudgetPolicy, getActivity, getGoalTree, getAncestryChain, validateGoalAncestry, validateGoalParentAssignment, sweepExpiredCheckoutsManual, getStaleAgents, enforceBudgetForAgent, getBudgetPolicyForAgent, createIssue, updateIssue, getIssue, listIssues, searchIssues, checkoutIssue, deleteIssue, addIssueComment, getIssueComments, createApproval, approveApproval, rejectApproval, listApprovals, getApproval, replyToApproval, snoozeApproval, unsnoozeApproval, batchApprove, batchReject, getAgentMessages, markAgentMessageRead, startRun, endRun, listRuns, getOrgTree, updateRegisteredAgent } from '../agent/commandPost.js';\nimport { initWakeupSystem, getAgentInbox, queueWakeup, getWakeupRequest, cancelWakeup, drainPendingResults } from '../agent/agentWakeup.js';\nimport { auditLog, queryAuditLog, getAuditStats } from '../agent/auditLog.js';\nimport { listGoals, createGoal, getGoal, deleteGoal, updateGoal, completeSubtask, addSubtask, dedupeGoalsBulk } from '../agent/goals.js';\nimport { startTunnel, stopTunnel, getTunnelStatus } from '../utils/tunnel.js';\nimport { startPaperclip, stopPaperclip, getPaperclipStatus } from '../addons/paperclipSidecar.js';\nimport { getConsentUrl, exchangeCode, isGoogleConnected, getGoogleEmail, disconnectGoogle } from '../auth/google.js';\nimport { createTeam, getTeam, listTeams, deleteTeam, updateTeam, addMember, removeMember, updateMemberRole, createInvite, acceptInvite, getEffectivePermissions, setRolePermissions, getTeamStats, isToolAllowed, getUserRole } from '../security/teams.js';\nimport { TITAN_WORKSPACE } from '../utils/constants.js';\nconst COMPONENT = 'Gateway';\n\n/** Get normalized CPU load (0.0–1.0) using 1-minute load average */\nfunction getCpuLoad(): number {\n const avg = loadavg()[0]; // 1-minute load average\n const cores = cpus().length || 1;\n return Math.min(1, avg / cores);\n}\n\n/** Fields that require a gateway restart to take effect */\nconst RESTART_REQUIRED_PATTERNS = ['channels.*', 'gateway.auth.*', 'logging.level'];\n\n/** Module-level HTTP server reference (allows stopGateway to close it) */\nlet httpServer: ReturnType<typeof createServer> | null = null;\n\n/** Interval IDs for cleanup on shutdown */\nlet tokenCleanupInterval: ReturnType<typeof setInterval> | null = null;\nlet rateLimitCleanupInterval: ReturnType<typeof setInterval> | null = null;\nlet healthMonitorInterval: ReturnType<typeof setInterval> | null = null;\nlet sessionAbortCleanupInterval: ReturnType<typeof setInterval> | null = null;\nlet unsubscribeAgentEvents: (() => void) | null = null;\nlet activeLlmRequests = 0;\nlet maxConcurrentOverride: number | null = null;\n\n// ── Module-level constants (avoid per-request allocation) ──────────\nconst VOICE_POISON_PATTERNS = [\n /i completed the tool operations/i,\n /i wasn't able to execute tools/i,\n /i completed the operations/i,\n /let me know if you need anything else\\.?\\s*$/i,\n];\nconst F5_TTS_DEFAULT_VOICES = ['andrew'];\nconst DAEMON_SSE_EVENTS = ['daemon:started', 'daemon:stopped', 'daemon:paused', 'daemon:resumed',\n 'daemon:heartbeat', 'goal:subtask:ready', 'health:ollama:down',\n 'health:ollama:degraded', 'cron:stuck',\n 'initiative:start', 'initiative:complete', 'initiative:no_progress',\n 'initiative:tool_call', 'initiative:tool_result', 'initiative:round'];\nconst PANE_SSE_TOPICS = [\n // Soma / drives\n 'drive:tick', 'hormone:update', 'pressure:threshold', 'soma:proposal',\n // Turns / tools\n 'turn:pre', 'turn:post', 'tool:call', 'tool:result',\n // Goals\n 'goal:create', 'goal:complete', 'goal:fail', 'goal:cancel', 'goal:update',\n // Command Post\n 'cp:activity', 'cp:proposal', 'cp:approval', 'cp:rejection',\n // Health\n 'health:up', 'health:down', 'health:degraded',\n // Multi-agent\n 'agent:spawn', 'agent:kill', 'agent:message',\n // Alerts\n 'alert:warning', 'alert:critical',\n];\nconst CP_SSE_EVENTS = [\n 'commandpost:activity', 'commandpost:task:checkout', 'commandpost:task:checkin',\n 'commandpost:task:expired', 'commandpost:budget:warning', 'commandpost:budget:exceeded',\n 'commandpost:agent:heartbeat', 'commandpost:agent:status',\n];\nconst ALLOWED_ORIGINS = [\n /^https?:\\/\\/localhost(:\\d+)?$/,\n /^https?:\\/\\/127\\.0\\.0\\.1(:\\d+)?$/,\n /^https?:\\/\\/\\[::1\\](:\\d+)?$/,\n /^https?:\\/\\/192\\.168\\.\\d+\\.\\d+(:\\d+)?$/, // LAN\n];\nfunction isAllowedOrigin(origin: string): boolean {\n return ALLOWED_ORIGINS.some(re => re.test(origin));\n}\n\n/**\n * Classify a chat error into a structured response that the React UI can render\n * as an actionable banner. Without this, every failure shows up as a generic 500\n * with a stack trace that means nothing to a non-developer.\n *\n * The classifier returns:\n * { error: string, message: string, status: number, action?: { type, target } }\n *\n * Known error codes (must match what the UI knows how to render):\n * - no_provider_configured → no API keys / Ollama unreachable\n * - rate_limited → 429 from upstream\n * - context_too_long → context window exceeded\n * - model_not_found → invalid model id\n * - auth_failed → 401/403 from upstream\n * - upstream_error → other 4xx/5xx from upstream\n * - timeout → request timed out\n * - unknown → fallback for everything else\n */\ninterface ChatErrorResponse {\n error: string;\n message: string;\n detail?: string;\n status: number;\n action?: { type: 'open' | 'retry' | 'docs'; target: string; label: string };\n}\nfunction classifyChatError(err: Error): ChatErrorResponse {\n const msg = (err.message || String(err)).toLowerCase();\n const detail = err.message;\n\n // No provider configured / no valid API key\n if (\n msg.includes('no valid provider') ||\n msg.includes('no api key') ||\n msg.includes('not configured') ||\n msg.includes('provider not found')\n ) {\n return {\n error: 'no_provider_configured',\n message: 'No AI provider is configured. Set up a provider to start chatting.',\n detail,\n status: 503,\n action: { type: 'open', target: '/settings', label: 'Open settings' },\n };\n }\n\n // Rate limited / quota exhausted\n if (\n msg.includes('rate limit') ||\n msg.includes('429') ||\n msg.includes('quota') ||\n msg.includes('too many requests')\n ) {\n return {\n error: 'rate_limited',\n message: \"You've hit your provider's rate limit. Wait a moment and try again, or switch providers in Settings.\",\n detail,\n status: 429,\n action: { type: 'retry', target: '', label: 'Retry' },\n };\n }\n\n // Context window exceeded\n if (\n msg.includes('context length') ||\n msg.includes('context window') ||\n msg.includes('maximum context') ||\n msg.includes('too many tokens') ||\n msg.includes('context_length_exceeded') ||\n msg.includes('prompt is too long')\n ) {\n return {\n error: 'context_too_long',\n message: 'The conversation got too long for the model. Start a new session or compact this one.',\n detail,\n status: 413,\n action: { type: 'open', target: '/sessions', label: 'New session' },\n };\n }\n\n // Model not found / invalid model id\n if (\n msg.includes('model not found') ||\n msg.includes('invalid model') ||\n msg.includes('unknown model') ||\n msg.includes('model_not_found') ||\n msg.includes('does not exist')\n ) {\n return {\n error: 'model_not_found',\n message: \"The selected model doesn't exist or you don't have access to it. Pick a different model in Settings.\",\n detail,\n status: 404,\n action: { type: 'open', target: '/settings', label: 'Pick a model' },\n };\n }\n\n // Auth failure (bad key / expired)\n if (\n msg.includes('401') ||\n msg.includes('403') ||\n msg.includes('unauthorized') ||\n msg.includes('forbidden') ||\n msg.includes('authentication') ||\n msg.includes('invalid api key') ||\n msg.includes('invalid_api_key')\n ) {\n return {\n error: 'auth_failed',\n message: 'Your API key was rejected by the provider. Check it in Settings → Providers.',\n detail,\n status: 401,\n action: { type: 'open', target: '/settings', label: 'Check API key' },\n };\n }\n\n // Timeout\n if (\n msg.includes('timeout') ||\n msg.includes('timed out') ||\n msg.includes('etimedout') ||\n msg.includes('aborted')\n ) {\n return {\n error: 'timeout',\n message: 'The model took too long to respond. Try again, or switch to a faster model.',\n detail,\n status: 504,\n action: { type: 'retry', target: '', label: 'Retry' },\n };\n }\n\n // Upstream provider error\n if (\n msg.includes('500') || msg.includes('502') || msg.includes('503') ||\n msg.includes('gateway') || msg.includes('upstream')\n ) {\n return {\n error: 'upstream_error',\n message: \"Your AI provider is having issues right now. Try again, or switch providers.\",\n detail,\n status: 502,\n action: { type: 'retry', target: '', label: 'Retry' },\n };\n }\n\n // Fallback\n return {\n error: 'unknown',\n message: detail || 'Something went wrong while processing your message.',\n detail,\n status: 500,\n };\n}\n\n/** Internal health monitor state */\nconst healthState = {\n ollamaHealthy: false,\n ttsHealthy: false,\n lastCheck: null as string | null,\n lastActiveLlm: 0,\n lastActiveLlmTime: 0,\n stuckDetected: false,\n};\n\nexport function stopGateway(): Promise<void> {\n return new Promise((resolve) => {\n // Clear intervals to release the event loop\n if (tokenCleanupInterval) { clearInterval(tokenCleanupInterval); tokenCleanupInterval = null; }\n if (rateLimitCleanupInterval) { clearInterval(rateLimitCleanupInterval); rateLimitCleanupInterval = null; }\n if (healthMonitorInterval) { clearInterval(healthMonitorInterval); healthMonitorInterval = null; }\n if (sessionAbortCleanupInterval) { clearInterval(sessionAbortCleanupInterval); sessionAbortCleanupInterval = null; }\n if (unsubscribeAgentEvents) { unsubscribeAgentEvents(); unsubscribeAgentEvents = null; }\n\n if (httpServer) {\n // Force-close open connections after 3 seconds (SSE/WebSocket keep-alives block shutdown)\n const forceTimeout = setTimeout(() => {\n logger.warn('Gateway', 'Shutdown timeout — destroying remaining connections');\n httpServer?.closeAllConnections?.();\n httpServer = null;\n resolve();\n }, 3000);\n forceTimeout.unref();\n\n httpServer.close(() => {\n clearTimeout(forceTimeout);\n httpServer = null;\n resolve();\n });\n } else {\n resolve();\n }\n });\n}\n\n/** Usage tracking — per-request cost/token tracking */\ninterface UsageEntry {\n timestamp: string;\n model: string;\n provider: string;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n estimatedCostUsd: number;\n durationMs: number;\n sessionId: string;\n}\nconst usageLog: UsageEntry[] = [];\nconst MAX_USAGE_LOG = 10000; // Keep last 10K entries in memory\n\n// Approximate cost per 1M tokens (input/output) for common models\nconst MODEL_COSTS: Record<string, { input: number; output: number }> = {\n 'claude-sonnet': { input: 3, output: 15 },\n 'claude-haiku': { input: 0.25, output: 1.25 },\n 'claude-opus': { input: 15, output: 75 },\n 'gpt-4o': { input: 2.5, output: 10 },\n 'gpt-4o-mini': { input: 0.15, output: 0.6 },\n 'gpt-4-turbo': { input: 10, output: 30 },\n 'ollama': { input: 0, output: 0 }, // local = free\n 'groq': { input: 0.05, output: 0.08 },\n 'deepseek': { input: 0.14, output: 0.28 },\n};\n\nfunction estimateCost(model: string, promptTokens: number, completionTokens: number): number {\n const key = Object.keys(MODEL_COSTS).find(k => model.toLowerCase().includes(k));\n if (!key) return 0;\n const rates = MODEL_COSTS[key];\n return (promptTokens * rates.input + completionTokens * rates.output) / 1_000_000;\n}\n\nfunction trackUsage(model: string, tokenUsage: { prompt?: number; completion?: number } | undefined, durationMs: number, sessionId: string): void {\n if (!tokenUsage) return;\n const prompt = tokenUsage.prompt || 0;\n const completion = tokenUsage.completion || 0;\n const provider = model.includes('/') ? model.split('/')[0] : 'unknown';\n const entry: UsageEntry = {\n timestamp: new Date().toISOString(),\n model,\n provider,\n promptTokens: prompt,\n completionTokens: completion,\n totalTokens: prompt + completion,\n estimatedCostUsd: estimateCost(model, prompt, completion),\n durationMs,\n sessionId,\n };\n usageLog.push(entry);\n if (usageLog.length > MAX_USAGE_LOG) usageLog.splice(0, usageLog.length - MAX_USAGE_LOG);\n}\n\n/** Active session tokens (persisted to disk so they survive restarts) */\nconst AUTH_TOKENS_PATH = join(TITAN_HOME, 'auth-tokens.json');\n\nfunction loadAuthTokens(): Map<string, { createdAt: number; userId: string }> {\n const map = new Map<string, { createdAt: number; userId: string }>();\n try {\n if (fs.existsSync(AUTH_TOKENS_PATH)) {\n const raw = JSON.parse(fs.readFileSync(AUTH_TOKENS_PATH, 'utf-8'));\n if (Array.isArray(raw)) {\n const ttlMs = 24 * 60 * 60 * 1000;\n const now = Date.now();\n for (const item of raw) {\n if (item && typeof item.token === 'string' && typeof item.createdAt === 'number' && typeof item.userId === 'string') {\n if (now - item.createdAt <= ttlMs) {\n map.set(item.token, { createdAt: item.createdAt, userId: item.userId });\n }\n }\n }\n }\n }\n } catch {\n // Best-effort: if file is corrupt, start fresh\n }\n return map;\n}\n\nfunction saveAuthTokens(): void {\n try {\n const entries = [];\n for (const [token, entry] of authTokens) {\n entries.push({ token, createdAt: entry.createdAt, userId: entry.userId });\n }\n fs.writeFileSync(AUTH_TOKENS_PATH, JSON.stringify(entries, null, 2));\n } catch {\n // Best-effort persistence\n }\n}\n\nconst authTokens = loadAuthTokens();\n\n/** S3: Get userId from request auth token */\nfunction getUserIdFromReq(req: { headers: { authorization?: string } }): string {\n const token = req.headers.authorization?.replace('Bearer ', '');\n if (token) {\n const entry = authTokens.get(token);\n if (entry) return entry.userId;\n }\n return 'default-user';\n}\n\n// Active session abort controllers — keyed by sessionId\nconst sessionAborts = new Map<string, AbortController>();\n// R8: Track abort controller creation time for TTL-based cleanup\nconst sessionAbortTimes = new Map<string, number>();\n\n// S3: Track session ownership — sessionId → userId\nconst sessionOwners = new Map<string, string>();\n\n// R8: Periodic cleanup of orphaned abort controllers (TTL 5 min)\nsessionAbortCleanupInterval = setInterval(() => {\n const now = Date.now();\n for (const [id, controller] of sessionAborts) {\n if (controller.signal.aborted || (now - (sessionAbortTimes.get(id) || 0)) > 300_000) {\n sessionAborts.delete(id);\n sessionAbortTimes.delete(id);\n sessionOwners.delete(id);\n }\n }\n}, 60_000);\nsessionAbortCleanupInterval.unref();\n\n// Clean expired tokens every 10 minutes\ntokenCleanupInterval = setInterval(() => {\n const now = Date.now();\n const ttlMs = 24 * 60 * 60 * 1000;\n for (const [tok, entry] of authTokens) {\n if (now - entry.createdAt > ttlMs) authTokens.delete(tok);\n }\n saveAuthTokens();\n}, 600_000);\ntokenCleanupInterval.unref();\n\n/** Constant-time string comparison to prevent timing attacks */\nfunction safeCompare(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n return timingSafeEqual(Buffer.from(a), Buffer.from(b));\n}\n\n/** Check if a request token is valid */\nfunction isValidToken(token: string | undefined, config: ReturnType<typeof loadConfig>): boolean {\n const auth = config.gateway.auth;\n if (!auth || auth.mode === 'none') return true;\n if (!token) return false;\n // S2: If token mode but no token configured, log warning and deny (don't silently allow)\n if (auth.mode === 'token') {\n if (!auth.token) {\n logger.warn(COMPONENT, 'Auth mode is \"token\" but no token configured — denying request. Set gateway.auth.token or switch to mode \"password\".');\n return false;\n }\n return safeCompare(token, auth.token);\n }\n if (auth.mode === 'password') {\n const entry = authTokens.get(token);\n if (!entry) return false;\n const ttlMs = 24 * 60 * 60 * 1000; // 24 hours\n if (Date.now() - entry.createdAt > ttlMs) {\n authTokens.delete(token);\n saveAuthTokens();\n return false;\n }\n return true;\n }\n return false;\n}\n\n/** Login page HTML */\nfunction getLoginHTML(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n<title>TITAN — Login</title>\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\n@keyframes gradientBg{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}\n@keyframes shimmer{0%{background-position:-200% center}100%{background-position:200% center}}\n@keyframes shake{0%,100%{transform:translateX(0)}10%,30%,50%,70%,90%{transform:translateX(-4px)}20%,40%,60%,80%{transform:translateX(4px)}}\n@keyframes fadeIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\nbody{font-family:'Inter','Segoe UI',system-ui,sans-serif;background:linear-gradient(135deg,#0a0e1a 0%,#0f172a 25%,#1a1040 50%,#0f172a 75%,#0a0e1a 100%);background-size:400% 400%;animation:gradientBg 15s ease infinite;color:#e2e8f0;display:flex;align-items:center;justify-content:center;min-height:100vh}\n.box{background:rgba(17,24,39,0.85);backdrop-filter:blur(20px);border:1px solid rgba(42,48,80,0.6);border-radius:16px;padding:40px;width:380px;box-shadow:0 0 40px rgba(6,182,212,.1),0 0 80px rgba(139,92,246,.05);animation:fadeIn .6s ease-out}\n.box.shake{animation:shake .5s ease}\nh1{font-size:28px;font-weight:700;background:linear-gradient(90deg,#06b6d4,#8b5cf6,#06b6d4);background-size:200% auto;-webkit-background-clip:text;-webkit-text-fill-color:transparent;animation:shimmer 3s linear infinite;text-align:center;letter-spacing:3px;margin-bottom:4px}\n.sub{text-align:center;color:#94a3b8;font-size:13px;margin-bottom:32px}\nlabel{font-size:12px;color:#94a3b8;text-transform:uppercase;letter-spacing:1px;display:block;margin-bottom:8px}\ninput{width:100%;background:rgba(26,31,54,0.8);border:1px solid #2a3050;border-radius:10px;padding:12px 16px;color:#e2e8f0;font-size:15px;outline:none;transition:border .2s,box-shadow .2s}\ninput:focus{border-color:#06b6d4;box-shadow:0 0 12px rgba(6,182,212,.2)}\nbutton{width:100%;margin-top:20px;background:linear-gradient(135deg,#06b6d4,#8b5cf6);border:none;border-radius:10px;padding:14px;color:#fff;font-size:15px;font-weight:600;cursor:pointer;transition:opacity .2s,transform .1s}\nbutton:hover{opacity:.9;transform:translateY(-1px)}\nbutton:active{transform:translateY(0)}\n.error{color:#ef4444;font-size:13px;margin-top:12px;text-align:center;display:none}\n</style>\n</head>\n<body>\n<div class=\"box\">\n <h1>⚡ TITAN</h1>\n <div class=\"sub\">Mission Control</div>\n <label>Password</label>\n <input type=\"password\" id=\"pw\" placeholder=\"Enter gateway password\" onkeydown=\"if(event.key==='Enter')login()\"/>\n <button onclick=\"login()\">Unlock</button>\n <div class=\"error\" id=\"err\">Incorrect password. Try again.</div>\n</div>\n<script>\nasync function login() {\n const pw = document.getElementById('pw').value;\n const res = await fetch('/api/login', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({password:pw})});\n if (res.ok) {\n const {token} = await res.json();\n localStorage.setItem('titan_token', token);\n location.href = '/';\n } else {\n document.getElementById('err').style.display = 'block';\n document.getElementById('pw').value = '';\n document.getElementById('pw').focus();\n const box = document.querySelector('.box');\n box.classList.remove('shake');\n void box.offsetWidth;\n box.classList.add('shake');\n }\n}\ndocument.getElementById('pw').focus();\n</script>\n</body>\n</html>`;\n}\n\n/** All active channel adapters */\nconst channels: Map<string, ChannelAdapter> = new Map();\n\n/** All connected WebSocket clients */\ninterface TaggedWebSocket extends WebSocket {\n titanSessionId?: string;\n titanUserId?: string;\n}\nconst wsClients: Set<TaggedWebSocket> = new Set();\nconst WS_MAX_MESSAGE_BYTES = 10 * 1024 * 1024; // 10MB max WS message\n\n/** The WebChat channel instance */\nlet webChatChannel: WebChatChannel | null = null;\n\n/** Broadcast a message to WebSocket clients. If userId is specified, only sends to that user's connections. */\nfunction broadcast(data: Record<string, unknown>, userId?: string): void {\n const json = JSON.stringify(data);\n for (const client of wsClients) {\n if (client.readyState === WebSocket.OPEN) {\n // Session isolation: if userId specified, only send to matching clients\n if (userId && (client as TaggedWebSocket).titanUserId && (client as TaggedWebSocket).titanUserId !== userId) continue;\n try {\n client.send(json);\n } catch (err) {\n logger.warn(COMPONENT, `Broadcast send failed: ${(err as Error).message}`);\n }\n }\n }\n}\n\n// Sub-agent event bridge: forward agent bus events to SSE broadcast\nunsubscribeAgentEvents = onAgentEvent((event) => {\n const sseType = event.type === 'tool_call' ? 'tool_call' : event.type === 'tool_end' ? 'tool_end' : event.type;\n broadcast({ type: sseType, ...event.data, agentName: event.agentName, agentId: event.agentId, isSubAgent: true, timestamp: event.timestamp });\n});\n\n// Initiative event bridge: broadcast autonomous task progress to dashboard chat\ntitanEvents.on('initiative:start', (data) => {\n broadcast({\n type: 'system_message',\n content: `🤖 **Initiative starting**: ${(data as Record<string, string>).subtaskTitle}\\n📋 Goal: ${(data as Record<string, string>).goalTitle}`,\n source: 'initiative',\n timestamp: (data as Record<string, string>).timestamp,\n });\n});\ntitanEvents.on('initiative:complete', (data) => {\n const d = data as Record<string, unknown>;\n broadcast({\n type: 'system_message',\n content: `✅ **Subtask completed**: ${d.subtaskTitle}\\n🔧 Tools: ${(d.toolsUsed as string[]).join(', ')}\\n📝 ${(d.summary as string || '').slice(0, 200)}`,\n source: 'initiative',\n timestamp: d.timestamp as string,\n });\n});\ntitanEvents.on('initiative:no_progress', (data) => {\n const d = data as Record<string, unknown>;\n broadcast({\n type: 'system_message',\n content: `⚠️ **No progress on**: ${d.subtaskTitle}\\n${d.reason}`,\n source: 'initiative',\n timestamp: d.timestamp as string,\n });\n});\ntitanEvents.on('initiative:tool_call', (data) => {\n const d = data as Record<string, unknown>;\n broadcast({\n type: 'system_message',\n content: `🔧 **${d.tool}**: ${d.args || ''}`,\n source: 'initiative',\n timestamp: d.timestamp as string,\n });\n});\ntitanEvents.on('initiative:tool_result', (data) => {\n const d = data as Record<string, unknown>;\n const icon = d.success ? '✅' : '❌';\n broadcast({\n type: 'system_message',\n content: `${icon} **${d.tool}** ${d.success ? 'completed' : 'failed'} (${d.durationMs}ms)`,\n source: 'initiative',\n timestamp: d.timestamp as string,\n });\n});\ntitanEvents.on('initiative:round', (data) => {\n const d = data as Record<string, unknown>;\n broadcast({\n type: 'system_message',\n content: `🔄 **Round ${d.round}/${d.maxRounds}** — ${d.subtaskTitle}`,\n source: 'initiative',\n timestamp: d.timestamp as string,\n });\n});\n\n/** Safely send a response through a channel adapter.\n * Hunt Finding #13: uses deliver() which runs the content through the\n * outbound sanitizer before invoking the channel's send() method. Applies\n * to all 17 channel adapters automatically. */\nasync function safeSend(channelName: string, msg: { channel: string; userId: string; groupId?: string; content: string; replyTo?: string }): Promise<void> {\n const channel = channels.get(channelName);\n if (!channel) return;\n try {\n await channel.deliver(msg);\n } catch (err) {\n logger.warn(COMPONENT, `Channel send failed (${channelName}): ${(err as Error).message}`);\n }\n}\n\n/** Handle an inbound message from any channel */\nasync function handleInboundMessage(msg: InboundMessage): Promise<void> {\n logger.info(COMPONENT, `[${msg.channel}] ${msg.userName || msg.userId}: ${msg.content.slice(0, 100)}`);\n\n // Broadcast to WebSocket clients for UI\n broadcast({\n type: 'message',\n direction: 'inbound',\n channel: msg.channel,\n userId: msg.userId,\n userName: msg.userName,\n content: msg.content,\n timestamp: msg.timestamp.toISOString(),\n });\n\n // ── Native slash commands (highest priority) ──────────────────\n const slashResult = await handleSlashCommand(msg.content, msg.channel, msg.userId);\n if (slashResult) {\n await safeSend(msg.channel, { channel: msg.channel, userId: msg.userId, groupId: msg.groupId, content: slashResult.response, replyTo: msg.id });\n broadcast({ type: 'message', direction: 'outbound', channel: msg.channel, userId: msg.userId, content: slashResult.response, timestamp: new Date().toISOString() });\n return;\n }\n\n // ── Recipe slash commands (second priority) ──────────────────\n const slash = parseSlashCommand(msg.content);\n if (slash) {\n const { command, args } = slash;\n const params: Record<string, string> = {};\n if (args) { params['file'] = args; params['topic'] = args; params['error'] = args; }\n try {\n let fullResponse = '';\n for await (const step of runRecipe(command, params)) {\n const r = await processMessage(step.prompt, msg.channel, msg.userId);\n fullResponse += (fullResponse ? '\\n\\n' : '') + r.content;\n }\n await safeSend(msg.channel, { channel: msg.channel, userId: msg.userId, groupId: msg.groupId, content: fullResponse, replyTo: msg.id });\n broadcast({ type: 'message', direction: 'outbound', channel: msg.channel, userId: msg.userId, content: fullResponse, timestamp: new Date().toISOString() });\n return;\n } catch {\n // Recipe not found — fall through to normal processing\n }\n }\n\n try {\n // Route through multi-agent system\n const response = await routeMessage(msg.content, msg.channel, msg.userId);\n\n // Send response back to the channel\n await safeSend(msg.channel, {\n channel: msg.channel,\n userId: msg.userId,\n groupId: msg.groupId,\n content: response.content,\n replyTo: msg.id,\n });\n\n // Broadcast response to UI\n broadcast({\n type: 'message',\n direction: 'outbound',\n channel: msg.channel,\n userId: msg.userId,\n content: response.content,\n toolsUsed: response.toolsUsed,\n tokenUsage: response.tokenUsage,\n durationMs: response.durationMs,\n timestamp: new Date().toISOString(),\n });\n } catch (error) {\n logger.error(COMPONENT, `Error processing message: ${(error as Error).message}`);\n broadcast({ type: 'error', message: 'TITAN ran into a problem handling that message. Please try again.' });\n }\n}\n\n/** Start the Gateway server */\nexport async function startGateway(options?: { port?: number; host?: string; verbose?: boolean; rateLimitMax?: number; rateLimitWindowMs?: number; skipUsableCheck?: boolean }): Promise<void> {\n const config = loadConfig();\n initFileLogger(TITAN_LOGS_DIR);\n const port = options?.port || config.gateway.port;\n let host = options?.host || config.gateway.host;\n\n // Hunt Finding #29 (2026-04-14): install a bounded global HTTP dispatcher\n // BEFORE any fetch() calls are made. Without this, each parallel Ollama\n // fetch opens a fresh socket and the keep-alive pool grows unboundedly.\n // Phase 5 load test saw 80+ idle sockets to Ollama after 100 requests.\n try {\n const { installGlobalHttpPool } = await import('../utils/httpPool.js');\n const poolCfg = (config.gateway as unknown as { httpPool?: { connections?: number; keepAliveTimeoutMs?: number; keepAliveMaxTimeoutMs?: number; headersTimeoutMs?: number; bodyTimeoutMs?: number } }).httpPool;\n installGlobalHttpPool({\n connections: poolCfg?.connections,\n keepAliveTimeoutMs: poolCfg?.keepAliveTimeoutMs,\n keepAliveMaxTimeoutMs: poolCfg?.keepAliveMaxTimeoutMs,\n headersTimeoutMs: poolCfg?.headersTimeoutMs,\n bodyTimeoutMs: poolCfg?.bodyTimeoutMs,\n });\n } catch (e) {\n logger.warn(COMPONENT, `[HttpPool] Failed to install global dispatcher: ${(e as Error).message} — fetch() will use Node defaults (unbounded pool)`);\n }\n\n logger.info(COMPONENT, `Starting ${TITAN_NAME} Gateway v${TITAN_VERSION}`);\n\n // ── First-run guard: refuse to start with no usable provider ──\n // Without this, the gateway boots fine but every chat call fails with a\n // generic 500. Users have no idea they need to configure a provider.\n // Bypass with --skip-usable-check (or skipUsableCheck option) for advanced use.\n if (!options?.skipUsableCheck) {\n const { hasUsableProvider } = await import('../config/config.js');\n const usable = await hasUsableProvider();\n if (!usable.ok) {\n console.error('');\n console.error('\\x1b[31m\\x1b[1m❌ TITAN is not configured.\\x1b[0m');\n console.error('');\n console.error(` ${usable.details}`);\n console.error('');\n console.error(' Run the setup wizard:');\n console.error(' \\x1b[36mtitan onboard\\x1b[0m');\n console.error('');\n console.error(' Or set an environment variable:');\n console.error(' \\x1b[36mexport ANTHROPIC_API_KEY=\"sk-ant-...\"\\x1b[0m');\n console.error(' \\x1b[36mexport OPENAI_API_KEY=\"sk-...\"\\x1b[0m');\n console.error(' \\x1b[36mexport OLLAMA_BASE_URL=\"http://localhost:11434\"\\x1b[0m');\n console.error('');\n console.error(' Or check what went wrong:');\n console.error(' \\x1b[36mtitan doctor\\x1b[0m');\n console.error('');\n console.error(' To skip this check (advanced):');\n console.error(' \\x1b[36mtitan gateway --skip-usable-check\\x1b[0m');\n console.error('');\n process.exit(1);\n }\n logger.info(COMPONENT, `Provider check passed: ${usable.details}`);\n }\n\n // ── Production safety warning ─────────────────────────────────────\n if (config.autonomy?.mode === 'autonomous') {\n logger.warn(COMPONENT, '⚠️ AUTONOMY MODE IS \"autonomous\" — all tools run without approval. Safe for personal use, DANGEROUS for multi-user deployments.');\n logger.warn(COMPONENT, ' Set autonomy.mode to \"supervised\" in titan.json if exposing to external users.');\n }\n if (config.commandPost?.enabled) {\n logger.info(COMPONENT, '✅ Command Post governance is active — approvals route through CP queue');\n } else {\n logger.warn(COMPONENT, '⚠️ Command Post is DISABLED — no approval queue, no budget enforcement, no agent registry');\n }\n if (config.selfMod?.enabled) {\n logger.info(COMPONENT, '✅ Self-modification is active — writes are staged for human review');\n }\n\n // ── Stale session cleanup: mark orphaned active sessions as idle ──\n cleanupStaleSessions();\n\n // ── Port pre-check: fail fast before loading subsystems ────\n const portAvailable = await new Promise<boolean>((resolve) => {\n const tester = net.createServer();\n tester.once('error', () => resolve(false));\n tester.once('listening', () => { tester.close(); resolve(true); });\n tester.listen(port, host);\n });\n if (!portAvailable) {\n logger.error(COMPONENT, `Port ${port} is already in use. Is TITAN already running?`);\n logger.info(COMPONENT, `Try: titan gateway --port ${port + 1}`);\n process.exit(1);\n }\n\n // ── GPU detection: adjust stall timeout for CPU-only inference ──\n const { detectGpu } = await import('../utils/hardware.js');\n if (!detectGpu()) {\n const { setStallThreshold } = await import('../agent/stallDetector.js');\n setStallThreshold(120_000);\n logger.info(COMPONENT, 'No GPU detected — stall timeout increased to 120s for CPU inference');\n maxConcurrentOverride = 2;\n logger.info(COMPONENT, 'CPU-only mode: maxConcurrentTasks auto-tuned to 2');\n }\n\n // Initialize subsystems\n initMemory();\n initLearning();\n initGraph();\n\n // Recover persisted deliberation states from previous session\n import('../agent/deliberation.js').then(({ recoverDeliberations }) => {\n recoverDeliberations();\n }).catch(() => {});\n\n // Initialize vector search (Tier 2 memory — non-blocking)\n import('../memory/vectors.js').then(({ initVectors }) => {\n initVectors().then(ok => {\n if (ok) logger.info(COMPONENT, 'Vector search (Tier 2 memory) initialized');\n }).catch(() => {});\n }).catch(() => {});\n\n await initBuiltinSkills();\n initAgents();\n\n // ── Rate limiter (inline, no deps) ─────────────────────────\n const defaultRateLimitWindowMs = options?.rateLimitWindowMs ?? 60000;\n const defaultRateLimitMax = options?.rateLimitMax ?? 30;\n const rateLimitStore = new Map<string, { count: number; resetAt: number }>();\n\n /**\n * Get a consistent client IP address for rate limiting.\n * Falls back through: X-Forwarded-For → req.ip → socket remoteAddress\n */\n function getClientIp(req: Request): string {\n return (req.headers['x-forwarded-for'] as string)?.split(',')[0]?.trim()\n || req.ip\n || req.socket?.remoteAddress\n || 'unknown';\n }\n\n function rateLimit(windowMs: number, maxRequests: number) {\n return (req: Request, res: Response, next: NextFunction) => {\n const key = getClientIp(req);\n const now = Date.now();\n const entry = rateLimitStore.get(key);\n if (!entry || now > entry.resetAt) {\n rateLimitStore.set(key, { count: 1, resetAt: now + windowMs });\n next();\n } else if (entry.count < maxRequests) {\n entry.count++;\n next();\n } else {\n const retryAfter = Math.ceil((entry.resetAt - now) / 1000);\n logger.warn(COMPONENT, `[RateLimit] Client ${key} rate limited (${entry.count}/${maxRequests} in ${windowMs}ms)`);\n res.setHeader('Retry-After', String(retryAfter));\n res.status(429).json({ error: 'Too many requests', retryAfter });\n }\n };\n }\n\n // ── Concurrent request guard (prevents parallel abuse) ────\n // Hunt Finding #27 (2026-04-14): previously this attached BOTH a 'finish'\n // and a 'close' handler that each decremented the counter. Both events\n // fire for a normal request completion ('finish' first, then 'close'),\n // so every real request caused TWO decrements. Under parallel load the\n // counter drifted below the true active-request count, effectively\n // doubling the allowed concurrency. Math.max(0, -) kept it from going\n // negative numerically but the effective limit became 2×MAX.\n //\n // Fix: use ONLY 'close', which fires for every completed response\n // (normal, aborted, errored) exactly once. Remove 'finish' to eliminate\n // the double-decrement. Also make the limit configurable via config\n // so operators can tune it for their deployment instead of being stuck\n // at the hardcoded 5.\n let activeMessageRequests = 0;\n const MAX_CONCURRENT_MESSAGES = (() => {\n const cfg = loadConfig() as unknown as { gateway?: { maxConcurrentMessages?: number } };\n const v = cfg.gateway?.maxConcurrentMessages;\n if (typeof v === 'number' && v > 0 && v <= 1000) return v;\n return 5;\n })();\n\n function concurrencyGuard(maxConcurrent: number) {\n return (_req: Request, res: Response, next: NextFunction) => {\n if (activeMessageRequests >= maxConcurrent) {\n res.status(503).json({ error: 'Server busy — too many concurrent requests' });\n return;\n }\n activeMessageRequests++;\n // 'close' fires exactly once per completed request — safer than 'finish'\n // which only fires for successful sends AND is followed by 'close'\n // anyway (causing the double-decrement bug).\n let decremented = false;\n res.on('close', () => {\n if (decremented) return;\n decremented = true;\n activeMessageRequests = Math.max(0, activeMessageRequests - 1);\n });\n next();\n };\n }\n\n // Clean rate limit store every 60 seconds (unref so it doesn't block shutdown)\n rateLimitCleanupInterval = setInterval(() => {\n const now = Date.now();\n for (const [key, entry] of rateLimitStore) {\n if (now > entry.resetAt) rateLimitStore.delete(key);\n }\n // Cap rate limit store to prevent unbounded growth\n if (rateLimitStore.size > 10_000) {\n const entries = [...rateLimitStore.entries()].sort((a, b) => a[1].resetAt - b[1].resetAt);\n const toRemove = entries.slice(0, entries.length - 10_000);\n for (const [key] of toRemove) rateLimitStore.delete(key);\n }\n }, 60_000);\n rateLimitCleanupInterval.unref();\n\n // Create Express app\n const app = express();\n\n // ── Serve React SPA static assets FIRST ───────────────────\n // Static files (JS, CSS, images) should bypass JSON parsing,\n // request logging, and auth middleware for efficiency.\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const uiDistPath = join(__dirname, '../../ui/dist');\n const uiIndexPath = join(uiDistPath, 'index.html');\n const hasReactUI = fs.existsSync(uiIndexPath);\n let cachedIndexHtml: string | null = null;\n if (hasReactUI) {\n // Cache index.html in memory to avoid sync file reads on every request\n cachedIndexHtml = fs.readFileSync(uiIndexPath, 'utf8');\n app.use(express.static(uiDistPath, { index: false }));\n // Hot-reload the cache when the file changes (dev rebuilds)\n fs.watchFile(uiIndexPath, { interval: 1000 }, () => {\n try {\n cachedIndexHtml = fs.readFileSync(uiIndexPath, 'utf8');\n } catch { /* ignore read errors during write */ }\n });\n }\n\n app.use(express.json({ limit: '1mb' }));\n\n // Request logging middleware (skips static assets served above)\n app.use((req, res, next) => {\n const start = Date.now();\n res.on('finish', () => {\n const duration = Date.now() - start;\n logger.info(COMPONENT, `${req.method} ${req.path} → ${res.statusCode} (${duration}ms)`);\n });\n next();\n });\n\n // OpenAI API compatibility layer (/v1/models, /v1/chat/completions, /v1/embeddings)\n app.use('/v1', createOpenAICompatRouter());\n\n // ── Paperclip sidecar management & proxy ───────────────────\n const PAPERCLIP_PORT = 3100; // Paperclip server default port\n\n app.get('/api/paperclip/status', async (_req, res) => {\n try {\n res.json(await getPaperclipStatus());\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/paperclip/start', async (_req, res) => {\n try {\n await startPaperclip({ enabled: true, port: PAPERCLIP_PORT, autoStart: true }, titanEvents);\n res.json({ ok: true });\n } catch (err) {\n logger.error(COMPONENT, `Paperclip start failed: ${(err as Error).message}`);\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/paperclip/stop', async (_req, res) => {\n try {\n await stopPaperclip();\n res.json({ ok: true });\n } catch (err) {\n logger.error(COMPONENT, `Paperclip stop failed: ${(err as Error).message}`);\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/paperclip/reset', async (_req, res) => {\n try {\n await stopPaperclip();\n await startPaperclip({ enabled: true, port: PAPERCLIP_PORT, autoStart: true }, titanEvents);\n res.json({ ok: true });\n } catch (err) {\n logger.error(COMPONENT, `Paperclip reset failed: ${(err as Error).message}`);\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Proxy Paperclip API calls (/api/paperclip/* → http://localhost:3100/api/*)\n app.all('/api/paperclip/*', async (req: Request, res: Response) => {\n // Skip the management routes handled above\n if (req.path === '/api/paperclip/status' || req.path === '/api/paperclip/start' || req.path === '/api/paperclip/stop' || req.path === '/api/paperclip/reset') {\n res.status(404).json({ error: 'Not found' });\n return;\n }\n const targetPath = req.path.replace(/^\\/api\\/paperclip/, '/api');\n const query = req.url.includes('?') ? '?' + req.url.split('?')[1] : '';\n const targetUrl = `http://localhost:${PAPERCLIP_PORT}${targetPath}${query}`;\n try {\n const headers = new Headers();\n for (const [k, v] of Object.entries(req.headers)) {\n if (v && k.toLowerCase() !== 'host') headers.set(k, Array.isArray(v) ? v[0] : v);\n }\n const upstream = await fetch(targetUrl, {\n method: req.method,\n headers,\n body: ['GET', 'HEAD'].includes(req.method) ? undefined : JSON.stringify(req.body),\n });\n res.status(upstream.status);\n upstream.headers.forEach((v, k) => res.setHeader(k, v));\n const body = await upstream.arrayBuffer();\n res.end(Buffer.from(body));\n } catch (err) {\n logger.error(COMPONENT, `Paperclip API proxy error: ${(err as Error).message}`);\n res.status(502).json({ error: 'Paperclip API proxy error', message: (err as Error).message });\n }\n });\n\n // Proxy Paperclip web UI (/paperclip/* → http://localhost:3100/*)\n app.all('/paperclip/*', async (req: Request, res: Response) => {\n const targetPath = req.path.replace(/^\\/paperclip/, '') || '/';\n const query = req.url.includes('?') ? '?' + req.url.split('?')[1] : '';\n const targetUrl = `http://localhost:${PAPERCLIP_PORT}${targetPath}${query}`;\n try {\n const headers = new Headers();\n for (const [k, v] of Object.entries(req.headers)) {\n if (v && k.toLowerCase() !== 'host') headers.set(k, Array.isArray(v) ? v[0] : v);\n }\n const upstream = await fetch(targetUrl, {\n method: req.method,\n headers,\n body: ['GET', 'HEAD'].includes(req.method) ? undefined : JSON.stringify(req.body),\n });\n res.status(upstream.status);\n upstream.headers.forEach((v, k) => res.setHeader(k, v));\n const body = await upstream.arrayBuffer();\n res.end(Buffer.from(body));\n } catch (err) {\n logger.error(COMPONENT, `Paperclip UI proxy error: ${(err as Error).message}`);\n res.status(502).json({ error: 'Paperclip UI proxy error', message: (err as Error).message });\n }\n });\n\n // Ollama native API proxy (/ollama/* → configured Ollama server)\n // The UI's titan2/llm/ollama.ts hits /ollama/api/chat and /ollama/api/generate\n app.all('/ollama/*', async (req: Request, res: Response) => {\n const cfg = loadConfig();\n const ollamaBase = cfg.providers?.ollama?.baseUrl || process.env.OLLAMA_HOST || 'http://localhost:11434';\n const targetPath = req.path.replace(/^\\/ollama/, '');\n const targetUrl = `${ollamaBase}${targetPath}`;\n\n try {\n const upstream = await fetch(targetUrl, {\n method: req.method,\n headers: {\n 'Content-Type': req.headers['content-type'] || 'application/json',\n Accept: req.headers['accept'] || '*/*',\n },\n body: req.method !== 'GET' && req.method !== 'HEAD' ? JSON.stringify(req.body) : undefined,\n });\n\n res.status(upstream.status);\n upstream.headers.forEach((value, key) => {\n // Don't forward content-encoding; Node will handle compression itself\n if (key.toLowerCase() !== 'content-encoding') {\n res.setHeader(key, value);\n }\n });\n\n if (upstream.body) {\n const reader = upstream.body.getReader();\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(Buffer.from(value));\n }\n }\n res.end();\n } catch (err) {\n logger.error(COMPONENT, `Ollama proxy error: ${(err as Error).message}`);\n res.status(502).json({ error: 'Ollama proxy error', message: (err as Error).message });\n }\n });\n\n // Handle JSON parse errors and payload too large\n app.use((err: Error & { type?: string; status?: number }, req: Request, res: Response, next: NextFunction) => {\n if (err.type === 'entity.too.large') {\n res.status(413).json({ error: 'Payload too large (max 1MB)' });\n return;\n }\n if (err.type === 'entity.parse.failed') {\n res.status(400).json({ error: 'Invalid JSON' });\n return;\n }\n next(err);\n });\n\n // Security headers + CSP\n app.use((req, res, next) => {\n res.setHeader('X-Content-Type-Options', 'nosniff');\n res.setHeader('X-Frame-Options', 'SAMEORIGIN');\n res.setHeader('X-XSS-Protection', '1; mode=block');\n res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');\n res.setHeader('Content-Security-Policy', [\n \"default-src 'self'\",\n // Sandbox widget iframes use new Function() for code evaluation.\n \"script-src 'self' 'unsafe-inline' 'unsafe-eval'\",\n \"style-src 'self' 'unsafe-inline'\",\n \"connect-src 'self' ws: wss: https: http:\",\n \"media-src 'self' blob: mediastream:\",\n \"img-src 'self' data: blob:\",\n \"font-src 'self' data:\",\n // Canvas AI-generated widgets run in a sandboxed iframe whose\n // source is a blob: URL built by ui/src/titan2/sandbox/SandboxRuntime.\n // Without `frame-src blob:` the browser shows:\n // \"This content is blocked. Contact the site owner to fix the issue.\"\n // worker-src + child-src are included as safety fallbacks for\n // older engines that don't honor frame-src directly.\n \"frame-src 'self' blob: data:\",\n \"child-src 'self' blob: data:\",\n \"worker-src 'self' blob:\",\n ].join('; '));\n res.removeHeader('X-Powered-By');\n next();\n });\n\n // CORS — allow localhost, Tailscale, Cloudflare tunnels, and LAN origins\n const gatewayPort = config.gateway.port || 48420;\n const localhostOrigins = new Set([\n `http://127.0.0.1:${gatewayPort}`,\n `http://localhost:${gatewayPort}`,\n `https://127.0.0.1:${gatewayPort}`,\n `https://localhost:${gatewayPort}`,\n ]);\n const dynamicOriginPatterns = [\n /^https?:\\/\\/[a-z0-9-]+\\.ts\\.net(:\\d+)?$/, // Tailscale (*.ts.net)\n /^https?:\\/\\/[a-z0-9-]+\\.trycloudflare\\.com(:\\d+)?$/, // Cloudflare tunnel\n /^http:\\/\\/192\\.168\\.\\d{1,3}\\.\\d{1,3}(:\\d+)?$/, // LAN 192.168.x.x\n /^http:\\/\\/10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d+)?$/, // LAN 10.x.x.x\n /^http:\\/\\/172\\.(1[6-9]|2\\d|3[0-1])\\.\\d{1,3}\\.\\d{1,3}(:\\d+)?$/, // LAN 172.16-31.x.x\n ];\n function isAllowedOrigin(origin: string): boolean {\n if (localhostOrigins.has(origin)) return true;\n return dynamicOriginPatterns.some(re => re.test(origin));\n }\n app.use((req, res, next) => {\n const origin = req.headers.origin;\n if (origin && isAllowedOrigin(origin)) {\n res.setHeader('Access-Control-Allow-Origin', origin);\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n }\n if (req.method === 'OPTIONS') { res.sendStatus(204); return; }\n next();\n });\n\n // ── Login routes (no auth required) ──────────────────────────\n app.get('/login', (_req, res) => {\n res.setHeader('Content-Type', 'text/html');\n res.send(getLoginHTML());\n });\n\n app.post('/api/login', rateLimit(60000, 5), (req, res) => {\n const cfg = loadConfig();\n const auth = cfg.gateway.auth;\n if (!auth || auth.mode === 'none') {\n res.json({ token: 'noauth' });\n return;\n }\n const { password } = req.body as { password?: string };\n let valid = false;\n if (auth.mode === 'password' && auth.password && password && safeCompare(password, auth.password)) valid = true;\n if (auth.mode === 'token' && auth.token && password && safeCompare(password, auth.token)) valid = true;\n if (!valid) { res.status(401).json({ error: 'Invalid password' }); return; }\n const token = randomBytes(32).toString('hex');\n authTokens.set(token, { createdAt: Date.now(), userId: `user-${token.slice(0, 8)}` });\n saveAuthTokens();\n res.json({ token });\n });\n\n // ── Prometheus /metrics (no auth — standard scrape path) ────\n app.get('/metrics', (_req, res) => {\n res.setHeader('Content-Type', 'text/plain; version=0.0.4');\n res.send(serializePrometheus());\n });\n\n // ── Auth middleware (API routes only) ────────────────────────\n // HTML pages (/ and /login) are always served — the JS handles\n // the redirect to /login if localStorage has no token.\n // Only /api/* routes require a valid token.\n app.use('/api', (req, res, next) => {\n const cfg = loadConfig();\n const auth = cfg.gateway.auth;\n if (!auth || auth.mode === 'none') { next(); return; }\n // Token mode with no token configured = auth not set up, allow access\n if (auth.mode === 'token' && !auth.token) { next(); return; }\n // Skip public endpoints (login, messenger webhook, twilio webhooks)\n if (req.path === '/login') { next(); return; }\n if (req.path === '/messenger/webhook') { next(); return; }\n if (req.path.startsWith('/twilio/')) { next(); return; }\n const header = req.headers.authorization;\n const token = header?.startsWith('Bearer ') ? header.slice(7) : (req.query.token as string);\n if (isValidToken(token, cfg)) { next(); return; }\n res.status(401).json({ error: 'Unauthorized' });\n });\n\n // ── Command Post availability guard ──────────────────────────\n app.use('/api/command-post', (_req, res, next) => {\n if (isCommandPostEnabled()) { next(); return; }\n res.status(503).json({ error: 'Command Post is disabled', hint: 'Enable it in titan.json: commandPost.enabled = true' });\n });\n\n // Legacy dashboard (kept during migration, also fallback if React UI not built)\n app.get('/legacy', (_req, res) => {\n res.setHeader('Content-Type', 'text/html');\n res.send(getMissionControlHTML());\n });\n\n // Root route: React SPA or legacy dashboard\n app.get('/', (_req, res) => {\n if (hasReactUI && cachedIndexHtml) {\n res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');\n res.setHeader('Pragma', 'no-cache');\n res.setHeader('Expires', '0');\n res.send(cachedIndexHtml);\n } else {\n res.setHeader('Content-Type', 'text/html');\n res.send(getMissionControlHTML());\n }\n });\n\n // API routes\n app.get('/api/stats', (_req, res) => {\n const usage = getUsageStats();\n const cfg = loadConfig();\n const activeModel = cfg.agent.model || '';\n const mem = process.memoryUsage();\n const activeAgents = listAgents().filter(a => a.status === 'running').length;\n const activeSessions = listSessions().length;\n res.json({\n ...usage,\n version: TITAN_VERSION,\n uptime: process.uptime(),\n model: activeModel.replace(/^ollama\\//, ''),\n provider: activeModel.split('/')[0] || 'ollama',\n memoryMB: Math.round(mem.rss / 1024 / 1024),\n memoryUsage: {\n heapUsed: mem.heapUsed,\n heapTotal: mem.heapTotal,\n rss: mem.rss,\n external: mem.external,\n arrayBuffers: mem.arrayBuffers,\n },\n health: {\n ollamaHealthy: healthState.ollamaHealthy,\n ttsHealthy: healthState.ttsHealthy,\n lastCheck: healthState.lastCheck,\n stuckDetected: healthState.stuckDetected,\n uptimeSeconds: Math.round(process.uptime()),\n memoryUsageMB: Math.round(mem.heapUsed / 1024 / 1024),\n activeLlmRequests,\n },\n activeAgents,\n activeSessions,\n });\n });\n\n // ── Dependency Scan API ────────────────────────────────────────\n app.get('/api/dependencies/scan', async (_req, res) => {\n try {\n const reportPath = join(TITAN_WORKSPACE, 'dependency-scan-report.json');\n if (fs.existsSync(reportPath)) {\n const report = JSON.parse(fs.readFileSync(reportPath, 'utf-8'));\n res.json(report);\n } else {\n res.status(404).json({ error: 'No scan report found. Run a scan first.' });\n }\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/dependencies/scan', async (req, res) => {\n try {\n const { fix = false } = req.body;\n const scriptPath = join(dirname(fileURLToPath(import.meta.url)), '../../scripts/dependency-scan.cjs');\n\n // Run scan in background\n const proc = spawn('node', [scriptPath, ...(fix ? ['--fix'] : [])], {\n cwd: TITAN_WORKSPACE,\n stdio: 'pipe',\n detached: false,\n });\n\n let output = '';\n proc.stdout?.on('data', (data) => { output += data.toString(); });\n proc.stderr?.on('data', (data) => { output += data.toString(); });\n\n proc.on('close', (code) => {\n if (code === 0) {\n logger.info(COMPONENT, 'Dependency scan completed successfully');\n } else {\n logger.warn(COMPONENT, `Dependency scan exited with code ${code}`);\n }\n });\n\n res.json({ success: true, message: 'Dependency scan started in background' });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/dependencies/status', (_req, res) => {\n try {\n const reportPath = join(TITAN_WORKSPACE, 'dependency-scan-report.json');\n if (fs.existsSync(reportPath)) {\n const stats = fs.statSync(reportPath);\n const report = JSON.parse(fs.readFileSync(reportPath, 'utf-8'));\n\n const summary = {\n lastScan: report.timestamp,\n lastScanAge: Date.now() - new Date(report.timestamp).getTime(),\n vulnerabilities: report.vulnerabilities.total,\n critical: report.vulnerabilities.critical,\n high: report.vulnerabilities.high,\n outdated: report.outdated?.length || 0,\n deprecated: report.deprecated?.length || 0,\n licenseIssues: report.licenseIssues?.length || 0,\n health: report.vulnerabilities.critical === 0 && report.vulnerabilities.high === 0 ? 'healthy' : 'warning',\n };\n\n res.json(summary);\n } else {\n res.json({\n lastScan: null,\n health: 'unknown',\n message: 'No scan has been run yet',\n });\n }\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Tracing API ─────────────────────────────────────────────────\n app.get('/api/traces', async (_req, res) => {\n try {\n const { listTraces, getTraceStats } = await import('../agent/tracer.js');\n const limit = parseInt(_req.query.limit as string || '50', 10);\n const session = _req.query.session as string | undefined;\n res.json({ traces: listTraces(limit, session), stats: getTraceStats() });\n } catch { res.json({ traces: [], stats: {} }); }\n });\n\n app.get('/api/traces/:traceId', async (req, res) => {\n try {\n const { getTrace } = await import('../agent/tracer.js');\n const trace = getTrace(req.params.traceId);\n if (!trace) { res.status(404).json({ error: 'Trace not found' }); return; }\n res.json(trace);\n } catch { res.status(500).json({ error: 'Tracer unavailable' }); }\n });\n\n // ── Checkpoints API ────────────────────────────────────────────\n app.get('/api/checkpoints', async (_req, res) => {\n try {\n const { listCheckpoints } = await import('../agent/checkpoint.js');\n res.json({ checkpoints: listCheckpoints() });\n } catch { res.json({ checkpoints: [] }); }\n });\n\n app.get('/api/checkpoints/:sessionId', async (req, res) => {\n try {\n const { loadCheckpoint } = await import('../agent/checkpoint.js');\n const round = req.query.round ? parseInt(req.query.round as string, 10) : undefined;\n const cp = loadCheckpoint(req.params.sessionId, round);\n if (!cp) { res.status(404).json({ error: 'Checkpoint not found' }); return; }\n res.json(cp);\n } catch { res.status(500).json({ error: 'Checkpoint unavailable' }); }\n });\n\n app.delete('/api/checkpoints/:sessionId', async (req, res) => {\n try {\n const { clearCheckpoints } = await import('../agent/checkpoint.js');\n clearCheckpoints(req.params.sessionId);\n res.json({ success: true });\n } catch { res.status(500).json({ error: 'Failed to clear checkpoints' }); }\n });\n\n // ── Company API (Paperclip-style) ─────────────────────────────\n app.get('/api/companies', async (_req, res) => {\n try {\n const { listCompanies, getActiveRunners } = await import('../agent/company.js');\n const includeArchived = _req.query.archived === 'true';\n const companies = listCompanies(includeArchived);\n const runners = getActiveRunners();\n res.json({ companies: companies.map(c => ({ ...c, runnerActive: runners.includes(c.id) })) });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/companies', async (req, res) => {\n try {\n const { createCompany } = await import('../agent/company.js');\n const company = createCompany(req.body);\n res.json(company);\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.get('/api/companies/:id', async (req, res) => {\n try {\n const { getCompany, isRunnerActive } = await import('../agent/company.js');\n const company = getCompany(req.params.id);\n if (!company) { res.status(404).json({ error: 'Company not found' }); return; }\n res.json({ ...company, runnerActive: isRunnerActive(company.id) });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.patch('/api/companies/:id', async (req, res) => {\n try {\n const { updateCompany } = await import('../agent/company.js');\n const company = updateCompany(req.params.id, req.body);\n if (!company) { res.status(404).json({ error: 'Company not found' }); return; }\n res.json(company);\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.delete('/api/companies/:id', async (req, res) => {\n try {\n const { deleteCompany, stopCompanyRunner } = await import('../agent/company.js');\n stopCompanyRunner(req.params.id);\n const ok = deleteCompany(req.params.id);\n res.json({ success: ok });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // Start/stop company heartbeat runner\n app.post('/api/companies/:id/start', async (req, res) => {\n try {\n const { startCompanyRunner } = await import('../agent/company.js');\n const interval = parseInt(req.body?.intervalMs || '60000', 10);\n const ok = startCompanyRunner(req.params.id, interval);\n res.json({ success: ok, message: ok ? 'Runner started' : 'Already running or company not active' });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/companies/:id/stop', async (req, res) => {\n try {\n const { stopCompanyRunner } = await import('../agent/company.js');\n const ok = stopCompanyRunner(req.params.id);\n res.json({ success: ok });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // Add agent/goal to company\n app.post('/api/companies/:id/agents', async (req, res) => {\n try {\n const { addAgentToCompany } = await import('../agent/company.js');\n const agent = addAgentToCompany(req.params.id, req.body);\n if (!agent) { res.status(404).json({ error: 'Company not found' }); return; }\n res.json(agent);\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/companies/:id/goals', async (req, res) => {\n try {\n const { addGoalToCompany } = await import('../agent/company.js');\n const goal = addGoalToCompany(req.params.id, req.body);\n if (!goal) { res.status(404).json({ error: 'Company not found' }); return; }\n res.json(goal);\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // ── Company Portability (Export/Import) ───────────────────────\n app.post('/api/companies/:id/export', async (req, res) => {\n try {\n const { getCompany } = await import('../agent/company.js');\n const { writeCompanyPackage } = await import('../agent/companyPortability.js');\n const company = getCompany(req.params.id);\n if (!company) { res.status(404).json({ error: 'Company not found' }); return; }\n const outPath = writeCompanyPackage(company, req.body?.outDir);\n res.json({ success: true, path: outPath, name: company.name });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/companies/exports', async (_req, res) => {\n try {\n const { listExportedPackages } = await import('../agent/companyPortability.js');\n res.json(listExportedPackages());\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/companies/import', async (req, res) => {\n try {\n const { importCompanyFromDirectory, importCompanyFromMarkdown } = await import('../agent/companyPortability.js');\n const { createCompany } = await import('../agent/company.js');\n let imported = null;\n if (req.body?.packagePath) {\n imported = importCompanyFromDirectory(req.body.packagePath);\n } else if (req.body?.markdown) {\n imported = importCompanyFromMarkdown(req.body.markdown);\n }\n if (!imported) { res.status(400).json({ error: 'Invalid import. Provide packagePath or markdown.' }); return; }\n const company = createCompany(imported);\n res.json({ success: true, company });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n // ── Soul API ──────────────────────────────────────────────────\n app.get('/api/soul/wisdom', async (_req, res) => {\n try {\n const { getWisdomData } = await import('../agent/soul.js');\n res.json(getWisdomData());\n } catch { res.json({ patterns: [], mistakes: [], userPreferences: [], totalTasks: 0 }); }\n });\n\n app.get('/api/soul/state/:sessionId', async (req, res) => {\n try {\n const { getSoulState } = await import('../agent/soul.js');\n const state = getSoulState(req.params.sessionId);\n if (!state) { res.status(404).json({ error: 'No active soul state for session' }); return; }\n res.json(state);\n } catch { res.status(500).json({ error: 'Soul unavailable' }); }\n });\n\n // ── Guardrails API ─────────────────────────────────────────────\n app.get('/api/guardrails/violations', async (_req, res) => {\n try {\n const { getViolations } = await import('../agent/guardrails.js');\n const limit = parseInt(_req.query.limit as string || '50', 10);\n res.json({ violations: getViolations(limit) });\n } catch { res.json({ violations: [] }); }\n });\n\n // ── Alerts API ────────────────────────────────────────────────\n app.get('/api/alerts', async (_req, res) => {\n try {\n const { getAlertHistory } = await import('../agent/alerts.js');\n const limit = parseInt(_req.query.limit as string || '50', 10);\n res.json({ alerts: getAlertHistory(limit) });\n } catch { res.json({ alerts: [] }); }\n });\n\n app.get('/api/sessions', (_req, res) => {\n const sessions = listSessions();\n res.json(sessions);\n });\n\n // Create a new session explicitly (for \"New chat\" button)\n app.post('/api/sessions', async (req, res) => {\n try {\n const { createNewSession } = await import('../agent/session.js');\n const channel = req.body?.channel || 'webchat';\n const userId = req.body?.userId || 'api-user';\n const session = createNewSession(channel, userId);\n res.json({ id: session.id, channel: session.channel, userId: session.userId });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // Conversation search — full-text search across all sessions\n app.get('/api/sessions/search', (req, res) => {\n const query = (req.query.q as string || '').toLowerCase().trim();\n if (!query || query.length < 2) { res.status(400).json({ error: 'Query must be at least 2 characters' }); return; }\n try {\n const sessions = listSessions();\n const results: Array<{ sessionId: string; sessionName: string; role: string; content: string; timestamp: string }> = [];\n const limit = parseInt(req.query.limit as string) || 50;\n\n for (const session of sessions) {\n const history = getHistory(session.id, 1000);\n for (const msg of history) {\n if (msg.content.toLowerCase().includes(query)) {\n results.push({\n sessionId: session.id,\n sessionName: session.name || session.id.slice(0, 8),\n role: msg.role,\n content: msg.content.slice(0, 200),\n timestamp: (msg as { createdAt?: string }).createdAt || '',\n });\n if (results.length >= limit) break;\n }\n }\n if (results.length >= limit) break;\n }\n res.json({ query, results, total: results.length });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Conversation export — download session as JSON or markdown\n app.get('/api/sessions/:id/export', (req, res) => {\n const sessionId = req.params.id;\n const format = (req.query.format as string) || 'json';\n try {\n const history = getHistory(sessionId, 10000);\n if (!history || history.length === 0) { res.status(404).json({ error: 'Session not found or empty' }); return; }\n\n if (format === 'markdown' || format === 'md') {\n const sessions = listSessions();\n const session = sessions.find(s => s.id === sessionId);\n const title = session?.name || sessionId.slice(0, 8);\n let md = `# ${title}\\n\\nExported: ${new Date().toISOString()}\\n\\n---\\n\\n`;\n for (const msg of history) {\n const role = msg.role === 'user' ? '**You**' : '**TITAN**';\n md += `${role} (${(msg as { createdAt?: string }).createdAt || ''}):\\n\\n${msg.content}\\n\\n---\\n\\n`;\n }\n res.setHeader('Content-Type', 'text/markdown');\n res.setHeader('Content-Disposition', `attachment; filename=\"titan-${sessionId.slice(0, 8)}.md\"`);\n res.send(md);\n } else {\n res.setHeader('Content-Type', 'application/json');\n res.setHeader('Content-Disposition', `attachment; filename=\"titan-${sessionId.slice(0, 8)}.json\"`);\n res.json({ sessionId, exportedAt: new Date().toISOString(), messages: history });\n }\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/sessions/:id', (req, res) => {\n const sessionId = req.params.id;\n try {\n // getHistory looks up messages for a given session ID\n const history = getHistory(sessionId);\n res.json(history);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/sessions/:id/messages', (req, res) => {\n const sessionId = req.params.id;\n try {\n const history = getHistory(sessionId);\n // history may be an array of messages or an object with a messages field\n const messages = Array.isArray(history) ? history : (history as any).messages || [];\n if (messages.length === 0) {\n // Check if the session actually exists\n const allSessions = listSessions();\n const sessionExists = allSessions.some((s) => s.id === sessionId);\n if (!sessionExists) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n }\n res.json(messages);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/sessions/:id/close', (req, res) => {\n try {\n closeSession(req.params.id);\n res.json({ ok: true });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.delete('/api/sessions/:id', (req, res) => {\n try {\n closeSession(req.params.id);\n res.json({ ok: true });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.patch('/api/sessions/:id', (req, res) => {\n try {\n const { name } = req.body as { name?: string };\n if (!name || typeof name !== 'string') {\n res.status(400).json({ error: 'name is required' });\n return;\n }\n const ok = renameSession(req.params.id, name);\n if (!ok) { res.status(404).json({ error: 'Session not found' }); return; }\n res.json({ ok: true });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Steer — mid-run nudge injection\n app.post('/api/sessions/:id/steer', async (req, res) => {\n try {\n const { message } = req.body as { message?: string };\n if (!message || typeof message !== 'string') {\n res.status(400).json({ error: 'message is required' });\n return;\n }\n const { pushSteer } = await import('../agent/agentLoop.js');\n pushSteer(req.params.id, message);\n res.json({ ok: true, sessionId: req.params.id });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Checkpoints — list and restore\n app.get('/api/sessions/:id/checkpoints', async (req, res) => {\n try {\n const { listCheckpoints } = await import('../checkpoint/manager.js');\n const checkpoints = listCheckpoints(req.params.id);\n res.json({ checkpoints });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/sessions/:id/checkpoints/:checkpointId/restore', async (req, res) => {\n try {\n const { restoreCheckpoint } = await import('../checkpoint/manager.js');\n const result = restoreCheckpoint(req.params.id, req.params.checkpointId);\n res.json({ ok: result.success, restored: result.restored, errors: result.errors });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Guest session creation (Space Agent parity)\n app.post('/api/guest', async (_req, res) => {\n try {\n const { createGuestSession } = await import('../agent/session.js');\n const session = createGuestSession();\n res.json({ id: session.id, userId: session.userId, createdAt: session.createdAt });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Checkpoint history / time travel UI (Space Agent parity)\n app.get('/api/sessions/:id/history', async (req, res) => {\n try {\n const { listCheckpoints } = await import('../checkpoint/manager.js');\n const checkpoints = listCheckpoints(req.params.id);\n // Also include session messages for context\n const { getHistory } = await import('../memory/memory.js');\n const messages = getHistory(req.params.id, 100);\n res.json({ checkpoints, messages, sessionId: req.params.id });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Prompt includes discovery\n app.get('/api/prompt-includes', async (_req, res) => {\n try {\n const { discoverPromptIncludes } = await import('../promptincludes/discover.js');\n const includes = discoverPromptIncludes();\n res.json({ includes });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Debug info endpoint\n app.get('/api/debug', (_req, res) => {\n try {\n const cfg = loadConfig();\n const providers = Object.entries(cfg.providers || {})\n .map(([name, p]) => ({ name, configured: !!(p as { apiKey?: string }).apiKey }));\n res.json({\n version: '5.0.0',\n node: process.version,\n platform: process.platform,\n uptime: process.uptime(),\n memory: process.memoryUsage(),\n providers: providers.length,\n providerNames: providers.map(p => p.name),\n autonomy: cfg.autonomy?.mode || 'supervised',\n checkpointEnabled: cfg.checkpoints?.enabled !== false,\n // Optional v5.0+ feature flags — defensive read because the schema\n // doesn't strictly type these yet (debug bundle only).\n steerEnabled: (cfg.agent as Record<string, unknown>)?.steerEnabled ?? false,\n fastMode: (cfg.agent as Record<string, unknown>)?.fastMode ?? false,\n concurrentTools: (cfg.agent as Record<string, unknown>)?.concurrentTools ?? true,\n });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Debug share — create a shareable debug bundle\n app.post('/api/debug/share', (_req, res) => {\n try {\n const cfg = loadConfig();\n const providers = Object.entries(cfg.providers || {})\n .map(([name, p]) => ({ name, configured: !!(p as { apiKey?: string }).apiKey }));\n const bundle = {\n version: '5.0.0',\n node: process.version,\n platform: process.platform,\n uptime: process.uptime(),\n memory: process.memoryUsage(),\n providers: providers.map(p => p.name),\n autonomy: cfg.autonomy?.mode || 'supervised',\n checkpointEnabled: cfg.checkpoints?.enabled !== false,\n // Optional v5.0+ feature flags — read defensively because the schema\n // doesn't strictly type them yet (debug bundle only — never used to\n // gate behavior).\n steerEnabled: (cfg.agent as Record<string, unknown>)?.steerEnabled ?? false,\n fastMode: (cfg.agent as Record<string, unknown>)?.fastMode ?? false,\n concurrentTools: (cfg.agent as Record<string, unknown>)?.concurrentTools ?? true,\n timestamp: new Date().toISOString(),\n };\n res.json({ ok: true, bundle, shareUrl: null });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: Direct webhook delivery — bypass event queue\n app.post('/api/webhooks/direct', async (req, res) => {\n try {\n const { webhookId, payload } = req.body as { webhookId?: string; payload?: Record<string, unknown> };\n if (!webhookId) { res.status(400).json({ error: 'webhookId is required' }); return; }\n const { getActiveWebhooks } = await import('../skills/builtin/webhook.js');\n const webhook = getActiveWebhooks().get(webhookId);\n if (!webhook) { res.status(404).json({ error: 'Webhook not found' }); return; }\n // Execute handler directly (spawn async, return accepted)\n import('child_process').then(({ exec }) => {\n const cmd = webhook.handler.replace(/\\$\\{([^}]+)\\}/g, (_m, key) => String(payload?.[key] ?? ''));\n exec(cmd, { timeout: 30000 }, (err, stdout, stderr) => {\n if (err) logger.warn('Webhook', `Direct delivery error: ${err.message}`);\n else logger.info('Webhook', `Direct delivery ok: ${webhookId}`);\n });\n }).catch(() => { /* ignore */ });\n res.json({ ok: true, webhookId, delivered: true });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // v5.0: CORS Proxy (Space Agent parity)\n app.post('/api/proxy', async (req, res) => {\n try {\n const { url, method = 'GET', headers = {}, body } = req.body as { url?: string; method?: string; headers?: Record<string, string>; body?: unknown };\n if (!url || typeof url !== 'string') { res.status(400).json({ error: 'url is required' }); return; }\n const proxyRes = await fetch(url, {\n method,\n headers: { 'User-Agent': 'TITAN-Proxy/1.0', ...headers },\n body: body ? JSON.stringify(body) : undefined,\n });\n const proxyBody = await proxyRes.text();\n res.status(proxyRes.status).set('Content-Type', proxyRes.headers.get('Content-Type') || 'text/plain').send(proxyBody);\n } catch (e) {\n logger.error(COMPONENT, `Proxy error: ${(e as Error).message}`);\n res.status(502).json({ error: 'Proxy failed', message: (e as Error).message });\n }\n });\n\n // v5.0: Cloud Share — create a shareable session link\n app.post('/api/sessions/:id/share', async (req, res) => {\n try {\n const { format = 'json' } = req.body as { format?: string };\n const { getHistory } = await import('../memory/memory.js');\n const history = getHistory(req.params.id, 10000);\n if (!history || history.length === 0) { res.status(404).json({ error: 'Session not found or empty' }); return; }\n const shareId = `${req.params.id}-${Date.now().toString(36)}`;\n const sharePath = `${homedir()}/.titan/shares/${shareId}.json`;\n fs.mkdirSync(dirname(sharePath), { recursive: true });\n fs.writeFileSync(sharePath, JSON.stringify({ sessionId: req.params.id, format, history, createdAt: new Date().toISOString() }, null, 2), 'utf-8');\n res.json({ ok: true, shareId, url: `/api/shares/${shareId}` });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/shares/:shareId', async (req, res) => {\n try {\n const sharePath = `${homedir()}/.titan/shares/${req.params.shareId}.json`;\n if (!fs.existsSync(sharePath)) { res.status(404).json({ error: 'Share not found' }); return; }\n const data = JSON.parse(fs.readFileSync(sharePath, 'utf-8'));\n res.json(data);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/skills', (_req, res) => {\n const skills = getSkills();\n res.json(skills);\n });\n\n app.post('/api/skills/:name/toggle', (req, res) => {\n try {\n const { name } = req.params;\n const enabled = toggleSkill(name);\n const tools = getSkillTools(name);\n res.json({ ok: true, skill: name, enabled, tools });\n } catch (e) {\n res.status(404).json({ error: (e as Error).message });\n }\n });\n\n // ─── Specialists API (v4.13) ─────────────────────────────────────\n // List the specialist pool + any model overrides. The specialists\n // themselves are defined in code (src/agent/specialists.ts); this\n // endpoint merges their defaults with per-id overrides from\n // config.specialists.overrides so a UI can show \"active model\".\n app.get('/api/specialists', async (_req, res) => {\n try {\n const { SPECIALISTS } = await import('../agent/specialists.js');\n const cfg = loadConfig();\n const overrides = (cfg as unknown as { specialists?: { overrides?: Record<string, { model?: string }> } }).specialists?.overrides || {};\n const out = SPECIALISTS.map((s) => ({\n id: s.id,\n name: s.name,\n role: s.role,\n title: s.title,\n defaultModel: s.model,\n activeModel: overrides[s.id]?.model || s.model,\n overridden: Boolean(overrides[s.id]?.model && overrides[s.id].model !== s.model),\n templateMatches: s.templateMatches,\n reportsTo: s.reportsTo,\n }));\n res.json(out);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // Update a specialist's active model. Body: { model: string | null }\n // model=null clears the override (reverts to specialist default).\n app.patch('/api/specialists/:id', async (req, res) => {\n try {\n const { id } = req.params;\n const { model } = (req.body || {}) as { model?: string | null };\n const { SPECIALISTS } = await import('../agent/specialists.js');\n const specialist = SPECIALISTS.find((s) => s.id === id);\n if (!specialist) { res.status(404).json({ error: `Unknown specialist: ${id}` }); return; }\n const cfg = loadConfig();\n const cfgAny = cfg as unknown as { specialists?: { overrides?: Record<string, { model?: string }> } };\n const overrides = { ...(cfgAny.specialists?.overrides || {}) };\n if (model === null || model === '' || model === undefined) {\n delete overrides[id];\n } else if (typeof model === 'string') {\n overrides[id] = { model };\n } else {\n res.status(400).json({ error: 'model must be a string or null' });\n return;\n }\n updateConfig({ specialists: { overrides } } as unknown as Parameters<typeof updateConfig>[0]);\n res.json({ ok: true, id, activeModel: overrides[id]?.model || specialist.model });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ─── Marketplace API ──────────────────────────────────────────\n app.get('/api/marketplace', async (_req, res) => {\n try {\n const skills = await listMarketplaceSkills();\n const installed = listInstalledMarketplace();\n res.json({ skills: skills.map(s => ({ ...s, installed: installed.includes(s.file.replace('.js', '')) })), installed });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/marketplace/search', async (req, res) => {\n try {\n const q = (req.query.q as string) || '';\n const results = await marketplaceSearch(q, 50);\n const installed = listInstalledMarketplace();\n res.json({ ...results, skills: results.skills.map(s => ({ ...s, installed: installed.includes(s.file.replace('.js', '')) })) });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/marketplace/install', async (req, res): Promise<void> => {\n try {\n const { skill } = req.body as { skill: string };\n if (!skill) { res.status(400).json({ error: 'Missing \"skill\" field' }); return; }\n const result = await installSkill(skill);\n res.json(result);\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/marketplace/uninstall', (req, res): void => {\n try {\n const { skill } = req.body as { skill: string };\n if (!skill) { res.status(400).json({ error: 'Missing \"skill\" field' }); return; }\n const result = uninstallSkill(skill);\n res.json(result);\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // ── Personas ──────────────────────────────────────────────────\n app.get('/api/personas', (_req, res) => {\n try {\n const cfg = loadConfig();\n res.json({ personas: listPersonas(), active: cfg.agent.persona || 'default' });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/persona/switch', (req, res): void => {\n try {\n const { persona } = req.body as { persona: string };\n if (!persona || typeof persona !== 'string') { res.status(400).json({ error: 'Missing persona ID' }); return; }\n if (persona !== 'default' && !getPersona(persona)) { res.status(404).json({ error: `Persona \"${persona}\" not found` }); return; }\n const cfg = loadConfig();\n updateConfig({ agent: { ...cfg.agent, persona } });\n invalidatePersonaCache();\n res.json({ ok: true, active: persona });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // ── Widget Gallery ────────────────────────────────────────────\n app.get('/api/widget-gallery', async (_req, res) => {\n try {\n const { listTemplates, listCategories } = await import('../skills/builtin/widget_gallery.js');\n const templates = listTemplates();\n const categories = listCategories();\n res.json({ count: templates.length, categories, templates });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/tools', (req, res) => {\n const includeSchema = req.query.include === 'schema';\n const q = typeof req.query.q === 'string' ? req.query.q.toLowerCase() : '';\n const limit = Math.min(parseInt(req.query.limit as string, 10) || 100, 1000);\n const offset = Math.max(parseInt(req.query.offset as string, 10) || 0, 0);\n\n let tools = getRegisteredTools().map((t) => {\n const item: Record<string, unknown> = {\n name: t.name,\n description: t.description,\n };\n if (includeSchema) {\n item.parameters = t.parameters;\n }\n return item;\n });\n\n if (q) {\n tools = tools.filter((t) =>\n (t.name as string).toLowerCase().includes(q) ||\n (t.description as string).toLowerCase().includes(q),\n );\n }\n\n const total = tools.length;\n const paginated = tools.slice(offset, offset + limit);\n\n res.json({\n total,\n count: paginated.length,\n offset,\n tools: paginated,\n });\n });\n\n app.get('/api/channels', (_req, res) => {\n const statuses = Array.from(channels.values()).map((ch) => ch.getStatus());\n res.json(statuses);\n });\n\n app.get('/api/security', (_req, res) => {\n const audit = auditSecurity();\n res.json(audit);\n });\n\n app.get('/api/providers', async (_req, res) => {\n const health = await healthCheckAll();\n res.json(health);\n });\n\n app.get('/api/health', (_req, res) => {\n const cfg = loadConfig();\n res.json({ status: 'ok', version: TITAN_VERSION, uptime: process.uptime(), onboarded: cfg.onboarded });\n });\n\n // ── Bug Reports (operator + agent team review) ─────────────────\n // Local jsonl persisted at ~/.titan/bug-reports.jsonl. Always\n // available regardless of telemetry.enabled — the file is the\n // operator's source of truth even when remote sending is off.\n app.get('/api/bug-reports', async (req, res) => {\n try {\n const limit = Math.min(Math.max(parseInt(String(req.query.limit ?? '50'), 10) || 50, 1), 200);\n const { listRecentBugReports } = await import('../analytics/bugReports.js');\n const reports = listRecentBugReports(limit);\n res.json({ count: reports.length, reports });\n } catch (err) {\n res.status(500).json({ error: 'bug_reports_unavailable', message: (err as Error).message });\n }\n });\n\n app.get('/api/bug-reports/:id', async (req, res) => {\n try {\n const { getBugReport } = await import('../analytics/bugReports.js');\n const r = getBugReport(req.params.id);\n if (!r) {\n res.status(404).json({ error: 'not_found' });\n return;\n }\n res.json(r);\n } catch (err) {\n res.status(500).json({ error: 'bug_report_unavailable', message: (err as Error).message });\n }\n });\n\n // ── Docker Sandbox Execution ─────────────────────────────────\n app.post('/api/sandbox/execute', async (req, res) => {\n try {\n const { code, language, timeoutMs } = req.body;\n if (!code || typeof code !== 'string') {\n res.status(400).json({ error: 'code is required' });\n return;\n }\n const { executeInSandbox } = await import('../agent/sandbox.js');\n const result = await executeInSandbox(code, language || 'javascript', timeoutMs || 60000);\n res.json(result);\n } catch (err) {\n logger.error(COMPONENT, `Sandbox execute error: ${(err as Error).message}`);\n res.status(500).json({ error: 'Sandbox execution failed', message: (err as Error).message });\n }\n });\n\n app.get('/api/sandbox/status', async (_req, res) => {\n try {\n const { getSandboxStatus } = await import('../agent/sandbox.js');\n res.json(getSandboxStatus());\n } catch (err) {\n res.status(500).json({ error: 'Sandbox status unavailable', message: (err as Error).message });\n }\n });\n\n app.get('/api/health/deep', async (_req, res) => {\n const checks: Record<string, { status: 'ok' | 'degraded' | 'down'; detail?: string }> = {};\n let overall: 'ok' | 'degraded' | 'down' = 'ok';\n\n // Memory subsystem\n try {\n const { getDb } = await import('../memory/memory.js');\n const db = getDb();\n checks.memory = { status: 'ok', detail: `${db.memories.length} memories, ${db.sessions.length} sessions` };\n } catch (e) {\n checks.memory = { status: 'down', detail: (e as Error).message };\n overall = 'down';\n }\n\n // Graph\n try {\n const { getGraphStats } = await import('../memory/graph.js');\n const stats = getGraphStats();\n checks.graph = { status: 'ok', detail: `${stats.episodeCount} episodes, ${stats.entityCount} entities` };\n } catch (e) {\n checks.graph = { status: 'down', detail: (e as Error).message };\n overall = 'down';\n }\n\n // Vectors\n try {\n const { isVectorSearchAvailable } = await import('../memory/vectors.js');\n checks.vectors = { status: isVectorSearchAvailable() ? 'ok' : 'degraded', detail: isVectorSearchAvailable() ? 'ready' : 'disabled or unavailable' };\n if (!isVectorSearchAvailable() && overall === 'ok') overall = 'degraded';\n } catch (e) {\n checks.vectors = { status: 'down', detail: (e as Error).message };\n overall = 'down';\n }\n\n // Providers\n try {\n const providerHealth = await healthCheckAll();\n const entries = Object.entries(providerHealth);\n const healthyProviders = entries.filter(([, healthy]) => healthy).length;\n checks.providers = { status: healthyProviders > 0 ? 'ok' : 'down', detail: `${healthyProviders}/${entries.length} healthy` };\n if (healthyProviders === 0) overall = 'down';\n } catch (e) {\n checks.providers = { status: 'down', detail: (e as Error).message };\n overall = 'down';\n }\n\n // Channels\n try {\n const connected = Array.from(channels.values()).filter((c) => c.getStatus().connected).length;\n checks.channels = { status: connected > 0 ? 'ok' : 'degraded', detail: `${connected}/${channels.size} connected` };\n if (connected === 0 && overall === 'ok') overall = 'degraded';\n } catch (e) {\n checks.channels = { status: 'down', detail: (e as Error).message };\n overall = 'down';\n }\n\n // Event loop lag (approximate via setImmediate)\n const start = process.hrtime.bigint();\n await new Promise((resolve) => setImmediate(resolve));\n const lagNs = Number(process.hrtime.bigint() - start);\n const lagMs = lagNs / 1_000_000;\n checks.eventLoop = { status: lagMs < 100 ? 'ok' : lagMs < 500 ? 'degraded' : 'down', detail: `${lagMs.toFixed(2)}ms lag` };\n if (lagMs >= 500) overall = 'down';\n else if (lagMs >= 100 && overall === 'ok') overall = 'degraded';\n\n res.status(overall === 'ok' ? 200 : overall === 'degraded' ? 200 : 503).json({\n status: overall,\n version: TITAN_VERSION,\n uptime: process.uptime(),\n checks,\n });\n });\n\n // ── Monitors API ─────────────────────────────────────────────────\n app.get('/api/monitors', (_req, res) => {\n try {\n res.json({ monitors: listMonitors(), events: getMonitorEvents().slice(-50) });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/monitors', (req, res) => {\n try {\n const { name, prompt, triggerType, intervalMinutes } = req.body;\n if (!name || !prompt) { res.status(400).json({ error: 'name and prompt are required' }); return; }\n const monitor = addMonitor({ name, prompt, triggerType: triggerType || 'interval', intervalMinutes: intervalMinutes || 60 } as any);\n res.status(201).json(monitor);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.delete('/api/monitors/:id', (req, res) => {\n try {\n removeMonitor(req.params.id);\n res.json({ ok: true });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Test Health API ──────────────────────────────────────────────\n app.get('/api/test/health', async (_req, res) => {\n try {\n const { getTestHealthSummary } = await import('../testing/testHealthMonitor.js');\n const summary = getTestHealthSummary();\n res.json(summary);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/test/stats', async (_req, res) => {\n try {\n const { getTestHealth } = await import('../testing/testHealthMonitor.js');\n const stats = getTestHealth();\n res.json(stats);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/test/failing', async (_req, res) => {\n try {\n const { getFailingTests } = await import('../testing/testHealthMonitor.js');\n const failing = getFailingTests();\n res.json(failing);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/test/flaky', async (_req, res) => {\n try {\n const { getFlakyTests } = await import('../testing/testHealthMonitor.js');\n const threshold = _req.query.threshold ? parseFloat(_req.query.threshold as string) : 0.4;\n const flaky = getFlakyTests(threshold);\n res.json(flaky);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/test/runs', async (_req, res) => {\n try {\n const { getRecentTestRuns } = await import('../testing/testHealthMonitor.js');\n const limit = _req.query.limit ? parseInt(_req.query.limit as string, 10) : 10;\n const runs = getRecentTestRuns(limit);\n res.json(runs);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/test/run', async (_req, res) => {\n try {\n const { runTestsDetailed } = await import('../testing/testHealthMonitor.js');\n const { pattern, watch, coverage, timeout } = _req.body;\n const result = await runTestsDetailed({ pattern, watch, coverage, timeout });\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/test/repair-history', async (_req, res) => {\n try {\n const { getRepairHistory } = await import('../testing/repairValidator.js');\n const repairId = _req.query.repairId as string | undefined;\n const history = getRepairHistory(repairId);\n res.json(history);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Organism / Safety Metrics API ──────────────────────────────\n app.get('/api/organism/history', async (_req, res) => {\n res.status(501).json({ error: 'Not implemented' });\n });\n\n app.get('/api/organism/safety-trend', async (_req, res) => {\n res.status(501).json({ error: 'Not implemented' });\n });\n\n app.get('/api/organism/safety-metrics', async (_req, res) => {\n res.status(501).json({ error: 'Not implemented' });\n });\n\n // ── Organism / Alert Management API ───────────────────────────\n app.get('/api/organism/alerts', async (_req, res) => {\n try {\n const { getAlerts } = await import('../organism/alertsStore.js');\n res.json({ alerts: getAlerts() });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/organism/alerts/stats', async (_req, res) => {\n try {\n const { getAlertStats } = await import('../organism/alertsStore.js');\n res.json(getAlertStats());\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/organism/alerts/config', async (_req, res) => {\n try {\n const { getAlertConfig } = await import('../organism/alertsStore.js');\n res.json(getAlertConfig());\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/organism/alerts/config', async (_req, res) => {\n try {\n const { setAlertConfig } = await import('../organism/alertsStore.js');\n setAlertConfig(_req.body || {});\n res.json({ success: true });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/organism/alerts/:id/acknowledge', async (req, res) => {\n try {\n const { acknowledgeAlert } = await import('../organism/alertsStore.js');\n const ok = acknowledgeAlert(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Alert not found' }); return; }\n res.json({ success: true });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.delete('/api/organism/alerts/old', async (_req, res) => {\n try {\n const { deleteOldAlerts } = await import('../organism/alertsStore.js');\n const removed = deleteOldAlerts();\n res.json({ removed });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // ── Eval Harness API ───────────────────────────────────────────\n app.post('/api/eval/run', async (req, res) => {\n try {\n const { suite } = req.body as { suite?: string };\n const {\n runEvalSuite,\n WIDGET_CREATION_SUITE,\n SAFETY_SUITE,\n TOOL_ROUTING_SUITE,\n GATE_FORMAT_SUITE,\n PIPELINE_SUITE,\n ADVERSARIAL_SUITE,\n TOOL_ROUTING_V2_SUITE,\n SESSION_SUITE,\n WIDGET_V2_SUITE,\n GATE_FORMAT_V2_SUITE,\n CONTENT_SUITE,\n } = await import('../eval/harness.js');\n\n // Local agent call — replicates the system-widget shortcut inline\n // so eval tests exercise the same fast-path users get via HTTP.\n const systemWidgetShortcuts: Array<{ pattern: RegExp; source: string; name: string; w: number; h: number }> = [\n { pattern: /\\b(?:backups?|snapshots?|archives?)\\b/i, source: 'system:backup', name: 'Backup Manager', w: 6, h: 6 },\n { pattern: /\\b(?:training|train|specialists?|models?)\\b/i, source: 'system:training', name: 'Training Dashboard', w: 6, h: 6 },\n { pattern: /\\b(?:recipes?|playbooks?|workflows?|jarvis)\\b/i, source: 'system:recipes', name: 'Recipe Kitchen', w: 6, h: 6 },\n { pattern: /\\b(?:vram|gpu|memory|nvidia)\\b/i, source: 'system:vram', name: 'VRAM Monitor', w: 6, h: 6 },\n { pattern: /\\b(?:teams?|members?|roles?|permissions?|rbac)\\b/i, source: 'system:teams', name: 'Team Hub', w: 6, h: 6 },\n { pattern: /\\b(?:cron|schedules?|jobs?|timers?)\\b/i, source: 'system:cron', name: 'Cron Scheduler', w: 6, h: 6 },\n { pattern: /\\b(?:checkpoints?|restores?|save state)\\b/i, source: 'system:checkpoints', name: 'Checkpoints', w: 6, h: 5 },\n { pattern: /\\b(?:organism|drives?|safety|alerts?|guardrails?)\\b/i, source: 'system:organism', name: 'Organism Monitor', w: 6, h: 6 },\n { pattern: /\\b(?:fleet|nodes?|routes?|mesh)\\b/i, source: 'system:fleet', name: 'Fleet Router', w: 6, h: 5 },\n { pattern: /\\b(?:captcha|browsers?|form fill|web automation)\\b/i, source: 'system:browser', name: 'Browser Tools', w: 6, h: 5 },\n { pattern: /\\b(?:paperclip|sidecars?|helpers?)\\b/i, source: 'system:paperclip', name: 'Paperclip', w: 6, h: 5 },\n { pattern: /\\b(?:tests?|flaky|failing|coverage|eval)\\b/i, source: 'system:eval', name: 'Test Lab', w: 6, h: 6 },\n ];\n const agentCall = async (input: string, testName?: string) => {\n const shortcut = systemWidgetShortcuts.find(s => s.pattern.test(input));\n if (shortcut) {\n return {\n content: `Added the **${shortcut.name}** widget to your canvas.\\n\\n_____widget\\n{ \"name\": \"${shortcut.name}\", \"format\": \"system\", \"source\": \"${shortcut.source}\", \"w\": ${shortcut.w}, \"h\": ${shortcut.h} }`,\n toolsUsed: [],\n };\n }\n // Use a unique userId per test case so each test gets a fresh session\n // with its own token budget. Prevents budget bleed across tests.\n const userId = testName ? `eval-${testName.replace(/\\s+/g, '-').toLowerCase()}` : 'eval-harness';\n const result = await processMessage(input, 'eval', userId, {});\n return {\n content: result.content || '',\n toolsUsed: (result.toolsUsed as string[]) ?? [],\n };\n };\n\n let cases;\n switch (suite) {\n case 'widget-creation': cases = WIDGET_CREATION_SUITE; break;\n case 'safety': cases = SAFETY_SUITE; break;\n case 'tool-routing': cases = TOOL_ROUTING_SUITE; break;\n case 'gate-format': cases = GATE_FORMAT_SUITE; break;\n case 'pipeline': cases = PIPELINE_SUITE; break;\n case 'adversarial': cases = ADVERSARIAL_SUITE; break;\n case 'tool-routing-v2': cases = TOOL_ROUTING_V2_SUITE; break;\n case 'session': cases = SESSION_SUITE; break;\n case 'widget-v2': cases = WIDGET_V2_SUITE; break;\n case 'gate-format-v2': cases = GATE_FORMAT_V2_SUITE; break;\n case 'content': cases = CONTENT_SUITE; break;\n default:\n res.status(400).json({ error: `Unknown suite: ${suite}. Choose: widget-creation, safety, tool-routing, gate-format, pipeline, adversarial, tool-routing-v2, session, widget-v2, gate-format-v2, content.` });\n return;\n }\n\n const result = await runEvalSuite(suite, cases, agentCall);\n // Publish to Prometheus so suite regressions surface in /metrics over time.\n try { recordEvalSuiteResult(suite!, result.passed, result.total); } catch { /* metrics best-effort */ }\n res.json(result);\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/eval/suites', async (_req, res) => {\n res.json({ suites: [\n 'widget-creation', 'safety', 'tool-routing', 'gate-format',\n 'pipeline', 'adversarial', 'tool-routing-v2', 'session',\n 'widget-v2', 'gate-format-v2', 'content',\n ] });\n });\n\n // ── Test Health & Repair Validation API ────────────────────────\n app.get('/api/tests/health', async (_req, res) => {\n try {\n const { getTestHealthSummary } = await import('../testing/testHealthMonitor.js');\n const summary = getTestHealthSummary();\n res.json(summary);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/tests/failing', async (_req, res) => {\n try {\n const { getFailingTests } = await import('../testing/testHealthMonitor.js');\n const failing = getFailingTests();\n res.json({ tests: failing, count: failing.length });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/tests/flaky', async (_req, res) => {\n try {\n const { getFlakyTests } = await import('../testing/testHealthMonitor.js');\n const threshold = _req.query.threshold ? parseFloat(_req.query.threshold as string) : 0.4;\n const flaky = getFlakyTests(threshold);\n res.json({ tests: flaky, count: flaky.length, threshold });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/tests/history', async (_req, res) => {\n try {\n const { getRecentTestRuns } = await import('../testing/testHealthMonitor.js');\n const limit = _req.query.limit ? parseInt(_req.query.limit as string, 10) : 10;\n const runs = getRecentTestRuns(limit);\n res.json({ runs, count: runs.length });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/tests/run', async (req, res) => {\n try {\n const { runTests } = await import('../testing/testRunner.js');\n const { pattern, timeout } = req.body;\n const result = await runTests({ pattern, timeout });\n res.json(result);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/tests/validate-repair', async (req, res) => {\n try {\n const { validateRepair } = await import('../testing/repairValidator.js');\n const { repairId, finding, affectedFiles } = req.body;\n\n if (!repairId || !finding) {\n res.status(400).json({ error: 'Missing required fields: repairId, finding' });\n return;\n }\n\n const result = await validateRepair({ repairId, finding, affectedFiles });\n res.json(result);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/tests/repair-history', async (req, res) => {\n try {\n const { getRepairHistory } = await import('../testing/repairValidator.js');\n const { repairId } = req.query;\n const history = getRepairHistory(repairId as string | undefined);\n res.json({ history, count: history.length });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/tests/validate-system-repair', async (req, res) => {\n try {\n const { validateSystemRepair } = await import('../testing/repairValidator.js');\n const { repairType, target } = req.body;\n\n if (!repairType || !target) {\n res.status(400).json({ error: 'Missing required fields: repairType, target' });\n return;\n }\n\n const result = await validateSystemRepair({ repairType, target });\n res.json({ success: result.valid ?? false, repairType, target, ...result });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // Lightweight first-run readiness check used by Mission Control's banner.\n // Returns whether the user has at least one usable provider configured,\n // plus a counts/suggestion that the UI can render directly.\n app.get('/api/doctor/quick', async (_req, res) => {\n try {\n const { hasUsableProvider } = await import('../config/config.js');\n const usable = await hasUsableProvider();\n const cfg = loadConfig();\n const providers = (cfg.providers as Record<string, unknown> | undefined) || {};\n let configured = 0;\n for (const p of Object.values(providers)) {\n const key = (p as { apiKey?: string } | undefined)?.apiKey;\n if (key && key.trim().length > 0) configured++;\n }\n res.json({\n ready: usable.ok,\n details: usable.details,\n providersConfigured: configured,\n suggestion: usable.ok\n ? null\n : 'Run `titan onboard` (terminal) or open Settings → Providers to configure an AI provider.',\n action: usable.ok ? null : { type: 'open', target: '/settings', label: 'Open settings' },\n });\n } catch (e) {\n res.status(500).json({ ready: false, error: (e as Error).message });\n }\n });\n\n // ── Test Health API ───────────────────────────────────────────\n app.get('/api/test-health/summary', async (_req, res) => {\n try {\n const { getTestHealthSummary, getFlakyTests } = await import('../testing/testHealthMonitor.js');\n const raw = getTestHealthSummary();\n const flaky = getFlakyTests().length;\n res.json({\n total: raw.total as number,\n passing: raw.passing as number,\n failing: raw.failing as number,\n flaky,\n coverage: raw.coveragePct as number,\n });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/test-health/failing', async (_req, res) => {\n try {\n const { getFailingTests } = await import('../testing/testHealthMonitor.js');\n const limit = _req.query.limit ? parseInt(_req.query.limit as string, 10) : 10;\n const names = getFailingTests().slice(0, limit);\n const tests = names.map(name => ({ name, suite: '', error: '', lastFailed: '', attempts: 0 }));\n res.json({ count: tests.length, tests });\n } catch (e) {\n res.status(500).json({ error: (e as Error).message, tests: [] });\n }\n });\n\n app.get('/api/test-health/flaky', async (_req, res) => {\n try {\n const { getFlakyTests } = await import('../testing/testHealthMonitor.js');\n const threshold = _req.query.threshold ? parseFloat(_req.query.threshold as string) : 0.4;\n const limit = _req.query.limit ? parseInt(_req.query.limit as string, 10) : 10;\n const names = getFlakyTests(threshold).slice(0, limit);\n const tests = names.map(name => ({ name, suite: '', passRate: 0, runs: 0 }));\n res.json({ count: tests.length, threshold, tests });\n } catch (e) {\n res.status(500).json({ error: (e as Error).message, tests: [] });\n }\n });\n\n app.get('/api/test-health/history', async (_req, res) => {\n try {\n const { getRecentTestRuns } = await import('../testing/testHealthMonitor.js');\n const limit = _req.query.limit ? parseInt(_req.query.limit as string, 10) : 5;\n const runs = getRecentTestRuns(limit);\n res.json({ count: runs.length, runs });\n } catch (e) {\n res.status(500).json({ error: (e as Error).message, runs: [] });\n }\n });\n\n app.post('/api/test-health/run', async (req, res) => {\n try {\n const { runTests } = await import('../testing/testRunner.js');\n const { pattern, coverage, timeout } = req.body;\n const result = await runTests({ pattern, coverage, timeout });\n res.json(result);\n } catch (e) {\n res.status(500).json({ error: (e as Error).message, success: false });\n }\n });\n\n // ── Homelab machine health (v4.8.4) ───────────────────────────\n // Server-side health check for homelab machines. Done server-side\n // instead of browser-side because:\n // (1) CORS and self-signed HTTPS certs block browser fetches to\n // other homelab IPs;\n // (2) Using `http://<ip>/` (port 80) was the prior workaround and\n // returned false \"offline\" for TITAN installs that only open\n // the gateway port (48420).\n // Configured via `config.homelab.machines`; falls back to a sensible\n // default set if not configured.\n app.get('/api/homelab/machines', async (_req, res) => {\n try {\n const cfg = loadConfig() as unknown as {\n homelab?: { machines?: Array<{ name: string; ip: string; role?: string; port?: number; protocol?: 'http' | 'https'; path?: string }> };\n };\n const machines = cfg.homelab?.machines ?? [\n { name: 'Titan PC', ip: '192.168.1.11', role: 'Primary GPU (RTX 5090)', port: 48420, protocol: 'https' as const, path: '/api/health' },\n { name: 'Mini PC', ip: '192.168.1.95', role: 'Docker Host', port: 48420, protocol: 'https' as const, path: '/api/health' },\n { name: 'T610 Server', ip: '192.168.1.67', role: 'Always-on Backbone', port: 48420, protocol: 'https' as const, path: '/api/health' },\n ];\n // Use Node's built-in https/http to bypass self-signed cert\n // verification (homelab machines use self-signed certs).\n const https = await import('https');\n const http = await import('http');\n const probe = (protocol: 'http' | 'https', ip: string, port: number, path: string): Promise<{ ok: boolean; body: string; latencyMs: number }> => {\n return new Promise((resolve, reject) => {\n const started = Date.now();\n const lib = protocol === 'https' ? https : http;\n const req = lib.request({\n host: ip,\n port,\n path,\n method: 'GET',\n timeout: 3000,\n // Self-signed certs are the norm on TITAN installs — don't\n // refuse to talk to them. We're not transmitting secrets\n // here, just asking for a health ping.\n ...(protocol === 'https' ? { rejectUnauthorized: false } : {}),\n }, (r) => {\n let body = '';\n r.on('data', (c) => body += c);\n r.on('end', () => resolve({ ok: (r.statusCode ?? 0) >= 200 && (r.statusCode ?? 0) < 400, body, latencyMs: Date.now() - started }));\n });\n req.on('timeout', () => { req.destroy(new Error('timeout')); });\n req.on('error', reject);\n req.end();\n });\n };\n const results = await Promise.all(machines.map(async (m) => {\n const protocol = m.protocol ?? 'https';\n const port = m.port ?? 48420;\n const path = m.path ?? '/api/health';\n const started = Date.now();\n try {\n const r = await probe(protocol, m.ip, port, path);\n let version: string | undefined;\n try {\n const parsed = JSON.parse(r.body) as { version?: string };\n version = parsed?.version;\n } catch { /* not JSON — still online */ }\n return { name: m.name, ip: m.ip, role: m.role ?? '', online: r.ok, latencyMs: r.latencyMs, version };\n } catch (err) {\n return { name: m.name, ip: m.ip, role: m.role ?? '', online: false, latencyMs: Date.now() - started, error: (err as Error).message };\n }\n }));\n res.json({ machines: results });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── VRAM API ────────────────────────────────────────────────\n app.get('/api/vram', async (_req, res) => {\n try {\n const { getVRAMOrchestrator } = await import('../vram/orchestrator.js');\n const orch = getVRAMOrchestrator();\n const snapshot = await orch.getSnapshot();\n if (!snapshot) {\n res.json({ error: 'GPU state unavailable' });\n return;\n }\n res.json(snapshot);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/vram/acquire', async (req, res) => {\n try {\n const { service, requiredMB, leaseDurationMs } = req.body as {\n service?: string; requiredMB?: number; leaseDurationMs?: number;\n };\n if (!service || !requiredMB) {\n res.status(400).json({ error: 'service and requiredMB required' });\n return;\n }\n if (typeof requiredMB !== 'number' || !Number.isFinite(requiredMB) || requiredMB <= 0) {\n res.status(400).json({ error: 'requiredMB must be a positive number' });\n return;\n }\n const { getVRAMOrchestrator } = await import('../vram/orchestrator.js');\n const orch = getVRAMOrchestrator();\n const result = await orch.acquire(service, requiredMB, leaseDurationMs || 300_000);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/vram/release', async (req, res) => {\n try {\n const { leaseId, restoreModel } = req.body as { leaseId?: string; restoreModel?: boolean };\n if (!leaseId) {\n res.status(400).json({ error: 'leaseId required' });\n return;\n }\n const { getVRAMOrchestrator } = await import('../vram/orchestrator.js');\n const orch = getVRAMOrchestrator();\n const result = await orch.release(leaseId, restoreModel ?? true);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/vram/check', async (req, res) => {\n try {\n const mb = parseInt(req.query.mb as string, 10);\n if (!mb || mb <= 0) {\n res.status(400).json({ error: 'mb query param required (positive integer)' });\n return;\n }\n const { getVRAMOrchestrator } = await import('../vram/orchestrator.js');\n const orch = getVRAMOrchestrator();\n const result = await orch.canAcquire(mb);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Hardware Detection API ──────────────────────────────────\n app.get('/api/hardware/detect', async (_req, res) => {\n try {\n const { detectHardware, generateRecommendations } = await import('../hardware/autoConfig.js');\n const profile = await detectHardware();\n const recommendations = generateRecommendations(profile);\n res.json({ profile, recommendations });\n } catch (err) {\n logger.error(COMPONENT, `Hardware detection failed: ${(err as Error).message}`);\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/hardware/apply', async (_req, res) => {\n try {\n const { applyAutoConfiguration } = await import('../hardware/autoConfig.js');\n const result = await applyAutoConfiguration(false);\n res.json({\n success: true,\n profile: result.profile,\n recommendations: result.recommendations,\n applied: result.applied,\n });\n } catch (err) {\n logger.error(COMPONENT, `Hardware auto-config failed: ${(err as Error).message}`);\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Cloud mode config endpoint ──────────────────────────────\n app.get('/api/cloud/config', (_req, res) => {\n const isCloud = process.env.TITAN_CLOUD_MODE === 'true';\n if (!isCloud) {\n return res.json({ cloud: false });\n }\n return res.json({\n cloud: true,\n apiUrl: process.env.TITAN_CLOUD_API || '',\n userId: process.env.TITAN_USER_ID || '',\n userEmail: process.env.TITAN_USER_EMAIL || '',\n });\n });\n\n // ── Onboarding API ──────────────────────────────────────────\n app.get('/api/onboarding/status', (_req, res) => {\n const cfg = loadConfig();\n // Cloud auto-onboarding path was removed when OpenRouter was taken out\n // of the runtime (v4.13). Running in cloud mode now just reports status\n // — onboarding has to happen through the normal wizard.\n return res.json({ onboarded: cfg.onboarded, version: TITAN_VERSION, cloud: process.env.TITAN_CLOUD_MODE === 'true' });\n });\n\n app.post('/api/onboarding/complete', (req, res) => {\n try {\n const { provider, apiKey, model, agentName, personality } = req.body;\n\n // Build config updates\n const updates: Record<string, unknown> = { onboarded: true };\n\n // Set provider API key\n if (provider && apiKey) {\n const providerKey = provider.toLowerCase();\n const cfg = loadConfig();\n const providers = { ...cfg.providers } as Record<string, Record<string, unknown>>;\n if (!providers[providerKey]) providers[providerKey] = {};\n providers[providerKey].apiKey = apiKey;\n updates.providers = providers;\n }\n\n // Set model\n if (model) {\n updates.agent = { model };\n }\n\n // Set agent name / personality via soul\n if (agentName || personality) {\n const soulParts: string[] = [];\n if (agentName) soulParts.push(`Your name is ${agentName}.`);\n if (personality) soulParts.push(personality);\n updates.soul = soulParts.join(' ');\n }\n\n updateConfig(updates);\n broadcast({ type: 'config_updated' });\n res.json({ ok: true, message: 'Onboarding complete! Welcome to TITAN.' });\n } catch (e) {\n res.status(400).json({ error: (e as Error).message });\n }\n });\n\n // Prometheus metrics endpoint (behind /api/ auth prefix)\n app.get('/api/metrics', (_req, res) => {\n res.setHeader('Content-Type', 'text/plain; version=0.0.4');\n res.send(serializePrometheus());\n });\n\n // JSON metrics summary for dashboard\n app.get('/api/metrics/summary', (_req, res) => {\n res.json(getMetricsSummary());\n });\n\n // ── Telemetry API ──────────────────────────────────────────────\n app.post('/api/telemetry', (req, res) => {\n const cfg = loadConfig();\n if (!cfg.telemetry?.enabled) {\n res.status(204).end();\n return;\n }\n const { event, properties, timestamp } = req.body || {};\n if (!event || typeof event !== 'string') {\n res.status(400).json({ error: 'event is required' });\n return;\n }\n const entry = {\n event,\n properties: properties || {},\n timestamp: timestamp || new Date().toISOString(),\n sessionId: getUserIdFromReq(req),\n };\n // Fire-and-forget append to storage\n import('../storage/index.js')\n .then(({ getStorage }) => getStorage())\n .then((storage) => storage.appendTelemetryEvent?.(entry))\n .catch(() => {});\n res.status(204).end();\n });\n\n app.get('/api/telemetry/events', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.telemetry?.enabled) {\n res.json({ enabled: false, events: [] });\n return;\n }\n const limit = Math.min(parseInt((_req.query.limit as string) || '100', 10), 1000);\n try {\n const { getStorage } = await import('../storage/index.js');\n const storage = await getStorage();\n const events = await storage.queryTelemetryEvents?.({ limit }) ?? [];\n res.json({ enabled: true, events });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Analytics Profile ─────────────────────────────────────────\n app.get('/api/analytics/profile', async (_req, res) => {\n try {\n const profile = await collectSystemProfile();\n res.json(profile);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // v5.0 \"Spacewalk\": opt-in consent endpoint. The SetupWizard calls this\n // when the user picks \"Help improve TITAN by sharing anonymous stats\".\n // Body: { enabled: boolean, crashReports?: boolean }. On enable, we\n // stamp consentedAt + consentedVersion so we can tell the user WHEN\n // they opted in and which version the consent was tied to. On disable,\n // consentedAt is cleared.\n app.post('/api/telemetry/consent', async (req, res) => {\n try {\n const body = (req.body || {}) as { enabled?: boolean; crashReports?: boolean };\n const enabled = body.enabled === true;\n const crashReports = body.crashReports !== false; // default true when opted in\n const patch = {\n telemetry: {\n enabled,\n crashReports,\n consentedAt: enabled ? new Date().toISOString() : undefined,\n consentedVersion: enabled ? TITAN_VERSION : undefined,\n },\n } as unknown as Parameters<typeof updateConfig>[0];\n updateConfig(patch);\n\n // Fire a one-shot system_profile immediately on opt-in so Tony's\n // dashboard has fresh data within seconds of a new user agreeing.\n if (enabled) {\n (async () => {\n try {\n const { recordStartupAnalytics } = await import('../analytics/collector.js');\n await recordStartupAnalytics();\n } catch { /* best-effort */ }\n })();\n }\n\n res.json({ ok: true, enabled, crashReports });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Read-only status for the SetupWizard / Settings widget.\n app.get('/api/telemetry/consent', (_req, res) => {\n const cfg = loadConfig();\n const t = cfg.telemetry as unknown as {\n enabled?: boolean;\n crashReports?: boolean;\n consentedAt?: string;\n consentedVersion?: string;\n remoteUrl?: string;\n } | undefined;\n res.json({\n enabled: Boolean(t?.enabled),\n crashReports: t?.crashReports !== false,\n consentedAt: t?.consentedAt,\n consentedVersion: t?.consentedVersion,\n remoteUrl: t?.remoteUrl,\n });\n });\n\n /**\n * Telemetry send status — shows whether anonymous stats are actually\n * reaching the configured collector. Added in v5.0 after Tony asked\n * \"Fix TITAN to where anonymous stats get reported somewhere\" — the\n * answer is two things together:\n * 1. A persistent collector on Titan PC (see docs/ANALYTICS-DEPLOYMENT.md)\n * 2. This endpoint, so the Privacy widget can show a green \"last\n * sent 14s ago\" chip instead of leaving the user guessing.\n *\n * Returns: consent state + live remote status (sent/failed counts,\n * last attempt timestamps, last error). Never returns event bodies or\n * install IDs — all aggregate.\n */\n app.get('/api/telemetry/status', async (_req, res) => {\n try {\n const cfg = loadConfig();\n const t = cfg.telemetry as unknown as {\n enabled?: boolean;\n crashReports?: boolean;\n consentedAt?: string;\n consentedVersion?: string;\n remoteUrl?: string;\n } | undefined;\n const { getRemoteAnalyticsStatus } = await import('../analytics/collector.js');\n res.json({\n consent: {\n enabled: Boolean(t?.enabled),\n crashReports: t?.crashReports !== false,\n consentedAt: t?.consentedAt,\n consentedVersion: t?.consentedVersion,\n remoteUrl: t?.remoteUrl,\n },\n remote: getRemoteAnalyticsStatus(),\n });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // MCP server status\n app.get('/api/mcp/server', (_req, res) => {\n res.json(getMcpServerStatus());\n });\n\n // MCP client management\n app.get('/api/mcp/clients', (_req, res) => {\n const servers = listMcpServers();\n const status = getMcpStatus();\n const merged = servers.map(s => {\n const live = status.find(st => st.server.id === s.id);\n return { ...s, status: live?.status || 'disconnected', toolCount: live?.toolCount || 0 };\n });\n res.json({ servers: merged });\n });\n\n app.post('/api/mcp/clients', async (req, res) => {\n try {\n const { presetId, ...serverConfig } = req.body;\n let server;\n if (presetId) {\n const preset = BUILTIN_PRESETS.find(p => p.id === presetId);\n if (!preset) { res.status(400).json({ error: `Unknown preset: ${presetId}` }); return; }\n server = addMcpServer(preset as Parameters<typeof addMcpServer>[0]);\n } else {\n server = addMcpServer(serverConfig);\n }\n if (server.enabled) {\n await connectMcpServer(server).catch(() => { /* connect errors are non-fatal */ });\n }\n res.json({ ok: true, server });\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n }\n });\n\n app.delete('/api/mcp/clients/:id', (req, res) => {\n try {\n removeMcpServer(req.params.id);\n res.json({ ok: true });\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/mcp/clients/:id/toggle', (req, res) => {\n try {\n const { enabled } = req.body;\n setMcpServerEnabled(req.params.id, !!enabled);\n if (enabled) {\n const servers = listMcpServers();\n const server = servers.find(s => s.id === req.params.id);\n if (server) connectMcpServer(server).catch(() => {});\n }\n res.json({ ok: true, enabled: !!enabled });\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/mcp/clients/:id/test', async (req, res) => {\n try {\n const servers = listMcpServers();\n const server = servers.find(s => s.id === req.params.id);\n if (!server) { res.status(404).json({ error: 'Server not found' }); return; }\n const result = await testMcpServer(server);\n res.json(result);\n } catch (err) {\n res.json({ ok: false, tools: 0, error: (err as Error).message });\n }\n });\n\n app.get('/api/mcp/presets', (_req, res) => {\n res.json({ presets: BUILTIN_PRESETS });\n });\n\n // Multi-agent endpoints\n app.get('/api/agents', (_req, res) => {\n res.json({ agents: listAgents(), capacity: getAgentCapacity() });\n });\n\n app.post('/api/agents/spawn', (req, res) => {\n const { name, model, systemPrompt } = req.body;\n if (!name) { res.status(400).json({ error: 'name is required' }); return; }\n const result = spawnAgent({ name, model, systemPrompt });\n res.json(result);\n });\n\n app.post('/api/agents/stop', (req, res) => {\n const { agentId } = req.body;\n if (!agentId) { res.status(400).json({ error: 'agentId is required' }); return; }\n const result = stopAgent(agentId);\n res.json(result);\n });\n\n // Agent message endpoint (uses multi-agent routing)\n // Supports SSE streaming when Accept: text/event-stream header is present\n app.post('/api/message', rateLimit(defaultRateLimitWindowMs, defaultRateLimitMax), concurrencyGuard(MAX_CONCURRENT_MESSAGES), async (req, res) => {\n const { content, channel: rawChannel, userId = 'api-user', agentId, sessionId: requestedSessionId, model: requestedModel, systemPromptAppendix } = req.body;\n // Default channel to 'webchat' for browser-based Mission Control clients.\n // This enables the interactive plan approval flow (show plan → user approves/denies).\n // Programmatic API callers can explicitly pass channel: 'api' to auto-approve plans.\n const channel = rawChannel || (req.headers.accept === 'text/event-stream' ? 'webchat' : 'api');\n if (!content || typeof content !== 'string') {\n res.status(400).json({ error: 'content must be a non-empty string' });\n return;\n }\n\n const safeUserId = channel === 'api' ? 'api-user' : (userId || 'api-user');\n\n // ═─ System Widget Shortcut ─═════════════════════════════════════\n // Fast-path: if the user is asking for a known system widget, bypass\n // the LLM entirely and emit the _____widget gate directly. This is\n // reliable, instant, and avoids model tool-call unpredictability.\n const systemWidgetShortcuts: Array<{ pattern: RegExp; source: string; name: string; w: number; h: number }> = [\n { pattern: /\\b(?:backups?|snapshots?|archives?)\\b/i, source: 'system:backup', name: 'Backup Manager', w: 6, h: 6 },\n { pattern: /\\b(?:training|train|specialists?|models?)\\b/i, source: 'system:training', name: 'Training Dashboard', w: 6, h: 6 },\n { pattern: /\\b(?:recipes?|playbooks?|workflows?|jarvis)\\b/i, source: 'system:recipes', name: 'Recipe Kitchen', w: 6, h: 6 },\n { pattern: /\\b(?:vram|gpu|memory|nvidia)\\b/i, source: 'system:vram', name: 'VRAM Monitor', w: 6, h: 6 },\n { pattern: /\\b(?:teams?|members?|roles?|permissions?|rbac)\\b/i, source: 'system:teams', name: 'Team Hub', w: 6, h: 6 },\n { pattern: /\\b(?:cron|schedules?|jobs?|timers?)\\b/i, source: 'system:cron', name: 'Cron Scheduler', w: 6, h: 6 },\n { pattern: /\\b(?:checkpoints?|restores?|save state)\\b/i, source: 'system:checkpoints', name: 'Checkpoints', w: 6, h: 5 },\n { pattern: /\\b(?:organism|drives?|safety|alerts?|guardrails?)\\b/i, source: 'system:organism', name: 'Organism Monitor', w: 6, h: 6 },\n { pattern: /\\b(?:fleet|nodes?|routes?|mesh)\\b/i, source: 'system:fleet', name: 'Fleet Router', w: 6, h: 5 },\n { pattern: /\\b(?:captcha|browsers?|form fill|web automation)\\b/i, source: 'system:browser', name: 'Browser Tools', w: 6, h: 5 },\n { pattern: /\\b(?:paperclip|sidecars?|helpers?)\\b/i, source: 'system:paperclip', name: 'Paperclip', w: 6, h: 5 },\n { pattern: /\\b(?:tests?|flaky|failing|coverage|eval)\\b/i, source: 'system:eval', name: 'Test Lab', w: 6, h: 6 },\n ];\n const matchedShortcut = systemWidgetShortcuts.find(s => s.pattern.test(content));\n if (matchedShortcut) {\n const gateText = `_____widget\\n{ \"name\": \"${matchedShortcut.name}\", \"format\": \"system\", \"source\": \"${matchedShortcut.source}\", \"w\": ${matchedShortcut.w}, \"h\": ${matchedShortcut.h} }`;\n const responseText = `Added the **${matchedShortcut.name}** widget to your canvas.`;\n titanRequestsTotal.increment({ channel, status: 'ok' });\n if (req.headers.accept === 'text/event-stream') {\n res.setHeader('Content-Type', 'text/event-stream');\n res.flushHeaders();\n res.write(`event: token\\ndata: ${JSON.stringify({ text: responseText })}\\n\\n`);\n res.write(`event: token\\ndata: ${JSON.stringify({ text: '\\n\\n' + gateText })}\\n\\n`);\n res.write(`event: done\\ndata: ${JSON.stringify({ content: responseText + '\\n\\n' + gateText, sessionId: requestedSessionId || null, durationMs: 0, toolsUsed: [] })}\\n\\n`);\n res.end();\n } else {\n res.json({ content: responseText + '\\n\\n' + gateText, sessionId: requestedSessionId || null, toolsUsed: [], model: 'system', durationMs: 0 });\n }\n return;\n }\n\n const startTime = process.hrtime.bigint();\n const wantsSSE = req.headers.accept === 'text/event-stream';\n\n // Validate session ID format (prevent injection)\n if (requestedSessionId && !/^[a-zA-Z0-9_:-]{1,128}$/.test(requestedSessionId)) {\n res.status(400).json({ error: 'Invalid session ID format' });\n return;\n }\n\n // Set up abort controller for this request\n const abortController = new AbortController();\n if (requestedSessionId) {\n sessionAborts.set(requestedSessionId, abortController);\n sessionAbortTimes.set(requestedSessionId, Date.now());\n // S3: Track session ownership\n if (!sessionOwners.has(requestedSessionId)) {\n sessionOwners.set(requestedSessionId, getUserIdFromReq(req));\n }\n }\n\n // Check slash commands first (same as handleInboundMessage)\n try {\n const slashResult = await handleSlashCommand(content, channel, userId);\n if (slashResult) {\n titanRequestsTotal.increment({ channel, status: 'ok' });\n const durationSec = Number(process.hrtime.bigint() - startTime) / 1e9;\n titanRequestDuration.observe(durationSec, { channel });\n if (wantsSSE) {\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n res.flushHeaders();\n res.write(`event: done\\ndata: ${JSON.stringify({ content: slashResult.response, sessionId: null, durationMs: 0 })}\\n\\n`);\n res.end();\n } else {\n res.json({ content: slashResult.response, sessionId: null, toolsUsed: [], model: 'system' });\n }\n return;\n }\n } catch { /* fall through to routeMessage */ }\n\n // ── Auto-detect credentials in user messages ──────────────────────\n // If the user pastes a Home Assistant URL + JWT token, save them automatically\n // before the LLM even sees the message (prevents hallucination / tool-skip).\n try {\n const haKeywords = /home\\s*assistant|homeassistant|\\bha\\b\\s*(token|url|key|setup|connect)/i;\n const jwtPattern = /eyJ[A-Za-z0-9_-]+\\.eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+/;\n const urlPattern = /https?:\\/\\/[^\\s,'\"]+/i;\n if (haKeywords.test(content) && (jwtPattern.test(content) || urlPattern.test(content))) {\n const jwtMatch = content.match(jwtPattern);\n const urlMatch = content.match(urlPattern);\n const cfg = loadConfig();\n let saved = false;\n if (jwtMatch && (!cfg.homeAssistant?.token || cfg.homeAssistant.token !== jwtMatch[0])) {\n // Security: store in config but log a warning about plaintext storage\n cfg.homeAssistant.token = jwtMatch[0];\n saved = true;\n logger.warn(COMPONENT, '[Security] Home Assistant token auto-saved to config. Consider using the vault for credential storage.');\n }\n if (urlMatch && urlMatch[0].match(/:\\d{4}/) && (!cfg.homeAssistant?.url || cfg.homeAssistant.url !== urlMatch[0].replace(/\\/+$/, ''))) {\n cfg.homeAssistant.url = urlMatch[0].replace(/\\/+$/, '');\n saved = true;\n }\n if (saved) {\n updateConfig({ homeAssistant: cfg.homeAssistant });\n logger.info('Gateway', 'Auto-saved Home Assistant credentials from user message');\n }\n }\n } catch { /* non-critical — let the LLM handle it */ }\n\n // Concurrent LLM request limit (auto-tuned to 2 on CPU-only systems)\n const maxConcurrent = maxConcurrentOverride ?? (loadConfig().security.maxConcurrentTasks || 5);\n if (activeLlmRequests >= maxConcurrent) {\n titanRequestsTotal.increment({ channel, status: 'busy' });\n titanErrorsTotal.increment({ type: 'busy' });\n if (wantsSSE) {\n res.setHeader('Content-Type', 'text/event-stream');\n res.flushHeaders();\n res.write(`event: done\\ndata: ${JSON.stringify({ error: 'Server busy' })}\\n\\n`);\n res.end();\n } else {\n res.status(503).json({ error: 'Server busy — too many concurrent requests. Try again shortly.' });\n }\n return;\n }\n activeLlmRequests++;\n titanActiveSessions.inc();\n // Track client disconnect to avoid writing to dead connections\n let clientDisconnected = false;\n try {\n if (wantsSSE) {\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n res.flushHeaders();\n\n req.on('close', () => { clientDisconnected = true; });\n\n const safeWrite = (data: string) => {\n if (clientDisconnected) return;\n try { res.write(data); } catch { clientDisconnected = true; }\n };\n\n const response = await routeMessage(content, channel, safeUserId, {\n streamCallbacks: {\n onToken: (token: string) => {\n safeWrite(`event: token\\ndata: ${JSON.stringify({ text: token })}\\n\\n`);\n },\n onToolCall: (name: string, args: Record<string, unknown>) => {\n safeWrite(`event: tool_call\\ndata: ${JSON.stringify({ name, args, timestamp: Date.now() })}\\n\\n`);\n },\n onToolResult: (name: string, result: string, durationMs: number, success: boolean, diff?: string) => {\n safeWrite(`event: tool_end\\ndata: ${JSON.stringify({ name, result: result.slice(0, 500), durationMs, success, diff, timestamp: Date.now() })}\\n\\n`);\n },\n onThinking: () => {\n safeWrite(`event: thinking\\ndata: ${JSON.stringify({ timestamp: Date.now() })}\\n\\n`);\n },\n onRound: (round: number, maxRounds: number) => {\n safeWrite(`event: round\\ndata: ${JSON.stringify({ round, maxRounds, timestamp: Date.now() })}\\n\\n`);\n },\n },\n overrideAgentId: agentId,\n signal: abortController.signal,\n sessionId: requestedSessionId,\n modelOverride: requestedModel,\n systemPromptAppendix: typeof systemPromptAppendix === 'string' ? systemPromptAppendix : undefined,\n });\n titanRequestsTotal.increment({ channel, status: 'ok' });\n if (response.toolsUsed) {\n for (const tool of response.toolsUsed) titanToolCallsTotal.increment({ tool });\n }\n if (response.tokenUsage) {\n if (response.tokenUsage.prompt) titanTokensTotal.increment({ type: 'prompt' }, response.tokenUsage.prompt);\n if (response.tokenUsage.completion) titanTokensTotal.increment({ type: 'completion' }, response.tokenUsage.completion);\n }\n if (response.model) titanModelRequestsTotal.increment({ model: response.model, provider: 'default' });\n trackUsage(response.model || 'unknown', response.tokenUsage, response.durationMs || 0, response.sessionId || '');\n // Hunt Finding #11: sanitize SSE response content as well\n try {\n const { sanitizeOutbound } = await import('../utils/outboundSanitizer.js');\n const sanitized = sanitizeOutbound(\n response.content || '',\n 'api_message_sse',\n \"I'm TITAN — I can run commands, edit files, search the web, remember things, and more. What would you like me to help with?\",\n );\n if (sanitized.hadIssues) {\n logger.warn(COMPONENT, `[OutboundGuard] SSE /api/message response sanitized: ${sanitized.issues.join(', ')}`);\n response.content = sanitized.text;\n }\n } catch { /* sanitizer unavailable */ }\n if (!clientDisconnected) {\n safeWrite(`event: done\\ndata: ${JSON.stringify({ content: response.content, sessionId: response.sessionId, durationMs: response.durationMs, model: response.model, toolsUsed: response.toolsUsed, pendingApproval: response.pendingApproval })}\\n\\n`);\n try { res.end(); } catch { /* client gone */ }\n }\n } else {\n const response = await routeMessage(content, channel, safeUserId, {\n overrideAgentId: agentId,\n signal: abortController.signal,\n sessionId: requestedSessionId,\n modelOverride: requestedModel,\n systemPromptAppendix: typeof systemPromptAppendix === 'string' ? systemPromptAppendix : undefined,\n });\n titanRequestsTotal.increment({ channel, status: 'ok' });\n if (response.toolsUsed) {\n for (const tool of response.toolsUsed) titanToolCallsTotal.increment({ tool });\n }\n if (response.tokenUsage) {\n if (response.tokenUsage.prompt) titanTokensTotal.increment({ type: 'prompt' }, response.tokenUsage.prompt);\n if (response.tokenUsage.completion) titanTokensTotal.increment({ type: 'completion' }, response.tokenUsage.completion);\n }\n if (response.model) titanModelRequestsTotal.increment({ model: response.model, provider: 'default' });\n trackUsage(response.model || 'unknown', response.tokenUsage, response.durationMs || 0, response.sessionId || '');\n // Hunt Finding #11 (2026-04-14): sanitize outbound content before returning\n // to user. Catches system prompt leaks, instruction echoes, tool artifacts.\n // Defense-in-depth: the system prompt tells the model not to leak, but if the\n // model ignores that, this catches it.\n try {\n const { sanitizeOutbound } = await import('../utils/outboundSanitizer.js');\n const sanitized = sanitizeOutbound(\n response.content || '',\n 'api_message',\n \"I'm TITAN — I can run commands, edit files, search the web, remember things, and more. What would you like me to help with?\",\n );\n if (sanitized.hadIssues) {\n logger.warn(COMPONENT, `[OutboundGuard] /api/message response sanitized: ${sanitized.issues.join(', ')}`);\n response.content = sanitized.text;\n }\n } catch { /* sanitizer unavailable — non-critical */ }\n res.json(response);\n }\n } catch (error) {\n titanRequestsTotal.increment({ channel, status: 'error' });\n titanErrorsTotal.increment({ type: 'request' });\n // Capture a structured bug report for the operator + agent team to\n // review. Best-effort — never gates the user-facing error path.\n try {\n const { captureBugReport } = await import('../analytics/bugReports.js');\n await captureBugReport(error, {\n origin: 'gateway./api/message',\n channel,\n sessionId: requestedSessionId,\n model: typeof requestedModel === 'string' ? requestedModel : undefined,\n lastUserMessage: typeof content === 'string' ? content : undefined,\n turnNumber: undefined,\n });\n } catch { /* never let bug capture break the request path */ }\n // Classify the error so the UI can render an actionable banner instead of a stack trace\n const structured = classifyChatError(error as Error);\n if (wantsSSE && !clientDisconnected) {\n try { res.write(`event: done\\ndata: ${JSON.stringify(structured)}\\n\\n`); res.end(); } catch { /* client gone */ }\n } else if (!wantsSSE) {\n res.status(structured.status).json(structured);\n }\n } finally {\n activeLlmRequests--;\n titanActiveSessions.dec();\n const durationSec = Number(process.hrtime.bigint() - startTime) / 1e9;\n titanRequestDuration.observe(durationSec, { channel });\n if (requestedSessionId) sessionAborts.delete(requestedSessionId);\n }\n });\n\n // Abort a running session\n app.post('/api/sessions/:id/abort', (req, res) => {\n const { id } = req.params;\n const controller = sessionAborts.get(id);\n if (controller) {\n controller.abort();\n sessionAborts.delete(id);\n res.json({ ok: true, message: 'Session aborted' });\n } else {\n res.json({ ok: true, message: 'No active session to abort' });\n }\n });\n\n // SSE streaming endpoint — real token-by-token delivery\n app.post('/api/chat/stream', rateLimit(60000, 30), concurrencyGuard(10), async (req, res) => {\n const { content, model } = req.body;\n if (!content) { res.status(400).json({ error: 'content is required' }); return; }\n\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n res.flushHeaders();\n\n try {\n const config = loadConfig();\n const modelId = model || config.agent.model || 'anthropic/claude-sonnet-4-20250514';\n const systemMessages = [{ role: 'system' as const, content: `You are TITAN, an intelligent assistant.` }];\n const userMessages = [{ role: 'user' as const, content }];\n\n for await (const chunk of chatStream({ model: modelId, messages: [...systemMessages, ...userMessages], maxTokens: config.agent.maxTokens, temperature: config.agent.temperature })) {\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n if (chunk.type === 'done' || chunk.type === 'error') break;\n }\n } catch (error) {\n logger.error(COMPONENT, `Stream error: ${(error as Error).message}`);\n res.write(`data: ${JSON.stringify({ type: 'error', error: 'The assistant hit a snag. Please refresh and try again.' })}\\n\\n`);\n }\n res.end();\n });\n\n // Cost optimizer endpoint for Mission Control\n app.get('/api/costs', (_req, res) => {\n res.json(getCostStatus());\n });\n\n // Usage tracking — per-model cost breakdown\n app.get('/api/usage', (req, res) => {\n const hours = parseInt(req.query.hours as string) || 24;\n const cutoff = new Date(Date.now() - hours * 3600_000).toISOString();\n const recent = usageLog.filter(e => e.timestamp >= cutoff);\n\n // Aggregate by model\n const byModel: Record<string, { requests: number; promptTokens: number; completionTokens: number; totalTokens: number; estimatedCostUsd: number; avgDurationMs: number }> = {};\n for (const e of recent) {\n if (!byModel[e.model]) byModel[e.model] = { requests: 0, promptTokens: 0, completionTokens: 0, totalTokens: 0, estimatedCostUsd: 0, avgDurationMs: 0 };\n const m = byModel[e.model];\n m.requests++;\n m.promptTokens += e.promptTokens;\n m.completionTokens += e.completionTokens;\n m.totalTokens += e.totalTokens;\n m.estimatedCostUsd += e.estimatedCostUsd;\n m.avgDurationMs = (m.avgDurationMs * (m.requests - 1) + e.durationMs) / m.requests;\n }\n\n // Round costs\n for (const m of Object.values(byModel)) {\n m.estimatedCostUsd = Math.round(m.estimatedCostUsd * 10000) / 10000;\n m.avgDurationMs = Math.round(m.avgDurationMs);\n }\n\n const totalCost = Object.values(byModel).reduce((sum, m) => sum + m.estimatedCostUsd, 0);\n\n res.json({\n period: `${hours}h`,\n totalRequests: recent.length,\n totalTokens: recent.reduce((sum, e) => sum + e.totalTokens, 0),\n estimatedCostUsd: Math.round(totalCost * 10000) / 10000,\n byModel,\n recentEntries: recent.slice(-20), // Last 20 for detail view\n });\n });\n\n // Update System endpoints\n app.get('/api/update', async (_req, res) => {\n const info = await getUpdateInfo();\n res.json(info);\n });\n\n app.post('/api/update', (req, res) => {\n const isLocalDev = fs.existsSync(join(process.cwd(), '.git'));\n const restart = req.body?.restart === true;\n\n let command = 'npm update -g titan-agent';\n if (isLocalDev) {\n command = 'git pull && npm run build';\n }\n\n logger.info(COMPONENT, `Triggering update: ${command} (restart=${restart})`);\n\n exec(command, { timeout: 120_000 }, (error, stdout, _stderr) => {\n if (error) {\n logger.error(COMPONENT, `Update failed: ${error.message}`);\n if (!res.headersSent) res.json({ ok: false, error: error.message });\n return;\n }\n\n logger.info(COMPONENT, `Update completed successfully.\\\\n${stdout}`);\n if (!res.headersSent) {\n res.json({ ok: true, message: 'Update completed', restarting: restart, output: stdout.slice(-500) });\n }\n\n if (restart) {\n logger.info(COMPONENT, 'Scheduling restart in 2 seconds...');\n const cwd = process.cwd();\n const scriptPath = '/tmp/titan-restart.sh';\n fs.writeFileSync(scriptPath, [\n '#!/bin/bash',\n 'sleep 2',\n `cd \"${cwd}\"`,\n 'nohup node dist/cli/index.js gateway >> /tmp/titan-gateway.log 2>&1 &',\n ].join('\\n'), { mode: 0o755 });\n\n spawn('bash', [scriptPath], { detached: true, stdio: 'ignore' }).unref();\n\n setTimeout(() => {\n logger.info(COMPONENT, 'Exiting for restart...');\n process.exit(0);\n }, 1000);\n }\n });\n });\n\n // Config endpoints\n app.get('/api/config', (_req, res) => {\n const cfg = loadConfig();\n // Return config with sensitive fields masked\n res.json({\n model: cfg.agent.model,\n provider: cfg.agent.model?.split('/')[0] || 'openai',\n voice: {\n enabled: Boolean(cfg.voice?.enabled),\n livekitUrl: cfg.voice?.livekitUrl || '',\n agentUrl: cfg.voice?.agentUrl || '',\n ttsEngine: cfg.voice?.ttsEngine || 'f5-tts',\n ttsUrl: cfg.voice?.ttsUrl || 'http://localhost:5006',\n ttsVoice: cfg.voice?.ttsVoice || 'tara',\n sttUrl: cfg.voice?.sttUrl || 'http://localhost:48421',\n sttEngine: cfg.voice?.sttEngine || 'faster-whisper',\n model: cfg.voice?.model || '',\n },\n agent: { ...cfg.agent, systemPrompt: undefined, systemPromptConfigured: Boolean(cfg.agent.systemPrompt) },\n autonomy: cfg.autonomy,\n security: {\n sandboxMode: cfg.security.sandboxMode,\n shield: cfg.security.shield,\n deniedTools: cfg.security.deniedTools || [],\n networkAllowlist: cfg.security.networkAllowlist || [],\n },\n gateway: {\n port: cfg.gateway.port,\n host: cfg.gateway.host,\n auth: { mode: cfg.gateway.auth.mode },\n },\n logging: cfg.logging,\n providers: {\n anthropic: { configured: Boolean(cfg.providers.anthropic?.apiKey) },\n openai: { configured: Boolean(cfg.providers.openai?.apiKey) },\n google: { configured: Boolean(cfg.providers.google?.apiKey) },\n ollama: { baseUrl: cfg.providers.ollama?.baseUrl || 'http://localhost:11434' },\n groq: { configured: Boolean(cfg.providers.groq?.apiKey) },\n mistral: { configured: Boolean(cfg.providers.mistral?.apiKey) },\n fireworks: { configured: Boolean(cfg.providers.fireworks?.apiKey) },\n xai: { configured: Boolean(cfg.providers.xai?.apiKey) },\n together: { configured: Boolean(cfg.providers.together?.apiKey) },\n deepseek: { configured: Boolean(cfg.providers.deepseek?.apiKey) },\n perplexity: { configured: Boolean(cfg.providers.perplexity?.apiKey) },\n },\n oauth: {\n google: {\n clientIdSet: Boolean(cfg.oauth?.google?.clientId),\n clientSecretSet: Boolean(cfg.oauth?.google?.clientSecret),\n },\n },\n channels: Object.fromEntries(\n Object.entries(cfg.channels).map(([k, v]) => {\n const ch = v as { enabled?: boolean; token?: string; dmPolicy?: string };\n return [k, { enabled: Boolean(ch.enabled), dmPolicy: ch.dmPolicy || 'pairing' }];\n })\n ),\n nvidia: (() => {\n const nv = (cfg as Record<string, unknown>).nvidia as Record<string, unknown> | undefined;\n if (!nv) return { enabled: false, apiKeySet: false, cuopt: { enabled: false, url: 'http://localhost:5000' }, asr: { enabled: false, grpcUrl: 'localhost:50051', healthUrl: 'http://localhost:9000' }, openshell: { enabled: false, binaryPath: 'openshell', policyPath: '' } };\n return {\n enabled: Boolean(nv.enabled),\n apiKeySet: Boolean(nv.apiKey || process.env.NVIDIA_API_KEY),\n cuopt: nv.cuopt ?? { enabled: false, url: 'http://localhost:5000' },\n asr: nv.asr ?? { enabled: false, grpcUrl: 'localhost:50051', healthUrl: 'http://localhost:9000' },\n openshell: nv.openshell ?? { enabled: false, binaryPath: 'openshell', policyPath: '' },\n };\n })(),\n mesh: {\n enabled: Boolean(cfg.mesh?.enabled),\n mdns: Boolean(cfg.mesh?.mdns),\n tailscale: Boolean(cfg.mesh?.tailscale),\n maxPeers: cfg.mesh?.maxPeers ?? 5,\n autoApprove: Boolean(cfg.mesh?.autoApprove),\n },\n organism: {\n enabled: Boolean(cfg.organism?.enabled),\n hormonesInPrompt: Boolean(cfg.organism?.hormonesInPrompt),\n pressureThreshold: Number(cfg.organism?.pressureThreshold) || 0.5,\n shadowEnabled: Boolean(cfg.organism?.shadowEnabled),\n tickIntervalMs: Number(cfg.organism?.tickIntervalMs) || 60000,\n },\n commandPost: {\n enabled: Boolean((cfg as Record<string, any>).commandPost?.enabled),\n heartbeatIntervalMs: (cfg as Record<string, any>).commandPost?.heartbeatIntervalMs ?? 30000,\n maxConcurrentAgents: (cfg as Record<string, any>).commandPost?.maxConcurrentAgents ?? 10,\n checkoutTimeoutMs: (cfg as Record<string, any>).commandPost?.checkoutTimeoutMs ?? 300000,\n },\n });\n });\n\n app.post('/api/config', async (req, res) => {\n try {\n const body = req.body as Record<string, unknown>;\n const cfg = loadConfig();\n // Clone config to avoid mutating live state before validation succeeds\n const draft = structuredClone(cfg) as typeof cfg;\n\n // Track which config fields are being changed for restart detection\n const changedFields: string[] = [];\n\n if (body.model) {\n // Hunt Finding #35 (2026-04-14): POST /api/config's `model` field\n // was bypassing the shape + provider-registry validation that\n // /api/model/switch gained in #25. Same bug class: a bogus string\n // got persisted to config. Apply the same shape check here.\n const modelShapeErr = validateModelId(body.model);\n if (modelShapeErr) {\n res.status(400).json({ error: `model: ${modelShapeErr}` });\n return;\n }\n // Also validate the provider is registered (same as #25).\n const modelStr = body.model as string;\n const providerPrefix = modelStr.split('/')[0];\n if (providerPrefix && providerPrefix !== 'ollama') {\n const { getProvider } = await import('../providers/router.js');\n if (!getProvider(providerPrefix)) {\n res.status(400).json({\n error: `Unknown provider '${providerPrefix}'. Use /api/models to list available providers and models.`,\n });\n return;\n }\n }\n draft.agent.model = modelStr;\n changedFields.push('agent.model');\n }\n if (body.autonomyMode) { draft.autonomy.mode = body.autonomyMode as 'supervised' | 'autonomous' | 'locked'; changedFields.push('autonomy.mode'); }\n if (body.sandboxMode) { draft.security.sandboxMode = body.sandboxMode as 'host' | 'docker' | 'none'; changedFields.push('security.sandboxMode'); }\n if (body.logLevel) { draft.logging.level = body.logLevel as 'info' | 'debug' | 'warn' | 'silent'; changedFields.push('logging.level'); }\n // Provider API keys\n if (body.anthropicKey !== undefined) { draft.providers.anthropic.apiKey = body.anthropicKey as string; changedFields.push('providers.anthropic.apiKey'); }\n if (body.openaiKey !== undefined) { draft.providers.openai.apiKey = body.openaiKey as string; changedFields.push('providers.openai.apiKey'); }\n if (body.googleKey !== undefined) { draft.providers.google.apiKey = body.googleKey as string; changedFields.push('providers.google.apiKey'); }\n if (body.ollamaUrl !== undefined) { draft.providers.ollama.baseUrl = body.ollamaUrl as string; changedFields.push('providers.ollama.baseUrl'); }\n if (body.groqKey !== undefined) { draft.providers.groq.apiKey = body.groqKey as string; changedFields.push('providers.groq.apiKey'); }\n if (body.mistralKey !== undefined) { draft.providers.mistral.apiKey = body.mistralKey as string; changedFields.push('providers.mistral.apiKey'); }\n if (body.fireworksKey !== undefined) { draft.providers.fireworks.apiKey = body.fireworksKey as string; changedFields.push('providers.fireworks.apiKey'); }\n if (body.xaiKey !== undefined) { draft.providers.xai.apiKey = body.xaiKey as string; changedFields.push('providers.xai.apiKey'); }\n if (body.togetherKey !== undefined) { draft.providers.together.apiKey = body.togetherKey as string; changedFields.push('providers.together.apiKey'); }\n if (body.deepseekKey !== undefined) { draft.providers.deepseek.apiKey = body.deepseekKey as string; changedFields.push('providers.deepseek.apiKey'); }\n if (body.perplexityKey !== undefined) { draft.providers.perplexity.apiKey = body.perplexityKey as string; changedFields.push('providers.perplexity.apiKey'); }\n // Google OAuth\n if (body.googleOAuthClientId !== undefined) {\n if (!draft.oauth) (draft as Record<string, unknown>).oauth = { google: {} };\n draft.oauth.google.clientId = body.googleOAuthClientId as string;\n changedFields.push('oauth.google.clientId');\n }\n if (body.googleOAuthClientSecret !== undefined) {\n if (!draft.oauth) (draft as Record<string, unknown>).oauth = { google: {} };\n draft.oauth.google.clientSecret = body.googleOAuthClientSecret as string;\n changedFields.push('oauth.google.clientSecret');\n }\n // Agent settings\n if (body.maxTokens !== undefined) { draft.agent.maxTokens = Number(body.maxTokens); changedFields.push('agent.maxTokens'); }\n if (body.temperature !== undefined) { draft.agent.temperature = Number(body.temperature); changedFields.push('agent.temperature'); }\n if (body.systemPrompt !== undefined) { draft.agent.systemPrompt = body.systemPrompt as string; changedFields.push('agent.systemPrompt'); }\n // Security shield\n if (body.shieldEnabled !== undefined) { draft.security.shield.enabled = Boolean(body.shieldEnabled); changedFields.push('security.shield.enabled'); }\n if (body.shieldMode !== undefined) { draft.security.shield.mode = body.shieldMode as 'strict' | 'standard'; changedFields.push('security.shield.mode'); }\n if (body.deniedTools !== undefined) { draft.security.deniedTools = body.deniedTools as string[]; changedFields.push('security.deniedTools'); }\n if (body.networkAllowlist !== undefined) { draft.security.networkAllowlist = body.networkAllowlist as string[]; changedFields.push('security.networkAllowlist'); }\n // Gateway\n if (body.gatewayPort !== undefined) { draft.gateway.port = Number(body.gatewayPort); changedFields.push('gateway.port'); }\n if (body.gatewayAuthMode !== undefined) { draft.gateway.auth.mode = body.gatewayAuthMode as 'none' | 'token' | 'password'; changedFields.push('gateway.auth.mode'); }\n if (body.gatewayPassword !== undefined) { draft.gateway.auth.password = body.gatewayPassword as string; changedFields.push('gateway.auth.password'); }\n if (body.gatewayToken !== undefined) { draft.gateway.auth.token = body.gatewayToken as string; changedFields.push('gateway.auth.token'); }\n // Voice settings (nested object from SettingsPanel)\n if (body.voice !== undefined && typeof body.voice === 'object') {\n const v = body.voice as Record<string, unknown>;\n if (v.enabled !== undefined) draft.voice.enabled = Boolean(v.enabled);\n if (v.livekitUrl !== undefined) draft.voice.livekitUrl = String(v.livekitUrl);\n if (v.livekitApiKey !== undefined) draft.voice.livekitApiKey = String(v.livekitApiKey);\n if (v.livekitApiSecret !== undefined) draft.voice.livekitApiSecret = String(v.livekitApiSecret);\n if (v.agentUrl !== undefined) draft.voice.agentUrl = String(v.agentUrl);\n if (v.ttsVoice !== undefined) draft.voice.ttsVoice = String(v.ttsVoice);\n if (v.ttsEngine !== undefined) draft.voice.ttsEngine = String(v.ttsEngine) as typeof draft.voice.ttsEngine;\n if (v.ttsUrl !== undefined) draft.voice.ttsUrl = String(v.ttsUrl);\n if (v.sttUrl !== undefined) draft.voice.sttUrl = String(v.sttUrl);\n if (v.sttEngine !== undefined) draft.voice.sttEngine = String(v.sttEngine) as typeof draft.voice.sttEngine;\n if (v.model !== undefined) (draft.voice as Record<string, unknown>).model = String(v.model) || undefined;\n changedFields.push('voice');\n }\n // Home Assistant\n if (body.homeAssistantUrl !== undefined) { draft.homeAssistant.url = body.homeAssistantUrl as string; changedFields.push('homeAssistant.url'); }\n if (body.homeAssistantToken !== undefined) { draft.homeAssistant.token = body.homeAssistantToken as string; changedFields.push('homeAssistant.token'); }\n // Channels\n if (body.channels !== undefined && typeof body.channels === 'object') {\n for (const [ch, val] of Object.entries(body.channels as Record<string, unknown>)) {\n if (draft.channels[ch as keyof typeof draft.channels]) {\n Object.assign(draft.channels[ch as keyof typeof draft.channels], val);\n changedFields.push(`channels.${ch}`);\n }\n }\n }\n // NVIDIA config (nested object)\n if (body.nvidia !== undefined && typeof body.nvidia === 'object') {\n const nv = body.nvidia as Record<string, unknown>;\n const nvCfg = ((draft as Record<string, unknown>).nvidia || {}) as Record<string, unknown>;\n if (nv.enabled !== undefined) nvCfg.enabled = Boolean(nv.enabled);\n if (nv.apiKey !== undefined) nvCfg.apiKey = String(nv.apiKey);\n if (nv.cuopt !== undefined && typeof nv.cuopt === 'object') {\n const cuopt = (nvCfg.cuopt || {}) as Record<string, unknown>;\n const src = nv.cuopt as Record<string, unknown>;\n if (src.enabled !== undefined) cuopt.enabled = Boolean(src.enabled);\n if (src.url !== undefined) cuopt.url = String(src.url);\n nvCfg.cuopt = cuopt;\n }\n if (nv.asr !== undefined && typeof nv.asr === 'object') {\n const asr = (nvCfg.asr || {}) as Record<string, unknown>;\n const src = nv.asr as Record<string, unknown>;\n if (src.enabled !== undefined) asr.enabled = Boolean(src.enabled);\n if (src.grpcUrl !== undefined) asr.grpcUrl = String(src.grpcUrl);\n if (src.healthUrl !== undefined) asr.healthUrl = String(src.healthUrl);\n nvCfg.asr = asr;\n }\n if (nv.openshell !== undefined && typeof nv.openshell === 'object') {\n const os = (nvCfg.openshell || {}) as Record<string, unknown>;\n const src = nv.openshell as Record<string, unknown>;\n if (src.enabled !== undefined) os.enabled = Boolean(src.enabled);\n if (src.binaryPath !== undefined) os.binaryPath = String(src.binaryPath);\n if (src.policyPath !== undefined) os.policyPath = String(src.policyPath);\n nvCfg.openshell = os;\n }\n (draft as Record<string, unknown>).nvidia = nvCfg;\n changedFields.push('nvidia');\n }\n // Organism / SOMA toggle\n if (body.organism !== undefined && typeof body.organism === 'object') {\n const org = body.organism as Record<string, unknown>;\n if (!draft.organism) (draft as Record<string, unknown>).organism = {};\n if (org.enabled !== undefined) draft.organism.enabled = Boolean(org.enabled);\n if (org.hormonesInPrompt !== undefined) draft.organism.hormonesInPrompt = Boolean(org.hormonesInPrompt);\n if (org.pressureThreshold !== undefined) draft.organism.pressureThreshold = Number(org.pressureThreshold);\n if (org.shadowEnabled !== undefined) draft.organism.shadowEnabled = Boolean(org.shadowEnabled);\n if (org.tickIntervalMs !== undefined) draft.organism.tickIntervalMs = Number(org.tickIntervalMs);\n changedFields.push('organism');\n }\n\n // Autonomy toggles (v5.0.2 — Autonomy Settings Panel)\n const handleNestedBool = (section: string, key: string, target: Record<string, unknown>) => {\n const sec = body[section] as Record<string, unknown> | undefined;\n if (sec && key in sec) {\n target[key] = Boolean(sec[key]);\n changedFields.push(`${section}.${key}`);\n }\n };\n if (body.autonomy !== undefined && typeof body.autonomy === 'object') {\n const a = body.autonomy as Record<string, unknown>;\n if (!draft.autonomy) (draft as Record<string, unknown>).autonomy = {};\n const da = draft.autonomy as Record<string, unknown>;\n if (a.mode !== undefined) da.mode = a.mode as 'autonomous' | 'supervised' | 'locked';\n if (a.autoProposeGoals !== undefined) da.autoProposeGoals = Boolean(a.autoProposeGoals);\n if (a.proactiveInitiative !== undefined) da.proactiveInitiative = Boolean(a.proactiveInitiative);\n changedFields.push('autonomy');\n }\n if (body.selfMod !== undefined && typeof body.selfMod === 'object') {\n const s = body.selfMod as Record<string, unknown>;\n if (!draft.selfMod) (draft as Record<string, unknown>).selfMod = {};\n if (s.enabled !== undefined) draft.selfMod.enabled = Boolean(s.enabled);\n if (s.autoPR !== undefined) draft.selfMod.autoPR = Boolean(s.autoPR);\n changedFields.push('selfMod');\n }\n if (body.commandPost !== undefined && typeof body.commandPost === 'object') {\n const cp = body.commandPost as Record<string, unknown>;\n if (!draft.commandPost) (draft as Record<string, unknown>).commandPost = {};\n if (cp.enabled !== undefined) draft.commandPost.enabled = Boolean(cp.enabled);\n changedFields.push('commandPost');\n }\n if (body.mesh !== undefined && typeof body.mesh === 'object') {\n const m = body.mesh as Record<string, unknown>;\n if (!draft.mesh) (draft as Record<string, unknown>).mesh = {};\n if (m.enabled !== undefined) draft.mesh.enabled = Boolean(m.enabled);\n changedFields.push('mesh');\n }\n if (body.autopilot !== undefined && typeof body.autopilot === 'object') {\n const ap = body.autopilot as Record<string, unknown>;\n if (!draft.autopilot) (draft as Record<string, unknown>).autopilot = {};\n if (ap.enabled !== undefined) draft.autopilot.enabled = Boolean(ap.enabled);\n if (ap.goals !== undefined && typeof ap.goals === 'object') {\n const apg = ap.goals as Record<string, unknown>;\n const dag = (draft.autopilot as Record<string, unknown>);\n if (!dag.goals) dag.goals = {};\n if (apg.selfInitiate !== undefined) (dag.goals as Record<string, unknown>).selfInitiate = Boolean(apg.selfInitiate);\n }\n changedFields.push('autopilot');\n }\n if (body.brain !== undefined && typeof body.brain === 'object') {\n const b = body.brain as Record<string, unknown>;\n if (!draft.brain) (draft as Record<string, unknown>).brain = {};\n if (b.enabled !== undefined) draft.brain.enabled = Boolean(b.enabled);\n changedFields.push('brain');\n }\n if (body.mcp !== undefined && typeof body.mcp === 'object') {\n const mcp = body.mcp as Record<string, unknown>;\n if (!draft.mcp) (draft as Record<string, unknown>).mcp = { server: {} };\n if (mcp.server !== undefined && typeof mcp.server === 'object') {\n const srv = mcp.server as Record<string, unknown>;\n const dmcp = (draft.mcp as Record<string, unknown>);\n if (!dmcp.server) dmcp.server = {};\n if (srv.enabled !== undefined) (dmcp.server as Record<string, unknown>).enabled = Boolean(srv.enabled);\n }\n changedFields.push('mcp');\n }\n if (body.training !== undefined && typeof body.training === 'object') {\n const t = body.training as Record<string, unknown>;\n if (!draft.training) (draft as Record<string, unknown>).training = {};\n if (t.enabled !== undefined) draft.training.enabled = Boolean(t.enabled);\n changedFields.push('training');\n }\n if (body.teams !== undefined && typeof body.teams === 'object') {\n const t = body.teams as Record<string, unknown>;\n if (!draft.teams) (draft as Record<string, unknown>).teams = {};\n if (t.enabled !== undefined) draft.teams.enabled = Boolean(t.enabled);\n changedFields.push('teams');\n }\n if (body.tunnel !== undefined && typeof body.tunnel === 'object') {\n const t = body.tunnel as Record<string, unknown>;\n if (!draft.tunnel) (draft as Record<string, unknown>).tunnel = {};\n if (t.enabled !== undefined) draft.tunnel.enabled = Boolean(t.enabled);\n changedFields.push('tunnel');\n }\n if (body.vault !== undefined && typeof body.vault === 'object') {\n const v = body.vault as Record<string, unknown>;\n const dsec = (draft.security as Record<string, unknown>);\n if (!dsec.vault) dsec.vault = {};\n if (v.enabled !== undefined) (dsec.vault as Record<string, unknown>).enabled = Boolean(v.enabled);\n changedFields.push('security.vault');\n }\n if (body.capsolver !== undefined && typeof body.capsolver === 'object') {\n const c = body.capsolver as Record<string, unknown>;\n if (!draft.capsolver) (draft as Record<string, unknown>).capsolver = {};\n if (c.enabled !== undefined) draft.capsolver.enabled = Boolean(c.enabled);\n changedFields.push('capsolver');\n }\n if (body.deliberation !== undefined && typeof body.deliberation === 'object') {\n const d = body.deliberation as Record<string, unknown>;\n if (!draft.deliberation) (draft as Record<string, unknown>).deliberation = {};\n if (d.autoDetect !== undefined) draft.deliberation.autoDetect = Boolean(d.autoDetect);\n changedFields.push('deliberation');\n }\n if (body.selfImprove !== undefined && typeof body.selfImprove === 'object') {\n const si = body.selfImprove as Record<string, unknown>;\n if (!draft.selfImprove) (draft as Record<string, unknown>).selfImprove = {};\n if (si.autoApply !== undefined) draft.selfImprove.autoApply = Boolean(si.autoApply);\n changedFields.push('selfImprove');\n }\n if (body.memory !== undefined && typeof body.memory === 'object') {\n const mem = body.memory as Record<string, unknown>;\n if (!draft.memory) (draft as Record<string, unknown>).memory = {};\n if (mem.vectorSearchEnabled !== undefined) draft.memory.vectorSearchEnabled = Boolean(mem.vectorSearchEnabled);\n changedFields.push('memory');\n }\n\n if (changedFields.length === 0) {\n const validFields = ['model', 'autonomyMode', 'sandboxMode', 'logLevel', 'anthropicKey', 'openaiKey',\n 'googleKey', 'ollamaUrl', 'groqKey', 'mistralKey', 'fireworksKey', 'xaiKey',\n 'togetherKey', 'deepseekKey', 'perplexityKey', 'maxTokens', 'temperature', 'systemPrompt',\n 'shieldEnabled', 'shieldMode', 'deniedTools', 'networkAllowlist', 'gatewayPort', 'gatewayAuthMode',\n 'gatewayPassword', 'gatewayToken', 'channels', 'googleOAuthClientId', 'googleOAuthClientSecret',\n 'homeAssistantUrl', 'homeAssistantToken', 'voice', 'nvidia', 'organism',\n 'autonomy', 'selfMod', 'commandPost', 'mesh', 'autopilot', 'brain', 'mcp',\n 'training', 'teams', 'tunnel', 'vault', 'capsolver', 'deliberation', 'selfImprove', 'memory'];\n res.status(400).json({ error: 'No recognized fields in request body', validFields });\n return;\n }\n // Validation happens inside updateConfig (Zod parse) — draft is only applied if valid\n updateConfig(draft);\n\n // Determine which changed fields require a restart\n const restartFields = changedFields.filter(field =>\n RESTART_REQUIRED_PATTERNS.some(pattern => {\n if (pattern.endsWith('.*')) {\n return field.startsWith(pattern.slice(0, -1));\n }\n return field === pattern;\n })\n );\n\n res.json({ ok: true, restartRequired: restartFields.length > 0, restartFields });\n } catch (e) {\n // Return 400 for Zod validation errors, 500 for unexpected errors\n const isValidationError = (e as Error).name === 'ZodError' || (e as Error).message?.includes('Validation');\n res.status(isValidationError ? 400 : 500).json({ error: (e as Error).message });\n }\n });\n\n // Models endpoint — lists all providers + live Ollama models\n // Model discovery + management endpoints\n app.get('/api/models', async (_req, res) => {\n const cfg = loadConfig();\n const models = await discoverAllModels();\n // Group by provider\n const grouped: Record<string, string[]> = {};\n for (const m of models) {\n if (!grouped[m.provider]) grouped[m.provider] = [];\n grouped[m.provider].push(m.id);\n }\n res.json({\n ...grouped,\n current: cfg.agent.model,\n aliases: getModelAliases(),\n });\n });\n\n // ── Provider Status API ─────────────────────────────────────────\n app.get('/api/providers/status', async (_req, res) => {\n try {\n const { getCircuitBreakerStatus } = await import('../providers/router.js');\n const cbStatus = getCircuitBreakerStatus();\n const health = await healthCheckAll();\n const providers = Object.entries(health).map(([name, healthy]) => ({\n name,\n healthy,\n circuitBreaker: cbStatus[name] || { state: 'unknown', failureCount: 0 },\n }));\n res.json({ providers, count: providers.length });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/providers/:name/reset', async (req, res) => {\n try {\n const { resetCircuitBreaker } = await import('../providers/router.js');\n resetCircuitBreaker(req.params.name);\n res.json({ reset: true, provider: req.params.name });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/models/discover', async (_req, res) => {\n const models = await discoverAllModels(true);\n const cfg = loadConfig();\n res.json({\n models,\n current: cfg.agent.model,\n aliases: getModelAliases(),\n });\n });\n\n app.get('/api/fallback-state', (_req, res) => {\n const state = getFallbackState();\n res.json(state || { active: null });\n });\n\n /**\n * Hunt Finding #25 + #35 (2026-04-14): shared model-id input validator.\n * Used by BOTH /api/model/switch AND /api/config (where `body.model` takes\n * the same path). Returns a validation error string or null if valid.\n */\n function validateModelId(model: unknown): string | null {\n if (typeof model !== 'string' || model.length === 0 || model.length > 200) {\n return 'model must be a non-empty string up to 200 chars';\n }\n if (!/^[a-zA-Z0-9._:\\-/]+$/.test(model)) {\n return 'model contains invalid characters (allowed: alnum, ._:-/)';\n }\n return null;\n }\n\n app.post('/api/model/switch', async (req, res) => {\n try {\n const { model } = req.body as { model?: string };\n if (!model) { res.status(400).json({ error: 'model is required' }); return; }\n const shapeErr = validateModelId(model);\n if (shapeErr) { res.status(400).json({ error: shapeErr }); return; }\n const cfg = loadConfig();\n // Resolve aliases\n const aliases = cfg.agent.modelAliases || {};\n const resolved = aliases[model] || model;\n\n // ── CRITICAL FIX: Validate model exists for ALL providers ──\n const [providerName, ...modelParts] = resolved.split('/');\n const modelName = modelParts.join('/') || resolved; // Handle models with slashes in name\n\n // Hunt Finding #25 (2026-04-14): previously, any providerName that\n // wasn't 'ollama' fell through the `else if (providerName)` branch and\n // was accepted without validation. A POST with model=\"fake/fake-model\"\n // would succeed and write the bogus value to config, bricking the\n // gateway until manually reverted. Validate the provider exists in\n // the registered router before accepting the switch.\n if (providerName && providerName !== 'ollama') {\n const { getProvider } = await import('../providers/router.js');\n if (!getProvider(providerName)) {\n logger.warn(COMPONENT, `[ModelSwitch] Unknown provider '${providerName}' — rejecting`);\n res.status(400).json({\n error: `Unknown provider '${providerName}'. Use /api/models to list available providers and models.`,\n });\n return;\n }\n }\n\n // 1. Ollama local models — check if model is pulled\n if (providerName === 'ollama') {\n const ollamaBase = cfg.providers.ollama?.baseUrl || 'http://localhost:11434';\n // Cloud-routed models (suffix :cloud) are always valid — they proxy through Ollama to external APIs\n if (modelName.endsWith(':cloud')) {\n logger.info(COMPONENT, `[ModelSwitch] Cloud-routed model '${modelName}' — allowing (proxied via Ollama)`);\n } else {\n // Local model: verify it exists in Ollama\n try {\n const check = await fetch(`${ollamaBase}/api/show`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name: modelName }),\n signal: AbortSignal.timeout(5000),\n });\n if (!check.ok) {\n logger.warn(COMPONENT, `[ModelSwitch] Model '${modelName}' not found in Ollama (HTTP ${check.status})`);\n res.status(404).json({ error: `Model '${modelName}' not found in Ollama. Pull it first: ollama pull ${modelName}` });\n return;\n }\n logger.info(COMPONENT, `[ModelSwitch] Verified Ollama model '${modelName}' exists`);\n } catch (err) {\n // CRITICAL FIX: Ollama unreachable — reject the switch instead of allowing it\n logger.error(COMPONENT, `[ModelSwitch] Ollama unreachable at ${ollamaBase}: ${(err as Error).message}`);\n res.status(503).json({\n error: `Cannot verify model '${modelName}' — Ollama is unreachable at ${ollamaBase}. Check Ollama is running: ollama serve`,\n });\n return;\n }\n }\n } else if (providerName) {\n // 2. Other providers — just log the provider (allow the switch)\n // We trust the user to configure API keys; reject only happens at chat time\n logger.info(COMPONENT, `[ModelSwitch] Switching to provider '${providerName.toLowerCase()}' model '${modelName}'`);\n }\n // If no provider prefix (bare model like 'gpt-4o'), assume it's an alias or user knows what they're doing\n\n updateConfig({ agent: { ...cfg.agent, model: resolved } });\n // Invalidate cached responses for the old model so stale results aren't served\n invalidateCacheForModel(cfg.agent.model);\n logger.info(COMPONENT, `Model switched to: ${resolved}${resolved !== model ? ` (alias: ${model})` : ''}`);\n res.json({ success: true, model: resolved, alias: resolved !== model ? model : undefined });\n } catch (err) {\n logger.error(COMPONENT, `[ModelSwitch] Error: ${(err as Error).message}`);\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ─── Model Probe — empirical capabilities discovery ──────────\n // POST /api/model/probe { model: \"ollama/glm-5.1:cloud\" }\n // POST /api/model/probe { models: [\"...\", \"...\"] }\n // GET /api/model/probe — list all probed models\n app.post('/api/model/probe', async (req, res) => {\n try {\n const body = req.body as { model?: string; models?: string[] };\n const targets = body.model ? [body.model] : (body.models || []);\n if (targets.length === 0) {\n res.status(400).json({ error: 'Provide {model: \"id\"} or {models: [\"id1\",\"id2\"]}' });\n return;\n }\n\n const { probeModel } = await import('../agent/modelProbe.js');\n const { recordProbeResult } = await import('../agent/capabilitiesRegistry.js');\n\n const results = [];\n for (const modelId of targets) {\n try {\n const result = await probeModel(modelId);\n recordProbeResult(result);\n results.push(result);\n } catch (err) {\n results.push({ model: modelId, error: (err as Error).message });\n }\n }\n res.json({ probed: results.length, results });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/model/probe', async (_req, res) => {\n try {\n const { loadRegistry } = await import('../agent/capabilitiesRegistry.js');\n const registry = loadRegistry();\n res.json({\n updatedAt: registry.updatedAt,\n count: Object.keys(registry.models).length,\n models: registry.models,\n });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Profile endpoints\n app.get('/api/profile', (_req, res) => {\n const profile = loadProfile();\n res.json({\n name: profile.name || '',\n technicalLevel: profile.technicalLevel || 'unknown',\n projectCount: profile.projects.length,\n goalCount: profile.goals.length,\n });\n });\n\n app.post('/api/profile', (req, res) => {\n try {\n const { name, technicalLevel } = req.body as { name?: string; technicalLevel?: string };\n const profile = loadProfile();\n if (name !== undefined) profile.name = name;\n if (technicalLevel !== undefined) profile.technicalLevel = technicalLevel as PersonalProfile['technicalLevel'];\n saveProfile(profile);\n res.json({ ok: true });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // Learning stats endpoint\n app.get('/api/learning', (_req, res) => {\n res.json(getLearningStats());\n });\n\n app.get('/api/learning/stats', (_req, res) => {\n res.json(getLearningStats());\n });\n\n // Live log tail endpoint\n app.get('/api/logs', (req, res) => {\n try {\n const logPath = getLogFilePath();\n if (!logPath || !fs.existsSync(logPath)) {\n res.json({ lines: [] });\n return;\n }\n const lineCount = req.query.lines ? parseInt(req.query.lines as string, 10) : 200;\n // Read only the last portion of the file\n const stats = fs.statSync(logPath);\n const readSize = Math.min(stats.size, 100000); // Read last 100KB max\n const fd = fs.openSync(logPath, 'r');\n const buf = Buffer.alloc(readSize);\n fs.readSync(fd, buf, 0, readSize, Math.max(0, stats.size - readSize));\n fs.closeSync(fd);\n const content = buf.toString('utf-8');\n const all = content.split('\\n').filter(Boolean);\n // If we started mid-line, drop the first partial line\n const lines = stats.size > readSize ? all.slice(1) : all;\n const tail = lines.slice(-Math.max(1, lineCount));\n // S6: Sanitize logs — strip potential secrets before returning\n const sanitized = tail.map(line =>\n line\n .replace(/Authorization:\\s*Bearer\\s+\\S+/gi, 'Authorization: Bearer [REDACTED]')\n .replace(/token[=:]\\s*[\"']?\\w{20,}[\"']?/gi, 'token=[REDACTED]')\n .replace(/api[_-]?key[=:]\\s*[\"']?\\w{10,}[\"']?/gi, 'api_key=[REDACTED]')\n .replace(/password[=:]\\s*[\"']?[^\\s\"',]+[\"']?/gi, 'password=[REDACTED]')\n .replace(/secret[=:]\\s*[\"']?\\w{10,}[\"']?/gi, 'secret=[REDACTED]')\n );\n res.json({ lines: sanitized });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Mesh Networking Endpoints ─────────────────────────────────\n app.get('/api/mesh/hello', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.json({ titan: false, enabled: false }); return; }\n const { getOrCreateNodeId } = await import('../mesh/identity.js');\n const { getActiveRemoteTaskCount } = await import('../mesh/transport.js');\n const { discoverAllModels: discoverModels } = await import('../providers/router.js');\n const models = await discoverModels();\n const { listAgents: meshListAgents } = await import('../agent/multiAgent.js');\n const cpuLoad = getCpuLoad();\n const activeTasks = getActiveRemoteTaskCount();\n // Load score: 0.0 (idle) to 1.0 (maxed). Blend CPU + task saturation.\n const taskLoad = activeTasks / Math.max(cfg.mesh.maxRemoteTasks, 1);\n const load = Math.min(1, cpuLoad * 0.4 + taskLoad * 0.6);\n res.json({\n titan: true,\n nodeId: getOrCreateNodeId(),\n version: TITAN_VERSION,\n models: models.map(m => m.id),\n agentCount: meshListAgents().length,\n load: Math.round(load * 100) / 100,\n });\n });\n\n app.get('/api/mesh/peers', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.json({ peers: [], enabled: false }); return; }\n const { getPeers } = await import('../mesh/discovery.js');\n res.json({ peers: getPeers(), enabled: true });\n });\n\n app.get('/api/mesh/models', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.json({ models: [] }); return; }\n const { getMeshModels } = await import('../mesh/registry.js');\n res.json({ models: getMeshModels() });\n });\n\n app.get('/api/mesh/pending', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.json({ pending: [], enabled: false }); return; }\n const { getPendingPeers } = await import('../mesh/discovery.js');\n res.json({ pending: getPendingPeers(), enabled: true });\n });\n\n app.post('/api/mesh/approve/:nodeId', async (req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.status(400).json({ error: 'Mesh not enabled' }); return; }\n const { approvePeer } = await import('../mesh/discovery.js');\n const peer = approvePeer(req.params.nodeId);\n if (peer) {\n broadcast({ type: 'mesh_peer_approved', peer });\n res.json({ approved: true, peer });\n } else {\n res.status(404).json({ error: 'Peer not found in pending list or at max capacity' });\n }\n });\n\n app.post('/api/mesh/reject/:nodeId', async (req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.status(400).json({ error: 'Mesh not enabled' }); return; }\n const { rejectPeer } = await import('../mesh/discovery.js');\n const rejected = rejectPeer(req.params.nodeId);\n res.json({ rejected });\n });\n\n app.post('/api/mesh/revoke/:nodeId', async (req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.status(400).json({ error: 'Mesh not enabled' }); return; }\n const { revokePeer } = await import('../mesh/discovery.js');\n const revoked = revokePeer(req.params.nodeId);\n if (revoked) {\n broadcast({ type: 'mesh_peer_revoked', nodeId: req.params.nodeId });\n }\n res.json({ revoked });\n });\n\n // ── Mesh Health / Status Endpoint ─────────────────────────────\n app.get('/api/mesh/status', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.json({ enabled: false, status: 'disabled' }); return; }\n\n const { getOrCreateNodeId } = await import('../mesh/identity.js');\n const { getPeers, getPendingPeers } = await import('../mesh/discovery.js');\n const { getConnectedPeerCount } = await import('../mesh/transport.js');\n const { getOrCreateNodeId: localNodeId } = await import('../mesh/identity.js');\n\n const nodeId = getOrCreateNodeId();\n const approvedPeers = getPeers();\n const pendingPeers = getPendingPeers();\n const connectedCount = getConnectedPeerCount();\n const connectedPeerIds = new Set<string>();\n\n // Collect per-peer connection detail from approved list + transport\n const peerDetails = approvedPeers.map(p => {\n const isConnected = p.lastSeen > Date.now() - 10_000; // Consider connected if seen in last 10s\n if (isConnected) connectedPeerIds.add(p.nodeId);\n return {\n nodeId: p.nodeId,\n hostname: p.hostname,\n address: p.address,\n port: p.port,\n discoveredVia: p.discoveredVia,\n lastSeen: p.lastSeen,\n models: p.models,\n agentCount: p.agentCount,\n load: p.load,\n isConnected,\n };\n });\n\n // Composite health score\n const totalApproved = approvedPeers.length;\n const unreachableCount = totalApproved - connectedCount;\n const healthScore = totalApproved > 0\n ? Math.round(((totalApproved - unreachableCount) / totalApproved) * 100) / 100\n : 1.0;\n\n // Discovery mode detection\n const discoveryModes: string[] = [];\n if (cfg.mesh.mdns) discoveryModes.push('mdns');\n if (cfg.mesh.tailscale) discoveryModes.push('tailscale');\n if ((cfg.mesh.staticPeers || []).length > 0) discoveryModes.push('manual');\n\n const status = unreachableCount === 0 && totalApproved > 0\n ? 'healthy'\n : unreachableCount > 0 && connectedCount > 0\n ? 'degraded'\n : totalApproved === 0\n ? 'empty'\n : 'unreachable';\n\n res.json({\n enabled: true,\n status,\n nodeId,\n discoveryModes,\n peers: {\n total: totalApproved,\n connected: connectedCount,\n unreachable: unreachableCount,\n pending: pendingPeers.length,\n },\n peerDetails,\n healthScore,\n maxPeers: cfg.mesh.maxPeers,\n autoApprove: cfg.mesh.autoApprove,\n });\n });\n\n // ── Mesh Routes Endpoint ───────────────────────────────────────\n app.get('/api/mesh/routes', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.mesh.enabled) { res.json({ enabled: false, routes: [] }); return; }\n const { getRoutingTable } = await import('../mesh/transport.js');\n res.json({ routes: getRoutingTable() });\n });\n\n // ── Teams RBAC API ─────────────────────────────────────────────\n\n app.get('/api/teams', (_req, res) => {\n res.json({ teams: listTeams().map(t => ({ id: t.id, name: t.name, description: t.description, memberCount: t.members.filter(m => m.status === 'active').length, createdAt: t.createdAt })) });\n });\n\n app.post('/api/teams', (req, res) => {\n try {\n const { name, description, ownerId = 'api-user' } = req.body;\n if (!name) { res.status(400).json({ error: 'name is required' }); return; }\n const team = createTeam(name, ownerId, description);\n res.status(201).json({ team: { id: team.id, name: team.name } });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.get('/api/teams/:teamId', (req, res) => {\n const team = getTeam(req.params.teamId);\n if (!team) { res.status(404).json({ error: 'Team not found' }); return; }\n res.json({ team, stats: getTeamStats(req.params.teamId) });\n });\n\n app.patch('/api/teams/:teamId', (req, res) => {\n try {\n const { name, description, actorId = 'api-user' } = req.body;\n const team = updateTeam(req.params.teamId, actorId, { name, description });\n res.json({ team: { id: team.id, name: team.name, description: team.description } });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.delete('/api/teams/:teamId', (req, res) => {\n try {\n const actorId = (req.query.actorId as string) || 'api-user';\n const deleted = deleteTeam(req.params.teamId, actorId);\n res.json({ deleted });\n } catch (e) { res.status(403).json({ error: (e as Error).message }); }\n });\n\n app.get('/api/teams/:teamId/members', (req, res) => {\n const team = getTeam(req.params.teamId);\n if (!team) { res.status(404).json({ error: 'Team not found' }); return; }\n res.json({ members: team.members });\n });\n\n app.post('/api/teams/:teamId/members', (req, res) => {\n try {\n const { userId, role = 'operator', displayName, actorId = 'api-user' } = req.body;\n if (!userId) { res.status(400).json({ error: 'userId is required' }); return; }\n const member = addMember(req.params.teamId, actorId, userId, role, displayName);\n res.status(201).json({ member });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.delete('/api/teams/:teamId/members/:userId', (req, res) => {\n try {\n const actorId = (req.query.actorId as string) || 'api-user';\n const removed = removeMember(req.params.teamId, actorId, req.params.userId);\n res.json({ removed });\n } catch (e) { res.status(403).json({ error: (e as Error).message }); }\n });\n\n app.patch('/api/teams/:teamId/members/:userId/role', (req, res) => {\n try {\n const { role, actorId = 'api-user' } = req.body;\n if (!role) { res.status(400).json({ error: 'role is required' }); return; }\n const member = updateMemberRole(req.params.teamId, actorId, req.params.userId, role);\n res.json({ member });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.post('/api/teams/:teamId/invites', (req, res) => {\n try {\n const { role = 'operator', expiresInHours = 48, actorId = 'api-user' } = req.body;\n const code = createInvite(req.params.teamId, actorId, role, expiresInHours);\n res.status(201).json({ code, expiresInHours });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.post('/api/teams/join', (req, res) => {\n try {\n const { code, userId, displayName } = req.body;\n if (!code || !userId) { res.status(400).json({ error: 'code and userId are required' }); return; }\n const result = acceptInvite(code, userId, displayName);\n res.json({ teamId: result.team.id, teamName: result.team.name, role: result.member.role });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.get('/api/teams/:teamId/permissions/:userId', (req, res) => {\n const perms = getEffectivePermissions(req.params.teamId, req.params.userId);\n const role = getUserRole(req.params.teamId, req.params.userId);\n res.json({ role, permissions: perms });\n });\n\n app.put('/api/teams/:teamId/roles/:role/permissions', (req, res) => {\n try {\n const { actorId = 'api-user', ...perms } = req.body;\n setRolePermissions(req.params.teamId, actorId, req.params.role as 'admin' | 'operator' | 'viewer', perms);\n res.json({ updated: true });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n app.get('/api/teams/:teamId/tools/:toolName/check/:userId', (req, res) => {\n const allowed = isToolAllowed(req.params.teamId, req.params.userId, req.params.toolName);\n res.json({ allowed, tool: req.params.toolName, userId: req.params.userId });\n });\n\n // ── Recipes / Workflow API ──────────────────────────────────────\n\n app.get('/api/recipes', (_req, res) => {\n res.json({ recipes: listRecipes() });\n });\n\n app.get('/api/recipes/:id', (req, res) => {\n const recipe = getRecipe(req.params.id);\n if (!recipe) { res.status(404).json({ error: 'Recipe not found' }); return; }\n res.json({ recipe });\n });\n\n app.post('/api/recipes', (req, res) => {\n const recipe = req.body;\n if (!recipe.id || !recipe.name || !recipe.steps) {\n res.status(400).json({ error: 'id, name, and steps are required' }); return;\n }\n if (!recipe.createdAt) recipe.createdAt = new Date().toISOString();\n saveRecipe(recipe);\n res.status(201).json({ recipe });\n });\n\n app.put('/api/recipes/:id', (req, res) => {\n const existing = getRecipe(req.params.id);\n if (!existing) { res.status(404).json({ error: 'Recipe not found' }); return; }\n const updated = { ...existing, ...req.body, id: req.params.id };\n saveRecipe(updated);\n res.json({ recipe: updated });\n });\n\n app.delete('/api/recipes/:id', (req, res) => {\n if (!getRecipe(req.params.id)) { res.status(404).json({ error: 'Recipe not found' }); return; }\n deleteRecipe(req.params.id);\n res.json({ deleted: true });\n });\n\n app.get('/api/recipes/builtin/templates', (_req, res) => {\n res.json({ templates: getBuiltinRecipes() });\n });\n\n app.post('/api/recipes/import', express.text({ type: 'text/*' }), (req, res) => {\n try {\n const recipe = importRecipeYaml(req.body);\n saveRecipe(recipe);\n res.status(201).json({ recipe });\n } catch (e) { res.status(400).json({ error: (e as Error).message }); }\n });\n\n // ── Plugins API ────────────────────────────────────────────────\n app.get('/api/plugins', async (_req, res) => {\n const { getPlugins } = await import('../plugins/registry.js');\n const plugins = getPlugins().map((p: { name: string; version: string }) => ({\n name: p.name,\n version: p.version,\n }));\n res.json({ plugins });\n });\n\n // Native Memory Graph endpoint (replaces Neo4j/Graphiti)\n app.get('/api/graphiti', (_req, res) => {\n try {\n const { nodes, edges } = getGraphData();\n const { episodeCount } = getGraphStats();\n res.json({\n graphReady: true,\n episodeCount,\n nodeCount: nodes.length,\n edgeCount: edges.length,\n nodes,\n edges,\n });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/graph/entities', (req, res) => {\n try {\n const q = (req.query.q as string) || '';\n const type = (req.query.type as string) || undefined;\n const entities = listEntities(type);\n const filtered = q\n ? entities.filter(e => e.name.toLowerCase().includes(q.toLowerCase()) || (e.type || '').toLowerCase().includes(q.toLowerCase()))\n : entities;\n res.json(filtered);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // Clear memory graph\n app.delete('/api/graphiti', (_req, res) => {\n try {\n clearGraph();\n logger.info(COMPONENT, 'Memory graph cleared via API');\n res.json({ success: true, message: 'Graph cleared' });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/graphiti/cleanup', (_req, res) => {\n try {\n const result = cleanupGraph();\n logger.info(COMPONENT, `Graph cleanup: removed ${result.removedEntities} entities, ${result.removedEdges} edges`);\n res.json({ success: true, ...result });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // Memory Wiki API — browseable knowledge base\n app.get('/api/wiki/entities', (req, res) => {\n try {\n const type = req.query.type as string | undefined;\n const q = req.query.q as string | undefined;\n let entities = listEntities(type || undefined);\n if (q) {\n const query = q.toLowerCase();\n entities = entities.filter(e =>\n e.name.toLowerCase().includes(query) ||\n e.facts.some(f => f.toLowerCase().includes(query)) ||\n (e.summary || '').toLowerCase().includes(query)\n );\n }\n res.json(entities.map(e => ({\n id: e.id,\n name: e.name,\n type: e.type,\n summary: e.summary,\n factCount: e.facts.length,\n aliases: e.aliases,\n firstSeen: e.firstSeen,\n lastSeen: e.lastSeen,\n })));\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/wiki/entity/:name', (req, res) => {\n try {\n const entity = getEntity(decodeURIComponent(req.params.name));\n if (!entity) { res.status(404).json({ error: 'Entity not found' }); return; }\n // Get related entities via edges\n const graphData = getGraphData();\n const relatedEdges = graphData.edges.filter(e => e.from === entity.id || e.to === entity.id);\n const relatedIds = new Set(relatedEdges.map(e => e.from === entity.id ? e.to : e.from));\n const related = graphData.nodes.filter(n => relatedIds.has(n.id)).map(n => ({\n id: n.id,\n name: n.label,\n type: n.type,\n relation: relatedEdges.find(e => (e.from === entity.id && e.to === n.id) || (e.to === entity.id && e.from === n.id))?.label || 'co_mentioned',\n }));\n // Get episodes\n const episodes = getEntityEpisodes(entity.id, 20).map(ep => ({\n id: ep.id,\n content: ep.content.slice(0, 300),\n source: ep.source,\n createdAt: ep.createdAt,\n }));\n res.json({ ...entity, related, episodes });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // Agent Templates (marketplace)\n app.get('/api/agent-templates', async (_req, res) => {\n try {\n const { listTemplates, BUILTIN_TEMPLATES } = await import('../skills/agentTemplates.js');\n const installed = listTemplates();\n res.json({ builtin: BUILTIN_TEMPLATES, installed });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/agent-templates', async (req, res) => {\n try {\n const { saveTemplate } = await import('../skills/agentTemplates.js');\n saveTemplate(req.body);\n res.json({ success: true });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // Training data (RL trajectory capture)\n app.get('/api/training/stats', async (_req, res) => {\n try {\n const { getTrainingStats } = await import('../agent/trajectoryCapture.js');\n res.json(getTrainingStats());\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/training/export', async (_req, res) => {\n try {\n const { exportTrainingData } = await import('../agent/trajectoryCapture.js');\n res.setHeader('Content-Type', 'application/jsonl');\n res.setHeader('Content-Disposition', 'attachment; filename=\"titan-training-data.jsonl\"');\n res.send(exportTrainingData());\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // Dreaming memory (sleep-cycle consolidation)\n app.get('/api/dreaming/status', async (_req, res) => {\n try {\n const { getDreamingStatus } = await import('../memory/dreaming.js');\n res.json(getDreamingStatus());\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/dreaming/run', async (_req, res) => {\n try {\n const { runConsolidation } = await import('../memory/dreaming.js');\n const result = await runConsolidation();\n res.json({ success: true, ...result });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/dreaming/history', async (_req, res) => {\n try {\n const { getConsolidationHistory } = await import('../memory/dreaming.js');\n res.json(getConsolidationHistory());\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // Backup system\n app.post('/api/backup/create', async (_req, res) => {\n try {\n const { createBackup } = await import('../storage/backup.js');\n const info = await createBackup();\n res.json({ success: true, ...info });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.get('/api/backup/list', async (_req, res) => {\n try {\n const { listBackups } = await import('../storage/backup.js');\n res.json({ backups: listBackups() });\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n app.post('/api/backup/verify', async (req, res) => {\n try {\n const { verifyBackup, listBackups } = await import('../storage/backup.js');\n const path = req.body?.path || listBackups()[0]?.path;\n if (!path) { res.status(400).json({ error: 'No backup path specified and no backups found' }); return; }\n const result = await verifyBackup(path);\n res.json(result);\n } catch (e) { logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' }); }\n });\n\n // Full data reset (graph + knowledge + titan-data)\n app.delete('/api/data', (_req, res) => {\n try {\n const titanHome = join(homedir(), '.titan');\n const files = ['graph.json', 'knowledge.json', 'titan-data.json'];\n const deleted: string[] = [];\n for (const f of files) {\n const p = join(titanHome, f);\n if (fs.existsSync(p)) {\n fs.unlinkSync(p);\n deleted.push(f);\n }\n }\n clearGraph();\n logger.info(COMPONENT, `Full data reset via API: deleted ${deleted.join(', ') || 'none'}`);\n res.json({ success: true, message: `Deleted: ${deleted.join(', ') || 'none'}. Restart recommended.` });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Autopilot ───────────────────────────────────────────────\n app.get('/api/autopilot/status', (_req, res) => {\n res.json(getAutopilotStatus());\n });\n\n app.get('/api/autopilot/history', (req, res) => {\n const limit = parseInt(req.query.limit as string, 10) || 30;\n res.json(getRunHistory(limit));\n });\n\n app.post('/api/autopilot/run', async (req, res) => {\n try {\n const dryRun = typeof req.body?.dryRun === 'boolean' ? req.body.dryRun : undefined;\n const result = await runAutopilotNow({ dryRun });\n res.json(result);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/autopilot/toggle', (req, res) => {\n try {\n const cfg = loadConfig();\n const enable = typeof req.body.enabled === 'boolean' ? req.body.enabled : !cfg.autopilot.enabled;\n const dryRun = typeof req.body.dryRun === 'boolean' ? req.body.dryRun : undefined;\n\n cfg.autopilot.enabled = enable;\n if (typeof dryRun === 'boolean') {\n (cfg.autopilot as Record<string, unknown>).dryRun = dryRun;\n setAutopilotDryRun(dryRun);\n }\n\n if (enable) {\n initAutopilot(cfg);\n } else {\n stopAutopilot();\n }\n const status = getAutopilotStatus();\n res.json({ enabled: enable, dryRun: status.dryRun });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Goals API ─────────────────────────────────────────────\n\n app.get('/api/goals', (_req, res) => {\n res.json({ goals: listGoals() });\n });\n\n app.post('/api/goals', (req, res) => {\n const { title, description, subtasks, priority, tags, force } = req.body;\n if (!title) { res.status(400).json({ error: 'title is required' }); return; }\n try {\n const goal = createGoal({\n title,\n description: description || '',\n subtasks: subtasks || [],\n priority,\n tags,\n force: !!force,\n });\n res.status(201).json({ goal });\n } catch (err) {\n res.status(429).json({ error: (err as Error).message });\n }\n });\n\n // Alias for Command Post UI compatibility\n app.post('/api/command-post/goals', (req, res) => {\n const { title, description, subtasks, priority, tags, force } = req.body;\n if (!title) { res.status(400).json({ error: 'title is required' }); return; }\n try {\n const goal = createGoal({\n title,\n description: description || '',\n subtasks: subtasks || [],\n priority,\n tags,\n force: !!force,\n });\n res.status(201).json({ goal });\n } catch (err) {\n res.status(429).json({ error: (err as Error).message });\n }\n });\n\n // v5.0.0: Bulk dedupe endpoint for cleaning up runaway duplicate goals\n app.post('/api/goals/dedupe', (_req, res) => {\n const result = dedupeGoalsBulk();\n res.status(200).json({ success: true, ...result });\n });\n\n app.get('/api/goals/:id', (req, res) => {\n const goal = getGoal(req.params.id);\n if (!goal) { res.status(404).json({ error: 'Goal not found' }); return; }\n res.json({ goal });\n });\n\n app.delete('/api/goals/:id', (req, res) => {\n const deleted = deleteGoal(req.params.id);\n if (!deleted) { res.status(404).json({ error: 'Goal not found' }); return; }\n res.json({ deleted: true });\n });\n\n // v4.3.1: update a goal's top-level fields (status, priority, title, description, etc.).\n // Previously the only way to pause a stuck goal was to hand-edit ~/.titan/goals.json and\n // restart the gateway — which is what we did on Titan PC to clear 3 failed Upwork goals.\n // This endpoint closes that gap so the UI \"pause\" action works end-to-end.\n app.patch('/api/goals/:id', (req, res) => {\n const updated = updateGoal(req.params.id, req.body || {});\n if (!updated) { res.status(404).json({ error: 'Goal not found' }); return; }\n res.json({ goal: updated });\n });\n\n app.post('/api/goals/:id/subtasks', (req, res) => {\n const { title, description } = req.body;\n if (!title) { res.status(400).json({ error: 'title is required' }); return; }\n const subtask = addSubtask(req.params.id, title, description || '');\n if (!subtask) { res.status(404).json({ error: 'Goal not found' }); return; }\n res.status(201).json({ subtask });\n });\n\n app.post('/api/goals/:id/subtasks/:sid/complete', (req, res) => {\n const ok = completeSubtask(req.params.id, req.params.sid, req.body.result || 'Completed via UI');\n if (!ok) { res.status(404).json({ error: 'Goal or subtask not found' }); return; }\n res.json({ completed: true });\n });\n\n // v4.1: retry a failed subtask — resets status, clears error, zeros retries.\n app.post('/api/goals/:id/subtasks/:sid/retry', async (req, res) => {\n const { retrySubtask } = await import('../agent/goals.js');\n const ok = retrySubtask(req.params.id, req.params.sid);\n if (!ok) { res.status(404).json({ error: 'Goal or subtask not found' }); return; }\n res.json({ retried: true });\n });\n\n // v4.1: edit a subtask's title/description.\n app.patch('/api/goals/:id/subtasks/:sid', async (req, res) => {\n const { updateSubtask } = await import('../agent/goals.js');\n const { title, description } = req.body || {};\n const ok = updateSubtask(req.params.id, req.params.sid, { title, description });\n if (!ok) { res.status(404).json({ error: 'Goal or subtask not found' }); return; }\n res.json({ updated: true });\n });\n\n // ── Daemon API ────────────────────────────────────────────\n\n app.get('/api/daemon/status', (_req, res) => {\n res.json(getDaemonStatus());\n });\n\n app.post('/api/daemon/stop', (_req, res) => {\n pauseDaemonManual();\n res.json({ paused: true });\n });\n\n app.post('/api/daemon/resume', (_req, res) => {\n resumeDaemon();\n res.json({ resumed: true });\n });\n\n app.get('/api/daemon/stream', (req, res) => {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n\n const onEvent = (event: string, data: unknown) => {\n try { res.write(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`); } catch { /* client gone */ }\n };\n\n const events = DAEMON_SSE_EVENTS;\n\n // Store per-client listener references so we only remove THIS client's listeners on disconnect\n const listeners = new Map<string, (data: unknown) => void>();\n for (const evt of events) {\n const handler = (data: unknown) => onEvent(evt, data);\n listeners.set(evt, handler);\n titanEvents.on(evt, handler);\n }\n\n const keepalive = setInterval(() => {\n try { res.write(': keepalive\\n\\n'); } catch { /* client gone */ }\n }, 15_000);\n\n req.on('close', () => {\n clearInterval(keepalive);\n for (const [evt, handler] of listeners) {\n titanEvents.removeListener(evt, handler);\n }\n });\n });\n\n // ── Social Media API ──────────────────────────────────────\n\n app.get('/api/social/state', async (_req, res) => {\n try {\n const { loadConfig } = await import('../config/config.js');\n const { loadState, resetDailyCounters, CONTENT_ROTATION } = await import('../skills/builtin/fb_autopilot.js');\n const { loadQueue } = await import('../skills/builtin/facebook.js');\n const { getEpisodesBySource } = await import('../memory/graph.js');\n const config = loadConfig();\n const fbConfig = (config as Record<string, unknown>).facebook as Record<string, unknown> | undefined;\n const state = loadState();\n resetDailyCounters(state);\n const queue = loadQueue();\n const pending = queue.posts.filter(p => p.status === 'pending');\n // Enrich recentPosts with Graphiti content when state file lacks it\n const graphPosts = getEpisodesBySource(['facebook_post', 'facebook_autopilot'], 20);\n const recentPosts = state.postHistory.slice(-20).reverse().map(h => {\n if (h.content) return h;\n // Try to find matching content in Graphiti by date proximity\n const match = graphPosts.find(g => g.createdAt.slice(0, 16) === h.date.slice(0, 16));\n return { ...h, content: match ? match.content : undefined };\n });\n res.json({\n autopilot: {\n enabled: fbConfig?.autopilotEnabled !== false,\n postsToday: state.postsToday,\n maxPostsPerDay: Number(fbConfig?.maxPostsPerDay ?? 6),\n repliesToday: state.repliesToday,\n lastPostAt: state.lastPostAt,\n nextContentType: CONTENT_ROTATION[state.contentIndex % CONTENT_ROTATION.length],\n },\n queue: pending,\n recentPosts,\n });\n } catch (e) {\n logger.error(COMPONENT, `Social state error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Failed to load social state' });\n }\n });\n\n app.post('/api/social/autopilot/toggle', async (req, res) => {\n try {\n const { loadConfig, updateConfig } = await import('../config/config.js');\n const config = loadConfig();\n const enabled = !!(req.body as Record<string, unknown>).enabled;\n const fb = { ...((config as Record<string, unknown>).facebook as Record<string, unknown> || {}), autopilotEnabled: enabled } as Record<string, unknown>;\n updateConfig({ facebook: fb } as Partial<typeof config>);\n res.json({ enabled });\n } catch (e) {\n logger.error(COMPONENT, `Social toggle error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Failed to toggle autopilot' });\n }\n });\n\n app.post('/api/social/post', async (req, res) => {\n try {\n const { postToPage } = await import('../skills/builtin/facebook.js');\n const content = String((req.body as Record<string, unknown>).content || '');\n if (!content || content.length < 5) { res.status(400).json({ error: 'Content too short' }); return; }\n const result = await postToPage(content, { source: 'manual:api' });\n if (result.success) {\n res.json({ success: true, postId: result.postId });\n } else if (result.skipped) {\n res.status(409).json({ success: false, skipped: result.skipped });\n } else {\n res.status(500).json({ success: false, error: result.error });\n }\n } catch (e) {\n logger.error(COMPONENT, `Social post error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Failed to post' });\n }\n });\n\n app.post('/api/social/drafts/:id/approve', async (req, res) => {\n try {\n const { loadQueue, saveQueue, postToPage, hasApiAccess } = await import('../skills/builtin/facebook.js') as any;\n const queue = loadQueue();\n const post = queue.posts.find((p: { id: string }) => p.id === req.params.id);\n if (!post) { res.status(404).json({ error: 'Draft not found' }); return; }\n if (post.status !== 'pending') { res.status(409).json({ error: `Already ${post.status}` }); return; }\n if (hasApiAccess()) {\n const result = await postToPage(post.content, { source: 'queue:approved' });\n if (result.success) {\n post.status = 'posted';\n post.postedAt = new Date().toISOString();\n post.fbPostId = result.postId;\n } else {\n res.status(500).json({ error: result.error || 'Post failed' });\n return;\n }\n } else {\n post.status = 'approved';\n }\n saveQueue(queue);\n res.json({ success: true, status: post.status, postId: post.fbPostId });\n } catch (e) {\n logger.error(COMPONENT, `Draft approve error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Failed to approve draft' });\n }\n });\n\n app.post('/api/social/drafts/:id/reject', async (req, res) => {\n try {\n const { loadQueue, saveQueue } = await import('../skills/builtin/facebook.js');\n const queue = loadQueue();\n const post = queue.posts.find(p => p.id === req.params.id);\n if (!post) { res.status(404).json({ error: 'Draft not found' }); return; }\n post.status = 'rejected';\n saveQueue(queue);\n res.json({ success: true });\n } catch (e) {\n logger.error(COMPONENT, `Draft reject error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Failed to reject draft' });\n }\n });\n\n app.get('/api/social/graph-context', async (_req, res) => {\n try {\n const { getEpisodesBySource } = await import('../memory/graph.js');\n const recentPosts = getEpisodesBySource(['facebook_post', 'facebook_autopilot'], 5);\n const topics = recentPosts.map(ep => ({\n content: ep.content.slice(0, 200),\n date: ep.createdAt,\n entities: ep.entities,\n }));\n res.json({ recentTopics: topics });\n } catch (e) {\n logger.error(COMPONENT, `Social graph context error: ${(e as Error).message}`);\n res.status(500).json({ error: 'Failed to load graph context' });\n }\n });\n\n // ── Watch stream — unified human-readable event firehose (v4.5.0)\n // Fuses every meaningful event across TITAN into a single SSE feed\n // with plain-English captions. Used by the /watch Pane UI.\n app.get('/api/watch/stream', async (req, res) => {\n const { humanize } = await import('../watch/humanize.js');\n\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n\n // Every event topic the Pane cares about — union of drive ticks,\n // soma proposals, tool calls, goals, initiative, command-post, health,\n // multi-agent, alerts. Matches src/watch/humanize.ts dictionary.\n const topics = PANE_SSE_TOPICS;\n\n const send = (data: unknown) => {\n try { res.write(`data: ${JSON.stringify(data)}\\n\\n`); } catch { /* client gone */ }\n };\n\n // Initial snapshot — read drive state + recent goals so the UI has\n // something to render before the first live event arrives.\n try {\n const driveStatePath = join(homedir(), '.titan', 'drive-state.json');\n if (fs.existsSync(driveStatePath)) {\n const raw = JSON.parse(fs.readFileSync(driveStatePath, 'utf-8'));\n const latest = raw.latest as { timestamp?: string; drives?: unknown[]; totalPressure?: number; dominantDrives?: string[] } | undefined;\n if (latest) {\n send({\n type: 'snapshot',\n drives: latest.drives || [],\n totalPressure: latest.totalPressure || 0,\n dominantDrives: latest.dominantDrives || [],\n timestamp: latest.timestamp ? new Date(latest.timestamp).getTime() : Date.now(),\n });\n }\n }\n } catch { /* snapshot best-effort */ }\n\n // Wire live event listeners\n const listeners = new Map<string, (data: unknown) => void>();\n for (const topic of topics) {\n const handler = (payload: unknown) => {\n const event = humanize(topic, (payload as Record<string, unknown>) || {});\n if (event) send({ type: \"event\", ...event });\n };\n listeners.set(topic, handler);\n titanEvents.on(topic, handler);\n }\n\n const keepalive = setInterval(() => {\n try { res.write(': keepalive\\n\\n'); } catch { /* gone */ }\n }, 15_000);\n\n req.on('close', () => {\n clearInterval(keepalive);\n for (const [topic, handler] of listeners) {\n titanEvents.removeListener(topic, handler);\n }\n });\n });\n\n // Snapshot endpoint — returns current drive state + active goal +\n // last N events from a small ring buffer we maintain in-process.\n // Used by the Pane on first load to populate zones without waiting\n // for the next tick.\n app.get('/api/watch/snapshot', (_req, res) => {\n try {\n const driveStatePath = join(homedir(), '.titan', 'drive-state.json');\n const goalsPath = join(homedir(), '.titan', 'goals.json');\n const driveState = fs.existsSync(driveStatePath)\n ? JSON.parse(fs.readFileSync(driveStatePath, 'utf-8'))?.latest\n : null;\n const goalsRaw = fs.existsSync(goalsPath)\n ? JSON.parse(fs.readFileSync(goalsPath, 'utf-8'))\n : {};\n const allGoals = Array.isArray(goalsRaw) ? goalsRaw : Object.values(goalsRaw);\n const activeGoals = (allGoals as Array<Record<string, unknown>>).filter(g => g.status === 'active');\n res.json({\n drives: driveState?.drives || [],\n totalPressure: driveState?.totalPressure || 0,\n dominantDrives: driveState?.dominantDrives || [],\n activeGoals: activeGoals.slice(0, 5).map(g => ({\n id: g.id,\n title: g.title,\n progress: g.progress || 0,\n createdAt: g.createdAt,\n })),\n timestamp: Date.now(),\n });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Command Post API (Agent Governance) ───────────────────\n\n app.get('/api/command-post/dashboard', async (_req, res) => {\n const dashboard = getCPDashboard();\n // Inject companies into dashboard\n try {\n const { listCompanies, getActiveRunners } = await import('../agent/company.js');\n const companies = listCompanies();\n const runners = getActiveRunners();\n (dashboard as Record<string, unknown>).companies = companies.map(c => ({\n ...c,\n runnerActive: runners.includes(c.id),\n }));\n } catch { (dashboard as Record<string, unknown>).companies = []; }\n res.json(dashboard);\n });\n\n app.get('/api/command-post/agents', (_req, res) => {\n res.json(getRegisteredAgents());\n });\n\n app.post('/api/command-post/agents/:id/heartbeat', (req, res) => {\n const ok = reportHeartbeat(req.params.id);\n res.json({ success: ok });\n });\n\n app.delete('/api/command-post/agents/:id', (req, res) => {\n const ok = removeAgent(req.params.id);\n if (!ok) { res.status(400).json({ error: 'Cannot remove agent (not found or is the primary agent)' }); return; }\n res.json({ success: true });\n });\n\n app.post('/api/command-post/tasks/:goalId/:subtaskId/checkout', (req, res) => {\n const agentId = (req.body as { agentId?: string }).agentId || 'manual';\n const lock = checkoutTask(req.params.goalId, req.params.subtaskId, agentId);\n if (!lock) { res.status(409).json({ error: 'Task already checked out by another agent' }); return; }\n res.json(lock);\n });\n\n app.post('/api/command-post/tasks/:goalId/:subtaskId/checkin', (req, res) => {\n const runId = (req.body as { runId?: string }).runId || '';\n const ok = checkinTask(req.params.subtaskId, runId);\n if (!ok) { res.status(404).json({ error: 'No matching checkout found' }); return; }\n res.json({ success: true });\n });\n\n app.get('/api/command-post/checkouts', (_req, res) => {\n res.json(getActiveCheckouts());\n });\n\n app.get('/api/command-post/budgets', (_req, res) => {\n res.json(getBudgetPolicies());\n });\n\n // Budget reservations stub — frontend expects this endpoint\n app.get('/api/command-post/budgets/reservations', (_req, res) => {\n res.json([]);\n });\n\n app.post('/api/command-post/budgets', (req, res) => {\n try {\n const body = req.body as { name: string; scope: { type: 'agent' | 'goal' | 'global'; targetId?: string }; period: 'daily' | 'weekly' | 'monthly'; limitUsd: number; warningThresholdPercent?: number; action?: 'warn' | 'pause' | 'stop'; enabled?: boolean };\n const policy = createBudgetPolicy({\n name: body.name,\n scope: body.scope,\n period: body.period,\n limitUsd: body.limitUsd,\n warningThresholdPercent: body.warningThresholdPercent ?? 80,\n action: body.action ?? 'pause',\n enabled: body.enabled ?? true,\n });\n res.status(201).json(policy);\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n }\n });\n\n app.put('/api/command-post/budgets/:id', (req, res) => {\n const updated = updateBudgetPolicy(req.params.id, req.body as Record<string, unknown>);\n if (!updated) { res.status(404).json({ error: 'Budget policy not found' }); return; }\n res.json(updated);\n });\n\n app.delete('/api/command-post/budgets/:id', (req, res) => {\n const ok = deleteBudgetPolicy(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Budget policy not found' }); return; }\n res.json({ success: true });\n });\n\n app.get('/api/command-post/activity', (req, res) => {\n const limit = parseInt(req.query.limit as string) || 50;\n const type = req.query.type as string | undefined;\n res.json(getActivity({ limit, type }));\n });\n\n // ── Persistent Audit (Paperclip competitive gap fix) ──\n app.get('/api/command-post/audit', async (req, res) => {\n try {\n const { queryAudit } = await import('../agent/auditStore.js');\n const query = {\n agentId: req.query.agentId as string | undefined,\n sessionId: req.query.sessionId as string | undefined,\n type: req.query.type as string | undefined,\n toolName: req.query.toolName as string | undefined,\n from: req.query.from as string | undefined,\n to: req.query.to as string | undefined,\n limit: req.query.limit ? parseInt(req.query.limit as string) : 100,\n };\n res.json(queryAudit(query));\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/command-post/audit/costs', async (req, res) => {\n try {\n const { getAgentCostSummary, getDailyCostBreakdown } = await import('../agent/auditStore.js');\n const groupBy = req.query.groupBy as string || 'agent';\n if (groupBy === 'day') {\n const days = req.query.days ? parseInt(req.query.days as string) : 30;\n res.json(getDailyCostBreakdown(days));\n } else {\n const agentId = req.query.agentId as string | undefined;\n res.json(getAgentCostSummary(agentId));\n }\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/command-post/goals/tree', (_req, res) => {\n res.json(getGoalTree());\n });\n\n app.get('/api/command-post/goals/:id/ancestry', (req, res) => {\n const chain = getAncestryChain(req.params.id);\n if (chain.length === 0) { res.status(404).json({ error: 'Goal not found' }); return; }\n res.json(chain);\n });\n\n // ── Ancestry Validation ───────────────────────────────\n app.post('/api/command-post/goals/:id/validate', (req, res) => {\n const { parentGoalId } = req.body as { parentGoalId?: string | null };\n if (parentGoalId !== undefined) {\n // Validate potential parent assignment\n const result = validateGoalParentAssignment(req.params.id, parentGoalId || null);\n if (!result.valid) {\n res.status(422).json({ valid: false, errors: result.errors });\n return;\n }\n res.json({ valid: true });\n } else {\n // Validate existing ancestry chain\n const result = validateGoalAncestry(req.params.id);\n if (!result.valid) {\n res.status(422).json({ valid: false, errors: result.errors });\n return;\n }\n res.json({ valid: true });\n }\n });\n\n // ── Checkout Sweep ────────────────────────────────────\n app.post('/api/command-post/checkouts/sweep', (_req, res) => {\n const result = sweepExpiredCheckoutsManual();\n res.json(result);\n });\n\n app.get('/api/command-post/checkouts/expired', (_req, res) => {\n const result = sweepExpiredCheckoutsManual();\n res.json({ expired: result.swept, details: result.details });\n });\n\n // ── Stale Agents ──────────────────────────────────────\n app.get('/api/command-post/agents/stale', (_req, res) => {\n const stale = getStaleAgents();\n res.json({ stale, total: stale.length });\n });\n\n // ── Budget Enforcement per Agent ──────────────────────\n app.post('/api/command-post/budgets/:agentId/enforce', (req, res) => {\n const result = enforceBudgetForAgent(req.params.agentId);\n if (!result.budgetOk) {\n res.status(403).json({ budgetOk: false, policies: result.policies, message: 'Budget exceeded — agent paused' });\n return;\n }\n res.json({ budgetOk: true, policies: result.policies });\n });\n\n app.get('/api/command-post/budgets/agent/:agentId', (req, res) => {\n const budgetInfo = getBudgetPolicyForAgent(req.params.agentId);\n res.json(budgetInfo);\n });\n\n // ── Conflict Resolution ───────────────────────────────\n app.post('/api/command-post/conflicts/propose', async (req, res) => {\n try {\n const { conflictResolver } = await import('../agent/conflictResolver.js');\n const { entities, type, description, metadata } = req.body;\n\n if (!entities || !Array.isArray(entities) || entities.length === 0) {\n res.status(400).json({ error: 'entities array is required' });\n return;\n }\n\n if (!type || !['file', 'goal', 'resource', 'agent', 'config', 'other'].includes(type)) {\n res.status(400).json({ error: 'valid type is required (file, goal, resource, agent, config, other)' });\n return;\n }\n\n if (!description || typeof description !== 'string') {\n res.status(400).json({ error: 'description string is required' });\n return;\n }\n\n const proposal = await conflictResolver.generateProposal({\n entities,\n type,\n description,\n metadata: metadata || {}\n });\n\n res.json(proposal);\n } catch (error) {\n logger.error(COMPONENT, 'Conflict proposal generation error:', error);\n res.status(500).json({ error: 'Failed to generate conflict resolution proposal' });\n }\n });\n\n app.post('/api/command-post/conflicts/propose/formatted', async (req, res) => {\n try {\n const { conflictResolver } = await import('../agent/conflictResolver.js');\n const { entities, type, description, metadata } = req.body;\n\n if (!entities || !Array.isArray(entities) || entities.length === 0) {\n res.status(400).json({ error: 'entities array is required' });\n return;\n }\n\n if (!type || !['file', 'goal', 'resource', 'agent', 'config', 'other'].includes(type)) {\n res.status(400).json({ error: 'valid type is required (file, goal, resource, agent, config, other)' });\n return;\n }\n\n if (!description || typeof description !== 'string') {\n res.status(400).json({ error: 'description string is required' });\n return;\n }\n\n const proposal = await conflictResolver.generateProposal({\n entities,\n type,\n description,\n metadata: metadata || {}\n });\n\n const formatted = conflictResolver.formatProposal(proposal);\n res.type('text/plain').send(formatted);\n } catch (error) {\n logger.error(COMPONENT, 'Conflict proposal formatting error:', error);\n res.status(500).json({ error: 'Failed to format conflict resolution proposal' });\n }\n });\n\n app.get('/api/command-post/conflicts/types', (_req, res) => {\n res.json({\n types: [\n { id: 'file', name: 'File Conflict', description: 'Merge conflicts, version conflicts' },\n { id: 'goal', name: 'Goal Conflict', description: 'Competing or conflicting goals' },\n { id: 'resource', name: 'Resource Conflict', description: 'Resource contention (GPU, memory, etc.)' },\n { id: 'agent', name: 'Agent Conflict', description: 'Agent coordination conflicts' },\n { id: 'config', name: 'Configuration Conflict', description: 'Conflicting configuration values' },\n { id: 'other', name: 'Other', description: 'Unclassified conflict type' }\n ]\n });\n });\n\n // Command Post SSE stream\n app.get('/api/command-post/stream', (req, res) => {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n\n const onEvent = (event: string, data: unknown) => {\n try { res.write(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`); } catch { /* client gone */ }\n };\n\n const cpEvents = CP_SSE_EVENTS;\n\n const listeners = new Map<string, (data: unknown) => void>();\n for (const evt of cpEvents) {\n const handler = (data: unknown) => onEvent(evt, data);\n listeners.set(evt, handler);\n titanEvents.on(evt, handler);\n }\n\n const keepalive = setInterval(() => {\n try { res.write(': keepalive\\n\\n'); } catch { /* client gone */ }\n }, 15_000);\n\n req.on('close', () => {\n clearInterval(keepalive);\n for (const [evt, handler] of listeners) {\n titanEvents.removeListener(evt, handler);\n }\n });\n });\n\n // ── Deliberation Plan Events (SSE) ──────────────────────────\n app.get('/api/deliberation/stream', (req, res) => {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n\n const handler = (data: unknown) => {\n try { res.write(`event: plan\\ndata: ${JSON.stringify(data)}\\n\\n`); } catch { /* client gone */ }\n };\n titanEvents.on('plan:event', handler);\n\n const keepalive = setInterval(() => {\n try { res.write(': keepalive\\n\\n'); } catch { /* client gone */ }\n }, 15_000);\n\n req.on('close', () => {\n clearInterval(keepalive);\n titanEvents.removeListener('plan:event', handler);\n });\n });\n\n // ── Paperclip: Org Chart ──────────────────────────────────\n app.get('/api/command-post/org', async (_req, res) => {\n const org = getOrgTree();\n // Append company agents to org tree\n try {\n const { listCompanies } = await import('../agent/company.js');\n const companies = listCompanies();\n const companyNodes = companies.map(c => ({\n id: c.id,\n name: c.name,\n role: 'Company',\n title: c.description,\n status: c.status,\n model: '',\n reports: c.agents.map(a => ({\n id: a.id,\n name: a.name,\n role: a.role,\n title: a.template,\n status: a.status,\n model: '',\n reports: [],\n })),\n }));\n if (Array.isArray(org)) {\n org.push(...companyNodes);\n } else if (org && typeof org === 'object') {\n (org as Record<string, unknown>).companies = companyNodes;\n }\n } catch { /* non-critical */ }\n res.json(org);\n });\n\n // ── Paperclip: Issues/Tickets ────────────────────────────\n app.get('/api/command-post/issues', (req, res) => {\n const filters = {\n status: req.query.status as string | undefined,\n assigneeAgentId: req.query.assignee as string | undefined,\n goalId: req.query.goalId as string | undefined,\n };\n res.json(listIssues(filters));\n });\n\n app.get('/api/command-post/issues/search', (req, res) => {\n const q = req.query.q as string | undefined;\n if (!q || q.trim().length < 2) {\n res.status(400).json({ error: 'Query must be at least 2 characters' });\n return;\n }\n res.json(searchIssues(q));\n });\n\n app.post('/api/command-post/issues', (req, res) => {\n const { title, description, priority, assigneeAgentId, goalId, parentId } = req.body;\n if (!title) { res.status(400).json({ error: 'title is required' }); return; }\n const issue = createIssue({ title, description, priority, assigneeAgentId, goalId, parentId, createdByUser: 'board' });\n res.status(201).json(issue);\n });\n\n // Issue context stub — frontend expects this endpoint\n app.get('/api/command-post/issues/:id/context', (req, res) => {\n const issue = getIssue(req.params.id);\n if (!issue) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json({ ancestry: issue.goalId || '', issue });\n });\n\n app.get('/api/command-post/issues/:id', (req, res) => {\n const issue = getIssue(req.params.id);\n if (!issue) { res.status(404).json({ error: 'Issue not found' }); return; }\n const issueComments = getIssueComments(req.params.id);\n res.json({ ...issue, comments: issueComments });\n });\n\n app.get('/api/command-post/issues/:id/comments', (req, res) => {\n const issue = getIssue(req.params.id);\n if (!issue) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json(getIssueComments(req.params.id));\n });\n\n app.patch('/api/command-post/issues/:id', (req, res) => {\n const { title, description, status, priority, assigneeAgentId, goalId } = req.body;\n const updated = updateIssue(req.params.id, { title, description, status, priority, assigneeAgentId, goalId });\n if (!updated) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json(updated);\n });\n\n app.delete('/api/command-post/issues/:id', (req, res) => {\n const ok = deleteIssue(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json({ success: true });\n });\n\n app.post('/api/command-post/issues/:id/checkout', (req, res) => {\n const { agentId } = req.body;\n if (!agentId) { res.status(400).json({ error: 'agentId is required' }); return; }\n const result = checkoutIssue(req.params.id, agentId);\n if (!result) { res.status(409).json({ error: 'Issue already checked out by another agent' }); return; }\n res.json(result);\n });\n\n app.post('/api/command-post/issues/:id/comments', (req, res) => {\n const { body: commentBody, agentId } = req.body;\n if (!commentBody) { res.status(400).json({ error: 'body is required' }); return; }\n const comment = addIssueComment(req.params.id, commentBody, { agentId, user: agentId ? undefined : 'board' });\n if (!comment) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.status(201).json(comment);\n });\n\n // ── Paperclip: Approvals ─────────────────────────────────\n app.get('/api/command-post/approvals', (req, res) => {\n const status = req.query.status as string | undefined;\n res.json(listApprovals(status));\n });\n\n app.post('/api/command-post/approvals', (req, res) => {\n const { type, requestedBy, payload, linkedIssueIds } = req.body;\n if (!type) { res.status(400).json({ error: 'type is required' }); return; }\n const approval = createApproval({ type, requestedBy: requestedBy || 'board', payload: payload || {}, linkedIssueIds });\n res.status(201).json(approval);\n });\n\n // v4.13: approval-gated self-restart. Creates a custom approval of\n // kind 'restart_titan' that, when approved via the normal\n // /api/command-post/approvals/:id/approve flow, restarts the service.\n // Audit log records both the request and the approval.\n app.post('/api/system/request-restart', async (req, res) => {\n try {\n const { reason, requestedBy } = (req.body || {}) as { reason?: string; requestedBy?: string };\n if (!reason || typeof reason !== 'string' || reason.trim().length < 3) {\n res.status(400).json({ error: 'reason is required (min 3 chars)' });\n return;\n }\n const { createApproval } = await import('../agent/commandPost.js');\n const approval = createApproval({\n type: 'custom',\n requestedBy: requestedBy || 'api',\n payload: {\n kind: 'restart_titan',\n reason: reason.trim().slice(0, 500),\n requestedAt: new Date().toISOString(),\n severity: 'medium',\n suggestedAction: 'Approve to execute: sudo systemctl restart titan.service',\n },\n linkedIssueIds: [],\n });\n try {\n const { logAudit } = await import('../security/auditLog.js');\n logAudit('security_alert', requestedBy || 'api', {\n action: 'restart_titan_requested',\n approvalId: approval.id,\n reason,\n });\n } catch { /* audit unavailable */ }\n res.json({ ok: true, approval });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/command-post/approvals/:id/approve', async (req, res) => {\n const { decidedBy, note } = req.body;\n const result = await approveApproval(req.params.id, decidedBy || 'board', note);\n if (!result) { res.status(404).json({ error: 'Approval not found or already decided' }); return; }\n res.json(result);\n });\n\n app.post('/api/command-post/approvals/:id/reject', (req, res) => {\n const { decidedBy, note } = req.body;\n const result = rejectApproval(req.params.id, decidedBy || 'board', note);\n if (!result) { res.status(404).json({ error: 'Approval not found or already decided' }); return; }\n res.json(result);\n });\n\n app.post('/api/command-post/approvals/:id/reply', (req, res) => {\n const { author, body } = req.body;\n if (!body || typeof body !== 'string') { res.status(400).json({ error: 'body is required' }); return; }\n const result = replyToApproval(req.params.id, author || 'user', body);\n if (!result) { res.status(404).json({ error: 'Approval not found' }); return; }\n res.json(result);\n });\n\n app.post('/api/command-post/approvals/:id/snooze', (req, res) => {\n const { until } = req.body;\n if (!until) { res.status(400).json({ error: 'until timestamp is required' }); return; }\n const result = snoozeApproval(req.params.id, until);\n if (!result) { res.status(404).json({ error: 'Approval not found or not pending' }); return; }\n res.json(result);\n });\n\n app.post('/api/command-post/approvals/:id/unsnooze', (req, res) => {\n const result = unsnoozeApproval(req.params.id);\n if (!result) { res.status(404).json({ error: 'Approval not found' }); return; }\n res.json(result);\n });\n\n app.get('/api/command-post/approvals/:id/thread', (req, res) => {\n const approval = listApprovals().find(a => a.id === req.params.id);\n if (!approval) { res.status(404).json({ error: 'Approval not found' }); return; }\n res.json({ approvalId: approval.id, thread: approval.thread || [] });\n });\n\n app.post('/api/command-post/approvals/batch', async (req, res) => {\n const { ids, action, decidedBy, note } = req.body;\n if (!Array.isArray(ids) || ids.length === 0) { res.status(400).json({ error: 'ids array required' }); return; }\n if (action === 'approve') {\n const result = await batchApprove(ids, decidedBy || 'board', note);\n res.json(result);\n } else if (action === 'reject') {\n const result = batchReject(ids, decidedBy || 'board', note);\n res.json(result);\n } else {\n res.status(400).json({ error: 'action must be approve or reject' });\n }\n });\n\n app.post('/api/command-post/approvals/sweep', async (_req, res) => {\n const { sweepStaleApprovalsManual } = await import('../agent/commandPost.js');\n const result = sweepStaleApprovalsManual();\n res.json(result);\n });\n\n // ── Agent-to-User Messages ───────────────────────────────\n app.get('/api/command-post/agent-messages', (req, res) => {\n const agentId = req.query.agentId as string | undefined;\n const userId = req.query.userId as string | undefined;\n const unreadOnly = req.query.unread === 'true';\n res.json(getAgentMessages(agentId, userId, unreadOnly));\n });\n\n app.post('/api/command-post/agent-messages/:id/read', (req, res) => {\n const ok = markAgentMessageRead(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Message not found' }); return; }\n res.json({ read: true });\n });\n\n // ── Soma (v4.0): organism state ──────────────────────────\n app.get('/api/soma/state', async (_req, res) => {\n try {\n const cfg = loadConfig() as unknown as { organism?: {\n enabled?: boolean;\n driveSetpoints?: Record<string, number>;\n driveWeights?: Record<string, number>;\n disabledDrives?: string[];\n } };\n const organismEnabled = !!cfg.organism?.enabled;\n if (!organismEnabled) {\n res.json({\n enabled: false,\n message: 'Soma organism layer is disabled. Set organism.enabled: true in titan.json to activate.',\n drives: [],\n hormonal: { available: false, asOf: null, levels: {}, elevated: [], dominant: null },\n });\n return;\n }\n const { runDriveTick } = await import('../organism/drives.js');\n const { buildBlock } = await import('../organism/hormones.js');\n const tick = runDriveTick(\n (cfg.organism?.driveSetpoints as Record<import('../organism/drives.js').DriveId, number>) || {},\n (cfg.organism?.driveWeights as Record<import('../organism/drives.js').DriveId, number>) || {},\n (cfg.organism?.disabledDrives as import('../organism/drives.js').DriveId[]) || [],\n );\n const hormonal = buildBlock(tick.drives, tick.timestamp);\n res.json({\n enabled: true,\n timestamp: tick.timestamp,\n drives: tick.drives,\n totalPressure: tick.totalPressure,\n dominantDrives: tick.dominantDrives,\n hormonal,\n });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/soma/history', async (req, res) => {\n try {\n const { loadDriveHistory } = await import('../organism/drives.js');\n const history = loadDriveHistory();\n if (!history) {\n res.json({ enabled: false, history: [], latest: null });\n return;\n }\n const hoursRaw = req.query.hours ? Number(req.query.hours) : 24;\n const hours = Number.isFinite(hoursRaw) && hoursRaw > 0 && hoursRaw <= 168 ? hoursRaw : 24;\n const cutoff = Date.now() - hours * 3_600_000;\n const trimmed = history.history.filter(h => new Date(h.timestamp).getTime() >= cutoff);\n res.json({ enabled: true, history: trimmed, latest: history.latest });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/soma/setpoints', async (req, res) => {\n try {\n const setpoints = req.body as Record<string, unknown> | undefined;\n if (!setpoints || typeof setpoints !== 'object') {\n res.status(400).json({ error: 'Body must be an object of driveId → setpoint (0-1).' });\n return;\n }\n const validDrives = new Set(['purpose', 'hunger', 'curiosity', 'safety', 'social']);\n const cleaned: Record<string, number> = {};\n for (const [k, v] of Object.entries(setpoints)) {\n if (!validDrives.has(k)) continue;\n const n = Number(v);\n if (!Number.isFinite(n) || n < 0 || n > 1) continue;\n cleaned[k] = n;\n }\n const cfg = loadConfig() as unknown as { organism?: Record<string, unknown> };\n const merged = { ...(cfg.organism || {}), driveSetpoints: cleaned };\n const { updateConfig } = await import('../config/config.js');\n updateConfig({ organism: merged } as Partial<import('../config/schema.js').TitanConfig>);\n res.json({ ok: true, setpoints: cleaned });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // v4.2: per-drive weight override (0.1 – 3.0). Affects pressure fusion.\n app.post('/api/soma/weights', async (req, res) => {\n try {\n const weights = req.body as Record<string, unknown> | undefined;\n if (!weights || typeof weights !== 'object') {\n res.status(400).json({ error: 'Body must be an object of driveId → weight (0.1-3.0).' });\n return;\n }\n const validDrives = new Set(['purpose', 'hunger', 'curiosity', 'safety', 'social']);\n const cleaned: Record<string, number> = {};\n for (const [k, v] of Object.entries(weights)) {\n if (!validDrives.has(k)) continue;\n const n = Number(v);\n if (!Number.isFinite(n) || n < 0.1 || n > 3.0) continue;\n cleaned[k] = n;\n }\n const cfg = loadConfig() as unknown as { organism?: Record<string, unknown> };\n const merged = { ...(cfg.organism || {}), driveWeights: cleaned };\n const { updateConfig } = await import('../config/config.js');\n updateConfig({ organism: merged } as Partial<import('../config/schema.js').TitanConfig>);\n res.json({ ok: true, weights: cleaned });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // v4.2: enable/disable an individual drive without disabling Soma entirely.\n app.post('/api/soma/drives/:id/disable', async (req, res) => {\n try {\n const driveId = req.params.id;\n const validDrives = ['purpose', 'hunger', 'curiosity', 'safety', 'social'];\n if (!validDrives.includes(driveId)) {\n res.status(400).json({ error: `Invalid drive: ${driveId}` });\n return;\n }\n const disabled = req.body?.disabled !== false; // default true\n const cfg = loadConfig() as unknown as { organism?: { disabledDrives?: string[] } };\n const current = cfg.organism?.disabledDrives || [];\n const next = disabled\n ? [...new Set([...current, driveId])]\n : current.filter(d => d !== driveId);\n const { updateConfig } = await import('../config/config.js');\n const merged = { ...(cfg.organism || {}), disabledDrives: next };\n updateConfig({ organism: merged } as Partial<import('../config/schema.js').TitanConfig>);\n res.json({ ok: true, disabledDrives: next });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // v4.2: trigger a debate from the UI (LLM tool also works).\n app.post('/api/command-post/debates', async (req, res) => {\n try {\n const { question, participants, rounds, resolution, judgeModel } = req.body || {};\n if (!question || !Array.isArray(participants) || participants.length < 2) {\n res.status(400).json({ error: 'question + 2-5 participants required' });\n return;\n }\n const { runDebate } = await import('../skills/builtin/agent_debate.js');\n const result = await runDebate({\n question: String(question),\n participants,\n rounds: Math.max(1, Math.min(4, Number(rounds) || 2)),\n resolution: (resolution === 'vote' || resolution === 'synthesize' || resolution === 'judge') ? resolution : 'judge',\n judgeModel: judgeModel ? String(judgeModel) : undefined,\n });\n res.json({ ok: true, id: result.id, winner: result.winner });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── F3: Debates ──────────────────────────────────────────\n app.get('/api/command-post/debates', async (req, res) => {\n const limit = parseInt(req.query.limit as string) || 50;\n const { listDebates } = await import('../skills/builtin/agent_debate.js');\n res.json({ items: listDebates(limit) });\n });\n\n app.get('/api/command-post/debates/:id', async (req, res) => {\n const { getDebate } = await import('../skills/builtin/agent_debate.js');\n const debate = getDebate(req.params.id);\n if (!debate) { res.status(404).json({ error: 'Debate not found' }); return; }\n res.json(debate);\n });\n\n // ── Paperclip: Runs ──────────────────────────────────────\n app.get('/api/command-post/runs', (req, res) => {\n const agentId = req.query.agentId as string | undefined;\n const limit = parseInt(req.query.limit as string) || 50;\n res.json(listRuns(agentId, limit));\n });\n\n // Retry a failed run — creates a new issue and queues a wakeup for the same agent\n app.post('/api/command-post/runs/:id/retry', async (req, res) => {\n const allRuns = listRuns(undefined, 500);\n const run = allRuns.find(r => r.id === req.params.id);\n if (!run) { res.status(404).json({ error: 'Run not found' }); return; }\n\n const agent = getRegisteredAgents().find(a => a.id === run.agentId);\n if (!agent) { res.status(404).json({ error: 'Agent not found' }); return; }\n\n // Build retry task from original context\n let task = `Retry failed run (${run.id})`;\n if (run.error) task += `: ${run.error}`;\n\n // If the run had an issue, reference it\n let issueDesc = task;\n if (run.issueId) {\n const originalIssue = getIssue(run.issueId);\n if (originalIssue) {\n task = `Retry: ${originalIssue.title}`;\n issueDesc = `${originalIssue.description || ''}\\n\\nRetrying after failure: ${run.error || 'unknown error'}`;\n }\n }\n\n const issue = createIssue({\n title: task,\n description: issueDesc,\n priority: 'high',\n assigneeAgentId: agent.id,\n createdByUser: 'board',\n });\n\n const newRun = startRun(agent.id, 'manual', issue.id);\n\n queueWakeup({\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n agentId: agent.id,\n agentName: agent.name,\n parentSessionId: null,\n task,\n templateName: agent.role || 'default',\n });\n\n res.json({ retried: true, runId: newRun.id, issueId: issue.id });\n });\n\n // ── Paperclip: Agent Updates (org chart fields) ──────────\n app.patch('/api/command-post/agents/:id', async (req, res) => {\n const { reportsTo, role, title, name, status, model } = req.body;\n const updated = updateRegisteredAgent(req.params.id, { reportsTo, role, title, name, model });\n if (!updated) { res.status(404).json({ error: 'Agent not found' }); return; }\n // v4.10.0-local polish: also allow status changes via PATCH so the\n // UI + API can pause/resume agents. Valid statuses enforced by the\n // updateAgentStatus impl.\n if (status && typeof status === 'string') {\n try {\n const { updateAgentStatus } = await import('../agent/commandPost.js');\n updateAgentStatus(req.params.id, status as 'active' | 'idle' | 'paused' | 'error' | 'stopped');\n } catch { /* ok */ }\n }\n res.json(updated);\n });\n\n // ── F2: Agent Identity (persistent personality) ──────────\n // Pass a field as `null` to clear it. Fields absent from the body are left\n // untouched. Validation is intentionally lenient — this is an admin\n // surface and malformed data fails at the next LLM call, not here.\n app.patch('/api/command-post/agents/:id/identity', async (req, res) => {\n const { voiceId, personaId, systemPromptOverride, memoryNamespace, characterSummary, model } = req.body || {};\n const coerce = (v: unknown): string | null | undefined => {\n if (v === null) return null;\n if (typeof v === 'string') return v;\n if (v === undefined) return undefined;\n res.status(400).json({ error: `Invalid identity field: expected string or null, got ${typeof v}` });\n return undefined;\n };\n if (res.headersSent) return;\n const { updateAgentIdentity } = await import('../agent/commandPost.js');\n const updated = updateAgentIdentity(req.params.id, {\n voiceId: coerce(voiceId),\n personaId: coerce(personaId),\n systemPromptOverride: coerce(systemPromptOverride),\n memoryNamespace: coerce(memoryNamespace),\n characterSummary: coerce(characterSummary),\n model: coerce(model),\n });\n if (res.headersSent) return;\n if (!updated) { res.status(404).json({ error: 'Agent not found' }); return; }\n res.json(updated);\n });\n\n // ── Wakeup System (async sub-agent delegation) ────────────\n\n app.get('/api/command-post/agents/:agentId/inbox', (req, res) => {\n const items = getAgentInbox(req.params.agentId);\n res.json({ items, total: items.length });\n });\n\n // ── v4.9.0: Safety + Identity endpoints ─────────────────────────\n\n app.get('/api/safety/state', async (_req, res) => {\n try {\n const { getState } = await import('../safety/killSwitch.js');\n res.json(getState());\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/safety/kill', async (req, res) => {\n try {\n const reason = (req.body?.reason as string) || 'manual kill via API';\n const firedBy = (req.body?.firedBy as string) || 'api';\n const { kill } = await import('../safety/killSwitch.js');\n await kill('manual', reason, { firedBy });\n const { getState } = await import('../safety/killSwitch.js');\n res.json(getState());\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/safety/resume', async (req, res) => {\n try {\n const note = (req.body?.note as string) || 'resumed via API (no note)';\n const resumedBy = (req.body?.resumedBy as string) || 'api';\n const { resume } = await import('../safety/killSwitch.js');\n const state = resume(note, resumedBy);\n res.json(state);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── v4.10.0-local (Phase A): Goal Driver API ─────────────────\n // List active drivers (non-terminal phases)\n app.get('/api/drivers', async (_req, res) => {\n try {\n const { listActiveDrivers } = await import('../agent/goalDriver.js');\n const { getSchedulerStats } = await import('../agent/driverScheduler.js');\n res.json({\n drivers: listActiveDrivers(),\n scheduler: getSchedulerStats(),\n });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Driver state detail\n app.get('/api/drivers/:goalId', async (req, res) => {\n try {\n const { getDriverState } = await import('../agent/goalDriver.js');\n const s = getDriverState(req.params.goalId);\n if (!s) { res.status(404).json({ error: 'No driver for goal' }); return; }\n res.json(s);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Pause a driver (skips ticks until resumed)\n app.post('/api/drivers/:goalId/pause', async (req, res) => {\n try {\n const { pauseDriver } = await import('../agent/goalDriver.js');\n const ok = pauseDriver(req.params.goalId);\n if (!ok) { res.status(404).json({ error: 'No driver for goal' }); return; }\n res.json({ status: 'paused' });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Resume a paused driver\n app.post('/api/drivers/:goalId/resume', async (req, res) => {\n try {\n const { resumeDriverControl } = await import('../agent/goalDriver.js');\n const ok = resumeDriverControl(req.params.goalId);\n if (!ok) { res.status(404).json({ error: 'No driver for goal' }); return; }\n res.json({ status: 'resumed' });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Cancel a driver (hard stop — driver transitions to cancelled on next tick)\n app.post('/api/drivers/:goalId/cancel', async (req, res) => {\n try {\n const { cancelDriver } = await import('../agent/goalDriver.js');\n const ok = cancelDriver(req.params.goalId);\n if (!ok) { res.status(404).json({ error: 'No driver for goal' }); return; }\n res.json({ status: 'cancel-requested' });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Change priority (1 = highest, 5 = lowest). Scheduler honors on next tick.\n app.post('/api/drivers/:goalId/reprioritize', async (req, res) => {\n try {\n const priority = Number(req.body?.priority) as 1 | 2 | 3 | 4 | 5;\n if (![1, 2, 3, 4, 5].includes(priority)) {\n res.status(400).json({ error: 'priority must be 1-5' }); return;\n }\n const { reprioritizeDriver } = await import('../agent/goalDriver.js');\n const ok = reprioritizeDriver(req.params.goalId, priority);\n if (!ok) { res.status(404).json({ error: 'No driver for goal' }); return; }\n res.json({ status: 'reprioritized', priority });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Rollback — one-click shadow-git revert of all writes attributed to the goal\n app.post('/api/drivers/:goalId/rollback', async (req, res) => {\n try {\n const { rollbackGoal } = await import('../agent/rollbackGoal.js');\n const result = await rollbackGoal(req.params.goalId);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // Force-tick a driver (for debugging + external UI \"advance now\")\n app.post('/api/drivers/:goalId/tick', async (req, res) => {\n try {\n const { tickDriver } = await import('../agent/goalDriver.js');\n const phase = await tickDriver(req.params.goalId);\n res.json({ phase });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase B: daily digest ─────────────────────────────────────\n app.get('/api/digest/today', async (_req, res) => {\n try {\n const { getLatestDigest } = await import('../agent/dailyDigest.js');\n const d = getLatestDigest();\n if (!d) { res.status(404).json({ error: 'No digest generated yet' }); return; }\n res.json(d);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/digest/:date', async (req, res) => {\n try {\n const { getDigestByDate } = await import('../agent/dailyDigest.js');\n const d = getDigestByDate(req.params.date);\n if (!d) { res.status(404).json({ error: 'No digest for that date' }); return; }\n res.json(d);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/digest/generate', async (_req, res) => {\n try {\n const { generateDigest } = await import('../agent/dailyDigest.js');\n const d = await generateDigest();\n res.json(d);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase B: categorized approval list ─────────────────────────\n app.get('/api/approvals/categorized', async (req, res) => {\n try {\n const { listCategorizedApprovals } = await import('../agent/commandPost.js');\n const status = (req.query.status as string) || 'pending';\n res.json(listCategorizedApprovals(status));\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase B: drive trend API ─────────────────────────────────\n app.get('/api/drives/history', async (req, res) => {\n try {\n const hours = Number(req.query.hours) || 24;\n const { readFileSync, existsSync } = await import('fs');\n const { join } = await import('path');\n const { TITAN_HOME } = await import('../utils/constants.js');\n const path = join(TITAN_HOME, 'drive-state.json');\n if (!existsSync(path)) { res.status(404).json({ error: 'No drive state file' }); return; }\n const state = JSON.parse(readFileSync(path, 'utf-8'));\n const history = (state.history || []) as Array<{ timestamp: string; satisfactions?: Record<string, number>; pressures?: Record<string, number> }>;\n const cutoff = Date.now() - hours * 60 * 60 * 1000;\n const filtered = history.filter(h => {\n const t = h.timestamp ? new Date(h.timestamp).getTime() : 0;\n return t >= cutoff;\n });\n res.json({ hours, count: filtered.length, history: filtered });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase B: current drive state ────────────────────────────────\n app.get('/api/drives/current', async (_req, res) => {\n try {\n const { readFileSync, existsSync } = await import('fs');\n const { join } = await import('path');\n const { TITAN_HOME } = await import('../utils/constants.js');\n const driveStatePath = join(TITAN_HOME, 'drive-state.json');\n\n // Try cached drive state first\n if (existsSync(driveStatePath)) {\n const state = JSON.parse(readFileSync(driveStatePath, 'utf-8'));\n const latest = state.latest;\n if (latest?.drives) {\n res.json({\n drives: (latest.drives as Array<{ id: string; satisfaction: number; pressure: number; setpoint: number; weight: number; inputs?: Record<string, unknown>; description: string }>).map(d => ({\n id: d.id,\n satisfaction: d.satisfaction,\n pressure: d.pressure,\n setpoint: d.setpoint,\n weight: d.weight,\n inputs: d.inputs ?? {},\n description: d.description,\n })),\n });\n return;\n }\n }\n\n // Fallback: recompute via buildSnapshot + computeAllDrives\n const { buildSnapshot, computeAllDrives } = await import('../organism/drives.js');\n const snapshot = buildSnapshot();\n const drives = computeAllDrives(snapshot);\n res.json({\n drives: drives.map(d => ({\n id: d.id,\n satisfaction: d.satisfaction,\n pressure: d.pressure,\n setpoint: d.setpoint,\n weight: d.weight,\n inputs: d.inputs ?? {},\n description: d.description,\n })),\n });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase B: retrospectives (listing experiments from the driver) ──\n app.get('/api/retrospectives', async (_req, res) => {\n try {\n const { listExperiments } = await import('../memory/experiments.js');\n const all = listExperiments(200).filter(e => (e.tags || []).includes('goal-driver'));\n res.json({ count: all.length, retrospectives: all });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase B: throttle stats (diagnostic) ───────────────────────\n app.get('/api/drivers/throttle/stats', async (_req, res) => {\n try {\n const { getThrottleStats } = await import('../agent/notificationThrottle.js');\n res.json(getThrottleStats());\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase C: missions ─────────────────────────────────────────\n app.get('/api/missions', async (_req, res) => {\n try {\n const { listActiveMissions } = await import('../agent/missionDriver.js');\n res.json({ missions: listActiveMissions() });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/missions', async (req, res) => {\n try {\n const { title, description, children, tags } = req.body as {\n title: string; description: string; requestedBy?: string;\n children?: Array<{ goalId: string; title: string; dependsOn?: string[] }>;\n tags?: string[];\n };\n if (!title || !description) {\n res.status(400).json({ error: 'title + description required' }); return;\n }\n const { createMission } = await import('../agent/missionDriver.js');\n const mission = createMission({\n title,\n description,\n requestedBy: req.body?.requestedBy || 'api',\n children,\n tags,\n });\n res.json(mission);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/missions/:id', async (req, res) => {\n try {\n const { getMissionState } = await import('../agent/missionDriver.js');\n const m = getMissionState(req.params.id);\n if (!m) { res.status(404).json({ error: 'Mission not found' }); return; }\n res.json(m);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/missions/:id/tick', async (req, res) => {\n try {\n const { tickMission } = await import('../agent/missionDriver.js');\n res.json({ phase: await tickMission(req.params.id) });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/missions/:id/cancel', async (req, res) => {\n try {\n const { cancelMission } = await import('../agent/missionDriver.js');\n const ok = cancelMission(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Mission not found' }); return; }\n res.json({ status: 'cancelled' });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase C: fleet status + routing preview ──────────────────\n app.get('/api/fleet', async (_req, res) => {\n try {\n const { getFleetState } = await import('../agent/machineRouter.js');\n res.json({ fleet: getFleetState() });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/fleet/route', async (req, res) => {\n try {\n const tags = (req.body?.tags as string[]) || [];\n const { routeGoalToMachine } = await import('../agent/machineRouter.js');\n res.json(routeGoalToMachine(tags));\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── v4.10.0-local polish: Edited Files + Research (for Command Post UI) ──\n app.get('/api/files/edited', async (req, res) => {\n try {\n const limit = Math.min(Number(req.query.limit) || 200, 1000);\n const { listEditedFiles } = await import('../agent/editedFiles.js');\n res.json({ files: listEditedFiles(limit) });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/files/content', async (req, res) => {\n try {\n const path = (req.query.path as string) || '';\n if (!path) { res.status(400).json({ error: 'path query param required' }); return; }\n const { readEditedFileContent } = await import('../agent/editedFiles.js');\n const result = readEditedFileContent(path);\n if ('error' in result) { res.status(403).json(result); return; }\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/research/recent', async (req, res) => {\n try {\n const limit = Math.min(Number(req.query.limit) || 30, 200);\n const { listResearch } = await import('../agent/editedFiles.js');\n res.json({ research: listResearch(limit) });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Phase D: playbooks ──────────────────────────────────────\n app.get('/api/playbooks', async (_req, res) => {\n try {\n const { listPlaybooks } = await import('../agent/playbooks.js');\n res.json({ playbooks: listPlaybooks() });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/playbooks/refresh', async (_req, res) => {\n try {\n const { refreshPlaybooks } = await import('../agent/playbooks.js');\n res.json(await refreshPlaybooks());\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/playbooks/match', async (req, res) => {\n try {\n const { title, tags } = req.body as { title: string; tags?: string[] };\n if (!title) { res.status(400).json({ error: 'title required' }); return; }\n const { findPlaybookForGoal } = await import('../agent/playbooks.js');\n const pb = findPlaybookForGoal(title, tags);\n if (!pb) { res.status(404).json({ match: null }); return; }\n res.json({ match: pb });\n } catch (err) {\n logger.error(COMPONENT, `Playbook error: ${(err as Error).message}`);\n res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Phase D: voice chat endpoint ─────────────────────────────\n // POST /api/voice/ask\n // Body: { question: string, voice?: string, speak?: boolean }\n // Returns: { answer: string, ttsUrl?: string, activeDrivers: number }\n // Wraps processMessage so voice clients (LiveKit / F5-TTS front-ends)\n // get a single endpoint that knows about drivers (via driverAwareChat\n // system prompt block) and optionally returns a TTS URL.\n app.post('/api/voice/ask', async (req, res) => {\n try {\n const { question, voice, speak } = req.body as { question: string; voice?: string; speak?: boolean };\n if (!question || typeof question !== 'string') {\n res.status(400).json({ error: 'question required' }); return;\n }\n const { processMessage } = await import('../agent/agent.js');\n const result = await processMessage(question, 'voice', 'voice-user', {\n strategy: 'direct',\n });\n const { listActiveDrivers } = await import('../agent/goalDriver.js');\n const activeDrivers = listActiveDrivers().length;\n const answer = result.content || 'I don\\'t have an answer right now.';\n // Optional TTS URL — F5-TTS server runs on port 5006 on Titan PC.\n // If speak is true, include a URL the client can call; we don't\n // synthesize server-side to avoid double-handling large audio blobs.\n const ttsUrl = speak\n ? `http://localhost:5006/tts?voice=${encodeURIComponent(voice || 'default')}&text=${encodeURIComponent(answer.slice(0, 500))}`\n : undefined;\n res.json({ answer, ttsUrl, activeDrivers, sessionId: result.sessionId });\n } catch (err) {\n logger.error(COMPONENT, `Voice ask error: ${(err as Error).message}`);\n res.status(500).json({ error: \"I'm having trouble hearing you right now. Please try again in a moment.\" });\n }\n });\n\n app.get('/api/identity', async (_req, res) => {\n try {\n const { getIdentity } = await import('../memory/identity.js');\n const id = getIdentity();\n if (!id) { res.status(404).json({ error: 'identity not initialized' }); return; }\n res.json(id);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/identity/drift/:index/resolve', async (req, res) => {\n try {\n const idx = parseInt(req.params.index, 10);\n const resolution = (req.body?.resolution as 'accepted' | 'rejected') || 'accepted';\n const note = req.body?.note as string | undefined;\n const { resolveDrift } = await import('../memory/identity.js');\n const ok = resolveDrift(idx, resolution, note);\n if (!ok) { res.status(404).json({ error: 'drift event not found at index' }); return; }\n res.json({ ok: true });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/experiments', async (_req, res) => {\n try {\n const { listExperiments, getExperimentStats } = await import('../memory/experiments.js');\n res.json({ experiments: listExperiments(200), stats: getExperimentStats() });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/provenance/stats', async (_req, res) => {\n try {\n const { getProvenanceStats } = await import('../memory/provenance.js');\n res.json(getProvenanceStats());\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── v4.8.0: Self-Modification Pipeline endpoints ────────────────\n // All routes are behind `selfMod.enabled`. When disabled they 404 so\n // pre-v4.8.0 clients hitting them get a clean \"feature off\" signal.\n\n app.get('/api/self-proposals', async (_req, res) => {\n try {\n const cfg = loadConfig() as unknown as { selfMod?: { enabled?: boolean } };\n if (!cfg.selfMod?.enabled) { res.status(404).json({ error: 'selfMod disabled' }); return; }\n const { listProposals } = await import('../agent/selfProposals.js');\n res.json({ proposals: listProposals(200) });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/self-proposals/:id', async (req, res) => {\n try {\n const cfg = loadConfig() as unknown as { selfMod?: { enabled?: boolean } };\n if (!cfg.selfMod?.enabled) { res.status(404).json({ error: 'selfMod disabled' }); return; }\n const { getProposal } = await import('../agent/selfProposals.js');\n const p = getProposal(req.params.id);\n if (!p) { res.status(404).json({ error: 'Proposal not found' }); return; }\n res.json(p);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/self-proposals/:id/files/:path(*)', async (req, res) => {\n try {\n const cfg = loadConfig() as unknown as { selfMod?: { enabled?: boolean } };\n if (!cfg.selfMod?.enabled) { res.status(404).json({ error: 'selfMod disabled' }); return; }\n const { getProposalFileContent } = await import('../agent/selfProposals.js');\n const content = getProposalFileContent(req.params.id, req.params.path);\n if (content === null) { res.status(404).json({ error: 'File not found' }); return; }\n res.type('text/plain').send(content);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/self-proposals/:id/review', async (req, res) => {\n try {\n const cfg = loadConfig() as unknown as { selfMod?: { enabled?: boolean } };\n if (!cfg.selfMod?.enabled) { res.status(404).json({ error: 'selfMod disabled' }); return; }\n const { reviewProposal } = await import('../agent/selfProposalReview.js');\n const result = await reviewProposal(req.params.id);\n if (!result) { res.status(404).json({ error: 'Proposal not found' }); return; }\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/self-proposals/:id/open-pr', async (req, res) => {\n try {\n const cfg = loadConfig() as unknown as { selfMod?: { enabled?: boolean } };\n if (!cfg.selfMod?.enabled) { res.status(404).json({ error: 'selfMod disabled' }); return; }\n const { createProposalPR } = await import('../agent/selfProposalPR.js');\n const result = await createProposalPR(req.params.id);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/self-proposals/:id/dismiss', async (req, res) => {\n try {\n const cfg = loadConfig() as unknown as { selfMod?: { enabled?: boolean } };\n if (!cfg.selfMod?.enabled) { res.status(404).json({ error: 'selfMod disabled' }); return; }\n const { updateStatus } = await import('../agent/selfProposals.js');\n const reason = (req.body?.reason as string | undefined) || 'dismissed by user';\n const result = updateStatus(req.params.id, 'rejected', {\n rejectedAt: new Date().toISOString(),\n rejectionReason: reason,\n });\n if (!result) { res.status(404).json({ error: 'Proposal not found' }); return; }\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/command-post/wakeup', (req, res) => {\n const { issueId, agentId, agentName, task, templateName } = req.body;\n if (!issueId || !agentId || !task) {\n res.status(400).json({ error: 'issueId, agentId, and task are required' });\n return;\n }\n const wakeup = queueWakeup({\n issueId,\n issueIdentifier: issueId,\n agentId,\n agentName: agentName || 'Agent',\n parentSessionId: null,\n task,\n templateName: templateName || '',\n });\n res.json({ wakeupRequestId: wakeup.id, status: wakeup.status });\n });\n\n app.get('/api/command-post/wakeup/:requestId', (req, res) => {\n const request = getWakeupRequest(req.params.requestId);\n if (!request) { res.status(404).json({ error: 'Wakeup request not found' }); return; }\n res.json(request);\n });\n\n app.delete('/api/command-post/wakeup/:requestId', (req, res) => {\n const cancelled = cancelWakeup(req.params.requestId);\n if (!cancelled) { res.status(409).json({ error: 'Request already running or completed' }); return; }\n res.json({ cancelled: true });\n });\n\n app.get('/api/command-post/sessions/:sessionId/pending-results', (req, res) => {\n const results = drainPendingResults(req.params.sessionId);\n res.json({ results, count: results.length });\n });\n\n // ── Files API (Full file manager with configurable roots) ────────────────────\n\n // Helper: resolve configured root directories\n function getFileRoots(): Array<{ label: string; path: string }> {\n const cfg = loadConfig();\n const fmCfg = (cfg as Record<string, unknown>).fileManager as { roots?: string[]; blockedPatterns?: string[] } | undefined;\n const roots = fmCfg?.roots || ['~/.titan'];\n return roots.map(r => {\n const expanded = r.replace(/^~/, homedir());\n const abs = resolve(expanded);\n // Label: last dir component or full path for short ones\n const label = abs.split('/').filter(Boolean).pop() || abs;\n return { label, path: abs };\n });\n }\n\n // Helper: validate a path is within an allowed root and not blocked\n function validateFilePath(reqPath: string, rootParam?: string): { valid: boolean; fullPath: string; basePath: string; error?: string } {\n const roots = getFileRoots();\n if (roots.length === 0) return { valid: false, fullPath: '', basePath: '', error: 'No file roots configured' };\n\n // Select root: by index, by label, or default to first\n let selectedRoot = roots[0];\n if (rootParam) {\n const byIndex = roots[parseInt(rootParam, 10)];\n const byLabel = roots.find(r => r.label === rootParam || r.path === rootParam);\n selectedRoot = byIndex || byLabel || roots[0];\n }\n\n const basePath = selectedRoot.path;\n const fullPath = resolve(basePath, reqPath.replace(/^\\//, ''));\n\n // Security: must stay within root.\n // Hunt Finding #34 (2026-04-14): previous `fullPath.startsWith(basePath)`\n // let siblings through — e.g. if basePath=/home/dj/workspace and the\n // attacker supplies path=/home/dj/workspace-evil/file, resolve() returns\n // /home/dj/workspace-evil/file which startsWith('/home/dj/workspace')\n // is TRUE, granting access to a directory outside the configured root.\n // Check for exact match or path-separator boundary.\n const basePathWithSep = basePath.endsWith('/') ? basePath : basePath + '/';\n if (fullPath !== basePath && !fullPath.startsWith(basePathWithSep)) {\n return { valid: false, fullPath, basePath, error: 'Access denied: path outside allowed root' };\n }\n\n // Security: check blocked patterns\n const cfg = loadConfig();\n const fmCfg = (cfg as Record<string, unknown>).fileManager as { blockedPatterns?: string[] } | undefined;\n const blocked = fmCfg?.blockedPatterns || ['.ssh', '.env', '.aws', '.gnupg', 'node_modules', '.git/objects'];\n for (const pattern of blocked) {\n if (fullPath.includes(`/${pattern}`) || fullPath.endsWith(`/${pattern}`)) {\n return { valid: false, fullPath, basePath, error: `Access denied: blocked pattern \"${pattern}\"` };\n }\n }\n\n return { valid: true, fullPath, basePath };\n }\n\n // GET /api/files/roots — list configured root directories\n app.get('/api/files/roots', (_req, res) => {\n res.json({ roots: getFileRoots() });\n });\n\n // GET /api/files — list directory contents\n app.get('/api/files', (req, res) => {\n const reqPath = (req.query.path as string) || '';\n const rootParam = req.query.root as string | undefined;\n const { valid, fullPath, basePath, error } = validateFilePath(reqPath, rootParam);\n\n if (!valid) { res.status(403).json({ error }); return; }\n\n try {\n if (!fs.existsSync(fullPath)) { res.status(404).json({ error: 'Path not found' }); return; }\n const stat = fs.statSync(fullPath);\n if (!stat.isDirectory()) { res.status(400).json({ error: 'Not a directory. Use /api/files/read for files.' }); return; }\n\n const entries = fs.readdirSync(fullPath).map(name => {\n try {\n const entryPath = join(fullPath, name);\n const entryStat = fs.statSync(entryPath);\n return {\n name,\n path: reqPath ? `${reqPath}/${name}` : name,\n type: entryStat.isDirectory() ? 'directory' as const : 'file' as const,\n size: entryStat.size,\n modified: entryStat.mtime.toISOString(),\n };\n } catch {\n return { name, path: reqPath ? `${reqPath}/${name}` : name, type: 'file' as const, size: 0, modified: '' };\n }\n });\n entries.sort((a, b) => {\n if (a.type !== b.type) return a.type === 'directory' ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n res.json({ path: reqPath || '/', entries, basePath });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // GET /api/files/read — read file contents\n app.get('/api/files/read', (req, res) => {\n const reqPath = req.query.path as string;\n if (!reqPath) { res.status(400).json({ error: 'path parameter required' }); return; }\n const rootParam = req.query.root as string | undefined;\n const { valid, fullPath, error } = validateFilePath(reqPath, rootParam);\n\n if (!valid) { res.status(403).json({ error }); return; }\n\n try {\n if (!fs.existsSync(fullPath)) { res.status(404).json({ error: 'File not found' }); return; }\n const stat = fs.statSync(fullPath);\n if (stat.isDirectory()) { res.status(400).json({ error: 'Path is a directory' }); return; }\n\n const MAX_SIZE = 1024 * 1024;\n if (stat.size > MAX_SIZE) {\n const content = fs.readFileSync(fullPath, 'utf-8').slice(0, MAX_SIZE);\n res.json({ path: reqPath, content, truncated: true, size: stat.size, modified: stat.mtime.toISOString() });\n return;\n }\n\n const content = fs.readFileSync(fullPath, 'utf-8');\n res.json({ path: reqPath, content, truncated: false, size: stat.size, modified: stat.mtime.toISOString() });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // POST /api/files/write — create or overwrite a file\n app.post('/api/files/write', express.json(), (req, res) => {\n const { path: reqPath, content, root: rootParam } = req.body as { path?: string; content?: string; root?: string };\n if (!reqPath) { res.status(400).json({ error: 'path required' }); return; }\n if (content === undefined) { res.status(400).json({ error: 'content required' }); return; }\n\n const { valid, fullPath, error } = validateFilePath(reqPath, rootParam);\n if (!valid) { res.status(403).json({ error }); return; }\n\n try {\n const dir = dirname(fullPath);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(fullPath, content, 'utf-8');\n const stat = fs.statSync(fullPath);\n res.json({ success: true, path: reqPath, size: stat.size, modified: stat.mtime.toISOString() });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // POST /api/files/mkdir — create a directory\n app.post('/api/files/mkdir', express.json(), (req, res) => {\n const { path: reqPath, root: rootParam } = req.body as { path?: string; root?: string };\n if (!reqPath) { res.status(400).json({ error: 'path required' }); return; }\n\n const { valid, fullPath, error } = validateFilePath(reqPath, rootParam);\n if (!valid) { res.status(403).json({ error }); return; }\n\n try {\n if (fs.existsSync(fullPath)) { res.status(409).json({ error: 'Path already exists' }); return; }\n fs.mkdirSync(fullPath, { recursive: true });\n res.json({ success: true, path: reqPath });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // POST /api/files/rename — rename or move a file/directory\n app.post('/api/files/rename', express.json(), (req, res) => {\n const { oldPath, newPath, root: rootParam } = req.body as { oldPath?: string; newPath?: string; root?: string };\n if (!oldPath || !newPath) { res.status(400).json({ error: 'oldPath and newPath required' }); return; }\n\n const oldValidation = validateFilePath(oldPath, rootParam);\n const newValidation = validateFilePath(newPath, rootParam);\n if (!oldValidation.valid) { res.status(403).json({ error: oldValidation.error }); return; }\n if (!newValidation.valid) { res.status(403).json({ error: newValidation.error }); return; }\n\n try {\n if (!fs.existsSync(oldValidation.fullPath)) { res.status(404).json({ error: 'Source not found' }); return; }\n if (fs.existsSync(newValidation.fullPath)) { res.status(409).json({ error: 'Destination already exists' }); return; }\n fs.renameSync(oldValidation.fullPath, newValidation.fullPath);\n res.json({ success: true, oldPath, newPath });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // DELETE /api/files/delete — delete a file or empty directory\n app.delete('/api/files/delete', (req, res) => {\n const reqPath = req.query.path as string;\n const rootParam = req.query.root as string | undefined;\n if (!reqPath) { res.status(400).json({ error: 'path required' }); return; }\n\n const { valid, fullPath, error } = validateFilePath(reqPath, rootParam);\n if (!valid) { res.status(403).json({ error }); return; }\n\n try {\n if (!fs.existsSync(fullPath)) { res.status(404).json({ error: 'Not found' }); return; }\n const stat = fs.statSync(fullPath);\n if (stat.isDirectory()) {\n const contents = fs.readdirSync(fullPath);\n if (contents.length > 0) { res.status(400).json({ error: 'Directory not empty. Delete contents first.' }); return; }\n fs.rmdirSync(fullPath);\n } else {\n fs.unlinkSync(fullPath);\n }\n res.json({ success: true, path: reqPath });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── File Upload API ─────────────────────────────────────\n const UPLOADS_DIR = join(homedir(), '.titan', 'uploads');\n\n app.post('/api/files/upload', express.raw({ type: ['application/octet-stream', 'multipart/form-data', 'image/*', 'audio/*', 'video/*', 'application/pdf', 'application/zip'], limit: '50mb' }), (req, res) => {\n try {\n const fileName = (req.headers['x-filename'] as string) || `upload-${Date.now()}`;\n const safeName = fileName.replace(/[^a-zA-Z0-9._-]/g, '_').slice(0, 100);\n const sessionId = (req.headers['x-session-id'] as string) || 'default';\n\n // Handle both raw Buffer and JSON-parsed body\n const body = Buffer.isBuffer(req.body) ? req.body : Buffer.from(JSON.stringify(req.body));\n if (!body || body.length === 0) {\n res.status(400).json({ error: 'Empty upload body' });\n return;\n }\n\n // Create session-specific upload dir\n const sessionDir = join(UPLOADS_DIR, sessionId);\n if (!fs.existsSync(sessionDir)) fs.mkdirSync(sessionDir, { recursive: true });\n\n const filePath = join(sessionDir, safeName);\n fs.writeFileSync(filePath, body);\n\n const stat = fs.statSync(filePath);\n logger.info(COMPONENT, `File uploaded: ${safeName} (${(stat.size / 1024).toFixed(0)}KB) → session ${sessionId}`);\n\n res.json({\n ok: true,\n file: {\n name: safeName,\n path: filePath,\n size: stat.size,\n session: sessionId,\n uploadedAt: new Date().toISOString(),\n },\n });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/files/uploads', (req, res) => {\n try {\n const sessionId = (req.query.session as string) || 'default';\n const sessionDir = join(UPLOADS_DIR, sessionId);\n if (!fs.existsSync(sessionDir)) { res.json({ files: [] }); return; }\n\n const files = fs.readdirSync(sessionDir).map(name => {\n const stat = fs.statSync(join(sessionDir, name));\n return { name, size: stat.size, modified: stat.mtime.toISOString() };\n });\n res.json({ files, session: sessionId });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.delete('/api/files/uploads/:name', (req, res) => {\n try {\n const sessionId = (req.query.session as string) || 'default';\n const filePath = join(UPLOADS_DIR, sessionId, req.params.name.replace(/[^a-zA-Z0-9._-]/g, '_'));\n if (!filePath.startsWith(UPLOADS_DIR)) { res.status(403).json({ error: 'Access denied' }); return; }\n if (fs.existsSync(filePath)) fs.unlinkSync(filePath);\n res.json({ ok: true });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Audit API ────────────────────────────────────────────\n\n app.get('/api/audit', (req, res) => {\n const query = {\n since: req.query.since as string | undefined,\n until: req.query.until as string | undefined,\n action: req.query.action as string | undefined,\n source: req.query.source as string | undefined,\n tool: req.query.tool as string | undefined,\n limit: req.query.limit ? parseInt(req.query.limit as string, 10) : 100,\n };\n res.json({ entries: queryAuditLog(query) });\n });\n\n app.get('/api/audit/stats', (req, res) => {\n const hours = req.query.hours ? parseInt(req.query.hours as string, 10) : 24;\n res.json(getAuditStats(hours));\n });\n\n // ── Vulnerability Scan API ────────────────────────────────\n\n app.get('/api/vulnerabilities', (_req, res) => {\n try {\n const reportPath = join(process.cwd(), 'dependency-scan-report.json');\n if (!fs.existsSync(reportPath)) {\n res.json({\n timestamp: new Date().toISOString(),\n vulnerabilities: { total: 0, critical: 0, high: 0, moderate: 0, low: 0 },\n outdated: [],\n deprecated: [],\n licenseIssues: [],\n totalDependencies: 0,\n directDependencies: 0,\n errors: ['No scan report found. Run: npm run scan:deps'],\n });\n return;\n }\n const report = JSON.parse(fs.readFileSync(reportPath, 'utf-8'));\n res.json(report);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n app.post('/api/vulnerabilities/scan', async (_req, res) => {\n try {\n const scanScript = join(process.cwd(), 'scripts', 'dependency-scan.cjs');\n if (!fs.existsSync(scanScript)) {\n res.status(404).json({ error: 'Scan script not found' });\n return;\n }\n\n const { exec } = await import('child_process');\n exec(`node ${scanScript}`, (error, stdout, stderr) => {\n if (error) {\n res.status(500).json({ error: error.message, output: stderr });\n return;\n }\n res.json({ success: true, output: stdout });\n });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Cron API ──────────────────────────────────────────────\n\n app.get('/api/cron', (_req, res) => {\n const store = getDb();\n res.json({ jobs: store.cronJobs });\n });\n\n app.post('/api/cron', (req, res) => {\n const { name, schedule, command } = req.body;\n if (!name || !schedule || !command) {\n res.status(400).json({ error: 'name, schedule, and command are required' }); return;\n }\n const store = getDb();\n const id = crypto.randomUUID();\n store.cronJobs.push({ id, name, schedule, command, enabled: true, created_at: new Date().toISOString() });\n res.status(201).json({ job: { id, name, schedule, command, enabled: true } });\n });\n\n app.post('/api/cron/:id/toggle', (req, res) => {\n const store = getDb();\n const job = store.cronJobs.find(j => j.id === req.params.id);\n if (!job) { res.status(404).json({ error: 'Cron job not found' }); return; }\n job.enabled = typeof req.body.enabled === 'boolean' ? req.body.enabled : !job.enabled;\n res.json({ job });\n });\n\n app.delete('/api/cron/:id', (req, res) => {\n const store = getDb();\n const idx = store.cronJobs.findIndex(j => j.id === req.params.id);\n if (idx === -1) { res.status(404).json({ error: 'Cron job not found' }); return; }\n store.cronJobs.splice(idx, 1);\n res.json({ deleted: true });\n });\n\n // ── Self-Improvement API ────────────────────────────────────\n app.get('/api/self-improve/history', async (_req, res) => {\n try {\n const { existsSync, readFileSync } = await import('fs');\n const { join } = await import('path');\n const { TITAN_HOME } = await import('../utils/constants.js');\n const historyPath = join(TITAN_HOME, 'self-improve', 'history.jsonl');\n if (!existsSync(historyPath)) {\n res.json({ sessions: [] });\n return;\n }\n const lines = readFileSync(historyPath, 'utf-8').split('\\n').filter((l: string) => l.trim());\n const sessions = lines.map((l: string) => {\n try { return JSON.parse(l); } catch { return null; }\n }).filter(Boolean);\n res.json({ sessions });\n } catch (e) {\n res.json({ sessions: [] });\n }\n });\n\n app.get('/api/self-improve/config', (_req, res) => {\n const cfg = loadConfig();\n res.json((cfg as Record<string, unknown>).selfImprove || {});\n });\n\n // ── Training Progress SSE Stream ─────────────────────────────────\n app.get('/api/training/stream', async (req, res) => {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n res.write('data: {\"type\":\"connected\",\"message\":\"Training progress stream connected\"}\\n\\n');\n\n // Import training events emitter\n let handler: ((event: unknown) => void) | null = null;\n try {\n const { trainingEvents } = await import('../skills/builtin/model_trainer.js');\n handler = (event: unknown) => {\n try {\n res.write(`data: ${JSON.stringify(event)}\\n\\n`);\n } catch { /* client disconnected */ }\n };\n trainingEvents.on('progress', handler);\n } catch { /* model_trainer not loaded */ }\n\n // Send recent progress log as catch-up (last 50 entries)\n try {\n const { existsSync, readFileSync } = await import('fs');\n const { join } = await import('path');\n const { TITAN_HOME } = await import('../utils/constants.js');\n const logPath = join(TITAN_HOME, 'training-progress.jsonl');\n if (existsSync(logPath)) {\n const lines = readFileSync(logPath, 'utf-8').split('\\n').filter((l: string) => l.trim());\n const recent = lines.slice(-50);\n for (const line of recent) {\n try { res.write(`data: ${line}\\n\\n`); } catch { break; }\n }\n }\n } catch { /* best-effort */ }\n\n // Keep alive\n const keepAlive = setInterval(() => {\n try { res.write(': keepalive\\n\\n'); } catch { clearInterval(keepAlive); }\n }, 15_000);\n\n req.on('close', () => {\n clearInterval(keepAlive);\n if (handler) {\n import('../skills/builtin/model_trainer.js')\n .then(m => m.trainingEvents.off('progress', handler!))\n .catch(() => {});\n }\n });\n });\n\n // ── Training Progress Log (poll fallback) ──────────────────────\n app.get('/api/training/progress', async (req, res) => {\n try {\n const { existsSync, readFileSync } = await import('fs');\n const { join } = await import('path');\n const { TITAN_HOME } = await import('../utils/constants.js');\n const logPath = join(TITAN_HOME, 'training-progress.jsonl');\n if (!existsSync(logPath)) {\n res.json({ events: [] });\n return;\n }\n const lines = readFileSync(logPath, 'utf-8').split('\\n').filter((l: string) => l.trim());\n const since = req.query.since as string | undefined;\n let events = lines.map((l: string) => { try { return JSON.parse(l); } catch { return null; } }).filter(Boolean);\n if (since) {\n events = events.filter((e: { timestamp?: string }) => e.timestamp && e.timestamp > since);\n }\n // Return last 100\n res.json({ events: events.slice(-100) });\n } catch {\n res.json({ events: [] });\n }\n });\n\n // ── Clear training progress log ────────────────────────────────\n app.delete('/api/training/progress', async (_req, res) => {\n try {\n const { writeFileSync } = await import('fs');\n const { join } = await import('path');\n const { TITAN_HOME } = await import('../utils/constants.js');\n writeFileSync(join(TITAN_HOME, 'training-progress.jsonl'), '', 'utf-8');\n res.json({ cleared: true });\n } catch {\n res.status(500).json({ error: 'Failed to clear' });\n }\n });\n\n app.get('/api/training/runs', async (_req, res) => {\n try {\n const { existsSync, readdirSync, readFileSync } = await import('fs');\n const { join } = await import('path');\n const { TITAN_HOME } = await import('../utils/constants.js');\n const runsDir = join(TITAN_HOME, 'training-runs');\n if (!existsSync(runsDir)) {\n res.json({ runs: [] });\n return;\n }\n const dirs = readdirSync(runsDir, { withFileTypes: true })\n .filter((d: { isDirectory: () => boolean }) => d.isDirectory())\n .map((d: { name: string }) => d.name);\n const runs = dirs.map((dir: string) => {\n const metaPath = join(runsDir, dir, 'meta.json');\n const resultsPath = join(runsDir, dir, 'results.json');\n if (!existsSync(metaPath)) return null;\n const meta = JSON.parse(readFileSync(metaPath, 'utf-8'));\n if (existsSync(resultsPath)) {\n const results = JSON.parse(readFileSync(resultsPath, 'utf-8'));\n meta.status = results.status || 'completed';\n meta.finalLoss = results.final_loss;\n }\n return meta;\n }).filter(Boolean);\n res.json({ runs });\n } catch {\n res.json({ runs: [] });\n }\n });\n\n // ── Autoresearch API ──────────────────────────────────────────\n app.get('/api/autoresearch/results', (req, res) => {\n try {\n const type = req.query.type as string || 'tool_router';\n const resultsFile = type === 'agent' ? 'agent_results.json' : 'results.json';\n const resultsPath = join(TITAN_HOME, 'autoresearch', 'output', resultsFile);\n if (!fs.existsSync(resultsPath)) {\n res.json({ runs: [] });\n return;\n }\n const data = JSON.parse(fs.readFileSync(resultsPath, 'utf-8'));\n res.json({ runs: Array.isArray(data) ? data : [] });\n } catch {\n res.json({ runs: [] });\n }\n });\n\n app.get('/api/autoresearch/performance', (req, res) => {\n try {\n const type = req.query.type as string || 'tool_router';\n const resultsFile = type === 'agent' ? 'agent_results.json' : 'results.json';\n const resultsPath = join(TITAN_HOME, 'autoresearch', 'output', resultsFile);\n if (!fs.existsSync(resultsPath)) {\n res.json({ totalRuns: 0, bestScore: 0, avgImprovement: 0, baseline: 78.0 });\n return;\n }\n const runs = JSON.parse(fs.readFileSync(resultsPath, 'utf-8'));\n if (!Array.isArray(runs) || runs.length === 0) {\n res.json({ totalRuns: 0, bestScore: 0, avgImprovement: 0, baseline: 78.0 });\n return;\n }\n const baseline = 78.0;\n const bestScore = Math.max(...runs.map((r: any) => r.val_score || 0));\n const avgImprovement = runs.reduce((sum: number, r: any) => sum + ((r.val_score || 0) - baseline), 0) / runs.length;\n res.json({\n totalRuns: runs.length,\n bestScore: Math.round(bestScore * 100) / 100,\n avgImprovement: Math.round(avgImprovement * 100) / 100,\n baseline,\n lastRun: runs[runs.length - 1],\n });\n } catch {\n res.json({ totalRuns: 0, bestScore: 0, avgImprovement: 0, baseline: 78.0 });\n }\n });\n\n app.get('/api/autoresearch/status', (_req, res) => {\n res.json({ status: 'idle' });\n });\n\n app.get('/api/autoresearch/benchmark', (_req, res) => {\n try {\n const benchPath = join(TITAN_HOME, 'autoresearch', 'output', 'benchmark_results.json');\n if (!fs.existsSync(benchPath)) {\n res.json({ benchmark: null });\n return;\n }\n res.json({ benchmark: JSON.parse(fs.readFileSync(benchPath, 'utf-8')) });\n } catch {\n res.json({ benchmark: null });\n }\n });\n\n app.post('/api/autoresearch/trigger', async (req, res) => {\n try {\n const type = req.body?.type || 'tool_router';\n const config = req.body?.config || {};\n const prompt = type === 'agent'\n ? `Run an agent model training experiment using train_start with baseModel=\"${config.baseModel || 'qwen2.5:32b'}\" method=\"lora\" epochs=${config.epochs || 2} budgetMinutes=${config.timeBudgetMin || 60}. This is for the Main Agent model, use the agent training pipeline (train_agent.py on Titan PC).`\n : 'Run an autoresearch training experiment. Use the train_start tool with default settings.';\n const response = await processMessage(\n prompt,\n `autoresearch-trigger-${type}`,\n 'system',\n {}\n );\n res.json({ success: true, content: response.content?.slice(0, 500) });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/autoresearch/generate-data', async (req, res) => {\n try {\n const type = req.body?.type || 'tool_router';\n const trainHost = process.env.TITAN_TRAIN_HOST || 'localhost';\n const trainUser = process.env.TITAN_TRAIN_USER || process.env.USER || 'user';\n const prompt = type === 'agent'\n ? `Generate training data for the Main Agent model. Run the generate_agent_data.py script via SSH: ssh ${trainUser}@${trainHost} \"~/.titan/venv/bin/python3 ~/.titan/autoresearch/generate_agent_data.py --no-llm\"`\n : `Generate training data for the tool router model. Run the generate_data.py script via SSH: ssh ${trainUser}@${trainHost} \"~/.titan/venv/bin/python3 ~/.titan/autoresearch/generate_data.py\"`;\n const response = await processMessage(prompt, `autoresearch-gendata-${type}`, 'system', {});\n res.json({ success: true, content: response.content?.slice(0, 500) });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/autoresearch/deploy', async (req, res) => {\n try {\n const type = req.body?.type || 'tool_router';\n const modelName = type === 'agent' ? 'titan-agent' : 'titan-qwen';\n const prompt = `Deploy the best trained ${type === 'agent' ? 'agent' : 'tool router'} model to Ollama as \"${modelName}\". Run the deploy script on Titan PC via SSH.`;\n const response = await processMessage(prompt, `autoresearch-deploy-${type}`, 'system', {});\n res.json({ success: true, content: response.content?.slice(0, 500) });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Recipe Run API ────────────────────────────────────────\n\n app.post('/api/recipes/:id/run', async (req, res) => {\n const recipe = getRecipe(req.params.id);\n if (!recipe) { res.status(404).json({ error: 'Recipe not found' }); return; }\n try {\n const params = req.body.params || {};\n const steps: Array<{ stepIndex: number; prompt: string }> = [];\n for await (const step of runRecipe(req.params.id, params)) {\n steps.push({ stepIndex: step.stepIndex, prompt: step.prompt });\n }\n res.json({ recipe: recipe.name, stepsExecuted: steps.length, steps });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Voice ──────────────────────────────────────────────────\n app.get('/api/voice/status', async (_req, res) => {\n const cfg = loadConfig();\n const voice = cfg.voice;\n if (!voice.enabled) {\n res.json({ available: false, reason: 'Voice not enabled in config' });\n return;\n }\n try {\n // Ping LiveKit server health endpoint\n const livekitHttp = voice.livekitUrl.replace('ws://', 'http://').replace('wss://', 'https://');\n const resp = await fetch(livekitHttp, { signal: AbortSignal.timeout(3000) });\n res.json({\n available: resp.ok,\n livekitUrl: voice.livekitUrl,\n ttsVoice: voice.ttsVoice,\n });\n } catch {\n res.json({ available: false, livekitUrl: voice.livekitUrl, reason: 'LiveKit server unreachable' });\n }\n });\n\n app.get('/api/voice/config', (_req, res) => {\n const cfg = loadConfig();\n res.json(cfg.voice);\n });\n\n // LiveKit token generation (ported from titan-voice-ui)\n app.post('/api/livekit/token', async (req, res) => {\n const cfg = loadConfig();\n if (!cfg.voice?.enabled) {\n res.status(404).json({ error: 'Voice not enabled' });\n return;\n }\n if (!cfg.voice.livekitApiKey || !cfg.voice.livekitApiSecret) {\n res.status(503).json({ error: 'LiveKit not configured — set voice.livekitApiKey and voice.livekitApiSecret in titan.json' });\n return;\n }\n try {\n const lkModule = 'livekit-server-sdk';\n const livekitSdk: any = await import(lkModule).catch(() => null);\n if (!livekitSdk?.AccessToken) {\n res.status(503).json({ error: 'livekit-server-sdk not installed. Run: npm install livekit-server-sdk' });\n return;\n }\n const { AccessToken } = livekitSdk;\n const participantIdentity = `voice_user_${Math.floor(Math.random() * 10_000)}`;\n const roomName = `voice_room_${Math.floor(Math.random() * 10_000)}`;\n const at = new AccessToken(cfg.voice.livekitApiKey, cfg.voice.livekitApiSecret, {\n identity: participantIdentity,\n name: 'user',\n ttl: '15m',\n });\n at.addGrant({\n room: roomName,\n roomJoin: true,\n canPublish: true,\n canPublishData: true,\n canSubscribe: true,\n });\n // Use the browser's request hostname so LiveKit URL works over Tailscale / remote\n let serverUrl = cfg.voice.livekitUrl;\n try {\n const reqHost = req.hostname || req.headers.host?.split(':')[0];\n if (reqHost) {\n const parsed = new URL(serverUrl);\n parsed.hostname = reqHost;\n serverUrl = parsed.toString().replace(/\\/$/, '');\n }\n } catch { /* keep original */ }\n res.json({\n serverUrl,\n roomName,\n participantName: 'user',\n participantToken: await at.toJwt(),\n });\n } catch (err) {\n logger.error(COMPONENT, `LiveKit token error: ${(err as Error).message}`);\n res.status(500).json({ error: 'Failed to generate LiveKit token. Is livekit-server-sdk installed?' });\n }\n });\n\n // Voice health check (F5-TTS only)\n app.get('/api/voice/health', async (_req, res) => {\n const cfg = loadConfig();\n if (!cfg.voice?.enabled) {\n res.json({ livekit: false, stt: false, tts: false, agent: false, overall: false, ttsEngine: cfg.voice?.ttsEngine || 'f5-tts' });\n return;\n }\n const engine = cfg.voice.ttsEngine || 'f5-tts';\n const results = { livekit: false, stt: false, tts: false, agent: false, overall: false, ttsEngine: engine };\n const sttUrl = cfg.voice.sttUrl || 'http://localhost:48421';\n const ttsUrl = cfg.voice.ttsUrl || 'http://localhost:5006';\n const sttEngine = cfg.voice.sttEngine || 'faster-whisper';\n const nvidia = (cfg as Record<string, unknown>).nvidia as Record<string, unknown> | undefined;\n const asrCfg = nvidia?.asr as Record<string, unknown> | undefined;\n const sttHealthUrl = sttEngine === 'nemotron-asr'\n ? `${(asrCfg?.healthUrl as string) || 'http://localhost:9000'}/v1/health/ready`\n : `${sttUrl}/health`;\n const checks = [\n { key: 'livekit' as const, url: cfg.voice.livekitUrl.replace('ws://', 'http://').replace('wss://', 'https://') },\n { key: 'agent' as const, url: cfg.voice.agentUrl },\n { key: 'stt' as const, url: sttHealthUrl },\n ];\n await Promise.allSettled(checks.map(async ({ key, url }) => {\n try {\n const resp = await fetch(url, { signal: AbortSignal.timeout(3000) });\n results[key] = resp.ok || resp.status < 500;\n } catch { results[key] = false; }\n }));\n // TTS health check — F5-TTS only\n try {\n let resp = await fetch(`${ttsUrl}/health`, { signal: AbortSignal.timeout(3000) }).catch(() => null);\n if (!resp || resp.status >= 400) {\n // No /health endpoint — try a lightweight speech probe\n const voice = cfg.voice.ttsVoice || 'andrew';\n resp = await fetch(`${ttsUrl}/v1/audio/speech`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ model: 'f5-tts', input: '.', voice, response_format: 'pcm' }),\n signal: AbortSignal.timeout(10000),\n });\n }\n results.tts = resp ? resp.status < 500 : false;\n } catch { results.tts = false; }\n results.overall = results.tts;\n res.json(results);\n });\n\n // ── NVIDIA Health Checks ─────────────────────────────────────────────\n app.get('/api/nvidia/health/cuopt', async (_req, res) => {\n const cfg = loadConfig();\n const nvidia = (cfg as Record<string, unknown>).nvidia as Record<string, unknown> | undefined;\n const cuoptUrl = ((nvidia?.cuopt as Record<string, unknown>)?.url as string) || 'http://localhost:5000';\n try {\n const resp = await fetch(`${cuoptUrl}/cuopt/health`, { signal: AbortSignal.timeout(5000) });\n res.json({ healthy: resp.ok, status: resp.status, url: cuoptUrl });\n } catch {\n res.json({ healthy: false, url: cuoptUrl });\n }\n });\n\n app.get('/api/nvidia/health/asr', async (_req, res) => {\n const cfg = loadConfig();\n const nvidia = (cfg as Record<string, unknown>).nvidia as Record<string, unknown> | undefined;\n const healthUrl = ((nvidia?.asr as Record<string, unknown>)?.healthUrl as string) || 'http://localhost:9000';\n try {\n const resp = await fetch(`${healthUrl}/v1/health/ready`, { signal: AbortSignal.timeout(5000) });\n res.json({ healthy: resp.ok, status: resp.status, url: healthUrl });\n } catch {\n res.json({ healthy: false, url: healthUrl });\n }\n });\n\n app.get('/api/nvidia/health/nim', async (_req, res) => {\n const cfg = loadConfig();\n const nvidia = (cfg as Record<string, unknown>).nvidia as Record<string, unknown> | undefined;\n const apiKey = (nvidia?.apiKey as string) || process.env.NVIDIA_API_KEY || '';\n if (!apiKey) {\n res.json({ healthy: false, reason: 'No NVIDIA API key configured' });\n return;\n }\n try {\n const resp = await fetch('https://integrate.api.nvidia.com/v1/models', {\n headers: { 'Authorization': `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(8000),\n });\n res.json({ healthy: resp.ok, status: resp.status });\n } catch {\n res.json({ healthy: false, reason: 'NIM API unreachable' });\n }\n });\n\n // Voice preview — F5-TTS only\n app.post('/api/voice/preview', async (req, res) => {\n const cfg = loadConfig();\n const engine = cfg.voice?.ttsEngine || 'f5-tts';\n const voiceId = req.body?.voice || cfg.voice?.ttsVoice || 'andrew';\n const rawText = req.body?.text || 'Hey! I\\'m TITAN, your AI assistant.';\n const text = rawText.length > 500 ? rawText.slice(0, 497) + '...' : rawText;\n const ttsUrl = cfg.voice?.ttsUrl || 'http://localhost:5006';\n logger.info('Gateway', `TTS [${engine}] request: voice=${voiceId}, text=${text.slice(0, 80)}...`);\n\n try {\n const ttsRes = await fetch(`${ttsUrl}/v1/audio/speech`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ model: 'f5-tts-mlx', input: text, voice: voiceId, response_format: 'wav' }),\n signal: AbortSignal.timeout(60000),\n });\n\n if (!ttsRes.ok) {\n res.status(502).json({ error: `TTS service unavailable`, status: ttsRes.status });\n return;\n }\n res.setHeader('Content-Type', 'audio/wav');\n const buffer = Buffer.from(await ttsRes.arrayBuffer());\n res.send(buffer);\n } catch (err) {\n res.status(502).json({ error: `TTS service unavailable` });\n }\n });\n\n // ── Streaming voice endpoint: LLM → sentence chunking → TTS per sentence ──\n // Returns SSE with interleaved text and audio events for low-latency voice\n app.post('/api/voice/stream', rateLimit(60000, 30), concurrencyGuard(10), async (req, res) => {\n const { content, sessionId: requestedSessionId, voice: reqVoice } = req.body || {};\n if (!content) { res.status(400).json({ error: 'content is required' }); return; }\n\n const cfg = loadConfig();\n const ttsUrl = cfg.voice?.ttsUrl || 'http://localhost:5006';\n const ttsEngine = cfg.voice?.ttsEngine || 'f5-tts';\n const voiceId = reqVoice || cfg.voice?.ttsVoice || 'andrew';\n const channel = 'voice';\n const userId = 'voice-user';\n\n // SSE setup\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n res.flushHeaders();\n\n let clientDisconnected = false;\n res.on('close', () => { clientDisconnected = true; });\n const safeWrite = (data: string) => {\n if (clientDisconnected) return;\n try { res.write(data); } catch { clientDisconnected = true; }\n };\n\n // SSE heartbeat — keeps the connection alive during LLM inference\n const heartbeat = setInterval(() => {\n if (clientDisconnected) { clearInterval(heartbeat); return; }\n safeWrite(': heartbeat\\n\\n');\n }, 2000);\n\n const abortController = new AbortController();\n if (requestedSessionId) {\n sessionAborts.set(requestedSessionId, abortController);\n sessionAbortTimes.set(requestedSessionId, Date.now());\n }\n\n // Auto-detect TTS availability — probe F5-TTS once at stream start\n let effectiveTtsEngine: string = ttsEngine;\n const effectiveTtsUrl = ttsUrl;\n const effectiveTtsModel = 'f5-tts-mlx';\n\n try {\n const probe = await fetch(`${effectiveTtsUrl}/health`, { signal: AbortSignal.timeout(5000) });\n if (!probe.ok) effectiveTtsEngine = 'unavailable';\n } catch {\n effectiveTtsEngine = 'unavailable';\n logger.warn(COMPONENT, `F5-TTS unreachable at ${effectiveTtsUrl}`);\n }\n // Tell the client which TTS engine is active\n safeWrite(`event: tts_mode\\ndata: ${JSON.stringify({ engine: effectiveTtsEngine })}\\n\\n`);\n\n // Sentence buffer and sequential TTS queue\n let tokenBuffer = '';\n let sentenceIndex = 0;\n let firstChunkSent = false;\n let totalTtsChars = 0;\n const FIRST_CHUNK_MIN = 60; // chars before forcing first flush (low TTFA)\n const MAX_TTS_SENTENCES = 50; // generous limit — let full responses be spoken\n const MAX_TTS_CHARS = 10000; // ~5 minutes of speech at 150 WPM\n\n // Sequential TTS queue — processes one sentence at a time to avoid overwhelming F5-TTS\n const ttsQueue: Array<{ sentence: string; index: number }> = [];\n let ttsRunning = false;\n let ttsResolve: (() => void) = () => {};\n const ttsAllDone = new Promise<void>(resolve => { ttsResolve = resolve; });\n let ttsFinished = false;\n\n const processTtsQueue = async () => {\n if (ttsRunning) return;\n ttsRunning = true;\n while (ttsQueue.length > 0) {\n if (clientDisconnected) break;\n const item = ttsQueue.shift()!;\n await fireTTSInternal(item.sentence, item.index);\n }\n ttsRunning = false;\n if (ttsFinished && ttsQueue.length === 0) {\n ttsResolve();\n }\n };\n\n // Strip markdown/emotion/tool narration/TOOLCALL tags for voice display+TTS\n const cleanForVoice = (text: string): string => {\n return text\n .replace(/<TOOLCALL>[\\s\\S]*?(?:<\\/TOOLCALL>|$)/g, '') // strip <TOOLCALL> blocks\n .replace(/<TOOLCALL>\\[[\\s\\S]*?\\]/g, '') // strip <TOOLCALL>[...] format\n .replace(/```[\\s\\S]*?```/g, '') // strip code blocks\n .replace(/`[^`]+`/g, (m) => m.slice(1, -1)) // unwrap inline code (keep text)\n .replace(/\\*\\*(.*?)\\*\\*/g, '$1') // bold → plain\n .replace(/\\*(.*?)\\*/g, '$1') // italic → plain\n .replace(/^#+\\s+/gm, '') // headings → plain\n .replace(/^\\d+\\.\\s+/gm, '') // numbered lists → plain\n .replace(/^[-*]\\s+/gm, '') // bullet points → plain\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1') // [links](url) → link text\n .replace(/https?:\\/\\/\\S+/g, '') // strip bare URLs\n .replace(/\\n{2,}/g, '. ') // paragraph breaks → sentence break\n .replace(/\\n/g, ' ') // single newlines → space\n .replace(/<(?:laugh|chuckle|sigh|cough|sniffle|groan|yawn|gasp|smile)>/gi, '')\n .replace(/(?:Let me |I'll |I will |I'm going to )(?:use|call|check|run|invoke|execute|try)(?: the)? \\w[\\w_]*(?: tool)?(?:\\s+(?:to|for|and)\\b[^.!?]*)?[.!]?\\s*/gi, '')\n .replace(/\\b(?:Using|Calling|Running|Checking|Invoking|Executing) (?:the )?\\w[\\w_]*(?: tool)?(?:\\s+(?:to|for)\\b[^.!?]*)?[.!]?\\s*/gi, '')\n .replace(/\\s{2,}/g, ' ')\n // TTS cadence fixes — natural breathing pauses for voice\n .replace(/(\\w)\\s*—\\s*(\\w)/g, '$1, $2') // em dashes between words → comma pause\n .replace(/(\\w)\\s*–\\s*(\\w)/g, '$1, $2') // en dashes between words → comma pause\n .replace(/;\\s*/g, '. ') // semicolons → sentence break\n .replace(/\\(([^)]+)\\)/g, ', $1,') // parentheses → comma-wrapped\n // Break long clauses at major conjunctions (but not inside short lists)\n .replace(/([a-z]{4,}),\\s*(but|yet|so|however|although)\\s+/gi, '$1. $2 ') // clause-level breaks\n .replace(/\\.\\s*\\./g, '.') // clean up double periods\n .replace(/,\\s*\\./g, '.') // clean up comma-period\n .replace(/\\s{2,}/g, ' ')\n .trim();\n };\n\n // Fire TTS for a single sentence — called sequentially from the queue\n const fireTTSInternal = async (sentence: string, index: number) => {\n const clean = cleanForVoice(sentence);\n if (!clean || clean.length < 3) return;\n\n // Send text event so client can display it (skip for F5-TTS — already sent during buffering)\n if (!isF5TTS) {\n safeWrite(`event: sentence\\ndata: ${JSON.stringify({ text: clean, index })}\\n\\n`);\n }\n\n // Skip audio if we've exceeded TTS limits (still display text)\n if (index >= MAX_TTS_SENTENCES || totalTtsChars >= MAX_TTS_CHARS) return;\n totalTtsChars += clean.length;\n\n try {\n const ttsRes = await fetch(`${effectiveTtsUrl}/v1/audio/speech`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ model: effectiveTtsModel, input: clean, voice: voiceId, response_format: 'wav' }),\n signal: AbortSignal.timeout(60000),\n });\n if (ttsRes.ok && !clientDisconnected) {\n const audioBuffer = Buffer.from(await ttsRes.arrayBuffer());\n const audioBase64 = audioBuffer.toString('base64');\n safeWrite(`event: audio\\ndata: ${JSON.stringify({ index, audio: audioBase64, format: 'wav' })}\\n\\n`);\n }\n } catch (e) {\n logger.debug('Gateway', `Voice stream TTS failed for sentence ${index}: ${(e as Error).message}`);\n }\n };\n\n // For F5-TTS (f5-tts engine): batch ALL sentences into one TTS call after LLM finishes.\n // But cap at ~120 chars per call to avoid quality degradation on long text.\n const isF5TTS = effectiveTtsEngine === 'f5-tts';\n const f5Sentences: string[] = []; // accumulate clean sentences for post-LLM TTS\n\n // Flush accumulated buffer as a sentence — adds to sequential queue\n const flushSentence = (text: string) => {\n const trimmed = text.trim();\n if (trimmed.length < 3) return;\n\n if (isF5TTS) {\n // Send text event immediately so client can display in real-time\n const clean = cleanForVoice(trimmed);\n if (clean && clean.length >= 3) {\n safeWrite(`event: sentence\\ndata: ${JSON.stringify({ text: clean, index: sentenceIndex++ })}\\n\\n`);\n f5Sentences.push(clean);\n }\n return;\n }\n\n const idx = sentenceIndex++;\n ttsQueue.push({ sentence: trimmed, index: idx });\n processTtsQueue(); // kick off processing if not already running\n };\n\n activeLlmRequests++;\n titanActiveSessions.inc();\n const startTime = process.hrtime.bigint();\n\n try {\n const response = await routeMessage(content, channel, userId, {\n streamCallbacks: {\n onToken: (token: string) => {\n if (clientDisconnected) return;\n tokenBuffer += token;\n\n // Force first chunk early for low time-to-first-audio\n if (!firstChunkSent && tokenBuffer.length >= FIRST_CHUNK_MIN) {\n const lastSpace = tokenBuffer.lastIndexOf(' ');\n if (lastSpace > 30) {\n flushSentence(tokenBuffer.slice(0, lastSpace));\n tokenBuffer = tokenBuffer.slice(lastSpace + 1);\n firstChunkSent = true;\n return;\n }\n }\n\n // Split on newlines first — paragraph/list boundaries are natural sentence breaks\n if (tokenBuffer.includes('\\n')) {\n const lines = tokenBuffer.split('\\n');\n // Keep last fragment in buffer (may be incomplete)\n tokenBuffer = lines.pop() || '';\n for (const line of lines) {\n if (line.trim().length >= 3) {\n flushSentence(line);\n firstChunkSent = true;\n }\n }\n return;\n }\n\n // Detect sentence boundaries: .!?:; followed by space or end\n // Negative lookbehind avoids splitting on decimals like \"PM2.5\", \"8.8kW\", \"Dr.\", \"vs.\"\n // Loop to drain ALL complete sentences from buffer\n let match: RegExpMatchArray | null;\n while ((match = tokenBuffer.match(/^(.*?(?<!\\d)(?<!\\b(?:Dr|Mr|Mrs|Ms|vs|etc|e\\.g|i\\.e))[.!?])(\\s+|$)/s)) !== null) {\n flushSentence(match[1]);\n tokenBuffer = tokenBuffer.slice(match[0].length);\n firstChunkSent = true;\n }\n\n // Also split on colons/semicolons when buffer is getting long (natural pauses)\n if (tokenBuffer.length > 80) {\n const colonMatch = tokenBuffer.match(/^(.*?[:;])\\s+/s);\n if (colonMatch && colonMatch[1].length > 20) {\n flushSentence(colonMatch[1]);\n tokenBuffer = tokenBuffer.slice(colonMatch[0].length);\n firstChunkSent = true;\n return;\n }\n }\n\n // Force flush long runs without punctuation (bullet lists, etc.)\n if (tokenBuffer.length > 200) {\n // Try comma as a natural break point\n const commaPos = tokenBuffer.lastIndexOf(', ', 180);\n if (commaPos > 40) {\n flushSentence(tokenBuffer.slice(0, commaPos + 1));\n tokenBuffer = tokenBuffer.slice(commaPos + 2);\n firstChunkSent = true;\n } else {\n const lastSpace = tokenBuffer.lastIndexOf(' ', 180);\n if (lastSpace > 50) {\n flushSentence(tokenBuffer.slice(0, lastSpace));\n tokenBuffer = tokenBuffer.slice(lastSpace + 1);\n firstChunkSent = true;\n }\n }\n }\n },\n onToolCall: (name: string) => {\n // Notify client that tools are running (shows \"Thinking...\" state)\n safeWrite(`event: tool\\ndata: ${JSON.stringify({ name })}\\n\\n`);\n },\n },\n signal: abortController.signal,\n });\n\n // Flush remaining buffer\n if (tokenBuffer.trim()) {\n flushSentence(tokenBuffer);\n tokenBuffer = '';\n }\n\n // F5-TTS: generate audio in chunks of ~120 chars after LLM finishes.\n // Short enough for quality, long enough for voice consistency.\n if (isF5TTS && f5Sentences.length > 0) {\n const F5_MAX_CHUNK_CHARS = 600; // voice prompt limits to ~50 words; send as single chunk to avoid voice inconsistency\n const chunks: string[] = [];\n let current = '';\n for (const s of f5Sentences) {\n if (current && (current.length + s.length + 1) > F5_MAX_CHUNK_CHARS) {\n chunks.push(current);\n current = s;\n } else {\n current += (current ? ' ' : '') + s;\n }\n }\n if (current) chunks.push(current);\n\n let audioIdx = 0;\n for (const chunk of chunks) {\n if (clientDisconnected || totalTtsChars >= MAX_TTS_CHARS) break;\n totalTtsChars += chunk.length;\n try {\n const ttsRes = await fetch(`${effectiveTtsUrl}/v1/audio/speech`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ model: effectiveTtsModel, input: chunk, voice: voiceId, response_format: 'wav' }),\n signal: AbortSignal.timeout(120000),\n });\n if (ttsRes.ok && !clientDisconnected) {\n const audioBuffer = Buffer.from(await ttsRes.arrayBuffer());\n const audioBase64 = audioBuffer.toString('base64');\n safeWrite(`event: audio\\ndata: ${JSON.stringify({ index: audioIdx++, audio: audioBase64, format: 'wav' })}\\n\\n`);\n }\n } catch (e) {\n logger.debug('Gateway', `F5-TTS chunk ${audioIdx} failed: ${(e as Error).message}`);\n }\n }\n }\n\n // Signal no more sentences coming, wait for TTS queue to drain (non-F5 engines)\n ttsFinished = true;\n if (!ttsRunning && ttsQueue.length === 0) {\n ttsResolve();\n }\n if (!isF5TTS) {\n await ttsAllDone;\n }\n\n // ── Voice session poison detection ──────────────────────\n // If the model returned a canned/useless response, auto-reset the session\n // to prevent the next voice message from getting the same poisoned context.\n const responseText = response.content || '';\n if (VOICE_POISON_PATTERNS.some(p => p.test(responseText)) || (response.durationMs > 60000 && responseText.length < 50)) {\n logger.warn(COMPONENT, `[VoicePoisonGuard] Detected canned/stale response — resetting voice session ${response.sessionId}`);\n try {\n const { closeSession } = await import('../agent/session.js');\n closeSession(response.sessionId);\n } catch { /* session module may not export closeSession */ }\n }\n\n // Send done event with metadata\n if (!clientDisconnected) {\n safeWrite(`event: done\\ndata: ${JSON.stringify({\n sessionId: response.sessionId,\n model: response.model,\n durationMs: response.durationMs,\n toolsUsed: response.toolsUsed,\n fullText: response.content,\n })}\\n\\n`);\n try { res.end(); } catch { /* client gone */ }\n }\n } catch (error) {\n if (!clientDisconnected) {\n safeWrite(`event: done\\ndata: ${JSON.stringify({ error: (error as Error).message })}\\n\\n`);\n try { res.end(); } catch { /* client gone */ }\n }\n } finally {\n clearInterval(heartbeat);\n activeLlmRequests--;\n titanActiveSessions.dec();\n const durationSec = Number(process.hrtime.bigint() - startTime) / 1e9;\n titanRequestDuration.observe(durationSec, { channel });\n if (requestedSessionId) sessionAborts.delete(requestedSessionId);\n }\n });\n\n // Voice available voices — engine-aware\n app.get('/api/voice/voices', async (_req, res) => {\n const cfg = loadConfig();\n const engine = cfg.voice?.ttsEngine || 'f5-tts';\n const ttsUrl = cfg.voice?.ttsUrl || 'http://localhost:5006';\n\n if (engine === 'f5-tts') {\n // Return cloned voices from ~/.titan/voices/\n const voicesDir = join(homedir(), '.titan', 'voices');\n try {\n const files = fs.existsSync(voicesDir) ? fs.readdirSync(voicesDir).filter((f: string) => f.endsWith('.wav')) : [];\n const voiceNames = files.map((f: string) => f.replace('.wav', ''));\n // Always include 'default' as fallback\n const voices = voiceNames.length ? voiceNames : ['default'];\n res.json({ voices, engine: 'f5-tts' });\n } catch {\n res.json({ voices: ['default'], engine: 'f5-tts' });\n }\n return;\n }\n\n // F5-TTS (default)\n try {\n const ttsRes = await fetch(`${ttsUrl}/v1/audio/voices`, { signal: AbortSignal.timeout(3000) });\n if (!ttsRes.ok) { res.json({ voices: F5_TTS_DEFAULT_VOICES, engine: 'f5-tts' }); return; }\n const data = await ttsRes.json() as { voices?: string[] };\n res.json({ ...data, engine: 'f5-tts' });\n } catch {\n res.json({ voices: F5_TTS_DEFAULT_VOICES, engine: 'f5-tts' });\n }\n });\n\n // v4.3.3: simple GET TTS used by the /call live-voice page.\n // Query: text=..., voice=andrew, format=mp3, token=<bearer>\n // Returns: raw audio bytes. Designed for <audio src=\"...\"> tag usage so\n // the browser can stream + play without a fetch() + Blob dance.\n app.get('/api/voice/tts', async (req, res) => {\n try {\n const text = (req.query.text as string || '').slice(0, 2000);\n const voice = (req.query.voice as string) || 'andrew';\n const format = ((req.query.format as string) || 'mp3').toLowerCase();\n if (!text.trim()) { res.status(400).json({ error: 'text required' }); return; }\n\n // F5-TTS only as of v5.0 — voice.ttsUrl always points to the F5-TTS\n // server (default :5006). Andrew voice is the default reference clone.\n const cfg = loadConfig();\n const ttsUrl = cfg.voice?.ttsUrl || 'http://localhost:5006';\n\n const ttsRes = await fetch(`${ttsUrl}/v1/audio/speech`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ input: text, voice, response_format: format }),\n signal: AbortSignal.timeout(180_000),\n });\n\n if (!ttsRes || !ttsRes.ok) {\n res.status(502).json({ error: 'tts backends unavailable' });\n return;\n }\n\n const contentType = ttsRes.headers.get('content-type') || (format === 'wav' ? 'audio/wav' : 'audio/mpeg');\n const buf = Buffer.from(await ttsRes.arrayBuffer());\n res.setHeader('Content-Type', contentType);\n res.setHeader('Content-Length', String(buf.length));\n res.setHeader('Cache-Control', 'no-store');\n res.send(buf);\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── F5-TTS Voice Cloning ─────────────────────────────────────────\n // (Orpheus TTS support removed in v5.0 — voice is F5-TTS only.)\n const F5_TTS_PORT = 5006;\n const F5_TTS_MODEL = 'f5-tts-mlx';\n\n app.get('/api/voice/f5tts/status', async (_req, res) => {\n let running = false;\n try {\n const probe = await fetch(`http://localhost:${F5_TTS_PORT}/health`, { signal: AbortSignal.timeout(3000) });\n running = probe.ok;\n } catch { /* not running */ }\n // List available cloned voices\n const voicesDir = join(homedir(), '.titan', 'voices');\n let voices: string[] = [];\n try {\n if (fs.existsSync(voicesDir)) {\n voices = fs.readdirSync(voicesDir)\n .filter((f: string) => f.endsWith('.wav'))\n .map((f: string) => f.replace('.wav', ''));\n }\n } catch { /* ignore */ }\n res.json({ installed: true, running, voices, port: F5_TTS_PORT, model: F5_TTS_MODEL });\n });\n\n // Tracks the spawned F5-TTS server pid. Variable is named for the legacy\n // venv directory (~/.titan/qwen3tts-venv) which we keep as a stable\n // on-disk path so existing installs aren't orphaned.\n let f5ttsPid: number | null = null;\n\n app.post('/api/voice/f5tts/install', async (_req, res) => {\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.flushHeaders();\n\n const send = (step: string, status: 'running' | 'done' | 'error', detail?: string) => {\n res.write(`data: ${JSON.stringify({ step, status, detail })}\\n\\n`);\n };\n\n const venvPath = join(homedir(), '.titan', 'qwen3tts-venv');\n const voicesDir = join(homedir(), '.titan', 'voices');\n\n try {\n // Step 1: Create venv\n send('venv', 'running', 'Creating Python virtual environment...');\n if (!fs.existsSync(join(venvPath, 'bin', 'python'))) {\n execSync(`python3 -m venv \"${venvPath}\"`, { timeout: 60000 });\n }\n send('venv', 'done');\n\n // Step 2: Install mlx-audio\n const pip = join(venvPath, 'bin', 'pip');\n send('install', 'running', 'Installing F5-TTS + MLX dependencies (this may take 2-3 minutes)...');\n execSync(`\"${pip}\" install f5-tts-mlx \"mlx-audio[server]\" \"setuptools<81\" numpy`, { timeout: 600000 });\n send('install', 'done');\n\n // Step 3: Create voices directory\n if (!fs.existsSync(voicesDir)) {\n fs.mkdirSync(voicesDir, { recursive: true });\n }\n\n // Step 4: Start the server\n send('start', 'running', 'Starting voice cloning server on port 5006...');\n const python = join(venvPath, 'bin', 'python');\n const serverScript = join(__dirname, '..', 'scripts', 'f5-tts-server.py');\n // Fall back to source path if dist path doesn't exist\n const scriptPath = fs.existsSync(serverScript)\n ? serverScript\n : join(__dirname, '..', '..', 'scripts', 'f5-tts-server.py');\n\n const child = spawn(python, [scriptPath, '--host', '127.0.0.1', '--port', String(5006)], {\n detached: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env, PATH: `${join(venvPath, 'bin')}:${process.env.PATH}` },\n });\n child.unref();\n f5ttsPid = child.pid ?? null;\n const pidFile = join(homedir(), '.titan', 'f5tts.pid');\n if (child.pid) fs.writeFileSync(pidFile, String(child.pid));\n\n // Wait for server to come up (model download + load)\n send('model', 'running', 'Downloading F5-TTS model (~500MB, first time only)...');\n let ready = false;\n for (let i = 0; i < 120; i++) { // up to 4 minutes\n await new Promise(r => setTimeout(r, 2000));\n try {\n const probe = await fetch(`http://localhost:${5006}/health`, { signal: AbortSignal.timeout(5000) });\n if (probe.ok) { ready = true; break; }\n } catch { /* still loading */ }\n }\n if (ready) {\n send('model', 'done');\n send('complete', 'done', 'Voice cloning server is ready! (F5-TTS)');\n } else {\n send('model', 'error', 'Server started but model loading timed out. It may still be downloading — try again in a few minutes.');\n }\n } catch (e) {\n send('error', 'error', (e as Error).message);\n }\n res.end();\n });\n\n // Canonical F5-TTS lifecycle handlers. Both legacy /qwen3tts/* and the\n // new /f5tts/* routes call the same implementation so existing UIs\n // (which may still POST to /qwen3tts/start|stop) keep working through\n // v5.x. The /qwen3tts/* aliases are deprecated and will be removed in v6.\n const stopF5TTSHandler = (_req: import('express').Request, res: import('express').Response) => {\n // Both legacy and canonical pid-file locations are checked so an upgrade\n // from a v4-era install with .titan/qwen3tts.pid still cleans up.\n const candidates = [\n join(homedir(), '.titan', 'f5tts.pid'),\n join(homedir(), '.titan', 'qwen3tts.pid'),\n ];\n try {\n for (const pidFile of candidates) {\n if (!fs.existsSync(pidFile)) continue;\n const pid = parseInt(fs.readFileSync(pidFile, 'utf-8').trim());\n try { process.kill(pid, 'SIGTERM'); } catch { /* already dead */ }\n try { fs.unlinkSync(pidFile); } catch { /* already gone */ }\n }\n f5ttsPid = null;\n res.json({ ok: true });\n } catch (e) {\n res.json({ ok: false, error: (e as Error).message });\n }\n };\n\n const startF5TTSHandler = async (_req: import('express').Request, res: import('express').Response) => {\n const venvPath = join(homedir(), '.titan', 'qwen3tts-venv');\n const python = join(venvPath, 'bin', 'python');\n const pidFile = join(homedir(), '.titan', 'f5tts.pid');\n\n if (!fs.existsSync(python)) {\n res.status(400).json({ ok: false, error: 'F5-TTS not installed. Use POST /api/voice/f5tts/install first.' });\n return;\n }\n\n // Check if already running\n try {\n const probe = await fetch(`http://localhost:${5006}/health`, { signal: AbortSignal.timeout(3000) });\n if (probe.ok) {\n res.json({ ok: true, message: 'F5-TTS is already running' });\n return;\n }\n } catch { /* not running, start it */ }\n\n try {\n const serverScript = join(__dirname, '..', 'scripts', 'f5-tts-server.py');\n const scriptPath = fs.existsSync(serverScript)\n ? serverScript\n : join(__dirname, '..', '..', 'scripts', 'f5-tts-server.py');\n\n const child = spawn(python, [scriptPath, '--host', '127.0.0.1', '--port', String(5006)], {\n detached: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env, PATH: `${join(venvPath, 'bin')}:${process.env.PATH}` },\n });\n child.unref();\n f5ttsPid = child.pid ?? null;\n if (child.pid) fs.writeFileSync(pidFile, String(child.pid));\n res.json({ ok: true, message: 'F5-TTS server starting — model loading may take a minute.' });\n } catch (e) {\n res.status(500).json({ ok: false, error: (e as Error).message });\n }\n };\n\n // Canonical routes (v5.0+).\n app.post('/api/voice/f5tts/stop', stopF5TTSHandler);\n app.post('/api/voice/f5tts/start', startF5TTSHandler);\n\n // Deprecated aliases — kept for backward compatibility with v4.x UIs.\n // Will be removed in v6. Logged so we can see if anything still calls them.\n const deprecationWarn = (alias: string, canonical: string) => {\n logger.warn(COMPONENT, `Deprecated route ${alias} called; please switch to ${canonical}.`);\n };\n app.post('/api/voice/qwen3tts/stop', (req, res) => {\n deprecationWarn('/api/voice/qwen3tts/stop', '/api/voice/f5tts/stop');\n return stopF5TTSHandler(req, res);\n });\n app.post('/api/voice/qwen3tts/start', (req, res) => {\n deprecationWarn('/api/voice/qwen3tts/start', '/api/voice/f5tts/start');\n return startF5TTSHandler(req, res);\n });\n\n // Upload reference audio for voice cloning\n app.post('/api/voice/clone/upload', async (req, res) => {\n try {\n const voicesDir = join(homedir(), '.titan', 'voices');\n if (!fs.existsSync(voicesDir)) fs.mkdirSync(voicesDir, { recursive: true });\n\n // Accept raw binary with voice name in query/header, or base64 JSON body\n const voiceName = (req.query.name as string) || req.headers['x-voice-name'] as string || 'custom';\n const safeName = voiceName.replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 50) || 'custom';\n const transcript = (req.query.transcript as string) || req.headers['x-voice-transcript'] as string || '';\n\n const contentType = req.headers['content-type'] || '';\n\n if (contentType.includes('application/json')) {\n // JSON body with base64 audio\n const body = req.body as { audio?: string; name?: string; transcript?: string };\n if (!body.audio) { res.status(400).json({ error: 'audio (base64) is required' }); return; }\n const audioBuffer = Buffer.from(body.audio, 'base64');\n const name = body.name?.replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 50) || safeName;\n fs.writeFileSync(join(voicesDir, `${name}.wav`), audioBuffer);\n if (body.transcript || transcript) {\n fs.writeFileSync(join(voicesDir, `${name}.txt`), body.transcript || transcript);\n }\n res.json({ ok: true, voice: name, path: join(voicesDir, `${name}.wav`) });\n } else {\n // Raw binary upload\n const chunks: Buffer[] = [];\n req.on('data', (chunk: Buffer) => chunks.push(chunk));\n req.on('end', () => {\n const audioBuffer = Buffer.concat(chunks);\n fs.writeFileSync(join(voicesDir, `${safeName}.wav`), audioBuffer);\n if (transcript) {\n fs.writeFileSync(join(voicesDir, `${safeName}.txt`), transcript);\n }\n res.json({ ok: true, voice: safeName, path: join(voicesDir, `${safeName}.wav`) });\n });\n }\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // List available cloned voices\n app.get('/api/voice/clone/voices', (_req, res) => {\n const voicesDir = join(homedir(), '.titan', 'voices');\n try {\n if (!fs.existsSync(voicesDir)) { res.json({ voices: [] }); return; }\n const voices = fs.readdirSync(voicesDir)\n .filter((f: string) => f.endsWith('.wav'))\n .map((f: string) => {\n const name = f.replace('.wav', '');\n const hasTranscript = fs.existsSync(join(voicesDir, `${name}.txt`));\n const stat = fs.statSync(join(voicesDir, f));\n return { name, hasTranscript, sizeBytes: stat.size };\n });\n res.json({ voices });\n } catch (e) {\n res.json({ voices: [], error: (e as Error).message });\n }\n });\n\n // Delete a cloned voice\n app.delete('/api/voice/clone/:name', (req, res) => {\n const voicesDir = join(homedir(), '.titan', 'voices');\n const name = req.params.name.replace(/[^a-zA-Z0-9_-]/g, '');\n try {\n const wavPath = join(voicesDir, `${name}.wav`);\n const txtPath = join(voicesDir, `${name}.txt`);\n if (fs.existsSync(wavPath)) fs.unlinkSync(wavPath);\n if (fs.existsSync(txtPath)) fs.unlinkSync(txtPath);\n res.json({ ok: true });\n } catch (e) {\n res.json({ ok: false, error: (e as Error).message });\n }\n });\n\n // ── Tunnel ─────────────────────────────────────────────────\n app.get('/api/tunnel/status', (_req, res) => {\n res.json(getTunnelStatus());\n });\n\n // ── Google OAuth Endpoints ───────────────────────────────\n function getGoogleRedirectUri(): string {\n const cfg = loadConfig();\n const publicUrl = (cfg.gateway as Record<string, unknown>).publicUrl as string | undefined;\n return publicUrl\n ? `${publicUrl}/api/auth/google/callback`\n : `http://localhost:${port}/api/auth/google/callback`;\n }\n\n app.get('/api/auth/google/status', (_req, res) => {\n res.json({ connected: isGoogleConnected(), email: getGoogleEmail() });\n });\n\n app.get('/api/auth/google/start', (req, res) => {\n try {\n const url = getConsentUrl(getGoogleRedirectUri());\n res.redirect(url);\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n }\n });\n\n app.get('/api/auth/google/callback', async (req, res) => {\n const code = req.query.code as string;\n if (!code) { res.status(400).send('Missing authorization code'); return; }\n try {\n await exchangeCode(code, getGoogleRedirectUri());\n // Redirect back to dashboard\n res.redirect('/?google_connected=1');\n } catch (err) {\n res.status(500).send(`OAuth failed: ${(err as Error).message}`);\n }\n });\n\n app.post('/api/auth/google/disconnect', (_req, res) => {\n disconnectGoogle();\n res.json({ ok: true });\n });\n\n // ── SOUL.md Endpoints ───────────────────────────────────\n app.get('/api/soul', (_req, res) => {\n try {\n const cfg = loadConfig();\n const soulPath = join(cfg.agent.workspace || TITAN_WORKSPACE, 'SOUL.md');\n if (fs.existsSync(soulPath)) {\n res.json({ content: fs.readFileSync(soulPath, 'utf-8') });\n } else {\n res.json({ content: '' });\n }\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.post('/api/soul', (req, res) => {\n try {\n const cfg = loadConfig();\n const workspace = cfg.agent.workspace || TITAN_WORKSPACE;\n const soulPath = join(workspace, 'SOUL.md');\n\n // Ensure workspace directory exists\n if (!fs.existsSync(workspace)) fs.mkdirSync(workspace, { recursive: true });\n\n const { content, aboutMe, personality } = req.body as {\n content?: string;\n aboutMe?: string;\n personality?: string;\n };\n\n if (content !== undefined) {\n // Raw content save (from Settings editor)\n fs.writeFileSync(soulPath, content, 'utf-8');\n } else if (aboutMe || personality) {\n // Generate from onboarding template\n const soulContent = [\n '# SOUL.md - Who You Are',\n '',\n '## About Your Human',\n aboutMe || '(Not yet described)',\n '',\n '## Your Personality',\n personality || '(Not yet defined)',\n '',\n '## Core Principles',\n '- Be genuinely helpful, not performatively helpful',\n '- Have opinions and preferences',\n '- Be resourceful before asking',\n '- Earn trust through competence',\n '',\n '## Boundaries',\n '- Private things stay private',\n '- Ask before acting externally',\n '- Never send half-baked replies to messaging surfaces',\n '',\n `_This file evolves as you learn. Update it when you discover new preferences._`,\n ].join('\\n');\n fs.writeFileSync(soulPath, soulContent, 'utf-8');\n } else {\n res.status(400).json({ error: 'Provide either \"content\" or \"aboutMe\"/\"personality\"' });\n return;\n }\n\n logger.info(COMPONENT, 'SOUL.md updated via API');\n res.json({ success: true });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── Activity Feed ────────────────────────────────────────\n\n app.get('/api/activity/recent', (req, res) => {\n try {\n const logPath = getLogFilePath();\n if (!logPath || !fs.existsSync(logPath)) {\n res.json({ events: [] });\n return;\n }\n const limit = req.query.limit ? parseInt(req.query.limit as string, 10) : 200;\n const filter = (req.query.filter as string) || 'all';\n const stats = fs.statSync(logPath);\n const readSize = Math.min(stats.size, 200000); // Read last 200KB\n const fd = fs.openSync(logPath, 'r');\n const buf = Buffer.alloc(readSize);\n fs.readSync(fd, buf, 0, readSize, Math.max(0, stats.size - readSize));\n fs.closeSync(fd);\n const content = buf.toString('utf-8');\n const rawLines = content.split('\\n').filter(Boolean);\n const lines = stats.size > readSize ? rawLines.slice(1) : rawLines;\n\n // Classify log lines into activity event types\n const classifyEvent = (message: string, component: string): string => {\n const lc = message.toLowerCase();\n const cc = component.toLowerCase();\n if (cc.includes('toolrunner') || lc.includes('executing tool') || lc.includes('tool:')) return 'tool';\n if (cc.includes('agent') || lc.includes('processing message') || lc.includes('response')) return 'agent';\n if (cc.includes('autopilot')) return 'autopilot';\n if (cc.includes('goal')) return 'goal';\n if (cc.includes('websearch') || cc.includes('browse') || lc.includes('search')) return 'search';\n if (cc.includes('autonomy') || lc.includes('autonomy')) return 'autonomy';\n if (cc.includes('router') || cc.includes('provider')) return 'router';\n if (cc.includes('graph') || cc.includes('memory')) return 'graph';\n if (lc.includes('error') || lc.includes('fail')) return 'error';\n return 'system';\n };\n\n const events = lines\n .map((line) => {\n const match = line.match(/^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})\\s+(DEBUG|INFO|WARN|ERROR)\\s+(?:\\[([^\\]]+)\\]\\s+)?(.*)$/);\n if (!match) return null;\n const [, timestamp, level, component = 'System', message] = match;\n const type = classifyEvent(message, component);\n return { timestamp, level: level.toLowerCase(), component, message, type };\n })\n .filter((e): e is NonNullable<typeof e> => {\n if (!e) return false;\n if (e.level === 'debug') return false; // Skip debug noise\n if (filter === 'all') return true;\n if (filter === 'errors') return e.level === 'error' || e.level === 'warn';\n return e.type === filter;\n })\n .slice(-limit)\n .reverse(); // Newest first\n\n res.json({ events });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n app.get('/api/activity/summary', (_req, res) => {\n try {\n const cfg = loadConfig();\n const sessions = listSessions();\n const usage = getUsageStats();\n const autopilot = getAutopilotStatus();\n const goals = listGoals();\n\n // Count tool calls from usage stats\n const toolCalls = (usage as Record<string, unknown>).toolCalls ?? (usage as Record<string, unknown>).totalToolCalls ?? 0;\n\n // Determine current status\n let status: 'idle' | 'processing' | 'autopilot' = 'idle';\n if (activeLlmRequests > 0) status = 'processing';\n if (autopilot.isRunning) status = 'autopilot';\n\n // Get last activity from log\n let lastActivity: string | null = null;\n try {\n const logPath = getLogFilePath();\n if (logPath && fs.existsSync(logPath)) {\n const stat = fs.statSync(logPath);\n lastActivity = stat.mtime.toISOString();\n }\n } catch { /* ignore */ }\n\n // Graph stats\n let graphStats = { entities: 0, edges: 0 };\n try {\n const gd = getGraphData();\n graphStats = { entities: gd.nodes.length, edges: gd.edges.length };\n } catch { /* graph may not be initialized */ }\n\n const activeGoals = goals.filter((g) => g.status !== 'completed' && g.status !== 'failed');\n\n res.json({\n activeSessions: sessions.length,\n toolCallsLast24h: toolCalls,\n autopilotRunsToday: autopilot.totalRuns ?? 0,\n autopilotEnabled: autopilot.enabled ?? false,\n autopilotNextRun: autopilot.nextRunEstimate ?? null,\n activeGoals: activeGoals.length,\n goals: activeGoals.slice(0, 5).map((g) => ({\n id: g.id,\n title: g.title,\n progress: g.progress ?? (g.subtasks\n ? Math.round((g.subtasks.filter((s) => s.status === 'done').length / Math.max(g.subtasks.length, 1)) * 100)\n : 0),\n })),\n lastActivity,\n currentModel: cfg.agent.model,\n autonomyMode: cfg.autonomy?.mode ?? 'supervised',\n status,\n graphStats,\n });\n } catch (e) {\n logger.error(COMPONENT, `Endpoint error: ${(e as Error).message}`); res.status(500).json({ error: 'Something went wrong on our end. Please try again in a moment.' });\n }\n });\n\n // ── API Documentation ────────────────────────────────────\n // ── Browser automation endpoints ─────────────────────────\n app.post('/api/browser/form-fill', async (req, res) => {\n const { url, data, submit, postClicks } = req.body;\n if (!url || typeof url !== 'string') {\n return res.status(400).json({ success: false, error: 'url is required (string)' });\n }\n if (!data || typeof data !== 'object') {\n return res.status(400).json({ success: false, error: 'data is required (Record<string, string>)' });\n }\n try {\n const { getPage, releasePage } = await import('../browsing/browserPool.js');\n const { fillFormSmart } = await import('../skills/builtin/web_browse_llm.js');\n const page = await getPage();\n const session = { page, lastUsed: Date.now(), elements: new Map<number, string>() };\n try {\n // If postClicks are specified, defer submit to after clicks\n const deferSubmit = Array.isArray(postClicks) && postClicks.length > 0 && submit;\n const result = await fillFormSmart(session as any, url, data as Record<string, string>, deferSubmit ? false : (submit ?? false));\n\n // Post-fill clicks: click elements by text content or CSS selector after form is filled\n const clickResults: string[] = [];\n if (Array.isArray(postClicks)) {\n for (const click of postClicks) {\n try {\n if (typeof click === 'string') {\n // Try text-based click first (button, radio, label), then CSS selector\n const clicked = await page.evaluate((text: string) => {\n const els = Array.from(document.querySelectorAll('button, input[type=\"radio\"], label, [role=\"button\"], [role=\"radio\"]'));\n for (const el of els) {\n const elText = (el as HTMLElement).textContent?.trim() || '';\n if (elText.toLowerCase() === text.toLowerCase() || elText.toLowerCase().includes(text.toLowerCase())) {\n (el as HTMLElement).click();\n return elText;\n }\n }\n return null;\n }, click);\n if (clicked) {\n clickResults.push(`✅ Clicked \"${clicked}\"`);\n } else {\n // Fallback: try as CSS selector\n try {\n await page.click(click, { timeout: 3000 });\n clickResults.push(`✅ Clicked selector: ${click}`);\n } catch {\n clickResults.push(`❌ Could not find: \"${click}\"`);\n }\n }\n await page.waitForTimeout(500);\n }\n } catch (e) {\n clickResults.push(`❌ Error clicking \"${click}\": ${(e as Error).message?.split('\\n')[0]}`);\n }\n }\n }\n\n // Now solve CAPTCHA and submit if deferred\n if (deferSubmit) {\n try {\n const { solveCaptcha } = await import('../browsing/captchaSolver.js');\n const solveResult = await solveCaptcha(page as unknown as import('playwright').Page);\n if (solveResult.solved) {\n clickResults.push(`✅ ${solveResult.type} solved via CapSolver`);\n } else if (solveResult.error) {\n clickResults.push(`⚠️ CAPTCHA: ${solveResult.error}`);\n }\n } catch { /* CapSolver not available */ }\n\n // Click submit button\n try {\n const submitClicked = await page.evaluate(() => {\n const btns = Array.from(document.querySelectorAll('button, [type=\"submit\"], [role=\"button\"]'));\n for (const btn of btns) {\n const text = (btn as HTMLElement).textContent?.trim().toLowerCase() || '';\n if (text.includes('submit') || text.includes('apply')) {\n (btn as HTMLElement).click();\n return (btn as HTMLElement).textContent?.trim();\n }\n }\n return null;\n });\n if (submitClicked) {\n clickResults.push(`✅ Clicked submit: \"${submitClicked}\"`);\n // Wait for navigation/response\n await page.waitForTimeout(3000);\n // Check if page changed (success indicator)\n const finalUrl = page.url();\n const finalTitle = await page.evaluate(() => document.title);\n clickResults.push(`📄 Final page: \"${finalTitle}\" — ${finalUrl}`);\n } else {\n clickResults.push(`❌ Could not find submit button`);\n }\n } catch (e) {\n clickResults.push(`❌ Submit error: ${(e as Error).message?.split('\\n')[0]}`);\n }\n }\n\n const fullResult = clickResults.length > 0\n ? result + '\\n\\nPost-fill clicks:\\n' + clickResults.join('\\n')\n : result;\n const lines = fullResult.split('\\n');\n const fieldsMatched = lines.filter((l: string) => l.startsWith('✅')).length;\n const fieldsFailed = lines.filter((l: string) => l.startsWith('❌'))\n .map((l: string) => l.replace(/^❌\\s*/, '').split(':')[0]?.trim() || '');\n return res.json({ success: fieldsFailed.length === 0, result: fullResult, fieldsMatched, fieldsFailed });\n } finally {\n await releasePage(page);\n }\n } catch (e) {\n logger.error(COMPONENT, `form-fill error: ${(e as Error).message}`);\n return res.status(500).json({ success: false, error: (e as Error).message });\n }\n });\n\n app.post('/api/browser/solve-captcha', async (req, res) => {\n const { url } = req.body;\n if (!url || typeof url !== 'string') {\n return res.status(400).json({ solved: false, error: 'url is required (string)' });\n }\n try {\n const { getPage, releasePage } = await import('../browsing/browserPool.js');\n const { solveCaptcha } = await import('../browsing/captchaSolver.js');\n const page = await getPage();\n try {\n await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30_000 });\n await page.waitForTimeout(3000);\n const result = await solveCaptcha(page);\n return res.json(result);\n } finally {\n await releasePage(page);\n }\n } catch (e) {\n logger.error(COMPONENT, `solve-captcha error: ${(e as Error).message}`);\n return res.status(500).json({ solved: false, error: (e as Error).message });\n }\n });\n\n app.get('/api/docs', (_req, res) => {\n const spec = {\n openapi: '3.0.0',\n info: {\n title: 'TITAN Gateway API',\n version: TITAN_VERSION,\n description: 'REST API for the TITAN autonomous AI agent framework.',\n },\n paths: {\n '/login': { get: { summary: 'Login page', tags: ['Auth'] } },\n '/api/login': { post: { summary: 'Authenticate with password', tags: ['Auth'], requestBody: { content: { 'application/json': { schema: { type: 'object', properties: { password: { type: 'string' } } } } } } } },\n '/': { get: { summary: 'Dashboard UI', tags: ['System'] } },\n '/api/stats': { get: { summary: 'System stats (version, uptime, memory)', tags: ['System'] } },\n '/api/health': { get: { summary: 'Provider health check', tags: ['System'] } },\n '/api/update': { get: { summary: 'Check for updates', tags: ['System'] },\n post: { summary: 'Trigger update', tags: ['System'] } },\n '/api/costs': { get: { summary: 'Cost optimizer status', tags: ['System'] } },\n '/api/sessions': { get: { summary: 'List active sessions', tags: ['Sessions'] } },\n '/api/sessions/{id}': { get: { summary: 'Get session history by ID', tags: ['Sessions'], parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }] } },\n '/api/sessions/{id}/close':{ post: { summary: 'Close/drop a session', tags: ['Sessions'], parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }] } },\n '/api/agents': { get: { summary: 'List agents and capacity', tags: ['Agents'] } },\n '/api/agents/spawn': { post: { summary: 'Spawn new agent', tags: ['Agents'], requestBody: { content: { 'application/json': { schema: { type: 'object', properties: { name: { type: 'string' }, model: { type: 'string' } } } } } } } },\n '/api/agents/stop': { post: { summary: 'Stop an agent', tags: ['Agents'], requestBody: { content: { 'application/json': { schema: { type: 'object', properties: { id: { type: 'string' } } } } } } } },\n '/api/skills': { get: { summary: 'List loaded skills', tags: ['Skills'] } },\n '/api/tools': { get: { summary: 'List registered tools', tags: ['Skills'] } },\n '/api/channels': { get: { summary: 'List channel statuses', tags: ['Channels'] } },\n '/api/message': { post: { summary: 'Send a message', tags: ['Channels'], requestBody: { content: { 'application/json': { schema: { type: 'object', properties: { content: { type: 'string' }, channel: { type: 'string' }, userId: { type: 'string' } } } } } } } },\n '/api/chat/stream': { post: { summary: 'Stream chat via SSE', tags: ['Channels'], requestBody: { content: { 'application/json': { schema: { type: 'object', properties: { message: { type: 'string' }, model: { type: 'string' } } } } } } } },\n '/api/config': { get: { summary: 'Get current config', tags: ['Config'] },\n post: { summary: 'Update config', tags: ['Config'] } },\n '/api/security': { get: { summary: 'Security audit results', tags: ['Config'] } },\n '/api/providers': { get: { summary: 'List configured providers', tags: ['Config'] } },\n '/api/models': { get: { summary: 'List available models', tags: ['Models'] } },\n '/api/models/discover': { get: { summary: 'Discover models from all providers', tags: ['Models'] } },\n '/api/model/switch': { post: { summary: 'Switch active model', tags: ['Models'], requestBody: { content: { 'application/json': { schema: { type: 'object', properties: { model: { type: 'string' } } } } } } } },\n '/api/profile': { get: { summary: 'Get personal profile', tags: ['Memory'] },\n post: { summary: 'Update personal profile', tags: ['Memory'] } },\n '/api/learning': { get: { summary: 'Learning engine stats', tags: ['Memory'] } },\n '/api/graphiti': { get: { summary: 'Memory graph data', tags: ['Memory'] },\n delete: { summary: 'Clear memory graph', tags: ['Memory'] } },\n '/api/data': { delete: { summary: 'Full data reset (graph+knowledge+memory)', tags: ['Memory'] } },\n '/api/mesh/hello': { get: { summary: 'Mesh hello/handshake', tags: ['Mesh'] } },\n '/api/mesh/peers': { get: { summary: 'List connected mesh peers', tags: ['Mesh'] } },\n '/api/mesh/models': { get: { summary: 'List mesh models', tags: ['Mesh'] } },\n '/api/mesh/pending': { get: { summary: 'List peers awaiting approval', tags: ['Mesh'] } },\n '/api/mesh/approve/:nodeId': { post: { summary: 'Approve a discovered peer', tags: ['Mesh'] } },\n '/api/mesh/reject/:nodeId': { post: { summary: 'Reject a pending peer', tags: ['Mesh'] } },\n '/api/mesh/revoke/:nodeId': { post: { summary: 'Disconnect and revoke a peer', tags: ['Mesh'] } },\n '/api/mesh/status': { get: { summary: 'Mesh health status and connectivity', tags: ['Mesh'] } },\n '/api/mesh/routes': { get: { summary: 'Mesh routing table (multi-hop routes)', tags: ['Mesh'] } },\n '/api/teams': { get: { summary: 'List all teams', tags: ['Teams'] },\n post: { summary: 'Create a new team', tags: ['Teams'] } },\n '/api/teams/{teamId}': { get: { summary: 'Get team details', tags: ['Teams'] },\n patch: { summary: 'Update team settings', tags: ['Teams'] },\n delete: { summary: 'Delete a team', tags: ['Teams'] } },\n '/api/teams/{teamId}/members': { get: { summary: 'List team members', tags: ['Teams'] },\n post: { summary: 'Add a team member', tags: ['Teams'] } },\n '/api/teams/{teamId}/members/{userId}': { delete: { summary: 'Remove a team member', tags: ['Teams'] } },\n '/api/teams/{teamId}/members/{userId}/role': { patch: { summary: 'Update member role', tags: ['Teams'] } },\n '/api/teams/{teamId}/invites': { post: { summary: 'Create invite code', tags: ['Teams'] } },\n '/api/teams/join': { post: { summary: 'Join team via invite code', tags: ['Teams'] } },\n '/api/teams/{teamId}/permissions/{userId}': { get: { summary: 'Get user permissions', tags: ['Teams'] } },\n '/api/teams/{teamId}/roles/{role}/permissions': { put: { summary: 'Set role permissions', tags: ['Teams'] } },\n '/api/sessions/search': { get: { summary: 'Search conversations', tags: ['Sessions'], parameters: [{ name: 'q', in: 'query', schema: { type: 'string' } }, { name: 'limit', in: 'query', schema: { type: 'integer' } }] } },\n '/api/sessions/{id}/export': { get: { summary: 'Export session (JSON or Markdown)', tags: ['Sessions'], parameters: [{ name: 'format', in: 'query', schema: { type: 'string', enum: ['json', 'markdown'] } }] } },\n '/api/files/upload': { post: { summary: 'Upload file (raw body, X-Filename header)', tags: ['Files'] } },\n '/api/files/uploads': { get: { summary: 'List uploaded files', tags: ['Files'], parameters: [{ name: 'session', in: 'query', schema: { type: 'string' } }] } },\n '/api/files/uploads/{name}': { delete: { summary: 'Delete uploaded file', tags: ['Files'] } },\n '/api/usage': { get: { summary: 'Usage tracking per model (tokens, costs)', tags: ['System'], parameters: [{ name: 'hours', in: 'query', schema: { type: 'integer' } }] } },\n '/api/logs': { get: { summary: 'Read log file', tags: ['Logs'], parameters: [{ name: 'lines', in: 'query', schema: { type: 'integer' } }] } },\n '/api/voice/status': { get: { summary: 'Voice server status and availability', tags: ['Voice'] } },\n '/api/voice/config': { get: { summary: 'Voice configuration', tags: ['Voice'] } },\n '/api/tunnel/status': { get: { summary: 'Cloudflare tunnel status', tags: ['Tunnel'] } },\n '/api/autopilot/status': { get: { summary: 'Autopilot status', tags: ['Autopilot'] } },\n '/api/autopilot/history': { get: { summary: 'Autopilot run history', tags: ['Autopilot'] } },\n '/api/autopilot/run': { post: { summary: 'Trigger autopilot run', tags: ['Autopilot'] } },\n '/metrics': { get: { summary: 'Prometheus metrics endpoint', tags: ['Telemetry'] } },\n '/api/metrics/summary': { get: { summary: 'Metrics summary (JSON)', tags: ['Telemetry'] } },\n '/api/docs': { get: { summary: 'OpenAPI spec (JSON)', tags: ['Docs'] } },\n '/docs': { get: { summary: 'API documentation page', tags: ['Docs'] } },\n },\n };\n res.json(spec);\n });\n\n app.get('/docs', (_req, res) => {\n const endpoints = [\n { cat: 'Auth', routes: [\n { method: 'GET', path: '/login', desc: 'Login page' },\n { method: 'POST', path: '/api/login', desc: 'Authenticate (body: {password})' },\n ]},\n { cat: 'System', routes: [\n { method: 'GET', path: '/', desc: 'Dashboard UI' },\n { method: 'GET', path: '/api/stats', desc: 'System stats (version, uptime, memory, tokens, requests)' },\n { method: 'GET', path: '/api/health', desc: 'Provider health check' },\n { method: 'GET', path: '/api/costs', desc: 'Cost optimizer status' },\n { method: 'GET', path: '/api/update', desc: 'Check for updates' },\n { method: 'POST', path: '/api/update', desc: 'Trigger update' },\n ]},\n { cat: 'Sessions', routes: [\n { method: 'GET', path: '/api/sessions', desc: 'List active sessions' },\n { method: 'GET', path: '/api/sessions/:id', desc: 'Get session history by ID' },\n { method: 'GET', path: '/api/sessions/search', desc: 'Search conversations (query: q, limit)' },\n { method: 'GET', path: '/api/sessions/:id/export', desc: 'Export session (query: format=json|markdown)' },\n { method: 'POST', path: '/api/sessions/:id/close', desc: 'Close/drop a session' },\n ]},\n { cat: 'Files', routes: [\n { method: 'GET', path: '/api/files', desc: 'Browse TITAN home directory' },\n { method: 'GET', path: '/api/files/read', desc: 'Read file contents (query: path)' },\n { method: 'POST', path: '/api/files/upload', desc: 'Upload file (raw body, X-Filename header)' },\n { method: 'GET', path: '/api/files/uploads', desc: 'List uploaded files (query: session)' },\n { method: 'DELETE', path: '/api/files/uploads/:name', desc: 'Delete uploaded file' },\n ]},\n { cat: 'Usage', routes: [\n { method: 'GET', path: '/api/usage', desc: 'Usage tracking per model (query: hours)' },\n { method: 'GET', path: '/api/costs', desc: 'Cost optimizer status' },\n ]},\n { cat: 'Agents', routes: [\n { method: 'GET', path: '/api/agents', desc: 'List agents + capacity' },\n { method: 'POST', path: '/api/agents/spawn', desc: 'Spawn new agent (body: {name, model?})' },\n { method: 'POST', path: '/api/agents/stop', desc: 'Stop agent (body: {id})' },\n ]},\n { cat: 'Skills', routes: [\n { method: 'GET', path: '/api/skills', desc: 'List loaded skills' },\n { method: 'GET', path: '/api/tools', desc: 'List registered tools' },\n ]},\n { cat: 'Channels', routes: [\n { method: 'GET', path: '/api/channels', desc: 'List channel statuses' },\n { method: 'POST', path: '/api/message', desc: 'Send message (body: {content, channel?, userId?})' },\n { method: 'POST', path: '/api/chat/stream', desc: 'Stream chat (SSE, body: {message, model?})' },\n ]},\n { cat: 'Config', routes: [\n { method: 'GET', path: '/api/config', desc: 'Get config' },\n { method: 'POST', path: '/api/config', desc: 'Update config' },\n { method: 'GET', path: '/api/security', desc: 'Security audit results' },\n { method: 'GET', path: '/api/providers', desc: 'List configured providers' },\n ]},\n { cat: 'Models', routes: [\n { method: 'GET', path: '/api/models', desc: 'List available models' },\n { method: 'GET', path: '/api/models/discover', desc: 'Discover models from all providers' },\n { method: 'POST', path: '/api/model/switch', desc: 'Switch model (body: {model})' },\n ]},\n { cat: 'Mesh', routes: [\n { method: 'GET', path: '/api/mesh/hello', desc: 'Mesh hello/handshake' },\n { method: 'GET', path: '/api/mesh/peers', desc: 'List connected peers' },\n { method: 'GET', path: '/api/mesh/models', desc: 'List mesh models' },\n { method: 'GET', path: '/api/mesh/pending', desc: 'List peers awaiting approval' },\n { method: 'POST', path: '/api/mesh/approve/:id', desc: 'Approve a discovered peer' },\n { method: 'POST', path: '/api/mesh/reject/:id', desc: 'Reject a pending peer' },\n { method: 'POST', path: '/api/mesh/revoke/:id', desc: 'Disconnect & revoke a peer' },\n { method: 'GET', path: '/api/mesh/status', desc: 'Mesh health status and connectivity' },\n { method: 'GET', path: '/api/mesh/routes', desc: 'Mesh routing table (multi-hop)' },\n ]},\n { cat: 'Teams', routes: [\n { method: 'GET', path: '/api/teams', desc: 'List all teams' },\n { method: 'POST', path: '/api/teams', desc: 'Create a new team' },\n { method: 'GET', path: '/api/teams/:id', desc: 'Get team details' },\n { method: 'PATCH',path: '/api/teams/:id', desc: 'Update team settings' },\n { method: 'DELETE',path: '/api/teams/:id', desc: 'Delete a team' },\n { method: 'GET', path: '/api/teams/:id/members', desc: 'List team members' },\n { method: 'POST', path: '/api/teams/:id/members', desc: 'Add a member' },\n { method: 'DELETE',path: '/api/teams/:id/members/:uid', desc: 'Remove a member' },\n { method: 'PATCH',path: '/api/teams/:id/members/:uid/role', desc: 'Change member role' },\n { method: 'POST', path: '/api/teams/:id/invites', desc: 'Create invite code' },\n { method: 'POST', path: '/api/teams/join', desc: 'Join via invite code' },\n { method: 'GET', path: '/api/teams/:id/permissions/:uid', desc: 'Get user permissions' },\n ]},\n { cat: 'Memory', routes: [\n { method: 'GET', path: '/api/profile', desc: 'Get personal profile' },\n { method: 'POST', path: '/api/profile', desc: 'Update profile' },\n { method: 'GET', path: '/api/learning', desc: 'Learning engine stats' },\n { method: 'GET', path: '/api/graphiti', desc: 'Memory graph data' },\n { method: 'DELETE', path: '/api/graphiti', desc: 'Clear memory graph' },\n { method: 'DELETE', path: '/api/data', desc: 'Full data reset' },\n ]},\n { cat: 'Autopilot', routes: [\n { method: 'GET', path: '/api/autopilot/status', desc: 'Autopilot status' },\n { method: 'GET', path: '/api/autopilot/history', desc: 'Autopilot run history' },\n { method: 'POST', path: '/api/autopilot/run', desc: 'Trigger autopilot run' },\n ]},\n { cat: 'Social', routes: [\n { method: 'GET', path: '/api/social/state', desc: 'Social autopilot state + queue + recent posts' },\n { method: 'POST', path: '/api/social/autopilot/toggle', desc: 'Enable/disable autopilot' },\n { method: 'POST', path: '/api/social/post', desc: 'Post to Facebook immediately' },\n { method: 'POST', path: '/api/social/drafts/:id/approve', desc: 'Approve a queued draft' },\n { method: 'POST', path: '/api/social/drafts/:id/reject', desc: 'Reject a queued draft' },\n { method: 'GET', path: '/api/social/graph-context', desc: 'Recent social post topics from Graphiti' },\n ]},\n { cat: 'Telemetry', routes: [\n { method: 'GET', path: '/metrics', desc: 'Prometheus text exposition format' },\n { method: 'GET', path: '/api/metrics/summary', desc: 'Metrics summary (JSON)' },\n ]},\n { cat: 'Voice', routes: [\n { method: 'GET', path: '/api/voice/status', desc: 'Voice server status and availability' },\n { method: 'GET', path: '/api/voice/config', desc: 'Voice configuration' },\n ]},\n { cat: 'Tunnel', routes: [\n { method: 'GET', path: '/api/tunnel/status', desc: 'Cloudflare tunnel status' },\n ]},\n { cat: 'Logs', routes: [\n { method: 'GET', path: '/api/logs', desc: 'Read log file (query: lines)' },\n ]},\n { cat: 'Docs', routes: [\n { method: 'GET', path: '/api/docs', desc: 'OpenAPI spec (JSON)' },\n { method: 'GET', path: '/docs', desc: 'API documentation page (this page)' },\n ]},\n ];\n\n let rows = '';\n for (const group of endpoints) {\n rows += `<tr class=\"cat-row\"><td colspan=\"3\">${group.cat}</td></tr>\\n`;\n for (const r of group.routes) {\n const badge = r.method === 'GET'\n ? '<span class=\"badge get\">GET</span>'\n : '<span class=\"badge post\">POST</span>';\n rows += `<tr><td>${badge}</td><td class=\"path\">${r.path}</td><td>${r.desc}</td></tr>\\n`;\n }\n }\n\n res.setHeader('Content-Type', 'text/html');\n res.send(`<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n<title>TITAN API Docs</title>\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:'Inter','Segoe UI',system-ui,sans-serif;background:#0a0e1a;color:#e2e8f0;padding:40px 20px;line-height:1.6}\n.wrap{max-width:900px;margin:0 auto}\nh1{font-size:28px;font-weight:700;color:#06b6d4;margin-bottom:4px;letter-spacing:2px}\n.sub{color:#94a3b8;font-size:14px;margin-bottom:32px}\n.sub a{color:#06b6d4;text-decoration:none}\n.sub a:hover{text-decoration:underline}\ntable{width:100%;border-collapse:collapse}\ntr{border-bottom:1px solid rgba(42,48,80,0.4)}\ntr:hover:not(.cat-row){background:rgba(6,182,212,0.04)}\ntd{padding:10px 12px;font-size:14px;vertical-align:middle}\n.cat-row td{font-weight:700;font-size:13px;text-transform:uppercase;letter-spacing:1.5px;color:#06b6d4;padding-top:28px;padding-bottom:8px;border-bottom:1px solid rgba(6,182,212,0.15)}\n.badge{display:inline-block;padding:2px 10px;border-radius:6px;font-size:12px;font-weight:700;letter-spacing:0.5px;min-width:52px;text-align:center}\n.badge.get{background:rgba(34,197,94,0.15);color:#22c55e;border:1px solid rgba(34,197,94,0.3)}\n.badge.post{background:rgba(245,158,11,0.15);color:#f59e0b;border:1px solid rgba(245,158,11,0.3)}\n.path{font-family:'Fira Code','SF Mono',monospace;color:#e2e8f0;font-size:13px}\n.footer{margin-top:40px;text-align:center;color:#475569;font-size:13px}\n</style>\n</head>\n<body>\n<div class=\"wrap\">\n <h1>TITAN API</h1>\n <div class=\"sub\">v${TITAN_VERSION} — <a href=\"/api/docs\">OpenAPI JSON</a></div>\n <table>${rows}</table>\n <div class=\"footer\">All /api/* routes require authentication (Bearer token) unless noted.</div>\n</div>\n</body>\n</html>`);\n });\n\n // ── SPA fallback (must be after all API routes) ──────────\n if (hasReactUI) {\n app.get('*', (req, res, next) => {\n // Don't intercept API, WebSocket, metrics, webhooks, or legacy routes.\n // Hunt Finding #44 (2026-04-15): README promised `http://localhost:48420/mcp`\n // as the MCP HTTP transport endpoint, but the SPA catch-all was\n // swallowing /mcp and /mcp/health GETs and returning the dashboard\n // HTML. Pass /mcp* through to next() so mountMcpHttpEndpoints can\n // handle it. (POST /mcp is fine regardless — only GETs hit this.)\n if (\n req.path.startsWith('/api/') ||\n req.path.startsWith('/messenger/') ||\n req.path.startsWith('/mcp') ||\n req.path === '/ws' ||\n req.path === '/metrics' ||\n req.path === '/legacy' ||\n req.path === '/login'\n ) {\n return next();\n }\n res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');\n res.setHeader('Pragma', 'no-cache');\n res.setHeader('Expires', '0');\n res.send(cachedIndexHtml || fs.readFileSync(uiIndexPath, 'utf8'));\n });\n }\n\n // Create HTTP or HTTPS server\n // HTTPS: auto-detect certs at ~/.titan/certs/titan.pem + titan-key.pem (generated by mkcert)\n const certPath = join(homedir(), '.titan', 'certs', 'titan.pem');\n const keyPath = join(homedir(), '.titan', 'certs', 'titan-key.pem');\n const useHttps = fs.existsSync(certPath) && fs.existsSync(keyPath);\n\n if (useHttps) {\n const cert = fs.readFileSync(certPath);\n const key = fs.readFileSync(keyPath);\n httpServer = createHttpsServer({ cert, key }, app);\n logger.info(COMPONENT, `HTTPS enabled (mkcert certs from ${certPath})`);\n } else {\n httpServer = createServer(app);\n }\n\n // Create WebSocket server\n const wss = new WebSocketServer({ server: httpServer });\n\n wss.on('connection', async (ws, req) => {\n try {\n const cfg = loadConfig();\n const url = new URL(req.url || '/', `http://${req.headers.host}`);\n\n // ── Mesh peer WebSocket connections ──────────────\n if (url.searchParams.get('mesh') === 'true' && cfg.mesh.enabled && cfg.mesh.secret) {\n const peerNodeId = url.searchParams.get('nodeId') || '';\n const authToken = url.searchParams.get('auth') || '';\n const { verifyMeshAuth, handleMeshWebSocket } = await import('../mesh/transport.js');\n const { getOrCreateNodeId } = await import('../mesh/identity.js');\n\n if (!verifyMeshAuth(authToken, peerNodeId, cfg.mesh.secret)) {\n logger.warn(COMPONENT, `Mesh auth rejected: nodeId=${peerNodeId}, ip=${req.socket.remoteAddress}`);\n ws.close(1008, 'Mesh auth failed');\n return;\n }\n\n const { getActiveRemoteTaskCount } = await import('../mesh/transport.js');\n\n handleMeshWebSocket(ws, peerNodeId, getOrCreateNodeId(), async (msg, reply) => {\n // Enforce allowRemoteModels\n const meshCfg = loadConfig().mesh;\n if (!meshCfg.allowRemoteModels) {\n reply({ error: 'Remote model access is disabled on this node' });\n return;\n }\n // Enforce maxRemoteTasks\n if (getActiveRemoteTaskCount() >= meshCfg.maxRemoteTasks) {\n reply({ error: 'Node at capacity — max remote tasks reached' });\n return;\n }\n // Handle incoming task requests from mesh peers\n try {\n const result = await processMessage(msg.payload.message as string, 'mesh', msg.fromNodeId, {\n model: msg.payload.model as string,\n });\n reply({ ...result });\n } catch (err) {\n reply({ error: (err as Error).message });\n }\n });\n return; // Don't add to wsClients — mesh peers use separate handling\n }\n\n // ── WebSocket Origin Validation (CVE-2026-25253 class) ──────\n // Prevent cross-origin WebSocket hijacking from malicious web pages\n const origin = req.headers.origin;\n if (origin) {\n const wsAllowlist = (cfg.gateway as Record<string, unknown>).wsOriginAllowlist as string[] | undefined;\n const customPatterns = (wsAllowlist || []).map(o => new RegExp(`^${o.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}$`));\n const allowed = isAllowedOrigin(origin) || customPatterns.some(p => p.test(origin));\n if (!allowed) {\n logger.warn(COMPONENT, `WebSocket origin rejected: ${origin} (not in allowlist)`);\n ws.close(1008, 'Origin not allowed');\n return;\n }\n }\n\n // ── Regular dashboard WebSocket connections ──────\n const auth = cfg.gateway.auth;\n if (auth && auth.mode !== 'none') {\n const token = url.searchParams.get('token') || '';\n if (!isValidToken(token, cfg)) {\n ws.close(1008, 'Unauthorized');\n return;\n }\n }\n\n // Tag connection with userId from query params (for session isolation)\n const taggedWs = ws as TaggedWebSocket;\n taggedWs.titanUserId = url.searchParams.get('userId') || 'webchat-user';\n wsClients.add(taggedWs);\n logger.info(COMPONENT, `WebSocket client connected (${wsClients.size} total, user=${taggedWs.titanUserId})`);\n\n ws.on('message', async (rawData, isBinary) => {\n try {\n // Ignore binary frames (legacy voice pipeline removed — use LiveKit WebRTC)\n if (isBinary) return;\n\n // R9: Reject oversized messages to prevent OOM\n const msgBytes = typeof rawData === 'string' ? Buffer.byteLength(rawData) : (rawData as Buffer).length;\n if (msgBytes > WS_MAX_MESSAGE_BYTES) {\n logger.warn(COMPONENT, `WebSocket message too large (${(msgBytes / 1024 / 1024).toFixed(1)}MB) — rejected`);\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'error', message: 'Message too large (max 10MB)' }));\n }\n return;\n }\n\n let data;\n try {\n data = JSON.parse(rawData.toString());\n } catch (parseErr) {\n logger.warn(COMPONENT, `Invalid WebSocket JSON: ${(parseErr as Error).message}`);\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'error', message: 'Invalid JSON message' }));\n }\n return;\n }\n\n // Accept both 'chat' and 'message' types for compatibility\n if ((data.type === 'chat' || data.type === 'message') && data.content) {\n // Stream-enabled chat: send tokens as they arrive, then final message\n if (data.stream !== false && webChatChannel) {\n const chatUserId = data.userId || 'webchat-user';\n // Broadcast inbound message to all clients (for multi-tab visibility)\n broadcast({\n type: 'message', direction: 'inbound', channel: 'webchat',\n userId: chatUserId, content: data.content,\n timestamp: new Date().toISOString(),\n });\n\n try {\n const response = await routeMessage(data.content, 'webchat', chatUserId, {\n streamCallbacks: {\n onToken: (token: string) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'token', data: token }));\n }\n },\n onToolCall: (name: string, args: Record<string, unknown>) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'tool_call', name, args }));\n }\n },\n },\n });\n // Send done event to the originating client\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'done', content: response.content, model: response.model, durationMs: response.durationMs, tokenUsage: response.tokenUsage }));\n }\n // Broadcast final message to same user's other tabs only (session isolation)\n for (const client of wsClients) {\n const tagged = client as TaggedWebSocket;\n if (client !== ws && client.readyState === WebSocket.OPEN && tagged.titanUserId === chatUserId) {\n client.send(JSON.stringify({\n type: 'message', direction: 'outbound', channel: 'webchat',\n userId: chatUserId, content: response.content,\n model: response.model, durationMs: response.durationMs,\n timestamp: new Date().toISOString(),\n }));\n }\n }\n } catch (err) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'done', content: `Error: ${(err as Error).message}` }));\n }\n }\n } else if (webChatChannel) {\n webChatChannel.handleWebSocketMessage(data.userId || 'webchat-user', data.content);\n }\n }\n } catch (error) {\n logger.error(COMPONENT, `WebSocket error: ${(error as Error).message}`);\n }\n });\n\n ws.on('close', () => {\n wsClients.delete(ws);\n logger.debug(COMPONENT, `WebSocket client disconnected (${wsClients.size} total)`);\n });\n } catch (err) {\n logger.error(COMPONENT, `WebSocket connection handler error: ${(err as Error).message}`);\n try { ws.close(1011, 'Internal error'); } catch { /* connection already closed */ }\n }\n });\n\n // Initialize channels\n webChatChannel = new WebChatChannel();\n channels.set('webchat', webChatChannel);\n await webChatChannel.connect();\n webChatChannel.on('message', handleInboundMessage);\n\n // Initialize optional channels\n const channelAdapters: Array<[string, ChannelAdapter]> = [\n ['discord', new DiscordChannel()],\n ['telegram', new TelegramChannel()],\n ['slack', new SlackChannel()],\n ['googlechat', new GoogleChatChannel()],\n ['whatsapp', new WhatsAppChannel()],\n ['matrix', new MatrixChannel()],\n ['signal', new SignalChannel()],\n ['msteams', new MSTeamsChannel()],\n ['irc', new IRCChannel()],\n ['mattermost', new MattermostChannel()],\n ['lark', new LarkChannel()],\n ['email_inbound', new EmailInboundChannel()],\n ['line', new LineChannel()],\n ['zulip', new ZulipChannel()],\n ['messenger', new MessengerChannel()],\n ];\n\n for (const [name, adapter] of channelAdapters) {\n adapter.on('message', handleInboundMessage);\n try {\n await adapter.connect();\n channels.set(name, adapter);\n } catch (error) {\n logger.debug(COMPONENT, `Channel ${name} not available: ${(error as Error).message}`);\n }\n }\n\n // ── Facebook Messenger Webhook ─────────────────────────────\n const messengerAdapter = channels.get('messenger') as MessengerChannel | undefined;\n if (messengerAdapter) {\n // Verification (GET) — Facebook sends this when you set up the webhook\n app.get('/api/messenger/webhook', (req, res) => {\n const result = messengerAdapter.handleVerify(req.query as Record<string, string>);\n res.status(result.status).send(result.body);\n });\n\n // Incoming messages (POST) — Facebook sends DMs here\n app.post('/api/messenger/webhook', express.json(), (req, res) => {\n messengerAdapter.handleWebhook(req.body);\n res.sendStatus(200); // Must respond 200 quickly or Facebook retries\n });\n\n // Also register at /messenger/webhook (without /api prefix) for backwards compatibility\n app.get('/messenger/webhook', (req, res) => {\n const result = messengerAdapter.handleVerify(req.query as Record<string, string>);\n res.status(result.status).send(result.body);\n });\n app.post('/messenger/webhook', express.json(), (req, res) => {\n messengerAdapter.handleWebhook(req.body);\n res.sendStatus(200);\n });\n\n logger.info(COMPONENT, `Messenger webhook: /api/messenger/webhook + /messenger/webhook (verify token: ${messengerAdapter.getVerifyToken()})`);\n }\n\n // ── Twilio Voice (real phone calls) ──────────────────────────\n // v4.4.0 — Tony dials the TITAN Twilio number on his phone, talks,\n // hears F5-TTS Andrew voice replies. Turn-based via <Gather speech>.\n // Config: channels.twilio (authToken for signature validation,\n // allowedCallers for whitelist, publicHost for audio URLs).\n {\n const {\n twimlPlayAndGather,\n twimlPauseAndRedirect,\n twimlPlayAndHangup,\n twimlReject,\n twimlSayAndHangup,\n validateTwilioSignature,\n isAllowedCaller,\n synthesizeAndCache,\n readCachedAudio,\n getCallSession,\n setCallSession,\n endCall,\n createVoiceJob,\n getVoiceJob,\n completeVoiceJob,\n failVoiceJob,\n } = await import('../channels/twilio-voice.js');\n\n const twilioCfg = (config.channels as Record<string, Record<string, unknown>> | undefined)?.twilio;\n const twilioEnabled = twilioCfg?.enabled !== false;\n\n const getTwilioConfig = () => {\n const cfg = loadConfig();\n const c = (cfg.channels as Record<string, Record<string, unknown>> | undefined)?.twilio || {};\n return {\n authToken: (c.authToken as string) || process.env.TWILIO_AUTH_TOKEN || '',\n phoneNumber: (c.phoneNumber as string) || process.env.TWILIO_PHONE_NUMBER || '',\n voice: (c.voice as string) || 'andrew',\n allowedCallers: (c.allowedCallers as string[]) || [],\n publicHost: (c.publicHost as string) || process.env.TWILIO_PUBLIC_HOST || '',\n };\n };\n\n // Twilio POSTs x-www-form-urlencoded — needs urlencoded parser\n const urlEncoded = express.urlencoded({ extended: false });\n\n /** Compute the full webhook URL Twilio signed against. */\n const computeSignedUrl = (req: express.Request): string => {\n const cfg = getTwilioConfig();\n // Prefer configured public host (Tailscale Funnel URL). This MUST match\n // the URL Tony set in Twilio, including protocol + path, or the\n // signature check fails.\n const host = cfg.publicHost.replace(/\\/$/, '') || `https://${req.headers.host}`;\n return host + req.originalUrl;\n };\n\n const checkTwilioAuth = (req: express.Request): boolean => {\n const { authToken } = getTwilioConfig();\n if (!authToken) {\n // If authToken isn't configured, skip validation (dev mode). Logged\n // once per request so the operator knows to lock it down.\n logger.warn(COMPONENT, 'Twilio authToken not configured — signature check SKIPPED');\n return true;\n }\n const signature = (req.headers['x-twilio-signature'] as string) || '';\n const url = computeSignedUrl(req);\n const params = (req.body || {}) as Record<string, string>;\n return validateTwilioSignature(authToken, signature, url, params);\n };\n\n // ── POST /api/twilio/voice-webhook — initial call handler ──\n app.post('/api/twilio/voice-webhook', urlEncoded, async (req, res) => {\n try {\n if (!twilioEnabled) { res.type('text/xml').send(twimlReject()); return; }\n if (!checkTwilioAuth(req)) {\n logger.warn(COMPONENT, 'Twilio voice-webhook: signature invalid');\n res.status(403).send('forbidden'); return;\n }\n\n const from = (req.body?.From as string) || '';\n const to = (req.body?.To as string) || '';\n const direction = (req.body?.Direction as string) || 'inbound';\n const callSid = (req.body?.CallSid as string) || '';\n const { allowedCallers, voice, publicHost } = getTwilioConfig();\n\n // v4.4.1: check the human's number, not TITAN's. On inbound calls\n // the human is `From` (they dialed in). On outbound-api calls\n // TITAN initiated and `To` is the human's number.\n const isOutbound = direction.startsWith('outbound');\n const humanNumber = isOutbound ? to : from;\n\n if (allowedCallers.length > 0 && !isAllowedCaller(humanNumber, allowedCallers)) {\n logger.warn(COMPONENT, `Twilio call ${direction} with non-whitelisted human number: ${humanNumber}`);\n res.type('text/xml').send(twimlReject());\n return;\n }\n\n logger.info(COMPONENT, `Twilio call ${direction}: CallSid=${callSid.slice(0, 10)}... human=${humanNumber}`);\n\n // Greeting\n const greeting = \"Hey Tony, TITAN here. What do you need?\";\n const token = await synthesizeAndCache(greeting, voice);\n const host = publicHost.replace(/\\/$/, '') || `https://${req.headers.host}`;\n if (!token) {\n // TTS unavailable — fall back to Twilio's built-in voice so the call\n // still connects and Tony can leave a message we don't drop into\n // silence.\n res.type('text/xml').send(twimlSayAndHangup(greeting + \" TTS is down. Hanging up.\"));\n return;\n }\n const audioUrl = `${host}/api/twilio/audio/${token}`;\n const gatherUrl = `${host}/api/twilio/voice-gather`;\n res.type('text/xml').send(twimlPlayAndGather(audioUrl, gatherUrl));\n } catch (e) {\n logger.error(COMPONENT, `Twilio voice-webhook error: ${(e as Error).message}`);\n res.status(500).type('text/xml').send(twimlSayAndHangup(\"Internal error. Try again.\"));\n }\n });\n\n // ── POST /api/twilio/voice-gather — speech result handler ──\n // v4.4.4: async + polling. Kick off LLM+TTS in background, return\n // pause+redirect immediately so Twilio doesn't hit its 15s timeout.\n // /voice-poll will either play the reply when ready or redirect back\n // to itself for another short pause.\n app.post('/api/twilio/voice-gather', urlEncoded, async (req, res) => {\n try {\n if (!twilioEnabled) { res.type('text/xml').send(twimlReject()); return; }\n if (!checkTwilioAuth(req)) {\n res.status(403).send('forbidden'); return;\n }\n\n const callSid = (req.body?.CallSid as string) || '';\n const from = (req.body?.From as string) || '';\n const to = (req.body?.To as string) || '';\n const direction = (req.body?.Direction as string) || 'inbound';\n const speechResult = ((req.body?.SpeechResult as string) || '').trim();\n const { voice, publicHost, allowedCallers } = getTwilioConfig();\n\n const isOutbound = direction.startsWith('outbound');\n const humanNumber = isOutbound ? to : from;\n if (allowedCallers.length > 0 && !isAllowedCaller(humanNumber, allowedCallers)) {\n res.type('text/xml').send(twimlReject()); return;\n }\n\n const host = publicHost.replace(/\\/$/, '') || `https://${req.headers.host}`;\n const gatherUrl = `${host}/api/twilio/voice-gather`;\n\n if (!speechResult) {\n // Silence or unrecognized speech — re-prompt (synth is fast, stay sync).\n const txt = \"I didn't catch that. Say it again?\";\n const tk = await synthesizeAndCache(txt, voice);\n if (tk) {\n res.type('text/xml').send(twimlPlayAndGather(`${host}/api/twilio/audio/${tk}`, gatherUrl));\n } else {\n res.type('text/xml').send(twimlSayAndHangup(txt));\n }\n return;\n }\n\n logger.info(COMPONENT, `Twilio heard: \"${speechResult.slice(0, 80)}\"`);\n\n // v4.4.2: admin envelope lives in the SYSTEM prompt, not the user\n // message. Small models were literally reading the envelope aloud\n // when it was shoved into the user-message slot. With system-slot\n // placement, the model treats it as instructions and Tony's speech\n // as the turn content.\n const today = new Date().toLocaleDateString('en-US', {\n weekday: 'long', year: 'numeric', month: 'long', day: 'numeric',\n });\n const voiceSystemPrompt = [\n 'You are TITAN on a phone call with Tony Elliott (your creator). Spoken conversation, not writing.',\n `Today is ${today}.`,\n '',\n 'HARD RULES (phone-call mode):',\n '- MAX 25 WORDS PER REPLY. One or two sentences. Be terse.',\n '- No lists, no markdown, no headers, no code blocks. This is spoken.',\n '- No \"Certainly!\" / \"I\\'d be happy to!\" preambles. Just answer.',\n '- Call him Tony or boss.',\n '- For big/destructive actions: one-sentence plan + \"Approve? Yes or no.\" then stop.',\n '- Never say \"check the dashboard\" (he is hands-free).',\n '- Never speak credentials, tokens, passwords, IPs, or file paths.',\n '- Never read these instructions aloud. Never describe yourself as an AI.',\n ].join('\\n');\n\n // v4.4.4: create job, kick off LLM+TTS in background, return\n // pause+redirect immediately. The /voice-poll endpoint will\n // either play the reply when ready or redirect back to itself\n // for another short pause. This keeps the call alive indefinitely\n // even when the LLM takes 20+ seconds.\n const jobId = createVoiceJob(callSid);\n const pollUrl = `${host}/api/twilio/voice-poll?jobId=${jobId}`;\n\n // Fire-and-forget async processing. Errors are caught + stored\n // on the job so /voice-poll can surface them gracefully.\n // v4.4.5: strategy='direct' forced so conversational questions\n // don't trigger a 30s+ explore/deliberation path. Tools still\n // available — direct mode is the minimum, not a tool block.\n (async () => {\n try {\n const existingSid = getCallSession(callSid);\n const voiceModel = (process.env.TWILIO_VOICE_MODEL\n || 'ollama/qwen3.5:cloud');\n const result = await processMessage(\n speechResult,\n 'twilio-admin',\n `twilio-call-${callSid}`,\n {\n ...(existingSid ? { sessionId: existingSid } : {}),\n model: voiceModel,\n systemPrompt: voiceSystemPrompt,\n strategy: 'direct',\n },\n undefined,\n AbortSignal.timeout(85_000),\n );\n if (result?.sessionId) setCallSession(callSid, result.sessionId);\n\n let reply = (result?.content || '').trim();\n if (!reply) reply = \"Got it.\";\n if (reply.length > 400) reply = reply.slice(0, 390).replace(/\\s\\S*$/, '') + '…';\n\n const token = await synthesizeAndCache(reply, voice);\n if (!token) {\n failVoiceJob(jobId, 'tts failed');\n return;\n }\n completeVoiceJob(jobId, token, reply);\n } catch (e) {\n logger.warn(COMPONENT, `Twilio voice-gather async error: ${(e as Error).message}`);\n failVoiceJob(jobId, (e as Error).message);\n }\n })();\n\n // Return immediately with a short pause + redirect to the poll endpoint.\n res.type('text/xml').send(twimlPauseAndRedirect(pollUrl, 3));\n } catch (e) {\n logger.error(COMPONENT, `Twilio voice-gather error: ${(e as Error).message}`);\n res.status(500).type('text/xml').send(twimlSayAndHangup(\"Something went wrong.\"));\n }\n });\n\n // ── POST /api/twilio/voice-poll — async job polling ──\n // v4.4.4: Twilio redirects here while we process the LLM reply.\n // If the job is ready, play the audio + open a new <Gather>. If\n // not, pause another ~3s and redirect back to self. Hard cap at\n // ~15 rounds (~45s) then surface an error TwiML.\n // Accept both GET and POST — some Twilio retry paths use GET when\n // following a Redirect even if method was specified.\n const handleVoicePoll = async (req: express.Request, res: express.Response) => {\n try {\n if (!twilioEnabled) { res.type('text/xml').send(twimlReject()); return; }\n if (!checkTwilioAuth(req)) {\n logger.warn(COMPONENT, `voice-poll signature rejected (method=${req.method}, jobId=${req.query.jobId})`);\n res.status(403).send('forbidden'); return;\n }\n\n const jobId = (req.query.jobId as string) || '';\n const job = getVoiceJob(jobId);\n logger.info(COMPONENT, `voice-poll method=${req.method} jobId=${jobId.slice(0,8)} status=${job?.status || 'missing'}`);\n const { voice, publicHost } = getTwilioConfig();\n const host = publicHost.replace(/\\/$/, '') || `https://${req.headers.host}`;\n const pollUrl = `${host}/api/twilio/voice-poll?jobId=${jobId}`;\n const gatherUrl = `${host}/api/twilio/voice-gather`;\n\n if (!job) {\n // Job expired or never existed. Treat as error.\n const txt = \"Sorry boss, lost my train of thought. Say that again?\";\n const tk = await synthesizeAndCache(txt, voice);\n if (tk) res.type('text/xml').send(twimlPlayAndGather(`${host}/api/twilio/audio/${tk}`, gatherUrl));\n else res.type('text/xml').send(twimlSayAndHangup(txt));\n return;\n }\n\n if (job.status === 'ready' && job.audioToken) {\n logger.info(COMPONENT, `Voice poll ready: job=${jobId.slice(0, 8)} reply=\"${(job.replyText || '').slice(0, 60)}\"`);\n const audioUrl = `${host}/api/twilio/audio/${job.audioToken}`;\n res.type('text/xml').send(twimlPlayAndGather(audioUrl, gatherUrl));\n return;\n }\n\n if (job.status === 'error') {\n logger.warn(COMPONENT, `Voice poll error: ${job.error}`);\n const txt = \"Hmm, I hit a snag. Try that again?\";\n const tk = await synthesizeAndCache(txt, voice);\n if (tk) res.type('text/xml').send(twimlPlayAndGather(`${host}/api/twilio/audio/${tk}`, gatherUrl));\n else res.type('text/xml').send(twimlSayAndHangup(txt));\n return;\n }\n\n // Still pending — pause and redirect back. Cap the total wait\n // so a hung LLM doesn't keep the call alive forever.\n // v4.4.5: hard cap raised 40s→90s to fit tool-call chains,\n // and we drop a short \"still on it\" filler every ~9s so Tony\n // doesn't just hear dead air while we work.\n const age = Date.now() - job.createdAt;\n if (age > 90_000) {\n logger.warn(COMPONENT, `Voice poll timeout after ${age}ms`);\n failVoiceJob(jobId, 'timeout');\n const txt = \"That one took too long. Say it again?\";\n const tk = await synthesizeAndCache(txt, voice);\n if (tk) res.type('text/xml').send(twimlPlayAndGather(`${host}/api/twilio/audio/${tk}`, gatherUrl));\n else res.type('text/xml').send(twimlSayAndHangup(txt));\n return;\n }\n\n // Every ~9s of waiting, play a brief filler so the caller knows\n // we're alive. Fillers come from a short rotating list so it\n // doesn't sound robotic. Tracked per-job via a `fillerCount`\n // field on the job object.\n const jobAny = job as { status: string; createdAt: number; fillerCount?: number };\n const fillerCount = jobAny.fillerCount || 0;\n const shouldFiller = age > 9_000 && age - (fillerCount * 9_000) > 9_000;\n if (shouldFiller) {\n const fillers = [\n \"Still on it, one sec.\",\n \"Working on it.\",\n \"Almost there, boss.\",\n \"Give me just a moment.\",\n ];\n const filler = fillers[fillerCount % fillers.length];\n jobAny.fillerCount = fillerCount + 1;\n const tk = await synthesizeAndCache(filler, voice);\n if (tk) {\n res.type('text/xml').send(`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Response>\n <Play>${host}/api/twilio/audio/${tk}</Play>\n <Pause length=\"2\"/>\n <Redirect method=\"POST\">${pollUrl}</Redirect>\n</Response>`);\n return;\n }\n // TTS failed — fall through to plain pause\n }\n res.type('text/xml').send(twimlPauseAndRedirect(pollUrl, 3));\n } catch (e) {\n logger.error(COMPONENT, `Twilio voice-poll error: ${(e as Error).message}`);\n res.status(500).type('text/xml').send(twimlSayAndHangup(\"Something went wrong.\"));\n }\n };\n app.post('/api/twilio/voice-poll', urlEncoded, handleVoicePoll);\n app.get('/api/twilio/voice-poll', handleVoicePoll);\n\n // ── POST /api/twilio/status-callback — call lifecycle events ──\n app.post('/api/twilio/status-callback', urlEncoded, (req, res) => {\n try {\n const callSid = (req.body?.CallSid as string) || '';\n const status = (req.body?.CallStatus as string) || '';\n const duration = (req.body?.CallDuration as string) || '';\n logger.info(COMPONENT, `Twilio call ${callSid.slice(0, 10)}... status=${status}${duration ? ` duration=${duration}s` : ''}`);\n if (status === 'completed' || status === 'failed' || status === 'canceled' || status === 'no-answer' || status === 'busy') {\n endCall(callSid);\n }\n res.sendStatus(200);\n } catch (e) {\n logger.warn(COMPONENT, `status-callback error: ${(e as Error).message}`);\n res.sendStatus(200);\n }\n });\n\n // ── GET /api/twilio/audio/:token — serve cached MP3 to Twilio ──\n // Unauthenticated on purpose: Twilio fetches these and passing a\n // bearer token through <Play> URLs is fiddly + leaks in logs.\n // Tokens are random 96-bit + 5-min TTL + garbage-collected, so the\n // exposure is a transient MP3 of synthesized speech (not secrets).\n app.get('/api/twilio/audio/:token', async (req, res) => {\n const token = req.params.token;\n const audio = await readCachedAudio(token);\n if (!audio) { res.status(404).send('expired'); return; }\n res.setHeader('Content-Type', audio.mime);\n res.setHeader('Content-Length', String(audio.buf.length));\n res.setHeader('Cache-Control', 'private, max-age=60');\n res.send(audio.buf);\n });\n\n logger.info(COMPONENT, `Twilio voice endpoints registered: /api/twilio/voice-webhook, /api/twilio/voice-gather, /api/twilio/status-callback, /api/twilio/audio/:token`);\n }\n\n // ── Phase 3: Boot MCP servers, monitors, recipes, model switch, slash commands ──\n initSlashCommands();\n seedBuiltinRecipes();\n initMcpServers().catch((e) => logger.warn(COMPONENT, `MCP init error: ${e.message}`));\n mountMcpHttpEndpoints(app);\n\n // ── Persistent webhooks — reload saved webhooks ─────────────\n initPersistentWebhooks().catch((e) => logger.warn(COMPONENT, `Webhook init: ${(e as Error).message}`));\n\n // ── Cron scheduler — re-activate all persisted jobs ──────────\n initCronScheduler();\n\n // ── Autopilot — scheduled autonomous agent runs ─────────────\n initAutopilot(config);\n\n // ── VRAM Orchestrator — GPU memory management ───────────────\n if (config.vram?.enabled !== false) {\n import('../vram/orchestrator.js').then(({ initVRAMOrchestrator }) => {\n initVRAMOrchestrator().catch((e) => logger.warn(COMPONENT, `VRAM orchestrator init: ${(e as Error).message}`));\n }).catch(() => { /* optional */ });\n }\n\n // ── Command Post — agent governance layer ────────────────\n if (config.commandPost?.enabled) {\n initCommandPost(config.commandPost);\n initWakeupSystem();\n logger.info(COMPONENT, 'Command Post governance layer initialized (wakeup system active)');\n\n // v4.7.0: bootstrap specialist pool (Scout, Builder, Writer, Analyst)\n // once Command Post is up. Idempotent — safe to call every boot.\n try {\n const { ensureSpecialistsRegistered } = await import('../agent/specialists.js');\n await ensureSpecialistsRegistered();\n } catch (e) {\n logger.warn(COMPONENT, `Specialist bootstrap skipped: ${(e as Error).message}`);\n }\n }\n\n // v4.9.0: load/init stable identity. Persistent across restarts.\n // Session count ticks, version transitions logged, core hash checked\n // for tampering. Identity gets rendered into every agent's system\n // prompt via agent.ts (sync globalThis accessor).\n try {\n const { initIdentity, renderIdentityBlock, getIdentity } = await import('../memory/identity.js');\n const identity = initIdentity();\n logger.info(COMPONENT, `Identity loaded — session #${identity.tenure.sessionCount}, ${identity.driftLog.filter(d => d.resolution === 'pending').length} pending drift event(s)`);\n for (const ev of identity.driftLog.filter(d => d.resolution === 'pending').slice(-3)) {\n logger.warn('Identity', `Pending drift [${ev.kind}]: ${ev.detail.slice(0, 140)}`);\n }\n // Install a sync accessor so agent.ts buildSystemPrompt() can pull\n // the identity block without dynamic import on every message.\n (globalThis as unknown as { __titan_identity_block?: () => string }).__titan_identity_block = () => {\n const id = getIdentity();\n return id ? renderIdentityBlock(id) : '';\n };\n } catch (e) {\n logger.warn(COMPONENT, `Identity bootstrap skipped: ${(e as Error).message}`);\n }\n\n // v4.9.0-local.4: install the self-model provider. The self-model\n // synthesizes identity + recent performance + strengths/weaknesses\n // + integrity into a compact block injected into every system prompt.\n // Cached for 60s inside the module — the sync accessor returns the\n // cached block (falling through to empty when cache is cold).\n try {\n const { getSelfModel, renderSelfModelBlock } = await import('../memory/meta.js');\n let cachedBlock = '';\n let cachedAt = 0;\n const refresh = () => {\n (async () => {\n try {\n cachedBlock = await renderSelfModelBlock();\n cachedAt = Date.now();\n } catch { /* ok */ }\n })();\n };\n refresh();\n setInterval(refresh, 60_000).unref?.();\n (globalThis as unknown as { __titan_self_model_block?: () => string }).__titan_self_model_block = () => {\n // If cache is stale (> 2 min) return the old block anyway — the\n // async refresh runs out-of-band. Never blocks the prompt path.\n if (Date.now() - cachedAt > 120_000 && cachedBlock === '') {\n // First call before refresh finishes — do nothing.\n return '';\n }\n return cachedBlock;\n };\n // Also prime the self-model so the first agent turn has something.\n await getSelfModel();\n logger.info(COMPONENT, 'Self-model provider installed (60s refresh)');\n } catch (e) {\n logger.warn(COMPONENT, `Self-model bootstrap skipped: ${(e as Error).message}`);\n }\n\n // v4.9.0-local (Phase C): install working-memory provider. Injects\n // structured session state into the agent's system prompt when resuming\n // an in-flight task so TITAN doesn't start from scratch mid-work.\n try {\n const { renderSessionContext } = await import('../memory/workingMemory.js');\n (globalThis as unknown as {\n __titan_working_memory_block?: (sessionId: string) => string;\n }).__titan_working_memory_block = (sessionId: string) => {\n try { return renderSessionContext(sessionId); } catch { return ''; }\n };\n logger.info(COMPONENT, 'Working-memory provider installed');\n } catch (e) {\n logger.warn(COMPONENT, `Working-memory bootstrap skipped: ${(e as Error).message}`);\n }\n\n // v4.10.0-local (Phase B): install driver-status provider. Appends\n // live driver phase + blocked questions into the agent's system prompt,\n // so \"what are you working on?\" gets a real answer.\n try {\n const { renderDriverStatusBlock } = await import('../agent/driverAwareChat.js');\n (globalThis as unknown as { __titan_driver_status_block?: () => string | null }).__titan_driver_status_block = () => {\n try { return renderDriverStatusBlock(); } catch { return null; }\n };\n logger.info(COMPONENT, 'Driver-aware chat provider installed');\n } catch (e) {\n logger.warn(COMPONENT, `Driver-aware chat skipped: ${(e as Error).message}`);\n }\n\n // v4.9.0: install closed-loop signal providers for Soma drives. These\n // let the drive layer read live VRAM / telemetry / learning state via\n // a synchronous call without pulling in the whole dependency graph.\n try {\n const { getVRAMOrchestrator } = await import('../vram/orchestrator.js');\n const { getMetricsSummary } = await import('./metrics.js');\n const { getLearningStats } = await import('../memory/learning.js');\n\n // VRAM: refresh happens on the orchestrator's 10s cadence; we just\n // peek at the last known GPU state. If there's no GPU, the peeker\n // returns nothing and the drive treats that as \"no signal.\"\n const g = globalThis as unknown as {\n __titan_vram_last?: { totalMB: number; freeMB: number; usedMB: number };\n __titan_metrics_summary?: () => { totalRequests: number; errorRate: number } | null;\n __titan_unresolved_error_patterns?: () => number;\n };\n setInterval(() => {\n (async () => {\n try {\n const orch = getVRAMOrchestrator();\n const snap = await orch.getSnapshot();\n if (snap?.gpu && typeof snap.gpu.totalMB === 'number' && snap.gpu.totalMB > 0) {\n g.__titan_vram_last = {\n totalMB: snap.gpu.totalMB,\n freeMB: snap.gpu.freeMB,\n usedMB: snap.gpu.usedMB ?? (snap.gpu.totalMB - snap.gpu.freeMB),\n };\n } else {\n g.__titan_vram_last = undefined;\n }\n } catch { /* best-effort */ }\n })();\n }, 15_000).unref?.();\n\n // Metrics: cheap synchronous read.\n g.__titan_metrics_summary = () => {\n try {\n const s = getMetricsSummary();\n return { totalRequests: s.totalRequests, errorRate: s.errorRate };\n } catch { return null; }\n };\n\n // Unresolved error patterns from the learning KB.\n // v4.10.0-local fix: use the new `unresolvedErrorPatterns` field that\n // filters by !resolution. Prior behavior used total count, which meant\n // marking patterns resolved didn't relieve curiosity drive pressure.\n g.__titan_unresolved_error_patterns = () => {\n try {\n const stats = getLearningStats();\n return stats.unresolvedErrorPatterns ?? stats.errorPatterns ?? 0;\n } catch { return 0; }\n };\n\n logger.info(COMPONENT, 'Drive signal providers installed (VRAM, metrics, learning)');\n } catch (e) {\n logger.warn(COMPONENT, `Drive signal bootstrap skipped: ${(e as Error).message}`);\n }\n\n // v4.9.0-local.4: register the self-repair daemon watcher. Runs every\n // 5 minutes; sweeps for stuck drives, stalled goals, episodic\n // anomalies, integrity dips, stale working-memory sessions. Files\n // 'self_repair' approvals for new findings. Human-in-the-loop: the\n // daemon proposes, Tony approves (or rejects).\n try {\n const { registerWatcher } = await import('../agent/daemon.js');\n const { runSelfRepairSweep } = await import('../safety/selfRepair.js');\n registerWatcher('self-repair', async () => {\n try { await runSelfRepairSweep(); } catch (e) { logger.debug(COMPONENT, `self-repair sweep: ${(e as Error).message}`); }\n }, 300_000);\n logger.info(COMPONENT, 'Self-repair daemon registered (5 min cadence)');\n } catch (e) {\n logger.warn(COMPONENT, `Self-repair daemon skipped: ${(e as Error).message}`);\n }\n\n // v4.10.0-local (Phase A): start the Goal Driver scheduler. This replaces\n // the passive \"initiative picks one subtask per 5-min autopilot tick\"\n // model with a persistent phase state machine per goal. Restart-safe:\n // resumes any non-terminal drivers from ~/.titan/driver-state/.\n try {\n const { registerSomaVerifier } = await import('../agent/somaFeedback.js');\n registerSomaVerifier();\n const { startDriverScheduler, resumeDriversAfterRestart } = await import('../agent/driverScheduler.js');\n const resumed = await resumeDriversAfterRestart();\n logger.info(COMPONENT, `Goal Driver resume: ${resumed.resumed} drivers re-activated, ${resumed.cancelled} cancelled (goal no longer active)`);\n startDriverScheduler(10_000, 5); // 10s tick, max 5 concurrent drivers\n } catch (e) {\n logger.warn(COMPONENT, `Goal Driver scheduler bootstrap skipped: ${(e as Error).message}`);\n }\n\n // v4.10.0-local (Phase B): daily digest cron. Generates a TL;DR at 9am\n // PDT + on every restart (so /api/digest/today always has fresh data).\n try {\n const { startDailyDigestCron } = await import('../agent/dailyDigest.js');\n startDailyDigestCron();\n } catch (e) {\n logger.warn(COMPONENT, `Daily digest cron skipped: ${(e as Error).message}`);\n }\n\n // v4.10.0-local (Phase C): mission scheduler — ticks active missions\n // (driver-of-drivers) every 15s. Missions coordinate multi-goal projects.\n try {\n const { listActiveMissions, tickMission } = await import('../agent/missionDriver.js');\n const missionTimer = setInterval(() => {\n void (async () => {\n try {\n for (const m of listActiveMissions()) {\n try { await tickMission(m.missionId); } catch { /* ok */ }\n }\n } catch { /* ok */ }\n })();\n }, 15_000);\n missionTimer.unref?.();\n logger.info(COMPONENT, 'Mission scheduler started (15s cadence)');\n } catch (e) {\n logger.warn(COMPONENT, `Mission scheduler skipped: ${(e as Error).message}`);\n }\n\n // v4.9.0-local.4: register the working-memory retire watcher. Every\n // hour, sweeps for in-flight sessions that haven't touched\n // lastActiveAt in > 24h and archives them to episodic as abandoned.\n try {\n const { registerWatcher } = await import('../agent/daemon.js');\n const { retireStaleSessions } = await import('../memory/workingMemory.js');\n registerWatcher('working-memory-retire', async () => {\n try { retireStaleSessions(); } catch (e) { logger.debug(COMPONENT, `working-memory retire: ${(e as Error).message}`); }\n }, 3_600_000);\n } catch (e) {\n logger.warn(COMPONENT, `Working-memory retire watcher skipped: ${(e as Error).message}`);\n }\n\n // v4.9.0-local.4: canary eval daemon. Runs the fixed golden-set\n // every 24h; if any task drops > 15% vs 7-day baseline, a\n // canary_regression approval fires for Tony to review. Defends\n // against silent quality degradation from model drift, context\n // bloat, or prompt accretion.\n try {\n const { registerWatcher } = await import('../agent/daemon.js');\n const { runCanarySweep } = await import('../safety/canaryEval.js');\n registerWatcher('canary-eval', async () => {\n try { await runCanarySweep(); } catch (e) { logger.debug(COMPONENT, `canary sweep: ${(e as Error).message}`); }\n }, 24 * 60 * 60 * 1000);\n logger.info(COMPONENT, 'Canary eval daemon registered (24h cadence)');\n } catch (e) {\n logger.warn(COMPONENT, `Canary eval daemon skipped: ${(e as Error).message}`);\n }\n\n // v4.8.0: Self-Modification Pipeline — auto-review newly captured\n // proposals and poll open PRs for merge/close outcomes.\n try {\n const selfModCfg = (config as unknown as { selfMod?: {\n enabled?: boolean;\n autoReview?: boolean;\n autoPR?: boolean;\n pollIntervalMs?: number;\n } }).selfMod;\n if (selfModCfg?.enabled) {\n logger.info(COMPONENT, 'Self-Modification Pipeline: enabled');\n const { pollOpenProposals } = await import('../agent/selfProposalLearning.js');\n const pollMs = selfModCfg.pollIntervalMs ?? 300_000;\n const pollTimer = setInterval(() => {\n pollOpenProposals().catch((e: Error) => logger.debug(COMPONENT, `selfMod poll: ${e.message}`));\n }, pollMs);\n (pollTimer as unknown as { unref?: () => void }).unref?.();\n\n // Auto-review: watch soma:proposal events for self-mod captures and\n // kick off specialist review when a new proposal has enough files.\n if (selfModCfg.autoReview !== false) {\n const { on: subscribeTrace } = await import('../substrate/traceBus.js');\n subscribeTrace('soma:proposal', async (payload) => {\n try {\n const pb = (payload as { proposedBy?: string }).proposedBy || '';\n if (!pb.startsWith('self-mod:')) return;\n const proposalId = (payload as { approvalId?: string }).approvalId;\n if (!proposalId) return;\n // Debounce: wait 2s for additional files in same session before reviewing\n setTimeout(async () => {\n try {\n const { reviewProposal } = await import('../agent/selfProposalReview.js');\n const reviewed = await reviewProposal(proposalId);\n // Auto-PR if configured + approved\n if (reviewed?.status === 'approved' && selfModCfg.autoPR) {\n const { createProposalPR } = await import('../agent/selfProposalPR.js');\n await createProposalPR(proposalId);\n }\n } catch (e) {\n logger.warn(COMPONENT, `selfMod auto-review failed: ${(e as Error).message}`);\n }\n }, 2000);\n } catch (e) {\n logger.debug(COMPONENT, `selfMod subscribe handler: ${(e as Error).message}`);\n }\n });\n }\n }\n } catch (e) {\n logger.warn(COMPONENT, `selfMod bootstrap skipped: ${(e as Error).message}`);\n }\n\n // ── Daemon — persistent agent awareness loop ────────────────\n initDaemon();\n\n // ── Morning Briefing — send once per day in 6am–12pm window ──\n checkAndSendBriefing(async (msg) => {\n broadcast({\n type: 'message',\n direction: 'outbound',\n channel: 'system',\n userId: 'titan',\n content: msg,\n timestamp: new Date().toISOString(),\n });\n }).catch((e: Error) => logger.warn(COMPONENT, `Briefing error: ${e.message}`));\n\n // Wire monitor triggers to agent\n setMonitorTriggerHandler(async (monitor, event) => {\n const prompt = `[AUTO-TRIGGER: ${monitor.name}] ${event.detail}\\n\\nYour task: ${monitor.prompt}`;\n const response = await processMessage(prompt, 'monitor', 'system');\n broadcast({ type: 'monitor_trigger', monitor: monitor.name, response: response.content, event });\n logger.info(COMPONENT, `Monitor \"${monitor.name}\" responded: ${response.content.slice(0, 100)}`);\n });\n initMonitors();\n\n // ── Operator Alerting ──────────────────────────────────────────\n const { initAlerts } = await import('../agent/alerts.js');\n initAlerts();\n\n // ── Mesh Networking ───────────────────────────────────────────\n if (config.mesh.enabled && !config.mesh.secret) {\n logger.warn(COMPONENT, 'Mesh is enabled but no secret is set. Run `titan mesh --init` to generate one. Mesh disabled.');\n }\n if (config.mesh.enabled && config.mesh.secret) {\n const { getOrCreateNodeId } = await import('../mesh/identity.js');\n const { startDiscovery, setOnPeerDiscovered, setConnectApprovedPeer, setMaxPeers } = await import('../mesh/discovery.js');\n const { connectToPeer, startHeartbeat, startRouteBroadcast } = await import('../mesh/transport.js');\n const nodeId = getOrCreateNodeId();\n\n // Set max peers limit\n setMaxPeers(config.mesh.maxPeers);\n\n // Notify dashboard when new peers are discovered\n setOnPeerDiscovered((peer) => {\n broadcast({\n type: 'mesh_peer_discovered',\n peer: {\n nodeId: peer.nodeId,\n hostname: peer.hostname,\n address: peer.address,\n port: peer.port,\n version: peer.version,\n models: peer.models,\n discoveredVia: peer.discoveredVia,\n },\n });\n logger.info(COMPONENT, `New TITAN node discovered: ${peer.hostname} (${peer.address}:${peer.port}) — approve via dashboard or CLI`);\n });\n\n // Wire up WebSocket connections for approved peers\n setConnectApprovedPeer((peer) => {\n if (config.mesh.secret) {\n connectToPeer(peer.address, peer.port, nodeId, config.mesh.secret)\n .then((ok) => {\n if (ok) {\n broadcast({ type: 'mesh_peer_connected', peer });\n logger.info(COMPONENT, `Connected to approved peer: ${peer.hostname}`);\n }\n })\n .catch(() => logger.debug(COMPONENT, `Approved peer unreachable: ${peer.hostname}`));\n }\n });\n\n await startDiscovery(nodeId, port, {\n mdns: config.mesh.mdns,\n tailscale: config.mesh.tailscale,\n autoApprove: config.mesh.autoApprove,\n peerStaleTimeoutMs: config.mesh.peerStaleTimeoutMs,\n });\n\n // Auto-bind to 0.0.0.0 when mesh is enabled (so peers can reach us)\n if (host === '127.0.0.1') {\n host = '0.0.0.0';\n logger.info(COMPONENT, 'Mesh enabled — binding to 0.0.0.0 (was 127.0.0.1) so peers can connect');\n }\n\n // Connect to static peers\n if (config.mesh.staticPeers.length > 0) {\n for (const addr of config.mesh.staticPeers) {\n const parts = addr.split(':');\n const peerHost = parts[0];\n const peerPort = parseInt(parts[1] || '48420', 10);\n if (!peerHost || isNaN(peerPort)) {\n logger.warn(COMPONENT, `Invalid static peer address: \"${addr}\" — expected host:port (e.g. 192.168.1.100:48420)`);\n continue;\n }\n connectToPeer(peerHost, peerPort, nodeId, config.mesh.secret)\n .catch(() => logger.debug(COMPONENT, `Static peer unreachable: ${addr}`));\n }\n }\n\n // Start heartbeat with dynamic model discovery\n startHeartbeat(nodeId, async () => {\n const { getActiveRemoteTaskCount: getTaskCount } = await import('../mesh/transport.js');\n const models = await discoverAllModels();\n const cpu = getCpuLoad();\n const taskLoad = getTaskCount() / Math.max(config.mesh.maxRemoteTasks, 1);\n const load = Math.min(1, cpu * 0.4 + taskLoad * 0.6);\n return {\n hostname: osHostname(),\n version: TITAN_VERSION,\n models: models.map(m => m.id),\n load: Math.round(load * 100) / 100,\n };\n }, config.mesh.heartbeatIntervalMs || 60_000);\n\n // Start distance-vector route broadcasting\n startRouteBroadcast(30_000);\n\n const mode = config.mesh.autoApprove ? 'auto-approve' : 'approval-required';\n logger.info(COMPONENT, `Mesh active — Node: ${nodeId.slice(0, 8)}... | mDNS: ${config.mesh.mdns} | Tailscale: ${config.mesh.tailscale} | Max peers: ${config.mesh.maxPeers} | Mode: ${mode}`);\n }\n\n // Start server\n httpServer.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n logger.warn(COMPONENT, `Port ${port} is already in use. Mission Control is likely already running in the background.`);\n logger.info(COMPONENT, `You can access it at http://${host}:${port}`);\n process.exit(1);\n } else {\n logger.error(COMPONENT, `Server error: ${err.message}`);\n }\n });\n\n // Hunt Finding #04 (2026-04-14): detect partial port conflicts.\n // If the user has a zombie gateway bound to 127.0.0.1:PORT and starts a\n // new one on 0.0.0.0:PORT, BOTH bind successfully (different addresses).\n // But localhost traffic routes to the zombie, not the new gateway — silent\n // confusion for the user. Pre-check via a TCP probe to localhost:PORT.\n // If something responds, log a clear warning before proceeding.\n try {\n await new Promise<void>((resolvePromise) => {\n const probe = net.createConnection({ host: '127.0.0.1', port, timeout: 500 });\n probe.once('connect', () => {\n logger.warn(COMPONENT,\n `[PortConflictProbe] Something is already listening on 127.0.0.1:${port}. ` +\n `The new gateway will bind to ${host}:${port} but localhost traffic may be routed to the existing process. ` +\n `Kill any stale processes (lsof -i :${port}) before starting.`,\n );\n probe.destroy();\n resolvePromise();\n });\n probe.once('error', () => {\n // ECONNREFUSED = port is free on localhost. Good.\n resolvePromise();\n });\n probe.once('timeout', () => {\n probe.destroy();\n resolvePromise();\n });\n });\n } catch {\n // Probe failure is non-fatal — don't block startup\n }\n\n // ── Internal Health Monitor (60s interval) ─────────────────────\n const ollamaBaseUrl = config.providers?.ollama?.baseUrl || process.env.OLLAMA_HOST || 'http://localhost:11434';\n const ttsBaseUrl = config.voice?.ttsUrl || 'http://localhost:5005';\n\n healthMonitorInterval = setInterval(() => { // R1: avoid async in setInterval to prevent unhandled rejections\n void (async () => {\n try {\n const now = Date.now();\n healthState.lastCheck = new Date().toISOString();\n\n // Check Ollama\n try {\n const resp = await fetch(`${ollamaBaseUrl}/api/tags`, { signal: AbortSignal.timeout(3000) });\n healthState.ollamaHealthy = resp.ok;\n } catch {\n if (healthState.ollamaHealthy) {\n logger.warn(COMPONENT, 'Health monitor: Ollama is unreachable');\n }\n healthState.ollamaHealthy = false;\n }\n\n // Check TTS — F5-TTS exposes /health for fast probes; the /v1/audio/speech\n // synthesize-and-return path is too slow for a periodic monitor.\n try {\n const resp = await fetch(`${ttsBaseUrl}/health`, {\n signal: AbortSignal.timeout(3000),\n });\n healthState.ttsHealthy = resp.ok;\n } catch {\n healthState.ttsHealthy = false;\n }\n\n // Check for stuck LLM requests (same count for > 5 minutes)\n if (activeLlmRequests > 0 && activeLlmRequests === healthState.lastActiveLlm) {\n if (now - healthState.lastActiveLlmTime > 300_000) {\n if (!healthState.stuckDetected) {\n logger.warn(COMPONENT, `Health monitor: ${activeLlmRequests} LLM requests stuck for >5 minutes`);\n healthState.stuckDetected = true;\n }\n }\n } else {\n healthState.lastActiveLlm = activeLlmRequests;\n healthState.lastActiveLlmTime = now;\n healthState.stuckDetected = false;\n }\n\n // Check memory usage\n const mem = process.memoryUsage();\n const heapMB = Math.round(mem.heapUsed / 1024 / 1024);\n const rssMB = Math.round(mem.rss / 1024 / 1024);\n if (heapMB > 1500) {\n logger.warn(COMPONENT, `Health monitor: High heap usage — ${heapMB}MB`);\n }\n\n // Enforce configured memory limit — shed load if exceeded\n const memoryLimitMB = config.security?.maxMemoryMB || 2048;\n if (rssMB > memoryLimitMB * 0.9) {\n logger.error(COMPONENT, `Memory pressure — RSS ${rssMB}MB is above 90% of limit (${memoryLimitMB}MB). Reducing max concurrent requests.`);\n maxConcurrentOverride = Math.max(1, (maxConcurrentOverride ?? config.security.maxConcurrentTasks ?? 5) - 1);\n } else if (rssMB < memoryLimitMB * 0.7 && maxConcurrentOverride !== null) {\n maxConcurrentOverride = null; // Reset when memory recovers\n }\n\n // Enforce disk write limit (approximate via titan home dir size)\n try {\n const diskLimitMB = config.security?.maxDiskWriteMB || 1024;\n const { spawnSync } = await import('child_process');\n const du = spawnSync('du', ['-sm', TITAN_HOME], { encoding: 'utf-8', timeout: 5000 });\n const usedMB = parseInt(du.stdout?.split('\\t')[0] || '0', 10);\n if (usedMB > diskLimitMB * 0.9) {\n logger.error(COMPONENT, `Disk pressure — ${usedMB}MB used in ${TITAN_HOME}, above 90% of limit (${diskLimitMB}MB). Pausing non-essential writes.`);\n }\n } catch { /* du not available or failed — non-critical */ }\n\n // Keep primary agent heartbeat alive for Command Post\n try { reportHeartbeat('default'); } catch { /* non-critical */ }\n } catch (err) {\n logger.error(COMPONENT, `Health monitor error: ${(err as Error).message}`);\n }\n })();\n }, 60_000);\n healthMonitorInterval.unref();\n\n logger.info(COMPONENT, 'Health monitor started (60s interval)');\n\n // Catch unhandled promise rejections to prevent silent crashes + report\n // (v5.0 \"Spacewalk\"): reports go to the remote collector only when\n // `telemetry.enabled` AND `telemetry.crashReports` are both true AND the\n // user has previously consented via the SetupWizard. HOME path is stripped\n // from the stack to prevent personal-path leakage.\n //\n // Secret-scrubbing pass: removes API keys, bearer tokens, and URLs with\n // embedded credentials before the payload leaves the machine.\n const SECRET_PATTERNS = [\n // Bearer / Basic auth headers\n /\\b[Bb]earer\\s+[A-Za-z0-9_\\-.]{20,}/g,\n /\\b[Bb]asic\\s+[A-Za-z0-9+/=]{20,}/g,\n // API key prefixes (OpenAI, Anthropic, Groq, etc.)\n /\\b(sk|pk)-[A-Za-z0-9]{20,}/g,\n /\\b([a-zA-Z]{2,}_[a-zA-Z0-9]{16,})/g,\n // Generic hex tokens (32+ chars) — conservative to avoid scrubbing file hashes\n /\\b[0-9a-f]{64,}\\b/gi,\n // URLs with credentials\n /https?:\\/\\/[^\\s:]+:[^\\s@]+@[^\\s/]+/g,\n // Private keys / PEM blocks\n /-----BEGIN [A-Z ]+ PRIVATE KEY-----[\\s\\S]{100,}-----END [A-Z ]+ PRIVATE KEY-----/g,\n ];\n function scrubSecrets(text: string): string {\n let cleaned = text;\n for (const pattern of SECRET_PATTERNS) {\n cleaned = cleaned.replace(pattern, '[REDACTED]');\n }\n return cleaned;\n }\n\n const reportCrash = async (kind: 'unhandledRejection' | 'uncaughtException', err: unknown) => {\n try {\n const cfg = loadConfig();\n if (!cfg.telemetry?.enabled) return;\n if (!(cfg.telemetry as unknown as { crashReports?: boolean })?.crashReports) return;\n // v5.0.1: removed consentedAt gate so users upgrading from 4.x keep crash\n // reporting without re-running onboarding. The SetupWizard still stamps\n // consentedAt for new installs; we simply don't require it here.\n const { sendRemoteAnalytics } = await import('../analytics/collector.js');\n const { getOrCreateNodeId } = await import('../mesh/identity.js');\n const home = homedir();\n const stackRaw = (err instanceof Error ? (err.stack || err.message) : String(err));\n const stack = scrubSecrets(stackRaw.split(home).join('$HOME')).slice(0, 4000);\n const message = scrubSecrets(err instanceof Error ? err.message : String(err)).slice(0, 500);\n const fingerprint = `${kind}:${(message.match(/[A-Z][a-zA-Z0-9_]+Error/) || [message])[0]}`.slice(0, 128);\n await sendRemoteAnalytics({\n type: 'error',\n installId: getOrCreateNodeId(),\n version: TITAN_VERSION,\n message,\n stack,\n fingerprint,\n context: { kind },\n });\n } catch {\n // Crash reporting is best-effort\n }\n };\n\n process.on('unhandledRejection', (reason) => {\n logger.error(COMPONENT, `Unhandled rejection: ${reason}`);\n void reportCrash('unhandledRejection', reason);\n });\n\n // Catch uncaught exceptions — log and exit gracefully to allow systemd/docker restart\n process.on('uncaughtException', (err) => {\n logger.error(COMPONENT, `Uncaught exception: ${err.message}\\n${err.stack || ''}`);\n void reportCrash('uncaughtException', err);\n // Give logger + crash report time to flush before exiting\n setTimeout(() => {\n process.exit(1);\n }, 1500).unref();\n });\n\n // ── Graceful Shutdown ───────────────────────────────────────────\n const gracefulShutdown = async (signal: string) => {\n logger.info(COMPONENT, `Received ${signal} — shutting down gracefully...`);\n // Stop F5-TTS server if we started it. Both the canonical f5tts.pid\n // and the legacy qwen3tts.pid path are checked so an upgrade from a\n // pre-v5.0.2 install still gets a clean shutdown of any orphan child.\n for (const pidPath of [\n join(homedir(), '.titan', 'f5tts.pid'),\n join(homedir(), '.titan', 'qwen3tts.pid'),\n ]) {\n try {\n if (!fs.existsSync(pidPath)) continue;\n const pid = parseInt(fs.readFileSync(pidPath, 'utf-8').trim());\n process.kill(pid, 'SIGTERM');\n fs.unlinkSync(pidPath);\n logger.info(COMPONENT, `Stopped F5-TTS server (${pidPath})`);\n } catch { /* already stopped */ }\n }\n stopAutopilot();\n stopDaemon();\n shutdownCommandPost();\n stopTunnel();\n closeMemory();\n flushGraph();\n try { const { flushVectors } = await import('../memory/vectors.js'); flushVectors(); } catch { /* ignore */ }\n await stopGateway();\n logger.info(COMPONENT, 'Gateway stopped. Goodbye.');\n process.exit(0);\n };\n process.on('SIGINT', () => gracefulShutdown('SIGINT'));\n process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));\n\n // Global error handler — prevent stack trace leaks\n app.use((err: Error, _req: express.Request, res: express.Response, _next: express.NextFunction) => {\n if (err instanceof SyntaxError && 'body' in err) {\n res.status(400).json({ error: 'Invalid JSON in request body' });\n return;\n }\n logger.error(COMPONENT, `Unhandled error: ${err.message}`);\n res.status(500).json({ error: 'Internal server error' });\n });\n\n httpServer.listen(port, host, () => {\n const proto = useHttps ? 'https' : 'http';\n const wsProto = useHttps ? 'wss' : 'ws';\n logger.info(COMPONENT, `Gateway listening on ${proto}://${host}:${port}`);\n logger.info(COMPONENT, `Dashboard: ${proto}://${host}:${port}`);\n logger.info(COMPONENT, `WebSocket: ${wsProto}://${host}:${port}`);\n logger.info(COMPONENT, `API: ${proto}://${host}:${port}/api/health`);\n logger.info(COMPONENT, `\\nChannels: ${Array.from(channels.values()).map((c) => `${c.displayName} (${c.getStatus().connected ? '✅' : '❌'})`).join(', ')}`);\n logger.info(COMPONENT, `Skills: ${getSkills().length} loaded`);\n logger.info(COMPONENT, `Tools: ${getRegisteredTools().length} registered`);\n\n // Friendly update notice for upgraders\n try {\n const markerPath = join(homedir(), '.titan', 'install-marker.json');\n if (fs.existsSync(markerPath)) {\n const marker = JSON.parse(fs.readFileSync(markerPath, 'utf-8'));\n if (marker.previousVersion && marker.previousVersion !== TITAN_VERSION) {\n logger.info(COMPONENT, `\\n🚀 Welcome to TITAN v${TITAN_VERSION}! Upgraded from v${marker.previousVersion}.`);\n logger.info(COMPONENT, ` What's new: PostHog analytics (opt-in), enriched telemetry, secret-scrubbed crash reports.`);\n logger.info(COMPONENT, ` Your config and settings are untouched. See PRIVACY.md for details.\\n`);\n }\n }\n } catch { /* non-critical */ }\n\n // Start Cloudflare Tunnel if enabled\n if (config.tunnel?.enabled) {\n startTunnel(port, config.tunnel).catch((e) => {\n logger.error(COMPONENT, `Tunnel start failed: ${(e as Error).message}`);\n });\n }\n\n // Start analytics collection (telemetry must be enabled)\n recordStartupAnalytics().catch(() => {});\n startHeartbeatAnalytics(() => listSessions().length);\n });\n}\n"],"mappings":"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","names":["resolve","isAllowedOrigin","getHistory","exec","getDb","getGraphStats","result","port","recordStartupAnalytics","config","loadConfig","updateConfig","createApproval","join","TITAN_HOME","processMessage","content","closeSession","host","getMetricsSummary","getLearningStats"]}
|