@ngandu/ulicode 0.0.6 → 0.0.7

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/agents/prompts/base.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/tool-guidance.ts","../src/agents/prompts/index.ts","../src/agents/instructions.ts","../src/constants.ts","../src/providers/claude-max.ts","../src/providers/openai-codex.ts","../src/agents/model.ts","../src/agents/memory.ts","../src/agents/subagent-tool.ts","../src/agents/tools.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/storage-factory.ts","../src/index.ts"],"names":["Tiktoken","o200k_base","tavily","createTool","z","path","os","fs","logRuntimeProfile","existsSync","join","TOOL_NAME_OVERRIDES","loadSettingsCached","dirname","fileURLToPath","workspace","Workspace","LocalFilesystem","LocalSandbox","path2","os2","path3","resolve","homedir","readFileSync","MC_TOOLS","getModeDefinition","getCurrentGitBranch","AuthStorage","anthropic","createAnthropic","wrapLanguageModel","authStorage","authStorageInstance","getAuthStorage","setAuthStorage","openai","createOpenAI","getCustomProviderId","ModelRouterLanguageModel","getOmScope","Memory","resolveModel","subagent","Agent","createWorkspaceTools","durationMs","path4","os3","fs2","spawn","loadSingleConfig","mergeConfigs","path5","os4","fs3","validateConfig","MCPClient","ModelsDevGateway","NetlifyGateway","LibSQLStore","getDatabasePath","PostgresStore","detectProject","getResourceIdOverride","lspManager","getStorageConfig","loadAgentDefinitionsCached","createHarnessSubagentsFromDefinitions","createHarnessModesFromDefinitions","PROVIDER_REGISTRY","config","getAvailableModePacks","getAvailableOmPacks","resolveModelDefaults","resolveOmModel","getSubagentModeMap","harness","Harness","getToolCategory","saveSettings","toCustomProviderModelId","acquireThreadLock","releaseThreadLock","getAllowedSubagentIdsForMode"],"mappings":"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","file":"chunk-Y5PO67TG.cjs","sourcesContent":["/**\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 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 return `You are Ulicode, 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}\nDate: ${ctx.date}\nCurrent mode: ${ctx.mode}\n\n# Tone and Style\n- Your output is displayed on a command line interface. Keep responses concise.\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, etc.). Use text for communication — talk to the user in text, not via tools, except for communication tools like \\`submit_plan\\`, \\`ask_user\\`, and \\`task_write\\`.\n- Prioritize technical accuracy over validating the user's beliefs. Be direct and objective. Respectful correction is more valuable than false agreement.\n\n${ctx.toolGuidance}\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## Work Incrementally\n- Focus on ONE thing at a time. Complete it fully before moving to the next.\n- Leave the codebase in a clean state after each change — no half-implemented features.\n- For multi-step tasks, use tasks to track progress and ensure nothing is missed.\n\n## Verify Before Moving On\n- After each change, verify it works. Don't assume — actually test it.\n- Run the relevant tests, check for type errors, or manually verify the behavior.\n- If something breaks, fix it immediately. Don't pile more changes on top of broken code.\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 commit or push unless the user explicitly asks.\n- NEVER force push to \\`main\\` or \\`master\\` without warning 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: Ulicode${ctx.modelId ? ` (${ctx.modelId})` : ''} <noreply@ulicode.local>\\` in the message body.\n\n## Pull Requests\nUse \\`gh pr create\\`. Include a summary of what changed and a test plan.\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. Exception: the **audit-tests** subagent may be used on its own.\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# 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- If you're unsure about something, ask the user rather than guessing.\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, tell the user to run the \\`/sandbox\\` command to add the external directory to the allowed paths for this thread. Once they do, you will be able to access it.\n`;\n}\n","import { Tiktoken } from 'js-tiktoken/lite';\nimport o200k_base from 'js-tiktoken/ranks/o200k_base';\n\nconst enc = new Tiktoken(o200k_base);\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}\nexport function tokenEstimate(text: string | object): number {\n return enc.encode(sanitizeInput(text), `all`).length;\n}\n\nexport function truncateStringForTokenEstimate(text: string, desiredTokenCount: number, fromEnd = true) {\n const tokens = enc.encode(sanitizeInput(text));\n\n if (tokens.length <= desiredTokenCount) return text;\n\n return `[Truncated ${tokens.length - desiredTokenCount} tokens]\n${enc.decode(tokens.slice(fromEnd ? -desiredTokenCount : 0, fromEnd ? undefined : desiredTokenCount))}`;\n}\n","import { createTool } from '@mastra/core/tools';\nimport { tavily } from '@tavily/core';\nimport { z } from 'zod';\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// Lazily cached Tavily client — created on first use when the API key is available.\nlet cachedTavilyClient: ReturnType<typeof tavily> | null = null;\n\nfunction getTavilyClient() {\n if (cachedTavilyClient) return cachedTavilyClient;\n const apiKey = process.env.TAVILY_API_KEY;\n if (!apiKey) return null;\n cachedTavilyClient = tavily({ apiKey });\n return cachedTavilyClient;\n}\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\nexport function createWebSearchTool() {\n return createTool({\n id: 'web-search',\n description:\n 'Search the web for information. Use this to find documentation, look up error messages, check package APIs, or research any topic. Returns relevant web results with content snippets and optionally images.',\n inputSchema: z.object({\n query: z.string().describe('The search query'),\n searchDepth: z\n .enum(['basic', 'advanced'])\n .optional()\n .default('basic')\n .describe(\"Search depth - 'basic' for quick searches, 'advanced' for more thorough results\"),\n maxResults: z.number().optional().default(10).describe('Maximum number of results to return'),\n includeImages: z.boolean().optional().default(false).describe('Whether to include related images in results'),\n }),\n execute: async context => {\n const tavilyClient = getTavilyClient();\n if (!tavilyClient) {\n return 'No results (TAVILY_API_KEY not configured)';\n }\n try {\n const response = await tavilyClient.search(context.query, {\n searchDepth: context.searchDepth || 'basic',\n maxResults: context.maxResults || 10,\n includeAnswer: true,\n includeImages: context.includeImages || false,\n });\n\n const filteredResults = response.results.filter(r => (r.score ?? 1) >= MIN_RELEVANCE_SCORE);\n\n const parts: string[] = [];\n\n if (response.answer) {\n parts.push(`Answer: ${response.answer}`);\n }\n\n for (const r of filteredResults) {\n parts.push(`## ${r.title}\\n${r.url}\\n${r.content}`);\n }\n\n const images = (response.images || [])\n .map((img: { url?: string } | string) => (typeof img === 'string' ? img : img.url || ''))\n .filter(Boolean);\n\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 } catch {\n return 'No results';\n }\n },\n });\n}\n\nexport function createWebExtractTool() {\n return createTool({\n id: 'web-extract',\n description:\n 'Extract content from one or more URLs. Use this to read web pages, documentation, articles, or any URL. Returns the raw content in markdown format. You can provide up to 20 URLs at once.',\n inputSchema: z.object({\n urls: z.array(z.string()).min(1).max(20).describe('URLs to extract content from (max 20)'),\n extractDepth: z\n .enum(['basic', 'advanced'])\n .optional()\n .default('basic')\n .describe(\"Extraction depth - 'basic' for simple text, 'advanced' for JS-rendered pages\"),\n includeImages: z.boolean().optional().default(false).describe('Whether to include extracted image URLs'),\n }),\n execute: async context => {\n const tavilyClient = getTavilyClient();\n if (!tavilyClient) {\n return 'Extraction failed (TAVILY_API_KEY not configured)';\n }\n try {\n const response = await tavilyClient.extract(context.urls, {\n extractDepth: context.extractDepth || 'basic',\n includeImages: context.includeImages || false,\n });\n\n const parts: string[] = [];\n\n for (const r of (response.results || []) as { url: string; rawContent: string }[]) {\n parts.push(`## ${r.url}\\n${r.rawContent}`);\n }\n\n for (const r of (response.failedResults || []) as { url: string; error: string }[]) {\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 } catch (error) {\n return `Extraction failed: ${String(error)}`;\n }\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 } from '@mastra/core/workspace';\nimport { loadSettingsCached } from '../onboarding/settings.js';\nimport type { MastraCodeState } from '../schema';\nimport { TOOL_NAME_OVERRIDES } from '../tool-names.js';\nimport { logRuntimeProfile } from '../utils/debug-log.js';\n\n// =============================================================================\n// Create Workspace with Skills\n// =============================================================================\n\n// We support multiple skill locations for compatibility:\n// 1. Project-local: .ulicode/skills (project-specific Ulicode skills)\n// 2. Project-local: .uli-cli/skills (temporary compatibility path)\n// 3. Project-local: .pulse/skills (legacy project skills)\n// 4. Project-local: .mastracode/skills (legacy project skills)\n// 5. Project-local: .claude/skills (Claude Code compatible skills)\n// 6. Global: ~/.ulicode/skills (user-wide Ulicode skills)\n// 7. Global: ~/.uli-cli/skills (temporary compatibility path)\n// 8. Global: ~/.pulse/skills (legacy global skills)\n// 9. Global: ~/.mastracode/skills (legacy global skills)\n// 10. Global: ~/.claude/skills (user-wide Claude Code skills)\n\nconst ulicodeLocalSkillsPath = path.join(process.cwd(), '.ulicode', 'skills');\n\nconst uliLocalSkillsPath = path.join(process.cwd(), '.uli-cli', 'skills');\n\nconst pulseLocalSkillsPath = path.join(process.cwd(), '.pulse', 'skills');\n\nconst mastraCodeLocalSkillsPath = path.join(process.cwd(), '.mastracode', 'skills');\n\nconst claudeLocalSkillsPath = path.join(process.cwd(), '.claude', 'skills');\n\nconst ulicodeGlobalSkillsPath = path.join(os.homedir(), '.ulicode', 'skills');\n\nconst uliGlobalSkillsPath = path.join(os.homedir(), '.uli-cli', 'skills');\n\nconst pulseGlobalSkillsPath = path.join(os.homedir(), '.pulse', 'skills');\n\nconst mastraCodeGlobalSkillsPath = path.join(os.homedir(), '.mastracode', 'skills');\n\nconst claudeGlobalSkillsPath = path.join(os.homedir(), '.claude', '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 if (!fs.existsSync(skillsDir)) continue;\n\n // Always add the directory itself\n const resolved = fs.realpathSync(skillsDir);\n if (!seen.has(resolved)) {\n seen.add(resolved);\n paths.push(skillsDir);\n }\n\n // Check for symlinked skill subdirectories and add their real parents\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 // Add the real parent directory as a skill path\n // so Mastra discovers it as a regular directory\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\nlet skillPathsCache: string[] | null = null;\nlet skillPathsLogged = false;\n\nexport function getSkillPaths(): string[] {\n if (skillPathsCache) {\n return [...skillPathsCache];\n }\n\n const startTime = performance.now();\n skillPathsCache = collectSkillPaths([\n ulicodeLocalSkillsPath,\n uliLocalSkillsPath,\n pulseLocalSkillsPath,\n mastraCodeLocalSkillsPath,\n claudeLocalSkillsPath,\n ulicodeGlobalSkillsPath,\n uliGlobalSkillsPath,\n pulseGlobalSkillsPath,\n mastraCodeGlobalSkillsPath,\n claudeGlobalSkillsPath,\n ]);\n\n logRuntimeProfile('workspace.skill_path_scan', performance.now() - startTime, {\n count: skillPathsCache.length,\n });\n\n if (!skillPathsLogged && skillPathsCache.length > 0) {\n console.info(`Skills loaded from:`);\n for (const p of skillPathsCache) {\n console.info(` - ${p}`);\n }\n skillPathsLogged = true;\n }\n\n return [...skillPathsCache];\n}\n\nexport function invalidateSkillPathsCache(): void {\n skillPathsCache = null;\n skillPathsLogged = false;\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 workspaceId = `${WORKSPACE_ID_PREFIX}-${projectPath}`;\n const sandboxPaths = state?.sandboxAllowedPaths ?? [];\n const skillPaths = getSkillPaths();\n const allowedPaths = [...skillPaths, ...sandboxPaths.map((p: string) => path.resolve(p))];\n const isPlanMode = modeId === 'plan';\n const isAskMode = modeId === 'ask';\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 askModeTools = {\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 mastra_workspace_delete: { ...TOOL_NAME_OVERRIDES.mastra_workspace_delete, enabled: false },\n mastra_workspace_mkdir: { ...TOOL_NAME_OVERRIDES.mastra_workspace_mkdir, enabled: false },\n mastra_workspace_execute_command: { ...TOOL_NAME_OVERRIDES.mastra_workspace_execute_command, enabled: false },\n mastra_workspace_get_process_output: { ...TOOL_NAME_OVERRIDES.mastra_workspace_get_process_output, enabled: false },\n mastra_workspace_kill_process: { ...TOOL_NAME_OVERRIDES.mastra_workspace_kill_process, enabled: false },\n };\n\n const toolsConfig = isAskMode\n ? { ...TOOL_NAME_OVERRIDES, ...askModeTools }\n : isPlanMode\n ? { ...TOOL_NAME_OVERRIDES, ...planModeTools }\n : TOOL_NAME_OVERRIDES;\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(toolsConfig);\n return existing;\n }\n\n const userLsp = loadSettingsCached().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 const startTime = performance.now();\n const workspace = new Workspace({\n id: workspaceId,\n name: 'Ulicode Workspace',\n filesystem: new LocalFilesystem({\n basePath: projectPath,\n allowedPaths,\n }),\n sandbox: new LocalSandbox({\n workingDirectory: projectPath,\n env: {\n ...process.env,\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 tools: toolsConfig,\n ...(skillPaths.length > 0 ? { skills: skillPaths } : {}),\n lsp: lspConfig,\n });\n logRuntimeProfile('workspace.create', performance.now() - startTime, {\n workspaceId,\n modeId,\n skillPathCount: skillPaths.length,\n });\n return workspace;\n}\n","import * as path from 'node:path';\nimport { getSkillPaths } from '../agents/workspace.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 at startup) with user-approved sandbox paths\n * from harness state so that both parent and subagent tools have the same access.\n * Returns 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 skillPaths = getSkillPaths();\n if (!toolContext?.requestContext) {\n return [...skillPaths];\n }\n const harnessCtx = toolContext.requestContext.get('harness') as\n | {\n state?: { sandboxAllowedPaths?: string[] };\n getState?: () => { sandboxAllowedPaths?: string[] };\n }\n | undefined;\n const sandboxPaths = harnessCtx?.getState?.()?.sandboxAllowedPaths ?? harnessCtx?.state?.sandboxAllowedPaths ?? [];\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 { isPathAllowed, getAllowedPathsFromContext } from './utils.js';\n\nfunction expandTilde(p: string): string {\n if (p === '~') return os.homedir();\n if (p.startsWith('~/') || p.startsWith('~\\\\')) {\n return `${os.homedir()}/${p.slice(2).replace(/\\\\/g, '/')}`;\n }\n return p;\n}\n\nfunction formatPathForMessage(requestedPath: string, resolvedPath: string): string {\n if (requestedPath.startsWith('~/') || requestedPath.startsWith('~\\\\')) {\n return `${os.homedir()}/${requestedPath.slice(2).replace(/\\\\/g, '/')}`;\n }\n\n if (requestedPath === '~') {\n return os.homedir();\n }\n\n return resolvedPath;\n}\n\nlet requestCounter = 0;\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: 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 execute: async ({ path: requestedPath, reason }, context) => {\n try {\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext<any> | 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 const displayPath = formatPathForMessage(requestedPath, absolutePath);\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: \"${displayPath}\" is within the project root or allowed paths.`,\n isError: false,\n };\n }\n\n if (!harnessCtx?.emitEvent || !harnessCtx?.registerQuestion) {\n return {\n content: `Cannot request sandbox access: TUI context not available. The user should manually run /sandbox add ${displayPath}`,\n isError: true,\n };\n }\n\n const questionId = `sandbox_${++requestCounter}_${Date.now()}`;\n\n // Create a promise that resolves when the user answers in the TUI\n const answer = await new Promise<string>(resolve => {\n // Register the resolver so respondToQuestion() can resolve it\n harnessCtx.registerQuestion!({ questionId, resolve });\n\n // Emit event — TUI will show the dialog\n harnessCtx.emitEvent!({\n type: 'sandbox_access_request',\n questionId,\n path: absolutePath,\n reason,\n });\n });\n\n const approved = answer.toLowerCase().startsWith('y') || answer.toLowerCase() === 'approve';\n if (approved) {\n // Add to allowed paths in harness state (persists across turns)\n const currentAllowed = (harnessCtx.getState?.()?.sandboxAllowedPaths as string[] | undefined) ?? [];\n if (!currentAllowed.includes(absolutePath)) {\n harnessCtx.setState?.({\n sandboxAllowedPaths: [...currentAllowed, absolutePath],\n });\n }\n\n // Also update the workspace filesystem immediately so tools in the\n // same turn can access the path without waiting for the next turn.\n const fs = context?.workspace?.filesystem;\n if (fs instanceof LocalFilesystem) {\n fs.setAllowedPaths((prev: readonly string[]) => [...prev, absolutePath]);\n }\n\n return {\n content: `Access granted: \"${displayPath}\" 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 \"${displayPath}\".`,\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});\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 } from 'node:path';\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 '.ulicode',\n '.uli-cli',\n '.pulse',\n '.mastracode',\n];\n\nconst GLOBAL_LOCATIONS = [\n '.claude',\n '.ulicode',\n '.uli-cli',\n '.pulse',\n '.mastracode',\n '.config/claude',\n '.config/ulicode',\n '.config/uli-cli',\n '.config/pulse',\n '.config/mastracode',\n];\n\ninterface InstructionSource {\n path: string;\n content: string;\n scope: 'global' | 'project';\n}\n\nconst instructionCache = new Map<string, InstructionSource[]>();\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): InstructionSource[] {\n const sources: InstructionSource[] = [];\n const home = homedir();\n\n // Load global instructions first\n for (const location of GLOBAL_LOCATIONS) {\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 PROJECT_LOCATIONS) {\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 loadAgentInstructionsCached(projectPath: string): InstructionSource[] {\n const cached = instructionCache.get(projectPath);\n if (cached) {\n return cached.map(source => ({ ...source }));\n }\n\n const sources = loadAgentInstructions(projectPath);\n instructionCache.set(\n projectPath,\n sources.map(source => ({ ...source })),\n );\n return sources.map(source => ({ ...source }));\n}\n\nexport function invalidateAgentInstructionsCache(projectPath?: string): void {\n if (projectPath) {\n instructionCache.delete(projectPath);\n return;\n }\n\n instructionCache.clear();\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","/**\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 const isAskMode = modeId === 'ask';\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 (!isAskMode && !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 (readTools.length > 0) {\n sections.push(readTools.join('\\n'));\n }\n\n // --- Write/edit tools (build & fast only) ---\n\n if (modeId !== 'plan' && modeId !== 'ask') {\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\n if (!isAskMode && !denied.has('task_write')) {\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- Pass the FULL task list each time (replaces previous list).\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- Each task has: content (imperative form), status (pending|in_progress|completed), activeForm (present continuous form shown during execution).`);\n }\n\n if (!isAskMode && !denied.has('task_check')) {\n taskTools.push(`\n**task_check** — Check completion status of tasks\n- Use this BEFORE deciding you're done with a task to verify all tasks are completed.\n- Returns the number of completed, in progress, and pending tasks.\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 (!isAskMode && !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';\n\nimport { getModeDefinition } from '../agent-definitions.js';\nimport { hasTavilyKey } from '../../tools/index.js';\nimport { loadAgentInstructionsCached, formatAgentInstructions } from './agent-instructions.js';\nimport { buildBasePrompt } from './base.js';\nimport type { PromptContext as BasePromptContext } from './base.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\nfunction buildModePromptFromDefinition(ctx: PromptContext, promptBody: string): string {\n if (ctx.modeId === 'build' && ctx.activePlan) {\n return `# 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${promptBody}`;\n }\n\n return promptBody;\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 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 modeDefinition = getModeDefinition(ctx.workingDir, ctx.modeId) ?? getModeDefinition(ctx.workingDir, 'build');\n const modeSpecific = buildModePromptFromDefinition(ctx, modeDefinition?.instructions ?? '');\n\n // Inject current task state so agent doesn't lose track after OM truncation\n let taskSection = '';\n const tasks = ctx.state?.tasks as { content: string; status: string; activeForm: string }[] | undefined;\n if (tasks && tasks.length > 0) {\n const lines = tasks.map(t => {\n const icon = t.status === 'completed' ? '✓' : t.status === 'in_progress' ? '▸' : '○';\n return ` ${icon} [${t.status}] ${t.content}`;\n });\n taskSection = `\\n<current-task-list>\\n${lines.join('\\n')}\\n</current-task-list>\\n`;\n }\n\n // Load and inject agent instructions from AGENTS.md/CLAUDE.md files\n const instructionSources = loadAgentInstructionsCached(ctx.workingDir);\n const instructionsSection = formatAgentInstructions(instructionSources);\n\n return base + taskSection + instructionsSection + '\\n' + modeSpecific;\n}\n","import type { HarnessRequestContext } from '@mastra/core/harness';\nimport type { MastraCodeState } from '../schema.js';\nimport { logRuntimeProfile } from '../utils/debug-log.js';\nimport { getCurrentGitBranch } from '../utils/project.js';\nimport type { PromptContext } from './prompts/index.js';\nimport { buildFullPrompt } from './prompts/index.js';\n\nlet promptBuildCount = 0;\n\nexport function getDynamicInstructions({ requestContext }: { requestContext: { get(key: string): unknown } }) {\n const startTime = performance.now();\n const harnessContext = requestContext.get('harness') as HarnessRequestContext<MastraCodeState> | undefined;\n const state = harnessContext?.state;\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: getCurrentGitBranch(projectPath) ?? state?.gitBranch,\n platform: process.platform,\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 const prompt = buildFullPrompt(promptCtx);\n promptBuildCount += 1;\n const durationMs = performance.now() - startTime;\n if (promptBuildCount === 1 || durationMs >= 20) {\n logRuntimeProfile('prompt.build', durationMs, {\n count: promptBuildCount,\n modeId,\n projectPath,\n });\n }\n return prompt;\n}\n","// Default OM model - using gemini-2.5-flash for efficiency\nexport const DEFAULT_OM_MODEL_ID = process.env.DEFAULT_OM_MODEL_ID ?? 'google/gemini-2.5-flash';\n\n// Default OM thresholds — per-thread overrides are loaded from thread metadata\nexport const DEFAULT_OBS_THRESHOLD = 30_000;\nexport const DEFAULT_REF_THRESHOLD = 40_000;\n","/**\n * Claude Max OAuth Provider\n *\n * Uses OAuth tokens from AuthStorage to authenticate with Claude Max plan.\n * The OAuth endpoint requires a specific system message to be present.\n */\n\nimport { createAnthropic } from '@ai-sdk/anthropic';\nimport type { MastraModelConfig } from '@mastra/core/llm';\nimport { wrapLanguageModel } from 'ai';\nimport type { LanguageModelMiddleware } from 'ai';\nimport { AuthStorage } from '../auth/storage.js';\n\n// Required for Claude Max plan OAuth - the endpoint checks for this system message\nconst claudeCodeIdentity = \"You are Claude Code, Anthropic's official CLI for Claude.\";\n\n// Singleton auth storage instance\nlet authStorageInstance: AuthStorage | null = null;\n\n/**\n * Get or create the shared AuthStorage instance\n */\nexport function getAuthStorage(): AuthStorage {\n if (!authStorageInstance) {\n authStorageInstance = new AuthStorage();\n }\n return authStorageInstance;\n}\n\n/**\n * Set a custom AuthStorage instance (useful for TUI integration)\n */\nexport function setAuthStorage(storage: AuthStorage | undefined): void {\n authStorageInstance = storage ?? null;\n}\n\n/**\n * Middleware that injects the Claude Code identity system message\n * Required for Claude Max OAuth authentication\n */\nconst 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 * Creates an Anthropic model using Claude Max OAuth authentication\n * Uses OAuth tokens from AuthStorage (auto-refreshes when needed)\n */\nexport function opencodeClaudeMaxProvider(modelId: string = 'claude-sonnet-4-20250514'): MastraModelConfig {\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 });\n return wrapLanguageModel({\n model: anthropic(modelId),\n middleware: [claudeCodeMiddleware, promptCacheMiddleware],\n });\n }\n\n // Custom fetch that handles OAuth\n const oauthFetch = async (url: string | URL | Request, init?: Parameters<typeof fetch>[1]) => {\n const authStorage = getAuthStorage();\n\n // Reload from disk to handle multi-instance refresh\n authStorage.reload();\n\n const storedCred = authStorage.get('anthropic');\n if (storedCred?.type === 'api_key') {\n throw new Error(\n 'Anthropic API key credential is configured, but Claude Max OAuth provider requires OAuth credentials.',\n );\n }\n\n // Get access token (auto-refreshes if expired)\n const accessToken = await authStorage.getApiKey('anthropic');\n\n if (!accessToken) {\n throw new Error('Not logged in to Anthropic. Run /login first.');\n }\n\n // Make request with OAuth headers\n return fetch(url, {\n ...init,\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'anthropic-beta':\n 'oauth-2025-04-20,claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14',\n 'anthropic-version': '2023-06-01',\n },\n });\n };\n\n const anthropic = createAnthropic({\n // Provide a dummy API key - the actual auth is handled via OAuth in oauthFetch\n // This prevents the SDK from throwing \"API key is missing\" at model creation time\n apiKey: 'oauth-placeholder',\n fetch: oauthFetch 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 * 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';\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).\nconst 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 */\nfunction 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 * 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 },\n): MastraModelConfig {\n // Map thinkingLevel to OpenAI reasoningEffort, defaulting to 'medium'.\n // When level is 'off', reasoningEffort is undefined and the parameter is omitted.\n // GPT-5.* models are floored to at least \"low\" on Codex.\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\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 });\n return wrapLanguageModel({\n model: openai.responses(modelId),\n middleware: [middleware],\n });\n }\n\n // Custom fetch that handles OAuth and URL rewriting\n const oauthFetch = async (url: string | URL | Request, init?: Parameters<typeof fetch>[1]) => {\n const authStorage = getAuthStorage();\n\n // Reload from disk to handle multi-instance refresh\n authStorage.reload();\n\n // Get credentials (includes accountId)\n const cred = authStorage.get('openai-codex');\n\n if (!cred || cred.type !== 'oauth') {\n throw new Error('Not logged in to OpenAI Codex. Run /login first.');\n }\n\n // Check if token needs refresh\n let accessToken = cred.access;\n if (Date.now() >= cred.expires) {\n // Token expired, need to refresh via getApiKey which handles refresh\n const refreshedToken = await authStorage.getApiKey('openai-codex');\n if (!refreshedToken) {\n throw new Error('Failed to refresh OpenAI Codex token. Please /login again.');\n }\n accessToken = refreshedToken;\n // Reload to get updated accountId\n authStorage.reload();\n }\n\n // Get accountId from credentials\n const accountId = (cred as any).accountId as string | undefined;\n\n // Build headers - remove any existing authorization header first\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 // Set authorization header with access token\n headers.set('Authorization', `Bearer ${accessToken}`);\n\n // Set ChatGPT-Account-Id header for organization subscriptions\n if (accountId) {\n headers.set('ChatGPT-Account-Id', accountId);\n }\n\n // Rewrite URL to Codex endpoint if it's a chat/responses request\n const parsed = url instanceof URL ? url : new URL(typeof url === 'string' ? url : (url as Request).url);\n\n const shouldRewrite = parsed.pathname.includes('/v1/responses') || parsed.pathname.includes('/chat/completions');\n const finalUrl = shouldRewrite ? new URL(CODEX_API_ENDPOINT) : parsed;\n\n return fetch(finalUrl, {\n ...init,\n headers,\n });\n };\n\n const openai = createOpenAI({\n // Use a dummy API key since we're using OAuth\n apiKey: 'oauth-dummy-key',\n fetch: oauthFetch as any,\n });\n\n // Use the responses API for Codex models\n // Wrap with middleware\n return wrapLanguageModel({\n model: openai.responses(modelId),\n middleware: [middleware],\n });\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport type { HarnessRequestContext } from '@mastra/core/harness';\nimport { ModelRouterLanguageModel } from '@mastra/core/llm';\nimport type { MastraModelConfig } from '@mastra/core/llm';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport { wrapLanguageModel } from 'ai';\nimport { AuthStorage } from '../auth/storage.js';\nimport { getCustomProviderId, loadSettingsCached } from '../onboarding/settings.js';\nimport { opencodeClaudeMaxProvider, promptCacheMiddleware } from '../providers/claude-max.js';\nimport { openaiCodexProvider } from '../providers/openai-codex.js';\nimport type { ThinkingLevel } from '../providers/openai-codex.js';\nimport type { MastraCodeState } from '../schema.js';\n\nconst authStorage = new AuthStorage();\n\nconst OPENAI_PREFIX = 'openai/';\nconst GOOGLE_PREFIX = 'google/';\n\nconst CODEX_OPENAI_MODEL_REMAPS: Record<string, string> = {\n 'gpt-5.3': 'gpt-5.3-codex',\n 'gpt-5.2': 'gpt-5.2-codex',\n 'gpt-5.1': 'gpt-5.1-codex',\n 'gpt-5.1-mini': 'gpt-5.1-codex-mini',\n 'gpt-5': 'gpt-5-codex',\n};\n\ntype ResolvedModel =\n | MastraModelConfig\n | ReturnType<typeof openaiCodexProvider>\n | ReturnType<typeof opencodeClaudeMaxProvider>\n | ModelRouterLanguageModel;\n\nexport function remapOpenAIModelForCodexOAuth(modelId: string): string {\n if (!modelId.startsWith(OPENAI_PREFIX)) {\n return modelId;\n }\n\n const openaiModelId = modelId.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 return `${OPENAI_PREFIX}${codexModelId}`;\n}\n\n/**\n * Resolve the Anthropic API key from stored credentials.\n * Returns the key if available, undefined otherwise.\n */\nexport function getAnthropicApiKey(): string | undefined {\n // Check stored API key credential (set via /apikey or UI prompt)\n const storedCred = authStorage.get('anthropic');\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n return undefined;\n}\n\n/**\n * Resolve the OpenAI API key from stored credentials.\n * Returns the key if available, undefined otherwise.\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 return undefined;\n}\n\n/**\n * Resolve the Google API key from stored credentials.\n * Returns the key if available, undefined otherwise.\n */\nexport function getGoogleApiKey(): string | undefined {\n const storedCred = authStorage.get('google');\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n return undefined;\n}\n\n/**\n * Create an Anthropic model using a direct API key (no OAuth).\n * Applies prompt caching but NOT the Claude Code identity middleware\n * (which is only required for Claude Max OAuth).\n */\nfunction anthropicApiKeyProvider(modelId: string, apiKey: string): MastraModelConfig {\n const anthropic = createAnthropic({ apiKey });\n return wrapLanguageModel({\n model: anthropic(modelId),\n middleware: [promptCacheMiddleware],\n });\n}\n\n/**\n * Create an OpenAI model using a direct API key from AuthStorage.\n */\nfunction openaiApiKeyProvider(modelId: string, apiKey: string): MastraModelConfig {\n const openai = createOpenAI({ apiKey });\n return wrapLanguageModel({\n model: openai.responses(modelId),\n middleware: [],\n });\n}\n\n/**\n * Resolve a model ID to the correct provider instance.\n * Shared by the main agent, observer, and reflector.\n *\n * - For anthropic/* models: Uses stored OAuth credentials when present, otherwise direct API key\n * - For openai/* models: Uses OAuth when configured, otherwise direct API key from AuthStorage\n * - For google/* models: Uses stored API key when present, otherwise the model router\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 },\n): ResolvedModel {\n authStorage.reload();\n const [providerId, modelName] = modelId.split('/', 2);\n const settings = loadSettingsCached();\n const customProvider =\n providerId && modelName\n ? settings.customProviders.find(provider => {\n return providerId === getCustomProviderId(provider.name);\n })\n : undefined;\n\n if (customProvider) {\n return new ModelRouterLanguageModel({\n id: modelId as `${string}/${string}`,\n url: customProvider.url,\n apiKey: customProvider.apiKey,\n });\n }\n\n const isAnthropicModel = modelId.startsWith('anthropic/');\n const isOpenAIModel = modelId.startsWith(OPENAI_PREFIX);\n const isGoogleModel = modelId.startsWith(GOOGLE_PREFIX);\n const isMoonshotModel = modelId.startsWith('moonshotai/');\n\n if (isMoonshotModel) {\n if (!process.env.MOONSHOT_AI_API_KEY) {\n throw new Error(`Need MOONSHOT_AI_API_KEY`);\n }\n return createAnthropic({\n apiKey: process.env.MOONSHOT_AI_API_KEY!,\n baseURL: 'https://api.moonshot.ai/anthropic/v1',\n name: 'moonshotai.anthropicv1',\n })(modelId.substring('moonshotai/'.length));\n } else if (isAnthropicModel) {\n const bareModelId = modelId.substring('anthropic/'.length);\n const storedCred = authStorage.get('anthropic');\n\n // Primary path: explicit OAuth credential\n if (storedCred?.type === 'oauth') {\n return opencodeClaudeMaxProvider(bareModelId);\n }\n\n // Secondary path: explicit stored API key credential\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return anthropicApiKeyProvider(bareModelId, storedCred.key.trim());\n }\n\n // Fallback: direct API key from AuthStorage\n const apiKey = getAnthropicApiKey();\n if (apiKey) {\n return anthropicApiKeyProvider(bareModelId, apiKey);\n }\n // No auth configured — attempt OAuth provider which will prompt login\n return opencodeClaudeMaxProvider(bareModelId);\n } else if (isOpenAIModel) {\n const bareModelId = modelId.substring(OPENAI_PREFIX.length);\n const storedCred = authStorage.get('openai-codex');\n\n if (storedCred?.type === 'oauth') {\n const resolvedModelId = options?.remapForCodexOAuth ? remapOpenAIModelForCodexOAuth(modelId) : modelId;\n return openaiCodexProvider(resolvedModelId.substring(OPENAI_PREFIX.length), {\n thinkingLevel: options?.thinkingLevel,\n });\n }\n\n const apiKey = getOpenAIApiKey();\n if (apiKey) {\n return openaiApiKeyProvider(bareModelId, apiKey);\n }\n\n return new ModelRouterLanguageModel(modelId);\n } else if (isGoogleModel) {\n const bareModelId = modelId.substring(GOOGLE_PREFIX.length);\n const apiKey = getGoogleApiKey();\n if (apiKey) {\n return new ModelRouterLanguageModel({\n providerId: 'google',\n modelId: bareModelId,\n apiKey,\n });\n }\n\n return new ModelRouterLanguageModel(modelId);\n } else {\n return new ModelRouterLanguageModel(modelId);\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<MastraCodeState> | 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 });\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 { 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) {\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, { remapForCodexOAuth: true });\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, { remapForCodexOAuth: true });\n}\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) {\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\n const observerPreviousObservationTokens = 1000;\n const cacheKey = `${obsThreshold}:${refThreshold}:${omScope}:${observerPreviousObservationTokens}`;\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 cachedMemory = new Memory({\n storage,\n options: {\n observationalMemory: {\n enabled: true,\n scope: omScope,\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 },\n reflection: {\n bufferActivation: isResourceScope ? undefined : 1 / 2,\n blockAfter: 1.1,\n model: getReflectorModel,\n observationTokens: refThreshold,\n },\n },\n },\n });\n cachedMemoryKey = cacheKey;\n\n return cachedMemory;\n };\n}\n","import { Agent } from '@mastra/core/agent';\nimport type { HarnessSubagent } from '@mastra/core/harness';\nimport { createTool } from '@mastra/core/tools';\nimport { createWorkspaceTools } from '@mastra/core/workspace';\nimport { z } from 'zod';\n\ntype ToolLike = Record<string, unknown>;\n\ninterface CreateScopedSubagentToolOptions {\n subagents: HarnessSubagent[];\n resolveModel: (modelId: string) => unknown;\n harnessTools?: Record<string, ToolLike>;\n fallbackModelId?: string;\n}\n\ninterface ApplyModeScopedSubagentGuardrailsOptions {\n harness: any;\n subagents: HarnessSubagent[];\n resolveModel: (modelId: string) => unknown;\n getAllowedSubagentIdsForMode: (modeId: string) => string[];\n}\n\nfunction buildSubagentMeta(\n modelId: string,\n durationMs: number,\n toolCalls: Array<{ name: string; isError?: boolean }>,\n): string {\n const tools = toolCalls.map(toolCall => `${toolCall.name}:${toolCall.isError ? 'err' : 'ok'}`).join(',');\n return `\\n<subagent-meta modelId=\"${modelId}\" durationMs=\"${durationMs}\" tools=\"${tools}\" />`;\n}\n\nexport function createScopedSubagentTool(opts: CreateScopedSubagentToolOptions) {\n const { subagents, resolveModel, harnessTools, fallbackModelId } = opts;\n const subagentIds = subagents.map(subagent => subagent.id);\n const typeDescriptions = subagents\n .map(subagent => `- **${subagent.id}** (${subagent.name}): ${subagent.description}`)\n .join('\\n');\n\n return createTool({\n id: 'subagent',\n description: `Delegate a focused task to a specialized subagent. The subagent runs independently with a constrained toolset, then returns its findings as text.\n\nAvailable agent types:\n${typeDescriptions}\n\nThe subagent runs in its own context - it does NOT see the parent conversation history. Write a clear, self-contained task description.\n\nUse this tool when:\n- You want to run multiple investigations in parallel\n- The task is self-contained and can be delegated`,\n inputSchema: z.object({\n agentType: z.enum(subagentIds as [string, ...string[]]).describe('Type of subagent to spawn'),\n task: z.string().describe(\n 'Clear, self-contained description of what the subagent should do. Include all relevant context - the subagent cannot see the parent conversation.',\n ),\n modelId: z.string().optional().describe('Optional model ID override for this task.'),\n }),\n execute: async ({ agentType, task, modelId }, context) => {\n const definition = subagents.find(subagent => subagent.id === agentType);\n if (!definition) {\n return {\n content: `Unknown agent type: ${agentType}. Valid types: ${subagentIds.join(', ')}`,\n isError: true,\n };\n }\n\n const harnessCtx = context?.requestContext?.get('harness') as\n | {\n emitEvent?: (event: Record<string, unknown>) => void;\n abortSignal?: AbortSignal;\n getSubagentModelId?: (params?: { agentType?: string }) => string | null;\n }\n | undefined;\n const emitEvent = harnessCtx?.emitEvent;\n const abortSignal = harnessCtx?.abortSignal;\n const toolCallId = context?.agent?.toolCallId ?? 'unknown';\n const mergedTools = { ...(definition.tools ?? {}) } as Record<string, ToolLike>;\n\n if (definition.allowedHarnessTools && harnessTools) {\n for (const toolId of definition.allowedHarnessTools) {\n if (harnessTools[toolId] && !mergedTools[toolId]) {\n mergedTools[toolId] = harnessTools[toolId]!;\n }\n }\n }\n\n const harnessModelId = harnessCtx?.getSubagentModelId?.({ agentType }) ?? undefined;\n const resolvedModelId = modelId ?? harnessModelId ?? definition.defaultModelId ?? fallbackModelId;\n if (!resolvedModelId) {\n return { content: 'No model ID available for subagent. Configure defaultModelId.', isError: true };\n }\n\n let model: unknown;\n try {\n model = resolveModel(resolvedModelId);\n } catch (error) {\n return {\n content: `Failed to resolve model \"${resolvedModelId}\": ${error instanceof Error ? error.message : String(error)}`,\n isError: true,\n };\n }\n\n const workspace = context?.workspace;\n const subagent = new Agent({\n id: `subagent-${definition.id}`,\n name: `${definition.name} Subagent`,\n instructions: definition.instructions,\n model: model as any,\n tools: mergedTools,\n workspace,\n });\n\n const allWorkspaceToolNames = workspace ? new Set(Object.keys(createWorkspaceTools(workspace as any))) : undefined;\n const allowedWorkspaceTools = definition.allowedWorkspaceTools\n ? new Set(definition.allowedWorkspaceTools)\n : undefined;\n const startTime = Date.now();\n emitEvent?.({\n type: 'subagent_start',\n toolCallId,\n agentType,\n task,\n modelId: resolvedModelId,\n });\n\n let partialText = '';\n const toolCallLog: Array<{ name: string; toolCallId?: string; isError?: boolean }> = [];\n\n try {\n const response = await subagent.stream(task, {\n maxSteps: definition.maxSteps ?? (definition.stopWhen ? undefined : 50),\n stopWhen: definition.stopWhen,\n abortSignal,\n requireToolApproval: false,\n requestContext: context?.requestContext,\n prepareStep:\n allowedWorkspaceTools && allWorkspaceToolNames\n ? ({ tools }) => ({\n activeTools: Object.keys(tools ?? {}).filter(toolName => {\n return !allWorkspaceToolNames.has(toolName) || allowedWorkspaceTools.has(toolName);\n }),\n })\n : undefined,\n });\n\n for await (const chunk of response.fullStream) {\n switch (chunk.type) {\n case 'text-delta':\n partialText += chunk.payload.text;\n emitEvent?.({\n type: 'subagent_text_delta',\n toolCallId,\n agentType,\n textDelta: chunk.payload.text,\n });\n break;\n case 'tool-call':\n toolCallLog.push({ name: chunk.payload.toolName, toolCallId: chunk.payload.toolCallId });\n emitEvent?.({\n type: 'subagent_tool_start',\n toolCallId,\n agentType,\n subToolName: chunk.payload.toolName,\n subToolArgs: chunk.payload.args,\n });\n break;\n case 'tool-result': {\n const isError = chunk.payload.isError ?? false;\n for (let index = toolCallLog.length - 1; index >= 0; index -= 1) {\n if (toolCallLog[index]!.toolCallId === chunk.payload.toolCallId && toolCallLog[index]!.isError === undefined) {\n toolCallLog[index]!.isError = isError;\n break;\n }\n }\n emitEvent?.({\n type: 'subagent_tool_end',\n toolCallId,\n agentType,\n subToolName: chunk.payload.toolName,\n subToolResult: chunk.payload.result,\n isError,\n });\n break;\n }\n }\n }\n\n if (abortSignal?.aborted) {\n const durationMs = Date.now() - startTime;\n const abortResult = partialText ? `[Aborted by user]\\n\\nPartial output:\\n${partialText}` : '[Aborted by user]';\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: abortResult, isError: false, durationMs });\n return { content: abortResult + buildSubagentMeta(resolvedModelId, durationMs, toolCallLog), isError: false };\n }\n\n const fullOutput = await response.getFullOutput();\n const resultText = fullOutput.text || partialText;\n const durationMs = Date.now() - startTime;\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: resultText, isError: false, durationMs });\n return { content: resultText + buildSubagentMeta(resolvedModelId, durationMs, toolCallLog), isError: false };\n } catch (error) {\n const isAbort = error instanceof Error && (\n error.name === 'AbortError'\n || error.message.includes('abort')\n || error.message.includes('cancel')\n );\n const durationMs = Date.now() - startTime;\n if (isAbort) {\n const abortResult = partialText ? `[Aborted by user]\\n\\nPartial output:\\n${partialText}` : '[Aborted by user]';\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: abortResult, isError: false, durationMs });\n return { content: abortResult + buildSubagentMeta(resolvedModelId, durationMs, toolCallLog), isError: false };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: message, isError: true, durationMs });\n return {\n content: `Subagent \"${definition.name}\" failed: ${message}${buildSubagentMeta(resolvedModelId, durationMs, toolCallLog)}`,\n isError: true,\n };\n }\n },\n });\n}\n\nexport function applyModeScopedSubagentGuardrails(\n opts: ApplyModeScopedSubagentGuardrailsOptions,\n): void {\n const originalBuildToolsets = opts.harness.buildToolsets.bind(opts.harness);\n\n opts.harness.buildToolsets = async (requestContext?: unknown) => {\n const toolsets = await originalBuildToolsets(requestContext) as {\n harnessBuiltIn?: Record<string, unknown>;\n harness?: Record<string, ToolLike>;\n };\n const builtInTools = toolsets.harnessBuiltIn;\n if (!builtInTools?.subagent) {\n return toolsets;\n }\n\n const currentModeId = opts.harness.getCurrentModeId();\n const allowedSubagentIds = new Set(opts.getAllowedSubagentIdsForMode(currentModeId));\n if (allowedSubagentIds.size === 0) {\n delete builtInTools.subagent;\n return toolsets;\n }\n\n const modeScopedSubagents = opts.subagents.filter(subagent => allowedSubagentIds.has(subagent.id));\n builtInTools.subagent = createScopedSubagentTool({\n subagents: modeScopedSubagents,\n resolveModel: opts.resolveModel,\n harnessTools: toolsets.harness,\n fallbackModelId: opts.harness.getCurrentMode().defaultModelId,\n });\n\n return toolsets;\n };\n}","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport type { HarnessRequestContext } from '@mastra/core/harness';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { HookManager } from '../hooks';\nimport type { McpManager } from '../mcp';\nimport type { MastraCodeState } from '../schema';\nimport { createWebSearchTool, createWebExtractTool, hasTavilyKey, requestSandboxAccessTool } from '../tools';\n\n/** Minimal shape for tools passed to createDynamicTools. */\ninterface ToolLike {\n execute?: (...args: any[]) => Promise<unknown> | unknown;\n}\n\nfunction wrapToolWithHooks(toolName: string, tool: ToolLike, hookManager?: HookManager): ToolLike {\n if (!hookManager || typeof tool?.execute !== 'function') {\n return tool;\n }\n\n return {\n ...tool,\n async execute(input: unknown, toolContext: unknown) {\n const preResult = await hookManager.runPreToolUse(toolName, input);\n if (!preResult.allowed) {\n return {\n error: preResult.blockReason ?? `Blocked by PreToolUse hook for tool \"${toolName}\"`,\n };\n }\n\n let output: unknown;\n let toolError = false;\n try {\n output = await tool.execute!(input, toolContext);\n return output;\n } catch (error) {\n toolError = true;\n output = {\n error: error instanceof Error ? error.message : String(error),\n };\n throw error;\n } finally {\n await hookManager.runPostToolUse(toolName, input, output, toolError).catch(() => undefined);\n }\n },\n };\n}\n\nexport function createDynamicTools(\n mcpManager?: McpManager,\n extraTools?: Record<string, ToolLike> | ((ctx: { requestContext: RequestContext }) => Record<string, ToolLike>),\n hookManager?: HookManager,\n disabledTools?: string[],\n) {\n return function getDynamicTools({ requestContext }: { requestContext: RequestContext }) {\n const ctx = requestContext.get('harness') as HarnessRequestContext<MastraCodeState> | undefined;\n const state = ctx?.getState?.();\n const modeId = ctx?.modeId ?? 'build';\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 (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 if (modeId === 'ask') {\n delete tools.request_access;\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 for (const [toolName, tool] of Object.entries(tools)) {\n tools[toolName] = wrapToolWithHooks(toolName, tool, hookManager);\n }\n\n return tools;\n };\n}\n","/**\n * Hook configuration loading from filesystem.\n * Loads from global (~/.ulicode/hooks.json) and project (.ulicode/hooks.json).\n * Falls back to temporary .uli-cli plus legacy .pulse and .mastracode paths.\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 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];\n\nexport function loadHooksConfig(projectDir: string): HooksConfig {\n const globalPath = getGlobalHooksPath();\n const projectPath = getProjectHooksPath(projectDir);\n\n const globalConfig = loadSingleConfig(\n globalPath,\n getLegacyUliCliGlobalHooksPath(),\n getLegacyPulseGlobalHooksPath(),\n getLegacyMastraGlobalHooksPath(),\n );\n const projectConfig = loadSingleConfig(\n projectPath,\n getLegacyUliCliProjectHooksPath(projectDir),\n getLegacyPulseProjectHooksPath(projectDir),\n getLegacyMastraProjectHooksPath(projectDir),\n );\n\n return mergeConfigs(globalConfig, projectConfig);\n}\n\nexport function getProjectHooksPath(projectDir: string): string {\n return path.join(projectDir, '.ulicode', 'hooks.json');\n}\n\nexport function getGlobalHooksPath(): string {\n return path.join(os.homedir(), '.ulicode', 'hooks.json');\n}\n\nfunction getLegacyUliCliProjectHooksPath(projectDir: string): string {\n return path.join(projectDir, '.uli-cli', 'hooks.json');\n}\n\nfunction getLegacyUliCliGlobalHooksPath(): string {\n return path.join(os.homedir(), '.uli-cli', 'hooks.json');\n}\n\nfunction getLegacyPulseProjectHooksPath(projectDir: string): string {\n return path.join(projectDir, '.pulse', 'hooks.json');\n}\n\nfunction getLegacyPulseGlobalHooksPath(): string {\n return path.join(os.homedir(), '.pulse', 'hooks.json');\n}\n\nfunction getLegacyMastraProjectHooksPath(projectDir: string): string {\n return path.join(projectDir, '.mastracode', 'hooks.json');\n}\n\nfunction getLegacyMastraGlobalHooksPath(): string {\n return path.join(os.homedir(), '.mastracode', 'hooks.json');\n}\n\nfunction loadSingleConfig(filePath: string, ...fallbackPaths: Array<string | undefined>): HooksConfig {\n try {\n const resolvedPath = [filePath, ...fallbackPaths].find(candidate => candidate && fs.existsSync(candidate)) ?? null;\n if (!resolvedPath) return {};\n const raw = fs.readFileSync(resolvedPath, '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 { logRuntimeProfile } from '../utils/debug-log.js';\nimport type { HookDefinition, HookStdin, HookResult, HookStdout, HookEventResult } from './types.js';\nimport { isBlockingEvent } from './types.js';\n\nconst DEFAULT_TIMEOUT = 10_000;\nconst FORCE_KILL_GRACE_MS = 250;\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 let forceKillTimer: ReturnType<typeof setTimeout> | undefined;\n\n const timer = setTimeout(() => {\n timedOut = true;\n try {\n child.kill('SIGTERM');\n } catch {\n // Ignore termination errors and fall back to force kill.\n }\n\n forceKillTimer = setTimeout(() => {\n try {\n child.kill('SIGKILL');\n } catch {\n // Ignore force-kill errors.\n }\n }, FORCE_KILL_GRACE_MS);\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 (forceKillTimer) clearTimeout(forceKillTimer);\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 const result = {\n hook,\n exitCode: exitCode ?? 1,\n stdout: parsedStdout,\n stderr: stderr.trim() || undefined,\n timedOut,\n durationMs: Date.now() - startTime,\n };\n logRuntimeProfile('hooks.execute', result.durationMs, {\n event: stdinPayload.hook_event_name,\n command: hook.command,\n timedOut,\n exitCode: result.exitCode,\n });\n resolve(result);\n });\n\n child.on('error', error => {\n clearTimeout(timer);\n if (forceKillTimer) clearTimeout(forceKillTimer);\n if (resolved) return;\n resolved = true;\n\n const result = {\n hook,\n exitCode: 1,\n stderr: error.message,\n timedOut: false,\n durationMs: Date.now() - startTime,\n };\n logRuntimeProfile('hooks.execute', result.durationMs, {\n event: stdinPayload.hook_event_name,\n command: hook.command,\n timedOut: false,\n exitCode: result.exitCode,\n error: error.message,\n });\n resolve(result);\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 if (!blocking) {\n const concurrentResults = await Promise.all(applicable.map(hook => executeHook(hook, stdinPayload)));\n for (const result of concurrentResults) {\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 ${result.hook.timeout ?? DEFAULT_TIMEOUT}ms: ${result.hook.command}`);\n continue;\n }\n\n if (result.exitCode === 0) continue;\n\n const warnMsg = result.stderr || `Hook exited with code ${result.exitCode}`;\n warnings.push(`${result.hook.description || result.hook.command}: ${warnMsg}`);\n }\n\n return { allowed: true, additionalContext, results, warnings };\n }\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 { 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\n constructor(projectDir: string, sessionId: string) {\n this.projectDir = projectDir;\n this.sessionId = sessionId;\n this.config = loadHooksConfig(projectDir);\n }\n\n reload(): void {\n this.config = loadHooksConfig(this.projectDir);\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),\n global: getGlobalHooksPath(),\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. ~/.ulicode/mcp.json (global)\n * 3. .ulicode/mcp.json (project — highest priority)\n * 4. temporary ~/.uli-cli/.uli-cli and legacy ~/.pulse/.mastracode fallbacks\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 type { McpConfig, McpServerConfig, McpSkippedServer } from './types.js';\n\nexport function loadMcpConfig(projectDir: string): McpConfig {\n const claudeConfig = loadClaudeSettings(projectDir);\n const globalConfig = loadSingleConfig(\n getGlobalMcpPath(),\n getLegacyUliCliGlobalMcpPath(),\n getLegacyPulseGlobalMcpPath(),\n getLegacyMastraGlobalMcpPath(),\n );\n const projectConfig = loadSingleConfig(\n getProjectMcpPath(projectDir),\n getLegacyUliCliProjectMcpPath(projectDir),\n getLegacyPulseProjectMcpPath(projectDir),\n getLegacyMastraProjectMcpPath(projectDir),\n );\n\n return mergeConfigs(claudeConfig, globalConfig, projectConfig);\n}\n\nexport function getProjectMcpPath(projectDir: string): string {\n return path.join(projectDir, '.ulicode', 'mcp.json');\n}\n\nexport function getGlobalMcpPath(): string {\n return path.join(os.homedir(), '.ulicode', 'mcp.json');\n}\n\nfunction getLegacyUliCliProjectMcpPath(projectDir: string): string {\n return path.join(projectDir, '.uli-cli', 'mcp.json');\n}\n\nfunction getLegacyUliCliGlobalMcpPath(): string {\n return path.join(os.homedir(), '.uli-cli', 'mcp.json');\n}\n\nfunction getLegacyPulseProjectMcpPath(projectDir: string): string {\n return path.join(projectDir, '.pulse', 'mcp.json');\n}\n\nfunction getLegacyPulseGlobalMcpPath(): string {\n return path.join(os.homedir(), '.pulse', 'mcp.json');\n}\n\nfunction getLegacyMastraProjectMcpPath(projectDir: string): string {\n return path.join(projectDir, '.mastracode', 'mcp.json');\n}\n\nfunction getLegacyMastraGlobalMcpPath(): string {\n return path.join(os.homedir(), '.mastracode', '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, ...fallbackPaths: Array<string | undefined>): McpConfig {\n try {\n const resolvedPath = [filePath, ...fallbackPaths].find(candidate => candidate && fs.existsSync(candidate)) ?? null;\n if (!resolvedPath) return {};\n const raw = fs.readFileSync(resolvedPath, '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 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 };\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\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 { MCPClient } from '@mastra/mcp';\nimport type { MastraMCPServerDefinition } from '@mastra/mcp';\nimport { loadMcpConfig, getProjectMcpPath, getGlobalMcpPath, getClaudeSettingsPath } from './config.js';\nimport type { McpConfig, McpHttpServerConfig, McpServerConfig, McpServerStatus, McpSkippedServer } from './types.js';\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 /** Disconnect all servers, reload config from disk, reconnect. */\n reload(): Promise<void>;\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}\n\nfunction getTransport(cfg: McpServerConfig): 'stdio' | 'http' {\n return 'url' in cfg ? 'http' : 'stdio';\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(projectDir: string, extraServers?: Record<string, McpServerConfig>): 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));\n let client: MCPClient | null = null;\n let tools: Record<string, any> = {};\n let serverStatuses = new Map<string, McpServerStatus>();\n let initialized = false;\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 };\n } else {\n defs[name] = { command: cfg.command, args: cfg.args, env: cfg.env };\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 client = new MCPClient({\n id: 'mastra-code-mcp',\n servers: buildServerDefs(servers),\n });\n\n // MCPClient.listTools() uses Promise.all internally — a single server\n // failure throws for all. We call it once wrapped in try/catch and\n // derive per-server status from tool name prefixes (serverName_toolName).\n const serverNames = Object.keys(servers);\n\n try {\n tools = await client.listTools();\n\n for (const name of serverNames) {\n const prefix = `${name}_`;\n const serverToolNames = Object.keys(tools).filter(t => t.startsWith(prefix));\n serverStatuses.set(name, {\n name,\n connected: true,\n toolCount: serverToolNames.length,\n toolNames: serverToolNames,\n transport: getTransport(servers[name]!),\n });\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 reload() {\n await disconnect();\n config = applyExtraServers(loadMcpConfig(projectDir));\n tools = {};\n serverStatuses = new Map();\n initialized = false;\n await connectAndCollectTools();\n initialized = true;\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),\n global: getGlobalMcpPath(),\n claude: getClaudeSettingsPath(projectDir),\n };\n },\n\n getConfig() {\n return config;\n },\n };\n}\n","import { z } from 'zod';\nimport { DEFAULT_OM_MODEL_ID } from './constants';\n\nexport const stateSchema = z.object({\n projectPath: z.string().optional(),\n projectName: z.string().optional(),\n gitBranch: z.string().optional(),\n lastCommand: z.string().optional(),\n currentModelId: z.string().default(''),\n // Subagent model settings (per-thread/per-mode)\n subagentModelId: z.string().optional(), // Thread-level default for subagents\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 // 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 (persisted per-thread)\n tasks: z\n .array(\n z.object({\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});\n\nexport type MastraCodeState = z.infer<typeof stateSchema>;\n","/**\n * Gateway sync utility for keeping the model registry up to date.\n * Periodically fetches provider data from gateways and updates the global cache.\n */\n\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { ModelsDevGateway, NetlifyGateway } from '@mastra/core/llm';\nimport type { ProviderConfig } from '@mastra/core/llm';\n\n// Cache paths (same as Mastra uses)\nconst CACHE_DIR = path.join(os.homedir(), '.cache', 'mastra');\nconst CACHE_FILE = path.join(CACHE_DIR, 'gateway-refresh-time');\nconst GLOBAL_PROVIDER_REGISTRY_JSON = path.join(CACHE_DIR, 'provider-registry.json');\nconst GLOBAL_PROVIDER_TYPES_DTS = path.join(CACHE_DIR, 'provider-types.generated.d.ts');\n\n// Default sync interval: 5 minutes\nconst DEFAULT_SYNC_INTERVAL_MS = 5 * 60 * 1000;\n\nlet syncInterval: NodeJS.Timeout | null = null;\nlet isSyncing = false;\n\n/**\n * Atomic file write to prevent corruption from concurrent writes\n */\nasync function atomicWriteFile(filePath: string, content: string): Promise<void> {\n const randomSuffix = Math.random().toString(36).substring(2, 15);\n const tempPath = `${filePath}.${process.pid}.${Date.now()}.${randomSuffix}.tmp`;\n\n try {\n await fs.promises.writeFile(tempPath, content, 'utf-8');\n await fs.promises.rename(tempPath, filePath);\n } catch (error) {\n try {\n await fs.promises.unlink(tempPath);\n } catch {\n // Ignore cleanup errors\n }\n throw error;\n }\n}\n\n/**\n * Fetch providers from all gateways\n */\nasync function fetchProvidersFromGateways(): Promise<{\n providers: Record<string, ProviderConfig>;\n models: Record<string, string[]>;\n}> {\n const allProviders: Record<string, ProviderConfig> = {};\n const allModels: Record<string, string[]> = {};\n\n const gateways = [new ModelsDevGateway({}), new NetlifyGateway()];\n\n for (const gateway of gateways) {\n try {\n const providers = await gateway.fetchProviders();\n\n // models.dev is a provider registry, not a true gateway - don't prefix its providers\n const isProviderRegistry = gateway.id === 'models.dev';\n\n for (const [providerId, config] of Object.entries(providers)) {\n const typeProviderId = isProviderRegistry\n ? providerId\n : providerId === gateway.id\n ? gateway.id\n : `${gateway.id}/${providerId}`;\n\n allProviders[typeProviderId] = config;\n allModels[typeProviderId] = config.models.sort();\n }\n } catch (error) {\n console.warn(`[GatewaySync] Failed to fetch from ${gateway.id}:`, error);\n }\n }\n\n return { providers: allProviders, models: allModels };\n}\n\n/**\n * Generate TypeScript type definitions content\n */\nfunction generateTypesContent(models: Record<string, string[]>): string {\n const providerModelsEntries = Object.entries(models)\n .map(([provider, modelList]) => {\n const modelsList = modelList.map(m => `'${m}'`);\n const needsQuotes = /[^a-zA-Z0-9_$]/.test(provider);\n const providerKey = needsQuotes ? `'${provider}'` : provider;\n const singleLine = ` readonly ${providerKey}: readonly [${modelsList.join(', ')}];`;\n\n if (singleLine.length > 120) {\n const formattedModels = modelList.map(m => ` '${m}',`).join('\\n');\n return ` readonly ${providerKey}: readonly [\\n${formattedModels}\\n ];`;\n }\n\n return singleLine;\n })\n .join('\\n');\n\n return `/**\n * THIS FILE IS AUTO-GENERATED - DO NOT EDIT\n * Generated from model gateway providers\n */\n\nexport type ProviderModelsMap = {\n${providerModelsEntries}\n};\n\nexport type Provider = keyof ProviderModelsMap;\n\nexport interface ProviderModels {\n [key: string]: string[];\n}\n\nexport type ModelRouterModelId =\n | {\n [P in Provider]: \\`\\${P}/\\${ProviderModelsMap[P][number]}\\`;\n }[Provider]\n | (string & {});\n\nexport type ModelForProvider<P extends Provider> = ProviderModelsMap[P][number];\n`;\n}\n\n/**\n * Get the last sync time from disk\n */\nfunction getLastSyncTime(): Date | null {\n try {\n if (!fs.existsSync(CACHE_FILE)) {\n return null;\n }\n const timestamp = fs.readFileSync(CACHE_FILE, 'utf-8').trim();\n return new Date(parseInt(timestamp, 10));\n } catch {\n return null;\n }\n}\n\n/**\n * Save the last sync time to disk\n */\nfunction saveLastSyncTime(date: Date): void {\n try {\n if (!fs.existsSync(CACHE_DIR)) {\n fs.mkdirSync(CACHE_DIR, { recursive: true });\n }\n fs.writeFileSync(CACHE_FILE, date.getTime().toString(), 'utf-8');\n } catch (error) {\n console.warn('[GatewaySync] Failed to save sync time:', error);\n }\n}\n\n/**\n * Sync gateways and update the global cache\n */\nexport async function syncGateways(force = false): Promise<void> {\n if (isSyncing && !force) {\n return;\n }\n\n // Check if we synced recently (within the last 5 minutes)\n if (!force) {\n const lastSync = getLastSyncTime();\n if (lastSync) {\n const timeSinceSync = Date.now() - lastSync.getTime();\n if (timeSinceSync < DEFAULT_SYNC_INTERVAL_MS) {\n // console.debug(`[GatewaySync] Skipping sync, last sync was ${Math.round(timeSinceSync / 1000)}s ago`)\n return;\n }\n }\n }\n\n isSyncing = true;\n\n try {\n // console.debug(\"[GatewaySync] Starting gateway sync...\")\n\n const { providers, models } = await fetchProvidersFromGateways();\n\n // Ensure cache directory exists\n await fs.promises.mkdir(CACHE_DIR, { recursive: true });\n\n // Write registry JSON\n const registryData = {\n providers,\n models,\n version: '1.0.0',\n };\n await atomicWriteFile(GLOBAL_PROVIDER_REGISTRY_JSON, JSON.stringify(registryData, null, 2));\n\n // Write types file\n const typesContent = generateTypesContent(models);\n await atomicWriteFile(GLOBAL_PROVIDER_TYPES_DTS, typesContent);\n\n // Save sync time\n const now = new Date();\n saveLastSyncTime(now);\n\n // console.debug(`[GatewaySync] ✅ Sync completed at ${now.toISOString()}`)\n } catch (error) {\n console.error('[GatewaySync] ❌ Sync failed:', error);\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\n syncGateways().catch(console.error);\n\n // Set up periodic sync\n syncInterval = setInterval(() => {\n syncGateways().catch(console.error);\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","/**\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 { LibSQLStore } from '@mastra/libsql';\nimport { PostgresStore } from '@mastra/pg';\n\nimport type { StorageConfig, PgStorageConfig } from './project.js';\nimport { getDatabasePath } from './project.js';\n\nexport interface StorageResult {\n storage: MastraCompositeStore;\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 });\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 }),\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 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 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 };\n}\n","import { Agent } from '@mastra/core/agent';\nimport { Harness } from '@mastra/core/harness';\nimport type {\n CustomAvailableModel,\n HeartbeatHandler,\n HarnessConfig,\n HarnessMode,\n HarnessSubagent,\n} from '@mastra/core/harness';\nimport { PROVIDER_REGISTRY } from '@mastra/core/llm';\nimport type { ProviderConfig } from '@mastra/core/llm';\nimport type { RequestContext } from '@mastra/core/request-context';\n\nimport {\n createHarnessModesFromDefinitions,\n createHarnessSubagentsFromDefinitions,\n getAllowedSubagentIdsForMode,\n getSubagentModeMap,\n loadAgentDefinitionsCached,\n} from './agents/agent-definitions.js';\nimport { getDynamicInstructions } from './agents/instructions.js';\nimport { getDynamicMemory } from './agents/memory.js';\nimport { getDynamicModel, resolveModel } from './agents/model.js';\nimport { applyModeScopedSubagentGuardrails } from './agents/subagent-tool.js';\nimport { createDynamicTools } from './agents/tools.js';\n\nimport { getDynamicWorkspace } from './agents/workspace.js';\nimport { AuthStorage } from './auth/storage.js';\nimport { HookManager } from './hooks/index.js';\nimport { lspManager } from './lsp/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 getCustomProviderId,\n loadSettingsCached,\n resolveModelDefaults,\n resolveOmModel,\n saveSettings,\n toCustomProviderModelId,\n} from './onboarding/settings.js';\nimport { getToolCategory } from './permissions.js';\nimport { setAuthStorage } from './providers/claude-max.js';\nimport { setAuthStorage as setOpenAIAuthStorage } from './providers/openai-codex.js';\n\nimport { stateSchema } from './schema.js';\nimport type { MastraCodeState } from './schema.js';\n\nimport { syncGateways } from './utils/gateway-sync.js';\nimport { detectProject, getStorageConfig, getResourceIdOverride } from './utils/project.js';\nimport type { StorageConfig } from './utils/project.js';\nimport { createStorage } from './utils/storage-factory.js';\nimport { acquireThreadLock, releaseThreadLock } from './utils/thread-lock.js';\n\nconst PROVIDER_TO_OAUTH_ID: Record<string, string> = {\n anthropic: 'anthropic',\n openai: 'openai-codex',\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<MastraCodeState>[];\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 /** Initial state overrides (yolo, thinkingLevel, etc.) */\n initialState?: Record<string, unknown>;\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 /** 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\nexport function createAuthStorage() {\n const authStorage = new AuthStorage();\n setAuthStorage(authStorage);\n setOpenAIAuthStorage(authStorage);\n return authStorage;\n}\n\nexport async function createMastraCode(config?: MastraCodeConfig) {\n const cwd = config?.cwd ?? process.cwd();\n\n // Auth storage (shared with Claude Max / OpenAI providers and Harness)\n const authStorage = createAuthStorage();\n\n // Project detection\n const project = detectProject(cwd);\n\n const resourceIdOverride = getResourceIdOverride(project.rootPath);\n if (resourceIdOverride) {\n project.resourceId = resourceIdOverride;\n project.resourceIdOverride = true;\n }\n\n lspManager.prewarmWorkspace(project.rootPath);\n\n // Load global settings to resolve storage preferences (needed before storage creation)\n const globalSettings = loadSettingsCached();\n\n // Storage\n const storageConfig = config?.storage ?? getStorageConfig(project.rootPath, globalSettings.storage);\n const storageResult = await createStorage(storageConfig);\n const storage = storageResult.storage;\n const storageWarning = storageResult.warning;\n\n const memory = getDynamicMemory(storage);\n\n // MCP\n const mcpManager = config?.disableMcp ? undefined : createMcpManager(project.rootPath, config?.mcpServers);\n\n // Hooks\n const hookManager = config?.disableHooks ? undefined : new HookManager(project.rootPath, 'session-init');\n\n if (hookManager?.hasHooks()) {\n const hookConfig = hookManager.getConfig();\n const hookCount = Object.values(hookConfig).reduce((sum, hooks) => sum + (hooks?.length ?? 0), 0);\n console.info(`Hooks: ${hookCount} hook(s) configured`);\n }\n\n // Agent\n const codeAgent = new Agent({\n id: 'code-agent',\n name: 'Code Agent',\n instructions: getDynamicInstructions,\n model: getDynamicModel,\n tools: createDynamicTools(mcpManager, config?.extraTools, hookManager, config?.disabledTools),\n });\n\n const agentRegistry = loadAgentDefinitionsCached(project.rootPath);\n const defaultSubagents = createHarnessSubagentsFromDefinitions(agentRegistry);\n const defaultModes: HarnessMode<MastraCodeState>[] = createHarnessModesFromDefinitions(agentRegistry, codeAgent);\n\n const defaultHeartbeatHandlers: HeartbeatHandler[] = [\n {\n id: 'gateway-sync',\n intervalMs: 5 * 60 * 1000,\n handler: () => syncGateways(),\n },\n ];\n\n // Build lightweight provider access for resolving built-in packs at startup.\n // Anthropic/OpenAI use AuthStorage only; other providers use env API keys.\n // Also scan the full provider registry so configured env API keys satisfy access checks.\n const anthropicCred = authStorage.get('anthropic');\n const openaiCred = authStorage.get('openai-codex');\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 google:\n authStorage.get('google')?.type === 'api_key' && (authStorage.get('google') as { key?: string }).key?.trim().length\n ? 'apikey'\n : process.env.GOOGLE_GENERATIVE_AI_API_KEY\n ? 'apikey'\n : false,\n cerebras: process.env.CEREBRAS_API_KEY ? 'apikey' : false,\n deepseek: process.env.DEEPSEEK_API_KEY ? 'apikey' : false,\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]) continue;\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, [], agentRegistry.modes);\n const builtinOmPacks = getAvailableOmPacks(startupAccess);\n const effectiveDefaults = resolveModelDefaults(globalSettings, builtinPacks);\n const effectiveOmModel = resolveOmModel(globalSettings, builtinOmPacks);\n\n // Apply resolved model defaults to modes\n const modes = (config?.modes ?? defaultModes).map(mode => {\n const savedModel = effectiveDefaults[mode.id];\n return savedModel ? { ...mode, defaultModelId: savedModel } : mode;\n });\n\n // Map subagent types to mode models: explore→fast, plan→plan, execute→build\n const subagentModeMap = getSubagentModeMap(agentRegistry);\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 = (config?.subagents ?? defaultSubagents).map(sa => {\n const modeId = subagentModeMap[sa.id];\n const model = modeId ? effectiveDefaults[modeId] : undefined;\n let filtered = sa;\n if (config?.disabledTools?.length) {\n if (sa.allowedWorkspaceTools) {\n filtered = {\n ...filtered,\n allowedWorkspaceTools: sa.allowedWorkspaceTools.filter(t => !config.disabledTools!.includes(t)),\n };\n }\n if (sa.tools) {\n filtered = {\n ...filtered,\n tools: Object.fromEntries(Object.entries(sa.tools).filter(([k]) => !config.disabledTools!.includes(k))),\n };\n }\n }\n return model ? { ...filtered, defaultModelId: model } : filtered;\n });\n\n // Build initial state with global preferences\n const globalInitialState: Record<string, unknown> = {};\n if (effectiveOmModel) {\n globalInitialState.observerModelId = effectiveOmModel;\n globalInitialState.reflectorModelId = effectiveOmModel;\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') {\n globalInitialState.subagentModelId = modelId;\n } else {\n globalInitialState[`subagentModelId_${key}`] = modelId;\n }\n }\n const harness = new Harness<any>({\n id: 'mastra-code',\n resourceId: project.resourceId,\n storage,\n memory,\n stateSchema,\n subagents,\n resolveModel: modelId => resolveModel(modelId) as any,\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 } as any,\n workspace: config?.workspace ?? getDynamicWorkspace,\n modes,\n heartbeatHandlers: config?.heartbeatHandlers ?? defaultHeartbeatHandlers,\n modelAuthChecker: provider => {\n const oauthId = PROVIDER_TO_OAUTH_ID[provider];\n if (oauthId && authStorage.isLoggedIn(oauthId)) {\n return true;\n }\n if (provider === 'anthropic') {\n const cred = authStorage.get('anthropic');\n if (cred?.type === 'api_key' && cred.key.trim().length > 0) {\n return true;\n }\n }\n if (provider === 'openai') {\n const cred = authStorage.get('openai-codex');\n if (cred?.type === 'api_key' && cred.key.trim().length > 0) {\n return true;\n }\n }\n if (provider === 'google') {\n const cred = authStorage.get('google');\n if (cred?.type === 'api_key' && cred.key.trim().length > 0) {\n return true;\n }\n }\n\n const customProvider = loadSettingsCached().customProviders.find(entry => {\n return provider === getCustomProviderId(entry.name);\n });\n if (customProvider) {\n return true;\n }\n return undefined;\n },\n modelUseCountProvider: () => loadSettingsCached().modelUseCounts,\n modelUseCountTracker: modelId => {\n try {\n const settings = loadSettingsCached();\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 customModelCatalogProvider: () => {\n const settings = loadSettingsCached();\n const customModels: CustomAvailableModel[] = [];\n for (const provider of settings.customProviders) {\n const providerId = getCustomProviderId(provider.name);\n for (const modelName of provider.models) {\n customModels.push({\n id: toCustomProviderModelId(provider.name, modelName),\n provider: providerId,\n modelName,\n hasApiKey: true,\n apiKeyEnvVar: undefined,\n });\n }\n }\n return customModels;\n },\n threadLock: {\n acquire: acquireThreadLock,\n release: releaseThreadLock,\n },\n });\n\n applyModeScopedSubagentGuardrails({\n harness,\n subagents,\n resolveModel: modelId => resolveModel(modelId) as any,\n getAllowedSubagentIdsForMode: modeId => getAllowedSubagentIdsForMode(agentRegistry, modeId),\n });\n\n // Sync hookManager session ID on thread changes\n if (hookManager) {\n harness.subscribe(event => {\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 return { harness, mcpManager, hookManager, authStorage, resolveModel, storageWarning };\n}\n"]}
1
+ {"version":3,"sources":["../src/agents/prompts/base.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/tool-guidance.ts","../src/agents/prompts/index.ts","../src/agents/instructions.ts","../src/constants.ts","../src/providers/claude-max.ts","../src/providers/openai-codex.ts","../src/agents/model.ts","../src/agents/memory.ts","../src/agents/subagent-tool.ts","../src/agents/tools.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/storage-factory.ts","../src/index.ts"],"names":["Tiktoken","o200k_base","tavily","createTool","z","path","os","fs","logRuntimeProfile","existsSync","join","TOOL_NAME_OVERRIDES","loadSettingsCached","dirname","fileURLToPath","workspace","Workspace","LocalFilesystem","LocalSandbox","path2","os2","path3","resolve","homedir","readFileSync","MC_TOOLS","getModeDefinition","getCurrentGitBranch","AuthStorage","anthropic","createAnthropic","wrapLanguageModel","authStorage","authStorageInstance","getAuthStorage","setAuthStorage","openai","createOpenAI","getCustomProviderId","ModelRouterLanguageModel","getOmScope","Memory","resolveModel","subagent","Agent","createWorkspaceTools","durationMs","path4","os3","fs2","spawn","loadSingleConfig","mergeConfigs","path5","os4","fs3","validateConfig","MCPClient","ModelsDevGateway","NetlifyGateway","LibSQLStore","getDatabasePath","PostgresStore","detectProject","getResourceIdOverride","lspManager","getStorageConfig","loadAgentDefinitionsCached","createHarnessSubagentsFromDefinitions","createHarnessModesFromDefinitions","PROVIDER_REGISTRY","config","getAvailableModePacks","getAvailableOmPacks","resolveModelDefaults","resolveOmModel","getSubagentModeMap","harness","Harness","getToolCategory","saveSettings","toCustomProviderModelId","acquireThreadLock","releaseThreadLock","getAllowedSubagentIdsForMode"],"mappings":"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","file":"chunk-RQBOKG6N.cjs","sourcesContent":["/**\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 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 return `You are Ulicode, 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}\nDate: ${ctx.date}\nCurrent mode: ${ctx.mode}\n\n# Tone and Style\n- Your output is displayed on a command line interface. Keep responses concise.\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, etc.). Use text for communication — talk to the user in text, not via tools, except for communication tools like \\`submit_plan\\`, \\`ask_user\\`, and \\`task_write\\`.\n- Prioritize technical accuracy over validating the user's beliefs. Be direct and objective. Respectful correction is more valuable than false agreement.\n\n${ctx.toolGuidance}\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## Work Incrementally\n- Focus on ONE thing at a time. Complete it fully before moving to the next.\n- Leave the codebase in a clean state after each change — no half-implemented features.\n- For multi-step tasks, use tasks to track progress and ensure nothing is missed.\n\n## Verify Before Moving On\n- After each change, verify it works. Don't assume — actually test it.\n- Run the relevant tests, check for type errors, or manually verify the behavior.\n- If something breaks, fix it immediately. Don't pile more changes on top of broken code.\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 commit or push unless the user explicitly asks.\n- NEVER force push to \\`main\\` or \\`master\\` without warning 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: Ulicode${ctx.modelId ? ` (${ctx.modelId})` : ''} <noreply@ulicode.local>\\` in the message body.\n\n## Pull Requests\nUse \\`gh pr create\\`. Include a summary of what changed and a test plan.\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. Exception: the **audit-tests** subagent may be used on its own.\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# 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- If you're unsure about something, ask the user rather than guessing.\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, tell the user to run the \\`/sandbox\\` command to add the external directory to the allowed paths for this thread. Once they do, you will be able to access it.\n`;\n}\n","import { Tiktoken } from 'js-tiktoken/lite';\nimport o200k_base from 'js-tiktoken/ranks/o200k_base';\n\nconst enc = new Tiktoken(o200k_base);\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}\nexport function tokenEstimate(text: string | object): number {\n return enc.encode(sanitizeInput(text), `all`).length;\n}\n\nexport function truncateStringForTokenEstimate(text: string, desiredTokenCount: number, fromEnd = true) {\n const tokens = enc.encode(sanitizeInput(text));\n\n if (tokens.length <= desiredTokenCount) return text;\n\n return `[Truncated ${tokens.length - desiredTokenCount} tokens]\n${enc.decode(tokens.slice(fromEnd ? -desiredTokenCount : 0, fromEnd ? undefined : desiredTokenCount))}`;\n}\n","import { createTool } from '@mastra/core/tools';\nimport { tavily } from '@tavily/core';\nimport { z } from 'zod';\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// Lazily cached Tavily client — created on first use when the API key is available.\nlet cachedTavilyClient: ReturnType<typeof tavily> | null = null;\n\nfunction getTavilyClient() {\n if (cachedTavilyClient) return cachedTavilyClient;\n const apiKey = process.env.TAVILY_API_KEY;\n if (!apiKey) return null;\n cachedTavilyClient = tavily({ apiKey });\n return cachedTavilyClient;\n}\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\nexport function createWebSearchTool() {\n return createTool({\n id: 'web-search',\n description:\n 'Search the web for information. Use this to find documentation, look up error messages, check package APIs, or research any topic. Returns relevant web results with content snippets and optionally images.',\n inputSchema: z.object({\n query: z.string().describe('The search query'),\n searchDepth: z\n .enum(['basic', 'advanced'])\n .optional()\n .default('basic')\n .describe(\"Search depth - 'basic' for quick searches, 'advanced' for more thorough results\"),\n maxResults: z.number().optional().default(10).describe('Maximum number of results to return'),\n includeImages: z.boolean().optional().default(false).describe('Whether to include related images in results'),\n }),\n execute: async context => {\n const tavilyClient = getTavilyClient();\n if (!tavilyClient) {\n return 'No results (TAVILY_API_KEY not configured)';\n }\n try {\n const response = await tavilyClient.search(context.query, {\n searchDepth: context.searchDepth || 'basic',\n maxResults: context.maxResults || 10,\n includeAnswer: true,\n includeImages: context.includeImages || false,\n });\n\n const filteredResults = response.results.filter(r => (r.score ?? 1) >= MIN_RELEVANCE_SCORE);\n\n const parts: string[] = [];\n\n if (response.answer) {\n parts.push(`Answer: ${response.answer}`);\n }\n\n for (const r of filteredResults) {\n parts.push(`## ${r.title}\\n${r.url}\\n${r.content}`);\n }\n\n const images = (response.images || [])\n .map((img: { url?: string } | string) => (typeof img === 'string' ? img : img.url || ''))\n .filter(Boolean);\n\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 } catch {\n return 'No results';\n }\n },\n });\n}\n\nexport function createWebExtractTool() {\n return createTool({\n id: 'web-extract',\n description:\n 'Extract content from one or more URLs. Use this to read web pages, documentation, articles, or any URL. Returns the raw content in markdown format. You can provide up to 20 URLs at once.',\n inputSchema: z.object({\n urls: z.array(z.string()).min(1).max(20).describe('URLs to extract content from (max 20)'),\n extractDepth: z\n .enum(['basic', 'advanced'])\n .optional()\n .default('basic')\n .describe(\"Extraction depth - 'basic' for simple text, 'advanced' for JS-rendered pages\"),\n includeImages: z.boolean().optional().default(false).describe('Whether to include extracted image URLs'),\n }),\n execute: async context => {\n const tavilyClient = getTavilyClient();\n if (!tavilyClient) {\n return 'Extraction failed (TAVILY_API_KEY not configured)';\n }\n try {\n const response = await tavilyClient.extract(context.urls, {\n extractDepth: context.extractDepth || 'basic',\n includeImages: context.includeImages || false,\n });\n\n const parts: string[] = [];\n\n for (const r of (response.results || []) as { url: string; rawContent: string }[]) {\n parts.push(`## ${r.url}\\n${r.rawContent}`);\n }\n\n for (const r of (response.failedResults || []) as { url: string; error: string }[]) {\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 } catch (error) {\n return `Extraction failed: ${String(error)}`;\n }\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 } from '@mastra/core/workspace';\nimport { loadSettingsCached } from '../onboarding/settings.js';\nimport type { MastraCodeState } from '../schema';\nimport { TOOL_NAME_OVERRIDES } from '../tool-names.js';\nimport { logRuntimeProfile } from '../utils/debug-log.js';\n\n// =============================================================================\n// Create Workspace with Skills\n// =============================================================================\n\n// We support multiple skill locations for compatibility:\n// 1. Project-local: .ulicode/skills (project-specific Ulicode skills)\n// 2. Project-local: .uli-cli/skills (temporary compatibility path)\n// 3. Project-local: .pulse/skills (legacy project skills)\n// 4. Project-local: .mastracode/skills (legacy project skills)\n// 5. Project-local: .claude/skills (Claude Code compatible skills)\n// 6. Global: ~/.ulicode/skills (user-wide Ulicode skills)\n// 7. Global: ~/.uli-cli/skills (temporary compatibility path)\n// 8. Global: ~/.pulse/skills (legacy global skills)\n// 9. Global: ~/.mastracode/skills (legacy global skills)\n// 10. Global: ~/.claude/skills (user-wide Claude Code skills)\n\nconst ulicodeLocalSkillsPath = path.join(process.cwd(), '.ulicode', 'skills');\n\nconst uliLocalSkillsPath = path.join(process.cwd(), '.uli-cli', 'skills');\n\nconst pulseLocalSkillsPath = path.join(process.cwd(), '.pulse', 'skills');\n\nconst mastraCodeLocalSkillsPath = path.join(process.cwd(), '.mastracode', 'skills');\n\nconst claudeLocalSkillsPath = path.join(process.cwd(), '.claude', 'skills');\n\nconst ulicodeGlobalSkillsPath = path.join(os.homedir(), '.ulicode', 'skills');\n\nconst uliGlobalSkillsPath = path.join(os.homedir(), '.uli-cli', 'skills');\n\nconst pulseGlobalSkillsPath = path.join(os.homedir(), '.pulse', 'skills');\n\nconst mastraCodeGlobalSkillsPath = path.join(os.homedir(), '.mastracode', 'skills');\n\nconst claudeGlobalSkillsPath = path.join(os.homedir(), '.claude', '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 if (!fs.existsSync(skillsDir)) continue;\n\n // Always add the directory itself\n const resolved = fs.realpathSync(skillsDir);\n if (!seen.has(resolved)) {\n seen.add(resolved);\n paths.push(skillsDir);\n }\n\n // Check for symlinked skill subdirectories and add their real parents\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 // Add the real parent directory as a skill path\n // so Mastra discovers it as a regular directory\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\nlet skillPathsCache: string[] | null = null;\nlet skillPathsLogged = false;\n\nexport function getSkillPaths(): string[] {\n if (skillPathsCache) {\n return [...skillPathsCache];\n }\n\n const startTime = performance.now();\n skillPathsCache = collectSkillPaths([\n ulicodeLocalSkillsPath,\n uliLocalSkillsPath,\n pulseLocalSkillsPath,\n mastraCodeLocalSkillsPath,\n claudeLocalSkillsPath,\n ulicodeGlobalSkillsPath,\n uliGlobalSkillsPath,\n pulseGlobalSkillsPath,\n mastraCodeGlobalSkillsPath,\n claudeGlobalSkillsPath,\n ]);\n\n logRuntimeProfile('workspace.skill_path_scan', performance.now() - startTime, {\n count: skillPathsCache.length,\n });\n\n if (!skillPathsLogged && skillPathsCache.length > 0) {\n console.info(`Skills loaded from:`);\n for (const p of skillPathsCache) {\n console.info(` - ${p}`);\n }\n skillPathsLogged = true;\n }\n\n return [...skillPathsCache];\n}\n\nexport function invalidateSkillPathsCache(): void {\n skillPathsCache = null;\n skillPathsLogged = false;\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 workspaceId = `${WORKSPACE_ID_PREFIX}-${projectPath}`;\n const sandboxPaths = state?.sandboxAllowedPaths ?? [];\n const skillPaths = getSkillPaths();\n const allowedPaths = [...skillPaths, ...sandboxPaths.map((p: string) => path.resolve(p))];\n const isPlanMode = modeId === 'plan';\n const isAskMode = modeId === 'ask';\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 askModeTools = {\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 mastra_workspace_delete: { ...TOOL_NAME_OVERRIDES.mastra_workspace_delete, enabled: false },\n mastra_workspace_mkdir: { ...TOOL_NAME_OVERRIDES.mastra_workspace_mkdir, enabled: false },\n mastra_workspace_execute_command: { ...TOOL_NAME_OVERRIDES.mastra_workspace_execute_command, enabled: false },\n mastra_workspace_get_process_output: { ...TOOL_NAME_OVERRIDES.mastra_workspace_get_process_output, enabled: false },\n mastra_workspace_kill_process: { ...TOOL_NAME_OVERRIDES.mastra_workspace_kill_process, enabled: false },\n };\n\n const toolsConfig = isAskMode\n ? { ...TOOL_NAME_OVERRIDES, ...askModeTools }\n : isPlanMode\n ? { ...TOOL_NAME_OVERRIDES, ...planModeTools }\n : TOOL_NAME_OVERRIDES;\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(toolsConfig);\n return existing;\n }\n\n const userLsp = loadSettingsCached().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 const startTime = performance.now();\n const workspace = new Workspace({\n id: workspaceId,\n name: 'Ulicode Workspace',\n filesystem: new LocalFilesystem({\n basePath: projectPath,\n allowedPaths,\n }),\n sandbox: new LocalSandbox({\n workingDirectory: projectPath,\n env: {\n ...process.env,\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 tools: toolsConfig,\n ...(skillPaths.length > 0 ? { skills: skillPaths } : {}),\n lsp: lspConfig,\n });\n logRuntimeProfile('workspace.create', performance.now() - startTime, {\n workspaceId,\n modeId,\n skillPathCount: skillPaths.length,\n });\n return workspace;\n}\n","import * as path from 'node:path';\nimport { getSkillPaths } from '../agents/workspace.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 at startup) with user-approved sandbox paths\n * from harness state so that both parent and subagent tools have the same access.\n * Returns 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 skillPaths = getSkillPaths();\n if (!toolContext?.requestContext) {\n return [...skillPaths];\n }\n const harnessCtx = toolContext.requestContext.get('harness') as\n | {\n state?: { sandboxAllowedPaths?: string[] };\n getState?: () => { sandboxAllowedPaths?: string[] };\n }\n | undefined;\n const sandboxPaths = harnessCtx?.getState?.()?.sandboxAllowedPaths ?? harnessCtx?.state?.sandboxAllowedPaths ?? [];\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 { isPathAllowed, getAllowedPathsFromContext } from './utils.js';\n\nfunction expandTilde(p: string): string {\n if (p === '~') return os.homedir();\n if (p.startsWith('~/') || p.startsWith('~\\\\')) {\n return `${os.homedir()}/${p.slice(2).replace(/\\\\/g, '/')}`;\n }\n return p;\n}\n\nfunction formatPathForMessage(requestedPath: string, resolvedPath: string): string {\n if (requestedPath.startsWith('~/') || requestedPath.startsWith('~\\\\')) {\n return `${os.homedir()}/${requestedPath.slice(2).replace(/\\\\/g, '/')}`;\n }\n\n if (requestedPath === '~') {\n return os.homedir();\n }\n\n return resolvedPath;\n}\n\nlet requestCounter = 0;\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: 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 execute: async ({ path: requestedPath, reason }, context) => {\n try {\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext<any> | 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 const displayPath = formatPathForMessage(requestedPath, absolutePath);\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: \"${displayPath}\" is within the project root or allowed paths.`,\n isError: false,\n };\n }\n\n if (!harnessCtx?.emitEvent || !harnessCtx?.registerQuestion) {\n return {\n content: `Cannot request sandbox access: TUI context not available. The user should manually run /sandbox add ${displayPath}`,\n isError: true,\n };\n }\n\n const questionId = `sandbox_${++requestCounter}_${Date.now()}`;\n\n // Create a promise that resolves when the user answers in the TUI\n const answer = await new Promise<string>(resolve => {\n // Register the resolver so respondToQuestion() can resolve it\n harnessCtx.registerQuestion!({ questionId, resolve });\n\n // Emit event — TUI will show the dialog\n harnessCtx.emitEvent!({\n type: 'sandbox_access_request',\n questionId,\n path: absolutePath,\n reason,\n });\n });\n\n const approved = answer.toLowerCase().startsWith('y') || answer.toLowerCase() === 'approve';\n if (approved) {\n // Add to allowed paths in harness state (persists across turns)\n const currentAllowed = (harnessCtx.getState?.()?.sandboxAllowedPaths as string[] | undefined) ?? [];\n if (!currentAllowed.includes(absolutePath)) {\n harnessCtx.setState?.({\n sandboxAllowedPaths: [...currentAllowed, absolutePath],\n });\n }\n\n // Also update the workspace filesystem immediately so tools in the\n // same turn can access the path without waiting for the next turn.\n const fs = context?.workspace?.filesystem;\n if (fs instanceof LocalFilesystem) {\n fs.setAllowedPaths((prev: readonly string[]) => [...prev, absolutePath]);\n }\n\n return {\n content: `Access granted: \"${displayPath}\" 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 \"${displayPath}\".`,\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});\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 } from 'node:path';\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 '.ulicode',\n '.uli-cli',\n '.pulse',\n '.mastracode',\n];\n\nconst GLOBAL_LOCATIONS = [\n '.claude',\n '.ulicode',\n '.uli-cli',\n '.pulse',\n '.mastracode',\n '.config/claude',\n '.config/ulicode',\n '.config/uli-cli',\n '.config/pulse',\n '.config/mastracode',\n];\n\ninterface InstructionSource {\n path: string;\n content: string;\n scope: 'global' | 'project';\n}\n\nconst instructionCache = new Map<string, InstructionSource[]>();\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): InstructionSource[] {\n const sources: InstructionSource[] = [];\n const home = homedir();\n\n // Load global instructions first\n for (const location of GLOBAL_LOCATIONS) {\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 PROJECT_LOCATIONS) {\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 loadAgentInstructionsCached(projectPath: string): InstructionSource[] {\n const cached = instructionCache.get(projectPath);\n if (cached) {\n return cached.map(source => ({ ...source }));\n }\n\n const sources = loadAgentInstructions(projectPath);\n instructionCache.set(\n projectPath,\n sources.map(source => ({ ...source })),\n );\n return sources.map(source => ({ ...source }));\n}\n\nexport function invalidateAgentInstructionsCache(projectPath?: string): void {\n if (projectPath) {\n instructionCache.delete(projectPath);\n return;\n }\n\n instructionCache.clear();\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","/**\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 const isAskMode = modeId === 'ask';\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 (!isAskMode && !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 (readTools.length > 0) {\n sections.push(readTools.join('\\n'));\n }\n\n // --- Write/edit tools (build & fast only) ---\n\n if (modeId !== 'plan' && modeId !== 'ask') {\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\n if (!isAskMode && !denied.has('task_write')) {\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- Pass the FULL task list each time (replaces previous list).\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- Each task has: content (imperative form), status (pending|in_progress|completed), activeForm (present continuous form shown during execution).`);\n }\n\n if (!isAskMode && !denied.has('task_check')) {\n taskTools.push(`\n**task_check** — Check completion status of tasks\n- Use this BEFORE deciding you're done with a task to verify all tasks are completed.\n- Returns the number of completed, in progress, and pending tasks.\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 (!isAskMode && !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';\n\nimport { getModeDefinition } from '../agent-definitions.js';\nimport { hasTavilyKey } from '../../tools/index.js';\nimport { loadAgentInstructionsCached, formatAgentInstructions } from './agent-instructions.js';\nimport { buildBasePrompt } from './base.js';\nimport type { PromptContext as BasePromptContext } from './base.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\nfunction buildModePromptFromDefinition(ctx: PromptContext, promptBody: string): string {\n if (ctx.modeId === 'build' && ctx.activePlan) {\n return `# 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${promptBody}`;\n }\n\n return promptBody;\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 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 modeDefinition = getModeDefinition(ctx.workingDir, ctx.modeId) ?? getModeDefinition(ctx.workingDir, 'build');\n const modeSpecific = buildModePromptFromDefinition(ctx, modeDefinition?.instructions ?? '');\n\n // Inject current task state so agent doesn't lose track after OM truncation\n let taskSection = '';\n const tasks = ctx.state?.tasks as { content: string; status: string; activeForm: string }[] | undefined;\n if (tasks && tasks.length > 0) {\n const lines = tasks.map(t => {\n const icon = t.status === 'completed' ? '✓' : t.status === 'in_progress' ? '▸' : '○';\n return ` ${icon} [${t.status}] ${t.content}`;\n });\n taskSection = `\\n<current-task-list>\\n${lines.join('\\n')}\\n</current-task-list>\\n`;\n }\n\n // Load and inject agent instructions from AGENTS.md/CLAUDE.md files\n const instructionSources = loadAgentInstructionsCached(ctx.workingDir);\n const instructionsSection = formatAgentInstructions(instructionSources);\n\n return base + taskSection + instructionsSection + '\\n' + modeSpecific;\n}\n","import type { HarnessRequestContext } from '@mastra/core/harness';\nimport type { MastraCodeState } from '../schema.js';\nimport { logRuntimeProfile } from '../utils/debug-log.js';\nimport { getCurrentGitBranch } from '../utils/project.js';\nimport type { PromptContext } from './prompts/index.js';\nimport { buildFullPrompt } from './prompts/index.js';\n\nlet promptBuildCount = 0;\n\nexport function getDynamicInstructions({ requestContext }: { requestContext: { get(key: string): unknown } }) {\n const startTime = performance.now();\n const harnessContext = requestContext.get('harness') as HarnessRequestContext<MastraCodeState> | undefined;\n const state = harnessContext?.state;\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: getCurrentGitBranch(projectPath) ?? state?.gitBranch,\n platform: process.platform,\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 const prompt = buildFullPrompt(promptCtx);\n promptBuildCount += 1;\n const durationMs = performance.now() - startTime;\n if (promptBuildCount === 1 || durationMs >= 20) {\n logRuntimeProfile('prompt.build', durationMs, {\n count: promptBuildCount,\n modeId,\n projectPath,\n });\n }\n return prompt;\n}\n","// Default OM model - using gemini-2.5-flash for efficiency\nexport const DEFAULT_OM_MODEL_ID = process.env.DEFAULT_OM_MODEL_ID ?? 'google/gemini-2.5-flash';\n\n// Default OM thresholds — per-thread overrides are loaded from thread metadata\nexport const DEFAULT_OBS_THRESHOLD = 30_000;\nexport const DEFAULT_REF_THRESHOLD = 40_000;\n","/**\n * Claude Max OAuth Provider\n *\n * Uses OAuth tokens from AuthStorage to authenticate with Claude Max plan.\n * The OAuth endpoint requires a specific system message to be present.\n */\n\nimport { createAnthropic } from '@ai-sdk/anthropic';\nimport type { MastraModelConfig } from '@mastra/core/llm';\nimport { wrapLanguageModel } from 'ai';\nimport type { LanguageModelMiddleware } from 'ai';\nimport { AuthStorage } from '../auth/storage.js';\n\n// Required for Claude Max plan OAuth - the endpoint checks for this system message\nconst claudeCodeIdentity = \"You are Claude Code, Anthropic's official CLI for Claude.\";\n\n// Singleton auth storage instance\nlet authStorageInstance: AuthStorage | null = null;\n\n/**\n * Get or create the shared AuthStorage instance\n */\nexport function getAuthStorage(): AuthStorage {\n if (!authStorageInstance) {\n authStorageInstance = new AuthStorage();\n }\n return authStorageInstance;\n}\n\n/**\n * Set a custom AuthStorage instance (useful for TUI integration)\n */\nexport function setAuthStorage(storage: AuthStorage | undefined): void {\n authStorageInstance = storage ?? null;\n}\n\n/**\n * Middleware that injects the Claude Code identity system message\n * Required for Claude Max OAuth authentication\n */\nconst 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 * Creates an Anthropic model using Claude Max OAuth authentication\n * Uses OAuth tokens from AuthStorage (auto-refreshes when needed)\n */\nexport function opencodeClaudeMaxProvider(modelId: string = 'claude-sonnet-4-20250514'): MastraModelConfig {\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 });\n return wrapLanguageModel({\n model: anthropic(modelId),\n middleware: [claudeCodeMiddleware, promptCacheMiddleware],\n });\n }\n\n // Custom fetch that handles OAuth\n const oauthFetch = async (url: string | URL | Request, init?: Parameters<typeof fetch>[1]) => {\n const authStorage = getAuthStorage();\n\n // Reload from disk to handle multi-instance refresh\n authStorage.reload();\n\n const storedCred = authStorage.get('anthropic');\n if (storedCred?.type === 'api_key') {\n throw new Error(\n 'Anthropic API key credential is configured, but Claude Max OAuth provider requires OAuth credentials.',\n );\n }\n\n // Get access token (auto-refreshes if expired)\n const accessToken = await authStorage.getApiKey('anthropic');\n\n if (!accessToken) {\n throw new Error('Not logged in to Anthropic. Run /login first.');\n }\n\n // Make request with OAuth headers\n return fetch(url, {\n ...init,\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'anthropic-beta':\n 'oauth-2025-04-20,claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14',\n 'anthropic-version': '2023-06-01',\n },\n });\n };\n\n const anthropic = createAnthropic({\n // Provide a dummy API key - the actual auth is handled via OAuth in oauthFetch\n // This prevents the SDK from throwing \"API key is missing\" at model creation time\n apiKey: 'oauth-placeholder',\n fetch: oauthFetch 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 * 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';\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).\nconst 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 */\nfunction 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 * 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 },\n): MastraModelConfig {\n // Map thinkingLevel to OpenAI reasoningEffort, defaulting to 'medium'.\n // When level is 'off', reasoningEffort is undefined and the parameter is omitted.\n // GPT-5.* models are floored to at least \"low\" on Codex.\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\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 });\n return wrapLanguageModel({\n model: openai.responses(modelId),\n middleware: [middleware],\n });\n }\n\n // Custom fetch that handles OAuth and URL rewriting\n const oauthFetch = async (url: string | URL | Request, init?: Parameters<typeof fetch>[1]) => {\n const authStorage = getAuthStorage();\n\n // Reload from disk to handle multi-instance refresh\n authStorage.reload();\n\n // Get credentials (includes accountId)\n const cred = authStorage.get('openai-codex');\n\n if (!cred || cred.type !== 'oauth') {\n throw new Error('Not logged in to OpenAI Codex. Run /login first.');\n }\n\n // Check if token needs refresh\n let accessToken = cred.access;\n if (Date.now() >= cred.expires) {\n // Token expired, need to refresh via getApiKey which handles refresh\n const refreshedToken = await authStorage.getApiKey('openai-codex');\n if (!refreshedToken) {\n throw new Error('Failed to refresh OpenAI Codex token. Please /login again.');\n }\n accessToken = refreshedToken;\n // Reload to get updated accountId\n authStorage.reload();\n }\n\n // Get accountId from credentials\n const accountId = (cred as any).accountId as string | undefined;\n\n // Build headers - remove any existing authorization header first\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 // Set authorization header with access token\n headers.set('Authorization', `Bearer ${accessToken}`);\n\n // Set ChatGPT-Account-Id header for organization subscriptions\n if (accountId) {\n headers.set('ChatGPT-Account-Id', accountId);\n }\n\n // Rewrite URL to Codex endpoint if it's a chat/responses request\n const parsed = url instanceof URL ? url : new URL(typeof url === 'string' ? url : (url as Request).url);\n\n const shouldRewrite = parsed.pathname.includes('/v1/responses') || parsed.pathname.includes('/chat/completions');\n const finalUrl = shouldRewrite ? new URL(CODEX_API_ENDPOINT) : parsed;\n\n return fetch(finalUrl, {\n ...init,\n headers,\n });\n };\n\n const openai = createOpenAI({\n // Use a dummy API key since we're using OAuth\n apiKey: 'oauth-dummy-key',\n fetch: oauthFetch as any,\n });\n\n // Use the responses API for Codex models\n // Wrap with middleware\n return wrapLanguageModel({\n model: openai.responses(modelId),\n middleware: [middleware],\n });\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport type { HarnessRequestContext } from '@mastra/core/harness';\nimport { ModelRouterLanguageModel } from '@mastra/core/llm';\nimport type { MastraModelConfig } from '@mastra/core/llm';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport { wrapLanguageModel } from 'ai';\nimport { AuthStorage } from '../auth/storage.js';\nimport { getCustomProviderId, loadSettingsCached } from '../onboarding/settings.js';\nimport { opencodeClaudeMaxProvider, promptCacheMiddleware } from '../providers/claude-max.js';\nimport { openaiCodexProvider } from '../providers/openai-codex.js';\nimport type { ThinkingLevel } from '../providers/openai-codex.js';\nimport type { MastraCodeState } from '../schema.js';\n\nconst authStorage = new AuthStorage();\n\nconst OPENAI_PREFIX = 'openai/';\nconst GOOGLE_PREFIX = 'google/';\n\nconst CODEX_OPENAI_MODEL_REMAPS: Record<string, string> = {\n 'gpt-5.3': 'gpt-5.3-codex',\n 'gpt-5.2': 'gpt-5.2-codex',\n 'gpt-5.1': 'gpt-5.1-codex',\n 'gpt-5.1-mini': 'gpt-5.1-codex-mini',\n 'gpt-5': 'gpt-5-codex',\n};\n\ntype ResolvedModel =\n | MastraModelConfig\n | ReturnType<typeof openaiCodexProvider>\n | ReturnType<typeof opencodeClaudeMaxProvider>\n | ModelRouterLanguageModel;\n\nexport function remapOpenAIModelForCodexOAuth(modelId: string): string {\n if (!modelId.startsWith(OPENAI_PREFIX)) {\n return modelId;\n }\n\n const openaiModelId = modelId.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 return `${OPENAI_PREFIX}${codexModelId}`;\n}\n\n/**\n * Resolve the Anthropic API key from stored credentials.\n * Returns the key if available, undefined otherwise.\n */\nexport function getAnthropicApiKey(): string | undefined {\n // Check stored API key credential (set via /apikey or UI prompt)\n const storedCred = authStorage.get('anthropic');\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n return undefined;\n}\n\n/**\n * Resolve the OpenAI API key from stored credentials.\n * Returns the key if available, undefined otherwise.\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 return undefined;\n}\n\n/**\n * Resolve the Google API key from stored credentials.\n * Returns the key if available, undefined otherwise.\n */\nexport function getGoogleApiKey(): string | undefined {\n const storedCred = authStorage.get('google');\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n return undefined;\n}\n\n/**\n * Create an Anthropic model using a direct API key (no OAuth).\n * Applies prompt caching but NOT the Claude Code identity middleware\n * (which is only required for Claude Max OAuth).\n */\nfunction anthropicApiKeyProvider(modelId: string, apiKey: string): MastraModelConfig {\n const anthropic = createAnthropic({ apiKey });\n return wrapLanguageModel({\n model: anthropic(modelId),\n middleware: [promptCacheMiddleware],\n });\n}\n\n/**\n * Create an OpenAI model using a direct API key from AuthStorage.\n */\nfunction openaiApiKeyProvider(modelId: string, apiKey: string): MastraModelConfig {\n const openai = createOpenAI({ apiKey });\n return wrapLanguageModel({\n model: openai.responses(modelId),\n middleware: [],\n });\n}\n\n/**\n * Resolve a model ID to the correct provider instance.\n * Shared by the main agent, observer, and reflector.\n *\n * - For anthropic/* models: Uses stored OAuth credentials when present, otherwise direct API key\n * - For openai/* models: Uses OAuth when configured, otherwise direct API key from AuthStorage\n * - For google/* models: Uses stored API key when present, otherwise the model router\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 },\n): ResolvedModel {\n authStorage.reload();\n const [providerId, modelName] = modelId.split('/', 2);\n const settings = loadSettingsCached();\n const customProvider =\n providerId && modelName\n ? settings.customProviders.find(provider => {\n return providerId === getCustomProviderId(provider.name);\n })\n : undefined;\n\n if (customProvider) {\n return new ModelRouterLanguageModel({\n id: modelId as `${string}/${string}`,\n url: customProvider.url,\n apiKey: customProvider.apiKey,\n });\n }\n\n const isAnthropicModel = modelId.startsWith('anthropic/');\n const isOpenAIModel = modelId.startsWith(OPENAI_PREFIX);\n const isGoogleModel = modelId.startsWith(GOOGLE_PREFIX);\n const isMoonshotModel = modelId.startsWith('moonshotai/');\n\n if (isMoonshotModel) {\n if (!process.env.MOONSHOT_AI_API_KEY) {\n throw new Error(`Need MOONSHOT_AI_API_KEY`);\n }\n return createAnthropic({\n apiKey: process.env.MOONSHOT_AI_API_KEY!,\n baseURL: 'https://api.moonshot.ai/anthropic/v1',\n name: 'moonshotai.anthropicv1',\n })(modelId.substring('moonshotai/'.length));\n } else if (isAnthropicModel) {\n const bareModelId = modelId.substring('anthropic/'.length);\n const storedCred = authStorage.get('anthropic');\n\n // Primary path: explicit OAuth credential\n if (storedCred?.type === 'oauth') {\n return opencodeClaudeMaxProvider(bareModelId);\n }\n\n // Secondary path: explicit stored API key credential\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return anthropicApiKeyProvider(bareModelId, storedCred.key.trim());\n }\n\n // Fallback: direct API key from AuthStorage\n const apiKey = getAnthropicApiKey();\n if (apiKey) {\n return anthropicApiKeyProvider(bareModelId, apiKey);\n }\n // No auth configured — attempt OAuth provider which will prompt login\n return opencodeClaudeMaxProvider(bareModelId);\n } else if (isOpenAIModel) {\n const bareModelId = modelId.substring(OPENAI_PREFIX.length);\n const storedCred = authStorage.get('openai-codex');\n\n if (storedCred?.type === 'oauth') {\n const resolvedModelId = options?.remapForCodexOAuth ? remapOpenAIModelForCodexOAuth(modelId) : modelId;\n return openaiCodexProvider(resolvedModelId.substring(OPENAI_PREFIX.length), {\n thinkingLevel: options?.thinkingLevel,\n });\n }\n\n const apiKey = getOpenAIApiKey();\n if (apiKey) {\n return openaiApiKeyProvider(bareModelId, apiKey);\n }\n\n return new ModelRouterLanguageModel(modelId);\n } else if (isGoogleModel) {\n const bareModelId = modelId.substring(GOOGLE_PREFIX.length);\n const apiKey = getGoogleApiKey();\n if (apiKey) {\n return new ModelRouterLanguageModel({\n providerId: 'google',\n modelId: bareModelId,\n apiKey,\n });\n }\n\n return new ModelRouterLanguageModel(modelId);\n } else {\n return new ModelRouterLanguageModel(modelId);\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<MastraCodeState> | 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 });\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 { 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) {\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, { remapForCodexOAuth: true });\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, { remapForCodexOAuth: true });\n}\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) {\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\n const observerPreviousObservationTokens = 1000;\n const cacheKey = `${obsThreshold}:${refThreshold}:${omScope}:${observerPreviousObservationTokens}`;\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 cachedMemory = new Memory({\n storage,\n options: {\n observationalMemory: {\n enabled: true,\n scope: omScope,\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 },\n reflection: {\n bufferActivation: isResourceScope ? undefined : 1 / 2,\n blockAfter: 1.1,\n model: getReflectorModel,\n observationTokens: refThreshold,\n },\n },\n },\n });\n cachedMemoryKey = cacheKey;\n\n return cachedMemory;\n };\n}\n","import { Agent } from '@mastra/core/agent';\nimport type { HarnessSubagent } from '@mastra/core/harness';\nimport { createTool } from '@mastra/core/tools';\nimport { createWorkspaceTools } from '@mastra/core/workspace';\nimport { z } from 'zod';\n\ntype ToolLike = Record<string, unknown>;\n\ninterface CreateScopedSubagentToolOptions {\n subagents: HarnessSubagent[];\n resolveModel: (modelId: string) => unknown;\n harnessTools?: Record<string, ToolLike>;\n fallbackModelId?: string;\n}\n\ninterface ApplyModeScopedSubagentGuardrailsOptions {\n harness: any;\n subagents: HarnessSubagent[];\n resolveModel: (modelId: string) => unknown;\n getAllowedSubagentIdsForMode: (modeId: string) => string[];\n}\n\nfunction buildSubagentMeta(\n modelId: string,\n durationMs: number,\n toolCalls: Array<{ name: string; isError?: boolean }>,\n): string {\n const tools = toolCalls.map(toolCall => `${toolCall.name}:${toolCall.isError ? 'err' : 'ok'}`).join(',');\n return `\\n<subagent-meta modelId=\"${modelId}\" durationMs=\"${durationMs}\" tools=\"${tools}\" />`;\n}\n\nexport function createScopedSubagentTool(opts: CreateScopedSubagentToolOptions) {\n const { subagents, resolveModel, harnessTools, fallbackModelId } = opts;\n const subagentIds = subagents.map(subagent => subagent.id);\n const typeDescriptions = subagents\n .map(subagent => `- **${subagent.id}** (${subagent.name}): ${subagent.description}`)\n .join('\\n');\n\n return createTool({\n id: 'subagent',\n description: `Delegate a focused task to a specialized subagent. The subagent runs independently with a constrained toolset, then returns its findings as text.\n\nAvailable agent types:\n${typeDescriptions}\n\nThe subagent runs in its own context - it does NOT see the parent conversation history. Write a clear, self-contained task description.\n\nUse this tool when:\n- You want to run multiple investigations in parallel\n- The task is self-contained and can be delegated`,\n inputSchema: z.object({\n agentType: z.enum(subagentIds as [string, ...string[]]).describe('Type of subagent to spawn'),\n task: z.string().describe(\n 'Clear, self-contained description of what the subagent should do. Include all relevant context - the subagent cannot see the parent conversation.',\n ),\n modelId: z.string().optional().describe('Optional model ID override for this task.'),\n }),\n execute: async ({ agentType, task, modelId }, context) => {\n const definition = subagents.find(subagent => subagent.id === agentType);\n if (!definition) {\n return {\n content: `Unknown agent type: ${agentType}. Valid types: ${subagentIds.join(', ')}`,\n isError: true,\n };\n }\n\n const harnessCtx = context?.requestContext?.get('harness') as\n | {\n emitEvent?: (event: Record<string, unknown>) => void;\n abortSignal?: AbortSignal;\n getSubagentModelId?: (params?: { agentType?: string }) => string | null;\n }\n | undefined;\n const emitEvent = harnessCtx?.emitEvent;\n const abortSignal = harnessCtx?.abortSignal;\n const toolCallId = context?.agent?.toolCallId ?? 'unknown';\n const mergedTools = { ...(definition.tools ?? {}) } as Record<string, ToolLike>;\n\n if (definition.allowedHarnessTools && harnessTools) {\n for (const toolId of definition.allowedHarnessTools) {\n if (harnessTools[toolId] && !mergedTools[toolId]) {\n mergedTools[toolId] = harnessTools[toolId]!;\n }\n }\n }\n\n const harnessModelId = harnessCtx?.getSubagentModelId?.({ agentType }) ?? undefined;\n const resolvedModelId = modelId ?? harnessModelId ?? definition.defaultModelId ?? fallbackModelId;\n if (!resolvedModelId) {\n return { content: 'No model ID available for subagent. Configure defaultModelId.', isError: true };\n }\n\n let model: unknown;\n try {\n model = resolveModel(resolvedModelId);\n } catch (error) {\n return {\n content: `Failed to resolve model \"${resolvedModelId}\": ${error instanceof Error ? error.message : String(error)}`,\n isError: true,\n };\n }\n\n const workspace = context?.workspace;\n const subagent = new Agent({\n id: `subagent-${definition.id}`,\n name: `${definition.name} Subagent`,\n instructions: definition.instructions,\n model: model as any,\n tools: mergedTools,\n workspace,\n });\n\n const allWorkspaceToolNames = workspace ? new Set(Object.keys(createWorkspaceTools(workspace as any))) : undefined;\n const allowedWorkspaceTools = definition.allowedWorkspaceTools\n ? new Set(definition.allowedWorkspaceTools)\n : undefined;\n const startTime = Date.now();\n emitEvent?.({\n type: 'subagent_start',\n toolCallId,\n agentType,\n task,\n modelId: resolvedModelId,\n });\n\n let partialText = '';\n const toolCallLog: Array<{ name: string; toolCallId?: string; isError?: boolean }> = [];\n\n try {\n const response = await subagent.stream(task, {\n maxSteps: definition.maxSteps ?? (definition.stopWhen ? undefined : 50),\n stopWhen: definition.stopWhen,\n abortSignal,\n requireToolApproval: false,\n requestContext: context?.requestContext,\n prepareStep:\n allowedWorkspaceTools && allWorkspaceToolNames\n ? ({ tools }) => ({\n activeTools: Object.keys(tools ?? {}).filter(toolName => {\n return !allWorkspaceToolNames.has(toolName) || allowedWorkspaceTools.has(toolName);\n }),\n })\n : undefined,\n });\n\n for await (const chunk of response.fullStream) {\n switch (chunk.type) {\n case 'text-delta':\n partialText += chunk.payload.text;\n emitEvent?.({\n type: 'subagent_text_delta',\n toolCallId,\n agentType,\n textDelta: chunk.payload.text,\n });\n break;\n case 'tool-call':\n toolCallLog.push({ name: chunk.payload.toolName, toolCallId: chunk.payload.toolCallId });\n emitEvent?.({\n type: 'subagent_tool_start',\n toolCallId,\n agentType,\n subToolName: chunk.payload.toolName,\n subToolArgs: chunk.payload.args,\n });\n break;\n case 'tool-result': {\n const isError = chunk.payload.isError ?? false;\n for (let index = toolCallLog.length - 1; index >= 0; index -= 1) {\n if (toolCallLog[index]!.toolCallId === chunk.payload.toolCallId && toolCallLog[index]!.isError === undefined) {\n toolCallLog[index]!.isError = isError;\n break;\n }\n }\n emitEvent?.({\n type: 'subagent_tool_end',\n toolCallId,\n agentType,\n subToolName: chunk.payload.toolName,\n subToolResult: chunk.payload.result,\n isError,\n });\n break;\n }\n }\n }\n\n if (abortSignal?.aborted) {\n const durationMs = Date.now() - startTime;\n const abortResult = partialText ? `[Aborted by user]\\n\\nPartial output:\\n${partialText}` : '[Aborted by user]';\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: abortResult, isError: false, durationMs });\n return { content: abortResult + buildSubagentMeta(resolvedModelId, durationMs, toolCallLog), isError: false };\n }\n\n const fullOutput = await response.getFullOutput();\n const resultText = fullOutput.text || partialText;\n const durationMs = Date.now() - startTime;\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: resultText, isError: false, durationMs });\n return { content: resultText + buildSubagentMeta(resolvedModelId, durationMs, toolCallLog), isError: false };\n } catch (error) {\n const isAbort = error instanceof Error && (\n error.name === 'AbortError'\n || error.message.includes('abort')\n || error.message.includes('cancel')\n );\n const durationMs = Date.now() - startTime;\n if (isAbort) {\n const abortResult = partialText ? `[Aborted by user]\\n\\nPartial output:\\n${partialText}` : '[Aborted by user]';\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: abortResult, isError: false, durationMs });\n return { content: abortResult + buildSubagentMeta(resolvedModelId, durationMs, toolCallLog), isError: false };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: message, isError: true, durationMs });\n return {\n content: `Subagent \"${definition.name}\" failed: ${message}${buildSubagentMeta(resolvedModelId, durationMs, toolCallLog)}`,\n isError: true,\n };\n }\n },\n });\n}\n\nexport function applyModeScopedSubagentGuardrails(\n opts: ApplyModeScopedSubagentGuardrailsOptions,\n): void {\n const originalBuildToolsets = opts.harness.buildToolsets.bind(opts.harness);\n\n opts.harness.buildToolsets = async (requestContext?: unknown) => {\n const toolsets = await originalBuildToolsets(requestContext) as {\n harnessBuiltIn?: Record<string, unknown>;\n harness?: Record<string, ToolLike>;\n };\n const builtInTools = toolsets.harnessBuiltIn;\n if (!builtInTools?.subagent) {\n return toolsets;\n }\n\n const currentModeId = opts.harness.getCurrentModeId();\n const allowedSubagentIds = new Set(opts.getAllowedSubagentIdsForMode(currentModeId));\n if (allowedSubagentIds.size === 0) {\n delete builtInTools.subagent;\n return toolsets;\n }\n\n const modeScopedSubagents = opts.subagents.filter(subagent => allowedSubagentIds.has(subagent.id));\n builtInTools.subagent = createScopedSubagentTool({\n subagents: modeScopedSubagents,\n resolveModel: opts.resolveModel,\n harnessTools: toolsets.harness,\n fallbackModelId: opts.harness.getCurrentMode().defaultModelId,\n });\n\n return toolsets;\n };\n}","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport type { HarnessRequestContext } from '@mastra/core/harness';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { HookManager } from '../hooks';\nimport type { McpManager } from '../mcp';\nimport type { MastraCodeState } from '../schema';\nimport { createWebSearchTool, createWebExtractTool, hasTavilyKey, requestSandboxAccessTool } from '../tools';\n\n/** Minimal shape for tools passed to createDynamicTools. */\ninterface ToolLike {\n execute?: (...args: any[]) => Promise<unknown> | unknown;\n}\n\nfunction wrapToolWithHooks(toolName: string, tool: ToolLike, hookManager?: HookManager): ToolLike {\n if (!hookManager || typeof tool?.execute !== 'function') {\n return tool;\n }\n\n return {\n ...tool,\n async execute(input: unknown, toolContext: unknown) {\n const preResult = await hookManager.runPreToolUse(toolName, input);\n if (!preResult.allowed) {\n return {\n error: preResult.blockReason ?? `Blocked by PreToolUse hook for tool \"${toolName}\"`,\n };\n }\n\n let output: unknown;\n let toolError = false;\n try {\n output = await tool.execute!(input, toolContext);\n return output;\n } catch (error) {\n toolError = true;\n output = {\n error: error instanceof Error ? error.message : String(error),\n };\n throw error;\n } finally {\n await hookManager.runPostToolUse(toolName, input, output, toolError).catch(() => undefined);\n }\n },\n };\n}\n\nexport function createDynamicTools(\n mcpManager?: McpManager,\n extraTools?: Record<string, ToolLike> | ((ctx: { requestContext: RequestContext }) => Record<string, ToolLike>),\n hookManager?: HookManager,\n disabledTools?: string[],\n) {\n return function getDynamicTools({ requestContext }: { requestContext: RequestContext }) {\n const ctx = requestContext.get('harness') as HarnessRequestContext<MastraCodeState> | undefined;\n const state = ctx?.getState?.();\n const modeId = ctx?.modeId ?? 'build';\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 (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 if (modeId === 'ask') {\n delete tools.request_access;\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 for (const [toolName, tool] of Object.entries(tools)) {\n tools[toolName] = wrapToolWithHooks(toolName, tool, hookManager);\n }\n\n return tools;\n };\n}\n","/**\n * Hook configuration loading from filesystem.\n * Loads from global (~/.ulicode/hooks.json) and project (.ulicode/hooks.json).\n * Falls back to temporary .uli-cli plus legacy .pulse and .mastracode paths.\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 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];\n\nexport function loadHooksConfig(projectDir: string): HooksConfig {\n const globalPath = getGlobalHooksPath();\n const projectPath = getProjectHooksPath(projectDir);\n\n const globalConfig = loadSingleConfig(\n globalPath,\n getLegacyUliCliGlobalHooksPath(),\n getLegacyPulseGlobalHooksPath(),\n getLegacyMastraGlobalHooksPath(),\n );\n const projectConfig = loadSingleConfig(\n projectPath,\n getLegacyUliCliProjectHooksPath(projectDir),\n getLegacyPulseProjectHooksPath(projectDir),\n getLegacyMastraProjectHooksPath(projectDir),\n );\n\n return mergeConfigs(globalConfig, projectConfig);\n}\n\nexport function getProjectHooksPath(projectDir: string): string {\n return path.join(projectDir, '.ulicode', 'hooks.json');\n}\n\nexport function getGlobalHooksPath(): string {\n return path.join(os.homedir(), '.ulicode', 'hooks.json');\n}\n\nfunction getLegacyUliCliProjectHooksPath(projectDir: string): string {\n return path.join(projectDir, '.uli-cli', 'hooks.json');\n}\n\nfunction getLegacyUliCliGlobalHooksPath(): string {\n return path.join(os.homedir(), '.uli-cli', 'hooks.json');\n}\n\nfunction getLegacyPulseProjectHooksPath(projectDir: string): string {\n return path.join(projectDir, '.pulse', 'hooks.json');\n}\n\nfunction getLegacyPulseGlobalHooksPath(): string {\n return path.join(os.homedir(), '.pulse', 'hooks.json');\n}\n\nfunction getLegacyMastraProjectHooksPath(projectDir: string): string {\n return path.join(projectDir, '.mastracode', 'hooks.json');\n}\n\nfunction getLegacyMastraGlobalHooksPath(): string {\n return path.join(os.homedir(), '.mastracode', 'hooks.json');\n}\n\nfunction loadSingleConfig(filePath: string, ...fallbackPaths: Array<string | undefined>): HooksConfig {\n try {\n const resolvedPath = [filePath, ...fallbackPaths].find(candidate => candidate && fs.existsSync(candidate)) ?? null;\n if (!resolvedPath) return {};\n const raw = fs.readFileSync(resolvedPath, '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 { logRuntimeProfile } from '../utils/debug-log.js';\nimport type { HookDefinition, HookStdin, HookResult, HookStdout, HookEventResult } from './types.js';\nimport { isBlockingEvent } from './types.js';\n\nconst DEFAULT_TIMEOUT = 10_000;\nconst FORCE_KILL_GRACE_MS = 250;\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 let forceKillTimer: ReturnType<typeof setTimeout> | undefined;\n\n const timer = setTimeout(() => {\n timedOut = true;\n try {\n child.kill('SIGTERM');\n } catch {\n // Ignore termination errors and fall back to force kill.\n }\n\n forceKillTimer = setTimeout(() => {\n try {\n child.kill('SIGKILL');\n } catch {\n // Ignore force-kill errors.\n }\n }, FORCE_KILL_GRACE_MS);\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 (forceKillTimer) clearTimeout(forceKillTimer);\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 const result = {\n hook,\n exitCode: exitCode ?? 1,\n stdout: parsedStdout,\n stderr: stderr.trim() || undefined,\n timedOut,\n durationMs: Date.now() - startTime,\n };\n logRuntimeProfile('hooks.execute', result.durationMs, {\n event: stdinPayload.hook_event_name,\n command: hook.command,\n timedOut,\n exitCode: result.exitCode,\n });\n resolve(result);\n });\n\n child.on('error', error => {\n clearTimeout(timer);\n if (forceKillTimer) clearTimeout(forceKillTimer);\n if (resolved) return;\n resolved = true;\n\n const result = {\n hook,\n exitCode: 1,\n stderr: error.message,\n timedOut: false,\n durationMs: Date.now() - startTime,\n };\n logRuntimeProfile('hooks.execute', result.durationMs, {\n event: stdinPayload.hook_event_name,\n command: hook.command,\n timedOut: false,\n exitCode: result.exitCode,\n error: error.message,\n });\n resolve(result);\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 if (!blocking) {\n const concurrentResults = await Promise.all(applicable.map(hook => executeHook(hook, stdinPayload)));\n for (const result of concurrentResults) {\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 ${result.hook.timeout ?? DEFAULT_TIMEOUT}ms: ${result.hook.command}`);\n continue;\n }\n\n if (result.exitCode === 0) continue;\n\n const warnMsg = result.stderr || `Hook exited with code ${result.exitCode}`;\n warnings.push(`${result.hook.description || result.hook.command}: ${warnMsg}`);\n }\n\n return { allowed: true, additionalContext, results, warnings };\n }\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 { 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\n constructor(projectDir: string, sessionId: string) {\n this.projectDir = projectDir;\n this.sessionId = sessionId;\n this.config = loadHooksConfig(projectDir);\n }\n\n reload(): void {\n this.config = loadHooksConfig(this.projectDir);\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),\n global: getGlobalHooksPath(),\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. ~/.ulicode/mcp.json (global)\n * 3. .ulicode/mcp.json (project — highest priority)\n * 4. temporary ~/.uli-cli/.uli-cli and legacy ~/.pulse/.mastracode fallbacks\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 type { McpConfig, McpServerConfig, McpSkippedServer } from './types.js';\n\nexport function loadMcpConfig(projectDir: string): McpConfig {\n const claudeConfig = loadClaudeSettings(projectDir);\n const globalConfig = loadSingleConfig(\n getGlobalMcpPath(),\n getLegacyUliCliGlobalMcpPath(),\n getLegacyPulseGlobalMcpPath(),\n getLegacyMastraGlobalMcpPath(),\n );\n const projectConfig = loadSingleConfig(\n getProjectMcpPath(projectDir),\n getLegacyUliCliProjectMcpPath(projectDir),\n getLegacyPulseProjectMcpPath(projectDir),\n getLegacyMastraProjectMcpPath(projectDir),\n );\n\n return mergeConfigs(claudeConfig, globalConfig, projectConfig);\n}\n\nexport function getProjectMcpPath(projectDir: string): string {\n return path.join(projectDir, '.ulicode', 'mcp.json');\n}\n\nexport function getGlobalMcpPath(): string {\n return path.join(os.homedir(), '.ulicode', 'mcp.json');\n}\n\nfunction getLegacyUliCliProjectMcpPath(projectDir: string): string {\n return path.join(projectDir, '.uli-cli', 'mcp.json');\n}\n\nfunction getLegacyUliCliGlobalMcpPath(): string {\n return path.join(os.homedir(), '.uli-cli', 'mcp.json');\n}\n\nfunction getLegacyPulseProjectMcpPath(projectDir: string): string {\n return path.join(projectDir, '.pulse', 'mcp.json');\n}\n\nfunction getLegacyPulseGlobalMcpPath(): string {\n return path.join(os.homedir(), '.pulse', 'mcp.json');\n}\n\nfunction getLegacyMastraProjectMcpPath(projectDir: string): string {\n return path.join(projectDir, '.mastracode', 'mcp.json');\n}\n\nfunction getLegacyMastraGlobalMcpPath(): string {\n return path.join(os.homedir(), '.mastracode', '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, ...fallbackPaths: Array<string | undefined>): McpConfig {\n try {\n const resolvedPath = [filePath, ...fallbackPaths].find(candidate => candidate && fs.existsSync(candidate)) ?? null;\n if (!resolvedPath) return {};\n const raw = fs.readFileSync(resolvedPath, '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 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 };\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\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 { MCPClient } from '@mastra/mcp';\nimport type { MastraMCPServerDefinition } from '@mastra/mcp';\nimport { loadMcpConfig, getProjectMcpPath, getGlobalMcpPath, getClaudeSettingsPath } from './config.js';\nimport type { McpConfig, McpHttpServerConfig, McpServerConfig, McpServerStatus, McpSkippedServer } from './types.js';\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 /** Disconnect all servers, reload config from disk, reconnect. */\n reload(): Promise<void>;\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}\n\nfunction getTransport(cfg: McpServerConfig): 'stdio' | 'http' {\n return 'url' in cfg ? 'http' : 'stdio';\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(projectDir: string, extraServers?: Record<string, McpServerConfig>): 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));\n let client: MCPClient | null = null;\n let tools: Record<string, any> = {};\n let serverStatuses = new Map<string, McpServerStatus>();\n let initialized = false;\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 };\n } else {\n defs[name] = { command: cfg.command, args: cfg.args, env: cfg.env };\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 client = new MCPClient({\n id: 'mastra-code-mcp',\n servers: buildServerDefs(servers),\n });\n\n // MCPClient.listTools() uses Promise.all internally — a single server\n // failure throws for all. We call it once wrapped in try/catch and\n // derive per-server status from tool name prefixes (serverName_toolName).\n const serverNames = Object.keys(servers);\n\n try {\n tools = await client.listTools();\n\n for (const name of serverNames) {\n const prefix = `${name}_`;\n const serverToolNames = Object.keys(tools).filter(t => t.startsWith(prefix));\n serverStatuses.set(name, {\n name,\n connected: true,\n toolCount: serverToolNames.length,\n toolNames: serverToolNames,\n transport: getTransport(servers[name]!),\n });\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 reload() {\n await disconnect();\n config = applyExtraServers(loadMcpConfig(projectDir));\n tools = {};\n serverStatuses = new Map();\n initialized = false;\n await connectAndCollectTools();\n initialized = true;\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),\n global: getGlobalMcpPath(),\n claude: getClaudeSettingsPath(projectDir),\n };\n },\n\n getConfig() {\n return config;\n },\n };\n}\n","import { z } from 'zod';\nimport { DEFAULT_OM_MODEL_ID } from './constants';\n\nexport const stateSchema = z.object({\n projectPath: z.string().optional(),\n projectName: z.string().optional(),\n gitBranch: z.string().optional(),\n lastCommand: z.string().optional(),\n currentModelId: z.string().default(''),\n // Subagent model settings (per-thread/per-mode)\n subagentModelId: z.string().optional(), // Thread-level default for subagents\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 // 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 (persisted per-thread)\n tasks: z\n .array(\n z.object({\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});\n\nexport type MastraCodeState = z.infer<typeof stateSchema>;\n","/**\n * Gateway sync utility for keeping the model registry up to date.\n * Periodically fetches provider data from gateways and updates the global cache.\n */\n\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { ModelsDevGateway, NetlifyGateway } from '@mastra/core/llm';\nimport type { ProviderConfig } from '@mastra/core/llm';\n\n// Cache paths (same as Mastra uses)\nconst CACHE_DIR = path.join(os.homedir(), '.cache', 'mastra');\nconst CACHE_FILE = path.join(CACHE_DIR, 'gateway-refresh-time');\nconst GLOBAL_PROVIDER_REGISTRY_JSON = path.join(CACHE_DIR, 'provider-registry.json');\nconst GLOBAL_PROVIDER_TYPES_DTS = path.join(CACHE_DIR, 'provider-types.generated.d.ts');\n\n// Default sync interval: 5 minutes\nconst DEFAULT_SYNC_INTERVAL_MS = 5 * 60 * 1000;\n\nlet syncInterval: NodeJS.Timeout | null = null;\nlet isSyncing = false;\n\n/**\n * Atomic file write to prevent corruption from concurrent writes\n */\nasync function atomicWriteFile(filePath: string, content: string): Promise<void> {\n const randomSuffix = Math.random().toString(36).substring(2, 15);\n const tempPath = `${filePath}.${process.pid}.${Date.now()}.${randomSuffix}.tmp`;\n\n try {\n await fs.promises.writeFile(tempPath, content, 'utf-8');\n await fs.promises.rename(tempPath, filePath);\n } catch (error) {\n try {\n await fs.promises.unlink(tempPath);\n } catch {\n // Ignore cleanup errors\n }\n throw error;\n }\n}\n\n/**\n * Fetch providers from all gateways\n */\nasync function fetchProvidersFromGateways(): Promise<{\n providers: Record<string, ProviderConfig>;\n models: Record<string, string[]>;\n}> {\n const allProviders: Record<string, ProviderConfig> = {};\n const allModels: Record<string, string[]> = {};\n\n const gateways = [new ModelsDevGateway({}), new NetlifyGateway()];\n\n for (const gateway of gateways) {\n try {\n const providers = await gateway.fetchProviders();\n\n // models.dev is a provider registry, not a true gateway - don't prefix its providers\n const isProviderRegistry = gateway.id === 'models.dev';\n\n for (const [providerId, config] of Object.entries(providers)) {\n const typeProviderId = isProviderRegistry\n ? providerId\n : providerId === gateway.id\n ? gateway.id\n : `${gateway.id}/${providerId}`;\n\n allProviders[typeProviderId] = config;\n allModels[typeProviderId] = config.models.sort();\n }\n } catch (error) {\n console.warn(`[GatewaySync] Failed to fetch from ${gateway.id}:`, error);\n }\n }\n\n return { providers: allProviders, models: allModels };\n}\n\n/**\n * Generate TypeScript type definitions content\n */\nfunction generateTypesContent(models: Record<string, string[]>): string {\n const providerModelsEntries = Object.entries(models)\n .map(([provider, modelList]) => {\n const modelsList = modelList.map(m => `'${m}'`);\n const needsQuotes = /[^a-zA-Z0-9_$]/.test(provider);\n const providerKey = needsQuotes ? `'${provider}'` : provider;\n const singleLine = ` readonly ${providerKey}: readonly [${modelsList.join(', ')}];`;\n\n if (singleLine.length > 120) {\n const formattedModels = modelList.map(m => ` '${m}',`).join('\\n');\n return ` readonly ${providerKey}: readonly [\\n${formattedModels}\\n ];`;\n }\n\n return singleLine;\n })\n .join('\\n');\n\n return `/**\n * THIS FILE IS AUTO-GENERATED - DO NOT EDIT\n * Generated from model gateway providers\n */\n\nexport type ProviderModelsMap = {\n${providerModelsEntries}\n};\n\nexport type Provider = keyof ProviderModelsMap;\n\nexport interface ProviderModels {\n [key: string]: string[];\n}\n\nexport type ModelRouterModelId =\n | {\n [P in Provider]: \\`\\${P}/\\${ProviderModelsMap[P][number]}\\`;\n }[Provider]\n | (string & {});\n\nexport type ModelForProvider<P extends Provider> = ProviderModelsMap[P][number];\n`;\n}\n\n/**\n * Get the last sync time from disk\n */\nfunction getLastSyncTime(): Date | null {\n try {\n if (!fs.existsSync(CACHE_FILE)) {\n return null;\n }\n const timestamp = fs.readFileSync(CACHE_FILE, 'utf-8').trim();\n return new Date(parseInt(timestamp, 10));\n } catch {\n return null;\n }\n}\n\n/**\n * Save the last sync time to disk\n */\nfunction saveLastSyncTime(date: Date): void {\n try {\n if (!fs.existsSync(CACHE_DIR)) {\n fs.mkdirSync(CACHE_DIR, { recursive: true });\n }\n fs.writeFileSync(CACHE_FILE, date.getTime().toString(), 'utf-8');\n } catch (error) {\n console.warn('[GatewaySync] Failed to save sync time:', error);\n }\n}\n\n/**\n * Sync gateways and update the global cache\n */\nexport async function syncGateways(force = false): Promise<void> {\n if (isSyncing && !force) {\n return;\n }\n\n // Check if we synced recently (within the last 5 minutes)\n if (!force) {\n const lastSync = getLastSyncTime();\n if (lastSync) {\n const timeSinceSync = Date.now() - lastSync.getTime();\n if (timeSinceSync < DEFAULT_SYNC_INTERVAL_MS) {\n // console.debug(`[GatewaySync] Skipping sync, last sync was ${Math.round(timeSinceSync / 1000)}s ago`)\n return;\n }\n }\n }\n\n isSyncing = true;\n\n try {\n // console.debug(\"[GatewaySync] Starting gateway sync...\")\n\n const { providers, models } = await fetchProvidersFromGateways();\n\n // Ensure cache directory exists\n await fs.promises.mkdir(CACHE_DIR, { recursive: true });\n\n // Write registry JSON\n const registryData = {\n providers,\n models,\n version: '1.0.0',\n };\n await atomicWriteFile(GLOBAL_PROVIDER_REGISTRY_JSON, JSON.stringify(registryData, null, 2));\n\n // Write types file\n const typesContent = generateTypesContent(models);\n await atomicWriteFile(GLOBAL_PROVIDER_TYPES_DTS, typesContent);\n\n // Save sync time\n const now = new Date();\n saveLastSyncTime(now);\n\n // console.debug(`[GatewaySync] ✅ Sync completed at ${now.toISOString()}`)\n } catch (error) {\n console.error('[GatewaySync] ❌ Sync failed:', error);\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\n syncGateways().catch(console.error);\n\n // Set up periodic sync\n syncInterval = setInterval(() => {\n syncGateways().catch(console.error);\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","/**\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 { LibSQLStore } from '@mastra/libsql';\nimport { PostgresStore } from '@mastra/pg';\n\nimport type { StorageConfig, PgStorageConfig } from './project.js';\nimport { getDatabasePath } from './project.js';\n\nexport interface StorageResult {\n storage: MastraCompositeStore;\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 });\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 }),\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 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 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 };\n}\n","import { Agent } from '@mastra/core/agent';\nimport { Harness } from '@mastra/core/harness';\nimport type {\n CustomAvailableModel,\n HeartbeatHandler,\n HarnessConfig,\n HarnessMode,\n HarnessSubagent,\n} from '@mastra/core/harness';\nimport { PROVIDER_REGISTRY } from '@mastra/core/llm';\nimport type { ProviderConfig } from '@mastra/core/llm';\nimport type { RequestContext } from '@mastra/core/request-context';\n\nimport {\n createHarnessModesFromDefinitions,\n createHarnessSubagentsFromDefinitions,\n getAllowedSubagentIdsForMode,\n getSubagentModeMap,\n loadAgentDefinitionsCached,\n} from './agents/agent-definitions.js';\nimport { getDynamicInstructions } from './agents/instructions.js';\nimport { getDynamicMemory } from './agents/memory.js';\nimport { getDynamicModel, resolveModel } from './agents/model.js';\nimport { applyModeScopedSubagentGuardrails } from './agents/subagent-tool.js';\nimport { createDynamicTools } from './agents/tools.js';\n\nimport { getDynamicWorkspace } from './agents/workspace.js';\nimport { AuthStorage } from './auth/storage.js';\nimport { HookManager } from './hooks/index.js';\nimport { lspManager } from './lsp/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 getCustomProviderId,\n loadSettingsCached,\n resolveModelDefaults,\n resolveOmModel,\n saveSettings,\n toCustomProviderModelId,\n} from './onboarding/settings.js';\nimport { getToolCategory } from './permissions.js';\nimport { setAuthStorage } from './providers/claude-max.js';\nimport { setAuthStorage as setOpenAIAuthStorage } from './providers/openai-codex.js';\n\nimport { stateSchema } from './schema.js';\nimport type { MastraCodeState } from './schema.js';\n\nimport { syncGateways } from './utils/gateway-sync.js';\nimport { detectProject, getStorageConfig, getResourceIdOverride } from './utils/project.js';\nimport type { StorageConfig } from './utils/project.js';\nimport { createStorage } from './utils/storage-factory.js';\nimport { acquireThreadLock, releaseThreadLock } from './utils/thread-lock.js';\n\nconst PROVIDER_TO_OAUTH_ID: Record<string, string> = {\n anthropic: 'anthropic',\n openai: 'openai-codex',\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<MastraCodeState>[];\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 /** Initial state overrides (yolo, thinkingLevel, etc.) */\n initialState?: Record<string, unknown>;\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 /** 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\nexport function createAuthStorage() {\n const authStorage = new AuthStorage();\n setAuthStorage(authStorage);\n setOpenAIAuthStorage(authStorage);\n return authStorage;\n}\n\nexport async function createMastraCode(config?: MastraCodeConfig) {\n const cwd = config?.cwd ?? process.cwd();\n\n // Auth storage (shared with Claude Max / OpenAI providers and Harness)\n const authStorage = createAuthStorage();\n\n // Project detection\n const project = detectProject(cwd);\n\n const resourceIdOverride = getResourceIdOverride(project.rootPath);\n if (resourceIdOverride) {\n project.resourceId = resourceIdOverride;\n project.resourceIdOverride = true;\n }\n\n lspManager.prewarmWorkspace(project.rootPath);\n\n // Load global settings to resolve storage preferences (needed before storage creation)\n const globalSettings = loadSettingsCached();\n\n // Storage\n const storageConfig = config?.storage ?? getStorageConfig(project.rootPath, globalSettings.storage);\n const storageResult = await createStorage(storageConfig);\n const storage = storageResult.storage;\n const storageWarning = storageResult.warning;\n\n const memory = getDynamicMemory(storage);\n\n // MCP\n const mcpManager = config?.disableMcp ? undefined : createMcpManager(project.rootPath, config?.mcpServers);\n\n // Hooks\n const hookManager = config?.disableHooks ? undefined : new HookManager(project.rootPath, 'session-init');\n\n if (hookManager?.hasHooks()) {\n const hookConfig = hookManager.getConfig();\n const hookCount = Object.values(hookConfig).reduce((sum, hooks) => sum + (hooks?.length ?? 0), 0);\n console.info(`Hooks: ${hookCount} hook(s) configured`);\n }\n\n // Agent\n const codeAgent = new Agent({\n id: 'code-agent',\n name: 'Code Agent',\n instructions: getDynamicInstructions,\n model: getDynamicModel,\n tools: createDynamicTools(mcpManager, config?.extraTools, hookManager, config?.disabledTools),\n });\n\n const agentRegistry = loadAgentDefinitionsCached(project.rootPath);\n const defaultSubagents = createHarnessSubagentsFromDefinitions(agentRegistry);\n const defaultModes: HarnessMode<MastraCodeState>[] = createHarnessModesFromDefinitions(agentRegistry, codeAgent);\n\n const defaultHeartbeatHandlers: HeartbeatHandler[] = [\n {\n id: 'gateway-sync',\n intervalMs: 5 * 60 * 1000,\n handler: () => syncGateways(),\n },\n ];\n\n // Build lightweight provider access for resolving built-in packs at startup.\n // Anthropic/OpenAI use AuthStorage only; other providers use env API keys.\n // Also scan the full provider registry so configured env API keys satisfy access checks.\n const anthropicCred = authStorage.get('anthropic');\n const openaiCred = authStorage.get('openai-codex');\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 google:\n authStorage.get('google')?.type === 'api_key' && (authStorage.get('google') as { key?: string }).key?.trim().length\n ? 'apikey'\n : process.env.GOOGLE_GENERATIVE_AI_API_KEY\n ? 'apikey'\n : false,\n cerebras: process.env.CEREBRAS_API_KEY ? 'apikey' : false,\n deepseek: process.env.DEEPSEEK_API_KEY ? 'apikey' : false,\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]) continue;\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, [], agentRegistry.modes);\n const builtinOmPacks = getAvailableOmPacks(startupAccess);\n const effectiveDefaults = resolveModelDefaults(globalSettings, builtinPacks);\n const effectiveOmModel = resolveOmModel(globalSettings, builtinOmPacks);\n\n // Apply resolved model defaults to modes\n const modes = (config?.modes ?? defaultModes).map(mode => {\n const savedModel = effectiveDefaults[mode.id];\n return savedModel ? { ...mode, defaultModelId: savedModel } : mode;\n });\n\n // Map subagent types to mode models: explore→fast, plan→plan, execute→build\n const subagentModeMap = getSubagentModeMap(agentRegistry);\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 = (config?.subagents ?? defaultSubagents).map(sa => {\n const modeId = subagentModeMap[sa.id];\n const model = modeId ? effectiveDefaults[modeId] : undefined;\n let filtered = sa;\n if (config?.disabledTools?.length) {\n if (sa.allowedWorkspaceTools) {\n filtered = {\n ...filtered,\n allowedWorkspaceTools: sa.allowedWorkspaceTools.filter(t => !config.disabledTools!.includes(t)),\n };\n }\n if (sa.tools) {\n filtered = {\n ...filtered,\n tools: Object.fromEntries(Object.entries(sa.tools).filter(([k]) => !config.disabledTools!.includes(k))),\n };\n }\n }\n return model ? { ...filtered, defaultModelId: model } : filtered;\n });\n\n // Build initial state with global preferences\n const globalInitialState: Record<string, unknown> = {};\n if (effectiveOmModel) {\n globalInitialState.observerModelId = effectiveOmModel;\n globalInitialState.reflectorModelId = effectiveOmModel;\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') {\n globalInitialState.subagentModelId = modelId;\n } else {\n globalInitialState[`subagentModelId_${key}`] = modelId;\n }\n }\n const harness = new Harness<any>({\n id: 'mastra-code',\n resourceId: project.resourceId,\n storage,\n memory,\n stateSchema,\n subagents,\n resolveModel: modelId => resolveModel(modelId) as any,\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 } as any,\n workspace: config?.workspace ?? getDynamicWorkspace,\n modes,\n heartbeatHandlers: config?.heartbeatHandlers ?? defaultHeartbeatHandlers,\n modelAuthChecker: provider => {\n const oauthId = PROVIDER_TO_OAUTH_ID[provider];\n if (oauthId && authStorage.isLoggedIn(oauthId)) {\n return true;\n }\n if (provider === 'anthropic') {\n const cred = authStorage.get('anthropic');\n if (cred?.type === 'api_key' && cred.key.trim().length > 0) {\n return true;\n }\n }\n if (provider === 'openai') {\n const cred = authStorage.get('openai-codex');\n if (cred?.type === 'api_key' && cred.key.trim().length > 0) {\n return true;\n }\n }\n if (provider === 'google') {\n const cred = authStorage.get('google');\n if (cred?.type === 'api_key' && cred.key.trim().length > 0) {\n return true;\n }\n }\n\n const customProvider = loadSettingsCached().customProviders.find(entry => {\n return provider === getCustomProviderId(entry.name);\n });\n if (customProvider) {\n return true;\n }\n return undefined;\n },\n modelUseCountProvider: () => loadSettingsCached().modelUseCounts,\n modelUseCountTracker: modelId => {\n try {\n const settings = loadSettingsCached();\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 customModelCatalogProvider: () => {\n const settings = loadSettingsCached();\n const customModels: CustomAvailableModel[] = [];\n for (const provider of settings.customProviders) {\n const providerId = getCustomProviderId(provider.name);\n for (const modelName of provider.models) {\n customModels.push({\n id: toCustomProviderModelId(provider.name, modelName),\n provider: providerId,\n modelName,\n hasApiKey: true,\n apiKeyEnvVar: undefined,\n });\n }\n }\n return customModels;\n },\n threadLock: {\n acquire: acquireThreadLock,\n release: releaseThreadLock,\n },\n });\n\n applyModeScopedSubagentGuardrails({\n harness,\n subagents,\n resolveModel: modelId => resolveModel(modelId) as any,\n getAllowedSubagentIdsForMode: modeId => getAllowedSubagentIdsForMode(agentRegistry, modeId),\n });\n\n // Sync hookManager session ID on thread changes\n if (hookManager) {\n harness.subscribe(event => {\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 return { harness, mcpManager, hookManager, authStorage, resolveModel, storageWarning };\n}\n"]}