nexus-agents 2.78.0 → 2.79.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-6WBTNZAY.js → chunk-3ULMVOIF.js} +2 -2
- package/dist/{chunk-GTGDVBLW.js → chunk-YMMYYAZT.js} +2 -2
- package/dist/{chunk-4N33QZLH.js → chunk-ZI6G7U7Y.js} +115 -21
- package/dist/chunk-ZI6G7U7Y.js.map +1 -0
- package/dist/cli.js +3 -3
- package/dist/index.js +2 -2
- package/dist/{setup-command-VYV4RFWW.js → setup-command-R4BOEMLZ.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-4N33QZLH.js.map +0 -1
- /package/dist/{chunk-6WBTNZAY.js.map → chunk-3ULMVOIF.js.map} +0 -0
- /package/dist/{chunk-GTGDVBLW.js.map → chunk-YMMYYAZT.js.map} +0 -0
- /package/dist/{setup-command-VYV4RFWW.js.map → setup-command-R4BOEMLZ.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/config/schemas-core.ts","../src/config/schemas-expert.ts","../src/config/schemas-security.ts","../src/config/schemas.ts","../src/config/schemas-observability.ts","../src/config/schemas-skills.ts","../src/config/schemas-sica.ts","../src/config/schemas-gateway.ts","../src/config/schemas-routing.ts","../src/config/env-schema.ts","../src/config/model-availability.ts","../src/config/routing-config-adapter.ts","../src/config/config-manager.ts","../src/config/config-loader.ts","../src/cli/setup-data-dir.ts","../src/cli/doctor.ts","../src/mcp/server.ts","../src/mcp/task-store.ts","../src/cli/doctor-formatting.ts","../src/cli/doctor-harness-alignment.ts"],"sourcesContent":["/**\n * nexus-agents - Version constant\n *\n * Injected at build time via tsup define from package.json.\n * Do NOT edit this value manually — it is replaced during build.\n */\n\ndeclare const __NEXUS_VERSION__: string;\n\nexport const VERSION: string = typeof __NEXUS_VERSION__ !== 'undefined' ? __NEXUS_VERSION__ : 'dev';\n","/**\n * nexus-agents/config - Core Configuration Schemas\n *\n * Basic infrastructure schemas: Logging, Provider, Model configuration.\n */\n\nimport { z } from 'zod';\n\n/**\n * Logging configuration schema.\n */\nexport const LoggingConfigSchema = z.object({\n level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n format: z.enum(['json', 'pretty']).default('json'),\n // Default to stderr: MCP stdio transport reserves stdout for JSON-RPC frames.\n destination: z.enum(['stdout', 'stderr', 'file']).default('stderr'),\n filePath: z.string().optional(),\n});\n\nexport type LoggingConfig = z.infer<typeof LoggingConfigSchema>;\n\n/**\n * Provider configuration schema.\n */\nexport const ProviderConfigSchema = z.object({\n apiKey: z.string().optional(),\n baseUrl: z.url().optional(),\n timeout: z.number().positive().default(30000),\n maxRetries: z.number().nonnegative().default(3),\n});\n\nexport type ProviderConfig = z.infer<typeof ProviderConfigSchema>;\n\n/**\n * Model tier configuration.\n */\nexport const ModelTiersSchema = z.object({\n fast: z.array(z.string()).min(1),\n balanced: z.array(z.string()).min(1),\n powerful: z.array(z.string()).min(1),\n});\n\nexport type ModelTiers = z.infer<typeof ModelTiersSchema>;\n\n/**\n * Model configuration schema.\n */\nexport const ModelConfigSchema = z.object({\n default: z.string(),\n tiers: ModelTiersSchema,\n providers: z.record(z.string(), ProviderConfigSchema).optional(),\n});\n\nexport type ModelConfig = z.infer<typeof ModelConfigSchema>;\n\n/**\n * Workflow configuration schema.\n */\nexport const WorkflowConfigSchema = z.object({\n templatesDir: z.string().default('./workflows'),\n timeout: z.number().positive().default(300000),\n maxParallel: z.number().positive().default(5),\n});\n\nexport type WorkflowConfig = z.infer<typeof WorkflowConfigSchema>;\n","/**\n * nexus-agents/config - Expert Configuration Schemas\n *\n * Schemas for expert definitions, custom experts, and related constants.\n */\n\nimport { z } from 'zod';\n\n/**\n * Valid model tiers for custom experts.\n */\nexport const VALID_EXPERT_TIERS = ['fast', 'balanced', 'powerful'] as const;\nexport type ExpertTier = (typeof VALID_EXPERT_TIERS)[number];\n\n/**\n * Valid task domains for custom experts.\n */\nexport const VALID_EXPERT_DOMAINS = [\n 'code',\n 'security',\n 'architecture',\n 'documentation',\n 'testing',\n 'general',\n] as const;\nexport type ExpertDomain = (typeof VALID_EXPERT_DOMAINS)[number];\n\n/**\n * Maximum system prompt length (4000 characters).\n * This matches typical LLM system prompt limits while allowing detailed instructions.\n */\nexport const MAX_SYSTEM_PROMPT_LENGTH = 4000;\n\n/**\n * Custom expert definition schema from YAML config.\n *\n * Defines a user-configurable expert with:\n * - systemPrompt: The expert's persona and instructions (max 4000 chars)\n * - tier: Model tier for routing (fast, balanced, powerful)\n * - domain: Primary domain of expertise\n * - capabilities: What this expert can do\n * - temperature: Model temperature (0-1)\n * - tools: Optional tool restrictions\n *\n * (Source: Issue #300)\n */\nexport const CustomExpertDefinitionSchema = z.object({\n /** System prompt defining the expert's persona (max 4000 characters) */\n systemPrompt: z\n .string()\n .min(1, 'System prompt is required')\n .max(\n MAX_SYSTEM_PROMPT_LENGTH,\n `System prompt must be at most ${String(MAX_SYSTEM_PROMPT_LENGTH)} characters`\n ),\n\n /** Model tier for routing */\n tier: z\n .enum(VALID_EXPERT_TIERS, {\n error: `Invalid tier. Valid options: ${VALID_EXPERT_TIERS.join(', ')}`,\n })\n .default('balanced'),\n\n /** Primary domain of expertise */\n domain: z\n .enum(VALID_EXPERT_DOMAINS, {\n error: `Invalid domain. Valid options: ${VALID_EXPERT_DOMAINS.join(', ')}`,\n })\n .default('general'),\n\n /** Secondary domains (optional) */\n secondaryDomains: z.array(z.enum(VALID_EXPERT_DOMAINS)).optional(),\n\n /** Expert capabilities */\n capabilities: z\n .array(z.string().min(1))\n .min(1, 'At least one capability is required')\n .default(['task_execution']),\n\n /** Model temperature (0-1) */\n temperature: z.number().min(0).max(1).default(0.3),\n\n /** Allowed tools (optional, unrestricted if not specified) */\n tools: z.array(z.string()).optional(),\n\n /** Human-readable description */\n description: z.string().optional(),\n\n /** Weight for expert selection scoring (0-1) */\n weight: z.number().min(0).max(1).default(1.0),\n\n /** Whether this expert is currently available */\n available: z.boolean().default(true),\n});\n\nexport type CustomExpertDefinition = z.infer<typeof CustomExpertDefinitionSchema>;\n\n/**\n * Legacy expert definition schema (for backwards compatibility).\n * Use CustomExpertDefinitionSchema for new implementations.\n */\nexport const ExpertDefinitionSchema = z.object({\n prompt: z.string().min(1),\n tier: z.enum(['fast', 'balanced', 'powerful']).default('balanced'),\n temperature: z.number().min(0).max(1).default(0.3),\n tools: z.array(z.string()).optional(),\n});\n\nexport type ExpertDefinition = z.infer<typeof ExpertDefinitionSchema>;\n\n/**\n * Expert configuration schema.\n */\nexport const ExpertConfigSchema = z.object({\n /** Enable built-in experts */\n builtin: z.boolean().default(true),\n\n /** Custom expert definitions keyed by expert ID */\n custom: z\n .record(\n z.string().regex(/^[a-z][a-z0-9_]*$/, {\n message:\n 'Expert ID must start with a letter and contain only lowercase letters, numbers, and underscores',\n }),\n CustomExpertDefinitionSchema\n )\n .optional(),\n});\n\nexport type ExpertConfig = z.infer<typeof ExpertConfigSchema>;\n","/**\n * nexus-agents/config - Security Configuration Schemas\n *\n * Schemas for security, policy, sandbox, timeout, and rate limiting.\n */\n\nimport { z } from 'zod';\n\n/**\n * Policy configuration schema.\n *\n * Controls authorization behavior for tool operations.\n * - defaultMode: Whether operations default to read-only or read-write\n * - policyMode: Whether to enforce denials or just warn (for migration)\n *\n * (Source: OWASP ASVS 4.0, Authorization Controls)\n */\nexport const PolicyConfigSchema = z.object({\n /** Default execution mode for tool operations (default: 'read-only') */\n defaultMode: z.enum(['read-only', 'read-write']).default('read-only'),\n /** Policy enforcement mode (default: 'enforce') */\n policyMode: z.enum(['enforce', 'warn']).default('enforce'),\n});\n\nexport type PolicyConfig = z.infer<typeof PolicyConfigSchema>;\n\n/**\n * Sandbox configuration schema.\n *\n * Controls agent execution isolation.\n * - mode: 'none' (no isolation), 'policy' (allowlist enforcement), 'container' (Docker)\n * - fallbackToPolicy: Whether to fall back to policy mode if container unavailable\n *\n * (Source: Issue #175, ALIGNMENT_ROADMAP Phase 4)\n */\nexport const SandboxConfigSchema = z.object({\n /** Sandbox execution mode (default: 'policy') */\n mode: z.enum(['none', 'policy', 'container']).default('policy'),\n /** Fall back to policy mode if container mode unavailable (default: true) */\n fallbackToPolicy: z.boolean().default(true),\n /** Docker image to use in container mode (default: 'node:22-alpine') */\n dockerImage: z.string().optional(),\n /** Enable network access in container mode (default: false) */\n networkEnabled: z.boolean().default(false),\n});\n\nexport type SandboxConfig = z.infer<typeof SandboxConfigSchema>;\n\n/**\n * Timeout configuration schema.\n *\n * Controls timeout behavior for MCP operations to mitigate CVE-2026-0621.\n * - defaultTimeoutMs: Default timeout for operations\n * - maxTimeoutMs: Maximum allowed timeout\n * - enableLogging: Whether to log timeout events\n * - uriValidation: Whether to validate URIs against ReDoS patterns\n *\n * (Source: Issue #271, CVE-2026-0621 mitigation)\n */\nexport const TimeoutConfigSchema = z.object({\n /** Default timeout in milliseconds (default: 30000) */\n defaultTimeoutMs: z.number().positive().default(30000),\n /** Maximum timeout in milliseconds (default: 300000) */\n maxTimeoutMs: z.number().positive().default(300000),\n /** Whether to log timeout events (default: true) */\n enableLogging: z.boolean().default(true),\n /** Enable URI validation to prevent ReDoS (default: true) */\n uriValidation: z.boolean().default(true),\n /** Per-tool timeout overrides in milliseconds (Issue #657) */\n perToolTimeout: z.record(z.string(), z.number().positive().max(600000)).optional(),\n});\n\nexport type TimeoutConfig = z.infer<typeof TimeoutConfigSchema>;\n\n/**\n * Per-tool rate limit configuration.\n * Allows different limits for each tool category.\n *\n * (Source: Issue #274 Phase 2 - per-tool rate limits)\n */\nexport const ToolRateLimitSchema = z.object({\n /** Maximum tokens (burst capacity) */\n capacity: z.number().positive().default(10),\n /** Tokens refilled per interval */\n refillRate: z.number().positive().default(10),\n /** Refill interval in milliseconds (default: 60000 = 1 minute) */\n refillIntervalMs: z.number().positive().default(60000),\n});\n\nexport type ToolRateLimit = z.infer<typeof ToolRateLimitSchema>;\n\n/**\n * Default per-tool rate limits per Issue #274.\n */\nexport const DEFAULT_TOOL_RATE_LIMITS = {\n orchestrate: { capacity: 10, refillRate: 10, refillIntervalMs: 60000 },\n delegate: { capacity: 20, refillRate: 20, refillIntervalMs: 60000 },\n workflow: { capacity: 5, refillRate: 5, refillIntervalMs: 60000 },\n expert: { capacity: 30, refillRate: 30, refillIntervalMs: 60000 },\n} as const satisfies Record<string, ToolRateLimit>;\n\n/**\n * Tool categories for rate limiting.\n */\nexport type ToolCategory = keyof typeof DEFAULT_TOOL_RATE_LIMITS;\n\n/**\n * Security configuration schema.\n */\nexport const SecurityConfigSchema = z.object({\n allowedPaths: z.array(z.string()).default(['./']),\n blockedPatterns: z.array(z.string()).default([]),\n rateLimit: z\n .object({\n enabled: z.boolean().default(true),\n requestsPerMinute: z.number().positive().default(60),\n /** Per-tool rate limits (Issue #274 Phase 2) */\n perTool: z.record(z.string(), ToolRateLimitSchema).optional(),\n })\n .default(() => ({ enabled: true, requestsPerMinute: 60 })),\n secretsFile: z.string().optional(),\n /** Policy firewall configuration */\n policy: PolicyConfigSchema.optional(),\n /** Sandbox execution configuration (Issue #175) */\n sandbox: SandboxConfigSchema.optional(),\n /** Timeout configuration (Issue #271, CVE-2026-0621) */\n timeout: TimeoutConfigSchema.optional(),\n /** Tool allowlist — when set, only listed tools are registered (Issue #740) */\n toolAllowlist: z.array(z.string()).optional(),\n /** Audit logging configuration (Issue #740 Phase 2) */\n audit: z\n .object({\n /** Enable audit logging (default: true) */\n enabled: z.boolean().default(true),\n /** Log directory (default: ~/.nexus-agents/audit) */\n logDir: z.string().optional(),\n /** Minimum severity to log (default: 'info') */\n minSeverity: z.enum(['info', 'warning', 'critical']).default('info'),\n /** Enable tamper-evident hash chain (default: true) */\n enableHashChain: z.boolean().default(true),\n /** Maximum log file size in bytes (default: 10MB) */\n maxFileSizeBytes: z\n .number()\n .positive()\n .default(10 * 1024 * 1024),\n /** Maximum number of log files to retain (default: 10) */\n maxFiles: z.number().positive().default(10),\n })\n .optional(),\n /** Authentication configuration (Issue #739) */\n auth: z\n .object({\n /** Enable authentication for network-exposed transports (default: true) */\n enabled: z.boolean().default(true),\n /** Authentication method (default: 'token') */\n method: z.enum(['token', 'oauth2']).default('token'),\n /** Header name for bearer token (default: 'Authorization') */\n tokenHeader: z.string().default('Authorization'),\n /** Token file path (default: ~/.nexus-agents/auth/server-token) */\n tokenFile: z.string().optional(),\n })\n .optional(),\n});\n\nexport type SecurityConfig = z.infer<typeof SecurityConfigSchema>;\n\n/**\n * Authentication configuration type.\n * (Source: Issue #739 - enable MCP authentication by default)\n */\nexport type AuthConfig = NonNullable<SecurityConfig['auth']>;\n","/**\n * nexus-agents/config - Configuration Schemas\n *\n * Aggregation module that re-exports all configuration schemas.\n * Individual schema categories are organized in separate files:\n * - schemas-core.ts: Logging, Provider, Model, Workflow\n * - schemas-expert.ts: Expert definitions and constants\n * - schemas-security.ts: Security, Policy, Sandbox, Timeout, RateLimit\n * - schemas-observability.ts: EventBus, Observability\n */\n\nimport { z } from 'zod';\n\n// Re-export core schemas\nexport {\n LoggingConfigSchema,\n ProviderConfigSchema,\n ModelTiersSchema,\n ModelConfigSchema,\n WorkflowConfigSchema,\n} from './schemas-core.js';\n\nexport type {\n LoggingConfig,\n ProviderConfig,\n ModelTiers,\n ModelConfig,\n WorkflowConfig,\n} from './schemas-core.js';\n\n// Re-export expert schemas\nexport {\n VALID_EXPERT_TIERS,\n VALID_EXPERT_DOMAINS,\n MAX_SYSTEM_PROMPT_LENGTH,\n CustomExpertDefinitionSchema,\n ExpertDefinitionSchema,\n ExpertConfigSchema,\n} from './schemas-expert.js';\n\nexport type {\n ExpertTier,\n ExpertDomain,\n CustomExpertDefinition,\n ExpertDefinition,\n ExpertConfig,\n} from './schemas-expert.js';\n\n// Re-export security schemas\nexport {\n PolicyConfigSchema,\n SandboxConfigSchema,\n TimeoutConfigSchema,\n ToolRateLimitSchema,\n DEFAULT_TOOL_RATE_LIMITS,\n SecurityConfigSchema,\n} from './schemas-security.js';\n\nexport type {\n PolicyConfig,\n SandboxConfig,\n TimeoutConfig,\n ToolRateLimit,\n ToolCategory,\n SecurityConfig,\n} from './schemas-security.js';\n\n// Re-export observability schemas\nexport { EventBusConfigSchema, ObservabilityConfigSchema } from './schemas-observability.js';\n\nexport type { EventBusConfig, ObservabilityConfig } from './schemas-observability.js';\n\n// Re-export skills schemas (Issue #491)\nexport {\n SkillLibraryConfigSchema,\n ExternalPackSourceSchema,\n DEFAULT_SKILL_LIBRARY_CONFIG as DEFAULT_SKILLS_CONFIG,\n} from './schemas-skills.js';\n\nexport type { SkillLibraryConfig, ExternalPackSource } from './schemas-skills.js';\n\n// Re-export SICA schemas (Issue #492)\nexport { SicaConfigSchema, DEFAULT_SICA_CONFIG } from './schemas-sica.js';\n\nexport type { SicaConfig } from './schemas-sica.js';\n\n// Re-export gateway schemas (Issue #897)\nexport { GatewayConfigSchema } from './schemas-gateway.js';\n\nexport type { GatewayConfigType } from './schemas-gateway.js';\n\n// Re-export routing schemas (Issue #475)\nexport {\n BudgetConstraintsSchema,\n TopsisCriterionSchema,\n TopsisConfigSchema,\n DifficultyWeightsConfigSchema,\n DifficultyThresholdsSchema,\n ZeroRouterConfigSchema,\n LatencyTrackerConfigSchema,\n RoutingMemoryConfigSchema,\n RoutingConfigSchema,\n DEFAULT_ROUTING_CONFIG,\n} from './schemas-routing.js';\n\nexport type {\n BudgetConstraints,\n TopsisCriterion,\n TopsisConfig,\n DifficultyWeightsConfig,\n DifficultyThresholds,\n ZeroRouterConfig,\n LatencyTrackerConfig,\n RoutingMemoryConfig,\n RoutingConfig,\n} from './schemas-routing.js';\n\n// Import for local use in AppConfigSchema\nimport { ModelConfigSchema, WorkflowConfigSchema, LoggingConfigSchema } from './schemas-core.js';\nimport { ExpertConfigSchema } from './schemas-expert.js';\nimport { SecurityConfigSchema } from './schemas-security.js';\nimport { ObservabilityConfigSchema } from './schemas-observability.js';\nimport { RoutingConfigSchema } from './schemas-routing.js';\nimport { SkillLibraryConfigSchema } from './schemas-skills.js';\nimport { SicaConfigSchema } from './schemas-sica.js';\nimport { GatewayConfigSchema } from './schemas-gateway.js';\n\n/**\n * Complete application configuration schema.\n */\nexport const AppConfigSchema = z.object({\n models: ModelConfigSchema,\n experts: ExpertConfigSchema.optional(),\n workflows: WorkflowConfigSchema.optional(),\n security: SecurityConfigSchema.optional(),\n logging: LoggingConfigSchema.optional(),\n /** Observability configuration (Issue #307) */\n observability: ObservabilityConfigSchema.optional(),\n /** Routing configuration (Issue #475) - used in orchestrator mode */\n routing: RoutingConfigSchema.optional(),\n /** Skill library configuration (Issue #491) */\n skills: SkillLibraryConfigSchema.optional(),\n /** SICA self-improvement configuration (Issue #492) */\n sica: SicaConfigSchema.optional(),\n /** Gateway middleware configuration (Issue #897) */\n gateway: GatewayConfigSchema.optional(),\n});\n\nexport type AppConfig = z.infer<typeof AppConfigSchema>;\n\n/**\n * Default configuration values.\n */\nexport const defaultConfig: Partial<AppConfig> = {\n models: {\n default: 'claude-sonnet',\n tiers: {\n fast: ['claude-haiku', 'gemini-flash'],\n balanced: ['claude-sonnet', 'gemini-pro'],\n powerful: ['claude-opus', 'codex-5.3'],\n },\n },\n logging: {\n level: 'info',\n format: 'json',\n // stderr is the safe default: MCP stdio transport reserves stdout for\n // JSON-RPC frames. Any log written to stdout corrupts the transport.\n destination: 'stderr',\n },\n security: {\n allowedPaths: ['./'],\n blockedPatterns: [],\n rateLimit: {\n enabled: true,\n requestsPerMinute: 60,\n },\n policy: {\n defaultMode: 'read-only',\n policyMode: 'enforce',\n },\n timeout: {\n defaultTimeoutMs: 30000,\n maxTimeoutMs: 300000,\n enableLogging: true,\n uriValidation: true,\n },\n },\n};\n","/**\n * nexus-agents/config - Observability Configuration Schemas\n *\n * Schemas for EventBus and observability configuration.\n */\n\nimport { z } from 'zod';\n\n/**\n * EventBus observability configuration schema.\n *\n * Controls EventBus integration with MCP server for agent-to-agent\n * communication visibility in Claude Desktop context.\n *\n * (Source: Issue #307 - EventBus MCP integration)\n */\nexport const EventBusConfigSchema = z.object({\n /** Enable EventBus integration (default: true) */\n enabled: z.boolean().default(true),\n /** Maximum events to retain in history (default: 1000) */\n maxHistorySize: z.number().positive().default(1000),\n /** Event patterns to subscribe to (default: all major patterns) */\n subscriptions: z\n .object({\n /** Subscribe to consensus events (consensus.*) */\n consensus: z.boolean().default(true),\n /** Subscribe to agent events (agent.*) */\n agent: z.boolean().default(true),\n /** Subscribe to protocol events (protocol.*) */\n protocol: z.boolean().default(true),\n /** Subscribe to session events (session.*) */\n session: z.boolean().default(true),\n /** Subscribe to message events (message.*) */\n message: z.boolean().default(false), // Off by default (high volume)\n /** Subscribe to byzantine detection events (byzantine.*) */\n byzantine: z.boolean().default(true),\n })\n .default(() => ({\n consensus: true,\n agent: true,\n protocol: true,\n session: true,\n message: false,\n byzantine: true,\n })),\n /** Logging configuration for events */\n logging: z\n .object({\n /** Log level for frequent events (default: debug) */\n frequentEventLevel: z.enum(['debug', 'info']).default('debug'),\n /** Log level for important events (default: info) */\n importantEventLevel: z.enum(['debug', 'info']).default('info'),\n })\n .default(() => ({\n frequentEventLevel: 'debug' as const,\n importantEventLevel: 'info' as const,\n })),\n});\n\nexport type EventBusConfig = z.infer<typeof EventBusConfigSchema>;\n\n/**\n * Observability configuration schema.\n *\n * Controls swarm-level observability features including EventBus integration.\n *\n * (Source: Issue #307 - EventBus MCP integration)\n */\nexport const ObservabilityConfigSchema = z.object({\n /** EventBus configuration */\n eventBus: EventBusConfigSchema.optional(),\n /** SwarmObserver maximum events (default: 10000) */\n swarmObserverMaxEvents: z.number().positive().default(10000),\n});\n\nexport type ObservabilityConfig = z.infer<typeof ObservabilityConfigSchema>;\n","/**\n * nexus-agents/config - Skills Configuration Schemas\n *\n * Zod schemas for SkillLibrary configuration.\n * Implements the Voyager skill library pattern configuration.\n *\n * @module config/schemas-skills\n * (Source: Issue #491 - Wire SkillLibrary to orchestration)\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema for an external skill pack source (Issue #654).\n */\nexport const ExternalPackSourceSchema = z.object({\n /** Pack name for identification */\n name: z.string().min(1),\n /** Source: npm package name or local file path */\n source: z.string().min(1),\n /** Whether the pack is enabled (default: true) */\n enabled: z.boolean().default(true),\n});\n\nexport type ExternalPackSource = z.infer<typeof ExternalPackSourceSchema>;\n\n/**\n * SkillLibrary configuration schema.\n *\n * Maps to SkillLibraryConfig in agents/skills/skill-types.ts\n */\nexport const SkillLibraryConfigSchema = z.object({\n /** Whether skill library is enabled (default: true) */\n enabled: z.boolean().default(true),\n\n /** Maximum skills to store (default: 1000) */\n maxSkills: z.number().int().positive().default(1000),\n\n /** Minimum success rate to keep skill (0-1, default: 0.3) */\n minSuccessRateForRetention: z.number().min(0).max(1).default(0.3),\n\n /** Number of executions before evaluating retention (default: 5) */\n executionsBeforeEvaluation: z.number().int().nonnegative().default(5),\n\n /** Enable automatic skill pruning (default: true) */\n enablePruning: z.boolean().default(true),\n\n /** Whether to track detailed execution history (default: true) */\n trackExecutionHistory: z.boolean().default(true),\n\n /** Maximum execution history entries per skill (default: 100) */\n maxHistoryPerSkill: z.number().int().positive().default(100),\n\n /** External skill pack sources (Issue #654) */\n externalPacks: z.array(ExternalPackSourceSchema).optional(),\n});\n\nexport type SkillLibraryConfig = z.infer<typeof SkillLibraryConfigSchema>;\n\n/**\n * Default SkillLibrary configuration values.\n */\nexport const DEFAULT_SKILL_LIBRARY_CONFIG: SkillLibraryConfig = {\n enabled: true,\n maxSkills: 1000,\n minSuccessRateForRetention: 0.3,\n executionsBeforeEvaluation: 5,\n enablePruning: true,\n trackExecutionHistory: true,\n maxHistoryPerSkill: 100,\n};\n","/**\n * nexus-agents/config - SICA Configuration Schemas\n *\n * Zod schemas for Self-Improving Coding Agent configuration.\n * Implements SICA pattern configuration for agent self-improvement.\n *\n * @module config/schemas-sica\n * (Source: Issue #492 - Wire SicaAgent to orchestration)\n */\n\nimport { z } from 'zod';\n\n/**\n * SICA (Self-Improving Coding Agent) configuration schema.\n *\n * Maps to SicaConfig in agents/self-improving/sica-types.ts\n */\nexport const SicaConfigSchema = z.object({\n /** Whether SICA wrapping is enabled (default: false) */\n enabled: z.boolean().default(false),\n\n /** Minimum executions before considering improvement (default: 10) */\n minExecutionsForImprovement: z.number().int().positive().default(10),\n\n /** Success rate threshold to trigger improvement (0-1, default: 0.7) */\n improvementThreshold: z.number().min(0).max(1).default(0.7),\n\n /** Maximum concurrent versions to evaluate (default: 3) */\n maxActiveVersions: z.number().int().positive().max(10).default(3),\n\n /** Whether to auto-select best version (default: true) */\n autoSelectBest: z.boolean().default(true),\n\n /** Improvement cooldown in milliseconds (default: 60000) */\n improvementCooldownMs: z.number().int().nonnegative().default(60000),\n\n /** Enable observability logging for SICA events (default: true) */\n enableObservability: z.boolean().default(true),\n});\n\nexport type SicaConfig = z.infer<typeof SicaConfigSchema>;\n\n/**\n * Default SICA configuration values.\n *\n * SICA is disabled by default as it wraps agents with self-improvement\n * capabilities which adds overhead. Enable explicitly when needed.\n */\nexport const DEFAULT_SICA_CONFIG: SicaConfig = {\n enabled: false,\n minExecutionsForImprovement: 10,\n improvementThreshold: 0.7,\n maxActiveVersions: 3,\n autoSelectBest: true,\n improvementCooldownMs: 60000,\n enableObservability: true,\n};\n","/**\n * nexus-agents/config - Gateway Configuration Schema\n *\n * Schema for the MCP gateway middleware configuration.\n * Controls tier-aware dispatch logging, per-tool tier overrides,\n * and upstream MCP server composition (#1498).\n *\n * (Source: Issue #897, Epic #888, Issue #1498)\n */\n\nimport { z } from 'zod';\n\n/**\n * Valid tier names for configuration.\n * Maps to RequestTier enum values in tier-classifier.ts.\n */\nconst TierNameSchema = z.enum(['DIRECT', 'ANALYZED', 'ORCHESTRATED']);\n\n/** Allowed commands for upstream MCP servers (security: no arbitrary exec). */\nconst ALLOWED_COMMANDS = ['node', 'npx', 'python', 'python3', 'uvx', 'docker'] as const;\n\n/**\n * Upstream MCP server configuration (#1498).\n * Defines an external MCP server to connect to via stdio transport.\n */\nexport const UpstreamServerSchema = z.object({\n /** Unique name for this upstream server (used as tool prefix). */\n name: z\n .string()\n .min(1)\n .max(50)\n .regex(/^[a-z0-9_-]+$/),\n /** Command to spawn the server. Must be in allowlist. */\n command: z.enum(ALLOWED_COMMANDS),\n /** Arguments to pass to the command. */\n args: z.array(z.string().max(500)).default([]),\n /** Environment variables (use {env:VAR} references, not plaintext secrets). */\n env: z.record(z.string(), z.string()).optional(),\n /** Whether to connect lazily on first tool call (default: true). */\n lazy: z.boolean().default(true),\n /** Connection timeout in ms (default: 10000). */\n timeoutMs: z.number().int().min(1000).max(60000).default(10000),\n});\n\nexport type UpstreamServerConfig = z.infer<typeof UpstreamServerSchema>;\n\n/** Maximum number of upstream servers (resource limit). */\nexport const MAX_UPSTREAM_SERVERS = 5;\n\n/**\n * Gateway middleware configuration schema.\n *\n * Controls whether tier-aware dispatch logging is active,\n * allows per-tool tier overrides, and defines upstream MCP servers.\n */\nexport const GatewayConfigSchema = z.object({\n /** Enable gateway tier dispatch logging (default: true). */\n enabled: z.boolean().default(true),\n /**\n * Per-tool tier overrides.\n * Keys are tool names (e.g., 'delegate_to_model'), values are tier names.\n * Overrides the default tier from TOOL_TIER_MAP in tier-classifier.ts.\n */\n tierOverrides: z.record(z.string(), TierNameSchema).optional(),\n /**\n * Upstream MCP servers to compose with (#1498).\n * Tools from upstream servers are available as prefixed tools (e.g., tavily.search).\n */\n upstreamServers: z.array(UpstreamServerSchema).max(MAX_UPSTREAM_SERVERS).optional(),\n});\n\nexport type GatewayConfigType = z.infer<typeof GatewayConfigSchema>;\n","/**\n * nexus-agents/config - Routing Configuration Schemas\n *\n * Zod schemas for routing configuration exposed via nexus-agents.yaml.\n * Allows users to configure the CompositeRouter pipeline, TOPSIS criteria,\n * ZeroRouter thresholds, and other routing parameters.\n *\n * @module config/schemas-routing\n * (Source: Issue #475 - Add routing configuration section to nexus-agents.yaml)\n */\n\nimport { z } from 'zod';\nimport { CliNameSchema } from './model-capabilities-types.js';\n\n/**\n * Budget constraints schema for cost/token/latency limits.\n */\nexport const BudgetConstraintsSchema = z\n .object({\n /** Maximum tokens per request */\n maxTokens: z.number().positive().optional(),\n /** Maximum cost per request in USD */\n maxCostUsd: z.number().positive().optional(),\n /** Maximum latency per request in milliseconds */\n maxLatencyMs: z.number().positive().optional(),\n })\n .optional();\n\nexport type BudgetConstraints = z.infer<typeof BudgetConstraintsSchema>;\n\n/**\n * TOPSIS criterion schema for multi-criteria decision making.\n */\nexport const TopsisCriterionSchema = z.object({\n /** Criterion name (e.g., 'quality', 'cost', 'latency') */\n name: z.string().min(1),\n /** Weight for this criterion (0-1, should sum to 1 across all criteria) */\n weight: z.number().min(0).max(1),\n /** Whether higher values are better (true) or lower is better (false) */\n beneficial: z.boolean(),\n});\n\nexport type TopsisCriterion = z.infer<typeof TopsisCriterionSchema>;\n\n/**\n * TOPSIS configuration schema.\n */\nexport const TopsisConfigSchema = z\n .object({\n /** Criteria with weights (must sum to 1.0) */\n criteria: z.array(TopsisCriterionSchema).optional(),\n /** Minimum acceptable quality score (0-10) */\n minQualityThreshold: z.number().min(0).max(10).default(5),\n /** Maximum acceptable latency in milliseconds (optional) */\n maxLatencyMs: z.number().positive().optional(),\n /** Maximum acceptable cost per request in USD (optional) */\n maxCostPerRequest: z.number().positive().optional(),\n /** Whether to log detailed scoring info */\n verbose: z.boolean().default(false),\n })\n .optional();\n\nexport type TopsisConfig = z.infer<typeof TopsisConfigSchema>;\n\n/**\n * Difficulty weights schema for ZeroRouter aggregation.\n */\nexport const DifficultyWeightsConfigSchema = z.object({\n /** Weight for reasoning difficulty (0-1) */\n reasoning: z.number().min(0).max(1).default(0.3),\n /** Weight for knowledge difficulty (0-1) */\n knowledge: z.number().min(0).max(1).default(0.15),\n /** Weight for creativity difficulty (0-1) */\n creativity: z.number().min(0).max(1).default(0.15),\n /** Weight for precision difficulty (0-1) */\n precision: z.number().min(0).max(1).default(0.25),\n /** Weight for context length difficulty (0-1) */\n context_length: z.number().min(0).max(1).default(0.15),\n});\n\nexport type DifficultyWeightsConfig = z.infer<typeof DifficultyWeightsConfigSchema>;\n\n/**\n * Difficulty thresholds schema for level classification.\n */\nexport const DifficultyThresholdsSchema = z.object({\n /** Upper bound for 'easy' classification (0-1) */\n easyUpperBound: z.number().min(0).max(1).default(0.3),\n /** Lower bound for 'hard' classification (0-1) */\n hardLowerBound: z.number().min(0).max(1).default(0.7),\n});\n\nexport type DifficultyThresholds = z.infer<typeof DifficultyThresholdsSchema>;\n\n// CliNameSchema imported from model-capabilities-types.ts (canonical source)\n\n/**\n * Valid difficulty levels.\n */\nconst DifficultyLevelSchema = z.enum(['easy', 'medium', 'hard']);\n\n/**\n * Valid model tiers.\n */\nconst ModelTierSchema = z.enum(['fast', 'balanced', 'powerful']);\n\n/**\n * ZeroRouter configuration schema.\n */\nexport const ZeroRouterConfigSchema = z\n .object({\n /** Difficulty thresholds for level classification */\n thresholds: DifficultyThresholdsSchema.optional(),\n /** Weights for difficulty aggregation */\n weights: DifficultyWeightsConfigSchema.optional(),\n /** Mapping from difficulty level to model tier */\n difficultyToTier: z.record(DifficultyLevelSchema, ModelTierSchema).optional(),\n /** Mapping from model tier to CLI preference order */\n tierToClis: z.record(ModelTierSchema, z.array(CliNameSchema)).optional(),\n /** Enable adaptive calibration from outcomes */\n enableCalibration: z.boolean().default(true),\n /** Maximum outcomes to store for calibration */\n maxCalibrationOutcomes: z.number().int().positive().default(1000),\n /** Minimum outcomes before applying calibration adjustments */\n minCalibrationOutcomes: z.number().int().positive().default(50),\n /** Verbose logging */\n verbose: z.boolean().default(false),\n })\n .optional();\n\nexport type ZeroRouterConfig = z.infer<typeof ZeroRouterConfigSchema>;\n\n/**\n * Latency tracker configuration schema.\n */\nexport const LatencyTrackerConfigSchema = z\n .object({\n /** Maximum number of samples to keep per CLI */\n windowSize: z.number().int().positive().default(100),\n /** Time-weighted decay factor (0-1, higher = more weight to recent) */\n decayFactor: z.number().min(0).max(1).default(0.95),\n /** Maximum age of samples in milliseconds before forced eviction */\n maxSampleAgeMs: z.number().int().positive().default(3600000),\n /** Percentiles to calculate */\n percentiles: z.array(z.number().min(0).max(100)).max(20).default([50, 95, 99]),\n })\n .optional();\n\nexport type LatencyTrackerConfig = z.infer<typeof LatencyTrackerConfigSchema>;\n\n/**\n * Routing memory configuration schema.\n */\nexport const RoutingMemoryConfigSchema = z\n .object({\n /** Minimum observations before using learned routing */\n minObservations: z.number().int().positive().default(5),\n /** Confidence threshold for using cached decisions */\n confidenceThreshold: z.number().min(0).max(1).default(0.6),\n /** Success rate threshold for trusting a routing pattern */\n successRateThreshold: z.number().min(0).max(1).default(0.7),\n /** Maximum age of cached actions in milliseconds */\n actionCacheMaxAgeMs: z.number().int().positive().default(3600000),\n })\n .optional();\n\nexport type RoutingMemoryConfig = z.infer<typeof RoutingMemoryConfigSchema>;\n\n/**\n * Complete routing configuration schema.\n * Exposes all routing subsystem parameters via nexus-agents.yaml.\n */\nexport const RoutingConfigSchema = z.object({\n /**\n * Pipeline stage toggles.\n * Enable or disable individual routing stages.\n */\n stages: z\n .object({\n /** Enable budget filtering stage */\n budgetFilter: z.boolean().default(true),\n /** Enable ZeroRouter difficulty-based routing */\n zeroRouter: z.boolean().default(true),\n /** Enable preference-trained routing */\n preferenceRouting: z.boolean().default(false),\n /** Enable TOPSIS ranking */\n topsisRanking: z.boolean().default(true),\n /** Enable LinUCB selection */\n linucbSelection: z.boolean().default(true),\n /** Enable latency tracking */\n latencyTracking: z.boolean().default(true),\n /** Enable routing memory for learned routing */\n routingMemory: z.boolean().default(false),\n /** Enable confidence cascade stage (Issue #755, ADR-0005) */\n confidenceCascade: z.boolean().default(false),\n /** Enable capability match stage (Issue #755, ADR-0005) */\n capabilityMatch: z.boolean().default(false),\n /** Enable quality constraint stage (Issue #755, ADR-0005) */\n qualityConstraint: z.boolean().default(false),\n /** Enable resource strategy stage for budget-aware oscillation (Issue #998) */\n resourceStrategy: z.boolean().default(true),\n /** Enable strategy distillation for learned routing rules (Issue #999) */\n strategyDistillation: z.boolean().default(false),\n })\n .optional(),\n\n /**\n * Budget constraints for routing decisions.\n */\n budget: BudgetConstraintsSchema,\n\n /**\n * TOPSIS multi-criteria decision making configuration.\n */\n topsis: TopsisConfigSchema,\n\n /**\n * ZeroRouter difficulty-based routing configuration.\n */\n zeroRouter: ZeroRouterConfigSchema,\n\n /**\n * Latency tracker configuration.\n */\n latencyTracker: LatencyTrackerConfigSchema,\n\n /**\n * Routing memory configuration.\n */\n routingMemory: RoutingMemoryConfigSchema,\n\n /**\n * LinUCB bandit parameters.\n */\n linucb: z\n .object({\n /** Exploration parameter (higher = more exploration) */\n alpha: z.number().positive().default(1.0),\n /** Maximum routing decision time in milliseconds */\n maxDecisionTimeMs: z.number().positive().default(50),\n })\n .optional(),\n\n /**\n * Preference router parameters.\n */\n preference: z\n .object({\n /** Minimum data points before using learned preferences */\n minDataPoints: z.number().int().positive().default(10),\n })\n .optional(),\n\n /**\n * Weight for latency score in final routing (0-1).\n */\n latencyScoreWeight: z.number().min(0).max(1).default(0.2),\n});\n\nexport type RoutingConfig = z.infer<typeof RoutingConfigSchema>;\n\n/**\n * Default routing configuration values.\n * Used when no routing config is provided in nexus-agents.yaml.\n */\nexport const DEFAULT_ROUTING_CONFIG: RoutingConfig = {\n stages: {\n budgetFilter: true,\n zeroRouter: true,\n preferenceRouting: false,\n topsisRanking: true,\n linucbSelection: true,\n latencyTracking: true,\n routingMemory: false,\n // Issue #755: New replacement stages (disabled by default for backward compatibility)\n confidenceCascade: false,\n capabilityMatch: false,\n qualityConstraint: false,\n // Issue #998: Resource strategy (enabled by default)\n resourceStrategy: true,\n // Issue #999: Strategy distillation (opt-in)\n strategyDistillation: false,\n },\n topsis: {\n minQualityThreshold: 5,\n verbose: false,\n },\n zeroRouter: {\n enableCalibration: true,\n maxCalibrationOutcomes: 1000,\n minCalibrationOutcomes: 50,\n verbose: false,\n },\n latencyTracker: {\n windowSize: 100,\n decayFactor: 0.95,\n maxSampleAgeMs: 3600000,\n percentiles: [50, 95, 99],\n },\n routingMemory: {\n minObservations: 5,\n confidenceThreshold: 0.6,\n successRateThreshold: 0.7,\n actionCacheMaxAgeMs: 3600000,\n },\n linucb: {\n alpha: 1.0,\n maxDecisionTimeMs: 50,\n },\n preference: {\n minDataPoints: 10,\n },\n latencyScoreWeight: 0.2,\n};\n","/**\n * Centralized Zod schema for NEXUS_* environment variables (Issue #1016)\n *\n * Validates all known NEXUS_* env vars at startup (warn-only, never blocks).\n * Detects typos via Levenshtein distance and suggests corrections.\n *\n * Does NOT replace per-module parsing (parseIntEnv, resolveV2Config, etc.).\n * This is an additional safety net run once at startup.\n *\n * @module config/env-schema\n */\n\nimport { z } from 'zod';\nimport type { ILogger } from '../core/index.js';\n\n// ============================================================================\n// Helper Zod types for string-encoded values\n// ============================================================================\n\n/** String that parses to a positive integer. */\nconst positiveIntStr = z.string().regex(/^\\d+$/, 'Must be a positive integer string');\n\n/** String \"true\" or \"false\". */\nconst boolStr = z.enum(['true', 'false']);\n\n/** String that parses to a non-negative float. */\nconst floatStr = z.string().regex(/^\\d+(\\.\\d+)?$/, 'Must be a non-negative number string');\n\n// ============================================================================\n// Known NEXUS_* environment variables schema\n// ============================================================================\n\n/**\n * Schema for all known NEXUS_* environment variables.\n * Each field is optional (env vars may not be set).\n * Values are validated as strings matching expected patterns.\n */\nconst NexusEnvSchema = z.object({\n // --- Timeouts ---\n NEXUS_TIMEOUT_CLI: positiveIntStr.optional(),\n NEXUS_TIMEOUT_CLISIMPLE: positiveIntStr.optional(),\n NEXUS_TIMEOUT_CLICOMPLEX: positiveIntStr.optional(),\n NEXUS_TIMEOUT_API: positiveIntStr.optional(),\n NEXUS_TIMEOUT_WORKFLOW: positiveIntStr.optional(),\n NEXUS_TIMEOUT_MCP: positiveIntStr.optional(),\n NEXUS_VOTE_TIMEOUT_MS: positiveIntStr.optional(),\n NEXUS_MCP_TIMEOUT_MS: positiveIntStr.optional(),\n NEXUS_WORKFLOW_TIMEOUT_MS: positiveIntStr.optional(),\n NEXUS_GRAPH_TIMEOUT_MS: positiveIntStr.optional(),\n NEXUS_TEST_TIMEOUT_MS: positiveIntStr.optional(),\n NEXUS_EXPERT_TIMEOUT_MS: positiveIntStr.optional(),\n NEXUS_WORKER_TIMEOUT_MS: positiveIntStr.optional(),\n\n // --- Retry ---\n NEXUS_RETRY_MAX_RETRIES: positiveIntStr.optional(),\n NEXUS_RETRY_BASE_DELAY: positiveIntStr.optional(),\n NEXUS_RETRY_MAX_DELAY: positiveIntStr.optional(),\n NEXUS_RETRY_JITTER: floatStr.optional(),\n\n // --- Rate Limit ---\n NEXUS_RATE_LIMIT_ENABLED: boolStr.optional(),\n NEXUS_RATE_LIMIT_RPM: positiveIntStr.optional(),\n NEXUS_RATE_LIMIT_MAX_CONCURRENT: positiveIntStr.optional(),\n NEXUS_RATE_LIMIT_CAPACITY: positiveIntStr.optional(),\n NEXUS_RATE_LIMIT_REFILL_RATE: positiveIntStr.optional(),\n NEXUS_RATE_LIMIT_REFILL_INTERVAL: positiveIntStr.optional(),\n\n // --- Workers & Concurrency ---\n NEXUS_MAX_CONCURRENT_EXPERTS: positiveIntStr.optional(),\n NEXUS_WORKERS_MAX: positiveIntStr.optional(),\n NEXUS_WORKERS_POOL_SIZE: positiveIntStr.optional(),\n NEXUS_WORKERS_IDLE_TIMEOUT: positiveIntStr.optional(),\n NEXUS_WORKFLOW_MAX_PARALLEL: positiveIntStr.optional(),\n NEXUS_TEST_PARALLELISM: positiveIntStr.optional(),\n NEXUS_EVALUATION_MAX_WORKERS: positiveIntStr.optional(),\n NEXUS_SWARM_OBSERVER_MAX_EVENTS: positiveIntStr.optional(),\n\n // --- Circuit Breaker ---\n NEXUS_CIRCUIT_BREAKER_THRESHOLD: positiveIntStr.optional(),\n NEXUS_CIRCUIT_BREAKER_RESET_TIMEOUT: positiveIntStr.optional(),\n\n // --- V2 Pipeline ---\n NEXUS_V2_MODE: z.enum(['off', 'partial', 'full']).optional(),\n NEXUS_V2_DELEGATE: boolStr.optional(),\n NEXUS_V2_ORCHESTRATE: boolStr.optional(),\n NEXUS_V2_POLICY_MODE: z.enum(['off', 'warn', 'block']).optional(),\n NEXUS_AORCHESTRA: boolStr.optional(),\n NEXUS_AORCHESTRA_DISPATCH: boolStr.optional(),\n NEXUS_WORKER_MAX_CALLS: positiveIntStr.optional(),\n\n // --- Server ---\n NEXUS_AUTH_ENABLED: boolStr.optional(),\n NEXUS_AUTH_METHOD: z.string().optional(),\n\n // --- Logging ---\n NEXUS_LOG_LEVEL: z\n .enum(['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'silent'])\n .optional(),\n\n // --- Features ---\n NEXUS_PERSIST_LEARNING: boolStr.optional(),\n NEXUS_REFLECTIVE_MEMORY: z.enum(['true', 'false', 'shadow']).optional(),\n NEXUS_EVENTBUS_ENABLED: boolStr.optional(),\n NEXUS_EVENTBUS_MAX_HISTORY: positiveIntStr.optional(),\n NEXUS_BILLING_MODE: z.enum(['plan', 'api']).optional(),\n NEXUS_CONFIG_PATH: z.string().optional(),\n NEXUS_ALLOW_MOCK_ORCHESTRATION: boolStr.optional(),\n\n // --- Hooks & Sessions ---\n NEXUS_HOOK_VERBOSE: boolStr.optional(),\n NEXUS_SESSIONS_DB: z.string().optional(),\n NEXUS_DISABLE_SESSIONS: boolStr.optional(),\n NEXUS_DISABLE_METRICS: boolStr.optional(),\n});\n\n// ============================================================================\n// Known variable names (derived from schema)\n// ============================================================================\n\nconst KNOWN_NAMES: readonly string[] = Object.keys(NexusEnvSchema.shape);\n\n// ============================================================================\n// Levenshtein distance\n// ============================================================================\n\n/** Safe array accessor — indices are always in-bounds by construction. */\nfunction at(arr: number[], i: number): number {\n return arr[i] ?? 0;\n}\n\n/** Standard Levenshtein edit distance between two strings. */\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n\n let prev = Array.from({ length: n + 1 }, (_, j) => j);\n let curr = new Array<number>(n + 1).fill(0);\n\n for (let i = 1; i <= m; i++) {\n curr[0] = i;\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n curr[j] = Math.min(at(prev, j) + 1, at(curr, j - 1) + 1, at(prev, j - 1) + cost);\n }\n [prev, curr] = [curr, prev];\n }\n\n return at(prev, n);\n}\n\n/** Returns the closest known var name if edit distance <= 3, or null. */\nfunction suggestSimilar(name: string, known: readonly string[]): string | null {\n let best: string | null = null;\n let bestDist = 4; // threshold: must be strictly less than 4\n\n for (const candidate of known) {\n const dist = levenshtein(name, candidate);\n if (dist < bestDist) {\n bestDist = dist;\n best = candidate;\n }\n }\n\n return best;\n}\n\n// ============================================================================\n// Validation result types\n// ============================================================================\n\n/** An unknown NEXUS_* env var with optional typo suggestion. */\nexport interface UnknownVar {\n readonly name: string;\n readonly suggestion: string | null;\n}\n\n/** An invalid NEXUS_* env var with error message. */\nexport interface InvalidVar {\n readonly name: string;\n readonly value: string;\n readonly error: string;\n}\n\n/** Result of validating NEXUS_* environment variables. */\nexport interface EnvValidationResult {\n readonly unknownVars: readonly UnknownVar[];\n readonly invalidVars: readonly InvalidVar[];\n}\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\n/** Classifies NEXUS_* keys into known (with values) and unknown. */\nfunction classifyEnvKeys(\n nexusKeys: readonly string[],\n env: NodeJS.ProcessEnv\n): { knownRecord: Record<string, string>; unknownVars: UnknownVar[] } {\n const knownRecord: Record<string, string> = {};\n const unknownVars: UnknownVar[] = [];\n\n for (const key of nexusKeys) {\n if (KNOWN_NAMES.includes(key)) {\n const value = env[key];\n if (value !== undefined) {\n knownRecord[key] = value;\n }\n } else {\n unknownVars.push({\n name: key,\n suggestion: suggestSimilar(key, KNOWN_NAMES),\n });\n }\n }\n\n return { knownRecord, unknownVars };\n}\n\n/** Logs validation warnings via the provided logger. */\nfunction logValidationWarnings(\n logger: ILogger,\n unknownVars: readonly UnknownVar[],\n invalidVars: readonly InvalidVar[]\n): void {\n for (const u of unknownVars) {\n const hint = u.suggestion !== null ? ` (did you mean ${u.suggestion}?)` : '';\n logger.warn(`Unknown environment variable: ${u.name}${hint}`);\n }\n for (const inv of invalidVars) {\n logger.warn(`Invalid environment variable ${inv.name}=\"${inv.value}\": ${inv.error}`);\n }\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Validates all NEXUS_* environment variables.\n *\n * - Detects unknown vars (potential typos) with Levenshtein suggestions\n * - Detects invalid values for known vars\n * - Warn-only: never throws, never blocks startup\n *\n * @param logger - Optional logger for direct warning output\n * @returns Validation result with unknown and invalid var lists\n */\nexport function validateNexusEnv(logger?: ILogger): EnvValidationResult {\n const nexusKeys = Object.keys(process.env).filter((k) => k.startsWith('NEXUS_'));\n const { knownRecord, unknownVars } = classifyEnvKeys(nexusKeys, process.env);\n\n // Validate known vars against the schema\n const invalidVars: InvalidVar[] = [];\n const result = NexusEnvSchema.safeParse(knownRecord);\n if (!result.success) {\n for (const issue of result.error.issues) {\n const varName = String(issue.path[0]);\n invalidVars.push({\n name: varName,\n value: knownRecord[varName] ?? '',\n error: issue.message,\n });\n }\n }\n\n if (logger !== undefined) {\n logValidationWarnings(logger, unknownVars, invalidVars);\n }\n\n return { unknownVars, invalidVars };\n}\n\n/**\n * Returns all known NEXUS_* variable names from the schema.\n */\nexport function getKnownNexusVarNames(): readonly string[] {\n return KNOWN_NAMES;\n}\n","/**\n * nexus-agents/config - Model Availability Probes & Fallback Chains\n *\n * Runtime availability tracking for model APIs. Maintains a bounded\n * TTL cache of probe results and provides fallback chain resolution\n * when a model is unavailable.\n *\n * @module config/model-availability\n * (Source: Issue #869)\n */\n\nimport { getTimeProvider } from '../core/index.js';\nimport type { ModelId, CliNameLiteral } from './model-capabilities-types.js';\nimport { DEFAULT_MODEL_PER_CLI } from './in-tree-data.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Status of a model probe. */\nexport interface ProbeResult {\n readonly modelId: ModelId;\n readonly available: boolean;\n readonly latencyMs: number;\n readonly checkedAt: number;\n readonly error?: string;\n}\n\n/** Configuration for the availability cache. */\nexport interface AvailabilityCacheConfig {\n /** Time-to-live in ms for probe results. Default: 60_000 (1 min). */\n readonly ttlMs?: number;\n /** Maximum entries in the cache. Default: 50. */\n readonly maxEntries?: number;\n}\n\n/** A function that probes whether a model is reachable. */\nexport type ProbeFn = (modelId: ModelId) => Promise<ProbeResult>;\n\n/** Fallback chain entry with model and reason for fallback. */\nexport interface FallbackEntry {\n readonly modelId: ModelId;\n readonly reason: string;\n}\n\n// ---------------------------------------------------------------------------\n// Availability Cache\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_TTL_MS = 60_000;\nconst DEFAULT_MAX_ENTRIES = 50;\n\n/**\n * Bounded TTL cache for model availability probe results.\n * Thread-safe for single-threaded Node.js; no locks needed.\n */\nexport class AvailabilityCache {\n private readonly cache = new Map<ModelId, ProbeResult>();\n private readonly ttlMs: number;\n private readonly maxEntries: number;\n\n constructor(config: AvailabilityCacheConfig = {}) {\n this.ttlMs = config.ttlMs ?? DEFAULT_TTL_MS;\n this.maxEntries = config.maxEntries ?? DEFAULT_MAX_ENTRIES;\n }\n\n /** Get a cached probe result, or undefined if expired/missing. */\n get(modelId: ModelId): ProbeResult | undefined {\n const entry = this.cache.get(modelId);\n if (entry === undefined) return undefined;\n if (getTimeProvider().now() - entry.checkedAt > this.ttlMs) {\n this.cache.delete(modelId);\n return undefined;\n }\n return entry;\n }\n\n /** Store a probe result, evicting oldest if at capacity. */\n set(result: ProbeResult): void {\n if (this.cache.size >= this.maxEntries && !this.cache.has(result.modelId)) {\n const oldest = this.cache.keys().next();\n if (oldest.done !== true) {\n this.cache.delete(oldest.value);\n }\n }\n this.cache.set(result.modelId, result);\n }\n\n /** Mark a model as unavailable without a full probe. */\n markUnavailable(modelId: ModelId, error: string): void {\n this.set({\n modelId,\n available: false,\n latencyMs: 0,\n checkedAt: getTimeProvider().now(),\n error,\n });\n }\n\n /** Mark a model as available. */\n markAvailable(modelId: ModelId, latencyMs: number): void {\n this.set({\n modelId,\n available: true,\n latencyMs,\n checkedAt: getTimeProvider().now(),\n });\n }\n\n /** Check if a model is known-unavailable (cached and not expired). */\n isKnownUnavailable(modelId: ModelId): boolean {\n const entry = this.get(modelId);\n return entry !== undefined && !entry.available;\n }\n\n /** Get all cached entries (for diagnostics). */\n entries(): ReadonlyArray<ProbeResult> {\n return [...this.cache.values()];\n }\n\n /** Number of cached entries. */\n get size(): number {\n return this.cache.size;\n }\n\n /** Clear all cached entries. */\n clear(): void {\n this.cache.clear();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Fallback Chain Resolution\n// ---------------------------------------------------------------------------\n\n/** Default fallback order per CLI (strongest → weakest). */\nconst FALLBACK_CHAINS: Readonly<Record<CliNameLiteral, readonly ModelId[]>> = {\n claude: ['claude-opus', 'claude-sonnet', 'claude-haiku'],\n gemini: ['gemini-3-pro', 'gemini-pro', 'gemini-3-flash', 'gemini-flash'],\n codex: ['codex-5.3', 'codex-5.2', 'codex-5.1-mini'],\n opencode: ['opencode-custom-opus', 'opencode-custom-sonnet', 'opencode-default'],\n};\n\n/**\n * Resolves a fallback chain for a given model.\n * Returns the first available model in the chain, skipping known-unavailable ones.\n */\nexport function resolveFallback(modelId: ModelId, cache: AvailabilityCache): FallbackEntry | null {\n const cli = getCliForModelId(modelId);\n if (cli === undefined) return null;\n\n const chain = FALLBACK_CHAINS[cli];\n for (const candidate of chain) {\n if (candidate === modelId) continue;\n if (!cache.isKnownUnavailable(candidate)) {\n return {\n modelId: candidate,\n reason: `Fallback from ${modelId} (unavailable) to ${candidate}`,\n };\n }\n }\n return null;\n}\n\n/**\n * Get the fallback chain for a CLI tool.\n */\nexport function getFallbackChain(cli: CliNameLiteral): readonly ModelId[] {\n return FALLBACK_CHAINS[cli];\n}\n\n/**\n * Get the CLI name for a model ID.\n */\nexport function getCliForModelId(modelId: ModelId): CliNameLiteral | undefined {\n for (const [cli, defaultModel] of Object.entries(DEFAULT_MODEL_PER_CLI)) {\n const chain = FALLBACK_CHAINS[cli as CliNameLiteral];\n if (chain.includes(modelId)) return cli as CliNameLiteral;\n if (defaultModel === modelId) return cli as CliNameLiteral;\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Singleton Cache (shared across the process)\n// ---------------------------------------------------------------------------\n\nlet globalCache: AvailabilityCache | undefined;\n\n/** Get the shared availability cache (lazy-init). */\nexport function getAvailabilityCache(): AvailabilityCache {\n globalCache ??= new AvailabilityCache();\n return globalCache;\n}\n\n/** Reset the global cache (for testing). */\nexport function resetAvailabilityCache(): void {\n globalCache = undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Filter Integration\n// ---------------------------------------------------------------------------\n\n/**\n * Filters out known-unavailable models from a set of model IDs.\n * Returns the filtered set, or null if no models were removed.\n * Used by scoreAllModels() to skip unavailable models.\n */\nexport function filterAvailableModels(\n modelIds: readonly string[],\n cache: AvailabilityCache\n): { available: string[]; removed: string[] } {\n const available: string[] = [];\n const removed: string[] = [];\n for (const id of modelIds) {\n if (cache.isKnownUnavailable(id as ModelId)) {\n removed.push(id);\n } else {\n available.push(id);\n }\n }\n return { available, removed };\n}\n","/**\n * nexus-agents/config - Routing Config Adapter\n *\n * Converts RoutingConfig from YAML schema to CompositeRouterConfigWithPreference\n * that the runtime routing system expects.\n *\n * @module config/routing-config-adapter\n * (Source: Issue #475 - Add routing configuration section to nexus-agents.yaml)\n */\n\nimport type {\n CompositeRouterConfig,\n CompositeRouterConfigWithPreference,\n} from '../cli-adapters/composite-router-types.js';\nimport { DEFAULT_COMPOSITE_CONFIG } from '../cli-adapters/composite-router-types.js';\nimport type { TopsisConfig as RuntimeTopsisConfig } from '../cli-adapters/topsis-types.js';\nimport { DEFAULT_TOPSIS_CONFIG, DEFAULT_TOPSIS_CRITERIA } from '../cli-adapters/topsis-types.js';\nimport type { ZeroRouterConfig as RuntimeZeroRouterConfig } from '../cli-adapters/zero-router-types.js';\nimport { DEFAULT_ZERO_ROUTER_CONFIG } from '../cli-adapters/zero-router-types.js';\nimport type { LatencyTrackerConfig as RuntimeLatencyConfig } from '../cli-adapters/latency-tracker-types.js';\nimport type { RoutingMemoryConfig as RuntimeMemoryConfig } from '../context/routing-memory.js';\nimport type {\n RoutingConfig,\n TopsisConfig as YamlTopsisConfig,\n ZeroRouterConfig as YamlZeroRouterConfig,\n LatencyTrackerConfig as YamlLatencyTrackerConfig,\n RoutingMemoryConfig as YamlRoutingMemoryConfig,\n} from './schemas-routing.js';\nimport { isPersistenceEnabled } from './learning-persistence.js';\n\n/** Non-nullable routing config for internal use. */\ntype DefinedRoutingConfig = NonNullable<RoutingConfig>;\n\n/** Default routing config with proper typing.\n * Note: `stages` is intentionally omitted so that persistence-aware flags\n * (routingMemory, strategyDistillation, preferenceRouting) resolve dynamically\n * via `resolveStageFlags()` instead of being hardcoded to false. (#1353)\n */\nconst ADAPTER_DEFAULTS: DefinedRoutingConfig = {\n latencyScoreWeight: 0.2,\n};\n\n/**\n * Converts YAML TopsisConfig to runtime TopsisConfig.\n */\nfunction adaptTopsisConfig(yaml: YamlTopsisConfig | undefined): Partial<RuntimeTopsisConfig> {\n if (yaml === undefined) return {};\n\n const result: Partial<RuntimeTopsisConfig> = {\n criteria: yaml.criteria ?? DEFAULT_TOPSIS_CRITERIA,\n minQualityThreshold: yaml.minQualityThreshold,\n verbose: yaml.verbose,\n };\n\n if (yaml.maxLatencyMs !== undefined) {\n (result as { maxLatencyMs?: number }).maxLatencyMs = yaml.maxLatencyMs;\n }\n if (yaml.maxCostPerRequest !== undefined) {\n (result as { maxCostPerRequest?: number }).maxCostPerRequest = yaml.maxCostPerRequest;\n }\n\n return result;\n}\n\n/**\n * Converts YAML ZeroRouterConfig to runtime ZeroRouterConfig.\n */\nfunction adaptZeroRouterConfig(\n yaml: YamlZeroRouterConfig | undefined\n): Partial<RuntimeZeroRouterConfig> {\n if (yaml === undefined) return {};\n\n return {\n thresholds: yaml.thresholds ?? DEFAULT_ZERO_ROUTER_CONFIG.thresholds,\n weights: yaml.weights ?? DEFAULT_ZERO_ROUTER_CONFIG.weights,\n difficultyToTier: yaml.difficultyToTier ?? DEFAULT_ZERO_ROUTER_CONFIG.difficultyToTier,\n tierToClis: yaml.tierToClis ?? DEFAULT_ZERO_ROUTER_CONFIG.tierToClis,\n enableCalibration: yaml.enableCalibration,\n maxCalibrationOutcomes: yaml.maxCalibrationOutcomes,\n minCalibrationOutcomes: yaml.minCalibrationOutcomes,\n verbose: yaml.verbose,\n };\n}\n\n/**\n * Converts YAML LatencyTrackerConfig to runtime LatencyTrackerConfig.\n */\nfunction adaptLatencyTrackerConfig(\n yaml: YamlLatencyTrackerConfig | undefined\n): Partial<RuntimeLatencyConfig> {\n if (yaml === undefined) return {};\n\n return {\n windowSize: yaml.windowSize,\n decayFactor: yaml.decayFactor,\n maxSampleAgeMs: yaml.maxSampleAgeMs,\n percentiles: yaml.percentiles,\n };\n}\n\n/**\n * Converts YAML RoutingMemoryConfig to runtime RoutingMemoryConfig.\n */\nfunction adaptRoutingMemoryConfig(\n yaml: YamlRoutingMemoryConfig | undefined\n): Partial<RuntimeMemoryConfig> {\n if (yaml === undefined) return {};\n\n return {\n minObservations: yaml.minObservations,\n confidenceThreshold: yaml.confidenceThreshold,\n successRateThreshold: yaml.successRateThreshold,\n actionCacheMaxAgeMs: yaml.actionCacheMaxAgeMs,\n };\n}\n\n/**\n * Converts YAML stages config to CompositeRouterConfig flags.\n */\nfunction adaptStagesConfig(\n yaml: DefinedRoutingConfig['stages'] | undefined\n): Partial<CompositeRouterConfig> {\n if (yaml === undefined) return {};\n\n return {\n enableBudgetFilter: yaml.budgetFilter,\n enableZeroRouter: yaml.zeroRouter,\n enablePreferenceRouting: yaml.preferenceRouting,\n enableTopsisRanking: yaml.topsisRanking,\n enableLinUCBSelection: yaml.linucbSelection,\n enableLatencyTracking: yaml.latencyTracking,\n enableRoutingMemory: yaml.routingMemory,\n // Issue #755: New replacement stages\n enableConfidenceCascade: yaml.confidenceCascade,\n enableCapabilityMatch: yaml.capabilityMatch,\n enableQualityConstraint: yaml.qualityConstraint,\n // Issue #998: Resource strategy\n enableResourceStrategy: yaml.resourceStrategy,\n // Issue #999: Strategy distillation\n enableStrategyDistillation: yaml.strategyDistillation,\n };\n}\n\n/** Stage flag keys that need to be resolved with defaults. */\nconst STAGE_FLAG_KEYS = [\n 'enableBudgetFilter',\n 'enableZeroRouter',\n 'enablePreferenceRouting',\n 'enableTopsisRanking',\n 'enableLinUCBSelection',\n 'enableLatencyTracking',\n 'enableRoutingMemory',\n 'enableConfidenceCascade',\n 'enableCapabilityMatch',\n 'enableQualityConstraint',\n 'enableResourceStrategy',\n 'enableStrategyDistillation',\n 'enableKnnRouting',\n 'enableCapacityBalancing',\n] as const;\n\ntype StageFlagKey = (typeof STAGE_FLAG_KEYS)[number];\ntype StageFlagsResult = Pick<CompositeRouterConfig, StageFlagKey>;\n\n/**\n * Stage flags that default to `true` when learning persistence is enabled.\n * These features consume data already recorded by OutcomeStore and add\n * no new data collection surface. (#1347, #1353)\n */\nconst PERSISTENCE_AWARE_FLAGS: ReadonlySet<StageFlagKey> = new Set([\n 'enableRoutingMemory',\n 'enableStrategyDistillation',\n 'enablePreferenceRouting',\n]);\n\n/**\n * Resolves stage flags with defaults using a data-driven approach.\n * routingMemory and strategyDistillation default to true when persistence is on.\n */\nfunction resolveStageFlags(stagesConfig: Partial<CompositeRouterConfig>): StageFlagsResult {\n const persistenceOn = isPersistenceEnabled();\n const result = {} as StageFlagsResult;\n for (const key of STAGE_FLAG_KEYS) {\n const explicit = stagesConfig[key];\n if (explicit !== undefined) {\n result[key] = explicit;\n } else if (PERSISTENCE_AWARE_FLAGS.has(key) && persistenceOn) {\n result[key] = true;\n } else {\n result[key] = DEFAULT_COMPOSITE_CONFIG[key];\n }\n }\n return result;\n}\n\n/**\n * Builds the base CompositeRouterConfig from YAML config and defaults.\n */\nfunction buildBaseConfig(\n config: DefinedRoutingConfig,\n stagesConfig: Partial<CompositeRouterConfig>\n): CompositeRouterConfig {\n const stageFlags = resolveStageFlags(stagesConfig);\n\n return {\n ...stageFlags,\n billingMode: DEFAULT_COMPOSITE_CONFIG.billingMode,\n latencyScoreWeight: config.latencyScoreWeight,\n budgetConstraints: config.budget,\n linucbAlpha: config.linucb?.alpha ?? DEFAULT_COMPOSITE_CONFIG.linucbAlpha,\n maxDecisionTimeMs:\n config.linucb?.maxDecisionTimeMs ?? DEFAULT_COMPOSITE_CONFIG.maxDecisionTimeMs,\n preferenceMinDataPoints:\n config.preference?.minDataPoints ?? DEFAULT_COMPOSITE_CONFIG.preferenceMinDataPoints,\n };\n}\n\n/**\n * Converts RoutingConfig from YAML schema to CompositeRouterConfigWithPreference.\n *\n * @param yamlConfig - Routing config from nexus-agents.yaml\n * @returns Runtime config for CompositeRouter\n */\nexport function adaptRoutingConfig(\n yamlConfig?: RoutingConfig\n): CompositeRouterConfigWithPreference {\n const config: DefinedRoutingConfig = yamlConfig ?? ADAPTER_DEFAULTS;\n const stagesConfig = adaptStagesConfig(config.stages);\n const baseConfig = buildBaseConfig(config, stagesConfig);\n\n return {\n ...baseConfig,\n zeroRouterConfig: adaptZeroRouterConfig(config.zeroRouter),\n latencyTrackerConfig: adaptLatencyTrackerConfig(config.latencyTracker),\n routingMemoryConfig: adaptRoutingMemoryConfig(config.routingMemory),\n };\n}\n\n/**\n * Gets TOPSIS config from YAML routing config.\n * Useful when TOPSIS is used independently of CompositeRouter.\n *\n * @param yamlConfig - Routing config from nexus-agents.yaml\n * @returns Runtime TOPSIS config\n */\nexport function getTopsisConfigFromYaml(yamlConfig?: RoutingConfig): RuntimeTopsisConfig {\n const config: DefinedRoutingConfig = yamlConfig ?? ADAPTER_DEFAULTS;\n const adapted = adaptTopsisConfig(config.topsis);\n\n const result: RuntimeTopsisConfig = {\n criteria: adapted.criteria ?? DEFAULT_TOPSIS_CONFIG.criteria,\n minQualityThreshold: adapted.minQualityThreshold ?? DEFAULT_TOPSIS_CONFIG.minQualityThreshold,\n verbose: adapted.verbose ?? DEFAULT_TOPSIS_CONFIG.verbose,\n };\n\n if (adapted.maxLatencyMs !== undefined) {\n (result as { maxLatencyMs?: number }).maxLatencyMs = adapted.maxLatencyMs;\n }\n if (adapted.maxCostPerRequest !== undefined) {\n (result as { maxCostPerRequest?: number }).maxCostPerRequest = adapted.maxCostPerRequest;\n }\n\n return result;\n}\n","/**\n * ConfigManager - Runtime Configuration Management (Issue #360 Phase 1)\n *\n * Precedence (highest to lowest):\n * 1. CLI overrides 2. Session overrides 3. Environment variables 4. Package defaults\n *\n * @module config/config-manager\n */\n\nimport { z } from 'zod';\nimport { getTimeProvider } from '../core/index.js';\nimport { DEFAULTS } from './defaults.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Configuration source indicating where a value originated. */\nexport type ConfigSource = 'package' | 'env' | 'user_file' | 'session' | 'cli';\n\n/** Metadata about a configuration value. */\nexport interface ConfigValueMeta<T> {\n readonly value: T;\n readonly source: ConfigSource;\n readonly key: string;\n readonly isOverride: boolean;\n readonly defaultValue: T;\n}\n\n/** An active override entry. */\nexport interface ConfigOverride<T = unknown> {\n readonly value: T;\n readonly source: ConfigSource;\n readonly setAt: Date;\n}\n\n/** Configuration categories matching DEFAULTS structure. */\nexport type ConfigCategory = keyof typeof DEFAULTS;\n\n/** Keys for a specific category. */\nexport type ConfigKey<C extends ConfigCategory> = keyof (typeof DEFAULTS)[C];\n\n/** Widens literal types: 60000 -> number, true -> boolean, 'foo' -> string */\ntype Widen<T> = T extends number\n ? number\n : T extends boolean\n ? boolean\n : T extends string\n ? string\n : T;\n\n/** Value type for category/key (widened for assignment). */\nexport type ConfigValue<C extends ConfigCategory, K extends ConfigKey<C>> = Widen<\n (typeof DEFAULTS)[C][K]\n>;\n\n// ============================================================================\n// Validation\n// ============================================================================\n\nconst NumericValueSchema = z.number();\nconst BooleanValueSchema = z.boolean();\nconst StringValueSchema = z.string();\n\nfunction validateValue<T>(value: unknown, expectedType: T): value is T {\n if (typeof expectedType === 'number') return NumericValueSchema.safeParse(value).success;\n if (typeof expectedType === 'boolean') return BooleanValueSchema.safeParse(value).success;\n if (typeof expectedType === 'string') return StringValueSchema.safeParse(value).success;\n return false;\n}\n\n// ============================================================================\n// Environment Variable Mapping\n// ============================================================================\n\n/** Maps category.key to NEXUS_* environment variable names. */\nconst ENV_VAR_MAP: Partial<Record<string, string>> = {\n 'TIMEOUT_DEFAULTS.cliMs': 'NEXUS_TIMEOUT_CLI',\n 'TIMEOUT_DEFAULTS.apiMs': 'NEXUS_TIMEOUT_API',\n 'TIMEOUT_DEFAULTS.workflowMs': 'NEXUS_TIMEOUT_WORKFLOW',\n 'TIMEOUT_DEFAULTS.mcpMs': 'NEXUS_TIMEOUT_MCP',\n 'RATE_LIMIT_DEFAULTS.requestsPerMinute': 'NEXUS_RATE_LIMIT_RPM',\n 'RATE_LIMIT_DEFAULTS.enabled': 'NEXUS_RATE_LIMIT_ENABLED',\n 'RATE_LIMIT_DEFAULTS.maxConcurrent': 'NEXUS_RATE_LIMIT_MAX_CONCURRENT',\n 'RATE_LIMIT_DEFAULTS.capacity': 'NEXUS_RATE_LIMIT_CAPACITY',\n 'RATE_LIMIT_DEFAULTS.refillRate': 'NEXUS_RATE_LIMIT_REFILL_RATE',\n 'RATE_LIMIT_DEFAULTS.refillIntervalMs': 'NEXUS_RATE_LIMIT_REFILL_INTERVAL',\n 'RETRY_DEFAULTS.maxRetries': 'NEXUS_RETRY_MAX_RETRIES',\n 'RETRY_DEFAULTS.baseDelayMs': 'NEXUS_RETRY_BASE_DELAY',\n 'RETRY_DEFAULTS.maxDelayMs': 'NEXUS_RETRY_MAX_DELAY',\n 'RETRY_DEFAULTS.jitterFactor': 'NEXUS_RETRY_JITTER',\n 'WORKER_DEFAULTS.maxWorkers': 'NEXUS_WORKERS_MAX',\n 'WORKER_DEFAULTS.poolSize': 'NEXUS_WORKERS_POOL_SIZE',\n 'WORKER_DEFAULTS.idleTimeoutMs': 'NEXUS_WORKERS_IDLE_TIMEOUT',\n 'WORKER_DEFAULTS.workflowMaxParallel': 'NEXUS_WORKFLOW_MAX_PARALLEL',\n 'WORKER_DEFAULTS.testParallelism': 'NEXUS_TEST_PARALLELISM',\n 'WORKER_DEFAULTS.evaluationMaxWorkers': 'NEXUS_EVALUATION_MAX_WORKERS',\n 'WORKER_DEFAULTS.eventBusMaxHistory': 'NEXUS_EVENTBUS_MAX_HISTORY',\n 'WORKER_DEFAULTS.swarmObserverMaxEvents': 'NEXUS_SWARM_OBSERVER_MAX_EVENTS',\n 'CIRCUIT_BREAKER_DEFAULTS.failureThreshold': 'NEXUS_CIRCUIT_BREAKER_THRESHOLD',\n 'CIRCUIT_BREAKER_DEFAULTS.resetTimeoutMs': 'NEXUS_CIRCUIT_BREAKER_RESET_TIMEOUT',\n};\n\nfunction parseEnvValue<T>(envValue: string, defaultValue: T): T | undefined {\n if (typeof defaultValue === 'number') {\n const parsed = Number(envValue);\n return !isNaN(parsed) && isFinite(parsed) ? (parsed as T) : undefined;\n }\n if (typeof defaultValue === 'boolean') {\n const lower = envValue.toLowerCase();\n if (lower === 'true' || lower === '1') return true as T;\n if (lower === 'false' || lower === '0') return false as T;\n return undefined; // Unknown value — use default\n }\n if (typeof defaultValue === 'string') return envValue as T;\n return undefined;\n}\n\n// ============================================================================\n// ConfigManager Class\n// ============================================================================\n\n/**\n * Singleton ConfigManager for runtime configuration management.\n *\n * @example\n * const config = ConfigManager.getInstance();\n * const timeout = config.get('TIMEOUT_DEFAULTS', 'cliMs');\n * config.setOverride('TIMEOUT_DEFAULTS', 'cliMs', 90000, 'session');\n */\nexport class ConfigManager {\n private static instance: ConfigManager | null = null;\n private readonly overrides: Map<string, ConfigOverride> = new Map();\n\n private constructor() {}\n\n /** Gets the singleton instance. */\n static getInstance(): ConfigManager {\n ConfigManager.instance ??= new ConfigManager();\n return ConfigManager.instance;\n }\n\n /** Resets the singleton instance (for testing). */\n static resetInstance(): void {\n ConfigManager.instance = null;\n }\n\n /** Gets the effective value for a configuration key. */\n get<C extends ConfigCategory, K extends ConfigKey<C>>(category: C, key: K): ConfigValue<C, K> {\n return this.getWithMeta(category, key).value;\n }\n\n /** Gets the effective value with source metadata. */\n getWithMeta<C extends ConfigCategory, K extends ConfigKey<C>>(\n category: C,\n key: K\n ): ConfigValueMeta<ConfigValue<C, K>> {\n const fullKey = `${category}.${String(key)}`;\n const defaultValue = DEFAULTS[category][key] as ConfigValue<C, K>;\n\n // Check overrides (CLI > session)\n const override = this.overrides.get(fullKey);\n if (override) {\n return {\n value: override.value as ConfigValue<C, K>,\n source: override.source,\n key: fullKey,\n isOverride: true,\n defaultValue,\n };\n }\n\n // Check environment variable\n const envVar = ENV_VAR_MAP[fullKey];\n if (envVar !== undefined && envVar.length > 0) {\n const envValue = process.env[envVar];\n if (envValue !== undefined) {\n const parsed = parseEnvValue(envValue, defaultValue);\n if (parsed !== undefined) {\n return { value: parsed, source: 'env', key: fullKey, isOverride: true, defaultValue };\n }\n }\n }\n\n return {\n value: defaultValue,\n source: 'package',\n key: fullKey,\n isOverride: false,\n defaultValue,\n };\n }\n\n /**\n * Sets an override for a configuration key.\n * @throws {Error} If value fails type validation\n */\n setOverride<C extends ConfigCategory, K extends ConfigKey<C>>(\n category: C,\n key: K,\n value: ConfigValue<C, K>,\n source: ConfigSource\n ): void {\n const fullKey = `${category}.${String(key)}`;\n const defaultValue = DEFAULTS[category][key];\n\n if (!validateValue(value, defaultValue)) {\n throw new Error(\n `Invalid value type for ${fullKey}: expected ${typeof defaultValue}, got ${typeof value}`\n );\n }\n\n this.overrides.set(fullKey, { value, source, setAt: new Date(getTimeProvider().now()) });\n }\n\n /** Clears an override. Returns true if it existed. */\n clearOverride<C extends ConfigCategory>(category: C, key: ConfigKey<C>): boolean {\n return this.overrides.delete(`${category}.${String(key)}`);\n }\n\n /** Clears all overrides. */\n clearAllOverrides(): void {\n this.overrides.clear();\n }\n\n /** Lists all active overrides. */\n listOverrides(): ReadonlyArray<{\n key: string;\n value: unknown;\n source: ConfigSource;\n setAt: Date;\n }> {\n return Array.from(this.overrides.entries()).map(([key, override]) => ({\n key,\n value: override.value,\n source: override.source,\n setAt: override.setAt,\n }));\n }\n\n /** Lists all configuration keys with their effective values. */\n listAll(categoryFilter?: ConfigCategory): ReadonlyArray<{\n category: string;\n key: string;\n value: unknown;\n source: ConfigSource;\n envVar: string | undefined;\n }> {\n const categories = categoryFilter\n ? [categoryFilter]\n : (Object.keys(DEFAULTS) as ConfigCategory[]);\n const result: Array<{\n category: string;\n key: string;\n value: unknown;\n source: ConfigSource;\n envVar: string | undefined;\n }> = [];\n\n for (const category of categories) {\n for (const key of Object.keys(DEFAULTS[category])) {\n const fullKey = `${category}.${key}`;\n const meta = this.getWithMeta(category, key as ConfigKey<typeof category>);\n result.push({\n category,\n key,\n value: meta.value,\n source: meta.source,\n envVar: ENV_VAR_MAP[fullKey],\n });\n }\n }\n return result;\n }\n\n /** Gets the environment variable name for a config key. */\n getEnvVarName<C extends ConfigCategory>(category: C, key: ConfigKey<C>): string | undefined {\n return ENV_VAR_MAP[`${category}.${String(key)}`];\n }\n\n /** Checks if a key has an active override. */\n hasOverride<C extends ConfigCategory>(category: C, key: ConfigKey<C>): boolean {\n return this.overrides.has(`${category}.${String(key)}`);\n }\n}\n\n/** Gets the ConfigManager singleton instance. */\nexport function getConfigManager(): ConfigManager {\n return ConfigManager.getInstance();\n}\n","/**\n * nexus-agents/config - Config File Loader\n *\n * Loads and validates nexus-agents.yaml using AppConfigSchema.\n * This module provides the missing link between the config file and runtime.\n *\n * @module config/config-loader\n * (Source: Issue #472 - Wire AppConfigSchema to runtime)\n */\n\nimport { readFileSync, existsSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { resolveInsideRoot } from '../security/safe-path.js';\nimport { getNexusDataDir } from './nexus-data-dir.js';\nimport * as yaml from 'yaml';\nimport { AppConfigSchema, type AppConfig, defaultConfig } from './schemas.js';\nimport type { Result } from '../core/index.js';\nimport { ok, err, formatZodIssuesAsArray } from '../core/index.js';\nimport type { ILogger } from '../core/index.js';\nimport { createLogger } from '../core/logger.js';\n\n/**\n * Default config file name.\n */\nconst DEFAULT_CONFIG_FILE = 'nexus-agents.yaml';\n\n/**\n * Alternate config file name.\n */\nconst ALTERNATE_CONFIG_FILE = 'nexus-agents.yml';\n\n/**\n * Result of loading configuration.\n */\nexport interface ConfigLoadResult {\n /** The validated configuration */\n config: AppConfig;\n /** Path to config file (if loaded from file) */\n configPath?: string;\n /** Whether defaults were used */\n usingDefaults: boolean;\n /** Validation warnings (partial config merged with defaults) */\n warnings: string[];\n}\n\n/**\n * Error when config loading fails.\n */\nexport class ConfigLoadError extends Error {\n public readonly code: ConfigLoadErrorCode;\n\n constructor(message: string, code: ConfigLoadErrorCode, cause?: Error) {\n super(message, { cause });\n this.name = 'ConfigLoadError';\n this.code = code;\n }\n}\n\nexport type ConfigLoadErrorCode =\n | 'FILE_READ_ERROR'\n | 'YAML_PARSE_ERROR'\n | 'VALIDATION_ERROR'\n | 'PATH_TRAVERSAL';\n\n/**\n * Options for loading configuration.\n */\nexport interface ConfigLoadOptions {\n /** Explicit path to config file */\n configPath?: string;\n /** Logger for diagnostics */\n logger?: ILogger;\n /** Working directory for relative paths (default: process.cwd()) */\n cwd?: string;\n /** Whether to merge with defaults (default: true) */\n mergeDefaults?: boolean;\n}\n\n/**\n * Validates that a path doesn't escape the allowed root.\n */\nfunction validatePath(userPath: string, root: string): Result<string, ConfigLoadError> {\n const resolved = resolveInsideRoot(userPath, root);\n if (resolved === null) {\n return err(\n new ConfigLoadError(\n `Config path traversal detected: ${userPath} escapes ${root}`,\n 'PATH_TRAVERSAL'\n )\n );\n }\n return ok(resolved);\n}\n\n/**\n * Finds the config file path.\n */\nfunction findConfigPath(cwd: string): string | undefined {\n // Check environment variable first\n const envPath = process.env['NEXUS_CONFIG_PATH'];\n if (envPath !== undefined && envPath !== '') {\n const validation = validatePath(envPath, cwd);\n if (validation.ok && existsSync(validation.value)) {\n return validation.value;\n }\n }\n\n // Check current directory for .yaml\n const yamlPath = resolve(cwd, DEFAULT_CONFIG_FILE);\n if (existsSync(yamlPath)) {\n return yamlPath;\n }\n\n // Check current directory for .yml\n const ymlPath = resolve(cwd, ALTERNATE_CONFIG_FILE);\n if (existsSync(ymlPath)) {\n return ymlPath;\n }\n\n // Check global config directory (resolved data dir) as fallback (#1265 + #2316)\n const globalDir = getNexusDataDir();\n const globalYamlPath = join(globalDir, DEFAULT_CONFIG_FILE);\n if (existsSync(globalYamlPath)) {\n return globalYamlPath;\n }\n const globalYmlPath = join(globalDir, ALTERNATE_CONFIG_FILE);\n if (existsSync(globalYmlPath)) {\n return globalYmlPath;\n }\n\n return undefined;\n}\n\n/**\n * Parses YAML content safely.\n */\nfunction parseYaml(content: string): Result<unknown, ConfigLoadError> {\n try {\n const parsed: unknown = yaml.parse(content);\n return ok(parsed);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown YAML parse error';\n return err(\n new ConfigLoadError(`YAML parse error: ${message}`, 'YAML_PARSE_ERROR', error as Error)\n );\n }\n}\n\n/** Keys that must never be merged — they target the prototype chain (CWE-1321). */\nconst PROTOTYPE_POLLUTION_KEYS: ReadonlySet<string> = new Set([\n '__proto__',\n 'constructor',\n 'prototype',\n]);\n\n/** True when both values are mergeable plain objects (not arrays/null). */\nfunction isMergeableObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Deep merges two objects, with source taking precedence.\n *\n * Exported for direct unit testing of the prototype-pollution guard.\n * @internal\n */\nexport function deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>\n): Record<string, unknown> {\n const result: Record<string, unknown> = { ...target };\n\n for (const key of Object.keys(source)) {\n if (PROTOTYPE_POLLUTION_KEYS.has(key)) continue;\n const sourceValue = source[key];\n if (sourceValue === undefined) continue;\n const targetValue = target[key];\n\n if (isMergeableObject(sourceValue) && isMergeableObject(targetValue)) {\n result[key] = deepMerge(targetValue, sourceValue);\n } else {\n result[key] = sourceValue;\n }\n }\n\n return result;\n}\n\n/** Returns default config when no file is found. */\nfunction loadDefaultConfig(logger: ILogger): Result<ConfigLoadResult, ConfigLoadError> {\n logger.debug('No config file found, using defaults');\n const validated = AppConfigSchema.safeParse(defaultConfig);\n if (!validated.success) {\n return err(\n new ConfigLoadError(\n `Default config validation failed: ${validated.error.message}`,\n 'VALIDATION_ERROR'\n )\n );\n }\n return ok({\n config: validated.data,\n usingDefaults: true,\n warnings: ['No config file found, using default configuration'],\n });\n}\n\n/** Reads and parses config file content. */\nfunction readAndParseConfig(\n configPath: string,\n mergeDefaults: boolean,\n logger: ILogger\n): Result<unknown, ConfigLoadError> {\n let content: string;\n try {\n content = readFileSync(configPath, 'utf-8');\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return err(\n new ConfigLoadError(\n `Failed to read config file: ${message}`,\n 'FILE_READ_ERROR',\n error as Error\n )\n );\n }\n\n const parseResult = parseYaml(content);\n if (!parseResult.ok) return err(parseResult.error);\n\n if (mergeDefaults && typeof parseResult.value === 'object' && parseResult.value !== null) {\n logger.debug('Merged config with defaults');\n return ok(\n deepMerge(\n defaultConfig as Record<string, unknown>,\n parseResult.value as Record<string, unknown>\n )\n );\n }\n return ok(parseResult.value);\n}\n\n/** Validates parsed config against schema. */\nfunction validateConfig(\n configData: unknown,\n configPath: string,\n logger: ILogger\n): Result<ConfigLoadResult, ConfigLoadError> {\n const validation = AppConfigSchema.safeParse(configData);\n if (!validation.success) {\n const issues = formatZodIssuesAsArray(validation.error);\n return err(\n new ConfigLoadError(`Config validation failed:\\n${issues.join('\\n')}`, 'VALIDATION_ERROR')\n );\n }\n logger.info('Configuration loaded successfully', { configPath });\n return ok({ config: validation.data, configPath, usingDefaults: false, warnings: [] });\n}\n\n/**\n * Loads and validates configuration from a file.\n */\nexport function loadConfig(\n options: ConfigLoadOptions = {}\n): Result<ConfigLoadResult, ConfigLoadError> {\n const { configPath: explicitPath, cwd = process.cwd(), mergeDefaults = true } = options;\n const logger = options.logger ?? createLogger({ component: 'ConfigLoader' });\n\n // Resolve config file path\n let configPath: string | undefined;\n if (explicitPath !== undefined) {\n const validation = validatePath(explicitPath, cwd);\n if (!validation.ok) return err(validation.error);\n configPath = validation.value;\n } else {\n configPath = findConfigPath(cwd);\n }\n\n // Use defaults if no config file found\n if (configPath === undefined) return loadDefaultConfig(logger);\n\n // Read, parse, and validate\n const parseResult = readAndParseConfig(configPath, mergeDefaults, logger);\n if (!parseResult.ok) return err(parseResult.error);\n\n return validateConfig(parseResult.value, configPath, logger);\n}\n\n/**\n * Singleton instance of loaded configuration.\n * Lazily initialized on first access.\n */\nlet loadedConfig: ConfigLoadResult | undefined;\n\n/**\n * Gets the currently loaded configuration.\n * Loads from file on first call, then returns cached result.\n *\n * @param options - Load options (only used on first call)\n * @returns The loaded configuration\n * @throws ConfigLoadError if loading fails\n */\nexport function getConfig(options?: ConfigLoadOptions): ConfigLoadResult {\n if (loadedConfig !== undefined) {\n return loadedConfig;\n }\n\n const result = loadConfig(options);\n if (!result.ok) {\n throw result.error;\n }\n loadedConfig = result.value;\n return loadedConfig;\n}\n\n/**\n * Clears the cached configuration.\n * Useful for testing or hot-reloading.\n */\nexport function clearConfigCache(): void {\n loadedConfig = undefined;\n}\n\n/**\n * Reloads configuration from file.\n * Replaces the cached configuration.\n *\n * @param options - Load options\n * @returns Result with new configuration or error\n */\nexport function reloadConfig(\n options?: ConfigLoadOptions\n): Result<ConfigLoadResult, ConfigLoadError> {\n clearConfigCache();\n const result = loadConfig(options);\n if (result.ok) {\n loadedConfig = result.value;\n }\n return result;\n}\n","/**\n * nexus-agents data directory initialization\n *\n * Pre-creates ~/.nexus-agents/ directory structure with proper permissions.\n * Used by `nexus-agents setup` to ensure data directories exist before first use.\n *\n * @module cli/setup-data-dir\n * (Source: Issue #1249 - Developer experience improvements)\n */\n\nimport { mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { DATA_SUBDIRECTORIES } from './doctor.js';\nimport { getNexusDataDir } from '../config/nexus-data-dir.js';\n\n/**\n * Root data directory path.\n *\n * Resolves to `$NEXUS_DATA_DIR` when set, else `<homedir>/.nexus-agents`.\n * See `src/config/nexus-data-dir.ts` for resolution rules (#2302).\n *\n * Evaluated at module-import time. Tests that mutate `NEXUS_DATA_DIR`\n * mid-process should call `resetNexusDataDirCache()` and re-import, or\n * call `getNexusDataDir()` directly.\n */\nexport const NEXUS_DATA_DIR = getNexusDataDir();\n\n/** Subdirectories requiring restricted permissions (owner-only). */\nconst RESTRICTED_DIRS = new Set(['auth']);\n\n/**\n * Result of data directory initialization.\n */\nexport interface DataDirInitResult {\n readonly success: boolean;\n readonly rootPath: string;\n readonly created: readonly string[];\n readonly alreadyExisted: readonly string[];\n readonly error: string | null;\n}\n\n/**\n * Creates the ~/.nexus-agents/ directory structure.\n * Sets restrictive permissions (0o700) on auth/ directory.\n *\n * @param dryRun - If true, reports what would be created without creating.\n * @returns Result of initialization.\n */\nexport function initDataDirectories(dryRun: boolean = false): DataDirInitResult {\n const created: string[] = [];\n const alreadyExisted: string[] = [];\n\n try {\n ensureDir(NEXUS_DATA_DIR, dryRun, created, alreadyExisted);\n\n for (const subdir of DATA_SUBDIRECTORIES) {\n const mode = RESTRICTED_DIRS.has(subdir) ? 0o700 : undefined;\n ensureDir(join(NEXUS_DATA_DIR, subdir), dryRun, created, alreadyExisted, mode);\n }\n\n return { success: true, rootPath: NEXUS_DATA_DIR, created, alreadyExisted, error: null };\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n return { success: false, rootPath: NEXUS_DATA_DIR, created, alreadyExisted, error: msg };\n }\n}\n\n/** Creates a single directory if it doesn't exist, tracking the result. */\nfunction ensureDir(\n dirPath: string,\n dryRun: boolean,\n created: string[],\n alreadyExisted: string[],\n mode?: number\n): void {\n if (existsSync(dirPath)) {\n alreadyExisted.push(dirPath);\n return;\n }\n if (!dryRun) {\n mkdirSync(dirPath, { recursive: true, ...(mode !== undefined ? { mode } : {}) });\n }\n created.push(dirPath);\n}\n","/* eslint-disable max-lines -- Cohesive doctor command module (governance: 400-600 OK if cohesive) */\n/**\n * nexus-agents doctor command\n *\n * Health check utility for CLI integration validation.\n * Verifies CLI installations, versions, authentication, Node.js version,\n * API keys, configuration files, and MCP server readiness.\n *\n * (Source: Issue #91, cli-project_plan.md DevEx amendment)\n * (Source: Issue #422 - Doctor command validations)\n */\n\nimport {\n existsSync,\n readFileSync,\n readdirSync,\n accessSync,\n constants as fsConstants,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { getNexusDataDir } from '../config/nexus-data-dir.js';\nimport { detectSandbox } from '../config/sandbox-detection.js';\nimport { getTimeProvider, getErrorMessage } from '../core/index.js';\nimport {\n isPersistenceEnabled,\n getLearningDir,\n getOutcomesFile,\n getRulesFile,\n} from '../config/learning-persistence.js';\nimport { createAllAdapters } from '../cli-adapters/factory.js';\nimport type { CliName, HealthStatus, CapacityStatus } from '../cli-adapters/types.js';\nimport { getInTreeCapabilitiesMatrix } from '../config/model-config-helpers.js';\nimport { createServer } from '../mcp/server.js';\nimport { printDoctorResults } from './doctor-formatting.js';\nimport { probeCli } from './cli-auth-probe.js';\nimport type { AuthProbeResult } from './cli-auth-probe.js';\nimport { checkHarnessAlignment } from './doctor-harness-alignment.js';\nimport type { HarnessAlignmentCheck } from './doctor-harness-alignment.js';\n\n/** Required Node.js major version. */\nconst REQUIRED_NODE_MAJOR = 22;\n\n/** API key environment variable names. */\nconst API_KEY_VARS = ['ANTHROPIC_API_KEY', 'OPENAI_API_KEY', 'GOOGLE_AI_API_KEY'] as const;\n\n/** Configuration file paths to check (in order of priority). */\nconst CONFIG_FILE_PATHS = ['./nexus-agents.yaml', './nexus-agents.yml'] as const;\n\n/**\n * Check result for a single CLI.\n */\nexport interface CliCheckResult {\n readonly name: CliName;\n readonly installed: boolean;\n readonly version: string;\n readonly versionStatus: 'supported' | 'outdated' | 'unsupported' | 'breaking';\n readonly authenticated: boolean;\n readonly authMethod?: string;\n readonly capacity?: CapacityStatus;\n readonly error?: string;\n readonly fix?: string;\n}\n\n/**\n * Node.js version check result.\n */\nexport interface NodeVersionCheck {\n readonly version: string;\n readonly major: number;\n readonly supported: boolean;\n}\n\n/**\n * API key check result.\n */\nexport interface ApiKeyCheck {\n readonly name: string;\n readonly configured: boolean;\n}\n\n/**\n * Configuration file check result.\n */\nexport interface ConfigFileCheck {\n readonly found: boolean;\n readonly path: string | null;\n}\n\n/**\n * Model availability advisory entry (#890).\n */\nexport interface ModelAdvisory {\n readonly modelId: string;\n readonly displayName: string;\n readonly cliName: string;\n readonly available: boolean;\n readonly reason: string;\n}\n\n/**\n * Learning persistence health check result (#1017).\n */\nexport interface LearningPersistenceCheck {\n readonly enabled: boolean;\n readonly dirExists: boolean;\n readonly dirWritable: boolean;\n readonly outcomeCount: number;\n readonly ruleCount: number;\n readonly rulesLastSaved: string | null;\n readonly error: string | null;\n}\n\n/**\n * Registry advisory summary (#890).\n */\nexport interface RegistryAdvisory {\n readonly totalModels: number;\n readonly availableModels: number;\n readonly unavailableModels: number;\n readonly models: readonly ModelAdvisory[];\n /** Days since the registry was last updated. */\n readonly registryAgeDays: number;\n /** True if the registry is >30 days old and may have stale model data. */\n readonly registryStale: boolean;\n}\n\n/**\n * SQLite (better-sqlite3) availability check (#1249).\n */\nexport interface SqliteCheck {\n readonly available: boolean;\n readonly error: string | null;\n}\n\n/**\n * Data directory health check (#1249).\n * Reports status of ~/.nexus-agents/ and its subdirectories.\n */\nexport interface DataDirectoryCheck {\n readonly rootExists: boolean;\n readonly rootPath: string;\n readonly subdirectories: readonly DataSubdirStatus[];\n}\n\n/**\n * Status of a single data subdirectory.\n */\nexport interface DataSubdirStatus {\n readonly name: string;\n readonly path: string;\n readonly exists: boolean;\n readonly writable: boolean;\n}\n\n/** Standard data subdirectories under ~/.nexus-agents/. */\nexport const DATA_SUBDIRECTORIES = [\n 'memory',\n 'memory/beliefs',\n 'learning',\n 'sessions',\n 'audit',\n 'voting',\n 'auth',\n 'research',\n 'checkpoints',\n] as const;\n\n/**\n * Sandbox awareness (#2501, child 1 of epic #2500).\n *\n * Reports whether nexus-agents is running inside a host-provided sandbox\n * (Docker Desktop Sandbox + OpenCode, Codex sandbox, locked-down CI) and\n * whether the explicit `NEXUS_SANDBOX` signal matches the runtime\n * heuristic. Mismatches don't block startup but get surfaced here so the\n * operator can fix the image / launch config.\n */\nexport interface SandboxCheck {\n readonly active: boolean;\n readonly flavor: string | undefined;\n readonly root: string | undefined;\n readonly heuristicMatch: 'docker' | 'podman' | 'unknown' | null;\n /** True iff the explicit signal disagrees with the heuristic. */\n readonly mismatch: boolean;\n /** True iff `NEXUS_DATA_DIR` resolves inside a single repo subfolder. */\n readonly dataDirInsideRepo: boolean;\n}\n\n/**\n * Complete doctor check results.\n */\nexport interface DoctorResult {\n readonly clis: CliCheckResult[];\n readonly nodeVersion: NodeVersionCheck;\n readonly apiKeys: ApiKeyCheck[];\n readonly configFile: ConfigFileCheck;\n readonly mcpServerReady: boolean;\n readonly mcpClientReady: boolean;\n /** Model registry advisory — which models are available (#890). */\n readonly registryAdvisory: RegistryAdvisory;\n /** Learning persistence health check (#1017). */\n readonly learningPersistence: LearningPersistenceCheck;\n /** SQLite (better-sqlite3) availability (#1249). */\n readonly sqliteCheck: SqliteCheck;\n /** Data directory health (#1249). */\n readonly dataDirectory: DataDirectoryCheck;\n /** Sandbox detection + heuristic verification (#2501). */\n readonly sandbox: SandboxCheck;\n /** Per-harness config alignment with AGENTS.md federation (#2805). */\n readonly harnessAlignment: HarnessAlignmentCheck;\n readonly allHealthy: boolean;\n readonly timestamp: Date;\n}\n\n/**\n * Gets the CLI install/upgrade fix command.\n */\nfunction getFixCommand(name: CliName, issue: 'install' | 'upgrade' | 'auth'): string {\n const commands: Record<CliName, Record<string, string>> = {\n claude: {\n install: 'npm install -g @anthropic-ai/claude-code',\n upgrade: 'npm update -g @anthropic-ai/claude-code',\n auth: 'claude auth login',\n },\n gemini: {\n install: 'npm install -g @google/gemini-cli',\n upgrade: 'npm update -g @google/gemini-cli',\n auth: 'gemini auth login',\n },\n codex: {\n install: 'npm install -g @openai/codex',\n upgrade: 'npm update -g @openai/codex',\n auth: 'codex auth login',\n },\n opencode: {\n install: 'npm install -g opencode-ai',\n upgrade: 'npm update -g opencode-ai',\n auth: 'opencode auth login',\n },\n };\n return commands[name][issue] ?? '';\n}\n\n/**\n * Creates a result for when a CLI is not found.\n */\nfunction createNotFoundResult(name: CliName, errorMsg: string): CliCheckResult {\n return {\n name,\n installed: false,\n version: 'N/A',\n versionStatus: 'unsupported',\n authenticated: false,\n error: errorMsg,\n fix: getFixCommand(name, 'install'),\n };\n}\n\n/**\n * Determines the authentication method based on CLI name.\n * CLIs use their own auth mechanisms - we report the method type\n * rather than assuming a specific one like 'OAuth'.\n */\nfunction detectAuthMethod(name: CliName): string {\n const authMethods: Record<CliName, string> = {\n claude: 'CLI auth',\n gemini: 'ADC/CLI auth',\n codex: 'CLI auth',\n opencode: 'CLI auth',\n };\n return authMethods[name];\n}\n\n/**\n * Creates a result from a successful health check.\n *\n * Authentication state comes from the auth probe (#2439, #2447), not from\n * `health.healthy` (which only confirms version compatibility). Without the\n * probe, doctor falsely reports \"Auth: CLI auth ✓\" for installed-but-\n * unauthed CLIs.\n */\nfunction createHealthyResult(\n name: CliName,\n health: HealthStatus,\n authProbe: AuthProbeResult,\n capacity?: CapacityStatus\n): CliCheckResult {\n const versionOk = health.healthy;\n const authenticated = versionOk && authProbe.state === 'authenticated';\n\n const result: CliCheckResult = {\n name,\n installed: true,\n version: health.version,\n versionStatus: health.versionStatus,\n authenticated,\n ...(authenticated && { authMethod: detectAuthMethod(name) }),\n ...(capacity !== undefined && { capacity }),\n };\n\n if (health.message !== undefined && health.message !== '') {\n return { ...result, error: health.message };\n }\n // Surface the probe's reason when needs-login so operators see what to fix.\n if (!authenticated && authProbe.state === 'needs-login') {\n return {\n ...result,\n error: authProbe.reason,\n fix: authProbe.fixCommand,\n };\n }\n if (!authenticated) {\n return { ...result, fix: getFixCommand(name, 'auth') };\n }\n if (health.versionStatus === 'outdated') {\n return { ...result, fix: getFixCommand(name, 'upgrade') };\n }\n\n return result;\n}\n\n/**\n * Runs health check on a single CLI adapter.\n *\n * Combines the version-compatibility check from `adapter.healthCheck()` with\n * the real auth probe from `cli-auth-probe.ts` — see #2439 for why both are\n * needed (version-OK alone misled doctor into reporting unauthed CLIs as ✓).\n */\nasync function checkCli(name: CliName): Promise<CliCheckResult> {\n const adapters = createAllAdapters();\n const adapter = adapters.get(name);\n\n if (!adapter) {\n return createNotFoundResult(name, 'Adapter not available');\n }\n\n try {\n const [health, authProbe] = await Promise.all([adapter.healthCheck(), probeCli(name)]);\n let capacity: CapacityStatus | undefined;\n\n try {\n capacity = await adapter.getCapacity();\n } catch (capErr: unknown) {\n // Capacity check is optional — some adapters don't support it\n void capErr; // Logged at debug via adapter internals\n }\n\n return createHealthyResult(name, health, authProbe, capacity);\n } catch (error) {\n const message = getErrorMessage(error);\n const isNotFound = message.includes('ENOENT') || message.includes('not found');\n return createNotFoundResult(name, isNotFound ? 'Not found in PATH' : message);\n }\n}\n\n/**\n * Checks the Node.js version against the required version.\n */\nfunction checkNodeVersion(): NodeVersionCheck {\n const version = process.version;\n const major = Number(version.slice(1).split('.')[0]);\n return {\n version,\n major,\n supported: major >= REQUIRED_NODE_MAJOR,\n };\n}\n\n/**\n * Checks which API keys are configured in the environment.\n * Does NOT expose the actual key values - only reports presence.\n *\n * Exported so `verify` (#2136) and other health gates can reuse it without\n * running the full doctor pipeline.\n */\nexport function checkApiKeys(): ApiKeyCheck[] {\n return API_KEY_VARS.map((name) => ({\n name,\n configured: typeof process.env[name] === 'string' && process.env[name] !== '',\n }));\n}\n\n/**\n * Checks for the existence of a configuration file.\n */\nfunction checkConfigFile(): ConfigFileCheck {\n for (const configPath of CONFIG_FILE_PATHS) {\n if (existsSync(configPath)) {\n return { found: true, path: configPath };\n }\n }\n return { found: false, path: null };\n}\n\n/**\n * Validates that the MCP server can be created successfully.\n * This is a lightweight check that verifies server instantiation works.\n */\nfunction checkMcpServerReady(): boolean {\n try {\n const result = createServer({ name: 'nexus-agents-doctor-check' });\n return result.ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Builds model registry advisory based on detected CLI availability (#890).\n *\n * Staleness threshold (#2445): bumped from 30 → 90 days. The published\n * npm tarball ships with a registry snapshot that's typically 1-4 weeks\n * old by the time an operator installs it (normal release cadence). A\n * 30-day threshold meant fresh installs of recently-published versions\n * showed `⚠ Model registry is 55 days old` on day one of usage, training\n * operators to ignore staleness warnings.\n *\n * Additionally, if the operator's data directory has no signs of prior\n * usage (no audit log, no outcome store), suppress the warning entirely\n * — staleness on first run is a publishing concern, not an operator\n * concern.\n */\nfunction buildRegistryAdvisory(cliResults: CliCheckResult[]): RegistryAdvisory {\n const installedClis = new Set(cliResults.filter((c) => c.installed).map((c) => c.name));\n\n const matrix = getInTreeCapabilitiesMatrix();\n const models: ModelAdvisory[] = matrix.models\n .filter((m) => m.cliName !== undefined)\n .map((m) => {\n const cliName = m.cliName ?? '';\n const available = cliName.length > 0 && installedClis.has(cliName as CliName);\n const reason = available ? `${cliName} CLI is installed` : `${cliName} CLI is not installed`;\n return { modelId: m.id, displayName: m.displayName, cliName, available, reason };\n });\n\n // Registry staleness check (#1549, threshold revised in #2445)\n const STALE_THRESHOLD_DAYS = 90;\n const updatedAt = new Date(matrix.updatedAt);\n const nowMs = getTimeProvider().now();\n const ageDays = Math.floor((nowMs - updatedAt.getTime()) / (1000 * 60 * 60 * 24));\n\n // First-install detection: if the operator has no prior activity in\n // their data dir, suppress the staleness warning. There's nothing they\n // can do about it on day one anyway, and it trains them to ignore\n // warnings.\n const isFreshInstall = !hasPriorUsage();\n const exceedsThreshold = ageDays > STALE_THRESHOLD_DAYS;\n\n return {\n totalModels: models.length,\n availableModels: models.filter((m) => m.available).length,\n unavailableModels: models.filter((m) => !m.available).length,\n models,\n registryAgeDays: ageDays,\n registryStale: exceedsThreshold && !isFreshInstall,\n };\n}\n\n/**\n * Cheap heuristic for \"operator has used nexus-agents before\": data dir\n * exists and contains audit / outcome / session evidence. Used to\n * suppress staleness warnings on day-one of a fresh install (#2445).\n */\nfunction hasPriorUsage(): boolean {\n try {\n const root = getNexusDataDir();\n if (!existsSync(root)) return false;\n // Check for any subdirectory with files. Lazy creation of empty\n // subdirs by `nexus-agents setup` would falsely register as usage —\n // hence we look for *files*, not just directories.\n for (const sub of ['audit', 'learning', 'sessions', 'voting']) {\n const p = `${root}/${sub}`;\n try {\n if (existsSync(p) && readdirSync(p).length > 0) return true;\n } catch {\n // ignore — best-effort heuristic\n }\n }\n return false;\n } catch {\n return false;\n }\n}\n\n/** Counts non-empty lines in a JSONL file. Returns 0 if file doesn't exist. */\nfunction countJsonlLines(filePath: string): number {\n if (!existsSync(filePath)) return 0;\n return readFileSync(filePath, 'utf-8')\n .split('\\n')\n .filter((l) => l.trim().length > 0).length;\n}\n\n/** Reads rules snapshot metadata. Returns count and savedAt. */\nfunction readRulesMetadata(filePath: string): { count: number; savedAt: string | null } {\n if (!existsSync(filePath)) return { count: 0, savedAt: null };\n try {\n const raw = JSON.parse(readFileSync(filePath, 'utf-8')) as Record<string, unknown>;\n const rules = raw['rules'];\n const saved = raw['savedAt'];\n return {\n count: Array.isArray(rules) ? rules.length : 0,\n savedAt: typeof saved === 'string' ? saved : null,\n };\n } catch {\n return { count: 0, savedAt: null };\n }\n}\n\n/** Checks if a directory exists and is writable. */\nfunction checkDirAccess(dir: string): { exists: boolean; writable: boolean } {\n const exists = existsSync(dir);\n if (!exists) return { exists: false, writable: false };\n try {\n accessSync(dir, fsConstants.W_OK);\n return { exists: true, writable: true };\n } catch {\n return { exists: true, writable: false };\n }\n}\n\nconst DISABLED_CHECK: LearningPersistenceCheck = {\n enabled: false,\n dirExists: false,\n dirWritable: false,\n outcomeCount: 0,\n ruleCount: 0,\n rulesLastSaved: null,\n error: null,\n};\n\n/** Checks learning persistence health (#1017). */\nfunction checkLearningPersistence(): LearningPersistenceCheck {\n if (!isPersistenceEnabled()) return DISABLED_CHECK;\n try {\n const { exists: dirExists, writable: dirWritable } = checkDirAccess(getLearningDir());\n const outcomeCount = countJsonlLines(getOutcomesFile());\n const { count: ruleCount, savedAt: rulesLastSaved } = readRulesMetadata(getRulesFile());\n return {\n enabled: true,\n dirExists,\n dirWritable,\n outcomeCount,\n ruleCount,\n rulesLastSaved,\n error: null,\n };\n } catch (error: unknown) {\n return {\n enabled: true,\n dirExists: false,\n dirWritable: false,\n outcomeCount: 0,\n ruleCount: 0,\n rulesLastSaved: null,\n error: getErrorMessage(error),\n };\n }\n}\n\n/**\n * Checks if better-sqlite3 is available (#1249).\n * Memory backends (agentic, adaptive, typed, mobimem, decay) require it.\n *\n * Exported so `verify` (#2136) can reuse it without running the full doctor\n * pipeline.\n */\nexport async function checkSqlite(): Promise<SqliteCheck> {\n try {\n await import('better-sqlite3');\n return { available: true, error: null };\n } catch (error: unknown) {\n const msg = getErrorMessage(error);\n const isNotFound = msg.includes('Cannot find') || msg.includes('MODULE_NOT_FOUND');\n return {\n available: false,\n error: isNotFound\n ? 'better-sqlite3 not installed — 5 memory backends unavailable'\n : `better-sqlite3 load error: ${msg}`,\n };\n }\n}\n\n/**\n * Checks the ~/.nexus-agents/ data directory health (#1249).\n *\n * Exported so `verify` (#2136) can reuse it without running the full doctor\n * pipeline.\n */\nexport function checkDataDirectory(): DataDirectoryCheck {\n const rootPath = getNexusDataDir();\n const rootExists = existsSync(rootPath);\n\n const subdirectories: DataSubdirStatus[] = DATA_SUBDIRECTORIES.map((name) => {\n const fullPath = join(rootPath, name);\n const exists = existsSync(fullPath);\n return { name, path: fullPath, exists, writable: exists && isWritable(fullPath) };\n });\n\n return { rootExists, rootPath, subdirectories };\n}\n\n/** Checks if a directory is writable by the current user. */\nfunction isWritable(dirPath: string): boolean {\n try {\n accessSync(dirPath, fsConstants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Sandbox awareness check (#2501).\n *\n * Cross-references the explicit `NEXUS_SANDBOX` signal against the runtime\n * heuristic and the resolved data dir. Surfaces mismatches that point at\n * a misconfigured image (claims docker but no `/.dockerenv`) or a\n * misconfigured launch (`NEXUS_DATA_DIR` inside a single repo while the\n * sandbox root spans multiple).\n */\nexport function checkSandbox(): SandboxCheck {\n const info = detectSandbox();\n const dataDir = getNexusDataDir();\n const root = info.root;\n const dataDirInsideRepo =\n info.active &&\n root !== undefined &&\n dataDir.startsWith(`${root.replace(/\\/$/, '')}/`) &&\n // path segments BETWEEN root and `.nexus-agents/` indicate the data dir\n // lives in a subfolder rather than at the multi-repo root.\n dataDir.replace(`${root.replace(/\\/$/, '')}/`, '').split('/').length > 1;\n\n // Mismatch: claimed sandbox but heuristic says not-a-container, or vice versa.\n const heuristicSaysContainer =\n info.heuristicMatch === 'docker' || info.heuristicMatch === 'podman';\n const mismatch =\n (info.active && info.heuristicMatch === 'unknown') || (!info.active && heuristicSaysContainer);\n\n return {\n active: info.active,\n flavor: info.flavor,\n root: info.root,\n heuristicMatch: info.heuristicMatch,\n mismatch,\n dataDirInsideRepo,\n };\n}\n\n/**\n * Runs the complete doctor check.\n */\nexport async function runDoctor(): Promise<DoctorResult> {\n const clis = await Promise.all([\n checkCli('claude'),\n checkCli('gemini'),\n checkCli('codex'),\n checkCli('opencode'),\n ]);\n const nodeVersion = checkNodeVersion();\n const apiKeys = checkApiKeys();\n const configFile = checkConfigFile();\n const mcpServerReady = checkMcpServerReady();\n const codexCheck = clis.find((c) => c.name === 'codex');\n const mcpClientReady = codexCheck?.installed ?? false;\n const registryAdvisory = buildRegistryAdvisory(clis);\n const learningPersistence = checkLearningPersistence();\n const sqliteCheck = await checkSqlite();\n const dataDirectory = checkDataDirectory();\n const sandbox = checkSandbox();\n const harnessAlignment = checkHarnessAlignment();\n\n // At least one API key configured or one CLI authenticated\n const hasAuthMethod =\n apiKeys.some((k) => k.configured) || clis.some((c) => c.installed && c.authenticated);\n\n const allHealthy =\n nodeVersion.supported &&\n hasAuthMethod &&\n mcpServerReady &&\n clis.every((c) => c.installed && c.authenticated && c.versionStatus !== 'unsupported');\n\n return {\n clis,\n nodeVersion,\n apiKeys,\n configFile,\n mcpServerReady,\n mcpClientReady,\n registryAdvisory,\n learningPersistence,\n sqliteCheck,\n dataDirectory,\n sandbox,\n harnessAlignment,\n allHealthy,\n timestamp: new Date(getTimeProvider().now()),\n };\n}\n\n/** Doctor command options. */\nexport interface DoctorOptions {\n /** Auto-fix safe issues (run setup, generate config). */\n readonly fix?: boolean;\n}\n\n/**\n * Runs the doctor command and prints results.\n * Returns exit code (0 = healthy, 1 = issues found).\n */\nexport async function doctorCommand(options: DoctorOptions = {}): Promise<number> {\n const result = await runDoctor();\n printDoctorResults(result);\n\n if (options.fix === true) {\n await runDoctorFix(result);\n }\n\n return result.allHealthy ? 0 : 1;\n}\n\n/**\n * Auto-fixes safe issues found by doctor (#1254).\n * Only runs our own code — never execs external package managers.\n */\nasync function runDoctorFix(result: DoctorResult): Promise<void> {\n const writeLine = (text: string): void => {\n process.stdout.write(text + '\\n');\n };\n\n writeLine('');\n writeLine('\\x1b[1mAuto-fix\\x1b[0m');\n writeLine('─'.repeat(40));\n\n let fixCount = 0;\n\n // Fix: data directories (missing or not writable)\n if (\n !result.dataDirectory.rootExists ||\n result.dataDirectory.subdirectories.some((d) => !d.exists || !d.writable)\n ) {\n const { runSetup } = await import('./setup-command.js');\n const setupResult = runSetup({\n skipMcp: true,\n skipRules: true,\n skipHooks: true,\n skipConfig: true,\n skipOpencode: true,\n });\n if (setupResult.success) {\n writeLine('✓ Created missing data directories');\n fixCount++;\n }\n }\n\n // Fix: config file\n if (!result.configFile.found) {\n const { runConfigInitSync } = await import('./setup-config.js');\n const configResult = runConfigInitSync(process.cwd(), false, false);\n if (configResult.success && configResult.created) {\n writeLine(`✓ Generated config: ${configResult.path}`);\n fixCount++;\n }\n }\n\n // Display-only: better-sqlite3\n if (!result.sqliteCheck.available) {\n writeLine('');\n writeLine('⚠ better-sqlite3 not installed (manual step required):');\n writeLine(' npm install -g better-sqlite3');\n }\n\n if (fixCount > 0) {\n writeLine('');\n writeLine(\n `\\x1b[32m${String(fixCount)} issue(s) fixed.\\x1b[0m Re-run \\x1b[1mnexus-agents doctor\\x1b[0m to verify.`\n );\n } else {\n writeLine('No auto-fixable issues found.');\n }\n writeLine('');\n}\n\n// Re-export printDoctorResults for backward compatibility\nexport { printDoctorResults } from './doctor-formatting.js';\n","/**\n * nexus-agents/mcp - MCP Server\n *\n * Main MCP server implementation for Nexus Agents orchestration.\n * Provides factory functions to create and start the server with\n * stdio or custom transports.\n *\n * (Source: MCP Protocol 2025-11-25)\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\n\nimport {\n getErrorMessage,\n createLogger,\n type Result,\n ok,\n err,\n type ILogger,\n} from '../core/index.js';\nimport { VERSION } from '../version.js';\nimport { getTaskStore } from './task-store.js';\nimport { initDataDirectories } from '../cli/setup-data-dir.js';\n\n/**\n * Server configuration options.\n */\nexport interface ServerConfig {\n /** Server name (default: \"nexus-agents\") */\n readonly name?: string;\n /** Server version (default: package version) */\n readonly version?: string;\n /** Logger instance */\n readonly logger?: ILogger;\n}\n\n/**\n * Server creation result containing the server and logger.\n */\nexport interface ServerInstance {\n /** The MCP server instance */\n readonly server: McpServer;\n /** The logger instance for this server */\n readonly logger: ILogger;\n}\n\n/**\n * Error type for server operations.\n */\nexport interface ServerError {\n code: 'SERVER_CREATION_FAILED' | 'SERVER_START_FAILED' | 'SERVER_STOP_FAILED';\n message: string;\n cause?: Error;\n}\n\nconst DEFAULT_SERVER_NAME = 'nexus-agents';\n\n/**\n * Creates a ServerError with the given code, message, and optional cause.\n */\nfunction createServerError(\n code: ServerError['code'],\n message: string,\n error: unknown\n): ServerError {\n const serverError: ServerError = { code, message };\n if (error instanceof Error) {\n serverError.cause = error;\n }\n return serverError;\n}\n\n/**\n * Creates a new MCP server instance.\n *\n * @param config - Optional server configuration\n * @returns Result containing the server instance or an error\n *\n * @example\n * ```typescript\n * const result = createServer({ name: 'my-server' });\n * if (result.ok) {\n * const { server, logger } = result.value;\n * // Register tools on server\n * }\n * ```\n */\nexport function createServer(config?: ServerConfig): Result<ServerInstance, ServerError> {\n const serverName = config?.name ?? DEFAULT_SERVER_NAME;\n const serverVersion = config?.version ?? VERSION;\n const logger = config?.logger ?? createLogger({ component: 'mcp-server' });\n\n try {\n // Ensure data directories exist on first MCP server startup (#1398)\n initDataDirectories();\n\n logger.info('Creating MCP server', {\n name: serverName,\n version: serverVersion,\n });\n\n const server = new McpServer(\n {\n name: serverName,\n version: serverVersion,\n },\n {\n capabilities: {\n logging: {},\n prompts: {},\n resources: {},\n tasks: {},\n },\n taskStore: getTaskStore(),\n }\n );\n\n logger.debug('MCP server created successfully');\n\n return ok({ server, logger });\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n logger.error('Failed to create MCP server', error instanceof Error ? error : undefined);\n return err(\n createServerError(\n 'SERVER_CREATION_FAILED',\n `Failed to create MCP server: ${errorMessage}`,\n error\n )\n );\n }\n}\n\n/**\n * Connects the server to a transport.\n *\n * @param server - The MCP server instance\n * @param transport - The transport to connect to\n * @param logger - Logger for the operation\n * @returns Result indicating success or failure\n */\nexport async function connectTransport(\n server: McpServer,\n transport: Transport,\n logger?: ILogger\n): Promise<Result<void, ServerError>> {\n const log = logger ?? createLogger({ component: 'mcp-server' });\n\n try {\n log.info('Connecting server to transport');\n await server.connect(transport);\n log.debug('Server connected to transport successfully');\n return ok(undefined);\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n log.error('Failed to connect to transport', error instanceof Error ? error : undefined);\n return err(\n createServerError(\n 'SERVER_START_FAILED',\n `Failed to connect to transport: ${errorMessage}`,\n error\n )\n );\n }\n}\n\n/**\n * Starts the MCP server with stdio transport.\n *\n * This is the main entry point for running the server as a standalone process.\n * The server will communicate over stdin/stdout using the MCP protocol.\n *\n * @param config - Optional server configuration\n * @returns Result indicating success or failure\n *\n * @example\n * ```typescript\n * const result = await startStdioServer();\n * if (!result.ok) {\n * console.error('Failed to start server:', result.error.message);\n * process.exit(1);\n * }\n * ```\n */\nexport async function startStdioServer(\n config?: ServerConfig\n): Promise<Result<ServerInstance, ServerError>> {\n const serverResult = createServer(config);\n if (!serverResult.ok) {\n return serverResult;\n }\n\n const { server, logger } = serverResult.value;\n\n try {\n // Defense-in-depth: stdio transport owns stdout for JSON-RPC frames.\n logger.setDestination?.('stderr');\n logger.info('Starting stdio transport');\n const transport = new StdioServerTransport();\n\n const connectResult = await connectTransport(server, transport, logger);\n if (!connectResult.ok) {\n return connectResult;\n }\n\n logger.info('MCP server running with stdio transport');\n return ok({ server, logger });\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n logger.error('Failed to start stdio server', error instanceof Error ? error : undefined);\n return err(\n createServerError(\n 'SERVER_START_FAILED',\n `Failed to start stdio server: ${errorMessage}`,\n error\n )\n );\n }\n}\n\n/**\n * Gracefully closes the server connection.\n *\n * @param server - The MCP server to close\n * @param logger - Optional logger\n * @returns Result indicating success or failure\n */\nexport async function closeServer(\n server: McpServer,\n logger?: ILogger\n): Promise<Result<void, ServerError>> {\n const log = logger ?? createLogger({ component: 'mcp-server' });\n\n try {\n log.info('Closing MCP server');\n await server.close();\n log.info('MCP server closed successfully');\n return ok(undefined);\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n log.error('Failed to close server', error instanceof Error ? error : undefined);\n return err(\n createServerError('SERVER_STOP_FAILED', `Failed to close server: ${errorMessage}`, error)\n );\n }\n}\n","/**\n * Nexus-Agents Task Store — wraps SDK InMemoryTaskStore with security controls.\n *\n * Provides:\n * - TTL enforcement (max 10 minutes per task)\n * - Capacity cap (max 50 tasks, FIFO eviction when exceeded)\n * - Singleton access via `getTaskStore()`\n * - Periodic cleanup of expired tasks\n *\n * @module mcp/task-store\n * (Source: Issue #1298 — Layer 2 MCP Tasks async execution)\n */\n\nimport { InMemoryTaskStore } from '@modelcontextprotocol/sdk/experimental/tasks';\nimport type { TaskStore } from '@modelcontextprotocol/sdk/experimental/tasks';\nimport { createLogger } from '../core/index.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Maximum TTL for any task (10 minutes). */\nexport const MAX_TASK_TTL_MS = 600_000;\n\n/** Default TTL applied when none specified (5 minutes). */\nexport const DEFAULT_TASK_TTL_MS = 300_000;\n\n/** Maximum number of tasks before FIFO eviction. */\nexport const MAX_TASK_CAPACITY = 50;\n\n/** Interval for periodic cleanup of expired tasks (60 seconds). */\nconst CLEANUP_INTERVAL_MS = 60_000;\n\n// ============================================================================\n// Singleton\n// ============================================================================\n\nconst logger = createLogger({ component: 'task-store' });\n\nlet singletonStore: InMemoryTaskStore | undefined;\nlet cleanupTimer: ReturnType<typeof setInterval> | undefined;\n\n/**\n * Returns the singleton InMemoryTaskStore, creating it on first call.\n *\n * The SDK's InMemoryTaskStore handles TTL cleanup internally.\n * We enforce our MAX_TASK_TTL_MS via `clampTaskTtl()` at task creation\n * (done by the ToolTaskHandler, not the store itself).\n */\nexport function getTaskStore(): TaskStore {\n if (singletonStore === undefined) {\n singletonStore = new InMemoryTaskStore();\n logger.info('Task store created', { maxCapacity: MAX_TASK_CAPACITY });\n\n // Periodic cleanup: evict oldest tasks if capacity exceeded\n cleanupTimer = setInterval(() => {\n evictExcessTasks();\n }, CLEANUP_INTERVAL_MS);\n\n // Prevent cleanup timer from keeping Node alive\n if (typeof cleanupTimer === 'object' && 'unref' in cleanupTimer) {\n cleanupTimer.unref();\n }\n }\n return singletonStore;\n}\n\n/**\n * Clamps a requested TTL to the maximum allowed value.\n * Returns DEFAULT_TASK_TTL_MS if no TTL is specified or null.\n */\nexport function clampTaskTtl(requestedTtl?: number | null): number {\n if (requestedTtl === undefined || requestedTtl === null) {\n return DEFAULT_TASK_TTL_MS;\n }\n if (requestedTtl > MAX_TASK_TTL_MS) {\n logger.warn('Task TTL clamped to maximum', {\n requested: requestedTtl,\n max: MAX_TASK_TTL_MS,\n });\n return MAX_TASK_TTL_MS;\n }\n return requestedTtl;\n}\n\n/**\n * Evicts oldest tasks when capacity is exceeded (FIFO).\n * Best-effort — logs warnings but does not throw.\n */\nfunction evictExcessTasks(): void {\n if (singletonStore === undefined) return;\n\n const allTasks = singletonStore.getAllTasks();\n if (allTasks.length <= MAX_TASK_CAPACITY) return;\n\n // Sort by creation time ascending (oldest first)\n const sorted = [...allTasks].sort(\n (a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()\n );\n\n const evictCount = sorted.length - MAX_TASK_CAPACITY;\n for (let i = 0; i < evictCount; i++) {\n const task = sorted[i];\n if (task === undefined) continue;\n singletonStore\n .updateTaskStatus(task.taskId, 'cancelled', 'Evicted: capacity exceeded')\n .catch((err: unknown) => {\n logger.debug('Failed to evict task', {\n taskId: task.taskId,\n error: String(err),\n });\n });\n }\n\n logger.info('Evicted excess tasks', { evicted: evictCount, total: sorted.length });\n}\n\n/**\n * Shuts down the task store and cleanup timer.\n * Call during server shutdown. Safe to call multiple times.\n * @internal\n */\nexport function shutdownTaskStore(): void {\n if (cleanupTimer !== undefined) {\n clearInterval(cleanupTimer);\n cleanupTimer = undefined;\n }\n if (singletonStore !== undefined) {\n singletonStore.cleanup();\n singletonStore = undefined;\n logger.info('Task store shut down');\n }\n}\n\n/** Resets the singleton for testing. @internal */\nexport function resetTaskStore(): void {\n shutdownTaskStore();\n}\n","/**\n * nexus-agents doctor command - Formatting utilities\n *\n * Terminal output formatting for doctor command results.\n * Extracted to comply with 400-line file limit.\n *\n * (Source: Issue #422 - Doctor command validations)\n */\n\nimport { DEFAULT_CAPABILITIES } from '../cli-adapters/types.js';\nimport type { CapacityStatus } from '../cli-adapters/types.js';\nimport type {\n CliCheckResult,\n NodeVersionCheck,\n ApiKeyCheck,\n ConfigFileCheck,\n RegistryAdvisory,\n LearningPersistenceCheck,\n SqliteCheck,\n DataDirectoryCheck,\n DoctorResult,\n} from './doctor.js';\nimport { colors, symbols, writeLine } from './ansi-output.js';\nimport { capitalize } from '../utils/text-utils.js';\n\n/** Required Node.js major version (for warning message). */\nconst REQUIRED_NODE_MAJOR = 22;\n\n/**\n * Formats a status symbol with color.\n */\nfunction formatStatus(healthy: boolean, warn = false): string {\n if (healthy) return `${colors.green}${symbols.check}${colors.reset}`;\n if (warn) return `${colors.yellow}${symbols.warn}${colors.reset}`;\n return `${colors.red}${symbols.cross}${colors.reset}`;\n}\n\n/**\n * Formats version status with color.\n */\nfunction formatVersionStatus(status: string): string {\n switch (status) {\n case 'supported':\n return `${colors.green}supported${colors.reset}`;\n case 'outdated':\n return `${colors.yellow}outdated${colors.reset}`;\n case 'unsupported':\n case 'breaking':\n return `${colors.red}${status}${colors.reset}`;\n default:\n return status;\n }\n}\n\n/**\n * Formats capacity as percentage string.\n */\nfunction formatCapacity(capacity?: CapacityStatus): string {\n if (capacity === undefined) return 'Unknown';\n const remaining = 100 - capacity.utilizationPercent;\n const remainingStr = String(remaining);\n if (remaining > 80) return `${colors.green}${remainingStr}% remaining${colors.reset}`;\n if (remaining > 20) return `${colors.yellow}${remainingStr}% remaining${colors.reset}`;\n return `${colors.red}${remainingStr}% remaining${colors.reset}`;\n}\n\n/**\n * Prints details for an installed CLI.\n */\nfunction printInstalledCliDetails(cli: CliCheckResult): void {\n writeLine(` Version: ${cli.version} (${formatVersionStatus(cli.versionStatus)})`);\n\n const authText = cli.authenticated\n ? `${colors.green}${cli.authMethod ?? 'Authenticated'}${colors.reset}`\n : `${colors.red}Not authenticated${colors.reset}`;\n writeLine(` Auth: ${authText}`);\n\n if (cli.capacity !== undefined) {\n writeLine(` Capacity: ${formatCapacity(cli.capacity)}`);\n }\n}\n\n/**\n * Prints a single CLI result.\n */\nfunction printCliResult(cli: CliCheckResult): void {\n const status = cli.installed && cli.authenticated;\n const warn = cli.installed && (!cli.authenticated || cli.versionStatus === 'outdated');\n\n writeLine(\n `${formatStatus(status, warn)} ${colors.bold}${capitalize(cli.name)} CLI${colors.reset}`\n );\n\n if (cli.installed) {\n printInstalledCliDetails(cli);\n } else {\n const errorText = cli.error ?? 'Not installed';\n writeLine(` ${colors.red}Error: ${errorText}${colors.reset}`);\n }\n\n if (cli.fix !== undefined && cli.fix !== '') {\n writeLine(` ${colors.dim}Fix: ${cli.fix}${colors.reset}`);\n }\n\n writeLine('');\n}\n\n/**\n * Prints capability summary for installed CLIs.\n */\nfunction printCapabilities(clis: CliCheckResult[]): void {\n const installedClis = clis.filter((c) => c.installed);\n\n if (installedClis.length === 0) {\n writeLine(`${formatStatus(false)} No CLIs installed`);\n return;\n }\n\n const caps = DEFAULT_CAPABILITIES;\n const bestReasoning = installedClis.reduce((best, c) =>\n caps[c.name].reasoning > caps[best.name].reasoning ? c : best\n );\n const bestContext = installedClis.reduce((best, c) =>\n caps[c.name].contextWindow > caps[best.name].contextWindow ? c : best\n );\n const bestSpeed = installedClis.reduce((best, c) =>\n caps[c.name].speed > caps[best.name].speed ? c : best\n );\n\n const contextTokensK = (caps[bestContext.name].contextWindow / 1000).toFixed(0);\n\n writeLine(\n `${formatStatus(true)} Complex reasoning: ${colors.bold}${capitalize(bestReasoning.name)}${colors.reset}`\n );\n writeLine(\n `${formatStatus(true)} Large context: ${colors.bold}${capitalize(bestContext.name)}${colors.reset} (${contextTokensK}K tokens)`\n );\n writeLine(\n `${formatStatus(true)} Fast execution: ${colors.bold}${capitalize(bestSpeed.name)}${colors.reset}`\n );\n}\n\n/**\n * Prints Node.js version check result.\n */\nfunction printNodeVersionCheck(check: NodeVersionCheck): void {\n const versionText = check.supported\n ? `${colors.green}${check.version}${colors.reset}`\n : `${colors.yellow}${check.version}${colors.reset}`;\n writeLine(`${formatStatus(check.supported, !check.supported)} Node.js version: ${versionText}`);\n if (!check.supported) {\n writeLine(\n ` ${colors.dim}Warning: Node.js ${String(REQUIRED_NODE_MAJOR)}.x LTS required${colors.reset}`\n );\n }\n}\n\n/**\n * Prints API key configuration check results.\n */\nfunction printApiKeysCheck(keys: ApiKeyCheck[]): void {\n const configuredCount = keys.filter((k) => k.configured).length;\n const configuredNames = keys.filter((k) => k.configured).map((k) => k.name);\n const hasAny = configuredCount > 0;\n\n writeLine(\n `${formatStatus(hasAny, !hasAny)} API keys configured: ${String(configuredCount)} of ${String(keys.length)}`\n );\n if (hasAny) {\n writeLine(` ${colors.dim}Keys: ${configuredNames.join(', ')}${colors.reset}`);\n } else {\n writeLine(\n ` ${colors.dim}Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or GOOGLE_AI_API_KEY${colors.reset}`\n );\n }\n}\n\n/**\n * Prints configuration file check result.\n */\nfunction printConfigFileCheck(check: ConfigFileCheck): void {\n if (check.found && check.path !== null) {\n writeLine(`${formatStatus(true)} Configuration loaded: ${check.path}`);\n } else {\n writeLine(`${formatStatus(false, true)} Configuration file: Not found`);\n writeLine(` ${colors.dim}Run: nexus-agents config init${colors.reset}`);\n }\n}\n\n/**\n * Prints model registry advisory (#890).\n */\nfunction printRegistryAdvisory(advisory: RegistryAdvisory): void {\n const allAvailable = advisory.unavailableModels === 0;\n const countText = `${String(advisory.availableModels)} of ${String(advisory.totalModels)}`;\n writeLine(`${formatStatus(allAvailable, !allAvailable)} Models available: ${countText}`);\n if (advisory.unavailableModels > 0) {\n const missing = advisory.models.filter((m) => !m.available);\n for (const m of missing) {\n writeLine(` ${colors.dim}${m.displayName} — ${m.reason}${colors.reset}`);\n }\n }\n // Registry staleness warning (#1549, revised in #2445)\n const ageText = `${String(advisory.registryAgeDays)} days old`;\n if (advisory.registryStale) {\n writeLine(\n `${colors.yellow}${symbols.warn}${colors.reset} Model registry is ${ageText} — may have stale model data`\n );\n writeLine(\n ` ${colors.dim}Update with 'npm update -g nexus-agents' to pick up the latest registry,${colors.reset}`\n );\n writeLine(\n ` ${colors.dim}or run 'nexus-agents registry refresh' to probe currently-installed models.${colors.reset}`\n );\n } else {\n writeLine(`${formatStatus(true)} Model registry: ${ageText}`);\n }\n}\n\n/**\n * Prints learning persistence health check (#1017).\n */\nfunction printLearningPersistence(check: LearningPersistenceCheck): void {\n if (!check.enabled) {\n writeLine(`${formatStatus(true)} Learning persistence: ${colors.dim}Disabled${colors.reset}`);\n writeLine(` ${colors.dim}Set NEXUS_PERSIST_LEARNING=true to enable${colors.reset}`);\n return;\n }\n\n const healthy = check.dirExists && check.dirWritable && check.error === null;\n writeLine(`${formatStatus(healthy, !healthy)} Learning persistence: Enabled`);\n\n if (check.error !== null) {\n writeLine(` ${colors.red}Error: ${check.error}${colors.reset}`);\n return;\n }\n\n const dirStatus = check.dirExists\n ? check.dirWritable\n ? `${colors.green}writable${colors.reset}`\n : `${colors.red}not writable${colors.reset}`\n : `${colors.yellow}not created yet${colors.reset}`;\n writeLine(` Data directory: ${dirStatus}`);\n writeLine(` Outcomes: ${String(check.outcomeCount)} recorded`);\n writeLine(` Distilled rules: ${String(check.ruleCount)} active`);\n if (check.rulesLastSaved !== null) {\n writeLine(` Rules last saved: ${check.rulesLastSaved}`);\n }\n}\n\n/**\n * Prints SQLite (better-sqlite3) availability check (#1249).\n */\nfunction printSqliteCheck(check: SqliteCheck): void {\n if (check.available) {\n writeLine(\n `${formatStatus(true)} SQLite (better-sqlite3): ${colors.green}Available${colors.reset}`\n );\n } else {\n writeLine(\n `${formatStatus(false, true)} SQLite (better-sqlite3): ${colors.yellow}Not available${colors.reset}`\n );\n writeLine(\n ` ${colors.dim}Memory backends (agentic, adaptive, typed) require it${colors.reset}`\n );\n writeLine(` ${colors.dim}Fix: npm install -g better-sqlite3${colors.reset}`);\n }\n}\n\n/**\n * Prints data directory health check (#1249).\n */\nfunction printDataDirectory(check: DataDirectoryCheck): void {\n if (check.rootExists) {\n const existCount = check.subdirectories.filter((d) => d.exists).length;\n const totalCount = check.subdirectories.length;\n const allExist = existCount === totalCount;\n const allWritable = check.subdirectories.every((d) => !d.exists || d.writable);\n const healthy = allExist && allWritable;\n writeLine(\n `${formatStatus(healthy, !healthy)} Data directory: ${check.rootPath} (${String(existCount)}/${String(totalCount)} subdirs)`\n );\n if (!allExist) {\n const missing = check.subdirectories.filter((d) => !d.exists);\n for (const dir of missing) {\n writeLine(` ${colors.dim}Missing: ${dir.name}/${colors.reset}`);\n }\n writeLine(` ${colors.dim}Fix: nexus-agents setup${colors.reset}`);\n }\n if (!allWritable) {\n const readonly_ = check.subdirectories.filter((d) => d.exists && !d.writable);\n for (const dir of readonly_) {\n writeLine(` ${colors.yellow}Not writable: ${dir.name}/${colors.reset}`);\n }\n }\n } else {\n writeLine(\n `${formatStatus(false, true)} Data directory: ${colors.yellow}Not created${colors.reset}`\n );\n writeLine(` ${colors.dim}Run: nexus-agents setup${colors.reset}`);\n }\n}\n\nfunction printSandboxHeader(check: DoctorResult['sandbox']): void {\n if (check.active) {\n writeLine(`${formatStatus(true)} Sandbox flavor: ${check.flavor ?? '(unknown)'}`);\n writeLine(` ${colors.dim}NEXUS_SANDBOX_ROOT: ${check.root ?? '(unset)'}${colors.reset}`);\n return;\n }\n writeLine(\n `${formatStatus(false, true)} Container detected (${check.heuristicMatch ?? 'unknown'}) but ${colors.yellow}NEXUS_SANDBOX is unset${colors.reset}`\n );\n writeLine(\n ` ${colors.dim}Set NEXUS_SANDBOX=<flavor> in the image to opt into sandbox-aware behaviour.${colors.reset}`\n );\n}\n\nfunction printSandboxWarnings(check: DoctorResult['sandbox']): void {\n if (check.mismatch && check.active) {\n writeLine(\n ` ${colors.yellow}Mismatch: NEXUS_SANDBOX is set but no container heuristic matched (heuristic=${String(check.heuristicMatch)}).${colors.reset}`\n );\n }\n if (check.dataDirInsideRepo) {\n writeLine(\n ` ${colors.yellow}NEXUS_DATA_DIR resolves inside a single repo subfolder of NEXUS_SANDBOX_ROOT — state will be lost when switching repos. Set NEXUS_DATA_DIR at the multi-repo root.${colors.reset}`\n );\n }\n}\n\n/**\n * Prints the sandbox-awareness section (#2501). Section is suppressed when\n * neither the explicit signal nor the heuristic indicates a sandbox.\n */\nfunction printSandbox(check: DoctorResult['sandbox']): void {\n const heuristicSaysContainer =\n check.heuristicMatch === 'docker' || check.heuristicMatch === 'podman';\n if (!check.active && !heuristicSaysContainer) {\n return;\n }\n writeLine(`${colors.cyan}Checking sandbox awareness...${colors.reset}`);\n writeLine('');\n printSandboxHeader(check);\n printSandboxWarnings(check);\n writeLine('');\n}\n\n/** Prints the summary line with issue count. */\nfunction printDoctorSummary(result: DoctorResult): void {\n const unhealthyCount = result.clis.filter((c) => !c.installed || !c.authenticated).length;\n const nodeIssue = result.nodeVersion.supported ? 0 : 1;\n const totalIssues = unhealthyCount + nodeIssue + (result.mcpServerReady ? 0 : 1);\n const summary = result.allHealthy\n ? `${colors.green}${colors.bold}Status: Ready${colors.reset}`\n : `${colors.yellow}${colors.bold}Summary: ${String(totalIssues)} issue(s) found${colors.reset}`;\n writeLine(summary);\n writeLine('');\n}\n\n/**\n * Prints the doctor results to stdout.\n */\nexport function printDoctorResults(result: DoctorResult): void {\n writeLine('');\n writeLine(`${colors.bold}Nexus Agents Doctor${colors.reset}`);\n writeLine('===================');\n writeLine('');\n\n writeLine(`${colors.cyan}Checking environment...${colors.reset}`);\n writeLine('');\n printNodeVersionCheck(result.nodeVersion);\n printApiKeysCheck(result.apiKeys);\n printConfigFileCheck(result.configFile);\n writeLine('');\n\n writeLine(`${colors.cyan}Checking CLI installations...${colors.reset}`);\n writeLine('');\n for (const cli of result.clis) {\n printCliResult(cli);\n }\n\n writeLine(`${colors.cyan}Checking MCP configuration...${colors.reset}`);\n writeLine('');\n writeLine(\n `${formatStatus(result.mcpServerReady)} MCP Server mode: ${result.mcpServerReady ? 'Ready' : 'Not ready'}`\n );\n writeLine(\n `${formatStatus(result.mcpClientReady)} MCP Client mode: ${result.mcpClientReady ? 'Ready (Codex mcp-server)' : 'Not ready (Codex not installed)'}`\n );\n writeLine('');\n\n writeLine(`${colors.cyan}Checking capabilities...${colors.reset}`);\n writeLine('');\n printCapabilities(result.clis);\n writeLine('');\n\n writeLine(`${colors.cyan}Checking model registry...${colors.reset}`);\n writeLine('');\n printRegistryAdvisory(result.registryAdvisory);\n writeLine('');\n\n writeLine(`${colors.cyan}Checking learning subsystem...${colors.reset}`);\n writeLine('');\n printLearningPersistence(result.learningPersistence);\n writeLine('');\n\n writeLine(`${colors.cyan}Checking data storage...${colors.reset}`);\n writeLine('');\n printSqliteCheck(result.sqliteCheck);\n printDataDirectory(result.dataDirectory);\n writeLine('');\n\n printSandbox(result.sandbox);\n\n printHarnessAlignment(result.harnessAlignment);\n\n printDoctorSummary(result);\n}\n\n/**\n * Prints harness-alignment status (#2805 Phase 3). Shows which harness\n * config files are present and whether they redirect to AGENTS.md per\n * the option-B federation contract.\n */\nfunction printHarnessAlignment(check: DoctorResult['harnessAlignment']): void {\n writeLine(`${colors.cyan}Checking agent-harness alignment...${colors.reset}`);\n writeLine('');\n\n writeLine(\n `${formatStatus(check.agentsMdExists)} AGENTS.md: ${check.agentsMdExists ? 'present (federated surface)' : 'MISSING — federation invariant broken'}`\n );\n\n for (const f of check.files) {\n if (!f.exists) {\n writeLine(` ${colors.gray}○${colors.reset} ${f.harness}: not present (${f.path})`);\n continue;\n }\n if (f.error !== null) {\n writeLine(` ${colors.red}✗${colors.reset} ${f.harness}: ${f.error}`);\n continue;\n }\n if (f.redirectsToAgentsMd) {\n writeLine(` ${colors.green}✓${colors.reset} ${f.harness}: aligned (${f.path})`);\n } else {\n writeLine(\n ` ${colors.yellow}⚠${colors.reset} ${f.harness}: drift — ${f.path} exists but does NOT mention AGENTS.md`\n );\n }\n }\n\n writeLine('');\n writeLine(\n ` Summary: ${String(check.alignedCount)} aligned, ${String(check.driftCount)} drift, ${String(check.missingCount)} absent`\n );\n if (check.driftCount > 0) {\n writeLine(\n ` ${colors.yellow}Drift detected.${colors.reset} Per docs/architecture/AGENT_COMPATIBILITY.md, harness configs must redirect to AGENTS.md — never duplicate content.`\n );\n }\n writeLine('');\n}\n","/**\n * nexus-agents doctor — harness-alignment sub-check.\n *\n * Phase 3 of #2805 (option B federation of #2764). Walks the\n * harness-specific config files in the current working directory and\n * reports whether each one redirects to AGENTS.md (aligned), exists\n * with non-redirect content (drift), or is absent (missing).\n *\n * \"Aligned\" means the file mentions AGENTS.md somewhere in its content.\n * That's intentionally loose — we don't try to parse Cursor MDC frontmatter\n * or Aider YAML semantics; the federation invariant is \"the file points\n * at AGENTS.md, never duplicates content.\" A grep for the literal string\n * is the right granularity.\n *\n * @module cli/doctor-harness-alignment\n * (Source: #2805 / #2764)\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/** Per-harness alignment status. */\nexport interface HarnessFileStatus {\n /** Human label, e.g. \"Cursor\". */\n readonly harness: string;\n /** Repo-relative path to the discovery file. */\n readonly path: string;\n /** True if the file exists on disk. */\n readonly exists: boolean;\n /** True if the file's content mentions `AGENTS.md` (the federation invariant). */\n readonly redirectsToAgentsMd: boolean;\n /** First read/stat error encountered, if any. */\n readonly error: string | null;\n}\n\n/** Aggregated harness-alignment health. */\nexport interface HarnessAlignmentCheck {\n /** True iff AGENTS.md is the federated surface (canonical doc exists). */\n readonly agentsMdExists: boolean;\n /** Per-harness rows. */\n readonly files: readonly HarnessFileStatus[];\n /** Count of harnesses with a properly-redirected config. */\n readonly alignedCount: number;\n /** Count of harnesses with a config file that exists but doesn't redirect (drift). */\n readonly driftCount: number;\n /** Count of harnesses with no config file (acceptable; harness not in use). */\n readonly missingCount: number;\n}\n\n/**\n * Each harness's expected discovery file. Order matches the compatibility\n * matrix in `docs/architecture/AGENT_COMPATIBILITY.md`.\n */\nconst HARNESS_FILES: ReadonlyArray<{ harness: string; path: string }> = [\n { harness: 'Cursor', path: '.cursor/rules/agents.mdc' },\n { harness: 'Windsurf', path: '.windsurf/rules/agents.md' },\n { harness: 'Aider', path: '.aider.conf.yml' },\n { harness: 'Continue', path: '.continue/rules/agents.md' },\n { harness: 'Cline', path: '.clinerules/agents.md' },\n];\n\n/**\n * Walk every known harness discovery file at the given root (defaults\n * to `process.cwd()`) and report alignment status.\n */\nexport function checkHarnessAlignment(cwd: string = process.cwd()): HarnessAlignmentCheck {\n const agentsMdPath = join(cwd, 'AGENTS.md');\n const agentsMdExists = existsSync(agentsMdPath);\n\n const files: HarnessFileStatus[] = HARNESS_FILES.map(({ harness, path }) =>\n inspectFile(harness, path, join(cwd, path))\n );\n\n const alignedCount = files.filter((f) => f.exists && f.redirectsToAgentsMd).length;\n const driftCount = files.filter((f) => f.exists && !f.redirectsToAgentsMd).length;\n const missingCount = files.filter((f) => !f.exists).length;\n\n return {\n agentsMdExists,\n files,\n alignedCount,\n driftCount,\n missingCount,\n };\n}\n\nfunction inspectFile(\n harness: string,\n relativePath: string,\n absolutePath: string\n): HarnessFileStatus {\n if (!existsSync(absolutePath)) {\n return {\n harness,\n path: relativePath,\n exists: false,\n redirectsToAgentsMd: false,\n error: null,\n };\n }\n try {\n const content = readFileSync(absolutePath, 'utf-8');\n return {\n harness,\n path: relativePath,\n exists: true,\n redirectsToAgentsMd: content.includes('AGENTS.md'),\n error: null,\n };\n } catch (error: unknown) {\n return {\n harness,\n path: relativePath,\n exists: true,\n redirectsToAgentsMd: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","logger","yaml","z","z","logger","existsSync","join","existsSync","readFileSync","join","err","logger","existsSync","readFileSync","join","REQUIRED_NODE_MAJOR","existsSync","readFileSync","join","writeLine","join","existsSync"]}
|
package/dist/cli.js
CHANGED
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
import {
|
|
23
23
|
setupCommandAsync,
|
|
24
24
|
verifyCommand
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-YMMYYAZT.js";
|
|
26
26
|
import "./chunk-YXWGEIQR.js";
|
|
27
27
|
import {
|
|
28
28
|
AuthHandler,
|
|
@@ -153,7 +153,7 @@ import {
|
|
|
153
153
|
validateCommand,
|
|
154
154
|
validateWorkflow,
|
|
155
155
|
wrapInMarkdownFence
|
|
156
|
-
} from "./chunk-
|
|
156
|
+
} from "./chunk-3ULMVOIF.js";
|
|
157
157
|
import "./chunk-AP2FD37C.js";
|
|
158
158
|
import "./chunk-ED6VQWNG.js";
|
|
159
159
|
import {
|
|
@@ -221,7 +221,7 @@ import {
|
|
|
221
221
|
loadConfig,
|
|
222
222
|
runDoctor,
|
|
223
223
|
validateNexusEnv
|
|
224
|
-
} from "./chunk-
|
|
224
|
+
} from "./chunk-ZI6G7U7Y.js";
|
|
225
225
|
import "./chunk-KT5FIBWS.js";
|
|
226
226
|
import {
|
|
227
227
|
DEFAULTS
|
package/dist/index.js
CHANGED
|
@@ -518,7 +518,7 @@ import {
|
|
|
518
518
|
validateWorkflow,
|
|
519
519
|
validateWorkflowDependencies,
|
|
520
520
|
withLogging
|
|
521
|
-
} from "./chunk-
|
|
521
|
+
} from "./chunk-3ULMVOIF.js";
|
|
522
522
|
import "./chunk-AP2FD37C.js";
|
|
523
523
|
import {
|
|
524
524
|
SharedMemoryStore
|
|
@@ -749,7 +749,7 @@ import {
|
|
|
749
749
|
resolveFallback,
|
|
750
750
|
startStdioServer,
|
|
751
751
|
validateNexusEnv
|
|
752
|
-
} from "./chunk-
|
|
752
|
+
} from "./chunk-ZI6G7U7Y.js";
|
|
753
753
|
import {
|
|
754
754
|
AvailableModelsCache,
|
|
755
755
|
getDefaultAvailableModelsCache,
|
|
@@ -7,9 +7,9 @@ import {
|
|
|
7
7
|
runWizard,
|
|
8
8
|
setupCommand,
|
|
9
9
|
setupCommandAsync
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-YMMYYAZT.js";
|
|
11
11
|
import "./chunk-YXWGEIQR.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-ZI6G7U7Y.js";
|
|
13
13
|
import "./chunk-KT5FIBWS.js";
|
|
14
14
|
import "./chunk-HYU4GZY6.js";
|
|
15
15
|
import "./chunk-NUBSJGQZ.js";
|
|
@@ -30,4 +30,4 @@ export {
|
|
|
30
30
|
setupCommand,
|
|
31
31
|
setupCommandAsync
|
|
32
32
|
};
|
|
33
|
-
//# sourceMappingURL=setup-command-
|
|
33
|
+
//# sourceMappingURL=setup-command-R4BOEMLZ.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nexus-agents",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.79.0",
|
|
4
4
|
"description": "Intelligent orchestration platform for AI coding tools — routes tasks to the best model, learns from outcomes, and enforces quality through multi-model consensus",
|
|
5
5
|
"mcpName": "io.github.williamzujkowski/nexus-agents",
|
|
6
6
|
"license": "MIT",
|