{"version":3,"sources":["../src/onboarding/settings.ts","../src/providers/claude-max.ts","../src/providers/github-copilot.ts","../src/providers/openai-codex.ts","../src/agents/model.ts","../src/onboarding/packs.ts","../src/tui/theme.ts","../src/utils/thread-lock.ts"],"names":["join","getAppDataDir","existsSync","readFileSync","writeFileSync","dirname","mkdirSync","AuthStorage","anthropic","createAnthropic","wrapLanguageModel","authStorageInstance","getAuthStorage","setAuthStorage","COPILOT_HEADERS","getGitHubCopilotBaseUrl","GoogleSchemaCompatLayer","applyCompatLayer","createOpenAICompatible","fetchCopilotModels","openai","createOpenAI","ModelRouterLanguageModel","GATEWAY_AUTH_HEADER","MastraGateway","bg","chalk","p","q","path","fs"],"mappings":"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","file":"chunk-QJKDPMZA.cjs","sourcesContent":["/**\n * Persistent global settings stored in the app data directory as settings.json.\n * This file persists onboarding state AND user preferences (model choices, yolo, etc.)\n * so they carry across threads and restarts.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { MastraBrowser } from '@mastra/core/browser';\nimport type { LSPConfig } from '@mastra/core/workspace';\nimport { getAppDataDir } from '../utils/project.js';\n\n/** A saved custom pack — user-defined model selections for each mode. */\nexport interface CustomPack {\n  name: string;\n  models: Record<string, string>;\n  createdAt: string;\n}\n\n/** A saved custom provider for OpenAI-compatible endpoints. */\nexport interface CustomProviderSetting {\n  name: string;\n  url: string;\n  apiKey?: string;\n  models: string[];\n}\n\n/** Storage backend type. */\nexport type StorageBackend = 'libsql' | 'pg';\n\n/** LibSQL-specific storage settings. */\nexport interface LibSQLStorageSettings {\n  url?: string;\n  authToken?: string;\n}\n\n/** PostgreSQL-specific storage settings. */\nexport interface PgStorageSettings {\n  connectionString?: string;\n  host?: string;\n  port?: number;\n  database?: string;\n  user?: string;\n  password?: string;\n  schemaName?: string;\n  disableInit?: boolean;\n  skipDefaultIndexes?: boolean;\n}\n\n/** Storage configuration persisted in global settings. */\nexport interface StorageSettings {\n  /** Which backend to use. Default: 'libsql'. */\n  backend: StorageBackend;\n  /** LibSQL-specific config (used when backend is 'libsql'). */\n  libsql: LibSQLStorageSettings;\n  /** PostgreSQL-specific config (used when backend is 'pg'). */\n  pg: PgStorageSettings;\n}\n\n/** Memory gateway provider key used in AuthStorage. */\nexport const MEMORY_GATEWAY_PROVIDER = 'mastra-gateway';\n\n/** Default gateway URL. */\nexport const MEMORY_GATEWAY_DEFAULT_URL = 'https://gateway-api.mastra.ai';\n\n/** Valid persisted thinking level values. */\nexport type ThinkingLevelSetting = 'off' | 'low' | 'medium' | 'high' | 'xhigh';\n\n/** Browser provider type. */\nexport type BrowserProvider = 'stagehand' | 'agent-browser';\n\n/** Stagehand environment type. */\nexport type StagehandEnv = 'LOCAL' | 'BROWSERBASE';\n\n/** Stagehand-specific browser settings. */\nexport interface StagehandSettings {\n  env: StagehandEnv;\n  apiKey?: string;\n  projectId?: string;\n  /** Whether to preserve the user data directory after the browser closes. */\n  preserveUserDataDir?: boolean;\n}\n\n/** AgentBrowser-specific browser settings. */\nexport interface AgentBrowserSettings {\n  /** Path to a Playwright storage state file (JSON) containing cookies and localStorage. */\n  storageState?: string;\n}\n\n/** Browser configuration persisted in global settings. */\nexport interface BrowserSettings {\n  /** Whether browser automation is enabled. */\n  enabled: boolean;\n  /** Which browser provider to use. */\n  provider: BrowserProvider;\n  /** Whether to run headless (no visible browser window). */\n  headless: boolean;\n  /** Browser viewport dimensions. */\n  viewport?: { width: number; height: number };\n  /** CDP URL for connecting to an existing browser. */\n  cdpUrl?: string;\n  /** Path to a Chrome/Chromium user data directory (profile). */\n  profile?: string;\n  /** Path to the browser executable to use. */\n  executablePath?: string;\n  /** Browser scope — 'shared' (all threads share one browser) or 'thread' (each thread gets its own). */\n  scope?: 'shared' | 'thread';\n  /** Stagehand-specific settings. */\n  stagehand?: StagehandSettings;\n  /** AgentBrowser-specific settings. */\n  agentBrowser?: AgentBrowserSettings;\n}\n\nexport interface GlobalSettings {\n  // Onboarding tracking\n  onboarding: {\n    completedAt: string | null;\n    skippedAt: string | null;\n    version: number;\n    modePackId: string | null;\n    omPackId: string | null;\n    quietModePreferenceSelected: boolean;\n  };\n  // Global model preferences (applied to new threads)\n  models: {\n    /**\n     * Active model pack ID. Built-in packs use their id directly (\"anthropic\",\n     * \"openai\"). Custom packs use \"custom:<name>\".\n     * When set, models are resolved from the pack at startup so pack updates\n     * (e.g. new model versions) apply automatically.\n     * Cleared when the user manually overrides via /models (falls back to modeDefaults).\n     */\n    activeModelPackId: string | null;\n    /** Explicit per-mode overrides — used when no activeModelPackId is set. */\n    modeDefaults: Record<string, string>;\n    /**\n     * Active OM pack ID (e.g. \"gemini\", \"anthropic\", \"custom\").\n     * When set, the OM model is resolved from the pack at startup so pack\n     * updates (e.g. new model versions) apply automatically.\n     * Cleared when the user manually overrides via /om (falls back to omModelOverride).\n     */\n    activeOmPackId: string | null;\n    /**\n     * Shared OM model override — used for both observer and reflector when a\n     * role-specific override is not set. Kept for back-compat with older settings\n     * files and set by onboarding when the user picks a custom OM pack.\n     */\n    omModelOverride: string | null;\n    /**\n     * Explicit Observer model override — takes precedence over `omModelOverride`\n     * when set. Written by `/om` when the observer model is changed independently.\n     */\n    observerModelOverride: string | null;\n    /**\n     * Explicit Reflector model override — takes precedence over `omModelOverride`\n     * when set. Written by `/om` when the reflector model is changed independently.\n     */\n    reflectorModelOverride: string | null;\n    /** Default OM observation threshold used for new threads unless overridden per-thread. */\n    omObservationThreshold: number | null;\n    /** Default OM reflection threshold used for new threads unless overridden per-thread. */\n    omReflectionThreshold: number | null;\n    /**\n     * Whether observations and reflections use the terse caveman-style instruction.\n     * `null` means inherit the built-in default (currently `false` — caveman is\n     * opt-in via `/om` settings). Used as the default for new threads unless\n     * overridden per-thread.\n     */\n    omCavemanObservations: boolean | null;\n    /**\n     * Whether Observational Memory forwards image/file attachment parts to the\n     * Observer LLM. `null` ⇒ inherit built-in default ('auto'). 'auto' checks\n     * model capabilities; true/false forces the setting.\n     */\n    omObserveAttachments: 'auto' | boolean | null;\n    /** Per-agent-type subagent model overrides (e.g. { explore: \"openai/gpt-5.1-codex-mini\" }) */\n    subagentModels: Record<string, string>;\n    /** Default judge model for /goal. */\n    goalJudgeModel: string | null;\n    /** Default max attempts for /goal. */\n    goalMaxTurns: number | null;\n  };\n  // Global behavior preferences\n  preferences: {\n    yolo: boolean | null;\n    theme: 'auto' | 'dark' | 'light';\n    /** Default reasoning effort level used for all threads/models unless overridden in-session. */\n    thinkingLevel: ThinkingLevelSetting;\n    /** When true, components like subagent output collapse to compact summaries on completion. */\n    quietMode: boolean;\n    /** Maximum quiet-mode detail preview lines for compact tool calls. Set to 0 to hide previews. */\n    quietModeMaxToolPreviewLines: number;\n  };\n  // Storage backend configuration\n  storage: StorageSettings;\n  // User-created custom model packs\n  customModelPacks: CustomPack[];\n  // User-created custom providers with custom models\n  customProviders: CustomProviderSetting[];\n  // Model usage counts for ranking in the selector\n  modelUseCounts: Record<string, number>;\n  // Version the user dismissed the update prompt for (skip until they manually update past this)\n  updateDismissedVersion: string | null;\n  // Memory gateway configuration\n  memoryGateway: { baseUrl?: string };\n  // LSP configuration forwarded to the workspace\n  lsp?: LSPConfig;\n  // Browser automation configuration\n  browser: BrowserSettings;\n  // Signal routing configuration\n  signals: SignalSettings;\n  // Cloud observability configuration (per-resource project IDs; tokens stored in auth.json)\n  observability: ObservabilitySettings;\n}\n\nexport interface SignalSettings {\n  /** Opt into local Unix socket PubSub for cross-process signal routing. */\n  unixSocketPubSub: boolean;\n}\n\nexport interface ObservabilityResourceConfig {\n  /** Cloud project ID for this resource */\n  projectId: string;\n  /** When this config was created */\n  configuredAt: string;\n}\n\nexport interface ObservabilitySettings {\n  /** Per-resource cloud project configs, keyed by resourceId */\n  resources: Record<string, ObservabilityResourceConfig>;\n  /** Whether to store traces locally in DuckDB. Off by default to avoid disk usage. */\n  localTracing: boolean;\n}\n\n/** Auth key prefix for observability tokens stored per-resource in auth.json */\nexport const OBSERVABILITY_AUTH_PREFIX = 'observability:';\n\nexport const STORAGE_DEFAULTS: StorageSettings = {\n  backend: 'libsql',\n  libsql: {},\n  pg: {},\n};\n\nconst DEFAULTS: GlobalSettings = {\n  onboarding: {\n    completedAt: null,\n    skippedAt: null,\n    version: 0,\n    modePackId: null,\n    omPackId: null,\n    quietModePreferenceSelected: true,\n  },\n  models: {\n    activeModelPackId: null,\n    modeDefaults: {},\n    activeOmPackId: null,\n    omModelOverride: null,\n    observerModelOverride: null,\n    reflectorModelOverride: null,\n    omObservationThreshold: null,\n    omReflectionThreshold: null,\n    omCavemanObservations: null,\n    omObserveAttachments: null,\n    subagentModels: {},\n    goalJudgeModel: null,\n    goalMaxTurns: null,\n  },\n  preferences: {\n    yolo: null,\n    theme: 'auto',\n    thinkingLevel: 'off',\n    quietMode: false,\n    quietModeMaxToolPreviewLines: 2,\n  },\n  storage: { ...STORAGE_DEFAULTS },\n  customModelPacks: [],\n  customProviders: [],\n  modelUseCounts: {},\n  updateDismissedVersion: null,\n  memoryGateway: {},\n  lsp: {},\n  browser: {\n    enabled: false,\n    provider: 'stagehand',\n    headless: false,\n    viewport: { width: 1280, height: 720 },\n    stagehand: { env: 'LOCAL' },\n  },\n  signals: { unixSocketPubSub: false },\n  observability: { resources: {}, localTracing: false },\n};\n\nconst THINKING_LEVEL_VALUES: ThinkingLevelSetting[] = ['off', 'low', 'medium', 'high', 'xhigh'];\nconst QUIET_MODE_MAX_TOOL_PREVIEW_LINES_MAX = 8;\n\nfunction parseThinkingLevel(value: unknown): ThinkingLevelSetting {\n  return typeof value === 'string' && THINKING_LEVEL_VALUES.includes(value as ThinkingLevelSetting)\n    ? (value as ThinkingLevelSetting)\n    : DEFAULTS.preferences.thinkingLevel;\n}\n\nfunction parseQuietModeMaxToolPreviewLines(value: unknown): number {\n  const rawValue =\n    typeof value === 'number' && Number.isFinite(value) ? value : DEFAULTS.preferences.quietModeMaxToolPreviewLines;\n  return Math.min(QUIET_MODE_MAX_TOOL_PREVIEW_LINES_MAX, Math.max(0, Math.floor(rawValue)));\n}\n\nfunction parsePreferences(rawPreferences: unknown): GlobalSettings['preferences'] {\n  const raw = rawPreferences && typeof rawPreferences === 'object' ? (rawPreferences as Record<string, unknown>) : {};\n\n  return {\n    ...DEFAULTS.preferences,\n    ...raw,\n    thinkingLevel: parseThinkingLevel(raw.thinkingLevel),\n    quietModeMaxToolPreviewLines: parseQuietModeMaxToolPreviewLines(raw.quietModeMaxToolPreviewLines),\n  };\n}\n\nfunction hasQuietModePreferenceSelected(rawOnboarding: unknown): boolean {\n  return Boolean(\n    rawOnboarding &&\n    typeof rawOnboarding === 'object' &&\n    Object.prototype.hasOwnProperty.call(rawOnboarding, 'quietModePreferenceSelected'),\n  );\n}\n\nfunction applyQuietModePreferenceRollout(settings: GlobalSettings, rawOnboarding: unknown): void {\n  if (hasQuietModePreferenceSelected(rawOnboarding)) return;\n  settings.onboarding.quietModePreferenceSelected = settings.preferences.quietMode === true;\n}\n\nfunction getNewInstallDefaults(): GlobalSettings {\n  const settings = structuredClone(DEFAULTS);\n  settings.preferences.quietMode = true;\n  settings.onboarding.quietModePreferenceSelected = true;\n  return settings;\n}\n\nexport function getSettingsPath(): string {\n  return join(getAppDataDir(), 'settings.json');\n}\n\nexport function getCustomProviderId(name: string): string {\n  const slug = name\n    .trim()\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, '-')\n    .replace(/^-+|-+$/g, '');\n  return slug || 'provider';\n}\n\nexport function toCustomProviderModelId(providerName: string, modelName: string): string {\n  const providerId = getCustomProviderId(providerName);\n  const trimmedModelName = modelName.trim();\n  const providerPrefix = `${providerId}/`;\n  if (trimmedModelName.startsWith(providerPrefix)) {\n    return trimmedModelName;\n  }\n  return `${providerId}/${trimmedModelName}`;\n}\n\nexport function parseCustomProviders(rawProviders: unknown): CustomProviderSetting[] {\n  if (!Array.isArray(rawProviders)) return [];\n\n  const parsedProviders: CustomProviderSetting[] = [];\n  for (const rawProvider of rawProviders) {\n    if (!rawProvider || typeof rawProvider !== 'object') continue;\n\n    const candidate = rawProvider as Record<string, unknown>;\n    const name = typeof candidate.name === 'string' ? candidate.name.trim() : '';\n    const url = typeof candidate.url === 'string' ? candidate.url.trim() : '';\n    if (!name || !url) continue;\n\n    const providerId = getCustomProviderId(name);\n    const models = Array.isArray(candidate.models)\n      ? [\n          ...new Set(\n            candidate.models\n              .filter((model): model is string => typeof model === 'string')\n              .map(model => model.trim())\n              .map(model => {\n                const providerPrefix = `${providerId}/`;\n                if (model.startsWith(providerPrefix)) {\n                  return model.slice(providerPrefix.length);\n                }\n                return model;\n              }),\n          ),\n        ].filter(model => model.length > 0)\n      : [];\n\n    const apiKey =\n      typeof candidate.apiKey === 'string' && candidate.apiKey.trim().length > 0 ? candidate.apiKey.trim() : undefined;\n\n    parsedProviders.push({\n      name,\n      url,\n      ...(apiKey ? { apiKey } : {}),\n      models,\n    });\n  }\n\n  return parsedProviders;\n}\n\nconst BROWSER_PROVIDERS = new Set<BrowserProvider>(['stagehand', 'agent-browser']);\nconst STAGEHAND_ENVS = new Set<StagehandEnv>(['LOCAL', 'BROWSERBASE']);\n\n/**\n * Deep-merge and validate browser settings from JSON.\n * Explicitly validates types to handle malformed settings.json gracefully.\n */\nfunction parseBrowserSettings(rawBrowser: unknown): BrowserSettings {\n  const raw = rawBrowser && typeof rawBrowser === 'object' ? (rawBrowser as Record<string, unknown>) : {};\n  const rawViewport = raw.viewport && typeof raw.viewport === 'object' ? (raw.viewport as Record<string, unknown>) : {};\n  const rawStagehand =\n    raw.stagehand && typeof raw.stagehand === 'object' ? (raw.stagehand as Record<string, unknown>) : {};\n  const rawAgentBrowser =\n    raw.agentBrowser && typeof raw.agentBrowser === 'object' ? (raw.agentBrowser as Record<string, unknown>) : {};\n\n  return {\n    enabled: typeof raw.enabled === 'boolean' ? raw.enabled : DEFAULTS.browser.enabled,\n    provider:\n      typeof raw.provider === 'string' && BROWSER_PROVIDERS.has(raw.provider as BrowserProvider)\n        ? (raw.provider as BrowserProvider)\n        : DEFAULTS.browser.provider,\n    headless: typeof raw.headless === 'boolean' ? raw.headless : DEFAULTS.browser.headless,\n    cdpUrl: typeof raw.cdpUrl === 'string' && raw.cdpUrl.trim() ? raw.cdpUrl.trim() : undefined,\n    profile: typeof raw.profile === 'string' && raw.profile.trim() ? raw.profile.trim() : undefined,\n    executablePath:\n      typeof raw.executablePath === 'string' && raw.executablePath.trim() ? raw.executablePath.trim() : undefined,\n    viewport: {\n      width: typeof rawViewport.width === 'number' ? rawViewport.width : DEFAULTS.browser.viewport!.width,\n      height: typeof rawViewport.height === 'number' ? rawViewport.height : DEFAULTS.browser.viewport!.height,\n    },\n    scope: typeof raw.scope === 'string' && (raw.scope === 'shared' || raw.scope === 'thread') ? raw.scope : undefined,\n    stagehand: {\n      env:\n        typeof rawStagehand.env === 'string' && STAGEHAND_ENVS.has(rawStagehand.env as StagehandEnv)\n          ? (rawStagehand.env as StagehandEnv)\n          : DEFAULTS.browser.stagehand!.env,\n      ...(typeof rawStagehand.apiKey === 'string' && rawStagehand.apiKey.trim()\n        ? { apiKey: rawStagehand.apiKey.trim() }\n        : {}),\n      ...(typeof rawStagehand.projectId === 'string' && rawStagehand.projectId.trim()\n        ? { projectId: rawStagehand.projectId.trim() }\n        : {}),\n      ...(typeof rawStagehand.preserveUserDataDir === 'boolean'\n        ? { preserveUserDataDir: rawStagehand.preserveUserDataDir }\n        : {}),\n    },\n    agentBrowser:\n      typeof rawAgentBrowser.storageState === 'string' && rawAgentBrowser.storageState.trim()\n        ? { storageState: rawAgentBrowser.storageState.trim() }\n        : undefined,\n  };\n}\n\nconst VALID_PROJECT_ID = /^[a-zA-Z0-9_-]+$/;\n\nfunction parseObservabilitySettings(raw: unknown): ObservabilitySettings {\n  if (!raw || typeof raw !== 'object') return { resources: {}, localTracing: false };\n  const obj = raw as Record<string, unknown>;\n  const localTracing = obj.localTracing === true;\n  const rawResources = obj.resources;\n  if (!rawResources || typeof rawResources !== 'object') return { resources: {}, localTracing };\n  const resources: Record<string, ObservabilityResourceConfig> = {};\n  for (const [key, val] of Object.entries(rawResources as Record<string, unknown>)) {\n    if (val && typeof val === 'object') {\n      const v = val as Record<string, unknown>;\n      if (typeof v.projectId === 'string' && VALID_PROJECT_ID.test(v.projectId)) {\n        resources[key] = {\n          projectId: v.projectId,\n          configuredAt: typeof v.configuredAt === 'string' ? v.configuredAt : new Date().toISOString(),\n        };\n      }\n    }\n  }\n  return { resources, localTracing };\n}\n\n/**\n * One-time migration: move model-related data from auth.json to settings.json.\n * Reads `_modelRanks`, `_modeModelId_*`, `_subagentModelId*` from auth.json,\n * merges them into settings, removes them from auth.json, and writes both files.\n * No-ops if auth.json has no _ prefixed model data.\n */\nfunction migrateFromAuth(settingsPath: string): boolean {\n  const authPath = join(getAppDataDir(), 'auth.json');\n  if (!existsSync(authPath)) return false;\n\n  let authData: Record<string, any>;\n  try {\n    authData = JSON.parse(readFileSync(authPath, 'utf-8'));\n  } catch {\n    return false;\n  }\n\n  const modelKeys = Object.keys(authData).filter(k => k.startsWith('_'));\n  if (modelKeys.length === 0) return false;\n\n  // Load existing settings (or defaults) and merge auth data into it\n  let settings: GlobalSettings;\n  if (existsSync(settingsPath)) {\n    try {\n      const raw = JSON.parse(readFileSync(settingsPath, 'utf-8'));\n      settings = {\n        onboarding: { ...DEFAULTS.onboarding, ...raw.onboarding },\n        models: { ...DEFAULTS.models, ...raw.models },\n        preferences: parsePreferences(raw.preferences),\n        storage: {\n          ...STORAGE_DEFAULTS,\n          ...raw.storage,\n          libsql: { ...STORAGE_DEFAULTS.libsql, ...raw.storage?.libsql },\n          pg: { ...STORAGE_DEFAULTS.pg, ...raw.storage?.pg },\n        },\n        customModelPacks: Array.isArray(raw.customModelPacks) ? raw.customModelPacks : [],\n        customProviders: parseCustomProviders(raw.customProviders),\n        modelUseCounts: raw.modelUseCounts && typeof raw.modelUseCounts === 'object' ? raw.modelUseCounts : {},\n        updateDismissedVersion: typeof raw.updateDismissedVersion === 'string' ? raw.updateDismissedVersion : null,\n        memoryGateway: raw.memoryGateway && typeof raw.memoryGateway === 'object' ? raw.memoryGateway : {},\n        lsp: raw.lsp && typeof raw.lsp === 'object' ? (raw.lsp as LSPConfig) : undefined,\n        browser: parseBrowserSettings(raw.browser),\n        signals: {\n          unixSocketPubSub:\n            raw.signals && typeof raw.signals === 'object' && typeof raw.signals.unixSocketPubSub === 'boolean'\n              ? raw.signals.unixSocketPubSub\n              : DEFAULTS.signals.unixSocketPubSub,\n        },\n        observability: parseObservabilitySettings(raw.observability),\n      };\n      applyQuietModePreferenceRollout(settings, raw.onboarding);\n    } catch {\n      settings = structuredClone(DEFAULTS);\n    }\n  } else {\n    settings = structuredClone(DEFAULTS);\n  }\n\n  // Migrate model use counts (only if settings doesn't already have them)\n  if (authData._modelRanks && typeof authData._modelRanks === 'object') {\n    settings.modelUseCounts = { ...authData._modelRanks, ...settings.modelUseCounts };\n  }\n\n  // Migrate per-mode model defaults (don't overwrite existing settings)\n  for (const key of modelKeys) {\n    const modeMatch = key.match(/^_modeModelId_(.+)$/);\n    if (modeMatch?.[1] && typeof authData[key] === 'string' && !settings.models.modeDefaults[modeMatch[1]]) {\n      settings.models.modeDefaults[modeMatch[1]] = authData[key];\n    }\n  }\n\n  // Migrate subagent models (don't overwrite existing settings)\n  for (const key of modelKeys) {\n    if (key === '_subagentModelId' && typeof authData[key] === 'string' && !settings.models.subagentModels['default']) {\n      settings.models.subagentModels['default'] = authData[key];\n    }\n    const saMatch = key.match(/^_subagentModelId_(.+)$/);\n    if (saMatch?.[1] && typeof authData[key] === 'string' && !settings.models.subagentModels[saMatch[1]]) {\n      settings.models.subagentModels[saMatch[1]] = authData[key];\n    }\n  }\n\n  // Write migrated settings\n  saveSettings(settings, settingsPath);\n\n  // Clean up auth.json — remove _ prefixed keys\n  for (const key of modelKeys) {\n    delete authData[key];\n  }\n  try {\n    writeFileSync(authPath, JSON.stringify(authData, null, 2), 'utf-8');\n  } catch {\n    // Non-fatal — settings are saved, auth cleanup can fail\n  }\n\n  return true;\n}\n\nconst LEGACY_VARIED_MODELS: Record<string, string> = {\n  plan: 'openai/gpt-5.4',\n  build: 'anthropic/claude-sonnet-4-5',\n  fast: 'anthropic/claude-haiku-4-5',\n};\n\nexport function migrateLegacyVariedPack(settings: GlobalSettings): boolean {\n  const legacyPackId = 'varied';\n  const customPackId = 'custom:varied';\n  const hasLegacyReference =\n    settings.models.activeModelPackId === legacyPackId || settings.onboarding.modePackId === legacyPackId;\n\n  if (!hasLegacyReference) return false;\n\n  const existingIdx = settings.customModelPacks.findIndex(p => p.name === 'varied');\n  if (existingIdx >= 0) {\n    const existing = settings.customModelPacks[existingIdx]!;\n    const modelsMatch = Object.entries(LEGACY_VARIED_MODELS).every(([k, v]) => existing.models[k] === v);\n    if (!modelsMatch) {\n      existing.models = { ...LEGACY_VARIED_MODELS };\n    }\n  } else {\n    settings.customModelPacks.push({\n      name: 'varied',\n      models: { ...LEGACY_VARIED_MODELS },\n      createdAt: new Date().toISOString(),\n    });\n  }\n\n  if (settings.models.activeModelPackId === legacyPackId) {\n    settings.models.activeModelPackId = customPackId;\n    if (Object.keys(settings.models.modeDefaults).length === 0) {\n      settings.models.modeDefaults = { ...LEGACY_VARIED_MODELS };\n    }\n  }\n\n  if (settings.onboarding.modePackId === legacyPackId) {\n    settings.onboarding.modePackId = customPackId;\n  }\n\n  return true;\n}\n\nexport function loadSettings(filePath: string = getSettingsPath()): GlobalSettings {\n  // One-time migration: move model data from auth.json into settings.json\n  migrateFromAuth(filePath);\n\n  if (!existsSync(filePath)) return getNewInstallDefaults();\n  try {\n    const raw = JSON.parse(readFileSync(filePath, 'utf-8'));\n    // Spread raw first to preserve unknown top-level keys (forward-compatibility),\n    // then overlay with parsed/typed fields so known keys are always correct.\n    const settings: GlobalSettings = {\n      ...raw,\n      onboarding: { ...DEFAULTS.onboarding, ...raw.onboarding },\n      models: { ...DEFAULTS.models, ...raw.models },\n      preferences: parsePreferences(raw.preferences),\n      storage: {\n        ...STORAGE_DEFAULTS,\n        ...raw.storage,\n        libsql: { ...STORAGE_DEFAULTS.libsql, ...raw.storage?.libsql },\n        pg: { ...STORAGE_DEFAULTS.pg, ...raw.storage?.pg },\n      },\n      customModelPacks: Array.isArray(raw.customModelPacks) ? raw.customModelPacks : [],\n      customProviders: parseCustomProviders(raw.customProviders),\n      modelUseCounts: raw.modelUseCounts && typeof raw.modelUseCounts === 'object' ? raw.modelUseCounts : {},\n      updateDismissedVersion: typeof raw.updateDismissedVersion === 'string' ? raw.updateDismissedVersion : null,\n      memoryGateway: raw.memoryGateway && typeof raw.memoryGateway === 'object' ? raw.memoryGateway : {},\n      lsp: raw.lsp && typeof raw.lsp === 'object' ? (raw.lsp as LSPConfig) : undefined,\n      browser: parseBrowserSettings(raw.browser),\n      signals: {\n        unixSocketPubSub:\n          raw.signals && typeof raw.signals === 'object' && typeof raw.signals.unixSocketPubSub === 'boolean'\n            ? raw.signals.unixSocketPubSub\n            : DEFAULTS.signals.unixSocketPubSub,\n      },\n      observability: parseObservabilitySettings(raw.observability),\n    };\n\n    // Migrate legacy omModelId → omModelOverride\n    let settingsChanged = false;\n    if (!hasQuietModePreferenceSelected(raw.onboarding)) {\n      applyQuietModePreferenceRollout(settings, raw.onboarding);\n      settingsChanged = true;\n    }\n    if (raw.models?.omModelId && !settings.models.omModelOverride) {\n      settings.models.omModelOverride = raw.models.omModelId;\n      settingsChanged = true;\n    }\n\n    if (migrateLegacyVariedPack(settings)) {\n      settingsChanged = true;\n    }\n\n    if (settingsChanged) {\n      saveSettings(settings, filePath);\n    }\n\n    return settings;\n  } catch {\n    return structuredClone(DEFAULTS);\n  }\n}\n\nexport const THREAD_ACTIVE_MODEL_PACK_ID_KEY = 'activeModelPackId';\n\nexport interface ThreadSettings {\n  activeModelPackId: string | null;\n  modeModelIds: Record<string, string>;\n}\n\nexport function parseThreadSettings(metadata: Record<string, unknown> | undefined): ThreadSettings {\n  const modeModelIds: Record<string, string> = {};\n  for (const [key, value] of Object.entries(metadata ?? {})) {\n    const modeMatch = key.match(/^modeModelId_(.+)$/);\n    if (modeMatch?.[1] && typeof value === 'string' && value.length > 0) {\n      modeModelIds[modeMatch[1]] = value;\n    }\n  }\n\n  const rawPackId = metadata?.[THREAD_ACTIVE_MODEL_PACK_ID_KEY];\n  const activeModelPackId = typeof rawPackId === 'string' && rawPackId.length > 0 ? rawPackId : null;\n\n  return {\n    activeModelPackId,\n    modeModelIds,\n  };\n}\n\n/**\n * Resolve active model pack id for the current thread.\n *\n * Priority:\n * 1) explicit thread metadata activeModelPackId\n * 2) inferred from thread modeModelId_* values\n * 3) global settings.models.activeModelPackId\n */\nexport function resolveThreadActiveModelPackId(\n  settings: GlobalSettings,\n  builtinPacks: Array<{ id: string; models: Record<string, string> }>,\n  metadata: Record<string, unknown> | undefined,\n): string | null {\n  const threadSettings = parseThreadSettings(metadata);\n\n  const isKnownPack = (packId: string): boolean => {\n    if (packId.startsWith('custom:')) {\n      const name = packId.slice('custom:'.length);\n      return settings.customModelPacks.some(p => p.name === name);\n    }\n    return builtinPacks.some(p => p.id === packId);\n  };\n\n  if (threadSettings.activeModelPackId && isKnownPack(threadSettings.activeModelPackId)) {\n    return threadSettings.activeModelPackId;\n  }\n\n  const allPacks: Array<{ id: string; models: Record<string, string> }> = [\n    ...builtinPacks,\n    ...settings.customModelPacks.map(p => ({ id: `custom:${p.name}`, models: p.models })),\n  ];\n\n  for (const pack of allPacks) {\n    const packEntries = Object.entries(pack.models);\n    const threadEntries = Object.keys(threadSettings.modeModelIds);\n    const matches =\n      packEntries.length === threadEntries.length &&\n      packEntries.every(([modeId, modelId]) => threadSettings.modeModelIds[modeId] === modelId);\n    if (matches) return pack.id;\n  }\n\n  if (settings.models.activeModelPackId && isKnownPack(settings.models.activeModelPackId)) {\n    return settings.models.activeModelPackId;\n  }\n\n  return null;\n}\n\n/**\n * Resolve effective per-mode model defaults.\n *\n * If `activeModelPackId` is set, looks up the pack (built-in or custom) and\n * returns its models. Falls back to the explicit `modeDefaults` map.\n *\n * @param settings  The loaded global settings.\n * @param builtinPacks  Built-in packs for the current provider access\n *                      (from `getAvailableModePacks`). Pass `[]` if unavailable.\n */\nexport function resolveModelDefaults(\n  settings: GlobalSettings,\n  builtinPacks: Array<{ id: string; models: Record<string, string> }>,\n): Record<string, string> {\n  const { activeModelPackId, modeDefaults } = settings.models;\n  if (!activeModelPackId) return modeDefaults;\n\n  // Custom pack: \"custom:<name>\"\n  if (activeModelPackId.startsWith('custom:')) {\n    const name = activeModelPackId.slice('custom:'.length);\n    const pack = settings.customModelPacks.find(p => p.name === name);\n    if (pack) return pack.models;\n    // Custom pack was deleted — fall through to modeDefaults\n    return modeDefaults;\n  }\n\n  // Built-in pack\n  const builtin = builtinPacks.find(p => p.id === activeModelPackId);\n  if (builtin) return builtin.models;\n\n  // Unknown pack id — fall through\n  return modeDefaults;\n}\n\n/**\n * Resolve the effective model ID for one of the two OM roles.\n *\n * Lookup order:\n *   1. The role-specific override (`observerModelOverride` /\n *      `reflectorModelOverride`) if set.\n *   2. If `activeOmPackId` points at a built-in pack, that pack's model.\n *   3. The shared `omModelOverride` fallback.\n *\n * @param settings  The loaded global settings.\n * @param role      Which OM role to resolve (`'observer'` or `'reflector'`).\n * @param builtinOmPacks  Built-in OM packs for the current provider access\n *                        (from `getAvailableOmPacks`). Pass `[]` if unavailable.\n */\nexport function resolveOmRoleModel(\n  settings: GlobalSettings,\n  role: 'observer' | 'reflector',\n  builtinOmPacks: Array<{ id: string; modelId: string }>,\n): string | null {\n  const { activeOmPackId, omModelOverride, observerModelOverride, reflectorModelOverride } = settings.models;\n  const roleOverride = role === 'observer' ? observerModelOverride : reflectorModelOverride;\n  if (roleOverride) return roleOverride;\n\n  if (!activeOmPackId) return omModelOverride;\n  if (activeOmPackId === 'custom') return omModelOverride;\n\n  const pack = builtinOmPacks.find(p => p.id === activeOmPackId);\n  if (pack) return pack.modelId;\n\n  return omModelOverride;\n}\n\n/**\n * @deprecated Use `resolveOmRoleModel(settings, 'observer' | 'reflector', ...)`.\n * Equivalent to resolving the observer role (existing callers set both observer\n * and reflector to the same value).\n */\nexport function resolveOmModel(\n  settings: GlobalSettings,\n  builtinOmPacks: Array<{ id: string; modelId: string }>,\n): string | null {\n  return resolveOmRoleModel(settings, 'observer', builtinOmPacks);\n}\n\nexport function saveSettings(settings: GlobalSettings, filePath: string = getSettingsPath()): void {\n  const dir = dirname(filePath);\n  if (!existsSync(dir)) {\n    mkdirSync(dir, { recursive: true });\n  }\n  writeFileSync(filePath, JSON.stringify(settings, null, 2), 'utf-8');\n}\n\n/** Marker file name to track which provider last used a profile. */\nconst PROFILE_PROVIDER_MARKER = '.mastra-provider';\n\n/**\n * Check which provider last used a profile directory.\n * Returns the provider name if the marker exists, undefined otherwise.\n */\nexport function getProfileProvider(profilePath: string): BrowserProvider | undefined {\n  const markerPath = join(profilePath, PROFILE_PROVIDER_MARKER);\n  if (!existsSync(markerPath)) {\n    return undefined;\n  }\n  try {\n    const content = readFileSync(markerPath, 'utf-8').trim();\n    if (content === 'stagehand' || content === 'agent-browser') {\n      return content;\n    }\n    return undefined;\n  } catch {\n    return undefined;\n  }\n}\n\n/**\n * Write the provider marker to a profile directory.\n * Creates the directory if it doesn't exist.\n */\nexport function setProfileProvider(profilePath: string, provider: BrowserProvider): void {\n  const markerPath = join(profilePath, PROFILE_PROVIDER_MARKER);\n  if (!existsSync(profilePath)) {\n    mkdirSync(profilePath, { recursive: true });\n  }\n  writeFileSync(markerPath, provider, 'utf-8');\n}\n\n/**\n * Check if a profile has a provider mismatch.\n * Returns the existing provider if there's a mismatch, undefined otherwise.\n */\nexport function checkProfileProviderMismatch(\n  profilePath: string | undefined,\n  targetProvider: BrowserProvider,\n): BrowserProvider | undefined {\n  if (!profilePath) {\n    return undefined;\n  }\n  const existingProvider = getProfileProvider(profilePath);\n  if (existingProvider && existingProvider !== targetProvider) {\n    return existingProvider;\n  }\n  return undefined;\n}\n\n/**\n * Create a browser instance from settings.\n * Shared by startup (main.ts) and live reconfiguration (/browser command).\n * Returns undefined if browser is disabled.\n */\nexport async function createBrowserFromSettings(settings: BrowserSettings): Promise<MastraBrowser | undefined> {\n  if (!settings.enabled) {\n    return undefined;\n  }\n\n  const { provider, headless, viewport, cdpUrl, profile, executablePath, stagehand, agentBrowser } = settings;\n\n  // Chrome only allows one process per profile directory, so force 'shared' scope\n  // when a profile is set. Otherwise use the user's setting (or provider default).\n  const scope = profile ? ('shared' as const) : settings.scope;\n\n  // Common launch options (no CDP)\n  const launchConfig = { headless, viewport, profile, executablePath, scope } as const;\n\n  if (provider === 'stagehand') {\n    const { StagehandBrowser } = await import('@mastra/stagehand');\n    const stagehandOpts = {\n      env: stagehand?.env ?? 'LOCAL',\n      apiKey: stagehand?.apiKey ?? process.env.BROWSERBASE_API_KEY,\n      projectId: stagehand?.projectId ?? process.env.BROWSERBASE_PROJECT_ID,\n      preserveUserDataDir: stagehand?.preserveUserDataDir,\n    };\n    return cdpUrl\n      ? new StagehandBrowser({ ...launchConfig, cdpUrl, scope: 'shared', ...stagehandOpts })\n      : new StagehandBrowser({ ...launchConfig, ...stagehandOpts });\n  } else if (provider === 'agent-browser') {\n    const { AgentBrowser } = await import('@mastra/agent-browser');\n    return cdpUrl\n      ? new AgentBrowser({ ...launchConfig, cdpUrl, scope: 'shared', storageState: agentBrowser?.storageState })\n      : new AgentBrowser({ ...launchConfig, storageState: agentBrowser?.storageState, scope });\n  }\n\n  throw new Error(`Unsupported browser provider: ${provider}`);\n}\n","/**\n * Claude Max OAuth Provider\n *\n * Uses OAuth tokens from AuthStorage to authenticate with Claude Max plan.\n * The OAuth endpoint requires a specific system message to be present.\n */\n\nimport { createAnthropic } from '@ai-sdk/anthropic';\nimport type { MastraModelConfig } from '@mastra/core/llm';\nimport { wrapLanguageModel } from 'ai';\nimport type { LanguageModelMiddleware } from 'ai';\nimport { AuthStorage } from '../auth/storage.js';\n\n// Required for Claude Max plan OAuth - the endpoint checks for this system message\nconst claudeCodeIdentity = \"You are Claude Code, Anthropic's official CLI for Claude.\";\n\n// Singleton auth storage instance\nlet authStorageInstance: AuthStorage | null = null;\n\n/**\n * Get or create the shared AuthStorage instance\n */\nexport function getAuthStorage(): AuthStorage {\n  if (!authStorageInstance) {\n    authStorageInstance = new AuthStorage();\n  }\n  return authStorageInstance;\n}\n\n/**\n * Set a custom AuthStorage instance (useful for TUI integration)\n */\nexport function setAuthStorage(storage: AuthStorage | undefined): void {\n  authStorageInstance = storage ?? null;\n}\n\n/**\n * Middleware that injects the Claude Code identity system message\n * Required for Claude Max OAuth authentication\n */\nexport const claudeCodeMiddleware: LanguageModelMiddleware = {\n  specificationVersion: 'v3',\n  transformParams: async ({ params }) => {\n    // Prepend the Claude Code identity as the first system message\n    const systemMessage = {\n      role: 'system' as const,\n      content: claudeCodeIdentity,\n    };\n\n    if (params.temperature) {\n      delete params.topP;\n    }\n\n    return {\n      ...params,\n      prompt: [systemMessage, ...params.prompt],\n    };\n  },\n};\n\n/**\n * Prompt caching middleware for Anthropic\n *\n * Adds cache breakpoints at strategic locations:\n * 1. Last system message (end of static instructions + dynamic memory)\n * 2. Most recent user/assistant message (conversation context)\n *\n * This allows Anthropic to cache:\n * - System prompts and instructions (rarely change)\n * - Conversation history up to the last message\n */\nexport const promptCacheMiddleware: LanguageModelMiddleware = {\n  specificationVersion: 'v3',\n  transformParams: async ({ params }) => {\n    const prompt = [...params.prompt];\n\n    const cacheControl = { type: 'ephemeral' as const, ttl: '5m' as const };\n\n    // Helper to add cache control to a message's last content part\n    const addCacheToMessage = (msg: any) => {\n      // For system messages with string content\n      if (typeof msg.content === 'string') {\n        return {\n          ...msg,\n          providerOptions: {\n            ...msg.providerOptions,\n            anthropic: { ...msg.providerOptions?.anthropic, cacheControl },\n          },\n        };\n      }\n\n      // For messages with array content, add to last part\n      if (Array.isArray(msg.content) && msg.content.length > 0) {\n        const content = [...msg.content];\n        const lastPart = content[content.length - 1];\n        content[content.length - 1] = {\n          ...lastPart,\n          providerOptions: {\n            ...lastPart.providerOptions,\n            anthropic: { ...lastPart.providerOptions?.anthropic, cacheControl },\n          },\n        };\n        return { ...msg, content };\n      }\n\n      return msg;\n    };\n\n    // Find the last system message index\n    let lastSystemIdx = -1;\n    for (let i = prompt.length - 1; i >= 0; i--) {\n      if ((prompt[i] as any).role === 'system') {\n        lastSystemIdx = i;\n        break;\n      }\n    }\n\n    // Add cache breakpoint to last system message\n    if (lastSystemIdx >= 0) {\n      prompt[lastSystemIdx] = addCacheToMessage(prompt[lastSystemIdx]);\n    }\n\n    // Add cache breakpoint to the most recent message (last in array)\n    const lastIdx = prompt.length - 1;\n    if (lastIdx >= 0 && lastIdx !== lastSystemIdx) {\n      prompt[lastIdx] = addCacheToMessage(prompt[lastIdx]);\n    }\n\n    return { ...params, prompt };\n  },\n};\n\n/**\n * Build a fetch function that handles Anthropic OAuth.\n * Preserves non-auth headers from init (critical for gateway auth header to survive\n * when used with the gateway). Strips `authorization` and `x-api-key`.\n */\nexport function buildAnthropicOAuthFetch(opts: { authStorage?: AuthStorage } = {}): typeof fetch {\n  return (async (url: string | URL | Request, init?: Parameters<typeof fetch>[1]) => {\n    const storage = opts.authStorage ?? getAuthStorage();\n    storage.reload();\n\n    const storedCred = storage.get('anthropic');\n    if (storedCred?.type === 'api_key') {\n      throw new Error('Anthropic API key credential is configured, but OAuth is required.');\n    }\n\n    const accessToken = await storage.getApiKey('anthropic');\n    if (!accessToken) {\n      throw new Error('Not logged in to Anthropic. Run /login first.');\n    }\n\n    // Preserve existing headers, strip auth-related ones\n    const headers = new Headers();\n    if (init?.headers) {\n      const source =\n        init.headers instanceof Headers\n          ? init.headers\n          : Array.isArray(init.headers)\n            ? new Headers(init.headers as Array<[string, string]>)\n            : new Headers(init.headers as Record<string, string>);\n      source.forEach((value, key) => {\n        const lower = key.toLowerCase();\n        if (lower !== 'authorization' && lower !== 'x-api-key') {\n          headers.set(key, value);\n        }\n      });\n    }\n\n    headers.set('Authorization', `Bearer ${accessToken}`);\n    headers.set(\n      'anthropic-beta',\n      'oauth-2025-04-20,claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14',\n    );\n    headers.set('anthropic-version', '2023-06-01');\n\n    try {\n      return await fetch(url, { ...init, headers });\n    } catch (error) {\n      if (error && typeof error === 'object') {\n        Object.assign(error as Record<string, unknown>, {\n          requestUrl: url instanceof URL ? url.toString() : typeof url === 'string' ? url : url.url,\n        });\n      }\n      throw error;\n    }\n  }) as typeof fetch;\n}\n\n/**\n * Creates an Anthropic model using Claude Max OAuth authentication\n * Uses OAuth tokens from AuthStorage (auto-refreshes when needed)\n */\nexport function opencodeClaudeMaxProvider(\n  modelId: string = 'claude-sonnet-4-20250514',\n  options?: { headers?: Record<string, string> },\n): MastraModelConfig {\n  const headers = options?.headers;\n\n  // Test environment: use API key\n  if (process.env.NODE_ENV === 'test' || process.env.VITEST) {\n    const anthropic = createAnthropic({\n      apiKey: 'test-api-key',\n      headers,\n    });\n    return wrapLanguageModel({\n      model: anthropic(modelId),\n      middleware: [claudeCodeMiddleware, promptCacheMiddleware],\n    });\n  }\n\n  const anthropic = createAnthropic({\n    apiKey: 'oauth-placeholder',\n    headers,\n    fetch: buildAnthropicOAuthFetch() as any,\n  });\n\n  // Wrap with middleware to inject Claude Code identity and enable prompt caching\n  return wrapLanguageModel({\n    model: anthropic(modelId),\n    middleware: [claudeCodeMiddleware, promptCacheMiddleware],\n  });\n}\n","/**\n * GitHub Copilot OAuth Provider\n *\n * Uses OAuth tokens from AuthStorage to authenticate with GitHub Copilot's chat API.\n * The Copilot API speaks an OpenAI-compatible chat format, so we plug\n * `@ai-sdk/openai-compatible` into Copilot's API URL and use a custom fetch to inject\n * the bearer token and Copilot-specific headers.\n *\n * Inspired by:\n *   - opencode: https://github.com/anomalyco/opencode/blob/dev/packages/opencode/src/plugin/github-copilot/copilot.ts\n *   - pi-mono:  https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/utils/oauth/github-copilot.ts\n */\n\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible';\nimport type { MastraModelConfig } from '@mastra/core/llm';\nimport type { JSONSchema7 } from '@mastra/schema-compat';\nimport { applyCompatLayer, GoogleSchemaCompatLayer } from '@mastra/schema-compat';\nimport { wrapLanguageModel } from 'ai';\nimport type { LanguageModelMiddleware } from 'ai';\nimport { COPILOT_HEADERS, fetchCopilotModels, getGitHubCopilotBaseUrl } from '../auth/providers/github-copilot.js';\nimport type { CopilotModelEntry, GitHubCopilotCredentials } from '../auth/providers/github-copilot.js';\nimport { AuthStorage } from '../auth/storage.js';\n\nconst COPILOT_PROVIDER_ID = 'github-copilot';\n\n// Singleton auth storage instance (shared with claude-max.ts / openai-codex.ts when not overridden).\nlet authStorageInstance: AuthStorage | null = null;\n\n/** Get or create the shared AuthStorage instance. */\nexport function getAuthStorage(): AuthStorage {\n  if (!authStorageInstance) {\n    authStorageInstance = new AuthStorage();\n  }\n  return authStorageInstance;\n}\n\n/** Set a custom AuthStorage instance (useful for tests / TUI integration). */\nexport function setAuthStorage(storage: AuthStorage | undefined): void {\n  authStorageInstance = storage ?? null;\n}\n\n/**\n * Heuristic: did this request come from the agent (e.g. tool result follow-ups) rather\n * than a fresh user turn? Mirrors opencode's `isAgent` logic — Copilot bills these\n * differently via the `x-initiator` header.\n */\nfunction detectIsAgent(body: unknown): boolean {\n  if (!body || typeof body !== 'object') return false;\n  const obj = body as Record<string, unknown>;\n\n  const messages = obj.messages;\n  if (Array.isArray(messages) && messages.length > 0) {\n    const last = messages[messages.length - 1] as { role?: string; content?: unknown };\n    if (last?.role && last.role !== 'user') return true;\n    if (Array.isArray(last?.content)) {\n      // If the last user turn carries any tool_result parts, treat it as an agent turn.\n      const hasToolResult = last.content.some(\n        (part: unknown) => part && typeof part === 'object' && (part as { type?: string }).type === 'tool_result',\n      );\n      if (hasToolResult) return true;\n    }\n  }\n\n  const input = obj.input;\n  if (Array.isArray(input) && input.length > 0) {\n    const last = input[input.length - 1] as { role?: string };\n    if (last?.role && last.role !== 'user') return true;\n  }\n\n  return false;\n}\n\n/** Detect image/vision content in a request body. */\nfunction detectIsVision(body: unknown): boolean {\n  if (!body || typeof body !== 'object') return false;\n  const obj = body as Record<string, unknown>;\n\n  const matchPart = (part: unknown): boolean => {\n    if (!part || typeof part !== 'object') return false;\n    const t = (part as { type?: string }).type;\n    return t === 'image' || t === 'image_url' || t === 'input_image';\n  };\n\n  const messages = obj.messages;\n  if (Array.isArray(messages)) {\n    return messages.some(\n      (msg: unknown) =>\n        msg &&\n        typeof msg === 'object' &&\n        Array.isArray((msg as { content?: unknown }).content) &&\n        ((msg as { content: unknown[] }).content as unknown[]).some(matchPart),\n    );\n  }\n\n  const input = obj.input;\n  if (Array.isArray(input)) {\n    return input.some(\n      (item: unknown) =>\n        item &&\n        typeof item === 'object' &&\n        Array.isArray((item as { content?: unknown }).content) &&\n        ((item as { content: unknown[] }).content as unknown[]).some(matchPart),\n    );\n  }\n\n  return false;\n}\n\n/**\n * Build a fetch wrapper that authenticates with GitHub Copilot OAuth.\n *\n * - Injects the short-lived Copilot bearer token (auto-refreshed by AuthStorage).\n * - Adds the VS Code-like Copilot headers required by the API.\n * - Rewrites the request URL onto the per-token API base when `rewriteUrl` is true.\n */\nexport function buildGitHubCopilotOAuthFetch(\n  opts: { authStorage?: AuthStorage; rewriteUrl?: boolean } = {},\n): typeof fetch {\n  return (async (url: string | URL | Request, init?: Parameters<typeof fetch>[1]) => {\n    const storage = opts.authStorage ?? getAuthStorage();\n    storage.reload();\n\n    const cred = storage.get(COPILOT_PROVIDER_ID);\n    if (!cred || cred.type !== 'oauth') {\n      throw new Error('Not logged in to GitHub Copilot. Run /login first.');\n    }\n\n    // getApiKey() refreshes the Copilot bearer if it has expired.\n    const accessToken = await storage.getApiKey(COPILOT_PROVIDER_ID);\n    if (!accessToken) {\n      throw new Error('Failed to refresh GitHub Copilot token. Please /login again.');\n    }\n    storage.reload();\n\n    const enterpriseUrl = (cred as GitHubCopilotCredentials).enterpriseUrl;\n\n    let parsedBody: unknown;\n    if (typeof init?.body === 'string') {\n      try {\n        parsedBody = JSON.parse(init.body);\n      } catch {\n        parsedBody = undefined;\n      }\n    }\n    const isAgent = detectIsAgent(parsedBody);\n    const isVision = detectIsVision(parsedBody);\n\n    // Preserve non-auth headers from caller.\n    const headers = new Headers();\n    if (init?.headers) {\n      const source =\n        init.headers instanceof Headers\n          ? init.headers\n          : Array.isArray(init.headers)\n            ? new Headers(init.headers as Array<[string, string]>)\n            : new Headers(init.headers as Record<string, string>);\n      source.forEach((value, key) => {\n        const lower = key.toLowerCase();\n        if (lower !== 'authorization' && lower !== 'x-api-key') {\n          headers.set(key, value);\n        }\n      });\n    }\n\n    headers.set('Authorization', `Bearer ${accessToken}`);\n    headers.set('x-initiator', isAgent ? 'agent' : 'user');\n    headers.set('Openai-Intent', 'conversation-edits');\n    if (isVision) {\n      headers.set('Copilot-Vision-Request', 'true');\n    }\n    for (const [key, value] of Object.entries(COPILOT_HEADERS)) {\n      // Only set if caller didn't already provide it (allow overrides for tests).\n      if (!headers.has(key)) {\n        headers.set(key, value);\n      }\n    }\n\n    const finalUrl =\n      opts.rewriteUrl !== false\n        ? rewriteToCopilotBase(url, accessToken, enterpriseUrl)\n        : url instanceof URL\n          ? url\n          : typeof url === 'string'\n            ? new URL(url)\n            : new URL((url as Request).url);\n\n    try {\n      return await fetch(finalUrl, { ...init, headers });\n    } catch (error) {\n      if (error && typeof error === 'object') {\n        Object.assign(error as Record<string, unknown>, {\n          requestUrl: finalUrl.toString(),\n        });\n      }\n      throw error;\n    }\n  }) as typeof fetch;\n}\n\nfunction rewriteToCopilotBase(url: string | URL | Request, token: string, enterpriseDomain?: string): URL {\n  const original = url instanceof URL ? url : new URL(typeof url === 'string' ? url : (url as Request).url);\n  const base = new URL(getGitHubCopilotBaseUrl(token, enterpriseDomain));\n  // Copilot's OpenAI-compatible API serves endpoints at the root of the base host\n  // (`/chat/completions`, `/responses`, `/models`, ...) — not under a `/v1/` prefix\n  // like api.openai.com does. The @ai-sdk/openai default baseURL is\n  // `https://api.openai.com/v1`, so the SDK builds requests like\n  // `https://api.openai.com/v1/chat/completions`. Strip the leading `/v1` segment\n  // when rewriting onto the Copilot base or Copilot will return 404 Not Found.\n  const pathname = original.pathname.replace(/^\\/v1(\\/|$)/, '/');\n  return new URL(`${pathname}${original.search}`, base);\n}\n\nfunction isGeminiModel(modelId: string): boolean {\n  return modelId.startsWith('gemini-');\n}\n\nfunction applyGeminiSchemaCompatToTools(modelId: string, tools: unknown): unknown {\n  if (!Array.isArray(tools)) {\n    return tools;\n  }\n\n  const compatLayer = new GoogleSchemaCompatLayer({\n    provider: COPILOT_PROVIDER_ID,\n    modelId,\n    supportsStructuredOutputs: false,\n  });\n\n  return tools.map(tool => {\n    if (!tool || typeof tool !== 'object' || (tool as { type?: unknown }).type !== 'function') {\n      return tool;\n    }\n\n    const functionTool = tool as { inputSchema?: JSONSchema7 };\n    if (!functionTool.inputSchema) {\n      return tool;\n    }\n\n    return {\n      ...functionTool,\n      inputSchema: applyCompatLayer({\n        schema: functionTool.inputSchema,\n        compatLayers: [compatLayer],\n        mode: 'aiSdkSchema',\n      }).jsonSchema as JSONSchema7,\n    };\n  });\n}\n\n/** Middleware that prevents sending parameters Copilot's endpoint rejects. */\nfunction createCopilotMiddleware(modelId: string): LanguageModelMiddleware {\n  return {\n    specificationVersion: 'v3',\n    transformParams: async ({ params }) => {\n      if (params.temperature !== undefined && params.temperature !== null) {\n        delete params.topP;\n      }\n\n      if (isGeminiModel(modelId)) {\n        (params as { tools?: unknown }).tools = applyGeminiSchemaCompatToTools(\n          modelId,\n          (params as { tools?: unknown }).tools,\n        );\n      }\n\n      return params;\n    },\n  };\n}\n\n/**\n * Creates a model that talks to GitHub Copilot using OAuth credentials.\n *\n * Copilot's `/chat/completions` endpoint is OpenAI-compatible, but GitHub Copilot\n * is not OpenAI. Use the generic OpenAI-compatible adapter with Copilot's base URL\n * instead of the OpenAI provider plus URL rewriting.\n */\nexport function githubCopilotProvider(\n  modelId: string = 'gpt-4.1',\n  options?: { headers?: Record<string, string> },\n): MastraModelConfig {\n  const headers = options?.headers;\n  const copilot = createOpenAICompatible({\n    name: COPILOT_PROVIDER_ID,\n    baseURL: 'https://api.githubcopilot.com',\n    apiKey: process.env.NODE_ENV === 'test' || process.env.VITEST ? 'test-api-key' : 'oauth-placeholder',\n    headers,\n    fetch:\n      process.env.NODE_ENV === 'test' || process.env.VITEST\n        ? undefined\n        : (buildGitHubCopilotOAuthFetch({ rewriteUrl: false }) as any),\n  });\n\n  return wrapLanguageModel({\n    model: copilot.chatModel(modelId),\n    middleware: [createCopilotMiddleware(modelId)],\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Live model catalog\n// ---------------------------------------------------------------------------\n\n/**\n * Hard-coded fallback advertised when the live `/models` request fails (network\n * down, expired token, etc.). Keep this conservative because the live catalog is\n * the source of truth for the user's currently-enabled Copilot models.\n *\n * Available across all paid Copilot tiers and free of premium-request charges.\n */\nconst COPILOT_FALLBACK_MODELS: CopilotModelEntry[] = [\n  {\n    id: 'gpt-4.1',\n    name: 'GPT-4.1',\n    vendor: 'OpenAI',\n    supportedEndpoints: ['/chat/completions'],\n    isAnthropicShaped: false,\n    supportsVision: true,\n    supportsToolCalls: true,\n  },\n];\n\nconst CATALOG_TTL_MS = 10 * 60 * 1000;\nconst CATALOG_FAILURE_TTL_MS = 60 * 1000;\nconst CATALOG_FETCH_TIMEOUT_MS = 5_000;\n\ninterface CatalogCacheEntry {\n  fetchedAt: number;\n  ttl: number;\n  models: CopilotModelEntry[];\n}\n\nlet catalogCache: CatalogCacheEntry | null = null;\nlet inflightFetch: Promise<CopilotModelEntry[]> | null = null;\n\n/** Reset the in-process Copilot catalog cache (test seam, also useful after logout). */\nexport function clearCopilotCatalogCache(): void {\n  catalogCache = null;\n  inflightFetch = null;\n}\n\n/**\n * Return the user's currently-available Copilot models.\n *\n * - Returns `[]` when the user is not logged in to GitHub Copilot.\n * - Returns the cached list when a recent fetch succeeded.\n * - On the cache-miss / expired path, fetches `/models` with a 5s timeout, filters\n *   to picker-enabled and non-policy-disabled models, then caches for 10 minutes.\n * - On fetch failure, returns a small hard-coded fallback (so packs still work\n *   offline) and caches that for 1 minute to avoid hammering the API.\n *\n * Concurrent calls during a fetch share the inflight promise.\n */\nexport async function getCopilotModelCatalog(opts: { authStorage?: AuthStorage } = {}): Promise<CopilotModelEntry[]> {\n  const storage = opts.authStorage ?? getAuthStorage();\n  storage.reload();\n\n  const cred = storage.get(COPILOT_PROVIDER_ID);\n  if (!cred || cred.type !== 'oauth') {\n    return [];\n  }\n\n  const now = Date.now();\n  if (catalogCache && now - catalogCache.fetchedAt < catalogCache.ttl) {\n    return catalogCache.models;\n  }\n\n  if (inflightFetch) return inflightFetch;\n\n  inflightFetch = (async (): Promise<CopilotModelEntry[]> => {\n    try {\n      // getApiKey() refreshes the Copilot bearer if it has expired.\n      const accessToken = await storage.getApiKey(COPILOT_PROVIDER_ID);\n      if (!accessToken) throw new Error('No Copilot bearer token');\n      storage.reload();\n\n      const refreshed = storage.get(COPILOT_PROVIDER_ID);\n      const enterpriseUrl = (refreshed as GitHubCopilotCredentials | undefined)?.enterpriseUrl;\n      const baseUrl = getGitHubCopilotBaseUrl(accessToken, enterpriseUrl);\n\n      const controller = new AbortController();\n      const timer = setTimeout(() => controller.abort(), CATALOG_FETCH_TIMEOUT_MS);\n      try {\n        const models = await fetchCopilotModels({\n          baseUrl,\n          bearerToken: accessToken,\n          signal: controller.signal,\n        });\n        catalogCache = { fetchedAt: Date.now(), ttl: CATALOG_TTL_MS, models };\n        return models;\n      } finally {\n        clearTimeout(timer);\n      }\n    } catch (error) {\n      catalogCache = {\n        fetchedAt: Date.now(),\n        ttl: CATALOG_FAILURE_TTL_MS,\n        models: COPILOT_FALLBACK_MODELS,\n      };\n      console.warn(\n        'Failed to fetch live GitHub Copilot models, using fallback list:',\n        error instanceof Error ? error.message : error,\n      );\n      return COPILOT_FALLBACK_MODELS;\n    } finally {\n      inflightFetch = null;\n    }\n  })();\n\n  return inflightFetch;\n}\n","/**\n * OpenAI Codex OAuth Provider\n *\n * Uses OAuth tokens from AuthStorage to authenticate with ChatGPT Plus/Pro subscription.\n * This allows access to OpenAI models through the ChatGPT OAuth flow.\n *\n * Inspired by opencode's Codex plugin implementation:\n * https://github.com/sst/opencode/blob/main/packages/opencode/src/plugin/codex.ts\n */\n\nimport { createOpenAI } from '@ai-sdk/openai';\nimport type { MastraModelConfig } from '@mastra/core/llm';\nimport { wrapLanguageModel } from 'ai';\nimport type { LanguageModelMiddleware } from 'ai';\nimport { AuthStorage } from '../auth/storage.js';\n\n// Codex API endpoint (not standard OpenAI API)\nconst CODEX_API_ENDPOINT = 'https://chatgpt.com/backend-api/codex/responses';\nconst CODEX_ORIGINATOR = 'mastracode';\nconst CODEX_USER_AGENT = 'mastracode';\n\n// Singleton auth storage instance (shared with claude-max.ts)\nlet authStorageInstance: AuthStorage | null = null;\n\n/**\n * Get or create the shared AuthStorage instance\n */\nexport function getAuthStorage(): AuthStorage {\n  if (!authStorageInstance) {\n    authStorageInstance = new AuthStorage();\n  }\n  return authStorageInstance;\n}\n\n/**\n * Set a custom AuthStorage instance (useful for TUI integration)\n */\nexport function setAuthStorage(storage: AuthStorage | undefined): void {\n  authStorageInstance = storage ?? null;\n}\n\n// Default instructions for Codex API (required)\nconst CODEX_INSTRUCTIONS = `You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.\n\nIMPORTANT: You should be concise, direct, and helpful. Focus on solving the user's problem efficiently.`;\n\n/** Valid thinking level values. */\nexport type ThinkingLevel = 'off' | 'low' | 'medium' | 'high' | 'xhigh';\n\nconst GPT5_MODEL_RE = /^gpt-5(?:\\.|-|$)/;\n\nexport function getEffectiveThinkingLevel(modelId: string, level: ThinkingLevel): ThinkingLevel {\n  // GPT-5.* models on Codex require at least low reasoning.\n  if (GPT5_MODEL_RE.test(modelId) && level === 'off') {\n    return 'low';\n  }\n\n  return level;\n}\n\n// Map thinkingLevel state values to OpenAI reasoningEffort values.\n// undefined means omit the parameter (no reasoning).\nexport const THINKING_LEVEL_TO_REASONING_EFFORT: Record<ThinkingLevel, string | undefined> = {\n  off: undefined,\n  low: 'low',\n  medium: 'medium',\n  high: 'high',\n  xhigh: 'xhigh',\n};\n\n/**\n * Create Codex middleware with the given reasoning effort level.\n */\nexport function createCodexMiddleware(reasoningEffort?: string): LanguageModelMiddleware {\n  return {\n    specificationVersion: 'v3',\n    transformParams: async ({ params }) => {\n      // Remove topP if temperature is set (OpenAI doesn't like both)\n      if (params.temperature !== undefined && params.temperature !== null) {\n        delete params.topP;\n      }\n\n      // Codex API requires specific settings via providerOptions\n      // Use type assertion to satisfy JSONValue constraints\n      params.providerOptions = {\n        ...params.providerOptions,\n        openai: {\n          ...(params.providerOptions?.openai ?? {}),\n          instructions: CODEX_INSTRUCTIONS,\n          // Codex API requires store to be false\n          store: false,\n          // Enable reasoning for Codex models — without this, the model\n          // skips the reasoning/action phase and goes straight to final_answer,\n          // resulting in narration instead of tool calls.\n          ...(reasoningEffort ? { reasoningEffort } : {}),\n        },\n      } as typeof params.providerOptions;\n\n      return params;\n    },\n  };\n}\n\n/**\n * Build a fetch function that handles OpenAI Codex OAuth.\n * Preserves non-authorization headers from init.\n * When rewriteUrl is true (default), rewrites /v1/responses and /chat/completions\n * to the Codex API endpoint. Set rewriteUrl: false for gateway usage where the\n * SDK already targets the correct URL.\n */\nexport function buildOpenAICodexOAuthFetch(\n  opts: { authStorage?: AuthStorage; rewriteUrl?: boolean } = {},\n): typeof fetch {\n  return (async (url: string | URL | Request, init?: Parameters<typeof fetch>[1]) => {\n    const storage = opts.authStorage ?? getAuthStorage();\n    storage.reload();\n\n    const cred = storage.get('openai-codex');\n    if (!cred || cred.type !== 'oauth') {\n      throw new Error('Not logged in to OpenAI Codex. Run /login first.');\n    }\n\n    let accessToken = cred.access;\n    if (Date.now() >= cred.expires) {\n      const refreshedToken = await storage.getApiKey('openai-codex');\n      if (!refreshedToken) {\n        throw new Error('Failed to refresh OpenAI Codex token. Please /login again.');\n      }\n      accessToken = refreshedToken;\n      storage.reload();\n    }\n\n    const accountId = (cred as any).accountId as string | undefined;\n\n    // Preserve non-authorization headers\n    const headers = new Headers();\n    if (init?.headers) {\n      if (init.headers instanceof Headers) {\n        init.headers.forEach((value, key) => {\n          if (key.toLowerCase() !== 'authorization') {\n            headers.set(key, value);\n          }\n        });\n      } else if (Array.isArray(init.headers)) {\n        for (const [key, value] of init.headers) {\n          if (key!.toLowerCase() !== 'authorization' && value !== undefined) {\n            headers.set(key!, String(value));\n          }\n        }\n      } else {\n        for (const [key, value] of Object.entries(init.headers)) {\n          if (key.toLowerCase() !== 'authorization' && value !== undefined) {\n            headers.set(key, String(value));\n          }\n        }\n      }\n    }\n\n    headers.set('Authorization', `Bearer ${accessToken}`);\n    if (!headers.has('originator')) {\n      headers.set('originator', CODEX_ORIGINATOR);\n    }\n    if (!headers.has('User-Agent')) {\n      headers.set('User-Agent', CODEX_USER_AGENT);\n    }\n    if (accountId) {\n      headers.set('ChatGPT-Account-ID', accountId);\n    }\n\n    // URL rewriting — only when rewriteUrl !== false\n    const parsed = url instanceof URL ? url : new URL(typeof url === 'string' ? url : (url as Request).url);\n    const shouldRewrite =\n      opts.rewriteUrl !== false &&\n      (parsed.pathname.includes('/v1/responses') || parsed.pathname.includes('/chat/completions'));\n    const finalUrl = shouldRewrite ? new URL(CODEX_API_ENDPOINT) : parsed;\n\n    try {\n      return await fetch(finalUrl, { ...init, headers });\n    } catch (error) {\n      if (error && typeof error === 'object') {\n        Object.assign(error as Record<string, unknown>, {\n          requestUrl: finalUrl.toString(),\n        });\n      }\n      throw error;\n    }\n  }) as typeof fetch;\n}\n\n/**\n * Creates an OpenAI model using ChatGPT OAuth authentication\n * Uses OAuth tokens from AuthStorage (auto-refreshes when needed)\n *\n * IMPORTANT: This uses the Codex API endpoint, not the standard OpenAI API.\n * URLs are rewritten from /v1/responses or /chat/completions to the Codex endpoint.\n */\nexport function openaiCodexProvider(\n  modelId: string = 'codex-mini-latest',\n  options?: { thinkingLevel?: ThinkingLevel; headers?: Record<string, string> },\n): MastraModelConfig {\n  const requestedLevel: ThinkingLevel = options?.thinkingLevel ?? 'medium';\n  const effectiveLevel = getEffectiveThinkingLevel(modelId, requestedLevel);\n  const reasoningEffort = THINKING_LEVEL_TO_REASONING_EFFORT[effectiveLevel];\n  const middleware = createCodexMiddleware(reasoningEffort);\n  const headers = options?.headers;\n\n  // Test environment: use API key\n  if (process.env.NODE_ENV === 'test' || process.env.VITEST) {\n    const openai = createOpenAI({\n      apiKey: 'test-api-key',\n      headers,\n    });\n    return wrapLanguageModel({\n      model: openai.responses(modelId),\n      middleware: [middleware],\n    });\n  }\n\n  const openai = createOpenAI({\n    apiKey: 'oauth-dummy-key',\n    headers,\n    fetch: buildOpenAICodexOAuthFetch() as any,\n  });\n\n  // Use the responses API for Codex models\n  // Wrap with middleware\n  return wrapLanguageModel({\n    model: openai.responses(modelId),\n    middleware: [middleware],\n  });\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport type { HarnessRequestContext } from '@mastra/core/harness';\nimport { GATEWAY_AUTH_HEADER, MastraGateway, ModelRouterLanguageModel } from '@mastra/core/llm';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport { wrapLanguageModel } from 'ai';\nimport { AuthStorage } from '../auth/storage.js';\nimport { getCustomProviderId, loadSettings, MEMORY_GATEWAY_PROVIDER } from '../onboarding/settings.js';\nimport {\n  buildAnthropicOAuthFetch,\n  claudeCodeMiddleware,\n  opencodeClaudeMaxProvider,\n  promptCacheMiddleware,\n} from '../providers/claude-max.js';\nimport { githubCopilotProvider } from '../providers/github-copilot.js';\nimport {\n  buildOpenAICodexOAuthFetch,\n  createCodexMiddleware,\n  getEffectiveThinkingLevel,\n  openaiCodexProvider,\n  THINKING_LEVEL_TO_REASONING_EFFORT,\n} from '../providers/openai-codex.js';\nimport type { ThinkingLevel } from '../providers/openai-codex.js';\n\nconst authStorage = new AuthStorage();\n\nconst OPENAI_PREFIX = 'openai/';\nconst GITHUB_COPILOT_PREFIX = 'github-copilot/';\nconst MASTRA_GATEWAY_PREFIX = 'mastra/';\n\nconst CODEX_OPENAI_MODEL_REMAPS: Record<string, string> = {\n  'gpt-5.3': 'gpt-5.3-codex',\n  'gpt-5.2': 'gpt-5.2-codex',\n  'gpt-5.1': 'gpt-5.1-codex',\n  'gpt-5.1-mini': 'gpt-5.1-codex-mini',\n  'gpt-5': 'gpt-5-codex',\n};\n\ntype ResolvedModel =\n  | ReturnType<typeof openaiCodexProvider>\n  | ReturnType<typeof opencodeClaudeMaxProvider>\n  | ReturnType<typeof githubCopilotProvider>\n  | ModelRouterLanguageModel\n  | ReturnType<ReturnType<typeof createAnthropic>>\n  | ReturnType<ReturnType<typeof createOpenAI>>;\n\ntype ModelRequestHeaders = Record<string, string>;\n\nfunction getHarnessHeaders(requestContext?: RequestContext): ModelRequestHeaders | undefined {\n  const harnessContext = requestContext?.get('harness') as HarnessRequestContext<any> | undefined;\n  const headers = {\n    ...(harnessContext?.threadId ? { 'x-thread-id': harnessContext.threadId } : {}),\n    ...(harnessContext?.resourceId ? { 'x-resource-id': harnessContext.resourceId } : {}),\n  };\n\n  return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction stripMastraGatewayPrefix(modelId: string): string {\n  return modelId.startsWith(MASTRA_GATEWAY_PREFIX) ? modelId.substring(MASTRA_GATEWAY_PREFIX.length) : modelId;\n}\n\nfunction normalizeAnthropicModelId(modelId: string): string {\n  return modelId.replace(/\\.(?=\\d)/g, '-');\n}\n\nexport function remapOpenAIModelForCodexOAuth(modelId: string): string {\n  const normalizedModelId = stripMastraGatewayPrefix(modelId);\n\n  if (!normalizedModelId.startsWith(OPENAI_PREFIX)) {\n    return modelId;\n  }\n\n  const openaiModelId = normalizedModelId.substring(OPENAI_PREFIX.length);\n\n  if (openaiModelId.includes('-codex')) {\n    return modelId;\n  }\n\n  const codexModelId = CODEX_OPENAI_MODEL_REMAPS[openaiModelId];\n  if (!codexModelId) {\n    return modelId;\n  }\n\n  const remappedModelId = `${OPENAI_PREFIX}${codexModelId}`;\n  return modelId.startsWith(MASTRA_GATEWAY_PREFIX) ? `${MASTRA_GATEWAY_PREFIX}${remappedModelId}` : remappedModelId;\n}\n\n/**\n * Resolve the Anthropic API key.\n * Main slot → dedicated apikey: slot → env var.\n */\nexport function getAnthropicApiKey(): string | undefined {\n  const storedCred = authStorage.get('anthropic');\n  if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n    return storedCred.key.trim();\n  }\n  const dedicatedKey = authStorage.getStoredApiKey('anthropic')?.trim();\n  if (dedicatedKey) return dedicatedKey;\n  return process.env.ANTHROPIC_API_KEY?.trim() || undefined;\n}\n\n/**\n * Resolve the OpenAI API key.\n * Main slot → dedicated apikey: slot → env var.\n */\nexport function getOpenAIApiKey(): string | undefined {\n  const storedCred = authStorage.get('openai-codex');\n  if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n    return storedCred.key.trim();\n  }\n  const dedicatedKey = authStorage.getStoredApiKey('openai-codex')?.trim();\n  if (dedicatedKey) return dedicatedKey;\n  return process.env.OPENAI_API_KEY?.trim() || undefined;\n}\n\n/**\n * Create an Anthropic model using a direct API key (no OAuth).\n * Applies prompt caching but NOT the Claude Code identity middleware\n * (which is only required for Claude Max OAuth).\n */\nfunction anthropicApiKeyProvider(modelId: string, apiKey: string, headers?: ModelRequestHeaders) {\n  const anthropic = createAnthropic({ apiKey, headers });\n  return wrapLanguageModel({\n    model: anthropic(modelId),\n    middleware: [promptCacheMiddleware],\n  });\n}\n\n/**\n * Create an OpenAI model using a direct API key from AuthStorage.\n */\nfunction openaiApiKeyProvider(modelId: string, apiKey: string, headers?: ModelRequestHeaders) {\n  const openai = createOpenAI({ apiKey, headers });\n  return wrapLanguageModel({\n    model: openai.responses(modelId),\n    middleware: [],\n  });\n}\n\n/**\n * Resolve a model ID to the correct provider instance.\n * Shared by the main agent, observer, and reflector.\n *\n * - For anthropic/* models: Uses stored OAuth credentials when present, otherwise direct API key\n * - For openai/* models: Uses OAuth when configured, otherwise direct API key from AuthStorage\n * - For moonshotai/* models: Uses Moonshot AI Anthropic-compatible endpoint\n * - For all other providers: Uses Mastra's model router (models.dev gateway)\n */\nexport function resolveModel(\n  modelId: string,\n  options?: { thinkingLevel?: ThinkingLevel; remapForCodexOAuth?: boolean; requestContext?: RequestContext },\n): ResolvedModel {\n  authStorage.reload();\n  const headers = getHarnessHeaders(options?.requestContext);\n  const isMastraGatewayModel = modelId.startsWith(MASTRA_GATEWAY_PREFIX);\n  const normalizedModelId = stripMastraGatewayPrefix(modelId);\n  const [providerId, modelName] = normalizedModelId.split('/', 2);\n  const settings = loadSettings();\n  const customProvider =\n    !isMastraGatewayModel && providerId && modelName\n      ? settings.customProviders.find(provider => {\n          return providerId === getCustomProviderId(provider.name);\n        })\n      : undefined;\n\n  if (customProvider) {\n    return new ModelRouterLanguageModel({\n      id: normalizedModelId as `${string}/${string}`,\n      url: customProvider.url,\n      apiKey: customProvider.apiKey,\n      headers,\n    });\n  }\n\n  // --- Memory Gateway path ---\n  const mgApiKey = authStorage.getStoredApiKey(MEMORY_GATEWAY_PROVIDER) ?? process.env['MASTRA_GATEWAY_API_KEY'];\n  if (mgApiKey && isMastraGatewayModel) {\n    // Normalize gateway base URL: strip trailing slashes and \"/v1\", then append \"/v1\"\n    const rawBase =\n      settings.memoryGateway?.baseUrl ?? process.env['MASTRA_GATEWAY_URL'] ?? 'https://gateway-api.mastra.ai';\n    const gatewayBaseURL = rawBase.replace(/\\/+$/, '').replace(/\\/v1$/, '') + '/v1';\n\n    const anthropicCred = authStorage.get('anthropic');\n    const openaiCred = authStorage.get('openai-codex');\n\n    // Anthropic OAuth: build model directly with middleware (bypasses ModelRouterLanguageModel)\n    // Required because claudeCodeMiddleware must inject the Claude Code identity system message\n    if (normalizedModelId.startsWith('anthropic/') && anthropicCred?.type === 'oauth') {\n      const bareModelId = normalizeAnthropicModelId(normalizedModelId.substring('anthropic/'.length));\n      const anthropic = createAnthropic({\n        apiKey: 'oauth-gateway-placeholder',\n        baseURL: gatewayBaseURL,\n        headers: {\n          [GATEWAY_AUTH_HEADER]: `Bearer ${mgApiKey}`,\n          ...headers,\n        },\n        fetch: buildAnthropicOAuthFetch({ authStorage }) as any,\n      });\n      return wrapLanguageModel({\n        model: anthropic(bareModelId),\n        middleware: [claudeCodeMiddleware, promptCacheMiddleware],\n      });\n    }\n\n    // OpenAI Codex OAuth: build model directly with middleware (bypasses ModelRouterLanguageModel)\n    // Required because createCodexMiddleware injects instructions, store:false, and reasoningEffort\n    if (normalizedModelId.startsWith('openai/') && openaiCred?.type === 'oauth') {\n      const resolvedModelId = remapOpenAIModelForCodexOAuth(normalizedModelId);\n      const resolvedBareModelId = resolvedModelId.substring('openai/'.length);\n      const requestedLevel: ThinkingLevel = options?.thinkingLevel ?? 'medium';\n      const effectiveLevel = getEffectiveThinkingLevel(resolvedBareModelId, requestedLevel);\n      const reasoningEffort = THINKING_LEVEL_TO_REASONING_EFFORT[effectiveLevel];\n      const middleware = createCodexMiddleware(reasoningEffort);\n\n      const openai = createOpenAI({\n        apiKey: 'oauth-gateway-placeholder',\n        baseURL: gatewayBaseURL,\n        headers: {\n          [GATEWAY_AUTH_HEADER]: `Bearer ${mgApiKey}`,\n          ...headers,\n        },\n        fetch: buildOpenAICodexOAuthFetch({ authStorage, rewriteUrl: false }) as any,\n      });\n      return wrapLanguageModel({\n        model: openai.responses(resolvedBareModelId),\n        middleware: [middleware],\n      });\n    }\n\n    // All other models: route through MastraGateway + ModelRouterLanguageModel\n    const gateway = new MastraGateway({\n      apiKey: mgApiKey,\n      baseUrl: gatewayBaseURL.replace(/\\/v1$/, ''),\n    });\n\n    return new ModelRouterLanguageModel({ id: `mastra/${normalizedModelId}` as `${string}/${string}`, headers }, [\n      gateway,\n    ]);\n  }\n\n  const isAnthropicModel = normalizedModelId.startsWith('anthropic/');\n  const isOpenAIModel = normalizedModelId.startsWith(OPENAI_PREFIX);\n  const isMoonshotModel = normalizedModelId.startsWith('moonshotai/');\n  const isGitHubCopilotModel = normalizedModelId.startsWith(GITHUB_COPILOT_PREFIX);\n\n  if (isGitHubCopilotModel) {\n    const bareModelId = normalizedModelId.substring(GITHUB_COPILOT_PREFIX.length);\n    return githubCopilotProvider(bareModelId, { headers });\n  }\n\n  if (isMoonshotModel) {\n    if (!process.env.MOONSHOT_AI_API_KEY) {\n      throw new Error(`Need MOONSHOT_AI_API_KEY`);\n    }\n    return createAnthropic({\n      apiKey: process.env.MOONSHOT_AI_API_KEY!,\n      baseURL: 'https://api.moonshot.ai/anthropic/v1',\n      name: 'moonshotai.anthropicv1',\n      headers,\n    })(normalizedModelId.substring('moonshotai/'.length));\n  } else if (isAnthropicModel) {\n    const bareModelId = normalizeAnthropicModelId(normalizedModelId.substring('anthropic/'.length));\n    const storedCred = authStorage.get('anthropic');\n\n    // Primary path: explicit OAuth credential\n    if (storedCred?.type === 'oauth') {\n      return opencodeClaudeMaxProvider(bareModelId, { headers });\n    }\n\n    // Secondary path: explicit stored API key credential\n    if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n      return anthropicApiKeyProvider(bareModelId, storedCred.key.trim(), headers);\n    }\n\n    // Fallback: direct API key from AuthStorage\n    const apiKey = getAnthropicApiKey();\n    if (apiKey) {\n      return anthropicApiKeyProvider(bareModelId, apiKey, headers);\n    }\n    // No auth configured — attempt OAuth provider which will prompt login\n    return opencodeClaudeMaxProvider(bareModelId, { headers });\n  } else if (isOpenAIModel) {\n    const bareModelId = normalizedModelId.substring(OPENAI_PREFIX.length);\n    const storedCred = authStorage.get('openai-codex');\n\n    if (storedCred?.type === 'oauth') {\n      const resolvedModelId = remapOpenAIModelForCodexOAuth(normalizedModelId);\n      return openaiCodexProvider(resolvedModelId.substring(OPENAI_PREFIX.length), {\n        thinkingLevel: options?.thinkingLevel,\n        headers,\n      });\n    }\n\n    const apiKey = getOpenAIApiKey();\n    if (apiKey) {\n      return openaiApiKeyProvider(bareModelId, apiKey, headers);\n    }\n\n    return new ModelRouterLanguageModel({ id: normalizedModelId as `${string}/${string}`, headers });\n  } else {\n    return new ModelRouterLanguageModel({ id: normalizedModelId as `${string}/${string}`, headers });\n  }\n}\n\n/**\n * Dynamic model function that reads the current model from harness state.\n * This allows runtime model switching via the /models picker.\n */\nexport function getDynamicModel({ requestContext }: { requestContext: RequestContext }): ResolvedModel {\n  const harnessContext = requestContext.get('harness') as HarnessRequestContext<any> | undefined;\n\n  const modelId = harnessContext?.state?.currentModelId;\n  if (!modelId) {\n    throw new Error('No model selected. Use /models to select a model first.');\n  }\n\n  const thinkingLevel = harnessContext?.state?.thinkingLevel as ThinkingLevel | undefined;\n\n  return resolveModel(modelId, { thinkingLevel, remapForCodexOAuth: true, requestContext });\n}\n","/**\n * Onboarding \"packs\" — predefined model configurations for each mode.\n *\n * Each pack assigns a default model to the build, plan, and fast modes,\n * plus an OM (observational memory) model.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ModePack {\n  id: string;\n  name: string;\n  description: string;\n  models: {\n    build: string;\n    plan: string;\n    fast: string;\n  };\n}\n\nexport interface OMPack {\n  id: string;\n  name: string;\n  description: string;\n  modelId: string;\n}\n\n/** How a provider is accessed: OAuth subscription, API key, or not at all. */\nexport type ProviderAccessLevel = 'oauth' | 'apikey' | false;\n\n/** Which providers the user has access to and how. */\nexport interface ProviderAccess {\n  anthropic: ProviderAccessLevel;\n  openai: ProviderAccessLevel;\n  cerebras: ProviderAccessLevel;\n  google: ProviderAccessLevel;\n  deepseek: ProviderAccessLevel;\n  'github-copilot': ProviderAccessLevel;\n  [provider: string]: ProviderAccessLevel;\n}\n\n// ---------------------------------------------------------------------------\n// Mode Packs\n// ---------------------------------------------------------------------------\n\n/**\n * Build the list of available mode packs based on which providers the user\n * can actually reach (API key or OAuth login).\n *\n * @param savedCustomPacks  Previously saved custom packs from settings.json.\n *                          These are inserted before the \"New Custom\" option.\n */\nexport function getAvailableModePacks(\n  access: ProviderAccess,\n  savedCustomPacks: Array<{ name: string; models: Record<string, string> }> = [],\n): ModePack[] {\n  const packs: ModePack[] = [];\n\n  const openaiCodex = 'openai/gpt-5.5';\n  const openaiFast = 'openai/gpt-5.4-mini';\n  const anthropicBuild = access.anthropic === 'oauth' ? 'anthropic/claude-opus-4-7' : 'anthropic/claude-sonnet-4-6';\n\n  if (access.anthropic) {\n    packs.push({\n      id: 'anthropic',\n      name: 'Anthropic',\n      description:\n        access.anthropic === 'oauth' ? 'All Anthropic models via Max subscription' : 'All Anthropic models via API key',\n      models: {\n        build: anthropicBuild,\n        plan: anthropicBuild,\n        fast: 'anthropic/claude-haiku-4-5',\n      },\n    });\n  }\n\n  if (access.openai) {\n    packs.push({\n      id: 'openai',\n      name: 'OpenAI',\n      description:\n        access.openai === 'oauth' ? 'All OpenAI models via Codex subscription' : 'All OpenAI models via API key',\n      models: {\n        build: openaiCodex,\n        plan: openaiCodex,\n        fast: openaiFast,\n      },\n    });\n  }\n\n  if (access['github-copilot']) {\n    packs.push({\n      id: 'github-copilot',\n      name: 'GitHub Copilot',\n      description: 'GitHub Copilot subscription',\n      models: {\n        build: 'github-copilot/gpt-4.1',\n        plan: 'github-copilot/gemini-2.5-pro',\n        fast: 'github-copilot/grok-code-fast-1',\n      },\n    });\n  }\n\n  // Saved custom packs — inserted before the \"New Custom\" option\n  for (const cp of savedCustomPacks) {\n    packs.push({\n      id: `custom:${cp.name}`,\n      name: cp.name,\n      description: 'Saved custom pack',\n      models: {\n        build: cp.models.build ?? '',\n        plan: cp.models.plan ?? '',\n        fast: cp.models.fast ?? '',\n      },\n    });\n  }\n\n  // New Custom — always available; user picks each model individually\n  const hasCustom = savedCustomPacks.length > 0;\n  packs.push({\n    id: 'custom',\n    name: hasCustom ? 'New Custom' : 'Custom',\n    description: 'Choose a model for each mode',\n    models: { build: '', plan: '', fast: '' },\n  });\n\n  return packs;\n}\n\n// ---------------------------------------------------------------------------\n// OM Packs\n// ---------------------------------------------------------------------------\n\nexport function getAvailableOmPacks(access: ProviderAccess): OMPack[] {\n  const packs: OMPack[] = [];\n\n  if (access.google) {\n    packs.push({\n      id: 'gemini',\n      name: 'Gemini Flash',\n      description: access.google === 'oauth' ? 'Via Google OAuth' : 'Via Google API key',\n      modelId: 'google/gemini-2.5-flash',\n    });\n  }\n\n  if (access.anthropic) {\n    packs.push({\n      id: 'anthropic',\n      name: 'Claude Haiku',\n      description: access.anthropic === 'oauth' ? 'Via Max subscription' : 'Via Anthropic API key',\n      modelId: 'anthropic/claude-haiku-4-5',\n    });\n  }\n\n  if (access.openai) {\n    packs.push({\n      id: 'openai',\n      name: 'OpenAI Mini',\n      description: access.openai === 'oauth' ? 'Via Codex subscription' : 'Via OpenAI API key',\n      modelId: 'openai/gpt-5.4-mini',\n    });\n  }\n\n  if (access.deepseek) {\n    packs.push({\n      id: 'deepseek',\n      name: 'DeepSeek',\n      description: 'Via DeepSeek API key',\n      modelId: 'deepseek/deepseek-chat',\n    });\n  }\n\n  // Custom — always available; user picks any model\n  packs.push({\n    id: 'custom',\n    name: 'Custom',\n    description: 'Choose any available model',\n    modelId: '',\n  });\n\n  return packs;\n}\n\n// ---------------------------------------------------------------------------\n// Current onboarding version — bump when adding new steps\n// ---------------------------------------------------------------------------\n\nexport const ONBOARDING_VERSION = 1;\n","/**\n * Theme system for the Mastra Code TUI.\n * Simplified from pi-mono's theme system.\n */\n\nimport type { MarkdownTheme, EditorTheme, SettingsListTheme, SelectListTheme } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\n\n// =============================================================================\n// Theme Mode\n// =============================================================================\n\nexport type ThemeMode = 'dark' | 'light';\n\nlet currentThemeMode: ThemeMode = 'dark';\n\nexport function getThemeMode(): ThemeMode {\n  return currentThemeMode;\n}\n\n// =============================================================================\n// Mastra Brand Palette (immutable — stays constant regardless of theme)\n// =============================================================================\n\nexport const mastraBrand = {\n  purple: '#7f45e0', // #b588fe brand is too washed out for terminal\n  green: '#16c858', // brand green (dark mode primary)\n  orange: '#fdac53',\n  pink: '#ff69cc',\n  blue: '#2563eb', // #6ccdfb brand is to washed out\n  red: '#DC5663', // #ff4758 too intense\n  yellow: '#e7e67b',\n} as const;\n\n// =============================================================================\n// Extended Color Palette (additional colors for future use)\n// =============================================================================\n\nexport const extendedColors = {\n  // Teals / Cyans\n  teal: '#14b8a6',\n  cyan: '#06b6d4',\n  lightCyan: '#22d3ee',\n  // Blues\n  skyBlue: '#38bdf8',\n  indigo: '#6366f1',\n  // Purples / Violets\n  violet: '#a855f7',\n  lavender: '#c084fc',\n  fuchsia: '#d946ef',\n  // Pinks / Roses\n  rose: '#f472b6',\n  coral: '#fb7185',\n  // Warm Tones\n  amber: '#fb923c',\n  lime: '#a3e635',\n  gold: '#facc15',\n  // Earthy / Muted\n  stone: '#a8a29e',\n  warmGray: '#78716c',\n  copper: '#b45309',\n} as const;\n\nexport const greens = {\n  // Bright / Vivid\n  emerald: '#4ade80',\n  seafoam: '#34d399',\n  jade: '#10b981',\n  springGreen: '#00ff7f',\n  neonGreen: '#50fa7b',\n  // Warm Greens\n  chartreuse: '#84cc16',\n  lightLime: '#bef264',\n  electricLime: '#caff33',\n  // Cool / Deep\n  aquamarine: '#2dd4bf',\n  mint: '#5eead4',\n  pastelMint: '#6ee7b7',\n  // Forest / Muted\n  forest: '#16a34a',\n  deepForest: '#15803d',\n  sage: '#059669',\n  pine: '#047857',\n  evergreen: '#065f46',\n  // Neon / Electric\n  neonLime: '#39ff14',\n  pureGreen: '#00ff00',\n  hacker: '#00ff41',\n  lawnGreen: '#66ff00',\n} as const;\n\n// =============================================================================\n// Mastra Surface Palette (theme-dependent)\n// =============================================================================\n\ninterface MastraSurface {\n  bg: string;\n  antiGrid: string;\n  elevationSm: string;\n  elevationLg: string;\n  hover: string;\n  white: string;\n  specialGray: string;\n  mainGray: string;\n  darkGray: string;\n  borderAntiGrid: string;\n  borderElevation: string;\n}\n\nconst darkSurface: MastraSurface = {\n  bg: '#020202',\n  antiGrid: '#0d0d0d',\n  elevationSm: '#1a1a1a',\n  elevationLg: '#141414',\n  hover: '#262626',\n  white: '#f0f0f0',\n  specialGray: '#cccccc',\n  mainGray: '#939393',\n  darkGray: '#848484',\n  borderAntiGrid: '#141414',\n  borderElevation: '#1a1a1a',\n};\n\nconst lightSurface: MastraSurface = {\n  bg: '#ffffff',\n  antiGrid: '#eaeaea',\n  elevationSm: '#ebebeb',\n  elevationLg: '#f0f0f0',\n  hover: '#e0e0e0',\n  white: '#1a1a1a',\n  specialGray: '#444444',\n  mainGray: '#636363',\n  darkGray: '#666666',\n  borderAntiGrid: '#e5e5e5',\n  borderElevation: '#e0e0e0',\n};\n\ntype MastraPalette = typeof mastraBrand & MastraSurface;\n\nfunction getSurface(): MastraSurface {\n  return currentThemeMode === 'dark' ? darkSurface : lightSurface;\n}\n\n// The actual terminal background color detected via OSC 11.\n// Falls back to the surface palette bg if not detected.\nlet detectedTerminalBg: string | undefined;\n\n/** The effective background color used for contrast calculations. */\nfunction getContrastBg(): string {\n  return detectedTerminalBg ?? getSurface().bg;\n}\n\n// Theme-adapted brand colors — precomputed for contrast against the actual terminal bg.\nlet adaptedBrand: Record<string, string> = {};\n\n// Theme-adapted surface colors — precomputed for contrast against the actual terminal bg.\nlet adaptedSurface: Partial<Record<string, string>> = {};\n\n// Surface keys that represent text colors (not backgrounds/borders)\nconst textSurfaceKeys: (keyof MastraSurface)[] = ['white', 'specialGray', 'mainGray', 'darkGray'];\n\n// Theme keys that are used as foreground text colors (not backgrounds/borders)\nconst textThemeKeys: (keyof ThemeColors)[] = [\n  'accent',\n  'success',\n  'error',\n  'warning',\n  'muted',\n  'dim',\n  'text',\n  'thinkingText',\n  'userMessageText',\n  'toolTitle',\n  'toolOutput',\n  'textHighlight',\n  'path',\n  'number',\n  'function',\n];\n\n// Comfortable minimum contrast for TUI body text — above WCAG AA (4.5:1) for better readability\nexport const TUI_MIN_CONTRAST = 5.5;\n\n/** Terminal width buffer applied at the framework level to prevent wrapping in nested terminals */\nexport const TERM_WIDTH_BUFFER = 3;\n/** Get the effective terminal width (matching the framework's reduced width) */\nexport const getTermWidth = () => (process.stdout.columns || 80) - TERM_WIDTH_BUFFER;\n\n/** Left indent (in spaces) applied to assistant text (Markdown body) */\nexport const CHAT_INDENT = 2;\n/** Precomputed indent string for assistant text */\nexport const CHAT_INDENT_STR = ' '.repeat(2);\n/** Left indent (in spaces) applied to user messages and tool call boxes */\nexport const BOX_INDENT = 0;\n/** Precomputed indent string for boxes */\nexport const BOX_INDENT_STR = '';\n\n// Brand accent colors (purple, blue, etc.) use standard WCAG AA to preserve vibrancy\nconst BRAND_MIN_CONTRAST = 4.5;\n\nfunction computeAdaptedColors(): void {\n  const bg = getContrastBg();\n\n  adaptedBrand = {};\n  for (const [key, value] of Object.entries(mastraBrand)) {\n    adaptedBrand[key] = ensureContrast(value, bg, BRAND_MIN_CONTRAST);\n  }\n  adaptedSurface = {};\n  const surface = getSurface();\n  for (const key of textSurfaceKeys) {\n    adaptedSurface[key] = ensureContrast(surface[key], bg, TUI_MIN_CONTRAST);\n  }\n\n  // Adapt theme foreground colors against actual terminal bg\n  const baseTheme = currentThemeMode === 'light' ? lightTheme : darkTheme;\n  const adapted = { ...baseTheme };\n  for (const key of textThemeKeys) {\n    adapted[key] = ensureContrast(baseTheme[key], bg, TUI_MIN_CONTRAST);\n  }\n  currentTheme = adapted;\n}\n\n// Note: computeAdaptedColors() is called after darkTheme/lightTheme are defined (see below)\n\n/** Mastra palette — brand + text surface colors are contrast-adapted, other surface colors adapt to theme mode. */\nexport const mastra: MastraPalette = new Proxy({} as MastraPalette, {\n  get(_target, prop: string) {\n    if (prop in mastraBrand) {\n      return adaptedBrand[prop] ?? mastraBrand[prop as keyof typeof mastraBrand];\n    }\n    // For text surface colors, return the contrast-adapted version\n    if (prop in adaptedSurface) {\n      return adaptedSurface[prop];\n    }\n    const surface = getSurface();\n    if (prop in surface) {\n      return surface[prop as keyof MastraSurface];\n    }\n    return undefined;\n  },\n});\n\n/** Tint a hex color by a brightness factor (0–1). e.g. tintHex(\"#ff8800\", 0.15) → near-black orange */\nexport function tintHex(hex: string, factor: number): string {\n  const r = Math.floor(parseInt(hex.slice(1, 3), 16) * factor);\n  const g = Math.floor(parseInt(hex.slice(3, 5), 16) * factor);\n  const b = Math.floor(parseInt(hex.slice(5, 7), 16) * factor);\n  return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\n// =============================================================================\n// Theme Colors\n// =============================================================================\n\nexport type ThemeColor =\n  | 'accent'\n  | 'border'\n  | 'borderAccent'\n  | 'borderMuted'\n  | 'success'\n  | 'error'\n  | 'warning'\n  | 'muted'\n  | 'dim'\n  | 'text'\n  | 'thinkingText'\n  | 'userMessageText'\n  | 'toolTitle'\n  | 'toolArgs'\n  | 'toolOutput'\n  | 'textHighlight'\n  | 'toolBorderPending'\n  | 'toolBorderSuccess'\n  | 'toolBorderError'\n  | 'function'\n  | 'path'\n  | 'number';\n\nexport type ThemeBg =\n  | 'selectedBg'\n  | 'userMessageBg'\n  | 'systemReminderBg'\n  | 'toolPendingBg'\n  | 'toolSuccessBg'\n  | 'toolErrorBg'\n  | 'overlayBg'\n  | 'errorBg';\n\nexport interface ThemeColors {\n  // Core UI\n  accent: string;\n  border: string;\n  borderAccent: string;\n  borderMuted: string;\n  success: string;\n  error: string;\n  warning: string;\n  muted: string;\n  dim: string;\n  text: string;\n  thinkingText: string;\n  // User messages\n  userMessageBg: string;\n  userMessageText: string;\n  // System reminders\n  systemReminderBg: string;\n  // Tool execution\n  toolPendingBg: string;\n  toolSuccessBg: string;\n  toolErrorBg: string;\n  toolBorderPending: string;\n  toolBorderSuccess: string;\n  toolBorderError: string;\n  toolTitle: string;\n  toolArgs: string;\n  toolOutput: string;\n  textHighlight: string;\n  // Selection\n  selectedBg: string;\n  // Overlays\n  overlayBg: string;\n  // Error display\n  errorBg: string;\n  path: string;\n  number: string;\n  function: string;\n}\n\n// =============================================================================\n// Dark Theme\n// =============================================================================\n\nexport const darkTheme: ThemeColors = {\n  // Core UI\n  accent: '#16c858', // Brand green\n  border: '#3f3f46',\n  borderAccent: '#16c858',\n  borderMuted: '#27272a',\n  success: '#22c55e',\n  error: '#ef4444',\n  warning: '#f59e0b',\n  muted: '#8c8c94',\n  dim: '#84848c',\n  text: '#fafafa',\n  thinkingText: '#a1a1aa',\n  // User messages\n  userMessageBg: '#0f172a', // Slate blue\n  userMessageText: '#fafafa',\n  // System reminders\n  systemReminderBg: '#1a1400', // Dark orange tint\n  // Tool execution\n  toolPendingBg: darkSurface.antiGrid,\n  toolSuccessBg: darkSurface.antiGrid,\n  toolErrorBg: '#1f0a0a', // Dark red tint\n  toolBorderPending: '#52525b', // Zinc-600 dim grey for pending\n  toolBorderSuccess: '#52525b', // Zinc-600 dim grey for success\n  toolBorderError: '#ef4444', // Red for error\n  toolTitle: '#fb923c', // Amber for tool names\n  toolArgs: '#ffe4c4', // Bisque (warm cream) for tool arguments\n  toolOutput: '#d4d4d8',\n  textHighlight: '#c084fc', // Lavender for inline code, headings, links\n  // Error display\n  errorBg: '#291415', // Slightly lighter than toolErrorBg for contrast\n  path: '#9ca3af', // Gray for file paths\n  number: '#fbbf24', // Yellow for line numbers\n  function: '#60a5fa', // Light blue for function names\n  // Selection\n  selectedBg: darkSurface.hover,\n  // Overlays\n  overlayBg: darkSurface.antiGrid,\n};\n\n// =============================================================================\n// Light Theme\n// =============================================================================\n\nexport const lightTheme: ThemeColors = {\n  // Core UI\n  accent: '#0d8020', // Brand green (light mode)\n  border: '#d4d4d8',\n  borderAccent: '#0d8020',\n  borderMuted: '#e4e4e7',\n  success: '#15803d',\n  error: '#dc2626',\n  warning: '#d97706',\n  muted: '#595961',\n  dim: '#67676f',\n  text: '#18181b',\n  thinkingText: '#595961',\n  // User messages\n  userMessageBg: '#f0fdf4', // Light green tint\n  userMessageText: '#18181b',\n  // System reminders\n  systemReminderBg: '#fefce8', // Light yellow\n  // Tool execution\n  toolPendingBg: lightSurface.antiGrid,\n  toolSuccessBg: lightSurface.antiGrid,\n  toolErrorBg: '#fef2f2', // Light red\n  toolBorderPending: '#a1a1aa', // Zinc-400 dim grey for pending\n  toolBorderSuccess: '#a1a1aa', // Zinc-400 dim grey for success\n  toolBorderError: '#dc2626', // Red for error\n  toolTitle: '#c2410c', // Deep amber for light backgrounds\n  toolArgs: '#92400e', // Deep amber-brown for light backgrounds\n  toolOutput: '#3f3f46',\n  textHighlight: '#7c3aed', // Deep violet for light backgrounds\n  // Error display\n  errorBg: '#fef2f2', // Light red\n  path: '#6b7280', // Gray for file paths\n  number: '#b45309', // Amber for line numbers\n  function: '#2563eb', // Blue for function names\n  // Selection\n  selectedBg: lightSurface.hover,\n  // Overlays\n  overlayBg: lightSurface.antiGrid,\n};\n\n// =============================================================================\n// Theme Instance\n// =============================================================================\n\nlet currentTheme: ThemeColors = darkTheme;\n\n// Initialize adapted colors now that darkTheme/lightTheme are defined\ncomputeAdaptedColors();\n\n/**\n * Get the current theme colors.\n */\nfunction getTheme(): ThemeColors {\n  return currentTheme;\n}\n\n/**\n * Set the current theme.\n */\nfunction setTheme(colors: ThemeColors): void {\n  currentTheme = colors;\n}\n\n/**\n * Apply a theme mode, updating both the surface palette and the theme colors.\n */\nexport function applyThemeMode(mode: ThemeMode, terminalBgHex?: string): void {\n  currentThemeMode = mode;\n  currentTheme = mode === 'light' ? lightTheme : darkTheme;\n  detectedTerminalBg = terminalBgHex;\n  computeAdaptedColors();\n  // Set terminal default foreground via OSC 10 so unstyled text (e.g. editor input)\n  // adapts to the theme. Convert hex to rgb/ format for OSC.\n  if (process.stdout.isTTY) {\n    const textHex = currentTheme.text;\n    const r = parseInt(textHex.slice(1, 3), 16);\n    const g = parseInt(textHex.slice(3, 5), 16);\n    const b = parseInt(textHex.slice(5, 7), 16);\n    process.stdout.write(\n      `\\x1b]10;rgb:${r.toString(16).padStart(2, '0')}/${g.toString(16).padStart(2, '0')}/${b.toString(16).padStart(2, '0')}\\x07`,\n    );\n  }\n}\n\n/**\n * Restore terminal foreground to default. Call on exit to undo OSC 10 changes.\n */\nexport function restoreTerminalForeground(): void {\n  if (process.stdout.isTTY) {\n    // OSC 110 resets the terminal's default foreground to its original value.\n    process.stdout.write('\\x1b]110\\x07');\n  }\n}\n\n// =============================================================================\n// Theme Helper Functions\n// =============================================================================\n\n/**\n * Apply foreground color from theme.\n */\nfunction fg(color: ThemeColor, text: string): string {\n  const hex = currentTheme[color];\n  if (!hex) return text;\n  return chalk.hex(hex)(text);\n}\n\n/**\n * Apply background color from theme.\n */\nfunction bg(color: ThemeBg, text: string): string {\n  const hex = currentTheme[color];\n  if (!hex) return text;\n  return chalk.bgHex(hex)(text);\n}\n\n/**\n * Apply bold styling.\n */\nfunction bold(text: string): string {\n  return chalk.bold(text);\n}\n\n/**\n * Apply italic styling.\n */\nfunction italic(text: string): string {\n  return chalk.italic(text);\n}\n\n/**\n * Apply dim styling.\n */\nfunction dim(text: string): string {\n  return chalk.dim(text);\n}\n\n// =============================================================================\n// Contrast Utilities (WCAG 2.1)\n// =============================================================================\n\n/** Convert a single sRGB channel (0–1) to linear light. */\nfunction linearize(c: number): number {\n  return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\n/** Parse a hex color string into [r, g, b] in 0–1 range. */\nfunction parseHex(hex: string): [number, number, number] {\n  const h = hex.replace('#', '');\n  return [parseInt(h.slice(0, 2), 16) / 255, parseInt(h.slice(2, 4), 16) / 255, parseInt(h.slice(4, 6), 16) / 255];\n}\n\n/** Convert [r, g, b] (0–255) to a hex color string. */\nfunction toHex(r: number, g: number, b: number): string {\n  const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n  return `#${clamp(r).toString(16).padStart(2, '0')}${clamp(g).toString(16).padStart(2, '0')}${clamp(b).toString(16).padStart(2, '0')}`;\n}\n\n/** WCAG relative luminance of a hex color. Returns 0 (black) to 1 (white). */\nexport function luminance(hex: string): number {\n  const [r, g, b] = parseHex(hex);\n  return 0.2126 * linearize(r) + 0.7152 * linearize(g) + 0.0722 * linearize(b);\n}\n\n/** WCAG contrast ratio between two hex colors. Returns 1 (identical) to 21 (black/white). */\nexport function contrastRatio(hex1: string, hex2: string): number {\n  const l1 = luminance(hex1);\n  const l2 = luminance(hex2);\n  const lighter = Math.max(l1, l2);\n  const darker = Math.min(l1, l2);\n  return (lighter + 0.05) / (darker + 0.05);\n}\n\n/** Convert RGB (0–1) to HSL. Returns [h (0–360), s (0–1), l (0–1)]. */\nfunction rgbToHsl(r: number, g: number, b: number): [number, number, number] {\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n  const l = (max + min) / 2;\n  if (max === min) return [0, 0, l];\n  const d = max - min;\n  const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n  let h = 0;\n  if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n  else if (max === g) h = ((b - r) / d + 2) / 6;\n  else h = ((r - g) / d + 4) / 6;\n  return [h * 360, s, l];\n}\n\n/** Convert HSL to RGB (0–1). */\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\n  h = h / 360;\n  if (s === 0) return [l, l, l];\n  const hue2rgb = (p: number, q: number, t: number) => {\n    if (t < 0) t += 1;\n    if (t > 1) t -= 1;\n    if (t < 1 / 6) return p + (q - p) * 6 * t;\n    if (t < 1 / 2) return q;\n    if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n    return p;\n  };\n  const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n  const p = 2 * l - q;\n  return [hue2rgb(p, q, h + 1 / 3), hue2rgb(p, q, h), hue2rgb(p, q, h - 1 / 3)];\n}\n\n/**\n * Adjust a foreground color to ensure sufficient contrast against a background.\n * Adjusts lightness in HSL space to preserve hue and saturation.\n * Returns the original color if it already has sufficient contrast.\n */\nexport function ensureContrast(fgHex: string, bgHex: string, minRatio = 4.5): string {\n  if (contrastRatio(fgHex, bgHex) >= minRatio) return fgHex;\n\n  const [r, g, b] = parseHex(fgHex);\n  const [h, s, origL] = rgbToHsl(r, g, b);\n  const origCR = contrastRatio(fgHex, bgHex);\n\n  function searchDirection(lighten: boolean): { hex: string; contrast: number } {\n    const targetL = lighten ? 1 : 0;\n    const extreme = lighten ? '#ffffff' : '#000000';\n    const extremeCR = contrastRatio(extreme, bgHex);\n    if (extremeCR <= origCR) return { hex: fgHex, contrast: origCR };\n\n    let lo = 0;\n    let hi = 1;\n    let best = fgHex;\n    let bestCR = origCR;\n\n    for (let i = 0; i < 20; i++) {\n      const mid = (lo + hi) / 2;\n      const newL = origL + (targetL - origL) * mid;\n      const [nr, ng, nb] = hslToRgb(h, s, newL);\n      const candidate = toHex(nr * 255, ng * 255, nb * 255);\n      const cr = contrastRatio(candidate, bgHex);\n      if (cr >= minRatio) {\n        best = candidate;\n        bestCR = cr;\n        hi = mid;\n      } else {\n        lo = mid;\n      }\n    }\n\n    if (bestCR < minRatio && extremeCR > bestCR) {\n      // If the best hue-preserving result is reasonably close to the target,\n      // keep it to preserve color identity rather than collapsing to black/white.\n      if (bestCR >= minRatio * 0.65) {\n        return { hex: best, contrast: bestCR };\n      }\n      return { hex: extreme, contrast: extremeCR };\n    }\n\n    return { hex: best, contrast: bestCR };\n  }\n\n  const whiteContrast = contrastRatio('#ffffff', bgHex);\n  const blackContrast = contrastRatio('#000000', bgHex);\n  const primaryLighten = whiteContrast >= blackContrast;\n\n  const primaryResult = searchDirection(primaryLighten);\n  if (primaryResult.contrast >= minRatio) return primaryResult.hex;\n\n  const altResult = searchDirection(!primaryLighten);\n  if (altResult.contrast >= minRatio) return altResult.hex;\n\n  return primaryResult.contrast >= altResult.contrast ? primaryResult.hex : altResult.hex;\n}\n\n/**\n * Returns \"#ffffff\" or \"#000000\" depending on which has better contrast\n * against the given hex background color (WCAG relative luminance).\n */\nexport function getContrastText(hexBg: string): string {\n  return luminance(hexBg) > 0.179 ? '#000000' : '#ffffff';\n}\n\nconst NEAR_BLACK_LUMINANCE = luminance('#111111');\nconst NEAR_BLACK_GLYPH_MIN_CONTRAST = 3;\n\n/**\n * Keep deliberately subdued glyph colors on black/nearly-black backgrounds,\n * but contrast-adapt them on brighter terminal backgrounds.\n */\nexport function ensureContrastUnlessNearBlack(fgHex: string, minRatio = TUI_MIN_CONTRAST): string {\n  const bgHex = getContrastBg();\n  if (luminance(bgHex) <= NEAR_BLACK_LUMINANCE) return fgHex;\n  return ensureContrast(fgHex, bgHex, minRatio);\n}\n\n/**\n * Terminal glyphs need a little extra visibility even on black backgrounds.\n * Keep them subdued on near-black terminals, but do not let them get too faint.\n */\nexport function ensureTerminalGlyphContrast(fgHex: string, minRatio = TUI_MIN_CONTRAST): string {\n  const bgHex = getContrastBg();\n  const targetRatio = luminance(bgHex) <= NEAR_BLACK_LUMINANCE ? NEAR_BLACK_GLYPH_MIN_CONTRAST : minRatio;\n  return ensureContrast(fgHex, bgHex, targetRatio);\n}\n\n// =============================================================================\n// Theme Object\n// =============================================================================\n\nexport const theme = {\n  fg,\n  bg,\n  bold,\n  italic,\n  dim,\n  getTheme,\n  setTheme,\n};\n\n// =============================================================================\n// Markdown Theme (for pi-tui Markdown component)\n// =============================================================================\n\nexport function getMarkdownTheme(): MarkdownTheme {\n  const t = getTheme();\n  return {\n    heading: (text: string) => chalk.hex(t.textHighlight).bold(text),\n    link: (text: string) => chalk.hex(t.textHighlight)(text),\n    linkUrl: (text: string) => chalk.hex(t.muted)(text),\n    code: (text: string) => chalk.hex(t.textHighlight).bold(text),\n    codeBlock: (text: string) => chalk.hex(t.text)(text),\n    codeBlockBorder: (text: string) => chalk.hex(t.dim)(text),\n    quote: (text: string) => chalk.hex(t.muted).italic(text),\n    quoteBorder: (text: string) => chalk.hex(t.borderMuted)(text),\n    hr: (text: string) => chalk.hex(t.borderMuted)(text),\n    listBullet: (text: string) => chalk.hex(t.textHighlight)(text),\n    // Required by MarkdownTheme interface\n    bold: (text: string) => chalk.bold(text),\n    italic: (text: string) => chalk.italic(text),\n    strikethrough: (text: string) => chalk.strikethrough(text),\n    underline: (text: string) => chalk.underline(text),\n  };\n}\n\n// =============================================================================\n// Editor Theme (for pi-tui Editor component)\n// =============================================================================\n\nexport function getEditorTheme(): EditorTheme {\n  const t = getTheme();\n  return {\n    borderColor: (text: string) => chalk.hex(getContrastBg())(text),\n    selectList: {\n      selectedPrefix: (text: string) => chalk.hex(t.accent)(text),\n      selectedText: (text: string) => chalk.bgHex(t.selectedBg)(text),\n      description: (text: string) => chalk.hex(t.muted)(text),\n      scrollInfo: (text: string) => chalk.hex(t.dim)(text),\n      noMatch: (text: string) => chalk.hex(t.muted)(text),\n    },\n  };\n}\n\n// =============================================================================\n// Settings List Theme (for pi-tui SettingsList component)\n// =============================================================================\n\nexport function getSettingsListTheme(): SettingsListTheme {\n  const t = getTheme();\n  return {\n    label: (text: string, selected: boolean) => (selected ? chalk.hex(t.text).bold(text) : chalk.hex(t.muted)(text)),\n    value: (text: string, selected: boolean) => (selected ? chalk.hex(t.accent)(text) : chalk.hex(t.dim)(text)),\n    description: (text: string) => chalk.hex(t.muted).italic(text),\n    cursor: chalk.hex(t.accent)('→ '),\n    hint: (text: string) => chalk.hex(t.dim)(text),\n  };\n}\n\nexport function getSelectListTheme(): SelectListTheme {\n  const t = getTheme();\n  return {\n    selectedPrefix: (text: string) => chalk.hex(t.accent)(text),\n    selectedText: (text: string) => chalk.bgHex(t.selectedBg)(text),\n    description: (text: string) => chalk.hex(t.muted)(text),\n    scrollInfo: (text: string) => chalk.hex(t.dim)(text),\n    noMatch: (text: string) => chalk.hex(t.muted)(text),\n  };\n}\n","/**\n * Thread lock — ensures only one process writes to a thread at a time.\n *\n * Uses filesystem lock files: <appDataDir>/locks/<threadId>.lock\n * Each lock file contains the PID of the owning process.\n * Stale locks (from crashed processes) are detected and reclaimed.\n */\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { getAppDataDir } from './project.js';\n\nexport class ThreadLockError extends Error {\n  constructor(\n    public readonly threadId: string,\n    public readonly ownerPid: number,\n  ) {\n    super(`Thread ${threadId} is locked by another process (PID ${ownerPid})`);\n    this.name = 'ThreadLockError';\n  }\n}\n\nfunction getLocksDir(): string {\n  const dir = path.join(getAppDataDir(), 'locks');\n  if (!fs.existsSync(dir)) {\n    fs.mkdirSync(dir, { recursive: true });\n  }\n  return dir;\n}\n\nfunction getLockPath(threadId: string): string {\n  // Sanitize thread ID for filesystem safety\n  const safeId = threadId.replace(/[^a-zA-Z0-9_-]/g, '_');\n  return path.join(getLocksDir(), `${safeId}.lock`);\n}\n\nfunction isProcessAlive(pid: number): boolean {\n  try {\n    process.kill(pid, 0);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Attempt to acquire a lock for the given thread.\n * Throws ThreadLockError if another live process holds the lock.\n * Reclaims stale locks from dead processes.\n */\nexport function acquireThreadLock(threadId: string): void {\n  const lockPath = getLockPath(threadId);\n  const myPid = process.pid;\n\n  // Check for existing lock\n  if (fs.existsSync(lockPath)) {\n    try {\n      const content = fs.readFileSync(lockPath, 'utf-8').trim();\n      const ownerPid = parseInt(content, 10);\n\n      if (!isNaN(ownerPid) && ownerPid !== myPid && isProcessAlive(ownerPid)) {\n        throw new ThreadLockError(threadId, ownerPid);\n      }\n      // Stale lock (dead process) or our own lock — reclaim it\n    } catch (error) {\n      if (error instanceof ThreadLockError) throw error;\n      // File read error — try to overwrite\n    }\n  }\n\n  // Write our PID to the lock file\n  fs.writeFileSync(lockPath, String(myPid), { mode: 0o644 });\n}\n\n/**\n * Release the lock for the given thread (only if we own it).\n */\nexport function releaseThreadLock(threadId: string): void {\n  const lockPath = getLockPath(threadId);\n  const myPid = process.pid;\n\n  try {\n    if (!fs.existsSync(lockPath)) return;\n\n    const content = fs.readFileSync(lockPath, 'utf-8').trim();\n    const ownerPid = parseInt(content, 10);\n\n    // Only remove if we own it\n    if (ownerPid === myPid) {\n      fs.unlinkSync(lockPath);\n    }\n  } catch {\n    // Best-effort cleanup — ignore errors\n  }\n}\n\n/**\n * Check if a thread is locked by another process.\n * Returns the PID of the owner if locked, null otherwise.\n */\nexport function getThreadLockOwner(threadId: string): number | null {\n  const lockPath = getLockPath(threadId);\n\n  try {\n    if (!fs.existsSync(lockPath)) return null;\n\n    const content = fs.readFileSync(lockPath, 'utf-8').trim();\n    const ownerPid = parseInt(content, 10);\n\n    if (isNaN(ownerPid)) return null;\n    if (ownerPid === process.pid) return null; // Our own lock\n    if (!isProcessAlive(ownerPid)) {\n      // Stale lock — clean it up\n      try {\n        fs.unlinkSync(lockPath);\n      } catch {}\n      return null;\n    }\n\n    return ownerPid;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Release all thread locks owned by this process.\n * Call this on process exit.\n */\nexport function releaseAllThreadLocks(): void {\n  try {\n    const locksDir = getLocksDir();\n    const files = fs.readdirSync(locksDir);\n    const myPid = String(process.pid);\n\n    for (const file of files) {\n      if (!file.endsWith('.lock')) continue;\n      const lockPath = path.join(locksDir, file);\n      try {\n        const content = fs.readFileSync(lockPath, 'utf-8').trim();\n        if (content === myPid) {\n          fs.unlinkSync(lockPath);\n        }\n      } catch {\n        // Best-effort\n      }\n    }\n  } catch {\n    // Best-effort\n  }\n}\n"]}