mastracode 0.20.1-alpha.2 → 0.20.1-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/dist/agents/instructions.d.ts +1 -1
- package/dist/agents/instructions.d.ts.map +1 -1
- package/dist/agents/thread-caveman-state.d.ts +10 -9
- package/dist/agents/thread-caveman-state.d.ts.map +1 -1
- package/dist/{chunk-EMX6Z54S.js → chunk-3FXFMD2Z.js} +3 -3
- package/dist/chunk-3FXFMD2Z.js.map +1 -0
- package/dist/{chunk-X642TTJF.cjs → chunk-5SWBONRN.cjs} +14 -14
- package/dist/chunk-5SWBONRN.cjs.map +1 -0
- package/dist/{chunk-KUEDNW7V.js → chunk-BV7BQWMY.js} +3 -6
- package/dist/chunk-BV7BQWMY.js.map +1 -0
- package/dist/{chunk-FKCOZXXR.js → chunk-JMQ7TFZB.js} +69 -74
- package/dist/chunk-JMQ7TFZB.js.map +1 -0
- package/dist/{chunk-WRXTEOXA.cjs → chunk-OFMG5UNQ.cjs} +2 -6
- package/dist/chunk-OFMG5UNQ.cjs.map +1 -0
- package/dist/{chunk-CZU2KS6X.cjs → chunk-VSPSFM7I.cjs} +971 -976
- package/dist/chunk-VSPSFM7I.cjs.map +1 -0
- package/dist/{chunk-RY2LLNHZ.cjs → chunk-VUHUFCZE.cjs} +210 -109
- package/dist/chunk-VUHUFCZE.cjs.map +1 -0
- package/dist/{chunk-KNQVKFSK.js → chunk-W365KUF7.js} +168 -67
- package/dist/chunk-W365KUF7.js.map +1 -0
- package/dist/cli.cjs +20 -20
- package/dist/cli.js +4 -4
- package/dist/index.cjs +3 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/onboarding/settings.d.ts +3 -3
- package/dist/onboarding/settings.d.ts.map +1 -1
- package/dist/schema.d.ts +1 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/storage-6EJTSQCI.js +3 -0
- package/dist/{storage-MX3CK45B.js.map → storage-6EJTSQCI.js.map} +1 -1
- package/dist/storage-AX7V35VD.cjs +24 -0
- package/dist/{storage-XMOF6XTO.cjs.map → storage-AX7V35VD.cjs.map} +1 -1
- package/dist/tui/commands/om.d.ts +1 -1
- package/dist/tui/commands/om.d.ts.map +1 -1
- package/dist/tui/components/om-marker.d.ts +1 -4
- package/dist/tui/components/om-marker.d.ts.map +1 -1
- package/dist/tui/components/om-settings.d.ts +2 -2
- package/dist/tui/components/om-settings.d.ts.map +1 -1
- package/dist/tui/components/system-reminder.d.ts +4 -2
- package/dist/tui/components/system-reminder.d.ts.map +1 -1
- package/dist/tui/handlers/message.d.ts.map +1 -1
- package/dist/tui/handlers/om.d.ts.map +1 -1
- package/dist/tui/render-messages.d.ts.map +1 -1
- package/dist/tui/state.d.ts +0 -1
- package/dist/tui/state.d.ts.map +1 -1
- package/dist/tui.cjs +19 -19
- package/dist/tui.js +2 -2
- package/dist/utils/binaries.d.ts +1 -0
- package/dist/utils/binaries.d.ts.map +1 -1
- package/dist/utils/signals-pubsub.d.ts +33 -3
- package/dist/utils/signals-pubsub.d.ts.map +1 -1
- package/package.json +9 -9
- package/dist/chunk-CZU2KS6X.cjs.map +0 -1
- package/dist/chunk-EMX6Z54S.js.map +0 -1
- package/dist/chunk-FKCOZXXR.js.map +0 -1
- package/dist/chunk-KNQVKFSK.js.map +0 -1
- package/dist/chunk-KUEDNW7V.js.map +0 -1
- package/dist/chunk-RY2LLNHZ.cjs.map +0 -1
- package/dist/chunk-WRXTEOXA.cjs.map +0 -1
- package/dist/chunk-X642TTJF.cjs.map +0 -1
- package/dist/storage-MX3CK45B.js +0 -3
- package/dist/storage-XMOF6XTO.cjs +0 -24
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# mastracode
|
|
2
2
|
|
|
3
|
+
## 0.20.1-alpha.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [[`b7286f4`](https://github.com/mastra-ai/mastra/commit/b7286f4308267f5fd70e6bfee10dba9472640906), [`a481027`](https://github.com/mastra-ai/mastra/commit/a481027b549ba1018414990c8f045eaee7b9f413), [`801baa0`](https://github.com/mastra-ai/mastra/commit/801baa07cccdbaec1d00942a92bdc831111744a2), [`b3c3b18`](https://github.com/mastra-ai/mastra/commit/b3c3b189121489a3a51a8fd8204b569be9a89fe5)]:
|
|
8
|
+
- @mastra/core@1.37.0-alpha.4
|
|
9
|
+
|
|
10
|
+
## 0.20.1-alpha.3
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- Fixed MastraCode observer attachment mode persistence so Auto/On/Off choices are applied consistently across thread reloads. ([#16922](https://github.com/mastra-ai/mastra/pull/16922))
|
|
15
|
+
|
|
16
|
+
- Improved responsiveness during streaming: reduced animation and text input lag by eliminating remaining event-loop blockers. Dynamic instruction building now uses async git branch detection and parallel binary resolution, and AGENTS.md reminders render compact loaded path notices without reading instruction files during streaming. ([#16951](https://github.com/mastra-ai/mastra/pull/16951))
|
|
17
|
+
|
|
18
|
+
- Route Unix socket signal PubSub traffic through per-thread socket paths under `/tmp/mc/<resourceId>/<threadId>.sock` and guard concurrent socket initialization. ([#16939](https://github.com/mastra-ai/mastra/pull/16939))
|
|
19
|
+
|
|
20
|
+
- Updated dependencies [[`008baaf`](https://github.com/mastra-ai/mastra/commit/008baafd8d851f831407045aebead5a2e3342eff), [`ac442a4`](https://github.com/mastra-ai/mastra/commit/ac442a42fda0354ac2bcea772bf6691cb3e9dbb3), [`1e5c067`](https://github.com/mastra-ai/mastra/commit/1e5c067d2e20a781af670578180d1ee249806d41), [`008baaf`](https://github.com/mastra-ai/mastra/commit/008baafd8d851f831407045aebead5a2e3342eff), [`8116436`](https://github.com/mastra-ai/mastra/commit/81164363eb225d774e41ff27da6a5ea611406688), [`c27c4b9`](https://github.com/mastra-ai/mastra/commit/c27c4b9f137df5414fca4e45896aceccff6b0ed5), [`08b3b59`](https://github.com/mastra-ai/mastra/commit/08b3b590dd960dee6c9a6e39272f8927d803db6e)]:
|
|
21
|
+
- @mastra/memory@1.20.0-alpha.1
|
|
22
|
+
- @mastra/core@1.37.0-alpha.3
|
|
23
|
+
|
|
3
24
|
## 0.20.1-alpha.2
|
|
4
25
|
|
|
5
26
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/agents/instructions.ts"],"names":[],"mappings":"AAUA,
|
|
1
|
+
{"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/agents/instructions.ts"],"names":[],"mappings":"AAUA,wBAAsB,sBAAsB,CAAC,EAAE,cAAc,EAAE,EAAE;IAAE,cAAc,EAAE;QAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAA;CAAE,mBAuBjH"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import type { Harness } from '@mastra/core/harness';
|
|
2
2
|
/**
|
|
3
|
-
* Wires
|
|
4
|
-
*
|
|
3
|
+
* Wires MastraCode-owned OM settings into harness thread events so they persist
|
|
4
|
+
* per-thread and new threads inherit the most recent value.
|
|
5
5
|
*
|
|
6
|
-
* This is intentionally implemented in mastracode rather than core:
|
|
7
|
-
*
|
|
6
|
+
* This is intentionally implemented in mastracode rather than core: these
|
|
7
|
+
* settings are mastracode-specific OM concepts, so persistence stays scoped to
|
|
8
|
+
* the host.
|
|
8
9
|
*/
|
|
9
|
-
export declare function
|
|
10
|
+
export declare function attachOMThreadStatePersistence(harness: Harness<Record<string, unknown>>): void;
|
|
10
11
|
/**
|
|
11
|
-
* Eagerly restores
|
|
12
|
-
* Called once at TUI startup after the initial thread is selected,
|
|
13
|
-
* subscription set up later misses the startup `thread_changed` event.
|
|
12
|
+
* Eagerly restores MastraCode-owned OM settings for the currently-selected
|
|
13
|
+
* thread. Called once at TUI startup after the initial thread is selected,
|
|
14
|
+
* since the subscription set up later misses the startup `thread_changed` event.
|
|
14
15
|
*/
|
|
15
|
-
export declare function
|
|
16
|
+
export declare function restoreOMThreadStateForCurrentThread(harness: Harness<Record<string, unknown>>): Promise<void>;
|
|
16
17
|
//# sourceMappingURL=thread-caveman-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-caveman-state.d.ts","sourceRoot":"","sources":["../../src/agents/thread-caveman-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"thread-caveman-state.d.ts","sourceRoot":"","sources":["../../src/agents/thread-caveman-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,sBAAsB,CAAC;AAqEnE;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAS9F;AAED;;;;GAIG;AACH,wBAAsB,oCAAoC,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAInH"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AuthStorage, getGitHubCopilotBaseUrl, fetchCopilotModels, getAppDataDir, COPILOT_HEADERS } from './chunk-
|
|
1
|
+
import { AuthStorage, getGitHubCopilotBaseUrl, fetchCopilotModels, getAppDataDir, COPILOT_HEADERS } from './chunk-BV7BQWMY.js';
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
|
|
4
4
|
import * as path from 'path';
|
|
@@ -1825,5 +1825,5 @@ function releaseAllThreadLocks() {
|
|
|
1825
1825
|
}
|
|
1826
1826
|
|
|
1827
1827
|
export { BOX_INDENT, BOX_INDENT_STR, CHAT_INDENT, MEMORY_GATEWAY_DEFAULT_URL, MEMORY_GATEWAY_PROVIDER, OBSERVABILITY_AUTH_PREFIX, ONBOARDING_VERSION, TERM_WIDTH_BUFFER, THREAD_ACTIVE_MODEL_PACK_ID_KEY, ThreadLockError, acquireThreadLock, applyThemeMode, checkProfileProviderMismatch, createBrowserFromSettings, ensureTerminalGlyphContrast, getAvailableModePacks, getAvailableOmPacks, getCopilotModelCatalog, getCustomProviderId, getDynamicModel, getEditorTheme, getMarkdownTheme, getSelectListTheme, getSettingsListTheme, getTermWidth, getThemeMode, loadSettings, luminance, mastra, mastraBrand, releaseAllThreadLocks, releaseThreadLock, resolveModel, resolveModelDefaults, resolveOmRoleModel, resolveThreadActiveModelPackId, restoreTerminalForeground, saveSettings, setAuthStorage, setAuthStorage2, setAuthStorage3, setProfileProvider, theme, tintHex, toCustomProviderModelId };
|
|
1828
|
-
//# sourceMappingURL=chunk-
|
|
1829
|
-
//# sourceMappingURL=chunk-
|
|
1828
|
+
//# sourceMappingURL=chunk-3FXFMD2Z.js.map
|
|
1829
|
+
//# sourceMappingURL=chunk-3FXFMD2Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"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":["anthropic","authStorageInstance","getAuthStorage","setAuthStorage","wrapLanguageModel","openai","createAnthropic","createOpenAI","bg","p","q"],"mappings":"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","file":"chunk-3FXFMD2Z.js","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"]}
|