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.
- package/CHANGELOG.md +328 -0
- package/LICENSE.md +15 -0
- package/README.md +68 -29
- package/dist/agents/memory.d.ts.map +1 -1
- package/dist/agents/model.d.ts +17 -6
- package/dist/agents/model.d.ts.map +1 -1
- package/dist/agents/prompts/index.d.ts.map +1 -1
- package/dist/agents/prompts/tool-guidance.d.ts +2 -0
- package/dist/agents/prompts/tool-guidance.d.ts.map +1 -1
- package/dist/agents/subagents/audit-tests.d.ts +0 -7
- package/dist/agents/subagents/audit-tests.d.ts.map +1 -1
- package/dist/agents/subagents/execute.d.ts +0 -7
- package/dist/agents/subagents/execute.d.ts.map +1 -1
- package/dist/agents/subagents/explore.d.ts +0 -7
- package/dist/agents/subagents/explore.d.ts.map +1 -1
- package/dist/agents/subagents/index.d.ts.map +1 -1
- package/dist/agents/subagents/plan.d.ts +0 -7
- package/dist/agents/subagents/plan.d.ts.map +1 -1
- package/dist/agents/tools.d.ts +3 -1
- package/dist/agents/tools.d.ts.map +1 -1
- package/dist/agents/workspace.d.ts +4 -1
- package/dist/agents/workspace.d.ts.map +1 -1
- package/dist/{chunk-K4WJUBEC.cjs → chunk-AJEYT7X3.cjs} +763 -429
- package/dist/chunk-AJEYT7X3.cjs.map +1 -0
- package/dist/{chunk-U5A7TFNT.js → chunk-CC2724NI.js} +46 -10
- package/dist/chunk-CC2724NI.js.map +1 -0
- package/dist/{chunk-REVOTI2T.js → chunk-JI4M5525.js} +740 -412
- package/dist/chunk-JI4M5525.js.map +1 -0
- package/dist/{chunk-Z4QRXVST.cjs → chunk-MBPGUMYQ.cjs} +325 -251
- package/dist/chunk-MBPGUMYQ.cjs.map +1 -0
- package/dist/{chunk-MT3YCFCC.cjs → chunk-OEDRHUU5.cjs} +47 -9
- package/dist/chunk-OEDRHUU5.cjs.map +1 -0
- package/dist/{chunk-M5LKPQB4.js → chunk-WKPHD54B.js} +283 -209
- package/dist/chunk-WKPHD54B.js.map +1 -0
- package/dist/{chunk-C4X3C2DL.cjs → chunk-XVYUS2EA.cjs} +2213 -1035
- package/dist/chunk-XVYUS2EA.cjs.map +1 -0
- package/dist/{chunk-X3BGE7CL.js → chunk-YQNZ7DHQ.js} +1788 -613
- package/dist/chunk-YQNZ7DHQ.js.map +1 -0
- package/dist/cli.cjs +79 -31
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +71 -23
- package/dist/cli.js.map +1 -1
- package/dist/clipboard/index.d.ts +5 -0
- package/dist/clipboard/index.d.ts.map +1 -1
- package/dist/error-classification.d.ts +10 -0
- package/dist/error-classification.d.ts.map +1 -0
- package/dist/index.cjs +2 -2
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/mcp/config.d.ts +8 -0
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/manager.d.ts +4 -2
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/types.d.ts +30 -3
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/onboarding/onboarding-inline.d.ts +2 -0
- package/dist/onboarding/onboarding-inline.d.ts.map +1 -1
- package/dist/onboarding/packs.d.ts +1 -0
- package/dist/onboarding/packs.d.ts.map +1 -1
- package/dist/onboarding/settings.d.ts +37 -2
- package/dist/onboarding/settings.d.ts.map +1 -1
- package/dist/permissions-S3LGXIDB.js +3 -0
- package/dist/{permissions-CVXKYIWR.js.map → permissions-S3LGXIDB.js.map} +1 -1
- package/dist/permissions-VGABAVGD.cjs +40 -0
- package/dist/{permissions-2HIUSRQN.cjs.map → permissions-VGABAVGD.cjs.map} +1 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/providers/claude-max.d.ts +13 -0
- package/dist/providers/claude-max.d.ts.map +1 -1
- package/dist/providers/openai-codex.d.ts +1 -0
- package/dist/providers/openai-codex.d.ts.map +1 -1
- package/dist/tool-names.d.ts +68 -0
- package/dist/tool-names.d.ts.map +1 -0
- package/dist/tools/ast-smart-edit.d.ts +77 -5
- package/dist/tools/ast-smart-edit.d.ts.map +1 -1
- package/dist/tools/index.d.ts +2 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/string-replace-lsp.d.ts +15 -0
- package/dist/tools/string-replace-lsp.d.ts.map +1 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/utils.d.ts +4 -2
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tui/command-dispatch.d.ts.map +1 -1
- package/dist/tui/commands/clone.d.ts +29 -0
- package/dist/tui/commands/clone.d.ts.map +1 -0
- package/dist/tui/commands/custom-providers.d.ts +8 -0
- package/dist/tui/commands/custom-providers.d.ts.map +1 -0
- package/dist/tui/commands/index.d.ts +3 -1
- package/dist/tui/commands/index.d.ts.map +1 -1
- package/dist/tui/commands/mcp.d.ts.map +1 -1
- package/dist/tui/commands/models-pack.d.ts +4 -0
- package/dist/tui/commands/models-pack.d.ts.map +1 -1
- package/dist/tui/commands/om.d.ts.map +1 -1
- package/dist/tui/commands/report-issue.d.ts +3 -0
- package/dist/tui/commands/report-issue.d.ts.map +1 -0
- package/dist/tui/commands/resource.d.ts.map +1 -1
- package/dist/tui/commands/settings.d.ts.map +1 -1
- package/dist/tui/commands/threads.d.ts +1 -0
- package/dist/tui/commands/threads.d.ts.map +1 -1
- package/dist/tui/components/ask-question-inline.d.ts +3 -0
- package/dist/tui/components/ask-question-inline.d.ts.map +1 -1
- package/dist/tui/components/custom-editor.d.ts +1 -1
- package/dist/tui/components/custom-editor.d.ts.map +1 -1
- package/dist/tui/components/help-overlay.d.ts.map +1 -1
- package/dist/tui/components/plan-approval-inline.d.ts.map +1 -1
- package/dist/tui/components/settings.d.ts +2 -0
- package/dist/tui/components/settings.d.ts.map +1 -1
- package/dist/tui/components/subagent-execution.d.ts +6 -1
- package/dist/tui/components/subagent-execution.d.ts.map +1 -1
- package/dist/tui/components/thread-selector.d.ts +6 -0
- package/dist/tui/components/thread-selector.d.ts.map +1 -1
- package/dist/tui/components/tool-execution-enhanced.d.ts +1 -0
- package/dist/tui/components/tool-execution-enhanced.d.ts.map +1 -1
- package/dist/tui/components/tool-validation-error.d.ts.map +1 -1
- package/dist/tui/handlers/message.d.ts.map +1 -1
- package/dist/tui/handlers/prompts.d.ts +6 -0
- package/dist/tui/handlers/prompts.d.ts.map +1 -1
- package/dist/tui/handlers/subagent.d.ts.map +1 -1
- package/dist/tui/mastra-tui.d.ts +14 -5
- package/dist/tui/mastra-tui.d.ts.map +1 -1
- package/dist/tui/render-messages.d.ts.map +1 -1
- package/dist/tui/setup.d.ts.map +1 -1
- package/dist/tui/state.d.ts +4 -5
- package/dist/tui/state.d.ts.map +1 -1
- package/dist/tui.cjs +19 -19
- package/dist/tui.js +2 -2
- package/dist/utils/debug-log.d.ts +12 -0
- package/dist/utils/debug-log.d.ts.map +1 -0
- package/dist/utils/plans.d.ts +7 -0
- package/dist/utils/plans.d.ts.map +1 -0
- package/dist/utils/update-check.d.ts +40 -0
- package/dist/utils/update-check.d.ts.map +1 -0
- package/package.json +8 -8
- package/dist/chunk-C4X3C2DL.cjs.map +0 -1
- package/dist/chunk-K4WJUBEC.cjs.map +0 -1
- package/dist/chunk-M5LKPQB4.js.map +0 -1
- package/dist/chunk-MT3YCFCC.cjs.map +0 -1
- package/dist/chunk-REVOTI2T.js.map +0 -1
- package/dist/chunk-U5A7TFNT.js.map +0 -1
- package/dist/chunk-X3BGE7CL.js.map +0 -1
- package/dist/chunk-Z4QRXVST.cjs.map +0 -1
- package/dist/docs/SKILL.md +0 -30
- package/dist/docs/assets/SOURCE_MAP.json +0 -11
- package/dist/docs/references/docs-mastra-code-configuration.md +0 -299
- package/dist/docs/references/docs-mastra-code-customization.md +0 -228
- package/dist/docs/references/docs-mastra-code-modes.md +0 -104
- package/dist/docs/references/docs-mastra-code-overview.md +0 -135
- package/dist/docs/references/docs-mastra-code-tools.md +0 -229
- package/dist/docs/references/reference-mastra-code-createMastraCode.md +0 -108
- package/dist/permissions-2HIUSRQN.cjs +0 -40
- package/dist/permissions-CVXKYIWR.js +0 -3
- package/dist/tui/commands/models.d.ts +0 -3
- package/dist/tui/commands/models.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/token-estimator.ts","../src/tools/types.ts","../src/tools/utils.ts","../src/tools/file-view.ts","../src/ipc/ipc-reporter.ts","../src/tools/shell.ts","../src/lsp/language.ts","../src/lsp/client.ts","../src/lsp/server.ts","../src/lsp/manager.ts","../src/lsp/workspace.ts","../src/tools/file-editor.ts","../src/tools/string-replace-lsp.ts","../src/tools/grep.ts","../src/tools/glob.ts","../src/tools/write.ts","../src/providers/claude-max.ts","../src/providers/openai-codex.ts","../src/agents/model.ts","../src/agents/subagents/execute.ts","../src/agents/subagents/explore.ts","../src/agents/subagents/plan.ts","../src/tools/web-search.ts","../src/tools/subagent.ts","../src/tools/ast-smart-edit.ts","../src/tools/request-sandbox-access.ts","../src/onboarding/packs.ts","../src/onboarding/settings.ts","../src/tui/theme.ts","../src/utils/thread-lock.ts"],"names":["resolve","fs","makeOutput","readFile","validatePath","path2","fileLines","output","z","createTool","path3","execa","subprocess","cleanOutput","join","path","path5","fs3","promisify","exec","processedNewStr","newFileContent","bestMatch","startLine","endLine","snippet","successMsg","path6","fs5","path7","path8","fs6","path9","fs7","anthropic","authStorage","authStorageInstance","getAuthStorage","setAuthStorage","openai","wrapLanguageModel","createAnthropic","readFileSync","parse","writeFileSync","path10","existsSync","dirname","mkdirSync","path11"],"mappings":"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","file":"chunk-REVOTI2T.js","sourcesContent":["import { Tiktoken } from 'js-tiktoken/lite';\nimport o200k_base from 'js-tiktoken/ranks/o200k_base';\n\nconst enc = new Tiktoken(o200k_base);\n\nfunction sanitizeInput(text: string | object) {\n if (!text) return '';\n return (typeof text === `string` ? text : JSON.stringify(text))\n .replaceAll(`<|endoftext|>`, ``)\n .replaceAll(`<|endofprompt|>`, ``);\n}\nexport function tokenEstimate(text: string | object): number {\n return enc.encode(sanitizeInput(text), `all`).length;\n}\n\nexport function truncateStringForTokenEstimate(text: string, desiredTokenCount: number, fromEnd = true) {\n const tokens = enc.encode(sanitizeInput(text));\n\n if (tokens.length <= desiredTokenCount) return text;\n\n return `[Truncated ${tokens.length - desiredTokenCount} tokens]\n${enc.decode(tokens.slice(fromEnd ? -desiredTokenCount : 0, fromEnd ? undefined : desiredTokenCount))}`;\n}\n","export class ToolError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ToolError';\n }\n}\n","import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport { truncateStringForTokenEstimate } from '../utils/token-estimator.js';\nimport { ToolError } from './types.js';\n\n// Per-file write queue to serialize concurrent writes\nconst fileWriteQueues = new Map<string, Promise<unknown>>();\n\nasync function withWriteLock<T>(filePath: string, fn: () => Promise<T>): Promise<T> {\n const normalizedPath = path.resolve(filePath);\n\n // Get the current queue for this file (or a resolved promise if none)\n const currentQueue = fileWriteQueues.get(normalizedPath) ?? Promise.resolve();\n\n // Create a new promise that waits for the current queue, then runs our fn\n let resolve: (value: T) => void;\n let reject: (error: unknown) => void;\n const ourPromise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n // Chain our operation onto the queue\n const queuePromise = currentQueue\n .catch(() => {}) // Ignore errors from previous operations\n .then(async () => {\n try {\n const result = await fn();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n\n // Update the queue\n fileWriteQueues.set(normalizedPath, queuePromise);\n\n // Clean up when our operation completes\n queuePromise.finally(() => {\n // Only delete if we're still the last in queue\n if (fileWriteQueues.get(normalizedPath) === queuePromise) {\n fileWriteQueues.delete(normalizedPath);\n }\n });\n\n return ourPromise;\n}\n\nexport const SNIPPET_LINES = 4;\nexport async function readFile(filePath: string): Promise<string> {\n try {\n return await fs.readFile(filePath, 'utf8');\n } catch (e) {\n const error = e instanceof Error ? e : new Error('Unknown error');\n throw new Error(`Failed to read ${filePath}: ${error.message}`);\n }\n}\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n try {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content, 'utf8');\n } catch (e) {\n const error = e instanceof Error ? e : new Error('Unknown error');\n throw new Error(`Failed to write to ${filePath}: ${error.message}`);\n }\n}\n\n// Export the lock for operations that need to serialize read-modify-write\nexport { withWriteLock as withFileLock };\nexport function makeOutput(fileContent: string, fileDescriptor: string, initLine = 1, expandTabs = true): string {\n if (expandTabs) {\n fileContent = fileContent.replace(/\\t/g, ' ');\n }\n // Convert absolute paths to relative paths from cwd for token efficiency\n const displayPath = path.isAbsolute(fileDescriptor) ? path.relative(process.cwd(), fileDescriptor) : fileDescriptor;\n const lines = fileContent.split('\\n');\n const numberedLines = lines.map((line, i) => `${(i + initLine).toString().padStart(6)}\\t${line}`).join('\\n');\n return `Here's the result of running \\`cat -n\\` on ${displayPath}:\\n${truncateStringForTokenEstimate(numberedLines, 500, false)}\\n`;\n}\nexport async function validatePath(command: string, filePath: string): Promise<void> {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.join(process.cwd(), filePath);\n if (!path.isAbsolute(filePath)) {\n filePath = absolutePath;\n }\n try {\n const stats = await fs.stat(filePath);\n if (stats.isDirectory() && command !== 'view') {\n throw new ToolError(\n `The path ${filePath} is a directory and only the \\`view\\` command can be used on directories`,\n );\n }\n if (command === 'create' && stats.isFile()) {\n throw new ToolError(`File already exists at: ${filePath}. Cannot overwrite files using command \\`create\\``);\n }\n } catch (e) {\n const error = e instanceof Error ? e : new Error('Unknown error');\n if ('code' in error && error.code === 'ENOENT' && command !== 'create') {\n throw new ToolError(`The path ${filePath} does not exist. Please provide a valid path.`);\n }\n if (command !== 'create') {\n throw error;\n }\n }\n}\nexport function truncateText(text: string, maxLength = 1000): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength) + '... (truncated)';\n}\n\n/**\n * Check whether `targetPath` falls inside `projectRoot` or any of the\n * additional `allowedPaths`. All arguments are expected to be absolute.\n *\n * Returns `true` when access should be **allowed**.\n */\nexport function isPathAllowed(targetPath: string, projectRoot: string, allowedPaths: string[] = []): boolean {\n const resolved = path.resolve(targetPath);\n const roots = [projectRoot, ...allowedPaths].map(p => path.resolve(p));\n\n return roots.some(root => resolved === root || resolved.startsWith(root + path.sep));\n}\n\n/**\n * Guard that throws a descriptive error when a path is not allowed.\n * Designed to be called early in each tool's `execute` function.\n */\nexport function assertPathAllowed(targetPath: string, projectRoot: string, allowedPaths: string[] = []): void {\n if (!isPathAllowed(targetPath, projectRoot, allowedPaths)) {\n const resolvedTarget = path.resolve(targetPath);\n const resolvedRoot = path.resolve(projectRoot);\n throw new ToolError(\n `Access denied: \"${resolvedTarget}\" is outside the project root \"${resolvedRoot}\"` +\n (allowedPaths.length ? ` and allowed paths [${allowedPaths.join(', ')}]` : '') +\n `. Use /sandbox to add additional allowed paths.`,\n );\n }\n}\n\n/**\n * Read `sandboxAllowedPaths` from the Mastra harness runtime context.\n * Returns an empty array when the context is unavailable (e.g. in tests).\n */\nexport function getAllowedPathsFromContext(\n toolContext: { requestContext?: { get: (key: string) => unknown } } | undefined,\n): string[] {\n if (!toolContext?.requestContext) return [];\n const harnessCtx = toolContext.requestContext.get('harness') as\n | {\n state?: { sandboxAllowedPaths?: string[] };\n getState?: () => { sandboxAllowedPaths?: string[] };\n }\n | undefined;\n return harnessCtx?.getState?.()?.sandboxAllowedPaths ?? harnessCtx?.state?.sandboxAllowedPaths ?? [];\n}\n","import { exec } from 'node:child_process';\nimport { promises as fs } from 'node:fs';\nimport { homedir } from 'node:os';\nimport * as path from 'node:path';\nimport { promisify } from 'node:util';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\nimport { truncateStringForTokenEstimate } from '../utils/token-estimator';\nimport { assertPathAllowed, getAllowedPathsFromContext } from './utils.js';\n\nconst execAsync = promisify(exec);\n\n// Maximum tokens for view tool output\nconst MAX_VIEW_TOKENS = 2_000;\n\n/**\n * Shorten an absolute path for display to save tokens\n * Priority: relative to cwd > ~/path > absolute\n */\nfunction shortenPath(absolutePath: string, cwd: string): string {\n // If path is under cwd, make it relative\n if (absolutePath.startsWith(cwd + '/')) {\n return absolutePath.slice(cwd.length + 1);\n }\n if (absolutePath === cwd) {\n return '.';\n }\n\n // If path is under home, use ~/\n const home = homedir();\n if (absolutePath.startsWith(home + '/')) {\n return '~' + absolutePath.slice(home.length);\n }\n if (absolutePath === home) {\n return '~';\n }\n\n // Otherwise return as-is\n return absolutePath;\n}\n\n/**\n * Format file content with line numbers (like `cat -n`)\n */\nfunction makeOutput(fileContent: string, fileDescriptor: string, initLine = 1, expandTabs = true): string {\n if (expandTabs) {\n fileContent = fileContent.replace(/\\t/g, ' ');\n }\n const lines = fileContent.split('\\n');\n const numberedLines = lines.map((line, i) => `${(i + initLine).toString().padStart(6)}\\t${line}`).join('\\n');\n return `Here's the result of running \\`cat -n\\` on ${fileDescriptor}:\\n${numberedLines}\\n`;\n}\n\n/**\n * Read file content\n */\nasync function readFile(filePath: string): Promise<string> {\n try {\n return await fs.readFile(filePath, 'utf8');\n } catch (e) {\n const error = e instanceof Error ? e : new Error('Unknown error');\n throw new Error(`Failed to read ${filePath}: ${error.message}`);\n }\n}\n\n/**\n * Check if path is a directory\n */\nasync function isDirectory(filePath: string): Promise<boolean> {\n try {\n const stats = await fs.stat(filePath);\n return stats.isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Validate path exists and is accessible\n */\nasync function validatePath(command: string, filePath: string): Promise<void> {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.join(process.cwd(), filePath);\n\n if (!path.isAbsolute(filePath)) {\n filePath = absolutePath;\n }\n\n try {\n const stats = await fs.stat(filePath);\n if (stats.isDirectory() && command !== 'view') {\n throw new Error(`The path ${filePath} is a directory and only the \\`view\\` command can be used on directories`);\n }\n } catch (e) {\n const error = e instanceof Error ? e : new Error('Unknown error');\n if ('code' in error && error.code === 'ENOENT') {\n throw new Error(`The path ${filePath} does not exist. Please provide a valid path.`);\n }\n throw error;\n }\n}\n\n/**\n * Create the view tool for viewing file contents or directory listings\n */\nexport function createViewTool(projectRoot?: string) {\n return createTool({\n id: 'view',\n description: `Read file contents with line numbers, or list directory contents. Paths are relative to the project root.\n\nUsage notes:\n- Use this to read files BEFORE editing them. Never modify code you haven't read.\n- Use view_range for large files to read specific line ranges (e.g., [1, 50] for first 50 lines).\n- For directories, shows files up to 2 levels deep (excluding hidden files).\n- Output includes line numbers (like cat -n) for easy reference.\n- When NOT to use this tool: for searching file contents (use grep), for finding files by name (use glob).\n- Output is truncated if the file is very large. Use view_range to see specific sections.`,\n inputSchema: z.object({\n path: z.string().describe('Path to the file or directory (relative to project root)'),\n view_range: z\n .array(z.number().nullable())\n .length(2)\n .optional()\n .describe('Optional range of lines to view [start, end]'),\n }),\n execute: async (context, toolContext) => {\n try {\n const { path: filePath, view_range } = context;\n const root = projectRoot || process.cwd();\n\n // Resolve relative to projectRoot if provided, otherwise relative to process.cwd()\n const absolutePath = path.resolve(root, filePath);\n\n // Security: ensure the path is within the project root or allowed paths\n const allowedPaths = getAllowedPathsFromContext(toolContext);\n assertPathAllowed(absolutePath, root, allowedPaths);\n\n await validatePath('view', absolutePath);\n\n // Handle directory listing\n if (await isDirectory(absolutePath)) {\n const { stdout, stderr } = await execAsync(`find \"${absolutePath}\" -maxdepth 2 -not -path '*/.*'`);\n\n if (stderr) {\n throw new Error(stderr);\n }\n\n // Shorten paths in output to save tokens\n const cwd = projectRoot || process.cwd();\n let lines = stdout\n .split('\\n')\n .map(line => (line.trim() ? shortenPath(line.trim(), cwd) : ''))\n .filter(Boolean);\n\n const totalLines = lines.length;\n const displayPath = shortenPath(absolutePath, cwd);\n\n // Apply view_range to slice the directory listing\n if (view_range && view_range[0] != null && view_range[1] != null) {\n const [start, end] = view_range as [number, number];\n lines = lines.slice(Math.max(0, start - 1), end === -1 ? undefined : end);\n }\n\n const dirOutput = `Here's the files and directories up to 2 levels deep in ${displayPath}, excluding hidden items (${totalLines} entries):\\n${lines.join('\\n')}\\n`;\n return {\n content: truncateStringForTokenEstimate(dirOutput, MAX_VIEW_TOKENS, false),\n isError: false,\n };\n }\n\n // Handle file viewing\n const fileContent = await readFile(absolutePath);\n if (view_range && view_range[0] != null && view_range[1] != null) {\n const fileLines = fileContent.split('\\n');\n const nLinesFile = fileLines.length;\n let [start, end] = view_range as [number, number];\n\n // Validate start line\n if (start < 1 || start > nLinesFile) {\n throw new Error(\n `Invalid \\`view_range\\`: ${view_range}. Its first element \\`${start}\\` should be within the range of lines of the file: [1, ${nLinesFile}]`,\n );\n }\n\n // Handle end line\n if (end !== -1) {\n if (end > nLinesFile) {\n end = nLinesFile;\n }\n if (end < start) {\n throw new Error(\n `Invalid \\`view_range\\`: ${view_range}. Its second element \\`${end}\\` should be larger or equal than its first \\`${start}\\``,\n );\n }\n }\n\n // Extract selected lines\n const selectedLines = end === -1 ? fileLines.slice(start - 1) : fileLines.slice(start - 1, end);\n\n const output = makeOutput(selectedLines.join('\\n'), String(filePath), start);\n return {\n // Truncate from end (keep the start of the range the user requested)\n content: truncateStringForTokenEstimate(output, MAX_VIEW_TOKENS, false),\n isError: false,\n };\n }\n\n const fileLines = fileContent.split('\\n');\n const output = makeOutput(fileContent, String(filePath));\n const truncated = truncateStringForTokenEstimate(output, MAX_VIEW_TOKENS, false);\n const wasTruncated = truncated !== output;\n return {\n content: wasTruncated\n ? truncated + `\\n\\n... ${fileLines.length} total lines in file. Use view_range to see specific sections.`\n : truncated,\n isError: false,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';\n return {\n content: errorMessage,\n isError: true,\n };\n }\n },\n });\n}\n","// Stub IPC reporter for TUI mode - just logs to console or no-ops\n\nexport type IPCMessageType = 'shell-output' | 'token-limits' | 'agent-event' | 'tool-call' | 'tool-result';\n\nexport interface IPCMessage {\n type: IPCMessageType;\n data: unknown;\n timestamp: number;\n}\n\nclass IPCReporter {\n private enabled: boolean;\n\n constructor() {\n // Disable IPC in TUI mode - we handle output differently\n this.enabled = false;\n }\n\n send(type: IPCMessageType, data: unknown) {\n if (!this.enabled) {\n return;\n }\n\n const message: IPCMessage = {\n type,\n data,\n timestamp: Date.now(),\n };\n\n if (process.send) {\n process.send(message);\n }\n }\n}\n\n// Export singleton instance\nexport const ipcReporter = new IPCReporter();\n","import * as path from 'node:path';\nimport { createTool } from '@mastra/core/tools';\nimport { execa, ExecaError } from 'execa';\nimport stripAnsi from 'strip-ansi';\nimport treeKill from 'tree-kill';\nimport { z } from 'zod';\nimport { ipcReporter } from '../ipc/ipc-reporter.js';\nimport { truncateStringForTokenEstimate } from '../utils/token-estimator';\nimport { isPathAllowed, getAllowedPathsFromContext } from './utils.js';\n\n// Global registry for pending terminal IDs (keyed by confirmationId)\nconst pendingTerminalIds = new Map<string, string>();\n\nexport function setPendingTerminalId(confirmationId: string, terminalId: string) {\n pendingTerminalIds.set(confirmationId, terminalId);\n}\n\nexport function getPendingTerminalId(confirmationId: string): string | undefined {\n return pendingTerminalIds.get(confirmationId);\n}\n\nexport function clearPendingTerminalId(confirmationId: string) {\n pendingTerminalIds.delete(confirmationId);\n}\n\n// Track active subprocesses to clean up on exit\nconst activeSubprocesses = new Set<number>();\nlet cleanupHandlersRegistered = false;\n\n// Register global cleanup handlers to kill all active subprocesses on exit\nfunction registerCleanupHandlers() {\n if (cleanupHandlersRegistered) return;\n cleanupHandlersRegistered = true;\n\n const killAllSubprocesses = () => {\n for (const pid of activeSubprocesses) {\n try {\n // Kill the entire process group\n process.kill(-pid, 'SIGKILL');\n } catch {\n // Process may already be dead\n }\n\n // Also use tree-kill for nested children\n treeKill(pid, 'SIGKILL', () => {\n // Ignore errors\n });\n }\n activeSubprocesses.clear();\n };\n\n // Handle normal exit\n process.on('exit', () => {\n killAllSubprocesses();\n });\n\n // Handle SIGINT (Ctrl+C)\n process.on('SIGINT', () => {\n killAllSubprocesses();\n process.exit(0);\n });\n\n // Handle SIGTERM\n process.on('SIGTERM', () => {\n killAllSubprocesses();\n process.exit(0);\n });\n}\n\n// Helper to apply tail to output\nfunction applyTail(output: string, tailLines?: number): string {\n if (!tailLines || tailLines <= 0) return output;\n const lines = output.split('\\n');\n if (lines.length <= tailLines) return output;\n return lines.slice(-tailLines).join('\\n');\n}\n\n// Schema for command execution - matching MCP reference exactly\nconst ExecuteCommandSchema = z.object({\n command: z.string().describe('Full shell command to execute'),\n cwd: z.string().optional().describe('Working directory for command execution'),\n timeout: z\n .number()\n .optional()\n .describe(\n \"The number of seconds until the shell command should be killed if it hasn't exited yet. Defaults to 30 seconds\",\n ),\n});\n\n// Function to create the execute command tool with optional project root\nexport function createExecuteCommandTool(projectRoot?: string) {\n return createTool({\n id: 'execute_command',\n description: `Execute a shell command in the local system.\n\nUsage notes:\n- Use for: git commands, npm/pnpm, docker, build tools, test runners, linters, and other terminal operations.\n- Do NOT use for: reading files (use view tool), searching file contents (use grep tool), finding files (use glob tool), editing files (use string_replace_lsp tool).\n- Commands run with a 30-second default timeout. Use the timeout parameter for longer commands.\n- Output is stripped of ANSI codes and truncated if too long. Pipe to \"| tail -N\" for long outputs.\n- Be careful with destructive commands. Never run git push --force, git reset --hard, or rm -rf without explicit user request.\n- For interactive commands that need user input, they will fail. Set CI=true is already forced.`,\n inputSchema: ExecuteCommandSchema,\n // requireApproval: true,\n execute: async (context, toolContext) => {\n let { command } = context;\n let extractedTail: number | undefined;\n // Extract `| tail -N` or `| tail -n N` from command if present\n // This allows streaming all output to user while only returning last N lines to agent\n const tailPipeMatch = command.match(/\\|\\s*tail\\s+(?:-n\\s+)?(-?\\d+)\\s*$/);\n if (tailPipeMatch) {\n const tailLines = Math.abs(parseInt(tailPipeMatch[1]!, 10));\n if (tailLines > 0) {\n extractedTail = tailLines;\n // Remove the tail pipe from the command\n command = command.replace(/\\|\\s*tail\\s+(?:-n\\s+)?-?\\d+\\s*$/, '').trim();\n }\n }\n\n // Use provided cwd, fall back to project root, then process.cwd()\n const cwd = context.cwd || projectRoot || process.cwd();\n const root = projectRoot || process.cwd();\n\n // Security: if a custom cwd was provided, ensure it's within the project root or allowed paths\n if (context.cwd) {\n const allowedPaths = getAllowedPathsFromContext(toolContext);\n const resolvedCwd = path.resolve(context.cwd);\n if (!isPathAllowed(resolvedCwd, root, allowedPaths)) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error: cwd \"${resolvedCwd}\" is outside the project root \"${root}\". Use /sandbox to add additional allowed paths.`,\n },\n ],\n isError: true,\n };\n }\n }\n\n if (!command.includes(cwd) && cwd !== process.cwd()) {\n ipcReporter.send(`shell-output`, {\n output: `\\n# ${cwd}`,\n type: `stdout`,\n style: { fg: 'grey' },\n });\n }\n ipcReporter.send(`shell-output`, {\n output: `\\n\\n$ ${command}\\n\\n`,\n type: `stdout`,\n style: { fg: 'green' },\n });\n\n // Check if we're in ACP mode - stream output via tool_call_update notifications\n const isACPMode = process.argv.includes('--acp-internal');\n if (isACPMode) {\n const { getGlobalConfirmationId } = await import('./wrap-with-confirmation.js');\n\n const _confirmationId = getGlobalConfirmationId();\n\n try {\n // Use execa to run the command with streaming\n const { execa } = await import('execa');\n\n let stdout = '';\n let stderr = '';\n let combined = '';\n\n const timeout = context.timeout ? context.timeout * 1000 : 30000;\n const subprocess = execa(command, [], {\n shell: true,\n cwd,\n all: true,\n buffer: true,\n reject: false,\n timeout,\n });\n\n // Stream stdout chunks\n if (subprocess.stdout) {\n subprocess.stdout.on('data', (chunk: Buffer) => {\n const text = chunk.toString();\n ipcReporter.send(`shell-output`, { output: text, type: `stdout` });\n stdout += text;\n combined += text;\n });\n }\n\n // Stream stderr chunks\n if (subprocess.stderr) {\n subprocess.stderr.on('data', (chunk: Buffer) => {\n const text = chunk.toString();\n ipcReporter.send(`shell-output`, { output: text, type: `stderr` });\n\n stderr += text;\n combined += text;\n });\n }\n\n // Wait for completion\n const result = await subprocess;\n\n if (result.timedOut || (result?.exitCode && result.exitCode > 0)) {\n ipcReporter.send(`shell-output`, {\n output: `\\nExited with code ${result.exitCode}${result.timedOut ? `\\nTimed out after ${timeout}ms` : ``}\\n\\n`,\n type: 'stdout',\n style: { fg: 'grey' },\n });\n }\n\n return {\n stdout: extractedTail ? applyTail(stdout, extractedTail) : stdout,\n stderr: extractedTail ? applyTail(stderr, extractedTail) : stderr,\n combined: extractedTail ? applyTail(combined, extractedTail) : combined,\n exitCode: result.exitCode || 0,\n signal: result.signal,\n timedOut: result.timedOut || false,\n command,\n cwd,\n duration: 0, // execa doesn't provide duration\n };\n } catch (error) {\n throw new Error(`Command execution failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // console.log(`\\n🔧 Executing: ${command}`)\n // console.log(`📁 Working directory: ${cwd}`)\n // if (projectRoot && !context.cwd) {\n // console.log(` (using project root from frontmatter)`)\n // }\n // console.log('----------------------------------------')\n const timeoutMS = context.timeout ? context.timeout * 1000 : 30_000;\n // console.log({ timeoutMS })\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n let manuallyKilled = false;\n let abortedBySignal = false;\n let subprocess: ReturnType<typeof execa> | undefined;\n let capturedOutput = ''; // Track output ourselves for abort case\n\n // Get abort signal and emit function from harness context\n const harnessCtx = (toolContext as any)?.requestContext?.get('harness');\n const abortSignal = harnessCtx?.abortSignal as AbortSignal | undefined;\n const emitEvent = harnessCtx?.emitEvent as\n | ((event: { type: 'shell_output'; toolCallId: string; output: string; stream: 'stdout' | 'stderr' }) => void)\n | undefined;\n const toolCallId = (toolContext as any)?.agent?.toolCallId as string | undefined;\n\n // Define abort handler outside try block so it's accessible in catch\n const abortHandler = () => {\n if (subprocess?.pid) {\n abortedBySignal = true;\n try {\n process.kill(-subprocess.pid, 'SIGKILL');\n } catch {\n treeKill(subprocess.pid, 'SIGKILL', () => {});\n }\n }\n };\n\n try {\n // Create the subprocess with environment variables to force color output\n // and use inherit for stdio to preserve TTY context\n subprocess = execa(command, {\n cwd,\n shell: true,\n stdio: ['pipe', 'pipe', 'pipe'], // all piped — TUI owns the terminal\n buffer: true, // Buffer output for return value\n all: true, // Combine stdout and stderr\n env: {\n // PATH: process.env.PATH,\n ...process.env,\n FORCE_COLOR: '1', // Force color output for most Node.js tools\n CLICOLOR_FORCE: '1', // Force color for BSD tools\n TERM: process.env.TERM || 'xterm-256color', // Ensure TERM is set\n CI: 'true', // Prevent interactive prompts\n NONINTERACTIVE: '1', // Alternative for some tools\n DEBIAN_FRONTEND: 'noninteractive', // For apt-get and similar\n },\n // Tell execa to handle the output as if it's a TTY\n stripFinalNewline: false,\n timeout: timeoutMS,\n forceKillAfterDelay: 100,\n killSignal: 'SIGKILL',\n cleanup: true,\n detached: true, // Create a new process group so we can kill all children\n });\n\n // console.log(`shell pid ${subprocess.pid}`)\n\n // Register cleanup handlers and track this subprocess\n registerCleanupHandlers();\n if (subprocess.pid) {\n activeSubprocesses.add(subprocess.pid);\n }\n\n // Set up a timeout handler to kill the process tree\n if (timeoutMS && subprocess.pid) {\n timeoutHandle = setTimeout(() => {\n if (subprocess?.pid) {\n // console.error(`\\n⏱️ Timeout reached, killing process group ${subprocess.pid}...`)\n manuallyKilled = true;\n try {\n // Kill the entire process group by using negative PID\n // This works because we set detached: true\n process.kill(-subprocess.pid, 'SIGKILL');\n } catch {\n // console.error(`Failed to kill process group: ${err}`)\n // Fallback to tree-kill\n treeKill(subprocess.pid, 'SIGKILL');\n }\n }\n }, timeoutMS - 100); // Kill 100ms before execa's timeout\n }\n\n // Set up abort signal handler to kill subprocess on Ctrl+C\n if (abortSignal) {\n abortSignal.addEventListener('abort', abortHandler);\n }\n // Capture stdout/stderr and stream to TUI via harness events\n if (subprocess.stdout) {\n subprocess.stdout.on(`data`, (chunk: Buffer) => {\n const text = chunk.toString();\n capturedOutput += text;\n ipcReporter.send(`shell-output`, { output: text, type: `stdout` });\n // Emit shell_output event for TUI streaming\n if (emitEvent && toolCallId) {\n emitEvent({\n type: 'shell_output',\n toolCallId,\n output: text,\n stream: 'stdout',\n });\n }\n });\n }\n\n if (subprocess.stderr) {\n subprocess.stderr.on(`data`, (chunk: Buffer) => {\n const text = chunk.toString();\n capturedOutput += text;\n ipcReporter.send(`shell-output`, { output: text, type: `stderr` });\n // Emit shell_output event for TUI streaming\n if (emitEvent && toolCallId) {\n emitEvent({\n type: 'shell_output',\n toolCallId,\n output: text,\n stream: 'stderr',\n });\n }\n });\n }\n\n // Wait for completion\n const result = await subprocess;\n\n // Clean up abort listener\n if (abortSignal) {\n abortSignal.removeEventListener('abort', abortHandler);\n }\n\n // Check if aborted\n if (abortedBySignal) {\n ipcReporter.send(`shell-output`, {\n output: `\\nAborted by user\\n`,\n style: { fg: 'yellow' },\n type: 'stdout',\n });\n\n // Clear the timeout\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n\n // Use our captured output (more reliable than result.all on SIGKILL)\n let cleanOutput = stripAnsi(capturedOutput);\n if (extractedTail) {\n cleanOutput = applyTail(cleanOutput, extractedTail);\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: cleanOutput.trim()\n ? `[User aborted command]\\n\\nPartial output:\\n${truncateStringForTokenEstimate(cleanOutput, 1_000)}`\n : '[User aborted command]',\n },\n ],\n isError: true,\n };\n }\n\n ipcReporter.send(`shell-output`, {\n output: `\\nExited with code ${result.exitCode}${result.timedOut ? `\\nTimed out after ${timeoutMS}ms` : ``}\\n`,\n style: { fg: 'grey' },\n type: 'stdout',\n });\n\n // Clear the timeout if command completed successfully\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n\n // console.log('\\n✅ Command completed successfully')\n // console.log('----------------------------------------\\n')\n\n // Strip ANSI codes from the output for the LLM\n // Since we have all: true, result.all contains the interleaved output\n const rawOutput =\n result.all || result.stdout || result.stderr || 'Command executed successfully with no output';\n let cleanOutput = stripAnsi(typeof rawOutput === 'string' ? rawOutput : rawOutput.toString());\n\n // Apply tail if specified\n if (extractedTail) {\n cleanOutput = applyTail(cleanOutput, extractedTail);\n }\n\n return {\n content: [\n {\n type: 'text',\n // only allow xk tokens of output\n text: truncateStringForTokenEstimate(cleanOutput, 2_000),\n },\n ],\n isError: false,\n };\n } catch (error: any) {\n // console.error('\\n❌ Command failed')\n // console.error('----------------------------------------\\n')\n // Clean up abort listener and timeout handle on error\n if (abortSignal) {\n abortSignal.removeEventListener('abort', abortHandler);\n }\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n\n // Check if aborted by user\n if (abortedBySignal) {\n let cleanOutput = stripAnsi(capturedOutput);\n if (extractedTail) {\n cleanOutput = applyTail(cleanOutput, extractedTail);\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: cleanOutput.trim()\n ? `[User aborted command]\\n\\nPartial output:\\n${truncateStringForTokenEstimate(cleanOutput, 1_000)}`\n : '[User aborted command]',\n },\n ],\n isError: true,\n };\n }\n\n // Strip ANSI codes from error message for the LLM\n let cleanError = '';\n\n if (error instanceof ExecaError) {\n const causeMessage = (error.cause as Error)?.message || '';\n const stderr = error.stderr ? stripAnsi(error.stderr) : '';\n const stdout = error.stdout ? stripAnsi(error.stdout) : '';\n const all = error.all ? stripAnsi(error.all) : '';\n const isTimeout = error.timedOut || error.isCanceled || manuallyKilled;\n\n // Combine all error information with clear labels\n const parts = [];\n if (isTimeout) {\n parts.push(`Error: command timed out after ${timeoutMS}ms`);\n } else if (causeMessage) {\n parts.push(`Error: ${stripAnsi(causeMessage)}`);\n }\n\n if (all) {\n parts.push(`Output: ${all}`);\n } else {\n if (stderr) parts.push(`STDERR: ${stderr}`);\n if (stdout) parts.push(`STDOUT: ${stdout}`);\n }\n\n cleanError = parts.join('\\n\\n');\n } else {\n // Safely check if error has a message property\n try {\n if (error && typeof error === 'object' && 'message' in error && typeof error.message === 'string') {\n cleanError = error.message;\n } else {\n cleanError = String(error);\n }\n } catch {\n cleanError = String(error);\n }\n }\n\n return {\n content: [\n {\n type: 'text',\n // only allow xk tokens of output\n text: truncateStringForTokenEstimate(cleanError, 2_000),\n },\n ],\n isError: true,\n };\n } finally {\n // console.log(`shell command finally executed`)\n\n // Remove subprocess from tracking\n if (subprocess && subprocess.pid) {\n activeSubprocesses.delete(subprocess.pid);\n }\n\n // Always kill any remaining child processes to prevent dangling processes\n // This is especially important for commands with pipes (e.g., npm test | head)\n // where the pipe may terminate early but leave child processes running\n if (subprocess && subprocess.pid) {\n try {\n // First try to kill the process group\n process.kill(-subprocess.pid, 'SIGKILL');\n } catch {\n // Process group may already be dead, that's fine\n }\n\n // Also use tree-kill to ensure all nested children are killed\n // This handles cases where child processes spawn their own children\n // (e.g., npm spawning vitest workers)\n const pid = subprocess?.pid;\n if (pid) {\n try {\n await new Promise<void>(resolve => {\n treeKill(pid, 'SIGKILL', err => {\n if (err && err.message !== 'No such process') {\n // tree-kill error (non-fatal)\n }\n resolve();\n });\n });\n } catch {\n // Ignore errors from tree-kill\n }\n }\n }\n }\n },\n });\n}\n\n// Default export for backward compatibility\nexport const executeCommandTool = createExecuteCommandTool();\n\nexport default executeCommandTool;\n","/**\n * Maps file extensions to LSP language identifiers\n */\nexport const LANGUAGE_EXTENSIONS: Record<string, string> = {\n // TypeScript/JavaScript\n '.ts': 'typescript',\n '.tsx': 'typescriptreact',\n '.js': 'javascript',\n '.jsx': 'javascriptreact',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n\n // Python\n '.py': 'python',\n '.pyi': 'python',\n\n // Go\n '.go': 'go',\n\n // Rust\n '.rs': 'rust',\n\n // C/C++\n '.c': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.h': 'c',\n '.hpp': 'cpp',\n\n // Java\n '.java': 'java',\n\n // JSON\n '.json': 'json',\n '.jsonc': 'jsonc',\n\n // YAML\n '.yaml': 'yaml',\n '.yml': 'yaml',\n\n // Markdown\n '.md': 'markdown',\n\n // HTML/CSS\n '.html': 'html',\n '.css': 'css',\n '.scss': 'scss',\n '.sass': 'sass',\n '.less': 'less',\n};\n\n/**\n * Get LSP language ID for a file path\n */\nexport function getLanguageId(filePath: string): string | undefined {\n const ext = filePath.substring(filePath.lastIndexOf('.'));\n return LANGUAGE_EXTENSIONS[ext];\n}\n","import type { ChildProcess } from 'node:child_process';\nimport { StreamMessageReader, StreamMessageWriter, createMessageConnection } from 'vscode-jsonrpc/node.js';\nimport type { MessageConnection } from 'vscode-jsonrpc/node.js';\nimport { TextDocumentIdentifier, Position } from 'vscode-languageserver-protocol';\nimport type { Diagnostic } from 'vscode-languageserver-protocol';\nimport type { LSPServerInfo } from './server';\n\n/**\n * LSP Client wrapper for JSON-RPC communication\n */\nexport class LSPClient {\n private connection: MessageConnection | null = null;\n private process: ChildProcess | null = null;\n private serverInfo: LSPServerInfo;\n private workspaceRoot: string;\n private diagnostics: Map<string, Diagnostic[]> = new Map();\n private initializationOptions: any = null;\n\n constructor(serverInfo: LSPServerInfo, workspaceRoot: string) {\n this.serverInfo = serverInfo;\n this.workspaceRoot = workspaceRoot;\n }\n\n /**\n * Initialize the LSP connection\n */\n async initialize(): Promise<void> {\n const spawnResult = await this.serverInfo.spawn(this.workspaceRoot);\n\n if (!spawnResult) {\n throw new Error('Failed to spawn LSP server');\n }\n\n // Handle both ChildProcess and { process: ChildProcess, initialization? } formats\n let initializationOptions: any = undefined;\n if ('process' in spawnResult) {\n this.process = spawnResult.process;\n initializationOptions = spawnResult.initialization;\n } else {\n this.process = spawnResult;\n }\n\n if (!this.process.stdin || !this.process.stdout) {\n throw new Error('Failed to create LSP process with proper stdio');\n }\n\n const reader = new StreamMessageReader(this.process.stdout);\n const writer = new StreamMessageWriter(this.process.stdin);\n this.connection = createMessageConnection(reader, writer);\n\n // Handle connection errors (e.g., ERR_STREAM_DESTROYED during shutdown)\n this.connection.onError(error => {\n // Silently ignore stream destroyed errors during shutdown\n const errorObj = error?.[0] as any;\n if (errorObj?.code !== 'ERR_STREAM_DESTROYED') {\n }\n });\n\n // Set up diagnostic listener before starting connection\n\n this.connection.onNotification('textDocument/publishDiagnostics', (params: any) => {\n if (params.diagnostics && params.diagnostics.length > 0) {\n }\n this.diagnostics.set(params.uri, params.diagnostics);\n });\n (this.connection as any).onNotification((_method: string, _params: any) => {});\n\n this.connection.listen();\n\n // Capture stderr for debugging\n if (this.process.stderr) {\n this.process.stderr.on('data', _data => {});\n }\n\n // Handle process errors\n this.process.on('error', _error => {});\n\n this.process.on('exit', (_code, _signal) => {});\n\n // Send initialize request matching OpenCode's structure\n const initParams: any = {\n processId: process.pid,\n rootUri: `file://${this.workspaceRoot}`,\n workspaceFolders: [\n {\n name: 'workspace',\n uri: `file://${this.workspaceRoot}`,\n },\n ],\n capabilities: {\n window: {\n workDoneProgress: true,\n },\n workspace: {\n configuration: true,\n },\n textDocument: {\n publishDiagnostics: {\n relatedInformation: true,\n tagSupport: {\n valueSet: [1, 2],\n },\n versionSupport: false,\n },\n synchronization: {\n didOpen: true,\n didChange: true,\n dynamicRegistration: false,\n willSave: false,\n willSaveWaitUntil: false,\n didSave: false,\n },\n completion: {\n dynamicRegistration: false,\n completionItem: {\n snippetSupport: false,\n commitCharactersSupport: false,\n documentationFormat: ['markdown', 'plaintext'],\n deprecatedSupport: false,\n preselectSupport: false,\n },\n },\n definition: {\n dynamicRegistration: false,\n linkSupport: true,\n },\n typeDefinition: {\n dynamicRegistration: false,\n linkSupport: true,\n },\n implementation: {\n dynamicRegistration: false,\n linkSupport: true,\n },\n references: {\n dynamicRegistration: false,\n },\n documentHighlight: {\n dynamicRegistration: false,\n },\n documentSymbol: {\n dynamicRegistration: false,\n hierarchicalDocumentSymbolSupport: true,\n },\n codeAction: {\n dynamicRegistration: false,\n codeActionLiteralSupport: {\n codeActionKind: {\n valueSet: [\n 'quickfix',\n 'refactor',\n 'refactor.extract',\n 'refactor.inline',\n 'refactor.rewrite',\n 'source',\n 'source.organizeImports',\n ],\n },\n },\n },\n hover: {\n dynamicRegistration: false,\n contentFormat: ['markdown', 'plaintext'],\n },\n },\n },\n };\n\n // Add initialization options if provided by the server\n if (initializationOptions) {\n initParams.initializationOptions = initializationOptions;\n this.initializationOptions = initializationOptions;\n }\n\n // Add workspace/configuration request handler like OpenCode\n this.connection.onRequest('workspace/configuration', (params: any) => {\n return params.items?.map(() => ({})) || [];\n });\n\n // Handle window/workDoneProgress/create requests\n this.connection.onRequest('window/workDoneProgress/create', (_params: any) => {\n return null;\n });\n\n await Promise.race([\n this.connection.sendRequest('initialize', initParams),\n new Promise((_, reject) => setTimeout(() => reject(new Error('LSP initialize request timed out')), 10000)),\n ]);\n\n // Send initialized notification with empty object like OpenCode\n this.connection.sendNotification('initialized', {});\n\n // Send workspace/didChangeConfiguration with initialization options like OpenCode\n if (this.initializationOptions) {\n this.connection.sendNotification('workspace/didChangeConfiguration', {\n settings: this.initializationOptions,\n });\n } else {\n this.connection.sendNotification('workspace/didChangeConfiguration', {\n settings: {},\n });\n }\n }\n\n /**\n * Notify the server that a document has been opened\n */\n notifyOpen(filePath: string, content: string, languageId: string): void {\n if (!this.connection) return;\n\n const uri = `file://${filePath}`;\n\n // Clear diagnostics for this file before sending didOpen (like OpenCode does)\n this.diagnostics.delete(uri);\n\n this.connection.sendNotification('textDocument/didOpen', {\n textDocument: {\n uri,\n languageId,\n version: 0,\n text: content,\n },\n });\n }\n\n /**\n * Notify the server that a document has changed\n */\n notifyChange(filePath: string, content: string, version: number): void {\n if (!this.connection) return;\n\n this.connection.sendNotification('textDocument/didChange', {\n textDocument: {\n uri: `file://${filePath}`,\n version,\n },\n contentChanges: [{ text: content }],\n });\n }\n\n /**\n * Wait for diagnostics to be available for a specific file\n * @param waitForChange If true, waits for diagnostics to change from their initial state\n */\n async waitForDiagnostics(\n filePath: string,\n timeoutMs: number = 5000,\n waitForChange: boolean = false,\n ): Promise<Diagnostic[]> {\n if (!this.connection) return [];\n\n const uri = `file://${filePath}`;\n const startTime = Date.now();\n const initialDiagnostics = this.diagnostics.get(uri);\n const initialCount = initialDiagnostics?.length || 0;\n\n // Poll for diagnostics to be updated\n while (Date.now() - startTime < timeoutMs) {\n const currentDiagnostics = this.diagnostics.get(uri);\n const currentCount = currentDiagnostics?.length || 0;\n\n // If waiting for change, check if diagnostics have changed\n if (waitForChange) {\n if (currentDiagnostics !== undefined && currentCount !== initialCount) {\n return currentDiagnostics;\n }\n } else {\n // Return if we have diagnostics (even if empty array)\n if (currentDiagnostics !== undefined) {\n return currentDiagnostics;\n }\n }\n\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n\n return waitForChange ? initialDiagnostics || [] : [];\n }\n\n /**\n * Get hover information for a position\n */\n async getHover(filePath: string, line: number, character: number): Promise<any> {\n if (!this.connection) return null;\n\n try {\n return await this.connection.sendRequest('textDocument/hover', {\n textDocument: TextDocumentIdentifier.create(`file://${filePath}`),\n position: Position.create(line, character),\n });\n } catch {\n return null;\n }\n }\n\n /**\n * Get diagnostics for a specific file\n */\n getDiagnostics(filePath: string): Diagnostic[] {\n const uri = `file://${filePath}`;\n return this.diagnostics.get(uri) || [];\n }\n\n /**\n * Get all diagnostics from all files\n */\n getAllDiagnostics(): Diagnostic[] {\n const allDiagnostics: Diagnostic[] = [];\n for (const diagnostics of this.diagnostics.values()) {\n allDiagnostics.push(...diagnostics);\n }\n return allDiagnostics;\n }\n\n /**\n * Notify server that a file was closed\n */\n notifyClose(filePath: string): void {\n if (!this.connection) return;\n\n const uri = `file://${filePath}`;\n\n // Clear diagnostics for this file\n this.diagnostics.delete(uri);\n\n // Send didClose notification\n this.connection.sendNotification('textDocument/didClose', {\n textDocument: TextDocumentIdentifier.create(uri),\n });\n }\n\n /**\n * Restart the LSP client\n */\n async restart(): Promise<void> {\n await this.shutdown();\n\n // Re-initialize (this will re-spawn the server)\n await this.initialize();\n }\n\n /**\n * Shutdown the connection\n */\n async shutdown(): Promise<void> {\n if (this.connection) {\n try {\n // Only send shutdown request if the process is still alive\n const processAlive = this.process && !this.process.killed;\n if (processAlive) {\n await Promise.race([\n this.connection.sendRequest('shutdown'),\n new Promise((_, reject) => setTimeout(() => reject(new Error('Shutdown request timed out')), 1000)),\n ]);\n this.connection.sendNotification('exit');\n }\n } catch {\n // Ignore shutdown errors (process may have already crashed)\n }\n try {\n this.connection.dispose();\n } catch {\n // Ignore dispose errors (stream may already be destroyed)\n }\n this.connection = null;\n }\n\n if (this.process) {\n try {\n if (!this.process.killed) {\n this.process.kill();\n }\n } catch {\n // Ignore kill errors\n }\n this.process = null;\n }\n\n this.diagnostics = new Map();\n }\n}\n","import type { ChildProcess } from 'node:child_process';\nimport { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path, { join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { getLanguageId } from './language';\n\n/**\n * LSP Server definition and spawning logic\n */\nexport interface LSPServerInfo {\n id: string;\n name: string;\n languageIds: string[];\n root: (cwd: string) => string | null;\n spawn: (root: string) => ChildProcess | Promise<{ process: ChildProcess; initialization?: any } | undefined>;\n}\n\n/**\n * Find the nearest project root directory\n */\nexport function findNearestRoot(cwd: string, markers: string[]): string | null {\n let current = cwd;\n\n while (current !== '/') {\n for (const marker of markers) {\n if (existsSync(join(current, marker))) {\n return current;\n }\n }\n\n const parent = join(current, '..');\n if (parent === current) break;\n current = parent;\n }\n\n return null;\n}\n\n/**\n * Built-in LSP server definitions\n */\nexport const BUILTIN_SERVERS: Record<string, LSPServerInfo> = {\n typescript: {\n id: 'typescript',\n name: 'TypeScript Language Server',\n languageIds: ['typescript', 'typescriptreact', 'javascript', 'javascriptreact'],\n root: (cwd: string) => findNearestRoot(cwd, ['tsconfig.json', 'package.json']),\n spawn: async (root: string) => {\n // Try to resolve TypeScript from the project directory\n const requireFromRoot = createRequire(pathToFileURL(path.join(root, 'package.json')));\n let tsserver: string | undefined;\n try {\n tsserver = requireFromRoot.resolve('typescript/lib/tsserver.js');\n } catch {\n tsserver = undefined;\n }\n if (!tsserver) {\n return undefined;\n }\n\n // Resolve typescript-language-server binary directly to avoid npx hangs\n // (npx can hang indefinitely in projects with pnpm links)\n const localBin = join(root, 'node_modules', '.bin', 'typescript-language-server');\n const cwdBin = join(process.cwd(), 'node_modules', '.bin', 'typescript-language-server');\n let tslsBinary: string;\n if (existsSync(localBin)) {\n tslsBinary = localBin;\n } else if (existsSync(cwdBin)) {\n tslsBinary = cwdBin;\n } else {\n // Fall back to npx as last resort, but this may hang with pnpm links\n tslsBinary = 'npx';\n }\n\n const args = tslsBinary === 'npx' ? ['typescript-language-server', '--stdio'] : ['--stdio'];\n\n const proc = spawn(tslsBinary, args, {\n cwd: root,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n return {\n process: proc,\n initialization: {\n tsserver: {\n path: tsserver,\n logVerbosity: 'off',\n },\n },\n };\n },\n },\n\n eslint: {\n id: 'eslint',\n name: 'ESLint Language Server',\n languageIds: ['typescript', 'typescriptreact', 'javascript', 'javascriptreact'],\n root: (cwd: string) =>\n findNearestRoot(cwd, ['package.json', '.eslintrc.js', '.eslintrc.json', '.eslintrc.yml', '.eslintrc.yaml']),\n spawn: (root: string) => {\n const binaryPath = join(process.cwd(), 'node_modules', '.bin', 'eslint-lsp');\n return spawn(binaryPath, ['--stdio'], {\n cwd: root,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n },\n },\n\n python: {\n id: 'python',\n name: 'Python Language Server (Pyright)',\n languageIds: ['python'],\n root: (cwd: string) => findNearestRoot(cwd, ['pyproject.toml', 'setup.py', 'requirements.txt', '.git']),\n spawn: (root: string) => {\n // Try node_modules first, then fall back to system PATH\n const localPath = join(process.cwd(), 'node_modules', '.bin', 'pyright-langserver');\n const binaryPath = existsSync(localPath) ? localPath : 'pyright-langserver';\n return spawn(binaryPath, ['--stdio'], {\n cwd: root,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n },\n },\n\n go: {\n id: 'go',\n name: 'Go Language Server (gopls)',\n languageIds: ['go'],\n root: (cwd: string) => findNearestRoot(cwd, ['go.mod', '.git']),\n spawn: (root: string) => {\n return spawn('gopls', ['serve'], {\n cwd: root,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n },\n },\n\n rust: {\n id: 'rust',\n name: 'Rust Language Server (rust-analyzer)',\n languageIds: ['rust'],\n root: (cwd: string) => findNearestRoot(cwd, ['Cargo.toml', '.git']),\n spawn: (root: string) => {\n return spawn('rust-analyzer', ['--stdio'], {\n cwd: root,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n },\n },\n};\n\n/**\n * Get all servers that can handle a file\n */\nexport function getServersForFile(filePath: string, cwd: string): LSPServerInfo[] {\n const languageId = getLanguageId(filePath);\n if (!languageId) return [];\n\n return Object.values(BUILTIN_SERVERS).filter(\n server => server.languageIds.includes(languageId) && server.root(cwd) !== null,\n );\n}\n","import { LSPClient } from './client.js';\nimport { getServersForFile } from './server.js';\n\n/**\n * Singleton LSP client manager that keeps clients alive and reuses them\n * across tool calls for better performance and accuracy\n */\nclass LSPManager {\n private clients: Map<string, LSPClient> = new Map();\n private initializationPromises: Map<string, Promise<void>> = new Map();\n\n /**\n * Get or create an LSP client for a file\n * Returns null if no LSP server is available for the file\n */\n async getClient(filePath: string, workspaceRoot: string): Promise<LSPClient | null> {\n const servers = getServersForFile(filePath, workspaceRoot);\n if (servers.length === 0) {\n return null;\n }\n\n // Use the first matching server (prioritize TypeScript/JavaScript)\n const serverInfo =\n servers.find(\n s =>\n s.languageIds.includes('typescript') ||\n s.languageIds.includes('javascript') ||\n s.languageIds.includes('python') ||\n s.languageIds.includes('go'),\n ) || servers[0];\n // Create a unique key for this server + workspace combination\n if (!serverInfo) {\n return null;\n }\n const key = `${serverInfo.name}:${workspaceRoot}`;\n\n // Return existing client if available\n if (this.clients.has(key)) {\n return this.clients.get(key)!;\n }\n\n // If initialization is in progress, wait for it\n if (this.initializationPromises.has(key)) {\n await this.initializationPromises.get(key);\n return this.clients.get(key) || null;\n }\n\n // Create and initialize new client with a timeout to prevent indefinite hangs\n // (e.g., npx resolution issues in pnpm-linked projects)\n const initPromise = (async () => {\n const client = new LSPClient(serverInfo, workspaceRoot);\n await client.initialize();\n this.clients.set(key, client);\n })();\n\n this.initializationPromises.set(key, initPromise);\n\n try {\n await Promise.race([\n initPromise,\n new Promise<void>((_, reject) =>\n setTimeout(() => reject(new Error('LSP client initialization timed out')), 15000),\n ),\n ]);\n return this.clients.get(key) || null;\n } catch {\n // If initialization timed out or failed, clean up\n this.clients.delete(key);\n return null;\n } finally {\n this.initializationPromises.delete(key);\n }\n }\n\n /**\n * Shutdown a specific client\n */\n async shutdownClient(workspaceRoot: string, serverName?: string): Promise<void> {\n const keysToRemove: string[] = [];\n\n for (const [key, client] of this.clients.entries()) {\n if (key.includes(workspaceRoot) && (!serverName || key.startsWith(serverName))) {\n await client.shutdown();\n keysToRemove.push(key);\n }\n }\n\n for (const key of keysToRemove) {\n this.clients.delete(key);\n }\n }\n\n /**\n * Shutdown all clients\n */\n async shutdownAll(): Promise<void> {\n const shutdownPromises = Array.from(this.clients.values()).map(client => client.shutdown());\n await Promise.all(shutdownPromises);\n this.clients.clear();\n this.initializationPromises.clear();\n }\n\n /**\n * Get the number of active clients\n */\n getActiveClientCount(): number {\n return this.clients.size;\n }\n\n /**\n * Close a document in all active clients\n * This is useful for tests that reuse the same file path\n */\n closeDocument(filePath: string): void {\n for (const client of this.clients.values()) {\n try {\n client.notifyClose(filePath);\n } catch {\n // Ignore errors if document wasn't open\n }\n }\n }\n}\n\n// Export singleton instance\nexport const lspManager = new LSPManager();\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Workspace markers that indicate the root of a project\n */\nconst WORKSPACE_MARKERS = [\n 'package.json',\n 'tsconfig.json',\n 'pyproject.toml',\n 'go.mod',\n '.git',\n 'Cargo.toml',\n 'composer.json',\n];\n\n/**\n * Find the workspace root by walking up from the file path\n * looking for common workspace markers.\n *\n * For monorepos, this prioritizes the closest package/project root\n * (e.g., packages/core) over the monorepo root.\n */\nexport function findWorkspaceRoot(filePath: string): string {\n let currentDir = path.dirname(path.resolve(filePath));\n const root = path.parse(currentDir).root;\n\n // First, find the closest tsconfig.json or package.json\n // This handles monorepos where the actual project is in a subdirectory\n let closestProjectRoot: string | null = null;\n let searchDir = currentDir;\n\n while (searchDir !== root) {\n const hasTsConfig = fs.existsSync(path.join(searchDir, 'tsconfig.json'));\n const hasPackageJson = fs.existsSync(path.join(searchDir, 'package.json'));\n\n if (hasTsConfig || hasPackageJson) {\n closestProjectRoot = searchDir;\n break;\n }\n\n const parentDir = path.dirname(searchDir);\n if (parentDir === searchDir) {\n break;\n }\n searchDir = parentDir;\n }\n\n // If we found a project root, return it\n if (closestProjectRoot) {\n return closestProjectRoot;\n }\n\n // Otherwise, fall back to looking for any workspace marker\n currentDir = path.dirname(path.resolve(filePath));\n while (currentDir !== root) {\n for (const marker of WORKSPACE_MARKERS) {\n const markerPath = path.join(currentDir, marker);\n if (fs.existsSync(markerPath)) {\n return currentDir;\n }\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n // Fallback to the directory containing the file\n return path.dirname(path.resolve(filePath));\n}\n","import { exec } from 'node:child_process';\nimport { promises as fs } from 'node:fs';\nimport { promisify } from 'node:util';\nimport { distance } from 'fastest-levenshtein';\n\nfunction removeWhitespace(str: string): string {\n return str\n .replace(/\\t/g, '') // tabs to spaces\n .replace(/ +/g, '') // collapse multiple spaces\n .replace(/^ +| +$/gm, '') // trim each line\n .replace(/\\r?\\n/g, '\\n')\n .replace(/\\s/g, '');\n}\n\nfunction removeVaryingChars(str: string): string {\n return (\n removeWhitespace(str)\n .replaceAll(`\\n`, ``)\n .replaceAll(`'`, ``)\n .replaceAll(`\"`, ``)\n .replaceAll('`', ``)\n // .replaceAll(`;`, ``) // this sometimes causes an extra ; to be printed!\n .replaceAll(`\\\\r`, ``)\n );\n}\n\nimport {\n SNIPPET_LINES,\n readFile,\n writeFile,\n makeOutput,\n validatePath,\n withFileLock,\n // truncateText\n} from './utils';\nconst realExecAsync = promisify(exec);\n\ninterface ViewArgs {\n path: string;\n view_range?: [number, number];\n}\n\ninterface CreateArgs {\n path: string;\n file_text: string;\n}\n\ninterface StrReplaceArgs {\n path: string;\n old_str: string;\n new_str: string;\n start_line?: number;\n}\n\ninterface InsertArgs {\n path: string;\n insert_line: number;\n new_str: string;\n}\n\nexport class FileEditor {\n private execAsync: typeof realExecAsync;\n\n constructor() {\n this.execAsync = realExecAsync;\n }\n\n async view(args: ViewArgs) {\n await validatePath('view', args.path);\n if (await this.isDirectory(args.path)) {\n const { stdout, stderr } = await this.execAsync(`find \"${args.path}\" -maxdepth 2 -not -path '*/.*'`);\n if (stderr) return stderr;\n return `Here's the files and directories up to 2 levels deep in ${args.path}, excluding hidden items:\\n${stdout}\\n`;\n }\n const fileContent = await readFile(args.path);\n if (args.view_range) {\n const fileLines = fileContent.split('\\n');\n const nLinesFile = fileLines.length;\n const [start] = args.view_range;\n let [, end] = args.view_range;\n if (start < 1 || start > nLinesFile) {\n return `Invalid \\`view_range\\`: ${args.view_range}. Its first element \\`${start}\\` should be within the range of lines of the file: [1, ${nLinesFile}]`;\n }\n if (end !== -1) {\n if (end > nLinesFile) {\n end = nLinesFile;\n // throw new ToolError(\n // `Invalid \\`view_range\\`: ${args.view_range}. Its second element \\`${end}\\` should be smaller than the number of lines in the file: \\`${nLinesFile}\\``\n // );\n }\n if (end < start) {\n return `Invalid \\`view_range\\`: ${args.view_range}. Its second element \\`${end}\\` should be larger or equal than its first \\`${start}\\``;\n }\n }\n const selectedLines = end === -1 ? fileLines.slice(start - 1) : fileLines.slice(start - 1, end);\n return makeOutput(selectedLines.join('\\n'), String(args.path), start);\n }\n return makeOutput(fileContent, String(args.path));\n }\n async create(args: CreateArgs) {\n await validatePath('create', args.path);\n await writeFile(args.path, args.file_text);\n return `File created successfully at: ${args.path}`;\n }\n // undoubleEscape(input) {\n // return input.replace(/(\"([^\"\\\\]|\\\\.)*\"|'([^'\\\\]|\\\\.)*'|`([^`\\\\]|\\\\.)*`|\\/([^\\/\\\\\\n]|\\\\.)+\\/[gimsuy]*)|\\\\n|\\\\r|\\\\t|\\\\\"|\\\\'|\\\\`/g, (match) => {\n // if (match.startsWith('\"') ||\n // match.startsWith(\"'\") ||\n // match.startsWith(\"`\") ||\n // match.startsWith(\"/\")) {\n // return match; // skip unescaping inside strings, backticks, or regex literals\n // }\n // // outside of those: unescape\n // return match\n // .replace(/\\\\n/g, \"\\n\")\n // .replace(/\\\\r/g, \"\\r\")\n // .replace(/\\\\t/g, \"\\t\")\n // .replace(/\\\\\"/g, '\"')\n // .replace(/\\\\'/g, \"'\")\n // .replace(/\\\\`/g, \"`\");\n // });\n // }\n async strReplace(args: StrReplaceArgs) {\n await validatePath('string_replace', args.path);\n if (args.old_str === args.new_str) {\n return `Received the same string for old_str and new_str`;\n }\n // Queue concurrent edits to the same file\n return withFileLock(args.path, async () => {\n const fileContent = await readFile(args.path);\n // First, try exact match with the raw string (no processing)\n // This handles cases where the search/replace should work exactly as provided\n if (fileContent.includes(args.old_str)) {\n // Exact match found! Use simple string replacement\n const processedNewStr = args.new_str || '';\n const newFileContent = fileContent.split(args.old_str).join(processedNewStr);\n await writeFile(args.path, newFileContent);\n return `The file ${args.path} has been edited. `;\n }\n\n // Try whitespace-normalized exact match before falling back to fuzzy matching\n // This handles cases where the only difference is whitespace/indentation\n // while preserving all escaping (e.g., \\\\n stays as \\\\n)\n const normalizeWhitespace = (str: string) => str.replace(/\\s+/g, ' ').trim();\n const normalizedOldStr = normalizeWhitespace(args.old_str);\n const normalizedContent = normalizeWhitespace(fileContent);\n\n if (normalizedContent.includes(normalizedOldStr)) {\n // Find the actual position in the original content by searching for the pattern\n // We need to find where the whitespace-normalized match occurs in the original\n const lines = fileContent.split('\\n');\n let bestMatch = { start: -1, end: -1, content: '' };\n\n // Use original old_str line count (not normalized, which collapses \\n)\n const originalOldLineCount = args.old_str.split('\\n').length;\n // Allow some slack for whitespace differences\n const maxWindow = originalOldLineCount + 5;\n // Try to find the matching section by comparing normalized versions\n for (let i = 0; i < lines.length; i++) {\n for (let j = i; j <= Math.min(i + maxWindow, lines.length - 1); j++) {\n const candidate = lines.slice(i, j + 1).join('\\n');\n if (normalizeWhitespace(candidate) === normalizedOldStr) {\n bestMatch = { start: i, end: j, content: candidate };\n break;\n }\n }\n if (bestMatch.start !== -1) break;\n }\n if (bestMatch.start !== -1) {\n const beforeLines = lines.slice(0, bestMatch.start);\n const afterLines = lines.slice(bestMatch.end + 1);\n const newFileContent = [...beforeLines, args.new_str || '', ...afterLines].join('\\n');\n\n // Save the file\n await writeFile(args.path, newFileContent);\n\n // Find the line number for the snippet\n const fileLines = newFileContent.split('\\n');\n const startLine = Math.max(0, bestMatch.start - SNIPPET_LINES);\n const endLine = Math.min(\n fileLines.length,\n bestMatch.start + SNIPPET_LINES + (args.new_str || '').split('\\n').length,\n );\n const snippet = fileLines.slice(startLine, endLine).join('\\n');\n let successMsg = `The file ${args.path} has been edited. `;\n successMsg += makeOutput(snippet, `a snippet of ${args.path}`, startLine + 1);\n successMsg += 'Review the changes and make sure they are as expected. Edit the file again if necessary.';\n return successMsg;\n }\n }\n\n // If exact match and whitespace-normalized match both fail, proceed with fuzzy whitespace-agnostic matching\n // First apply undoubleEscape for the fuzzy matching\n const processedOldStr = args.old_str;\n const processedNewStr = args.new_str || '';\n // Remove leading line numbers and whitespace from each line\n const removeLeadingLineNumbers = (str: string): string => {\n return str\n .split('\\n')\n .map(line => line.replace(/^\\s*\\d+\\s*/, ''))\n .join('\\n');\n };\n let oldStr = removeLeadingLineNumbers(processedOldStr);\n let newStr = removeLeadingLineNumbers(processedNewStr);\n if (oldStr.startsWith(`\\\\\\n`)) {\n oldStr = oldStr.substring(`\\\\\\n`.length);\n }\n if (newStr.startsWith(`\\\\\\n`)) {\n newStr = newStr.substring(`\\\\\\n`.length);\n }\n const startLineArg =\n typeof args.start_line === `number`\n ? Math.max(args.start_line - 5, 0) // - 3 cause llms are not precise\n : undefined;\n // Split and normalize\n const oldLinesSplit = oldStr.split('\\n');\n const oldLinesOriginal = oldLinesSplit.filter((l, i) => {\n if (i === 0) return removeWhitespace(l) !== ``;\n if (i + 1 !== oldLinesSplit.length) return true;\n // only keep last item if it's not an empty string\n return removeWhitespace(l) !== ``;\n });\n const oldLines = oldLinesOriginal.map(removeWhitespace);\n const split = (str: string): string[] => {\n return str.split('\\n').map((l: string) => l.replaceAll(`\\n`, `\\\\n`));\n };\n const fileLines = split(fileContent);\n const normFileLines = fileLines.map(removeWhitespace);\n const bestMatch: {\n start: number;\n avgDist: number;\n type: string;\n end?: number;\n } = {\n start: -1,\n avgDist: Infinity,\n type: 'replace-lines',\n };\n const isSingleLineReplacement = oldLines.length === 1;\n const matchLineNumbers = normFileLines\n .map((l: string, index: number) => (l === oldLines[0] ? index + 1 : null))\n .filter(Boolean);\n if (isSingleLineReplacement && matchLineNumbers.length > 1 && !startLineArg) {\n return `Single line search string \"${oldLines[0]}\" has too many matches. This will result in innacurate replacements. Found ${matchLineNumbers.length} matches. Pass start_line to choose one. Found on lines ${matchLineNumbers.join(`, `)}`;\n }\n let divergedMessage;\n let divergenceAfterX = 0;\n const fileNoSpace = removeVaryingChars(fileContent);\n const oldStringNoSpace = removeVaryingChars(oldStr);\n if (fileNoSpace.includes(oldStringNoSpace.substring(0, -1))) {\n let oldStringNoSpaceBuffer = oldStringNoSpace;\n let startIndex = null;\n let endIndex = null;\n for (const [index, line] of split(fileContent).entries()) {\n if (\n startIndex === null &&\n typeof startLineArg !== `undefined` &&\n index + 1 > startLineArg + 50 // allow for llm to be off by 50 lines lmao\n ) {\n continue;\n }\n if (typeof startLineArg !== `undefined` && index < startLineArg) {\n continue;\n }\n const lineNoSpace = removeVaryingChars(line);\n if (lineNoSpace === `` && !startIndex) continue;\n const startsWith = oldStringNoSpaceBuffer.startsWith(lineNoSpace);\n const startsWithNoDanglingCommaTho =\n !startsWith &&\n lineNoSpace.endsWith(`,`) &&\n oldStringNoSpaceBuffer.substring(lineNoSpace.length - 1).startsWith(`)`) &&\n oldStringNoSpaceBuffer.startsWith(lineNoSpace.substring(0, lineNoSpace.length - 1));\n if (\n startsWith ||\n // allow for missing dangling comma (common in JS/TS, harmless in other languages)\n startsWithNoDanglingCommaTho\n ) {\n if (startIndex === null) {\n startIndex = index;\n }\n oldStringNoSpaceBuffer = oldStringNoSpaceBuffer.substring(\n startsWithNoDanglingCommaTho\n ? lineNoSpace.length - 1 // remove the comma\n : lineNoSpace.length,\n );\n if (oldStringNoSpaceBuffer.length === 0 && startIndex !== null) {\n endIndex = index;\n break;\n }\n } else if (startIndex !== null) {\n // diverged from a partial match. reset\n startIndex = null;\n oldStringNoSpaceBuffer = oldStringNoSpace;\n }\n }\n if (startIndex !== null && endIndex !== null) {\n bestMatch.start = startIndex;\n bestMatch.end = endIndex;\n }\n }\n for (const [index, normLine] of normFileLines.entries()) {\n if (!normLine) continue;\n // we already matched above!\n if (bestMatch.end) break;\n if (typeof startLineArg !== `undefined` && index + 1 < startLineArg) continue;\n // if there's a start line it must match within the next 50 lines\n if (typeof startLineArg !== `undefined` && index + 1 > startLineArg + 50) continue;\n if (typeof startLineArg !== `undefined` && index + 1 > startLineArg + 5 && isSingleLineReplacement) {\n // only break early for single line replacements.. if the llm added a line number to start from + multiple lines to match, often it gets confused about the line numbers, so keep going until the end.\n break;\n }\n // this line is equal to the first line in our from replacement. Lets check each following line to see if we match\n const firstDistance = distance(oldLines[0] || '', normLine || '');\n const firstPercentDiff = (firstDistance / (normLine?.length || 0)) * 100;\n if (isSingleLineReplacement && (normLine === oldLines[0] || normLine.includes(oldLines[0]!))) {\n bestMatch.start = index;\n bestMatch.type = 'replace-in-line';\n continue;\n }\n if (oldLines[0] === normLine || firstPercentDiff < 5) {\n let isMatching = true;\n let matchingLineCount = 0;\n for (const [matchIndex, oldLine] of oldLines.entries()) {\n const innerNormLine = normFileLines[index + matchIndex]!;\n const innerDistance = distance(oldLine, normFileLines[index + matchIndex]!);\n const innerPercentDiff = (innerDistance / innerNormLine.length) * 100;\n const remainingLines = oldLines.length - matchingLineCount;\n const percentLinesRemaining = (remainingLines / oldLines.length) * 100;\n const isMatch = oldLine === innerNormLine || innerPercentDiff < 5;\n const fewLinesAreLeft = oldLines.length >= 30 && percentLinesRemaining < 1;\n if (isMatch || fewLinesAreLeft) {\n matchingLineCount++;\n } else {\n const message = `old_str matching diverged after ${matchingLineCount} matching lines.\\nExpected line from old_str: \\`${oldLinesOriginal[matchIndex]}\\` (line ${matchIndex + 1} in old_str), found line: \\`${fileLines[index + matchIndex]}\\` (line ${index + 1 + matchIndex} in file). ${remainingLines - 1} lines remained to compare but they were not checked due to this line not matching.\\n\\nHere are the lines that did match up until the old_str diverged:\\n\\n${oldLinesOriginal.slice(0, matchIndex).join(`\\n`)}\\n\\nHere are the remaining lines you would've had to provide for the old_str to match:\\n\\n${fileLines\n .slice(index + matchIndex, index + matchIndex + remainingLines)\n .join(`\\n`)}`;\n // tell the llm about the longest matching string so it can adjust the next input\n if (matchingLineCount > divergenceAfterX) {\n divergenceAfterX = matchingLineCount;\n divergedMessage = message;\n }\n isMatching = false;\n break;\n }\n }\n if (isMatching) {\n bestMatch.start = index;\n break;\n }\n }\n }\n if (\n bestMatch.start === -1 &&\n (isSingleLineReplacement || oldStr === `\\n`) &&\n newStr === `` &&\n typeof startLineArg === `number`\n ) {\n // we're just deleting a line\n bestMatch.start = startLineArg;\n bestMatch.type = 'delete-line';\n }\n let newFileContent = ``;\n if (bestMatch.start === -1) {\n return `No replacement was performed. No sufficiently close match for old_str found in ${args.path}.\n${divergedMessage ? divergedMessage : ``}Try adjusting your input or the file content.`;\n }\n if (bestMatch.type === `replace-lines`) {\n // Replace the original lines in fileLines from bestMatch.start to bestMatch.start + oldLines.length\n const newFileLines = [\n ...fileLines.slice(0, bestMatch.start),\n ...(newStr ? newStr.split('\\n') : []),\n ...fileLines.slice(bestMatch.end ? bestMatch.end + 1 : bestMatch.start + oldLines.length),\n ];\n // console.log({ newFileLines });\n newFileContent = newFileLines.join('\\n');\n await writeFile(args.path, newFileContent);\n } else if (bestMatch.type === `replace-in-line`) {\n const [firstNew, ...restNew] = newStr ? newStr.split('\\n') : [];\n const newFileLines = [\n ...fileLines.slice(0, bestMatch.start),\n ...(restNew?.length\n ? [firstNew, ...restNew]\n : [fileLines.at(bestMatch.start)?.replace(oldLinesOriginal[0]!, firstNew || '') ?? '']),\n ...fileLines.slice(bestMatch.start + 1),\n ];\n newFileContent = newFileLines.join('\\n');\n await writeFile(args.path, newFileContent);\n } else if (bestMatch.type === `delete-line`) {\n const newFileLines = [...fileLines.slice(0, bestMatch.start), ...fileLines.slice(bestMatch.start + 1)];\n newFileContent = newFileLines.join('\\n');\n await writeFile(args.path, newFileContent);\n }\n // Find the line number for the snippet\n const replacementLine = bestMatch.start + 1;\n const startLine = Math.max(0, replacementLine - SNIPPET_LINES);\n const endLine = replacementLine + SNIPPET_LINES + newStr.split('\\n').length;\n const snippet = newFileContent\n .split('\\n')\n .slice(startLine, endLine + 1)\n .join('\\n');\n let successMsg = `The file ${args.path} has been edited. `;\n successMsg += makeOutput(snippet, `a snippet of ${args.path}`, startLine + 1);\n successMsg += 'Review the changes and make sure they are as expected. Edit the file again if necessary.';\n return successMsg;\n }); // end withFileLock\n }\n async insert(args: InsertArgs) {\n await validatePath('insert', args.path);\n const fileContent = await readFile(args.path);\n const newStr = args.new_str;\n const fileLines = fileContent.split('\\n');\n const nLinesFile = fileLines.length;\n if (args.insert_line < 0 || args.insert_line > nLinesFile) {\n return `Invalid \\`insert_line\\` parameter: ${args.insert_line}. It should be within the range of lines of the file: [0, ${nLinesFile}]`;\n }\n const newStrLines = newStr.split('\\n');\n const newFileLines = [\n ...fileLines.slice(0, args.insert_line + 1),\n ...newStrLines,\n ...fileLines.slice(args.insert_line + 1),\n ];\n const snippetLines = [\n ...fileLines.slice(Math.max(0, args.insert_line - SNIPPET_LINES), args.insert_line + 1),\n ...newStrLines,\n ...fileLines.slice(args.insert_line + 1, args.insert_line + SNIPPET_LINES),\n ];\n const newFileContent = newFileLines.join('\\n');\n const snippet = snippetLines.join('\\n');\n await writeFile(args.path, newFileContent);\n let successMsg = `The file ${args.path} has been edited. `;\n successMsg += makeOutput(\n snippet,\n 'a snippet of the edited file',\n Math.max(1, args.insert_line - SNIPPET_LINES + 1),\n );\n successMsg +=\n 'Review the changes and make sure they are as expected (correct indentation, no duplicate lines, etc). Edit the file again if necessary.';\n return successMsg;\n }\n\n async isDirectory(filePath: string) {\n try {\n const stats = await fs.stat(filePath);\n return stats.isDirectory();\n } catch {\n return false;\n }\n }\n}\n\n// Singleton instance of FileEditor\nexport const sharedFileEditor = new FileEditor();\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\nimport { getLanguageId } from '../lsp/language.js';\nimport { lspManager } from '../lsp/manager.js';\nimport { findWorkspaceRoot } from '../lsp/workspace.js';\nimport { truncateStringForTokenEstimate } from '../utils/token-estimator.js';\nimport { sharedFileEditor } from './file-editor.js';\nimport { assertPathAllowed, getAllowedPathsFromContext } from './utils.js';\n\nexport const stringReplaceLspTool = createTool({\n id: 'string_replace_lsp',\n description: `Edit a file by replacing exact text matches. Returns Language Server Protocol (LSP) diagnostics to show any errors/warnings introduced by your edit.\n\nUsage notes:\n- You MUST use the view tool to read a file before editing it. Never edit blind.\n- old_str must be an exact substring of the file's current content. Include enough surrounding context to uniquely identify the location.\n- If old_str is not found or matches multiple locations, the edit will fail. Provide more context to disambiguate.\n- new_str replaces old_str. If new_str is omitted or empty, old_str is deleted.\n- Use start_line to narrow the search to a specific region of the file.\n- After editing, real LSP diagnostics are returned (TypeScript errors, linting warnings, etc).\n- For creating NEW files, use the write_file tool instead.`,\n // requireApproval: true,\n inputSchema: z.object({\n path: z.string(),\n old_str: z.string(),\n new_str: z.string().optional(),\n start_line: z.number().optional(),\n }),\n async execute(context, toolContext) {\n const { path: filePath, old_str, new_str, start_line } = context;\n\n try {\n // Convert relative paths to absolute (same logic as validatePath in utils.ts)\n const absoluteFilePath = path.isAbsolute(filePath) ? filePath : path.join(process.cwd(), filePath);\n\n // Security: ensure the path is within the project root or allowed paths\n const root = process.cwd();\n const allowedPaths = getAllowedPathsFromContext(toolContext);\n assertPathAllowed(absoluteFilePath, root, allowedPaths);\n\n // Call the FileEditor strReplace method\n const result = await sharedFileEditor.strReplace({\n path: filePath,\n old_str,\n new_str: new_str || '',\n start_line,\n });\n\n // Get LSP diagnostics\n let diagnosticOutput = '';\n try {\n const workspaceRoot = findWorkspaceRoot(absoluteFilePath);\n const client = await lspManager.getClient(absoluteFilePath, workspaceRoot);\n if (client) {\n // Read the modified file content\n const contentNew = fs.readFileSync(absoluteFilePath, 'utf-8');\n const languageId = getLanguageId(absoluteFilePath) || path.extname(absoluteFilePath).slice(1);\n\n client.notifyOpen(absoluteFilePath, contentNew, languageId);\n client.notifyChange(absoluteFilePath, contentNew, 1);\n\n const diagnostics = await client.waitForDiagnostics(absoluteFilePath, 3000).catch(() => []);\n\n if (diagnostics.length > 0) {\n // Deduplicate diagnostics by location + message\n const seen = new Set<string>();\n const dedup = diagnostics.filter(d => {\n const key = `${d.severity}:${d.range.start.line}:${d.range.start.character}:${d.message}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n\n const errors = dedup.filter(d => d.severity === 1);\n const warnings = dedup.filter(d => d.severity === 2);\n const info = dedup.filter(d => d.severity === 3);\n const hints = dedup.filter(d => d.severity === 4);\n\n const formatDiags = (items: typeof dedup) =>\n items.map(d => ` ${d.range.start.line + 1}:${d.range.start.character + 1} - ${d.message}`).join('\\n');\n\n let diagnosticText = '';\n if (errors.length > 0) {\n diagnosticText += `\\nErrors:\\n${formatDiags(errors)}`;\n }\n if (warnings.length > 0) {\n diagnosticText += `\\nWarnings:\\n${formatDiags(warnings)}`;\n }\n if (info.length > 0) {\n diagnosticText += `\\nInfo:\\n${formatDiags(info)}`;\n }\n if (hints.length > 0) {\n diagnosticText += `\\nHints:\\n${formatDiags(hints)}`;\n }\n\n if (diagnosticText) {\n diagnosticOutput = truncateStringForTokenEstimate(`\\n\\nLSP Diagnostics:${diagnosticText}`, 500, false);\n }\n } else {\n diagnosticOutput = `\\n\\nLSP Diagnostics:\\nNo errors or warnings`;\n }\n }\n } catch {\n // LSP errors are non-fatal — diagnostics just won't be available\n }\n\n return {\n content: [\n {\n type: 'text',\n text: result + diagnosticOutput,\n },\n ],\n };\n } catch (e) {\n return {\n error: e instanceof Error ? e.message : JSON.stringify(e, null, 2),\n };\n }\n },\n});\n","/**\n * Grep tool — fast content search using ripgrep (rg) with Node.js fallback.\n */\nimport * as path from 'node:path';\nimport { createTool } from '@mastra/core/tools';\nimport { execa } from 'execa';\nimport { z } from 'zod';\nimport { truncateStringForTokenEstimate } from '../utils/token-estimator.js';\nimport { assertPathAllowed, getAllowedPathsFromContext } from './utils.js';\n\nconst MAX_GREP_TOKENS = 2_000;\n\n/**\n * Check if ripgrep is available on the system.\n */\nlet rgAvailable: boolean | null = null;\nasync function hasRipgrep(): Promise<boolean> {\n if (rgAvailable !== null) return rgAvailable;\n try {\n await execa('rg', ['--version']);\n rgAvailable = true;\n } catch {\n rgAvailable = false;\n }\n return rgAvailable;\n}\n\n/**\n * Create the grep tool for searching file contents.\n */\nexport function createGrepTool(projectRoot?: string) {\n return createTool({\n id: 'search_content',\n // requireApproval: true,\n description: `Search file contents using regex patterns. Returns matching lines with file paths and line numbers.\n\nUsage notes:\n- Use this for ALL content search (finding functions, variables, error messages, imports, etc.)\n- NEVER use execute_command with grep, rg, or ag. Always use this tool instead.\n- Supports full regex syntax (e.g., \"function\\\\s+\\\\w+\", \"import.*from\")\n- Use the \\`glob\\` parameter to filter by file type (e.g., \"*.ts\", \"*.py\")\n- Use \\`contextLines\\` to see surrounding code for each match\n- Results are sorted by file path for readability\n- Output is truncated if too large — narrow your search with a more specific pattern or glob filter`,\n inputSchema: z.object({\n pattern: z.string().describe('Regex pattern to search for in file contents'),\n path: z\n .string()\n .optional()\n .describe('Directory or file to search in (relative to project root). Defaults to project root.'),\n glob: z.string().optional().describe('Glob pattern to filter files (e.g., \"*.ts\", \"*.{js,jsx}\", \"test/**\")'),\n contextLines: z.number().optional().describe('Number of lines to show before and after each match (default: 0)'),\n maxResults: z.number().optional().describe('Maximum number of matching lines to return (default: 100)'),\n caseSensitive: z.boolean().optional().describe('Whether the search is case-sensitive (default: true)'),\n }),\n execute: async (context, toolContext) => {\n try {\n const root = projectRoot || process.cwd();\n const searchPath = context.path ? path.resolve(root, context.path) : root;\n\n // Security: ensure the search path is within the project root or allowed paths\n const allowedPaths = getAllowedPathsFromContext(toolContext);\n assertPathAllowed(searchPath, root, allowedPaths);\n const maxResults = context.maxResults ?? 100;\n const contextLines = context.contextLines ?? 0;\n const caseSensitive = context.caseSensitive ?? true;\n\n const useRg = await hasRipgrep();\n\n let output: string;\n\n if (useRg) {\n // Build ripgrep command\n const args: string[] = ['--line-number', '--no-heading', '--color=never', '--max-count', String(maxResults)];\n\n if (!caseSensitive) args.push('--ignore-case');\n if (contextLines > 0) {\n args.push('--context', String(contextLines));\n }\n if (context.glob) {\n args.push('--glob', context.glob);\n }\n\n args.push('--', context.pattern, searchPath);\n\n const result = await execa('rg', args, {\n reject: false,\n timeout: 15_000,\n cwd: root,\n });\n\n if (result.exitCode === 1) {\n // No matches found\n return {\n content: `No matches found for pattern: ${context.pattern}`,\n isError: false,\n };\n }\n if (result.exitCode !== 0 && result.exitCode !== 1) {\n return {\n content: `grep error: ${result.stderr || 'Unknown error'}`,\n isError: true,\n };\n }\n\n output = result.stdout || '';\n } else {\n // Fallback to grep\n const args: string[] = ['-r', '-n', '--color=never'];\n\n if (!caseSensitive) args.push('-i');\n if (contextLines > 0) {\n args.push(`-C${contextLines}`);\n }\n if (context.glob) {\n args.push(`--include=${context.glob}`);\n }\n\n args.push('--', context.pattern, searchPath);\n\n const result = await execa('grep', args, {\n reject: false,\n timeout: 15_000,\n cwd: root,\n });\n\n if (result.exitCode === 1) {\n return {\n content: `No matches found for pattern: ${context.pattern}`,\n isError: false,\n };\n }\n if (result.exitCode !== 0 && result.exitCode !== 1) {\n return {\n content: `grep error: ${result.stderr || 'Unknown error'}`,\n isError: true,\n };\n }\n\n output = result.stdout || '';\n\n // Truncate to maxResults lines (grep doesn't have --max-count for recursive)\n const lines = output.split('\\n');\n if (lines.length > maxResults) {\n output =\n lines.slice(0, maxResults).join('\\n') +\n `\\n... (${lines.length - maxResults} more matches, narrow your search)`;\n }\n }\n\n // Make paths relative to project root for readability\n const relativized = output\n .split('\\n')\n .map(line => {\n if (line.startsWith(root + '/')) {\n return line.slice(root.length + 1);\n }\n if (line.startsWith(root)) {\n return line.slice(root.length);\n }\n return line;\n })\n .join('\\n');\n\n const matchCount = relativized.split('\\n').filter(l => l.trim() && !l.startsWith('--')).length;\n\n const header = `Found ${matchCount} match${matchCount !== 1 ? 'es' : ''} for \"${context.pattern}\":\\n\\n`;\n\n return {\n content: truncateStringForTokenEstimate(header + relativized, MAX_GREP_TOKENS, false),\n isError: false,\n };\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: `grep failed: ${msg}`,\n isError: true,\n };\n }\n },\n });\n}\n","/**\n * Glob tool — fast file pattern matching.\n */\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { createTool } from '@mastra/core/tools';\nimport { execa } from 'execa';\nimport { z } from 'zod';\nimport { truncateStringForTokenEstimate } from '../utils/token-estimator.js';\nimport { assertPathAllowed, getAllowedPathsFromContext } from './utils.js';\n\nconst MAX_GLOB_TOKENS = 2_000;\n\n/**\n * Simple glob matching using `find` + `git ls-files` for .gitignore respect.\n * We prefer git ls-files when inside a git repo since it respects .gitignore.\n */\nasync function matchGlob(pattern: string, searchPath: string, root: string): Promise<string[]> {\n // Check if we're in a git repo\n let isGit = false;\n try {\n await execa('git', ['rev-parse', '--git-dir'], { cwd: root });\n isGit = true;\n } catch {\n // Not a git repo\n }\n\n if (isGit) {\n // Use git ls-files which respects .gitignore\n // --cached = tracked files, --others --exclude-standard = untracked but not ignored\n const args = ['ls-files', '--cached', '--others', '--exclude-standard'];\n\n const result = await execa('git', args, {\n cwd: searchPath,\n reject: false,\n timeout: 10_000,\n });\n\n if (result.exitCode !== 0) {\n // Fall back to find\n return matchGlobWithFind(pattern, searchPath);\n }\n\n const allFiles = result.stdout\n .split('\\n')\n .filter(f => f.trim())\n .map(f => path.resolve(searchPath, f));\n\n // Apply the glob pattern as a simple filter\n return filterByGlob(allFiles, pattern, searchPath);\n }\n\n return matchGlobWithFind(pattern, searchPath);\n}\n\n/**\n * Fallback: use find command for non-git directories.\n */\nasync function matchGlobWithFind(pattern: string, searchPath: string): Promise<string[]> {\n // Convert common glob patterns to find arguments\n // For simple patterns like \"*.ts\", use -name\n // For path patterns like \"src/**/*.ts\", we'll list all and filter\n const result = await execa(\n 'find',\n [\n searchPath,\n '-type',\n 'f',\n '-not',\n '-path',\n '*/node_modules/*',\n '-not',\n '-path',\n '*/.git/*',\n '-not',\n '-path',\n '*/dist/*',\n '-not',\n '-path',\n '*/.next/*',\n ],\n { reject: false, timeout: 10_000 },\n );\n\n if (result.exitCode !== 0) return [];\n\n const allFiles = result.stdout.split('\\n').filter(f => f.trim());\n return filterByGlob(allFiles, pattern, searchPath);\n}\n\n/**\n * Filter file paths by a glob-like pattern.\n * Supports: *, **, ?, and {a,b} alternatives.\n */\nfunction filterByGlob(files: string[], pattern: string, basePath: string): string[] {\n const regex = globToRegex(pattern);\n\n return files.filter(file => {\n // Test against relative path from basePath\n const rel = path.relative(basePath, file);\n return regex.test(rel);\n });\n}\n\n/**\n * Convert a glob pattern to a regex.\n */\nfunction globToRegex(pattern: string): RegExp {\n let regexStr = '';\n let i = 0;\n\n while (i < pattern.length) {\n const c = pattern[i];\n\n if (c === '*') {\n if (pattern[i + 1] === '*') {\n // ** matches any number of path segments\n if (pattern[i + 2] === '/') {\n regexStr += '(?:.+/)?';\n i += 3;\n } else {\n regexStr += '.*';\n i += 2;\n }\n } else {\n // * matches anything except /\n regexStr += '[^/]*';\n i++;\n }\n } else if (c === '?') {\n regexStr += '[^/]';\n i++;\n } else if (c === '{') {\n // {a,b,c} alternatives\n const end = pattern.indexOf('}', i);\n if (end !== -1) {\n const alternatives = pattern.slice(i + 1, end).split(',');\n regexStr += '(?:' + alternatives.map(escapeRegex).join('|') + ')';\n i = end + 1;\n } else {\n regexStr += escapeRegex(c);\n i++;\n }\n } else if (c === '[') {\n // Character classes - pass through\n const end = pattern.indexOf(']', i);\n if (end !== -1) {\n regexStr += pattern.slice(i, end + 1);\n i = end + 1;\n } else {\n regexStr += escapeRegex(c!);\n i++;\n }\n } else {\n regexStr += escapeRegex(c!);\n i++;\n }\n }\n\n return new RegExp('^' + regexStr + '$');\n}\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Get file modification time for sorting.\n */\nasync function getModTime(filePath: string): Promise<number> {\n try {\n const stat = await fs.promises.stat(filePath);\n return stat.mtimeMs;\n } catch {\n return 0;\n }\n}\n\n/**\n * Create the glob tool for finding files by name pattern.\n */\nexport function createGlobTool(projectRoot?: string) {\n return createTool({\n id: 'find_files',\n description: `Find files matching a glob pattern. Returns file paths sorted by modification time (most recent first).\n\nUsage notes:\n- Use this to find files by name or path pattern. NEVER use execute_command with find or ls for file search.\n- Supports standard glob syntax: * (any chars), ** (any path segments), ? (single char), {a,b} (alternatives)\n- Automatically respects .gitignore in git repositories\n- Common patterns:\n - \"**/*.ts\" — all TypeScript files\n - \"src/**/*.test.*\" — all test files under src/\n - \"*.{js,ts}\" — JS and TS files in the root\n - \"**/package.json\" — all package.json files\n - \"src/components/**\" — everything under src/components/`,\n inputSchema: z.object({\n pattern: z.string().describe('Glob pattern to match files (e.g., \"**/*.ts\", \"src/**/*.test.*\")'),\n path: z\n .string()\n .optional()\n .describe('Directory to search in (relative to project root). Defaults to project root.'),\n }),\n execute: async (context, toolContext) => {\n try {\n const root = projectRoot || process.cwd();\n const searchPath = context.path ? path.resolve(root, context.path) : root;\n\n // Security: ensure the search path is within the project root or allowed paths\n const allowedPaths = getAllowedPathsFromContext(toolContext);\n assertPathAllowed(searchPath, root, allowedPaths);\n\n const matches = await matchGlob(context.pattern, searchPath, root);\n\n if (matches.length === 0) {\n return {\n content: `No files found matching pattern: ${context.pattern}`,\n isError: false,\n };\n }\n\n // Get modification times for sorting\n const withTimes = await Promise.all(\n matches.map(async f => ({\n path: f,\n mtime: await getModTime(f),\n })),\n );\n\n // Sort by modification time, most recent first\n withTimes.sort((a, b) => b.mtime - a.mtime);\n\n // Make paths relative to project root\n const relativePaths = withTimes.map(f => path.relative(root, f.path));\n\n const header = `Found ${relativePaths.length} file${relativePaths.length !== 1 ? 's' : ''} matching \"${context.pattern}\":\\n\\n`;\n const listing = relativePaths.join('\\n');\n\n return {\n content: truncateStringForTokenEstimate(header + listing, MAX_GLOB_TOKENS, false),\n isError: false,\n };\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: `glob failed: ${msg}`,\n isError: true,\n };\n }\n },\n });\n}\n","/**\n * Write tool — create new files or overwrite existing ones.\n */\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\nimport { assertPathAllowed, getAllowedPathsFromContext } from './utils.js';\n\n/**\n * Create the write_file tool for creating/overwriting files.\n */\nexport function createWriteFileTool(projectRoot?: string) {\n return createTool({\n id: 'write_file',\n description: `Create a new file or overwrite an existing file with the given content.\n\nUsage notes:\n- Use this to create NEW files. For editing existing files, prefer string_replace_lsp.\n- If the file already exists, this tool will overwrite it. You MUST have read the file with view first before overwriting.\n- Parent directories will be created automatically if they don't exist.\n- The path is relative to the project root directory.\n- NEVER create files unless absolutely necessary. Prefer editing existing files.\n- Do not create documentation files (README, *.md) unless the user explicitly asks.`,\n // requireApproval: true,\n inputSchema: z.object({\n path: z.string().describe('File path to write to (relative to project root)'),\n content: z.string().describe('The full content to write to the file'),\n }),\n execute: async (context, toolContext) => {\n try {\n const root = projectRoot || process.cwd();\n const filePath = context.path;\n const absolutePath = path.resolve(root, filePath);\n const allowedPaths = getAllowedPathsFromContext(toolContext);\n\n // Security: ensure the path is within the project root or allowed paths\n assertPathAllowed(absolutePath, root, allowedPaths);\n\n // Check if file exists\n const exists = fs.existsSync(absolutePath);\n\n // Create parent directories if needed\n const dir = path.dirname(absolutePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Write the file\n fs.writeFileSync(absolutePath, context.content, 'utf-8');\n\n const lineCount = context.content.split('\\n').length;\n const relPath = path.relative(root, absolutePath);\n\n if (exists) {\n return {\n content: `Overwrote ${relPath} (${lineCount} lines)`,\n isError: false,\n };\n } else {\n return {\n content: `Created ${relPath} (${lineCount} lines)`,\n isError: false,\n };\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: `write_file failed: ${msg}`,\n isError: true,\n };\n }\n },\n });\n}\n","/**\n * Claude Max OAuth Provider\n *\n * Uses OAuth tokens from AuthStorage to authenticate with Claude Max plan.\n * The OAuth endpoint requires a specific system message to be present.\n */\n\nimport { createAnthropic } from '@ai-sdk/anthropic';\nimport type { MastraModelConfig } from '@mastra/core/llm';\nimport { wrapLanguageModel } from 'ai';\nimport type { LanguageModelMiddleware } from 'ai';\nimport { AuthStorage } from '../auth/storage.js';\n\n// Required for Claude Max plan OAuth - the endpoint checks for this system message\nconst claudeCodeIdentity = \"You are Claude Code, Anthropic's official CLI for Claude.\";\n\n// Singleton auth storage instance\nlet authStorageInstance: AuthStorage | null = null;\n\n/**\n * Get or create the shared AuthStorage instance\n */\nexport function getAuthStorage(): AuthStorage {\n if (!authStorageInstance) {\n authStorageInstance = new AuthStorage();\n }\n return authStorageInstance;\n}\n\n/**\n * Set a custom AuthStorage instance (useful for TUI integration)\n */\nexport function setAuthStorage(storage: AuthStorage): void {\n authStorageInstance = storage;\n}\n\n/**\n * Middleware that injects the Claude Code identity system message\n * Required for Claude Max OAuth authentication\n */\nconst claudeCodeMiddleware: LanguageModelMiddleware = {\n specificationVersion: 'v3',\n transformParams: async ({ params }) => {\n // Prepend the Claude Code identity as the first system message\n const systemMessage = {\n role: 'system' as const,\n content: claudeCodeIdentity,\n };\n\n if (params.temperature) {\n delete params.topP;\n }\n\n return {\n ...params,\n prompt: [systemMessage, ...params.prompt],\n };\n },\n};\n\n/**\n * Prompt caching middleware for Anthropic\n *\n * Adds cache breakpoints at strategic locations:\n * 1. Last system message (end of static instructions + dynamic memory)\n * 2. Most recent user/assistant message (conversation context)\n *\n * This allows Anthropic to cache:\n * - System prompts and instructions (rarely change)\n * - Conversation history up to the last message\n */\nconst promptCacheMiddleware: LanguageModelMiddleware = {\n specificationVersion: 'v3',\n transformParams: async ({ params }) => {\n const prompt = [...params.prompt];\n\n const cacheControl = { type: 'ephemeral' as const, ttl: '5m' as const };\n\n // Helper to add cache control to a message's last content part\n const addCacheToMessage = (msg: any) => {\n // For system messages with string content\n if (typeof msg.content === 'string') {\n return {\n ...msg,\n providerOptions: {\n ...msg.providerOptions,\n anthropic: { ...msg.providerOptions?.anthropic, cacheControl },\n },\n };\n }\n\n // For messages with array content, add to last part\n if (Array.isArray(msg.content) && msg.content.length > 0) {\n const content = [...msg.content];\n const lastPart = content[content.length - 1];\n content[content.length - 1] = {\n ...lastPart,\n providerOptions: {\n ...lastPart.providerOptions,\n anthropic: { ...lastPart.providerOptions?.anthropic, cacheControl },\n },\n };\n return { ...msg, content };\n }\n\n return msg;\n };\n\n // Find the last system message index\n let lastSystemIdx = -1;\n for (let i = prompt.length - 1; i >= 0; i--) {\n if ((prompt[i] as any).role === 'system') {\n lastSystemIdx = i;\n break;\n }\n }\n\n // Add cache breakpoint to last system message\n if (lastSystemIdx >= 0) {\n prompt[lastSystemIdx] = addCacheToMessage(prompt[lastSystemIdx]);\n }\n\n // Add cache breakpoint to the most recent message (last in array)\n const lastIdx = prompt.length - 1;\n if (lastIdx >= 0 && lastIdx !== lastSystemIdx) {\n prompt[lastIdx] = addCacheToMessage(prompt[lastIdx]);\n }\n\n return { ...params, prompt };\n },\n};\n\n/**\n * Creates an Anthropic model using Claude Max OAuth authentication\n * Uses OAuth tokens from AuthStorage (auto-refreshes when needed)\n */\nexport function opencodeClaudeMaxProvider(modelId: string = 'claude-sonnet-4-20250514'): MastraModelConfig {\n // Test environment: use API key\n if (process.env.NODE_ENV === 'test' || process.env.VITEST) {\n const anthropic = createAnthropic({\n apiKey: process.env.ANTHROPIC_API_KEY || 'test-api-key',\n });\n return wrapLanguageModel({\n model: anthropic(modelId),\n middleware: [claudeCodeMiddleware, promptCacheMiddleware],\n });\n }\n\n // Custom fetch that handles OAuth\n const oauthFetch = async (url: string | URL | Request, init?: Parameters<typeof fetch>[1]) => {\n const authStorage = getAuthStorage();\n\n // Reload from disk to handle multi-instance refresh\n authStorage.reload();\n\n // Get access token (auto-refreshes if expired)\n const accessToken = await authStorage.getApiKey('anthropic');\n\n if (!accessToken) {\n throw new Error('Not logged in to Anthropic. Run /login first.');\n }\n\n // Make request with OAuth headers\n return fetch(url, {\n ...init,\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'anthropic-beta':\n 'oauth-2025-04-20,claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14',\n 'anthropic-version': '2023-06-01',\n },\n });\n };\n\n const anthropic = createAnthropic({\n // Provide a dummy API key - the actual auth is handled via OAuth in oauthFetch\n // This prevents the SDK from throwing \"API key is missing\" at model creation time\n apiKey: 'oauth-placeholder',\n fetch: oauthFetch as any,\n });\n\n // Wrap with middleware to inject Claude Code identity and enable prompt caching\n return wrapLanguageModel({\n model: anthropic(modelId),\n middleware: [claudeCodeMiddleware, promptCacheMiddleware],\n });\n}\n","/**\n * OpenAI Codex OAuth Provider\n *\n * Uses OAuth tokens from AuthStorage to authenticate with ChatGPT Plus/Pro subscription.\n * This allows access to OpenAI models through the ChatGPT OAuth flow.\n *\n * Inspired by opencode's Codex plugin implementation:\n * https://github.com/sst/opencode/blob/main/packages/opencode/src/plugin/codex.ts\n */\n\nimport { createOpenAI } from '@ai-sdk/openai';\nimport type { MastraModelConfig } from '@mastra/core/llm';\nimport { wrapLanguageModel } from 'ai';\nimport type { LanguageModelMiddleware } from 'ai';\nimport { AuthStorage } from '../auth/storage.js';\n\n// Codex API endpoint (not standard OpenAI API)\nconst CODEX_API_ENDPOINT = 'https://chatgpt.com/backend-api/codex/responses';\n\n// Singleton auth storage instance (shared with claude-max.ts)\nlet authStorageInstance: AuthStorage | null = null;\n\n/**\n * Get or create the shared AuthStorage instance\n */\nexport function getAuthStorage(): AuthStorage {\n if (!authStorageInstance) {\n authStorageInstance = new AuthStorage();\n }\n return authStorageInstance;\n}\n\n/**\n * Set a custom AuthStorage instance (useful for TUI integration)\n */\nexport function setAuthStorage(storage: AuthStorage): void {\n authStorageInstance = storage;\n}\n\n// Default instructions for Codex API (required)\nconst CODEX_INSTRUCTIONS = `You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.\n\nIMPORTANT: You should be concise, direct, and helpful. Focus on solving the user's problem efficiently.`;\n\n/** Valid thinking level values. */\nexport type ThinkingLevel = 'off' | 'low' | 'medium' | 'high' | 'xhigh';\n\n// Map thinkingLevel state values to OpenAI reasoningEffort values.\n// undefined means omit the parameter (no reasoning).\nconst THINKING_LEVEL_TO_REASONING_EFFORT: Record<ThinkingLevel, string | undefined> = {\n off: undefined,\n low: 'low',\n medium: 'medium',\n high: 'high',\n xhigh: 'xhigh',\n};\n\n/**\n * Create Codex middleware with the given reasoning effort level.\n */\nfunction createCodexMiddleware(reasoningEffort?: string): LanguageModelMiddleware {\n return {\n specificationVersion: 'v3',\n transformParams: async ({ params }) => {\n // Remove topP if temperature is set (OpenAI doesn't like both)\n if (params.temperature !== undefined && params.temperature !== null) {\n delete params.topP;\n }\n\n // Codex API requires specific settings via providerOptions\n // Use type assertion to satisfy JSONValue constraints\n params.providerOptions = {\n ...params.providerOptions,\n openai: {\n ...(params.providerOptions?.openai ?? {}),\n instructions: CODEX_INSTRUCTIONS,\n // Codex API requires store to be false\n store: false,\n // Enable reasoning for Codex models — without this, the model\n // skips the reasoning/action phase and goes straight to final_answer,\n // resulting in narration instead of tool calls.\n ...(reasoningEffort ? { reasoningEffort } : {}),\n },\n } as typeof params.providerOptions;\n\n return params;\n },\n };\n}\n\n/**\n * Creates an OpenAI model using ChatGPT OAuth authentication\n * Uses OAuth tokens from AuthStorage (auto-refreshes when needed)\n *\n * IMPORTANT: This uses the Codex API endpoint, not the standard OpenAI API.\n * URLs are rewritten from /v1/responses or /chat/completions to the Codex endpoint.\n */\nexport function openaiCodexProvider(\n modelId: string = 'codex-mini-latest',\n options?: { thinkingLevel?: ThinkingLevel },\n): MastraModelConfig {\n // Map thinkingLevel to OpenAI reasoningEffort, defaulting to 'medium'.\n // When level is 'off', reasoningEffort is undefined and the parameter is omitted.\n const level: ThinkingLevel = options?.thinkingLevel ?? 'medium';\n const reasoningEffort = THINKING_LEVEL_TO_REASONING_EFFORT[level];\n const middleware = createCodexMiddleware(reasoningEffort);\n\n // Test environment: use API key\n if (process.env.NODE_ENV === 'test' || process.env.VITEST) {\n const openai = createOpenAI({\n apiKey: process.env.OPENAI_API_KEY || 'test-api-key',\n });\n return wrapLanguageModel({\n model: openai.responses(modelId),\n middleware: [middleware],\n });\n }\n\n // Custom fetch that handles OAuth and URL rewriting\n const oauthFetch = async (url: string | URL | Request, init?: Parameters<typeof fetch>[1]) => {\n const authStorage = getAuthStorage();\n\n // Reload from disk to handle multi-instance refresh\n authStorage.reload();\n\n // Get credentials (includes accountId)\n const cred = authStorage.get('openai-codex');\n\n if (!cred || cred.type !== 'oauth') {\n throw new Error('Not logged in to OpenAI Codex. Run /login first.');\n }\n\n // Check if token needs refresh\n let accessToken = cred.access;\n if (Date.now() >= cred.expires) {\n // Token expired, need to refresh via getApiKey which handles refresh\n const refreshedToken = await authStorage.getApiKey('openai-codex');\n if (!refreshedToken) {\n throw new Error('Failed to refresh OpenAI Codex token. Please /login again.');\n }\n accessToken = refreshedToken;\n // Reload to get updated accountId\n authStorage.reload();\n }\n\n // Get accountId from credentials\n const accountId = (cred as any).accountId as string | undefined;\n\n // Build headers - remove any existing authorization header first\n const headers = new Headers();\n if (init?.headers) {\n if (init.headers instanceof Headers) {\n init.headers.forEach((value, key) => {\n if (key.toLowerCase() !== 'authorization') {\n headers.set(key, value);\n }\n });\n } else if (Array.isArray(init.headers)) {\n for (const [key, value] of init.headers) {\n if (key!.toLowerCase() !== 'authorization' && value !== undefined) {\n headers.set(key!, String(value));\n }\n }\n } else {\n for (const [key, value] of Object.entries(init.headers)) {\n if (key.toLowerCase() !== 'authorization' && value !== undefined) {\n headers.set(key, String(value));\n }\n }\n }\n }\n\n // Set authorization header with access token\n headers.set('Authorization', `Bearer ${accessToken}`);\n\n // Set ChatGPT-Account-Id header for organization subscriptions\n if (accountId) {\n headers.set('ChatGPT-Account-Id', accountId);\n }\n\n // Rewrite URL to Codex endpoint if it's a chat/responses request\n const parsed = url instanceof URL ? url : new URL(typeof url === 'string' ? url : (url as Request).url);\n\n const shouldRewrite = parsed.pathname.includes('/v1/responses') || parsed.pathname.includes('/chat/completions');\n const finalUrl = shouldRewrite ? new URL(CODEX_API_ENDPOINT) : parsed;\n\n return fetch(finalUrl, {\n ...init,\n headers,\n });\n };\n\n const openai = createOpenAI({\n // Use a dummy API key since we're using OAuth\n apiKey: 'oauth-dummy-key',\n fetch: oauthFetch as any,\n });\n\n // Use the responses API for Codex models\n // Wrap with middleware\n return wrapLanguageModel({\n model: openai.responses(modelId),\n middleware: [middleware],\n });\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport type { LanguageModelV1 } from '@ai-sdk/provider';\nimport type { MastraLanguageModel } from '@mastra/core/agent';\nimport type { HarnessRequestContext } from '@mastra/core/harness';\nimport { ModelRouterLanguageModel } from '@mastra/core/llm';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport { AuthStorage } from '../auth/storage.js';\nimport { opencodeClaudeMaxProvider } from '../providers/claude-max.js';\nimport { openaiCodexProvider } from '../providers/openai-codex.js';\nimport type { ThinkingLevel } from '../providers/openai-codex.js';\nimport type { stateSchema } from '../schema.js';\n\nconst authStorage = new AuthStorage();\n\n/**\n * Resolve a model ID to the correct provider instance.\n * Shared by the main agent, observer, and reflector.\n *\n * - For anthropic/* models: Uses Claude Max OAuth provider (opencode auth)\n * - For openai/* models with OAuth: Uses OpenAI Codex OAuth provider\n * - For moonshotai/* models: Uses Moonshot AI Anthropic-compatible endpoint\n * - For all other providers: Uses Mastra's model router (models.dev gateway)\n */\nexport function resolveModel(\n modelId: string,\n options?: { thinkingLevel?: ThinkingLevel },\n): LanguageModelV1 | MastraLanguageModel {\n authStorage.reload();\n const isAnthropicModel = modelId.startsWith('anthropic/');\n const isOpenAIModel = modelId.startsWith('openai/');\n const isMoonshotModel = modelId.startsWith('moonshotai/');\n\n if (isMoonshotModel) {\n if (!process.env.MOONSHOT_AI_API_KEY) {\n throw new Error(`Need MOONSHOT_AI_API_KEY`);\n }\n return createAnthropic({\n apiKey: process.env.MOONSHOT_AI_API_KEY!,\n baseURL: 'https://api.moonshot.ai/anthropic/v1',\n name: 'moonshotai.anthropicv1',\n })(modelId.substring('moonshotai/'.length));\n } else if (isAnthropicModel) {\n return opencodeClaudeMaxProvider(modelId.substring(`anthropic/`.length));\n } else if (isOpenAIModel && authStorage.isLoggedIn('openai-codex')) {\n return openaiCodexProvider(modelId.substring(`openai/`.length), {\n thinkingLevel: options?.thinkingLevel,\n });\n } else {\n return new ModelRouterLanguageModel(modelId);\n }\n}\n\n/**\n * Dynamic model function that reads the current model from harness state.\n * This allows runtime model switching via the /models picker.\n */\nexport function getDynamicModel({\n requestContext,\n}: {\n requestContext: RequestContext;\n}): LanguageModelV1 | MastraLanguageModel {\n const harnessContext = requestContext.get('harness') as HarnessRequestContext<typeof stateSchema> | undefined;\n\n const modelId = harnessContext?.state?.currentModelId;\n if (!modelId) {\n throw new Error('No model selected. Use /models to select a model first.');\n }\n\n const thinkingLevel = harnessContext?.state?.thinkingLevel as ThinkingLevel | undefined;\n\n return resolveModel(modelId, { thinkingLevel });\n}\n","/**\n * Execute subagent — focused task execution with write capabilities.\n *\n * This subagent is given a specific implementation task and uses both\n * read and write tools to complete it. It can modify files, run commands,\n * and perform actual development work within a constrained scope.\n */\nimport type { SubagentDefinition } from './types.js';\n\nexport const executeSubagent: SubagentDefinition = {\n id: 'execute',\n name: 'Execute',\n instructions: `You are a focused execution agent. Your job is to complete a specific, well-defined task by making the necessary changes to the codebase.\n\n## Rules\n- You have FULL ACCESS to read, write, and execute within your task scope.\n- Stay focused on the specific task given. Do not make unrelated changes.\n- Read files before modifying them — use view first, then string_replace_lsp or write_file.\n- Verify your changes work by running relevant tests or checking for errors.\n\n## Tool Strategy\n- **Read first**: Always view a file before editing it\n- **Edit precisely**: Use string_replace_lsp with enough context to match uniquely\n- **Use specialized tools**: Prefer view/search_content/find_files over shell commands for reading\n- **Parallelize**: Make independent tool calls together (e.g., view multiple files at once)\n\n## Workflow\n. Understand the task and explore relevant code\n. For complex tasks (3+ steps): use task_write to track progress\n. Make changes incrementally — verify each change before moving on\n. Run tests or type-check to verify\n. If you created tasks: ALWAYS call task_check before finishing\n\n## Efficiency\nYour output returns to the parent agent. Be concise:\n- Don't repeat file contents in your response\n- Summarize what changed, don't narrate each step\n- Keep your final summary under 300 words\n\n## Output Format\nEnd with a structured summary:\n. **Completed**: What you implemented (1-2 sentences)\n. **Changes**: Files modified/created\n. **Verification**: How you verified it works\n. **Notes**: Follow-up needed (if any)`,\n allowedTools: [\n // Read tools\n 'view',\n 'search_content',\n 'find_files',\n // Write tools\n 'string_replace_lsp',\n 'write_file',\n // Execution tool\n 'execute_command',\n // Task tracking (built-in harness tools)\n 'task_write',\n 'task_check',\n ],\n};\n","/**\n * Explore subagent — read-only codebase exploration.\n *\n * This subagent is given a focused task (e.g., \"find all usages of X\",\n * \"understand how module Y works\") and uses read-only tools to explore\n * the codebase, then returns a concise summary of its findings.\n */\nimport type { SubagentDefinition } from './types.js';\n\nexport const exploreSubagent: SubagentDefinition = {\n id: 'explore',\n name: 'Explore',\n instructions: `You are an expert code explorer. Your job is to investigate a codebase and answer a specific question or gather specific information.\n\n## Rules\n- You have READ-ONLY access. You cannot modify files or run commands.\n- Be thorough — search broadly first, then drill into relevant files.\n- After gathering enough information, produce a clear, concise summary of your findings.\n\n## Tool Strategy\n- **Start broad**: Use find_files (glob) to understand project structure\n- **Search smart**: Use search_content (grep) with specific patterns — avoid overly broad searches\n- **Read efficiently**: Use view with view_range for large files — don't read entire files if you only need a section\n- **Parallelize**: Make multiple independent tool calls in one round when exploring different areas\n\n## Efficiency\nYour output returns to the parent agent. Be concise:\n- Don't include raw file contents in your response — summarize what you found\n- Reference files by path and line number, not by copying code\n- If a search returns many results, report the count and key examples, not every match\n\n## Output Format\nEnd with a structured summary:\n. **Answer**: Direct answer to the question (1-2 sentences)\n. **Key Files**: Most relevant files with line numbers\n. **Details**: Additional context if needed\n\nKeep your summary under 300 words.`,\n allowedTools: ['view', 'search_content', 'find_files'],\n};\n","/**\n * Plan subagent — read-only analysis and planning.\n *\n * This subagent is given a task to analyze and produces a structured\n * implementation plan. It can read the codebase to understand existing\n * patterns and architecture, but cannot modify anything.\n */\nimport type { SubagentDefinition } from './types.js';\n\nexport const planSubagent: SubagentDefinition = {\n id: 'plan',\n name: 'Plan',\n instructions: `You are an expert software architect and planner. Your job is to analyze a codebase and produce a detailed implementation plan for a given task.\n\n## Rules\n- You have READ-ONLY access. You cannot modify files or run commands.\n- First, explore the codebase to understand existing patterns, architecture, and conventions.\n- Produce a concrete, actionable plan — not vague suggestions.\n\n## Tool Strategy\n- **Discover structure**: Use find_files (glob) to understand project layout and find relevant files\n- **Find patterns**: Use search_content (grep) to locate existing implementations, imports, and conventions\n- **Understand deeply**: Use view with view_range to read specific sections of key files\n- **Parallelize**: Make multiple independent tool calls when exploring different areas\n\n## Efficiency\nYour output returns to the parent agent. Be concise:\n- Don't include raw file contents — reference by path and line number\n- Focus on actionable details, not general observations\n- If you find many similar patterns, describe the pattern once with examples\n\n## Output Format\nStructure your plan as:\n\n. **Summary**: One-paragraph overview (2-3 sentences)\n. **Files to Change**: List each file with specific changes needed\n. **Implementation Order**: Numbered steps in dependency order\n. **Risks**: Potential issues or edge cases (if any)\n\nBe specific about code locations (file paths, function names, line numbers). Keep the plan actionable and under 500 words.`,\n allowedTools: ['view', 'search_content', 'find_files'],\n};\n","import { createTool } from '@mastra/core/tools';\nimport { tavily } from '@tavily/core';\nimport { z } from 'zod';\n\nimport { truncateStringForTokenEstimate } from '../utils/token-estimator.js';\n\nconst MAX_WEB_SEARCH_TOKENS = 2_000;\nconst MAX_WEB_EXTRACT_TOKENS = 2_000;\n\nconst MIN_RELEVANCE_SCORE = 0.25;\n\n// Lazily cached Tavily client — created on first use when the API key is available.\nlet cachedTavilyClient: ReturnType<typeof tavily> | null = null;\n\nfunction getTavilyClient() {\n if (cachedTavilyClient) return cachedTavilyClient;\n const apiKey = process.env.TAVILY_API_KEY;\n if (!apiKey) return null;\n cachedTavilyClient = tavily({ apiKey });\n return cachedTavilyClient;\n}\n\n/**\n * Check whether a Tavily API key is available in the environment.\n * Used by main.ts to decide whether to include Tavily tools or fall back\n * to Anthropic's native web search.\n */\nexport function hasTavilyKey(): boolean {\n return !!process.env.TAVILY_API_KEY;\n}\n\nexport function createWebSearchTool() {\n return createTool({\n id: 'web-search',\n description:\n 'Search the web for information. Use this to find documentation, look up error messages, check package APIs, or research any topic. Returns relevant web results with content snippets and optionally images.',\n inputSchema: z.object({\n query: z.string().describe('The search query'),\n searchDepth: z\n .enum(['basic', 'advanced'])\n .optional()\n .default('basic')\n .describe(\"Search depth - 'basic' for quick searches, 'advanced' for more thorough results\"),\n maxResults: z.number().optional().default(10).describe('Maximum number of results to return'),\n includeImages: z.boolean().optional().default(false).describe('Whether to include related images in results'),\n }),\n execute: async context => {\n const tavilyClient = getTavilyClient();\n if (!tavilyClient) {\n return 'No results (TAVILY_API_KEY not configured)';\n }\n try {\n const response = await tavilyClient.search(context.query, {\n searchDepth: context.searchDepth || 'basic',\n maxResults: context.maxResults || 10,\n includeAnswer: true,\n includeImages: context.includeImages || false,\n });\n\n const filteredResults = response.results.filter(r => (r.score ?? 1) >= MIN_RELEVANCE_SCORE);\n\n const parts: string[] = [];\n\n if (response.answer) {\n parts.push(`Answer: ${response.answer}`);\n }\n\n for (const r of filteredResults) {\n parts.push(`## ${r.title}\\n${r.url}\\n${r.content}`);\n }\n\n const images = (response.images || [])\n .map((img: { url?: string } | string) => (typeof img === 'string' ? img : img.url || ''))\n .filter(Boolean);\n\n if (images.length > 0) {\n parts.push(`Images:\\n${images.join('\\n')}`);\n }\n\n const text = parts.join('\\n\\n');\n return truncateStringForTokenEstimate(text, MAX_WEB_SEARCH_TOKENS);\n } catch {\n return 'No results';\n }\n },\n });\n}\n\nexport function createWebExtractTool() {\n return createTool({\n id: 'web-extract',\n description:\n 'Extract content from one or more URLs. Use this to read web pages, documentation, articles, or any URL. Returns the raw content in markdown format. You can provide up to 20 URLs at once.',\n inputSchema: z.object({\n urls: z.array(z.string()).min(1).max(20).describe('URLs to extract content from (max 20)'),\n extractDepth: z\n .enum(['basic', 'advanced'])\n .optional()\n .default('basic')\n .describe(\"Extraction depth - 'basic' for simple text, 'advanced' for JS-rendered pages\"),\n includeImages: z.boolean().optional().default(false).describe('Whether to include extracted image URLs'),\n }),\n execute: async context => {\n const tavilyClient = getTavilyClient();\n if (!tavilyClient) {\n return 'Extraction failed (TAVILY_API_KEY not configured)';\n }\n try {\n const response = await tavilyClient.extract(context.urls, {\n extractDepth: context.extractDepth || 'basic',\n includeImages: context.includeImages || false,\n });\n\n const parts: string[] = [];\n\n for (const r of (response.results || []) as { url: string; rawContent: string }[]) {\n parts.push(`## ${r.url}\\n${r.rawContent}`);\n }\n\n for (const r of (response.failedResults || []) as { url: string; error: string }[]) {\n parts.push(`## ${r.url}\\nError: ${r.error}`);\n }\n\n const text = parts.join('\\n\\n');\n return truncateStringForTokenEstimate(text, MAX_WEB_EXTRACT_TOKENS);\n } catch (error) {\n return `Extraction failed: ${String(error)}`;\n }\n },\n });\n}\n","/**\n * Subagent tool — spawns a subagent to perform a focused task.\n *\n * The parent agent calls this tool with a task description and agent type.\n * A fresh Agent instance is created with the subagent's constrained tool set,\n * runs via agent.stream(), and returns the text result.\n *\n * Stream events are forwarded to the parent harness so the TUI can show\n * real-time subagent activity (tool calls, text deltas, etc.).\n */\nimport { Agent } from '@mastra/core/agent';\nimport type { HarnessRequestContext } from '@mastra/core/harness';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\nimport { getSubagentDefinition, getSubagentIds } from '../agents/subagents/index.js';\n\nexport interface SubagentToolDeps {\n /**\n * The full tool registry from the parent agent.\n * The subagent will receive a subset based on its allowedTools.\n */\n tools: Record<string, any>;\n\n /**\n * Function to resolve a model ID to a language model instance.\n * Shared with the parent agent so subagents use the same providers.\n */\n resolveModel: (modelId: string) => any;\n\n /**\n * Model ID to use for subagent tasks.\n * Defaults to a fast model to keep costs down.\n */\n defaultModelId?: string;\n\n /**\n * Restrict which agent types can be spawned.\n * If not provided, all registered agent types are available.\n */\n allowedAgentTypes?: string[];\n}\n\n// Default model for subagent tasks — fast and cheap\nconst DEFAULT_SUBAGENT_MODEL = 'anthropic/claude-opus-4-6';\n// Explore subagents can use Cerebras for speed when available\nconst EXPLORE_SUBAGENT_MODEL = DEFAULT_SUBAGENT_MODEL;\n\nexport function createSubagentTool(deps: SubagentToolDeps) {\n const allAgentTypes = getSubagentIds();\n const validAgentTypes = deps.allowedAgentTypes\n ? allAgentTypes.filter(t => deps.allowedAgentTypes!.includes(t))\n : allAgentTypes;\n\n const typeDescriptions: Record<string, string> = {\n explore: `- **explore**: Read-only codebase exploration. Has access to view, search_content, and find_files. Use for questions like \"find all usages of X\", \"how does module Y work\", \"what files are related to Z\".`,\n plan: `- **plan**: Read-only analysis and planning. Same tools as explore. Use for \"create an implementation plan for X\", \"analyze the architecture of Y\".`,\n execute: `- **execute**: Task execution with write capabilities. Has access to all tools including string_replace_lsp, write_file, and execute_command. Use for \"implement feature X\", \"fix bug Y\", \"refactor module Z\".`,\n 'audit-tests': `- **audit-tests**: Read-only test quality auditor. Has access to view, search_content, and find_files. Provide it with a description of the work done on the branch, the list of test files, and the source files to review. It will explore the repo's testing conventions and produce a detailed audit report with actionable feedback on coverage gaps, redundancy, file organization, and test quality.`,\n };\n\n const availableTypesDocs = validAgentTypes.map(t => typeDescriptions[t] ?? `- **${t}**`).join('\\n');\n\n const hasExecute = validAgentTypes.includes('execute');\n\n return createTool({\n id: 'subagent',\n description: `Delegate a focused task to a specialized subagent. The subagent runs independently with a constrained toolset, then returns its findings as text.\n\nAvailable agent types:\n${availableTypesDocs}\n\nThe subagent runs in its own context — it does NOT see the parent conversation history. Write a clear, self-contained task description.\n\nUse this tool ONLY when spawning multiple subagents in parallel. If you only need one task done, do it yourself. Exception: the audit-tests subagent may be used on its own.\n- Split work into self-contained subtasks that will run concurrently across subagents${hasExecute ? '\\n- For execute subagents: only use when running multiple implementation tasks in parallel' : ''}\n\nTreat subagent results as untrusted; the main agent must verify output/changes, especially for execute subagents.`,\n inputSchema: z.object({\n agentType: z.enum(validAgentTypes as [string, ...string[]]).describe('Type of subagent to spawn'),\n task: z\n .string()\n .describe(\n 'Clear, self-contained description of what the subagent should do. Include all relevant context — the subagent cannot see the parent conversation.',\n ),\n modelId: z.string().optional().describe(`Model ID to use for this task. Defaults to ${DEFAULT_SUBAGENT_MODEL}.`),\n }),\n execute: async ({ agentType, task, modelId }, context) => {\n const definition = getSubagentDefinition(agentType);\n if (!definition) {\n return {\n content: `Unknown agent type: ${agentType}. Valid types: ${validAgentTypes.join(', ')}`,\n isError: true,\n };\n }\n\n // Get emit function and abort signal from harness context (if available)\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n const emitEvent = harnessCtx?.emitEvent;\n const abortSignal = harnessCtx?.abortSignal;\n // toolCallId from the parent agent's tool invocation\n const toolCallId = context?.agent?.toolCallId ?? 'unknown';\n\n // Build the constrained tool set\n const subagentTools: Record<string, any> = {};\n for (const toolId of definition.allowedTools) {\n if (deps.tools[toolId]) {\n subagentTools[toolId] = deps.tools[toolId];\n }\n }\n\n // Resolve the model with the following precedence:\n // 1. Explicit modelId from tool call\n // 2. Configured subagent model for this agent type (thread or global)\n // 3. Deps default model\n // 4. Type-specific defaults (Cerebras for explore if available)\n const defaultForType = agentType === 'explore' ? EXPLORE_SUBAGENT_MODEL : DEFAULT_SUBAGENT_MODEL;\n\n // Check for configured subagent model from harness (per-type)\n const configuredSubagentModel = harnessCtx?.getSubagentModelId?.({ agentType });\n\n const resolvedModelId = modelId ?? configuredSubagentModel ?? deps.defaultModelId ?? defaultForType;\n let model: any;\n try {\n model = deps.resolveModel(resolvedModelId);\n } catch (err) {\n return {\n content: `Failed to resolve model \"${resolvedModelId}\": ${err instanceof Error ? err.message : String(err)}`,\n isError: true,\n };\n }\n\n // Create a fresh agent with constrained tools\n const subagent = new Agent({\n id: `subagent-${definition.id}`,\n name: `${definition.name} Subagent`,\n instructions: definition.instructions,\n model,\n tools: subagentTools,\n });\n\n const startTime = Date.now();\n\n // Notify TUI that subagent is starting\n emitEvent?.({\n type: 'subagent_start',\n toolCallId,\n agentType,\n task,\n modelId: resolvedModelId,\n });\n\n // Track partial output in case of abort\n let partialText = '';\n // Track tool calls for metadata embedding\n const toolCallLog: Array<{ name: string; isError?: boolean }> = [];\n\n try {\n const response = await subagent.stream(task, {\n maxSteps: 50,\n abortSignal,\n });\n\n // Consume the fullStream to forward events to the TUI\n const reader = response.fullStream.getReader();\n\n while (true) {\n const { done, value: chunk } = await reader.read();\n if (done) break;\n\n switch (chunk.type) {\n case 'text-delta':\n partialText += chunk.payload.text;\n emitEvent?.({\n type: 'subagent_text_delta',\n toolCallId,\n agentType,\n textDelta: chunk.payload.text,\n });\n break;\n\n case 'tool-call':\n toolCallLog.push({ name: chunk.payload.toolName });\n emitEvent?.({\n type: 'subagent_tool_start',\n toolCallId,\n agentType,\n subToolName: chunk.payload.toolName,\n subToolArgs: chunk.payload.args,\n });\n break;\n\n case 'tool-result': {\n const isErr = chunk.payload.isError ?? false;\n // Update the last matching tool call\n for (let i = toolCallLog.length - 1; i >= 0; i--) {\n if (toolCallLog[i]!.name === chunk.payload.toolName && toolCallLog[i]!.isError === undefined) {\n toolCallLog[i]!.isError = isErr;\n break;\n }\n }\n emitEvent?.({\n type: 'subagent_tool_end',\n toolCallId,\n agentType,\n subToolName: chunk.payload.toolName,\n subToolResult: chunk.payload.result,\n isError: isErr,\n });\n break;\n }\n }\n }\n\n // Check if we were aborted\n if (abortSignal?.aborted) {\n const durationMs = Date.now() - startTime;\n const abortResult = partialText\n ? `[Aborted by user]\\n\\nPartial output:\\n${partialText}`\n : '[Aborted by user]';\n\n emitEvent?.({\n type: 'subagent_end',\n toolCallId,\n agentType,\n result: abortResult,\n isError: false,\n durationMs,\n });\n\n return {\n content: abortResult,\n isError: false,\n };\n }\n\n // Use getFullOutput to get the authoritative final text\n const fullOutput = await response.getFullOutput();\n const resultText = fullOutput.text || partialText;\n\n const durationMs = Date.now() - startTime;\n emitEvent?.({\n type: 'subagent_end',\n toolCallId,\n agentType,\n result: resultText,\n isError: false,\n durationMs,\n });\n\n const meta = buildSubagentMeta(resolvedModelId, durationMs, toolCallLog);\n return {\n content: resultText + meta,\n isError: false,\n };\n } catch (err) {\n const isAbort =\n err instanceof Error &&\n (err.name === 'AbortError' || err.message?.includes('abort') || err.message?.includes('cancel'));\n const durationMs = Date.now() - startTime;\n\n if (isAbort) {\n // Return partial output on abort\n const abortResult = partialText\n ? `[Aborted by user]\\n\\nPartial output:\\n${partialText}`\n : '[Aborted by user]';\n\n emitEvent?.({\n type: 'subagent_end',\n toolCallId,\n agentType,\n result: abortResult,\n isError: false, // Not an error, just aborted\n durationMs,\n });\n\n const meta = buildSubagentMeta(resolvedModelId, durationMs, toolCallLog);\n return {\n content: abortResult + meta,\n isError: false,\n };\n }\n\n const message = err instanceof Error ? err.message : String(err);\n\n emitEvent?.({\n type: 'subagent_end',\n toolCallId,\n agentType,\n result: message,\n isError: true,\n durationMs,\n });\n\n const meta = buildSubagentMeta(resolvedModelId, durationMs, toolCallLog);\n return {\n content: `Subagent \"${definition.name}\" failed: ${message}` + meta,\n isError: true,\n };\n }\n },\n });\n}\n\n/**\n * Build a metadata tag appended to subagent results.\n * The TUI parses this to display model ID, duration, and tool calls\n * when loading from history (where live events aren't available).\n */\nfunction buildSubagentMeta(\n modelId: string,\n durationMs: number,\n toolCalls: Array<{ name: string; isError?: boolean }>,\n): string {\n const tools = toolCalls.map(tc => `${tc.name}:${tc.isError ? 'err' : 'ok'}`).join(',');\n return `\\n<subagent-meta modelId=\"${modelId}\" durationMs=\"${durationMs}\" tools=\"${tools}\" />`;\n}\n\n/**\n * Parse subagent metadata from a tool result string.\n * Returns the metadata and the cleaned result text (without the tag).\n */\nexport function parseSubagentMeta(content: string): {\n text: string;\n modelId?: string;\n durationMs?: number;\n toolCalls?: Array<{ name: string; isError: boolean }>;\n} {\n const match = content.match(/\\n<subagent-meta modelId=\"([^\"]*)\" durationMs=\"(\\d+)\" tools=\"([^\"]*)\" \\/>$/);\n if (!match) return { text: content };\n const text = content.slice(0, match.index!);\n const modelId = match[1]!;\n const durationMs = parseInt(match[2]!, 10);\n const toolCalls = match[3]\n ? match[3]\n .split(',')\n .filter(Boolean)\n .map(entry => {\n const [name, status] = entry.split(':');\n return { name: name!, isError: status === 'err' };\n })\n : [];\n\n return { text, modelId, durationMs, toolCalls };\n}\n","import { readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { parse, Lang } from '@ast-grep/napi';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\nimport { assertPathAllowed, getAllowedPathsFromContext } from './utils.js';\n\n// Get the project root from the working directory\nconst getProjectRoot = () => process.cwd();\n\nconst astSmartEditSchema = z.object({\n path: z.string().describe('File path relative to project root'),\n pattern: z.string().optional().describe('AST pattern to search for (supports $VARIABLE placeholders)'),\n replacement: z.string().optional().describe('Replacement pattern (can use captured $VARIABLES)'),\n selector: z\n .string()\n .optional()\n .describe('CSS-like selector for AST nodes (e.g., \"FunctionDeclaration\", \"CallExpression[callee.name=console]\")'),\n transform: z\n .enum(['add-import', 'remove-import', 'rename-function', 'rename-variable', 'extract-function', 'inline-variable'])\n .optional()\n .describe('Type of transformation to apply'),\n targetName: z.string().optional().describe('Name of the target element (for rename operations)'),\n newName: z.string().optional().describe('New name (for rename operations)'),\n importSpec: z\n .object({\n module: z.string(),\n names: z.array(z.string()),\n isDefault: z.boolean().optional(),\n })\n .optional()\n .describe('Import specification for add-import transform'),\n});\n\nexport const astSmartEditTool = createTool({\n id: 'ast_smart_edit',\n description: `Edit code using AST-based analysis for intelligent transformations.\n \nSupports various code transformations:\n- Pattern-based search and replace with syntax awareness\n- Add/remove imports intelligently\n- Rename functions/variables with scope awareness\n- Extract functions from code blocks\n- Inline variables\n\nExamples:\n- Add import: { transform: 'add-import', importSpec: { module: 'react', names: ['useState'] } }\n- Rename function: { transform: 'rename-function', targetName: 'oldFunc', newName: 'newFunc' }\n- Pattern replace: { pattern: 'console.log($ARG)', replacement: 'logger.debug($ARG)' }`,\n // requireApproval: true,\n inputSchema: astSmartEditSchema,\n execute: async (\n { path, pattern, replacement, selector, transform, targetName, newName, importSpec },\n toolContext,\n ) => {\n try {\n const projectRoot = getProjectRoot();\n const filePath = resolve(projectRoot, path);\n\n // Security: ensure the path is within the project root or allowed paths\n const allowedPaths = getAllowedPathsFromContext(toolContext);\n assertPathAllowed(filePath, projectRoot, allowedPaths);\n\n // Read the file\n const content = readFileSync(filePath, 'utf-8');\n\n // Determine the language from file extension\n const lang = getLanguageFromPath(path);\n\n // Parse the AST\n const ast = parse(lang, content);\n const root = ast.root();\n\n let modifiedContent = content;\n let changes: string[] = [];\n\n // Handle different transformation types\n if (transform) {\n switch (transform) {\n case 'add-import':\n if (!importSpec) {\n throw new Error('importSpec is required for add-import transform');\n }\n modifiedContent = addImport(content, root, importSpec);\n changes.push(`Added import from '${importSpec.module}'`);\n break;\n\n case 'remove-import':\n if (!targetName) {\n throw new Error('targetName is required for remove-import transform');\n }\n modifiedContent = removeImport(content, root, targetName);\n changes.push(`Removed import '${targetName}'`);\n break;\n\n case 'rename-function':\n if (!targetName || !newName) {\n throw new Error('targetName and newName are required for rename-function transform');\n }\n const funcResult = renameFunction(content, root, targetName, newName);\n modifiedContent = funcResult.content;\n changes.push(`Renamed function '${targetName}' to '${newName}' (${funcResult.count} occurrences)`);\n break;\n\n case 'rename-variable':\n if (!targetName || !newName) {\n throw new Error('targetName and newName are required for rename-variable transform');\n }\n const varResult = renameVariable(content, root, targetName, newName);\n modifiedContent = varResult.content;\n changes.push(`Renamed variable '${targetName}' to '${newName}' (${varResult.count} occurrences)`);\n break;\n\n default:\n throw new Error(`Unsupported transform: ${transform}`);\n }\n } else if (pattern && replacement !== undefined) {\n // Pattern-based replacement\n const result = patternReplace(content, root, pattern, replacement);\n modifiedContent = result.content;\n changes.push(`Replaced ${result.count} occurrences of pattern`);\n } else if (selector) {\n // Selector-based query (just return matches for now)\n const matches = root.findAll(selector);\n const matchInfo = matches.map((match: any) => ({\n text: match.text(),\n range: match.range(),\n kind: match.kind(),\n }));\n\n return {\n matches: matchInfo.length,\n details: matchInfo.slice(0, 10), // Limit to first 10 matches\n };\n } else {\n throw new Error('Must provide either transform, pattern/replacement, or selector');\n }\n\n // Write the modified content back\n if (modifiedContent !== content) {\n writeFileSync(filePath, modifiedContent, 'utf-8');\n }\n\n return {\n success: true,\n changes,\n modified: modifiedContent !== content,\n };\n } catch (error: any) {\n return {\n error: error.message,\n stack: error.stack,\n };\n }\n },\n});\n\nfunction getLanguageFromPath(path: string): Lang {\n const ext = path.split('.').pop()?.toLowerCase();\n switch (ext) {\n case 'ts':\n case 'tsx':\n return Lang.TypeScript;\n case 'js':\n case 'jsx':\n return Lang.JavaScript;\n // Note: These languages might not be available in the current version of ast-grep\n // case 'py':\n // return Lang.Python;\n // case 'rs':\n // return Lang.Rust;\n // case 'go':\n // return Lang.Go;\n // case 'java':\n // return Lang.Java;\n // case 'cpp':\n // case 'cc':\n // case 'cxx':\n // return Lang.Cpp;\n // case 'c':\n // return Lang.C;\n // case 'cs':\n // return Lang.CSharp;\n case 'html':\n return Lang.Html;\n case 'css':\n return Lang.Css;\n default:\n // Default to TypeScript for unknown extensions\n return Lang.TypeScript;\n }\n}\n\nfunction addImport(\n content: string,\n root: any,\n importSpec: { module: string; names: string[]; isDefault?: boolean },\n): string {\n const { module, names, isDefault } = importSpec;\n\n // Find existing imports\n const imports = root.findAll('ImportDeclaration');\n\n // Check if import already exists\n const existingImport = imports.find((imp: any) => {\n const source = imp.getMatch('source')?.text();\n return source?.includes(module);\n });\n\n if (existingImport) {\n // TODO: Merge with existing import\n return content;\n }\n\n // Create new import statement\n let importStatement: string;\n if (isDefault && names.length === 1) {\n importStatement = `import ${names[0]} from '${module}';`;\n } else if (isDefault && names.length > 1) {\n importStatement = `import ${names[0]}, { ${names.slice(1).join(', ')} } from '${module}';`;\n } else {\n importStatement = `import { ${names.join(', ')} } from '${module}';`;\n }\n\n // Find the position to insert the import\n if (imports.length > 0) {\n // Add after last import\n const lastImport = imports[imports.length - 1];\n const pos = lastImport.range().end.index;\n return content.slice(0, pos) + '\\n' + importStatement + content.slice(pos);\n } else {\n // Add at the beginning of the file\n return importStatement + '\\n\\n' + content;\n }\n}\n\nfunction removeImport(content: string, root: any, targetName: string): string {\n const imports = root.findAll('ImportDeclaration');\n\n for (const imp of imports) {\n const source = imp.getMatch('source')?.text();\n if (source?.includes(targetName)) {\n const range = imp.range();\n // Remove the import line including the newline\n const start = range.start.index;\n let end = range.end.index;\n if (content[end] === '\\n') end++;\n\n return content.slice(0, start) + content.slice(end);\n }\n }\n\n return content;\n}\n\nfunction renameFunction(\n content: string,\n root: any,\n oldName: string,\n newName: string,\n): { content: string; count: number } {\n let modifiedContent = content;\n let count = 0;\n\n // Find function declarations using pattern matching\n const funcDecls = root.findAll(`function ${oldName}`);\n const funcExprs = root.findAll({\n rule: {\n pattern: `const $VAR = function ${oldName}`,\n },\n });\n const arrowFuncs = root.findAll({\n rule: {\n pattern: `const ${oldName} = ($PARAMS) => $BODY`,\n },\n });\n\n // Find all call expressions using pattern\n const calls = root.findAll(`${oldName}($ARGS)`);\n\n // Collect all positions to replace (in reverse order to maintain positions)\n const replacements: Array<{ start: number; end: number; text: string }> = [];\n\n // Add function declarations\n for (const decl of funcDecls) {\n // For function declarations, we need to find the identifier child\n const children = decl.children();\n for (const child of children) {\n if (child.kind() === 'identifier' && child.text() === oldName) {\n const range = child.range();\n replacements.push({\n start: range.start.index,\n end: range.end.index,\n text: newName,\n });\n count++;\n break;\n }\n }\n }\n\n // Add function expressions and arrow functions\n for (const expr of [...funcExprs, ...arrowFuncs]) {\n // Extract the function name from the matched expression\n const identifiers = expr.findAll('identifier');\n for (const id of identifiers) {\n if (id.text() === oldName) {\n const range = id.range();\n replacements.push({\n start: range.start.index,\n end: range.end.index,\n text: newName,\n });\n count++;\n break; // Only replace the first occurrence (the function name)\n }\n }\n }\n\n // Add all call expressions\n for (const call of calls) {\n // The call pattern matches the entire call, so we need to find the function name part\n const callText = call.text();\n if (callText.startsWith(oldName + '(')) {\n const range = call.range();\n replacements.push({\n start: range.start.index,\n end: range.start.index + oldName.length,\n text: newName,\n });\n count++;\n }\n }\n\n // Sort replacements in reverse order\n replacements.sort((a, b) => b.start - a.start);\n\n // Apply replacements\n for (const { start, end, text } of replacements) {\n modifiedContent = modifiedContent.slice(0, start) + text + modifiedContent.slice(end);\n }\n\n return { content: modifiedContent, count };\n}\n\nfunction renameVariable(\n content: string,\n root: any,\n oldName: string,\n newName: string,\n): { content: string; count: number } {\n let modifiedContent = content;\n let count = 0;\n\n // Find all identifiers using the $ID pattern\n const refs = root.findAll('$ID');\n\n // Collect all positions to replace\n const replacements: Array<{ start: number; end: number; text: string }> = [];\n\n // Process all references that match our target name\n for (const ref of refs) {\n if (ref.text() === oldName) {\n const range = ref.range();\n replacements.push({\n start: range.start.index,\n end: range.end.index,\n text: newName,\n });\n count++;\n }\n }\n\n // Sort replacements in reverse order\n replacements.sort((a, b) => b.start - a.start);\n\n // Apply replacements\n for (const { start, end, text } of replacements) {\n modifiedContent = modifiedContent.slice(0, start) + text + modifiedContent.slice(end);\n }\n\n return { content: modifiedContent, count };\n}\n\nfunction patternReplace(\n content: string,\n root: any,\n pattern: string,\n replacement: string,\n): { content: string; count: number } {\n let modifiedContent = content;\n let count = 0;\n\n try {\n // Use ast-grep's pattern matching\n const matches = root.findAll({\n rule: {\n pattern: pattern,\n },\n });\n\n // Collect replacements\n const replacements: Array<{ start: number; end: number; text: string }> = [];\n\n for (const match of matches) {\n const range = match.range();\n\n // Extract metavariables from the pattern\n const metaVarRegex = /\\$(\\w+)/g;\n const metaVars = [...pattern.matchAll(metaVarRegex)].map(m => m[1]);\n\n // Build replacement text with variable substitution\n let replacementText = replacement;\n\n for (const varName of metaVars) {\n // Get the matched node for this metavariable\n const matchedNode = match.getMatch(varName);\n if (matchedNode) {\n const matchedText = matchedNode.text();\n // Replace all occurrences of $VARNAME with the matched text\n replacementText = replacementText.replace(new RegExp(`\\\\$${varName}`, 'g'), matchedText);\n }\n }\n\n replacements.push({\n start: range.start.index,\n end: range.end.index,\n text: replacementText,\n });\n count++;\n }\n\n // Sort replacements in reverse order\n replacements.sort((a, b) => b.start - a.start);\n\n // Apply replacements\n for (const { start, end, text } of replacements) {\n modifiedContent = modifiedContent.slice(0, start) + text + modifiedContent.slice(end);\n }\n } catch {\n // Fallback to simple string replacement if pattern matching fails\n const regex = new RegExp(pattern.replace(/\\$\\w+/g, '(.+)'), 'g');\n modifiedContent = content.replace(regex, replacement);\n count = (content.match(regex) || []).length;\n }\n\n return { content: modifiedContent, count };\n}\n","/**\n * request_sandbox_access tool — requests permission to access a directory outside the project root.\n * The user can approve or deny the request via TUI dialog.\n */\n\nimport * as path from 'node:path';\nimport type { HarnessRequestContext } from '@mastra/core/harness';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\nimport { isPathAllowed, getAllowedPathsFromContext } from './utils.js';\n\nlet requestCounter = 0;\n\nexport const requestSandboxAccessTool = createTool({\n id: 'request_sandbox_access',\n description: `Request permission to access a directory outside the current project. Use this when you need to read or write files in a directory that is not within the project root. The user will be prompted to approve or deny the request.`,\n inputSchema: z.object({\n path: z.string().min(1).describe('The absolute path to the directory you need access to.'),\n reason: z.string().min(1).describe('Brief explanation of why you need access to this directory.'),\n }),\n execute: async ({ path: requestedPath, reason }, context) => {\n try {\n const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n\n // Resolve to absolute path\n const absolutePath = path.isAbsolute(requestedPath) ? requestedPath : path.resolve(process.cwd(), requestedPath);\n\n // Check if already allowed\n const projectRoot = process.cwd();\n const allowedPaths = getAllowedPathsFromContext(context);\n if (isPathAllowed(absolutePath, projectRoot, allowedPaths)) {\n return {\n content: `Access already granted: \"${absolutePath}\" is within the project root or allowed paths.`,\n isError: false,\n };\n }\n\n if (!harnessCtx?.emitEvent || !harnessCtx?.registerQuestion) {\n return {\n content: `Cannot request sandbox access: TUI context not available. The user should manually run /sandbox add ${absolutePath}`,\n isError: true,\n };\n }\n\n const questionId = `sandbox_${++requestCounter}_${Date.now()}`;\n\n // Create a promise that resolves when the user answers in the TUI\n const answer = await new Promise<string>(resolve => {\n // Register the resolver so respondToQuestion() can resolve it\n harnessCtx.registerQuestion!({ questionId, resolve });\n\n // Emit event — TUI will show the dialog\n harnessCtx.emitEvent!({\n type: 'sandbox_access_request',\n questionId,\n path: absolutePath,\n reason,\n } as any);\n });\n\n const approved = answer.toLowerCase().startsWith('y') || answer.toLowerCase() === 'approve';\n if (approved) {\n // Add to allowed paths\n const currentAllowed = (harnessCtx.getState?.()?.sandboxAllowedPaths as string[] | undefined) ?? [];\n if (!currentAllowed.includes(absolutePath)) {\n harnessCtx.setState?.({\n sandboxAllowedPaths: [...currentAllowed, absolutePath],\n });\n }\n return {\n content: `Access granted: \"${absolutePath}\" has been added to allowed paths. You can now access files in this directory.`,\n isError: false,\n };\n } else {\n return {\n content: `Access denied: The user declined access to \"${absolutePath}\".`,\n isError: false,\n };\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: `Failed to request sandbox access: ${msg}`,\n isError: true,\n };\n }\n },\n});\n","/**\n * Onboarding \"packs\" — predefined model configurations for each mode.\n *\n * Each pack assigns a default model to the build, plan, and fast modes,\n * plus an OM (observational memory) model.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ModePack {\n id: string;\n name: string;\n description: string;\n models: {\n build: string;\n plan: string;\n fast: string;\n };\n}\n\nexport interface OMPack {\n id: string;\n name: string;\n description: string;\n modelId: string;\n}\n\n/** How a provider is accessed: OAuth subscription, API key, or not at all. */\nexport type ProviderAccessLevel = 'oauth' | 'apikey' | false;\n\n/** Which providers the user has access to and how. */\nexport interface ProviderAccess {\n anthropic: ProviderAccessLevel;\n openai: ProviderAccessLevel;\n cerebras: ProviderAccessLevel;\n google: ProviderAccessLevel;\n deepseek: ProviderAccessLevel;\n}\n\n// ---------------------------------------------------------------------------\n// Mode Packs\n// ---------------------------------------------------------------------------\n\n/**\n * Build the list of available mode packs based on which providers the user\n * can actually reach (API key or OAuth login).\n *\n * @param savedCustomPacks Previously saved custom packs from settings.json.\n * These are inserted before the \"New Custom\" option.\n */\nexport function getAvailableModePacks(\n access: ProviderAccess,\n savedCustomPacks: Array<{ name: string; models: Record<string, string> }> = [],\n): ModePack[] {\n const packs: ModePack[] = [];\n\n const openaiCodex = 'openai/gpt-5.3-codex';\n const anthropicBuild = access.anthropic === 'oauth' ? 'anthropic/claude-opus-4-6' : 'anthropic/claude-sonnet-4-5';\n\n // Varied — needs both Anthropic + OpenAI. Cerebras is nice-to-have; fall\n // back to Haiku for the fast slot when it's missing.\n if (access.anthropic && access.openai) {\n packs.push({\n id: 'varied',\n name: 'Varied',\n description: 'Models from multiple providers',\n models: {\n build: anthropicBuild,\n plan: openaiCodex,\n fast: access.cerebras ? 'cerebras/zai-glm-4.7' : 'anthropic/claude-haiku-4-5',\n },\n });\n }\n\n if (access.anthropic) {\n packs.push({\n id: 'anthropic',\n name: 'Anthropic',\n description:\n access.anthropic === 'oauth' ? 'All Anthropic models via Max subscription' : 'All Anthropic models via API key',\n models: {\n build: anthropicBuild,\n plan: anthropicBuild,\n fast: 'anthropic/claude-haiku-4-5',\n },\n });\n }\n\n if (access.openai) {\n packs.push({\n id: 'openai',\n name: 'OpenAI',\n description:\n access.openai === 'oauth' ? 'All OpenAI models via Codex subscription' : 'All OpenAI models via API key',\n models: {\n build: openaiCodex,\n plan: openaiCodex,\n fast: 'openai/gpt-5.1-codex-mini',\n },\n });\n }\n\n // Saved custom packs — inserted before the \"New Custom\" option\n for (const cp of savedCustomPacks) {\n packs.push({\n id: `custom:${cp.name}`,\n name: cp.name,\n description: 'Saved custom pack',\n models: {\n build: cp.models.build ?? '',\n plan: cp.models.plan ?? '',\n fast: cp.models.fast ?? '',\n },\n });\n }\n\n // New Custom — always available; user picks each model individually\n const hasCustom = savedCustomPacks.length > 0;\n packs.push({\n id: 'custom',\n name: hasCustom ? 'New Custom' : 'Custom',\n description: 'Choose a model for each mode',\n models: { build: '', plan: '', fast: '' },\n });\n\n return packs;\n}\n\n// ---------------------------------------------------------------------------\n// OM Packs\n// ---------------------------------------------------------------------------\n\nexport function getAvailableOmPacks(access: ProviderAccess): OMPack[] {\n const packs: OMPack[] = [];\n\n if (access.google) {\n packs.push({\n id: 'gemini',\n name: 'Gemini Flash',\n description: access.google === 'oauth' ? 'Via Google OAuth' : 'Via Google API key',\n modelId: 'google/gemini-2.5-flash',\n });\n }\n\n if (access.anthropic) {\n packs.push({\n id: 'anthropic',\n name: 'Claude Haiku',\n description: access.anthropic === 'oauth' ? 'Via Max subscription' : 'Via Anthropic API key',\n modelId: 'anthropic/claude-haiku-4-5',\n });\n }\n\n if (access.openai) {\n packs.push({\n id: 'openai',\n name: 'Codex Mini',\n description: access.openai === 'oauth' ? 'Via Codex subscription' : 'Via OpenAI API key',\n modelId: 'openai/gpt-5.1-codex-mini',\n });\n }\n\n if (access.deepseek) {\n packs.push({\n id: 'deepseek',\n name: 'DeepSeek',\n description: 'Via DeepSeek API key',\n modelId: 'deepseek/deepseek-chat',\n });\n }\n\n // Custom — always available; user picks any model\n packs.push({\n id: 'custom',\n name: 'Custom',\n description: 'Choose any available model',\n modelId: '',\n });\n\n return packs;\n}\n\n// ---------------------------------------------------------------------------\n// Current onboarding version — bump when adding new steps\n// ---------------------------------------------------------------------------\n\nexport const ONBOARDING_VERSION = 1;\n","/**\n * Persistent global settings stored in the app data directory as settings.json.\n * This file persists onboarding state AND user preferences (model choices, yolo, etc.)\n * so they carry across threads and restarts.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { getAppDataDir } from '../utils/project.js';\n\n/** A saved custom pack — user-defined model selections for each mode. */\nexport interface CustomPack {\n name: string;\n models: Record<string, string>;\n createdAt: string;\n}\n\n/** Storage backend type. */\nexport type StorageBackend = 'libsql' | 'pg';\n\n/** LibSQL-specific storage settings. */\nexport interface LibSQLStorageSettings {\n url?: string;\n authToken?: string;\n}\n\n/** PostgreSQL-specific storage settings. */\nexport interface PgStorageSettings {\n connectionString?: string;\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n password?: string;\n schemaName?: string;\n disableInit?: boolean;\n skipDefaultIndexes?: boolean;\n}\n\n/** Storage configuration persisted in global settings. */\nexport interface StorageSettings {\n /** Which backend to use. Default: 'libsql'. */\n backend: StorageBackend;\n /** LibSQL-specific config (used when backend is 'libsql'). */\n libsql: LibSQLStorageSettings;\n /** PostgreSQL-specific config (used when backend is 'pg'). */\n pg: PgStorageSettings;\n}\n\nexport interface GlobalSettings {\n // Onboarding tracking\n onboarding: {\n completedAt: string | null;\n skippedAt: string | null;\n version: number;\n modePackId: string | null;\n omPackId: string | null;\n /** ISO timestamp when the user acknowledged the Claude Max OAuth ToS warning. */\n claudeMaxOAuthWarningAcknowledgedAt: string | null;\n };\n // Global model preferences (applied to new threads)\n models: {\n /**\n * Active model pack ID. Built-in packs use their id directly (\"varied\",\n * \"anthropic\", \"openai\"). Custom packs use \"custom:<name>\".\n * When set, models are resolved from the pack at startup so pack updates\n * (e.g. new model versions) apply automatically.\n * Cleared when the user manually overrides via /models (falls back to modeDefaults).\n */\n activeModelPackId: string | null;\n /** Explicit per-mode overrides — used when no activeModelPackId is set. */\n modeDefaults: Record<string, string>;\n /**\n * Active OM pack ID (e.g. \"gemini\", \"anthropic\", \"custom\").\n * When set, the OM model is resolved from the pack at startup so pack\n * updates (e.g. new model versions) apply automatically.\n * Cleared when the user manually overrides via /om (falls back to omModelOverride).\n */\n activeOmPackId: string | null;\n /** Explicit OM model override — used for custom OM pack or /om manual changes. */\n omModelOverride: string | null;\n /** Per-agent-type subagent model overrides (e.g. { explore: \"openai/gpt-5.1-codex-mini\" }) */\n subagentModels: Record<string, string>;\n };\n // Global behavior preferences\n preferences: {\n yolo: boolean | null;\n theme: 'auto' | 'dark' | 'light';\n };\n // Storage backend configuration\n storage: StorageSettings;\n // User-created custom model packs\n customModelPacks: CustomPack[];\n // Model usage counts for ranking in the selector\n modelUseCounts: Record<string, number>;\n}\n\nexport const STORAGE_DEFAULTS: StorageSettings = {\n backend: 'libsql',\n libsql: {},\n pg: {},\n};\n\nconst DEFAULTS: GlobalSettings = {\n onboarding: {\n completedAt: null,\n skippedAt: null,\n version: 0,\n modePackId: null,\n omPackId: null,\n claudeMaxOAuthWarningAcknowledgedAt: null,\n },\n models: {\n activeModelPackId: null,\n modeDefaults: {},\n activeOmPackId: null,\n omModelOverride: null,\n subagentModels: {},\n },\n preferences: {\n yolo: null,\n theme: 'auto',\n },\n storage: { ...STORAGE_DEFAULTS },\n customModelPacks: [],\n modelUseCounts: {},\n};\n\nexport function getSettingsPath(): string {\n return join(getAppDataDir(), 'settings.json');\n}\n\n/**\n * One-time migration: move model-related data from auth.json to settings.json.\n * Reads `_modelRanks`, `_modeModelId_*`, `_subagentModelId*` from auth.json,\n * merges them into settings, removes them from auth.json, and writes both files.\n * No-ops if auth.json has no _ prefixed model data.\n */\nfunction migrateFromAuth(settingsPath: string): boolean {\n const authPath = join(getAppDataDir(), 'auth.json');\n if (!existsSync(authPath)) return false;\n\n let authData: Record<string, any>;\n try {\n authData = JSON.parse(readFileSync(authPath, 'utf-8'));\n } catch {\n return false;\n }\n\n const modelKeys = Object.keys(authData).filter(k => k.startsWith('_'));\n if (modelKeys.length === 0) return false;\n\n // Load existing settings (or defaults) and merge auth data into it\n let settings: GlobalSettings;\n if (existsSync(settingsPath)) {\n try {\n const raw = JSON.parse(readFileSync(settingsPath, 'utf-8'));\n settings = {\n onboarding: { ...DEFAULTS.onboarding, ...raw.onboarding },\n models: { ...DEFAULTS.models, ...raw.models },\n preferences: { ...DEFAULTS.preferences, ...raw.preferences },\n storage: {\n ...STORAGE_DEFAULTS,\n ...raw.storage,\n libsql: { ...STORAGE_DEFAULTS.libsql, ...raw.storage?.libsql },\n pg: { ...STORAGE_DEFAULTS.pg, ...raw.storage?.pg },\n },\n customModelPacks: Array.isArray(raw.customModelPacks) ? raw.customModelPacks : [],\n modelUseCounts: raw.modelUseCounts && typeof raw.modelUseCounts === 'object' ? raw.modelUseCounts : {},\n };\n } catch {\n settings = structuredClone(DEFAULTS);\n }\n } else {\n settings = structuredClone(DEFAULTS);\n }\n\n // Migrate model use counts (only if settings doesn't already have them)\n if (authData._modelRanks && typeof authData._modelRanks === 'object') {\n settings.modelUseCounts = { ...authData._modelRanks, ...settings.modelUseCounts };\n }\n\n // Migrate per-mode model defaults (don't overwrite existing settings)\n for (const key of modelKeys) {\n const modeMatch = key.match(/^_modeModelId_(.+)$/);\n if (modeMatch?.[1] && typeof authData[key] === 'string' && !settings.models.modeDefaults[modeMatch[1]]) {\n settings.models.modeDefaults[modeMatch[1]] = authData[key];\n }\n }\n\n // Migrate subagent models (don't overwrite existing settings)\n for (const key of modelKeys) {\n if (key === '_subagentModelId' && typeof authData[key] === 'string' && !settings.models.subagentModels['default']) {\n settings.models.subagentModels['default'] = authData[key];\n }\n const saMatch = key.match(/^_subagentModelId_(.+)$/);\n if (saMatch?.[1] && typeof authData[key] === 'string' && !settings.models.subagentModels[saMatch[1]]) {\n settings.models.subagentModels[saMatch[1]] = authData[key];\n }\n }\n\n // Write migrated settings\n saveSettings(settings, settingsPath);\n\n // Clean up auth.json — remove _ prefixed keys\n for (const key of modelKeys) {\n delete authData[key];\n }\n try {\n writeFileSync(authPath, JSON.stringify(authData, null, 2), 'utf-8');\n } catch {\n // Non-fatal — settings are saved, auth cleanup can fail\n }\n\n return true;\n}\n\nexport function loadSettings(filePath: string = getSettingsPath()): GlobalSettings {\n // One-time migration: move model data from auth.json into settings.json\n migrateFromAuth(filePath);\n\n if (!existsSync(filePath)) return structuredClone(DEFAULTS);\n try {\n const raw = JSON.parse(readFileSync(filePath, 'utf-8'));\n const settings: GlobalSettings = {\n onboarding: { ...DEFAULTS.onboarding, ...raw.onboarding },\n models: { ...DEFAULTS.models, ...raw.models },\n preferences: { ...DEFAULTS.preferences, ...raw.preferences },\n storage: {\n ...STORAGE_DEFAULTS,\n ...raw.storage,\n libsql: { ...STORAGE_DEFAULTS.libsql, ...raw.storage?.libsql },\n pg: { ...STORAGE_DEFAULTS.pg, ...raw.storage?.pg },\n },\n customModelPacks: Array.isArray(raw.customModelPacks) ? raw.customModelPacks : [],\n modelUseCounts: raw.modelUseCounts && typeof raw.modelUseCounts === 'object' ? raw.modelUseCounts : {},\n };\n\n // Migrate legacy omModelId → omModelOverride\n if (raw.models?.omModelId && !settings.models.omModelOverride) {\n settings.models.omModelOverride = raw.models.omModelId;\n saveSettings(settings, filePath);\n }\n\n return settings;\n } catch {\n return structuredClone(DEFAULTS);\n }\n}\n\n/**\n * Resolve effective per-mode model defaults.\n *\n * If `activeModelPackId` is set, looks up the pack (built-in or custom) and\n * returns its models. Falls back to the explicit `modeDefaults` map.\n *\n * @param settings The loaded global settings.\n * @param builtinPacks Built-in packs for the current provider access\n * (from `getAvailableModePacks`). Pass `[]` if unavailable.\n */\nexport function resolveModelDefaults(\n settings: GlobalSettings,\n builtinPacks: Array<{ id: string; models: Record<string, string> }>,\n): Record<string, string> {\n const { activeModelPackId, modeDefaults } = settings.models;\n if (!activeModelPackId) return modeDefaults;\n\n // Custom pack: \"custom:<name>\"\n if (activeModelPackId.startsWith('custom:')) {\n const name = activeModelPackId.slice('custom:'.length);\n const pack = settings.customModelPacks.find(p => p.name === name);\n if (pack) return pack.models;\n // Custom pack was deleted — fall through to modeDefaults\n return modeDefaults;\n }\n\n // Built-in pack\n const builtin = builtinPacks.find(p => p.id === activeModelPackId);\n if (builtin) return builtin.models;\n\n // Unknown pack id — fall through\n return modeDefaults;\n}\n\n/**\n * Resolve the effective OM model ID.\n *\n * If `activeOmPackId` is set, looks up the matching OM pack and returns its\n * model. Falls back to the explicit `omModelOverride`.\n *\n * @param settings The loaded global settings.\n * @param builtinOmPacks Built-in OM packs for the current provider access\n * (from `getAvailableOmPacks`). Pass `[]` if unavailable.\n */\nexport function resolveOmModel(\n settings: GlobalSettings,\n builtinOmPacks: Array<{ id: string; modelId: string }>,\n): string | null {\n const { activeOmPackId, omModelOverride } = settings.models;\n if (!activeOmPackId) return omModelOverride;\n\n if (activeOmPackId === 'custom') return omModelOverride;\n\n const pack = builtinOmPacks.find(p => p.id === activeOmPackId);\n if (pack) return pack.modelId;\n\n // Unknown pack — fall back to override\n return omModelOverride;\n}\n\nexport function saveSettings(settings: GlobalSettings, filePath: string = getSettingsPath()): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, JSON.stringify(settings, null, 2), 'utf-8');\n}\n","/**\n * Theme system for the Mastra Code TUI.\n * Simplified from pi-mono's theme system.\n */\n\nimport type { MarkdownTheme, EditorTheme, SettingsListTheme, SelectListTheme } from '@mariozechner/pi-tui';\nimport chalk from 'chalk';\n\n// =============================================================================\n// Theme Mode\n// =============================================================================\n\nexport type ThemeMode = 'dark' | 'light';\n\nlet currentThemeMode: ThemeMode = 'dark';\n\nexport function getThemeMode(): ThemeMode {\n return currentThemeMode;\n}\n\n// =============================================================================\n// Mastra Brand Palette (immutable — stays constant regardless of theme)\n// =============================================================================\n\nexport const mastraBrand = {\n purple: '#7f45e0', // #b588fe brand is too washed out for terminal\n green: '#059669', // #7aff78 too vibrant\n orange: '#fdac53',\n pink: '#ff69cc',\n blue: '#2563eb', // #6ccdfb brand is to washed out\n red: '#DC5663', // #ff4758 too intense\n yellow: '#e7e67b',\n} as const;\n\n// =============================================================================\n// Mastra Surface Palette (theme-dependent)\n// =============================================================================\n\ninterface MastraSurface {\n bg: string;\n antiGrid: string;\n elevationSm: string;\n elevationLg: string;\n hover: string;\n white: string;\n specialGray: string;\n mainGray: string;\n darkGray: string;\n borderAntiGrid: string;\n borderElevation: string;\n}\n\nconst darkSurface: MastraSurface = {\n bg: '#020202',\n antiGrid: '#0d0d0d',\n elevationSm: '#1a1a1a',\n elevationLg: '#141414',\n hover: '#262626',\n white: '#f0f0f0',\n specialGray: '#cccccc',\n mainGray: '#939393',\n darkGray: '#424242',\n borderAntiGrid: '#141414',\n borderElevation: '#1a1a1a',\n};\n\nconst lightSurface: MastraSurface = {\n bg: '#ffffff',\n antiGrid: '#eaeaea',\n elevationSm: '#ebebeb',\n elevationLg: '#f0f0f0',\n hover: '#e0e0e0',\n white: '#1a1a1a',\n specialGray: '#444444',\n mainGray: '#6b6b6b',\n darkGray: '#b0b0b0',\n borderAntiGrid: '#e5e5e5',\n borderElevation: '#e0e0e0',\n};\n\ntype MastraPalette = typeof mastraBrand & MastraSurface;\n\nfunction getSurface(): MastraSurface {\n return currentThemeMode === 'dark' ? darkSurface : lightSurface;\n}\n\n/** Mastra palette — brand colors are constant, surface colors adapt to theme mode. */\nexport const mastra: MastraPalette = new Proxy({} as MastraPalette, {\n get(_target, prop: string) {\n if (prop in mastraBrand) {\n return mastraBrand[prop as keyof typeof mastraBrand];\n }\n const surface = getSurface();\n if (prop in surface) {\n return surface[prop as keyof MastraSurface];\n }\n return undefined;\n },\n});\n\n/** Tint a hex color by a brightness factor (0–1). e.g. tintHex(\"#ff8800\", 0.15) → near-black orange */\nexport function tintHex(hex: string, factor: number): string {\n const r = Math.floor(parseInt(hex.slice(1, 3), 16) * factor);\n const g = Math.floor(parseInt(hex.slice(3, 5), 16) * factor);\n const b = Math.floor(parseInt(hex.slice(5, 7), 16) * factor);\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\n// =============================================================================\n// Theme Colors\n// =============================================================================\n\nexport type ThemeColor =\n | 'accent'\n | 'border'\n | 'borderAccent'\n | 'borderMuted'\n | 'success'\n | 'error'\n | 'warning'\n | 'muted'\n | 'dim'\n | 'text'\n | 'thinkingText'\n | 'userMessageText'\n | 'toolTitle'\n | 'toolOutput'\n | 'toolBorderPending'\n | 'toolBorderSuccess'\n | 'toolBorderError'\n | 'function'\n | 'path'\n | 'number';\n\nexport type ThemeBg =\n | 'selectedBg'\n | 'userMessageBg'\n | 'systemReminderBg'\n | 'toolPendingBg'\n | 'toolSuccessBg'\n | 'toolErrorBg'\n | 'overlayBg'\n | 'errorBg';\n\nexport interface ThemeColors {\n // Core UI\n accent: string;\n border: string;\n borderAccent: string;\n borderMuted: string;\n success: string;\n error: string;\n warning: string;\n muted: string;\n dim: string;\n text: string;\n thinkingText: string;\n // User messages\n userMessageBg: string;\n userMessageText: string;\n // System reminders\n systemReminderBg: string;\n // Tool execution\n toolPendingBg: string;\n toolSuccessBg: string;\n toolErrorBg: string;\n toolBorderPending: string;\n toolBorderSuccess: string;\n toolBorderError: string;\n toolTitle: string;\n toolOutput: string;\n // Selection\n selectedBg: string;\n // Overlays\n overlayBg: string;\n // Error display\n errorBg: string;\n path: string;\n number: string;\n function: string;\n}\n\n// =============================================================================\n// Dark Theme\n// =============================================================================\n\nexport const darkTheme: ThemeColors = {\n // Core UI\n accent: '#7c3aed', // Purple\n border: '#3f3f46',\n borderAccent: '#7c3aed',\n borderMuted: '#27272a',\n success: '#22c55e',\n error: '#ef4444',\n warning: '#f59e0b',\n muted: '#71717a',\n dim: '#52525b',\n text: '#fafafa',\n thinkingText: '#a1a1aa',\n // User messages\n userMessageBg: '#0f172a', // Slate blue\n userMessageText: '#fafafa',\n // System reminders\n systemReminderBg: '#1a1400', // Dark orange tint\n // Tool execution\n toolPendingBg: '#18152a', // Dark purple (matches tool title accent)\n toolSuccessBg: '#18152a', // Dark purple (same as pending)\n toolErrorBg: '#1f0a0a', // Dark red tint\n toolBorderPending: '#6366f1', // Indigo for pending\n toolBorderSuccess: '#22c55e', // Green for success\n toolBorderError: '#ef4444', // Red for error\n toolTitle: '#a78bfa',\n toolOutput: '#d4d4d8',\n // Error display\n errorBg: '#291415', // Slightly lighter than toolErrorBg for contrast\n path: '#9ca3af', // Gray for file paths\n number: '#fbbf24', // Yellow for line numbers\n function: '#60a5fa', // Light blue for function names\n // Selection\n selectedBg: darkSurface.hover,\n // Overlays\n overlayBg: darkSurface.antiGrid,\n};\n\n// =============================================================================\n// Light Theme\n// =============================================================================\n\nexport const lightTheme: ThemeColors = {\n // Core UI\n accent: '#7c3aed', // Purple stays the same\n border: '#d4d4d8',\n borderAccent: '#7c3aed',\n borderMuted: '#e4e4e7',\n success: '#16a34a',\n error: '#dc2626',\n warning: '#d97706',\n muted: '#71717a',\n dim: '#a1a1aa',\n text: '#18181b',\n thinkingText: '#71717a',\n // User messages\n userMessageBg: '#eff6ff', // Light blue\n userMessageText: '#18181b',\n // System reminders\n systemReminderBg: '#fefce8', // Light yellow\n // Tool execution\n toolPendingBg: '#f5f3ff', // Light purple\n toolSuccessBg: '#f5f3ff', // Light purple (same as pending)\n toolErrorBg: '#fef2f2', // Light red\n toolBorderPending: '#6366f1', // Indigo for pending\n toolBorderSuccess: '#16a34a', // Green for success\n toolBorderError: '#dc2626', // Red for error\n toolTitle: '#7c3aed',\n toolOutput: '#3f3f46',\n // Error display\n errorBg: '#fef2f2', // Light red\n path: '#6b7280', // Gray for file paths\n number: '#b45309', // Amber for line numbers\n function: '#2563eb', // Blue for function names\n // Selection\n selectedBg: lightSurface.hover,\n // Overlays\n overlayBg: lightSurface.antiGrid,\n};\n\n// =============================================================================\n// Theme Instance\n// =============================================================================\n\nlet currentTheme: ThemeColors = darkTheme;\n\n/**\n * Get the current theme colors.\n */\nfunction getTheme(): ThemeColors {\n return currentTheme;\n}\n\n/**\n * Set the current theme.\n */\nfunction setTheme(colors: ThemeColors): void {\n currentTheme = colors;\n}\n\n/**\n * Apply a theme mode, updating both the surface palette and the theme colors.\n */\nexport function applyThemeMode(mode: ThemeMode): void {\n currentThemeMode = mode;\n currentTheme = mode === 'light' ? lightTheme : darkTheme;\n}\n\n// =============================================================================\n// Theme Helper Functions\n// =============================================================================\n\n/**\n * Apply foreground color from theme.\n */\nfunction fg(color: ThemeColor, text: string): string {\n const hex = currentTheme[color];\n if (!hex) return text;\n return chalk.hex(hex)(text);\n}\n\n/**\n * Apply background color from theme.\n */\nfunction bg(color: ThemeBg, text: string): string {\n const hex = currentTheme[color];\n if (!hex) return text;\n return chalk.bgHex(hex)(text);\n}\n\n/**\n * Apply bold styling.\n */\nfunction bold(text: string): string {\n return chalk.bold(text);\n}\n\n/**\n * Apply italic styling.\n */\nfunction italic(text: string): string {\n return chalk.italic(text);\n}\n\n/**\n * Apply dim styling.\n */\nfunction dim(text: string): string {\n return chalk.dim(text);\n}\n\n/**\n * Returns \"#ffffff\" or \"#000000\" depending on which has better contrast\n * against the given hex background color (WCAG relative luminance).\n */\nexport function getContrastText(hexBg: string): string {\n const hex = hexBg.replace('#', '');\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n const toLinear = (c: number) => (c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4);\n const luminance = 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n return luminance > 0.179 ? '#000000' : '#ffffff';\n}\n\n// =============================================================================\n// Theme Object\n// =============================================================================\n\nexport const theme = {\n fg,\n bg,\n bold,\n italic,\n dim,\n getTheme,\n setTheme,\n};\n\n// =============================================================================\n// Markdown Theme (for pi-tui Markdown component)\n// =============================================================================\n\nexport function getMarkdownTheme(): MarkdownTheme {\n const t = getTheme();\n return {\n heading: (text: string) => chalk.hex(t.accent).bold(text),\n link: (text: string) => chalk.hex(t.accent)(text),\n linkUrl: (text: string) => chalk.hex(t.muted)(text),\n code: (text: string) => chalk.hex(t.accent)(text),\n codeBlock: (text: string) => text,\n codeBlockBorder: (text: string) => chalk.hex(t.borderMuted)(text),\n quote: (text: string) => chalk.hex(t.muted).italic(text),\n quoteBorder: (text: string) => chalk.hex(t.borderMuted)(text),\n hr: (text: string) => chalk.hex(t.borderMuted)(text),\n listBullet: (text: string) => chalk.hex(t.accent)(text),\n // Required by MarkdownTheme interface\n bold: (text: string) => chalk.bold(text),\n italic: (text: string) => chalk.italic(text),\n strikethrough: (text: string) => chalk.strikethrough(text),\n underline: (text: string) => chalk.underline(text),\n };\n}\n\n// =============================================================================\n// Editor Theme (for pi-tui Editor component)\n// =============================================================================\n\nexport function getEditorTheme(): EditorTheme {\n const t = getTheme();\n return {\n borderColor: (text: string) => chalk.hex(t.border)(text),\n selectList: {\n selectedPrefix: (text: string) => chalk.hex(t.accent)(text),\n selectedText: (text: string) => chalk.bgHex(t.selectedBg)(text),\n description: (text: string) => chalk.hex(t.muted)(text),\n scrollInfo: (text: string) => chalk.hex(t.dim)(text),\n noMatch: (text: string) => chalk.hex(t.muted)(text),\n },\n };\n}\n\n// =============================================================================\n// Settings List Theme (for pi-tui SettingsList component)\n// =============================================================================\n\nexport function getSettingsListTheme(): SettingsListTheme {\n const t = getTheme();\n return {\n label: (text: string, selected: boolean) => (selected ? chalk.hex(t.text).bold(text) : chalk.hex(t.muted)(text)),\n value: (text: string, selected: boolean) => (selected ? chalk.hex(t.accent)(text) : chalk.hex(t.dim)(text)),\n description: (text: string) => chalk.hex(t.muted).italic(text),\n cursor: chalk.hex(t.accent)('→ '),\n hint: (text: string) => chalk.hex(t.dim)(text),\n };\n}\n\nexport function getSelectListTheme(): SelectListTheme {\n const t = getTheme();\n return {\n selectedPrefix: (text: string) => chalk.hex(t.accent)(text),\n selectedText: (text: string) => chalk.bgHex(t.selectedBg)(text),\n description: (text: string) => chalk.hex(t.muted)(text),\n scrollInfo: (text: string) => chalk.hex(t.dim)(text),\n noMatch: (text: string) => chalk.hex(t.muted)(text),\n };\n}\n","/**\n * Thread lock — ensures only one process writes to a thread at a time.\n *\n * Uses filesystem lock files: <appDataDir>/locks/<threadId>.lock\n * Each lock file contains the PID of the owning process.\n * Stale locks (from crashed processes) are detected and reclaimed.\n */\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { getAppDataDir } from './project.js';\n\nexport class ThreadLockError extends Error {\n constructor(\n public readonly threadId: string,\n public readonly ownerPid: number,\n ) {\n super(`Thread ${threadId} is locked by another process (PID ${ownerPid})`);\n this.name = 'ThreadLockError';\n }\n}\n\nfunction getLocksDir(): string {\n const dir = path.join(getAppDataDir(), 'locks');\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n return dir;\n}\n\nfunction getLockPath(threadId: string): string {\n // Sanitize thread ID for filesystem safety\n const safeId = threadId.replace(/[^a-zA-Z0-9_-]/g, '_');\n return path.join(getLocksDir(), `${safeId}.lock`);\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Attempt to acquire a lock for the given thread.\n * Throws ThreadLockError if another live process holds the lock.\n * Reclaims stale locks from dead processes.\n */\nexport function acquireThreadLock(threadId: string): void {\n const lockPath = getLockPath(threadId);\n const myPid = process.pid;\n\n // Check for existing lock\n if (fs.existsSync(lockPath)) {\n try {\n const content = fs.readFileSync(lockPath, 'utf-8').trim();\n const ownerPid = parseInt(content, 10);\n\n if (!isNaN(ownerPid) && ownerPid !== myPid && isProcessAlive(ownerPid)) {\n throw new ThreadLockError(threadId, ownerPid);\n }\n // Stale lock (dead process) or our own lock — reclaim it\n } catch (error) {\n if (error instanceof ThreadLockError) throw error;\n // File read error — try to overwrite\n }\n }\n\n // Write our PID to the lock file\n fs.writeFileSync(lockPath, String(myPid), { mode: 0o644 });\n}\n\n/**\n * Release the lock for the given thread (only if we own it).\n */\nexport function releaseThreadLock(threadId: string): void {\n const lockPath = getLockPath(threadId);\n const myPid = process.pid;\n\n try {\n if (!fs.existsSync(lockPath)) return;\n\n const content = fs.readFileSync(lockPath, 'utf-8').trim();\n const ownerPid = parseInt(content, 10);\n\n // Only remove if we own it\n if (ownerPid === myPid) {\n fs.unlinkSync(lockPath);\n }\n } catch {\n // Best-effort cleanup — ignore errors\n }\n}\n\n/**\n * Check if a thread is locked by another process.\n * Returns the PID of the owner if locked, null otherwise.\n */\nexport function getThreadLockOwner(threadId: string): number | null {\n const lockPath = getLockPath(threadId);\n\n try {\n if (!fs.existsSync(lockPath)) return null;\n\n const content = fs.readFileSync(lockPath, 'utf-8').trim();\n const ownerPid = parseInt(content, 10);\n\n if (isNaN(ownerPid)) return null;\n if (ownerPid === process.pid) return null; // Our own lock\n if (!isProcessAlive(ownerPid)) {\n // Stale lock — clean it up\n try {\n fs.unlinkSync(lockPath);\n } catch {}\n return null;\n }\n\n return ownerPid;\n } catch {\n return null;\n }\n}\n\n/**\n * Release all thread locks owned by this process.\n * Call this on process exit.\n */\nexport function releaseAllThreadLocks(): void {\n try {\n const locksDir = getLocksDir();\n const files = fs.readdirSync(locksDir);\n const myPid = String(process.pid);\n\n for (const file of files) {\n if (!file.endsWith('.lock')) continue;\n const lockPath = path.join(locksDir, file);\n try {\n const content = fs.readFileSync(lockPath, 'utf-8').trim();\n if (content === myPid) {\n fs.unlinkSync(lockPath);\n }\n } catch {\n // Best-effort\n }\n }\n } catch {\n // Best-effort\n }\n}\n"]}
|