@ngandu/ulicode 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +1081 -0
  2. package/README.md +312 -0
  3. package/dist/agents/definitions/ask.agent.md +53 -0
  4. package/dist/agents/definitions/audit-tests.agent.md +138 -0
  5. package/dist/agents/definitions/build.agent.md +111 -0
  6. package/dist/agents/definitions/execute.agent.md +99 -0
  7. package/dist/agents/definitions/explore.agent.md +57 -0
  8. package/dist/agents/definitions/fast.agent.md +48 -0
  9. package/dist/agents/definitions/plan-mode.agent.md +102 -0
  10. package/dist/agents/definitions/planner.agent.md +59 -0
  11. package/dist/chunk-3YYDXNUH.js +854 -0
  12. package/dist/chunk-3YYDXNUH.js.map +1 -0
  13. package/dist/chunk-IEV2IT3O.cjs +873 -0
  14. package/dist/chunk-IEV2IT3O.cjs.map +1 -0
  15. package/dist/chunk-MBWGSXBT.js +11927 -0
  16. package/dist/chunk-MBWGSXBT.js.map +1 -0
  17. package/dist/chunk-MS5RYNRK.js +137 -0
  18. package/dist/chunk-MS5RYNRK.js.map +1 -0
  19. package/dist/chunk-OXFO76JC.js +2633 -0
  20. package/dist/chunk-OXFO76JC.js.map +1 -0
  21. package/dist/chunk-PKRLG6A4.js +1756 -0
  22. package/dist/chunk-PKRLG6A4.js.map +1 -0
  23. package/dist/chunk-PUVEPQQ3.cjs +1805 -0
  24. package/dist/chunk-PUVEPQQ3.cjs.map +1 -0
  25. package/dist/chunk-R6JK3DE3.cjs +148 -0
  26. package/dist/chunk-R6JK3DE3.cjs.map +1 -0
  27. package/dist/chunk-Y3HWP75B.cjs +11974 -0
  28. package/dist/chunk-Y3HWP75B.cjs.map +1 -0
  29. package/dist/chunk-Y5PO67TG.cjs +2659 -0
  30. package/dist/chunk-Y5PO67TG.cjs.map +1 -0
  31. package/dist/cli.cjs +372 -0
  32. package/dist/cli.cjs.map +1 -0
  33. package/dist/cli.d.cts +1 -0
  34. package/dist/cli.d.ts +1 -0
  35. package/dist/cli.js +370 -0
  36. package/dist/cli.js.map +1 -0
  37. package/dist/index.cjs +16 -0
  38. package/dist/index.cjs.map +1 -0
  39. package/dist/index.d.cts +165 -0
  40. package/dist/index.d.ts +165 -0
  41. package/dist/index.js +3 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/permissions-NRD36MYI.cjs +40 -0
  44. package/dist/permissions-NRD36MYI.cjs.map +1 -0
  45. package/dist/permissions-RC7CYR5H.js +3 -0
  46. package/dist/permissions-RC7CYR5H.js.map +1 -0
  47. package/dist/project-q9WpahUs.d.cts +329 -0
  48. package/dist/project-q9WpahUs.d.ts +329 -0
  49. package/dist/storage-6P53PQBL.cjs +24 -0
  50. package/dist/storage-6P53PQBL.cjs.map +1 -0
  51. package/dist/storage-QELMNBZ2.js +3 -0
  52. package/dist/storage-QELMNBZ2.js.map +1 -0
  53. package/dist/tui.cjs +76 -0
  54. package/dist/tui.cjs.map +1 -0
  55. package/dist/tui.d.cts +1013 -0
  56. package/dist/tui.d.ts +1013 -0
  57. package/dist/tui.js +3 -0
  58. package/dist/tui.js.map +1 -0
  59. package/package.json +107 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agents/agent-definitions.ts","../src/utils/debug-log.ts","../src/onboarding/settings.ts","../src/lsp/client.ts","../src/lsp/language.ts","../src/lsp/server.ts","../src/lsp/manager.ts","../src/onboarding/packs.ts","../src/utils/thread-lock.ts"],"names":["basename","join","dirname","fileURLToPath","MC_TOOLS","taskWriteTool","taskCheckTool","yaml","existsSync","readdirSync","readFileSync","homedir","path","getAppDataDir","fs","writeFileSync","mkdirSync","StreamMessageReader","StreamMessageWriter","createMessageConnection","TextDocumentIdentifier","Position","createRequire","pathToFileURL","spawn","path4","fs2"],"mappings":"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","file":"chunk-PUVEPQQ3.cjs","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { basename, dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { HarnessMode, HarnessSubagent } from '@mastra/core/harness';\nimport { taskCheckTool, taskWriteTool } from '@mastra/core/harness';\nimport type { Agent } from '@mastra/core/agent';\nimport * as yaml from 'js-yaml';\n\nimport type { MastraCodeState } from '../schema.js';\nimport { MC_TOOLS } from '../tool-names.js';\n\ntype AgentScope = 'builtin' | 'user' | 'project';\ntype AgentKind = 'mode' | 'subagent';\n\nexport interface AgentDefinitionDiagnostic {\n severity: 'warning' | 'error';\n scope: AgentScope;\n sourcePath: string;\n message: string;\n}\n\ninterface BaseDefinition {\n id: string;\n name: string;\n kind: AgentKind;\n description: string;\n instructions: string;\n sourcePath: string;\n scope: AgentScope;\n hidden: boolean;\n}\n\nexport interface ModeAgentDefinition extends BaseDefinition {\n kind: 'mode';\n default: boolean;\n defaultModelId?: string;\n color?: string;\n subagents: string[];\n}\n\nexport interface SubagentAgentDefinition extends BaseDefinition {\n kind: 'subagent';\n defaultModelFromMode?: string;\n tools: string[];\n allowedWorkspaceTools?: string[];\n}\n\nexport interface AgentDefinitionRegistry {\n modes: ModeAgentDefinition[];\n subagents: SubagentAgentDefinition[];\n diagnostics: AgentDefinitionDiagnostic[];\n}\n\ninterface AgentFrontmatter {\n id?: string;\n name?: string;\n kind?: string;\n description?: string;\n default?: boolean;\n defaultModelId?: string;\n color?: string;\n subagents?: string[];\n tools?: string[] | string;\n allowedWorkspaceTools?: string[] | string;\n workspaceTools?: string[] | string;\n defaultModelFromMode?: string;\n modeId?: string;\n hidden?: boolean;\n /** Subagent-only: list of mode ids this subagent should auto-register with. */\n modes?: string[];\n}\n\n// Fields whose presence indicates a mode definition (used for kind auto-inference).\nconst MODE_INDICATOR_FIELDS: ReadonlySet<string> = new Set([\n 'subagents', 'default', 'defaultModelId', 'color',\n]);\n\n/**\n * Derive the agent id from a file path: `explore.agent.md` → `explore`.\n */\nfunction idFromFilename(filePath: string): string {\n return basename(filePath).replace(/\\.agent\\.md$/i, '');\n}\n\n/**\n * Extract the first sentence / first line from the markdown body as a fallback description.\n */\nfunction descriptionFromBody(body: string): string {\n // Skip leading heading lines\n const lines = body.split(/\\r?\\n/);\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n // Take up to the first period or the whole line, capped at 120 chars.\n const sentence = trimmed.match(/^[^.!?]+[.!?]?/)?.[0] ?? trimmed;\n return sentence.length > 120 ? sentence.slice(0, 117) + '...' : sentence;\n }\n return '';\n}\n\n/**\n * Auto-detect `kind` from frontmatter fields.\n * If any mode-indicator field is present → 'mode'; otherwise → 'subagent'.\n */\nfunction inferKind(frontmatter: AgentFrontmatter): AgentKind {\n for (const key of Object.keys(frontmatter)) {\n if (MODE_INDICATOR_FIELDS.has(key)) return 'mode';\n }\n return 'subagent';\n}\n\nconst BUILTIN_DEFINITIONS_DIR = join(dirname(fileURLToPath(import.meta.url)), 'definitions');\n\nconst GLOBAL_AGENT_LOCATIONS = [\n '.claude/agents',\n '.ulicode/agents',\n '.uli-cli/agents',\n '.pulse/agents',\n '.mastracode/agents',\n '.config/claude/agents',\n '.config/ulicode/agents',\n '.config/uli-cli/agents',\n '.config/pulse/agents',\n '.config/mastracode/agents',\n];\n\nconst PROJECT_AGENT_LOCATIONS = [\n '.claude/agents',\n '.ulicode/agents',\n '.uli-cli/agents',\n '.pulse/agents',\n '.mastracode/agents',\n];\n\nconst WORKSPACE_TOOL_IDS = new Set<string>(Object.values(MC_TOOLS));\n\nconst DIRECT_SUBAGENT_TOOLS = {\n task_write: taskWriteTool,\n task_check: taskCheckTool,\n} as const;\n\nconst agentDefinitionCache = new Map<string, AgentDefinitionRegistry>();\n\nfunction pushDiagnostic(\n diagnostics: AgentDefinitionDiagnostic[],\n severity: AgentDefinitionDiagnostic['severity'],\n scope: AgentScope,\n sourcePath: string,\n message: string,\n): void {\n diagnostics.push({ severity, scope, sourcePath, message });\n}\n\nfunction titleCaseId(id: string): string {\n return id\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map(part => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n}\n\nfunction parseFrontmatter(content: string): { frontmatter: AgentFrontmatter; body: string } | null {\n const normalized = content.replace(/^\\uFEFF/, '');\n const match = normalized.match(/^---\\r?\\n([\\s\\S]*?)(?:\\r?\\n)?---\\r?\\n?([\\s\\S]*)$/);\n if (!match) {\n return null;\n }\n\n const frontmatter = (yaml.load(match[1]!) ?? {}) as AgentFrontmatter;\n return { frontmatter, body: match[2]!.trim() };\n}\n\nfunction scanAgentDirectory(dirPath: string): string[] {\n if (!existsSync(dirPath)) {\n return [];\n }\n\n const results: string[] = [];\n for (const entry of readdirSync(dirPath, { withFileTypes: true })) {\n const fullPath = join(dirPath, entry.name);\n if (entry.isDirectory()) {\n results.push(...scanAgentDirectory(fullPath));\n continue;\n }\n if (entry.isFile() && entry.name.endsWith('.agent.md')) {\n results.push(fullPath);\n }\n }\n return results.sort((left, right) => left.localeCompare(right));\n}\n\nfunction normalizeModeDefinition(\n filePath: string,\n scope: AgentScope,\n frontmatter: AgentFrontmatter,\n instructions: string,\n diagnostics: AgentDefinitionDiagnostic[],\n): ModeAgentDefinition | null {\n const id = (frontmatter.id ?? idFromFilename(filePath)).trim();\n if (!id) {\n pushDiagnostic(diagnostics, 'error', scope, filePath, 'could not derive `id` for mode definition');\n return null;\n }\n\n const name = typeof frontmatter.name === 'string' && frontmatter.name.trim()\n ? frontmatter.name.trim()\n : titleCaseId(id);\n\n const description = typeof frontmatter.description === 'string' && frontmatter.description.trim()\n ? frontmatter.description.trim()\n : descriptionFromBody(instructions);\n\n if (frontmatter.subagents !== undefined && !Array.isArray(frontmatter.subagents)) {\n pushDiagnostic(diagnostics, 'error', scope, filePath, `mode \\`${id}\\` must declare \\`subagents\\` as an array`);\n return null;\n }\n\n if (Array.isArray(frontmatter.subagents) && frontmatter.subagents.some(entry => typeof entry !== 'string' || entry.trim().length === 0)) {\n pushDiagnostic(\n diagnostics,\n 'error',\n scope,\n filePath,\n `mode \\`${id}\\` has invalid \\`subagents\\` entries; expected non-empty string ids`,\n );\n return null;\n }\n\n const subagents = Array.isArray(frontmatter.subagents)\n ? frontmatter.subagents.map(entry => entry.trim())\n : [];\n\n return {\n id,\n name,\n kind: 'mode',\n description,\n instructions,\n sourcePath: filePath,\n scope,\n hidden: frontmatter.hidden === true,\n default: frontmatter.default === true,\n defaultModelId: typeof frontmatter.defaultModelId === 'string' ? frontmatter.defaultModelId.trim() : undefined,\n color: typeof frontmatter.color === 'string' ? frontmatter.color.trim() : undefined,\n subagents,\n };\n}\n\nfunction normalizeSubagentDefinition(\n filePath: string,\n scope: AgentScope,\n frontmatter: AgentFrontmatter,\n instructions: string,\n diagnostics: AgentDefinitionDiagnostic[],\n): SubagentAgentDefinition | null {\n const id = (frontmatter.id ?? idFromFilename(filePath)).trim();\n if (!id) {\n pushDiagnostic(diagnostics, 'error', scope, filePath, 'could not derive `id` for subagent definition');\n return null;\n }\n\n const name = typeof frontmatter.name === 'string' && frontmatter.name.trim()\n ? frontmatter.name.trim()\n : titleCaseId(id);\n\n const description = typeof frontmatter.description === 'string' && frontmatter.description.trim()\n ? frontmatter.description.trim()\n : descriptionFromBody(instructions);\n\n if (frontmatter.allowedWorkspaceTools && frontmatter.workspaceTools) {\n pushDiagnostic(\n diagnostics,\n 'error',\n scope,\n filePath,\n `subagent \\`${id}\\` cannot declare both \\`allowedWorkspaceTools\\` and \\`workspaceTools\\``,\n );\n return null;\n }\n\n // Validate tools: accept array of strings or the string \"all\".\n if (\n frontmatter.tools &&\n typeof frontmatter.tools !== 'string' &&\n (!Array.isArray(frontmatter.tools) || frontmatter.tools.some(entry => typeof entry !== 'string'))\n ) {\n pushDiagnostic(diagnostics, 'error', scope, filePath, `subagent \\`${id}\\` must declare \\`tools\\` as an array of strings or \"all\"`);\n return null;\n }\n\n // Resolve tools. \"all\" (string or single-element array) → all available direct tools.\n const useAllTools =\n frontmatter.tools === 'all' ||\n (Array.isArray(frontmatter.tools) && frontmatter.tools.length === 1 && frontmatter.tools[0] === 'all');\n const tools = useAllTools\n ? Object.keys(DIRECT_SUBAGENT_TOOLS)\n : Array.isArray(frontmatter.tools)\n ? frontmatter.tools.map(entry => entry.trim())\n : [];\n\n // Resolve allowedWorkspaceTools. \"all\" (string or single-element array) → inherit all workspace tools.\n const rawWorkspaceTools = frontmatter.allowedWorkspaceTools ?? frontmatter.workspaceTools;\n const useAllWorkspaceTools =\n rawWorkspaceTools === 'all' ||\n (Array.isArray(rawWorkspaceTools) && rawWorkspaceTools.length === 1 && rawWorkspaceTools[0] === 'all');\n\n let allowedWorkspaceTools: string[] | undefined;\n if (useAllWorkspaceTools) {\n allowedWorkspaceTools = undefined;\n } else if (Array.isArray(rawWorkspaceTools)) {\n allowedWorkspaceTools = rawWorkspaceTools.filter(\n (entry): entry is string => typeof entry === 'string' && entry.trim().length > 0,\n );\n } else if (typeof rawWorkspaceTools === 'string') {\n pushDiagnostic(diagnostics, 'warning', scope, filePath, `subagent \\`${id}\\` has unrecognized \\`allowedWorkspaceTools\\` value \"${rawWorkspaceTools}\"; expected array or \"all\"`);\n allowedWorkspaceTools = undefined;\n } else {\n allowedWorkspaceTools = undefined;\n }\n\n // Warn about unknown direct tools (filtered out at runtime)\n const unknownDirectTools = tools.filter(toolId => !(toolId in DIRECT_SUBAGENT_TOOLS));\n if (unknownDirectTools.length > 0) {\n pushDiagnostic(diagnostics, 'warning', scope, filePath, `subagent \\`${id}\\` declares unknown direct tools (ignored at runtime): ${unknownDirectTools.join(', ')}`);\n }\n\n // Warn about unknown workspace tools (filtered out at runtime)\n const unknownWorkspaceTools = (allowedWorkspaceTools ?? []).filter(toolId => !WORKSPACE_TOOL_IDS.has(toolId));\n if (unknownWorkspaceTools.length > 0) {\n pushDiagnostic(diagnostics, 'warning', scope, filePath, `subagent \\`${id}\\` declares unknown workspace tools (ignored at runtime): ${unknownWorkspaceTools.join(', ')}`);\n }\n\n return {\n id,\n name,\n kind: 'subagent',\n description,\n instructions,\n sourcePath: filePath,\n scope,\n hidden: frontmatter.hidden === true,\n tools,\n allowedWorkspaceTools,\n defaultModelFromMode:\n typeof frontmatter.defaultModelFromMode === 'string'\n ? frontmatter.defaultModelFromMode.trim()\n : typeof frontmatter.modeId === 'string'\n ? frontmatter.modeId.trim()\n : undefined,\n };\n}\n\nfunction parseAgentDefinitionFile(\n filePath: string,\n scope: AgentScope,\n diagnostics: AgentDefinitionDiagnostic[],\n): ModeAgentDefinition | SubagentAgentDefinition | null {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const parsed = parseFrontmatter(content);\n if (!parsed) {\n pushDiagnostic(diagnostics, 'error', scope, filePath, 'missing valid YAML frontmatter');\n return null;\n }\n\n const instructions = parsed.body.trim();\n if (!instructions) {\n pushDiagnostic(diagnostics, 'error', scope, filePath, 'missing markdown instruction body');\n return null;\n }\n\n const kind = (parsed.frontmatter.kind as AgentKind | undefined) ?? inferKind(parsed.frontmatter);\n\n if (kind === 'mode') {\n return normalizeModeDefinition(filePath, scope, parsed.frontmatter, instructions, diagnostics);\n }\n if (kind === 'subagent') {\n return normalizeSubagentDefinition(filePath, scope, parsed.frontmatter, instructions, diagnostics);\n }\n\n pushDiagnostic(diagnostics, 'error', scope, filePath, `unsupported \\`kind\\`: ${String(parsed.frontmatter.kind)}; expected \\`mode\\` or \\`subagent\\``);\n return null;\n } catch (error) {\n pushDiagnostic(\n diagnostics,\n 'error',\n scope,\n filePath,\n `failed to parse agent definition: ${error instanceof Error ? error.message : String(error)}`,\n );\n return null;\n }\n}\n\nfunction validateRegistry(\n registry: AgentDefinitionRegistry,\n diagnostics: AgentDefinitionDiagnostic[],\n): void {\n const modeIds = new Set(registry.modes.map(mode => mode.id));\n const subagentIds = new Set(registry.subagents.map(subagent => subagent.id));\n\n for (const mode of registry.modes) {\n const seen = new Set<string>();\n for (const subagentId of mode.subagents) {\n if (seen.has(subagentId)) {\n pushDiagnostic(diagnostics, 'warning', mode.scope, mode.sourcePath, `mode \\`${mode.id}\\` lists duplicate subagent \\`${subagentId}\\``);\n continue;\n }\n seen.add(subagentId);\n if (!subagentIds.has(subagentId)) {\n pushDiagnostic(\n diagnostics,\n 'error',\n mode.scope,\n mode.sourcePath,\n `mode \\`${mode.id}\\` references unknown subagent \\`${subagentId}\\` in \\`subagents\\``,\n );\n }\n }\n }\n\n for (const subagent of registry.subagents) {\n if (subagent.defaultModelFromMode && !modeIds.has(subagent.defaultModelFromMode)) {\n pushDiagnostic(\n diagnostics,\n 'error',\n subagent.scope,\n subagent.sourcePath,\n `subagent \\`${subagent.id}\\` references unknown mode \\`${subagent.defaultModelFromMode}\\` in \\`defaultModelFromMode\\``,\n );\n }\n\n const ownerCount = registry.modes.filter(mode => mode.subagents.includes(subagent.id)).length;\n if (ownerCount === 0) {\n pushDiagnostic(\n diagnostics,\n 'warning',\n subagent.scope,\n subagent.sourcePath,\n `subagent \\`${subagent.id}\\` is not referenced by any top-level mode \\`subagents\\` list`,\n );\n }\n }\n\n const defaultModes = registry.modes.filter(mode => mode.default);\n if (defaultModes.length === 0) {\n pushDiagnostic(diagnostics, 'warning', 'builtin', BUILTIN_DEFINITIONS_DIR, 'no default top-level mode is defined');\n } else if (defaultModes.length > 1) {\n pushDiagnostic(\n diagnostics,\n 'error',\n 'builtin',\n BUILTIN_DEFINITIONS_DIR,\n `multiple default top-level modes found: ${defaultModes.map(mode => mode.id).join(', ')}`,\n );\n }\n}\n\nfunction mergeDefinitions(entries: Array<{ dirPath: string; scope: AgentScope }>): AgentDefinitionRegistry {\n const modeMap = new Map<string, ModeAgentDefinition>();\n const subagentMap = new Map<string, SubagentAgentDefinition>();\n const diagnostics: AgentDefinitionDiagnostic[] = [];\n\n // Track subagent→modes declarations for auto-linking after all files are parsed.\n const subagentModeClaims = new Map<string, string[]>();\n\n for (const entry of entries) {\n for (const filePath of scanAgentDirectory(entry.dirPath)) {\n const content = readFileSync(filePath, 'utf-8');\n const parsed = parseFrontmatter(content);\n // Capture the raw `modes` field before it goes through normalisation.\n const rawModes = parsed?.frontmatter?.modes;\n\n const definition = parseAgentDefinitionFile(filePath, entry.scope, diagnostics);\n if (!definition) {\n continue;\n }\n\n if (definition.kind === 'mode') {\n modeMap.set(definition.id, definition);\n } else {\n subagentMap.set(definition.id, definition);\n // Collect modes declarations from the subagent's frontmatter.\n if (Array.isArray(rawModes) && rawModes.length > 0) {\n subagentModeClaims.set(\n definition.id,\n rawModes.filter((m): m is string => typeof m === 'string' && m.trim().length > 0).map(m => m.trim()),\n );\n }\n }\n }\n }\n\n // Auto-link: merge subagent `modes` declarations into mode `subagents` lists.\n for (const [subagentId, claimedModeIds] of subagentModeClaims) {\n for (const modeId of claimedModeIds) {\n const mode = modeMap.get(modeId);\n if (mode && !mode.subagents.includes(subagentId)) {\n mode.subagents.push(subagentId);\n }\n }\n }\n\n // Auto-link: attach orphaned subagents to the default mode so that dropping\n // a new .agent.md file is all that's needed to make it available.\n const defaultMode = Array.from(modeMap.values()).find(m => m.default);\n if (defaultMode) {\n for (const [subagentId] of subagentMap) {\n if (subagentModeClaims.has(subagentId)) continue;\n const isReferenced = Array.from(modeMap.values()).some(m => m.subagents.includes(subagentId));\n if (!isReferenced) {\n defaultMode.subagents.push(subagentId);\n }\n }\n }\n\n const registry = {\n modes: Array.from(modeMap.values()),\n subagents: Array.from(subagentMap.values()),\n diagnostics,\n } satisfies AgentDefinitionRegistry;\n\n validateRegistry(registry, diagnostics);\n return registry;\n}\n\nexport function loadAgentDefinitions(projectPath: string): AgentDefinitionRegistry {\n const entries: Array<{ dirPath: string; scope: AgentScope }> = [{ dirPath: BUILTIN_DEFINITIONS_DIR, scope: 'builtin' }];\n const home = homedir();\n\n for (const location of GLOBAL_AGENT_LOCATIONS) {\n entries.push({ dirPath: join(home, location), scope: 'user' });\n }\n\n for (const location of PROJECT_AGENT_LOCATIONS) {\n entries.push({ dirPath: join(projectPath, location), scope: 'project' });\n }\n\n return mergeDefinitions(entries);\n}\n\nexport function loadAgentDefinitionsCached(projectPath: string): AgentDefinitionRegistry {\n const cached = agentDefinitionCache.get(projectPath);\n if (cached) {\n return {\n modes: cached.modes.map(mode => ({ ...mode, subagents: [...mode.subagents] })),\n subagents: cached.subagents.map(subagent => ({\n ...subagent,\n tools: [...subagent.tools],\n allowedWorkspaceTools: subagent.allowedWorkspaceTools ? [...subagent.allowedWorkspaceTools] : undefined,\n })),\n diagnostics: cached.diagnostics.map(diagnostic => ({ ...diagnostic })),\n };\n }\n\n const loaded = loadAgentDefinitions(projectPath);\n agentDefinitionCache.set(projectPath, loaded);\n return loadAgentDefinitionsCached(projectPath);\n}\n\nexport function invalidateAgentDefinitionsCache(projectPath?: string): void {\n if (projectPath) {\n agentDefinitionCache.delete(projectPath);\n return;\n }\n agentDefinitionCache.clear();\n}\n\nexport function getModeDefinition(projectPath: string, modeId: string): ModeAgentDefinition | undefined {\n return loadAgentDefinitionsCached(projectPath).modes.find(mode => mode.id === modeId);\n}\n\nexport function formatAgentDefinitionDiagnostics(\n diagnostics: AgentDefinitionDiagnostic[],\n maxItems = 5,\n): string | null {\n if (diagnostics.length === 0) {\n return null;\n }\n\n const errors = diagnostics.filter(diagnostic => diagnostic.severity === 'error');\n const warnings = diagnostics.filter(diagnostic => diagnostic.severity === 'warning');\n const headlineParts: string[] = [];\n if (errors.length > 0) {\n headlineParts.push(`${errors.length} error${errors.length === 1 ? '' : 's'}`);\n }\n if (warnings.length > 0) {\n headlineParts.push(`${warnings.length} warning${warnings.length === 1 ? '' : 's'}`);\n }\n\n const visible = diagnostics.slice(0, maxItems);\n const lines = visible.map(diagnostic => {\n const prefix = diagnostic.severity === 'error' ? 'error' : 'warning';\n return `- ${prefix}: ${diagnostic.sourcePath} — ${diagnostic.message}`;\n });\n if (diagnostics.length > maxItems) {\n lines.push(`- ... ${diagnostics.length - maxItems} more`);\n }\n\n return `Ignored invalid custom agent definitions (${headlineParts.join(', ')}):\\n${lines.join('\\n')}`;\n}\n\nexport function getSubagentOwnerModes(\n registry: AgentDefinitionRegistry,\n subagentId: string,\n): ModeAgentDefinition[] {\n return registry.modes.filter(mode => mode.subagents.includes(subagentId));\n}\n\nexport function getAllowedSubagentIdsForMode(\n registry: AgentDefinitionRegistry,\n modeId: string,\n): string[] {\n return registry.modes.find(mode => mode.id === modeId)?.subagents ?? [];\n}\n\nexport function getSubagentModeMap(registry: AgentDefinitionRegistry): Record<string, string> {\n const mapping: Record<string, string> = {};\n\n for (const subagent of registry.subagents) {\n if (subagent.defaultModelFromMode) {\n mapping[subagent.id] = subagent.defaultModelFromMode;\n continue;\n }\n\n const ownerMode = registry.modes.find(mode => mode.subagents.includes(subagent.id));\n if (ownerMode) {\n mapping[subagent.id] = ownerMode.id;\n }\n }\n\n return mapping;\n}\n\nexport function createHarnessModesFromDefinitions(\n registry: AgentDefinitionRegistry,\n codeAgent: Agent,\n): HarnessMode<MastraCodeState>[] {\n return registry.modes.map(mode => ({\n id: mode.id,\n name: mode.name,\n default: mode.default,\n defaultModelId: mode.defaultModelId,\n color: mode.color,\n agent: codeAgent,\n }));\n}\n\nexport function createHarnessSubagentsFromDefinitions(\n registry: AgentDefinitionRegistry,\n disabledTools?: string[],\n): HarnessSubagent[] {\n return registry.subagents.map(subagent => {\n const directTools = Object.fromEntries(\n subagent.tools\n .filter(toolId => !disabledTools?.includes(toolId) && toolId in DIRECT_SUBAGENT_TOOLS)\n .map(toolId => [toolId, DIRECT_SUBAGENT_TOOLS[toolId as keyof typeof DIRECT_SUBAGENT_TOOLS]]),\n );\n\n const allowedWorkspaceTools = subagent.allowedWorkspaceTools?.filter(toolId => !disabledTools?.includes(toolId));\n\n return {\n id: subagent.id,\n name: subagent.name,\n description: subagent.description,\n instructions: subagent.instructions,\n defaultModelId: undefined,\n allowedWorkspaceTools,\n ...(Object.keys(directTools).length > 0 ? { tools: directTools } : {}),\n } satisfies HarnessSubagent;\n });\n}","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { getAppDataDir } from './project.js';\n\nconst MAX_LOG_SIZE = 5 * 1024 * 1024; // 5 MB\nconst KEEP_SIZE = 4 * 1024 * 1024; // 4 MB\n\nfunction formatLogArg(a: unknown): string {\n if (typeof a === 'string') return a;\n if (a instanceof Error) return a.stack ?? `${a.name}: ${a.message}`;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n}\n\nfunction getDebugLogFile(): string {\n return path.join(getAppDataDir(), 'debug.log');\n}\n\nfunction appendDebugLogLine(level: 'ERROR' | 'WARN' | 'PROFILE', message: string): void {\n const logFile = getDebugLogFile();\n const logDir = path.dirname(logFile);\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n truncateLogFile(logFile);\n fs.appendFileSync(logFile, `[${level}] ${new Date().toISOString()} ${message}\\n`);\n}\n\n/**\n * Truncate a log file to roughly {@link KEEP_SIZE} bytes if it exceeds\n * {@link MAX_LOG_SIZE}, cutting at the first newline so we don't start mid-line.\n */\nexport function truncateLogFile(logFile: string): void {\n try {\n const stat = fs.statSync(logFile);\n if (stat.size > MAX_LOG_SIZE) {\n const buf = Buffer.alloc(KEEP_SIZE);\n const fd = fs.openSync(logFile, 'r');\n fs.readSync(fd, buf, 0, KEEP_SIZE, stat.size - KEEP_SIZE);\n fs.closeSync(fd);\n const firstNewline = buf.indexOf(10);\n const trimmed = firstNewline >= 0 ? buf.subarray(firstNewline + 1) : buf;\n fs.writeFileSync(logFile, trimmed);\n }\n } catch {\n // File may not exist yet — that's fine\n }\n}\n\n/**\n * Set up debug logging. When {@link MASTRA_DEBUG} is `\"true\"`, redirects\n * `console.error` and `console.warn` to a log file (truncating it first if\n * oversized). Otherwise silences them to avoid corrupting the TUI.\n */\nexport function setupDebugLogging(): void {\n const debugEnabled = ['true', '1'].includes(process.env.MASTRA_DEBUG ?? '');\n\n if (debugEnabled) {\n const logFile = getDebugLogFile();\n truncateLogFile(logFile);\n\n const logStream = fs.createWriteStream(logFile, { flags: 'a' });\n console.error = (...args: unknown[]) => {\n logStream.write(`[ERROR] ${new Date().toISOString()} ${args.map(formatLogArg).join(' ')}\\n`);\n };\n console.warn = (...args: unknown[]) => {\n logStream.write(`[WARN] ${new Date().toISOString()} ${args.map(formatLogArg).join(' ')}\\n`);\n };\n } else {\n const noop = () => {};\n console.error = noop;\n console.warn = noop;\n }\n}\n\nexport function logRuntimeProfile(event: string, durationMs: number, details?: Record<string, unknown>): void {\n const profileEnabled = ['true', '1'].includes(process.env.MASTRA_PROFILE ?? '');\n if (!profileEnabled) return;\n\n const payload = details ? `${event} durationMs=${durationMs.toFixed(2)} ${formatLogArg(details)}` : `${event} durationMs=${durationMs.toFixed(2)}`;\n appendDebugLogLine('PROFILE', payload);\n}\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 type { LSPConfig } from '@mastra/core/workspace';\nimport { getAppDataDir } from '../utils/project.js';\n\n/** A saved custom pack — user-defined model selections for each mode. */\nexport interface CustomPack {\n name: string;\n models: Record<string, string>;\n createdAt: string;\n}\n\n/** A saved custom provider for OpenAI-compatible endpoints. */\nexport interface CustomProviderSetting {\n name: string;\n url: string;\n apiKey?: string;\n models: string[];\n}\n\n/** Storage backend type. */\nexport type StorageBackend = 'libsql' | 'pg';\n\n/** LibSQL-specific storage settings. */\nexport interface LibSQLStorageSettings {\n url?: string;\n authToken?: string;\n}\n\n/** PostgreSQL-specific storage settings. */\nexport interface PgStorageSettings {\n connectionString?: string;\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n password?: string;\n schemaName?: string;\n disableInit?: boolean;\n skipDefaultIndexes?: boolean;\n}\n\n/** Storage configuration persisted in global settings. */\nexport interface StorageSettings {\n /** Which backend to use. Default: 'libsql'. */\n backend: StorageBackend;\n /** LibSQL-specific config (used when backend is 'libsql'). */\n libsql: LibSQLStorageSettings;\n /** PostgreSQL-specific config (used when backend is 'pg'). */\n pg: PgStorageSettings;\n}\n\n/** Valid persisted thinking level values. */\nexport type ThinkingLevelSetting = 'off' | 'low' | 'medium' | 'high' | 'xhigh';\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 (\"anthropic\",\n * \"openai\"). Custom packs use \"custom:<name>\".\n * When set, models are resolved from the pack at startup so pack updates\n * (e.g. new model versions) apply automatically.\n * Cleared when the user manually overrides via /models (falls back to modeDefaults).\n */\n activeModelPackId: string | null;\n /** Explicit per-mode overrides — used when no activeModelPackId is set. */\n modeDefaults: Record<string, string>;\n /**\n * Active OM pack ID (e.g. \"gemini\", \"anthropic\", \"custom\").\n * When set, the OM model is resolved from the pack at startup so pack\n * updates (e.g. new model versions) apply automatically.\n * Cleared when the user manually overrides via /om (falls back to omModelOverride).\n */\n activeOmPackId: string | null;\n /** 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 /** Default reasoning effort level used for all threads/models unless overridden in-session. */\n thinkingLevel: ThinkingLevelSetting;\n /** When true, components like subagent output collapse to compact summaries on completion. */\n quietMode: boolean;\n };\n // Storage backend configuration\n storage: StorageSettings;\n // User-created custom model packs\n customModelPacks: CustomPack[];\n // User-created custom providers with custom models\n customProviders: CustomProviderSetting[];\n // Model usage counts for ranking in the selector\n modelUseCounts: Record<string, number>;\n // Version the user dismissed the update prompt for (skip until they manually update past this)\n updateDismissedVersion: string | null;\n // LSP configuration forwarded to the workspace\n lsp?: LSPConfig;\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 thinkingLevel: 'off',\n quietMode: false,\n },\n storage: { ...STORAGE_DEFAULTS },\n customModelPacks: [],\n customProviders: [],\n modelUseCounts: {},\n updateDismissedVersion: null,\n lsp: {},\n};\n\nconst THINKING_LEVEL_VALUES: ThinkingLevelSetting[] = ['off', 'low', 'medium', 'high', 'xhigh'];\nconst settingsCache = new Map<string, GlobalSettings>();\n\nfunction cloneSettings(settings: GlobalSettings): GlobalSettings {\n return structuredClone(settings);\n}\n\nfunction parseThinkingLevel(value: unknown): ThinkingLevelSetting {\n return typeof value === 'string' && THINKING_LEVEL_VALUES.includes(value as ThinkingLevelSetting)\n ? (value as ThinkingLevelSetting)\n : DEFAULTS.preferences.thinkingLevel;\n}\n\nfunction parsePreferences(rawPreferences: unknown): GlobalSettings['preferences'] {\n const raw = rawPreferences && typeof rawPreferences === 'object' ? (rawPreferences as Record<string, unknown>) : {};\n\n return {\n ...DEFAULTS.preferences,\n ...raw,\n thinkingLevel: parseThinkingLevel(raw.thinkingLevel),\n };\n}\n\nexport function getSettingsPath(): string {\n return join(getAppDataDir(), 'settings.json');\n}\n\nexport function getCustomProviderId(name: string): string {\n const slug = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return slug || 'provider';\n}\n\nexport function toCustomProviderModelId(providerName: string, modelName: string): string {\n const providerId = getCustomProviderId(providerName);\n const trimmedModelName = modelName.trim();\n const providerPrefix = `${providerId}/`;\n if (trimmedModelName.startsWith(providerPrefix)) {\n return trimmedModelName;\n }\n return `${providerId}/${trimmedModelName}`;\n}\n\nexport function parseCustomProviders(rawProviders: unknown): CustomProviderSetting[] {\n if (!Array.isArray(rawProviders)) return [];\n\n const parsedProviders: CustomProviderSetting[] = [];\n for (const rawProvider of rawProviders) {\n if (!rawProvider || typeof rawProvider !== 'object') continue;\n\n const candidate = rawProvider as Record<string, unknown>;\n const name = typeof candidate.name === 'string' ? candidate.name.trim() : '';\n const url = typeof candidate.url === 'string' ? candidate.url.trim() : '';\n if (!name || !url) continue;\n\n const providerId = getCustomProviderId(name);\n const models = Array.isArray(candidate.models)\n ? [\n ...new Set(\n candidate.models\n .filter((model): model is string => typeof model === 'string')\n .map(model => model.trim())\n .map(model => {\n const providerPrefix = `${providerId}/`;\n if (model.startsWith(providerPrefix)) {\n return model.slice(providerPrefix.length);\n }\n return model;\n }),\n ),\n ].filter(model => model.length > 0)\n : [];\n\n const apiKey =\n typeof candidate.apiKey === 'string' && candidate.apiKey.trim().length > 0 ? candidate.apiKey.trim() : undefined;\n\n parsedProviders.push({\n name,\n url,\n ...(apiKey ? { apiKey } : {}),\n models,\n });\n }\n\n return parsedProviders;\n}\n\n/**\n * One-time migration: move model-related data from auth.json to settings.json.\n * Reads `_modelRanks`, `_modeModelId_*`, `_subagentModelId*` from auth.json,\n * merges them into settings, removes them from auth.json, and writes both files.\n * No-ops if auth.json has no _ prefixed model data.\n */\nfunction migrateFromAuth(settingsPath: string): boolean {\n const authPath = join(getAppDataDir(), 'auth.json');\n if (!existsSync(authPath)) return false;\n\n let authData: Record<string, any>;\n try {\n authData = JSON.parse(readFileSync(authPath, 'utf-8'));\n } catch {\n return false;\n }\n\n const modelKeys = Object.keys(authData).filter(k => k.startsWith('_'));\n if (modelKeys.length === 0) return false;\n\n // Load existing settings (or defaults) and merge auth data into it\n let settings: GlobalSettings;\n if (existsSync(settingsPath)) {\n try {\n const raw = JSON.parse(readFileSync(settingsPath, 'utf-8'));\n settings = {\n onboarding: { ...DEFAULTS.onboarding, ...raw.onboarding },\n models: { ...DEFAULTS.models, ...raw.models },\n preferences: parsePreferences(raw.preferences),\n storage: {\n ...STORAGE_DEFAULTS,\n ...raw.storage,\n libsql: { ...STORAGE_DEFAULTS.libsql, ...raw.storage?.libsql },\n pg: { ...STORAGE_DEFAULTS.pg, ...raw.storage?.pg },\n },\n customModelPacks: Array.isArray(raw.customModelPacks) ? raw.customModelPacks : [],\n customProviders: parseCustomProviders(raw.customProviders),\n modelUseCounts: raw.modelUseCounts && typeof raw.modelUseCounts === 'object' ? raw.modelUseCounts : {},\n updateDismissedVersion: typeof raw.updateDismissedVersion === 'string' ? raw.updateDismissedVersion : null,\n lsp: raw.lsp && typeof raw.lsp === 'object' ? (raw.lsp as LSPConfig) : undefined,\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\nconst LEGACY_VARIED_MODELS: Record<string, string> = {\n plan: 'openai/gpt-5.3-codex',\n build: 'anthropic/claude-sonnet-4-5',\n fast: 'anthropic/claude-haiku-4-5',\n};\n\nexport function migrateLegacyVariedPack(settings: GlobalSettings): boolean {\n const legacyPackId = 'varied';\n const customPackId = 'custom:varied';\n const hasLegacyReference =\n settings.models.activeModelPackId === legacyPackId || settings.onboarding.modePackId === legacyPackId;\n\n if (!hasLegacyReference) return false;\n\n const existingIdx = settings.customModelPacks.findIndex(p => p.name === 'varied');\n if (existingIdx >= 0) {\n const existing = settings.customModelPacks[existingIdx]!;\n const modelsMatch = Object.entries(LEGACY_VARIED_MODELS).every(([k, v]) => existing.models[k] === v);\n if (!modelsMatch) {\n existing.models = { ...LEGACY_VARIED_MODELS };\n }\n } else {\n settings.customModelPacks.push({\n name: 'varied',\n models: { ...LEGACY_VARIED_MODELS },\n createdAt: new Date().toISOString(),\n });\n }\n\n if (settings.models.activeModelPackId === legacyPackId) {\n settings.models.activeModelPackId = customPackId;\n if (Object.keys(settings.models.modeDefaults).length === 0) {\n settings.models.modeDefaults = { ...LEGACY_VARIED_MODELS };\n }\n }\n\n if (settings.onboarding.modePackId === legacyPackId) {\n settings.onboarding.modePackId = customPackId;\n }\n\n return true;\n}\n\nexport function loadSettings(filePath: string = getSettingsPath()): GlobalSettings {\n // One-time migration: move model data from auth.json into settings.json\n migrateFromAuth(filePath);\n\n if (!existsSync(filePath)) return structuredClone(DEFAULTS);\n try {\n const raw = JSON.parse(readFileSync(filePath, 'utf-8'));\n // Spread raw first to preserve unknown top-level keys (forward-compatibility),\n // then overlay with parsed/typed fields so known keys are always correct.\n const settings: GlobalSettings = {\n ...raw,\n onboarding: { ...DEFAULTS.onboarding, ...raw.onboarding },\n models: { ...DEFAULTS.models, ...raw.models },\n preferences: parsePreferences(raw.preferences),\n storage: {\n ...STORAGE_DEFAULTS,\n ...raw.storage,\n libsql: { ...STORAGE_DEFAULTS.libsql, ...raw.storage?.libsql },\n pg: { ...STORAGE_DEFAULTS.pg, ...raw.storage?.pg },\n },\n customModelPacks: Array.isArray(raw.customModelPacks) ? raw.customModelPacks : [],\n customProviders: parseCustomProviders(raw.customProviders),\n modelUseCounts: raw.modelUseCounts && typeof raw.modelUseCounts === 'object' ? raw.modelUseCounts : {},\n updateDismissedVersion: typeof raw.updateDismissedVersion === 'string' ? raw.updateDismissedVersion : null,\n lsp: raw.lsp && typeof raw.lsp === 'object' ? (raw.lsp as LSPConfig) : undefined,\n };\n\n // Migrate legacy omModelId → omModelOverride\n let settingsChanged = false;\n if (raw.models?.omModelId && !settings.models.omModelOverride) {\n settings.models.omModelOverride = raw.models.omModelId;\n settingsChanged = true;\n }\n\n if (migrateLegacyVariedPack(settings)) {\n settingsChanged = true;\n }\n\n if (settingsChanged) {\n saveSettings(settings, filePath);\n }\n\n return settings;\n } catch {\n return structuredClone(DEFAULTS);\n }\n}\n\nexport function loadSettingsCached(filePath: string = getSettingsPath()): GlobalSettings {\n const cached = settingsCache.get(filePath);\n if (cached) {\n return cloneSettings(cached);\n }\n\n const settings = loadSettings(filePath);\n settingsCache.set(filePath, cloneSettings(settings));\n return cloneSettings(settings);\n}\n\nexport function invalidateSettingsCache(filePath?: string): void {\n if (filePath) {\n settingsCache.delete(filePath);\n return;\n }\n\n settingsCache.clear();\n}\n\nexport const THREAD_ACTIVE_MODEL_PACK_ID_KEY = 'activeModelPackId';\n\nexport interface ThreadSettings {\n activeModelPackId: string | null;\n modeModelIds: Record<string, string>;\n}\n\nexport function parseThreadSettings(metadata: Record<string, unknown> | undefined): ThreadSettings {\n const modeModelIds: Record<string, string> = {};\n for (const [key, value] of Object.entries(metadata ?? {})) {\n const modeMatch = key.match(/^modeModelId_(.+)$/);\n if (modeMatch?.[1] && typeof value === 'string' && value.length > 0) {\n modeModelIds[modeMatch[1]] = value;\n }\n }\n\n const rawPackId = metadata?.[THREAD_ACTIVE_MODEL_PACK_ID_KEY];\n const activeModelPackId = typeof rawPackId === 'string' && rawPackId.length > 0 ? rawPackId : null;\n\n return {\n activeModelPackId,\n modeModelIds,\n };\n}\n\n/**\n * Resolve active model pack id for the current thread.\n *\n * Priority:\n * 1) explicit thread metadata activeModelPackId\n * 2) inferred from thread modeModelId_* values\n * 3) global settings.models.activeModelPackId\n */\nexport function resolveThreadActiveModelPackId(\n settings: GlobalSettings,\n builtinPacks: Array<{ id: string; models: Record<string, string> }>,\n metadata: Record<string, unknown> | undefined,\n): string | null {\n const threadSettings = parseThreadSettings(metadata);\n\n const isKnownPack = (packId: string): boolean => {\n if (packId.startsWith('custom:')) {\n const name = packId.slice('custom:'.length);\n return settings.customModelPacks.some(p => p.name === name);\n }\n return builtinPacks.some(p => p.id === packId);\n };\n\n if (threadSettings.activeModelPackId && isKnownPack(threadSettings.activeModelPackId)) {\n return threadSettings.activeModelPackId;\n }\n\n const allPacks: Array<{ id: string; models: Record<string, string> }> = [\n ...builtinPacks,\n ...settings.customModelPacks.map(p => ({ id: `custom:${p.name}`, models: p.models })),\n ];\n\n for (const pack of allPacks) {\n const packEntries = Object.entries(pack.models);\n const threadEntries = Object.keys(threadSettings.modeModelIds);\n const matches =\n packEntries.length === threadEntries.length &&\n packEntries.every(([modeId, modelId]) => threadSettings.modeModelIds[modeId] === modelId);\n if (matches) return pack.id;\n }\n\n if (settings.models.activeModelPackId && isKnownPack(settings.models.activeModelPackId)) {\n return settings.models.activeModelPackId;\n }\n\n return null;\n}\n\n/**\n * Resolve effective per-mode model defaults.\n *\n * If `activeModelPackId` is set, looks up the pack (built-in or custom) and\n * returns its models. Falls back to the explicit `modeDefaults` map.\n *\n * @param settings The loaded global settings.\n * @param builtinPacks Built-in packs for the current provider access\n * (from `getAvailableModePacks`). Pass `[]` if unavailable.\n */\nexport function resolveModelDefaults(\n settings: GlobalSettings,\n builtinPacks: Array<{ id: string; models: Record<string, string> }>,\n): Record<string, string> {\n const { activeModelPackId, modeDefaults } = settings.models;\n if (!activeModelPackId) return modeDefaults;\n\n // Custom pack: \"custom:<name>\"\n if (activeModelPackId.startsWith('custom:')) {\n const name = activeModelPackId.slice('custom:'.length);\n const pack = settings.customModelPacks.find(p => p.name === name);\n if (pack) return pack.models;\n // Custom pack was deleted — fall through to modeDefaults\n return modeDefaults;\n }\n\n // Built-in pack\n const builtin = builtinPacks.find(p => p.id === activeModelPackId);\n if (builtin) return builtin.models;\n\n // Unknown pack id — fall through\n return modeDefaults;\n}\n\n/**\n * Resolve the effective 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 settingsCache.set(filePath, cloneSettings(settings));\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 try {\n this.connection.sendNotification('initialized', {});\n } catch {\n return;\n }\n\n // Send workspace/didChangeConfiguration with initialization options like OpenCode\n try {\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 } catch {\n // Server exited between initialize and configuration notification.\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","/**\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 { 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\nfunction resolveLocalBin(binName: string, baseDir: string = process.cwd()): string {\n const binDir = join(baseDir, 'node_modules', '.bin');\n const windowsPath = join(binDir, `${binName}.cmd`);\n const defaultPath = join(binDir, binName);\n\n if (process.platform === 'win32' && existsSync(windowsPath)) {\n return windowsPath;\n }\n\n return defaultPath;\n}\n\n/**\n * LSP Server definition and spawning logic\n */\nexport interface LSPServerInfo {\n id: string;\n name: string;\n languageIds: string[];\n installHint?: 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 installHint: 'Install typescript-language-server for TypeScript LSP support',\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 // Only use an installed local language server. Falling back to npx here\n // makes prewarm noisy and unreliable in package workspaces where the\n // binary is not declared.\n const localBin = resolveLocalBin('typescript-language-server', root);\n const cwdBin = resolveLocalBin('typescript-language-server');\n let tslsBinary: string | undefined;\n if (existsSync(localBin)) {\n tslsBinary = localBin;\n } else if (existsSync(cwdBin)) {\n tslsBinary = cwdBin;\n }\n\n if (!tslsBinary) {\n return undefined;\n }\n\n const proc = spawn(tslsBinary, ['--stdio'], {\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 installHint: 'Install eslint-lsp for ESLint diagnostics',\n root: (cwd: string) =>\n findNearestRoot(cwd, ['package.json', '.eslintrc.js', '.eslintrc.json', '.eslintrc.yml', '.eslintrc.yaml']),\n spawn: (root: string) => {\n const binaryPath = resolveLocalBin('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 installHint: 'Install pyright for Python LSP support',\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 = resolveLocalBin('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 installHint: 'Install gopls for Go LSP support',\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 installHint: 'Install rust-analyzer for Rust LSP support',\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';\nimport { logRuntimeProfile } from '../utils/debug-log.js';\nimport path from 'node:path';\n\nconst LSP_INIT_TIMEOUT_MS = 15_000;\nconst LSP_FAILURE_COOLDOWN_MS = 30_000;\n\ntype LSPClientStatus =\n | { state: 'idle' }\n | { state: 'initializing'; startedAt: number }\n | { state: 'ready'; readyAt: number; durationMs?: number }\n | { state: 'failed'; failedAt: number; durationMs?: number; error: string };\n\ntype LSPStatusListener = () => void;\ntype UnavailableServerInfo = {\n serverName: string;\n installHint?: string;\n};\n\n/**\n * Singleton LSP client manager that keeps clients alive and reuses them\n * across tool calls for better performance and accuracy\n */\nexport class LSPManager {\n private clients: Map<string, LSPClient> = new Map();\n private initializationPromises: Map<string, Promise<void>> = new Map();\n private clientStatuses: Map<string, LSPClientStatus> = new Map();\n private unavailableServers: Map<string, UnavailableServerInfo> = new Map();\n private statusListeners: Set<LSPStatusListener> = new Set();\n\n private emitStatusChange(): void {\n for (const listener of this.statusListeners) {\n listener();\n }\n }\n\n private setClientStatus(key: string, status: LSPClientStatus): void {\n this.clientStatuses.set(key, status);\n this.emitStatusChange();\n }\n\n private getClientKey(filePath: string, workspaceRoot: string): { key: string; serverInfo?: ReturnType<typeof getServersForFile>[number] } {\n const servers = getServersForFile(filePath, workspaceRoot);\n if (servers.length === 0) {\n return { key: '' };\n }\n\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\n if (!serverInfo) {\n return { key: '' };\n }\n\n return {\n key: `${serverInfo.name}:${workspaceRoot}`,\n serverInfo,\n };\n }\n\n private isInFailureCooldown(key: string): boolean {\n const status = this.clientStatuses.get(key);\n return status?.state === 'failed' && Date.now() - status.failedAt < LSP_FAILURE_COOLDOWN_MS;\n }\n\n private async initializeClient(key: string, serverInfo: NonNullable<ReturnType<LSPManager['getClientKey']>['serverInfo']>, workspaceRoot: string): Promise<void> {\n const startedAt = Date.now();\n this.unavailableServers.delete(key);\n this.setClientStatus(key, { state: 'initializing', startedAt });\n\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')), LSP_INIT_TIMEOUT_MS),\n ),\n ]);\n const durationMs = Date.now() - startedAt;\n this.setClientStatus(key, { state: 'ready', readyAt: Date.now(), durationMs });\n logRuntimeProfile('lsp.initialize', durationMs, {\n key,\n status: 'ready',\n });\n } catch (error) {\n const durationMs = Date.now() - startedAt;\n const message = error instanceof Error ? error.message : String(error);\n this.clients.delete(key);\n if (message === 'Failed to spawn LSP server') {\n this.clientStatuses.delete(key);\n this.unavailableServers.set(key, {\n serverName: serverInfo.name,\n installHint: serverInfo.installHint,\n });\n this.emitStatusChange();\n logRuntimeProfile('lsp.initialize', durationMs, {\n key,\n status: 'unavailable',\n });\n return;\n }\n\n this.setClientStatus(key, {\n state: 'failed',\n failedAt: Date.now(),\n durationMs,\n error: message,\n });\n logRuntimeProfile('lsp.initialize', durationMs, {\n key,\n status: 'failed',\n error: message,\n });\n throw error;\n } finally {\n this.initializationPromises.delete(key);\n }\n }\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 { key, serverInfo } = this.getClientKey(filePath, workspaceRoot);\n if (!serverInfo || !key) {\n return null;\n }\n\n // Return existing client if available\n if (this.clients.has(key)) {\n return this.clients.get(key)!;\n }\n\n if (this.isInFailureCooldown(key)) {\n return null;\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 try {\n await this.initializeClient(key, serverInfo, workspaceRoot);\n return this.clients.get(key) || null;\n } catch {\n return null;\n }\n }\n\n prewarmClient(filePath: string, workspaceRoot: string): void {\n const { key, serverInfo } = this.getClientKey(filePath, workspaceRoot);\n if (!serverInfo || !key || this.clients.has(key) || this.initializationPromises.has(key) || this.isInFailureCooldown(key)) {\n return;\n }\n\n void this.initializeClient(key, serverInfo, workspaceRoot).catch(() => {});\n }\n\n getClientStatus(filePath: string, workspaceRoot: string): LSPClientStatus {\n const { key } = this.getClientKey(filePath, workspaceRoot);\n if (!key) return { state: 'idle' };\n return this.clientStatuses.get(key) ?? { state: 'idle' };\n }\n\n getInitializingClientCount(): number {\n let count = 0;\n for (const status of this.clientStatuses.values()) {\n if (status.state === 'initializing') {\n count += 1;\n }\n }\n return count;\n }\n\n getUnavailableClientCount(): number {\n return this.unavailableServers.size;\n }\n\n getUnavailableStatusHint(): string | null {\n const unavailable = Array.from(this.unavailableServers.values());\n if (unavailable.length === 0) {\n return null;\n }\n\n const first = unavailable[0];\n if (unavailable.length === 1) {\n return first?.installHint ?? `${first?.serverName} unavailable`;\n }\n\n return `${first?.installHint ?? `${first?.serverName} unavailable`} (+${unavailable.length - 1} more)`;\n }\n\n subscribeStatusChange(listener: LSPStatusListener): () => void {\n this.statusListeners.add(listener);\n return () => {\n this.statusListeners.delete(listener);\n };\n }\n\n prewarmWorkspace(workspaceRoot: string): void {\n const candidates = ['index.ts', 'index.js', 'main.py', 'main.go', 'main.rs'];\n for (const candidate of candidates) {\n const filePath = path.join(workspaceRoot, candidate);\n const { serverInfo } = this.getClientKey(filePath, workspaceRoot);\n if (serverInfo) {\n this.prewarmClient(filePath, workspaceRoot);\n return;\n }\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 this.clientStatuses.delete(key);\n this.unavailableServers.delete(key);\n this.emitStatusChange();\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 this.clientStatuses.clear();\n this.unavailableServers.clear();\n this.emitStatusChange();\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","/**\n * Onboarding \"packs\" — predefined model configurations for each mode.\n *\n * Each pack assigns a default model to every configured mode,\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: Record<string, string>;\n}\n\nexport interface ModePackOption {\n id: string;\n label: string;\n color?: string;\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 [provider: string]: ProviderAccessLevel;\n}\n\n// ---------------------------------------------------------------------------\n// Mode Packs\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_PACK_MODE_IDS = ['plan', 'build', 'fast'] as const;\nconst MODE_PRIORITY = ['plan', 'build', 'fast', 'ask'] as const;\n\nfunction sortModeIds(modeIds: string[]): string[] {\n return [...modeIds].sort((left, right) => {\n const leftPriority = MODE_PRIORITY.indexOf(left as (typeof MODE_PRIORITY)[number]);\n const rightPriority = MODE_PRIORITY.indexOf(right as (typeof MODE_PRIORITY)[number]);\n const leftRank = leftPriority === -1 ? Number.MAX_SAFE_INTEGER : leftPriority;\n const rightRank = rightPriority === -1 ? Number.MAX_SAFE_INTEGER : rightPriority;\n if (leftRank !== rightRank) return leftRank - rightRank;\n return left.localeCompare(right);\n });\n}\n\nexport function getModePackOptions(\n modeDefinitions: Array<{ id: string; name?: string; color?: string }> = [],\n): ModePackOption[] {\n if (modeDefinitions.length === 0) {\n return DEFAULT_PACK_MODE_IDS.map(id => ({ id, label: id }));\n }\n\n const seen = new Set<string>();\n const modes = modeDefinitions\n .map(definition => ({\n id: definition.id.trim(),\n label: definition.name?.trim() || definition.id.trim(),\n color: definition.color?.trim(),\n }))\n .filter(mode => {\n if (!mode.id || seen.has(mode.id)) return false;\n seen.add(mode.id);\n return true;\n });\n\n return sortModeIds(modes.map(mode => mode.id))\n .map(id => modes.find(mode => mode.id === id)!)\n .filter(Boolean);\n}\n\nfunction firstAssignedModel(models: Record<string, string>): string {\n for (const modeId of MODE_PRIORITY) {\n const modelId = models[modeId];\n if (modelId) return modelId;\n }\n\n for (const modelId of Object.values(models)) {\n if (modelId) return modelId;\n }\n\n return '';\n}\n\nfunction getFallbackModelForMode(modeId: string, models: Record<string, string>): string {\n const candidatesByMode: Record<string, string[]> = {\n ask: ['ask', 'fast', 'plan', 'build'],\n fast: ['fast', 'ask', 'plan', 'build'],\n plan: ['plan', 'build', 'fast', 'ask'],\n build: ['build', 'plan', 'fast', 'ask'],\n };\n\n for (const candidate of candidatesByMode[modeId] ?? [modeId, 'fast', 'ask', 'plan', 'build']) {\n const modelId = models[candidate];\n if (modelId) return modelId;\n }\n\n return firstAssignedModel(models);\n}\n\nexport function expandPackModels(\n models: Record<string, string>,\n modeIds: string[],\n options?: { fillMissing?: boolean },\n): Record<string, string> {\n const expanded: Record<string, string> = { ...models };\n\n for (const modeId of modeIds) {\n if (expanded[modeId]) continue;\n expanded[modeId] = options?.fillMissing ? getFallbackModelForMode(modeId, expanded) : '';\n }\n\n return expanded;\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 modeDefinitions: Array<{ id: string; name?: string; color?: string }> = [],\n): ModePack[] {\n const packs: ModePack[] = [];\n const modeIds = getModePackOptions(modeDefinitions).map(mode => mode.id);\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 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: expandPackModels({\n build: anthropicBuild,\n plan: anthropicBuild,\n fast: 'anthropic/claude-haiku-4-5',\n }, modeIds, { fillMissing: true }),\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: expandPackModels({\n build: openaiCodex,\n plan: openaiCodex,\n fast: 'openai/gpt-5.1-codex-mini',\n }, modeIds, { fillMissing: true }),\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: expandPackModels(cp.models, modeIds, { fillMissing: true }),\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: expandPackModels({}, modeIds),\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 * 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"]}
@@ -0,0 +1,148 @@
1
+ 'use strict';
2
+
3
+ var workspace = require('@mastra/core/workspace');
4
+
5
+ // src/tool-names.ts
6
+ var MC_TOOLS = {
7
+ // Filesystem
8
+ VIEW: "view",
9
+ WRITE_FILE: "write_file",
10
+ STRING_REPLACE_LSP: "string_replace_lsp",
11
+ FIND_FILES: "find_files",
12
+ DELETE_FILE: "delete_file",
13
+ FILE_STAT: "file_stat",
14
+ MKDIR: "mkdir",
15
+ // Search
16
+ SEARCH_CONTENT: "search_content",
17
+ // Code intelligence
18
+ AST_SMART_EDIT: "ast_smart_edit",
19
+ // Sandbox
20
+ EXECUTE_COMMAND: "execute_command",
21
+ GET_PROCESS_OUTPUT: "get_process_output",
22
+ KILL_PROCESS: "kill_process"
23
+ };
24
+ var TOOL_NAME_OVERRIDES = {
25
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.READ_FILE]: { name: MC_TOOLS.VIEW },
26
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.WRITE_FILE]: { name: MC_TOOLS.WRITE_FILE },
27
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.EDIT_FILE]: { name: MC_TOOLS.STRING_REPLACE_LSP },
28
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.LIST_FILES]: { name: MC_TOOLS.FIND_FILES },
29
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.DELETE]: { name: MC_TOOLS.DELETE_FILE },
30
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.FILE_STAT]: { name: MC_TOOLS.FILE_STAT },
31
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.MKDIR]: { name: MC_TOOLS.MKDIR },
32
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.GREP]: { name: MC_TOOLS.SEARCH_CONTENT },
33
+ [workspace.WORKSPACE_TOOLS.FILESYSTEM.AST_EDIT]: { name: MC_TOOLS.AST_SMART_EDIT },
34
+ [workspace.WORKSPACE_TOOLS.SANDBOX.EXECUTE_COMMAND]: { name: MC_TOOLS.EXECUTE_COMMAND },
35
+ [workspace.WORKSPACE_TOOLS.SANDBOX.GET_PROCESS_OUTPUT]: { name: MC_TOOLS.GET_PROCESS_OUTPUT },
36
+ [workspace.WORKSPACE_TOOLS.SANDBOX.KILL_PROCESS]: { name: MC_TOOLS.KILL_PROCESS }
37
+ };
38
+
39
+ // src/permissions.ts
40
+ var TOOL_CATEGORIES = {
41
+ read: {
42
+ label: "Read",
43
+ description: "Read files, search, list directories"
44
+ },
45
+ edit: {
46
+ label: "Edit",
47
+ description: "Create, modify, or delete files"
48
+ },
49
+ execute: {
50
+ label: "Execute",
51
+ description: "Run shell commands"
52
+ },
53
+ mcp: {
54
+ label: "MCP",
55
+ description: "External MCP server tools"
56
+ }
57
+ };
58
+ var TOOL_CATEGORY_MAP = {
59
+ // Read-only tools — always safe
60
+ [MC_TOOLS.VIEW]: "read",
61
+ [MC_TOOLS.SEARCH_CONTENT]: "read",
62
+ [MC_TOOLS.FIND_FILES]: "read",
63
+ web_search: "read",
64
+ "web-search": "read",
65
+ web_extract: "read",
66
+ "web-extract": "read",
67
+ // Edit tools — modify files
68
+ [MC_TOOLS.STRING_REPLACE_LSP]: "edit",
69
+ [MC_TOOLS.AST_SMART_EDIT]: "edit",
70
+ [MC_TOOLS.WRITE_FILE]: "edit",
71
+ subagent: "edit",
72
+ // Execute tools — run arbitrary commands
73
+ [MC_TOOLS.EXECUTE_COMMAND]: "execute"
74
+ // Interactive / planning tools — always allowed (no category needed)
75
+ // ask_user, task_write, task_check, submit_plan, request_access
76
+ };
77
+ var ALWAYS_ALLOW_TOOLS = /* @__PURE__ */ new Set(["ask_user", "task_write", "task_check", "submit_plan", "request_access"]);
78
+ function getToolCategory(toolName) {
79
+ if (ALWAYS_ALLOW_TOOLS.has(toolName)) return null;
80
+ return TOOL_CATEGORY_MAP[toolName] ?? "mcp";
81
+ }
82
+ function getToolsForCategory(category) {
83
+ return Object.entries(TOOL_CATEGORY_MAP).filter(([, cat]) => cat === category).map(([tool]) => tool);
84
+ }
85
+ var DEFAULT_POLICIES = {
86
+ read: "allow",
87
+ edit: "ask",
88
+ execute: "ask",
89
+ mcp: "ask"
90
+ };
91
+ var YOLO_POLICIES = {
92
+ read: "allow",
93
+ edit: "allow",
94
+ execute: "allow",
95
+ mcp: "allow"
96
+ };
97
+ function createDefaultRules() {
98
+ return {
99
+ categories: { ...DEFAULT_POLICIES },
100
+ tools: {}
101
+ };
102
+ }
103
+ var SessionGrants = class {
104
+ grantedCategories = /* @__PURE__ */ new Set();
105
+ grantedTools = /* @__PURE__ */ new Set();
106
+ allowCategory(category) {
107
+ this.grantedCategories.add(category);
108
+ }
109
+ allowTool(toolName) {
110
+ this.grantedTools.add(toolName);
111
+ }
112
+ isGranted(toolName, category) {
113
+ return this.grantedTools.has(toolName) || this.grantedCategories.has(category);
114
+ }
115
+ reset() {
116
+ this.grantedCategories.clear();
117
+ this.grantedTools.clear();
118
+ }
119
+ getGrantedCategories() {
120
+ return [...this.grantedCategories];
121
+ }
122
+ getGrantedTools() {
123
+ return [...this.grantedTools];
124
+ }
125
+ };
126
+ function resolveApproval(toolName, rules, sessionGrants) {
127
+ const category = getToolCategory(toolName);
128
+ if (category === null) return "allow";
129
+ const toolPolicy = rules.tools[toolName];
130
+ if (toolPolicy) return toolPolicy;
131
+ if (sessionGrants.isGranted(toolName, category)) return "allow";
132
+ const categoryPolicy = rules.categories[category];
133
+ if (categoryPolicy) return categoryPolicy;
134
+ return DEFAULT_POLICIES[category] ?? "ask";
135
+ }
136
+
137
+ exports.DEFAULT_POLICIES = DEFAULT_POLICIES;
138
+ exports.MC_TOOLS = MC_TOOLS;
139
+ exports.SessionGrants = SessionGrants;
140
+ exports.TOOL_CATEGORIES = TOOL_CATEGORIES;
141
+ exports.TOOL_NAME_OVERRIDES = TOOL_NAME_OVERRIDES;
142
+ exports.YOLO_POLICIES = YOLO_POLICIES;
143
+ exports.createDefaultRules = createDefaultRules;
144
+ exports.getToolCategory = getToolCategory;
145
+ exports.getToolsForCategory = getToolsForCategory;
146
+ exports.resolveApproval = resolveApproval;
147
+ //# sourceMappingURL=chunk-R6JK3DE3.cjs.map
148
+ //# sourceMappingURL=chunk-R6JK3DE3.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tool-names.ts","../src/permissions.ts"],"names":["WORKSPACE_TOOLS"],"mappings":"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","file":"chunk-R6JK3DE3.cjs","sourcesContent":["/**\n * Mastracode tool name constants.\n *\n * These are the names exposed to the LLM via workspace tool name remapping.\n * Used throughout mastracode for permissions, TUI rendering, tool guidance,\n * subagent allowedTools, etc.\n *\n * The workspace tools get remapped from their core names (e.g. `mastra_workspace_read_file`)\n * to these names (e.g. `view`) via the `name` property in workspace tool config.\n */\n\nimport { WORKSPACE_TOOLS } from '@mastra/core/workspace';\n\nexport const MC_TOOLS = {\n // Filesystem\n VIEW: 'view',\n WRITE_FILE: 'write_file',\n STRING_REPLACE_LSP: 'string_replace_lsp',\n FIND_FILES: 'find_files',\n DELETE_FILE: 'delete_file',\n FILE_STAT: 'file_stat',\n MKDIR: 'mkdir',\n\n // Search\n SEARCH_CONTENT: 'search_content',\n\n // Code intelligence\n AST_SMART_EDIT: 'ast_smart_edit',\n\n // Sandbox\n EXECUTE_COMMAND: 'execute_command',\n GET_PROCESS_OUTPUT: 'get_process_output',\n KILL_PROCESS: 'kill_process',\n} as const;\n\n/**\n * Workspace tool name remapping config.\n * Maps core workspace tool constants to mastracode's tool names.\n * Pass this (or spread it) into `Workspace({ tools: ... })`.\n */\nexport const TOOL_NAME_OVERRIDES = {\n [WORKSPACE_TOOLS.FILESYSTEM.READ_FILE]: { name: MC_TOOLS.VIEW },\n [WORKSPACE_TOOLS.FILESYSTEM.WRITE_FILE]: { name: MC_TOOLS.WRITE_FILE },\n [WORKSPACE_TOOLS.FILESYSTEM.EDIT_FILE]: { name: MC_TOOLS.STRING_REPLACE_LSP },\n [WORKSPACE_TOOLS.FILESYSTEM.LIST_FILES]: { name: MC_TOOLS.FIND_FILES },\n [WORKSPACE_TOOLS.FILESYSTEM.DELETE]: { name: MC_TOOLS.DELETE_FILE },\n [WORKSPACE_TOOLS.FILESYSTEM.FILE_STAT]: { name: MC_TOOLS.FILE_STAT },\n [WORKSPACE_TOOLS.FILESYSTEM.MKDIR]: { name: MC_TOOLS.MKDIR },\n [WORKSPACE_TOOLS.FILESYSTEM.GREP]: { name: MC_TOOLS.SEARCH_CONTENT },\n [WORKSPACE_TOOLS.FILESYSTEM.AST_EDIT]: { name: MC_TOOLS.AST_SMART_EDIT },\n [WORKSPACE_TOOLS.SANDBOX.EXECUTE_COMMAND]: { name: MC_TOOLS.EXECUTE_COMMAND },\n [WORKSPACE_TOOLS.SANDBOX.GET_PROCESS_OUTPUT]: { name: MC_TOOLS.GET_PROCESS_OUTPUT },\n [WORKSPACE_TOOLS.SANDBOX.KILL_PROCESS]: { name: MC_TOOLS.KILL_PROCESS },\n} as const;\n","/**\n * Granular tool permission system.\n *\n * Tools are classified into categories by risk level.\n * Each category has a configurable policy: \"allow\", \"ask\", or \"deny\".\n * Session-scoped grants let the user approve a category once per session.\n */\n\nimport { MC_TOOLS } from './tool-names.js';\n\n// ---------------------------------------------------------------------------\n// Categories\n// ---------------------------------------------------------------------------\n\nexport type ToolCategory = 'read' | 'edit' | 'execute' | 'mcp';\n\nexport const TOOL_CATEGORIES: Record<ToolCategory, { label: string; description: string }> = {\n read: {\n label: 'Read',\n description: 'Read files, search, list directories',\n },\n edit: {\n label: 'Edit',\n description: 'Create, modify, or delete files',\n },\n execute: {\n label: 'Execute',\n description: 'Run shell commands',\n },\n mcp: {\n label: 'MCP',\n description: 'External MCP server tools',\n },\n};\n\n// ---------------------------------------------------------------------------\n// Tool → Category mapping\n// ---------------------------------------------------------------------------\n\nconst TOOL_CATEGORY_MAP: Record<string, ToolCategory> = {\n // Read-only tools — always safe\n [MC_TOOLS.VIEW]: 'read',\n [MC_TOOLS.SEARCH_CONTENT]: 'read',\n [MC_TOOLS.FIND_FILES]: 'read',\n web_search: 'read',\n 'web-search': 'read',\n web_extract: 'read',\n 'web-extract': 'read',\n // Edit tools — modify files\n [MC_TOOLS.STRING_REPLACE_LSP]: 'edit',\n [MC_TOOLS.AST_SMART_EDIT]: 'edit',\n [MC_TOOLS.WRITE_FILE]: 'edit',\n subagent: 'edit',\n\n // Execute tools — run arbitrary commands\n [MC_TOOLS.EXECUTE_COMMAND]: 'execute',\n\n // Interactive / planning tools — always allowed (no category needed)\n // ask_user, task_write, task_check, submit_plan, request_access\n};\n\n// Tools that never need approval regardless of policy\nconst ALWAYS_ALLOW_TOOLS = new Set(['ask_user', 'task_write', 'task_check', 'submit_plan', 'request_access']);\n\n/**\n * Get the category for a tool, or null if the tool is always-allowed.\n */\nexport function getToolCategory(toolName: string): ToolCategory | null {\n if (ALWAYS_ALLOW_TOOLS.has(toolName)) return null;\n return TOOL_CATEGORY_MAP[toolName] ?? 'mcp';\n}\n\n/**\n * Get the list of known tools for a given category.\n */\nexport function getToolsForCategory(category: ToolCategory): string[] {\n return Object.entries(TOOL_CATEGORY_MAP)\n .filter(([, cat]) => cat === category)\n .map(([tool]) => tool);\n}\n\n// ---------------------------------------------------------------------------\n// Policies\n// ---------------------------------------------------------------------------\n\nexport type PermissionPolicy = 'allow' | 'ask' | 'deny';\n\nexport interface PermissionRules {\n /** Policy per category. Missing categories default to their DEFAULT_POLICIES value. */\n categories: Partial<Record<ToolCategory, PermissionPolicy>>;\n /** Per-tool overrides. Tool name → policy. Takes precedence over category. */\n tools: Record<string, PermissionPolicy>;\n}\n\n/** Default policies when no rules are configured (YOLO=false equivalent). */\nexport const DEFAULT_POLICIES: Record<ToolCategory, PermissionPolicy> = {\n read: 'allow',\n edit: 'ask',\n execute: 'ask',\n mcp: 'ask',\n};\n\n/** YOLO-mode policies — everything auto-allowed. */\nexport const YOLO_POLICIES: Record<ToolCategory, PermissionPolicy> = {\n read: 'allow',\n edit: 'allow',\n execute: 'allow',\n mcp: 'allow',\n};\n\nexport function createDefaultRules(): PermissionRules {\n return {\n categories: { ...DEFAULT_POLICIES },\n tools: {},\n };\n}\n\n// ---------------------------------------------------------------------------\n// Session grants — temporary \"always allow\" for this session\n// ---------------------------------------------------------------------------\n\nexport class SessionGrants {\n private grantedCategories = new Set<ToolCategory>();\n private grantedTools = new Set<string>();\n\n allowCategory(category: ToolCategory): void {\n this.grantedCategories.add(category);\n }\n\n allowTool(toolName: string): void {\n this.grantedTools.add(toolName);\n }\n\n isGranted(toolName: string, category: ToolCategory): boolean {\n return this.grantedTools.has(toolName) || this.grantedCategories.has(category);\n }\n\n reset(): void {\n this.grantedCategories.clear();\n this.grantedTools.clear();\n }\n\n getGrantedCategories(): ToolCategory[] {\n return [...this.grantedCategories];\n }\n\n getGrantedTools(): string[] {\n return [...this.grantedTools];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Decision engine\n// ---------------------------------------------------------------------------\n\nexport type ApprovalDecision = 'allow' | 'ask' | 'deny';\n\n/**\n * Determine whether a tool call should be allowed, prompted, or denied.\n *\n * Priority order:\n * 1. Always-allowed tools (ask_user, task_write, etc.) → allow\n * 2. Per-tool policy override → use that policy\n * 3. Session grants (user said \"always allow\" during this session) → allow\n * 4. Category policy → use that policy\n * 5. Fallback → \"ask\"\n */\nexport function resolveApproval(\n toolName: string,\n rules: PermissionRules,\n sessionGrants: SessionGrants,\n): ApprovalDecision {\n // 1. Always-allowed tools\n const category = getToolCategory(toolName);\n if (category === null) return 'allow';\n\n // 2. Per-tool override\n const toolPolicy = rules.tools[toolName];\n if (toolPolicy) return toolPolicy;\n\n // 3. Session grants\n if (sessionGrants.isGranted(toolName, category)) return 'allow';\n\n // 4. Category policy\n const categoryPolicy = rules.categories[category];\n if (categoryPolicy) return categoryPolicy;\n\n // 5. Default policy for category\n return DEFAULT_POLICIES[category] ?? 'ask';\n}\n"]}