mastracode 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/CHANGELOG.md +328 -0
  2. package/LICENSE.md +15 -0
  3. package/README.md +68 -29
  4. package/dist/agents/memory.d.ts.map +1 -1
  5. package/dist/agents/model.d.ts +17 -6
  6. package/dist/agents/model.d.ts.map +1 -1
  7. package/dist/agents/prompts/index.d.ts.map +1 -1
  8. package/dist/agents/prompts/tool-guidance.d.ts +2 -0
  9. package/dist/agents/prompts/tool-guidance.d.ts.map +1 -1
  10. package/dist/agents/subagents/audit-tests.d.ts +0 -7
  11. package/dist/agents/subagents/audit-tests.d.ts.map +1 -1
  12. package/dist/agents/subagents/execute.d.ts +0 -7
  13. package/dist/agents/subagents/execute.d.ts.map +1 -1
  14. package/dist/agents/subagents/explore.d.ts +0 -7
  15. package/dist/agents/subagents/explore.d.ts.map +1 -1
  16. package/dist/agents/subagents/index.d.ts.map +1 -1
  17. package/dist/agents/subagents/plan.d.ts +0 -7
  18. package/dist/agents/subagents/plan.d.ts.map +1 -1
  19. package/dist/agents/tools.d.ts +3 -1
  20. package/dist/agents/tools.d.ts.map +1 -1
  21. package/dist/agents/workspace.d.ts +4 -1
  22. package/dist/agents/workspace.d.ts.map +1 -1
  23. package/dist/{chunk-K4WJUBEC.cjs → chunk-AJEYT7X3.cjs} +763 -429
  24. package/dist/chunk-AJEYT7X3.cjs.map +1 -0
  25. package/dist/{chunk-U5A7TFNT.js → chunk-CC2724NI.js} +46 -10
  26. package/dist/chunk-CC2724NI.js.map +1 -0
  27. package/dist/{chunk-REVOTI2T.js → chunk-JI4M5525.js} +740 -412
  28. package/dist/chunk-JI4M5525.js.map +1 -0
  29. package/dist/{chunk-Z4QRXVST.cjs → chunk-MBPGUMYQ.cjs} +325 -251
  30. package/dist/chunk-MBPGUMYQ.cjs.map +1 -0
  31. package/dist/{chunk-MT3YCFCC.cjs → chunk-OEDRHUU5.cjs} +47 -9
  32. package/dist/chunk-OEDRHUU5.cjs.map +1 -0
  33. package/dist/{chunk-M5LKPQB4.js → chunk-WKPHD54B.js} +283 -209
  34. package/dist/chunk-WKPHD54B.js.map +1 -0
  35. package/dist/{chunk-C4X3C2DL.cjs → chunk-XVYUS2EA.cjs} +2213 -1035
  36. package/dist/chunk-XVYUS2EA.cjs.map +1 -0
  37. package/dist/{chunk-X3BGE7CL.js → chunk-YQNZ7DHQ.js} +1788 -613
  38. package/dist/chunk-YQNZ7DHQ.js.map +1 -0
  39. package/dist/cli.cjs +79 -31
  40. package/dist/cli.cjs.map +1 -1
  41. package/dist/cli.js +71 -23
  42. package/dist/cli.js.map +1 -1
  43. package/dist/clipboard/index.d.ts +5 -0
  44. package/dist/clipboard/index.d.ts.map +1 -1
  45. package/dist/error-classification.d.ts +10 -0
  46. package/dist/error-classification.d.ts.map +1 -0
  47. package/dist/index.cjs +2 -2
  48. package/dist/index.d.ts +10 -3
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +1 -1
  51. package/dist/mcp/config.d.ts +8 -0
  52. package/dist/mcp/config.d.ts.map +1 -1
  53. package/dist/mcp/index.d.ts +1 -1
  54. package/dist/mcp/index.d.ts.map +1 -1
  55. package/dist/mcp/manager.d.ts +4 -2
  56. package/dist/mcp/manager.d.ts.map +1 -1
  57. package/dist/mcp/types.d.ts +30 -3
  58. package/dist/mcp/types.d.ts.map +1 -1
  59. package/dist/onboarding/onboarding-inline.d.ts +2 -0
  60. package/dist/onboarding/onboarding-inline.d.ts.map +1 -1
  61. package/dist/onboarding/packs.d.ts +1 -0
  62. package/dist/onboarding/packs.d.ts.map +1 -1
  63. package/dist/onboarding/settings.d.ts +37 -2
  64. package/dist/onboarding/settings.d.ts.map +1 -1
  65. package/dist/permissions-S3LGXIDB.js +3 -0
  66. package/dist/{permissions-CVXKYIWR.js.map → permissions-S3LGXIDB.js.map} +1 -1
  67. package/dist/permissions-VGABAVGD.cjs +40 -0
  68. package/dist/{permissions-2HIUSRQN.cjs.map → permissions-VGABAVGD.cjs.map} +1 -1
  69. package/dist/permissions.d.ts.map +1 -1
  70. package/dist/providers/claude-max.d.ts +13 -0
  71. package/dist/providers/claude-max.d.ts.map +1 -1
  72. package/dist/providers/openai-codex.d.ts +1 -0
  73. package/dist/providers/openai-codex.d.ts.map +1 -1
  74. package/dist/tool-names.d.ts +68 -0
  75. package/dist/tool-names.d.ts.map +1 -0
  76. package/dist/tools/ast-smart-edit.d.ts +77 -5
  77. package/dist/tools/ast-smart-edit.d.ts.map +1 -1
  78. package/dist/tools/index.d.ts +2 -2
  79. package/dist/tools/index.d.ts.map +1 -1
  80. package/dist/tools/string-replace-lsp.d.ts +15 -0
  81. package/dist/tools/string-replace-lsp.d.ts.map +1 -1
  82. package/dist/tools/subagent.d.ts.map +1 -1
  83. package/dist/tools/utils.d.ts +4 -2
  84. package/dist/tools/utils.d.ts.map +1 -1
  85. package/dist/tui/command-dispatch.d.ts.map +1 -1
  86. package/dist/tui/commands/clone.d.ts +29 -0
  87. package/dist/tui/commands/clone.d.ts.map +1 -0
  88. package/dist/tui/commands/custom-providers.d.ts +8 -0
  89. package/dist/tui/commands/custom-providers.d.ts.map +1 -0
  90. package/dist/tui/commands/index.d.ts +3 -1
  91. package/dist/tui/commands/index.d.ts.map +1 -1
  92. package/dist/tui/commands/mcp.d.ts.map +1 -1
  93. package/dist/tui/commands/models-pack.d.ts +4 -0
  94. package/dist/tui/commands/models-pack.d.ts.map +1 -1
  95. package/dist/tui/commands/om.d.ts.map +1 -1
  96. package/dist/tui/commands/report-issue.d.ts +3 -0
  97. package/dist/tui/commands/report-issue.d.ts.map +1 -0
  98. package/dist/tui/commands/resource.d.ts.map +1 -1
  99. package/dist/tui/commands/settings.d.ts.map +1 -1
  100. package/dist/tui/commands/threads.d.ts +1 -0
  101. package/dist/tui/commands/threads.d.ts.map +1 -1
  102. package/dist/tui/components/ask-question-inline.d.ts +3 -0
  103. package/dist/tui/components/ask-question-inline.d.ts.map +1 -1
  104. package/dist/tui/components/custom-editor.d.ts +1 -1
  105. package/dist/tui/components/custom-editor.d.ts.map +1 -1
  106. package/dist/tui/components/help-overlay.d.ts.map +1 -1
  107. package/dist/tui/components/plan-approval-inline.d.ts.map +1 -1
  108. package/dist/tui/components/settings.d.ts +2 -0
  109. package/dist/tui/components/settings.d.ts.map +1 -1
  110. package/dist/tui/components/subagent-execution.d.ts +6 -1
  111. package/dist/tui/components/subagent-execution.d.ts.map +1 -1
  112. package/dist/tui/components/thread-selector.d.ts +6 -0
  113. package/dist/tui/components/thread-selector.d.ts.map +1 -1
  114. package/dist/tui/components/tool-execution-enhanced.d.ts +1 -0
  115. package/dist/tui/components/tool-execution-enhanced.d.ts.map +1 -1
  116. package/dist/tui/components/tool-validation-error.d.ts.map +1 -1
  117. package/dist/tui/handlers/message.d.ts.map +1 -1
  118. package/dist/tui/handlers/prompts.d.ts +6 -0
  119. package/dist/tui/handlers/prompts.d.ts.map +1 -1
  120. package/dist/tui/handlers/subagent.d.ts.map +1 -1
  121. package/dist/tui/mastra-tui.d.ts +14 -5
  122. package/dist/tui/mastra-tui.d.ts.map +1 -1
  123. package/dist/tui/render-messages.d.ts.map +1 -1
  124. package/dist/tui/setup.d.ts.map +1 -1
  125. package/dist/tui/state.d.ts +4 -5
  126. package/dist/tui/state.d.ts.map +1 -1
  127. package/dist/tui.cjs +19 -19
  128. package/dist/tui.js +2 -2
  129. package/dist/utils/debug-log.d.ts +12 -0
  130. package/dist/utils/debug-log.d.ts.map +1 -0
  131. package/dist/utils/plans.d.ts +7 -0
  132. package/dist/utils/plans.d.ts.map +1 -0
  133. package/dist/utils/update-check.d.ts +40 -0
  134. package/dist/utils/update-check.d.ts.map +1 -0
  135. package/package.json +8 -8
  136. package/dist/chunk-C4X3C2DL.cjs.map +0 -1
  137. package/dist/chunk-K4WJUBEC.cjs.map +0 -1
  138. package/dist/chunk-M5LKPQB4.js.map +0 -1
  139. package/dist/chunk-MT3YCFCC.cjs.map +0 -1
  140. package/dist/chunk-REVOTI2T.js.map +0 -1
  141. package/dist/chunk-U5A7TFNT.js.map +0 -1
  142. package/dist/chunk-X3BGE7CL.js.map +0 -1
  143. package/dist/chunk-Z4QRXVST.cjs.map +0 -1
  144. package/dist/docs/SKILL.md +0 -30
  145. package/dist/docs/assets/SOURCE_MAP.json +0 -11
  146. package/dist/docs/references/docs-mastra-code-configuration.md +0 -299
  147. package/dist/docs/references/docs-mastra-code-customization.md +0 -228
  148. package/dist/docs/references/docs-mastra-code-modes.md +0 -104
  149. package/dist/docs/references/docs-mastra-code-overview.md +0 -135
  150. package/dist/docs/references/docs-mastra-code-tools.md +0 -229
  151. package/dist/docs/references/reference-mastra-code-createMastraCode.md +0 -108
  152. package/dist/permissions-2HIUSRQN.cjs +0 -40
  153. package/dist/permissions-CVXKYIWR.js +0 -3
  154. package/dist/tui/commands/models.d.ts +0 -3
  155. package/dist/tui/commands/models.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agents/prompts/base.ts","../src/agents/prompts/build.ts","../src/agents/prompts/plan.ts","../src/agents/prompts/fast.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/agents/memory.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":["join","existsSync","homedir","readFileSync","MC_TOOLS","hasTavilyKey","getCurrentGitBranch","resolveModel","getOmScope","Memory","requestSandboxAccessTool","createWebSearchTool","createWebExtractTool","anthropic","createAnthropic","openai","createOpenAI","path","os","fs","spawn","loadSingleConfig","mergeConfigs","path2","os2","fs2","validateConfig","MCPClient","z","ModelsDevGateway","NetlifyGateway","LibSQLStore","getDatabasePath","PostgresStore","AuthStorage","setAuthStorage","detectProject","getResourceIdOverride","loadSettings","getStorageConfig","Agent","getDynamicModel","createViewTool","createGrepTool","createGlobTool","createExecuteCommandTool","createWriteFileTool","createStringReplaceLspTool","exploreSubagent","planSubagent","executeSubagent","taskWriteTool","taskCheckTool","mastra","PROVIDER_REGISTRY","config","getAvailableModePacks","getAvailableOmPacks","resolveModelDefaults","resolveOmModel","harness","Harness","getToolCategory","getDynamicWorkspace","getCustomProviderId","saveSettings","toCustomProviderModelId","acquireThreadLock","releaseThreadLock"],"mappings":"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","file":"chunk-MBPGUMYQ.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 Mastra Code, an interactive CLI coding agent that helps users with software engineering tasks.\n\n# Environment\nWorking directory: ${ctx.projectPath}\nProject: ${ctx.projectName}\n${ctx.gitBranch ? `Git branch: ${ctx.gitBranch}` : 'Not a git repository'}\nPlatform: ${ctx.platform}\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: Mastra Code${ctx.modelId ? ` (${ctx.modelId})` : ''} <noreply@mastra.ai>\\` in the message body.\n\n## Pull Requests\nUse \\`gh pr create\\`. Include a summary of what changed and a test plan.\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","/**\n * Build mode prompt — full tool access, make changes and verify.\n */\n\nimport type { PromptContext } from './index.js';\n\n/**\n * Dynamic build mode prompt function.\n * When an approved plan exists in state, prepends it so the agent\n * knows exactly what to implement.\n */\nexport function buildModePromptFn(ctx: PromptContext): string {\n if (ctx.activePlan) {\n return (\n `# Approved Plan\n\n**${ctx.activePlan.title}**\n\n${ctx.activePlan.plan}\n\n---\n\nImplement the approved plan above. Follow the steps in order and verify each step works before moving on.\n\n` + buildModePrompt\n );\n }\n return buildModePrompt;\n}\n\nexport const buildModePrompt = `\n# Build Mode\n\nYou are in BUILD mode. You have full access to all tools and can read, write, edit, and execute commands.\n\n## Working Style\n\n**For simple tasks** (typo fixes, small edits, single-file changes):\n- Just do it. No need to explain your plan first.\n\n**For non-trivial tasks** (3+ files, architectural decisions, unclear requirements):\n- Use task_write to track your steps\n- Work on ONE step at a time — complete it and verify it works before moving on\n- If the approach is risky or ambiguous, ask the user before proceeding\n\n## The Implementation Loop\n\nFor each change you make:\n\n1. **Understand** — Read the relevant code. Check how similar things are done elsewhere.\n2. **Implement** — Make the change. Follow existing patterns and conventions.\n3. **Verify** — Test that it works. Don't assume — actually run it.\n4. **Clean up** — Ensure no broken code, no debug statements, no half-done features.\n\nOnly move to the next change after the current one is verified working.\n\n## Verification is Required\n\nBefore considering any task complete:\n- Run relevant tests (check package.json for test scripts)\n- For TypeScript, run \\`tsc --noEmit\\` to catch type errors\n- If there are no automated tests, manually verify the behavior works as expected\n- Use task_check to ensure all tracked tasks are done\n\n**Don't mark something as done until you've verified it actually works.**\n\n## Error Recovery\n\nWhen something breaks:\n1. Read the full error output carefully — don't guess\n2. Find the root cause, not just the symptom\n3. Fix it properly — no casts or suppressions to hide errors\n4. Re-run to confirm the fix\n5. If stuck after 2 attempts, tell the user what you've tried\n\n## Git in Build Mode\n\n- Don't commit unless asked — just report what you changed\n- Before committing, verify the code compiles and passes lint\n- Use descriptive branch names: \\`feat/...\\`, \\`fix/...\\`, \\`refactor/...\\`\n`;\n","/**\n * Plan mode prompt — read-only exploration and planning.\n */\n\nexport const planModePrompt = `\n# Plan Mode — READ-ONLY\n\nYou are in PLAN mode. Your job is to explore the codebase and design an implementation plan — NOT to make changes.\n\n## CRITICAL: Read-Only Mode\n\nThis mode is **strictly read-only**. You must NOT modify anything.\n\n- Do NOT modify, create, or delete any files\n- Do NOT run commands that change state (no git commit, no npm install, no file creation)\n- Do NOT run build commands, tests, or scripts that have side effects\n\nIf the user asks you to make changes while in Plan mode, explain that you're in read-only mode and they should switch to Build mode (\\`/mode build\\`) first.\n\n## Exploration Strategy\n\nBefore writing any plan, build a mental model of the codebase:\n1. Start with the directory structure (\\`view\\` on the project root or relevant subdirectory).\n2. Find the relevant entry points and core files using \\`search_content\\` and \\`find_files\\`.\n3. Read the actual code — don't assume based on file names alone.\n4. Trace data flow: where does input come from, how is it transformed, where does it go?\n5. Identify existing patterns the codebase uses (naming, structure, error handling, testing).\n\n## Your Plan Output\n\nProduce a clear, step-by-step plan with this structure:\n\n### Overview\nOne paragraph: what the change does and why.\n\n### Complexity Estimate\n- **Size**: Small (1-2 files) / Medium (3-5 files) / Large (6+ files)\n- **Risk**: Low (additive, no breaking changes) / Medium (modifies existing behavior) / High (architectural, affects many consumers)\n- **Dependencies**: List any new packages, external services, or migration steps needed.\n\n### Steps\nFor each step:\n1. **File**: path to create or modify\n2. **Change**: what to add/modify/remove, with enough specificity to implement directly\n3. **Why**: brief rationale connecting this step to the overall goal\n\n### Verification\n- What tests to run\n- What to check manually\n- What could go wrong\n\n## IMMEDIATE ACTION: Call submit_plan Tool\n\nAs soon as your plan is complete, **STOP** and call the \\`submit_plan\\` tool immediately.\n\n**CRITICAL:** Do NOT generate a long text response describing your plan. The plan content belongs in the \\`submit_plan\\` tool call, not in your text output.\n\nWhen done, call:\n\\`\\`\\`javascript\nsubmit_plan({\n title: \"short descriptive title\",\n plan: \"your full plan in markdown\"\n})\n\\`\\`\\`\n\nThe user will see the plan rendered inline and can:\n- **Approve** — automatically switches to Build mode for implementation\n- **Reject** — stays in Plan mode\n- **Request changes** — provides feedback for you to revise and resubmit\n\nDo NOT start implementing until the plan is approved. If rejected with feedback, revise the plan and call \\`submit_plan\\` again.\n`;\n","/**\n * Fast mode prompt — quick answers and small edits, minimal overhead.\n */\n\nexport const fastModePrompt = `\n# Fast Mode\n\nYou are in FAST mode. Optimize for speed and brevity.\n\n## Rules\n- Keep responses short. Under 200 words unless the task genuinely requires more.\n- Skip planning. Just do the task directly.\n- For questions: give the direct answer, not a tutorial.\n- For edits: make the change, show what you did, move on.\n- Don't explore the codebase more than necessary for the immediate task.\n\n## When to Use Tools vs. Just Answer\n- If the user asks a general programming question, answer directly from knowledge. Don't search the codebase.\n- If the user asks about THIS project's code, use tools to look it up — don't guess.\n- If the user asks for a quick edit and you know the file, read it and edit it. Don't ask for confirmation.\n- One tool call to read + one to edit is ideal. Minimize round trips.\n`;\n","/**\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 '.mastracode',\n];\n\nconst GLOBAL_LOCATIONS = ['.claude', '.mastracode', '.config/claude', '.config/mastracode'];\n\ninterface InstructionSource {\n path: string;\n content: string;\n scope: 'global' | 'project';\n}\n\n/**\n * Find the first existing instruction file at a given base path.\n * Prefers AGENTS.md over CLAUDE.md.\n */\nfunction findInstructionFile(basePath: string): string | null {\n for (const filename of INSTRUCTION_FILES) {\n const fullPath = join(basePath, filename);\n if (existsSync(fullPath)) {\n return fullPath;\n }\n }\n return null;\n}\n\n/**\n * Load all agent instruction files from global and project locations.\n * Returns an array of instruction sources, with global ones first.\n */\nexport function loadAgentInstructions(projectPath: string): 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\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\n sections.push(`# Tool Usage Rules\n\nIMPORTANT: You can ONLY call tools by their exact registered names listed below. Shell commands like \\`git\\`, \\`npm\\`, \\`ls\\`, etc. are NOT tools — they must be run via the \\`execute_command\\` tool.\n\nYou have access to the following tools. Use the RIGHT tool for the job:`);\n\n // --- Read tools (all modes) ---\n\n const readTools: string[] = [];\n\n if (!denied.has(MC_TOOLS.VIEW)) {\n readTools.push(`\n**${MC_TOOLS.VIEW}** — Read file contents\n- Use this to read files before editing them. NEVER propose changes to code you haven't read.\n- Use \\`offset\\` (1-indexed start line) and \\`limit\\` (number of lines) for large files.\n- Example: Read lines 50-100: \\`{ path: \"src/big-file.ts\", offset: 50, limit: 51 }\\`\n- To list directories, use \\`${MC_TOOLS.FIND_FILES}\\` instead.`);\n }\n\n if (!denied.has(MC_TOOLS.SEARCH_CONTENT)) {\n readTools.push(`\n**${MC_TOOLS.SEARCH_CONTENT}** — Search file contents using regex\n- Preferred for content search (finding functions, variables, error messages, imports, etc.)\n- Use \\`path\\` to filter by directory or glob pattern. Supports \\`contextLines\\`, \\`caseSensitive\\`, and \\`maxCount\\`.\n- Example: Find a function: \\`{ pattern: \"function handleSubmit\", path: \"**/*.ts\" }\\`\n- Example: Find imports: \\`{ pattern: \"from ['\\\\\"\\\\]express['\\\\\"\\\\]\", path: \"**/*.ts\" }\\`\n- Respects .gitignore by default.`);\n }\n\n if (!denied.has(MC_TOOLS.FIND_FILES)) {\n readTools.push(`\n**${MC_TOOLS.FIND_FILES}** — List files and directories as a tree\n- Preferred for exploring project structure and finding files by pattern.\n- Returns tree-style output. Respects .gitignore by default.\n- Example: List project root: \\`{ path: \"./\" }\\`\n- Example: Find test files: \\`{ path: \"./src\", pattern: \"**/*.test.ts\" }\\`\n- Example: Find config files: \\`{ pattern: \"*.config.{js,ts,json}\" }\\``);\n }\n\n if (!denied.has(MC_TOOLS.EXECUTE_COMMAND)) {\n readTools.push(`\n**${MC_TOOLS.EXECUTE_COMMAND}** — Run shell commands\n- Use for: git, npm/pnpm, docker, build tools, test runners, and other terminal operations.\n- Prefer dedicated tools for: file reading (${MC_TOOLS.VIEW}), file search (${MC_TOOLS.SEARCH_CONTENT}/${MC_TOOLS.FIND_FILES}), file editing (${MC_TOOLS.STRING_REPLACE_LSP}/${MC_TOOLS.WRITE_FILE}).\n- Commands have a 30-second default timeout. Use \\`timeout\\` for longer commands, \\`cwd\\` for working directory.\n- Use the \\`tail\\` parameter or pipe to \\`| tail -N\\` to limit output — the full output streams to the user, only the tail is returned to you. If you're building any kind of package you should be tailing.\n- Good: Run independent commands in parallel when possible.\n- Bad: Running \\`cat file.txt\\` — use the ${MC_TOOLS.VIEW} tool instead.`);\n }\n\n if (readTools.length > 0) {\n sections.push(readTools.join('\\n'));\n }\n\n // --- Write/edit tools (build & fast only) ---\n\n if (modeId !== 'plan') {\n const writeTools: string[] = [];\n\n if (!denied.has(MC_TOOLS.STRING_REPLACE_LSP)) {\n writeTools.push(`\n**${MC_TOOLS.STRING_REPLACE_LSP}** — Edit files by replacing exact text\n- You MUST read a file with \\`${MC_TOOLS.VIEW}\\` before editing it.\n- \\`old_string\\` must be an exact match of existing text in the file.\n- Provide enough surrounding context in \\`old_string\\` to make it unique.\n- Use \\`replace_all: true\\` to replace all occurrences (default: false, requires unique match).\n- For creating new files, use \\`${MC_TOOLS.WRITE_FILE}\\` instead.\n- Good: Include 2-3 lines of surrounding context to ensure uniqueness.\n- Bad: Using just \\`return true;\\` — too common, will match multiple places.`);\n }\n\n if (!denied.has(MC_TOOLS.WRITE_FILE)) {\n writeTools.push(`\n**${MC_TOOLS.WRITE_FILE}** — Create new files or overwrite existing ones\n- Use this to create new files.\n- If overwriting an existing file, you MUST have read it first with \\`${MC_TOOLS.VIEW}\\`.\n- Prefer editing existing files over creating new ones.`);\n }\n\n if (writeTools.length > 0) {\n sections.push(writeTools.join('\\n'));\n }\n }\n\n // --- Web tools (all modes, conditionally available) ---\n\n if (options.hasWebSearch) {\n const webTools: string[] = [];\n if (!denied.has('web_search')) webTools.push('**web_search**');\n if (!denied.has('web_extract')) webTools.push('**web_extract**');\n if (webTools.length > 0) {\n sections.push(`\n${webTools.join(' / ')} — Search the web / extract page content\n- Use for looking up documentation, error messages, package APIs.`);\n }\n }\n\n // --- Task management tools (all modes) ---\n\n const taskTools: string[] = [];\n\n if (!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 (!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 (!denied.has('subagent')) {\n sections.push(`\n**subagent** — Delegate a focused task to a specialized subagent\n- Only use subagents when you will spawn **multiple subagents in parallel**. If you only need one task done, do it yourself.\n- Subagent outputs are **untrusted**. Always review and verify the results.`);\n }\n\n return sections.join('\\n');\n}\n","/**\n * Prompt system — exports the prompt builder and mode-specific prompts.\n */\n\nexport { buildBasePrompt } from './base.js';\nexport { buildModePrompt, buildModePromptFn } from './build.js';\nexport { planModePrompt } from './plan.js';\nexport { fastModePrompt } from './fast.js';\n\nimport { hasTavilyKey } from '../../tools/index.js';\nimport { loadAgentInstructions, formatAgentInstructions } from './agent-instructions.js';\nimport { buildBasePrompt } from './base.js';\nimport type { PromptContext as BasePromptContext } from './base.js';\nimport { buildModePromptFn } from './build.js';\nimport { fastModePrompt } from './fast.js';\nimport { planModePrompt } from './plan.js';\nimport { buildToolGuidance } from './tool-guidance.js';\n\n// Extended prompt context that includes runtime information\nexport interface PromptContext extends Omit<BasePromptContext, 'toolGuidance'> {\n modeId: string;\n state?: any;\n currentDate: string;\n workingDir: string;\n}\n\nconst modePrompts: Record<string, string | ((ctx: PromptContext) => string)> = {\n build: buildModePromptFn,\n plan: planModePrompt,\n fast: fastModePrompt,\n};\n\n/**\n * Build the full system prompt for a given mode and context.\n * Combines the base prompt with mode-specific instructions.\n */\nexport function buildFullPrompt(ctx: PromptContext): string {\n // Determine whether web search tools are available\n const modelId = ctx.state?.currentModelId as string | undefined;\n const hasWebSearch = hasTavilyKey() || (!!modelId && modelId.startsWith('anthropic/'));\n\n // Collect per-tool deny rules so guidance omits denied tools\n const deniedTools = new Set<string>();\n const permRules = ctx.state?.permissionRules as { tools?: Record<string, string> } | undefined;\n if (permRules?.tools) {\n for (const [name, policy] of Object.entries(permRules.tools)) {\n if (policy === 'deny') deniedTools.add(name);\n }\n }\n\n // Build mode-aware tool guidance\n const toolGuidance = buildToolGuidance(ctx.modeId, { hasWebSearch, deniedTools });\n\n // Map new context to base context\n const baseCtx: BasePromptContext = {\n projectPath: ctx.workingDir,\n projectName: ctx.projectName || 'unknown',\n gitBranch: ctx.gitBranch,\n platform: process.platform,\n date: ctx.currentDate,\n mode: ctx.modeId,\n modelId: ctx.modelId,\n activePlan: ctx.state?.activePlan,\n toolGuidance,\n };\n\n const base = buildBasePrompt(baseCtx);\n const entry = modePrompts[ctx.modeId] || modePrompts.build;\n const modeSpecific = typeof entry === 'function' ? entry(ctx) : entry;\n\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 = loadAgentInstructions(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 { stateSchema } from '../schema.js';\nimport { getCurrentGitBranch } from '../utils/project.js';\nimport type { PromptContext } from './prompts/index.js';\nimport { buildFullPrompt } from './prompts/index.js';\n\nexport function getDynamicInstructions({ requestContext }: { requestContext: { get(key: string): unknown } }) {\n const harnessContext = requestContext.get('harness') as HarnessRequestContext<typeof stateSchema> | 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 return buildFullPrompt(promptCtx);\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","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 { stateSchema } 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<typeof stateSchema> | 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 = getOmScope(state?.projectPath);\n\n const obsThreshold = state?.observationThreshold ?? DEFAULT_OBS_THRESHOLD;\n const refThreshold = state?.reflectionThreshold ?? DEFAULT_REF_THRESHOLD;\n\n const cacheKey = `${obsThreshold}:${refThreshold}:${omScope}`;\n if (cachedMemory && cachedMemoryKey === cacheKey) {\n return cachedMemory;\n }\n\n cachedMemory = new Memory({\n storage,\n options: {\n observationalMemory: {\n enabled: true,\n scope: omScope,\n observation: {\n bufferTokens: 1 / 5,\n bufferActivation: 2000,\n model: getObserverModel,\n messageTokens: obsThreshold,\n blockAfter: 2,\n },\n reflection: {\n bufferActivation: 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 { 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 { McpManager } from '../mcp';\nimport type { stateSchema } from '../schema';\nimport { createWebSearchTool, createWebExtractTool, hasTavilyKey, requestSandboxAccessTool } from '../tools';\n\nexport function createDynamicTools(\n mcpManager?: McpManager,\n extraTools?: Record<string, any> | ((ctx: { requestContext: RequestContext }) => Record<string, any>),\n) {\n return function getDynamicTools({ requestContext }: { requestContext: RequestContext }) {\n const ctx = requestContext.get('harness') as HarnessRequestContext<typeof stateSchema> | undefined;\n const state = ctx?.getState?.();\n\n const modelId = state?.currentModelId;\n const isAnthropicModel = modelId?.startsWith('anthropic/');\n const isOpenAIModel = modelId?.startsWith('openai/');\n\n // Filesystem, grep, glob, edit, write, execute_command, and process\n // management tools are now provided by the workspace (see workspace.ts).\n // Only tools without a workspace equivalent remain here.\n const tools: Record<string, any> = {\n request_sandbox_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 // Remove tools that have a per-tool 'deny' policy so the model never sees them.\n const permissionRules = state?.permissionRules;\n if (permissionRules?.tools) {\n for (const [name, policy] of Object.entries(permissionRules.tools)) {\n if (policy === 'deny') {\n delete tools[name];\n }\n }\n }\n\n return tools;\n };\n}\n","/**\n * Hook configuration loading from filesystem.\n * Loads from global (~/.mastracode/hooks.json) and project (.mastracode/hooks.json).\n * Global hooks run first, project hooks append.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport 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(globalPath);\n const projectConfig = loadSingleConfig(projectPath);\n\n return mergeConfigs(globalConfig, projectConfig);\n}\n\nexport function getProjectHooksPath(projectDir: string): string {\n return path.join(projectDir, '.mastracode', 'hooks.json');\n}\n\nexport function getGlobalHooksPath(): string {\n return path.join(os.homedir(), '.mastracode', 'hooks.json');\n}\n\nfunction loadSingleConfig(filePath: string): HooksConfig {\n try {\n if (!fs.existsSync(filePath)) return {};\n const raw = fs.readFileSync(filePath, 'utf-8');\n return validateConfig(JSON.parse(raw));\n } catch {\n return {};\n }\n}\n\nfunction validateConfig(raw: unknown): HooksConfig {\n if (!raw || typeof raw !== 'object') return {};\n\n const config: HooksConfig = {};\n const obj = raw as Record<string, unknown>;\n\n for (const event of VALID_EVENTS) {\n if (Array.isArray(obj[event])) {\n const hooks = (obj[event] as unknown[]).filter(isValidHook);\n if (hooks.length > 0) {\n config[event] = hooks;\n }\n }\n }\n\n return config;\n}\n\nfunction isValidHook(raw: unknown): raw is HookDefinition {\n if (!raw || typeof raw !== 'object') return false;\n const obj = raw as Record<string, unknown>;\n return obj.type === 'command' && typeof obj.command === 'string';\n}\n\nfunction mergeConfigs(global: HooksConfig, project: HooksConfig): HooksConfig {\n const merged: HooksConfig = {};\n\n for (const event of VALID_EVENTS) {\n const combined = [...(global[event] ?? []), ...(project[event] ?? [])];\n if (combined.length > 0) {\n merged[event] = combined;\n }\n }\n\n return merged;\n}\n","/**\n * Type definitions for the hooks system.\n * Hooks are user-configured shell commands that run at lifecycle events.\n */\n\n// =============================================================================\n// Hook Event Names\n// =============================================================================\nexport type HookEventName =\n | 'PreToolUse'\n | 'PostToolUse'\n | 'Stop'\n | 'UserPromptSubmit'\n | 'SessionStart'\n | 'SessionEnd'\n | 'Notification';\n\nexport type BlockingHookEvent = 'PreToolUse' | 'Stop' | 'UserPromptSubmit';\n\nexport function isBlockingEvent(event: HookEventName): event is BlockingHookEvent {\n return event === 'PreToolUse' || event === 'Stop' || event === 'UserPromptSubmit';\n}\n\n// =============================================================================\n// Hook Configuration\n// =============================================================================\n\nexport interface HookMatcher {\n /** Regex pattern matched against tool_name (PreToolUse/PostToolUse only). */\n tool_name?: string;\n}\n\nexport interface HookDefinition {\n /** Hook type. Only \"command\" supported in phase 1. */\n type: 'command';\n /** Shell command to execute via /bin/sh -c. */\n command: string;\n /** Optional matcher to filter when this hook runs. */\n matcher?: HookMatcher;\n /** Timeout in ms. Default 10000. Process killed after timeout. */\n timeout?: number;\n /** Human-readable description for /hooks display. */\n description?: string;\n}\nexport interface HooksConfig {\n PreToolUse?: HookDefinition[];\n PostToolUse?: HookDefinition[];\n Stop?: HookDefinition[];\n UserPromptSubmit?: HookDefinition[];\n SessionStart?: HookDefinition[];\n SessionEnd?: HookDefinition[];\n Notification?: HookDefinition[];\n}\n\n// =============================================================================\n// Stdin Protocol (JSON sent to hook process)\n// =============================================================================\n\nexport interface HookStdinBase {\n session_id: string;\n cwd: string;\n hook_event_name: HookEventName;\n}\n\nexport interface HookStdinToolEvent extends HookStdinBase {\n hook_event_name: 'PreToolUse' | 'PostToolUse';\n tool_name: string;\n tool_input: unknown;\n tool_output?: unknown;\n tool_error?: boolean;\n}\n\nexport interface HookStdinUserPrompt extends HookStdinBase {\n hook_event_name: 'UserPromptSubmit';\n user_message: string;\n}\n\nexport interface HookStdinStop extends HookStdinBase {\n hook_event_name: 'Stop';\n assistant_message?: string;\n stop_reason: 'complete' | 'aborted' | 'error';\n}\nexport interface HookStdinSession extends HookStdinBase {\n hook_event_name: 'SessionStart' | 'SessionEnd';\n}\n\nexport interface HookStdinNotification extends HookStdinBase {\n hook_event_name: 'Notification';\n /** Why the notification fired: agent_done, ask_question, tool_approval, plan_approval, sandbox_access */\n reason: string;\n /** Optional human-readable message for the notification. */\n message?: string;\n}\n\nexport type HookStdin =\n | HookStdinToolEvent\n | HookStdinUserPrompt\n | HookStdinStop\n | HookStdinSession\n | HookStdinNotification;\n\n// =============================================================================\n// Stdout Protocol (JSON read from hook process)\n// =============================================================================\n\nexport interface HookStdout {\n decision?: 'allow' | 'block';\n reason?: string;\n additionalContext?: string;\n}\n\n// =============================================================================\n// Execution Results\n// =============================================================================\n\nexport interface HookResult {\n hook: HookDefinition;\n exitCode: number;\n stdout?: HookStdout;\n stderr?: string;\n timedOut: boolean;\n durationMs: number;\n}\n\nexport interface HookEventResult {\n allowed: boolean;\n blockReason?: string;\n additionalContext?: string;\n results: HookResult[];\n warnings: string[];\n}\n","/**\n * Hook process execution.\n * Spawns shell commands, handles stdin/stdout/exit-code protocol.\n */\n\nimport { spawn } from 'node:child_process';\nimport type { HookDefinition, HookStdin, HookResult, HookStdout, HookEventResult } from './types.js';\nimport { isBlockingEvent } from './types.js';\n\nconst DEFAULT_TIMEOUT = 10_000;\n\nexport async function executeHook(hook: HookDefinition, stdinPayload: HookStdin): Promise<HookResult> {\n const timeout = hook.timeout ?? DEFAULT_TIMEOUT;\n const startTime = Date.now();\n\n return new Promise<HookResult>(resolve => {\n const isWindows = process.platform === 'win32';\n const shell = isWindows ? 'cmd' : '/bin/sh';\n const shellArgs = isWindows ? ['/c', hook.command] : ['-c', hook.command];\n\n const child = spawn(shell, shellArgs, {\n stdio: ['pipe', 'pipe', 'pipe'],\n cwd: stdinPayload.cwd,\n env: {\n ...process.env,\n MASTRA_HOOK_EVENT: stdinPayload.hook_event_name,\n },\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n let resolved = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill('SIGKILL');\n }, timeout);\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', exitCode => {\n clearTimeout(timer);\n if (resolved) return;\n resolved = true;\n\n let parsedStdout: HookStdout | undefined;\n if (stdout.trim()) {\n try {\n parsedStdout = JSON.parse(stdout.trim()) as HookStdout;\n } catch {\n // Not valid JSON — ignore\n }\n }\n\n resolve({\n hook,\n exitCode: exitCode ?? 1,\n stdout: parsedStdout,\n stderr: stderr.trim() || undefined,\n timedOut,\n durationMs: Date.now() - startTime,\n });\n });\n\n child.on('error', error => {\n clearTimeout(timer);\n if (resolved) return;\n resolved = true;\n\n resolve({\n hook,\n exitCode: 1,\n stderr: error.message,\n timedOut: false,\n durationMs: Date.now() - startTime,\n });\n });\n\n try {\n child.stdin?.write(JSON.stringify(stdinPayload));\n child.stdin?.end();\n } catch {\n // stdin write failure — process continues\n }\n });\n}\n\nexport function matchesHook(hook: HookDefinition, context: { tool_name?: string }): boolean {\n if (!hook.matcher) return true;\n\n if (hook.matcher.tool_name) {\n if (!context.tool_name) return false;\n try {\n return new RegExp(hook.matcher.tool_name).test(context.tool_name);\n } catch {\n return false;\n }\n }\n\n return true;\n}\n\nexport async function runHooksForEvent(\n hooks: HookDefinition[],\n stdinPayload: HookStdin,\n matchContext: { tool_name?: string } = {},\n): Promise<HookEventResult> {\n const results: HookResult[] = [];\n const warnings: string[] = [];\n let additionalContext: string | undefined;\n\n const applicable = hooks.filter(h => matchesHook(h, matchContext));\n if (applicable.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const blocking = isBlockingEvent(stdinPayload.hook_event_name);\n\n for (const hook of applicable) {\n const result = await executeHook(hook, stdinPayload);\n results.push(result);\n\n if (result.stdout?.additionalContext) {\n additionalContext = additionalContext\n ? `${additionalContext}\\n${result.stdout.additionalContext}`\n : result.stdout.additionalContext;\n }\n\n if (result.timedOut) {\n warnings.push(`Hook timed out after ${hook.timeout ?? DEFAULT_TIMEOUT}ms: ${hook.command}`);\n continue;\n }\n\n if (result.exitCode === 2 && blocking) {\n const reason = result.stdout?.reason || result.stderr || `Blocked by hook: ${hook.description || hook.command}`;\n\n return {\n allowed: false,\n blockReason: reason,\n additionalContext,\n results,\n warnings,\n };\n }\n\n if (result.exitCode === 0) continue;\n\n const warnMsg = result.stderr || `Hook exited with code ${result.exitCode}`;\n warnings.push(`${hook.description || hook.command}: ${warnMsg}`);\n }\n\n return { allowed: true, additionalContext, results, warnings };\n}\n","/**\n * HookManager — high-level orchestration for the hooks system.\n * Created once at startup, provides methods for each lifecycle event.\n */\nimport { 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. ~/.mastracode/mcp.json (global)\n * 3. .mastracode/mcp.json (project — highest priority)\n *\n * Project overrides global by server name. Claude Code config is lowest priority.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { McpConfig, McpServerConfig, McpSkippedServer } from './types.js';\n\nexport function loadMcpConfig(projectDir: string): McpConfig {\n const claudeConfig = loadClaudeSettings(projectDir);\n const globalConfig = loadSingleConfig(getGlobalMcpPath());\n const projectConfig = loadSingleConfig(getProjectMcpPath(projectDir));\n\n return mergeConfigs(claudeConfig, globalConfig, projectConfig);\n}\n\nexport function getProjectMcpPath(projectDir: string): string {\n return path.join(projectDir, '.mastracode', 'mcp.json');\n}\n\nexport function getGlobalMcpPath(): 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): McpConfig {\n try {\n if (!fs.existsSync(filePath)) return {};\n const raw = fs.readFileSync(filePath, 'utf-8');\n return validateConfig(JSON.parse(raw));\n } catch {\n return {};\n }\n}\n\nfunction loadClaudeSettings(projectDir: string): McpConfig {\n try {\n const filePath = getClaudeSettingsPath(projectDir);\n if (!fs.existsSync(filePath)) return {};\n const raw = fs.readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(raw);\n // Claude Code stores mcpServers at the top level of settings\n if (parsed?.mcpServers && typeof parsed.mcpServers === 'object') {\n return validateConfig({ mcpServers: parsed.mcpServers });\n }\n return {};\n } catch {\n return {};\n }\n}\n\n/**\n * Classify a raw server entry as stdio, http, or skip (with reason).\n */\nexport function classifyServerEntry(raw: unknown): { kind: 'stdio' | 'http' | 'skip'; reason?: string } {\n if (!raw || typeof raw !== 'object') {\n return { kind: 'skip', reason: 'Invalid entry: expected an object' };\n }\n\n const obj = raw as Record<string, unknown>;\n const hasCommand = typeof obj.command === 'string';\n const hasUrl = typeof obj.url === 'string';\n\n if (hasCommand && hasUrl) {\n return { kind: 'skip', reason: 'Cannot specify both \"command\" and \"url\"' };\n }\n\n if (hasCommand) {\n return { kind: 'stdio' };\n }\n\n if (hasUrl) {\n try {\n new URL(obj.url as string);\n } catch {\n return { kind: 'skip', reason: `Invalid URL: \"${obj.url}\"` };\n }\n return { kind: 'http' };\n }\n\n return { kind: 'skip', reason: 'Missing required field: \"command\" (stdio) or \"url\" (http)' };\n}\n\nexport function validateConfig(raw: unknown): McpConfig {\n if (!raw || typeof raw !== 'object') return {};\n const obj = raw as Record<string, unknown>;\n\n if (!obj.mcpServers || typeof obj.mcpServers !== 'object') return {};\n\n const servers: Record<string, McpServerConfig> = {};\n const skippedServers: McpSkippedServer[] = [];\n const rawServers = obj.mcpServers as Record<string, unknown>;\n\n for (const [name, entry] of Object.entries(rawServers)) {\n const classification = classifyServerEntry(entry);\n\n if (classification.kind === 'stdio') {\n const e = entry as Record<string, unknown>;\n servers[name] = {\n command: e.command as string,\n args: Array.isArray(e.args) ? (e.args as string[]) : undefined,\n env: typeof e.env === 'object' && e.env !== null ? (e.env as Record<string, string>) : undefined,\n };\n } else if (classification.kind === 'http') {\n const e = entry as Record<string, unknown>;\n 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): McpManager {\n let config = 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 = 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 // 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","/**\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, taskWriteTool, taskCheckTool } 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 { getDynamicInstructions } from './agents/instructions.js';\nimport { getDynamicMemory } from './agents/memory.js';\nimport { getDynamicModel, resolveModel } from './agents/model.js';\nimport { executeSubagent } from './agents/subagents/execute.js';\nimport { exploreSubagent } from './agents/subagents/explore.js';\nimport { planSubagent } from './agents/subagents/plan.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 { createMcpManager } from './mcp/index.js';\nimport type { ProviderAccess } from './onboarding/packs.js';\nimport { getAvailableModePacks, getAvailableOmPacks } from './onboarding/packs.js';\nimport {\n getCustomProviderId,\n loadSettings,\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 {\n createViewTool,\n createGrepTool,\n createGlobTool,\n createExecuteCommandTool,\n createWriteFileTool,\n createStringReplaceLspTool,\n} from './tools/index.js';\nimport { mastra } from './tui/theme.js';\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[];\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?: Record<string, any> | ((ctx: { requestContext: RequestContext }) => Record<string, any>);\n /** Custom storage config instead of auto-detected default */\n storage?: StorageConfig;\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['workspace'];\n /** Disable MCP server discovery. Default: false */\n disableMcp?: boolean;\n /** Disable hooks. Default: false */\n disableHooks?: boolean;\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 = new AuthStorage();\n setAuthStorage(authStorage);\n setOpenAIAuthStorage(authStorage);\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 // Load global settings to resolve storage preferences (needed before storage creation)\n const globalSettings = loadSettings();\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);\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),\n });\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 // Build subagent definitions with project-scoped tools\n const viewTool = createViewTool(project.rootPath);\n const grepTool = createGrepTool(project.rootPath);\n const globTool = createGlobTool(project.rootPath);\n const executeCommandTool = createExecuteCommandTool(project.rootPath);\n const writeFileTool = createWriteFileTool(project.rootPath);\n const stringReplaceLspTool = createStringReplaceLspTool(project.rootPath);\n\n const readOnlyTools = {\n view: viewTool,\n search_content: grepTool,\n find_files: globTool,\n };\n\n const defaultSubagents: HarnessSubagent[] = [\n {\n id: exploreSubagent.id,\n name: exploreSubagent.name,\n description:\n \"Read-only codebase exploration. Use for questions like 'find all usages of X', 'how does module Y work'.\",\n instructions: exploreSubagent.instructions,\n tools: readOnlyTools,\n },\n {\n id: planSubagent.id,\n name: planSubagent.name,\n description:\n \"Read-only analysis and planning. Use for 'create an implementation plan for X', 'analyze the architecture of Y'.\",\n instructions: planSubagent.instructions,\n tools: readOnlyTools,\n },\n {\n id: executeSubagent.id,\n name: executeSubagent.name,\n description:\n \"Task execution with write capabilities. Use for 'implement feature X', 'fix bug Y', 'refactor module Z'.\",\n instructions: executeSubagent.instructions,\n tools: {\n ...readOnlyTools,\n string_replace_lsp: stringReplaceLspTool,\n write_file: writeFileTool,\n execute_command: executeCommandTool,\n task_write: taskWriteTool,\n task_check: taskCheckTool,\n },\n },\n ];\n\n const defaultModes: HarnessMode[] = [\n {\n id: 'build',\n name: 'Build',\n default: true,\n defaultModelId: 'anthropic/claude-opus-4-6',\n color: mastra.purple,\n agent: codeAgent,\n },\n {\n id: 'plan',\n name: 'Plan',\n defaultModelId: 'openai/gpt-5.2-codex',\n color: mastra.blue,\n agent: codeAgent,\n },\n {\n id: 'fast',\n name: 'Fast',\n defaultModelId: 'cerebras/zai-glm-4.7',\n color: mastra.green,\n agent: codeAgent,\n },\n ];\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 // OAuth providers are checked via authStorage, env-only providers via process.env.\n // Also scan the full provider registry so any configured API key satisfies access checks.\n const startupAccess: ProviderAccess = {\n anthropic: authStorage.isLoggedIn('anthropic') ? 'oauth' : process.env.ANTHROPIC_API_KEY ? 'apikey' : false,\n openai: authStorage.isLoggedIn('openai-codex') ? 'oauth' : process.env.OPENAI_API_KEY ? 'apikey' : false,\n cerebras: process.env.CEREBRAS_API_KEY ? 'apikey' : false,\n google: process.env.GOOGLE_GENERATIVE_AI_API_KEY ? 'apikey' : false,\n deepseek: process.env.DEEPSEEK_API_KEY ? 'apikey' : false,\n };\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] && startupAccess[provider] !== false) continue; // Already enabled above\n const envVars = config?.apiKeyEnvVar;\n const envVarList = Array.isArray(envVars) ? envVars : envVars ? [envVars] : [];\n if (envVarList.some(envVar => process.env[envVar])) {\n startupAccess[provider] = 'apikey';\n }\n }\n } catch {\n // Registry may not be loaded yet; the 5 hardcoded providers are sufficient fallback\n }\n const builtinPacks = getAvailableModePacks(startupAccess);\n const builtinOmPacks = getAvailableOmPacks(startupAccess);\n const effectiveDefaults = resolveModelDefaults(globalSettings, builtinPacks);\n const 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: Record<string, string> = { explore: 'fast', plan: 'plan', execute: 'build' };\n const subagents = (config?.subagents ?? defaultSubagents).map(sa => {\n const modeId = subagentModeMap[sa.id];\n const model = modeId ? effectiveDefaults[modeId] : undefined;\n return model ? { ...sa, defaultModelId: model } : sa;\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 // 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\n const harness = new Harness({\n id: 'mastra-code',\n resourceId: project.resourceId,\n storage,\n memory,\n stateSchema,\n subagents,\n resolveModel,\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 },\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\n const customProvider = loadSettings().customProviders.find(entry => {\n return provider === getCustomProviderId(entry.name);\n });\n if (customProvider) {\n return true;\n }\n\n return undefined;\n },\n modelUseCountProvider: () => loadSettings().modelUseCounts,\n modelUseCountTracker: modelId => {\n try {\n const settings = loadSettings();\n settings.modelUseCounts[modelId] = (settings.modelUseCounts[modelId] ?? 0) + 1;\n saveSettings(settings);\n } catch (error) {\n console.error('Failed to persist model usage count', error);\n }\n },\n customModelCatalogProvider: () => {\n const settings = loadSettings();\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 // 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,5 +1,41 @@
1
1
  'use strict';
2
2
 
3
+ var workspace = require('@mastra/core/workspace');
4
+
5
+ // src/tool-names.ts
6
+ var MC_TOOLS = {
7
+ // Filesystem
8
+ VIEW: "view",
9
+ WRITE_FILE: "write_file",
10
+ STRING_REPLACE_LSP: "string_replace_lsp",
11
+ FIND_FILES: "find_files",
12
+ DELETE_FILE: "delete_file",
13
+ FILE_STAT: "file_stat",
14
+ MKDIR: "mkdir",
15
+ // Search
16
+ SEARCH_CONTENT: "search_content",
17
+ // Code intelligence
18
+ AST_SMART_EDIT: "ast_smart_edit",
19
+ // Sandbox
20
+ EXECUTE_COMMAND: "execute_command",
21
+ GET_PROCESS_OUTPUT: "get_process_output",
22
+ KILL_PROCESS: "kill_process"
23
+ };
24
+ var TOOL_NAME_OVERRIDES = {
25
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.READ_FILE]: { name: MC_TOOLS.VIEW },
26
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.WRITE_FILE]: { name: MC_TOOLS.WRITE_FILE },
27
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.EDIT_FILE]: { name: MC_TOOLS.STRING_REPLACE_LSP },
28
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.LIST_FILES]: { name: MC_TOOLS.FIND_FILES },
29
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.DELETE]: { name: MC_TOOLS.DELETE_FILE },
30
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.FILE_STAT]: { name: MC_TOOLS.FILE_STAT },
31
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.MKDIR]: { name: MC_TOOLS.MKDIR },
32
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.GREP]: { name: MC_TOOLS.SEARCH_CONTENT },
33
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.AST_EDIT]: { name: MC_TOOLS.AST_SMART_EDIT },
34
+ [workspace.WORKSPACE_TOOLS.SANDBOX.EXECUTE_COMMAND]: { name: MC_TOOLS.EXECUTE_COMMAND },
35
+ [workspace.WORKSPACE_TOOLS.SANDBOX.GET_PROCESS_OUTPUT]: { name: MC_TOOLS.GET_PROCESS_OUTPUT },
36
+ [workspace.WORKSPACE_TOOLS.SANDBOX.KILL_PROCESS]: { name: MC_TOOLS.KILL_PROCESS }
37
+ };
38
+
3
39
  // src/permissions.ts
4
40
  var TOOL_CATEGORIES = {
5
41
  read: {
@@ -21,20 +57,20 @@ var TOOL_CATEGORIES = {
21
57
  };
22
58
  var TOOL_CATEGORY_MAP = {
23
59
  // Read-only tools — always safe
24
- view: "read",
25
- search_content: "read",
26
- find_files: "read",
60
+ [MC_TOOLS.VIEW]: "read",
61
+ [MC_TOOLS.SEARCH_CONTENT]: "read",
62
+ [MC_TOOLS.FIND_FILES]: "read",
27
63
  web_search: "read",
28
64
  "web-search": "read",
29
65
  web_extract: "read",
30
66
  "web-extract": "read",
31
67
  // Edit tools — modify files
32
- string_replace_lsp: "edit",
33
- ast_smart_edit: "edit",
34
- write_file: "edit",
68
+ [MC_TOOLS.STRING_REPLACE_LSP]: "edit",
69
+ [MC_TOOLS.AST_SMART_EDIT]: "edit",
70
+ [MC_TOOLS.WRITE_FILE]: "edit",
35
71
  subagent: "edit",
36
72
  // Execute tools — run arbitrary commands
37
- execute_command: "execute"
73
+ [MC_TOOLS.EXECUTE_COMMAND]: "execute"
38
74
  // Interactive / planning tools — always allowed (no category needed)
39
75
  // ask_user, task_write, task_check, submit_plan, request_sandbox_access
40
76
  };
@@ -99,12 +135,14 @@ function resolveApproval(toolName, rules, sessionGrants) {
99
135
  }
100
136
 
101
137
  exports.DEFAULT_POLICIES = DEFAULT_POLICIES;
138
+ exports.MC_TOOLS = MC_TOOLS;
102
139
  exports.SessionGrants = SessionGrants;
103
140
  exports.TOOL_CATEGORIES = TOOL_CATEGORIES;
141
+ exports.TOOL_NAME_OVERRIDES = TOOL_NAME_OVERRIDES;
104
142
  exports.YOLO_POLICIES = YOLO_POLICIES;
105
143
  exports.createDefaultRules = createDefaultRules;
106
144
  exports.getToolCategory = getToolCategory;
107
145
  exports.getToolsForCategory = getToolsForCategory;
108
146
  exports.resolveApproval = resolveApproval;
109
- //# sourceMappingURL=chunk-MT3YCFCC.cjs.map
110
- //# sourceMappingURL=chunk-MT3YCFCC.cjs.map
147
+ //# sourceMappingURL=chunk-OEDRHUU5.cjs.map
148
+ //# sourceMappingURL=chunk-OEDRHUU5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tool-names.ts","../src/permissions.ts"],"names":["WORKSPACE_TOOLS"],"mappings":"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","file":"chunk-OEDRHUU5.cjs","sourcesContent":["/**\n * Mastracode tool name constants.\n *\n * These are the names exposed to the LLM via workspace tool name remapping.\n * Used throughout mastracode for permissions, TUI rendering, tool guidance,\n * subagent allowedTools, etc.\n *\n * The workspace tools get remapped from their core names (e.g. `mastra_workspace_read_file`)\n * to these names (e.g. `view`) via the `name` property in workspace tool config.\n */\n\nimport { WORKSPACE_TOOLS } from '@mastra/core/workspace';\n\nexport const MC_TOOLS = {\n // Filesystem\n VIEW: 'view',\n WRITE_FILE: 'write_file',\n STRING_REPLACE_LSP: 'string_replace_lsp',\n FIND_FILES: 'find_files',\n DELETE_FILE: 'delete_file',\n FILE_STAT: 'file_stat',\n MKDIR: 'mkdir',\n\n // Search\n SEARCH_CONTENT: 'search_content',\n\n // Code intelligence\n AST_SMART_EDIT: 'ast_smart_edit',\n\n // Sandbox\n EXECUTE_COMMAND: 'execute_command',\n GET_PROCESS_OUTPUT: 'get_process_output',\n KILL_PROCESS: 'kill_process',\n} as const;\n\n/**\n * Workspace tool name remapping config.\n * Maps core workspace tool constants to mastracode's tool names.\n * Pass this (or spread it) into `Workspace({ tools: ... })`.\n */\nexport const TOOL_NAME_OVERRIDES = {\n [WORKSPACE_TOOLS.FILESYSTEM.READ_FILE]: { name: MC_TOOLS.VIEW },\n [WORKSPACE_TOOLS.FILESYSTEM.WRITE_FILE]: { name: MC_TOOLS.WRITE_FILE },\n [WORKSPACE_TOOLS.FILESYSTEM.EDIT_FILE]: { name: MC_TOOLS.STRING_REPLACE_LSP },\n [WORKSPACE_TOOLS.FILESYSTEM.LIST_FILES]: { name: MC_TOOLS.FIND_FILES },\n [WORKSPACE_TOOLS.FILESYSTEM.DELETE]: { name: MC_TOOLS.DELETE_FILE },\n [WORKSPACE_TOOLS.FILESYSTEM.FILE_STAT]: { name: MC_TOOLS.FILE_STAT },\n [WORKSPACE_TOOLS.FILESYSTEM.MKDIR]: { name: MC_TOOLS.MKDIR },\n [WORKSPACE_TOOLS.FILESYSTEM.GREP]: { name: MC_TOOLS.SEARCH_CONTENT },\n [WORKSPACE_TOOLS.FILESYSTEM.AST_EDIT]: { name: MC_TOOLS.AST_SMART_EDIT },\n [WORKSPACE_TOOLS.SANDBOX.EXECUTE_COMMAND]: { name: MC_TOOLS.EXECUTE_COMMAND },\n [WORKSPACE_TOOLS.SANDBOX.GET_PROCESS_OUTPUT]: { name: MC_TOOLS.GET_PROCESS_OUTPUT },\n [WORKSPACE_TOOLS.SANDBOX.KILL_PROCESS]: { name: MC_TOOLS.KILL_PROCESS },\n} as const;\n","/**\n * Granular tool permission system.\n *\n * Tools are classified into categories by risk level.\n * Each category has a configurable policy: \"allow\", \"ask\", or \"deny\".\n * Session-scoped grants let the user approve a category once per session.\n */\n\nimport { MC_TOOLS } from './tool-names.js';\n\n// ---------------------------------------------------------------------------\n// Categories\n// ---------------------------------------------------------------------------\n\nexport type ToolCategory = 'read' | 'edit' | 'execute' | 'mcp';\n\nexport const TOOL_CATEGORIES: Record<ToolCategory, { label: string; description: string }> = {\n read: {\n label: 'Read',\n description: 'Read files, search, list directories',\n },\n edit: {\n label: 'Edit',\n description: 'Create, modify, or delete files',\n },\n execute: {\n label: 'Execute',\n description: 'Run shell commands',\n },\n mcp: {\n label: 'MCP',\n description: 'External MCP server tools',\n },\n};\n\n// ---------------------------------------------------------------------------\n// Tool → Category mapping\n// ---------------------------------------------------------------------------\n\nconst TOOL_CATEGORY_MAP: Record<string, ToolCategory> = {\n // Read-only tools — always safe\n [MC_TOOLS.VIEW]: 'read',\n [MC_TOOLS.SEARCH_CONTENT]: 'read',\n [MC_TOOLS.FIND_FILES]: 'read',\n web_search: 'read',\n 'web-search': 'read',\n web_extract: 'read',\n 'web-extract': 'read',\n // Edit tools — modify files\n [MC_TOOLS.STRING_REPLACE_LSP]: 'edit',\n [MC_TOOLS.AST_SMART_EDIT]: 'edit',\n [MC_TOOLS.WRITE_FILE]: 'edit',\n subagent: 'edit',\n\n // Execute tools — run arbitrary commands\n [MC_TOOLS.EXECUTE_COMMAND]: 'execute',\n\n // Interactive / planning tools — always allowed (no category needed)\n // ask_user, task_write, task_check, submit_plan, request_sandbox_access\n};\n\n// Tools that never need approval regardless of policy\nconst ALWAYS_ALLOW_TOOLS = new Set(['ask_user', 'task_write', 'task_check', 'submit_plan', 'request_sandbox_access']);\n\n/**\n * Get the category for a tool, or null if the tool is always-allowed.\n */\nexport function getToolCategory(toolName: string): ToolCategory | null {\n if (ALWAYS_ALLOW_TOOLS.has(toolName)) return null;\n return TOOL_CATEGORY_MAP[toolName] ?? 'mcp';\n}\n\n/**\n * Get the list of known tools for a given category.\n */\nexport function getToolsForCategory(category: ToolCategory): string[] {\n return Object.entries(TOOL_CATEGORY_MAP)\n .filter(([, cat]) => cat === category)\n .map(([tool]) => tool);\n}\n\n// ---------------------------------------------------------------------------\n// Policies\n// ---------------------------------------------------------------------------\n\nexport type PermissionPolicy = 'allow' | 'ask' | 'deny';\n\nexport interface PermissionRules {\n /** Policy per category. Missing categories default to their DEFAULT_POLICIES value. */\n categories: Partial<Record<ToolCategory, PermissionPolicy>>;\n /** Per-tool overrides. Tool name → policy. Takes precedence over category. */\n tools: Record<string, PermissionPolicy>;\n}\n\n/** Default policies when no rules are configured (YOLO=false equivalent). */\nexport const DEFAULT_POLICIES: Record<ToolCategory, PermissionPolicy> = {\n read: 'allow',\n edit: 'ask',\n execute: 'ask',\n mcp: 'ask',\n};\n\n/** YOLO-mode policies — everything auto-allowed. */\nexport const YOLO_POLICIES: Record<ToolCategory, PermissionPolicy> = {\n read: 'allow',\n edit: 'allow',\n execute: 'allow',\n mcp: 'allow',\n};\n\nexport function createDefaultRules(): PermissionRules {\n return {\n categories: { ...DEFAULT_POLICIES },\n tools: {},\n };\n}\n\n// ---------------------------------------------------------------------------\n// Session grants — temporary \"always allow\" for this session\n// ---------------------------------------------------------------------------\n\nexport class SessionGrants {\n private grantedCategories = new Set<ToolCategory>();\n private grantedTools = new Set<string>();\n\n allowCategory(category: ToolCategory): void {\n this.grantedCategories.add(category);\n }\n\n allowTool(toolName: string): void {\n this.grantedTools.add(toolName);\n }\n\n isGranted(toolName: string, category: ToolCategory): boolean {\n return this.grantedTools.has(toolName) || this.grantedCategories.has(category);\n }\n\n reset(): void {\n this.grantedCategories.clear();\n this.grantedTools.clear();\n }\n\n getGrantedCategories(): ToolCategory[] {\n return [...this.grantedCategories];\n }\n\n getGrantedTools(): string[] {\n return [...this.grantedTools];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Decision engine\n// ---------------------------------------------------------------------------\n\nexport type ApprovalDecision = 'allow' | 'ask' | 'deny';\n\n/**\n * Determine whether a tool call should be allowed, prompted, or denied.\n *\n * Priority order:\n * 1. Always-allowed tools (ask_user, task_write, etc.) → allow\n * 2. Per-tool policy override → use that policy\n * 3. Session grants (user said \"always allow\" during this session) → allow\n * 4. Category policy → use that policy\n * 5. Fallback → \"ask\"\n */\nexport function resolveApproval(\n toolName: string,\n rules: PermissionRules,\n sessionGrants: SessionGrants,\n): ApprovalDecision {\n // 1. Always-allowed tools\n const category = getToolCategory(toolName);\n if (category === null) return 'allow';\n\n // 2. Per-tool override\n const toolPolicy = rules.tools[toolName];\n if (toolPolicy) return toolPolicy;\n\n // 3. Session grants\n if (sessionGrants.isGranted(toolName, category)) return 'allow';\n\n // 4. Category policy\n const categoryPolicy = rules.categories[category];\n if (categoryPolicy) return categoryPolicy;\n\n // 5. Default policy for category\n return DEFAULT_POLICIES[category] ?? 'ask';\n}\n"]}