mastracode 0.22.3 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/dist/HarnessCompat.d.ts +2 -2
- package/dist/HarnessCompat.d.ts.map +1 -1
- package/dist/agents/mastracode-gateway.d.ts +58 -0
- package/dist/agents/mastracode-gateway.d.ts.map +1 -0
- package/dist/agents/model.d.ts +26 -28
- package/dist/agents/model.d.ts.map +1 -1
- package/dist/agents/{subagents/execute.d.ts → modes/build.d.ts} +3 -3
- package/dist/agents/modes/build.d.ts.map +1 -0
- package/dist/agents/{subagents → modes}/explore.d.ts +2 -2
- package/dist/agents/modes/explore.d.ts.map +1 -0
- package/dist/agents/modes/plan.d.ts +6 -0
- package/dist/agents/modes/plan.d.ts.map +1 -0
- package/dist/{chunk-EATS4KOR.cjs → chunk-3CO7PY6M.cjs} +1094 -239
- package/dist/chunk-3CO7PY6M.cjs.map +1 -0
- package/dist/{chunk-DJEQBK7L.cjs → chunk-CBPEMMRV.cjs} +1659 -2010
- package/dist/chunk-CBPEMMRV.cjs.map +1 -0
- package/dist/{chunk-W7Y7QIJA.js → chunk-FXYM4OEI.js} +14 -805
- package/dist/chunk-FXYM4OEI.js.map +1 -0
- package/dist/{chunk-OXYE6SUY.js → chunk-GKGPZBID.js} +836 -1187
- package/dist/chunk-GKGPZBID.js.map +1 -0
- package/dist/{chunk-FDDVVRPH.js → chunk-RDIIIT54.js} +1076 -221
- package/dist/chunk-RDIIIT54.js.map +1 -0
- package/dist/{chunk-NKTZDFIU.cjs → chunk-XPPJHUAD.cjs} +12 -809
- package/dist/chunk-XPPJHUAD.cjs.map +1 -0
- package/dist/cli.cjs +18 -18
- package/dist/cli.js +3 -3
- package/dist/index.cjs +3 -3
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/onboarding/onboarding-inline.d.ts +2 -2
- package/dist/onboarding/onboarding-inline.d.ts.map +1 -1
- package/dist/onboarding/settings.d.ts.map +1 -1
- package/dist/providers/claude-max.d.ts.map +1 -1
- package/dist/tui/chat-boundary-reconciliation.d.ts +18 -1
- package/dist/tui/chat-boundary-reconciliation.d.ts.map +1 -1
- package/dist/tui/command-dispatch.d.ts.map +1 -1
- package/dist/tui/commands/browser.d.ts.map +1 -1
- package/dist/tui/commands/goal.d.ts.map +1 -1
- package/dist/tui/commands/mode.d.ts.map +1 -1
- package/dist/tui/commands/new.d.ts.map +1 -1
- package/dist/tui/commands/settings.d.ts.map +1 -1
- package/dist/tui/commands/skills.d.ts.map +1 -1
- package/dist/tui/components/api-key-dialog.d.ts +2 -2
- package/dist/tui/components/api-key-dialog.d.ts.map +1 -1
- package/dist/tui/components/ask-question-dialog.d.ts +2 -2
- package/dist/tui/components/ask-question-dialog.d.ts.map +1 -1
- package/dist/tui/components/ask-question-inline.d.ts +4 -2
- package/dist/tui/components/ask-question-inline.d.ts.map +1 -1
- package/dist/tui/components/assistant-message.d.ts +2 -2
- package/dist/tui/components/assistant-message.d.ts.map +1 -1
- package/dist/tui/components/chat-boundary-spacer.d.ts +9 -9
- package/dist/tui/components/chat-boundary-spacer.d.ts.map +1 -1
- package/dist/tui/components/chat-spacing.d.ts +1 -1
- package/dist/tui/components/chat-spacing.d.ts.map +1 -1
- package/dist/tui/components/collapsible.d.ts +2 -2
- package/dist/tui/components/collapsible.d.ts.map +1 -1
- package/dist/tui/components/custom-editor.d.ts +2 -2
- package/dist/tui/components/custom-editor.d.ts.map +1 -1
- package/dist/tui/components/diff-output.d.ts +3 -1
- package/dist/tui/components/diff-output.d.ts.map +1 -1
- package/dist/tui/components/error-display.d.ts +4 -2
- package/dist/tui/components/error-display.d.ts.map +1 -1
- package/dist/tui/components/goal-cycles-dialog.d.ts +2 -2
- package/dist/tui/components/goal-cycles-dialog.d.ts.map +1 -1
- package/dist/tui/components/idle-counter.d.ts +1 -1
- package/dist/tui/components/idle-counter.d.ts.map +1 -1
- package/dist/tui/components/judge-display.d.ts +14 -2
- package/dist/tui/components/judge-display.d.ts.map +1 -1
- package/dist/tui/components/login-dialog.d.ts +2 -2
- package/dist/tui/components/login-dialog.d.ts.map +1 -1
- package/dist/tui/components/login-mode-selector.d.ts +2 -2
- package/dist/tui/components/login-mode-selector.d.ts.map +1 -1
- package/dist/tui/components/login-selector.d.ts +1 -1
- package/dist/tui/components/login-selector.d.ts.map +1 -1
- package/dist/tui/components/masked-input.d.ts +1 -1
- package/dist/tui/components/masked-input.d.ts.map +1 -1
- package/dist/tui/components/mcp-selector.d.ts +2 -2
- package/dist/tui/components/mcp-selector.d.ts.map +1 -1
- package/dist/tui/components/model-selector.d.ts +2 -2
- package/dist/tui/components/model-selector.d.ts.map +1 -1
- package/dist/tui/components/multi-step-progress.d.ts +3 -1
- package/dist/tui/components/multi-step-progress.d.ts.map +1 -1
- package/dist/tui/components/multiline-input.d.ts +1 -1
- package/dist/tui/components/multiline-input.d.ts.map +1 -1
- package/dist/tui/components/notification-summary.d.ts +1 -1
- package/dist/tui/components/notification-summary.d.ts.map +1 -1
- package/dist/tui/components/notification.d.ts +1 -1
- package/dist/tui/components/notification.d.ts.map +1 -1
- package/dist/tui/components/om-marker.d.ts +3 -1
- package/dist/tui/components/om-marker.d.ts.map +1 -1
- package/dist/tui/components/om-output.d.ts +3 -1
- package/dist/tui/components/om-output.d.ts.map +1 -1
- package/dist/tui/components/om-progress.d.ts +1 -1
- package/dist/tui/components/om-progress.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/plan-approval-inline.d.ts +2 -2
- package/dist/tui/components/plan-approval-inline.d.ts.map +1 -1
- package/dist/tui/components/reactive-signal.d.ts +1 -1
- package/dist/tui/components/reactive-signal.d.ts.map +1 -1
- package/dist/tui/components/settings.d.ts +2 -2
- package/dist/tui/components/settings.d.ts.map +1 -1
- package/dist/tui/components/shell-output.d.ts +3 -1
- package/dist/tui/components/shell-output.d.ts.map +1 -1
- package/dist/tui/components/simple-progress.d.ts +1 -1
- package/dist/tui/components/simple-progress.d.ts.map +1 -1
- package/dist/tui/components/slash-command.d.ts +3 -1
- package/dist/tui/components/slash-command.d.ts.map +1 -1
- package/dist/tui/components/state-signal.d.ts +1 -1
- package/dist/tui/components/state-signal.d.ts.map +1 -1
- package/dist/tui/components/subagent-execution.d.ts +2 -2
- package/dist/tui/components/subagent-execution.d.ts.map +1 -1
- package/dist/tui/components/system-reminder.d.ts +1 -1
- package/dist/tui/components/system-reminder.d.ts.map +1 -1
- package/dist/tui/components/task-progress.d.ts +1 -1
- package/dist/tui/components/task-progress.d.ts.map +1 -1
- package/dist/tui/components/temporal-gap.d.ts +3 -1
- package/dist/tui/components/temporal-gap.d.ts.map +1 -1
- package/dist/tui/components/thinking-settings.d.ts +2 -2
- package/dist/tui/components/thinking-settings.d.ts.map +1 -1
- package/dist/tui/components/thread-selector.d.ts +2 -2
- package/dist/tui/components/thread-selector.d.ts.map +1 -1
- package/dist/tui/components/tool-approval-dialog.d.ts +2 -2
- package/dist/tui/components/tool-approval-dialog.d.ts.map +1 -1
- package/dist/tui/components/tool-execution-enhanced.d.ts +2 -2
- package/dist/tui/components/tool-execution-enhanced.d.ts.map +1 -1
- package/dist/tui/components/tool-validation-error.d.ts +2 -2
- package/dist/tui/components/tool-validation-error.d.ts.map +1 -1
- package/dist/tui/components/user-message.d.ts +2 -2
- package/dist/tui/components/user-message.d.ts.map +1 -1
- package/dist/tui/components/wrapping-autocomplete-list.d.ts +1 -1
- package/dist/tui/components/wrapping-autocomplete-list.d.ts.map +1 -1
- package/dist/tui/components/wrapping-select-list.d.ts +1 -1
- package/dist/tui/components/wrapping-select-list.d.ts.map +1 -1
- package/dist/tui/display.d.ts.map +1 -1
- package/dist/tui/event-dispatch.d.ts.map +1 -1
- package/dist/tui/goal-manager.d.ts +48 -40
- package/dist/tui/goal-manager.d.ts.map +1 -1
- package/dist/tui/handlers/agent-lifecycle.d.ts +13 -0
- package/dist/tui/handlers/agent-lifecycle.d.ts.map +1 -1
- package/dist/tui/handlers/index.d.ts +1 -1
- package/dist/tui/handlers/index.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/handlers/tool.d.ts.map +1 -1
- package/dist/tui/handlers/types.d.ts +1 -1
- package/dist/tui/handlers/types.d.ts.map +1 -1
- package/dist/tui/mastra-tui.d.ts.map +1 -1
- package/dist/tui/modal-question.d.ts +1 -1
- package/dist/tui/modal-question.d.ts.map +1 -1
- package/dist/tui/overlay.d.ts +1 -1
- package/dist/tui/overlay.d.ts.map +1 -1
- package/dist/tui/prompt-api-key.d.ts +1 -1
- package/dist/tui/prompt-api-key.d.ts.map +1 -1
- package/dist/tui/render-messages.d.ts +1 -1
- package/dist/tui/render-messages.d.ts.map +1 -1
- package/dist/tui/setup.d.ts.map +1 -1
- package/dist/tui/shell.d.ts.map +1 -1
- package/dist/tui/state.d.ts +2 -2
- package/dist/tui/state.d.ts.map +1 -1
- package/dist/tui/status-line.d.ts.map +1 -1
- package/dist/tui/theme.d.ts +1 -1
- package/dist/tui/theme.d.ts.map +1 -1
- package/dist/tui.cjs +19 -19
- package/dist/tui.js +2 -2
- package/package.json +20 -20
- package/dist/agents/coding.d.ts +0 -2
- package/dist/agents/coding.d.ts.map +0 -1
- package/dist/agents/subagents/execute.d.ts.map +0 -1
- package/dist/agents/subagents/explore.d.ts.map +0 -1
- package/dist/agents/subagents/plan.d.ts +0 -10
- package/dist/agents/subagents/plan.d.ts.map +0 -1
- package/dist/chunk-DJEQBK7L.cjs.map +0 -1
- package/dist/chunk-EATS4KOR.cjs.map +0 -1
- package/dist/chunk-FDDVVRPH.js.map +0 -1
- package/dist/chunk-NKTZDFIU.cjs.map +0 -1
- package/dist/chunk-OXYE6SUY.js.map +0 -1
- package/dist/chunk-W7Y7QIJA.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/binaries.ts","../src/agents/prompts/base.ts","../src/agents/prompts/build.ts","../src/agents/prompts/plan.ts","../src/agents/prompts/fast.ts","../src/utils/token-estimator.ts","../src/tools/web-search.ts","../src/agents/workspace.ts","../src/tools/utils.ts","../src/tools/request-sandbox-access.ts","../src/agents/prompts/agent-instructions.ts","../src/agents/prompts/model.ts","../src/agents/prompts/tool-guidance.ts","../src/agents/prompts/index.ts","../src/agents/instructions.ts","../src/providers/claude-max.ts","../src/providers/github-copilot.ts","../src/providers/openai-codex.ts","../src/agents/mastracode-gateway.ts","../src/agents/model.ts","../src/agents/memory.ts","../src/agents/modes/build.ts","../src/agents/modes/explore.ts","../src/agents/modes/plan.ts","../src/agents/thread-caveman-state.ts","../src/agents/tools.ts","../src/evals/scorers/classify-command.ts","../src/evals/scorers/extract-tools.ts","../src/evals/scorers/outcome.ts","../src/evals/scorers/efficiency.ts","../src/hooks/config.ts","../src/hooks/types.ts","../src/hooks/executor.ts","../src/hooks/manager.ts","../src/mcp/config.ts","../src/mcp/manager.ts","../src/schema.ts","../src/utils/gateway-sync.ts","../src/utils/signals-pubsub.ts","../src/utils/storage-factory.ts","../src/index.ts"],"names":["resolve","execFile","estimateTokenCount","sliceByTokens","createTavilySearchTool","createTool","createTavilyExtractTool","path","os","fs","existsSync","join","mastra","DEFAULT_CONFIG_DIR","TOOL_NAME_OVERRIDES","loadSettings","dirname","fileURLToPath","Workspace","LocalFilesystem","LocalSandbox","path2","os2","path3","z","homedir","readFileSync","normalize","MC_TOOLS","getCurrentGitBranchAsync","AuthStorage","anthropic","createAnthropic","wrapLanguageModel","authStorageInstance","getAuthStorage","setAuthStorage","COPILOT_HEADERS","getGitHubCopilotBaseUrl","GoogleSchemaCompatLayer","applyCompatLayer","createOpenAICompatible","fetchCopilotModels","openai","createOpenAI","PROVIDER_REGISTRY","MastraModelGateway","MastraGateway","MEMORY_GATEWAY_PROVIDER","getCustomProviderId","ModelRouterLanguageModel","GATEWAY_AUTH_HEADER","DEFAULT_OM_MODEL_ID","getOmScope","DEFAULT_OBS_THRESHOLD","DEFAULT_REF_THRESHOLD","Memory","fastembed","NotificationsStorage","createNotificationInboxTool","createScorer","filterRun","WEIGHTS","THRESHOLDS","score","path4","os3","fs2","spawn","loadSingleConfig","mergeConfigs","path5","os4","fs3","validateConfig","mkdirSync","writeFileSync","renameSync","getAppDataDir","MCPOAuthClientProvider","MCPClient","GatewayRegistry","PubSub","UnixSocketPubSub","mkdir","createHash","LibSQLStore","getDatabasePath","PostgresStore","LibSQLVector","getVectorDatabasePath","authStorage","OBSERVABILITY_AUTH_PREFIX","validateConfigDirName","detectProject","getResourceIdOverride","getStorageConfig","DuckDBStore","getObservabilityDatabasePath","InMemoryHarness","storage","MastraCompositeStore","observability","Observability","MastraStorageExporter","MastraPlatformExporter","SensitiveDataFilter","githubSignals","GithubSignals","requestContext","RequestContext","harness","Agent","TaskSignalProvider","DEFAULT_GOAL_JUDGE_PROMPT","AgentsMDInjector","ProviderHistoryCompat","StreamErrorRetryProcessor","PrefillErrorHandler","config","getAvailableModePacks","getAvailableOmPacks","resolveModelDefaults","resolveOmRoleModel","Harness","getToolCategory","saveSettings","acquireThreadLock","releaseThreadLock"],"mappings":"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","file":"chunk-3CO7PY6M.cjs","sourcesContent":["import { execFile, execFileSync } from 'node:child_process';\n\nexport interface CommonBinary {\n name: string;\n path: string | null;\n}\n\nconst COMMON_BINARIES = [\n 'python',\n 'python3',\n 'node',\n 'npm',\n 'pnpm',\n 'yarn',\n 'bun',\n 'git',\n 'rg',\n 'fd',\n 'fdfind',\n 'curl',\n 'wget',\n 'docker',\n 'make',\n 'gcc',\n 'g++',\n 'go',\n 'rustc',\n 'cargo',\n] as const;\n\nlet cachedBinaries: CommonBinary[] | null = null;\nlet inFlightPromise: Promise<CommonBinary[]> | null = null;\n\nfunction resolveBinary(name: string): string | null {\n const command = process.platform === 'win32' ? 'where' : 'which';\n try {\n const output = execFileSync(command, [name], { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n return output.split(/\\r?\\n/)[0] || null;\n } catch {\n return null;\n }\n}\n\nfunction resolveBinaryAsync(name: string): Promise<string | null> {\n const command = process.platform === 'win32' ? 'where' : 'which';\n return new Promise(resolve => {\n execFile(command, [name], { encoding: 'utf-8' }, (err, stdout) => {\n if (err) {\n resolve(null);\n return;\n }\n resolve(stdout.trim().split(/\\r?\\n/)[0] || null);\n });\n });\n}\n\nexport function detectCommonBinaries(): CommonBinary[] {\n cachedBinaries ??= COMMON_BINARIES.map(name => ({\n name,\n path: resolveBinary(name),\n }));\n\n return cachedBinaries;\n}\n\nexport async function detectCommonBinariesAsync(): Promise<CommonBinary[]> {\n if (cachedBinaries) return cachedBinaries;\n if (inFlightPromise) return inFlightPromise;\n\n inFlightPromise = Promise.all(\n COMMON_BINARIES.map(async name => ({\n name,\n path: await resolveBinaryAsync(name),\n })),\n );\n\n try {\n cachedBinaries = await inFlightPromise;\n return cachedBinaries;\n } finally {\n inFlightPromise = null;\n }\n}\n","/**\n * Base system prompt — shared behavioral instructions for all modes.\n * This is the \"brain\" that makes the agent a good coding assistant.\n */\n\nexport interface PromptContext {\n projectPath: string;\n projectName: string;\n gitBranch?: string;\n platform: string;\n commonBinaries?: { name: string; path: string | null }[];\n date: string;\n mode: string;\n modelId?: string;\n activePlan?: { title: string; plan: string; approvedAt: string } | null;\n toolGuidance: string;\n}\n\nexport function buildBasePrompt(ctx: PromptContext): string {\n const commonBinaries = formatCommonBinaries(ctx.commonBinaries);\n\n return `You are Mastra Code, an interactive CLI coding agent that helps users with software engineering tasks.\n\n# Environment\nWorking directory: ${ctx.projectPath}\nProject: ${ctx.projectName}\n${ctx.gitBranch ? `Git branch: ${ctx.gitBranch}` : 'Not a git repository'}\nPlatform: ${ctx.platform}${commonBinaries ? `\\nCommon binaries: ${commonBinaries}` : ''}\nDate: ${ctx.date}\nCurrent mode: ${ctx.mode}\n\n${ctx.toolGuidance}\n\n# Memory Style\n- Your memory system may contain observations or reflections written in terse caveman-speak to reduce token usage.\n- Treat that compressed memory style as storage format only.\n- Do NOT imitate or adopt caveman-speak in your user-facing responses unless the user explicitly asks for that style.\n- Use the memory content for facts and context, but respond in your normal clear professional style by default.\n\n# How to Work on Tasks\n\n## Start by Understanding\n- Read relevant code before making changes. Use search_content/find_files to find related files.\n- For unfamiliar codebases, check git log to understand recent changes and patterns.\n- Identify existing conventions (naming, structure, error handling) and follow them.\n\n## Goal Mode Awareness\n- Mastra Code has a goal mode for longer-running work. A goal is a persistent objective that the agent continues pursuing across turns until a judge decides the goal is complete, should continue, should pause, or should wait for user input.\n- Users can start goal mode directly with /goal <objective>. In plan mode, plans submitted with the submit_plan tool may also be started as a goal if the user selects that option in the approval UI.\n- Help users create good goals by making objectives concrete, outcome-focused, verifiable, and bounded. Prefer goals that state the desired end state, relevant constraints, and what proof or verification should be produced.\n- When writing implementation plans, make them goal-ready: structure steps so they can be carried out autonomously after approval, include clear verification criteria, call out risks/blockers, and avoid vague instructions that would leave the goal judge unable to determine completion.\n- If a proposed goal is too broad or ambiguous to pursue safely, ask a focused clarification or suggest a tighter objective.\n\n# Coding Philosophy\n\n- **Avoid over-engineering.** Only make changes that are directly requested or clearly necessary.\n- **Don't add extras.** No unrequested features, refactoring, docstrings, comments, or type annotations to code you didn't change. Only add comments where the logic isn't self-evident.\n- **Don't add unnecessary error handling.** Trust internal code and framework guarantees. Only validate at system boundaries (user input, external APIs).\n- **Don't create premature abstractions.** Three similar lines of code is better than a helper function used once. Don't design for hypothetical future requirements.\n- **Clean up dead code.** If something is unused, delete it completely. No backwards-compatibility shims, no renaming to \\`_unused\\`, no \\`// removed\\` comments.\n- **Be careful with security.** Don't introduce command injection, XSS, SQL injection, or other vulnerabilities. If you notice insecure code you wrote, fix it immediately.\n\n# Git Safety\n\n## Hard Rules\n- NEVER run destructive commands (\\`push --force\\`, \\`reset --hard\\`, \\`clean -fd\\`) unless explicitly requested.\n- NEVER use interactive flags (\\`git rebase -i\\`, \\`git add -i\\`) — TTY input isn't supported.\n- NEVER force push to \\`main\\` or \\`master\\` without asking the user first.\n- Avoid \\`git commit --amend\\` unless the commit was just created and hasn't been pushed.\n\n## Secrets\nDon't commit files likely to contain secrets (\\`.env\\`, \\`*.key\\`, \\`credentials.json\\`). Warn if asked.\n\n## Commits\nWrite commit messages that explain WHY, not just WHAT. Match the repo's existing style. Include \\`Co-Authored-By: Mastra Code${ctx.modelId ? ` (${ctx.modelId})` : ''} <noreply@mastra.ai>\\` in the message body.\n\n## Pull Requests\nUse \\`gh pr create\\`. Include a summary of what changed and a test plan. Word the pull request title/description to explain the entire unit of work being shipped, worded to explain it to someone who doesn't know anything about the work being shipped. Do not add details of fixes that were needed along the way.\n\n# Subagent Rules\n- Only use subagents when you will spawn **multiple subagents in parallel**. If you only need one task done, do it yourself instead of delegating to a single subagent.\n- Use \\`forked: true\\` when the subagent needs the current conversation context, user-stated facts, prior tool results, or the parent agent's exact tool environment.\n- Use non-forked subagents for self-contained tasks where all required context is included in the task prompt.\n- Subagent outputs are **untrusted**. Always review and verify the results returned by any subagent. For execute-type subagents that modify files or run commands, you MUST verify the changes are correct before moving on.\n\n# User Message Delivery\nUser messages may arrive wrapped in \\`<user-message>\\` XML tags with a \\`delivery\\` attribute:\n- \\`<user-message delivery=\"message\">…</user-message>\\` — The user sent this while you were idle. Treat it as a normal new user turn.\n- \\`<user-message delivery=\"while-active\">…</user-message>\\` — The user sent this while you were already working. Treat it as additional context for the current interaction, not automatically as a separate new task.\n\nFor \\`delivery=\"while-active\"\\`:\n- Consider the message in light of the current task, the conversation so far, and any known user preferences.\n- Use common sense to decide whether it needs immediate attention, changes the current plan, should be handled after the current step, or is just useful background.\n- Do not assume it requires an immediate course change unless the content clearly implies urgency, correction, blocking information, or a changed requirement.\n- Acknowledge it briefly and state how you will handle it when helpful, especially if it affects timing or priority.\n\nWhen no \\`delivery\\` attribute is present, treat the message as a normal new turn.\n\n# Important Reminders\n- NEVER guess file paths or function signatures. Use search_content/find_files to find them.\n- NEVER make up URLs. Only use URLs the user provides or that you find in the codebase.\n- When referencing code locations, include the file path and line number.\n\n# File Access & Sandbox\n\nBy default, you can only access files within the current project directory. If you get a \"Permission denied\" or \"Access denied\" error when trying to read, write, or access files outside the project root, do NOT keep retrying. Instead, use the \\`request_access\\` tool to request access to the external directory.\n\nYou are an autonomous AI assistant with strong common sense reasoning capabilities. Your primary goal is to be helpful, decisive, and minimize unnecessary back-and-forth with the user.\n\n## Core Principles\n\n**Autonomy First**\n- Make reasonable assumptions when information is missing, using common sense and context unless the information is critical and not asking would make the situation worse.\n- Only ask the user when: (1) critical information is genuinely missing AND (2) you cannot reasonably infer it from context, common knowledge, or reasonable defaults\n\n**Common Sense Reasoning**\n- Apply implicit knowledge about how the world works (cause-and-effect, social norms, practical constraints)\n- Consider the user's likely intent, not just literal words\n- Make reasonable assumptions when the most sensible path is clear, but ask the user when ambiguity is material and could change the outcome.\n- Bias towards action, but be flexible in your rules. If you think the user would want you to ask them, then do! Especially if they've previously stated a preference that you do in the specific situation.\n\n**Decision Framework**\nBefore asking a question, run this internal check:\n1. Is this information critical to completing the task?\n2. Can I reasonably infer or assume this?\n3. Would a reasonable human make this assumption in this context?\n4. Is there a safe default I can use?\n\nIf the answer to #2, #3, or #4 is \"yes\" → PROCEED without asking\nOnly if all are \"no\" → THEN ask the user\n\n**Communication Style**\n- Be direct and concise—no fillers, meta-commentary, or unnecessary explanations\n- State your assumptions clearly when you make them\n- Provide your best answer, then offer to adjust if needed\n- Don't announce what you're about to do—just do it\n\n**Completion Criteria**\n- Consider a task \"done\" when you've provided a complete, actionable response\n- Don't ask \"Is there anything else?\"—let the user drive follow-ups\n- If multiple valid approaches exist, pick the most sensible one and explain why briefly\n\n## When You MUST Ask\n- Safety-critical decisions with real-world consequences\n- Irreversible actions where the wrong choice causes significant harm\n- Genuine ambiguity where multiple interpretations are equally valid AND the distinction matters\n- User preferences that cannot be reasonably inferred (e.g., \"which color do you prefer?\")\n\n## When You Should NOT Ask\n- Minor details that don't affect the core outcome\n- Information available through reasonable inference\n- Choices where any reasonable option works\n- Things you can reasonably assume based on context\n- When common sense applies or the answer is obvious\n\n# Tone and Style\n- Your output is displayed in a terminal so long output text will be hard for the user to read. Keep responses short/concise and to the point, the user will ask questions if they need you to expand on anything. Be critical of yourself and don't add filler sentences, say what you mean, and say it quickly, while remaining friendly.\n- Use Github-flavored markdown for formatting.\n- Only use emojis if the user explicitly requests it.\n- Use tool calls for actions (editing files, running commands, searching, updating tasks, etc.). Use text for communication — talk to the user in text, not via tools, except for explicit user-facing or progress tools listed in the tool guidance.\n- Prioritize technical accuracy over validating the user's beliefs. Be direct and objective. Respectful correction is more valuable than false agreement.\n`;\n}\n\nfunction formatCommonBinaries(binaries: PromptContext['commonBinaries']): string {\n if (!binaries?.length) return '';\n\n return binaries.map(binary => `${binary.name}: ${binary.path ?? 'not found'}`).join(', ');\n}\n","/**\n * Build mode prompt — full tool access, make changes and verify.\n */\n\nimport type { PromptContext } from './index.js';\n\n/**\n * Dynamic build mode prompt function.\n * When an approved plan exists in state, prepends it so the agent\n * knows exactly what to implement.\n */\nexport function buildModePromptFn(ctx: PromptContext): string {\n if (ctx.activePlan) {\n return (\n `# Approved Plan\n\n**${ctx.activePlan.title}**\n\n${ctx.activePlan.plan}\n\n---\n\nImplement the approved plan above. Follow the steps in order and verify each step works before moving on.\n\n` + buildModePrompt\n );\n }\n return buildModePrompt;\n}\n\nexport const buildModePrompt = `\n# Build Mode\n\nYou are in BUILD mode. You have full access to all tools and can read, write, edit, and execute commands.\n\n## Working Style\n\n**For simple tasks** (typo fixes, small edits, single-file changes):\n- Just do it. No need to explain your plan first.\n\n**For non-trivial tasks** (3+ files, architectural decisions, unclear requirements):\n- Use the available task-management tools to create and update your task list\n- Work on ONE step at a time — complete it and verify it works before moving on\n- If multiple approaches are plausible and the choice would materially affect scope, behavior, or risk, stop and ask the user\n\n## The Implementation Loop\n\nFor each change you make:\n\n1. **Understand** — Read the relevant code. Check how similar things are done elsewhere.\n2. **Implement** — Make the change. Follow existing patterns and conventions.\n3. **Verify** — Test that it works. Don't assume — actually run it.\n4. **Prove** — Proactively prove that the change is good, makes sense in context, is a positive contribution, and works fully. The burden of proof is on YOU.\n5. **Clean up** — Ensure no broken code, no debug statements, no half-done features.\n\nOnly move to the next change after the current one is verified and proved to be working.\n\n## Verification is Required\n\nBefore considering any task complete:\n- Run relevant tests (check package.json for test scripts)\n- For TypeScript, run \\`tsc --noEmit\\` to catch type errors\n- If there are no automated tests, manually verify the behavior works as expected\n- Confirm the result makes sense in the codebase and improves the requested behavior\n- Use available task-checking tools to ensure all tracked tasks are done\n\n**Don't mark something as done until you've verified and proved it actually works.**\n\n## Error Recovery\n\nWhen something breaks:\n1. Read the full error output carefully — don't guess\n2. Find the root cause, not just the symptom\n3. Fix it properly — no casts or suppressions to hide errors\n4. Re-run to confirm the fix\n5. If progress is blocked after reasonable attempts, briefly explain the blocker, what you've tried, and the next best option\n\n## Git in Build Mode\n\n- Before committing, verify the code compiles and passes lint\n- Use descriptive branch names: \\`feat/...\\`, \\`fix/...\\`, \\`refactor/...\\`\n`;\n","/**\n * Plan mode prompt — read-only exploration and planning.\n */\n\nexport const planModePrompt = `\n# Plan Mode — READ-ONLY\n\nYou are in PLAN mode. Your job is to explore the codebase and design an implementation plan — NOT to make changes.\n\n## CRITICAL: Read-Only Mode\n\nThis mode is **strictly read-only**. You must NOT modify anything.\n\n- Do NOT modify, create, or delete any files\n- Do NOT run commands that change state (no git commit, no npm install, no file creation)\n- Do NOT run build commands, tests, or scripts that have side effects\n\nIf the user asks you to make changes while in Plan mode, explain that you're in read-only mode and they should switch to Build mode (\\`/mode build\\`) first.\n\n## Exploration Strategy\n\nBefore writing any plan, build a mental model of the codebase:\n1. Start with the directory structure (\\`view\\` on the project root or relevant subdirectory).\n2. Find the relevant entry points and core files using \\`search_content\\` and \\`find_files\\`.\n3. Read the actual code — don't assume based on file names alone.\n4. Trace data flow: where does input come from, how is it transformed, where does it go?\n5. Identify existing patterns the codebase uses (naming, structure, error handling, testing).\n\n## Goal-Ready Plans\n\nThe submit_plan approval UI can let the user approve the plan normally or start it as a persistent goal. Write plans so they can be carried out as a goal if the user chooses that option:\n- Make the desired outcome explicit and verifiable.\n- Break work into ordered, actionable steps that can be executed autonomously.\n- Include constraints, risks, blockers, and decision points that may require user input.\n- Include concrete verification criteria so the goal judge can tell when the work is done.\n\n## Your Plan Output\n\nProduce a clear, step-by-step plan with this structure:\n\n### Overview\nOne paragraph: what the change does and why.\n\n### Complexity Estimate\n- **Size**: Small (1-2 files) / Medium (3-5 files) / Large (6+ files)\n- **Risk**: Low (additive, no breaking changes) / Medium (modifies existing behavior) / High (architectural, affects many consumers)\n- **Dependencies**: List any new packages, external services, or migration steps needed.\n\n### Steps\nFor each step:\n1. **File**: path to create or modify\n2. **Change**: what to add/modify/remove, with enough specificity to implement directly\n3. **Why**: brief rationale connecting this step to the overall goal\n\n### Verification\n- What tests to run\n- What to check manually\n- What could go wrong\n\n## IMMEDIATE ACTION: Call submit_plan Tool\n\nAs soon as your plan is complete, **STOP** and call the \\`submit_plan\\` tool immediately.\n\n**CRITICAL:** Do NOT generate a long text response describing your plan. The plan content belongs in the \\`submit_plan\\` tool call, not in your text output.\n\nWhen done, call:\n\\`\\`\\`javascript\nsubmit_plan({\n title: \"short descriptive title\",\n plan: \"your full plan in markdown\"\n})\n\\`\\`\\`\n\nThe user will see the plan rendered inline and can:\n- **Approve** — automatically switches to Build mode for implementation\n- **Start as goal** — approves the plan and enters goal mode so the agent keeps working toward the plan until judged complete, paused, or waiting for user input\n- **Reject** — stays in Plan mode\n- **Request changes** — provides feedback for you to revise and resubmit\n\nDo NOT start implementing until the plan is approved. If rejected with feedback, revise the plan and call \\`submit_plan\\` again.\n`;\n","/**\n * Fast mode prompt — quick answers and small edits, minimal overhead.\n */\n\nexport const fastModePrompt = `\n# Fast Mode\n\nYou are in FAST mode. Optimize for speed and brevity.\n\n## Rules\n- Keep responses short. Under 200 words unless the task genuinely requires more.\n- Skip planning. Just do the task directly.\n- For questions: give the direct answer, not a tutorial.\n- For edits: make the change, show what you did, move on.\n- Don't explore the codebase more than necessary for the immediate task.\n\n## When to Use Tools vs. Just Answer\n- If the user asks a general programming question, answer directly from knowledge. Don't search the codebase.\n- If the user asks about THIS project's code, use tools to look it up — don't guess.\n- If the user asks for a quick edit and you know the file, read it and edit it. Don't ask for confirmation.\n- One tool call to read + one to edit is ideal. Minimize round trips.\n`;\n","import { estimateTokenCount, sliceByTokens } from 'tokenx';\n\nfunction sanitizeInput(text: string | object) {\n if (!text) return '';\n return (typeof text === `string` ? text : JSON.stringify(text))\n .replaceAll(`<|endoftext|>`, ``)\n .replaceAll(`<|endofprompt|>`, ``);\n}\n\nexport function tokenEstimate(text: string | object): number {\n return estimateTokenCount(sanitizeInput(text));\n}\n\nexport function truncateStringForTokenEstimate(text: string, desiredTokenCount: number, fromEnd = true) {\n const sanitized = sanitizeInput(text);\n const totalTokens = estimateTokenCount(sanitized);\n\n if (totalTokens <= desiredTokenCount) return sanitized;\n\n const kept = fromEnd ? sliceByTokens(sanitized, -desiredTokenCount) : sliceByTokens(sanitized, 0, desiredTokenCount);\n\n return `[Truncated ~${totalTokens - desiredTokenCount} tokens]\n${kept}`;\n}\n","import { createTool } from '@mastra/core/tools';\nimport { createTavilySearchTool, createTavilyExtractTool } from '@mastra/tavily';\n\nimport { truncateStringForTokenEstimate } from '../utils/token-estimator.js';\n\nconst MAX_WEB_SEARCH_TOKENS = 2_000;\nconst MAX_WEB_EXTRACT_TOKENS = 2_000;\n\nconst MIN_RELEVANCE_SCORE = 0.25;\n\n/**\n * Check whether a Tavily API key is available in the environment.\n * Used by main.ts to decide whether to include Tavily tools or fall back\n * to Anthropic's native web search.\n */\nexport function hasTavilyKey(): boolean {\n return !!process.env.TAVILY_API_KEY;\n}\n\n/**\n * Wraps the @mastra/tavily search tool with mastracode-specific behavior:\n * relevance filtering, markdown string formatting, and token truncation.\n * The underlying Tavily tool handles client init, input validation, and the API call.\n */\nexport function createWebSearchTool() {\n const tavilySearchTool = createTavilySearchTool();\n\n return createTool({\n id: 'web-search',\n description: tavilySearchTool.description!,\n inputSchema: tavilySearchTool.inputSchema!,\n execute: async (input, context) => {\n const output: any = await tavilySearchTool.execute!(input as any, context as any);\n\n const parts: string[] = [];\n\n if (output.answer) {\n parts.push(`Answer: ${output.answer}`);\n }\n\n const filtered = output.results.filter((r: any) => (r.score ?? 1) >= MIN_RELEVANCE_SCORE);\n for (const r of filtered) {\n parts.push(`## ${r.title}\\n${r.url}\\n${r.content}`);\n }\n\n const images = (output.images || []).map((img: any) => img.url).filter(Boolean);\n if (images.length > 0) {\n parts.push(`Images:\\n${images.join('\\n')}`);\n }\n\n const text = parts.join('\\n\\n');\n return truncateStringForTokenEstimate(text, MAX_WEB_SEARCH_TOKENS);\n },\n });\n}\n\n/**\n * Wraps the @mastra/tavily extract tool with mastracode-specific behavior:\n * markdown string formatting and token truncation.\n */\nexport function createWebExtractTool() {\n const tavilyExtractTool = createTavilyExtractTool();\n\n return createTool({\n id: 'web-extract',\n description: tavilyExtractTool.description!,\n inputSchema: tavilyExtractTool.inputSchema!,\n execute: async (input, context) => {\n const output: any = await tavilyExtractTool.execute!(input as any, context as any);\n\n const parts: string[] = [];\n\n for (const r of output.results) {\n parts.push(`## ${r.url}\\n${r.rawContent}`);\n }\n\n for (const r of output.failedResults) {\n parts.push(`## ${r.url}\\nError: ${r.error}`);\n }\n\n const text = parts.join('\\n\\n');\n return truncateStringForTokenEstimate(text, MAX_WEB_EXTRACT_TOKENS);\n },\n });\n}\n","import fs, { existsSync } from 'node:fs';\nimport os from 'node:os';\nimport path, { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { HarnessRequestContext } from '@mastra/core/harness';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport { Workspace, LocalFilesystem, LocalSandbox } from '@mastra/core/workspace';\nimport type { LSPConfig, WorkspaceToolsConfig } from '@mastra/core/workspace';\nimport { DEFAULT_CONFIG_DIR } from '../constants.js';\nimport { loadSettings } from '../onboarding/settings.js';\nimport type { MastraCodeState } from '../schema';\nimport { TOOL_NAME_OVERRIDES } from '../tool-names.js';\n\n// =============================================================================\n// Sandbox Environment\n// =============================================================================\n\nfunction buildSandboxEnv(): NodeJS.ProcessEnv {\n return {\n ...process.env,\n // Explicit overrides for non-interactive subprocess execution\n FORCE_COLOR: '1',\n CLICOLOR_FORCE: '1',\n TERM: process.env.TERM || 'xterm-256color',\n CI: 'true',\n NONINTERACTIVE: '1',\n DEBIAN_FRONTEND: 'noninteractive',\n };\n}\n\n// =============================================================================\n// Create Workspace with Skills\n// =============================================================================\n\n// We support multiple skill locations for compatibility:\n// 1. Project-local: <configDir>/skills (project-specific mastracode skills)\n// 2. Project-local: .claude/skills (Claude Code compatible skills)\n// 3. Project-local: .agents/skills (Agent Skills spec compatible)\n// 4. Global: ~/<configDir>/skills (user-wide mastracode skills)\n// 5. Global: ~/.claude/skills (user-wide Claude Code skills)\n// 6. Global: ~/.agents/skills (user-wide Agent Skills spec compatible)\n\nconst claudeGlobalSkillsPath = path.join(os.homedir(), '.claude', 'skills');\nconst agentSkillsGlobalPath = path.join(os.homedir(), '.agents', 'skills');\n\n// Mastra's LocalSkillSource.readdir uses Node's Dirent.isDirectory() which\n// returns false for symlinks. Tools like `npx skills add` install skills as\n// symlinks, so we need to resolve them. For each symlinked skill directory,\n// we add the real (resolved) parent path as an additional skill scan path.\nfunction collectSkillPaths(skillsDirs: string[]): string[] {\n const paths: string[] = [];\n const seen = new Set<string>();\n\n for (const skillsDir of skillsDirs) {\n const resolved = path.resolve(skillsDir);\n if (!seen.has(resolved)) {\n seen.add(resolved);\n paths.push(skillsDir);\n }\n\n if (!fs.existsSync(skillsDir)) continue;\n\n try {\n const entries = fs.readdirSync(skillsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isSymbolicLink()) {\n const linkPath = path.join(skillsDir, entry.name);\n const realPath = fs.realpathSync(linkPath);\n const stat = fs.statSync(realPath);\n if (stat.isDirectory()) {\n const realParent = path.dirname(realPath);\n if (!seen.has(realParent)) {\n seen.add(realParent);\n paths.push(realParent);\n }\n }\n }\n }\n } catch {\n // Ignore errors during symlink resolution\n }\n }\n\n return paths;\n}\n\n// Build skill paths dynamically based on configDir and projectPath\nexport function buildSkillPaths(projectPath: string, configDir: string): string[] {\n const mastraCodeLocalSkillsPath = path.join(projectPath, configDir, 'skills');\n const claudeLocalSkillsPath = path.join(projectPath, '.claude', 'skills');\n const agentSkillsLocalPath = path.join(projectPath, '.agents', 'skills');\n const mastraCodeGlobalSkillsPath = path.join(os.homedir(), configDir, 'skills');\n\n return collectSkillPaths([\n mastraCodeLocalSkillsPath,\n claudeLocalSkillsPath,\n agentSkillsLocalPath,\n mastraCodeGlobalSkillsPath,\n claudeGlobalSkillsPath,\n agentSkillsGlobalPath,\n ]);\n}\n\n/**\n * Paths the agent is always allowed to access (in addition to the project root\n * and any per-thread sandboxAllowedPaths). The OS temp directory is included\n * so the agent can use it as a scratchpad without requesting access every time.\n */\nconst DEFAULT_ALLOWED_PATHS: string[] = [os.tmpdir(), '/tmp'].reduce<string[]>((acc, p) => {\n const resolved = path.resolve(p);\n if (!acc.includes(resolved)) acc.push(resolved);\n return acc;\n}, []);\n\nconst WORKSPACE_ID_PREFIX = 'mastra-code-workspace';\n\n/**\n * Detect the project's package runner from lock files.\n * Used as a fallback packageRunner for LSP when no binary is found locally or on PATH.\n */\nfunction detectPackageRunner(projectPath: string): string | undefined {\n if (existsSync(join(projectPath, 'pnpm-lock.yaml'))) return 'pnpm dlx';\n if (existsSync(join(projectPath, 'bun.lockb')) || existsSync(join(projectPath, 'bun.lock'))) return 'bunx';\n if (existsSync(join(projectPath, 'yarn.lock'))) return 'yarn dlx';\n if (existsSync(join(projectPath, 'package-lock.json'))) return 'npx --yes';\n return 'npx --yes';\n}\n\nexport function getDynamicWorkspace({ requestContext, mastra }: { requestContext: RequestContext; mastra?: Mastra }) {\n const ctx = requestContext.get('harness') as HarnessRequestContext<MastraCodeState> | undefined;\n const state = ctx?.getState();\n const modeId = ctx?.modeId ?? 'build';\n const rawProjectPath = state?.projectPath;\n\n if (!rawProjectPath) {\n throw new Error('Project path is required');\n }\n\n const projectPath = path.resolve(rawProjectPath);\n const configDir = state?.configDir ?? DEFAULT_CONFIG_DIR;\n const skillPaths = buildSkillPaths(projectPath, configDir);\n const workspaceId = `${WORKSPACE_ID_PREFIX}-${projectPath}`;\n const sandboxPaths = state?.sandboxAllowedPaths ?? [];\n const allowedPaths = [...skillPaths, ...DEFAULT_ALLOWED_PATHS, ...sandboxPaths.map((p: string) => path.resolve(p))];\n const isPlanMode = modeId === 'plan';\n\n const planModeTools = {\n mastra_workspace_write_file: { ...TOOL_NAME_OVERRIDES.mastra_workspace_write_file, enabled: false },\n mastra_workspace_edit_file: { ...TOOL_NAME_OVERRIDES.mastra_workspace_edit_file, enabled: false },\n mastra_workspace_ast_edit: { ...TOOL_NAME_OVERRIDES.mastra_workspace_ast_edit, enabled: false },\n };\n\n const workspaceTools: WorkspaceToolsConfig = {\n ...(isPlanMode ? { ...TOOL_NAME_OVERRIDES, ...planModeTools } : TOOL_NAME_OVERRIDES),\n };\n\n // Reuse existing workspace if already registered (preserves ProcessManager state)\n let existing: Workspace<LocalFilesystem, LocalSandbox> | undefined;\n try {\n existing = mastra?.getWorkspaceById(workspaceId) as Workspace<LocalFilesystem, LocalSandbox>;\n } catch {\n // Not registered yet\n }\n\n if (existing) {\n existing.filesystem.setAllowedPaths(allowedPaths);\n existing.setToolsConfig(workspaceTools);\n return existing;\n }\n\n const userLsp = loadSettings().lsp ?? {};\n const mcModulePath = join(dirname(fileURLToPath(import.meta.url)), '..');\n const lspConfig: LSPConfig = {\n ...userLsp,\n packageRunner: userLsp.packageRunner || detectPackageRunner(projectPath), // Detected runner is the fallback — user's packageRunner always wins\n searchPaths: [mcModulePath, ...(userLsp.searchPaths ?? [])],\n };\n\n // First call for this project — create the workspace\n return new Workspace({\n id: workspaceId,\n name: 'Mastra Code Workspace',\n filesystem: new LocalFilesystem({\n basePath: projectPath,\n allowedPaths,\n }),\n sandbox: new LocalSandbox({\n workingDirectory: projectPath,\n env: buildSandboxEnv(),\n }),\n tools: workspaceTools,\n ...(skillPaths.length > 0 ? { skills: skillPaths } : {}),\n lsp: lspConfig,\n });\n}\n","import * as path from 'node:path';\nimport { buildSkillPaths } from '../agents/workspace.js';\nimport { DEFAULT_CONFIG_DIR } from '../constants.js';\n\n/**\n * Check whether `targetPath` falls inside `projectRoot` or any of the\n * additional `allowedPaths`. All arguments are expected to be absolute.\n *\n * Returns `true` when access should be **allowed**.\n */\nexport function isPathAllowed(targetPath: string, projectRoot: string, allowedPaths: string[] = []): boolean {\n const resolved = path.resolve(targetPath);\n const roots = [projectRoot, ...allowedPaths].map(p => path.resolve(p));\n\n return roots.some(root => resolved === root || resolved.startsWith(root + path.sep));\n}\n\n/**\n * Read allowed paths from the Mastra harness runtime context.\n * Combines skill paths (computed dynamically from projectPath and configDir)\n * with user-approved sandbox paths from harness state so that both parent\n * and subagent tools have the same access.\n * Returns default skill paths when the context is unavailable (e.g. in tests).\n */\nexport function getAllowedPathsFromContext(\n toolContext: { requestContext?: { get: (key: string) => unknown } } | undefined,\n): string[] {\n const harnessCtx = toolContext?.requestContext?.get('harness') as\n | {\n state?: { sandboxAllowedPaths?: string[]; projectPath?: string; configDir?: string };\n getState?: () => { sandboxAllowedPaths?: string[]; projectPath?: string; configDir?: string };\n }\n | undefined;\n\n const state = harnessCtx?.getState?.() ?? harnessCtx?.state;\n const projectPath = state?.projectPath ? path.resolve(state.projectPath) : process.cwd();\n const configDir = state?.configDir ?? DEFAULT_CONFIG_DIR;\n const skillPaths = buildSkillPaths(projectPath, configDir);\n const sandboxPaths = state?.sandboxAllowedPaths ?? [];\n\n return [...skillPaths, ...sandboxPaths];\n}\n","/**\n * request_access tool — requests permission to access a directory outside the project root.\n * The user can approve or deny the request via TUI dialog.\n */\n\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { HarnessRequestContext } from '@mastra/core/harness';\nimport { createTool } from '@mastra/core/tools';\nimport { LocalFilesystem } from '@mastra/core/workspace';\nimport { z } from 'zod';\nimport type { MastraCodeState } from '../schema.js';\nimport { isPathAllowed, getAllowedPathsFromContext } from './utils.js';\n\nfunction expandTilde(p: string): string {\n if (p === '~') return os.homedir();\n if (p.startsWith('~/') || p.startsWith('~\\\\')) return path.join(os.homedir(), p.slice(2));\n return p;\n}\n\ntype RequestSandboxAccessInput = {\n path: string;\n reason: string;\n};\n\nconst requestSandboxAccessInputSchema = z.object({\n path: z.string().min(1).describe('The absolute path to the directory you need access to.'),\n reason: z.string().min(1).describe('Brief explanation of why you need access to this directory.'),\n});\n\nexport const requestSandboxAccessTool = createTool({\n id: 'request_access',\n description: `Request permission to access a directory outside the current project. Use this when you need to read or write files in a directory that is not within the project root. The user will be prompted to approve or deny the request.`,\n inputSchema: requestSandboxAccessInputSchema,\n suspendSchema: z.object({\n kind: z.literal('sandbox_access_request'),\n path: z.string(),\n reason: z.string(),\n }),\n resumeSchema: z.union([z.string(), z.array(z.string())]),\n execute: async ({ path: requestedPath, reason }: RequestSandboxAccessInput, context: any) => {\n try {\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext<MastraCodeState> | undefined;\n\n // Resolve to absolute path (expand ~ first since Node path APIs don't handle it)\n const expanded = expandTilde(requestedPath);\n const absolutePath = path.isAbsolute(expanded) ? expanded : path.resolve(process.cwd(), expanded);\n\n // Check if already allowed\n const projectRoot = process.cwd();\n const allowedPaths = getAllowedPathsFromContext(context);\n if (isPathAllowed(absolutePath, projectRoot, allowedPaths)) {\n return {\n content: `Access already granted: \"${absolutePath}\" is within the project root or allowed paths.`,\n isError: false,\n };\n }\n\n const suspend = context?.agent?.suspend ?? context?.suspend;\n const resumeData = context?.agent?.resumeData ?? context?.resumeData;\n\n // First pass: pause via the native tool-suspension primitive so the host can\n // prompt the user. The suspend payload carries the request details; the host\n // resumes with the user's answer as resume data.\n if (resumeData === undefined) {\n if (!suspend) {\n return {\n content: `Cannot request sandbox access: interactive context not available. The user should manually run /sandbox add ${absolutePath}`,\n isError: true,\n };\n }\n await suspend({ kind: 'sandbox_access_request', path: absolutePath, reason });\n return;\n }\n\n const answerText = Array.isArray(resumeData) ? resumeData.join(', ') : String(resumeData);\n const approved = answerText.toLowerCase().startsWith('y') || answerText.toLowerCase() === 'approve';\n if (approved) {\n // Persist to harness state first (and await it) so the value is\n // committed before the next tool call re-derives the workspace's\n // allowed paths from state. The workspace factory rebuilds the\n // filesystem allowlist from `sandboxAllowedPaths` on every call\n // (getDynamicWorkspace), so an unawaited setState would let that\n // rebuild clobber the in-turn widen below before the grant lands.\n const currentAllowed = (harnessCtx?.getState?.()?.sandboxAllowedPaths as string[] | undefined) ?? [];\n if (!currentAllowed.includes(absolutePath)) {\n await harnessCtx?.setState?.({\n sandboxAllowedPaths: [...currentAllowed, absolutePath],\n });\n }\n\n // Also update the live workspace filesystem immediately so tools in\n // the same turn (e.g. `view`) can access the path without waiting for\n // a fresh workspace build. The resolved workspace is carried on the\n // harness request context — the tool-execution context does not expose\n // it — so read the filesystem from there.\n const fs = harnessCtx?.workspace?.filesystem ?? context?.workspace?.filesystem;\n if (fs instanceof LocalFilesystem) {\n fs.setAllowedPaths((prev: readonly string[]) => [...prev, absolutePath]);\n }\n\n return {\n content: `Access granted: \"${absolutePath}\" has been added to allowed paths. You can now access files in this directory.`,\n isError: false,\n };\n } else {\n return {\n content: `Access denied: The user declined access to \"${absolutePath}\".`,\n isError: false,\n };\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: `Failed to request sandbox access: ${msg}`,\n isError: true,\n };\n }\n },\n} as any);\n","/**\n * Load project and global agent instruction files (AGENTS.md, CLAUDE.md).\n * Prefers AGENTS.md over CLAUDE.md when multiple exist at the same location.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, normalize } from 'node:path';\nimport { DEFAULT_CONFIG_DIR } from '../../constants.js';\n\n// Filenames to check, in order of preference\nconst INSTRUCTION_FILES = ['AGENTS.md', 'CLAUDE.md'];\n\n// Locations to scan (relative to project root or home)\nconst PROJECT_LOCATIONS = [\n '', // project root\n '.claude',\n '.mastracode',\n];\n\nconst GLOBAL_LOCATIONS = ['.claude', '.mastracode', '.config/claude', '.config/mastracode'];\n\nexport interface InstructionSource {\n path: string;\n content: string;\n scope: 'global' | 'project';\n}\n\n/**\n * Find the first existing instruction file at a given base path.\n * Prefers AGENTS.md over CLAUDE.md.\n */\nfunction findInstructionFile(basePath: string): string | null {\n for (const filename of INSTRUCTION_FILES) {\n const fullPath = join(basePath, filename);\n if (existsSync(fullPath)) {\n return fullPath;\n }\n }\n return null;\n}\n\n/**\n * Load all agent instruction files from global and project locations.\n * Returns an array of instruction sources, with global ones first.\n */\nexport function loadAgentInstructions(projectPath: string, configDirName = DEFAULT_CONFIG_DIR): InstructionSource[] {\n const sources: InstructionSource[] = [];\n const home = homedir();\n\n // Derive location arrays from the base constants, substituting the config dir name\n const projectLocations = PROJECT_LOCATIONS.map(loc => (loc === '.mastracode' ? configDirName : loc));\n const globalLocations = GLOBAL_LOCATIONS.map(loc => {\n if (loc === '.mastracode') return configDirName;\n // XDG-style path (~/.config/<name>): strip the leading dot since the\n // .config/ prefix already signals a hidden/config directory.\n if (loc === '.config/mastracode') return '.config/' + configDirName.replace(/^\\./, '');\n return loc;\n });\n\n // Load global instructions first\n for (const location of globalLocations) {\n const basePath = join(home, location);\n const filePath = findInstructionFile(basePath);\n if (filePath) {\n try {\n const content = readFileSync(filePath, 'utf-8').trim();\n if (content) {\n sources.push({ path: filePath, content, scope: 'global' });\n break; // Only use first found global instruction file\n }\n } catch {\n // Skip unreadable files\n }\n }\n }\n\n // Load project instructions\n for (const location of projectLocations) {\n const basePath = location ? join(projectPath, location) : projectPath;\n const filePath = findInstructionFile(basePath);\n if (filePath) {\n try {\n const content = readFileSync(filePath, 'utf-8').trim();\n if (content) {\n sources.push({ path: filePath, content, scope: 'project' });\n break; // Only use first found project instruction file\n }\n } catch {\n // Skip unreadable files\n }\n }\n }\n\n return sources;\n}\n\nexport function getStaticallyLoadedInstructionPaths(projectPath: string): string[] {\n return loadAgentInstructions(projectPath).map(source => normalize(source.path));\n}\n\n/**\n * Format loaded instructions into a string for the system prompt.\n */\nexport function formatAgentInstructions(sources: InstructionSource[]): string {\n if (sources.length === 0) return '';\n\n const sections = sources.map(source => {\n const label = source.scope === 'global' ? 'Global' : 'Project';\n return `<!-- ${label} instructions from ${source.path} -->\\n${source.content}`;\n });\n\n return `\\n# Agent Instructions\\n\\n${sections.join('\\n\\n')}\\n`;\n}\n","export const modelSpecificPrompts = {\n 'openai/gpt-5.4': `<autonomy_and_persistence>\nPersist until the task is fully handled end-to-end within the current turn whenever feasible: do not stop at analysis or partial fixes; carry changes through implementation, verification, and a clear explanation of outcomes unless the user explicitly pauses or redirects you.\n\nUnless the user explicitly asks for a plan, asks a question about the code, is brainstorming potential solutions, or some other intent that makes it clear that code should not be written, assume the user wants you to make code changes or run tools to solve the user's problem. In these cases, it's bad to output your proposed solution in a message, you should go ahead and actually implement the change. If you encounter challenges or blockers, you should attempt to resolve them yourself.\n</autonomy_and_persistence>\n`,\n 'openai/gpt-5.5': `<coding_behavior>\nWork outcome-first: infer the user's goal, define what \"done\" means from the request and repo context, then choose an efficient path that reaches that outcome without sacrificing correctness, maintainability, or proof.\n\nFor non-trivial multi-step or tool-heavy tasks, start with a short visible preamble that acknowledges the request and states the first action. Skip the preamble for direct answers and tiny edits. Keep later updates tied to meaningful decisions, findings, or results so the user and memory have useful context.\n\nUse efficient retrieval. Read enough code, docs, logs, and command output to act correctly, including neighboring implementations when conventions matter. Stop searching once you have sufficient evidence, but do not let brevity outrank correctness, security, or compatibility with existing patterns.\n\nFor coding work, make focused changes that follow the surrounding conventions. Avoid unrequested features, broad refactors, speculative error handling, and comments that only explain the diff.\n</coding_behavior>\n`,\n};\n","/**\n * Mode-specific tool behavioral guidance.\n * Generates tool usage instructions that match the actual registered tool names\n * and are scoped to what's available in the current mode.\n */\n\nimport { MC_TOOLS } from '../../tool-names.js';\n\ninterface ToolGuidanceOptions {\n hasWebSearch?: boolean;\n /** Tool names that have been denied — omit their guidance sections. */\n deniedTools?: Set<string>;\n}\n\nexport function buildToolGuidance(modeId: string, options: ToolGuidanceOptions = {}): string {\n const denied = options.deniedTools ?? new Set<string>();\n const sections: string[] = [];\n\n sections.push(`# Tool Usage Rules\n\nIMPORTANT: You can ONLY call tools by their exact registered names listed below. Shell commands like \\`git\\`, \\`npm\\`, \\`ls\\`, etc. are NOT tools — they must be run via the \\`execute_command\\` tool.\n\nYou have access to the following tools. Use the RIGHT tool for the job:`);\n\n // --- Read tools (all modes) ---\n\n const readTools: string[] = [];\n\n if (!denied.has(MC_TOOLS.VIEW)) {\n readTools.push(`\n**${MC_TOOLS.VIEW}** — Read file contents\n- Use this to read files before editing them. NEVER propose changes to code you haven't read.\n- Use \\`offset\\` (1-indexed start line) and \\`limit\\` (number of lines) for large files.\n- Example: Read lines 50-100: \\`{ path: \"src/big-file.ts\", offset: 50, limit: 51 }\\`\n- To list directories, use \\`${MC_TOOLS.FIND_FILES}\\` instead.`);\n }\n\n if (!denied.has(MC_TOOLS.SEARCH_CONTENT)) {\n readTools.push(`\n**${MC_TOOLS.SEARCH_CONTENT}** — Search file contents using regex\n- Preferred for content search (finding functions, variables, error messages, imports, etc.)\n- Use \\`path\\` to filter by directory or glob pattern. Supports \\`contextLines\\`, \\`caseSensitive\\`, and \\`maxCount\\`.\n- Example: Find a function: \\`{ pattern: \"function handleSubmit\", path: \"**/*.ts\" }\\`\n- Example: Find imports: \\`{ pattern: \"from ['\\\\\"\\\\]express['\\\\\"\\\\]\", path: \"**/*.ts\" }\\`\n- Respects .gitignore by default.`);\n }\n\n if (!denied.has(MC_TOOLS.FIND_FILES)) {\n readTools.push(`\n**${MC_TOOLS.FIND_FILES}** — List files and directories as a tree\n- Preferred for exploring project structure and finding files by pattern.\n- Returns tree-style output. Respects .gitignore by default.\n- Example: List project root: \\`{ path: \"./\" }\\`\n- Example: Find test files: \\`{ path: \"./src\", pattern: \"**/*.test.ts\" }\\`\n- Example: Find config files: \\`{ pattern: \"*.config.{js,ts,json}\" }\\``);\n }\n\n if (!denied.has(MC_TOOLS.EXECUTE_COMMAND)) {\n readTools.push(`\n**${MC_TOOLS.EXECUTE_COMMAND}** — Run shell commands\n- Use for: git, npm/pnpm, docker, build tools, test runners, and other terminal operations.\n- Prefer dedicated tools for: file reading (${MC_TOOLS.VIEW}), file search (${MC_TOOLS.SEARCH_CONTENT}/${MC_TOOLS.FIND_FILES}), file editing (${MC_TOOLS.STRING_REPLACE_LSP}/${MC_TOOLS.WRITE_FILE}).\n- Commands have a 30-second default timeout. Use \\`timeout\\` for longer commands, \\`cwd\\` for working directory.\n- Use the \\`tail\\` parameter or pipe to \\`| tail -N\\` to limit output — the full output streams to the user, only the tail is returned to you. If you're building any kind of package you should be tailing.\n- Good: Run independent commands in parallel when possible.\n- Bad: Running \\`cat file.txt\\` — use the ${MC_TOOLS.VIEW} tool instead.`);\n }\n\n if (!denied.has(MC_TOOLS.LSP_INSPECT)) {\n readTools.push(`\n**${MC_TOOLS.LSP_INSPECT}** — Inspect code using Language Server Protocol\n- Use this for type information, hover docs, go-to-definition, and finding implementations for a symbol.\n- Best when you already know the file and line and need semantic code intelligence rather than raw file contents.\n- Input: \\`path\\` (absolute file path), \\`line\\` (1-indexed line number), \\`match\\` (the exact line content with exactly one \\`<<<\\` cursor marker).\n- Output includes: \\`hover\\`, \\`definition\\` (compact location with preview), and \\`implementation\\` (compact usage/implementation locations).\n- Example: \\`{ path: \"/abs/path/src/foo.ts\", line: 10, match: \"const foo = <<<bar()\" }\\` — inspect the symbol at the \\`<<<\\` position.\n- Use \\`${MC_TOOLS.VIEW}\\` when you need to read the implementation or surrounding code.\n- Use \\`${MC_TOOLS.SEARCH_CONTENT}\\` or \\`${MC_TOOLS.FIND_FILES}\\` first if you do not yet know where the symbol is.`);\n }\n\n if (!denied.has(MC_TOOLS.NOTIFICATION_INBOX)) {\n readTools.push(`\n**${MC_TOOLS.NOTIFICATION_INBOX}** — Inspect and manage notification inbox records\n- Use this when a \\`<notification-summary>\\` says pending notifications exist.\n- Use \\`{ \"action\": \"list\", \"status\": \"pending\" }\\` or \\`{ \"action\": \"search\", \"query\": \"...\" }\\` to find notification records for the current thread.\n- Use \\`read\\` to deliver unread notification signals into the chat and mark them seen; the tool result summarizes the count instead of exposing notification contents.\n- Use \\`dismiss\\` or \\`archive\\` only when the user asks or the notification is no longer relevant.`);\n }\n\n if (readTools.length > 0) {\n sections.push(readTools.join('\\n'));\n }\n\n // --- Write/edit tools (build & fast only) ---\n\n if (modeId !== 'plan') {\n const writeTools: string[] = [];\n\n if (!denied.has(MC_TOOLS.STRING_REPLACE_LSP)) {\n writeTools.push(`\n**${MC_TOOLS.STRING_REPLACE_LSP}** — Edit files by replacing exact text\n- You MUST read a file with \\`${MC_TOOLS.VIEW}\\` before editing it.\n- \\`old_string\\` must be an exact match of existing text in the file.\n- Provide enough surrounding context in \\`old_string\\` to make it unique.\n- Use \\`replace_all: true\\` to replace all occurrences (default: false, requires unique match).\n- For creating new files, use \\`${MC_TOOLS.WRITE_FILE}\\` instead.\n- Good: Include 2-3 lines of surrounding context to ensure uniqueness.\n- Bad: Using just \\`return true;\\` — too common, will match multiple places.`);\n }\n\n if (!denied.has(MC_TOOLS.WRITE_FILE)) {\n writeTools.push(`\n**${MC_TOOLS.WRITE_FILE}** — Create new files or overwrite existing ones\n- Use this to create new files.\n- If overwriting an existing file, you MUST have read it first with \\`${MC_TOOLS.VIEW}\\`.\n- Prefer editing existing files over creating new ones.`);\n }\n\n if (writeTools.length > 0) {\n sections.push(writeTools.join('\\n'));\n }\n }\n\n // --- Web tools (all modes, conditionally available) ---\n\n if (options.hasWebSearch) {\n const webTools: string[] = [];\n if (!denied.has('web_search')) webTools.push('**web_search**');\n if (!denied.has('web_extract')) webTools.push('**web_extract**');\n if (webTools.length > 0) {\n sections.push(`\n${webTools.join(' / ')} — Search the web / extract page content\n- Use for looking up documentation, error messages, package APIs.`);\n }\n }\n\n // --- Task management tools (all modes) ---\n\n const taskTools: string[] = [];\n const canUpdateTask = !denied.has('task_update');\n const canCompleteTask = !denied.has('task_complete');\n const canCheckTasks = !denied.has('task_check');\n const canWriteTasks = !denied.has('task_write');\n const patchToolGuidance =\n canUpdateTask && canCompleteTask\n ? '- Prefer task_update or task_complete when changing one existing task.'\n : canUpdateTask\n ? '- Prefer task_update when changing one existing task.'\n : canCompleteTask\n ? '- Prefer task_complete when marking one existing task completed.'\n : '- Use task_write with the full task list when changing existing tasks.';\n\n if (canWriteTasks) {\n taskTools.push(`\n**task_write** — Track tasks for complex multi-step work\n- Use when a task requires 3 or more distinct steps or actions.\n- Use task_write to create the initial task list or replace the whole list after replanning.\n- Each task has: id (stable identifier), content (imperative form), status (pending, in_progress, or completed), activeForm (present continuous form shown during execution).\n- Keep task IDs stable across updates. If you omit IDs, the tool result returns generated IDs.\n${patchToolGuidance}\n- Mark tasks \\`in_progress\\` BEFORE starting work. Only ONE task should be \\`in_progress\\` at a time.\n- Mark tasks \\`completed\\` IMMEDIATELY after finishing each task. Do not batch completions.`);\n }\n\n if (canUpdateTask) {\n taskTools.push(`\n**task_update** — Patch one tracked task by ID\n- Use this for targeted changes to one existing task.\n- Provide the task ID and only the fields that changed: content, status, or activeForm.`);\n }\n\n if (canCompleteTask) {\n const idSource = canCheckTasks\n ? 'Use task_check if you need the current IDs before completing a task.'\n : canWriteTasks\n ? 'Use IDs returned by task_write.'\n : 'Use only task IDs already visible in the current task list.';\n taskTools.push(`\n**task_complete** — Mark one tracked task completed by ID\n- Use this immediately after finishing a tracked task.\n- ${idSource}`);\n }\n\n if (canCheckTasks) {\n taskTools.push(`\n**task_check** — Check completion status of tasks\n- Use this BEFORE finishing tracked work to verify all tasks are completed.\n- Returns a readable status summary plus structured fields: tasks, summary, incompleteTasks, and isError.\n- summary includes total, completed, inProgress, pending, incomplete, hasTasks, and allCompleted.\n- Use summary.allCompleted to decide whether tracked work is complete; if summary.hasTasks is false, no task list is currently tracked.\n- If any tasks remain incomplete, continue working on them.\n- IMPORTANT: Always check task completion before ending work on a complex task.`);\n }\n\n if (!denied.has('ask_user')) {\n taskTools.push(`\n**ask_user** — Ask the user a structured question\n- Use when you need clarification, want to validate assumptions, or need the user to make a decision.\n- Provide clear, specific questions. End with a question mark.\n- Include options (2-4 choices) for structured decisions. Omit options for open-ended questions.\n- Don't use this for simple yes/no — just ask in your text response.`);\n }\n\n if (taskTools.length > 0) {\n sections.push(taskTools.join('\\n'));\n }\n\n // --- Plan submission tool (plan mode) ---\n\n if (modeId === 'plan' && !denied.has('submit_plan')) {\n sections.push(`\n**submit_plan** — Submit a completed implementation plan for user review\n- Call this tool when your plan is complete. Do NOT just describe your plan in text — you MUST call this tool.\n- The plan will be rendered as markdown and the user can approve, reject, or request changes.\n- On approval, the system automatically switches to the default mode so you can implement.\n- Takes two arguments: \\`title\\` (short descriptive title) and \\`plan\\` (full plan in markdown).`);\n }\n\n // --- Subagent tool (all modes) ---\n\n if (!denied.has('subagent')) {\n sections.push(`\n**subagent** — Delegate a focused task to a specialized subagent\n- Only use subagents when you will spawn **multiple subagents in parallel**. If you only need one task done, do it yourself.\n- Subagent outputs are **untrusted**. Always review and verify the results.`);\n }\n\n return sections.join('\\n');\n}\n","/**\n * Prompt system — exports the prompt builder and mode-specific prompts.\n */\n\nexport { buildBasePrompt } from './base.js';\nexport { buildModePrompt, buildModePromptFn } from './build.js';\nexport { planModePrompt } from './plan.js';\nexport { fastModePrompt } from './fast.js';\n\nimport { hasTavilyKey } from '../../tools/index.js';\nimport { loadAgentInstructions, formatAgentInstructions } from './agent-instructions.js';\nimport { buildBasePrompt } from './base.js';\nimport type { PromptContext as BasePromptContext } from './base.js';\nimport { buildModePromptFn } from './build.js';\nimport { fastModePrompt } from './fast.js';\nimport { modelSpecificPrompts } from './model.js';\nimport { planModePrompt } from './plan.js';\nimport { buildToolGuidance } from './tool-guidance.js';\n\n// Extended prompt context that includes runtime information\nexport interface PromptContext extends Omit<BasePromptContext, 'toolGuidance'> {\n modeId: string;\n state?: any;\n currentDate: string;\n workingDir: string;\n}\n\nconst modePrompts: Record<string, string | ((ctx: PromptContext) => string)> = {\n build: buildModePromptFn,\n plan: planModePrompt,\n fast: fastModePrompt,\n};\n\n/**\n * Build the full system prompt for a given mode and context.\n * Combines the base prompt with mode-specific instructions.\n */\nexport function buildFullPrompt(ctx: PromptContext): string {\n // Determine whether web search tools are available\n const modelId = ctx.state?.currentModelId as string | undefined;\n const hasWebSearch = hasTavilyKey() || (!!modelId && modelId.startsWith('anthropic/'));\n\n // Collect per-tool deny rules so guidance omits denied tools\n const deniedTools = new Set<string>();\n const permRules = ctx.state?.permissionRules as { tools?: Record<string, string> } | undefined;\n if (permRules?.tools) {\n for (const [name, policy] of Object.entries(permRules.tools)) {\n if (policy === 'deny') deniedTools.add(name);\n }\n }\n\n // Build mode-aware tool guidance\n const toolGuidance = buildToolGuidance(ctx.modeId, { hasWebSearch, deniedTools });\n\n // Map new context to base context\n const baseCtx: BasePromptContext = {\n projectPath: ctx.workingDir,\n projectName: ctx.projectName || 'unknown',\n gitBranch: ctx.gitBranch,\n platform: process.platform,\n commonBinaries: ctx.commonBinaries,\n date: ctx.currentDate,\n mode: ctx.modeId,\n modelId: ctx.modelId,\n activePlan: ctx.state?.activePlan,\n toolGuidance,\n };\n\n const base = buildBasePrompt(baseCtx);\n const entry = modePrompts[ctx.modeId] || modePrompts.build;\n const modeSpecific = (typeof entry === 'function' ? entry(ctx) : entry) ?? '';\n const modelSpecific = ctx.modelId\n ? (modelSpecificPrompts[ctx.modelId as keyof typeof modelSpecificPrompts] ?? '')\n : '';\n\n // The current task list is carried on the agent state-signal lane (see\n // TaskStateProcessor) rather than injected into the cached system prompt. This\n // keeps the prompt prefix stable across task updates (preserving prompt cache)\n // while still surviving observational-memory truncation.\n\n // Load and inject agent instructions from AGENTS.md/CLAUDE.md files\n const configDir = ctx.state?.configDir as string | undefined;\n const instructionSources = loadAgentInstructions(ctx.workingDir, configDir);\n const instructionsSection = formatAgentInstructions(instructionSources);\n\n const sections = [base, instructionsSection.trim(), modelSpecific.trim(), modeSpecific.trim()].filter(Boolean);\n\n return sections.join('\\n\\n');\n}\n","import type { HarnessRequestContext } from '@mastra/core/harness';\nimport type { MastraCodeComposedState } from '../schema.js';\nimport { detectCommonBinariesAsync } from '../utils/binaries.js';\nimport { getCurrentGitBranchAsync } from '../utils/project.js';\nimport type { PromptContext } from './prompts/index.js';\nimport { buildFullPrompt } from './prompts/index.js';\n\nexport async function getDynamicInstructions({ requestContext }: { requestContext: { get(key: string): unknown } }) {\n const harnessContext = requestContext.get('harness') as HarnessRequestContext<MastraCodeComposedState> | undefined;\n const state = harnessContext?.getState?.();\n const modeId = harnessContext?.modeId ?? 'build';\n const projectPath = state?.projectPath ?? process.cwd();\n\n const promptCtx: PromptContext = {\n projectPath,\n projectName: state?.projectName ?? '',\n gitBranch: (await getCurrentGitBranchAsync(projectPath)) ?? state?.gitBranch,\n platform: process.platform,\n commonBinaries: await detectCommonBinariesAsync(),\n date: new Date().toISOString().split('T')[0]!,\n mode: modeId,\n modelId: state?.currentModelId || undefined,\n activePlan: state?.activePlan ?? null,\n modeId: modeId,\n currentDate: new Date().toISOString().split('T')[0]!,\n workingDir: state?.projectPath ?? process.cwd(),\n state: state,\n };\n\n return buildFullPrompt(promptCtx);\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// Betas required for Claude Max plan OAuth. Merged with (not replacing) any\n// betas the AI SDK already set on the request — e.g. the SDK adds\n// `server-side-fallback-2026-06-01` when `providerOptions.anthropic.fallbacks`\n// is configured; dropping it makes the API reject the `fallbacks` body field\n// with \"Extra inputs are not permitted\".\nconst OAUTH_REQUIRED_BETAS = [\n 'oauth-2025-04-20',\n 'claude-code-20250219',\n 'interleaved-thinking-2025-05-14',\n 'fine-grained-tool-streaming-2025-05-14',\n];\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 const requestBetas = (headers.get('anthropic-beta') ?? '')\n .split(',')\n .map(beta => beta.trim())\n .filter(Boolean);\n headers.set('anthropic-beta', Array.from(new Set([...OAUTH_REQUIRED_BETAS, ...requestBetas])).join(','));\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 const baseURL = process.env.OPENAI_BASE_URL;\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 baseURL,\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 baseURL,\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 { createOpenAICompatible } from '@ai-sdk/openai-compatible';\nimport type { CustomAvailableModel, CustomModelCatalogProvider } from '@mastra/core/harness';\nimport {\n GATEWAY_AUTH_HEADER,\n MastraGateway,\n MastraModelGateway,\n ModelRouterLanguageModel,\n PROVIDER_REGISTRY,\n} from '@mastra/core/llm';\nimport type {\n GatewayAuthRequest,\n GatewayAuthResult,\n GatewayLanguageModel,\n MastraModelGatewayInterface,\n ProviderConfig,\n} from '@mastra/core/llm';\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 { getCopilotModelCatalog, 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\nexport const OPENAI_PREFIX = 'openai/';\nexport const MASTRA_GATEWAY_PREFIX = 'mastra/';\nexport const MASTRACODE_GATEWAY_ID = 'mastracode';\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 ModelRequestHeaders = Record<string, string>;\n\nexport type MastraCodeCustomProvider = { name: string; url: string; apiKey?: string; models?: string[] };\n\nexport type MastraCodeGatewayOptions = {\n mastraGatewayBaseUrl: string;\n mastraGatewayApiKey?: string;\n routeThroughMastraGateway: boolean;\n thinkingLevel?: ThinkingLevel;\n customProviders?: MastraCodeCustomProvider[];\n settingsPath?: string;\n};\n\nconst authStorage = new AuthStorage();\n\nexport function reloadAuthStorage() {\n authStorage.reload();\n}\n\nexport function 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\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\nfunction openaiApiKeyProvider(modelId: string, apiKey: string, headers?: ModelRequestHeaders) {\n const openai = createOpenAI({ apiKey, baseURL: process.env.OPENAI_BASE_URL, headers });\n return wrapLanguageModel({\n model: openai.responses(modelId),\n middleware: [],\n });\n}\n\nfunction getAuthProviderId(providerId: string): string {\n return providerId === 'openai' ? 'openai-codex' : providerId;\n}\n\nfunction getProviderAuthKey(providerId: string): string | undefined {\n const authProviderId = getAuthProviderId(providerId);\n const storedCred = authStorage.get(authProviderId);\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n return authStorage.getStoredApiKey(authProviderId)?.trim() || undefined;\n}\n\nexport function resolveAuth(request: GatewayAuthRequest, memoryGatewayApiKey?: string): GatewayAuthResult | undefined {\n return MastraCodeGateway.resolveProviderAuth(request, memoryGatewayApiKey);\n}\n\nfunction getGatewayProviderKey(gatewayId: string, providerId: string): string {\n if (gatewayId === 'models.dev') return providerId;\n return providerId === gatewayId ? gatewayId : `${gatewayId}/${providerId}`;\n}\n\nfunction parseGatewayRouterId(\n routerId: string,\n gateway: MastraModelGatewayInterface,\n): { gatewayId: string; providerId: string; modelId: string } {\n const [firstPart = '', secondPart = '', ...restParts] = routerId.split('/');\n const gatewayId = gateway.id;\n\n if (firstPart === gatewayId && secondPart) {\n return {\n gatewayId,\n providerId: secondPart,\n modelId: restParts.join('/'),\n };\n }\n\n return {\n gatewayId,\n providerId: firstPart,\n modelId: [secondPart, ...restParts].filter(Boolean).join('/'),\n };\n}\n\nfunction hasResolvedAuth(auth: GatewayAuthResult | undefined): boolean {\n if (!auth) return false;\n if (auth.apiKey || auth.bearerToken) return true;\n return auth.headers ? Object.keys(auth.headers).length > 0 : false;\n}\n\nasync function resolveGatewayProviderAuth(\n gateway: MastraModelGatewayInterface,\n routerId: string,\n): Promise<GatewayAuthResult | undefined> {\n if (!gateway.resolveAuth) return undefined;\n\n const parsed = parseGatewayRouterId(routerId, gateway);\n try {\n const result = await gateway.resolveAuth({\n gatewayId: parsed.gatewayId,\n providerId: parsed.providerId,\n modelId: parsed.modelId,\n routerId,\n });\n return hasResolvedAuth(result) ? result : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function getMastraCodeProviderConfigs(\n gateway: MastraModelGatewayInterface,\n): Promise<Record<string, ProviderConfig>> {\n const providers: Record<string, ProviderConfig> = { ...(PROVIDER_REGISTRY as Record<string, ProviderConfig>) };\n\n try {\n const gatewayProviders = await gateway.fetchProviders();\n for (const [providerId, config] of Object.entries(gatewayProviders)) {\n providers[getGatewayProviderKey(gateway.id, providerId)] = {\n ...config,\n gateway: gateway.id,\n };\n }\n } catch (error) {\n console.warn(`Failed to load providers from gateway ${gateway.id}:`, error);\n }\n\n return providers;\n}\n\nfunction getApiKeyEnvVar(providerConfig: Pick<ProviderConfig, 'apiKeyEnvVar'> | undefined): string | undefined {\n const envVars = providerConfig?.apiKeyEnvVar;\n return Array.isArray(envVars) ? envVars[0] : envVars;\n}\n\nexport class MastraCodeGateway extends MastraModelGateway {\n readonly id = MASTRACODE_GATEWAY_ID;\n readonly name = 'MastraCode Gateway';\n\n readonly #mastraGateway: MastraGateway;\n readonly #mastraGatewayBaseUrl: string;\n readonly #mastraGatewayApiKey?: string;\n readonly #routeThroughMastraGateway: boolean;\n readonly #thinkingLevel?: ThinkingLevel;\n readonly #customProviders?: MastraCodeCustomProvider[];\n readonly #settingsPath?: string;\n\n constructor({\n mastraGatewayBaseUrl,\n mastraGatewayApiKey,\n routeThroughMastraGateway,\n thinkingLevel,\n customProviders,\n settingsPath,\n }: MastraCodeGatewayOptions) {\n super();\n this.#mastraGateway = new MastraGateway({ baseUrl: mastraGatewayBaseUrl });\n this.#mastraGatewayBaseUrl = mastraGatewayBaseUrl;\n this.#mastraGatewayApiKey = mastraGatewayApiKey;\n this.#routeThroughMastraGateway = routeThroughMastraGateway;\n this.#thinkingLevel = thinkingLevel;\n this.#customProviders = customProviders;\n this.#settingsPath = settingsPath;\n }\n\n static getMemoryGatewayApiKey(): string | undefined {\n return authStorage.getStoredApiKey(MEMORY_GATEWAY_PROVIDER) ?? process.env['MASTRA_GATEWAY_API_KEY'];\n }\n\n static resolveProviderAuth(request: GatewayAuthRequest, memoryGatewayApiKey?: string): GatewayAuthResult | undefined {\n if (request.gatewayId === 'mastra' && memoryGatewayApiKey) {\n return { apiKey: memoryGatewayApiKey, source: 'gateway' };\n }\n\n const storedCred = authStorage.get(getAuthProviderId(request.providerId));\n if (storedCred?.type === 'oauth') {\n return { bearerToken: 'oauth', source: 'gateway' };\n }\n\n const apiKey = getProviderAuthKey(request.providerId);\n return apiKey ? { apiKey, source: 'gateway' } : undefined;\n }\n\n static createModelCatalogProvider(gateway: MastraModelGatewayInterface): CustomModelCatalogProvider {\n return async () => {\n const registry = await getMastraCodeProviderConfigs(gateway);\n const models: CustomAvailableModel[] = [];\n\n for (const [provider, providerConfig] of Object.entries(registry)) {\n const apiKeyEnvVar = getApiKeyEnvVar(providerConfig);\n const hasEnvKey = apiKeyEnvVar ? Boolean(process.env[apiKeyEnvVar]) : false;\n const modelNames = providerConfig.models;\n if (!Array.isArray(modelNames)) continue;\n\n const gatewayAuth = modelNames[0]\n ? await resolveGatewayProviderAuth(gateway, `${provider}/${modelNames[0]}`)\n : undefined;\n\n for (const modelName of modelNames) {\n const id = `${provider}/${modelName}`;\n models.push({\n id,\n provider,\n modelName,\n hasApiKey: hasEnvKey || Boolean(gatewayAuth),\n apiKeyEnvVar: apiKeyEnvVar || undefined,\n });\n }\n }\n\n return models;\n };\n }\n\n createModelCatalogProvider(): CustomModelCatalogProvider {\n return MastraCodeGateway.createModelCatalogProvider(this);\n }\n\n #getCustomProviders(): MastraCodeCustomProvider[] {\n return this.#customProviders ?? loadSettings(this.#settingsPath).customProviders;\n }\n\n async fetchProviders(): Promise<Record<string, ProviderConfig>> {\n const providers: Record<string, ProviderConfig> = {};\n for (const provider of this.#getCustomProviders()) {\n const models = provider.models ?? [];\n if (!models.length) continue;\n providers[getCustomProviderId(provider.name)] = {\n name: provider.name,\n url: provider.url,\n apiKeyEnvVar: '',\n apiKeyHeader: 'Authorization',\n gateway: this.id,\n models,\n };\n }\n\n try {\n const copilotModels = await getCopilotModelCatalog({ authStorage });\n providers['github-copilot'] = {\n name: 'GitHub Copilot',\n apiKeyEnvVar: '',\n apiKeyHeader: 'Authorization',\n gateway: this.id,\n models: copilotModels.map(model => model.id),\n };\n } catch (error) {\n console.warn('Failed to load GitHub Copilot model catalog:', error);\n }\n\n return providers;\n }\n\n buildUrl(modelId: string): string | undefined | Promise<string | undefined> {\n return this.#routeThroughMastraGateway ? this.#mastraGateway.buildUrl(modelId) : modelId;\n }\n\n async getApiKey(modelId: string): Promise<string> {\n const providerId = stripMastraGatewayPrefix(modelId).split('/', 1)[0];\n if (this.#routeThroughMastraGateway) return this.#mastraGatewayApiKey ?? '';\n return providerId ? (getProviderAuthKey(providerId) ?? '') : '';\n }\n\n resolveAuth(request: GatewayAuthRequest): GatewayAuthResult | undefined {\n if (this.#routeThroughMastraGateway && this.#mastraGatewayApiKey) {\n return { apiKey: this.#mastraGatewayApiKey, source: 'gateway' };\n }\n\n const customProvider = this.#getCustomProviders().find(\n provider => request.providerId === getCustomProviderId(provider.name),\n );\n if (customProvider?.apiKey) {\n return { apiKey: customProvider.apiKey, source: 'gateway' };\n }\n\n return MastraCodeGateway.resolveProviderAuth(request);\n }\n\n resolveLanguageModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel {\n const customProvider = this.#getCustomProviders().find(\n provider => args.providerId === getCustomProviderId(provider.name),\n );\n if (customProvider) {\n const provider = createOpenAICompatible({\n name: args.providerId,\n baseURL: customProvider.url,\n apiKey: args.apiKey,\n headers: args.headers,\n });\n return provider.chatModel(args.modelId) as unknown as GatewayLanguageModel;\n }\n\n if (args.providerId === 'github-copilot') {\n return githubCopilotProvider(args.modelId, { headers: args.headers }) as unknown as GatewayLanguageModel;\n }\n\n if (args.providerId === 'moonshotai') {\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: args.headers,\n })(args.modelId) as unknown as GatewayLanguageModel;\n }\n\n if (args.providerId === 'anthropic') {\n return this.#resolveAnthropicModel(args);\n }\n\n if (args.providerId === 'openai') {\n const openaiModel = this.#resolveOpenAIModel(args);\n if (openaiModel) return openaiModel;\n }\n\n if (this.#routeThroughMastraGateway) {\n return this.#mastraGateway.resolveLanguageModel(args) as GatewayLanguageModel;\n }\n\n return new ModelRouterLanguageModel({\n id: `${args.providerId}/${args.modelId}` as `${string}/${string}`,\n headers: args.headers,\n }) as unknown as GatewayLanguageModel;\n }\n\n #resolveAnthropicModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel {\n const bareModelId = normalizeAnthropicModelId(args.modelId);\n const storedCred = authStorage.get('anthropic');\n\n if (this.#routeThroughMastraGateway) {\n if (storedCred?.type === 'oauth') {\n const anthropic = createAnthropic({\n apiKey: 'oauth-gateway-placeholder',\n baseURL: `${this.#mastraGatewayBaseUrl}/v1`,\n headers: {\n [GATEWAY_AUTH_HEADER]: `Bearer ${args.apiKey}`,\n ...args.headers,\n },\n fetch: buildAnthropicOAuthFetch({ authStorage }) as any,\n });\n\n return wrapLanguageModel({\n model: anthropic(bareModelId),\n middleware: [claudeCodeMiddleware, promptCacheMiddleware],\n }) as unknown as GatewayLanguageModel;\n }\n\n return this.#mastraGateway.resolveLanguageModel({ ...args, modelId: bareModelId }) as GatewayLanguageModel;\n }\n\n if (storedCred?.type === 'oauth') {\n return opencodeClaudeMaxProvider(bareModelId, { headers: args.headers }) as unknown as GatewayLanguageModel;\n }\n\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return anthropicApiKeyProvider(\n bareModelId,\n storedCred.key.trim(),\n args.headers,\n ) as unknown as GatewayLanguageModel;\n }\n\n const apiKey = getAnthropicApiKey();\n if (apiKey) {\n return anthropicApiKeyProvider(bareModelId, apiKey, args.headers) as unknown as GatewayLanguageModel;\n }\n\n // No stored credentials: use the OAuth-backed provider so the first request can trigger login.\n return opencodeClaudeMaxProvider(bareModelId, { headers: args.headers }) as unknown as GatewayLanguageModel;\n }\n\n #resolveOpenAIModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel | undefined {\n const storedCred = authStorage.get('openai-codex');\n\n if (this.#routeThroughMastraGateway) {\n if (storedCred?.type === 'oauth') {\n const resolvedModelId = remapOpenAIModelForCodexOAuth(`openai/${args.modelId}`);\n const resolvedBareModelId = resolvedModelId.substring(OPENAI_PREFIX.length);\n const requestedLevel: ThinkingLevel = this.#thinkingLevel ?? 'medium';\n const effectiveLevel = getEffectiveThinkingLevel(resolvedBareModelId, requestedLevel);\n const reasoningEffort = THINKING_LEVEL_TO_REASONING_EFFORT[effectiveLevel];\n const middleware = createCodexMiddleware(reasoningEffort);\n const openai = createOpenAI({\n apiKey: 'oauth-gateway-placeholder',\n baseURL: `${this.#mastraGatewayBaseUrl}/v1`,\n headers: {\n [GATEWAY_AUTH_HEADER]: `Bearer ${args.apiKey}`,\n ...args.headers,\n },\n fetch: buildOpenAICodexOAuthFetch({ authStorage, rewriteUrl: false }) as any,\n });\n\n return wrapLanguageModel({\n model: openai.responses(resolvedBareModelId),\n middleware: [middleware],\n }) as unknown as GatewayLanguageModel;\n }\n\n return this.#mastraGateway.resolveLanguageModel(args) as GatewayLanguageModel;\n }\n\n if (storedCred?.type === 'oauth') {\n const resolvedModelId = remapOpenAIModelForCodexOAuth(`openai/${args.modelId}`);\n return openaiCodexProvider(resolvedModelId.substring(OPENAI_PREFIX.length), {\n thinkingLevel: this.#thinkingLevel,\n headers: args.headers,\n }) as unknown as GatewayLanguageModel;\n }\n\n const apiKey = getOpenAIApiKey();\n if (apiKey) {\n return openaiApiKeyProvider(args.modelId, apiKey, args.headers) as unknown as GatewayLanguageModel;\n }\n\n return undefined;\n }\n}\n","import type { HarnessRequestContext } from '@mastra/core/harness';\nimport type { GatewayLanguageModel, MastraModelGatewayInterface } from '@mastra/core/llm';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport { loadSettings } from '../onboarding/settings.js';\nimport type { ThinkingLevel } from '../providers/openai-codex.js';\nimport {\n MASTRA_GATEWAY_PREFIX,\n MASTRACODE_GATEWAY_ID,\n MastraCodeGateway,\n reloadAuthStorage,\n stripMastraGatewayPrefix,\n} from './mastracode-gateway.js';\nimport type { MastraCodeGatewayOptions } from './mastracode-gateway.js';\n\nexport {\n getAnthropicApiKey,\n getOpenAIApiKey,\n MASTRACODE_GATEWAY_ID,\n MastraCodeGateway,\n remapOpenAIModelForCodexOAuth,\n resolveAuth,\n} from './mastracode-gateway.js';\nexport type { MastraCodeCustomProvider, MastraCodeGatewayOptions } from './mastracode-gateway.js';\n\ntype ResolvedModel = GatewayLanguageModel;\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\nexport function createMastraCodeGateway(options: MastraCodeGatewayOptions): MastraCodeGateway {\n return new MastraCodeGateway(options);\n}\n\nexport function createMastraCodeModelCatalogProvider(gateway: MastraModelGatewayInterface) {\n return gateway instanceof MastraCodeGateway\n ? gateway.createModelCatalogProvider()\n : MastraCodeGateway.createModelCatalogProvider(gateway);\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): GatewayLanguageModel {\n reloadAuthStorage();\n const headers = getHarnessHeaders(options?.requestContext);\n const settings = loadSettings();\n const isMastraGatewayModel = modelId.startsWith(MASTRA_GATEWAY_PREFIX);\n const normalizedModelId = stripMastraGatewayPrefix(modelId);\n const [providerId, ...modelParts] = normalizedModelId.split('/');\n const bareModelId = modelParts.join('/');\n if (!providerId || !bareModelId) {\n throw new Error(`Invalid model id: ${modelId}`);\n }\n const routerId = `${MASTRACODE_GATEWAY_ID}/${normalizedModelId}`;\n\n const mgApiKey = MastraCodeGateway.getMemoryGatewayApiKey();\n const rawGatewayBase =\n settings.memoryGateway?.baseUrl ?? process.env['MASTRA_GATEWAY_URL'] ?? 'https://gateway-api.mastra.ai';\n const gateway = createMastraCodeGateway({\n mastraGatewayBaseUrl: rawGatewayBase.replace(/\\/+$/, '').replace(/\\/v1$/, ''),\n mastraGatewayApiKey: mgApiKey,\n routeThroughMastraGateway: Boolean(mgApiKey && isMastraGatewayModel),\n thinkingLevel: options?.thinkingLevel,\n customProviders: settings.customProviders,\n });\n\n const auth = gateway.resolveAuth({\n gatewayId: MASTRACODE_GATEWAY_ID,\n providerId,\n modelId: bareModelId,\n routerId,\n });\n\n return gateway.resolveLanguageModel({\n providerId,\n modelId: bareModelId,\n apiKey: auth?.apiKey ?? mgApiKey ?? '',\n 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/**\n * Goal judge model resolver for the agent's `goal.judge` config. Resolves the\n * configured goal judge model through mastracode's gateway so provider\n * credentials (stored in auth storage, not just env) are injected — a bare model\n * id handed to core's default model router would fail to find the API key.\n *\n * Returns `undefined` when no judge model is configured, which keeps the goal\n * step a complete no-op (the goal mechanism requires a judge to do anything).\n *\n * `settingsPath` must be the same source `createMastraCode()` reads from so the\n * judge model and the goal budget (`goalMaxTurns`) come from one config — with a\n * custom `settingsPath` a bare `loadSettings()` here could read a different file\n * and silently turn the goal step into a no-op.\n */\nexport function getGoalJudgeModel(\n { requestContext }: { requestContext: RequestContext },\n settingsPath?: string,\n): ResolvedModel | undefined {\n const judgeModelId = loadSettings(settingsPath).models.goalJudgeModel;\n if (!judgeModelId) return undefined;\n return resolveModel(judgeModelId, { remapForCodexOAuth: true, requestContext });\n}\n","import type { HarnessRequestContext } from '@mastra/core/harness';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MastraCompositeStore } from '@mastra/core/storage';\nimport type { MastraVector } from '@mastra/core/vector';\nimport { fastembed } from '@mastra/fastembed';\nimport { Memory } from '@mastra/memory';\nimport { DEFAULT_OM_MODEL_ID, DEFAULT_OBS_THRESHOLD, DEFAULT_REF_THRESHOLD } from '../constants';\nimport type { MastraCodeState } from '../schema';\nimport { getOmScope } from '../utils/project';\nimport { resolveModel } from './model';\n\nlet cachedMemory: Memory | null = null;\nlet cachedMemoryKey: string | null = null;\n\n/**\n * Read harness state from requestContext.\n * Used by both the memory factory and the OM model functions.\n */\nfunction getHarnessState(requestContext: RequestContext): MastraCodeState | undefined {\n return (requestContext.get('harness') as HarnessRequestContext<MastraCodeState> | undefined)?.getState?.();\n}\n\n/**\n * Observer model function — reads the current observer model ID from\n * harness state via requestContext (now propagated by OM's agent.generate).\n */\nfunction getObserverModel({ requestContext }: { requestContext: RequestContext }) {\n const state = getHarnessState(requestContext);\n return resolveModel(state?.observerModelId ?? DEFAULT_OM_MODEL_ID, {\n remapForCodexOAuth: true,\n requestContext,\n });\n}\n\n/**\n * Reflector model function — reads the current reflector model ID from\n * harness state via requestContext (now propagated by OM's agent.generate).\n */\nfunction getReflectorModel({ requestContext }: { requestContext: RequestContext }) {\n const state = getHarnessState(requestContext);\n return resolveModel(state?.reflectorModelId ?? DEFAULT_OM_MODEL_ID, {\n remapForCodexOAuth: true,\n requestContext,\n });\n}\n\nconst DYNAMIC_AGENTS_MD_INSTRUCTION =\n 'Messages wrapped in <system-reminder type=\"dynamic-agents-md\" ...>...</system-reminder> are ephemeral project-context instructions injected from files on disk. Do NOT observe or extract information from these messages — they are reloaded automatically when needed and should not be stored in memory.';\n\n// Derived from https://github.com/JuliusBrussee/caveman and adapted for OM use with fixed full-level compression.\nconst CAVEMAN_OM_INSTRUCTION = `Respond terse like smart caveman. All technical substance stay. Only fluff die.\n\nUse full caveman compression style.\n\nDrop: articles (a/an/the), filler (just/really/basically/actually/simply), pleasantries (sure/certainly/of course/happy to), hedging. Fragments OK. Short synonyms (big not extensive, fix not \"implement a solution for\"). Technical terms exact. Code blocks unchanged. Errors quoted exact. Leave out the words \"agent\" and \"assistant\" at the start of each observation line, it is assumed each line is referring to the assistant unless it specifically says it was about the user. Leave out parenthesis and other text characters like * that would not contribute to understanding the observations.\n\nPattern: \\`[thing] [action] [reason]. [next step]\\`\n\nNot: \"Sure! I'd be happy to help you with that. The issue you're experiencing is likely caused by...\"\nYes: \"Bug in auth middleware. Token expiry check use < not <=. Fix:\"\n\nExample 1\n🔴 14:31 user asks why React component rerenders\n🟡 14:32 saw inline object prop create new ref each render, cause rerender\n✅ 14:34 fixed render issue by wrap object in useMemo\n\nExample 2\n🟡 15:10 explained pool reuse DB connections, skip repeat handshake overhead\n\nDon't say \"Agent did x\", say \"did x\". It will be assumed the agent did what was observed. The who should only be specified for the user or other third parties: \"user asked x\"\n\nDrop caveman for: security warnings, irreversible action confirmations, multi-step sequences where fragment order risks misread, user asks to clarify or repeats question, and anything that requires remembering verbatim content. Resume caveman after clear part done`;\n\n/**\n * Dynamic memory factory function.\n * Reads OM thresholds from harness state via requestContext.\n * Model functions also read from requestContext (no mutable bridge needed).\n */\nexport function getDynamicMemory(storage: MastraCompositeStore, vector?: MastraVector) {\n return ({ requestContext }: { requestContext: RequestContext }) => {\n const state = getHarnessState(requestContext);\n const omScope = state?.omScope ?? getOmScope(state?.projectPath);\n\n const obsThreshold = state?.observationThreshold ?? DEFAULT_OBS_THRESHOLD;\n const refThreshold = state?.reflectionThreshold ?? DEFAULT_REF_THRESHOLD;\n const caveman = state?.cavemanObservations ?? false;\n\n const observerPreviousObservationTokens = 1000;\n const observeAttachments = state?.observeAttachments;\n const cacheKey = `${obsThreshold}:${refThreshold}:${omScope}:${observerPreviousObservationTokens}:${caveman ? 1 : 0}:${observeAttachments}`;\n if (cachedMemory && cachedMemoryKey === cacheKey) {\n return cachedMemory;\n }\n\n // Async buffering is not supported with resource scope — disable it\n const isResourceScope = omScope === 'resource';\n\n const observerInstruction = caveman\n ? `${DYNAMIC_AGENTS_MD_INSTRUCTION}\\n\\n${CAVEMAN_OM_INSTRUCTION}`\n : DYNAMIC_AGENTS_MD_INSTRUCTION;\n const reflectionInstruction = caveman ? CAVEMAN_OM_INSTRUCTION : undefined;\n\n cachedMemory = new Memory({\n storage,\n vector: vector || false,\n embedder: vector ? fastembed.small : undefined,\n options: {\n observationalMemory: {\n enabled: true,\n temporalMarkers: true,\n retrieval: vector ? { vector: true } : true,\n scope: omScope,\n activateAfterIdle: 'auto',\n activateOnProviderChange: true,\n observation: {\n bufferTokens: isResourceScope ? false : 1 / 5,\n bufferActivation: isResourceScope ? undefined : 2000,\n model: getObserverModel,\n messageTokens: obsThreshold,\n blockAfter: 2,\n previousObserverTokens: observerPreviousObservationTokens,\n threadTitle: true,\n instruction: observerInstruction,\n observeAttachments,\n },\n reflection: {\n bufferActivation: isResourceScope ? undefined : 1 / 2,\n blockAfter: 1.1,\n model: getReflectorModel,\n observationTokens: refThreshold,\n instruction: reflectionInstruction,\n },\n },\n },\n });\n cachedMemoryKey = cacheKey;\n\n return cachedMemory;\n };\n}\n","/**\n * Execute subagent — focused task execution with write capabilities.\n *\n * This subagent is given a specific implementation task and uses both\n * read and write tools to complete it. It can modify files, run commands,\n * and perform actual development work within a constrained scope.\n */\nimport type { HarnessMode } from '@mastra/core/harness';\n\nexport const buildMode: HarnessMode = {\n id: 'build',\n name: 'Build',\n description:\n \"Task execution with write capabilities. Use for 'implement feature X', 'fix bug Y', 'refactor module Z'.\",\n instructions: `You are a focused execution agent. Your job is to complete a specific, well-defined task by making the necessary changes to the codebase.\n\n## Rules\n- You have FULL ACCESS to read, write, and execute within your task scope.\n- Stay focused on the specific task given. Do not make unrelated changes.\n- Read files before modifying them — use view first, then string_replace_lsp or write_file.\n- Verify your changes work by running relevant tests or checking for errors.\n\n## Tool Strategy\n- **Read first**: Always view a file before editing it\n- **Edit precisely**: Use string_replace_lsp with enough context to match uniquely\n- **Use specialized tools**: Prefer view/search_content/find_files over shell commands for reading\n- **Parallelize**: Make independent tool calls together (e.g., view multiple files at once)\n\n## Workflow\n. Understand the task and explore relevant code\n. For complex tasks (3+ steps): track progress internally and summarize it in your final answer\n. Make changes incrementally — verify each change before moving on\n. Run tests or type-check to verify\n\n## Efficiency\nYour output returns to the parent agent. Be concise:\n- Don't repeat file contents in your response\n- Summarize what changed, don't narrate each step\n- Keep your final summary under 300 words\n\n## Output Format\nEnd with a structured summary:\n. **Completed**: What you implemented (1-2 sentences)\n. **Changes**: Files modified/created\n. **Verification**: How you verified it works\n. **Notes**: Follow-up needed (if any)`,\n defaultModelId: 'openai/gpt-5.5',\n metadata: {\n default: true,\n },\n};\n","/**\n * Explore subagent — read-only codebase exploration.\n *\n * This subagent is given a focused task (e.g., \"find all usages of X\",\n * \"understand how module Y works\") and uses read-only tools to explore\n * the codebase, then returns a concise summary of its findings.\n */\nimport type { HarnessMode } from '@mastra/core/harness';\n\nexport const fastMode: HarnessMode = {\n id: 'fast',\n name: 'Explore',\n description:\n \"Read-only codebase exploration. Use for questions like 'find all usages of X', 'how does module Y work'.\",\n defaultModelId: 'openai/gpt-5.4-mini',\n instructions: `You are an expert code explorer. Your job is to investigate a codebase and answer a specific question or gather specific information.\n\n## Rules\n- You have READ-ONLY access. You cannot modify files or run commands.\n- Be thorough — search broadly first, then drill into relevant files.\n- After gathering enough information, produce a clear, concise summary of your findings.\n\n## Tool Strategy\n- **Start broad**: Use find_files (glob) to understand project structure\n- **Search smart**: Use search_content (grep) with specific patterns — avoid overly broad searches\n- **Read efficiently**: Use view with view_range for large files — don't read entire files if you only need a section\n- **Parallelize**: Make multiple independent tool calls in one round when exploring different areas\n\n## Efficiency\nYour output returns to the parent agent. Be concise:\n- Don't include raw file contents in your response — summarize what you found\n- Reference files by path and line number, not by copying code\n- If a search returns many results, report the count and key examples, not every match\n\n## Output Format\nEnd with a structured summary:\n. **Answer**: Direct answer to the question (1-2 sentences)\n. **Key Files**: Most relevant files with line numbers\n. **Details**: Additional context if needed\n\nKeep your summary under 300 words.`,\n};\n","/**\n * Plan mode — read-only analysis and planning.\n */\nimport type { HarnessMode } from '@mastra/core/harness';\n\nexport const planMode: HarnessMode = {\n id: 'plan',\n name: 'Plan',\n transitionsTo: 'build',\n defaultModelId: 'openai/gpt-5.5',\n description:\n \"Read-only analysis and planning. Use for 'create an implementation plan for X', 'analyze the architecture of Y'.\",\n instructions: `You are an expert software architect and planner. Your job is to analyze a codebase and produce a detailed implementation plan for a given task.\n\n## Rules\n- You have READ-ONLY access. You cannot modify files or run commands.\n- First, explore the codebase to understand existing patterns, architecture, and conventions.\n- Produce a concrete, actionable plan — not vague suggestions.\n\n## Tool Strategy\n- **Discover structure**: Use find_files (glob) to understand project layout and find relevant files\n- **Find patterns**: Use search_content (grep) to locate existing implementations, imports, and conventions\n- **Understand deeply**: Use view with view_range to read specific sections of key files\n- **Parallelize**: Make multiple independent tool calls when exploring different areas\n\n## Efficiency\nYour output returns to the parent agent. Be concise:\n- Don't include raw file contents — reference by path and line number\n- Focus on actionable details, not general observations\n- If you find many similar patterns, describe the pattern once with examples\n\n## Output Format\nStructure your plan as:\n\n. **Summary**: One-paragraph overview (2-3 sentences)\n. **Files to Change**: List each file with specific changes needed\n. **Implementation Order**: Numbered steps in dependency order\n. **Risks**: Potential issues or edge cases (if any)\n\nBe specific about code locations (file paths, function names, line numbers). Keep the plan actionable and under 500 words.`,\n\n metadata: {\n default: false,\n },\n};\n","import type { Harness, HarnessThread } from '@mastra/core/harness';\n\ninterface ThreadStateSetting {\n key: string;\n isValid(value: unknown): boolean;\n}\n\nconst THREAD_STATE_SETTINGS: ThreadStateSetting[] = [\n {\n key: 'cavemanObservations',\n isValid: (value: unknown): value is boolean => typeof value === 'boolean',\n },\n {\n key: 'observeAttachments',\n isValid: (value: unknown): value is 'auto' | boolean => value === 'auto' || typeof value === 'boolean',\n },\n];\n\nfunction getStateValue(harness: Harness<Record<string, unknown>>, setting: ThreadStateSetting): unknown {\n const value = (harness.getState() as Record<string, unknown>)[setting.key];\n return setting.isValid(value) ? value : undefined;\n}\n\nasync function findThread(\n harness: Harness<Record<string, unknown>>,\n threadId: string,\n): Promise<HarnessThread | undefined> {\n const threads = await harness.listThreads({ allResources: true });\n return threads.find(t => t.id === threadId);\n}\n\n/**\n * Restores MastraCode-owned per-thread OM settings for the given thread:\n * - If the thread already has a valid value in metadata, mirror it into harness state.\n * - Otherwise, persist the current harness-state value to the thread so future\n * sessions see the user's last-selected setting.\n */\nasync function restoreSettingsForThread(harness: Harness<Record<string, unknown>>, threadId: string): Promise<void> {\n const thread = await findThread(harness, threadId);\n if (harness.getCurrentThreadId() !== threadId) return;\n\n const updates: Record<string, unknown> = {};\n const settingsToSeed: Array<{ key: string; value: unknown }> = [];\n\n for (const setting of THREAD_STATE_SETTINGS) {\n const persisted = thread?.metadata?.[setting.key];\n\n if (setting.isValid(persisted)) {\n if (getStateValue(harness, setting) !== persisted) {\n updates[setting.key] = persisted;\n }\n continue;\n }\n\n const current = getStateValue(harness, setting);\n if (current !== undefined) {\n settingsToSeed.push({ key: setting.key, value: current });\n }\n }\n\n if (Object.keys(updates).length > 0) {\n await harness.setState(updates);\n }\n\n for (const setting of settingsToSeed) {\n await harness.setThreadSetting(setting);\n }\n}\n\n/**\n * Wires MastraCode-owned OM settings into harness thread events so they persist\n * per-thread and new threads inherit the most recent value.\n *\n * This is intentionally implemented in mastracode rather than core: these\n * settings are mastracode-specific OM concepts, so persistence stays scoped to\n * the host.\n */\nexport function attachOMThreadStatePersistence(harness: Harness<Record<string, unknown>>): void {\n harness.subscribe(event => {\n if (event.type === 'thread_changed' || event.type === 'thread_created') {\n const threadId = event.type === 'thread_changed' ? event.threadId : event.thread.id;\n void restoreSettingsForThread(harness, threadId).catch(() => {\n // Persistence is best-effort; don't crash the TUI if storage hiccups.\n });\n }\n });\n}\n\n/**\n * Eagerly restores MastraCode-owned OM settings for the currently-selected\n * thread. Called once at TUI startup after the initial thread is selected,\n * since the subscription set up later misses the startup `thread_changed` event.\n */\nexport async function restoreOMThreadStateForCurrentThread(harness: Harness<Record<string, unknown>>): Promise<void> {\n const threadId = harness.getCurrentThreadId();\n if (!threadId) return;\n await restoreSettingsForThread(harness, threadId);\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport type { HarnessRequestContext } from '@mastra/core/harness';\nimport { createNotificationInboxTool, NotificationsStorage } from '@mastra/core/notifications';\nimport type {\n CreateNotificationInput,\n ListDueNotificationsInput,\n ListNotificationsInput,\n UpdateNotificationInput,\n} from '@mastra/core/notifications';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MastraCompositeStore } from '@mastra/core/storage';\nimport type { ToolHooks } from '@mastra/core/tools';\nimport type { HookManager } from '../hooks';\nimport type { McpManager } from '../mcp';\nimport type { MastraCodeComposedState } from '../schema';\nimport { MC_TOOLS } from '../tool-names.js';\nimport { createWebSearchTool, createWebExtractTool, hasTavilyKey, requestSandboxAccessTool } from '../tools';\n\n/** Minimal shape for tools passed to createDynamicTools. */\nexport type ToolLike = {\n execute?: (...args: any[]) => Promise<unknown> | unknown;\n} & Record<string, any>;\n\nclass LazyNotificationsStorage extends NotificationsStorage {\n constructor(private readonly storage: MastraCompositeStore) {\n super();\n }\n\n private async getNotificationsStorage(): Promise<NotificationsStorage> {\n const notifications = await this.storage.getStore('notifications');\n if (!notifications) {\n throw new Error('notification_inbox requires a notifications storage domain');\n }\n return notifications;\n }\n\n async createNotification(input: CreateNotificationInput) {\n return (await this.getNotificationsStorage()).createNotification(input);\n }\n\n async listNotifications(input: ListNotificationsInput) {\n return (await this.getNotificationsStorage()).listNotifications(input);\n }\n\n async listDueNotifications(input: ListDueNotificationsInput) {\n return (await this.getNotificationsStorage()).listDueNotifications(input);\n }\n\n async getNotification(input: { threadId: string; id: string }) {\n return (await this.getNotificationsStorage()).getNotification(input);\n }\n\n async updateNotification(input: UpdateNotificationInput) {\n return (await this.getNotificationsStorage()).updateNotification(input);\n }\n\n async dangerouslyClearAll() {\n return (await this.getNotificationsStorage()).dangerouslyClearAll();\n }\n}\n\nexport function createToolHooks(hookManager?: HookManager): ToolHooks | undefined {\n if (!hookManager) return undefined;\n\n return {\n beforeToolCall: async ({ toolName, input }) => {\n const preResult = await hookManager.runPreToolUse(toolName, input);\n if (!preResult.allowed) {\n return {\n proceed: false as const,\n output: {\n error: preResult.blockReason ?? `Blocked by PreToolUse hook for tool \"${toolName}\"`,\n },\n };\n }\n },\n afterToolCall: async ({ toolName, input, output, error }) => {\n await hookManager\n .runPostToolUse(\n toolName,\n input,\n error ? { error: error instanceof Error ? error.message : String(error) } : output,\n Boolean(error),\n )\n .catch(() => undefined);\n },\n };\n}\n\nexport function createDynamicTools(\n mcpManager?: McpManager,\n extraTools?: Record<string, ToolLike> | ((ctx: { requestContext: RequestContext }) => Record<string, ToolLike>),\n disabledTools?: string[],\n storage?: MastraCompositeStore,\n) {\n return function getDynamicTools({ requestContext }: { requestContext: RequestContext }) {\n const ctx = requestContext.get('harness') as HarnessRequestContext<MastraCodeComposedState> | undefined;\n const state = ctx?.getState?.();\n\n const modelId = state?.currentModelId;\n const isAnthropicModel = modelId?.startsWith('anthropic/');\n const isOpenAIModel = modelId?.startsWith('openai/');\n\n // Filesystem, grep, glob, edit, write, execute_command, and process\n // management tools are now provided by the workspace (see workspace.ts).\n // Only tools without a workspace equivalent remain here.\n const tools: Record<string, ToolLike> = {\n request_access: requestSandboxAccessTool,\n };\n\n if (storage) {\n tools[MC_TOOLS.NOTIFICATION_INBOX] = createNotificationInboxTool({\n storage: new LazyNotificationsStorage(storage),\n });\n }\n\n if (hasTavilyKey()) {\n tools.web_search = createWebSearchTool();\n tools.web_extract = createWebExtractTool();\n } else if (isAnthropicModel) {\n const anthropic = createAnthropic({});\n tools.web_search = anthropic.tools.webSearch_20250305();\n } else if (isOpenAIModel) {\n const openai = createOpenAI({});\n tools.web_search = openai.tools.webSearch();\n }\n\n if (mcpManager) {\n const mcpTools = mcpManager.getTools();\n Object.assign(tools, mcpTools);\n }\n\n if (extraTools) {\n const resolved = typeof extraTools === 'function' ? extraTools({ requestContext }) : extraTools;\n for (const [name, tool] of Object.entries(resolved)) {\n if (!(name in tools)) {\n tools[name] = tool;\n }\n }\n }\n\n // Remove tools explicitly disabled via config so the model never sees them.\n if (disabledTools?.length) {\n for (const toolName of disabledTools) {\n delete tools[toolName];\n }\n }\n\n // Remove tools that have a per-tool 'deny' policy so the model never sees them.\n const permissionRules = state?.permissionRules;\n if (permissionRules?.tools) {\n for (const [name, policy] of Object.entries(permissionRules.tools)) {\n if (policy === 'deny') {\n delete tools[name];\n }\n }\n }\n\n return tools;\n };\n}\n","/**\n * Shared command classification utilities for scoring.\n *\n * Used by both live scorers (outcome.ts) and offline scorers (outcome-match.ts)\n * to consistently identify build, test, and other command types.\n */\n\n/**\n * Check if a command string is a build/typecheck command.\n * Handles compound commands (e.g. `pnpm build && pnpm test`) by checking each segment.\n */\nexport function isBuildCommand(command: string): boolean {\n const segments = command.split(/\\s*(?:&&|\\|\\||;)\\s*/);\n return segments.some(seg => {\n const trimmed = seg.trim();\n if (!/\\b(tsc|typecheck|type-check|build)\\b/.test(trimmed)) return false;\n // Don't reject if \"test\" only appears as a substring (e.g. \"build-test-output\").\n // Only reject if a test runner is the primary verb of this segment.\n const primaryVerb = trimmed.replace(/^(?:pnpm|npm|yarn|npx|bunx?|turbo)\\s+(?:run\\s+)?/, '').split(/\\s/)[0] ?? '';\n return !/^(test|vitest|jest|mocha|pytest)$/.test(primaryVerb);\n });\n}\n\n/**\n * Check if a command string is a test command.\n */\nexport function isTestCommand(command: string): boolean {\n return /\\b(test|vitest|jest|mocha|pytest|spec)\\b/.test(command);\n}\n\n/**\n * Extract exit code from an `execute_command` result.\n * Only trusts explicit exitCode/code fields — no heuristic fallbacks.\n */\nexport function getExitCode(result: unknown): number | null {\n if (result == null) return null;\n\n if (typeof result === 'string') {\n const exitMatch = result.match(/exit(?:ed)?\\s+(?:with\\s+)?(?:code\\s+)?(\\d+)/i);\n if (exitMatch) return parseInt(exitMatch[1]!, 10);\n return null;\n }\n\n if (typeof result === 'object') {\n const obj = result as Record<string, unknown>;\n if ('exitCode' in obj && typeof obj.exitCode === 'number') return obj.exitCode;\n if ('code' in obj && typeof obj.code === 'number') return obj.code;\n }\n\n return null;\n}\n\n/**\n * Determine if a tool call result indicates success (exit code 0, no explicit error).\n * Works with both structured result objects and string results.\n */\nexport function isSuccessResult(result: unknown, error?: unknown): boolean {\n if (error) return false;\n if (!result) return false;\n\n if (typeof result === 'object') {\n const obj = result as Record<string, unknown>;\n const exitCode = (obj.exitCode as number | undefined) ?? (obj.code as number | undefined);\n if (typeof exitCode === 'number') return exitCode === 0;\n }\n\n if (typeof result === 'string') {\n const exitMatch = result.match(/exit(?:ed)?\\s+(?:with\\s+)?(?:code\\s+)?(\\d+)/i);\n if (exitMatch) return exitMatch[1] === '0';\n }\n\n // No explicit exit code — can't determine\n return false;\n}\n\n/**\n * Match a file path from tool output against an expected path.\n * Supports exact match and suffix match (e.g. \"src/foo.ts\" matches \"/abs/path/src/foo.ts\").\n */\nexport function matchFilePath(actual: string, expected: string): boolean {\n if (actual === expected) return true;\n return actual.endsWith(`/${expected}`) || expected.endsWith(`/${actual}`);\n}\n","/**\n * Shared tool invocation extraction from MastraDBMessages.\n *\n * Used by both the Outcome and Efficiency scorers to extract completed\n * tool calls from message content, handling both the `parts` array (primary)\n * and the legacy `toolInvocations` array.\n */\n\nimport type { MastraDBMessage } from '@mastra/core/agent';\nimport type { MastraMessagePart, MastraToolInvocation } from '@mastra/core/agent/message-list';\n\nexport type ExtractedToolCall = {\n toolCallId?: string;\n toolName: string;\n args: Record<string, unknown>;\n result: unknown;\n isError: boolean;\n index: number;\n};\n\nfunction isToolInvocationPart(part: MastraMessagePart): part is MastraMessagePart & {\n type: 'tool-invocation';\n toolInvocation: MastraToolInvocation;\n} {\n return 'type' in part && part.type === 'tool-invocation' && 'toolInvocation' in part;\n}\n\nfunction isCompleted(inv: { state: string }): boolean {\n return (\n inv.state === 'result' || inv.state === 'error' || inv.state === 'output-error' || inv.state === 'output-denied'\n );\n}\n\nfunction isErrorState(inv: { state: string }): boolean {\n return inv.state === 'error' || inv.state === 'output-error' || inv.state === 'output-denied';\n}\n\n/**\n * Extract completed tool invocations from MastraDBMessages.\n *\n * Handles both:\n * - `content.parts` (primary format, MastraToolInvocationPart)\n * - `content.toolInvocations` (legacy format, AI SDK ToolInvocation[])\n */\nexport function extractToolCalls(messages: MastraDBMessage[]): ExtractedToolCall[] {\n const results: ExtractedToolCall[] = [];\n const seenToolCallIds = new Set<string>();\n let index = 0;\n\n for (const msg of messages) {\n if (!msg.content) continue;\n\n // Primary format: parts array with tool-invocation parts\n for (const part of msg.content.parts ?? []) {\n if (isToolInvocationPart(part)) {\n const inv = part.toolInvocation;\n if (isCompleted(inv)) {\n const toolCallId = 'toolCallId' in inv ? (inv.toolCallId as string) : undefined;\n if (toolCallId) seenToolCallIds.add(toolCallId);\n\n results.push({\n toolCallId,\n toolName: inv.toolName ?? '',\n args: (inv.args ?? {}) as Record<string, unknown>,\n result: inv.result,\n isError: isErrorState(inv),\n index: index++,\n });\n }\n }\n }\n\n // Legacy format: toolInvocations array (AI SDK ToolInvocation)\n // Only states here are 'partial-call' | 'call' | 'result' — no error state.\n if (msg.content.toolInvocations) {\n for (const inv of msg.content.toolInvocations) {\n if (inv.state === 'result') {\n // Skip if we already extracted this from parts (deduplicate by toolCallId)\n const toolCallId = 'toolCallId' in inv ? inv.toolCallId : undefined;\n if (toolCallId && seenToolCallIds.has(toolCallId)) continue;\n if (toolCallId) seenToolCallIds.add(toolCallId);\n\n results.push({\n toolCallId,\n toolName: inv.toolName ?? '',\n args: (inv.args ?? {}) as Record<string, unknown>,\n result: inv.result,\n isError: false,\n index: index++,\n });\n }\n }\n }\n }\n\n return results;\n}\n","/**\n * MastraCode Outcome Scorer (Code-based, Agent type, always-on)\n *\n * Grades the objective outcome of a coding session by checking hard facts:\n * - Did the build/typecheck pass?\n * - Did tests pass?\n * - What was the tool error rate?\n * - Did the agent get stuck in a loop?\n * - Was there a regression (build passed earlier, failed later)?\n * - Did the agent use ask_user unnecessarily? (autonomy)\n *\n * This scorer is always-on (no sampling) because it's cheap — it only\n * reads exit codes and error states from tool results already in the messages.\n *\n * Scoring philosophy (from Anthropic's eval guidance):\n * \"Grade outcomes, not paths\" — we check what happened, not how.\n * Partial credit: a session that passes build but fails tests scores\n * higher than one that fails build entirely.\n *\n * Dimensions that don't apply to a session (e.g. build for a docs-only task)\n * are excluded from the weighted average, so sessions aren't penalized for\n * irrelevant criteria.\n */\n\nimport type { MastraDBMessage } from '@mastra/core/agent';\nimport { createScorer, filterRun } from '@mastra/core/evals';\n\nimport { isBuildCommand, isTestCommand, getExitCode } from './classify-command';\nimport type { ExtractedToolCall } from './extract-tools';\nimport { extractToolCalls } from './extract-tools';\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// CONFIGURATION — Adjust weights and thresholds here\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Dimension weights. Used to compute the weighted average of applicable dimensions.\n * Dimensions that don't apply (e.g. no build ran) are excluded from the average.\n */\nconst WEIGHTS = {\n build: 0.3,\n tests: 0.25,\n toolErrors: 0.2,\n loops: 0.1,\n regression: 0.1,\n autonomy: 0.05,\n} as const;\n\n/**\n * Scoring thresholds and multipliers.\n */\nconst THRESHOLDS = {\n /** Multiplier for tool error rate penalty. Score = max(0, 1 - rate × this). */\n toolErrorPenaltyMultiplier: 1.0,\n\n /** How many consecutive identical calls (or same-error repeats) before it's a \"loop\". */\n loopMinRepetitions: 3,\n\n /** Score penalty per detected loop. */\n loopPenaltyPerOccurrence: 0.3,\n\n /** Score deducted per ask_user call. */\n autonomyPenaltyPerAsk: 0.25,\n\n /** Score when a command ran but exit code is ambiguous. */\n ambiguousExitScore: 0.75,\n\n /** Minimum tool calls required to produce a meaningful score. */\n minToolCalls: 1,\n\n /** Tool names whose errors are expected/benign (not penalized). */\n benignErrorTools: ['search_content', 'find_files', 'lsp_inspect'] as string[],\n} as const;\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\ntype DimensionResult = { score: number; detail: string; applicable: boolean };\n\n/**\n * Check if the primary verb of an execute_command is a build/typecheck command.\n * Splits compound commands (&&, ;) and checks the first segment.\n */\n/** Extract command string from tool call args, then delegate to shared classifier. */\nfunction isBuildArgs(args: Record<string, unknown>): boolean {\n return isBuildCommand(String(args.command ?? ''));\n}\n\nfunction isTestArgs(args: Record<string, unknown>): boolean {\n return isTestCommand(String(args.command ?? ''));\n}\n\n/**\n * Score build/typecheck outcome (final state).\n */\nfunction scoreBuild(execResults: ExtractedToolCall[]): DimensionResult {\n const builds = execResults.filter(r => r.toolName === 'execute_command' && isBuildArgs(r.args));\n if (builds.length === 0) return { score: 0, detail: 'No build/typecheck ran', applicable: false };\n\n const last = builds[builds.length - 1]!;\n if (last.isError) return { score: 0, detail: 'Build/typecheck tool errored', applicable: true };\n\n const exitCode = getExitCode(last.result);\n if (exitCode === 0) return { score: 1, detail: 'Build/typecheck passed', applicable: true };\n if (exitCode !== null && exitCode !== 0)\n return { score: 0, detail: `Build failed (exit ${exitCode})`, applicable: true };\n\n // Fallback: check result text for TS errors\n const text = typeof last.result === 'string' ? last.result : JSON.stringify(last.result ?? '');\n if (/error TS\\d+|Cannot find module|is not assignable/i.test(text)) {\n return { score: 0, detail: 'Build failed (TypeScript errors in output)', applicable: true };\n }\n\n return { score: THRESHOLDS.ambiguousExitScore, detail: 'Build ran, outcome unclear', applicable: true };\n}\n\n/**\n * Score test outcome (final state).\n */\nfunction scoreTests(execResults: ExtractedToolCall[]): DimensionResult {\n const tests = execResults.filter(r => r.toolName === 'execute_command' && isTestArgs(r.args));\n if (tests.length === 0) return { score: 0, detail: 'No tests ran', applicable: false };\n\n const last = tests[tests.length - 1]!;\n if (last.isError) return { score: 0, detail: 'Test command errored', applicable: true };\n\n const exitCode = getExitCode(last.result);\n if (exitCode === 0) return { score: 1, detail: 'Tests passed', applicable: true };\n if (exitCode !== null && exitCode !== 0)\n return { score: 0, detail: `Tests failed (exit ${exitCode})`, applicable: true };\n\n const text = typeof last.result === 'string' ? last.result : JSON.stringify(last.result ?? '');\n if (/\\d+ (?:tests? )?passed|✓|PASS/i.test(text) && !/\\bfail(?:ed|ure)?\\b|\\berror\\b/i.test(text)) {\n return { score: 1, detail: 'Tests passed (inferred)', applicable: true };\n }\n if (/\\bFAIL\\b|failed|✗|✘/i.test(text)) {\n return { score: 0, detail: 'Tests failed (inferred)', applicable: true };\n }\n\n return { score: THRESHOLDS.ambiguousExitScore, detail: 'Tests ran, outcome unclear', applicable: true };\n}\n\n/**\n * Score tool error rate, excluding benign errors from expected-to-fail tools.\n */\nfunction scoreToolErrors(results: ExtractedToolCall[]): DimensionResult {\n if (results.length === 0) return { score: 1, detail: 'No tool calls', applicable: false };\n\n // Only count errors from non-benign tools\n const nonBenign = results.filter(r => !THRESHOLDS.benignErrorTools.includes(r.toolName));\n if (nonBenign.length === 0) return { score: 1, detail: 'All tool calls are benign-error tools', applicable: true };\n\n const errors = nonBenign.filter(r => r.isError);\n const rate = errors.length / nonBenign.length;\n\n if (rate === 0) return { score: 1, detail: 'No tool errors', applicable: true };\n\n const score = Math.max(0, 1 - rate * THRESHOLDS.toolErrorPenaltyMultiplier);\n return {\n score,\n detail: `${errors.length}/${nonBenign.length} tools errored (${(rate * 100).toFixed(0)}%)`,\n applicable: true,\n };\n}\n\n/**\n * Detect stuck loops: same tool + same args appearing 3+ times consecutively,\n * or same tool + same args erroring 3+ times total.\n */\nfunction scoreStuckLoops(results: ExtractedToolCall[]): DimensionResult {\n if (results.length < 3) return { score: 1, detail: 'Too few calls for loop detection', applicable: true };\n\n const fingerprint = (r: ExtractedToolCall) => `${r.toolName}:${JSON.stringify(r.args)}`;\n\n // Check consecutive identical calls\n let maxConsecutive = 1;\n let currentRun = 1;\n for (let i = 1; i < results.length; i++) {\n if (fingerprint(results[i]!) === fingerprint(results[i - 1]!)) {\n currentRun++;\n maxConsecutive = Math.max(maxConsecutive, currentRun);\n } else {\n currentRun = 1;\n }\n }\n\n // Check repeated error fingerprints\n const errorCounts = new Map<string, number>();\n for (const r of results) {\n if (!r.isError) continue;\n const fp = fingerprint(r);\n errorCounts.set(fp, (errorCounts.get(fp) ?? 0) + 1);\n }\n const maxErrorRepeat = Math.max(0, ...[...errorCounts.values()]);\n\n const minReps = THRESHOLDS.loopMinRepetitions;\n const loopSeverity = Math.max(\n maxConsecutive >= minReps ? maxConsecutive - (minReps - 1) : 0,\n maxErrorRepeat >= minReps ? maxErrorRepeat - (minReps - 1) : 0,\n );\n\n if (loopSeverity === 0) return { score: 1, detail: 'No stuck loops', applicable: true };\n\n const score = Math.max(0, 1 - loopSeverity * THRESHOLDS.loopPenaltyPerOccurrence);\n const details: string[] = [];\n if (maxConsecutive >= minReps) details.push(`${maxConsecutive} consecutive identical calls`);\n if (maxErrorRepeat >= minReps) details.push(`same error repeated ${maxErrorRepeat}x`);\n return { score, detail: details.join('; '), applicable: true };\n}\n\n/**\n * Detect regressions: build/test passed at some point, then failed later.\n * Gives partial credit if the agent recovered (final state passes).\n */\nfunction scoreRegression(execResults: ExtractedToolCall[]): DimensionResult {\n const regressions: { label: string; recovered: boolean }[] = [];\n\n for (const [label, filter] of [\n ['Build', isBuildArgs],\n ['Tests', isTestArgs],\n ] as const) {\n const cmds = execResults.filter(r => r.toolName === 'execute_command' && filter(r.args));\n if (cmds.length < 2) continue;\n\n let sawPass = false;\n let sawRegression = false;\n for (const cmd of cmds) {\n const exit = getExitCode(cmd.result);\n if (exit === 0) {\n if (sawRegression) {\n // Recovered from regression\n regressions.push({ label, recovered: true });\n sawRegression = false;\n }\n sawPass = true;\n }\n if (sawPass && exit !== null && exit !== 0) {\n sawRegression = true;\n }\n }\n\n if (sawRegression) {\n // Regression persisted at end of session\n regressions.push({ label, recovered: false });\n }\n }\n\n if (regressions.length === 0) return { score: 1, detail: 'No regressions', applicable: true };\n\n // Persistent regressions are severe (0), recovered regressions get partial credit (0.5)\n const persistentCount = regressions.filter(r => !r.recovered).length;\n const recoveredCount = regressions.filter(r => r.recovered).length;\n const score = Math.max(0, 1 - persistentCount * 0.5 - recoveredCount * 0.1);\n const details = regressions.map(\n r => `${r.label} ${r.recovered ? 'regressed then recovered' : 'regressed (persisted)'}`,\n );\n return { score, detail: details.join('; '), applicable: true };\n}\n\n/**\n * Score autonomy: penalize ask_user calls.\n * 0 calls = 1.0, each call reduces by 0.25 (up to a floor of 0).\n */\nfunction scoreAutonomy(results: ExtractedToolCall[]): DimensionResult {\n const askUserCalls = results.filter(r => r.toolName === 'ask_user');\n const count = askUserCalls.length;\n\n if (count === 0) return { score: 1, detail: 'No ask_user calls (fully autonomous)', applicable: true };\n\n const score = Math.max(0, 1 - count * THRESHOLDS.autonomyPenaltyPerAsk);\n return { score, detail: `${count} ask_user call${count > 1 ? 's' : ''}`, applicable: true };\n}\n\n/**\n * Compute weighted average of only applicable dimensions.\n * Returns null if no dimensions are applicable.\n */\nfunction weightedAverage(dimensions: Record<string, DimensionResult>, weights: Record<string, number>): number | null {\n let totalWeight = 0;\n let weightedSum = 0;\n\n for (const [key, result] of Object.entries(dimensions)) {\n if (!result.applicable) continue;\n const weight = weights[key] ?? 0;\n totalWeight += weight;\n weightedSum += result.score * weight;\n }\n\n if (totalWeight === 0) return null;\n return weightedSum / totalWeight;\n}\n\nexport function createOutcomeScorer() {\n return createScorer({\n id: 'mastracode-outcome',\n name: 'MastraCode Outcome',\n description:\n 'Grades coding session outcomes: build/test pass, tool errors, stuck loops, regressions, autonomy. Always-on.',\n type: 'agent',\n prepareRun: filterRun({ partTypes: ['tool-invocation', 'text'] }),\n })\n .preprocess(async ({ run }) => {\n const messages = (run.output ?? []) as MastraDBMessage[];\n const allResults = extractToolCalls(messages);\n const totalCalls = allResults.length;\n\n // H1: Empty sessions or sessions with no tool calls → score 0\n if (totalCalls < THRESHOLDS.minToolCalls) {\n const empty: DimensionResult = { score: 0, detail: 'No tool calls', applicable: false };\n return {\n empty: true as const,\n build: empty,\n tests: empty,\n toolErrors: empty,\n loops: empty,\n regression: empty,\n autonomy: empty,\n totalCalls,\n };\n }\n\n const execResults = allResults.filter(r => r.toolName === 'execute_command');\n\n return {\n empty: false as const,\n build: scoreBuild(execResults),\n tests: scoreTests(execResults),\n toolErrors: scoreToolErrors(allResults),\n loops: scoreStuckLoops(allResults),\n regression: scoreRegression(execResults),\n autonomy: scoreAutonomy(allResults),\n totalCalls,\n };\n })\n .generateScore(({ results }) => {\n const p = results.preprocessStepResult;\n if (p.empty) return 0;\n\n const score = weightedAverage(\n {\n build: p.build,\n tests: p.tests,\n toolErrors: p.toolErrors,\n loops: p.loops,\n regression: p.regression,\n autonomy: p.autonomy,\n },\n WEIGHTS,\n );\n\n return score === null ? 0 : Math.round(score * 100) / 100;\n })\n .generateReason(({ results, score }) => {\n const p = results.preprocessStepResult;\n if (p.empty) {\n return `Score: 0 (${p.totalCalls} tool calls — below minimum threshold for scoring)`;\n }\n\n const pct = (w: number) => `${(w * 100).toFixed(0)}%`;\n const dimLine = (name: string, weight: number, r: DimensionResult) =>\n r.applicable\n ? `${name} (${pct(weight)}): ${r.detail} [${r.score}]`\n : `${name}: ${r.detail} [N/A — excluded from average]`;\n\n const parts: string[] = [`Score: ${score} (${p.totalCalls} tool calls total)`];\n parts.push(dimLine('Build', WEIGHTS.build, p.build));\n parts.push(dimLine('Tests', WEIGHTS.tests, p.tests));\n parts.push(dimLine('Tool errors', WEIGHTS.toolErrors, p.toolErrors));\n parts.push(dimLine('Loops', WEIGHTS.loops, p.loops));\n parts.push(dimLine('Regression', WEIGHTS.regression, p.regression));\n parts.push(dimLine('Autonomy', WEIGHTS.autonomy, p.autonomy));\n\n return parts.join('\\n');\n });\n}\n","/**\n * MastraCode Efficiency Scorer (Code-based, Agent type, 30% sampling)\n *\n * Measures how efficiently the agent completes work through quantitative ratios.\n * Unlike the Outcome Scorer (which checks *what* happened), this checks\n * *how much work* it took.\n *\n * This scorer produces a score from 0-1 but also exposes raw metrics in the\n * reason text for trend analysis. The score represents \"how cleanly did the\n * agent work?\" — not whether it got the right answer.\n *\n * Sampled at 30% because it's slightly more expensive (analyzes message sequences).\n */\n\nimport type { MastraDBMessage } from '@mastra/core/agent';\nimport { createScorer, filterRun } from '@mastra/core/evals';\n\nimport type { ExtractedToolCall } from './extract-tools';\nimport { extractToolCalls } from './extract-tools';\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// CONFIGURATION — Adjust weights and thresholds here\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Dimension weights (must sum to 1.0).\n *\n * - redundancy: Duplicate mutation tool calls with identical args.\n * - turnCount: Total assistant turns to complete the task.\n * - retryEfficiency: How quickly the agent recovers from tool failures.\n * - readBeforeEdit: Whether files are read before being edited.\n */\nconst WEIGHTS = {\n redundancy: 0.35,\n turnCount: 0.3,\n retryEfficiency: 0.2,\n readBeforeEdit: 0.15,\n} as const;\n\n/**\n * Scoring thresholds and multipliers.\n */\nconst THRESHOLDS = {\n /** Redundancy ratio below this is considered acceptable (no penalty). */\n redundancyAcceptableRate: 0.05,\n\n /** Penalty multiplier applied to redundancy ratio above the acceptable rate. */\n redundancyPenaltyMultiplier: 3,\n\n /** Turns at or below this is considered normal (score 1.0). */\n turnCountNormalMax: 8,\n\n /** Penalty per turn beyond the normal maximum (for turns 9–15). */\n turnCountPenaltyPerTurn: 0.04,\n\n /** Penalty per turn beyond 15. */\n turnCountExtendedPenaltyPerTurn: 0.03,\n\n /** Number of consecutive failures before a retry chain is \"excessive\". */\n retryExcessiveThreshold: 3,\n\n /** Tools considered \"edit\" tools that should be preceded by a read. */\n editTools: ['string_replace_lsp', 'ast_smart_edit'] as string[],\n\n /** Tools that satisfy read-before-edit (only `view` truly reads a specific file). */\n readTools: ['view'] as string[],\n\n /** Tools whose repeated identical calls are intentional (idempotent reads). */\n redundancyWhitelist: ['view', 'search_content', 'find_files', 'lsp_inspect', 'web_search', 'web_extract'] as string[],\n\n /** Minimum tool calls required to produce a meaningful score. */\n minToolCalls: 2,\n} as const;\n\n/**\n * Count assistant turns (messages with role === 'assistant').\n */\nfunction countAssistantTurns(messages: MastraDBMessage[]): number {\n return messages.filter(m => m.role === 'assistant').length;\n}\n\n/**\n * Calculate redundant call ratio.\n * Only counts mutation/action tools as redundant — reads are whitelisted.\n */\nfunction scoreRedundancy(calls: ExtractedToolCall[]): { score: number; ratio: number; detail: string } {\n if (calls.length < 2) return { score: 1, ratio: 0, detail: 'Too few calls' };\n\n // Only consider non-whitelisted (mutation) tools for redundancy\n const mutationCalls = calls.filter(c => !THRESHOLDS.redundancyWhitelist.includes(c.toolName));\n if (mutationCalls.length < 2) return { score: 1, ratio: 0, detail: 'No mutation tools to check' };\n\n const fingerprints = new Map<string, { count: number; successCount: number }>();\n for (const call of mutationCalls) {\n const fp = `${call.toolName}:${JSON.stringify(call.args)}`;\n const existing = fingerprints.get(fp) ?? { count: 0, successCount: 0 };\n existing.count++;\n if (!call.isError) existing.successCount++;\n fingerprints.set(fp, existing);\n }\n\n // Only count as redundant if the same successful call happened multiple times\n let redundantCount = 0;\n for (const { successCount } of fingerprints.values()) {\n if (successCount > 1) redundantCount += successCount - 1;\n }\n\n const ratio = redundantCount / mutationCalls.length;\n const acceptable = THRESHOLDS.redundancyAcceptableRate;\n const score =\n ratio <= acceptable ? 1 : Math.max(0, 1 - (ratio - acceptable) * THRESHOLDS.redundancyPenaltyMultiplier);\n return {\n score,\n ratio,\n detail: `${redundantCount}/${mutationCalls.length} redundant mutations (${(ratio * 100).toFixed(0)}%)`,\n };\n}\n\n/**\n * Score turn count efficiency.\n * Fewer turns to accomplish the task = more efficient.\n */\nfunction scoreTurnCount(turns: number): { score: number; detail: string } {\n const normalMax = THRESHOLDS.turnCountNormalMax;\n const penaltyPerTurn = THRESHOLDS.turnCountPenaltyPerTurn;\n const extendedPenalty = THRESHOLDS.turnCountExtendedPenaltyPerTurn;\n\n if (turns <= 1) return { score: 1, detail: `${turns} turn` };\n if (turns <= normalMax) return { score: 1, detail: `${turns} turns (within normal range)` };\n if (turns <= 15) {\n const score = 1 - (turns - normalMax) * penaltyPerTurn;\n return { score, detail: `${turns} turns (slightly extended)` };\n }\n\n const midPenalty = (15 - normalMax) * penaltyPerTurn;\n const score = Math.max(0, 1 - midPenalty - (turns - 15) * extendedPenalty);\n return { score, detail: `${turns} turns (extended session)` };\n}\n\n/**\n * Score failed-then-succeeded ratio.\n * Groups retry chains by tool name + target file path for more accurate detection.\n */\nfunction scoreRetryEfficiency(calls: ExtractedToolCall[]): { score: number; detail: string } {\n if (calls.length < 2) return { score: 1, detail: 'Too few calls' };\n\n // Group calls by tool name + target file path (if available)\n const groupKey = (call: ExtractedToolCall): string => {\n const path = String(call.args.path ?? call.args.command ?? '');\n return `${call.toolName}:${path}`;\n };\n\n const byGroup = new Map<string, ExtractedToolCall[]>();\n for (const call of calls) {\n const key = groupKey(call);\n const arr = byGroup.get(key) ?? [];\n arr.push(call);\n byGroup.set(key, arr);\n }\n\n let totalRetryChains = 0;\n let excessiveRetries = 0;\n const threshold = THRESHOLDS.retryExcessiveThreshold;\n\n for (const [, toolCalls] of byGroup) {\n let consecutiveFailures = 0;\n for (const call of toolCalls) {\n if (call.isError) {\n consecutiveFailures++;\n } else {\n if (consecutiveFailures > 0) {\n totalRetryChains++;\n if (consecutiveFailures >= threshold) excessiveRetries++;\n }\n consecutiveFailures = 0;\n }\n }\n // Count unrecovered retry chains (failures at end of group with no success)\n if (consecutiveFailures > 0) {\n totalRetryChains++;\n if (consecutiveFailures >= threshold) excessiveRetries++;\n }\n }\n\n if (totalRetryChains === 0) return { score: 1, detail: 'No retry chains' };\n if (excessiveRetries === 0) return { score: 0.9, detail: `${totalRetryChains} retry chain(s), all resolved quickly` };\n\n const score = Math.max(0, 0.8 - excessiveRetries * 0.2);\n return {\n score,\n detail: `${excessiveRetries} excessive retry chain(s) (${threshold}+ failures before success)`,\n };\n}\n\n/**\n * Score read-before-edit compliance.\n * Only `view` satisfies a read — search/find don't provide specific file content.\n */\nfunction scoreReadBeforeEdit(calls: ExtractedToolCall[]): { score: number; detail: string } {\n const editTools = THRESHOLDS.editTools;\n const readTools = THRESHOLDS.readTools;\n\n const edits = calls.filter(c => editTools.includes(c.toolName));\n if (edits.length === 0) return { score: 1, detail: 'No edits to check' };\n\n // Build set of files that were read before each edit.\n // Use suffix-normalized paths so that \"/abs/path/src/foo.ts\" and \"src/foo.ts\" match.\n const readPaths = new Set<string>();\n let compliant = 0;\n let total = 0;\n\n for (const call of calls) {\n const rawPath = String(call.args.path ?? '');\n if (!rawPath) continue;\n\n if (readTools.includes(call.toolName)) {\n readPaths.add(rawPath);\n } else if (editTools.includes(call.toolName)) {\n total++;\n if (hasReadPath(readPaths, rawPath)) {\n compliant++;\n }\n }\n }\n\n if (total === 0) return { score: 1, detail: 'No path-targeted edits' };\n\n const ratio = compliant / total;\n const violations = total - compliant;\n if (violations === 0) return { score: 1, detail: `All ${total} edits had prior reads` };\n return { score: ratio, detail: `${violations}/${total} edits without prior read` };\n}\n\n/** Check if any read path matches the edit path, using suffix matching for mixed abs/relative paths. */\nfunction hasReadPath(readPaths: Set<string>, editPath: string): boolean {\n if (readPaths.has(editPath)) return true;\n for (const rp of readPaths) {\n if (rp.endsWith(`/${editPath}`) || editPath.endsWith(`/${rp}`)) return true;\n }\n return false;\n}\n\nexport function createEfficiencyScorer() {\n return createScorer({\n id: 'mastracode-efficiency',\n name: 'MastraCode Efficiency',\n description:\n 'Measures coding session efficiency: redundancy, turn count, retry patterns, read-before-edit. 30% sampled.',\n type: 'agent',\n prepareRun: filterRun({ partTypes: ['tool-invocation', 'text'] }),\n })\n .preprocess(async ({ run }) => {\n const messages = (run.output ?? []) as MastraDBMessage[];\n const calls = extractToolCalls(messages);\n const turns = countAssistantTurns(messages);\n\n // H1: Empty sessions → score 0\n if (calls.length < THRESHOLDS.minToolCalls) {\n return { empty: true as const, totalCalls: calls.length, totalTurns: turns };\n }\n\n const redundancy = scoreRedundancy(calls);\n const turnCount = scoreTurnCount(turns);\n const retryEfficiency = scoreRetryEfficiency(calls);\n const readBeforeEdit = scoreReadBeforeEdit(calls);\n\n return {\n empty: false as const,\n redundancy,\n turnCount,\n retryEfficiency,\n readBeforeEdit,\n totalCalls: calls.length,\n totalTurns: turns,\n };\n })\n .generateScore(({ results }) => {\n const p = results.preprocessStepResult;\n if (p.empty) return 0;\n\n const score =\n p.redundancy.score * WEIGHTS.redundancy +\n p.turnCount.score * WEIGHTS.turnCount +\n p.retryEfficiency.score * WEIGHTS.retryEfficiency +\n p.readBeforeEdit.score * WEIGHTS.readBeforeEdit;\n\n return Math.round(score * 100) / 100;\n })\n .generateReason(({ results, score }) => {\n const p = results.preprocessStepResult;\n if (p.empty) {\n return `Score: 0 (${p.totalCalls} tool calls — below minimum threshold for scoring)`;\n }\n\n const pct = (w: number) => `${(w * 100).toFixed(0)}%`;\n const parts: string[] = [`Score: ${score} (${p.totalCalls} calls, ${p.totalTurns} turns)`];\n\n parts.push(`Redundancy (${pct(WEIGHTS.redundancy)}): ${p.redundancy.detail} [${p.redundancy.score}]`);\n parts.push(`Turn count (${pct(WEIGHTS.turnCount)}): ${p.turnCount.detail} [${p.turnCount.score}]`);\n parts.push(\n `Retry efficiency (${pct(WEIGHTS.retryEfficiency)}): ${p.retryEfficiency.detail} [${p.retryEfficiency.score}]`,\n );\n parts.push(\n `Read-before-edit (${pct(WEIGHTS.readBeforeEdit)}): ${p.readBeforeEdit.detail} [${p.readBeforeEdit.score}]`,\n );\n\n return parts.join('\\n');\n });\n}\n","/**\n * Hook configuration loading from filesystem.\n * Loads from global (~/.mastracode/hooks.json) and project (.mastracode/hooks.json).\n * Global hooks run first, project hooks append.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { DEFAULT_CONFIG_DIR } from '../constants.js';\nimport type { HooksConfig, HookDefinition, HookEventName } from './types.js';\n\nconst VALID_EVENTS: HookEventName[] = [\n 'PreToolUse',\n 'PostToolUse',\n 'Stop',\n 'UserPromptSubmit',\n 'SessionStart',\n 'SessionEnd',\n 'Notification',\n];\n\nexport function loadHooksConfig(projectDir: string, configDirName = DEFAULT_CONFIG_DIR): HooksConfig {\n const globalPath = getGlobalHooksPath(configDirName);\n const projectPath = getProjectHooksPath(projectDir, configDirName);\n\n const globalConfig = loadSingleConfig(globalPath);\n const projectConfig = loadSingleConfig(projectPath);\n\n return mergeConfigs(globalConfig, projectConfig);\n}\n\nexport function getProjectHooksPath(projectDir: string, configDirName = DEFAULT_CONFIG_DIR): string {\n return path.join(projectDir, configDirName, 'hooks.json');\n}\n\nexport function getGlobalHooksPath(configDirName = DEFAULT_CONFIG_DIR): string {\n return path.join(os.homedir(), configDirName, 'hooks.json');\n}\n\nfunction loadSingleConfig(filePath: string): HooksConfig {\n try {\n if (!fs.existsSync(filePath)) return {};\n const raw = fs.readFileSync(filePath, 'utf-8');\n return validateConfig(JSON.parse(raw));\n } catch {\n return {};\n }\n}\n\nfunction validateConfig(raw: unknown): HooksConfig {\n if (!raw || typeof raw !== 'object') return {};\n\n const config: HooksConfig = {};\n const obj = raw as Record<string, unknown>;\n\n for (const event of VALID_EVENTS) {\n if (Array.isArray(obj[event])) {\n const hooks = (obj[event] as unknown[]).filter(isValidHook);\n if (hooks.length > 0) {\n config[event] = hooks;\n }\n }\n }\n\n return config;\n}\n\nfunction isValidHook(raw: unknown): raw is HookDefinition {\n if (!raw || typeof raw !== 'object') return false;\n const obj = raw as Record<string, unknown>;\n return obj.type === 'command' && typeof obj.command === 'string';\n}\n\nfunction mergeConfigs(global: HooksConfig, project: HooksConfig): HooksConfig {\n const merged: HooksConfig = {};\n\n for (const event of VALID_EVENTS) {\n const combined = [...(global[event] ?? []), ...(project[event] ?? [])];\n if (combined.length > 0) {\n merged[event] = combined;\n }\n }\n\n return merged;\n}\n","/**\n * Type definitions for the hooks system.\n * Hooks are user-configured shell commands that run at lifecycle events.\n */\n\n// =============================================================================\n// Hook Event Names\n// =============================================================================\nexport type HookEventName =\n | 'PreToolUse'\n | 'PostToolUse'\n | 'Stop'\n | 'UserPromptSubmit'\n | 'SessionStart'\n | 'SessionEnd'\n | 'Notification';\n\nexport type BlockingHookEvent = 'PreToolUse' | 'Stop' | 'UserPromptSubmit';\n\nexport function isBlockingEvent(event: HookEventName): event is BlockingHookEvent {\n return event === 'PreToolUse' || event === 'Stop' || event === 'UserPromptSubmit';\n}\n\n// =============================================================================\n// Hook Configuration\n// =============================================================================\n\nexport interface HookMatcher {\n /** Regex pattern matched against tool_name (PreToolUse/PostToolUse only). */\n tool_name?: string;\n}\n\nexport interface HookDefinition {\n /** Hook type. Only \"command\" supported in phase 1. */\n type: 'command';\n /** Shell command to execute via /bin/sh -c. */\n command: string;\n /** Optional matcher to filter when this hook runs. */\n matcher?: HookMatcher;\n /** Timeout in ms. Default 10000. Process killed after timeout. */\n timeout?: number;\n /** Human-readable description for /hooks display. */\n description?: string;\n}\nexport interface HooksConfig {\n PreToolUse?: HookDefinition[];\n PostToolUse?: HookDefinition[];\n Stop?: HookDefinition[];\n UserPromptSubmit?: HookDefinition[];\n SessionStart?: HookDefinition[];\n SessionEnd?: HookDefinition[];\n Notification?: HookDefinition[];\n}\n\n// =============================================================================\n// Stdin Protocol (JSON sent to hook process)\n// =============================================================================\n\nexport interface HookStdinBase {\n session_id: string;\n cwd: string;\n hook_event_name: HookEventName;\n}\n\nexport interface HookStdinToolEvent extends HookStdinBase {\n hook_event_name: 'PreToolUse' | 'PostToolUse';\n tool_name: string;\n tool_input: unknown;\n tool_output?: unknown;\n tool_error?: boolean;\n}\n\nexport interface HookStdinUserPrompt extends HookStdinBase {\n hook_event_name: 'UserPromptSubmit';\n user_message: string;\n}\n\nexport interface HookStdinStop extends HookStdinBase {\n hook_event_name: 'Stop';\n assistant_message?: string;\n stop_reason: 'complete' | 'aborted' | 'error';\n}\nexport interface HookStdinSession extends HookStdinBase {\n hook_event_name: 'SessionStart' | 'SessionEnd';\n}\n\nexport interface HookStdinNotification extends HookStdinBase {\n hook_event_name: 'Notification';\n /** Why the notification fired: agent_done, ask_question, tool_approval, plan_approval, sandbox_access */\n reason: string;\n /** Optional human-readable message for the notification. */\n message?: string;\n}\n\nexport type HookStdin =\n | HookStdinToolEvent\n | HookStdinUserPrompt\n | HookStdinStop\n | HookStdinSession\n | HookStdinNotification;\n\n// =============================================================================\n// Stdout Protocol (JSON read from hook process)\n// =============================================================================\n\nexport interface HookStdout {\n decision?: 'allow' | 'block';\n reason?: string;\n additionalContext?: string;\n}\n\n// =============================================================================\n// Execution Results\n// =============================================================================\n\nexport interface HookResult {\n hook: HookDefinition;\n exitCode: number;\n stdout?: HookStdout;\n stderr?: string;\n timedOut: boolean;\n durationMs: number;\n}\n\nexport interface HookEventResult {\n allowed: boolean;\n blockReason?: string;\n additionalContext?: string;\n results: HookResult[];\n warnings: string[];\n}\n","/**\n * Hook process execution.\n * Spawns shell commands, handles stdin/stdout/exit-code protocol.\n */\n\nimport { spawn } from 'node:child_process';\nimport type { HookDefinition, HookStdin, HookResult, HookStdout, HookEventResult } from './types.js';\nimport { isBlockingEvent } from './types.js';\n\nconst DEFAULT_TIMEOUT = 10_000;\n\nexport async function executeHook(hook: HookDefinition, stdinPayload: HookStdin): Promise<HookResult> {\n const timeout = hook.timeout ?? DEFAULT_TIMEOUT;\n const startTime = Date.now();\n\n return new Promise<HookResult>(resolve => {\n const isWindows = process.platform === 'win32';\n const shell = isWindows ? 'cmd' : '/bin/sh';\n const shellArgs = isWindows ? ['/c', hook.command] : ['-c', hook.command];\n\n const child = spawn(shell, shellArgs, {\n stdio: ['pipe', 'pipe', 'pipe'],\n cwd: stdinPayload.cwd,\n env: {\n ...process.env,\n MASTRA_HOOK_EVENT: stdinPayload.hook_event_name,\n },\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n let resolved = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill('SIGKILL');\n }, timeout);\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', exitCode => {\n clearTimeout(timer);\n if (resolved) return;\n resolved = true;\n\n let parsedStdout: HookStdout | undefined;\n if (stdout.trim()) {\n try {\n parsedStdout = JSON.parse(stdout.trim()) as HookStdout;\n } catch {\n // Not valid JSON — ignore\n }\n }\n\n resolve({\n hook,\n exitCode: exitCode ?? 1,\n stdout: parsedStdout,\n stderr: stderr.trim() || undefined,\n timedOut,\n durationMs: Date.now() - startTime,\n });\n });\n\n child.on('error', error => {\n clearTimeout(timer);\n if (resolved) return;\n resolved = true;\n\n resolve({\n hook,\n exitCode: 1,\n stderr: error.message,\n timedOut: false,\n durationMs: Date.now() - startTime,\n });\n });\n\n try {\n child.stdin?.write(JSON.stringify(stdinPayload));\n child.stdin?.end();\n } catch {\n // stdin write failure — process continues\n }\n });\n}\n\nexport function matchesHook(hook: HookDefinition, context: { tool_name?: string }): boolean {\n if (!hook.matcher) return true;\n\n if (hook.matcher.tool_name) {\n if (!context.tool_name) return false;\n try {\n return new RegExp(hook.matcher.tool_name).test(context.tool_name);\n } catch {\n return false;\n }\n }\n\n return true;\n}\n\nexport async function runHooksForEvent(\n hooks: HookDefinition[],\n stdinPayload: HookStdin,\n matchContext: { tool_name?: string } = {},\n): Promise<HookEventResult> {\n const results: HookResult[] = [];\n const warnings: string[] = [];\n let additionalContext: string | undefined;\n\n const applicable = hooks.filter(h => matchesHook(h, matchContext));\n if (applicable.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const blocking = isBlockingEvent(stdinPayload.hook_event_name);\n\n for (const hook of applicable) {\n const result = await executeHook(hook, stdinPayload);\n results.push(result);\n\n if (result.stdout?.additionalContext) {\n additionalContext = additionalContext\n ? `${additionalContext}\\n${result.stdout.additionalContext}`\n : result.stdout.additionalContext;\n }\n\n if (result.timedOut) {\n warnings.push(`Hook timed out after ${hook.timeout ?? DEFAULT_TIMEOUT}ms: ${hook.command}`);\n continue;\n }\n\n if (result.exitCode === 2 && blocking) {\n const reason = result.stdout?.reason || result.stderr || `Blocked by hook: ${hook.description || hook.command}`;\n\n return {\n allowed: false,\n blockReason: reason,\n additionalContext,\n results,\n warnings,\n };\n }\n\n if (result.exitCode === 0) continue;\n\n const warnMsg = result.stderr || `Hook exited with code ${result.exitCode}`;\n warnings.push(`${hook.description || hook.command}: ${warnMsg}`);\n }\n\n return { allowed: true, additionalContext, results, warnings };\n}\n","/**\n * HookManager — high-level orchestration for the hooks system.\n * Created once at startup, provides methods for each lifecycle event.\n */\nimport { DEFAULT_CONFIG_DIR } from '../constants.js';\nimport { loadHooksConfig, getProjectHooksPath, getGlobalHooksPath } from './config.js';\nimport { runHooksForEvent } from './executor.js';\nimport type {\n HooksConfig,\n HookEventResult,\n HookStdinToolEvent,\n HookStdinUserPrompt,\n HookStdinStop,\n HookStdinSession,\n HookStdinNotification,\n} from './types.js';\n\nexport class HookManager {\n private config: HooksConfig;\n private projectDir: string;\n private sessionId: string;\n private configDirName: string;\n\n constructor(projectDir: string, sessionId: string, configDirName = DEFAULT_CONFIG_DIR) {\n this.projectDir = projectDir;\n this.sessionId = sessionId;\n this.configDirName = configDirName;\n this.config = loadHooksConfig(projectDir, configDirName);\n }\n\n reload(): void {\n this.config = loadHooksConfig(this.projectDir, this.configDirName);\n }\n\n setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n hasHooks(): boolean {\n return Object.keys(this.config).length > 0;\n }\n\n getConfig(): HooksConfig {\n return this.config;\n }\n\n getConfigPaths(): { project: string; global: string } {\n return {\n project: getProjectHooksPath(this.projectDir, this.configDirName),\n global: getGlobalHooksPath(this.configDirName),\n };\n }\n\n // =========================================================================\n // Event Methods\n // =========================================================================\n\n async runPreToolUse(toolName: string, toolInput: unknown): Promise<HookEventResult> {\n const hooks = this.config.PreToolUse;\n if (!hooks || hooks.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const stdin: HookStdinToolEvent = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name: 'PreToolUse',\n tool_name: toolName,\n tool_input: toolInput,\n };\n\n return runHooksForEvent(hooks, stdin, { tool_name: toolName });\n }\n\n async runPostToolUse(\n toolName: string,\n toolInput: unknown,\n toolOutput: unknown,\n toolError: boolean,\n ): Promise<HookEventResult> {\n const hooks = this.config.PostToolUse;\n if (!hooks || hooks.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const stdin: HookStdinToolEvent = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name: 'PostToolUse',\n tool_name: toolName,\n tool_input: toolInput,\n tool_output: toolOutput,\n tool_error: toolError,\n };\n\n return runHooksForEvent(hooks, stdin, { tool_name: toolName });\n }\n\n async runUserPromptSubmit(userMessage: string): Promise<HookEventResult> {\n const hooks = this.config.UserPromptSubmit;\n if (!hooks || hooks.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const stdin: HookStdinUserPrompt = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name: 'UserPromptSubmit',\n user_message: userMessage,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runStop(\n assistantMessage: string | undefined,\n stopReason: 'complete' | 'aborted' | 'error',\n ): Promise<HookEventResult> {\n const hooks = this.config.Stop;\n if (!hooks || hooks.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const stdin: HookStdinStop = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name: 'Stop',\n assistant_message: assistantMessage,\n stop_reason: stopReason,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runSessionStart(): Promise<HookEventResult> {\n const hooks = this.config.SessionStart;\n if (!hooks || hooks.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const stdin: HookStdinSession = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name: 'SessionStart',\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n async runSessionEnd(): Promise<HookEventResult> {\n const hooks = this.config.SessionEnd;\n if (!hooks || hooks.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const stdin: HookStdinSession = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name: 'SessionEnd',\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n /**\n * Fire notification hooks (non-blocking, fire-and-forget).\n * Called when the TUI is waiting for user input.\n */\n runNotification(reason: string, message?: string): void {\n const hooks = this.config.Notification;\n if (!hooks || hooks.length === 0) return;\n\n const stdin: HookStdinNotification = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name: 'Notification',\n reason,\n message,\n };\n\n // Fire-and-forget — don't await\n runHooksForEvent(hooks, stdin).catch(() => {});\n }\n}\n","/**\n * MCP server configuration loading from filesystem.\n * Loads from:\n * 1. .claude/settings.local.json (Claude Code compat — lowest priority)\n * 2. ~/.mastracode/mcp.json (global)\n * 3. .mastracode/mcp.json (project — highest priority)\n *\n * Project overrides global by server name. Claude Code config is lowest priority.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { DEFAULT_CONFIG_DIR } from '../constants.js';\nimport type { McpConfig, McpHttpOAuthConfig, McpServerConfig, McpSkippedServer } from './types.js';\n\nexport function loadMcpConfig(projectDir: string, configDirName = DEFAULT_CONFIG_DIR): McpConfig {\n const claudeConfig = loadClaudeSettings(projectDir);\n const globalConfig = loadSingleConfig(getGlobalMcpPath(configDirName));\n const projectConfig = loadSingleConfig(getProjectMcpPath(projectDir, configDirName));\n\n return mergeConfigs(claudeConfig, globalConfig, projectConfig);\n}\n\nexport function getProjectMcpPath(projectDir: string, configDirName = DEFAULT_CONFIG_DIR): string {\n return path.join(projectDir, configDirName, 'mcp.json');\n}\n\nexport function getGlobalMcpPath(configDirName = DEFAULT_CONFIG_DIR): string {\n return path.join(os.homedir(), configDirName, 'mcp.json');\n}\n\nexport function getClaudeSettingsPath(projectDir: string): string {\n return path.join(projectDir, '.claude', 'settings.local.json');\n}\n\nfunction loadSingleConfig(filePath: string): McpConfig {\n try {\n if (!fs.existsSync(filePath)) return {};\n const raw = fs.readFileSync(filePath, 'utf-8');\n return validateConfig(JSON.parse(raw));\n } catch {\n return {};\n }\n}\n\nfunction loadClaudeSettings(projectDir: string): McpConfig {\n try {\n const filePath = getClaudeSettingsPath(projectDir);\n if (!fs.existsSync(filePath)) return {};\n const raw = fs.readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(raw);\n // Claude Code stores mcpServers at the top level of settings\n if (parsed?.mcpServers && typeof parsed.mcpServers === 'object') {\n return validateConfig({ mcpServers: parsed.mcpServers });\n }\n return {};\n } catch {\n return {};\n }\n}\n\n/**\n * Classify a raw server entry as stdio, http, or skip (with reason).\n */\nexport function classifyServerEntry(raw: unknown): { kind: 'stdio' | 'http' | 'skip'; reason?: string } {\n if (!raw || typeof raw !== 'object') {\n return { kind: 'skip', reason: 'Invalid entry: expected an object' };\n }\n\n const obj = raw as Record<string, unknown>;\n const hasCommand = typeof obj.command === 'string';\n const hasUrl = typeof obj.url === 'string';\n\n if (hasCommand && hasUrl) {\n return { kind: 'skip', reason: 'Cannot specify both \"command\" and \"url\"' };\n }\n\n if (hasCommand) {\n return { kind: 'stdio' };\n }\n\n if (hasUrl) {\n try {\n new URL(obj.url as string);\n } catch {\n return { kind: 'skip', reason: `Invalid URL: \"${obj.url}\"` };\n }\n return { kind: 'http' };\n }\n\n return { kind: 'skip', reason: 'Missing required field: \"command\" (stdio) or \"url\" (http)' };\n}\n\nexport function validateConfig(raw: unknown): McpConfig {\n if (!raw || typeof raw !== 'object') return {};\n const obj = raw as Record<string, unknown>;\n\n if (!obj.mcpServers || typeof obj.mcpServers !== 'object') return {};\n\n const servers: Record<string, McpServerConfig> = {};\n const skippedServers: McpSkippedServer[] = [];\n const rawServers = obj.mcpServers as Record<string, unknown>;\n\n for (const [name, entry] of Object.entries(rawServers)) {\n const classification = classifyServerEntry(entry);\n\n if (classification.kind === 'stdio') {\n const e = entry as Record<string, unknown>;\n servers[name] = {\n command: e.command as string,\n args: Array.isArray(e.args) ? (e.args as string[]) : undefined,\n env: typeof e.env === 'object' && e.env !== null ? (e.env as Record<string, string>) : undefined,\n };\n } else if (classification.kind === 'http') {\n const e = entry as Record<string, unknown>;\n const oauthResult = parseOAuthConfig(e.oauth);\n if (oauthResult.reason) {\n skippedServers.push({ name, reason: oauthResult.reason });\n continue;\n }\n servers[name] = {\n url: e.url as string,\n headers:\n typeof e.headers === 'object' && e.headers !== null ? (e.headers as Record<string, string>) : undefined,\n oauth: oauthResult.config,\n };\n } else {\n skippedServers.push({ name, reason: classification.reason! });\n }\n }\n\n const result: McpConfig = {};\n if (Object.keys(servers).length > 0) {\n result.mcpServers = servers;\n }\n if (skippedServers.length > 0) {\n result.skippedServers = skippedServers;\n }\n return result;\n}\n\nfunction parseOAuthConfig(raw: unknown): { config?: McpHttpOAuthConfig; reason?: string } {\n if (raw === undefined) return {};\n if (!raw || typeof raw !== 'object') {\n return { reason: 'Invalid OAuth config: expected an object' };\n }\n\n const obj = raw as Record<string, unknown>;\n if (typeof obj.redirectUrl !== 'string') {\n return { reason: 'Invalid OAuth config: missing required field \"redirectUrl\"' };\n }\n try {\n const redirectUrl = new URL(obj.redirectUrl);\n const isLoopback =\n redirectUrl.hostname === 'localhost' ||\n redirectUrl.hostname.startsWith('127.') ||\n redirectUrl.hostname === '[::1]';\n if (redirectUrl.protocol !== 'https:' && !(redirectUrl.protocol === 'http:' && isLoopback)) {\n return { reason: 'Invalid OAuth redirectUrl: must use HTTPS unless it is a loopback HTTP URL' };\n }\n } catch {\n return { reason: `Invalid OAuth redirectUrl: \"${obj.redirectUrl}\"` };\n }\n\n if (obj.scopes !== undefined && (!Array.isArray(obj.scopes) || obj.scopes.some(scope => typeof scope !== 'string'))) {\n return { reason: 'Invalid OAuth config: \"scopes\" must be an array of strings' };\n }\n\n return {\n config: {\n redirectUrl: obj.redirectUrl,\n clientName: typeof obj.clientName === 'string' ? obj.clientName : undefined,\n scopes: obj.scopes as string[] | undefined,\n clientId: typeof obj.clientId === 'string' ? obj.clientId : undefined,\n clientSecret: typeof obj.clientSecret === 'string' ? obj.clientSecret : undefined,\n },\n };\n}\n\n/**\n * Merge configs: claude (lowest priority) < global < project (highest).\n * Later configs override earlier by server name.\n * Skipped entries are accumulated, but if a higher-priority config provides\n * a valid entry for a skipped name, the skip is removed.\n */\nfunction mergeConfigs(...configs: McpConfig[]): McpConfig {\n const merged: Record<string, McpServerConfig> = {};\n const allSkipped: McpSkippedServer[] = [];\n\n for (const config of configs) {\n if (config.mcpServers) {\n for (const [name, server] of Object.entries(config.mcpServers)) {\n merged[name] = server;\n }\n }\n if (config.skippedServers) {\n allSkipped.push(...config.skippedServers);\n }\n }\n\n // Remove skipped entries that were resolved by a valid config at any priority\n const validNames = new Set(Object.keys(merged));\n const filteredSkipped = allSkipped.filter(s => !validNames.has(s.name));\n\n // Deduplicate skipped entries by name (keep last occurrence — highest priority reason)\n const skippedMap = new Map<string, McpSkippedServer>();\n for (const s of filteredSkipped) {\n skippedMap.set(s.name, s);\n }\n\n const result: McpConfig = {};\n if (Object.keys(merged).length > 0) {\n result.mcpServers = merged;\n }\n if (skippedMap.size > 0) {\n result.skippedServers = Array.from(skippedMap.values());\n }\n return result;\n}\n","/**\n * MCP manager — orchestrates MCP server connections using MCPClient directly.\n * Created once at startup, provides tools from connected MCP servers.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { MCPClient, MCPOAuthClientProvider } from '@mastra/mcp';\nimport type { MastraMCPServerDefinition, OAuthClientInformation, OAuthStorage } from '@mastra/mcp';\nimport { DEFAULT_CONFIG_DIR } from '../constants.js';\nimport { getAppDataDir } from '../utils/project.js';\nimport { loadMcpConfig, getProjectMcpPath, getGlobalMcpPath, getClaudeSettingsPath } from './config.js';\nimport type { McpConfig, McpHttpServerConfig, McpServerConfig, McpServerStatus, McpSkippedServer } from './types.js';\n\nconst MASTRACODE_MCP_TIMEOUT_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n\n/** Summary of MCP initialization result. */\nexport interface McpInitResult {\n connected: McpServerStatus[];\n failed: McpServerStatus[];\n skipped: McpSkippedServer[];\n totalTools: number;\n}\n\n/** Public interface for the MCP manager returned by createMcpManager(). */\nexport interface McpManager {\n /** Connect to all configured MCP servers and collect their tools. */\n init(): Promise<void>;\n /** Start init in the background. Returns a promise that resolves with status when done. */\n initInBackground(): Promise<McpInitResult>;\n /** Disconnect all servers, reload config from disk, reconnect. */\n reload(): Promise<void>;\n /** Reconnect a single server by name. Returns updated status. */\n reconnectServer(name: string): Promise<McpServerStatus>;\n /** Disconnect from all MCP servers and clean up. */\n disconnect(): Promise<void>;\n /** Get all tools from connected MCP servers (namespaced as serverName_toolName). */\n getTools(): Record<string, any>;\n /** Check if any MCP servers are configured (or skipped). */\n hasServers(): boolean;\n /** Get status of all servers. */\n getServerStatuses(): McpServerStatus[];\n /** Get servers that were skipped during config loading. */\n getSkippedServers(): McpSkippedServer[];\n /** Get config file paths for display. */\n getConfigPaths(): { project: string; global: string; claude: string };\n /** Get the merged config. */\n getConfig(): McpConfig;\n /** Get captured stderr logs for a server. */\n getServerLogs(name: string): string[];\n}\n\nfunction getTransport(cfg: McpServerConfig): 'stdio' | 'http' {\n return 'url' in cfg ? 'http' : 'stdio';\n}\n\nclass FileOAuthStorage implements OAuthStorage {\n constructor(private filePath: string) {}\n\n get(key: string): string | undefined {\n return this.read()[key];\n }\n\n set(key: string, value: string): void {\n const data = this.read();\n data[key] = value;\n this.write(data);\n }\n\n delete(key: string): void {\n const data = this.read();\n delete data[key];\n this.write(data);\n }\n\n private read(): Record<string, string> {\n if (!existsSync(this.filePath)) return {};\n try {\n return JSON.parse(readFileSync(this.filePath, 'utf-8')) as Record<string, string>;\n } catch {\n return {};\n }\n }\n\n private write(data: Record<string, string>): void {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n const tmpPath = `${this.filePath}.tmp`;\n writeFileSync(tmpPath, JSON.stringify(data, null, 2), { encoding: 'utf-8', mode: 0o600 });\n renameSync(tmpPath, this.filePath);\n }\n}\n\nfunction getOAuthStoragePath(projectDir: string, name: string, cfg: McpHttpServerConfig): string {\n const key = JSON.stringify({\n projectDir,\n name,\n url: cfg.url,\n redirectUrl: cfg.oauth?.redirectUrl,\n clientId: cfg.oauth?.clientId,\n scopes: cfg.oauth?.scopes ?? [],\n });\n return join(getAppDataDir(), 'mcp-oauth', `${getStorageKeyFingerprint(key)}.json`);\n}\n\nfunction getStorageKeyFingerprint(value: string): string {\n let fingerprint = 0xcbf29ce484222325n;\n for (let i = 0; i < value.length; i += 1) {\n fingerprint ^= BigInt(value.charCodeAt(i));\n fingerprint = BigInt.asUintN(64, fingerprint * 0x100000001b3n);\n }\n return fingerprint.toString(16).padStart(16, '0');\n}\n\n/**\n * Create an MCP manager that wraps MCPClient with config-file discovery\n * and per-server status tracking.\n */\nexport function createMcpManager(\n projectDir: string,\n configDirName = DEFAULT_CONFIG_DIR,\n extraServers?: Record<string, McpServerConfig>,\n): McpManager {\n /** Merge programmatic servers into a base config (highest priority). */\n const applyExtraServers = (base: McpConfig): McpConfig => {\n if (!extraServers || Object.keys(extraServers).length === 0) return base;\n return { ...base, mcpServers: { ...base.mcpServers, ...extraServers } };\n };\n\n let config = applyExtraServers(loadMcpConfig(projectDir, configDirName));\n let client: MCPClient | null = null;\n let tools: Record<string, any> = {};\n let serverStatuses = new Map<string, McpServerStatus>();\n let stderrLogs = new Map<string, string[]>();\n let initialized = false;\n\n const MAX_STDERR_LINES = 200;\n\n /** Hook into a server's stderr stream and buffer its output. */\n function captureStderr(serverName: string): void {\n if (!client || typeof client.getServerStderr !== 'function') return;\n const stream = client.getServerStderr(serverName);\n if (!stream) return;\n\n let buffer = '';\n const lines = stderrLogs.get(serverName) ?? [];\n stderrLogs.set(serverName, lines);\n\n stream.on('data', (chunk: Buffer) => {\n buffer += chunk.toString();\n const parts = buffer.split('\\n');\n // Last element is incomplete line (or empty if ended with \\n)\n buffer = parts.pop()!;\n for (const line of parts) {\n if (line.trim()) {\n lines.push(line);\n if (lines.length > MAX_STDERR_LINES) {\n lines.shift();\n }\n }\n }\n });\n\n stream.on('end', () => {\n if (buffer.trim()) {\n lines.push(buffer);\n if (lines.length > MAX_STDERR_LINES) {\n lines.shift();\n }\n }\n });\n }\n\n function createOAuthProvider(name: string, cfg: McpHttpServerConfig) {\n if (!cfg.oauth) return undefined;\n\n return new MCPOAuthClientProvider({\n redirectUrl: cfg.oauth.redirectUrl,\n clientMetadata: {\n redirect_uris: [cfg.oauth.redirectUrl],\n client_name: cfg.oauth.clientName ?? `Mastra Code MCP ${name}`,\n grant_types: ['authorization_code', 'refresh_token'],\n response_types: ['code'],\n ...(cfg.oauth.scopes?.length ? { scope: cfg.oauth.scopes.join(' ') } : {}),\n },\n clientInformation: cfg.oauth.clientId\n ? ({\n client_id: cfg.oauth.clientId,\n ...(cfg.oauth.clientSecret ? { client_secret: cfg.oauth.clientSecret } : {}),\n } satisfies OAuthClientInformation)\n : undefined,\n storage: new FileOAuthStorage(getOAuthStoragePath(projectDir, name, cfg)),\n });\n }\n\n function buildServerDefs(servers: Record<string, McpServerConfig>): Record<string, MastraMCPServerDefinition> {\n const defs: Record<string, MastraMCPServerDefinition> = {};\n for (const [name, cfg] of Object.entries(servers)) {\n if ('url' in cfg) {\n const httpCfg = cfg as McpHttpServerConfig;\n defs[name] = {\n url: new URL(httpCfg.url),\n requestInit: httpCfg.headers ? { headers: httpCfg.headers } : undefined,\n authProvider: createOAuthProvider(name, httpCfg),\n };\n } else {\n defs[name] = { command: cfg.command, args: cfg.args, env: cfg.env, stderr: 'pipe' };\n }\n }\n return defs;\n }\n\n async function connectAndCollectTools(): Promise<void> {\n const servers = config.mcpServers;\n if (!servers || Object.keys(servers).length === 0) {\n return;\n }\n\n // Pre-populate statuses as \"connecting\" so callers can see in-progress state\n const serverNames = Object.keys(servers);\n for (const name of serverNames) {\n serverStatuses.set(name, {\n name,\n connected: false,\n connecting: true,\n toolCount: 0,\n toolNames: [],\n transport: getTransport(servers[name]!),\n });\n }\n\n client = new MCPClient({\n id: 'mastra-code-mcp',\n servers: buildServerDefs(servers),\n timeout: MASTRACODE_MCP_TIMEOUT_MS,\n });\n\n // Use listToolsetsWithErrors() to get tools grouped by server name,\n // plus per-server error messages for servers that failed to connect.\n\n try {\n const { toolsets, errors } = await client.listToolsetsWithErrors();\n const typedToolsets = toolsets as Record<string, Record<string, any>>;\n\n // Flatten toolsets into the namespaced tools map (serverName_toolName)\n for (const [serverName, serverTools] of Object.entries(typedToolsets)) {\n for (const [toolName, toolConfig] of Object.entries(serverTools)) {\n tools[`${serverName}_${toolName}`] = toolConfig;\n }\n }\n\n for (const name of serverNames) {\n const serverTools = typedToolsets[name];\n if (serverTools && Object.keys(serverTools).length > 0) {\n const toolNames = Object.keys(serverTools).map(t => `${name}_${t}`);\n serverStatuses.set(name, {\n name,\n connected: true,\n toolCount: toolNames.length,\n toolNames,\n transport: getTransport(servers[name]!),\n });\n } else {\n // Server failed — use the real error from listToolsetsWithErrors()\n serverStatuses.set(name, {\n name,\n connected: false,\n toolCount: 0,\n toolNames: [],\n transport: getTransport(servers[name]!),\n error: errors[name] ?? 'Failed to connect',\n });\n }\n }\n\n // Capture stderr from all stdio servers (connected or failed)\n for (const name of serverNames) {\n captureStderr(name);\n }\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n\n for (const name of serverNames) {\n serverStatuses.set(name, {\n name,\n connected: false,\n toolCount: 0,\n toolNames: [],\n transport: getTransport(servers[name]!),\n error: errMsg,\n });\n }\n }\n }\n\n async function disconnect(): Promise<void> {\n if (client) {\n try {\n await client.disconnect();\n } catch {\n // Ignore disconnect errors\n }\n client = null;\n }\n }\n\n return {\n async init() {\n if (initialized) return;\n await connectAndCollectTools();\n initialized = true;\n },\n\n async initInBackground(): Promise<McpInitResult> {\n await this.init();\n const statuses = Array.from(serverStatuses.values());\n const connected = statuses.filter(s => s.connected);\n const failed = statuses.filter(s => !s.connected);\n return {\n connected,\n failed,\n skipped: [...(config.skippedServers ?? [])],\n totalTools: connected.reduce((sum, s) => sum + s.toolCount, 0),\n };\n },\n\n async reload() {\n await disconnect();\n config = applyExtraServers(loadMcpConfig(projectDir, configDirName));\n tools = {};\n serverStatuses = new Map();\n stderrLogs = new Map();\n initialized = false;\n await connectAndCollectTools();\n initialized = true;\n },\n\n async reconnectServer(name: string): Promise<McpServerStatus> {\n const cfg = config.mcpServers?.[name];\n if (!cfg) {\n return {\n name,\n connected: false,\n toolCount: 0,\n toolNames: [],\n transport: 'stdio',\n error: `Server \"${name}\" not found in config`,\n };\n }\n\n if (!client) {\n return {\n name,\n connected: false,\n toolCount: 0,\n toolNames: [],\n transport: getTransport(cfg),\n error: 'MCP client not initialized',\n };\n }\n\n const transport = getTransport(cfg);\n\n // Remove old tools for this server\n const prefix = `${name}_`;\n for (const key of Object.keys(tools)) {\n if (key.startsWith(prefix)) {\n delete tools[key];\n }\n }\n\n // Clear old logs and mark as connecting\n stderrLogs.delete(name);\n serverStatuses.set(name, {\n name,\n connected: false,\n connecting: true,\n toolCount: 0,\n toolNames: [],\n transport,\n });\n\n try {\n // Use MCPClient's per-server reconnect\n await client.reconnectServer(name);\n\n // Recapture stderr for the reconnected server\n captureStderr(name);\n\n // Fetch updated toolsets to get this server's tools\n const { toolsets, errors } = await client.listToolsetsWithErrors();\n const serverTools = toolsets[name];\n const serverError = errors[name];\n\n if (serverError) {\n const status: McpServerStatus = {\n name,\n connected: false,\n toolCount: 0,\n toolNames: [],\n transport,\n error: serverError,\n };\n serverStatuses.set(name, status);\n return status;\n } else if (serverTools && Object.keys(serverTools).length > 0) {\n const toolNames = Object.keys(serverTools).map(t => `${name}_${t}`);\n for (const [toolName, toolConfig] of Object.entries(serverTools)) {\n tools[`${name}_${toolName}`] = toolConfig;\n }\n const status: McpServerStatus = {\n name,\n connected: true,\n toolCount: toolNames.length,\n toolNames,\n transport,\n };\n serverStatuses.set(name, status);\n return status;\n } else {\n const status: McpServerStatus = {\n name,\n connected: false,\n toolCount: 0,\n toolNames: [],\n transport,\n error: 'Failed to connect',\n };\n serverStatuses.set(name, status);\n return status;\n }\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n const status: McpServerStatus = {\n name,\n connected: false,\n toolCount: 0,\n toolNames: [],\n transport,\n error: errMsg,\n };\n serverStatuses.set(name, status);\n return status;\n }\n },\n\n disconnect,\n\n getTools() {\n return { ...tools };\n },\n\n hasServers() {\n const hasConfigured = config.mcpServers !== undefined && Object.keys(config.mcpServers).length > 0;\n const hasSkipped = config.skippedServers !== undefined && config.skippedServers.length > 0;\n return hasConfigured || hasSkipped;\n },\n\n getServerStatuses() {\n return Array.from(serverStatuses.values());\n },\n\n getSkippedServers() {\n return [...(config.skippedServers ?? [])];\n },\n\n getConfigPaths() {\n return {\n project: getProjectMcpPath(projectDir, configDirName),\n global: getGlobalMcpPath(configDirName),\n claude: getClaudeSettingsPath(projectDir),\n };\n },\n\n getConfig() {\n return config;\n },\n\n getServerLogs(name: string) {\n return [...(stderrLogs.get(name) ?? [])];\n },\n };\n}\n","import { z } from 'zod';\nimport { DEFAULT_CONFIG_DIR, DEFAULT_OM_MODEL_ID } from './constants';\n\nexport type PermissionPolicy = 'allow' | 'ask' | 'deny';\n\nexport type MastraCodeSessionState = {\n currentModelId: string;\n modeId: string;\n};\n\nexport type MastraCodeComposedState = MastraCodeState & MastraCodeSessionState;\n\nexport interface MastraCodeState {\n [key: string]: unknown;\n [key: `subagentModelId_${string}`]: string | undefined;\n subagentModelId?: string;\n projectPath?: string;\n projectName?: string;\n configDir: string;\n gitBranch?: string;\n lastCommand?: string;\n observerModelId: string;\n reflectorModelId: string;\n observationThreshold: number;\n reflectionThreshold: number;\n cavemanObservations: boolean;\n observeAttachments: 'auto' | boolean;\n omScope?: 'thread' | 'resource';\n thinkingLevel: 'off' | 'low' | 'medium' | 'high' | 'xhigh';\n yolo: boolean;\n permissionRules: {\n categories: Record<string, PermissionPolicy>;\n tools: Record<string, PermissionPolicy>;\n };\n smartEditing: boolean;\n notifications: 'bell' | 'system' | 'both' | 'off';\n tasks: Array<{\n id?: string;\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm: string;\n }>;\n sandboxAllowedPaths: string[];\n activePlan: {\n title: string;\n plan: string;\n approvedAt: string;\n } | null;\n activeBrowserSettings?: {\n enabled: boolean;\n provider: 'stagehand' | 'agent-browser';\n headless?: boolean;\n viewport?: {\n width: number;\n height: number;\n };\n cdpUrl?: string;\n stagehand?: {\n env: 'LOCAL' | 'BROWSERBASE';\n apiKey?: string;\n projectId?: string;\n };\n };\n}\n\nexport const stateSchema = z.object({\n // Session-scoped selection. The legacy Harness stores these in its state and\n // validates state against this schema, so they MUST be declared here — Zod\n // strips unknown keys on parse, which would otherwise silently discard the\n // seeded model and leave the harness with no model selected.\n currentModelId: z.string().optional(),\n modeId: z.string().optional(),\n subagentModelId: z.string().optional(),\n projectPath: z.string().optional(),\n projectName: z.string().optional(),\n configDir: z.string().default(DEFAULT_CONFIG_DIR),\n gitBranch: z.string().optional(),\n lastCommand: z.string().optional(),\n // Observational Memory model settings\n observerModelId: z.string().default(DEFAULT_OM_MODEL_ID),\n reflectorModelId: z.string().default(DEFAULT_OM_MODEL_ID),\n // Observational Memory threshold settings\n observationThreshold: z.number().default(30_000),\n reflectionThreshold: z.number().default(40_000),\n // Whether observations and reflections use the terse caveman-style instruction.\n // Off by default — caveman style is opt-in via `/om` settings; observers and\n // reflectors fall back to their built-in (prose) behavior unless enabled.\n cavemanObservations: z.boolean().default(false),\n // Whether OM forwards image/file attachment parts to the Observer LLM.\n // 'auto' (default) checks the provider capabilities registry to decide.\n // true/false forces the setting regardless of model capabilities.\n observeAttachments: z.union([z.literal('auto'), z.boolean()]).default('auto'),\n // Observational Memory scope — 'thread' (per-conversation) or 'resource' (shared across threads)\n omScope: z.enum(['thread', 'resource']).optional(),\n // Thinking level for model reasoning effort\n thinkingLevel: z.enum(['off', 'low', 'medium', 'high', 'xhigh']).default('off'),\n // YOLO mode — auto-approve all tool calls\n yolo: z.boolean().default(false),\n // Permission rules — per-category and per-tool approval policies\n permissionRules: z\n .object({\n categories: z.record(z.string(), z.enum(['allow', 'ask', 'deny'])).default({}),\n tools: z.record(z.string(), z.enum(['allow', 'ask', 'deny'])).default({}),\n })\n .default({ categories: {}, tools: {} }),\n // Smart editing mode — use AST-based analysis for code edits\n smartEditing: z.boolean().default(true),\n // Notification mode — alert when TUI needs user attention\n notifications: z.enum(['bell', 'system', 'both', 'off']).default('off'),\n // Task list (ephemeral per-thread, cleared on thread switch/creation)\n tasks: z\n .array(\n z.object({\n id: z.string().optional(),\n content: z.string(),\n status: z.enum(['pending', 'in_progress', 'completed']),\n activeForm: z.string(),\n }),\n )\n .default([]),\n // Sandbox allowed paths (per-thread, absolute paths allowed in addition to project root)\n sandboxAllowedPaths: z.array(z.string()).default([]),\n // Active plan (set when a plan is approved in Plan mode)\n activePlan: z\n .object({\n title: z.string(),\n plan: z.string(),\n approvedAt: z.string(),\n })\n .nullable()\n .default(null),\n // Active browser settings (tracks what's actually running vs. what's in the settings file)\n activeBrowserSettings: z\n .object({\n enabled: z.boolean(),\n provider: z.enum(['stagehand', 'agent-browser']),\n headless: z.boolean().optional(),\n viewport: z\n .object({\n width: z.number(),\n height: z.number(),\n })\n .optional(),\n cdpUrl: z.string().optional(),\n stagehand: z\n .object({\n env: z.enum(['LOCAL', 'BROWSERBASE']),\n apiKey: z.string().optional(),\n projectId: z.string().optional(),\n })\n .optional(),\n })\n .optional(),\n});\n","/**\n * Gateway sync utility for keeping the model registry up to date.\n *\n * This is a thin wrapper around `@mastra/core/llm`'s `GatewayRegistry` so\n * mastracode and `mastra dev` share a single implementation for fetching\n * providers, generating types, and writing to the global cache. Keep this\n * file small — provider/registry logic belongs in `@mastra/core`.\n */\n\nimport { GatewayRegistry } from '@mastra/core/llm';\n\nconst DEFAULT_SYNC_INTERVAL_MS = 5 * 60 * 1000;\n\nlet syncInterval: NodeJS.Timeout | null = null;\nlet isSyncing = false;\n\nfunction getRegistry(): GatewayRegistry {\n return GatewayRegistry.getInstance({ useDynamicLoading: true });\n}\n\n/**\n * Sync gateways and update the global cache via `@mastra/core`'s registry.\n *\n * Skips the sync if the global cache was refreshed within the last\n * `DEFAULT_SYNC_INTERVAL_MS`, unless `force` is set. Multiple calls in\n * the same process coalesce while a sync is in flight.\n */\nexport async function syncGateways(force = false): Promise<void> {\n if (isSyncing && !force) {\n return;\n }\n\n if (!force) {\n const lastSync = getRegistry().getLastRefreshTime();\n if (lastSync && Date.now() - lastSync.getTime() < DEFAULT_SYNC_INTERVAL_MS) {\n return;\n }\n }\n\n isSyncing = true;\n try {\n await getRegistry().syncGateways(true);\n } catch {\n // Silently ignore — the bundled registry already contains all model\n // data so a failed network fetch is non-critical.\n } finally {\n isSyncing = false;\n }\n}\n\n/**\n * Start periodic gateway sync.\n * @param intervalMs Sync interval in milliseconds (default: 5 minutes)\n */\nexport function startGatewaySync(intervalMs = DEFAULT_SYNC_INTERVAL_MS): void {\n if (syncInterval) {\n return;\n }\n\n // Do an initial sync (will skip if recently synced)\n syncGateways().catch(() => {});\n\n // Set up periodic sync\n syncInterval = setInterval(() => {\n syncGateways().catch(() => {});\n }, intervalMs);\n\n // Don't prevent process exit\n syncInterval.unref();\n}\n\n/**\n * Stop periodic gateway sync.\n */\nexport function stopGatewaySync(): void {\n if (syncInterval) {\n clearInterval(syncInterval);\n syncInterval = null;\n }\n}\n","import { createHash } from 'node:crypto';\nimport { mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { PubSub, UnixSocketPubSub } from '@mastra/core/events';\nimport type { PubSubDeliveryMode, Event, EventCallback, SubscribeOptions } from '@mastra/core/events';\n\nconst THREAD_STREAM_PREFIX = 'agent.thread-stream.';\n\n/**\n * A PubSub that manages one Unix socket per topic for cross-process signal\n * coordination within a mastracode resource.\n *\n * Socket paths use `/tmp/mc/<resourceId>/<sanitized-topic>.sock` for\n * inspectability and automatic OS cleanup. Each topic gets its own isolated\n * socket so broker election and message routing are per-topic.\n *\n * Stale sockets from crashed processes are handled by\n * {@link UnixSocketPubSub}'s built-in election logic: it detects\n * ECONNREFUSED on a dead broker socket, unlinks it, and re-elects.\n * No blanket cleanup is needed here — that would break concurrent\n * mc instances sharing the same resourceId.\n */\nclass SignalsPubSub extends PubSub {\n readonly #resourceId: string;\n readonly #sockets = new Map<string, UnixSocketPubSub>();\n readonly #pending = new Map<string, Promise<UnixSocketPubSub>>();\n #closed = false;\n\n constructor(resourceId: string) {\n super();\n this.#resourceId = resourceId;\n }\n\n override get supportedModes(): ReadonlyArray<PubSubDeliveryMode> {\n return ['push'];\n }\n\n async publish(\n topic: string,\n event: Omit<Event, 'id' | 'createdAt'>,\n options?: { localOnly?: boolean },\n ): Promise<void> {\n const socket = await this.#getOrCreate(topic);\n await socket.publish(topic, event, options);\n }\n\n async subscribe(topic: string, cb: EventCallback, options?: SubscribeOptions): Promise<void> {\n const socket = await this.#getOrCreate(topic);\n await socket.subscribe(topic, cb, options);\n }\n\n async unsubscribe(topic: string, cb: EventCallback): Promise<void> {\n const socket = this.#sockets.get(this.#topicKey(topic));\n if (!socket) return;\n await socket.unsubscribe(topic, cb);\n }\n\n async flush(): Promise<void> {\n await Promise.all([...this.#sockets.values()].map(s => s.flush()));\n }\n\n async close(): Promise<void> {\n this.#closed = true;\n await Promise.allSettled([...this.#sockets.values()].map(s => s.close()));\n this.#sockets.clear();\n }\n\n /** Get the underlying socket for a topic (for testing/inspection). */\n getSocket(topic: string): UnixSocketPubSub | undefined {\n return this.#sockets.get(this.#topicKey(topic));\n }\n\n async #getOrCreate(topic: string): Promise<UnixSocketPubSub> {\n if (this.#closed) throw new Error('SignalsPubSub is closed');\n const key = this.#topicKey(topic);\n const existing = this.#sockets.get(key);\n if (existing) return existing;\n // Deduplicate concurrent callers so only one socket is created per topic.\n let inflight = this.#pending.get(key);\n if (!inflight) {\n inflight = this.#initSocket(topic, key);\n this.#pending.set(key, inflight);\n }\n const socket = await inflight;\n if (this.#closed) throw new Error('SignalsPubSub is closed');\n return socket;\n }\n\n async #initSocket(topic: string, key: string): Promise<UnixSocketPubSub> {\n try {\n const socketPath = await this.#socketPath(topic);\n if (this.#closed) throw new Error('SignalsPubSub is closed');\n const socket = new UnixSocketPubSub(socketPath);\n this.#sockets.set(key, socket);\n return socket;\n } finally {\n this.#pending.delete(key);\n }\n }\n\n async #socketPath(topic: string): Promise<string> {\n let key = this.#topicKey(topic);\n const dir = join('/tmp/mc', this.#resourceId);\n await mkdir(dir, { recursive: true });\n const candidate = join(dir, `${key}.sock`);\n // macOS sun_path limit is 104 bytes; Linux is 108. Use 104 as the\n // conservative bound. When the path is too long, replace the key with\n // a short hash so the socket can still be created.\n if (Buffer.byteLength(candidate) > 104) {\n key = createHash('sha256').update(key).digest('hex').slice(0, 16);\n return join(dir, `${key}.sock`);\n }\n return candidate;\n }\n\n /**\n * Derive a filesystem-safe key for the topic. Thread-stream topics embed\n * a threadId; all other topics use a sanitized version of the topic name.\n */\n #topicKey(topic: string): string {\n if (topic.startsWith(THREAD_STREAM_PREFIX)) {\n const encoded = topic.slice(THREAD_STREAM_PREFIX.length);\n try {\n const decoded = decodeURIComponent(encoded);\n const separatorIdx = decoded.indexOf('\\0');\n if (separatorIdx !== -1) {\n return decoded.slice(separatorIdx + 1);\n }\n } catch {\n // Malformed URI — fall through to sanitized fallback.\n }\n }\n // Fallback: use the topic directly (sanitized for filesystem)\n return topic.replace(/[^a-zA-Z0-9_-]/g, '_');\n }\n}\n\n/**\n * Creates a per-topic PubSub backed by Unix sockets for cross-process signal\n * and workflow event coordination within a mastracode resource.\n *\n * Each topic gets its own Unix socket under `/tmp/mc/<resourceId>/`.\n * Stale sockets from crashed processes are handled by the underlying\n * {@link UnixSocketPubSub}'s broker election logic.\n */\nexport function createSignalsPubSub(resourceId: string): SignalsPubSub {\n return new SignalsPubSub(resourceId);\n}\n","/**\n * Storage factory — creates the appropriate storage backend based on resolved config.\n *\n * If PG is selected but fails to connect, falls back to LibSQL so the TUI\n * can start and the user can fix the connection via /settings.\n */\n\nimport type { MastraCompositeStore } from '@mastra/core/storage';\nimport type { MastraVector } from '@mastra/core/vector';\nimport { LibSQLStore, LibSQLVector } from '@mastra/libsql';\nimport { PostgresStore } from '@mastra/pg';\n\nimport type { StorageConfig, PgStorageConfig } from './project.js';\nimport { getDatabasePath, getVectorDatabasePath } from './project.js';\n\nconst MASTRA_CODE_LOCAL_PRAGMAS = {\n cacheSize: -128000,\n mmapSize: 536870912,\n};\n\nexport interface StorageResult {\n storage: MastraCompositeStore;\n /** The effective backend after any fallback logic has run. */\n backend: 'libsql' | 'pg';\n /** Non-null when PG was requested but failed — contains a user-facing warning. */\n warning?: string;\n}\n\nfunction createFallbackLibSQL(): MastraCompositeStore {\n return new LibSQLStore({\n id: 'mastra-code-storage',\n url: `file:${getDatabasePath()}`,\n localPragmas: MASTRA_CODE_LOCAL_PRAGMAS,\n });\n}\n\n/**\n * Create a storage instance from the resolved config.\n *\n * - `libsql` backend → LibSQLStore (always available)\n * - `pg` backend → PostgresStore, falls back to LibSQL on connection failure\n */\nexport async function createStorage(config: StorageConfig): Promise<StorageResult> {\n if (config.backend === 'pg') {\n return createPgStorage(config);\n }\n\n // Default: LibSQL\n return {\n storage: new LibSQLStore({\n id: 'mastra-code-storage',\n url: config.url,\n ...(config.authToken ? { authToken: config.authToken } : {}),\n localPragmas: MASTRA_CODE_LOCAL_PRAGMAS,\n }),\n backend: 'libsql',\n };\n}\n\nasync function createPgStorage(config: PgStorageConfig): Promise<StorageResult> {\n // No connection info → fall back with guidance\n if (!config.connectionString && !config.host) {\n return {\n storage: createFallbackLibSQL(),\n backend: 'libsql',\n warning:\n 'PostgreSQL backend selected but no connection info configured. ' +\n 'Using LibSQL fallback. Set a connection string via /settings.',\n };\n }\n\n const base = {\n id: 'mastra-code-storage' as const,\n ...(config.schemaName ? { schemaName: config.schemaName } : {}),\n ...(config.disableInit ? { disableInit: config.disableInit } : {}),\n ...(config.skipDefaultIndexes ? { skipDefaultIndexes: config.skipDefaultIndexes } : {}),\n };\n\n const store = config.connectionString\n ? new PostgresStore({ ...base, connectionString: config.connectionString })\n : new PostgresStore({\n ...base,\n host: config.host!,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n });\n\n // Test the connection before committing — if it fails, fall back to LibSQL\n // so the user can fix the config via /settings.\n try {\n await store.init();\n } catch (err: any) {\n const msg = err?.message ?? String(err);\n const target = config.connectionString ?? `${config.host}:${config.port ?? 5432}`;\n try {\n await store.close();\n } catch {\n // ignore cleanup errors\n }\n return {\n storage: createFallbackLibSQL(),\n backend: 'libsql',\n warning:\n `Failed to connect to PostgreSQL at ${target}: ${msg}\\n` +\n 'Using LibSQL fallback. Fix the connection via /settings.',\n };\n }\n\n return { storage: store, backend: 'pg' };\n}\n\n/**\n * Create a vector store for recall search.\n * Uses a separate LibSQL file to avoid bloating the main storage DB with embedding data.\n * For PG backends, reuses the same connection (PG handles the extra tables fine).\n */\nexport async function createVectorStore(\n config: StorageConfig,\n effectiveBackend: 'libsql' | 'pg' = config.backend,\n): Promise<MastraVector | undefined> {\n if (effectiveBackend === 'pg') {\n // PG can handle vector tables in the same database\n const pgConfig = config as PgStorageConfig;\n if (!pgConfig.connectionString && !pgConfig.host) return undefined;\n\n const { PgVector } = await import('@mastra/pg');\n return new PgVector({\n id: 'mastra-code-vectors',\n connectionString:\n pgConfig.connectionString ??\n `postgresql://${pgConfig.user}:${pgConfig.password}@${pgConfig.host}:${pgConfig.port ?? 5432}/${pgConfig.database}`,\n });\n }\n\n // LibSQL: separate file for vectors\n return new LibSQLVector({\n id: 'mastra-code-vectors',\n url: `file:${getVectorDatabasePath()}`,\n });\n}\n","import path from 'node:path';\n\nimport { Agent } from '@mastra/core/agent';\nimport type { PubSub } from '@mastra/core/events';\nimport { Harness } from '@mastra/core/harness';\nimport type {\n HeartbeatHandler,\n HarnessConfig,\n HarnessEvent,\n HarnessMode,\n HarnessSubagent,\n HarnessRequestContext,\n} from '@mastra/core/harness';\nimport { PROVIDER_REGISTRY } from '@mastra/core/llm';\nimport type { ProviderConfig } from '@mastra/core/llm';\nimport {\n AgentsMDInjector,\n PrefillErrorHandler,\n ProviderHistoryCompat,\n StreamErrorRetryProcessor,\n} from '@mastra/core/processors';\nimport { RequestContext } from '@mastra/core/request-context';\nimport type { PublicSchema } from '@mastra/core/schema';\nimport { TaskSignalProvider } from '@mastra/core/signals';\nimport { InMemoryHarness, MastraCompositeStore } from '@mastra/core/storage';\nimport { DEFAULT_GOAL_JUDGE_PROMPT } from '@mastra/core/tools';\nimport { DuckDBStore } from '@mastra/duckdb';\n\nimport { GithubSignals } from '@mastra/github-signals';\nimport {\n Observability,\n MastraStorageExporter,\n MastraPlatformExporter,\n SensitiveDataFilter,\n} from '@mastra/observability';\n\nimport { getDynamicInstructions } from './agents/instructions.js';\nimport { getDynamicMemory } from './agents/memory.js';\nimport {\n createMastraCodeGateway,\n createMastraCodeModelCatalogProvider,\n getDynamicModel,\n getGoalJudgeModel,\n resolveModel,\n} from './agents/model.js';\nimport { buildMode } from './agents/modes/build.js';\nimport { fastMode } from './agents/modes/explore.js';\nimport { planMode } from './agents/modes/plan.js';\nimport { getStaticallyLoadedInstructionPaths } from './agents/prompts/agent-instructions.js';\n// import { executeSubagent } from './agents/subagents/execute.js';\n// import { exploreSubagent } from './agents/subagents/explore.js';\n// import { planSubagent } from './agents/subagents/plan.js';\nimport { attachOMThreadStatePersistence, restoreOMThreadStateForCurrentThread } from './agents/thread-caveman-state.js';\nimport { createDynamicTools, createToolHooks } from './agents/tools.js';\n\nimport { getDynamicWorkspace } from './agents/workspace.js';\nimport { AuthStorage } from './auth/storage.js';\nimport { DEFAULT_CONFIG_DIR, validateConfigDirName } from './constants.js';\nimport { createOutcomeScorer, createEfficiencyScorer } from './evals/scorers/index.js';\nimport { HookManager } from './hooks/index.js';\nimport { createMcpManager } from './mcp/index.js';\nimport type { McpServerConfig } from './mcp/index.js';\nimport type { ProviderAccess } from './onboarding/packs.js';\nimport { getAvailableModePacks, getAvailableOmPacks } from './onboarding/packs.js';\nimport {\n loadSettings,\n MEMORY_GATEWAY_PROVIDER,\n OBSERVABILITY_AUTH_PREFIX,\n resolveModelDefaults,\n resolveOmRoleModel,\n saveSettings,\n} from './onboarding/settings.js';\nimport { getToolCategory } from './permissions.js';\nimport { setAuthStorage } from './providers/claude-max.js';\nimport { setAuthStorage as setGitHubCopilotAuthStorage } from './providers/github-copilot.js';\nimport { setAuthStorage as setOpenAIAuthStorage } from './providers/openai-codex.js';\n\nimport { stateSchema } from './schema.js';\nimport type { MastraCodeState } from './schema.js';\n\nimport { mastra } from './tui/theme.js';\nimport { syncGateways } from './utils/gateway-sync.js';\nimport {\n detectProject,\n getObservabilityDatabasePath,\n getStorageConfig,\n getResourceIdOverride,\n} from './utils/project.js';\nimport type { StorageConfig } from './utils/project.js';\nimport { createSignalsPubSub } from './utils/signals-pubsub.js';\nimport { createStorage, createVectorStore } from './utils/storage-factory.js';\nimport { acquireThreadLock, releaseThreadLock } from './utils/thread-lock.js';\n\nconst CODE_AGENT_ID = 'code-agent';\n\nfunction applyEffectiveDefaultsToModes(modes: HarnessMode[], effectiveDefaults: Record<string, string>): HarnessMode[] {\n return modes.map(mode => {\n const savedModel = effectiveDefaults[mode.id];\n if (!savedModel) {\n return mode;\n }\n return {\n ...mode,\n defaultModelId: savedModel,\n };\n });\n}\n\nexport interface MastraCodeConfig {\n /** Working directory for project detection. Default: process.cwd() */\n cwd?: string;\n /** Override modes (model IDs, colors, which modes exist). Default: build/plan/fast */\n modes?: HarnessMode[];\n /** Override or extend subagent definitions. Default: explore/plan/execute */\n subagents?: HarnessSubagent[];\n /** Extra tools merged into the dynamic tool set. Can be a static record or a function that receives requestContext. */\n extraTools?:\n | Record<\n string,\n { execute?: (input: unknown, context?: unknown) => Promise<unknown> | unknown; [key: string]: unknown }\n >\n | ((ctx: {\n requestContext: RequestContext;\n }) => Record<\n string,\n { execute?: (input: unknown, context?: unknown) => Promise<unknown> | unknown; [key: string]: unknown }\n >);\n /** Tools removed from the dynamic tool set before exposure to the model */\n disabledTools?: string[];\n /** Custom storage config instead of auto-detected default */\n storage?: StorageConfig;\n /** Observational memory scope. Default: auto-detected from env/config files, falls back to 'thread' */\n omScope?: 'thread' | 'resource';\n /** Path to a custom settings.json file. Default: global settings */\n settingsPath?: string;\n /** Initial state overrides (yolo, thinkingLevel, etc.) */\n initialState?: Partial<MastraCodeState>;\n /** Override heartbeat handlers. Default: gateway-sync */\n heartbeatHandlers?: HeartbeatHandler[];\n /** Override the workspace. Default: local filesystem + local sandbox based on detected project */\n workspace?: HarnessConfig<MastraCodeState>['workspace'];\n /** Override the config directory name. Default: '.mastracode'. Replaces '.mastracode' in all project-level and global config paths (MCP, hooks, commands, database, skills, agent instructions). */\n configDir?: string;\n /** Programmatic MCP server configurations, merged with (and overriding) file-based configs. */\n mcpServers?: Record<string, McpServerConfig>;\n /** Disable MCP server discovery. Default: false */\n disableMcp?: boolean;\n /** Disable hooks. Default: false */\n disableHooks?: boolean;\n /**\n * Override the memory instance (or dynamic factory) passed to the Harness.\n * When provided, this replaces the default `getDynamicMemory(storage, vectorStore)` which\n * uses mastracode's built-in model gateway (Anthropic OAuth, OpenAI Codex,\n * custom providers, and models.dev fallback).\n *\n * Use this when you need to override memory model behavior completely.\n */\n memory?: HarnessConfig<MastraCodeState>['memory'];\n /** Browser provider for browser automation tools. When set, the agent gains access to browser tools. */\n browser?: HarnessConfig<MastraCodeState>['browser'];\n /** PubSub for signal routing. When crossProcessPubSub is true, thread locks are disabled. */\n pubsub?: PubSub;\n /** Use Mastra Code's built-in Unix socket PubSub for local cross-process signal routing. */\n unixSocketPubSub?: boolean;\n /** Marks the configured PubSub as cross-process-safe, allowing Mastra Code to skip file thread locks. */\n crossProcessPubSub?: boolean;\n}\n\nexport function createAuthStorage() {\n const authStorage = new AuthStorage();\n setAuthStorage(authStorage);\n setOpenAIAuthStorage(authStorage);\n setGitHubCopilotAuthStorage(authStorage);\n return authStorage;\n}\n\n/**\n * Resolve cloud observability credentials for the MastraPlatformExporter.\n * Priority: per-resource settings > environment variables > disabled.\n */\nfunction resolveCloudObservabilityConfig(\n settings: ReturnType<typeof loadSettings>,\n authStorage: AuthStorage,\n resourceId: string,\n): { accessToken?: string; projectId?: string } {\n const resourceConfig = settings.observability.resources[resourceId];\n if (resourceConfig) {\n const token = authStorage.getStoredApiKey(`${OBSERVABILITY_AUTH_PREFIX}${resourceId}`);\n if (token) {\n return { accessToken: token, projectId: resourceConfig.projectId };\n }\n }\n // Fall back to environment variables for backwards compatibility\n return {\n accessToken: process.env.MASTRA_CLOUD_ACCESS_TOKEN,\n projectId: process.env.MASTRA_PROJECT_ID,\n };\n}\n\nexport async function createMastraCode(config?: MastraCodeConfig) {\n const cwd = config?.cwd ?? process.cwd();\n const configDir = config?.configDir ?? DEFAULT_CONFIG_DIR;\n if (configDir !== DEFAULT_CONFIG_DIR) {\n validateConfigDirName(configDir);\n }\n\n // Load .env file from cwd if present (for observability API keys, etc.)\n try {\n process.loadEnvFile(path.join(cwd, '.env'));\n } catch {\n // No .env file — that's fine, keys may be in shell environment\n }\n\n // Auth storage (shared with Claude Max / OpenAI providers and Harness)\n const authStorage = createAuthStorage();\n const globalSettings = loadSettings(config?.settingsPath);\n const storedGatewayKey = authStorage.getStoredApiKey(MEMORY_GATEWAY_PROVIDER);\n const storedGatewayUrl = globalSettings.memoryGateway?.baseUrl;\n\n if (storedGatewayKey) {\n process.env['MASTRA_GATEWAY_API_KEY'] ??= storedGatewayKey;\n }\n\n if (storedGatewayUrl) {\n process.env['MASTRA_GATEWAY_URL'] ??= storedGatewayUrl;\n }\n\n // Load user-entered API keys from auth.json into process.env\n // (only sets env vars that aren't already present — env vars take precedence)\n try {\n const registry = PROVIDER_REGISTRY as Record<string, ProviderConfig>;\n const providerEnvVars: Record<string, string | undefined> = {};\n for (const [provider, cfg] of Object.entries(registry)) {\n const envVars = cfg?.apiKeyEnvVar;\n providerEnvVars[provider] = Array.isArray(envVars) ? envVars[0] : envVars;\n }\n providerEnvVars[MEMORY_GATEWAY_PROVIDER] ??= 'MASTRA_GATEWAY_API_KEY';\n authStorage.loadStoredApiKeysIntoEnv(providerEnvVars);\n } catch {\n // Registry unavailable — load well-known provider keys so non-gateway flows still work\n authStorage.loadStoredApiKeysIntoEnv({\n [MEMORY_GATEWAY_PROVIDER]: 'MASTRA_GATEWAY_API_KEY',\n anthropic: 'ANTHROPIC_API_KEY',\n openai: 'OPENAI_API_KEY',\n google: 'GOOGLE_GENERATIVE_AI_API_KEY',\n cerebras: 'CEREBRAS_API_KEY',\n deepseek: 'DEEPSEEK_API_KEY',\n });\n }\n\n const mgApiKey = process.env['MASTRA_GATEWAY_API_KEY'] ?? storedGatewayKey;\n const mastraGatewayBaseUrl = (\n process.env['MASTRA_GATEWAY_URL'] ??\n storedGatewayUrl ??\n 'https://gateway-api.mastra.ai'\n )\n .replace(/\\/+$/, '')\n .replace(/\\/v1$/, '');\n const mastraCodeGateway = createMastraCodeGateway({\n mastraGatewayBaseUrl,\n mastraGatewayApiKey: mgApiKey,\n routeThroughMastraGateway: false,\n settingsPath: config?.settingsPath,\n });\n\n // Project detection\n const project = detectProject(cwd);\n\n const resourceIdOverride = getResourceIdOverride(project.rootPath, configDir);\n if (resourceIdOverride) {\n project.resourceId = resourceIdOverride;\n project.resourceIdOverride = true;\n }\n\n const configuredPubSub = config?.pubsub;\n const useUnixSocketPubSub =\n (config?.unixSocketPubSub ?? globalSettings.signals?.unixSocketPubSub ?? false) && process.platform !== 'win32';\n const signalsPubSub = configuredPubSub ?? (useUnixSocketPubSub ? createSignalsPubSub(project.resourceId) : undefined);\n const crossProcessPubSub = config?.crossProcessPubSub ?? (!configuredPubSub && useUnixSocketPubSub);\n if (crossProcessPubSub && !signalsPubSub) {\n throw new Error('crossProcessPubSub requires a pubsub instance');\n }\n\n // Storage\n const storageConfig = config?.storage ?? getStorageConfig(project.rootPath, globalSettings.storage, configDir);\n const storageResult = await createStorage(storageConfig);\n const storageWarning = storageResult.warning;\n\n // Observability storage (DuckDB — separate file for OLAP-style trace/score/feedback queries).\n // Local tracing is opt-in via `/observability local on`. When disabled, the\n // MastraStorageExporter is omitted entirely so traces never fall through to\n // the default libsql backend.\n let observabilityDomain: DuckDBStore['observability'] | undefined;\n let observabilityWarning: string | undefined;\n if (globalSettings.observability.localTracing) {\n try {\n const observabilityDuckDB = new DuckDBStore({\n id: 'mastra-code-observability',\n path: getObservabilityDatabasePath(),\n });\n // Force an early connection attempt so the lock error surfaces now, not mid-session.\n await observabilityDuckDB.db.getConnection();\n observabilityDomain = observabilityDuckDB.observability;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const isLockError = /lock|locked|busy/i.test(message);\n if (isLockError) {\n observabilityWarning =\n 'Observability unavailable — another MastraCode instance holds the database lock. Traces, scores, and feedback will not be recorded in this session.';\n } else {\n observabilityWarning = `Observability unavailable — DuckDB initialization failed: ${message}`;\n }\n }\n }\n\n const harnessStorage = new InMemoryHarness();\n\n const storage = new MastraCompositeStore({\n id: 'mastra-code-storage',\n default: storageResult.storage,\n domains: {\n ...(observabilityDomain ? { observability: observabilityDomain } : {}),\n harness: harnessStorage,\n },\n });\n\n // Observability (tracing, scoring, feedback)\n const observability = new Observability({\n configs: {\n default: {\n serviceName: 'mastracode',\n // Only these requestContext keys are stored on spans — prevents leaking\n // large objects (harness state, workspace, env vars) into trace data.\n // Use dot-notation because these are nested inside the 'harness' key.\n //\n // Session identifiers:\n // threadId, resourceId, modeId, harnessId\n // Environment & project:\n // state.projectName, state.gitBranch\n // Model configuration:\n // state.currentModelId, state.subagentModelId\n // Agent settings:\n // state.yolo, state.thinkingLevel, state.smartEditing\n // Observational memory settings:\n // state.omScope, state.observerModelId, state.reflectorModelId,\n // state.observationThreshold, state.reflectionThreshold\n requestContextKeys: [\n // Session identifiers\n 'harness.threadId',\n 'harness.resourceId',\n 'harness.modeId',\n 'harness.harnessId',\n // Environment & project\n 'harness.state.projectName',\n 'harness.state.gitBranch',\n // Model configuration\n 'harness.state.currentModelId',\n 'harness.state.subagentModelId',\n // Agent settings\n 'harness.state.yolo',\n 'harness.state.thinkingLevel',\n 'harness.state.smartEditing',\n // Observational memory settings\n 'harness.state.omScope',\n 'harness.state.observerModelId',\n 'harness.state.reflectorModelId',\n 'harness.state.observationThreshold',\n 'harness.state.reflectionThreshold',\n ],\n exporters: [\n // Only persist traces locally when DuckDB observability is available\n // (via `/observability local on`). Without this guard the storage\n // exporter falls through to the default libsql backend and silently\n // fills the main database with gigabytes of span data.\n ...(observabilityDomain ? [new MastraStorageExporter({ strategy: 'event-sourced' })] : []),\n new MastraPlatformExporter(resolveCloudObservabilityConfig(globalSettings, authStorage, project.resourceId)),\n ],\n spanOutputProcessors: [new SensitiveDataFilter()],\n },\n },\n });\n\n // Vector store for recall search (separate DB file to avoid bloating main storage)\n const vectorStore = await createVectorStore(storageConfig, storageResult.backend);\n\n const memory = config?.memory ?? getDynamicMemory(storage, vectorStore);\n\n // MCP\n const mcpManager = config?.disableMcp ? undefined : createMcpManager(project.rootPath, configDir, config?.mcpServers);\n\n // Hooks\n const hookManager = config?.disableHooks ? undefined : new HookManager(project.rootPath, 'session-init', configDir);\n\n // Scorers (live evaluation with sampling)\n const outcomeScorer = createOutcomeScorer();\n const efficiencyScorer = createEfficiencyScorer();\n\n // Agent — githubSignals is created before `harness` but the closure below\n // captures `harness` by reference; it is only invoked at notification time,\n // well after harness is constructed (line ~692). Explicit type annotations\n // on githubSignals, codeAgent, modes, and harness break the circular\n // inference chain this forward reference would otherwise create.\n const githubSignals: GithubSignals | undefined = globalSettings.signals?.experimentalGithubSignals\n ? new GithubSignals({\n cwd: project.rootPath,\n getNotificationStreamOptions: ({ resourceId, threadId }) => {\n const requestContext = new RequestContext();\n const harnessContext: HarnessRequestContext = {\n harnessId: harness.id,\n state: harness.getState(),\n getState: () => harness.getState(),\n setState: updates => harness.setState(updates),\n threadId,\n resourceId,\n modeId: harness.getCurrentModeId(),\n workspace: harness.getWorkspace(),\n getSubagentModelId: params => harness.getSubagentModelId(params),\n };\n requestContext.set('harness', harnessContext);\n\n return {\n memory: { thread: threadId, resource: resourceId },\n requestContext,\n maxSteps: 1000,\n savePerStep: false,\n requireToolApproval: (harness.getState() as Record<string, unknown>).yolo !== true,\n modelSettings: { temperature: 1 },\n };\n },\n })\n : undefined;\n const codeAgent: Agent = new Agent({\n id: CODE_AGENT_ID,\n name: 'Code Agent',\n instructions: getDynamicInstructions,\n model: getDynamicModel,\n tools: createDynamicTools(mcpManager, config?.extraTools, config?.disabledTools, storage),\n hooks: createToolHooks(hookManager),\n scorers: {\n outcome: {\n scorer: outcomeScorer,\n sampling: { type: 'none' },\n },\n efficiency: {\n scorer: efficiencyScorer,\n sampling: { type: 'ratio', rate: 0.3 },\n },\n },\n // TaskSignalProvider bundles the task tools + TaskStateProcessor: it merges\n // the tools into the toolset and registers the task state-signal processor,\n // so the task list persists across turns and survives OM truncation.\n signals: [new TaskSignalProvider(), ...(githubSignals ? [githubSignals] : [])],\n // Native goal mechanism: the in-loop goal step judges the thread's active\n // objective each qualifying iteration. The judge model is required for any\n // gating to occur; when unset the goal step is a complete no-op. A6 auto-wires\n // the GoalStateProcessor so the `<current-objective>` signal persists across\n // turns. Per-thread overrides live in the ThreadState `goal` record and win\n // over these defaults.\n goal: {\n // Resolve the judge model through mastracode's gateway (a model-resolver\n // function) so provider credentials are injected; returns undefined when no\n // judge model is configured, keeping the goal step a no-op. Bind the same\n // `settingsPath` used above so the judge model and `maxRuns` come from one\n // config (a custom settings file would otherwise diverge).\n judge: ctx => getGoalJudgeModel(ctx, config?.settingsPath),\n maxRuns: globalSettings.models.goalMaxTurns ?? 50,\n prompt: DEFAULT_GOAL_JUDGE_PROMPT,\n },\n inputProcessors: [\n new AgentsMDInjector({\n getIgnoredInstructionPaths: ({ requestContext }) => {\n const harnessContext = requestContext?.get('harness') as\n | { state?: { projectPath?: string }; getState?: () => { projectPath?: string } }\n | undefined;\n const projectPath =\n harnessContext?.getState?.()?.projectPath ?? harnessContext?.state?.projectPath ?? project.rootPath;\n return getStaticallyLoadedInstructionPaths(projectPath);\n },\n }),\n new ProviderHistoryCompat(),\n ],\n errorProcessors: [new StreamErrorRetryProcessor(), new PrefillErrorHandler(), new ProviderHistoryCompat()],\n });\n\n // const defaultSubAgents: Array<HarnessSubagent> = [];\n // const defaultSubagents = [exploreSubagent, planSubagent, executeSubagent];\n\n const defaultModes: HarnessMode[] = [\n {\n ...buildMode,\n metadata: {\n ...buildMode.metadata,\n color: mastra.green,\n },\n },\n {\n ...planMode,\n metadata: {\n ...planMode.metadata,\n color: mastra.purple,\n },\n },\n {\n ...fastMode,\n metadata: {\n ...fastMode.metadata,\n color: mastra.orange,\n },\n },\n ];\n\n const defaultHeartbeatHandlers: HeartbeatHandler[] = [\n {\n id: 'gateway-sync',\n intervalMs: 5 * 60 * 1000,\n immediate: false,\n handler: () => syncGateways(),\n },\n ];\n const heartbeatHandlers = config?.heartbeatHandlers ?? defaultHeartbeatHandlers;\n\n // Build lightweight provider access for resolving built-in packs at startup.\n // Anthropic/OpenAI use AuthStorage; other providers use env API keys.\n // Also scan the full provider registry so configured API keys satisfy access checks.\n const anthropicCred = authStorage.get('anthropic');\n const openaiCred = authStorage.get('openai-codex');\n const githubCopilotCred = authStorage.get('github-copilot');\n const startupAccess: ProviderAccess = {\n anthropic:\n anthropicCred?.type === 'oauth'\n ? 'oauth'\n : anthropicCred?.type === 'api_key' && anthropicCred.key.trim().length > 0\n ? 'apikey'\n : false,\n openai:\n openaiCred?.type === 'oauth'\n ? 'oauth'\n : openaiCred?.type === 'api_key' && openaiCred.key.trim().length > 0\n ? 'apikey'\n : false,\n cerebras: process.env.CEREBRAS_API_KEY ? 'apikey' : false,\n google: process.env.GOOGLE_GENERATIVE_AI_API_KEY ? 'apikey' : false,\n deepseek: process.env.DEEPSEEK_API_KEY ? 'apikey' : false,\n 'github-copilot': githubCopilotCred?.type === 'oauth' ? 'oauth' : false,\n };\n // Gateway covers all providers — ensure Anthropic/OpenAI packs are visible\n if (mgApiKey) {\n if (!startupAccess.anthropic) startupAccess.anthropic = 'apikey';\n if (!startupAccess.openai) startupAccess.openai = 'apikey';\n }\n // Check all providers in the registry for API keys\n try {\n const registry = PROVIDER_REGISTRY as Record<string, ProviderConfig>;\n for (const [provider, config] of Object.entries(registry)) {\n if (startupAccess[provider] === 'oauth' || startupAccess[provider] === 'apikey') continue; // Already enabled above\n if (provider === 'anthropic' || provider === 'openai') continue;\n const envVars = config?.apiKeyEnvVar;\n const envVarList = Array.isArray(envVars) ? envVars : envVars ? [envVars] : [];\n if (envVarList.some(envVar => process.env[envVar])) {\n startupAccess[provider] = 'apikey';\n }\n }\n } catch {\n // Registry may not be loaded yet; the 5 hardcoded providers are sufficient fallback\n }\n const builtinPacks = getAvailableModePacks(startupAccess);\n const builtinOmPacks = getAvailableOmPacks(startupAccess);\n const effectiveDefaults = resolveModelDefaults(globalSettings, builtinPacks);\n const effectiveObserverModel = resolveOmRoleModel(globalSettings, 'observer', builtinOmPacks);\n const effectiveReflectorModel = resolveOmRoleModel(globalSettings, 'reflector', builtinOmPacks);\n const effectiveObservationThreshold = globalSettings.models.omObservationThreshold ?? undefined;\n const effectiveReflectionThreshold = globalSettings.models.omReflectionThreshold ?? undefined;\n const effectiveCavemanObservations = globalSettings.models.omCavemanObservations ?? undefined;\n const effectiveObserveAttachments = globalSettings.models.omObserveAttachments ?? 'auto';\n\n const modes = applyEffectiveDefaultsToModes(config?.modes ? config.modes : defaultModes, effectiveDefaults);\n const defaultModeId =\n modes.find(mode => mode.metadata?.default === true)?.id ??\n modes.find(mode => mode.id === 'build')?.id ??\n modes[0]?.id;\n if (!defaultModeId) {\n throw new Error('MastraCode requires at least one mode');\n }\n\n // Map subagent types to mode models: explore→fast, plan→plan, execute→build\n // const subagentModeMap: Record<string, string> = { explore: 'fast', plan: 'plan', execute: 'build' };\n // Subagents inherit workspace tools from the parent agent's workspace automatically.\n // Apply disabledTools filter to both default and custom subagents.\n // const subagents = [];\n\n // Build initial state with global preferences\n const globalInitialState: Partial<MastraCodeState> = {};\n if (effectiveObserverModel) {\n globalInitialState.observerModelId = effectiveObserverModel;\n }\n if (effectiveReflectorModel) {\n globalInitialState.reflectorModelId = effectiveReflectorModel;\n }\n if (effectiveObservationThreshold !== undefined) {\n globalInitialState.observationThreshold = effectiveObservationThreshold;\n }\n if (effectiveReflectionThreshold !== undefined) {\n globalInitialState.reflectionThreshold = effectiveReflectionThreshold;\n }\n if (effectiveCavemanObservations !== undefined) {\n globalInitialState.cavemanObservations = effectiveCavemanObservations;\n }\n if (effectiveObserveAttachments !== undefined) {\n globalInitialState.observeAttachments = effectiveObserveAttachments;\n }\n if (globalSettings.preferences.yolo !== null) {\n globalInitialState.yolo = globalSettings.preferences.yolo;\n }\n globalInitialState.thinkingLevel = globalSettings.preferences.thinkingLevel;\n if (config?.omScope) {\n globalInitialState.omScope = config.omScope;\n }\n // Seed subagent models from global settings\n for (const [key, modelId] of Object.entries(globalSettings.models.subagentModels)) {\n if (key === 'default' || key === '_default') {\n globalInitialState.subagentModelId = modelId;\n } else {\n globalInitialState[`subagentModelId_${key}`] = modelId;\n }\n }\n\n // const { threads } = (await (\n // await storage.getStore('memory')\n // )?.listThreads({\n // perPage: false,\n // filter: {\n // resourceId: project.resourceId,\n // },\n // })) ?? { threads: [] as StorageThreadType[] };\n // const ownerId = `mastracode-${hash(`${hostname()}\\0${project.rootPath}`)}`;\n\n // temporary prefill sessions from threads\n // await Promise.all(\n // threads.map(thread => {\n // const sessionHash = hash(`${thread.resourceId}\\0${thread.id}`);\n\n // const meta = thread.metadata as Record<string, unknown> | undefined;\n // const modeId = typeof meta?.currentModeId === 'string' ? meta.currentModeId : defaultModeId;\n // const mode = modesV1.find(mode => mode.id === modeId) ?? modesV1.find(mode => mode.id === defaultModeId)!;\n // const modelId = typeof meta?.currentModelId === 'string' ? meta.currentModelId : mode.defaultModelId;\n // return harnessStorage.saveSession({\n // id: `sess-${sessionHash}`,\n // ownerId,\n // resourceId: thread.resourceId,\n // threadId: thread.id,\n // modeId: mode.id,\n // modelId,\n // origin: 'top-level',\n // createdAt: thread.createdAt,\n // lastActivityAt: thread.updatedAt,\n // });\n // }),\n // );\n\n // const harnessV1 = new HarnessV1({\n // ownerId,\n // agents: { [CODE_AGENT_ID]: codeAgent },\n // memory,\n // modes: modesV1,\n // defaultModeId,\n // storage: harnessStorage,\n // });\n\n const typedStateSchema = stateSchema as PublicSchema<MastraCodeState>;\n const harness: Harness<MastraCodeState> = new Harness<MastraCodeState>({\n id: 'mastra-code',\n resourceId: project.resourceId,\n storage,\n observability,\n memory,\n pubsub: signalsPubSub,\n stateSchema: typedStateSchema,\n agent: codeAgent,\n subagents: config?.subagents ?? [],\n gateways: [mastraCodeGateway],\n toolCategoryResolver: getToolCategory,\n initialState: {\n projectPath: project.rootPath,\n projectName: project.name,\n gitBranch: project.gitBranch,\n yolo: true,\n ...globalInitialState,\n ...config?.initialState,\n // configDir must always win over initialState spreads to stay in sync\n // with MCP/hooks/storage which were already initialized with this value.\n configDir,\n },\n workspace: config?.workspace ?? (args => getDynamicWorkspace(args)),\n browser: config?.browser,\n modes,\n heartbeatHandlers,\n resolveModel,\n customModelCatalogProvider: createMastraCodeModelCatalogProvider(mastraCodeGateway),\n modelUseCountProvider: () => loadSettings().modelUseCounts,\n modelUseCountTracker: modelId => {\n try {\n const settings = loadSettings();\n settings.modelUseCounts[modelId] = (settings.modelUseCounts[modelId] ?? 0) + 1;\n saveSettings(settings);\n } catch (error) {\n console.error('Failed to persist model usage count', error);\n }\n },\n threadLock: crossProcessPubSub\n ? undefined\n : {\n acquire: acquireThreadLock,\n release: releaseThreadLock,\n },\n // , harnessV1\n });\n\n // Sync hookManager session ID on thread changes\n if (hookManager) {\n harness.subscribe((event: HarnessEvent) => {\n if (event.type === 'thread_changed') {\n hookManager.setSessionId(event.threadId);\n } else if (event.type === 'thread_created') {\n hookManager.setSessionId(event.thread.id);\n }\n });\n }\n\n if (githubSignals) {\n const startGithubPollingForCurrentThread = async (threadId?: string | null) => {\n if (!threadId) return;\n githubSignals.stopAllPolling();\n try {\n const threads = await harness.listThreads({ allResources: true });\n const thread = threads.find((item: { id: string }) => item.id === threadId);\n await githubSignals.startPollingForThread(\n {\n threadId,\n resourceId: thread?.resourceId ?? harness.getResourceId(),\n },\n { pollImmediately: true },\n );\n } catch (error) {\n console.warn('Failed to start GitHub PR polling:', error);\n }\n };\n\n harness.subscribe((event: HarnessEvent) => {\n if (event.type === 'thread_changed') void startGithubPollingForCurrentThread(event.threadId);\n else if (event.type === 'thread_created') void startGithubPollingForCurrentThread(event.thread.id);\n });\n void startGithubPollingForCurrentThread(harness.getCurrentThreadId());\n }\n\n // Persist MastraCode-owned /om settings per-thread (mastracode-only concern;\n // intentionally not in core's harness loadThreadMetadata).\n const omThreadStateHarness = harness as unknown as Harness<Record<string, unknown>>;\n attachOMThreadStatePersistence(omThreadStateHarness);\n await restoreOMThreadStateForCurrentThread(omThreadStateHarness).catch(() => {\n // Persistence is best-effort; don't crash startup if storage hiccups.\n });\n\n return {\n harness,\n mcpManager,\n hookManager,\n signalsPubSub,\n authStorage,\n resolveModel,\n storageWarning,\n observabilityWarning,\n builtinPacks,\n builtinOmPacks,\n effectiveDefaults,\n githubSignals,\n };\n}\n"]}
|