shark-ai 0.4.22 → 0.4.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/error/crash-handler.ts","../../src/bin/shark.ts","../../src/commands/init.ts","../../src/core/workflow/workflow-manager.ts","../../src/core/workflow/shark-workflow.schema.ts","../../src/commands/dev.ts","../../src/core/agents/agent-response-parser.ts","../../src/core/api/stackspot-client.ts","../../src/core/api/sse-client.ts","../../src/core/auth/get-active-realm.ts","../../src/core/api/prompts.ts","../../src/core/api/stackspot-provider.ts","../../src/core/workflow/history-manager.ts","../../src/core/api/openai-compatible-provider.ts","../../src/core/api/provider-resolver.ts","../../src/core/workflow/conversation-manager.ts","../../src/core/workflow/anchor-state-manager.ts","../../src/core/agents/developer-agent.ts","../../src/core/agents/agent-tools.ts","../../src/core/ast-editing/editors/code-editor-factory.ts","../../src/core/ast-editing/editors/typescript-editor.ts","../../src/core/workflow/skill-manager.ts","../../src/core/workflow/subagent-manager.ts","../../src/core/workflow/message-queue.ts","../../src/commands/legacy.ts","../../src/core/agents/legacy-developer-agent.ts","../../src/core/workflow/task-manager.ts","../../src/core/agents/specification-agent.ts","../../src/commands/export-schema.ts","../../src/commands/export-prompt.ts","../../src/commands/super.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { colors } from '../../ui/colors.js';\n\nexport class CrashHandler {\n private static instance: CrashHandler;\n private readonly logDir: string;\n\n private constructor() {\n this.logDir = path.join(os.homedir(), '.shark', 'logs');\n }\n\n public static getInstance(): CrashHandler {\n if (!CrashHandler.instance) {\n CrashHandler.instance = new CrashHandler();\n }\n return CrashHandler.instance;\n }\n\n public init(): void {\n process.on('uncaughtException', (error) => this.handleError(error, 'Uncaught Exception'));\n process.on('unhandledRejection', (reason) => this.handleError(reason, 'Unhandled Rejection'));\n }\n\n private handleError(error: any, type: string): void {\n // Prevent infinite loops if logging fails\n try {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const logFile = path.join(this.logDir, `crash-${timestamp}.log`);\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n const stackTrace = error instanceof Error ? error.stack : 'No stack trace available';\n\n const logContent = `\n[${new Date().toISOString()}] ${type}\n--------------------------------------------------\nMessage: ${errorMessage}\nStack:\n${stackTrace}\n--------------------------------------------------\nSystem: ${os.platform()} ${os.release()} ${os.arch()}\nNode: ${process.version}\n`;\n\n // Ensure directory exists sync (we are crashing, async might not finish)\n if (!fs.existsSync(this.logDir)) {\n fs.mkdirSync(this.logDir, { recursive: true });\n }\n\n fs.writeFileSync(logFile, logContent, 'utf-8');\n\n console.error('\\n');\n console.error(colors.error('💥 Whoops! Shark CLI crashed unexpectedly.'));\n console.error(colors.dim(` Details have been saved to: ${logFile}`));\n console.error(colors.dim(' Please report this issue so we can fix it.'));\n console.error(colors.error(` Error: ${errorMessage}`));\n console.error('\\n');\n\n } catch (filesysError) {\n console.error('Fatal Error: Failed to write crash log.', filesysError);\n console.error('Original Error:', error);\n } finally {\n process.exit(1);\n }\n }\n}\n\nexport const crashHandler = CrashHandler.getInstance();\n","import { crashHandler } from '../core/error/crash-handler.js';\n\n// Initialize Global Crash Handler\ncrashHandler.init();\n\nimport { Command } from 'commander';\nimport { loginCommand } from '../commands/login.js';\nimport { configCommand } from '../commands/config.js';\nimport { initCommand } from '../commands/init.js';\nimport { colors } from '../ui/colors.js';\nimport { devCommand } from '../commands/dev.js';\nimport { legacyCommand } from '../commands/legacy.js';\nimport { exportSchemaCommand } from '../commands/export-schema.js';\nimport { exportPromptCommand } from '../commands/export-prompt.js';\nimport { superCommand } from '../commands/super.js';\n\nconst program = new Command();\n\nprogram\n .name('shark')\n .description('Shark CLI: AI-Native Collaborative Development Tool')\n .version('0.0.1');\n\nprogram.addCommand(loginCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(devCommand);\nprogram.addCommand(legacyCommand);\nprogram.addCommand(exportSchemaCommand);\nprogram.addCommand(exportPromptCommand);\nprogram.addCommand(superCommand);\n\nprogram\n .command('config')\n .description('Manage global configuration')\n .action(configCommand.action);\n\n// Global Error Handler for the CLI\nprocess.on('unhandledRejection', (err) => {\n console.error(colors.error('❌ Unhandled Error:'), err);\n process.exit(1);\n});\n\nprogram.parse(process.argv);\n","import { Command } from 'commander';\nimport { tui } from '../ui/tui.js';\nimport { workflowManager } from '../core/workflow/workflow-manager.js';\nimport { TechStackEnum } from '../core/workflow/shark-workflow.schema.js';\nimport { randomUUID } from 'crypto';\nimport { colors } from '../ui/colors.js';\n\nexport const initAction = async () => {\n tui.intro('Shark Project Initialization');\n\n // 1. Check if workflow already exists\n const existingState = await workflowManager.load();\n if (existingState) {\n // Smart Resume Context Card\n tui.log.info(colors.dim('----------------------------------------'));\n tui.log.info(`🦈 ${colors.primary('Welcome back to Shark CLI!')}`);\n tui.log.message(` Project: ${colors.white(existingState.projectName)}`);\n tui.log.message(` Stage: ${colors.secondary(existingState.currentStage)}`);\n tui.log.message(` Updated: ${colors.dim(new Date(existingState.lastUpdated).toLocaleString())}`);\n tui.log.info(colors.dim('----------------------------------------'));\n\n const action = await tui.select({\n message: 'An existing project was detected. What would you like to do?',\n options: [\n { value: 'resume', label: '🚀 Resume Work' },\n { value: 'overwrite', label: '⚠️ Overwrite (Start Fresh)' },\n { value: 'exit', label: '❌ Exit' }\n ]\n });\n\n if (tui.isCancel(action) || action === 'exit') {\n tui.outro('See you later! 👋');\n return;\n }\n\n if (action === 'resume') {\n tui.log.success(`Resuming work on ${colors.primary(existingState.projectName)}...`);\n // Future: Route to specific agent based on stage\n tui.outro(`To continue, run: \"shark agent\" (Context loaded)`);\n return;\n }\n\n // If overwrite, we just proceed to step 2...\n }\n\n // 2. Prompt for Project Name\n const projectName = await tui.text({\n message: 'What is the name of your project?',\n placeholder: 'e.g. My Awesome App',\n validate: (value) => {\n if (!value) return 'Project name is required';\n if (value.trim().length < 2) return 'Project name must be at least 2 characters';\n }\n });\n\n if (tui.isCancel(projectName)) {\n tui.outro('Initialization cancelled.');\n return;\n }\n\n // 3. Prompt for Tech Stack\n const techStackOptions = TechStackEnum.options.map(stack => ({\n value: stack,\n label: stack === 'node-ts' ? 'Node.js (TypeScript)' :\n stack === 'nextjs' ? 'Next.js' :\n stack.charAt(0).toUpperCase() + stack.slice(1)\n }));\n\n const techStack = await tui.select({\n message: 'Select your technology stack:',\n options: techStackOptions\n });\n\n if (tui.isCancel(techStack)) {\n tui.outro('Initialization cancelled.');\n return;\n }\n\n // 4. Create and Save State\n const spinner = tui.spinner();\n spinner.start('Initializing project workflow...');\n\n try {\n const newState = {\n projectId: randomUUID(),\n projectName: projectName as string,\n techStack: techStack as any,\n currentStage: 'business_analysis' as const,\n stageStatus: 'pending' as const,\n lastUpdated: new Date().toISOString(),\n artifacts: [],\n metadata: {\n initializedBy: 'shark-cli',\n version: '0.0.1'\n }\n };\n\n await workflowManager.save(newState);\n spinner.stop('Project workflow created!');\n\n tui.log.success(`Project ${colors.primary(projectName as string)} initialized successfully.`);\n tui.log.message(`Your Project ID: ${colors.dim(newState.projectId)}`);\n tui.outro('Ready to start! Run \"shark agent\" to begin analyzing requirements.'); // Placeholder hint\n } catch (error: any) {\n spinner.stop('Initialization failed.', 1);\n tui.log.error(error.message);\n process.exit(1);\n }\n};\n\nexport const initCommand = new Command('init')\n .description('Initialize a new Shark project')\n .action(initAction);\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { WorkflowSchema, type WorkflowState } from './shark-workflow.schema.js';\nimport { colors } from '../../ui/colors.js';\n\nexport class WorkflowManager {\n private static instance: WorkflowManager;\n private readonly filename = 'shark-workflow.json';\n private readonly tmpFilename = '.shark-workflow.tmp';\n\n private constructor() { }\n\n public static getInstance(): WorkflowManager {\n if (!WorkflowManager.instance) {\n WorkflowManager.instance = new WorkflowManager();\n }\n return WorkflowManager.instance;\n }\n\n private getFilePath(): string {\n return path.join(process.cwd(), this.filename);\n }\n\n private getTmpFilePath(): string {\n return path.join(process.cwd(), this.tmpFilename);\n }\n\n public async save(state: WorkflowState): Promise<void> {\n // 1. Validate State\n const parsed = WorkflowSchema.safeParse(state);\n if (!parsed.success) {\n throw new Error(`Invalid workflow state: ${parsed.error.message}`);\n }\n\n const filePath = this.getFilePath();\n const tmpPath = this.getTmpFilePath();\n const data = JSON.stringify(parsed.data, null, 2);\n\n try {\n // 2. Write to TMP\n await fs.writeFile(tmpPath, data, 'utf-8');\n\n // 3. Rename TMP to Final (Atomic)\n await fs.rename(tmpPath, filePath);\n } catch (error: any) {\n throw new Error(`Failed to save workflow state atomically: ${error.message}`);\n }\n }\n\n public async load(): Promise<WorkflowState | null> {\n const filePath = this.getFilePath();\n\n try {\n // Check if file exists\n try {\n await fs.access(filePath);\n } catch {\n return null; // File doesn't exist, generic start\n }\n\n const content = await fs.readFile(filePath, 'utf-8');\n const json = JSON.parse(content);\n\n const parsed = WorkflowSchema.safeParse(json);\n if (parsed.success) {\n return parsed.data;\n } else {\n console.warn(colors.warning(`⚠️ Corrupted workflow file detected: ${parsed.error.message}`));\n return null;\n }\n\n } catch (error: any) {\n console.warn(colors.warning(`⚠️ Failed to load workflow state: ${error.message}`));\n return null;\n }\n }\n\n // Helper to get current state or default if none exists\n public async getOrInitState(): Promise<WorkflowState | null> {\n return await this.load();\n }\n}\n\nexport const workflowManager = WorkflowManager.getInstance();\n","import { z } from 'zod';\n\nexport enum ProjectParams {\n PROJECT_ID = 'projectId',\n PROJECT_NAME = 'projectName',\n TECH_STACK = 'techStack',\n}\n\nexport const TechStackEnum = z.enum([\n 'react',\n 'nextjs',\n 'angular',\n 'vue',\n 'node-ts',\n 'python',\n 'dotnet',\n 'java',\n 'unknown'\n]);\n\nexport type TechStack = z.infer<typeof TechStackEnum>;\n\nexport const WorkflowStageEnum = z.enum([\n 'business_analysis',\n 'specification',\n 'architecture',\n 'development',\n 'verification',\n 'deployment'\n]);\n\nexport type WorkflowStage = z.infer<typeof WorkflowStageEnum>;\n\nexport const StageStatusEnum = z.enum([\n 'pending',\n 'in_progress',\n 'completed',\n 'failed',\n 'skipped'\n]);\n\nexport type StageStatus = z.infer<typeof StageStatusEnum>;\n\nexport const WorkflowSchema = z.object({\n projectId: z.string().uuid(),\n projectName: z.string().min(1),\n techStack: TechStackEnum.default('unknown'),\n currentStage: WorkflowStageEnum.default('business_analysis'),\n stageStatus: StageStatusEnum.default('pending'),\n lastUpdated: z.string().datetime(), // ISO 8601\n conversationId: z.string().optional(),\n conversations: z.record(z.string(), z.string()).optional(), // agentType -> conversationId\n artifacts: z.array(z.string()).default([]),\n // Extensible metadata bag\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport type WorkflowState = z.infer<typeof WorkflowSchema>;\n","import { Command } from 'commander';\nimport { interactiveDeveloperAgent } from '../core/agents/developer-agent.js';\nimport { AGENT_RESPONSE_JSON_SCHEMA } from '../core/api/prompts.js';\n\nexport const devCommand = new Command('dev')\n .description('Starts the Shark Developer Agent (Shark Dev Orchestration V2)')\n .option('-t, --task <type>', 'Initial task description (Quick Mode)')\n .option('-c, --context <path>', 'Path to custom context file')\n .option('-y, --yes', 'Automatically approve all actions without prompting')\n .option('--auto', 'Automatically approve all actions without prompting')\n .option('--export-schema', 'Export the agent response JSON schema')\n .option('--taskId <id>', 'ID of the current subagent task')\n .action(async (options) => {\n if (options.exportSchema) {\n console.log(JSON.stringify(AGENT_RESPONSE_JSON_SCHEMA, null, 2));\n return;\n }\n\n try {\n const result = await interactiveDeveloperAgent({\n taskInstruction: options.task,\n context: options.context,\n auto: options.yes || options.auto,\n taskId: options.taskId\n });\n if (!result.success) {\n console.error('Task execution failed:', result.summary);\n process.exit(1);\n }\n } catch (error: any) {\n console.error('Error during development agent execution:', error.message);\n process.exit(1);\n }\n });\n\n","import { z } from 'zod';\nimport { FileLogger } from '../debug/file-logger.js';\n\n// Action Schema\nexport const AgentActionSchema = z.object({\n type: z.enum([\n 'create_file', 'modify_file', 'list_files', 'search_file', 'search_code', 'read_file', 'delete_file',\n 'list_structure', 'modify_ast', 'search_ast', 'run_command',\n 'talk_with_user', 'use_mcp_tool',\n 'activate_skill', 'define_subagent', 'invoke_subagent', 'send_message', 'manage_subagents',\n 'complete_task',\n 'wait',\n 'ast_list_structure',\n 'ast_get_method',\n 'ast_add_method', 'ast_modify_method', 'ast_remove_method',\n 'ast_add_class',\n 'ast_get_property', 'ast_add_property', 'ast_modify_property', 'ast_remove_property',\n 'ast_add_decorator',\n 'ast_add_interface', 'ast_add_type_alias',\n 'ast_add_function', 'ast_remove_function',\n 'ast_add_import', 'ast_remove_import', 'ast_organize_imports'\n ]),\n path: z.string().nullable().optional(), // Nullable for strict mode combatibility\n content: z.string().nullable().optional(),\n line_range: z.array(z.number()).nullable().optional(),\n target_content: z.string().nullable().optional(),\n command: z.string().nullable().optional(),\n tool_name: z.string().nullable().optional(),\n tool_args: z.string().nullable().optional(), // JSON string argument\n\n // search_code fields\n query: z.string().nullable().optional(),\n is_regex: z.boolean().nullable().optional(),\n\n // AST-Grep fields\n pattern: z.string().nullable().optional(),\n fix: z.string().nullable().optional(),\n language: z.string().nullable().optional(),\n file_path: z.string().nullable().optional(), // Alias for path in ast-grep actions\n\n // New AST Tool Specific Fields\n class_name: z.string().nullable().optional(),\n method_name: z.string().nullable().optional(),\n method_code: z.string().nullable().optional(),\n property_name: z.string().nullable().optional(),\n property_code: z.string().nullable().optional(),\n extends_class: z.string().nullable().optional(),\n implements_interfaces: z.array(z.string()).nullable().optional(),\n decorator_code: z.string().nullable().optional(),\n interface_code: z.string().nullable().optional(),\n type_code: z.string().nullable().optional(),\n function_name: z.string().nullable().optional(),\n function_code: z.string().nullable().optional(),\n import_statement: z.string().nullable().optional(),\n module_path: z.string().nullable().optional(),\n new_body: z.string().nullable().optional(),\n\n // Preview confirmation\n confirmed: z.boolean().nullable().optional(),\n start_anchor: z.string().nullable().optional(),\n end_anchor: z.string().nullable().optional(),\n\n // Superpowers fields\n skill_name: z.string().nullable().optional(),\n duration_seconds: z.number().nullable().optional(),\n Subagents: z.array(z.object({\n TypeName: z.string(),\n Role: z.string(),\n Prompt: z.string()\n })).nullable().optional(),\n Recipient: z.string().nullable().optional(),\n Message: z.string().nullable().optional(),\n Action: z.enum(['list', 'kill', 'kill_all']).nullable().optional(),\n ConversationIds: z.array(z.string()).nullable().optional(),\n\n // define_subagent fields\n name: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n system_prompt: z.string().nullable().optional(),\n enable_write_tools: z.boolean().nullable().optional(),\n enable_subagent_tools: z.boolean().nullable().optional(),\n enable_mcp_tools: z.boolean().nullable().optional(),\n});\n\nexport type AgentAction = z.infer<typeof AgentActionSchema>;\n\n// Command Schema (for future use)\nexport const AgentCommandSchema = z.object({\n command: z.string(),\n description: z.string(),\n critical: z.boolean(),\n});\n\n// Full Structured Response Schema\nexport const AgentResponseSchema = z.object({\n action: AgentActionSchema.nullable().optional(),\n actions: z.array(AgentActionSchema).default([]), // Maintain backward compatibility\n commands: z.array(AgentCommandSchema).optional(), // Maintain backward compatibility\n summary: z.string().optional(),\n\n // Legacy fields handling for smooth transition/fallback\n message: z.string().optional(),\n conversation_id: z.string().optional(),\n});\n\nexport type AgentResponse = z.infer<typeof AgentResponseSchema>;\n\n/**\n * Parses raw agent response expecting a JSON string that matches our schema.\n */\nexport function parseAgentResponse(rawResponse: unknown): AgentResponse {\n FileLogger.log('PARSER', 'Parsing Agent Response', { rawType: typeof rawResponse });\n\n let parsedObj: any = {};\n let conversation_id: string | undefined;\n\n // 1. Handle string input (accumulated SSE or raw JSON string)\n if (typeof rawResponse === 'string') {\n FileLogger.log('PARSER', 'Type String', { length: rawResponse.length });\n try {\n parsedObj = extractFirstJson(rawResponse);\n } catch (e) {\n FileLogger.log('PARSER', 'String Parse Failed', { error: (e as Error).message });\n const errMsg = (e as Error).message;\n const cleanRaw = rawResponse.trim();\n \n if (cleanRaw === '') {\n const systemMsg = `[SYSTEM ERROR]: O modelo retornou uma resposta vazia. Por favor, tente novamente e forneça uma ação JSON válida.`;\n return {\n action: {\n type: 'talk_with_user',\n content: systemMsg,\n path: ''\n },\n actions: [{\n type: 'talk_with_user',\n content: systemMsg,\n path: ''\n }],\n message: systemMsg\n };\n }\n\n const looksLikeJson = cleanRaw.startsWith('{') || cleanRaw.startsWith('[');\n \n if (!looksLikeJson) {\n // Fallback: treat as simple message if not valid JSON and not trying to be JSON\n return {\n action: {\n type: 'talk_with_user',\n content: rawResponse,\n path: ''\n },\n actions: [{\n type: 'talk_with_user',\n content: rawResponse,\n path: ''\n }],\n message: rawResponse\n };\n }\n\n const isTruncated = errMsg.includes('Unterminated string') || errMsg.includes('Unexpected end of JSON input');\n const charCount = rawResponse.length;\n const safeLimit = Math.floor(charCount * 0.9);\n const systemMsg = isTruncated\n ? `[SYSTEM ERROR]: Sua resposta anterior foi cortada/truncada antes do final devido ao limite máximo de tokens de saída (output token limit) após atingir ${charCount} caracteres. O JSON ficou incompleto: ${errMsg}. Por favor, envie uma nova resposta com formato JSON completo e válido (não tente apenas completar o JSON anterior). Continue o trabalho lógico da tarefa de forma mais curta ou incremental (ex: criando apenas o esqueleto/estrutura básica ou escrevendo uma parte menor do arquivo de cada vez). Garanta que o tamanho total desta nova resposta JSON seja menor que ${safeLimit} caracteres para evitar novos cortes.`\n : `[SYSTEM ERROR]: Falha ao parsear o JSON de resposta: ${errMsg}.`;\n return {\n action: {\n type: 'talk_with_user',\n content: systemMsg,\n path: ''\n },\n actions: [{\n type: 'talk_with_user',\n content: systemMsg,\n path: ''\n }],\n message: systemMsg\n };\n }\n }\n // 2. Handle object input (direct API response)\n else if (typeof rawResponse === 'object' && rawResponse !== null) {\n const anyResp = rawResponse as any;\n conversation_id = anyResp.conversation_id;\n\n FileLogger.log('PARSER', 'Type Object', {\n hasContent: !!anyResp.content,\n hasMessage: !!anyResp.message,\n messageType: typeof anyResp.message\n });\n\n // Sometimes content is nested in 'content' or 'message'\n const stringContent = anyResp.content || anyResp.message;\n if (stringContent && typeof stringContent === 'string') {\n try {\n // Try to parse it as JSON actions/action\n const parsedInside = extractFirstJson(stringContent);\n // Only use it if it looks like an object (not just a primitive)\n if (typeof parsedInside === 'object' && parsedInside !== null) {\n parsedObj = parsedInside;\n FileLogger.log('PARSER', 'Inner JSON Parsed', { keys: Object.keys(parsedObj) });\n } else {\n // It was a string literal or number, treat as text\n parsedObj = rawResponse;\n FileLogger.log('PARSER', 'Inner JSON was primitive');\n }\n } catch (e) {\n FileLogger.log('PARSER', 'Inner JSON Parse Error', { error: (e as Error).message });\n const errMsg = (e as Error).message;\n const cleanContent = stringContent.trim();\n const looksLikeJson = cleanContent.startsWith('{') || cleanContent.startsWith('[');\n \n if (looksLikeJson) {\n const isTruncated = errMsg.includes('Unterminated string') || errMsg.includes('Unexpected end of JSON input');\n const charCount = stringContent.length;\n const safeLimit = Math.floor(charCount * 0.9);\n const systemMsg = isTruncated\n ? `[SYSTEM ERROR]: Sua resposta anterior foi cortada/truncada antes do final devido ao limite máximo de tokens de saída (output token limit) após atingir ${charCount} caracteres. O JSON ficou incompleto: ${errMsg}. Por favor, envie uma nova resposta com formato JSON completo e válido (não tente apenas completar o JSON anterior). Continue o trabalho lógico da tarefa de forma mais curta ou incremental (ex: criando apenas o esqueleto/estrutura básica ou escrevendo uma parte menor do arquivo de cada vez). Garanta que o tamanho total desta nova resposta JSON seja menor que ${safeLimit} caracteres para evitar novos cortes.`\n : `[SYSTEM ERROR]: Falha ao parsear o JSON de resposta: ${errMsg}.`;\n parsedObj = {\n action: {\n type: 'talk_with_user',\n content: systemMsg,\n path: ''\n },\n actions: [{\n type: 'talk_with_user',\n content: systemMsg,\n path: ''\n }],\n summary: 'Parsing failed due to truncated JSON response'\n };\n } else {\n parsedObj = rawResponse;\n }\n }\n } else {\n parsedObj = rawResponse;\n }\n\n // If we didn't successfully parse inner JSON actions/action, use the raw object\n if (!parsedObj.actions && !parsedObj.action) {\n parsedObj = rawResponse;\n }\n }\n\n // 3. Normalize Actions/Action\n let normalizedAction: any = parsedObj.action;\n let normalizedActions: any[] = parsedObj.actions;\n\n // Handle root-level action objects directly (fallback for less strict models)\n if (!normalizedAction && (!normalizedActions || normalizedActions.length === 0) && parsedObj && typeof parsedObj === 'object' && typeof parsedObj.type === 'string') {\n const validTypes = [\n 'create_file', 'modify_file', 'list_files', 'search_file', 'search_code', 'read_file', 'delete_file',\n 'talk_with_user', 'use_mcp_tool', 'list_structure', 'modify_ast', 'search_ast', 'run_command',\n 'activate_skill', 'define_subagent', 'invoke_subagent', 'send_message', 'manage_subagents',\n 'complete_task'\n ];\n if (validTypes.includes(parsedObj.type)) {\n normalizedAction = parsedObj;\n normalizedActions = [parsedObj];\n }\n }\n\n if (!normalizedAction && normalizedActions && normalizedActions.length > 0) {\n normalizedAction = normalizedActions[0];\n } else if (normalizedAction && (!normalizedActions || normalizedActions.length === 0)) {\n normalizedActions = [normalizedAction];\n }\n\n if (!normalizedAction && !normalizedActions) {\n FileLogger.log('PARSER', 'No Action/Actions Found - Constructing Default');\n const content = parsedObj.message || (typeof parsedObj === 'object' ? JSON.stringify(parsedObj) : String(parsedObj));\n normalizedAction = {\n type: 'talk_with_user',\n content,\n path: ''\n };\n normalizedActions = [normalizedAction];\n }\n\n // 4. Validate against Schema\n // We construct the final object to match our schema structure\n let normalizedCommands: any[] = [];\n if (Array.isArray(parsedObj.commands)) {\n normalizedCommands = parsedObj.commands.map((cmd: any) => {\n if (typeof cmd === 'string') {\n return {\n command: cmd,\n description: `Execute ${cmd}`,\n critical: false\n };\n }\n if (cmd && typeof cmd === 'object') {\n return {\n command: cmd.command || '',\n description: cmd.description || `Execute ${cmd.command || ''}`,\n critical: cmd.critical === true\n };\n }\n return null;\n }).filter(Boolean);\n }\n\n const result = {\n action: normalizedAction,\n actions: normalizedActions,\n commands: normalizedCommands,\n summary: parsedObj.summary || '',\n conversation_id,\n message: parsedObj.summary || 'Agent Action' // Backward compatibility\n };\n\n FileLogger.log('PARSER', 'Final Result Constructed', { hasAction: !!result.action });\n\n try {\n return AgentResponseSchema.parse(result);\n } catch (e) {\n FileLogger.log('PARSER', 'Schema Validation Failed', { error: (e as Error).message });\n throw e;\n }\n}\n\nexport function extractFirstJson(str: string): any {\n try {\n return JSON.parse(str);\n } catch (e) {\n // If simple parse fails, try to find the first balanced object\n const firstOpen = str.indexOf('{');\n if (firstOpen === -1) throw e;\n\n let balance = 0;\n let inString = false;\n let escape = false;\n\n for (let i = firstOpen; i < str.length; i++) {\n const char = str[i];\n\n if (escape) {\n escape = false;\n continue;\n }\n\n if (char === '\\\\') {\n escape = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (!inString) {\n if (char === '{') balance++;\n else if (char === '}') {\n balance--;\n if (balance === 0) {\n // Found the end of the first object\n const potentialJson = str.substring(firstOpen, i + 1);\n try {\n return JSON.parse(potentialJson);\n } catch (innerE) {\n // If this chunk failed, maybe our brace counting was off (e.g. comments?), throw original\n throw e;\n }\n }\n }\n }\n }\n throw e;\n }\n}\n","import { tokenStorage } from '../auth/token-storage.js';\nimport { authenticate } from '../auth/stackspot-auth.js';\nimport { colors } from '../../ui/colors.js';\n\nexport class AuthError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'AuthError';\n }\n}\n\ninterface RequestOptions extends RequestInit {\n params?: Record<string, string>;\n}\n\n// API Base URLs\nexport const STACKSPOT_API_BASE = 'https://api.stackspot.com';\nexport const STACKSPOT_AGENT_API_BASE = 'https://genai-inference-app.stackspot.com';\n\n// Shared Token Validation & Refresh Logic\nexport async function ensureValidToken(realm: string): Promise<string> {\n let creds = await tokenStorage.getCredentials(realm);\n\n if (!creds?.accessToken) {\n throw new AuthError(`Authentication required for realm '${realm}'.\\nPlease run 'shark login' to authenticate.`);\n }\n\n // Auto-Refresh Logic\n const now = Math.floor(Date.now() / 1000);\n const buffer = 300; // 5 minutes buffer\n\n // If we have credentials and expiry time, check if we need to refresh\n if (creds.expiresAt && creds.clientId && creds.clientKey) {\n if (now > creds.expiresAt - buffer) {\n try {\n // console.log(colors.dim('🔄 Refreshing expired token...'));\n // We keep it silent or use a global logger if available\n\n const newTokens = await authenticate(realm, creds.clientId, creds.clientKey);\n\n await tokenStorage.saveToken(\n realm,\n newTokens.access_token,\n creds.clientId,\n creds.clientKey,\n newTokens.expires_in\n );\n\n return newTokens.access_token;\n\n } catch (error) {\n console.warn(colors.warning(`⚠️ Failed to auto-refresh token: ${(error as Error).message}`));\n // Fallback to existing token\n }\n }\n }\n\n return creds.accessToken;\n}\n\nexport class StackSpotClient {\n private readonly MAX_RETRIES = 3;\n private readonly RETRY_DELAYS = [1000, 2000, 4000]; // 1s, 2s, 4s\n private debugMode = false;\n\n constructor(private realm: string) { }\n\n public enableDebug(): void {\n this.debugMode = true;\n }\n\n private async getHeaders(): Promise<Headers> {\n const token = await ensureValidToken(this.realm);\n const headers = new Headers();\n headers.set('Authorization', `Bearer ${token}`);\n headers.set('Content-Type', 'application/json');\n return headers;\n }\n\n private shouldRetry(error: any, attempt: number): boolean {\n if (attempt >= this.MAX_RETRIES) return false;\n\n // Retry on network errors\n if (error.name === 'TypeError' || error.message?.includes('fetch')) return true;\n\n // Retry on 5xx server errors\n if (error.status && error.status >= 500) return true;\n\n return false;\n }\n\n private async sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n private async request<T>(url: string, options: RequestOptions = {}): Promise<T> {\n let lastError: any;\n\n for (let attempt = 0; attempt <= this.MAX_RETRIES; attempt++) {\n try {\n if (this.debugMode && attempt > 0) {\n console.log(`[StackSpotClient] Retry attempt ${attempt}/${this.MAX_RETRIES} for ${url}`);\n }\n\n const headers = await this.getHeaders();\n\n // Merge custom headers\n if (options.headers) {\n new Headers(options.headers).forEach((value, key) => headers.set(key, value));\n }\n\n // Add Query Params\n let finalUrl = url;\n if (options.params) {\n const query = new URLSearchParams(options.params).toString();\n finalUrl += `?${query}`;\n }\n\n if (this.debugMode) {\n console.log(`[StackSpotClient] ${options.method || 'GET'} ${finalUrl}`);\n }\n\n const response = await fetch(finalUrl, {\n ...options,\n headers,\n });\n\n if (response.status === 401) {\n throw new AuthError(\"Session expired or invalid credentials. Please run 'shark login' again.\");\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n const error: any = new Error(`API Request failed: ${response.status} ${response.statusText} - ${errorText}`);\n error.status = response.status;\n throw error;\n }\n\n // Return null for 204 No Content\n if (response.status === 204) {\n return null as T;\n }\n\n return (await response.json()) as T;\n\n } catch (error: any) {\n lastError = error;\n\n // Don't retry auth errors\n if (error instanceof AuthError) {\n throw error;\n }\n\n if (this.shouldRetry(error, attempt)) {\n const delay = this.RETRY_DELAYS[attempt] || this.RETRY_DELAYS[this.RETRY_DELAYS.length - 1];\n if (this.debugMode) {\n console.log(`[StackSpotClient] Retrying in ${delay}ms...`);\n }\n await this.sleep(delay);\n continue;\n }\n\n // No more retries\n throw error;\n }\n }\n\n throw lastError;\n }\n\n async get<T>(url: string, options?: RequestOptions): Promise<T> {\n return this.request<T>(url, { ...options, method: 'GET' });\n }\n\n async post<T>(url: string, body: any, options?: RequestOptions): Promise<T> {\n return this.request<T>(url, {\n ...options,\n method: 'POST',\n body: JSON.stringify(body)\n });\n }\n\n async put<T>(url: string, body: any, options?: RequestOptions): Promise<T> {\n return this.request<T>(url, {\n ...options,\n method: 'PUT',\n body: JSON.stringify(body)\n });\n }\n\n async delete<T>(url: string, options?: RequestOptions): Promise<T> {\n return this.request<T>(url, { ...options, method: 'DELETE' });\n }\n}\n\nexport function createAuthenticatedClient(realm: string): StackSpotClient {\n return new StackSpotClient(realm);\n}\n","import { FileLogger } from '../debug/file-logger.js';\n\nexport interface SSECallbacks {\n onChunk?: (partialMessage: string) => void;\n onComplete?: (fullMessage: string, metadata?: any) => void;\n onError?: (error: Error) => void;\n}\n\nexport class SSEClient {\n /**\n * Streams agent response using Server-Sent Events.\n * \n * @param url - The SSE endpoint URL\n * @param requestPayload - The request payload to POST\n * @param headers - Request headers (including Authorization)\n * @param callbacks - Event callbacks for chunks, completion, and errors\n */\n async streamAgentResponse(\n url: string,\n requestPayload: unknown,\n headers: HeadersInit,\n callbacks: SSECallbacks = {}\n ): Promise<void> {\n const { onChunk, onComplete, onError } = callbacks;\n\n FileLogger.log('SSE', `Starting Request to ${url}`, {\n headers,\n payload: requestPayload\n });\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestPayload),\n });\n\n FileLogger.log('SSE', `Response Status: ${response.status} ${response.statusText}`);\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => { responseHeaders[key] = value; });\n FileLogger.log('SSE', 'Response Headers', responseHeaders);\n\n if (!response.ok) {\n const errorText = await response.text();\n FileLogger.log('SSE', 'Response Error Body', errorText);\n throw new Error(`SSE request failed: ${response.status} ${response.statusText} - ${errorText}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const contentType = response.headers.get('content-type') || '';\n const isJson = contentType.includes('application/json');\n\n if (isJson) {\n // Handle non-streaming JSON response properly\n const jsonBody = await response.json();\n FileLogger.log('SSE', 'Received Non-Streaming JSON Response', { length: JSON.stringify(jsonBody).length });\n\n // Try to extract message content depending on structure\n let content = '';\n if (typeof jsonBody === 'string') content = jsonBody;\n else if (jsonBody.message) content = jsonBody.message;\n else if (jsonBody.choices?.[0]?.message?.content) content = jsonBody.choices[0].message.content; // OpenAI style just in case\n else content = JSON.stringify(jsonBody); // Fallback to raw JSON\n\n // Trigger callbacks as if it streamed in one chunk\n if (onChunk) onChunk(content);\n if (onComplete) onComplete(content, jsonBody);\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let fullMessage = '';\n let metadata: any = {};\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n // Decode chunk\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n buffer = lines.pop() || ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n const data = line.slice(5).trim(); // Remove 'data:' prefix\n\n if (data === '[DONE]') {\n FileLogger.log('SSE', 'Stream Complete [DONE]', { fullMessage, metadata });\n // End of stream\n if (onComplete) {\n onComplete(fullMessage, metadata);\n }\n return;\n }\n\n try {\n const parsed = JSON.parse(data);\n const chunk = parsed.message || parsed.content || data;\n fullMessage += chunk;\n\n // Capture latest metadata (e.g. conversation_id)\n if (parsed.conversation_id) {\n metadata.conversation_id = parsed.conversation_id;\n }\n\n if (onChunk) {\n onChunk(chunk);\n }\n } catch (parseError) {\n // Not JSON, treat as plain text\n fullMessage += data;\n if (onChunk) {\n onChunk(data);\n }\n }\n }\n }\n }\n\n FileLogger.log('SSE', 'Stream Ended Naturally', { fullMessage, metadata });\n\n // Stream ended without [DONE]\n if (onComplete) {\n onComplete(fullMessage, metadata);\n }\n\n } catch (error) {\n FileLogger.log('SSE', 'Stream Error', error);\n if (onError) {\n onError(error instanceof Error ? error : new Error(String(error)));\n } else {\n throw error;\n }\n }\n }\n}\n\nexport const sseClient = new SSEClient();\n","import { ConfigManager } from '../config-manager.js';\n\n/**\n * Gets the currently active (logged-in) realm from config.\n * \n * @returns The active realm\n * @throws Error if no realm is active (user not logged in)\n */\nexport async function getActiveRealm(): Promise<string> {\n const configManager = ConfigManager.getInstance();\n const config = configManager.getConfig();\n const realm = config.activeRealm;\n\n if (!realm) {\n throw new Error(\n 'No active authentication found.\\n' +\n 'Please run \"shark login\" first to authenticate.'\n );\n }\n\n return realm;\n}\n","export const UNIFIED_SYSTEM_PROMPT = `Você é o Shark Dev, um agente de inteligência artificial de desenvolvimento colaborativo no Shark AI.\nSeu objetivo é ajudar o usuário a analisar, especificar e implementar código de forma estruturada.\n\nℹ️ SISTEMA DE ÂNCORAS PARA LEITURA/EDIÇÃO DE ARQUIVOS (Anchor System):\n- Quando você lê um arquivo usando a ação 'read_file', cada linha do arquivo será retornada no formato: \\`palavra_âncora§conteúdo_da_linha\\`.\n- Exemplo: \\`apple§const x = 10;\\`\n- Ao modificar um arquivo usando a ação 'modify_file', você DEVE especificar:\n - \\`start_anchor\\`: A palavra âncora (ex: \\`apple\\`) que marca o início do bloco a ser substituído.\n - \\`end_anchor\\`: A palavra âncora (ex: \\`apple\\`) que marca o fim do bloco a ser substituído (inclusive).\n - \\`content\\`: O novo conteúdo que substituirá todo o bloco entre (e incluindo) as duas âncoras.\n - Importante: Use APENAS a palavra âncora no campo \\`start_anchor\\` e \\`end_anchor\\` (por exemplo: \\`apple\\`), e NÃO a linha inteira ou o separador \\`§\\`.\n\n⚠️ REGRA GERAL PARA ARQUIVOS GRANDES (Evitar JSON truncado):\n- Evite criar ou modificar arquivos grandes (como planos, documentações ou códigos extensos) de uma única vez.\n- Limite de Saída Rígido: A API possui um limite máximo de tokens de saída. Para sua segurança, garanta que o conteúdo de cada resposta JSON sua tenha no máximo 15.000 caracteres (cerca de 4.000 tokens). NUNCA gere respostas únicas maiores do que isso.\n- Se a tarefa exigir criar ou modificar arquivos longos, siga estritamente esta lógica:\n 1. Use 'create_file' para criar apenas a estrutura básica ou esqueleto do arquivo (cabeçalhos e seções vazias).\n 2. Nas rodadas subsequentes, use 'modify_file' com o sistema de âncoras para preencher/atualizar o conteúdo de forma incremental e em pedaços menores (no máximo 50 a 100 linhas por vez).\n- Isso evita que a sua resposta JSON seja cortada no meio devido ao limite máximo de tokens de saída da API.\n\n🚨 REGRAS CRÍTICAS DE RESPOSTA (JSON):\n- Você DEVE responder APENAS com um objeto JSON válido.\n- Não inclua nenhuma introdução, explicação ou bloco de markdown fora do JSON.\n- Se precisar falar com o usuário, use a action com type 'talk_with_user'.\n\nSUA SAÍDA DEVE SEGUIR EXATAMENTE ESTE FORMATO JSON:\n{\n \"action\": {\n \"type\": \"create_file\" | \"modify_file\" | \"read_file\" | \"list_files\" | \"search_file\" | \"search_code\" | \"delete_file\" | \"run_command\" | \"talk_with_user\" | \"use_mcp_tool\" | \"activate_skill\" | \"define_subagent\" | \"invoke_subagent\" | \"send_message\" | \"manage_subagents\" | \"complete_task\" | \"wait\",\n \"path\": \"caminho/relativo/do/arquivo (opcional)\",\n \"content\": \"conteúdo do arquivo ou mensagem para o usuário (opcional)\",\n \"start_anchor\": \"âncora de início de substituição (modify_file apenas)\",\n \"end_anchor\": \"âncora de fim de substituição (modify_file apenas)\",\n \"command\": \"comando bash a ser executado (run_command apenas)\",\n \"query\": \"termo de busca (search_code apenas)\",\n \"tool_name\": \"nome da ferramenta MCP (use_mcp_tool apenas)\",\n \"tool_args\": \"argumentos em string JSON para MCP (use_mcp_tool apenas)\",\n \"skill_name\": \"nome da habilidade a ativar (activate_skill apenas)\",\n \"duration_seconds\": \"tempo máximo em segundos para aguardar atualizações (opcional, wait apenas)\",\n \"Subagents\": [\n {\n \"TypeName\": \"tipo do subagente\",\n \"Role\": \"papel do subagente\",\n \"Prompt\": \"instruções de tarefa para o subagente\"\n }\n ] (invoke_subagent apenas),\n \"Recipient\": \"ID da conversa de destino da mensagem (send_message apenas)\",\n \"Message\": \"conteúdo da mensagem a ser enviada (send_message apenas)\",\n \"Action\": \"list\" | \"kill\" | \"kill_all\" (manage_subagents apenas),\n \"ConversationIds\": [\"lista de IDs de conversa para cancelar\"] (manage_subagents apenas, opcional),\n \"name\": \"nome do subagente (define_subagent apenas)\",\n \"description\": \"descrição do subagente (define_subagent apenas)\",\n \"system_prompt\": \"prompt de sistema customizado (define_subagent apenas)\",\n \"enable_write_tools\": true | false (define_subagent apenas, opcional),\n \"enable_subagent_tools\": true | false (define_subagent apenas, opcional),\n \"enable_mcp_tools\": true | false (define_subagent apenas, opcional)\n },\n \"summary\": \"Resumo de 1 frase do que você realizou nesta rodada.\"\n}`;\n\nexport const AGENT_RESPONSE_JSON_SCHEMA = {\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": \"AgentResponse\",\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"create_file\",\n \"modify_file\",\n \"read_file\",\n \"list_files\",\n \"search_file\",\n \"search_code\",\n \"delete_file\",\n \"run_command\",\n \"talk_with_user\",\n \"use_mcp_tool\",\n \"activate_skill\",\n \"define_subagent\",\n \"invoke_subagent\",\n \"send_message\",\n \"manage_subagents\",\n \"complete_task\",\n \"wait\"\n ]\n },\n \"path\": { \"type\": [\"string\", \"null\"] },\n \"content\": { \"type\": [\"string\", \"null\"] },\n \"start_anchor\": { \"type\": [\"string\", \"null\"] },\n \"end_anchor\": { \"type\": [\"string\", \"null\"] },\n \"command\": { \"type\": [\"string\", \"null\"] },\n \"query\": { \"type\": [\"string\", \"null\"] },\n \"tool_name\": { \"type\": [\"string\", \"null\"] },\n \"tool_args\": { \"type\": [\"string\", \"null\"] },\n \"skill_name\": { \"type\": [\"string\", \"null\"] },\n \"duration_seconds\": {\n \"type\": [\"integer\", \"null\"],\n \"description\": \"Tempo maximo em segundos para aguardar atualizacoes.\"\n },\n \"Subagents\": {\n \"type\": [\"array\", \"null\"],\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"TypeName\": { \"type\": \"string\" },\n \"Role\": { \"type\": \"string\" },\n \"Prompt\": { \"type\": \"string\" }\n },\n \"required\": [\"TypeName\", \"Role\", \"Prompt\"]\n }\n },\n \"Recipient\": { \"type\": [\"string\", \"null\"] },\n \"Message\": { \"type\": [\"string\", \"null\"] },\n \"Action\": { \"type\": [\"string\", \"null\"], \"enum\": [\"list\", \"kill\", \"kill_all\"] },\n \"ConversationIds\": {\n \"type\": [\"array\", \"null\"],\n \"items\": { \"type\": \"string\" }\n },\n \"name\": { \"type\": [\"string\", \"null\"] },\n \"description\": { \"type\": [\"string\", \"null\"] },\n \"system_prompt\": { \"type\": [\"string\", \"null\"] },\n \"enable_write_tools\": { \"type\": [\"boolean\", \"null\"] },\n \"enable_subagent_tools\": { \"type\": [\"boolean\", \"null\"] },\n \"enable_mcp_tools\": { \"type\": [\"boolean\", \"null\"] }\n },\n \"required\": [\"type\"]\n },\n \"summary\": { \"type\": \"string\" }\n },\n \"required\": [\"action\"]\n};\n\n","import { AIProvider, ChatOptions } from './provider.interface.js';\nimport { AgentResponse, parseAgentResponse } from '../agents/agent-response-parser.js';\nimport { STACKSPOT_AGENT_API_BASE, ensureValidToken } from './stackspot-client.js';\nimport { sseClient } from './sse-client.js';\nimport { tokenStorage } from '../auth/token-storage.js';\nimport { getActiveRealm } from '../auth/get-active-realm.js';\nimport { ConfigManager } from '../config-manager.js';\nimport { UNIFIED_SYSTEM_PROMPT } from './prompts.js';\nimport { FileLogger } from '../debug/file-logger.js';\n\nexport class StackSpotProvider implements AIProvider {\n public agentId?: string;\n\n constructor(private agentType: string) {\n const config = ConfigManager.getInstance().getConfig();\n this.agentId = config.stackspot?.agentId;\n }\n\n private getAgentId(): string {\n const config = ConfigManager.getInstance().getConfig();\n const configKeyMapping: Record<string, 'dev' | 'ba' | 'spec' | 'qa' | 'scan' | 'codeReview'> = {\n 'developer_agent': 'dev',\n 'business_analyst': 'ba',\n 'specification_agent': 'spec',\n 'qa_agent': 'qa',\n 'scan_agent': 'scan',\n 'code_review': 'codeReview'\n };\n const mappedKey = configKeyMapping[this.agentType];\n if (mappedKey && config.agents?.[mappedKey]) {\n return config.agents[mappedKey]!;\n }\n\n const envIdMapping: Record<string, string | undefined> = {\n 'business_analyst': process.env.STACKSPOT_BA_AGENT_ID,\n 'developer_agent': process.env.STACKSPOT_DEV_AGENT_ID,\n 'qa_agent': process.env.STACKSPOT_QA_AGENT_ID,\n 'specification_agent': process.env.STACKSPOT_SPEC_AGENT_ID,\n 'scan_agent': process.env.STACKSPOT_SCAN_AGENT_ID,\n 'code_review': process.env.STACKSPOT_CODE_REVIEW_AGENT_ID\n };\n\n const envResolved = envIdMapping[this.agentType];\n if (envResolved) {\n return envResolved;\n }\n\n if (this.agentId && this.agentId !== '01KEQCGJ65YENRA4QBXVN1YFFX') {\n return this.agentId;\n }\n\n const defaultIdMapping: Record<string, string> = {\n 'business_analyst': '01KEJ95G304TNNAKGH5XNEEBVD',\n 'developer_agent': '01KEQCGJ65YENRA4QBXVN1YFFX',\n 'qa_agent': '01KEQFJZ3Q3JER11NH22HEZX9X',\n 'specification_agent': '01KEPXTX37FTB4N672TZST4SGP',\n 'scan_agent': '01KEQ9AHWB550J2244YBH3QATN',\n 'code_review': ''\n };\n\n const resolved = defaultIdMapping[this.agentType];\n if (this.agentType === 'code_review') {\n if (!resolved) {\n throw new Error(\"Agent ID for 'code_review' is not configured.\");\n }\n return resolved;\n }\n\n return resolved || '01KEQCGJ65YENRA4QBXVN1YFFX';\n }\n\n private getAgentVersion(): string | undefined {\n const config = ConfigManager.getInstance().getConfig();\n const versionMapping: Record<string, string | undefined> = {\n 'business_analyst': config.agentVersions?.ba || process.env.STACKSPOT_BA_AGENT_VERSION,\n 'developer_agent': config.agentVersions?.dev || process.env.STACKSPOT_DEV_AGENT_VERSION,\n 'qa_agent': config.agentVersions?.qa || process.env.STACKSPOT_QA_AGENT_VERSION,\n 'specification_agent': config.agentVersions?.spec || process.env.STACKSPOT_SPEC_AGENT_VERSION,\n 'scan_agent': config.agentVersions?.scan || process.env.STACKSPOT_SCAN_AGENT_VERSION,\n 'code_review': config.agentVersions?.codeReview || process.env.STACKSPOT_CODE_REVIEW_AGENT_VERSION\n };\n return versionMapping[this.agentType];\n }\n\n async streamChat(prompt: string, options: ChatOptions): Promise<AgentResponse> {\n const realm = await getActiveRealm();\n let token: string | null = null;\n try {\n token = await ensureValidToken(realm);\n } catch (error) {\n token = await tokenStorage.getToken(realm);\n }\n\n if (!token) {\n throw new Error(`No authentication token found for realm '${realm}'. Please run 'shark login'.`);\n }\n\n const isFirstTurn = !options.conversationId;\n const finalPrompt = isFirstTurn\n ? `SYSTEM INSTRUCTIONS:\\n${UNIFIED_SYSTEM_PROMPT}\\n\\nUSER REQUEST:\\n${prompt}`\n : prompt;\n\n const requestPayload: any = {\n user_prompt: finalPrompt,\n streaming: true,\n stackspot_knowledge: false,\n return_ks_in_response: true,\n deep_search_ks: false,\n use_conversation: true,\n conversation_id: options.conversationId,\n };\n\n const agentVersion = this.getAgentVersion();\n if (agentVersion) {\n requestPayload.agent_version_number = agentVersion;\n }\n\n const effectiveAgentId = this.getAgentId();\n const agentUrl = `${STACKSPOT_AGENT_API_BASE}/v1/agent/${effectiveAgentId}/chat`;\n\n const headers = {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n };\n\n const sanitizedHeaders = { ...headers };\n if (sanitizedHeaders['Authorization']) {\n sanitizedHeaders['Authorization'] = 'Bearer ***';\n }\n FileLogger.log('PROVIDER_REQUEST', 'Request payload sent to StackSpot API', {\n agentId: effectiveAgentId,\n url: agentUrl,\n headers: sanitizedHeaders,\n payload: requestPayload\n });\n\n let fullMessage = '';\n let rawResponse: any = {};\n\n await sseClient.streamAgentResponse(\n agentUrl,\n requestPayload,\n headers,\n {\n onChunk: (chunk) => {\n fullMessage += chunk;\n if (options.onChunk) {\n options.onChunk(chunk);\n }\n },\n onComplete: async (message, metadata) => {\n rawResponse = {\n message: message || fullMessage,\n conversation_id: metadata?.conversation_id || options.conversationId,\n };\n },\n onError: (error) => {\n throw error;\n },\n }\n );\n\n FileLogger.log('PROVIDER_RESPONSE', 'Raw response from StackSpot API', { rawResponse });\n const parsedResponse = parseAgentResponse(rawResponse);\n if (options.onComplete) {\n options.onComplete(parsedResponse);\n }\n return parsedResponse;\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface ChatMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\nexport class HistoryManager {\n private static getHistoryDir(): string {\n const dir = path.resolve(process.cwd(), '_sharkrc', 'history');\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n return dir;\n }\n\n private static getFilePath(conversationId: string): string {\n return path.resolve(this.getHistoryDir(), `${conversationId}.json`);\n }\n\n static async getHistory(conversationId: string): Promise<ChatMessage[]> {\n const filePath = this.getFilePath(conversationId);\n if (!fs.existsSync(filePath)) {\n return [];\n }\n try {\n const raw = fs.readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as ChatMessage[]) : [];\n } catch {\n return [];\n }\n }\n\n static async saveHistory(conversationId: string, messages: ChatMessage[]): Promise<void> {\n const filePath = this.getFilePath(conversationId);\n fs.writeFileSync(filePath, JSON.stringify(messages, null, 2), 'utf-8');\n }\n\n static async appendMessage(conversationId: string, message: ChatMessage): Promise<void> {\n const history = await this.getHistory(conversationId);\n history.push(message);\n await this.saveHistory(conversationId, history);\n }\n}\n","import { AIProvider, ChatOptions } from './provider.interface.js';\nimport { AgentResponse, parseAgentResponse } from '../agents/agent-response-parser.js';\nimport { HistoryManager, ChatMessage } from '../workflow/history-manager.js';\nimport { UNIFIED_SYSTEM_PROMPT } from './prompts.js';\nimport crypto from 'node:crypto';\nimport { FileLogger } from '../debug/file-logger.js';\n\ninterface OpenAIConfig {\n baseURL: string;\n apiKey: string;\n model: string;\n useStructuredOutputs: boolean;\n}\n\nexport class OpenAICompatibleProvider implements AIProvider {\n constructor(private options: OpenAIConfig) {}\n\n private getAgentSystemPrompt(agentType: string): string {\n return UNIFIED_SYSTEM_PROMPT;\n }\n\n async streamChat(prompt: string, options: ChatOptions): Promise<AgentResponse> {\n const conversationId = options.conversationId || crypto.randomUUID();\n\n const history = await HistoryManager.getHistory(conversationId);\n if (history.length === 0) {\n history.push({\n role: 'system',\n content: this.getAgentSystemPrompt(options.agentType)\n });\n }\n\n history.push({ role: 'user', content: prompt });\n\n const requestPayload: any = {\n model: this.options.model,\n messages: history,\n stream: true,\n temperature: 0.2\n };\n\n if (this.options.useStructuredOutputs) {\n requestPayload.response_format = {\n type: 'json_schema',\n json_schema: {\n name: 'agent_response',\n strict: true,\n schema: {\n type: 'object',\n properties: {\n action: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: [\n \"create_file\",\n \"modify_file\",\n \"read_file\",\n \"list_files\",\n \"search_file\",\n \"search_code\",\n \"delete_file\",\n \"run_command\",\n \"talk_with_user\",\n \"use_mcp_tool\",\n \"activate_skill\",\n \"define_subagent\",\n \"invoke_subagent\",\n \"send_message\",\n \"manage_subagents\",\n \"complete_task\",\n \"list_structure\",\n \"modify_ast\",\n \"search_ast\",\n \"ast_list_structure\",\n \"ast_get_method\",\n \"ast_add_method\",\n \"ast_modify_method\",\n \"ast_remove_method\",\n \"ast_add_class\",\n \"ast_get_property\",\n \"ast_add_property\",\n \"ast_modify_property\",\n \"ast_remove_property\",\n \"ast_add_decorator\",\n \"ast_add_interface\",\n \"ast_add_type_alias\",\n \"ast_add_function\",\n \"ast_remove_function\",\n \"ast_add_import\",\n \"ast_remove_import\",\n \"ast_organize_imports\"\n ]\n },\n path: { type: ['string', 'null'] },\n content: { type: ['string', 'null'] },\n start_anchor: { type: ['string', 'null'] },\n end_anchor: { type: ['string', 'null'] },\n command: { type: ['string', 'null'] },\n query: { type: ['string', 'null'] },\n tool_name: { type: ['string', 'null'] },\n tool_args: { type: ['string', 'null'] },\n line_range: {\n type: ['array', 'null'],\n items: { type: 'number' }\n },\n target_content: { type: ['string', 'null'] },\n is_regex: { type: ['boolean', 'null'] },\n pattern: { type: ['string', 'null'] },\n fix: { type: ['string', 'null'] },\n language: { type: ['string', 'null'] },\n file_path: { type: ['string', 'null'] },\n class_name: { type: ['string', 'null'] },\n method_name: { type: ['string', 'null'] },\n method_code: { type: ['string', 'null'] },\n property_name: { type: ['string', 'null'] },\n property_code: { type: ['string', 'null'] },\n extends_class: { type: ['string', 'null'] },\n implements_interfaces: {\n type: ['array', 'null'],\n items: { type: 'string' }\n },\n decorator_code: { type: ['string', 'null'] },\n interface_code: { type: ['string', 'null'] },\n type_code: { type: ['string', 'null'] },\n function_name: { type: ['string', 'null'] },\n function_code: { type: ['string', 'null'] },\n import_statement: { type: ['string', 'null'] },\n module_path: { type: ['string', 'null'] },\n new_body: { type: ['string', 'null'] },\n confirmed: { type: ['boolean', 'null'] },\n skill_name: { type: ['string', 'null'] },\n Subagents: {\n type: ['array', 'null'],\n items: {\n type: 'object',\n properties: {\n TypeName: { type: 'string' },\n Role: { type: 'string' },\n Prompt: { type: 'string' }\n },\n required: [\"TypeName\", \"Role\", \"Prompt\"],\n additionalProperties: false\n }\n },\n Recipient: { type: ['string', 'null'] },\n Message: { type: ['string', 'null'] },\n Action: { type: ['string', 'null'] },\n ConversationIds: {\n type: ['array', 'null'],\n items: { type: 'string' }\n },\n name: { type: ['string', 'null'] },\n description: { type: ['string', 'null'] },\n system_prompt: { type: ['string', 'null'] },\n enable_write_tools: { type: ['boolean', 'null'] },\n enable_subagent_tools: { type: ['boolean', 'null'] },\n enable_mcp_tools: { type: ['boolean', 'null'] }\n },\n required: [\n \"type\", \"path\", \"content\", \"start_anchor\", \"end_anchor\", \"command\", \"query\", \"tool_name\", \"tool_args\",\n \"line_range\", \"target_content\", \"is_regex\", \"pattern\", \"fix\", \"language\", \"file_path\",\n \"class_name\", \"method_name\", \"method_code\", \"property_name\", \"property_code\", \"extends_class\", \"implements_interfaces\",\n \"decorator_code\", \"interface_code\", \"type_code\", \"function_name\", \"function_code\", \"import_statement\", \"module_path\", \"new_body\",\n \"confirmed\", \"skill_name\", \"Subagents\", \"Recipient\", \"Message\", \"Action\", \"ConversationIds\",\n \"name\", \"description\", \"system_prompt\", \"enable_write_tools\", \"enable_subagent_tools\", \"enable_mcp_tools\"\n ],\n additionalProperties: false\n },\n summary: { type: 'string' }\n },\n required: [\"action\", \"summary\"],\n additionalProperties: false\n }\n }\n };\n } else {\n requestPayload.response_format = { type: 'json_object' };\n }\n\n const headers: any = {\n 'Content-Type': 'application/json'\n };\n if (this.options.apiKey) {\n headers['Authorization'] = `Bearer ${this.options.apiKey}`;\n }\n\n const sanitizedHeaders = { ...headers };\n if (sanitizedHeaders['Authorization']) {\n sanitizedHeaders['Authorization'] = 'Bearer ***';\n }\n FileLogger.log('PROVIDER_REQUEST', 'Request payload sent to OpenAI Compatible API', {\n baseURL: this.options.baseURL,\n headers: sanitizedHeaders,\n payload: requestPayload\n });\n\n const res = await fetch(`${this.options.baseURL}/chat/completions`, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestPayload)\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n throw new Error(`OpenAI API request failed: ${res.status} ${res.statusText} - ${errBody}`);\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n throw new Error('Response body reader is undefined');\n }\n\n try {\n const decoder = new TextDecoder();\n let fullContent = '';\n let done = false;\n let buffer = '';\n\n while (!done) {\n const { value, done: doneReading } = await reader.read();\n done = doneReading;\n if (value) {\n buffer += decoder.decode(value, { stream: !done });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || ''; // Keep the last incomplete line in the buffer\n\n for (const line of lines) {\n const clean = line.trim();\n if (!clean || clean === 'data: [DONE]') continue;\n if (clean.startsWith('data: ')) {\n let parsed: any;\n try {\n parsed = JSON.parse(clean.substring(6));\n } catch {\n // ignore JSON parse error\n continue;\n }\n if (parsed && parsed.error) {\n throw new Error(`OpenAI Stream Error: ${JSON.stringify(parsed.error)}`);\n }\n const delta = parsed?.choices?.[0]?.delta?.content || '';\n if (delta) {\n fullContent += delta;\n if (options.onChunk) {\n options.onChunk(delta);\n }\n }\n }\n }\n }\n }\n\n // Process any remaining data in buffer\n if (buffer) {\n const clean = buffer.trim();\n if (clean && clean !== 'data: [DONE]' && clean.startsWith('data: ')) {\n let parsed: any;\n try {\n parsed = JSON.parse(clean.substring(6));\n } catch {\n // ignore JSON parse error\n }\n if (parsed && parsed.error) {\n throw new Error(`OpenAI Stream Error: ${JSON.stringify(parsed.error)}`);\n }\n const delta = parsed?.choices?.[0]?.delta?.content || '';\n if (delta) {\n fullContent += delta;\n if (options.onChunk) {\n options.onChunk(delta);\n }\n }\n }\n }\n\n FileLogger.log('PROVIDER_RESPONSE', 'Raw response from OpenAI Compatible API', { fullContent });\n const parsedResponse = parseAgentResponse(fullContent);\n parsedResponse.conversation_id = conversationId;\n\n // Save LLM response to history\n history.push({ role: 'assistant', content: JSON.stringify(parsedResponse) });\n await HistoryManager.saveHistory(conversationId, history);\n\n if (options.onComplete) {\n options.onComplete(parsedResponse);\n }\n\n return parsedResponse;\n } finally {\n if (typeof reader.releaseLock === 'function') {\n reader.releaseLock();\n }\n }\n }\n}\n","import { AIProvider } from './provider.interface.js';\nimport { StackSpotProvider } from './stackspot-provider.js';\nimport { OpenAICompatibleProvider } from './openai-compatible-provider.js';\nimport { ConfigManager } from '../config-manager.js';\n\nexport class ProviderResolver {\n static getProvider(agentType: 'business_analyst' | 'developer_agent' | 'qa_agent' | 'specification_agent' | 'scan_agent' | 'code_review'): AIProvider {\n const config = ConfigManager.getInstance().getConfig() as any;\n \n if (config.provider === 'openai-compatible') {\n const opt = config['openai-compatible'] || {};\n return new OpenAICompatibleProvider({\n baseURL: opt.baseURL || 'http://localhost:11434/v1',\n apiKey: opt.apiKey || 'ollama',\n model: opt.model || 'llama3',\n useStructuredOutputs: opt.useStructuredOutputs ?? true\n });\n }\n \n return new StackSpotProvider(agentType);\n }\n}\n","import { workflowManager } from './workflow-manager.js';\n\n/**\n * Manages conversation IDs for agent interactions.\n * Stores conversation IDs in the workflow state to maintain context across sessions.\n */\nexport class ConversationManager {\n private static instance: ConversationManager;\n\n private constructor() { }\n\n public static getInstance(): ConversationManager {\n if (!ConversationManager.instance) {\n ConversationManager.instance = new ConversationManager();\n }\n return ConversationManager.instance;\n }\n\n /**\n * Saves a conversation ID for a specific agent type.\n * \n * @param agentType - The type of agent (e.g., 'business_analyst', 'architect')\n * @param conversationId - The conversation ID from the agent response\n */\n async saveConversationId(agentType: string, conversationId: string): Promise<void> {\n const state = await workflowManager.load();\n if (!state) {\n throw new Error('No workflow state found. Please run \"shark init\" first.');\n }\n\n // Initialize conversations object if it doesn't exist\n if (!state.conversations) {\n state.conversations = {};\n }\n\n state.conversations[agentType] = conversationId;\n await workflowManager.save(state);\n }\n\n /**\n * Retrieves the conversation ID for a specific agent type.\n * \n * @param agentType - The type of agent\n * @returns The conversation ID, or undefined if none exists\n */\n async getConversationId(agentType: string): Promise<string | undefined> {\n const state = await workflowManager.load();\n if (!state || !state.conversations) {\n return undefined;\n }\n\n return state.conversations[agentType];\n }\n\n /**\n * Clears the conversation ID for a specific agent type.\n * \n * @param agentType - The type of agent\n */\n async clearConversationId(agentType: string): Promise<void> {\n const state = await workflowManager.load();\n if (!state || !state.conversations) {\n return;\n }\n\n delete state.conversations[agentType];\n await workflowManager.save(state);\n }\n\n /**\n * Clears all conversation IDs.\n * Useful when transitioning to a new project or resetting state.\n */\n async clearAllConversations(): Promise<void> {\n const state = await workflowManager.load();\n if (!state) {\n return;\n }\n\n state.conversations = {};\n await workflowManager.save(state);\n }\n}\n\nexport const conversationManager = ConversationManager.getInstance();\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { diffLines } from 'diff';\n\ninterface LineState {\n anchor: string;\n text: string;\n}\n\nexport class AnchorStateManager {\n private cache = new Map<string, LineState[]>();\n private wordPool: string[] = [];\n\n constructor() {\n this.initializeWordPool();\n }\n\n private initializeWordPool() {\n this.wordPool = [\n // group 1\n \"apple\", \"beach\", \"cabin\", \"dust\", \"edge\", \"stone\", \"river\", \"tree\", \"leaf\", \"flower\",\n \"grass\", \"seed\", \"soil\", \"sand\", \"rock\", \"hill\", \"path\", \"road\", \"street\", \"house\",\n \"room\", \"door\", \"window\", \"wall\", \"roof\", \"floor\", \"desk\", \"chair\", \"table\", \"book\",\n \"pen\", \"paper\", \"bag\", \"box\", \"cup\", \"plate\", \"bowl\", \"spoon\", \"fork\", \"knife\",\n \"food\", \"bread\", \"milk\", \"water\", \"tea\", \"fruit\", \"pear\", \"peach\", \"plum\", \"grape\",\n \"melon\", \"berry\", \"nut\", \"bean\", \"corn\", \"rice\", \"oat\", \"wheat\", \"fish\", \"bird\",\n \"cat\", \"dog\", \"cow\", \"sheep\", \"goat\", \"pig\", \"horse\", \"deer\", \"bear\", \"wolf\",\n \"fox\", \"lion\", \"tiger\", \"seal\", \"whale\", \"crab\", \"frog\", \"toad\", \"snake\", \"worm\",\n \"bee\", \"ant\", \"fly\", \"spider\", \"moth\", \"fern\", \"moss\", \"pine\", \"oak\", \"maple\",\n \"birch\", \"willow\", \"ash\", \"elm\", \"palm\", \"rose\", \"lily\", \"daisy\", \"tulip\", \"iris\",\n // group 2\n \"about\", \"above\", \"actor\", \"acute\", \"admit\", \"adopt\", \"adult\", \"after\", \"again\", \"agent\",\n \"agree\", \"ahead\", \"alarm\", \"album\", \"alert\", \"alike\", \"alive\", \"allow\", \"alone\", \"along\",\n \"alter\", \"among\", \"anger\", \"angle\", \"angry\", \"apart\", \"appeal\", \"apron\", \"arena\", \"argue\",\n \"arise\", \"array\", \"arrow\", \"aside\", \"asset\", \"audio\", \"audit\", \"avoid\", \"award\", \"aware\",\n \"awful\", \"back\", \"bacon\", \"badge\", \"baker\", \"ball\", \"band\", \"bank\", \"base\", \"basic\",\n \"basil\", \"basin\", \"basis\", \"bath\", \"baton\", \"bayou\", \"bead\", \"beak\", \"beam\", \"beast\",\n \"beat\", \"beauty\", \"beef\", \"beer\", \"beet\", \"begin\", \"begun\", \"being\", \"belief\", \"bell\",\n \"belly\", \"below\", \"bench\", \"bend\", \"best\", \"bible\", \"bike\", \"bill\", \"bind\", \"bingo\",\n \"birth\", \"bite\", \"black\", \"blade\", \"blame\", \"blank\", \"blast\", \"blaze\", \"bleed\", \"blend\",\n \"blind\", \"blink\", \"block\", \"blond\", \"blood\", \"bloom\", \"blow\", \"blue\", \"blunt\", \"blush\",\n // group 3\n \"board\", \"boast\", \"boat\", \"body\", \"boil\", \"bold\", \"bolt\", \"bomb\", \"bond\", \"bone\",\n \"bonus\", \"boom\", \"boost\", \"boot\", \"booth\", \"border\", \"bore\", \"boss\", \"both\", \"bough\",\n \"bound\", \"boy\", \"brace\", \"brain\", \"brake\", \"branch\", \"brand\", \"brass\", \"brave\", \"break\",\n \"breast\", \"breath\", \"breezy\", \"brick\", \"bride\", \"bridge\", \"brief\", \"bright\", \"brim\", \"bring\",\n \"brisk\", \"broad\", \"broil\", \"broke\", \"bronze\", \"brook\", \"broom\", \"broth\", \"brown\", \"brush\",\n \"bubble\", \"bucket\", \"buckle\", \"bud\", \"budget\", \"buffet\", \"bugle\", \"build\", \"built\", \"bulb\",\n \"bulk\", \"bull\", \"bullet\", \"bump\", \"bunch\", \"bundle\", \"bunk\", \"bunny\", \"burden\", \"bureau\",\n \"burn\", \"burst\", \"bush\", \"busy\", \"butler\", \"butter\", \"button\", \"buyer\", \"buzz\", \"cable\",\n \"cactus\", \"cage\", \"cake\", \"calf\", \"calm\", \"came\", \"camel\", \"camera\", \"camp\", \"canal\",\n \"candle\", \"candy\", \"cane\", \"canoe\", \"canopy\", \"canvas\", \"canyon\", \"cape\", \"capital\", \"captain\",\n // group 4\n \"car\", \"card\", \"care\", \"cargo\", \"carol\", \"carpet\", \"carrot\", \"carry\", \"cart\", \"carve\",\n \"case\", \"cash\", \"cask\", \"cast\", \"castle\", \"catch\", \"cater\", \"cattle\", \"cause\", \"cave\",\n \"caviar\", \"cavity\", \"cedar\", \"celery\", \"cell\", \"cellar\", \"cello\", \"cement\", \"census\", \"center\",\n \"cereal\", \"chain\", \"chalk\", \"chamber\", \"chance\", \"change\", \"channel\", \"chapel\", \"chapter\", \"char\",\n \"charcoal\", \"charge\", \"charm\", \"chart\", \"chase\", \"chasm\", \"cheap\", \"cheat\", \"check\", \"cheek\",\n \"cheer\", \"cheese\", \"chef\", \"cherry\", \"chess\", \"chest\", \"chew\", \"chick\", \"chief\", \"child\",\n \"chili\", \"chill\", \"chime\", \"chin\", \"china\", \"chip\", \"chirp\", \"chisel\", \"choir\", \"choke\",\n \"choose\", \"chop\", \"chord\", \"chore\", \"chorus\", \"chose\", \"chrome\", \"chubby\", \"chuck\", \"chunk\",\n \"church\", \"cider\", \"cigar\", \"cinder\", \"circle\", \"circus\", \"cite\", \"citizen\", \"city\", \"civic\",\n // group 5\n \"civil\", \"clad\", \"claim\", \"clam\", \"clamp\", \"clan\", \"clap\", \"clasp\", \"class\", \"clause\",\n \"claw\", \"clay\", \"clean\", \"clear\", \"cleat\", \"cleft\", \"clerk\", \"clever\", \"click\", \"client\",\n \"cliff\", \"climate\", \"climb\", \"cling\", \"clinic\", \"clip\", \"cloak\", \"clock\", \"clod\", \"clog\",\n \"clone\", \"close\", \"closet\", \"cloth\", \"cloud\", \"clove\", \"clown\", \"club\", \"cluck\", \"clue\",\n \"clump\", \"clumsy\", \"clung\", \"cluster\", \"coach\", \"coal\", \"coast\", \"coat\", \"cobalt\", \"cobra\",\n \"cobweb\", \"cocoa\", \"coconut\", \"cod\", \"code\", \"coffee\", \"coffin\", \"cog\", \"coil\", \"coin\",\n \"coke\", \"cold\", \"collar\", \"collie\", \"colony\", \"color\", \"colt\", \"column\", \"comb\", \"combat\",\n \"come\", \"comedy\", \"comet\", \"comfort\", \"comic\", \"comma\", \"common\", \"compact\", \"company\", \"compare\",\n // group 6\n \"compass\", \"compel\", \"complex\", \"comply\", \"comrade\", \"concise\", \"concrete\", \"condor\", \"cone\", \"confer\",\n \"conga\", \"conic\", \"connect\", \"consul\", \"contest\", \"context\", \"contract\", \"control\", \"convert\", \"convex\",\n \"convey\", \"convoy\", \"cook\", \"cookie\", \"cool\", \"coop\", \"cope\", \"copper\", \"copy\", \"coral\",\n \"cord\", \"core\", \"cork\", \"corner\", \"cornet\", \"corps\", \"cosmic\", \"cost\", \"costume\", \"cottage\",\n \"cotton\", \"couch\", \"cough\", \"could\", \"council\", \"counsel\", \"count\", \"counter\", \"country\", \"county\",\n \"coup\", \"couple\", \"courage\", \"course\", \"court\", \"cousin\", \"cove\", \"cover\", \"covet\", \"coward\",\n \"coyote\", \"crack\", \"cradle\", \"craft\", \"crag\", \"cram\", \"cramp\", \"cranberry\", \"crane\", \"crank\",\n \"crash\", \"crate\", \"crater\", \"cravat\", \"crave\", \"craw\", \"crawl\", \"crayon\", \"craze\", \"crazy\",\n \"creak\", \"cream\", \"create\", \"credit\", \"creed\", \"creek\", \"creep\", \"crepe\", \"cress\", \"crest\",\n // group 7\n \"crew\", \"crib\", \"cricket\", \"cried\", \"crier\", \"crime\", \"crimson\", \"cringe\", \"cripple\", \"crisis\",\n \"crisp\", \"critic\", \"croak\", \"crock\", \"crocus\", \"crony\", \"crook\", \"crop\", \"cross\", \"croup\",\n \"crow\", \"crowd\", \"crown\", \"crude\", \"cruel\", \"crumb\", \"crumple\", \"crush\", \"crust\", \"crutch\",\n \"cry\", \"crypt\", \"crystal\", \"cub\", \"cube\", \"cuckoo\", \"cucumber\", \"cuff\", \"cult\", \"culture\",\n \"cupboard\", \"curb\", \"curd\", \"cure\", \"curfew\", \"curl\", \"currant\", \"current\", \"curry\", \"curse\",\n \"curve\", \"cushion\", \"custard\", \"custom\", \"cut\", \"cute\", \"cutter\", \"cycle\", \"cyclone\", \"cynic\",\n \"cypress\", \"dad\", \"dagger\", \"daily\", \"dairy\", \"dale\", \"dally\", \"dam\", \"damage\", \"dame\",\n \"damp\", \"dance\", \"dandy\", \"danger\", \"dapple\", \"dare\", \"dark\", \"darling\", \"darn\", \"dart\",\n // group 8\n \"dash\", \"date\", \"datum\", \"daub\", \"daughter\", \"dawn\", \"daze\", \"dazzle\", \"deacon\", \"dead\",\n \"deaf\", \"deal\", \"dealer\", \"dean\", \"dear\", \"death\", \"debar\", \"debate\", \"debit\", \"debris\",\n \"debt\", \"decade\", \"decay\", \"decent\", \"decide\", \"deck\", \"declare\", \"decline\", \"decor\", \"decoy\",\n \"decrease\", \"decree\", \"deduct\", \"deed\", \"deep\", \"defeat\", \"defect\", \"defend\", \"defer\",\n \"deficit\", \"defile\", \"define\", \"deform\", \"defray\", \"defy\", \"degree\", \"delay\", \"delegate\", \"delight\",\n \"deliver\", \"dell\", \"delta\", \"deluge\", \"delve\", \"demand\", \"demean\", \"demerit\", \"demise\", \"demo\",\n \"demote\", \"demur\", \"den\", \"denial\", \"denote\", \"denounce\", \"dense\", \"density\", \"dent\", \"dental\",\n \"dentist\", \"deny\", \"depart\", \"depend\", \"depict\", \"deplore\", \"deport\", \"depose\", \"deposit\",\n // group 9\n \"depot\", \"depth\", \"deputy\", \"derby\", \"derive\", \"dervish\", \"descend\", \"descent\", \"describe\", \"desert\",\n \"deserve\", \"design\", \"desire\", \"desolate\", \"despair\", \"despise\", \"despite\", \"despot\", \"dessert\", \"destiny\",\n \"destroy\", \"detach\", \"detail\", \"detain\", \"detect\", \"deter\", \"detest\", \"detour\", \"deuce\", \"develop\",\n \"deviate\", \"device\", \"devil\", \"devise\", \"devoid\", \"devote\", \"devour\", \"devout\", \"dew\", \"diagram\",\n \"dial\", \"dialect\", \"dialogue\", \"diameter\", \"diamond\", \"diary\", \"dice\", \"dictate\", \"diction\", \"dictionary\",\n \"did\", \"die\", \"diet\", \"differ\", \"difficult\", \"diffuse\", \"dig\", \"digest\", \"digger\", \"digit\",\n \"dignity\", \"dike\", \"dilute\", \"dim\", \"dime\", \"diminish\", \"dimple\", \"din\", \"dine\", \"diner\",\n \"dinghy\", \"dingle\", \"dinner\", \"dint\", \"dip\", \"diphthong\", \"diploma\", \"dire\", \"direct\", \"director\",\n // group 10\n \"dirge\", \"dirk\", \"dirt\", \"dirty\", \"disable\", \"disarm\", \"disaster\", \"disavow\", \"disband\", \"discard\",\n \"discern\", \"discharge\", \"disciple\", \"discipline\", \"disclose\", \"discomfit\", \"discord\", \"discount\", \"discourse\", \"discover\",\n \"discreet\", \"discrepant\", \"discretion\", \"discuss\", \"disdain\", \"disease\", \"disfavor\", \"disfigure\", \"disgrace\", \"disguise\",\n \"disgust\", \"dish\", \"dishevel\", \"dishonest\", \"dishonor\", \"disinfect\", \"disinherit\", \"disintegrate\", \"dislike\", \"dislocate\",\n \"dislodge\", \"disloyal\", \"dismal\", \"dismantle\", \"dismay\", \"dismember\", \"dismiss\", \"dismount\", \"disobey\", \"disorder\",\n \"disown\", \"disparage\", \"disparate\", \"disparity\", \"dispatch\", \"dispel\", \"dispense\", \"disperse\", \"displace\", \"display\",\n \"displease\", \"dispose\", \"disprove\", \"dispipe\", \"disqualify\", \"disquiet\", \"disregard\", \"disrepute\", \"disrespect\", \"disrobe\",\n \"disrupt\", \"dissatisfy\", \"dissect\", \"dissemble\", \"disseminate\", \"dissent\", \"dissertation\", \"disservice\", \"dissident\", \"dissimilar\",\n \"dissipate\", \"dissolve\", \"dissonant\", \"dissuade\", \"distance\", \"distant\", \"distaste\", \"distemper\", \"distend\", \"distich\",\n \"distill\", \"distinct\", \"distinguish\", \"distort\", \"distract\", \"distrain\", \"distress\", \"distribute\", \"district\", \"distrust\",\n \"disturb\", \"disunion\", \"disuse\", \"ditch\", \"ditty\", \"diurnal\", \"divan\", \"dive\", \"diverge\", \"diverse\",\n \"diversion\", \"diversity\", \"divert\", \"divest\", \"divide\", \"dividend\", \"divine\", \"diviner\", \"divinity\", \"divisible\",\n \"division\", \"divisor\", \"divorce\", \"divulge\", \"dizzy\", \"do\", \"docile\", \"dock\", \"doctor\", \"doctrine\",\n \"document\", \"dodge\", \"doe\", \"doer\", \"dogma\", \"dogmatic\", \"dole\", \"doll\", \"dollar\", \"domain\",\n \"dome\", \"domestic\", \"domicile\", \"dominant\", \"dominate\", \"domineer\", \"dominion\", \"domino\", \"don\", \"donation\",\n \"done\", \"donkey\", \"donor\", \"doom\", \"dormant\", \"dormitory\", \"dormouse\", \"dose\", \"dot\", \"double\",\n \"doublet\", \"doubt\", \"doubtful\", \"dough\", \"doughnut\", \"doughty\", \"dour\", \"douse\", \"dove\", \"dowager\",\n \"dowdy\", \"dower\", \"downcast\", \"downfall\", \"downright\", \"downy\", \"dowry\"\n ];\n }\n\n private allocateAnchor(usedAnchors: Set<string>): string {\n for (const word of this.wordPool) {\n if (!usedAnchors.has(word)) {\n usedAnchors.add(word);\n return word;\n }\n }\n let counter = 1;\n while (true) {\n const word = `anchor_${counter}`;\n if (!usedAnchors.has(word)) {\n usedAnchors.add(word);\n return word;\n }\n counter++;\n }\n }\n\n getAnchoredContent(filePath: string): string {\n const absolutePath = path.resolve(filePath);\n let lineStates = this.cache.get(absolutePath);\n\n if (!lineStates) {\n const content = fs.readFileSync(absolutePath, 'utf8');\n const hasTrailingNewline = content.endsWith('\\n');\n const lines = hasTrailingNewline ? content.slice(0, -1).split('\\n') : content.split('\\n');\n const usedAnchors = new Set<string>();\n\n lineStates = lines.map(line => {\n const anchor = this.allocateAnchor(usedAnchors);\n return { anchor, text: line };\n });\n\n this.cache.set(absolutePath, lineStates);\n }\n\n return lineStates.map(ls => `${ls.anchor}§${ls.text}`).join('\\n');\n }\n\n applyAnchoredEdit(filePath: string, startAnchor: string, endAnchor: string, content: string): void {\n const absolutePath = path.resolve(filePath);\n let lineStates = this.cache.get(absolutePath);\n\n if (!lineStates) {\n this.getAnchoredContent(absolutePath);\n lineStates = this.cache.get(absolutePath)!;\n }\n\n const startIndex = lineStates.findIndex(ls => ls.anchor === startAnchor);\n if (startIndex === -1) {\n throw new Error(`Start anchor \"${startAnchor}\" not found`);\n }\n\n const endIndex = lineStates.findIndex(ls => ls.anchor === endAnchor);\n if (endIndex === -1) {\n throw new Error(`End anchor \"${endAnchor}\" not found`);\n }\n\n if (startIndex > endIndex) {\n throw new Error(`Invalid range: start anchor \"${startAnchor}\" is after end anchor \"${endAnchor}\"`);\n }\n\n const originalContent = fs.readFileSync(absolutePath, 'utf8');\n const hasTrailingNewline = originalContent.endsWith('\\n');\n\n const oldLines = lineStates.map(ls => ls.text);\n const cleanContent = content.endsWith('\\n') ? content.slice(0, -1) : content;\n const newEditLines = cleanContent.split('\\n');\n\n const updatedLines = [\n ...oldLines.slice(0, startIndex),\n ...newEditLines,\n ...oldLines.slice(endIndex + 1)\n ];\n\n const fileContentToWrite = updatedLines.join('\\n') + (hasTrailingNewline ? '\\n' : '');\n fs.writeFileSync(absolutePath, fileContentToWrite, 'utf8');\n\n // Collect all anchors in the file (unchanged prefix, suffix, and the old edit segment) to avoid duplicate allocations\n const usedAnchors = new Set<string>();\n for (let i = 0; i < lineStates.length; i++) {\n usedAnchors.add(lineStates[i].anchor);\n }\n\n // Diff only the edited range\n const oldEditSegment = lineStates.slice(startIndex, endIndex + 1);\n const oldEditLines = oldEditSegment.map(ls => ls.text);\n const diffs = diffLines(oldEditLines.join('\\n'), cleanContent);\n\n const reconciledEditStates: LineState[] = [];\n let oldEditIndex = 0;\n\n for (const change of diffs) {\n const changeLines = change.value.split('\\n');\n if (changeLines.length > 1 && changeLines[changeLines.length - 1] === '') {\n changeLines.pop();\n }\n\n if (change.removed) {\n oldEditIndex += changeLines.length;\n } else if (change.added) {\n for (const line of changeLines) {\n const anchor = this.allocateAnchor(usedAnchors);\n reconciledEditStates.push({ anchor, text: line });\n }\n } else {\n for (let i = 0; i < changeLines.length; i++) {\n const oldLs = oldEditSegment[oldEditIndex];\n if (oldLs) {\n reconciledEditStates.push({ anchor: oldLs.anchor, text: oldLs.text });\n usedAnchors.add(oldLs.anchor);\n } else {\n const anchor = this.allocateAnchor(usedAnchors);\n reconciledEditStates.push({ anchor, text: changeLines[i] });\n }\n oldEditIndex++;\n }\n }\n }\n\n const finalLineStates = [\n ...lineStates.slice(0, startIndex),\n ...reconciledEditStates,\n ...lineStates.slice(endIndex + 1)\n ];\n\n this.cache.set(absolutePath, finalLineStates);\n }\n}\n","import { ProviderResolver } from '../api/provider-resolver.js';\nimport { conversationManager } from '../workflow/conversation-manager.js';\nimport { tui } from '../../ui/tui.js';\nimport { colors } from '../../ui/colors.js';\nimport { AnchorStateManager } from '../workflow/anchor-state-manager.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { handleRunCommand, handleListFiles, handleSearchFile, handleSearchCode } from './agent-tools.js';\nimport { skillManager } from '../workflow/skill-manager.js';\nimport { subagentManager } from '../workflow/subagent-manager.js';\nimport { FileLogger } from '../debug/file-logger.js';\nimport { MessageQueue, QueueMessage } from '../workflow/message-queue.js';\n\nconst AGENT_TYPE = 'developer_agent';\n\nasync function promptUser(message: string, initialValue?: string, placeholder?: string, prefix: string = ''): Promise<string> {\n let userReply = await tui.text({ message: `${prefix}${message}`, initialValue, placeholder });\n \n while (userReply === '/skills') {\n const availableSkills = await skillManager.listAvailableSkills();\n const options = availableSkills.map(name => ({ value: name, label: name }));\n if (options.length === 0) {\n tui.log.warning('Nenhuma skill encontrada. Execute `shark super` para instalar as skills.');\n } else {\n const selectedSkill = await tui.select({\n message: 'Selecione a Skill do Superpowers para ativar:',\n options\n });\n if (!tui.isCancel(selectedSkill)) {\n await skillManager.activateSkill(selectedSkill as string);\n tui.log.success(`✔ Skill '${selectedSkill}' ativada com sucesso!`);\n }\n }\n userReply = await tui.text({ \n message: `${prefix}${message}`, \n initialValue, \n placeholder: 'digite a instrução da tarefa...' \n });\n }\n \n return userReply as string;\n}\n\nexport async function waitForInputOrNotification(\n queue: MessageQueue,\n promptMessage: string = 'Your answer:',\n subagentPrefix: string = '',\n timeoutMs?: number\n): Promise<QueueMessage> {\n let cancelled = false;\n let resolvePromptPromise: ((value: QueueMessage) => void) | null = null;\n let timerId: any = null;\n\n const promptPromise = new Promise<QueueMessage>((resolve) => {\n resolvePromptPromise = resolve;\n });\n\n const runPrompt = async () => {\n try {\n const userReply = await promptUser(promptMessage, undefined, undefined, subagentPrefix);\n if (!cancelled && resolvePromptPromise) {\n resolvePromptPromise({\n type: 'user',\n content: userReply,\n timestamp: Date.now()\n });\n }\n } catch (e) {}\n };\n runPrompt();\n\n const queuePromise = queue.next();\n\n const promises: Promise<QueueMessage>[] = [promptPromise, queuePromise];\n\n if (timeoutMs !== undefined && timeoutMs !== null) {\n const timeoutPromise = new Promise<QueueMessage>((resolve) => {\n timerId = setTimeout(() => {\n resolve({\n type: 'timeout',\n content: 'Wait timeout expired.',\n timestamp: Date.now()\n });\n }, timeoutMs);\n });\n promises.push(timeoutPromise);\n }\n\n const winner = await Promise.race(promises);\n\n if (timerId) {\n clearTimeout(timerId);\n }\n\n if (winner.type === 'subagent_notification' || winner.type === 'timeout') {\n cancelled = true;\n process.stdin.emit('data', '\\r');\n await new Promise(r => setTimeout(r, 50));\n if (process.stdout.isTTY) {\n process.stdout.write('\\x1b[1A\\x1b[2K\\x1b[1A\\x1b[2K');\n }\n }\n\n return winner;\n}\n\n\nfunction formatRoleForUI(role: string): string {\n const limit = 20;\n if (role.length <= limit) return role;\n return role.substring(0, limit - 3) + '...';\n}\n\nexport interface DevelopmentResult {\n success: boolean;\n summary: string;\n}\n\nexport async function interactiveDeveloperAgent(options: {\n taskId?: string,\n taskInstruction?: string,\n context?: string,\n history?: string,\n auto?: boolean\n} = {}): Promise<DevelopmentResult> {\n const isAuto = options.auto === true || process.argv.includes('--auto');\n const isSubagent = !!options.taskId && (options.taskId.startsWith('subagent-') || subagentManager.hasSubagent(options.taskId));\n const projectRoot = process.cwd();\n const messageQueue = new MessageQueue();\n \n let currentTask = options.taskInstruction;\n if (!currentTask) {\n if (isSubagent) {\n currentTask = 'Subagent Task';\n } else {\n const userTask = await promptUser(\n 'O que você gostaria que o Shark Dev fizesse?',\n undefined,\n 'ex: crie uma API REST simples ou digite /skills para ativar diretrizes'\n );\n if (tui.isCancel(userTask) || !userTask) {\n return { success: false, summary: 'Task execution cancelled.' };\n }\n currentTask = userTask;\n }\n }\n\n let subagentPrefix = '';\n if (options.taskId) {\n const subState = subagentManager.getSubagentState(options.taskId);\n if (subState) {\n subagentPrefix = `[Subagent: ${formatRoleForUI(subState.role)}] `;\n }\n }\n\n const log = {\n info: (msg: string) => tui.log.info(`${subagentPrefix}${msg}`),\n warning: (msg: string) => tui.log.warning(`${subagentPrefix}${msg}`),\n error: (msg: string) => tui.log.error(`${subagentPrefix}${msg}`),\n success: (msg: string) => tui.log.success(`${subagentPrefix}${msg}`),\n message: (msg: string) => tui.log.message(`${subagentPrefix}${msg}`),\n };\n\n // Load context if available\n let contextContent = '';\n const defaultContextPath = path.resolve(projectRoot, '_sharkrc', 'project-context.md');\n const specificContextPath = options.context ? path.resolve(projectRoot, options.context) : defaultContextPath;\n\n if (fs.existsSync(specificContextPath)) {\n try {\n contextContent = fs.readFileSync(specificContextPath, 'utf-8');\n } catch (e) {\n log.warning(`Failed to read context file: ${e}`);\n }\n }\n\n // Build Prompt\n let basePrompt = ``;\n if (contextContent) {\n basePrompt += `\\n\\n--- PROJECT CONTEXT ---\\n${contextContent}\\n-----------------------\\n`;\n }\n\n if (options.history) {\n basePrompt += `\\n\\n--- PREVIOUS EXECUTION SUMMARY ---\\n${options.history}\\n----------------------------------\\n`;\n }\n\n basePrompt += `\\n\\n🟢 EXECUTION MODE\\n\nYou are a highly skilled Developer Agent.\n👉 **CURRENT TASK**: \"${currentTask}\"\n\nYour goal is to address the user's request:\n- If the request is a question, a request for explanation, or a discussion, answer the user using the 'talk_with_user' action. You can search the codebase or read files first to answer accurately. Once the explanation/discussion is complete, output a final response starting with \"TASK_COMPLETED:\" followed by a brief summary.\n- If the request is to implement changes, debug, or write code:\n 1. Implement the necessary changes.\n 2. Verify (compile/test).\n 3. When you are confident the task is done, output a final response starting with \"TASK_COMPLETED:\" followed by a brief technical summary of what you did.\n`;\n\n let nextPrompt = basePrompt;\n let keepGoing = true;\n let finalSummary = \"\";\n const conversationKey = options.taskId ? `dev_agent_${options.taskId}` : `dev_agent_${Date.now()}`;\n const anchorManager = new AnchorStateManager();\n\n const spinner = tui.spinner();\n\n const handleCleanupSignal = (exitCode: number) => {\n const currentId = options.taskId || 'parent';\n const active = subagentManager.getActiveSubagentsForParent(currentId);\n if (active.length > 0) {\n for (const sub of active) {\n subagentManager.killSubagent(sub.id);\n }\n }\n process.exit(exitCode);\n };\n const sigIntHandler = () => handleCleanupSignal(130);\n const sigTermHandler = () => handleCleanupSignal(143);\n\n process.on('SIGINT', sigIntHandler);\n process.on('SIGTERM', sigTermHandler);\n\n try {\n while (keepGoing) {\n // Check if this subagent has been terminated by parent (only if it is a registered subagent)\n if (options.taskId && subagentManager.hasSubagent(options.taskId) && !subagentManager.isSubagentActive(options.taskId)) {\n log.warning(`Subagent ${options.taskId} was terminated.`);\n return { success: false, summary: 'Subagent terminated by manager.' };\n }\n\n // Retrieve incoming mailbox messages for this subagent or parent\n const recipientId = options.taskId || 'parent';\n const mailboxMessages = subagentManager.retrieveMessages(recipientId);\n let currentTurnPrompt = nextPrompt;\n if (mailboxMessages.length > 0) {\n currentTurnPrompt += `\\n\\n✉️ NEW MAILBOX MESSAGES:\\n${mailboxMessages.map(m => `- ${m}`).join('\\n')}\\n`;\n }\n\n // Inject active subagent status panel\n const myId = options.taskId || 'parent';\n const allSubagents = subagentManager.getActiveSubagentsForParent(myId);\n if (allSubagents.length > 0) {\n let panel = `\\n\\n--- CURRENT ACTIVE SUBAGENTS ---\\n`;\n panel += `You have ${allSubagents.length} active subagent(s) running in the background:\\n`;\n for (const sub of allSubagents) {\n panel += `- ID: ${sub.id} | Role: ${sub.role} | Status: ${sub.status}\\n`;\n }\n panel += `Use the 'wait' action if you have no other work and are waiting for these subagents to complete.\\n`;\n panel += `--------------------------------\\n`;\n currentTurnPrompt += panel;\n }\n\n // Append skill extension to this turn's prompt\n const promptToSend = currentTurnPrompt + skillManager.getSystemInstructionExtension();\n\n try {\n const activeSubagents = subagentManager.getActiveSubagents();\n const activeCount = activeSubagents.length;\n const spinnerText = activeCount > 0\n ? `🦈 Shark Dev working... (Active subagents: ${activeCount})`\n : '🦈 Shark Dev working...';\n spinner.start(spinnerText);\n\n const existingConversationId = await conversationManager.getConversationId(conversationKey);\n const provider = ProviderResolver.getProvider('developer_agent');\n const response = await provider.streamChat(promptToSend, {\n conversationId: existingConversationId,\n agentType: 'developer_agent',\n onChunk: () => {}\n });\n\n if (response.conversation_id) {\n await conversationManager.saveConversationId(conversationKey, response.conversation_id);\n }\n\n spinner.stop('Response received');\n\n if (response.summary) {\n if (options.taskId) {\n subagentManager.updateSubagentSummary(options.taskId, response.summary);\n }\n log.info(`📌 Status: ${response.summary}`);\n }\n\n // Handle completion/failure messages\n if (response.message && response.message.includes('TASK_COMPLETED:')) {\n finalSummary = response.message.split('TASK_COMPLETED:')[1].trim();\n log.success(`✔ Task Completed: ${finalSummary}`);\n \n if (options.taskId) {\n subagentManager.updateSubagentSummary(options.taskId, finalSummary);\n keepGoing = false;\n break;\n }\n\n if (!options.taskInstruction) {\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Your answer:', subagentPrefix);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n keepGoing = false;\n break;\n }\n }\n nextPrompt = nextMsg.content;\n continue;\n } else {\n keepGoing = false;\n break;\n }\n }\n\n if (response.message && response.message.includes('TASK_FAILED:')) {\n const failureReason = response.message.split('TASK_FAILED:')[1].trim();\n log.error(`❌ Agent reported task failure: ${failureReason}`);\n \n if (options.taskId) {\n if (process.env.SHARK_PARENT_ID) {\n const parentId = process.env.SHARK_PARENT_ID;\n const role = process.env.SHARK_SUBAGENT_ROLE || 'Subagent';\n subagentManager.sendMessage(\n parentId,\n `[Subagent Notification] Subagent ${role} (${options.taskId}) has finished with status: FAILED. Summary: ${failureReason}`\n );\n }\n return { success: false, summary: failureReason };\n }\n\n if (!options.taskInstruction) {\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Your answer:', subagentPrefix);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n return { success: false, summary: failureReason };\n }\n }\n nextPrompt = nextMsg.content;\n continue;\n } else {\n return { success: false, summary: failureReason };\n }\n }\n\n const action = response.action;\n\n if (!action) {\n if (isSubagent) {\n log.warning('No action returned by the subagent. Exiting loop.');\n keepGoing = false;\n break;\n }\n\n if (response.message) {\n log.info(colors.primary('🤖 Shark Dev:'));\n console.log(response.message);\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Your answer:', subagentPrefix);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n keepGoing = false;\n break;\n }\n }\n nextPrompt = nextMsg.content;\n } else {\n log.warning('No action or message returned by the agent.');\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Agent returned empty response. Type a message to continue or press Ctrl+C to cancel:', subagentPrefix);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n keepGoing = false;\n break;\n }\n }\n nextPrompt = nextMsg.content;\n }\n continue;\n }\n\n let resultMsg = \"\";\n\n if (action.type === 'read_file') {\n const filePath = action.path || '';\n log.info(`📖 Reading (Anchored): ${colors.dim(filePath)}`);\n try {\n const content = anchorManager.getAnchoredContent(filePath);\n resultMsg = `[Action read_file(${filePath}) Success]:\\n${content}`;\n } catch (e: any) {\n resultMsg = `[Action read_file(${filePath}) Failed]: ${e.message}`;\n }\n }\n else if (action.type === 'modify_file') {\n const filePath = action.path || '';\n log.warning(`📝 Modify (Anchored): ${colors.bold(filePath)}`);\n\n let approved = isAuto;\n if (!approved) {\n approved = await tui.confirm({ message: `Approve modify_file changes to ${filePath}?` });\n }\n\n if (approved) {\n try {\n anchorManager.applyAnchoredEdit(filePath, action.start_anchor || '', action.end_anchor || '', action.content || '');\n resultMsg = `[Action modify_file(${filePath}) Success]`;\n } catch (e: any) {\n resultMsg = `[Action modify_file(${filePath}) Failed]: ${e.message}`;\n }\n } else {\n resultMsg = `[Action modify_file(${filePath}) User Denied]`;\n }\n }\n else if (action.type === 'create_file') {\n const filePath = action.path || '';\n log.warning(`📝 Create file: ${colors.bold(filePath)}`);\n\n let approved = isAuto;\n if (!approved) {\n approved = await tui.confirm({ message: `Approve create_file changes to ${filePath}?` });\n }\n\n if (approved) {\n try {\n const resolvedPath = path.resolve(projectRoot, filePath);\n const dir = path.dirname(resolvedPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(resolvedPath, action.content || '', 'utf-8');\n resultMsg = `[Action create_file(${filePath}) Success]`;\n } catch (e: any) {\n resultMsg = `[Action create_file(${filePath}) Failed]: ${e.message}`;\n }\n } else {\n resultMsg = `[Action create_file(${filePath}) User Denied]`;\n }\n }\n else if (action.type === 'delete_file') {\n const filePath = action.path || '';\n log.warning(`🗑️ Delete file: ${colors.bold(filePath)}`);\n\n let approved = isAuto;\n if (!approved) {\n approved = await tui.confirm({ message: `Approve delete_file changes to ${filePath}?` });\n }\n\n if (approved) {\n try {\n const resolvedPath = path.resolve(projectRoot, filePath);\n if (fs.existsSync(resolvedPath)) {\n fs.rmSync(resolvedPath, { force: true });\n }\n resultMsg = `[Action delete_file(${filePath}) Success]`;\n } catch (e: any) {\n resultMsg = `[Action delete_file(${filePath}) Failed]: ${e.message}`;\n }\n } else {\n resultMsg = `[Action delete_file(${filePath}) User Denied]`;\n }\n }\n else if (action.type === 'run_command') {\n const cmd = action.command || '';\n log.info(`💻 Executing: ${colors.dim(cmd)}`);\n\n let approved = isAuto;\n if (!approved) {\n approved = await tui.confirm({ message: `Execute run_command: ${cmd}?` });\n }\n\n if (approved) {\n try {\n const output = await handleRunCommand(cmd);\n resultMsg = `[Action run_command(${cmd}) Success]:\\n${output}`;\n } catch (e: any) {\n resultMsg = `[Action run_command(${cmd}) Failed]: ${e.message}`;\n }\n } else {\n resultMsg = `[Action run_command(${cmd}) User Denied]`;\n }\n }\n else if (action.type === 'list_files') {\n const dirPath = action.path || '.';\n log.info(`📂 Scanning: ${colors.dim(dirPath)}`);\n try {\n const result = handleListFiles(dirPath);\n resultMsg = `[Action list_files(${dirPath}) Success]:\\n${result}`;\n } catch (e: any) {\n resultMsg = `[Action list_files(${dirPath}) Failed]: ${e.message}`;\n }\n }\n else if (action.type === 'search_file') {\n const pattern = action.path || '';\n log.info(`🔍 Searching files: ${colors.dim(pattern)}`);\n try {\n const result = handleSearchFile(pattern);\n resultMsg = `[Action search_file(${pattern}) Success]:\\n${result}`;\n } catch (e: any) {\n resultMsg = `[Action search_file(${pattern}) Failed]: ${e.message}`;\n }\n }\n else if (action.type === 'search_code') {\n const glob = action.path || 'src/**/*';\n const query = action.query || '';\n const isRegex = action.is_regex === true;\n log.info(`🔎 Search code: ${colors.dim(`\"${query}\" in ${glob}`)}`);\n try {\n const result = handleSearchCode(glob, query, isRegex);\n resultMsg = `[Action search_code(\"${query}\" in \"${glob}\") Success]:\\n${result}`;\n } catch (e: any) {\n resultMsg = `[Action search_code(\"${query}\" in \"${glob}\") Failed]: ${e.message}`;\n }\n }\n else if (action.type === 'use_mcp_tool') {\n resultMsg = `[Action use_mcp_tool Failed]: MCP tools are not configured/available in this agent.`;\n }\n else if (action.type === 'activate_skill') {\n const name = action.skill_name || '';\n log.info(`⚡ Activating skill: ${colors.bold(name)}`);\n try {\n await skillManager.activateSkill(name);\n resultMsg = `[System]: Skill '${name}' activated successfully.`;\n } catch (e: any) {\n resultMsg = `[System]: Failed to activate skill '${name}': ${e.message}`;\n }\n }\n else if (action.type === 'talk_with_user') {\n const isSystemError = action.content?.startsWith('[SYSTEM ERROR]');\n if (isSystemError) {\n log.error(`⚠️ Detectado erro na resposta do Agente (truncado ou inválido).`);\n log.info(colors.dim(action.content || ''));\n if (isSubagent) {\n resultMsg = action.content || '';\n nextPrompt = resultMsg;\n continue; // Retry loop\n } else {\n let approved = isAuto;\n if (!approved) {\n approved = await tui.confirm({ message: `Enviar notificação de erro para o agente tentar se recuperar automaticamente?` });\n }\n if (approved) {\n resultMsg = action.content || '';\n } else {\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Seu prompt alternativo para o agente:', subagentPrefix);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n keepGoing = false;\n break;\n }\n }\n resultMsg = nextMsg.content;\n }\n }\n } else {\n const contentStr = action.content || '';\n const hasCompleted = contentStr.includes('TASK_COMPLETED:');\n \n if (isSubagent) {\n // Subagents cannot prompt the user. Treat talk_with_user as completion\n const summary = hasCompleted ? contentStr.split('TASK_COMPLETED:')[1].trim() : contentStr;\n subagentManager.updateSubagentSummary(options.taskId!, summary);\n finalSummary = summary;\n keepGoing = false;\n break;\n }\n\n if (hasCompleted) {\n finalSummary = contentStr.split('TASK_COMPLETED:')[1].trim();\n log.success(`✔ Task Completed: ${finalSummary}`);\n if (!options.taskInstruction) {\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Your answer:', subagentPrefix);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n keepGoing = false;\n break;\n }\n }\n nextPrompt = nextMsg.content;\n continue;\n } else {\n keepGoing = false;\n break;\n }\n }\n\n log.info(colors.primary('🤖 Shark Dev:'));\n console.log(contentStr);\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Your answer:', subagentPrefix);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n keepGoing = false;\n break;\n }\n resultMsg = `User Reply: ${nextMsg.content}`;\n } else {\n resultMsg = nextMsg.content;\n }\n }\n }\n else if (action.type === 'define_subagent') {\n const name = action.name || '';\n const desc = action.description || '';\n const sysPrompt = action.system_prompt || '';\n const opts = {\n enableWriteTools: action.enable_write_tools ?? undefined,\n enableSubagentTools: action.enable_subagent_tools ?? undefined,\n enableMcpTools: action.enable_mcp_tools ?? undefined\n };\n log.info(`🛠️ Defining subagent type: ${colors.bold(name)}`);\n subagentManager.defineSubagentType(name, desc, sysPrompt, opts);\n resultMsg = `[Action define_subagent Success]: Defined subagent type '${name}'`;\n }\n else if (action.type === 'invoke_subagent') {\n const subagentsToInvoke = action.Subagents || [];\n log.info(`🚀 Invoking ${subagentsToInvoke.length} subagent(s)`);\n const parentId = options.taskId || 'parent';\n const invoked = await subagentManager.invokeSubagents(subagentsToInvoke, parentId, messageQueue);\n resultMsg = `[Action invoke_subagent Success]: Invoked subagents:\\n${invoked.map(s => `- ID: ${s.id}, Type: ${s.TypeName}, Role: ${s.Role}`).join('\\n')}`;\n }\n else if (action.type === 'send_message') {\n const recipient = action.Recipient || '';\n const message = action.Message || '';\n log.info(`✉️ Sending message to ${colors.bold(recipient)}`);\n subagentManager.sendMessage(recipient, message);\n resultMsg = `[Action send_message Success]: Message sent to '${recipient}'`;\n }\n else if (action.type === 'manage_subagents') {\n const subAction = action.Action || '';\n const ids = action.ConversationIds || [];\n log.info(`⚙️ Managing subagents. Action: ${colors.bold(subAction)}`);\n\n if (subAction === 'list') {\n const active = subagentManager.getActiveSubagents();\n resultMsg = `[Action manage_subagents Success]: Active subagents:\\n${active.map(s => `- ID: ${s.id}, Type: ${s.type}, Role: ${s.role}`).join('\\n')}`;\n } else if (subAction === 'read_logs') {\n const id = ids[0];\n if (!id) {\n resultMsg = `[Action manage_subagents Failed]: No subagent ID provided in ConversationIds.`;\n } else {\n try {\n const logs = subagentManager.getSubagentLogs(id);\n resultMsg = `[Action manage_subagents Success]: Last log lines for subagent ${id}:\\n\\`\\`\\`\\n${logs}\\n\\`\\`\\``;\n } catch (e: any) {\n resultMsg = `[Action manage_subagents Failed]: ${e.message}`;\n }\n }\n } else if (subAction === 'kill') {\n for (const id of ids) {\n subagentManager.killSubagent(id);\n }\n resultMsg = `[Action manage_subagents Success]: Terminated subagents: ${ids.join(', ')}`;\n } else if (subAction === 'kill_all') {\n subagentManager.killAllSubagents();\n resultMsg = `[Action manage_subagents Success]: Terminated all active subagents`;\n } else {\n resultMsg = `[Action manage_subagents Failed]: Unknown action '${subAction}'`;\n }\n }\n else if (action.type === 'complete_task') {\n const detailedContent = action.content || '';\n const taskSummary = action.summary || 'Task completed successfully.';\n \n if (isSubagent) {\n subagentManager.updateSubagentSummary(options.taskId!, taskSummary);\n // Send the detailed markdown content to parent mailbox instead of just a 1-sentence summary\n if (process.env.SHARK_PARENT_ID) {\n subagentManager.sendMessage(\n process.env.SHARK_PARENT_ID,\n `[Subagent Notification] Subagent ${process.env.SHARK_SUBAGENT_ROLE || 'Subagent'} (${options.taskId}) completed.\\nResult Details:\\n${detailedContent}`\n );\n }\n }\n \n finalSummary = taskSummary;\n keepGoing = false;\n break;\n }\n else if (action.type === 'wait') {\n const durationSeconds = action.duration_seconds || 0;\n const durationMs = durationSeconds > 0 ? durationSeconds * 1000 : undefined;\n log.info(`⏳ Waiting for updates (Timeout: ${durationSeconds || 'infinite'}s)...`);\n \n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Your answer:', subagentPrefix, durationMs);\n }\n\n if (nextMsg.type === 'timeout') {\n resultMsg = `[System]: Wait duration of ${durationSeconds} seconds expired. No notifications received.`;\n } else if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n keepGoing = false;\n break;\n }\n resultMsg = `User Reply: ${nextMsg.content}`;\n } else {\n resultMsg = nextMsg.content;\n }\n }\n else {\n resultMsg = `[Unsupported action type: ${action.type}]`;\n }\n\n FileLogger.log('TOOL_EXECUTION', `Action: ${action.type}`, { action, result: resultMsg });\n nextPrompt = resultMsg;\n\n } catch (e: any) {\n log.error(e.message);\n if (options.taskId && process.env.SHARK_PARENT_ID) {\n const parentId = process.env.SHARK_PARENT_ID;\n const role = process.env.SHARK_SUBAGENT_ROLE || 'Subagent';\n subagentManager.sendMessage(\n parentId,\n `[Subagent Notification] Subagent ${role} (${options.taskId}) has finished with status: FAILED. Summary: Error: ${e.message}`\n );\n }\n keepGoing = false;\n return { success: false, summary: `Error: ${e.message}` };\n }\n }\n\n const finalResult = { success: true, summary: finalSummary || \"Task completed without summary.\" };\n if (options.taskId && process.env.SHARK_PARENT_ID) {\n const parentId = process.env.SHARK_PARENT_ID;\n const role = process.env.SHARK_SUBAGENT_ROLE || 'Subagent';\n subagentManager.sendMessage(\n parentId,\n `[Subagent Notification] Subagent ${role} (${options.taskId}) has finished with status: COMPLETED. Summary: ${finalResult.summary}`\n );\n }\n\n log.success('✅ Task Scope Completed');\n return finalResult;\n } finally {\n process.off('SIGINT', sigIntHandler);\n process.off('SIGTERM', sigTermHandler);\n\n // Auto terminate active subagents created by this parent to prevent leaks on exit\n const currentId = options.taskId || 'parent';\n const myActiveSubagents = subagentManager.getActiveSubagentsForParent(currentId);\n if (myActiveSubagents.length > 0) {\n log.info(`🧹 Terminating ${myActiveSubagents.length} active child subagent(s) before exit...`);\n for (const sub of myActiveSubagents) {\n subagentManager.killSubagent(sub.id);\n }\n }\n }\n}\n","\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport fg from 'fast-glob';\nimport { colors } from '../../ui/colors.js';\nimport { tui } from '../../ui/tui.js';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { fileURLToPath } from 'node:url';\nimport { CodeEditorFactory } from '../ast-editing/editors/code-editor-factory.js';\nimport { CodeStructure } from '../ast-editing/interfaces/structure.types.js';\n\nconst execAsync = promisify(exec);\n\n\n/**\n * Shared tools for Agent interaction (File System, etc.)\n */\n\n\nexport function detectLineEnding(content: string): string {\n const crlf = content.split('\\r\\n').length - 1;\n const lf = content.split('\\n').length - 1 - crlf;\n return crlf > lf ? '\\r\\n' : '\\n';\n}\n\nexport function handleListFiles(dirPath: string): string {\n try {\n const fullPath = path.resolve(process.cwd(), dirPath);\n if (!fs.existsSync(fullPath)) return `Error: Directory ${dirPath} does not exist.`;\n\n const items = fs.readdirSync(fullPath, { withFileTypes: true });\n return items.map(item => {\n return `${item.isDirectory() ? '[DIR]' : '[FILE]'} ${item.name}`;\n }).join('\\n');\n } catch (e: any) {\n return `Error listing files: ${e.message}`;\n }\n}\n\nexport function handleReadFile(filePath: string, showLineNumbers: boolean = true): string {\n try {\n const fullPath = path.resolve(process.cwd(), filePath);\n if (!fs.existsSync(fullPath)) return `Error: File ${filePath} does not exist.`;\n\n // Limit size?\n const stats = fs.statSync(fullPath);\n if (stats.size > 100 * 1024) return `Error: File too large to read (${stats.size} bytes). Limit is 100KB.`;\n\n const content = fs.readFileSync(fullPath, 'utf-8');\n\n if (showLineNumbers) {\n const lines = content.split('\\n');\n return lines.map((line, idx) => `${idx + 1}: ${line}`).join('\\n');\n }\n\n return content;\n } catch (e: any) {\n return `Error reading file: ${e.message}`;\n }\n}\n\nexport function replaceLineRange(\n filePath: string,\n startLine: number, // 1-indexed\n endLine: number, // 1-indexed\n newContent: string,\n tui: any\n): boolean {\n try {\n if (!fs.existsSync(filePath)) {\n tui.log.error(`❌ File not found for modification: ${filePath}`);\n return false;\n }\n\n const currentFileContent = fs.readFileSync(filePath, 'utf-8');\n const lineEnding = detectLineEnding(currentFileContent);\n const lines = currentFileContent.split(lineEnding);\n\n // Validation\n if (startLine < 1 || startLine > lines.length) {\n tui.log.error(`❌ Invalid start line: ${startLine}. File has ${lines.length} lines.`);\n return false;\n }\n\n if (endLine < startLine || endLine > lines.length) {\n tui.log.error(`❌ Invalid end line: ${endLine}. Must be >= startLine and <= file length.`);\n return false;\n }\n\n // Replace lines [startLine-1, endLine-1]\n // Note: lines array is 0-indexed\n const before = lines.slice(0, startLine - 1);\n const after = lines.slice(endLine);\n const newLines = newContent.split(lineEnding); // Use detected line ending for new content splitting if provided with one, usually agent provides \\n\n\n // If newContent comes from LLM, it likely has \\n. We should split by \\n and join by detected.\n // But wait, if newContent has \\n and we join by \\r\\n, it works if we split newContent by \\n.\n // If newContent already has \\r\\n, splitting by \\n leaves \\r.\n // Safe approach: Normalized split of new code.\n const normalizedNewLines = newContent.replace(/\\r\\n/g, '\\n').split('\\n');\n\n const result = [...before, ...normalizedNewLines, ...after].join(lineEnding);\n\n const BOM = '\\uFEFF';\n const finalContent = result.startsWith(BOM) ? result : BOM + result;\n fs.writeFileSync(filePath, finalContent, { encoding: 'utf-8' });\n\n tui.log.success(`✅ Replaced lines ${startLine}-${endLine} in ${filePath}`);\n return true;\n\n } catch (e: any) {\n tui.log.error(`❌ Error replacing line range: ${e.message}`);\n return false;\n }\n}\n\nimport { CodeReviewService } from '../services/code-review.service.js';\n\nexport async function generateFilePreview(\n filePath: string,\n startLine: number,\n endLine: number,\n newContent: string\n): Promise<string> {\n try {\n const fullPath = path.resolve(process.cwd(), filePath);\n if (!fs.existsSync(fullPath)) return `Error: File ${filePath} does not exist.`;\n\n const content = fs.readFileSync(fullPath, 'utf-8');\n const lines = content.split(/\\r\\n|\\r|\\n/);\n\n // 0-indexed adjustment\n const startIdx = startLine - 1;\n const endIdx = endLine - 1;\n\n if (startIdx < 0 || startIdx >= lines.length) return `Error: Start line ${startLine} is out of bounds (File has ${lines.length} lines).`;\n if (endIdx < startIdx || endIdx >= lines.length) return `Error: End line ${endLine} is invalid.`;\n\n const contextBefore = lines.slice(Math.max(0, startIdx - 3), startIdx).map((l, i) => `${Math.max(1, startLine - 3) + i} | ${l}`).join('\\n');\n const contentReplacing = lines.slice(startIdx, endIdx + 1).map((l, i) => `${startLine + i} | - ${l}`).join('\\n');\n const contextAfter = lines.slice(endIdx + 1, Math.min(lines.length, endIdx + 4)).map((l, i) => `${endLine + 1 + i} | ${l}`).join('\\n');\n\n const newLines = newContent.split('\\n').map(l => `+ ${l}`).join('\\n');\n\n // INTEGRATE CODE REVIEW AGENT\n let reviewFeedback = '';\n try {\n reviewFeedback = await CodeReviewService.reviewCode(filePath, newContent);\n } catch (err) {\n reviewFeedback = `⚠️ Code Review Service Unavailable: ${(err as any).message}`;\n }\n\n return `PREVIEW OF CHANGES to ${filePath}:\n--------------------------------------------------\nCONTEXT BEFORE:\n${contextBefore}\n\nCHANGES:\n${contentReplacing}\n${newLines}\n\nCONTEXT AFTER:\n${contextAfter}\n--------------------------------------------------\n${reviewFeedback}\n\nIMPORTANT: Please verify that the lines being replaced (marked with -) are exactly what you intend to remove.\nIf the context looks wrong, DO NOT CONFIRM. Re-read the file to check line numbers.\n`;\n } catch (e: any) {\n return `Error generating preview: ${e.message}`;\n }\n}\n\nexport function handleSearchFile(pattern: string): string {\n try {\n // Limit scope to current directory for safety?\n // Patterns are relative to process.cwd()\n const entries = fg.sync(pattern, { dot: true });\n if (entries.length === 0) return 'No files found matching pattern.';\n return entries.slice(0, 50).join('\\n');\n } catch (e: any) {\n return `Error searching files: ${e.message}`;\n }\n}\n\n/**\n * Searches for a string or regex pattern within files matching a glob.\n * Works like VSCode's \"Find in Files\" — returns matching lines with file path and line number.\n * Use this instead of read_file when you only need to find specific symbols,\n * exports, method names, or patterns — avoiding flooding the context with full file contents.\n *\n * @param globPattern Glob pattern to select files (e.g., \"src/**‌/*.ts\")\n * @param query String or regex pattern to search for\n * @param isRegex If true, treats query as a regular expression\n */\nexport function handleSearchCode(\n globPattern: string,\n query: string,\n isRegex: boolean = false\n): string {\n const MAX_MATCHES = 50;\n const MAX_FILE_SIZE_BYTES = 500 * 1024; // skip files > 500KB\n\n try {\n const files = fg.sync(globPattern, { dot: true, absolute: false });\n if (files.length === 0) return `No files found matching pattern: \"${globPattern}\"`;\n\n let searchRegex: RegExp;\n try {\n searchRegex = isRegex\n ? new RegExp(query, 'gi')\n : new RegExp(query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n } catch {\n return `Error: Invalid regex pattern: \"${query}\"`;\n }\n\n const results: string[] = [];\n let totalMatches = 0;\n\n for (const filePath of files) {\n if (totalMatches >= MAX_MATCHES) break;\n\n try {\n const fullPath = path.resolve(process.cwd(), filePath);\n const stats = fs.statSync(fullPath);\n if (stats.size > MAX_FILE_SIZE_BYTES) continue; // skip huge binaries\n\n const content = fs.readFileSync(fullPath, 'utf-8');\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n if (totalMatches >= MAX_MATCHES) break;\n searchRegex.lastIndex = 0; // reset for 'g' flag\n if (searchRegex.test(lines[i])) {\n results.push(`${filePath}:${i + 1}: ${lines[i].trim()}`);\n totalMatches++;\n }\n }\n } catch {\n // skip unreadable files silently\n }\n }\n\n if (results.length === 0) {\n return `No matches found for \"${query}\" in files matching \"${globPattern}\"`;\n }\n\n const limited = totalMatches >= MAX_MATCHES ? ` (limited to ${MAX_MATCHES})` : '';\n return `Found ${totalMatches} match(es) for \"${query}\" in \"${globPattern}\"${limited}:\\n${results.join('\\n')}`;\n\n } catch (e: any) {\n return `Error searching code: ${e.message}`;\n }\n}\n\nexport function startSmartReplace(filePath: string, newContent: string, targetContent: string, tui: any): boolean {\n if (!fs.existsSync(filePath)) {\n tui.log.error(`❌ File not found for modification: ${filePath}`);\n return false;\n }\n\n const currentFileContent = fs.readFileSync(filePath, 'utf-8');\n\n // 1. Validation: Does target exist?\n // Normalize string for comparison to avoid CRLF issues during check\n const normalizedTarget = targetContent.replace(/\\r\\n/g, '\\n');\n const normalizedContent = currentFileContent.replace(/\\r\\n/g, '\\n');\n\n if (!normalizedContent.includes(normalizedTarget)) {\n tui.log.error(`❌ Target content not found in ${filePath} (checked with normalized line endings). Modification aborted.`);\n console.log(colors.dim('--- Target Content Expected ---'));\n console.log(targetContent.substring(0, 200) + '...');\n return false;\n }\n\n // 2. Validation: Is it unique?\n const occurrences = currentFileContent.split(targetContent).length - 1;\n if (occurrences > 1) {\n tui.log.error(`❌ Ambiguous target: Found ${occurrences} occurrences in ${filePath}. Modification aborted.`);\n return false;\n }\n\n // 3. Apply Replacement\n const BOM = '\\uFEFF';\n const updatedContent = currentFileContent.replace(targetContent, newContent);\n const finalContent = updatedContent.startsWith(BOM) ? updatedContent : BOM + updatedContent;\n fs.writeFileSync(filePath, finalContent, { encoding: 'utf-8' });\n tui.log.success(`✅ Smart Replace Applied: ${filePath}`);\n return true;\n}\n\nexport async function handleRunCommand(command: string): Promise<string> {\n const { spawn } = await import('node:child_process');\n try {\n tui.log.info(`💻 Executing: ${colors.dim(command)}`);\n\n // Split command into cmd and args (naive split, use specific parser if needed for complex quotes)\n // For simplicity in Agent usage, we might act as a shell?\n // Let's use shell: true option for ease of piping/env usage.\n\n return new Promise((resolve) => {\n const child = spawn(command, {\n shell: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n cwd: process.cwd()\n });\n\n let stdout = '';\n let stderr = '';\n\n // Timeout safety: 5 minutes\n const timer = setTimeout(() => {\n child.kill();\n resolve(`Error: Command timed out after 5 minutes.\\nOutput so far:\\n${stdout}\\n${stderr}`);\n }, 5 * 60 * 1000);\n\n child.stdout.on('data', (data) => {\n const chunk = data.toString();\n stdout += chunk;\n // Optional: Stream to TUI if verbose?\n });\n\n child.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n if (code === 0) {\n resolve(stdout.trim() || 'Command executed successfully (no output).');\n } else {\n resolve(`Command failed with exit code ${code}.\\nSTDERR:\\n${stderr}\\nSTDOUT:\\n${stdout}`);\n }\n });\n\n child.on('error', (err) => {\n clearTimeout(timer);\n resolve(`Error executing command: ${err.message}`);\n });\n });\n\n } catch (e: any) {\n return `Error launching command: ${e.message}`;\n }\n}\n\n\n/**\n * Resolves the ast-grep command to use.\n * Priorities:\n * 1. Package-local node_modules binary (for global installs)\n * 2. CWD node_modules binary (for local dev)\n * 3. Fallback to 'npx sg'\n */\nfunction resolveAstGrepCommand(): string {\n const isWin = process.platform === 'win32';\n const binName = isWin ? 'sg.cmd' : 'sg';\n\n // 1. Try to find binary relative to THIS file (package root)\n try {\n const currentFile = fileURLToPath(import.meta.url);\n // Go up until we find package root or hit root\n let dir = path.dirname(currentFile);\n\n // Simple heuristic: walk up up to 5 levels to find node_modules\n // When bundled, we might be in dist/ or dist/bin/\n for (let i = 0; i < 5; i++) {\n const candidate = path.join(dir, 'node_modules', '.bin', binName);\n if (fs.existsSync(candidate)) {\n return `\"${candidate}\"`;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch (e) {\n // Ignore errors resolving path\n }\n\n // 2. Try CWD (User's project)\n const cwdBin = path.resolve(process.cwd(), 'node_modules', '.bin', binName);\n if (fs.existsSync(cwdBin)) {\n return `\"${cwdBin}\"`;\n }\n\n // 3. Fallback\n return 'npx sg';\n}\n\n/**\n * Executes ast-grep search via local CLI.\n * Returns the raw output (JSON usually requested by consumer) or error message.\n */\nexport async function astGrepSearch(\n pattern: string,\n filePath: string,\n language: string,\n tui: any\n): Promise<string> {\n const { spawn } = await import('node:child_process');\n try {\n if (!fs.existsSync(filePath)) {\n return `❌ File not found: ${filePath}`;\n }\n\n // Resolve sg command robustly\n const sgCmd = resolveAstGrepCommand();\n const cmd = `${sgCmd} run -p \"${pattern}\" -l ${language} --json ${filePath}`;\n\n tui.log.info(`🔍 [AST-GREP] Searching: ${cmd}`);\n\n return new Promise((resolve) => {\n const child = spawn(cmd, {\n shell: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n cwd: process.cwd(),\n env: { ...process.env, NO_COLOR: 'true' } // Avoid ANSI codes in JSON output\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout.on('data', (data) => stdout += data.toString());\n child.stderr.on('data', (data) => stderr += data.toString());\n\n child.on('close', (code) => {\n if (code === 0 && stdout) {\n resolve(stdout);\n } else if (code === 1 && !stderr) {\n // ast-grep finds simply nothing\n resolve(\"No structural matches found.\");\n } else {\n // Real error or no matches with empty stdout\n if (!stdout && !stderr) resolve(\"No structural matches found.\");\n else {\n tui.log.error(`❌ ast-grep search error (code ${code}): ${stderr}`);\n resolve(`Error executing ast-grep search: ${stderr || stdout}`);\n }\n }\n });\n\n child.on('error', (err) => {\n resolve(`Error executing ast-grep search: ${err.message}`);\n });\n });\n\n } catch (e: any) {\n tui.log.error(`❌ ast-grep search exception: ${e.message}`);\n return `Error executing ast-grep search: ${e.message}`;\n }\n}\n\n/**\n * Executes ast-grep rewrite via local CLI.\n * Returns boolean success/failure.\n */\nexport async function astGrepRewrite(\n pattern: string,\n fix: string,\n filePath: string,\n language: string,\n tui: any\n): Promise<boolean> {\n const { spawn } = await import('node:child_process');\n try {\n if (!fs.existsSync(filePath)) {\n tui.log.error(`❌ File not found for AST modification: ${filePath}`);\n return false;\n }\n\n // Resolve sg command robustly\n const sgCmd = resolveAstGrepCommand();\n const cmd = `${sgCmd} run -p \"${pattern}\" -r \"${fix}\" -l ${language} ${filePath} --update-all`;\n\n tui.log.info(`✏️ [AST-GREP] Rewriting: pattern=\"${pattern}\" fix=\"${fix.substring(0, 50)}...\"`);\n\n return new Promise((resolve) => {\n const child = spawn(cmd, {\n shell: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n cwd: process.cwd()\n });\n\n let stderr = '';\n child.stderr.on('data', (data) => stderr += data.toString());\n\n child.on('close', (code) => {\n if (code === 0) {\n tui.log.success(`✅ AST Rewrite applied to ${filePath}`);\n resolve(true);\n } else {\n tui.log.error(`❌ AST Rewrite failed (code ${code}): ${stderr}`);\n resolve(false);\n }\n });\n\n child.on('error', (err) => {\n tui.log.error(`❌ AST Rewrite spawn error: ${err.message}`);\n resolve(false);\n });\n });\n\n } catch (e: any) {\n tui.log.error(`❌ Unexpected error in astGrepRewrite: ${e.message}`);\n return false;\n }\n}\n\n// ═══════════════════════════════════════════════════════\n// AST TOOLS IMPLEMENTATION\n// ═══════════════════════════════════════════════════════\n\n/**\n * AST Tool: List file structure\n */\nexport async function astListStructure(filePath: string): Promise<string> {\n try {\n const editor = CodeEditorFactory.getEditor(filePath);\n\n if (!editor) {\n return `[AST Error] File type not supported: ${filePath}. Use read_file instead.`;\n }\n\n const structure: CodeStructure = await editor.listStructure(filePath);\n\n // Format for LLM consumption\n let output = `[AST Structure of ${filePath}]\\n\\n`;\n\n // Classes\n if (structure.classes.length > 0) {\n output += `CLASSES:\\n`;\n structure.classes.forEach(cls => {\n output += ` - ${cls.name}`;\n if (cls.extendsClass) output += ` extends ${cls.extendsClass}`;\n if (cls.implementsInterfaces.length > 0) {\n output += ` implements ${cls.implementsInterfaces.join(', ')}`;\n }\n output += `\\n`;\n\n if (cls.decorators.length > 0) {\n output += ` Decorators: ${cls.decorators.join(', ')}\\n`;\n }\n\n if (cls.properties.length > 0) {\n output += ` Properties:\\n`;\n cls.properties.forEach(prop => {\n output += ` - ${prop.visibility} ${prop.name}: ${prop.type}\\n`;\n });\n }\n\n if (cls.methods.length > 0) {\n output += ` Methods:\\n`;\n cls.methods.forEach(method => {\n const params = method.parameters.map(p => `${p.name}: ${p.type}`).join(', ');\n output += ` - ${method.visibility} ${method.name}(${params}): ${method.returnType}\\n`;\n });\n }\n output += `\\n`;\n });\n }\n\n // Interfaces\n if (structure.interfaces.length > 0) {\n output += `INTERFACES:\\n`;\n structure.interfaces.forEach(iface => {\n output += ` - ${iface.name}\\n`;\n iface.properties.forEach(prop => {\n output += ` ${prop.name}: ${prop.type}\\n`;\n });\n });\n output += `\\n`;\n }\n\n // Functions\n if (structure.functions.length > 0) {\n output += `FUNCTIONS:\\n`;\n structure.functions.forEach(fn => {\n const params = fn.parameters.map(p => `${p.name}: ${p.type}`).join(', ');\n output += ` - ${fn.name}(${params}): ${fn.returnType}\\n`;\n });\n output += `\\n`;\n }\n\n // Imports\n if (structure.imports.length > 0) {\n output += `IMPORTS:\\n`;\n structure.imports.forEach(imp => {\n output += ` - from \"${imp.modulePath}\": ${imp.namedImports.join(', ')}\\n`;\n });\n }\n\n return output;\n } catch (error: any) {\n return `[AST Error] ${error.message}`;\n }\n}\n\nexport async function astAddMethod(\n filePath: string,\n className: string,\n methodCode: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) {\n throw new Error(`No AST editor available for ${filePath}`);\n }\n return await editor.addMethod(filePath, className, methodCode);\n}\n\nexport async function astGetMethod(\n filePath: string,\n className: string,\n methodName: string\n): Promise<string> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) {\n throw new Error(`No AST editor available for ${filePath}`);\n }\n const methodContent = await editor.getMethod(filePath, className, methodName);\n if (!methodContent) {\n return `Method \"${methodName}\" not found in class \"${className}\"`;\n }\n return methodContent;\n}\n\nexport async function astAddClass(\n filePath: string,\n className: string,\n extendsClass?: string,\n implementsInterfaces?: string[]\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.addClass(filePath, className, { extendsClass, implementsInterfaces });\n}\n\nexport async function astAddProperty(\n filePath: string,\n className: string,\n propertyCode: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.addProperty(filePath, className, propertyCode);\n}\n\nexport async function astGetProperty(\n filePath: string,\n className: string,\n propertyName: string\n): Promise<string> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n const propContent = await editor.getProperty(filePath, className, propertyName);\n if (!propContent) {\n return `Property \"${propertyName}\" not found in class \"${className}\"`;\n }\n return propContent;\n}\n\nexport async function astModifyProperty(\n filePath: string,\n className: string,\n propertyName: string,\n propertyCode: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.modifyProperty(filePath, className, propertyName, propertyCode);\n}\n\nexport async function astRemoveProperty(\n filePath: string,\n className: string,\n propertyName: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.removeProperty(filePath, className, propertyName);\n}\n\nexport async function astModifyMethod(\n filePath: string,\n className: string,\n methodName: string,\n newBody: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.modifyMethod(filePath, className, methodName, newBody);\n}\n\nexport async function astRemoveMethod(\n filePath: string,\n className: string,\n methodName: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.removeMethod(filePath, className, methodName);\n}\n\nexport async function astAddDecorator(\n filePath: string,\n className: string,\n decoratorCode: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.addDecorator(filePath, className, decoratorCode);\n}\n\nexport async function astAddInterface(\n filePath: string,\n interfaceCode: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.addInterface(filePath, interfaceCode);\n}\n\nexport async function astAddTypeAlias(\n filePath: string,\n typeCode: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.addTypeAlias(filePath, typeCode);\n}\n\nexport async function astAddFunction(\n filePath: string,\n functionCode: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.addFunction(filePath, functionCode);\n}\n\nexport async function astRemoveFunction(\n filePath: string,\n functionName: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.removeFunction(filePath, functionName);\n}\n\nexport async function astAddImport(\n filePath: string,\n importStatement: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.addImport(filePath, importStatement);\n}\n\nexport async function astRemoveImport(\n filePath: string,\n modulePath: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.removeImport(filePath, modulePath);\n}\n\nexport async function astOrganizeImports(\n filePath: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.organizeImports(filePath);\n}\n","import * as path from 'node:path';\nimport { CodeEditor } from '../interfaces/code-editor.interface.js';\nimport { TypeScriptEditor } from './typescript-editor.js';\n\nexport class CodeEditorFactory {\n private static tsEditor: TypeScriptEditor | null = null;\n\n /**\n * Returns appropriate editor for the file, or null if AST editing not supported\n */\n static getEditor(filePath: string): CodeEditor | null {\n const ext = path.extname(filePath).toLowerCase();\n\n // TypeScript/JavaScript\n if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) {\n // Reuse singleton instance for performance (ts-morph Project is heavy)\n if (!this.tsEditor) {\n this.tsEditor = new TypeScriptEditor();\n }\n return this.tsEditor;\n }\n\n // HTML - TODO: Implement in Phase 2\n // if (ext === '.html') {\n // return new TreeSitterEditor('html');\n // }\n\n // For unsupported files, return null (will fallback to modify_file)\n return null;\n }\n\n /**\n * Clear cached editors (useful for testing)\n */\n static clearCache(): void {\n this.tsEditor = null;\n }\n}\n","import { Project, SourceFile, ClassDeclaration, SyntaxKind } from 'ts-morph';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { CodeEditor, ClassOptions } from '../interfaces/code-editor.interface.js';\nimport {\n CodeStructure,\n ClassInfo,\n MethodInfo,\n PropertyInfo\n} from '../interfaces/structure.types.js';\n\nexport class TypeScriptEditor implements CodeEditor {\n private project: Project;\n\n constructor() {\n this.project = new Project({\n skipAddingFilesFromTsConfig: true,\n compilerOptions: {\n target: 99, // ESNext\n module: 99, // ESNext\n },\n });\n }\n\n /**\n * Get or add source file to project\n */\n private getSourceFile(filePath: string): SourceFile {\n const absolutePath = path.resolve(filePath);\n\n // Check if already in project\n let sourceFile = this.project.getSourceFile(absolutePath);\n\n if (!sourceFile) {\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`File not found: ${absolutePath}`);\n }\n sourceFile = this.project.addSourceFileAtPath(absolutePath);\n }\n\n return sourceFile;\n }\n\n /**\n * Get class declaration by name\n */\n private getClass(sourceFile: SourceFile, className: string): ClassDeclaration {\n const classDecl = sourceFile.getClass(className);\n if (!classDecl) {\n throw new Error(`Class \"${className}\" not found in ${sourceFile.getFilePath()}`);\n }\n return classDecl;\n }\n\n // ═══════════════════════════════════════════════════════\n // IMPLEMENTATION: listStructure\n // ═══════════════════════════════════════════════════════\n\n async listStructure(filePath: string): Promise<CodeStructure> {\n const sourceFile = this.getSourceFile(filePath);\n\n // Extract classes\n const classes: ClassInfo[] = sourceFile.getClasses().map(cls => ({\n name: cls.getName() || '<anonymous>',\n methods: cls.getMethods().map(m => this.extractMethodInfo(m)),\n properties: cls.getProperties().map(p => this.extractPropertyInfo(p)),\n decorators: cls.getDecorators().map(d => d.getText()),\n extendsClass: cls.getExtends()?.getText(),\n implementsInterfaces: cls.getImplements().map(i => i.getText()),\n }));\n\n // Extract interfaces\n const interfaces = sourceFile.getInterfaces().map(iface => ({\n name: iface.getName(),\n properties: iface.getProperties().map(p => this.extractPropertyInfo(p)),\n extends: iface.getExtends().map(e => e.getText()),\n }));\n\n // Extract functions\n const functions = sourceFile.getFunctions().map(fn => ({\n name: fn.getName() || '<anonymous>',\n parameters: fn.getParameters().map(p => ({\n name: p.getName(),\n type: p.getType().getText(),\n isOptional: p.isOptional(),\n })),\n returnType: fn.getReturnType().getText(),\n isAsync: fn.isAsync(),\n isExported: fn.isExported(),\n }));\n\n // Extract imports\n const imports = sourceFile.getImportDeclarations().map(imp => ({\n modulePath: imp.getModuleSpecifierValue(),\n isDefault: !!imp.getDefaultImport(),\n namedImports: imp.getNamedImports().map(n => n.getName()),\n namespaceImport: imp.getNamespaceImport()?.getText(),\n }));\n\n // Extract exports\n const exports = sourceFile.getExportedDeclarations();\n const exportInfo = Array.from(exports.entries()).flatMap(([name, declarations]) =>\n declarations.map(decl => ({\n name,\n type: this.getDeclarationType(decl),\n isDefault: sourceFile.getDefaultExportSymbol()?.getName() === name,\n }))\n );\n\n return {\n classes,\n interfaces,\n functions,\n imports,\n exports: exportInfo,\n };\n }\n\n private extractMethodInfo(method: any): MethodInfo {\n return {\n name: method.getName(),\n parameters: method.getParameters().map((p: any) => ({\n name: p.getName(),\n type: p.getType().getText(),\n isOptional: p.isOptional(),\n })),\n returnType: method.getReturnType().getText(),\n isAsync: method.isAsync(),\n isStatic: method.isStatic(),\n visibility: this.getVisibility(method),\n decorators: method.getDecorators().map((d: any) => d.getText()),\n };\n }\n\n private extractPropertyInfo(property: any): PropertyInfo {\n return {\n name: property.getName(),\n type: property.getType()?.getText(),\n visibility: this.getVisibility(property),\n isReadonly: property.isReadonly(),\n initializer: property.getInitializer()?.getText(),\n };\n }\n\n private getVisibility(node: any): 'public' | 'private' | 'protected' {\n if (node.hasModifier?.(SyntaxKind.PrivateKeyword)) return 'private';\n if (node.hasModifier?.(SyntaxKind.ProtectedKeyword)) return 'protected';\n return 'public';\n }\n\n private getDeclarationType(decl: any): 'class' | 'function' | 'interface' | 'type' | 'const' {\n if (decl.getKind() === SyntaxKind.ClassDeclaration) return 'class';\n if (decl.getKind() === SyntaxKind.FunctionDeclaration) return 'function';\n if (decl.getKind() === SyntaxKind.InterfaceDeclaration) return 'interface';\n if (decl.getKind() === SyntaxKind.TypeAliasDeclaration) return 'type';\n return 'const';\n }\n\n // ═══════════════════════════════════════════════════════\n // IMPLEMENTATION: Class Operations\n // ═══════════════════════════════════════════════════════\n\n async addClass(\n filePath: string,\n className: string,\n options?: ClassOptions\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n\n sourceFile.addClass({\n name: className,\n extends: options?.extendsClass,\n implements: options?.implementsInterfaces,\n isExported: true,\n });\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add class \"${className}\":`, error);\n return false;\n }\n }\n\n async addProperty(\n filePath: string,\n className: string,\n propertyCode: string\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n // Using insertText directly to support full property definitions\n const closeBrace = classDecl.getEnd() - 1;\n classDecl.insertText(closeBrace, `\\n ${propertyCode}`);\n\n // Reformat\n classDecl.formatText();\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add property to \"${className}\":`, error);\n return false;\n }\n }\n\n async getProperty(\n filePath: string,\n className: string,\n propertyName: string\n ): Promise<string | undefined> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n const property = classDecl.getProperty(propertyName);\n if (!property) {\n return undefined;\n }\n\n return property.getText();\n } catch (error) {\n console.error(`Failed to get property \"${propertyName}\":`, error);\n return undefined;\n }\n }\n\n async modifyProperty(\n filePath: string,\n className: string,\n propertyName: string,\n newCode: string\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n const property = classDecl.getProperty(propertyName);\n if (!property) {\n throw new Error(`Property \"${propertyName}\" not found in class \"${className}\"`);\n }\n\n // Replace the entire property text\n property.replaceWithText(newCode);\n\n // Reformat\n classDecl.formatText();\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to modify property \"${propertyName}\":`, error);\n return false;\n }\n }\n\n async removeProperty(\n filePath: string,\n className: string,\n propertyName: string\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n const property = classDecl.getProperty(propertyName);\n if (!property) {\n throw new Error(`Property \"${propertyName}\" not found in class \"${className}\"`);\n }\n\n property.remove();\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to remove property \"${propertyName}\":`, error);\n return false;\n }\n }\n\n async addMethod(\n filePath: string,\n className: string,\n methodCode: string\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n // Method code is likely \"methodName(...) { ... }\"\n // We can insert this as text.\n const closeBrace = classDecl.getEnd() - 1;\n classDecl.insertText(closeBrace, `\\n ${methodCode}\\n`);\n\n classDecl.formatText();\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add method to \"${className}\":`, error);\n return false;\n }\n }\n\n async modifyMethod(\n filePath: string,\n className: string,\n methodName: string,\n newBody: string\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n const method = classDecl.getMethod(methodName);\n if (!method) {\n throw new Error(`Method \"${methodName}\" not found in class \"${className}\"`);\n }\n\n method.setBodyText(newBody);\n\n // Optional: reformat\n method.formatText();\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to modify method \"${methodName}\":`, error);\n return false;\n }\n }\n\n async removeMethod(\n filePath: string,\n className: string,\n methodName: string\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n const method = classDecl.getMethod(methodName);\n if (!method) {\n throw new Error(`Method \"${methodName}\" not found in class \"${className}\"`);\n }\n\n method.remove();\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to remove method \"${methodName}\":`, error);\n return false;\n }\n }\n\n async addDecorator(\n filePath: string,\n className: string,\n decoratorCode: string\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n // Robust text-based insertion\n const start = classDecl.getStart();\n // Prefix the class with the decorator\n sourceFile.insertText(start, `${decoratorCode}\\n`);\n sourceFile.formatText();\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add decorator to \"${className}\":`, error);\n return false;\n }\n }\n\n async getMethod(\n filePath: string,\n className: string,\n methodName: string\n ): Promise<string | undefined> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n const method = classDecl.getMethod(methodName);\n if (!method) {\n return undefined;\n }\n\n return method.getText();\n } catch (error) {\n console.error(`Failed to get method \"${methodName}\":`, error);\n return undefined;\n }\n }\n\n // ═══════════════════════════════════════════════════════\n // IMPLEMENTATION: Interface/Type Operations\n // ═══════════════════════════════════════════════════════\n\n async addInterface(filePath: string, interfaceCode: string): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n\n // Add at the end of file\n sourceFile.insertText(sourceFile.getEnd(), `\\n\\n${interfaceCode}`);\n sourceFile.formatText();\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add interface:`, error);\n return false;\n }\n }\n\n async addTypeAlias(filePath: string, typeCode: string): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n sourceFile.insertText(sourceFile.getEnd(), `\\n\\n${typeCode}`);\n sourceFile.formatText();\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add type alias:`, error);\n return false;\n }\n }\n\n // ═══════════════════════════════════════════════════════\n // IMPLEMENTATION: Function Operations\n // ═══════════════════════════════════════════════════════\n\n async addFunction(filePath: string, functionCode: string): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n sourceFile.insertText(sourceFile.getEnd(), `\\n\\n${functionCode}`);\n sourceFile.formatText();\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add function:`, error);\n return false;\n }\n }\n\n async removeFunction(filePath: string, functionName: string): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n\n const func = sourceFile.getFunction(functionName);\n if (!func) {\n throw new Error(`Function \"${functionName}\" not found`);\n }\n\n func.remove();\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to remove function \"${functionName}\":`, error);\n return false;\n }\n }\n\n // ═══════════════════════════════════════════════════════\n // IMPLEMENTATION: Import/Export Operations\n // ═══════════════════════════════════════════════════════\n\n async addImport(filePath: string, importStatement: string): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n\n const lastImport = sourceFile.getImportDeclarations().pop();\n const pos = lastImport ? lastImport.getEnd() : 0;\n\n sourceFile.insertText(pos, `\\n${importStatement}`);\n\n // Organize to clean up\n this.organizeImports(filePath);\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add import:`, error);\n return false;\n }\n }\n\n async removeImport(filePath: string, modulePath: string): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n\n const importDecls = sourceFile.getImportDeclarations()\n .filter(imp => imp.getModuleSpecifierValue() === modulePath);\n\n if (importDecls.length === 0) {\n throw new Error(`Import from \"${modulePath}\" not found`);\n }\n\n importDecls.forEach(d => d.remove());\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to remove import from \"${modulePath}\":`, error);\n return false;\n }\n }\n\n async organizeImports(filePath: string): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n\n sourceFile.organizeImports();\n\n // Fallback manual just in case:\n const imports = sourceFile.getImportDeclarations();\n const importStructure = imports.map(i => i.getStructure());\n\n // Sort by module specifier\n importStructure.sort((a, b) => {\n return a.moduleSpecifier.localeCompare(b.moduleSpecifier);\n });\n\n // Remove all\n imports.forEach(i => i.remove());\n\n // Re-add\n sourceFile.addImportDeclarations(importStructure);\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to organize imports:`, error);\n return false;\n }\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport os from 'node:os';\n\nexport class SkillManager {\n private activeSkills: Set<string> = new Set();\n private skillPrompts: Map<string, string> = new Map();\n\n async loadSkillFromFile(filePath: string): Promise<string> {\n const content = await fs.readFile(filePath, 'utf-8');\n // Strip frontmatter\n const cleanContent = content.replace(/^---[\\s\\S]*?---\\s*/, '');\n return cleanContent;\n }\n\n async activateSkill(skillName: string): Promise<string> {\n if (this.activeSkills.has(skillName)) {\n return `Skill ${skillName} is already active.`;\n }\n\n // Reset previous active skills to avoid collision/token waste\n this.reset();\n\n const globalPath = path.join(os.homedir(), '.shark', 'skills', skillName, 'SKILL.md');\n const localPath = path.join(process.cwd(), '.agents', 'skills', skillName, 'SKILL.md');\n\n let skillPath = '';\n try {\n await fs.access(localPath);\n skillPath = localPath;\n } catch {\n try {\n await fs.access(globalPath);\n skillPath = globalPath;\n } catch {\n throw new Error(`Skill '${skillName}' not found globally or locally.`);\n }\n }\n\n const prompt = await this.loadSkillFromFile(skillPath);\n this.activeSkills.add(skillName);\n this.skillPrompts.set(skillName, prompt);\n return prompt;\n }\n\n getSystemInstructionExtension(): string {\n if (this.activeSkills.size === 0) return '';\n let extension = '\\n\\n<EXTREMELY_IMPORTANT>\\n';\n for (const [name, prompt] of this.skillPrompts.entries()) {\n extension += `\\n--- ACTIVE SKILL: ${name} ---\\n${prompt}\\n`;\n }\n extension += '\\n</EXTREMELY_IMPORTANT>\\n';\n return extension;\n }\n\n async listAvailableSkills(): Promise<string[]> {\n const globalSkillsDir = path.join(os.homedir(), '.shark', 'skills');\n const localSkillsDir = path.join(process.cwd(), '.agents', 'skills');\n\n const skillNames = new Set<string>();\n\n const readDir = async (dir: string) => {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const skillMdPath = path.join(dir, entry.name, 'SKILL.md');\n try {\n await fs.access(skillMdPath);\n skillNames.add(entry.name);\n } catch {\n // No SKILL.md — not a valid skill directory\n }\n }\n }\n } catch {\n // Directory doesn't exist — silently skip\n }\n };\n\n await readDir(globalSkillsDir);\n await readDir(localSkillsDir);\n\n return Array.from(skillNames).sort();\n }\n\n reset() {\n this.activeSkills.clear();\n this.skillPrompts.clear();\n }\n}\n\nexport const skillManager = new SkillManager();\n","import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fork } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport { tui } from '../../ui/tui.js';\nimport { MessageQueue } from './message-queue.js';\n\ninterface SubagentState {\n id: string;\n type: string;\n role: string;\n status: 'running' | 'completed' | 'failed' | 'cancelled';\n summary?: string;\n promise?: Promise<any>;\n parentId?: string;\n childProcess?: any;\n}\n\nexport interface CustomSubagentType {\n name: string;\n description: string;\n systemPrompt: string;\n enableWriteTools?: boolean;\n enableSubagentTools?: boolean;\n enableMcpTools?: boolean;\n}\n\nexport class SubagentManager {\n private subagents = new Map<string, SubagentState>();\n private customTypes = new Map<string, CustomSubagentType>();\n\n registerSubagent(id: string, type: string, role: string, parentId?: string) {\n this.subagents.set(id, { id, type, role, status: 'running', parentId });\n }\n\n terminateSubagent(id: string, success: boolean = true, isCancelled: boolean = false) {\n const state = this.subagents.get(id);\n if (state) {\n if (state.status === 'cancelled') {\n return;\n }\n if (isCancelled) {\n state.status = 'cancelled';\n } else {\n state.status = success ? 'completed' : 'failed';\n }\n }\n }\n\n isSubagentActive(id: string): boolean {\n return this.subagents.get(id)?.status === 'running';\n }\n\n hasSubagent(id: string): boolean {\n return this.subagents.has(id);\n }\n\n getSubagentState(id: string): SubagentState | undefined {\n return this.subagents.get(id);\n }\n\n updateSubagentSummary(id: string, summary: string) {\n const state = this.subagents.get(id);\n if (state) {\n state.summary = summary;\n }\n }\n\n sendMessage(recipient: string, message: string) {\n const mailboxDir = path.resolve(process.cwd(), '.shark', 'mailbox', recipient);\n fs.mkdirSync(mailboxDir, { recursive: true });\n const filePath = path.join(mailboxDir, `${Date.now()}-${crypto.randomUUID()}.json`);\n fs.writeFileSync(filePath, JSON.stringify({ message }), 'utf-8');\n }\n\n retrieveMessages(id: string): string[] {\n const mailboxDir = path.resolve(process.cwd(), '.shark', 'mailbox', id);\n if (!fs.existsSync(mailboxDir)) {\n return [];\n }\n const files = fs.readdirSync(mailboxDir);\n // Sort files to process them in deterministic order (chronologically by filename prefix)\n files.sort();\n const messages: string[] = [];\n for (const file of files) {\n const filePath = path.join(mailboxDir, file);\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const data = JSON.parse(content);\n if (data && typeof data.message === 'string') {\n messages.push(data.message);\n }\n } catch (e) {\n // Ignore read/parse errors\n }\n try {\n fs.unlinkSync(filePath);\n } catch (e) {\n // Ignore unlink errors\n }\n }\n return messages;\n }\n\n peekMessages(id: string): string[] {\n const mailboxDir = path.resolve(process.cwd(), '.shark', 'mailbox', id);\n if (!fs.existsSync(mailboxDir)) {\n return [];\n }\n const files = fs.readdirSync(mailboxDir);\n files.sort();\n const messages: string[] = [];\n for (const file of files) {\n const filePath = path.join(mailboxDir, file);\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const data = JSON.parse(content);\n if (data && typeof data.message === 'string') {\n messages.push(data.message);\n }\n } catch (e) {\n // Ignore read/parse errors\n }\n }\n return messages;\n }\n\n defineSubagentType(\n name: string,\n description: string,\n systemPrompt: string,\n options: { enableWriteTools?: boolean; enableSubagentTools?: boolean; enableMcpTools?: boolean } = {}\n ) {\n this.customTypes.set(name, {\n name,\n description,\n systemPrompt,\n ...options\n });\n }\n\n getCustomSubagentType(name: string): CustomSubagentType | undefined {\n return this.customTypes.get(name);\n }\n\n getSubagentLogs(id: string, maxLines: number = 50): string {\n if (!/^[a-zA-Z0-9-]+$/.test(id)) {\n throw new Error('Invalid subagent ID format');\n }\n const projectRoot = process.cwd();\n const logFile = path.resolve(projectRoot, '_sharkrc', 'history', `subagent-${id}-console.log`);\n if (!fs.existsSync(logFile)) {\n return \"No console logs found for this subagent.\";\n }\n try {\n let content = fs.readFileSync(logFile, 'utf-8');\n if (content.endsWith('\\n')) {\n content = content.slice(0, -1);\n }\n const lines = content.split('\\n');\n const tail = lines.slice(-maxLines);\n return tail.join('\\n');\n } catch (e: any) {\n return `Failed to read subagent logs: ${e.message}`;\n }\n }\n\n getActiveSubagents(): SubagentState[] {\n return Array.from(this.subagents.values()).filter(s => s.status === 'running');\n }\n\n getActiveSubagentsForParent(parentId: string): SubagentState[] {\n return Array.from(this.subagents.values()).filter(s => s.status === 'running' && s.parentId === parentId);\n }\n\n killSubagent(id: string) {\n const state = this.subagents.get(id);\n if (state) {\n if (state.childProcess) {\n try {\n state.childProcess.kill('SIGTERM');\n } catch (e) {\n // Ignore\n }\n }\n this.terminateSubagent(id, false, true); // true sets status to 'cancelled'\n \n // Send cancellation notification to parent mailbox\n if (state.parentId) {\n const cancelMsg = `[Subagent Notification] Subagent ${state.role} (${id}) has finished with status: CANCELLED. Summary: Terminated by parent agent.`;\n this.sendMessage(state.parentId, cancelMsg);\n }\n }\n }\n\n killAllSubagents() {\n for (const [id, state] of this.subagents.entries()) {\n if (state.status === 'running') {\n this.killSubagent(id);\n }\n }\n }\n\n async invokeSubagents(\n subagents: Array<{ TypeName: string, Role: string, Prompt: string }>,\n parentId: string,\n parentQueue?: MessageQueue\n ): Promise<Array<{ id: string, TypeName: string, Role: string }>> {\n const invoked: Array<{ id: string, TypeName: string, Role: string }> = [];\n\n for (const sub of subagents) {\n const id = `subagent-${crypto.randomUUID()}`;\n this.registerSubagent(id, sub.TypeName, sub.Role, parentId);\n\n // Spawn the subagent execution in the background as a child process\n const promise = (async () => {\n try {\n const projectRoot = process.cwd();\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n\n // Find the package root of shark-ai containing package.json with name \"shark-ai\"\n let packageRoot = __dirname;\n while (true) {\n const pkgPath = path.join(packageRoot, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg && pkg.name === 'shark-ai') {\n break;\n }\n } catch (e) {\n // Ignore\n }\n }\n const parent = path.dirname(packageRoot);\n if (parent === packageRoot) {\n break;\n }\n packageRoot = parent;\n }\n const pathToSharkJs = path.resolve(packageRoot, 'dist', 'bin', 'shark.js');\n\n const customType = this.customTypes.get(sub.TypeName);\n let customContext = `Você está executando em modo SUBAGENTE.\\n`;\n customContext += `- Seu ID é: ${id}\\n`;\n customContext += `- O ID do seu Agente Pai é: ${parentId}\\n`;\n customContext += `- Você NÃO tem um terminal interativo com o usuário humano. Não use 'talk_with_user' para interagir.\\n`;\n customContext += `- Para reportar progresso intermediário ou tirar dúvidas com seu pai, use a ação 'send_message' com Recipient='${parentId}'.\\n`;\n customContext += `- Para concluir a tarefa e enviar o resultado detalhado em markdown, use obrigatoriamente a ação 'complete_task' com suas descobertas no campo 'content'.\\n`;\n \n if (customType) {\n customContext += `Custom Prompt: ${customType.systemPrompt}\\n`;\n }\n const instruction = customContext + '\\n\\n' + sub.Prompt;\n\n const args = ['dev', '-t', instruction, '--taskId', id, '--auto'];\n\n // Fork the child process silently (pipes stdout/stderr)\n const child = fork(pathToSharkJs, args, {\n cwd: projectRoot,\n silent: true,\n env: {\n ...process.env,\n SHARK_PARENT_ID: parentId,\n SHARK_SUBAGENT_ROLE: sub.Role\n }\n });\n\n // Store child process reference to allow termination (kill/kill_all)\n const state = this.subagents.get(id);\n if (state) {\n state.childProcess = child;\n }\n\n // Pipe console output to a history log file for process isolation\n const historyDir = path.resolve(projectRoot, '_sharkrc', 'history');\n fs.mkdirSync(historyDir, { recursive: true });\n const consoleLogFile = path.join(historyDir, `subagent-${id}-console.log`);\n const logStream = fs.createWriteStream(consoleLogFile, { flags: 'a' });\n\n if (child.stdout) {\n child.stdout.pipe(logStream);\n }\n if (child.stderr) {\n child.stderr.pipe(logStream);\n }\n\n // Wait for the child process to exit\n const exitCode = await new Promise<number | null>(resolve => {\n child.on('exit', (code) => {\n resolve(code);\n });\n });\n\n logStream.end();\n\n const isCancelled = this.subagents.get(id)?.status === 'cancelled';\n const success = exitCode === 0;\n this.terminateSubagent(id, success);\n \n if (isCancelled) {\n this.updateSubagentSummary(id, 'Terminated by parent agent.');\n tui.log.message(`\\nSubagent ${sub.Role} (${id}) cancelled.`);\n } else if (!success) {\n this.updateSubagentSummary(id, 'Failed');\n const fallbackMsg = `[Subagent Notification] Subagent ${sub.Role} (${id}) has finished with status: FAILED. Summary: Subagent process exited with code ${exitCode}`;\n const mailboxDir = path.resolve(projectRoot, '.shark', 'mailbox', parentId);\n const hasMessages = fs.existsSync(mailboxDir) && fs.readdirSync(mailboxDir).length > 0;\n if (!hasMessages) {\n this.sendMessage(parentId, fallbackMsg);\n }\n tui.log.error(`Subagent ${sub.Role} (${id}) failed.`);\n } else {\n this.updateSubagentSummary(id, 'Completed');\n // Print the subagent notification message to the parent console immediately\n const parentMsgs = this.peekMessages(parentId);\n const subagentMsg = parentMsgs.find(m => m.includes(`(${id})`));\n if (subagentMsg) {\n tui.log.message(`\\n${subagentMsg}`);\n } else {\n tui.log.success(`Subagent ${sub.Role} (${id}) completed successfully.`);\n }\n }\n\n if (parentQueue) {\n let summaryContent = \"Tarefa concluída sem resumo.\";\n let statusVal: 'completed' | 'failed' | 'cancelled' = success ? 'completed' : 'failed';\n if (isCancelled) {\n summaryContent = 'Terminated by parent agent.';\n statusVal = 'cancelled';\n } else if (success) {\n const parentMsgs = this.peekMessages(parentId);\n const subagentMsg = parentMsgs.find(m => m.includes(`(${id})`));\n if (subagentMsg) {\n summaryContent = subagentMsg;\n }\n } else {\n summaryContent = `Subagente falhou com código de saída ${exitCode}`;\n }\n parentQueue.push({\n type: 'subagent_notification',\n content: summaryContent,\n timestamp: Date.now(),\n metadata: {\n subagentId: id,\n role: sub.Role,\n status: statusVal\n }\n });\n }\n\n } catch (error) {\n console.error(`Subagent ${id} failed to spawn:`, error);\n this.terminateSubagent(id, false);\n const errorMsg = error instanceof Error ? error.message : 'Unknown error';\n this.sendMessage(\n parentId,\n `[Subagent Notification] Subagent ${sub.Role} (${id}) has finished with status: FAILED. Summary: Subagent spawn failed: ${errorMsg}`\n );\n tui.log.error(`Subagent ${sub.Role} (${id}) failed to spawn.`);\n if (parentQueue) {\n parentQueue.push({\n type: 'subagent_notification',\n content: `Subagente falhou ao iniciar: ${errorMsg}`,\n timestamp: Date.now(),\n metadata: {\n subagentId: id,\n role: sub.Role,\n status: 'failed'\n }\n });\n }\n }\n })();\n\n const state = this.subagents.get(id);\n if (state) {\n state.promise = promise;\n }\n\n invoked.push({ id, TypeName: sub.TypeName, Role: sub.Role });\n }\n\n return invoked;\n }\n}\n\nexport const subagentManager = new SubagentManager();\n","export interface QueueMessage {\n type: 'user' | 'subagent_notification' | 'timeout';\n content: string;\n timestamp: number;\n metadata?: {\n subagentId?: string;\n role?: string;\n status?: 'completed' | 'failed' | 'cancelled';\n };\n}\n\nexport class MessageQueue {\n private queue: QueueMessage[] = [];\n private pendingResolvers: ((value: QueueMessage) => void)[] = [];\n\n public push(message: QueueMessage): void {\n if (this.pendingResolvers.length > 0) {\n const resolve = this.pendingResolvers.shift()!;\n resolve(message);\n } else {\n this.queue.push(message);\n }\n }\n\n public async next(): Promise<QueueMessage> {\n if (this.queue.length > 0) {\n return this.queue.shift()!;\n }\n return new Promise<QueueMessage>((resolve) => {\n this.pendingResolvers.push(resolve);\n });\n }\n\n public isEmpty(): boolean {\n return this.queue.length === 0;\n }\n}\n","import { Command } from 'commander';\nimport { interactiveDeveloperAgent, DevelopmentResult } from '../core/agents/legacy-developer-agent.js';\nimport { TaskManager } from '../core/workflow/task-manager.js';\nimport { tui } from '../ui/tui.js';\nimport { colors } from '../ui/colors.js';\nimport { interactiveSpecificationAgent } from '../core/agents/specification-agent.js';\n\nexport const legacyCommand = new Command('legacy')\n .description('Starts the Legacy Developer Agent task orchestration loop')\n .option('-t, --task <type>', 'Initial task description (Quick Mode)')\n .option('-c, --context <path>', 'Path to custom context file')\n .action(async (options) => {\n const taskManager = new TaskManager(process.cwd());\n\n // 1. Check State\n let state = taskManager.analyzeSpecState();\n\n if (state.status === 'MISSING') {\n tui.log.warning('📋 No tech-spec.md found.');\n const confirm = await tui.confirm({ message: 'Create a new Specification (Tech Spec)?' });\n if (confirm) {\n // Handover to Spec Agent\n await interactiveSpecificationAgent({\n briefingPath: options.task ? undefined : undefined\n });\n // Re-analyze after spec agent returns\n state = taskManager.analyzeSpecState();\n if (state.status === 'MISSING') {\n tui.log.error('❌ Spec creation aborted or failed.');\n return;\n }\n } else {\n return;\n }\n }\n\n // 2. Orchestration Loop\n let keepOrchestrating = true;\n let burnMode = false; // \"Auto\" mode\n let contextHistory = \"\";\n\n tui.intro('🦈 Shark Legacy Orchestrator');\n\n while (keepOrchestrating) {\n state = taskManager.analyzeSpecState();\n\n if (state.status === 'COMPLETED') {\n tui.log.success('🎉 All tasks in tech-spec.md are COMPLETED!');\n const choice = await tui.select({\n message: 'What next?',\n options: [\n { value: 'exit', label: 'Exit' },\n { value: 'new_spec', label: 'New Specification (Reset)' }\n ]\n });\n if (choice === 'new_spec') {\n await interactiveSpecificationAgent();\n contextHistory = \"\"; // Reset history for new spec\n continue; // Loop again\n } else {\n keepOrchestrating = false;\n break;\n }\n }\n\n const currentTask = state.nextTask;\n if (!currentTask) {\n tui.log.error('Something went wrong. Status is not completed but no next task found.');\n break;\n }\n\n tui.log.info(`\\n👉 **NEXT TASK**: ${colors.bold(currentTask.description)}`);\n\n // Confirm Execution (unless Burn Mode)\n if (!burnMode) {\n const action = await tui.select({\n message: 'Orchestration Checkpoint:',\n options: [\n { value: 'execute', label: '🚀 Execute Task (Start)' },\n { value: 'burn', label: '🔥 Burn Mode (Auto-Execute Remaining)' },\n { value: 'pivot', label: '🔧 Pivot/Correct (Edit Spec)' },\n { value: 'skip', label: '⏭️ Skip Task (Mark Done without Executing)' },\n { value: 'stop', label: '🛑 Stop Session' }\n ]\n });\n\n if (action === 'stop') {\n keepOrchestrating = false;\n break;\n } else if (action === 'burn') {\n burnMode = true;\n } else if (action === 'skip') {\n taskManager.markTaskAsDone(currentTask.id);\n tui.log.info('Task skipped.');\n continue;\n } else if (action === 'pivot') {\n tui.log.info('Transferring control to Specification Agent...');\n await interactiveSpecificationAgent({\n initialContext: `User requested pivot after tasks:\\n${contextHistory}`\n });\n continue;\n }\n }\n\n // Execute Agent\n taskManager.markTaskInProgress(currentTask.id);\n\n tui.log.info(`⚡ Starting Micro-Context for Task: \"${currentTask.description}\"`);\n\n const result: DevelopmentResult = await interactiveDeveloperAgent({\n taskId: currentTask.id,\n taskInstruction: currentTask.description,\n history: contextHistory,\n context: options.context\n });\n\n if (result.success) {\n tui.log.success(`✅ Task Completed: ${currentTask.description}`);\n taskManager.markTaskAsDone(currentTask.id);\n contextHistory += `\\n[Task \"${currentTask.description}\" completed]: ${result.summary}`;\n } else {\n tui.log.error(`❌ Task Failed: ${result.summary}`);\n burnMode = false; // Stop burn mode on failure\n\n const recovery = await tui.select({\n message: 'Task Failed. Recovery Action:',\n options: [\n { value: 'retry', label: 'Retry (Run Agent Again)' },\n { value: 'pivot', label: 'Pivot (Adjust Spec/Instructions)' },\n { value: 'ignore', label: 'Ignore (Mark Done anyway)' },\n { value: 'stop', label: 'Stop' }\n ]\n });\n\n if (recovery === 'stop') break;\n if (recovery === 'ignore') taskManager.markTaskAsDone(currentTask.id);\n if (recovery === 'pivot') {\n await interactiveSpecificationAgent({\n initialContext: `Task \"${currentTask.description}\" FAILED.\\nError: ${result.summary}\\nHistory:\\n${contextHistory}`\n });\n }\n }\n }\n\n tui.outro('🦈 Legacy Orchestration Finished.');\n });\n","import { ProviderResolver } from '../api/provider-resolver.js';\nimport { AgentResponse } from './agent-response-parser.js';\nimport { conversationManager } from '../workflow/conversation-manager.js';\nimport { tui } from '../../ui/tui.js';\nimport { colors } from '../../ui/colors.js';\nimport { ConfigManager } from '../config-manager.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { FileLogger } from '../debug/file-logger.js';\nimport {\n handleListFiles,\n handleReadFile,\n handleSearchFile,\n startSmartReplace,\n replaceLineRange,\n handleRunCommand,\n astGrepSearch,\n astGrepRewrite,\n generateFilePreview,\n astListStructure,\n astAddMethod,\n astGetMethod,\n astAddClass,\n astGetProperty,\n astAddProperty,\n astRemoveProperty,\n astModifyMethod,\n astRemoveMethod,\n astAddDecorator,\n astAddInterface,\n astAddTypeAlias,\n astAddFunction,\n astRemoveFunction,\n astAddImport,\n astRemoveImport,\n astOrganizeImports,\n astModifyProperty\n} from './agent-tools.js';\nimport { t } from '../i18n/index.js';\n\nconst AGENT_TYPE = 'developer_agent';\n\n// Validation Functions\nasync function validateTypeScript(filePath: string): Promise<{ valid: boolean, error?: string }> {\n try {\n const result = await handleRunCommand(`npx tsc --noEmit --skipLibCheck ${filePath}`);\n if (result.trim() === '' || !result.includes('error TS')) {\n return { valid: true };\n }\n return { valid: false, error: result };\n } catch (e: any) {\n return { valid: false, error: e.message || 'TypeScript validation failed' };\n }\n}\n\nfunction validateHtmlTagBalance(filePath: string): { valid: boolean, error?: string } {\n const content = fs.readFileSync(filePath, 'utf-8');\n const stack: string[] = [];\n const tagRegex = /<\\/?(\\w+)(?:\\s[^>]*)?\\s*\\/?>/g;\n const selfClosingTags = ['br', 'hr', 'img', 'input', 'meta', 'link', 'area', 'base', 'col', 'embed', 'param', 'source', 'track', 'wbr'];\n\n let match;\n while ((match = tagRegex.exec(content)) !== null) {\n const fullTag = match[0];\n const tagName = match[1].toLowerCase();\n\n if (fullTag.startsWith('</')) {\n const expected = stack.pop();\n if (expected !== tagName) {\n return {\n valid: false,\n error: `Tag mismatch: expected </${expected}> but found </${tagName}> at position ${match.index}`\n };\n }\n } else if (!fullTag.endsWith('/>') && !selfClosingTags.includes(tagName)) {\n stack.push(tagName);\n }\n }\n\n if (stack.length > 0) {\n return { valid: false, error: `Unclosed tags: <${stack.join('>, <')}>` };\n }\n\n return { valid: true };\n}\n\n// Helper to get effective Agent ID\nfunction getAgentId(overrideId?: string): string {\n if (overrideId) return overrideId;\n\n // Check Config\n const config = ConfigManager.getInstance().getConfig();\n if (config.agents?.dev) return config.agents.dev;\n\n // Check Env\n if (process.env.STACKSPOT_DEV_AGENT_ID) return process.env.STACKSPOT_DEV_AGENT_ID;\n\n // Default\n return '01KEQCGJ65YENRA4QBXVN1YFFX';\n}\n\nfunction getAgentVersion(overrideVersion?: string): string | undefined {\n if (overrideVersion) return overrideVersion;\n\n // Check Config\n const config: any = ConfigManager.getInstance().getConfig();\n if (config.agentVersions?.dev) return config.agentVersions.dev;\n\n // Check Env\n if (process.env.STACKSPOT_DEV_AGENT_VERSION) return process.env.STACKSPOT_DEV_AGENT_VERSION;\n\n return undefined;\n}\n\ninterface SpecState {\n status: 'MISSING' | 'PENDING' | 'COMPLETED';\n nextTask?: string;\n specContent?: string;\n}\n\nfunction analyzeSpecState(projectRoot: string): SpecState {\n const specPath = path.resolve(projectRoot, '_sharkrc', 'tech-spec.md');\n if (!fs.existsSync(specPath)) {\n return { status: 'MISSING' };\n }\n\n const content = fs.readFileSync(specPath, 'utf-8');\n // Regex for unchecked task: - [ ] Task description\n // Capture the line content - simple regex, can be improved for nested lists if needed\n const match = content.match(/- \\[ \\] (.*)/);\n\n if (match) {\n return { status: 'PENDING', nextTask: match[1].trim(), specContent: content };\n }\n\n return { status: 'COMPLETED', specContent: content };\n}\n\nfunction buildSystemPrompt(state: SpecState, contextContent: string, additionalInstructions: string = ''): string {\n let basePrompt = ``;\n\n if (contextContent) {\n basePrompt += `\\n\\n--- PROJECT CONTEXT ---\\n${contextContent}\\n-----------------------\\n`;\n }\n\n if (state.status === 'MISSING') {\n basePrompt += `\\n\\n🚨 CRITICAL: NO 'tech-spec.md' FOUND.\\n\nYour FIRST priority is to analyze the user request and CREATE a 'tech-spec.md' file.\n\n⚠️ WORKFLOW:\n1. **Understand**: Clarify the goal with the user if needed.\n2. **Explore**: Use 'list_files'/'read_file' to find RELEVANT files for this specific task.\n3. **Specify**: Create 'tech-spec.md' referencing REAL file paths you found.\n\nDO NOT create a spec based on guesses. Verify file existence before writing the plan.\n\nStructure for 'tech-spec.md':\n\\`\\`\\`markdown\n# Technical Spec: [Title]\n\n## Goal\n[Brief description]\n\n## Implementation Plan\n- [ ] Step 1: [Description]\n- [ ] Step 2: [Description]\n...\n\\`\\`\\`\nUser Request: \"${additionalInstructions}\"\n`;\n } else if (state.status === 'PENDING') {\n basePrompt += `\\n\\n🟢 EXECUTION MODE\\n\nUse 'tech-spec.md' as your source of truth.\n\\n👉 **CURRENT TASK**: \"${state.nextTask}\"\n\\n\nFocus ONLY on this task. Do not jump ahead.\n1. Implement the necessary changes.\n2. Verify (compile/test).\n3. **MANDATORY**: Use 'modify_file' to mark this task as '[x]' in 'tech-spec.md' when done.\n`;\n } else {\n basePrompt += `\\n\\n✨ ALL TASKS COMPLETED according to 'tech-spec.md'.\\n\nAsk the user if they want to add more tasks or finish the session.\n`;\n }\n\n return basePrompt;\n}\n\n\nexport interface DevelopmentResult {\n success: boolean;\n summary: string;\n}\n\nexport async function interactiveDeveloperAgent(options: {\n taskId?: string,\n taskInstruction?: string,\n context?: string,\n history?: string\n} = {}): Promise<DevelopmentResult> {\n FileLogger.init();\n // tui.intro('🦈 Shark Dev Agent (Scoped)'); // Reduced verbosity for orchestration loop\n\n const agentId = getAgentId();\n\n if (agentId === 'PENDING_CONFIGURATION') {\n tui.log.error('❌ STACKSPOT_DEV_AGENT_ID not configured in .env');\n return { success: false, summary: \"Missing configuration.\" };\n }\n\n // 1. Load Context\n const projectRoot = process.cwd();\n let contextContent = '';\n const defaultContextPath = path.resolve(projectRoot, '_sharkrc', 'project-context.md');\n // If orchestrator passes the summary of previous tasks, we append it to context\n const specificContextPath = options.context ? path.resolve(projectRoot, options.context) : defaultContextPath;\n\n if (fs.existsSync(specificContextPath)) {\n try {\n contextContent = fs.readFileSync(specificContextPath, 'utf-8');\n // tui.log.info(`📘 Context loaded from: ${colors.dim(path.relative(projectRoot, specificContextPath))}`);\n } catch (e) {\n tui.log.warning(`Failed to read context file: ${e}`);\n }\n }\n\n // 2. Build Scoped Prompt\n // Note: We are NOT calling analyzeSpecState here anymore. The Orchestrator tells us WHAT to do.\n const currentTask = options.taskInstruction || \"Analyze the project and fix pending issues.\";\n\n let basePrompt = ``;\n if (contextContent) {\n basePrompt += `\\n\\n--- PROJECT CONTEXT ---\\n${contextContent}\\n-----------------------\\n`;\n }\n\n // Inject History from previous turns (Orchestrator Responsibility)\n if (options.history) {\n basePrompt += `\\n\\n--- PREVIOUS EXECUTION SUMMARY ---\\n${options.history}\\n----------------------------------\\n`;\n }\n\n basePrompt += `\\n\\n🟢 EXECUTION MODE\\n\nYou are a highly skilled Developer Agent.\n👉 **CURRENT TASK**: \"${currentTask}\"\n\nYour goal is to COMPLETE this specific task and then STOP.\n1. Implement the necessary changes.\n2. Verify (compile/test).\n3. **MANDATORY**: When you are confident the task is done, output a final message starting with \"TASK_COMPLETED:\" followed by a brief technical summary of what you did.\n`;\n\n let nextPrompt = basePrompt;\n\n // 3. Main Loop\n let keepGoing = true;\n const spinner = tui.spinner();\n let finalSummary = \"\";\n let isTaskCompleted = false;\n\n // Force NEW Conversation ID for Statelessness\n // We update the conversation manager to a random ID or based on TaskID\n // To ensure we don't pollute the global 'developer_agent' state if we want true statelessness.\n // Ideally, we pass a specific conversation ID Key.\n const conversationKey = options.taskId ? `dev_agent_${options.taskId}` : `dev_agent_${Date.now()}`;\n // Resetting for safety if repeated calls\n // await conversationManager.saveConversationId(conversationKey, \"\"); \n\n // Auto-Approval State\n let autoApprovals = {\n files: false,\n commands: false\n };\n\n while (keepGoing) {\n try {\n spinner.start('🦈 Shark Dev working...');\n\n // Call API\n const lastResponse = await callDevAgentApi(nextPrompt, (chunk) => {\n // Optional: Stream text\n }, conversationKey);\n\n spinner.stop('Response received');\n\n if (lastResponse) {\n const response = lastResponse;\n const actions = response.actions || []; // Should be array by schema, but safe fallback\n\n // Check Global Message first (e.g. Completion or Failure)\n if (response.message && response.message.includes('TASK_COMPLETED:')) {\n isTaskCompleted = true;\n finalSummary = response.message.split('TASK_COMPLETED:')[1].trim();\n // We continue to process actions if any, but stop loop after\n keepGoing = false;\n }\n\n // Check for explicit task failure signal from agent\n if (response.message && response.message.includes('TASK_FAILED:')) {\n const failureReason = response.message.split('TASK_FAILED:')[1].trim();\n tui.log.error(`❌ Agent reported task failure: ${failureReason}`);\n return { success: false, summary: failureReason };\n }\n\n // If we have just a message and NO actions (or empty actions), treat as talk\n if (actions.length === 0 && response.message && !isTaskCompleted) {\n tui.log.info(colors.primary('🤖 Shark Dev:'));\n console.log(response.message);\n const userReply = await tui.text({ message: 'Your answer:' });\n if (tui.isCancel(userReply)) { keepGoing = false; break; }\n nextPrompt = userReply as string;\n }\n\n let executionResults = \"\";\n let waitingForUser = false;\n\n for (const action of actions) {\n\n // ... (Existing Tool Handling Logic - reusing almost 1:1, just cleaner logging) ...\n // [Optimization: I will minimize the copy-paste here by keeping the core logic but ensuring it writes to executionResults]\n\n if (action.type === 'talk_with_user') {\n tui.log.info(colors.primary('🤖 Shark Dev:'));\n console.log(action.content);\n // If agent talks, we might need input. \n // In stateless mode, if it asks a question, we might bubble it up?\n // For now, let's keep the TUI interaction valid.\n if (!isTaskCompleted) waitingForUser = true;\n }\n\n // ... (Include all tool handlers from original code: list_files, read_file, run_command, modify_file, ast_*, etc.) ...\n // To avoid a massive edit block that might break, I will assume the original tool handlers logic is robust.\n // I will reinject strictly the necessary parts. \n // [Developer Note: For the sake of this edit, I have to replicate the tool logic to ensure the function works. \n // I'll condense the logging.]\n\n else if (action.type === 'list_files') {\n tui.log.info(`📂 Scanning: ${colors.dim(action.path || '.')}`);\n const result = handleListFiles(action.path || '.');\n executionResults += `[Action list_files(${action.path}) Result]:\\n${result}\\n\\n`;\n }\n else if (action.type === 'read_file') {\n tui.log.info(`📖 Reading: ${colors.dim(action.path || '')}`);\n const result = handleReadFile(action.path || '');\n executionResults += `[Action read_file(${action.path}) Result]:\\n${result}\\n\\n`;\n }\n else if (action.type === 'search_file') {\n const result = handleSearchFile(action.path || '');\n executionResults += `[Action search_file(${action.path}) Result]:\\n${result}\\n\\n`;\n }\n else if (action.type === 'run_command') {\n const cmd = action.command || '';\n tui.log.info(`💻 Executing: ${colors.dim(cmd)}`);\n // Auto-approval logic reuse\n let approved = autoApprovals.commands;\n if (!approved) {\n const choice = await tui.select({\n message: `Execute: ${cmd}?`,\n options: [{ value: 'yes', label: 'Yes' }, { value: 'always', label: 'Yes (Auto-Approve Session)' }, { value: 'no', label: 'No' }]\n });\n if (choice === 'always') { autoApprovals.commands = true; approved = true; }\n else if (choice === 'yes') approved = true;\n }\n if (approved) {\n const result = await handleRunCommand(cmd);\n executionResults += `[Action run_command(${cmd}) Result]:\\n${result}\\n\\n`;\n } else {\n executionResults += `[Action run_command]: User blocked execution.\\n\\n`;\n }\n }\n else if (['create_file', 'modify_file'].includes(action.type)) {\n const filePath = action.path || '';\n tui.log.warning(`📝 ${action.type === 'create_file' ? 'CREATE' : 'MODIFY'}: ${colors.bold(filePath)}`);\n\n let approved = autoApprovals.files;\n if (!approved) {\n const choice = await tui.select({\n message: `Approve changes to ${filePath}?`,\n options: [{ value: 'yes', label: 'Yes' }, { value: 'always', label: 'Yes (Auto-Approve Session)' }, { value: 'no', label: 'No' }]\n });\n if (choice === 'always') { autoApprovals.files = true; approved = true; }\n else if (choice === 'yes') approved = true;\n }\n\n if (approved) {\n // ... (Perform Write) ...\n if (action.type === 'create_file') {\n // Simple Create Logic\n const dir = path.dirname(path.resolve(projectRoot, filePath));\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.resolve(projectRoot, filePath), action.content || '', 'utf-8');\n executionResults += `[Action create_file]: Success\\n\\n`;\n } else {\n // Modify Logic\n let success = false;\n if (action.line_range) success = replaceLineRange(filePath, action.line_range[0], action.line_range[1], action.content || '', tui);\n else if (action.target_content) success = startSmartReplace(filePath, action.content || '', action.target_content, tui);\n\n executionResults += success ? `[Action modify_file]: Success\\n\\n` : `[Action modify_file]: Failed\\n\\n`;\n }\n // Validation hooks can be re-added here similar to original\n const val = await validateTypeScript(path.resolve(projectRoot, filePath));\n if (!val.valid) executionResults += `[Validation Failed]: ${val.error}\\n\\n`;\n } else {\n executionResults += `[Action ${action.type}]: User Denied.\\n\\n`;\n }\n }\n // ... (AST Actions would follow similar pattern) ...\n else if (action.type.startsWith('ast_')) {\n try {\n // AST Tools Mapping (Async)\n let result = '';\n if (action.type === 'ast_list_structure') {\n result = await astListStructure(action.path || '');\n }\n else if (action.type === 'ast_get_method') {\n result = await astGetMethod(action.path || '', action.class_name || '', action.method_name || '');\n }\n else if (action.type === 'ast_add_method') {\n const success = await astAddMethod(action.path || '', action.class_name || '', action.method_code || '');\n result = success ? 'Method added successfully.' : 'Failed to add method.';\n }\n else if (action.type === 'ast_modify_method') {\n const success = await astModifyMethod(action.path || '', action.class_name || '', action.method_name || '', action.new_body || '');\n result = success ? 'Method modified successfully.' : 'Failed to modify method.';\n }\n else if (action.type === 'ast_remove_method') {\n const success = await astRemoveMethod(action.path || '', action.class_name || '', action.method_name || '');\n result = success ? 'Method removed successfully.' : 'Failed to remove method.';\n }\n else if (action.type === 'ast_add_class') {\n const success = await astAddClass(action.path || '', action.class_name || '', action.extends_class || undefined, action.implements_interfaces || undefined);\n result = success ? 'Class added successfully.' : 'Failed to add class.';\n }\n else if (action.type === 'ast_get_property') {\n tui.log.info(`🔍 Reading property ${colors.gray(action.property_name || '')} in ${colors.gray(action.class_name || '')}`);\n const propContent = await astGetProperty(action.path || '', action.class_name || '', action.property_name || '');\n result = `[AST Get Property] Content:\\n${propContent}`;\n }\n else if (action.type === 'ast_add_property') {\n const success = await astAddProperty(action.path || '', action.class_name || '', action.property_code || '');\n result = success ? 'Property added successfully.' : 'Failed to add property.';\n }\n else if (action.type === 'ast_modify_property') {\n tui.log.info(`✏️ Modifying property ${colors.gray(action.property_name || '')} in ${colors.gray(action.class_name || '')}`);\n // Note: property_code here is the NEW full property definition\n const success = await astModifyProperty(action.path || '', action.class_name || '', action.property_name || '', action.property_code || '');\n result = success ? 'Property modified successfully.' : 'Failed to modify property.';\n }\n else if (action.type === 'ast_remove_property') {\n const success = await astRemoveProperty(action.path || '', action.class_name || '', action.property_name || '');\n result = success ? 'Property removed successfully.' : 'Failed to remove property.';\n }\n else if (action.type === 'ast_add_decorator') {\n // Tool only supports class decorators for now\n const success = await astAddDecorator(action.path || '', action.class_name || '', action.decorator_code || '');\n result = success ? 'Decorator added successfully.' : 'Failed to add decorator.';\n }\n else if (action.type === 'ast_add_interface') {\n const success = await astAddInterface(action.path || '', action.interface_code || '');\n result = success ? 'Interface added successfully.' : 'Failed to add interface.';\n }\n else if (action.type === 'ast_add_type_alias') {\n const success = await astAddTypeAlias(action.path || '', action.type_code || '');\n result = success ? 'Type alias added successfully.' : 'Failed to add type alias.';\n }\n else if (action.type === 'ast_add_function') {\n const success = await astAddFunction(action.path || '', action.function_code || '');\n result = success ? 'Function added successfully.' : 'Failed to add function.';\n }\n else if (action.type === 'ast_remove_function') {\n const success = await astRemoveFunction(action.path || '', action.function_name || '');\n result = success ? 'Function removed successfully.' : 'Failed to remove function.';\n }\n else if (action.type === 'ast_add_import') {\n const success = await astAddImport(action.path || '', action.import_statement || '');\n result = success ? 'Import added successfully.' : 'Failed to add import.';\n }\n else if (action.type === 'ast_remove_import') {\n const success = await astRemoveImport(action.path || '', action.module_path || '');\n result = success ? 'Import removed successfully.' : 'Failed to remove import.';\n }\n else if (action.type === 'ast_organize_imports') {\n const success = await astOrganizeImports(action.path || '');\n result = success ? 'Imports organized successfully.' : 'Failed to organize imports.';\n }\n else {\n result = `Unknown AST action: ${action.type}`;\n }\n\n executionResults += `[Action ${action.type} Result]:\\n${result}\\n\\n`;\n tui.log.info(`⚡ AST Action ${colors.dim(action.type)}: ${result}`);\n\n } catch (e: any) {\n executionResults += `[Action ${action.type} Failed]: ${e.message}\\n\\n`;\n tui.log.error(`❌ AST Action Error: ${e.message}`);\n }\n }\n else if (action.type === 'search_ast') {\n const result = await astGrepSearch(action.pattern || '', action.path || '', action.language || 'typescript', tui);\n executionResults += `[Action search_ast Result]:\\n${result}\\n\\n`;\n }\n else if (action.type === 'modify_ast') {\n const success = await astGrepRewrite(action.pattern || '', action.fix || '', action.path || '', action.language || 'typescript', tui);\n executionResults += success ? `[Action modify_ast]: Success\\n\\n` : `[Action modify_ast]: Failed\\n\\n`;\n }\n } // End Action Loop\n\n // Determine Next Prompt\n if (executionResults) {\n if (waitingForUser) {\n const userReply = await tui.text({ message: 'Your answer:' });\n if (tui.isCancel(userReply)) { keepGoing = false; break; }\n nextPrompt = `${executionResults}\\nUser Reply: ${userReply}`;\n } else {\n nextPrompt = `${executionResults}\\n[System]: Continue execution. If finished, output \"TASK_COMPLETED: summary\".`;\n tui.log.info(colors.dim('Processing results...'));\n }\n } else if (!keepGoing) {\n // Task completed or stopped\n } else if (waitingForUser) {\n // handled above in message fallback\n } else {\n if (!isTaskCompleted && actions.length > 0) nextPrompt = \"Please continue.\";\n }\n\n } else {\n tui.log.warning('No response received from agent.');\n }\n\n } catch (e: any) {\n tui.log.error(e.message);\n keepGoing = false;\n return { success: false, summary: `Error: ${e.message}` };\n }\n }\n\n tui.log.success('✅ Task Scope Completed');\n return { success: true, summary: finalSummary || \"Task completed without summary.\" };\n}\n\n// Helper to support key-based conversation\nasync function callDevAgentApi(prompt: string, onChunk: (chunk: string) => void, conversationKey: string = AGENT_TYPE): Promise<AgentResponse> {\n const existingConversationId = await conversationManager.getConversationId(conversationKey);\n\n const provider = ProviderResolver.getProvider('developer_agent');\n\n const parsedResponse = await provider.streamChat(prompt, {\n conversationId: existingConversationId,\n agentType: 'developer_agent',\n onChunk\n });\n\n if (parsedResponse.conversation_id) {\n await conversationManager.saveConversationId(conversationKey, parsedResponse.conversation_id);\n }\n\n return parsedResponse;\n}\n","\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface SpecTask {\n id: string; // generated based on index (e.g., \"task-1\")\n description: string;\n status: 'PENDING' | 'IN_PROGRESS' | 'COMPLETED';\n line_number: number; // 0-based line index in the file\n}\n\nexport interface SpecState {\n status: 'MISSING' | 'PENDING' | 'COMPLETED';\n nextTask?: SpecTask;\n allTasks: SpecTask[];\n}\n\nexport class TaskManager {\n private projectRoot: string;\n private specPath: string;\n\n constructor(projectRoot: string = process.cwd()) {\n this.projectRoot = projectRoot;\n this.specPath = path.resolve(this.projectRoot, '_sharkrc', 'tech-spec.md');\n }\n\n /**\n * Reads the tech-spec.md file and analyzes its current state.\n */\n public analyzeSpecState(): SpecState {\n if (!fs.existsSync(this.specPath)) {\n return { status: 'MISSING', allTasks: [] };\n }\n\n const content = fs.readFileSync(this.specPath, 'utf-8');\n const lines = content.split('\\n');\n const tasks: SpecTask[] = [];\n\n let taskIndex = 1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n const pendingMatch = trimmed.match(/^- \\[ \\] (.*)/);\n const completedMatch = trimmed.match(/^- \\[x\\] (.*)/i);\n const progressMatch = trimmed.match(/^- \\[\\/\\] (.*)/);\n\n let currentTask: SpecTask | null = null;\n let status: 'PENDING' | 'IN_PROGRESS' | 'COMPLETED' | null = null;\n let description = '';\n\n if (pendingMatch) {\n description = pendingMatch[1].trim();\n status = 'PENDING';\n } else if (completedMatch) {\n description = completedMatch[1].trim();\n status = 'COMPLETED';\n } else if (progressMatch) {\n description = progressMatch[1].trim();\n status = 'IN_PROGRESS';\n }\n\n if (status && description) {\n // Look ahead for sub-bullets or details\n let j = i + 1;\n while (j < lines.length) {\n const nextLine = lines[j];\n const nextTrimmed = nextLine.trim();\n // Stop if next line is empty, a new task, or a new section\n if (!nextTrimmed || nextTrimmed.match(/^- \\[[ x\\/]\\]/) || nextTrimmed.startsWith('#')) {\n break;\n }\n description += '\\n' + nextTrimmed;\n j++;\n }\n\n currentTask = {\n id: `task-${taskIndex++}`,\n description: description,\n status: status,\n line_number: i\n };\n tasks.push(currentTask);\n }\n }\n\n // Determine next actionable task\n // Priority: IN_PROGRESS -> First PENDING\n let nextTask = tasks.find(t => t.status === 'IN_PROGRESS');\n if (!nextTask) {\n nextTask = tasks.find(t => t.status === 'PENDING');\n }\n\n const status = (!nextTask && tasks.length > 0 && tasks.every(t => t.status === 'COMPLETED'))\n ? 'COMPLETED'\n : 'PENDING';\n\n return {\n status: tasks.length === 0 ? 'MISSING' : status, // Empty file is effectively \"pending creation\" but we treat as missing content logic elsewhere\n nextTask,\n allTasks: tasks\n };\n }\n\n /**\n * Marks a specific task as COMPLETED in the file.\n * Uses line-based replacement to be safe.\n */\n public markTaskAsDone(taskId: string): boolean {\n const state = this.analyzeSpecState();\n const task = state.allTasks.find(t => t.id === taskId);\n\n if (!task) {\n console.error(`Task ${taskId} not found.`);\n return false;\n }\n\n const content = fs.readFileSync(this.specPath, 'utf-8');\n const lines = content.split('\\n');\n\n // Verify line content hasn't drifted (sanity check)\n const targetLine = lines[task.line_number];\n if (!targetLine.includes(task.description)) {\n console.error(`Concurrency Error: Task line content mistmatch. Expected \"${task.description}\" at line ${task.line_number}.`);\n // Fallback: search for the task description again\n // This is simple recovery, in a real DB we'd use IDs.\n return false;\n }\n\n // Replace [ ], [/] with [x]\n const newLine = targetLine\n .replace('- [ ]', '- [x]')\n .replace('- [/]', '- [x]');\n\n lines[task.line_number] = newLine;\n\n fs.writeFileSync(this.specPath, lines.join('\\n'), 'utf-8');\n return true;\n }\n\n /**\n * Marks a task as IN_PROGRESS.\n */\n public markTaskInProgress(taskId: string): boolean {\n const state = this.analyzeSpecState();\n const task = state.allTasks.find(t => t.id === taskId);\n\n if (!task) return false;\n\n const content = fs.readFileSync(this.specPath, 'utf-8');\n const lines = content.split('\\n');\n\n let targetLine = lines[task.line_number];\n\n // Replace [ ] with [/]\n targetLine = targetLine.replace('- [ ]', '- [/]');\n\n lines[task.line_number] = targetLine;\n fs.writeFileSync(this.specPath, lines.join('\\n'), 'utf-8');\n return true;\n }\n\n /**\n * Completely updates the spec file content (used by Spec Agent).\n */\n public updateSpecContent(newContent: string): void {\n fs.writeFileSync(this.specPath, newContent, 'utf-8');\n }\n\n public getSpecPath(): string {\n return this.specPath;\n }\n}\n","\nimport { parseAgentResponse, AgentResponse } from './agent-response-parser.js';\nimport { conversationManager } from '../workflow/conversation-manager.js';\nimport { ProviderResolver } from '../api/provider-resolver.js';\nimport { tui } from '../../ui/tui.js';\nimport { colors } from '../../ui/colors.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { FileLogger } from '../debug/file-logger.js';\nimport { handleListFiles, handleReadFile, handleSearchFile, handleSearchCode, startSmartReplace } from './agent-tools.js';\nimport { ConfigManager } from '../config-manager.js';\n\nconst AGENT_TYPE = 'specification_agent';\n\nfunction getAgentId(overrideId?: string): string {\n if (overrideId) return overrideId;\n const config = ConfigManager.getInstance().getConfig();\n if (config.agents?.spec) return config.agents.spec;\n return process.env.STACKSPOT_SPEC_AGENT_ID || '01KEPXTX37FTB4N672TZST4SGP';\n}\n\nfunction getAgentVersion(overrideVersion?: string): string | undefined {\n if (overrideVersion) return overrideVersion;\n const config: any = ConfigManager.getInstance().getConfig();\n if (config.agentVersions?.spec) return config.agentVersions.spec;\n return process.env.STACKSPOT_SPEC_AGENT_VERSION;\n}\n\nexport interface SpecAgentOptions {\n agentId?: string;\n briefingPath?: string; // Path to the briefing file to read, explicit override\n initialContext?: string; // Handover context from Dev Agent or Orchestrator\n}\n\n/**\n * Interactive Specification Agent session.\n * Uses a Template-Based Incremental Workflow.\n */\nexport async function interactiveSpecificationAgent(options: SpecAgentOptions = {}): Promise<void> {\n FileLogger.init();\n tui.intro('🏗️ Specification Agent (Template-Based)');\n\n const projectRoot = process.cwd();\n // User requested to store tech-spec.md in _sharkrc\n const sharkRcDir = path.resolve(projectRoot, '_sharkrc');\n if (!fs.existsSync(sharkRcDir)) fs.mkdirSync(sharkRcDir, { recursive: true });\n\n const outputFile = path.resolve(sharkRcDir, 'tech-spec.md');\n\n // 1. Ensure Template Exists (Inline Template)\n if (!fs.existsSync(outputFile)) {\n // Hardcoded template as requested, similar to scan-agent.ts\n let initialContent = `# Technical Specification: {{PROJECT_NAME}}\n\n## 1. Technology Stack\n[TO BE ANALYZED - STACK]\n- Language: [e.g. TypeScript]\n- Framework: [e.g. Node.js / React]\n- Database: [e.g. SQLite / PostgreSQL]\n- Key Libraries: [Top 5 dependencies]\n\n## 2. Architecture Overview\n[TO BE ANALYZED - ARCHITECTURE]\n[Brief description of architectural pattern]\n\n## 3. Data Model\n[TO BE ANALYZED - DATA MODEL]\n[Schema/ERD definitions]\n\n## 4. API / Interface Contracts\n[TO BE ANALYZED - API]\n[Main endpoints or CLI commands]\n\n## 5. Implementation Steps\n[TO BE FILLED - MUST BE CHECKBOXES]\n`;\n\n // Replace basic placeholders immediately\n const projectName = path.basename(projectRoot);\n initialContent = initialContent.replace(/{{PROJECT_NAME}}/g, projectName);\n\n const BOM = '\\uFEFF';\n fs.writeFileSync(outputFile, BOM + initialContent, { encoding: 'utf-8' });\n tui.log.success(`✅ Created: ${colors.bold('_sharkrc/tech-spec.md')}`);\n } else {\n tui.log.info(`📄 Using existing ${colors.bold('_sharkrc/tech-spec.md')}`);\n }\n\n // 2. Load Inputs (Context, Briefing)\n let contextContent = '';\n const contextPath = path.resolve(projectRoot, '_sharkrc', 'project-context.md');\n if (fs.existsSync(contextPath)) {\n contextContent = fs.readFileSync(contextPath, 'utf-8');\n tui.log.info(`📘 Context loaded.`);\n }\n\n let briefingContent = '';\n if (options.briefingPath && fs.existsSync(options.briefingPath)) {\n briefingContent = fs.readFileSync(options.briefingPath, 'utf-8');\n tui.log.info(`📄 Briefing loaded from: ${colors.dim(options.briefingPath)}`);\n } else {\n const standardBriefing = path.resolve(projectRoot, '_sharkrc', 'briefing.md');\n if (fs.existsSync(standardBriefing)) {\n briefingContent = fs.readFileSync(standardBriefing, 'utf-8');\n tui.log.info(`📄 Briefing loaded.`);\n }\n }\n\n // 3. Construct Super Prompt\n let initialPrompt = `\nVocê é o **Shark Spec**, um Arquiteto de Software Sênior e Tech Lead.\nSeu objetivo final é produzir uma especificação técnica precisa para a tarefa no arquivo \\`_sharkrc/tech-spec.md\\`.\n\n⚠️ O SEU WORKFLOW É GUIADO POR FASES.\nNÃO TENTE ADIANTAR O TRABALHO (ex: investigar código ou preencher template agora).\n\n**VOCÊ ESTÁ NA FASE 1: ENTENDIMENTO DA TAREFA**\n- Use \\`talk_with_user\\` para perguntar ao usuário qual tarefa específica, funcionalidade ou bug ele precisa especificar.\n- Confirme o escopo e os limites com o usuário.\n- Se o escopo estiver perfeitamente claro e confirmado (com o usuário), emita \"PHASE_COMPLETED\" no campo \"summary\" do JSON para avançar.\n\nIMPORTANTE: Toda a sua comunicação DEVE ser em Português.\n`;\n\n if (briefingContent) {\n initialPrompt += `\nℹ️ Um documento de briefing foi encontrado. Ele define parcialmente a tarefa para a Fase 1.\nConfirme seu entendimento com o usuário via \\`talk_with_user\\` antes de prosseguir para a Fase 2.\n\n--- BRIEFING ---\n${briefingContent}\n----------------\n`;\n } else {\n initialPrompt += `\nℹ️ Nenhum documento de briefing foi encontrado. Inicie a Fase 1 imediatamente: use \\`talk_with_user\\` para perguntar ao usuário o que precisa ser especificado.\n`;\n }\n\n if (options.initialContext) {\n initialPrompt += `\\n--- CONTEXTO DE EXECUÇÃO ANTERIOR (HANDOVER/FEEDBACK) ---\\n${options.initialContext}\\n-----------------------------------------------------\\n`;\n }\n\n if (contextContent) {\n initialPrompt += `\nℹ️ O contexto do projeto está disponível para referência. Use-o na Fase 2 para se alinhar com os padrões de arquitetura existentes, mas NÃO o use para preencher as seções de forma genérica.\n\n--- PROJECT CONTEXT ---\n${contextContent}\n-----------------------\n`;\n }\n\n // 4. Start Loop\n await runSpecLoop(initialPrompt.trim(), outputFile, options.agentId);\n}\n\n/**\n * Main Loop for Specification Agent (Incremental)\n */\nasync function runSpecLoop(initialMessage: string, targetPath: string, overrideAgentId?: string) {\n let nextPrompt = initialMessage;\n let keepGoing = true;\n let stepCount = 0;\n let currentPhase = 1;\n const MAX_STEPS = 30;\n\n while (keepGoing && stepCount < MAX_STEPS) {\n stepCount++;\n const spinner = tui.spinner();\n spinner.start(`🏗️ Spec Agent working (Step ${stepCount}/${MAX_STEPS})...`);\n\n // Check Pending Sections to guide the agent\n let pendingSections = [];\n if (fs.existsSync(targetPath)) {\n const content = fs.readFileSync(targetPath, 'utf-8');\n if (content.includes('[TO BE ANALYZED]')) pendingSections.push('Analysis Sections (Stack, Arch, Data, API)');\n if (content.includes('[TO BE FILLED')) pendingSections.push('Implementation Steps');\n }\n\n if (pendingSections.length === 0 && stepCount > 1) {\n // Check if user is done?\n }\n\n let responseText = '';\n let lastResponse: AgentResponse | null = null;\n\n try {\n lastResponse = await callSpecAgentApi(nextPrompt, (chunk) => {\n responseText += chunk;\n }, overrideAgentId);\n\n spinner.stop('Response received');\n\n if (lastResponse && lastResponse.actions) {\n let executionResults = \"\";\n let waitingForUser = false;\n let specUpdated = false;\n let hasSystemError = false;\n let systemErrorContent = \"\";\n\n for (const action of lastResponse.actions) {\n if (action.type === 'talk_with_user') {\n const isSystemError = action.content?.startsWith('[SYSTEM ERROR]');\n if (isSystemError) {\n tui.log.error(`⚠️ Detectado erro na resposta do Agente (truncado ou inválido).`);\n tui.log.info(colors.dim(action.content || ''));\n const approved = await tui.confirm({ message: `Enviar notificação de erro para o agente tentar se recuperar automaticamente?` });\n if (approved) {\n hasSystemError = true;\n systemErrorContent = action.content || '';\n } else {\n const userReply = await tui.text({ message: 'Seu prompt alternativo para o agente:' });\n if (tui.isCancel(userReply)) { keepGoing = false; return; }\n hasSystemError = true;\n systemErrorContent = userReply as string;\n }\n } else {\n tui.log.info(colors.primary('🤖 Architect:'));\n console.log(action.content);\n waitingForUser = true;\n }\n }\n\n else if (action.type === 'list_files') {\n tui.log.info(`📂 Scanning: ${colors.dim(action.path || '.')}`);\n const result = handleListFiles(action.path || '.');\n executionResults += `[Action list_files(${action.path}) Result]:\\n${result}\\n\\n`;\n }\n\n else if (action.type === 'read_file') {\n tui.log.info(`📖 Reading: ${colors.dim(action.path || '')}`);\n const result = handleReadFile(action.path || '');\n executionResults += `[Action read_file(${action.path}) Result]:\\n${result}\\n\\n`;\n }\n\n else if (action.type === 'search_file') {\n tui.log.info(`🔍 Searching: ${colors.dim(action.path || '')}`);\n const result = handleSearchFile(action.path || '');\n executionResults += `[Action search_file(${action.path}) Result]:\\n${result}\\n\\n`;\n }\n\n else if (action.type === 'search_code') {\n const glob = action.path || 'src/**/*';\n const query = action.query || '';\n const isRegex = action.is_regex === true;\n tui.log.info(`🔎 Search code: ${colors.dim(`\"${query}\" in ${glob}`)}`);\n const result = handleSearchCode(glob, query, isRegex);\n executionResults += `[Action search_code(\"${query}\" in \"${glob}\") Result]:\\n${result}\\n\\n`;\n }\n\n else if (['create_file', 'modify_file'].includes(action.type)) {\n // Target Validation & Redirection\n let actionPath = path.resolve(action.path || '');\n const resolvedTargetPath = path.resolve(targetPath);\n let isTarget = actionPath === resolvedTargetPath;\n\n // Auto-redirect if agent tries to write to root tech-spec.md instead of _sharkrc\n if (!isTarget && path.basename(actionPath) === 'tech-spec.md') {\n tui.log.warning(`Redirecting ${action.type} from ${action.path} to ${path.relative(process.cwd(), targetPath)}`);\n action.path = targetPath;\n actionPath = resolvedTargetPath;\n isTarget = true;\n }\n\n if (!isTarget && action.type === 'create_file') {\n const confirm = await tui.confirm({ message: `Agent wants to create ${action.path}. Allow?` });\n if (!confirm) {\n executionResults += `[Action create_file]: User denied.\\n`;\n continue;\n }\n }\n\n try {\n if (action.type === 'create_file') {\n const BOM = '\\uFEFF';\n fs.writeFileSync(action.path!, BOM + (action.content || ''), 'utf-8');\n tui.log.success(`✅ Created: ${action.path}`);\n executionResults += `[Action create_file]: Success.\\n`;\n } else if (action.type === 'modify_file') {\n if (action.target_content) {\n // Ensure we pass the possibly redirected path\n const success = startSmartReplace(action.path!, action.content || '', action.target_content, tui);\n if (success) {\n executionResults += `[Action modify_file]: Success.\\n`;\n specUpdated = true;\n } else {\n executionResults += `[Action modify_file]: Failed. Target content not found or ambiguous.\\n`;\n }\n } else {\n executionResults += `[Action modify_file]: Failed. 'target_content' is required.\\n`;\n }\n }\n } catch (e: any) {\n executionResults += `[Action ${action.type}]: Error: ${e.message}\\n`;\n }\n }\n }\n\n // Check for Phase completion signal\n if (lastResponse.message && lastResponse.message.includes('PHASE_COMPLETED')) {\n const extraContext = executionResults ? `\\n\\nResultados das últimas ações executadas antes da conclusão:\\n${executionResults}` : \"\";\n \n if (currentPhase === 1) {\n currentPhase = 2;\n tui.log.success(`✅ Fase 1 Concluída. Iniciando Fase 2 (Investigação).`);\n nextPrompt = `[System Message]\\nVocê completou a FASE 1 com sucesso.\\n\\n**VOCÊ AGORA ESTÁ NA FASE 2: INVESTIGAÇÃO**\\n- Use \\`search_code\\` e \\`list_files\\` para explorar os arquivos relevantes à tarefa.\\n- Prefira \\`search_code\\` em vez de \\`read_file\\` para buscar código sem inflar o contexto.\\n- NÃO leia o projeto inteiro de forma genérica.\\n- REGRA DE OURO (READ-FIRST): Você NÃO PODE referenciar um arquivo na especificação técnica que não tenha investigado nesta fase.\\n- Quando achar que possui toda a clareza técnica sobre onde e o que deve ser feito no código, emita \"PHASE_COMPLETED\" no summary.${extraContext}`;\n continue;\n } else if (currentPhase === 2) {\n currentPhase = 3;\n tui.log.success(`✅ Fase 2 Concluída. Iniciando Fase 3 (Preenchimento).`);\n nextPrompt = `[System Message]\\nVocê completou a FASE 2 com sucesso.\\n\\n**VOCÊ AGORA ESTÁ NA FASE 3: PREENCHIMENTO DO TEMPLATE**\\n- Use \\`modify_file\\` no arquivo \\`${targetPath}\\` para substituir os placeholders pelo conteúdo real levantado na fase de investigação.\\n- As seções 1-4 devem descrever o contexto da TAREFA, e não o projeto como um todo.\\n- Passos de Implementação (Implementation Steps): APENAS checkboxes markdown: \\`- [ ] [Verbo de Ação] [O Que] em [Caminho Relativo]\\`.\\n- Quando TODOS os placeholders ([TO BE ANALYZED...] ou [TO BE FILLED]) forem substituídos e o trabalho concluído, emita \"SPEC_UPDATED: Complete\" no summary para finalizar.${extraContext}`;\n continue;\n }\n }\n\n // Check for final completion signal\n if (lastResponse.message && lastResponse.message.includes('SPEC_UPDATED:')) {\n if (currentPhase < 3) {\n tui.log.warning(`O agente tentou finalizar prematuramente. Forçando retorno para a fase atual...`);\n nextPrompt = `[System Error]: Você tentou finalizar a especificação prematuramente emitindo SPEC_UPDATED, mas ainda está na Fase ${currentPhase}. Você só pode finalizar quando estiver na Fase 3.\\n\\nContinue seu trabalho na Fase ${currentPhase} ou emita \"PHASE_COMPLETED\" se terminou esta etapa atual.`;\n continue;\n }\n\n const content = fs.existsSync(targetPath) ? fs.readFileSync(targetPath, 'utf-8') : '';\n if (content.includes('[TO BE')) {\n const pendingMatches = [...content.matchAll(/## ([^\\n]+)[\\s\\S]*?\\[TO BE/g)].map(m => m[1]);\n let missing = pendingMatches.length > 0 ? pendingMatches.join(', ') : 'algumas seções';\n \n tui.log.warning(`O agente tentou concluir prematuramente, mas há placeholders pendentes. Forçando retorno...`);\n nextPrompt = `[System Error]: A validação falhou e o bloqueio automático foi acionado.\\nVocê tentou concluir a tarefa, mas o arquivo AINDA possui placeholders '[TO BE ANALYZED...]' ou '[TO BE FILLED]'.\\nAs seguintes seções ainda contêm estes placeholders: ${missing}.\\nVocê é OBRIGADO a usar a action \\`modify_file\\` para preencher o conteúdo de cada uma dessas seções. Use o placeholder exato no campo \\`target_content\\`. NÃO repita a conclusão da tarefa até corrigir todas as pendências.`;\n continue;\n } else {\n const updateSummary = lastResponse.message.split('SPEC_UPDATED:')[1].trim();\n tui.log.success(`✅ Spec Finalized: ${updateSummary}`);\n return;\n }\n }\n\n // Prepare Next Prompt\n if (executionResults) {\n FileLogger.log('TOOL_EXECUTION', 'Specification Agent Actions Output', { executionResults });\n }\n\n if (hasSystemError) {\n nextPrompt = systemErrorContent;\n } else if (waitingForUser) {\n const userReply = await tui.text({ message: 'Your answer', placeholder: 'Type your answer...' });\n if (tui.isCancel(userReply)) { keepGoing = false; return; }\n FileLogger.log('USER_INPUT', 'User response to specification agent', { userReply });\n nextPrompt = `${executionResults}\\n\\nUser Reply: ${userReply}`;\n } else if (executionResults) {\n const content = fs.existsSync(targetPath) ? fs.readFileSync(targetPath, 'utf-8') : '';\n let systemMsg = \"Execução da ferramenta concluída.\";\n if (specUpdated) {\n if (content.includes('[TO BE')) {\n const pendingMatches = [...content.matchAll(/## ([^\\n]+)[\\s\\S]*?\\[TO BE/g)].map(m => m[1]);\n let missing = pendingMatches.length > 0 ? pendingMatches.join(', ') : 'várias seções';\n systemMsg += `\\n[System]: Seção atualizada com sucesso. A validação detectou que AINDA HÁ placeholders pendentes ('[TO BE...]') nas seguintes seções: ${missing}.\\nPor favor, envie uma nova action \\`modify_file\\` focada em uma destas seções obrigatoriamente. USE o respectivo placeholder no campo \\`target_content\\` para que o replace funcione.`;\n } else {\n systemMsg += \"\\n[System]: O arquivo parece completo! Se estiver satisfeito e possuir TODAS as implementações descritas, retorne 'SPEC_UPDATED: Complete'.\";\n }\n } else {\n // Adicionando um aviso de que falhou e precisa tentar de novo\n systemMsg += \"\\n[System]: A modificação do arquivo falhou. Verifique se o \\`target_content\\` que você usou existe EXATAMENTE como no arquivo e se ele é ÚNICO na hora de usar a action \\`modify_file\\`.\";\n }\n nextPrompt = `${executionResults}\\n\\n${systemMsg}`;\n } else {\n if (lastResponse.message) {\n tui.log.info(colors.primary('🤖 Architect (Message only):'));\n console.log(lastResponse.message);\n const userReply = await tui.text({ message: 'Your answer:' });\n if (tui.isCancel(userReply)) { keepGoing = false; break; }\n FileLogger.log('USER_INPUT', 'User response to specification agent (Message only)', { userReply });\n nextPrompt = userReply as string;\n } else {\n keepGoing = false;\n }\n }\n\n } else {\n tui.log.warning('No actions received.');\n keepGoing = false;\n }\n\n } catch (error: any) {\n spinner.stop('Error');\n tui.log.error(error.message);\n keepGoing = false;\n }\n }\n}\n\n// --- API Wrapper Matches Scan/Dev Agent Pattern ---\nasync function callSpecAgentApi(prompt: string, onChunk: (chunk: string) => void, agentId?: string): Promise<AgentResponse> {\n const conversationId = await conversationManager.getConversationId(AGENT_TYPE);\n\n FileLogger.log('AGENT', 'Calling Agent API', { agentId, conversationId });\n\n const provider = ProviderResolver.getProvider('specification_agent');\n if (agentId && 'agentId' in provider) {\n (provider as any).agentId = agentId;\n }\n\n const parsed = await provider.streamChat(prompt, {\n conversationId,\n agentType: 'specification_agent',\n onChunk\n });\n\n if (parsed.conversation_id) {\n await conversationManager.saveConversationId(AGENT_TYPE, parsed.conversation_id);\n }\n\n return parsed;\n}\n","import { Command } from 'commander';\nimport { AGENT_RESPONSE_JSON_SCHEMA } from '../core/api/prompts.js';\n\nexport const exportSchemaCommand = new Command('export-schema')\n .description('Outputs the agent response JSON Schema')\n .action(() => {\n console.log(JSON.stringify(AGENT_RESPONSE_JSON_SCHEMA, null, 2));\n });\n\n","import { Command } from 'commander';\nimport { UNIFIED_SYSTEM_PROMPT } from '../core/api/prompts.js';\n\nexport const exportPromptCommand = new Command('export-prompt')\n .description('Outputs the unified agent system prompt')\n .action(() => {\n console.log(UNIFIED_SYSTEM_PROMPT);\n });\n","import { Command } from 'commander';\nimport { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport os from 'node:os';\nimport fs from 'node:fs/promises';\n\nexport interface SuperCommandOptions {\n local?: boolean;\n}\n\nexport const superCommandAction = async (options: SuperCommandOptions = {}) => {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const packageRoot = path.resolve(__dirname, '../../');\n const internalSkillsPath = path.join(packageRoot, 'skills');\n\n const targetPath = options.local \n ? path.join(process.cwd(), '.agents', 'skills')\n : path.join(os.homedir(), '.shark', 'skills');\n\n try {\n try {\n await fs.rm(targetPath, { recursive: true, force: true });\n } catch {\n // Ignore if it doesn't exist\n }\n await fs.mkdir(targetPath, { recursive: true });\n await fs.cp(internalSkillsPath, targetPath, { recursive: true, force: true });\n console.log(`🚀 Superpowers skills installed successfully to ${targetPath}`);\n } catch (error: any) {\n console.error(`❌ Failed to install superpowers skills: ${error.message}`);\n process.exit(1);\n }\n};\n\nexport const superCommand = new Command('super')\n .description('Install Superpowers skills globally or locally')\n .option('-l, --local', 'Install skills locally in the current project under .agents/skills')\n .action(superCommandAction);\n"],"mappings":"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","names":["Command","fs","path","path","fs","Command","z","z","systemMsg","fs","path","fs","path","fs","path","fs","path","path","path","fs","path","fs","tui","path","fs","tui","resolve","fs","path","os","crypto","fs","path","fileURLToPath","path","fs","crypto","__filename","fileURLToPath","__dirname","state","resolve","resolve","resolve","path","fs","nextMsg","Command","Command","fs","path","interactiveDeveloperAgent","path","fs","fs","path","status","fs","path","AGENT_TYPE","path","fs","AGENT_TYPE","Command","interactiveDeveloperAgent","Command","Command","Command","Command","Command","fileURLToPath","path","os","fs","__filename","__dirname","Command"]}
1
+ {"version":3,"sources":["../../src/core/error/crash-handler.ts","../../src/bin/shark.ts","../../src/commands/init.ts","../../src/core/workflow/workflow-manager.ts","../../src/core/workflow/shark-workflow.schema.ts","../../src/commands/dev.ts","../../src/core/agents/agent-response-parser.ts","../../src/core/api/stackspot-client.ts","../../src/core/api/sse-client.ts","../../src/core/auth/get-active-realm.ts","../../src/core/api/prompts.ts","../../src/core/api/stackspot-provider.ts","../../src/core/workflow/history-manager.ts","../../src/core/api/openai-compatible-provider.ts","../../src/core/api/provider-resolver.ts","../../src/core/workflow/conversation-manager.ts","../../src/core/workflow/anchor-state-manager.ts","../../src/core/agents/developer-agent.ts","../../src/core/agents/agent-tools.ts","../../src/core/ast-editing/editors/code-editor-factory.ts","../../src/core/ast-editing/editors/typescript-editor.ts","../../src/core/workflow/skill-manager.ts","../../src/core/workflow/subagent-manager.ts","../../src/core/workflow/message-queue.ts","../../src/commands/legacy.ts","../../src/core/agents/legacy-developer-agent.ts","../../src/core/workflow/task-manager.ts","../../src/core/agents/specification-agent.ts","../../src/commands/export-schema.ts","../../src/commands/export-prompt.ts","../../src/commands/super.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { colors } from '../../ui/colors.js';\n\nexport class CrashHandler {\n private static instance: CrashHandler;\n private readonly logDir: string;\n\n private constructor() {\n this.logDir = path.join(os.homedir(), '.shark', 'logs');\n }\n\n public static getInstance(): CrashHandler {\n if (!CrashHandler.instance) {\n CrashHandler.instance = new CrashHandler();\n }\n return CrashHandler.instance;\n }\n\n public init(): void {\n process.on('uncaughtException', (error) => this.handleError(error, 'Uncaught Exception'));\n process.on('unhandledRejection', (reason) => this.handleError(reason, 'Unhandled Rejection'));\n }\n\n private handleError(error: any, type: string): void {\n // Prevent infinite loops if logging fails\n try {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const logFile = path.join(this.logDir, `crash-${timestamp}.log`);\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n const stackTrace = error instanceof Error ? error.stack : 'No stack trace available';\n\n const logContent = `\n[${new Date().toISOString()}] ${type}\n--------------------------------------------------\nMessage: ${errorMessage}\nStack:\n${stackTrace}\n--------------------------------------------------\nSystem: ${os.platform()} ${os.release()} ${os.arch()}\nNode: ${process.version}\n`;\n\n // Ensure directory exists sync (we are crashing, async might not finish)\n if (!fs.existsSync(this.logDir)) {\n fs.mkdirSync(this.logDir, { recursive: true });\n }\n\n fs.writeFileSync(logFile, logContent, 'utf-8');\n\n console.error('\\n');\n console.error(colors.error('💥 Whoops! Shark CLI crashed unexpectedly.'));\n console.error(colors.dim(` Details have been saved to: ${logFile}`));\n console.error(colors.dim(' Please report this issue so we can fix it.'));\n console.error(colors.error(` Error: ${errorMessage}`));\n console.error('\\n');\n\n } catch (filesysError) {\n console.error('Fatal Error: Failed to write crash log.', filesysError);\n console.error('Original Error:', error);\n } finally {\n process.exit(1);\n }\n }\n}\n\nexport const crashHandler = CrashHandler.getInstance();\n","import { crashHandler } from '../core/error/crash-handler.js';\n\n// Initialize Global Crash Handler\ncrashHandler.init();\n\nimport { Command } from 'commander';\nimport { loginCommand } from '../commands/login.js';\nimport { configCommand } from '../commands/config.js';\nimport { initCommand } from '../commands/init.js';\nimport { colors } from '../ui/colors.js';\nimport { devCommand } from '../commands/dev.js';\nimport { legacyCommand } from '../commands/legacy.js';\nimport { exportSchemaCommand } from '../commands/export-schema.js';\nimport { exportPromptCommand } from '../commands/export-prompt.js';\nimport { superCommand } from '../commands/super.js';\n\nconst program = new Command();\n\nprogram\n .name('shark')\n .description('Shark CLI: AI-Native Collaborative Development Tool')\n .version('0.0.1');\n\nprogram.addCommand(loginCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(devCommand);\nprogram.addCommand(legacyCommand);\nprogram.addCommand(exportSchemaCommand);\nprogram.addCommand(exportPromptCommand);\nprogram.addCommand(superCommand);\n\nprogram\n .command('config')\n .description('Manage global configuration')\n .action(configCommand.action);\n\n// Global Error Handler for the CLI\nprocess.on('unhandledRejection', (err) => {\n console.error(colors.error('❌ Unhandled Error:'), err);\n process.exit(1);\n});\n\nprogram.parse(process.argv);\n","import { Command } from 'commander';\nimport { tui } from '../ui/tui.js';\nimport { workflowManager } from '../core/workflow/workflow-manager.js';\nimport { TechStackEnum } from '../core/workflow/shark-workflow.schema.js';\nimport { randomUUID } from 'crypto';\nimport { colors } from '../ui/colors.js';\n\nexport const initAction = async () => {\n tui.intro('Shark Project Initialization');\n\n // 1. Check if workflow already exists\n const existingState = await workflowManager.load();\n if (existingState) {\n // Smart Resume Context Card\n tui.log.info(colors.dim('----------------------------------------'));\n tui.log.info(`🦈 ${colors.primary('Welcome back to Shark CLI!')}`);\n tui.log.message(` Project: ${colors.white(existingState.projectName)}`);\n tui.log.message(` Stage: ${colors.secondary(existingState.currentStage)}`);\n tui.log.message(` Updated: ${colors.dim(new Date(existingState.lastUpdated).toLocaleString())}`);\n tui.log.info(colors.dim('----------------------------------------'));\n\n const action = await tui.select({\n message: 'An existing project was detected. What would you like to do?',\n options: [\n { value: 'resume', label: '🚀 Resume Work' },\n { value: 'overwrite', label: '⚠️ Overwrite (Start Fresh)' },\n { value: 'exit', label: '❌ Exit' }\n ]\n });\n\n if (tui.isCancel(action) || action === 'exit') {\n tui.outro('See you later! 👋');\n return;\n }\n\n if (action === 'resume') {\n tui.log.success(`Resuming work on ${colors.primary(existingState.projectName)}...`);\n // Future: Route to specific agent based on stage\n tui.outro(`To continue, run: \"shark agent\" (Context loaded)`);\n return;\n }\n\n // If overwrite, we just proceed to step 2...\n }\n\n // 2. Prompt for Project Name\n const projectName = await tui.text({\n message: 'What is the name of your project?',\n placeholder: 'e.g. My Awesome App',\n validate: (value) => {\n if (!value) return 'Project name is required';\n if (value.trim().length < 2) return 'Project name must be at least 2 characters';\n }\n });\n\n if (tui.isCancel(projectName)) {\n tui.outro('Initialization cancelled.');\n return;\n }\n\n // 3. Prompt for Tech Stack\n const techStackOptions = TechStackEnum.options.map(stack => ({\n value: stack,\n label: stack === 'node-ts' ? 'Node.js (TypeScript)' :\n stack === 'nextjs' ? 'Next.js' :\n stack.charAt(0).toUpperCase() + stack.slice(1)\n }));\n\n const techStack = await tui.select({\n message: 'Select your technology stack:',\n options: techStackOptions\n });\n\n if (tui.isCancel(techStack)) {\n tui.outro('Initialization cancelled.');\n return;\n }\n\n // 4. Create and Save State\n const spinner = tui.spinner();\n spinner.start('Initializing project workflow...');\n\n try {\n const newState = {\n projectId: randomUUID(),\n projectName: projectName as string,\n techStack: techStack as any,\n currentStage: 'business_analysis' as const,\n stageStatus: 'pending' as const,\n lastUpdated: new Date().toISOString(),\n artifacts: [],\n metadata: {\n initializedBy: 'shark-cli',\n version: '0.0.1'\n }\n };\n\n await workflowManager.save(newState);\n spinner.stop('Project workflow created!');\n\n tui.log.success(`Project ${colors.primary(projectName as string)} initialized successfully.`);\n tui.log.message(`Your Project ID: ${colors.dim(newState.projectId)}`);\n tui.outro('Ready to start! Run \"shark agent\" to begin analyzing requirements.'); // Placeholder hint\n } catch (error: any) {\n spinner.stop('Initialization failed.', 1);\n tui.log.error(error.message);\n process.exit(1);\n }\n};\n\nexport const initCommand = new Command('init')\n .description('Initialize a new Shark project')\n .action(initAction);\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { WorkflowSchema, type WorkflowState } from './shark-workflow.schema.js';\nimport { colors } from '../../ui/colors.js';\n\nexport class WorkflowManager {\n private static instance: WorkflowManager;\n private readonly filename = 'shark-workflow.json';\n private readonly tmpFilename = '.shark-workflow.tmp';\n\n private constructor() { }\n\n public static getInstance(): WorkflowManager {\n if (!WorkflowManager.instance) {\n WorkflowManager.instance = new WorkflowManager();\n }\n return WorkflowManager.instance;\n }\n\n private getFilePath(): string {\n return path.join(process.cwd(), this.filename);\n }\n\n private getTmpFilePath(): string {\n return path.join(process.cwd(), this.tmpFilename);\n }\n\n public async save(state: WorkflowState): Promise<void> {\n // 1. Validate State\n const parsed = WorkflowSchema.safeParse(state);\n if (!parsed.success) {\n throw new Error(`Invalid workflow state: ${parsed.error.message}`);\n }\n\n const filePath = this.getFilePath();\n const tmpPath = this.getTmpFilePath();\n const data = JSON.stringify(parsed.data, null, 2);\n\n try {\n // 2. Write to TMP\n await fs.writeFile(tmpPath, data, 'utf-8');\n\n // 3. Rename TMP to Final (Atomic)\n await fs.rename(tmpPath, filePath);\n } catch (error: any) {\n throw new Error(`Failed to save workflow state atomically: ${error.message}`);\n }\n }\n\n public async load(): Promise<WorkflowState | null> {\n const filePath = this.getFilePath();\n\n try {\n // Check if file exists\n try {\n await fs.access(filePath);\n } catch {\n return null; // File doesn't exist, generic start\n }\n\n const content = await fs.readFile(filePath, 'utf-8');\n const json = JSON.parse(content);\n\n const parsed = WorkflowSchema.safeParse(json);\n if (parsed.success) {\n return parsed.data;\n } else {\n console.warn(colors.warning(`⚠️ Corrupted workflow file detected: ${parsed.error.message}`));\n return null;\n }\n\n } catch (error: any) {\n console.warn(colors.warning(`⚠️ Failed to load workflow state: ${error.message}`));\n return null;\n }\n }\n\n // Helper to get current state or default if none exists\n public async getOrInitState(): Promise<WorkflowState | null> {\n return await this.load();\n }\n}\n\nexport const workflowManager = WorkflowManager.getInstance();\n","import { z } from 'zod';\n\nexport enum ProjectParams {\n PROJECT_ID = 'projectId',\n PROJECT_NAME = 'projectName',\n TECH_STACK = 'techStack',\n}\n\nexport const TechStackEnum = z.enum([\n 'react',\n 'nextjs',\n 'angular',\n 'vue',\n 'node-ts',\n 'python',\n 'dotnet',\n 'java',\n 'unknown'\n]);\n\nexport type TechStack = z.infer<typeof TechStackEnum>;\n\nexport const WorkflowStageEnum = z.enum([\n 'business_analysis',\n 'specification',\n 'architecture',\n 'development',\n 'verification',\n 'deployment'\n]);\n\nexport type WorkflowStage = z.infer<typeof WorkflowStageEnum>;\n\nexport const StageStatusEnum = z.enum([\n 'pending',\n 'in_progress',\n 'completed',\n 'failed',\n 'skipped'\n]);\n\nexport type StageStatus = z.infer<typeof StageStatusEnum>;\n\nexport const WorkflowSchema = z.object({\n projectId: z.string().uuid(),\n projectName: z.string().min(1),\n techStack: TechStackEnum.default('unknown'),\n currentStage: WorkflowStageEnum.default('business_analysis'),\n stageStatus: StageStatusEnum.default('pending'),\n lastUpdated: z.string().datetime(), // ISO 8601\n conversationId: z.string().optional(),\n conversations: z.record(z.string(), z.string()).optional(), // agentType -> conversationId\n artifacts: z.array(z.string()).default([]),\n // Extensible metadata bag\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport type WorkflowState = z.infer<typeof WorkflowSchema>;\n","import { Command } from 'commander';\nimport { interactiveDeveloperAgent } from '../core/agents/developer-agent.js';\nimport { AGENT_RESPONSE_JSON_SCHEMA } from '../core/api/prompts.js';\n\nexport const devCommand = new Command('dev')\n .description('Starts the Shark Developer Agent (Shark Dev Orchestration V2)')\n .option('-t, --task <type>', 'Initial task description (Quick Mode)')\n .option('-c, --context <path>', 'Path to custom context file')\n .option('-y, --yes', 'Automatically approve all actions without prompting')\n .option('--auto', 'Automatically approve all actions without prompting')\n .option('--export-schema', 'Export the agent response JSON schema')\n .option('--taskId <id>', 'ID of the current subagent task')\n .action(async (options) => {\n if (options.exportSchema) {\n console.log(JSON.stringify(AGENT_RESPONSE_JSON_SCHEMA, null, 2));\n return;\n }\n\n try {\n const result = await interactiveDeveloperAgent({\n taskInstruction: options.task,\n context: options.context,\n auto: options.yes || options.auto,\n taskId: options.taskId\n });\n if (!result.success) {\n console.error('Task execution failed:', result.summary);\n process.exit(1);\n }\n } catch (error: any) {\n console.error('Error during development agent execution:', error.message);\n process.exit(1);\n }\n });\n\n","import { z } from 'zod';\nimport { FileLogger } from '../debug/file-logger.js';\n\n// Action Schema\nexport const AgentActionSchema = z.object({\n type: z.enum([\n 'create_file', 'modify_file', 'list_files', 'search_file', 'search_code', 'read_file', 'delete_file',\n 'list_structure', 'modify_ast', 'search_ast', 'run_command',\n 'talk_with_user', 'use_mcp_tool',\n 'activate_skill', 'define_subagent', 'invoke_subagent', 'send_message', 'manage_subagents',\n 'complete_task',\n 'wait',\n 'notify_user',\n 'ast_list_structure',\n 'ast_get_method',\n 'ast_add_method', 'ast_modify_method', 'ast_remove_method',\n 'ast_add_class',\n 'ast_get_property', 'ast_add_property', 'ast_modify_property', 'ast_remove_property',\n 'ast_add_decorator',\n 'ast_add_interface', 'ast_add_type_alias',\n 'ast_add_function', 'ast_remove_function',\n 'ast_add_import', 'ast_remove_import', 'ast_organize_imports'\n ]),\n path: z.string().nullable().optional(), // Nullable for strict mode combatibility\n content: z.string().nullable().optional(),\n line_range: z.array(z.number()).nullable().optional(),\n target_content: z.string().nullable().optional(),\n command: z.string().nullable().optional(),\n tool_name: z.string().nullable().optional(),\n tool_args: z.string().nullable().optional(), // JSON string argument\n\n // search_code fields\n query: z.string().nullable().optional(),\n is_regex: z.boolean().nullable().optional(),\n\n // AST-Grep fields\n pattern: z.string().nullable().optional(),\n fix: z.string().nullable().optional(),\n language: z.string().nullable().optional(),\n file_path: z.string().nullable().optional(), // Alias for path in ast-grep actions\n\n // New AST Tool Specific Fields\n class_name: z.string().nullable().optional(),\n method_name: z.string().nullable().optional(),\n method_code: z.string().nullable().optional(),\n property_name: z.string().nullable().optional(),\n property_code: z.string().nullable().optional(),\n extends_class: z.string().nullable().optional(),\n implements_interfaces: z.array(z.string()).nullable().optional(),\n decorator_code: z.string().nullable().optional(),\n interface_code: z.string().nullable().optional(),\n type_code: z.string().nullable().optional(),\n function_name: z.string().nullable().optional(),\n function_code: z.string().nullable().optional(),\n import_statement: z.string().nullable().optional(),\n module_path: z.string().nullable().optional(),\n new_body: z.string().nullable().optional(),\n\n // Preview confirmation\n confirmed: z.boolean().nullable().optional(),\n start_anchor: z.string().nullable().optional(),\n end_anchor: z.string().nullable().optional(),\n\n // Superpowers fields\n skill_name: z.string().nullable().optional(),\n duration_seconds: z.number().nullable().optional(),\n Subagents: z.array(z.object({\n TypeName: z.string(),\n Role: z.string(),\n Prompt: z.string()\n })).nullable().optional(),\n Recipient: z.string().nullable().optional(),\n Message: z.string().nullable().optional(),\n Action: z.enum(['list', 'kill', 'kill_all']).nullable().optional(),\n ConversationIds: z.array(z.string()).nullable().optional(),\n\n // define_subagent fields\n name: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n system_prompt: z.string().nullable().optional(),\n enable_write_tools: z.boolean().nullable().optional(),\n enable_subagent_tools: z.boolean().nullable().optional(),\n enable_mcp_tools: z.boolean().nullable().optional(),\n});\n\nexport type AgentAction = z.infer<typeof AgentActionSchema>;\n\n// Command Schema (for future use)\nexport const AgentCommandSchema = z.object({\n command: z.string(),\n description: z.string(),\n critical: z.boolean(),\n});\n\n// Full Structured Response Schema\nexport const AgentResponseSchema = z.object({\n action: AgentActionSchema.nullable().optional(),\n actions: z.array(AgentActionSchema).default([]), // Maintain backward compatibility\n commands: z.array(AgentCommandSchema).optional(), // Maintain backward compatibility\n summary: z.string().optional(),\n\n // Legacy fields handling for smooth transition/fallback\n message: z.string().optional(),\n conversation_id: z.string().optional(),\n});\n\nexport type AgentResponse = z.infer<typeof AgentResponseSchema>;\n\n/**\n * Parses raw agent response expecting a JSON string that matches our schema.\n */\nexport function parseAgentResponse(rawResponse: unknown): AgentResponse {\n FileLogger.log('PARSER', 'Parsing Agent Response', { rawType: typeof rawResponse });\n\n let parsedObj: any = {};\n let conversation_id: string | undefined;\n\n // 1. Handle string input (accumulated SSE or raw JSON string)\n if (typeof rawResponse === 'string') {\n FileLogger.log('PARSER', 'Type String', { length: rawResponse.length });\n try {\n parsedObj = extractFirstJson(rawResponse);\n } catch (e) {\n FileLogger.log('PARSER', 'String Parse Failed', { error: (e as Error).message });\n const errMsg = (e as Error).message;\n const cleanRaw = rawResponse.trim();\n \n if (cleanRaw === '') {\n const systemMsg = `[SYSTEM ERROR]: O modelo retornou uma resposta vazia. Por favor, tente novamente e forneça uma ação JSON válida.`;\n return {\n action: {\n type: 'talk_with_user',\n content: systemMsg,\n path: ''\n },\n actions: [{\n type: 'talk_with_user',\n content: systemMsg,\n path: ''\n }],\n message: systemMsg\n };\n }\n\n const looksLikeJson = cleanRaw.startsWith('{') || cleanRaw.startsWith('[');\n \n if (!looksLikeJson) {\n // Fallback: treat as simple message if not valid JSON and not trying to be JSON\n return {\n action: {\n type: 'talk_with_user',\n content: rawResponse,\n path: ''\n },\n actions: [{\n type: 'talk_with_user',\n content: rawResponse,\n path: ''\n }],\n message: rawResponse\n };\n }\n\n const isTruncated = errMsg.includes('Unterminated string') || errMsg.includes('Unexpected end of JSON input');\n const charCount = rawResponse.length;\n const safeLimit = Math.floor(charCount * 0.9);\n const systemMsg = isTruncated\n ? `[SYSTEM ERROR]: Sua resposta anterior foi cortada/truncada antes do final devido ao limite máximo de tokens de saída (output token limit) após atingir ${charCount} caracteres. O JSON ficou incompleto: ${errMsg}. Por favor, envie uma nova resposta com formato JSON completo e válido (não tente apenas completar o JSON anterior). Continue o trabalho lógico da tarefa de forma mais curta ou incremental (ex: criando apenas o esqueleto/estrutura básica ou escrevendo uma parte menor do arquivo de cada vez). Garanta que o tamanho total desta nova resposta JSON seja menor que ${safeLimit} caracteres para evitar novos cortes.`\n : `[SYSTEM ERROR]: Falha ao parsear o JSON de resposta: ${errMsg}.`;\n return {\n action: {\n type: 'talk_with_user',\n content: systemMsg,\n path: ''\n },\n actions: [{\n type: 'talk_with_user',\n content: systemMsg,\n path: ''\n }],\n message: systemMsg\n };\n }\n }\n // 2. Handle object input (direct API response)\n else if (typeof rawResponse === 'object' && rawResponse !== null) {\n const anyResp = rawResponse as any;\n conversation_id = anyResp.conversation_id;\n\n FileLogger.log('PARSER', 'Type Object', {\n hasContent: !!anyResp.content,\n hasMessage: !!anyResp.message,\n messageType: typeof anyResp.message\n });\n\n // Sometimes content is nested in 'content' or 'message'\n const stringContent = anyResp.content || anyResp.message;\n if (stringContent && typeof stringContent === 'string') {\n try {\n // Try to parse it as JSON actions/action\n const parsedInside = extractFirstJson(stringContent);\n // Only use it if it looks like an object (not just a primitive)\n if (typeof parsedInside === 'object' && parsedInside !== null) {\n parsedObj = parsedInside;\n FileLogger.log('PARSER', 'Inner JSON Parsed', { keys: Object.keys(parsedObj) });\n } else {\n // It was a string literal or number, treat as text\n parsedObj = rawResponse;\n FileLogger.log('PARSER', 'Inner JSON was primitive');\n }\n } catch (e) {\n FileLogger.log('PARSER', 'Inner JSON Parse Error', { error: (e as Error).message });\n const errMsg = (e as Error).message;\n const cleanContent = stringContent.trim();\n const looksLikeJson = cleanContent.startsWith('{') || cleanContent.startsWith('[');\n \n if (looksLikeJson) {\n const isTruncated = errMsg.includes('Unterminated string') || errMsg.includes('Unexpected end of JSON input');\n const charCount = stringContent.length;\n const safeLimit = Math.floor(charCount * 0.9);\n const systemMsg = isTruncated\n ? `[SYSTEM ERROR]: Sua resposta anterior foi cortada/truncada antes do final devido ao limite máximo de tokens de saída (output token limit) após atingir ${charCount} caracteres. O JSON ficou incompleto: ${errMsg}. Por favor, envie uma nova resposta com formato JSON completo e válido (não tente apenas completar o JSON anterior). Continue o trabalho lógico da tarefa de forma mais curta ou incremental (ex: criando apenas o esqueleto/estrutura básica ou escrevendo uma parte menor do arquivo de cada vez). Garanta que o tamanho total desta nova resposta JSON seja menor que ${safeLimit} caracteres para evitar novos cortes.`\n : `[SYSTEM ERROR]: Falha ao parsear o JSON de resposta: ${errMsg}.`;\n parsedObj = {\n action: {\n type: 'talk_with_user',\n content: systemMsg,\n path: ''\n },\n actions: [{\n type: 'talk_with_user',\n content: systemMsg,\n path: ''\n }],\n summary: 'Parsing failed due to truncated JSON response'\n };\n } else {\n parsedObj = rawResponse;\n }\n }\n } else {\n parsedObj = rawResponse;\n }\n\n // If we didn't successfully parse inner JSON actions/action, use the raw object\n if (!parsedObj.actions && !parsedObj.action) {\n parsedObj = rawResponse;\n }\n }\n\n // 3. Normalize Actions/Action\n let normalizedAction: any = parsedObj.action;\n let normalizedActions: any[] = parsedObj.actions;\n\n // Handle root-level action objects directly (fallback for less strict models)\n if (!normalizedAction && (!normalizedActions || normalizedActions.length === 0) && parsedObj && typeof parsedObj === 'object' && typeof parsedObj.type === 'string') {\n const validTypes = [\n 'create_file', 'modify_file', 'list_files', 'search_file', 'search_code', 'read_file', 'delete_file',\n 'talk_with_user', 'use_mcp_tool', 'list_structure', 'modify_ast', 'search_ast', 'run_command',\n 'activate_skill', 'define_subagent', 'invoke_subagent', 'send_message', 'manage_subagents',\n 'complete_task', 'wait', 'notify_user'\n ];\n if (validTypes.includes(parsedObj.type)) {\n normalizedAction = parsedObj;\n normalizedActions = [parsedObj];\n }\n }\n\n if (!normalizedAction && normalizedActions && normalizedActions.length > 0) {\n normalizedAction = normalizedActions[0];\n } else if (normalizedAction && (!normalizedActions || normalizedActions.length === 0)) {\n normalizedActions = [normalizedAction];\n }\n\n if (!normalizedAction && !normalizedActions) {\n FileLogger.log('PARSER', 'No Action/Actions Found - Constructing Default');\n const content = parsedObj.message || (typeof parsedObj === 'object' ? JSON.stringify(parsedObj) : String(parsedObj));\n normalizedAction = {\n type: 'talk_with_user',\n content,\n path: ''\n };\n normalizedActions = [normalizedAction];\n }\n\n // 4. Validate against Schema\n // We construct the final object to match our schema structure\n let normalizedCommands: any[] = [];\n if (Array.isArray(parsedObj.commands)) {\n normalizedCommands = parsedObj.commands.map((cmd: any) => {\n if (typeof cmd === 'string') {\n return {\n command: cmd,\n description: `Execute ${cmd}`,\n critical: false\n };\n }\n if (cmd && typeof cmd === 'object') {\n return {\n command: cmd.command || '',\n description: cmd.description || `Execute ${cmd.command || ''}`,\n critical: cmd.critical === true\n };\n }\n return null;\n }).filter(Boolean);\n }\n\n const result = {\n action: normalizedAction,\n actions: normalizedActions,\n commands: normalizedCommands,\n summary: parsedObj.summary || '',\n conversation_id,\n message: parsedObj.summary || 'Agent Action' // Backward compatibility\n };\n\n FileLogger.log('PARSER', 'Final Result Constructed', { hasAction: !!result.action });\n\n try {\n return AgentResponseSchema.parse(result);\n } catch (e) {\n FileLogger.log('PARSER', 'Schema Validation Failed', { error: (e as Error).message });\n throw e;\n }\n}\n\nexport function extractFirstJson(str: string): any {\n try {\n return JSON.parse(str);\n } catch (e) {\n // If simple parse fails, try to find the first balanced object\n const firstOpen = str.indexOf('{');\n if (firstOpen === -1) throw e;\n\n let balance = 0;\n let inString = false;\n let escape = false;\n\n for (let i = firstOpen; i < str.length; i++) {\n const char = str[i];\n\n if (escape) {\n escape = false;\n continue;\n }\n\n if (char === '\\\\') {\n escape = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (!inString) {\n if (char === '{') balance++;\n else if (char === '}') {\n balance--;\n if (balance === 0) {\n // Found the end of the first object\n const potentialJson = str.substring(firstOpen, i + 1);\n try {\n return JSON.parse(potentialJson);\n } catch (innerE) {\n // If this chunk failed, maybe our brace counting was off (e.g. comments?), throw original\n throw e;\n }\n }\n }\n }\n }\n throw e;\n }\n}\n","import { tokenStorage } from '../auth/token-storage.js';\nimport { authenticate } from '../auth/stackspot-auth.js';\nimport { colors } from '../../ui/colors.js';\n\nexport class AuthError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'AuthError';\n }\n}\n\ninterface RequestOptions extends RequestInit {\n params?: Record<string, string>;\n}\n\n// API Base URLs\nexport const STACKSPOT_API_BASE = 'https://api.stackspot.com';\nexport const STACKSPOT_AGENT_API_BASE = 'https://genai-inference-app.stackspot.com';\n\n// Shared Token Validation & Refresh Logic\nexport async function ensureValidToken(realm: string): Promise<string> {\n let creds = await tokenStorage.getCredentials(realm);\n\n if (!creds?.accessToken) {\n throw new AuthError(`Authentication required for realm '${realm}'.\\nPlease run 'shark login' to authenticate.`);\n }\n\n // Auto-Refresh Logic\n const now = Math.floor(Date.now() / 1000);\n const buffer = 300; // 5 minutes buffer\n\n // If we have credentials and expiry time, check if we need to refresh\n if (creds.expiresAt && creds.clientId && creds.clientKey) {\n if (now > creds.expiresAt - buffer) {\n try {\n // console.log(colors.dim('🔄 Refreshing expired token...'));\n // We keep it silent or use a global logger if available\n\n const newTokens = await authenticate(realm, creds.clientId, creds.clientKey);\n\n await tokenStorage.saveToken(\n realm,\n newTokens.access_token,\n creds.clientId,\n creds.clientKey,\n newTokens.expires_in\n );\n\n return newTokens.access_token;\n\n } catch (error) {\n console.warn(colors.warning(`⚠️ Failed to auto-refresh token: ${(error as Error).message}`));\n // Fallback to existing token\n }\n }\n }\n\n return creds.accessToken;\n}\n\nexport class StackSpotClient {\n private readonly MAX_RETRIES = 3;\n private readonly RETRY_DELAYS = [1000, 2000, 4000]; // 1s, 2s, 4s\n private debugMode = false;\n\n constructor(private realm: string) { }\n\n public enableDebug(): void {\n this.debugMode = true;\n }\n\n private async getHeaders(): Promise<Headers> {\n const token = await ensureValidToken(this.realm);\n const headers = new Headers();\n headers.set('Authorization', `Bearer ${token}`);\n headers.set('Content-Type', 'application/json');\n return headers;\n }\n\n private shouldRetry(error: any, attempt: number): boolean {\n if (attempt >= this.MAX_RETRIES) return false;\n\n // Retry on network errors\n if (error.name === 'TypeError' || error.message?.includes('fetch')) return true;\n\n // Retry on 5xx server errors\n if (error.status && error.status >= 500) return true;\n\n return false;\n }\n\n private async sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n private async request<T>(url: string, options: RequestOptions = {}): Promise<T> {\n let lastError: any;\n\n for (let attempt = 0; attempt <= this.MAX_RETRIES; attempt++) {\n try {\n if (this.debugMode && attempt > 0) {\n console.log(`[StackSpotClient] Retry attempt ${attempt}/${this.MAX_RETRIES} for ${url}`);\n }\n\n const headers = await this.getHeaders();\n\n // Merge custom headers\n if (options.headers) {\n new Headers(options.headers).forEach((value, key) => headers.set(key, value));\n }\n\n // Add Query Params\n let finalUrl = url;\n if (options.params) {\n const query = new URLSearchParams(options.params).toString();\n finalUrl += `?${query}`;\n }\n\n if (this.debugMode) {\n console.log(`[StackSpotClient] ${options.method || 'GET'} ${finalUrl}`);\n }\n\n const response = await fetch(finalUrl, {\n ...options,\n headers,\n });\n\n if (response.status === 401) {\n throw new AuthError(\"Session expired or invalid credentials. Please run 'shark login' again.\");\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n const error: any = new Error(`API Request failed: ${response.status} ${response.statusText} - ${errorText}`);\n error.status = response.status;\n throw error;\n }\n\n // Return null for 204 No Content\n if (response.status === 204) {\n return null as T;\n }\n\n return (await response.json()) as T;\n\n } catch (error: any) {\n lastError = error;\n\n // Don't retry auth errors\n if (error instanceof AuthError) {\n throw error;\n }\n\n if (this.shouldRetry(error, attempt)) {\n const delay = this.RETRY_DELAYS[attempt] || this.RETRY_DELAYS[this.RETRY_DELAYS.length - 1];\n if (this.debugMode) {\n console.log(`[StackSpotClient] Retrying in ${delay}ms...`);\n }\n await this.sleep(delay);\n continue;\n }\n\n // No more retries\n throw error;\n }\n }\n\n throw lastError;\n }\n\n async get<T>(url: string, options?: RequestOptions): Promise<T> {\n return this.request<T>(url, { ...options, method: 'GET' });\n }\n\n async post<T>(url: string, body: any, options?: RequestOptions): Promise<T> {\n return this.request<T>(url, {\n ...options,\n method: 'POST',\n body: JSON.stringify(body)\n });\n }\n\n async put<T>(url: string, body: any, options?: RequestOptions): Promise<T> {\n return this.request<T>(url, {\n ...options,\n method: 'PUT',\n body: JSON.stringify(body)\n });\n }\n\n async delete<T>(url: string, options?: RequestOptions): Promise<T> {\n return this.request<T>(url, { ...options, method: 'DELETE' });\n }\n}\n\nexport function createAuthenticatedClient(realm: string): StackSpotClient {\n return new StackSpotClient(realm);\n}\n","import { FileLogger } from '../debug/file-logger.js';\n\nexport interface SSECallbacks {\n onChunk?: (partialMessage: string) => void;\n onComplete?: (fullMessage: string, metadata?: any) => void;\n onError?: (error: Error) => void;\n}\n\nexport class SSEClient {\n /**\n * Streams agent response using Server-Sent Events.\n * \n * @param url - The SSE endpoint URL\n * @param requestPayload - The request payload to POST\n * @param headers - Request headers (including Authorization)\n * @param callbacks - Event callbacks for chunks, completion, and errors\n */\n async streamAgentResponse(\n url: string,\n requestPayload: unknown,\n headers: HeadersInit,\n callbacks: SSECallbacks = {}\n ): Promise<void> {\n const { onChunk, onComplete, onError } = callbacks;\n\n FileLogger.log('SSE', `Starting Request to ${url}`, {\n headers,\n payload: requestPayload\n });\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestPayload),\n });\n\n FileLogger.log('SSE', `Response Status: ${response.status} ${response.statusText}`);\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => { responseHeaders[key] = value; });\n FileLogger.log('SSE', 'Response Headers', responseHeaders);\n\n if (!response.ok) {\n const errorText = await response.text();\n FileLogger.log('SSE', 'Response Error Body', errorText);\n throw new Error(`SSE request failed: ${response.status} ${response.statusText} - ${errorText}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const contentType = response.headers.get('content-type') || '';\n const isJson = contentType.includes('application/json');\n\n if (isJson) {\n // Handle non-streaming JSON response properly\n const jsonBody = await response.json();\n FileLogger.log('SSE', 'Received Non-Streaming JSON Response', { length: JSON.stringify(jsonBody).length });\n\n // Try to extract message content depending on structure\n let content = '';\n if (typeof jsonBody === 'string') content = jsonBody;\n else if (jsonBody.message) content = jsonBody.message;\n else if (jsonBody.choices?.[0]?.message?.content) content = jsonBody.choices[0].message.content; // OpenAI style just in case\n else content = JSON.stringify(jsonBody); // Fallback to raw JSON\n\n // Trigger callbacks as if it streamed in one chunk\n if (onChunk) onChunk(content);\n if (onComplete) onComplete(content, jsonBody);\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let fullMessage = '';\n let metadata: any = {};\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n // Decode chunk\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n buffer = lines.pop() || ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n const data = line.slice(5).trim(); // Remove 'data:' prefix\n\n if (data === '[DONE]') {\n FileLogger.log('SSE', 'Stream Complete [DONE]', { fullMessage, metadata });\n // End of stream\n if (onComplete) {\n onComplete(fullMessage, metadata);\n }\n return;\n }\n\n try {\n const parsed = JSON.parse(data);\n const chunk = parsed.message || parsed.content || data;\n fullMessage += chunk;\n\n // Capture latest metadata (e.g. conversation_id)\n if (parsed.conversation_id) {\n metadata.conversation_id = parsed.conversation_id;\n }\n\n if (onChunk) {\n onChunk(chunk);\n }\n } catch (parseError) {\n // Not JSON, treat as plain text\n fullMessage += data;\n if (onChunk) {\n onChunk(data);\n }\n }\n }\n }\n }\n\n FileLogger.log('SSE', 'Stream Ended Naturally', { fullMessage, metadata });\n\n // Stream ended without [DONE]\n if (onComplete) {\n onComplete(fullMessage, metadata);\n }\n\n } catch (error) {\n FileLogger.log('SSE', 'Stream Error', error);\n if (onError) {\n onError(error instanceof Error ? error : new Error(String(error)));\n } else {\n throw error;\n }\n }\n }\n}\n\nexport const sseClient = new SSEClient();\n","import { ConfigManager } from '../config-manager.js';\n\n/**\n * Gets the currently active (logged-in) realm from config.\n * \n * @returns The active realm\n * @throws Error if no realm is active (user not logged in)\n */\nexport async function getActiveRealm(): Promise<string> {\n const configManager = ConfigManager.getInstance();\n const config = configManager.getConfig();\n const realm = config.activeRealm;\n\n if (!realm) {\n throw new Error(\n 'No active authentication found.\\n' +\n 'Please run \"shark login\" first to authenticate.'\n );\n }\n\n return realm;\n}\n","export const UNIFIED_SYSTEM_PROMPT = `Você é o Shark Dev, um agente de inteligência artificial de desenvolvimento colaborativo no Shark AI.\nSeu objetivo é ajudar o usuário a analisar, especificar e implementar código de forma estruturada.\n\nℹ️ SISTEMA DE ÂNCORAS PARA LEITURA/EDIÇÃO DE ARQUIVOS (Anchor System):\n- Quando você lê um arquivo usando a ação 'read_file', cada linha do arquivo será retornada no formato: \\`palavra_âncora§conteúdo_da_linha\\`.\n- Exemplo: \\`apple§const x = 10;\\`\n- Ao modificar um arquivo usando a ação 'modify_file', você DEVE especificar:\n - \\`start_anchor\\`: A palavra âncora (ex: \\`apple\\`) que marca o início do bloco a ser substituído.\n - \\`end_anchor\\`: A palavra âncora (ex: \\`apple\\`) que marca o fim do bloco a ser substituído (inclusive).\n - \\`content\\`: O novo conteúdo que substituirá todo o bloco entre (e incluindo) as duas âncoras.\n - Importante: Use APENAS a palavra âncora no campo \\`start_anchor\\` e \\`end_anchor\\` (por exemplo: \\`apple\\`), e NÃO a linha inteira ou o separador \\`§\\`.\n\n⚠️ REGRA GERAL PARA ARQUIVOS GRANDES (Evitar JSON truncado):\n- Evite criar ou modificar arquivos grandes (como planos, documentações ou códigos extensos) de uma única vez.\n- Limite de Saída Rígido: A API possui um limite máximo de tokens de saída. Para sua segurança, garanta que o conteúdo de cada resposta JSON sua tenha no máximo 15.000 caracteres (cerca de 4.000 tokens). NUNCA gere respostas únicas maiores do que isso.\n- Se a tarefa exigir criar ou modificar arquivos longos, siga estritamente esta lógica:\n 1. Use 'create_file' para criar apenas a estrutura básica ou esqueleto do arquivo (cabeçalhos e seções vazias).\n 2. Nas rodadas subsequentes, use 'modify_file' com o sistema de âncoras para preencher/atualizar o conteúdo de forma incremental e em pedaços menores (no máximo 50 a 100 linhas por vez).\n- Isso evita que a sua resposta JSON seja cortada no meio devido ao limite máximo de tokens de saída da API.\n\n🚨 REGRAS CRÍTICAS DE RESPOSTA (JSON):\n- Você DEVE responder APENAS com um objeto JSON válido.\n- Não inclua nenhuma introdução, explicação ou bloco de markdown fora do JSON.\n- Se precisar falar com o usuário e aguardar uma resposta dele, use a action com type 'talk_with_user'.\n- Se você quiser apenas enviar uma mensagem informativa ou relatório detalhado para o usuário sem bloquear ou parar a execução para receber resposta, use a action 'notify_user'.\n\n\nSUA SAÍDA DEVE SEGUIR EXATAMENTE ESTE FORMATO JSON:\n{\n \"action\": {\n \"type\": \"create_file\" | \"modify_file\" | \"read_file\" | \"list_files\" | \"search_file\" | \"search_code\" | \"delete_file\" | \"run_command\" | \"talk_with_user\" | \"use_mcp_tool\" | \"activate_skill\" | \"define_subagent\" | \"invoke_subagent\" | \"send_message\" | \"manage_subagents\" | \"complete_task\" | \"wait\" | \"notify_user\",\n \"path\": \"caminho/relativo/do/arquivo (opcional)\",\n \"content\": \"conteúdo do arquivo ou mensagem para o usuário (opcional)\",\n \"start_anchor\": \"âncora de início de substituição (modify_file apenas)\",\n \"end_anchor\": \"âncora de fim de substituição (modify_file apenas)\",\n \"command\": \"comando bash a ser executado (run_command apenas)\",\n \"query\": \"termo de busca (search_code apenas)\",\n \"tool_name\": \"nome da ferramenta MCP (use_mcp_tool apenas)\",\n \"tool_args\": \"argumentos em string JSON para MCP (use_mcp_tool apenas)\",\n \"skill_name\": \"nome da habilidade a ativar (activate_skill apenas)\",\n \"duration_seconds\": \"tempo máximo em segundos para aguardar atualizações (opcional, wait apenas)\",\n \"Subagents\": [\n {\n \"TypeName\": \"tipo do subagente\",\n \"Role\": \"papel do subagente\",\n \"Prompt\": \"instruções de tarefa para o subagente\"\n }\n ] (invoke_subagent apenas),\n \"Recipient\": \"ID da conversa de destino da mensagem (send_message apenas)\",\n \"Message\": \"conteúdo da mensagem a ser enviada (send_message apenas)\",\n \"Action\": \"list\" | \"kill\" | \"kill_all\" (manage_subagents apenas),\n \"ConversationIds\": [\"lista de IDs de conversa para cancelar\"] (manage_subagents apenas, opcional),\n \"name\": \"nome do subagente (define_subagent apenas)\",\n \"description\": \"descrição do subagente (define_subagent apenas)\",\n \"system_prompt\": \"prompt de sistema customizado (define_subagent apenas)\",\n \"enable_write_tools\": true | false (define_subagent apenas, opcional),\n \"enable_subagent_tools\": true | false (define_subagent apenas, opcional),\n \"enable_mcp_tools\": true | false (define_subagent apenas, opcional)\n },\n \"summary\": \"Resumo de 1 frase do que você realizou nesta rodada.\"\n}`;\n\nexport const AGENT_RESPONSE_JSON_SCHEMA = {\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": \"AgentResponse\",\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"create_file\",\n \"modify_file\",\n \"read_file\",\n \"list_files\",\n \"search_file\",\n \"search_code\",\n \"delete_file\",\n \"run_command\",\n \"talk_with_user\",\n \"use_mcp_tool\",\n \"activate_skill\",\n \"define_subagent\",\n \"invoke_subagent\",\n \"send_message\",\n \"manage_subagents\",\n \"complete_task\",\n \"wait\",\n \"notify_user\"\n ]\n },\n \"path\": { \"type\": [\"string\", \"null\"] },\n \"content\": { \"type\": [\"string\", \"null\"] },\n \"start_anchor\": { \"type\": [\"string\", \"null\"] },\n \"end_anchor\": { \"type\": [\"string\", \"null\"] },\n \"command\": { \"type\": [\"string\", \"null\"] },\n \"query\": { \"type\": [\"string\", \"null\"] },\n \"tool_name\": { \"type\": [\"string\", \"null\"] },\n \"tool_args\": { \"type\": [\"string\", \"null\"] },\n \"skill_name\": { \"type\": [\"string\", \"null\"] },\n \"duration_seconds\": {\n \"type\": [\"integer\", \"null\"],\n \"description\": \"Tempo maximo em segundos para aguardar atualizacoes.\"\n },\n \"Subagents\": {\n \"type\": [\"array\", \"null\"],\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"TypeName\": { \"type\": \"string\" },\n \"Role\": { \"type\": \"string\" },\n \"Prompt\": { \"type\": \"string\" }\n },\n \"required\": [\"TypeName\", \"Role\", \"Prompt\"]\n }\n },\n \"Recipient\": { \"type\": [\"string\", \"null\"] },\n \"Message\": { \"type\": [\"string\", \"null\"] },\n \"Action\": { \"type\": [\"string\", \"null\"], \"enum\": [\"list\", \"kill\", \"kill_all\"] },\n \"ConversationIds\": {\n \"type\": [\"array\", \"null\"],\n \"items\": { \"type\": \"string\" }\n },\n \"name\": { \"type\": [\"string\", \"null\"] },\n \"description\": { \"type\": [\"string\", \"null\"] },\n \"system_prompt\": { \"type\": [\"string\", \"null\"] },\n \"enable_write_tools\": { \"type\": [\"boolean\", \"null\"] },\n \"enable_subagent_tools\": { \"type\": [\"boolean\", \"null\"] },\n \"enable_mcp_tools\": { \"type\": [\"boolean\", \"null\"] }\n },\n \"required\": [\"type\"]\n },\n \"summary\": { \"type\": \"string\" }\n },\n \"required\": [\"action\"]\n};\n\n","import { AIProvider, ChatOptions } from './provider.interface.js';\nimport { AgentResponse, parseAgentResponse } from '../agents/agent-response-parser.js';\nimport { STACKSPOT_AGENT_API_BASE, ensureValidToken } from './stackspot-client.js';\nimport { sseClient } from './sse-client.js';\nimport { tokenStorage } from '../auth/token-storage.js';\nimport { getActiveRealm } from '../auth/get-active-realm.js';\nimport { ConfigManager } from '../config-manager.js';\nimport { UNIFIED_SYSTEM_PROMPT } from './prompts.js';\nimport { FileLogger } from '../debug/file-logger.js';\n\nexport class StackSpotProvider implements AIProvider {\n public agentId?: string;\n\n constructor(private agentType: string) {\n const config = ConfigManager.getInstance().getConfig();\n this.agentId = config.stackspot?.agentId;\n }\n\n private getAgentId(): string {\n const config = ConfigManager.getInstance().getConfig();\n const configKeyMapping: Record<string, 'dev' | 'ba' | 'spec' | 'qa' | 'scan' | 'codeReview'> = {\n 'developer_agent': 'dev',\n 'business_analyst': 'ba',\n 'specification_agent': 'spec',\n 'qa_agent': 'qa',\n 'scan_agent': 'scan',\n 'code_review': 'codeReview'\n };\n const mappedKey = configKeyMapping[this.agentType];\n if (mappedKey && config.agents?.[mappedKey]) {\n return config.agents[mappedKey]!;\n }\n\n const envIdMapping: Record<string, string | undefined> = {\n 'business_analyst': process.env.STACKSPOT_BA_AGENT_ID,\n 'developer_agent': process.env.STACKSPOT_DEV_AGENT_ID,\n 'qa_agent': process.env.STACKSPOT_QA_AGENT_ID,\n 'specification_agent': process.env.STACKSPOT_SPEC_AGENT_ID,\n 'scan_agent': process.env.STACKSPOT_SCAN_AGENT_ID,\n 'code_review': process.env.STACKSPOT_CODE_REVIEW_AGENT_ID\n };\n\n const envResolved = envIdMapping[this.agentType];\n if (envResolved) {\n return envResolved;\n }\n\n if (this.agentId && this.agentId !== '01KEQCGJ65YENRA4QBXVN1YFFX') {\n return this.agentId;\n }\n\n const defaultIdMapping: Record<string, string> = {\n 'business_analyst': '01KEJ95G304TNNAKGH5XNEEBVD',\n 'developer_agent': '01KEQCGJ65YENRA4QBXVN1YFFX',\n 'qa_agent': '01KEQFJZ3Q3JER11NH22HEZX9X',\n 'specification_agent': '01KEPXTX37FTB4N672TZST4SGP',\n 'scan_agent': '01KEQ9AHWB550J2244YBH3QATN',\n 'code_review': ''\n };\n\n const resolved = defaultIdMapping[this.agentType];\n if (this.agentType === 'code_review') {\n if (!resolved) {\n throw new Error(\"Agent ID for 'code_review' is not configured.\");\n }\n return resolved;\n }\n\n return resolved || '01KEQCGJ65YENRA4QBXVN1YFFX';\n }\n\n private getAgentVersion(): string | undefined {\n const config = ConfigManager.getInstance().getConfig();\n const versionMapping: Record<string, string | undefined> = {\n 'business_analyst': config.agentVersions?.ba || process.env.STACKSPOT_BA_AGENT_VERSION,\n 'developer_agent': config.agentVersions?.dev || process.env.STACKSPOT_DEV_AGENT_VERSION,\n 'qa_agent': config.agentVersions?.qa || process.env.STACKSPOT_QA_AGENT_VERSION,\n 'specification_agent': config.agentVersions?.spec || process.env.STACKSPOT_SPEC_AGENT_VERSION,\n 'scan_agent': config.agentVersions?.scan || process.env.STACKSPOT_SCAN_AGENT_VERSION,\n 'code_review': config.agentVersions?.codeReview || process.env.STACKSPOT_CODE_REVIEW_AGENT_VERSION\n };\n return versionMapping[this.agentType];\n }\n\n async streamChat(prompt: string, options: ChatOptions): Promise<AgentResponse> {\n const realm = await getActiveRealm();\n let token: string | null = null;\n try {\n token = await ensureValidToken(realm);\n } catch (error) {\n token = await tokenStorage.getToken(realm);\n }\n\n if (!token) {\n throw new Error(`No authentication token found for realm '${realm}'. Please run 'shark login'.`);\n }\n\n const isFirstTurn = !options.conversationId;\n const finalPrompt = isFirstTurn\n ? `SYSTEM INSTRUCTIONS:\\n${UNIFIED_SYSTEM_PROMPT}\\n\\nUSER REQUEST:\\n${prompt}`\n : prompt;\n\n const requestPayload: any = {\n user_prompt: finalPrompt,\n streaming: true,\n stackspot_knowledge: false,\n return_ks_in_response: true,\n deep_search_ks: false,\n use_conversation: true,\n conversation_id: options.conversationId,\n };\n\n const agentVersion = this.getAgentVersion();\n if (agentVersion) {\n requestPayload.agent_version_number = agentVersion;\n }\n\n const effectiveAgentId = this.getAgentId();\n const agentUrl = `${STACKSPOT_AGENT_API_BASE}/v1/agent/${effectiveAgentId}/chat`;\n\n const headers = {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n };\n\n const sanitizedHeaders = { ...headers };\n if (sanitizedHeaders['Authorization']) {\n sanitizedHeaders['Authorization'] = 'Bearer ***';\n }\n FileLogger.log('PROVIDER_REQUEST', 'Request payload sent to StackSpot API', {\n agentId: effectiveAgentId,\n url: agentUrl,\n headers: sanitizedHeaders,\n payload: requestPayload\n });\n\n let fullMessage = '';\n let rawResponse: any = {};\n\n await sseClient.streamAgentResponse(\n agentUrl,\n requestPayload,\n headers,\n {\n onChunk: (chunk) => {\n fullMessage += chunk;\n if (options.onChunk) {\n options.onChunk(chunk);\n }\n },\n onComplete: async (message, metadata) => {\n rawResponse = {\n message: message || fullMessage,\n conversation_id: metadata?.conversation_id || options.conversationId,\n };\n },\n onError: (error) => {\n throw error;\n },\n }\n );\n\n FileLogger.log('PROVIDER_RESPONSE', 'Raw response from StackSpot API', { rawResponse });\n const parsedResponse = parseAgentResponse(rawResponse);\n if (options.onComplete) {\n options.onComplete(parsedResponse);\n }\n return parsedResponse;\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface ChatMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\nexport class HistoryManager {\n private static getHistoryDir(): string {\n const dir = path.resolve(process.cwd(), '_sharkrc', 'history');\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n return dir;\n }\n\n private static getFilePath(conversationId: string): string {\n return path.resolve(this.getHistoryDir(), `${conversationId}.json`);\n }\n\n static async getHistory(conversationId: string): Promise<ChatMessage[]> {\n const filePath = this.getFilePath(conversationId);\n if (!fs.existsSync(filePath)) {\n return [];\n }\n try {\n const raw = fs.readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as ChatMessage[]) : [];\n } catch {\n return [];\n }\n }\n\n static async saveHistory(conversationId: string, messages: ChatMessage[]): Promise<void> {\n const filePath = this.getFilePath(conversationId);\n fs.writeFileSync(filePath, JSON.stringify(messages, null, 2), 'utf-8');\n }\n\n static async appendMessage(conversationId: string, message: ChatMessage): Promise<void> {\n const history = await this.getHistory(conversationId);\n history.push(message);\n await this.saveHistory(conversationId, history);\n }\n}\n","import { AIProvider, ChatOptions } from './provider.interface.js';\nimport { AgentResponse, parseAgentResponse } from '../agents/agent-response-parser.js';\nimport { HistoryManager, ChatMessage } from '../workflow/history-manager.js';\nimport { UNIFIED_SYSTEM_PROMPT } from './prompts.js';\nimport crypto from 'node:crypto';\nimport { FileLogger } from '../debug/file-logger.js';\n\ninterface OpenAIConfig {\n baseURL: string;\n apiKey: string;\n model: string;\n useStructuredOutputs: boolean;\n}\n\nexport class OpenAICompatibleProvider implements AIProvider {\n constructor(private options: OpenAIConfig) {}\n\n private getAgentSystemPrompt(agentType: string): string {\n return UNIFIED_SYSTEM_PROMPT;\n }\n\n async streamChat(prompt: string, options: ChatOptions): Promise<AgentResponse> {\n const conversationId = options.conversationId || crypto.randomUUID();\n\n const history = await HistoryManager.getHistory(conversationId);\n if (history.length === 0) {\n history.push({\n role: 'system',\n content: this.getAgentSystemPrompt(options.agentType)\n });\n }\n\n history.push({ role: 'user', content: prompt });\n\n const requestPayload: any = {\n model: this.options.model,\n messages: history,\n stream: true,\n temperature: 0.2\n };\n\n if (this.options.useStructuredOutputs) {\n requestPayload.response_format = {\n type: 'json_schema',\n json_schema: {\n name: 'agent_response',\n strict: true,\n schema: {\n type: 'object',\n properties: {\n action: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: [\n \"create_file\",\n \"modify_file\",\n \"read_file\",\n \"list_files\",\n \"search_file\",\n \"search_code\",\n \"delete_file\",\n \"run_command\",\n \"talk_with_user\",\n \"use_mcp_tool\",\n \"activate_skill\",\n \"define_subagent\",\n \"invoke_subagent\",\n \"send_message\",\n \"manage_subagents\",\n \"complete_task\",\n \"list_structure\",\n \"modify_ast\",\n \"search_ast\",\n \"ast_list_structure\",\n \"ast_get_method\",\n \"ast_add_method\",\n \"ast_modify_method\",\n \"ast_remove_method\",\n \"ast_add_class\",\n \"ast_get_property\",\n \"ast_add_property\",\n \"ast_modify_property\",\n \"ast_remove_property\",\n \"ast_add_decorator\",\n \"ast_add_interface\",\n \"ast_add_type_alias\",\n \"ast_add_function\",\n \"ast_remove_function\",\n \"ast_add_import\",\n \"ast_remove_import\",\n \"ast_organize_imports\"\n ]\n },\n path: { type: ['string', 'null'] },\n content: { type: ['string', 'null'] },\n start_anchor: { type: ['string', 'null'] },\n end_anchor: { type: ['string', 'null'] },\n command: { type: ['string', 'null'] },\n query: { type: ['string', 'null'] },\n tool_name: { type: ['string', 'null'] },\n tool_args: { type: ['string', 'null'] },\n line_range: {\n type: ['array', 'null'],\n items: { type: 'number' }\n },\n target_content: { type: ['string', 'null'] },\n is_regex: { type: ['boolean', 'null'] },\n pattern: { type: ['string', 'null'] },\n fix: { type: ['string', 'null'] },\n language: { type: ['string', 'null'] },\n file_path: { type: ['string', 'null'] },\n class_name: { type: ['string', 'null'] },\n method_name: { type: ['string', 'null'] },\n method_code: { type: ['string', 'null'] },\n property_name: { type: ['string', 'null'] },\n property_code: { type: ['string', 'null'] },\n extends_class: { type: ['string', 'null'] },\n implements_interfaces: {\n type: ['array', 'null'],\n items: { type: 'string' }\n },\n decorator_code: { type: ['string', 'null'] },\n interface_code: { type: ['string', 'null'] },\n type_code: { type: ['string', 'null'] },\n function_name: { type: ['string', 'null'] },\n function_code: { type: ['string', 'null'] },\n import_statement: { type: ['string', 'null'] },\n module_path: { type: ['string', 'null'] },\n new_body: { type: ['string', 'null'] },\n confirmed: { type: ['boolean', 'null'] },\n skill_name: { type: ['string', 'null'] },\n Subagents: {\n type: ['array', 'null'],\n items: {\n type: 'object',\n properties: {\n TypeName: { type: 'string' },\n Role: { type: 'string' },\n Prompt: { type: 'string' }\n },\n required: [\"TypeName\", \"Role\", \"Prompt\"],\n additionalProperties: false\n }\n },\n Recipient: { type: ['string', 'null'] },\n Message: { type: ['string', 'null'] },\n Action: { type: ['string', 'null'] },\n ConversationIds: {\n type: ['array', 'null'],\n items: { type: 'string' }\n },\n name: { type: ['string', 'null'] },\n description: { type: ['string', 'null'] },\n system_prompt: { type: ['string', 'null'] },\n enable_write_tools: { type: ['boolean', 'null'] },\n enable_subagent_tools: { type: ['boolean', 'null'] },\n enable_mcp_tools: { type: ['boolean', 'null'] }\n },\n required: [\n \"type\", \"path\", \"content\", \"start_anchor\", \"end_anchor\", \"command\", \"query\", \"tool_name\", \"tool_args\",\n \"line_range\", \"target_content\", \"is_regex\", \"pattern\", \"fix\", \"language\", \"file_path\",\n \"class_name\", \"method_name\", \"method_code\", \"property_name\", \"property_code\", \"extends_class\", \"implements_interfaces\",\n \"decorator_code\", \"interface_code\", \"type_code\", \"function_name\", \"function_code\", \"import_statement\", \"module_path\", \"new_body\",\n \"confirmed\", \"skill_name\", \"Subagents\", \"Recipient\", \"Message\", \"Action\", \"ConversationIds\",\n \"name\", \"description\", \"system_prompt\", \"enable_write_tools\", \"enable_subagent_tools\", \"enable_mcp_tools\"\n ],\n additionalProperties: false\n },\n summary: { type: 'string' }\n },\n required: [\"action\", \"summary\"],\n additionalProperties: false\n }\n }\n };\n } else {\n requestPayload.response_format = { type: 'json_object' };\n }\n\n const headers: any = {\n 'Content-Type': 'application/json'\n };\n if (this.options.apiKey) {\n headers['Authorization'] = `Bearer ${this.options.apiKey}`;\n }\n\n const sanitizedHeaders = { ...headers };\n if (sanitizedHeaders['Authorization']) {\n sanitizedHeaders['Authorization'] = 'Bearer ***';\n }\n FileLogger.log('PROVIDER_REQUEST', 'Request payload sent to OpenAI Compatible API', {\n baseURL: this.options.baseURL,\n headers: sanitizedHeaders,\n payload: requestPayload\n });\n\n const res = await fetch(`${this.options.baseURL}/chat/completions`, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestPayload)\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n throw new Error(`OpenAI API request failed: ${res.status} ${res.statusText} - ${errBody}`);\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n throw new Error('Response body reader is undefined');\n }\n\n try {\n const decoder = new TextDecoder();\n let fullContent = '';\n let done = false;\n let buffer = '';\n\n while (!done) {\n const { value, done: doneReading } = await reader.read();\n done = doneReading;\n if (value) {\n buffer += decoder.decode(value, { stream: !done });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || ''; // Keep the last incomplete line in the buffer\n\n for (const line of lines) {\n const clean = line.trim();\n if (!clean || clean === 'data: [DONE]') continue;\n if (clean.startsWith('data: ')) {\n let parsed: any;\n try {\n parsed = JSON.parse(clean.substring(6));\n } catch {\n // ignore JSON parse error\n continue;\n }\n if (parsed && parsed.error) {\n throw new Error(`OpenAI Stream Error: ${JSON.stringify(parsed.error)}`);\n }\n const delta = parsed?.choices?.[0]?.delta?.content || '';\n if (delta) {\n fullContent += delta;\n if (options.onChunk) {\n options.onChunk(delta);\n }\n }\n }\n }\n }\n }\n\n // Process any remaining data in buffer\n if (buffer) {\n const clean = buffer.trim();\n if (clean && clean !== 'data: [DONE]' && clean.startsWith('data: ')) {\n let parsed: any;\n try {\n parsed = JSON.parse(clean.substring(6));\n } catch {\n // ignore JSON parse error\n }\n if (parsed && parsed.error) {\n throw new Error(`OpenAI Stream Error: ${JSON.stringify(parsed.error)}`);\n }\n const delta = parsed?.choices?.[0]?.delta?.content || '';\n if (delta) {\n fullContent += delta;\n if (options.onChunk) {\n options.onChunk(delta);\n }\n }\n }\n }\n\n FileLogger.log('PROVIDER_RESPONSE', 'Raw response from OpenAI Compatible API', { fullContent });\n const parsedResponse = parseAgentResponse(fullContent);\n parsedResponse.conversation_id = conversationId;\n\n // Save LLM response to history\n history.push({ role: 'assistant', content: JSON.stringify(parsedResponse) });\n await HistoryManager.saveHistory(conversationId, history);\n\n if (options.onComplete) {\n options.onComplete(parsedResponse);\n }\n\n return parsedResponse;\n } finally {\n if (typeof reader.releaseLock === 'function') {\n reader.releaseLock();\n }\n }\n }\n}\n","import { AIProvider } from './provider.interface.js';\nimport { StackSpotProvider } from './stackspot-provider.js';\nimport { OpenAICompatibleProvider } from './openai-compatible-provider.js';\nimport { ConfigManager } from '../config-manager.js';\n\nexport class ProviderResolver {\n static getProvider(agentType: 'business_analyst' | 'developer_agent' | 'qa_agent' | 'specification_agent' | 'scan_agent' | 'code_review'): AIProvider {\n const config = ConfigManager.getInstance().getConfig() as any;\n \n if (config.provider === 'openai-compatible') {\n const opt = config['openai-compatible'] || {};\n return new OpenAICompatibleProvider({\n baseURL: opt.baseURL || 'http://localhost:11434/v1',\n apiKey: opt.apiKey || 'ollama',\n model: opt.model || 'llama3',\n useStructuredOutputs: opt.useStructuredOutputs ?? true\n });\n }\n \n return new StackSpotProvider(agentType);\n }\n}\n","import { workflowManager } from './workflow-manager.js';\n\n/**\n * Manages conversation IDs for agent interactions.\n * Stores conversation IDs in the workflow state to maintain context across sessions.\n */\nexport class ConversationManager {\n private static instance: ConversationManager;\n\n private constructor() { }\n\n public static getInstance(): ConversationManager {\n if (!ConversationManager.instance) {\n ConversationManager.instance = new ConversationManager();\n }\n return ConversationManager.instance;\n }\n\n /**\n * Saves a conversation ID for a specific agent type.\n * \n * @param agentType - The type of agent (e.g., 'business_analyst', 'architect')\n * @param conversationId - The conversation ID from the agent response\n */\n async saveConversationId(agentType: string, conversationId: string): Promise<void> {\n const state = await workflowManager.load();\n if (!state) {\n throw new Error('No workflow state found. Please run \"shark init\" first.');\n }\n\n // Initialize conversations object if it doesn't exist\n if (!state.conversations) {\n state.conversations = {};\n }\n\n state.conversations[agentType] = conversationId;\n await workflowManager.save(state);\n }\n\n /**\n * Retrieves the conversation ID for a specific agent type.\n * \n * @param agentType - The type of agent\n * @returns The conversation ID, or undefined if none exists\n */\n async getConversationId(agentType: string): Promise<string | undefined> {\n const state = await workflowManager.load();\n if (!state || !state.conversations) {\n return undefined;\n }\n\n return state.conversations[agentType];\n }\n\n /**\n * Clears the conversation ID for a specific agent type.\n * \n * @param agentType - The type of agent\n */\n async clearConversationId(agentType: string): Promise<void> {\n const state = await workflowManager.load();\n if (!state || !state.conversations) {\n return;\n }\n\n delete state.conversations[agentType];\n await workflowManager.save(state);\n }\n\n /**\n * Clears all conversation IDs.\n * Useful when transitioning to a new project or resetting state.\n */\n async clearAllConversations(): Promise<void> {\n const state = await workflowManager.load();\n if (!state) {\n return;\n }\n\n state.conversations = {};\n await workflowManager.save(state);\n }\n}\n\nexport const conversationManager = ConversationManager.getInstance();\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { diffLines } from 'diff';\n\ninterface LineState {\n anchor: string;\n text: string;\n}\n\nexport class AnchorStateManager {\n private cache = new Map<string, LineState[]>();\n private wordPool: string[] = [];\n\n constructor() {\n this.initializeWordPool();\n }\n\n private initializeWordPool() {\n this.wordPool = [\n // group 1\n \"apple\", \"beach\", \"cabin\", \"dust\", \"edge\", \"stone\", \"river\", \"tree\", \"leaf\", \"flower\",\n \"grass\", \"seed\", \"soil\", \"sand\", \"rock\", \"hill\", \"path\", \"road\", \"street\", \"house\",\n \"room\", \"door\", \"window\", \"wall\", \"roof\", \"floor\", \"desk\", \"chair\", \"table\", \"book\",\n \"pen\", \"paper\", \"bag\", \"box\", \"cup\", \"plate\", \"bowl\", \"spoon\", \"fork\", \"knife\",\n \"food\", \"bread\", \"milk\", \"water\", \"tea\", \"fruit\", \"pear\", \"peach\", \"plum\", \"grape\",\n \"melon\", \"berry\", \"nut\", \"bean\", \"corn\", \"rice\", \"oat\", \"wheat\", \"fish\", \"bird\",\n \"cat\", \"dog\", \"cow\", \"sheep\", \"goat\", \"pig\", \"horse\", \"deer\", \"bear\", \"wolf\",\n \"fox\", \"lion\", \"tiger\", \"seal\", \"whale\", \"crab\", \"frog\", \"toad\", \"snake\", \"worm\",\n \"bee\", \"ant\", \"fly\", \"spider\", \"moth\", \"fern\", \"moss\", \"pine\", \"oak\", \"maple\",\n \"birch\", \"willow\", \"ash\", \"elm\", \"palm\", \"rose\", \"lily\", \"daisy\", \"tulip\", \"iris\",\n // group 2\n \"about\", \"above\", \"actor\", \"acute\", \"admit\", \"adopt\", \"adult\", \"after\", \"again\", \"agent\",\n \"agree\", \"ahead\", \"alarm\", \"album\", \"alert\", \"alike\", \"alive\", \"allow\", \"alone\", \"along\",\n \"alter\", \"among\", \"anger\", \"angle\", \"angry\", \"apart\", \"appeal\", \"apron\", \"arena\", \"argue\",\n \"arise\", \"array\", \"arrow\", \"aside\", \"asset\", \"audio\", \"audit\", \"avoid\", \"award\", \"aware\",\n \"awful\", \"back\", \"bacon\", \"badge\", \"baker\", \"ball\", \"band\", \"bank\", \"base\", \"basic\",\n \"basil\", \"basin\", \"basis\", \"bath\", \"baton\", \"bayou\", \"bead\", \"beak\", \"beam\", \"beast\",\n \"beat\", \"beauty\", \"beef\", \"beer\", \"beet\", \"begin\", \"begun\", \"being\", \"belief\", \"bell\",\n \"belly\", \"below\", \"bench\", \"bend\", \"best\", \"bible\", \"bike\", \"bill\", \"bind\", \"bingo\",\n \"birth\", \"bite\", \"black\", \"blade\", \"blame\", \"blank\", \"blast\", \"blaze\", \"bleed\", \"blend\",\n \"blind\", \"blink\", \"block\", \"blond\", \"blood\", \"bloom\", \"blow\", \"blue\", \"blunt\", \"blush\",\n // group 3\n \"board\", \"boast\", \"boat\", \"body\", \"boil\", \"bold\", \"bolt\", \"bomb\", \"bond\", \"bone\",\n \"bonus\", \"boom\", \"boost\", \"boot\", \"booth\", \"border\", \"bore\", \"boss\", \"both\", \"bough\",\n \"bound\", \"boy\", \"brace\", \"brain\", \"brake\", \"branch\", \"brand\", \"brass\", \"brave\", \"break\",\n \"breast\", \"breath\", \"breezy\", \"brick\", \"bride\", \"bridge\", \"brief\", \"bright\", \"brim\", \"bring\",\n \"brisk\", \"broad\", \"broil\", \"broke\", \"bronze\", \"brook\", \"broom\", \"broth\", \"brown\", \"brush\",\n \"bubble\", \"bucket\", \"buckle\", \"bud\", \"budget\", \"buffet\", \"bugle\", \"build\", \"built\", \"bulb\",\n \"bulk\", \"bull\", \"bullet\", \"bump\", \"bunch\", \"bundle\", \"bunk\", \"bunny\", \"burden\", \"bureau\",\n \"burn\", \"burst\", \"bush\", \"busy\", \"butler\", \"butter\", \"button\", \"buyer\", \"buzz\", \"cable\",\n \"cactus\", \"cage\", \"cake\", \"calf\", \"calm\", \"came\", \"camel\", \"camera\", \"camp\", \"canal\",\n \"candle\", \"candy\", \"cane\", \"canoe\", \"canopy\", \"canvas\", \"canyon\", \"cape\", \"capital\", \"captain\",\n // group 4\n \"car\", \"card\", \"care\", \"cargo\", \"carol\", \"carpet\", \"carrot\", \"carry\", \"cart\", \"carve\",\n \"case\", \"cash\", \"cask\", \"cast\", \"castle\", \"catch\", \"cater\", \"cattle\", \"cause\", \"cave\",\n \"caviar\", \"cavity\", \"cedar\", \"celery\", \"cell\", \"cellar\", \"cello\", \"cement\", \"census\", \"center\",\n \"cereal\", \"chain\", \"chalk\", \"chamber\", \"chance\", \"change\", \"channel\", \"chapel\", \"chapter\", \"char\",\n \"charcoal\", \"charge\", \"charm\", \"chart\", \"chase\", \"chasm\", \"cheap\", \"cheat\", \"check\", \"cheek\",\n \"cheer\", \"cheese\", \"chef\", \"cherry\", \"chess\", \"chest\", \"chew\", \"chick\", \"chief\", \"child\",\n \"chili\", \"chill\", \"chime\", \"chin\", \"china\", \"chip\", \"chirp\", \"chisel\", \"choir\", \"choke\",\n \"choose\", \"chop\", \"chord\", \"chore\", \"chorus\", \"chose\", \"chrome\", \"chubby\", \"chuck\", \"chunk\",\n \"church\", \"cider\", \"cigar\", \"cinder\", \"circle\", \"circus\", \"cite\", \"citizen\", \"city\", \"civic\",\n // group 5\n \"civil\", \"clad\", \"claim\", \"clam\", \"clamp\", \"clan\", \"clap\", \"clasp\", \"class\", \"clause\",\n \"claw\", \"clay\", \"clean\", \"clear\", \"cleat\", \"cleft\", \"clerk\", \"clever\", \"click\", \"client\",\n \"cliff\", \"climate\", \"climb\", \"cling\", \"clinic\", \"clip\", \"cloak\", \"clock\", \"clod\", \"clog\",\n \"clone\", \"close\", \"closet\", \"cloth\", \"cloud\", \"clove\", \"clown\", \"club\", \"cluck\", \"clue\",\n \"clump\", \"clumsy\", \"clung\", \"cluster\", \"coach\", \"coal\", \"coast\", \"coat\", \"cobalt\", \"cobra\",\n \"cobweb\", \"cocoa\", \"coconut\", \"cod\", \"code\", \"coffee\", \"coffin\", \"cog\", \"coil\", \"coin\",\n \"coke\", \"cold\", \"collar\", \"collie\", \"colony\", \"color\", \"colt\", \"column\", \"comb\", \"combat\",\n \"come\", \"comedy\", \"comet\", \"comfort\", \"comic\", \"comma\", \"common\", \"compact\", \"company\", \"compare\",\n // group 6\n \"compass\", \"compel\", \"complex\", \"comply\", \"comrade\", \"concise\", \"concrete\", \"condor\", \"cone\", \"confer\",\n \"conga\", \"conic\", \"connect\", \"consul\", \"contest\", \"context\", \"contract\", \"control\", \"convert\", \"convex\",\n \"convey\", \"convoy\", \"cook\", \"cookie\", \"cool\", \"coop\", \"cope\", \"copper\", \"copy\", \"coral\",\n \"cord\", \"core\", \"cork\", \"corner\", \"cornet\", \"corps\", \"cosmic\", \"cost\", \"costume\", \"cottage\",\n \"cotton\", \"couch\", \"cough\", \"could\", \"council\", \"counsel\", \"count\", \"counter\", \"country\", \"county\",\n \"coup\", \"couple\", \"courage\", \"course\", \"court\", \"cousin\", \"cove\", \"cover\", \"covet\", \"coward\",\n \"coyote\", \"crack\", \"cradle\", \"craft\", \"crag\", \"cram\", \"cramp\", \"cranberry\", \"crane\", \"crank\",\n \"crash\", \"crate\", \"crater\", \"cravat\", \"crave\", \"craw\", \"crawl\", \"crayon\", \"craze\", \"crazy\",\n \"creak\", \"cream\", \"create\", \"credit\", \"creed\", \"creek\", \"creep\", \"crepe\", \"cress\", \"crest\",\n // group 7\n \"crew\", \"crib\", \"cricket\", \"cried\", \"crier\", \"crime\", \"crimson\", \"cringe\", \"cripple\", \"crisis\",\n \"crisp\", \"critic\", \"croak\", \"crock\", \"crocus\", \"crony\", \"crook\", \"crop\", \"cross\", \"croup\",\n \"crow\", \"crowd\", \"crown\", \"crude\", \"cruel\", \"crumb\", \"crumple\", \"crush\", \"crust\", \"crutch\",\n \"cry\", \"crypt\", \"crystal\", \"cub\", \"cube\", \"cuckoo\", \"cucumber\", \"cuff\", \"cult\", \"culture\",\n \"cupboard\", \"curb\", \"curd\", \"cure\", \"curfew\", \"curl\", \"currant\", \"current\", \"curry\", \"curse\",\n \"curve\", \"cushion\", \"custard\", \"custom\", \"cut\", \"cute\", \"cutter\", \"cycle\", \"cyclone\", \"cynic\",\n \"cypress\", \"dad\", \"dagger\", \"daily\", \"dairy\", \"dale\", \"dally\", \"dam\", \"damage\", \"dame\",\n \"damp\", \"dance\", \"dandy\", \"danger\", \"dapple\", \"dare\", \"dark\", \"darling\", \"darn\", \"dart\",\n // group 8\n \"dash\", \"date\", \"datum\", \"daub\", \"daughter\", \"dawn\", \"daze\", \"dazzle\", \"deacon\", \"dead\",\n \"deaf\", \"deal\", \"dealer\", \"dean\", \"dear\", \"death\", \"debar\", \"debate\", \"debit\", \"debris\",\n \"debt\", \"decade\", \"decay\", \"decent\", \"decide\", \"deck\", \"declare\", \"decline\", \"decor\", \"decoy\",\n \"decrease\", \"decree\", \"deduct\", \"deed\", \"deep\", \"defeat\", \"defect\", \"defend\", \"defer\",\n \"deficit\", \"defile\", \"define\", \"deform\", \"defray\", \"defy\", \"degree\", \"delay\", \"delegate\", \"delight\",\n \"deliver\", \"dell\", \"delta\", \"deluge\", \"delve\", \"demand\", \"demean\", \"demerit\", \"demise\", \"demo\",\n \"demote\", \"demur\", \"den\", \"denial\", \"denote\", \"denounce\", \"dense\", \"density\", \"dent\", \"dental\",\n \"dentist\", \"deny\", \"depart\", \"depend\", \"depict\", \"deplore\", \"deport\", \"depose\", \"deposit\",\n // group 9\n \"depot\", \"depth\", \"deputy\", \"derby\", \"derive\", \"dervish\", \"descend\", \"descent\", \"describe\", \"desert\",\n \"deserve\", \"design\", \"desire\", \"desolate\", \"despair\", \"despise\", \"despite\", \"despot\", \"dessert\", \"destiny\",\n \"destroy\", \"detach\", \"detail\", \"detain\", \"detect\", \"deter\", \"detest\", \"detour\", \"deuce\", \"develop\",\n \"deviate\", \"device\", \"devil\", \"devise\", \"devoid\", \"devote\", \"devour\", \"devout\", \"dew\", \"diagram\",\n \"dial\", \"dialect\", \"dialogue\", \"diameter\", \"diamond\", \"diary\", \"dice\", \"dictate\", \"diction\", \"dictionary\",\n \"did\", \"die\", \"diet\", \"differ\", \"difficult\", \"diffuse\", \"dig\", \"digest\", \"digger\", \"digit\",\n \"dignity\", \"dike\", \"dilute\", \"dim\", \"dime\", \"diminish\", \"dimple\", \"din\", \"dine\", \"diner\",\n \"dinghy\", \"dingle\", \"dinner\", \"dint\", \"dip\", \"diphthong\", \"diploma\", \"dire\", \"direct\", \"director\",\n // group 10\n \"dirge\", \"dirk\", \"dirt\", \"dirty\", \"disable\", \"disarm\", \"disaster\", \"disavow\", \"disband\", \"discard\",\n \"discern\", \"discharge\", \"disciple\", \"discipline\", \"disclose\", \"discomfit\", \"discord\", \"discount\", \"discourse\", \"discover\",\n \"discreet\", \"discrepant\", \"discretion\", \"discuss\", \"disdain\", \"disease\", \"disfavor\", \"disfigure\", \"disgrace\", \"disguise\",\n \"disgust\", \"dish\", \"dishevel\", \"dishonest\", \"dishonor\", \"disinfect\", \"disinherit\", \"disintegrate\", \"dislike\", \"dislocate\",\n \"dislodge\", \"disloyal\", \"dismal\", \"dismantle\", \"dismay\", \"dismember\", \"dismiss\", \"dismount\", \"disobey\", \"disorder\",\n \"disown\", \"disparage\", \"disparate\", \"disparity\", \"dispatch\", \"dispel\", \"dispense\", \"disperse\", \"displace\", \"display\",\n \"displease\", \"dispose\", \"disprove\", \"dispipe\", \"disqualify\", \"disquiet\", \"disregard\", \"disrepute\", \"disrespect\", \"disrobe\",\n \"disrupt\", \"dissatisfy\", \"dissect\", \"dissemble\", \"disseminate\", \"dissent\", \"dissertation\", \"disservice\", \"dissident\", \"dissimilar\",\n \"dissipate\", \"dissolve\", \"dissonant\", \"dissuade\", \"distance\", \"distant\", \"distaste\", \"distemper\", \"distend\", \"distich\",\n \"distill\", \"distinct\", \"distinguish\", \"distort\", \"distract\", \"distrain\", \"distress\", \"distribute\", \"district\", \"distrust\",\n \"disturb\", \"disunion\", \"disuse\", \"ditch\", \"ditty\", \"diurnal\", \"divan\", \"dive\", \"diverge\", \"diverse\",\n \"diversion\", \"diversity\", \"divert\", \"divest\", \"divide\", \"dividend\", \"divine\", \"diviner\", \"divinity\", \"divisible\",\n \"division\", \"divisor\", \"divorce\", \"divulge\", \"dizzy\", \"do\", \"docile\", \"dock\", \"doctor\", \"doctrine\",\n \"document\", \"dodge\", \"doe\", \"doer\", \"dogma\", \"dogmatic\", \"dole\", \"doll\", \"dollar\", \"domain\",\n \"dome\", \"domestic\", \"domicile\", \"dominant\", \"dominate\", \"domineer\", \"dominion\", \"domino\", \"don\", \"donation\",\n \"done\", \"donkey\", \"donor\", \"doom\", \"dormant\", \"dormitory\", \"dormouse\", \"dose\", \"dot\", \"double\",\n \"doublet\", \"doubt\", \"doubtful\", \"dough\", \"doughnut\", \"doughty\", \"dour\", \"douse\", \"dove\", \"dowager\",\n \"dowdy\", \"dower\", \"downcast\", \"downfall\", \"downright\", \"downy\", \"dowry\"\n ];\n }\n\n private allocateAnchor(usedAnchors: Set<string>): string {\n for (const word of this.wordPool) {\n if (!usedAnchors.has(word)) {\n usedAnchors.add(word);\n return word;\n }\n }\n let counter = 1;\n while (true) {\n const word = `anchor_${counter}`;\n if (!usedAnchors.has(word)) {\n usedAnchors.add(word);\n return word;\n }\n counter++;\n }\n }\n\n getAnchoredContent(filePath: string): string {\n const absolutePath = path.resolve(filePath);\n let lineStates = this.cache.get(absolutePath);\n\n if (!lineStates) {\n const content = fs.readFileSync(absolutePath, 'utf8');\n const hasTrailingNewline = content.endsWith('\\n');\n const lines = hasTrailingNewline ? content.slice(0, -1).split('\\n') : content.split('\\n');\n const usedAnchors = new Set<string>();\n\n lineStates = lines.map(line => {\n const anchor = this.allocateAnchor(usedAnchors);\n return { anchor, text: line };\n });\n\n this.cache.set(absolutePath, lineStates);\n }\n\n return lineStates.map(ls => `${ls.anchor}§${ls.text}`).join('\\n');\n }\n\n applyAnchoredEdit(filePath: string, startAnchor: string, endAnchor: string, content: string): void {\n const absolutePath = path.resolve(filePath);\n let lineStates = this.cache.get(absolutePath);\n\n if (!lineStates) {\n this.getAnchoredContent(absolutePath);\n lineStates = this.cache.get(absolutePath)!;\n }\n\n const startIndex = lineStates.findIndex(ls => ls.anchor === startAnchor);\n if (startIndex === -1) {\n throw new Error(`Start anchor \"${startAnchor}\" not found`);\n }\n\n const endIndex = lineStates.findIndex(ls => ls.anchor === endAnchor);\n if (endIndex === -1) {\n throw new Error(`End anchor \"${endAnchor}\" not found`);\n }\n\n if (startIndex > endIndex) {\n throw new Error(`Invalid range: start anchor \"${startAnchor}\" is after end anchor \"${endAnchor}\"`);\n }\n\n const originalContent = fs.readFileSync(absolutePath, 'utf8');\n const hasTrailingNewline = originalContent.endsWith('\\n');\n\n const oldLines = lineStates.map(ls => ls.text);\n const cleanContent = content.endsWith('\\n') ? content.slice(0, -1) : content;\n const newEditLines = cleanContent.split('\\n');\n\n const updatedLines = [\n ...oldLines.slice(0, startIndex),\n ...newEditLines,\n ...oldLines.slice(endIndex + 1)\n ];\n\n const fileContentToWrite = updatedLines.join('\\n') + (hasTrailingNewline ? '\\n' : '');\n fs.writeFileSync(absolutePath, fileContentToWrite, 'utf8');\n\n // Collect all anchors in the file (unchanged prefix, suffix, and the old edit segment) to avoid duplicate allocations\n const usedAnchors = new Set<string>();\n for (let i = 0; i < lineStates.length; i++) {\n usedAnchors.add(lineStates[i].anchor);\n }\n\n // Diff only the edited range\n const oldEditSegment = lineStates.slice(startIndex, endIndex + 1);\n const oldEditLines = oldEditSegment.map(ls => ls.text);\n const diffs = diffLines(oldEditLines.join('\\n'), cleanContent);\n\n const reconciledEditStates: LineState[] = [];\n let oldEditIndex = 0;\n\n for (const change of diffs) {\n const changeLines = change.value.split('\\n');\n if (changeLines.length > 1 && changeLines[changeLines.length - 1] === '') {\n changeLines.pop();\n }\n\n if (change.removed) {\n oldEditIndex += changeLines.length;\n } else if (change.added) {\n for (const line of changeLines) {\n const anchor = this.allocateAnchor(usedAnchors);\n reconciledEditStates.push({ anchor, text: line });\n }\n } else {\n for (let i = 0; i < changeLines.length; i++) {\n const oldLs = oldEditSegment[oldEditIndex];\n if (oldLs) {\n reconciledEditStates.push({ anchor: oldLs.anchor, text: oldLs.text });\n usedAnchors.add(oldLs.anchor);\n } else {\n const anchor = this.allocateAnchor(usedAnchors);\n reconciledEditStates.push({ anchor, text: changeLines[i] });\n }\n oldEditIndex++;\n }\n }\n }\n\n const finalLineStates = [\n ...lineStates.slice(0, startIndex),\n ...reconciledEditStates,\n ...lineStates.slice(endIndex + 1)\n ];\n\n this.cache.set(absolutePath, finalLineStates);\n }\n}\n","import { ProviderResolver } from '../api/provider-resolver.js';\nimport { conversationManager } from '../workflow/conversation-manager.js';\nimport { tui } from '../../ui/tui.js';\nimport { colors } from '../../ui/colors.js';\nimport { AnchorStateManager } from '../workflow/anchor-state-manager.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { handleRunCommand, handleListFiles, handleSearchFile, handleSearchCode } from './agent-tools.js';\nimport { skillManager } from '../workflow/skill-manager.js';\nimport { subagentManager } from '../workflow/subagent-manager.js';\nimport { FileLogger } from '../debug/file-logger.js';\nimport { MessageQueue, QueueMessage } from '../workflow/message-queue.js';\n\nconst AGENT_TYPE = 'developer_agent';\n\nasync function promptUser(message: string, initialValue?: string, placeholder?: string, prefix: string = ''): Promise<string> {\n let userReply = await tui.text({ message: `${prefix}${message}`, initialValue, placeholder });\n \n while (userReply === '/skills') {\n const availableSkills = await skillManager.listAvailableSkills();\n const options = availableSkills.map(name => ({ value: name, label: name }));\n if (options.length === 0) {\n tui.log.warning('Nenhuma skill encontrada. Execute `shark super` para instalar as skills.');\n } else {\n const selectedSkill = await tui.select({\n message: 'Selecione a Skill do Superpowers para ativar:',\n options\n });\n if (!tui.isCancel(selectedSkill)) {\n await skillManager.activateSkill(selectedSkill as string);\n tui.log.success(`✔ Skill '${selectedSkill}' ativada com sucesso!`);\n }\n }\n userReply = await tui.text({ \n message: `${prefix}${message}`, \n initialValue, \n placeholder: 'digite a instrução da tarefa...' \n });\n }\n \n return userReply as string;\n}\n\nexport async function waitForInputOrNotification(\n queue: MessageQueue,\n promptMessage: string = 'Your answer:',\n subagentPrefix: string = '',\n timeoutMs?: number,\n isAuto: boolean = false\n): Promise<QueueMessage> {\n let cancelled = false;\n let resolvePromptPromise: ((value: QueueMessage) => void) | null = null;\n let timerId: any = null;\n\n const promises: Promise<QueueMessage>[] = [];\n\n if (!isAuto) {\n const promptPromise = new Promise<QueueMessage>((resolve) => {\n resolvePromptPromise = resolve;\n });\n\n const runPrompt = async () => {\n try {\n const userReply = await promptUser(promptMessage, undefined, undefined, subagentPrefix);\n if (!cancelled && resolvePromptPromise) {\n resolvePromptPromise({\n type: 'user',\n content: userReply,\n timestamp: Date.now()\n });\n }\n } catch (e) {}\n };\n runPrompt();\n promises.push(promptPromise);\n }\n\n const queuePromise = queue.next();\n promises.push(queuePromise);\n\n if (timeoutMs !== undefined && timeoutMs !== null) {\n const timeoutPromise = new Promise<QueueMessage>((resolve) => {\n timerId = setTimeout(() => {\n if (resolvePromptPromise) {\n cancelled = true;\n }\n resolve({\n type: 'timeout',\n content: 'Wait timeout expired.',\n timestamp: Date.now()\n });\n }, timeoutMs);\n });\n promises.push(timeoutPromise);\n }\n\n const winner = await Promise.race(promises);\n\n if (timerId) {\n clearTimeout(timerId);\n }\n\n if (winner.type === 'subagent_notification' || winner.type === 'timeout') {\n cancelled = true;\n if (!isAuto) {\n process.stdin.emit('data', '\\r');\n await new Promise(r => setTimeout(r, 50));\n if (process.stdout.isTTY) {\n process.stdout.write('\\x1b[1A\\x1b[2K\\x1b[1A\\x1b[2K');\n }\n }\n }\n\n return winner;\n}\n\n\nfunction formatRoleForUI(role: string): string {\n const limit = 20;\n if (role.length <= limit) return role;\n return role.substring(0, limit - 3) + '...';\n}\n\nexport interface DevelopmentResult {\n success: boolean;\n summary: string;\n}\n\nexport async function interactiveDeveloperAgent(options: {\n taskId?: string,\n taskInstruction?: string,\n context?: string,\n history?: string,\n auto?: boolean\n} = {}): Promise<DevelopmentResult> {\n const isAuto = options.auto === true || process.argv.includes('--auto');\n const isSubagent = !!options.taskId && (options.taskId.startsWith('subagent-') || subagentManager.hasSubagent(options.taskId));\n const projectRoot = process.cwd();\n const messageQueue = new MessageQueue();\n \n let currentTask = options.taskInstruction;\n if (!currentTask) {\n if (isSubagent) {\n currentTask = 'Subagent Task';\n } else {\n const userTask = await promptUser(\n 'O que você gostaria que o Shark Dev fizesse?',\n undefined,\n 'ex: crie uma API REST simples ou digite /skills para ativar diretrizes'\n );\n if (tui.isCancel(userTask) || !userTask) {\n return { success: false, summary: 'Task execution cancelled.' };\n }\n currentTask = userTask;\n }\n }\n\n let subagentPrefix = '';\n if (options.taskId) {\n const subState = subagentManager.getSubagentState(options.taskId);\n if (subState) {\n subagentPrefix = `[Subagent: ${formatRoleForUI(subState.role)}] `;\n }\n }\n\n const log = {\n info: (msg: string) => tui.log.info(`${subagentPrefix}${msg}`),\n warning: (msg: string) => tui.log.warning(`${subagentPrefix}${msg}`),\n error: (msg: string) => tui.log.error(`${subagentPrefix}${msg}`),\n success: (msg: string) => tui.log.success(`${subagentPrefix}${msg}`),\n message: (msg: string) => tui.log.message(`${subagentPrefix}${msg}`),\n };\n\n // Load context if available\n let contextContent = '';\n const defaultContextPath = path.resolve(projectRoot, '_sharkrc', 'project-context.md');\n const specificContextPath = options.context ? path.resolve(projectRoot, options.context) : defaultContextPath;\n\n if (fs.existsSync(specificContextPath)) {\n try {\n contextContent = fs.readFileSync(specificContextPath, 'utf-8');\n } catch (e) {\n log.warning(`Failed to read context file: ${e}`);\n }\n }\n\n // Build Prompt\n let basePrompt = ``;\n if (contextContent) {\n basePrompt += `\\n\\n--- PROJECT CONTEXT ---\\n${contextContent}\\n-----------------------\\n`;\n }\n\n if (options.history) {\n basePrompt += `\\n\\n--- PREVIOUS EXECUTION SUMMARY ---\\n${options.history}\\n----------------------------------\\n`;\n }\n\n basePrompt += `\\n\\n🟢 EXECUTION MODE\\n\nYou are a highly skilled Developer Agent.\n👉 **CURRENT TASK**: \"${currentTask}\"\n\nYour goal is to address the user's request:\n- If the request is a question, a request for explanation, or a discussion, answer the user using the 'talk_with_user' action. You can search the codebase or read files first to answer accurately. Once the explanation/discussion is complete, execute the 'complete_task' action with a brief summary in the 'summary' field and the full explanation in the 'content' field.\n- If the request is to implement changes, debug, or write code:\n 1. Implement the necessary changes.\n 2. Verify (compile/test).\n 3. When you are confident the task is done, execute the 'complete_task' action with a brief technical summary of what you did in the 'summary' field and any additional details in the 'content' field.\n\n- Handling Subagent Notifications:\n - When you receive notifications about subagent progress or completion in your mailbox, do NOT invoke the 'talk_with_user' action just to relay this information to the user if you still have other subagents running, or if you have further steps to execute yourself.\n - Instead, process the subagent's output, update your task progress in the 'summary' field of your next action, and proceed with executing your next planned steps (or use the 'wait' action to continue waiting for other running subagents).\n - Only use 'talk_with_user' if you genuinely require the user's input/decision to proceed, or when the entire task is ready for final discussion.\n`;\n\n let nextPrompt = basePrompt;\n let keepGoing = true;\n let finalSummary = \"\";\n const conversationKey = options.taskId ? `dev_agent_${options.taskId}` : `dev_agent_${Date.now()}`;\n const anchorManager = new AnchorStateManager();\n\n const spinner = tui.spinner();\n\n const handleCleanupSignal = (exitCode: number) => {\n const currentId = options.taskId || 'parent';\n const active = subagentManager.getActiveSubagentsForParent(currentId);\n if (active.length > 0) {\n for (const sub of active) {\n subagentManager.killSubagent(sub.id);\n }\n }\n process.exit(exitCode);\n };\n const sigIntHandler = () => handleCleanupSignal(130);\n const sigTermHandler = () => handleCleanupSignal(143);\n\n process.on('SIGINT', sigIntHandler);\n process.on('SIGTERM', sigTermHandler);\n\n try {\n while (keepGoing) {\n // Check if this subagent has been terminated by parent (only if it is a registered subagent)\n if (options.taskId && subagentManager.hasSubagent(options.taskId) && !subagentManager.isSubagentActive(options.taskId)) {\n log.warning(`Subagent ${options.taskId} was terminated.`);\n return { success: false, summary: 'Subagent terminated by manager.' };\n }\n\n // Retrieve incoming mailbox messages for this subagent or parent\n const recipientId = options.taskId || 'parent';\n const mailboxMessages = subagentManager.retrieveMessages(recipientId);\n let currentTurnPrompt = nextPrompt;\n if (mailboxMessages.length > 0) {\n currentTurnPrompt += `\\n\\n✉️ NEW MAILBOX MESSAGES:\\n${mailboxMessages.map(m => `- ${m}`).join('\\n')}\\n`;\n }\n\n // Inject active subagent status panel\n const myId = options.taskId || 'parent';\n const allSubagents = subagentManager.getActiveSubagentsForParent(myId);\n if (allSubagents.length > 0) {\n let panel = `\\n\\n--- CURRENT ACTIVE SUBAGENTS ---\\n`;\n panel += `You have ${allSubagents.length} active subagent(s) running in the background:\\n`;\n for (const sub of allSubagents) {\n panel += `- ID: ${sub.id} | Role: ${sub.role} | Status: ${sub.status}\\n`;\n }\n panel += `Use the 'wait' action if you have no other work and are waiting for these subagents to complete.\\n`;\n panel += `--------------------------------\\n`;\n currentTurnPrompt += panel;\n }\n\n // Append skill extension to this turn's prompt\n const promptToSend = currentTurnPrompt + skillManager.getSystemInstructionExtension();\n\n try {\n const activeSubagents = subagentManager.getActiveSubagents();\n const activeCount = activeSubagents.length;\n const spinnerText = activeCount > 0\n ? `🦈 Shark Dev working... (Active subagents: ${activeCount})`\n : '🦈 Shark Dev working...';\n spinner.start(spinnerText);\n\n const existingConversationId = await conversationManager.getConversationId(conversationKey);\n const provider = ProviderResolver.getProvider('developer_agent');\n const response = await provider.streamChat(promptToSend, {\n conversationId: existingConversationId,\n agentType: 'developer_agent',\n onChunk: () => {}\n });\n\n if (response.conversation_id) {\n await conversationManager.saveConversationId(conversationKey, response.conversation_id);\n }\n\n spinner.stop('Response received');\n\n if (response.summary) {\n if (options.taskId) {\n subagentManager.updateSubagentSummary(options.taskId, response.summary);\n }\n log.info(`📌 Status: ${response.summary}`);\n }\n\n // Handle completion/failure messages\n if (response.message && response.message.includes('TASK_COMPLETED:')) {\n const mainContent = response.message.split('TASK_COMPLETED:')[0].trim();\n if (mainContent) {\n log.info(colors.primary('🤖 Shark Dev:'));\n console.log(mainContent);\n }\n\n finalSummary = response.message.split('TASK_COMPLETED:')[1].trim();\n log.success(`✔ Task Completed: ${finalSummary}`);\n \n if (options.taskId) {\n subagentManager.updateSubagentSummary(options.taskId, finalSummary);\n if (process.env.SHARK_PARENT_ID) {\n subagentManager.sendMessage(\n process.env.SHARK_PARENT_ID,\n `[Subagent Notification] Subagent ${process.env.SHARK_SUBAGENT_ROLE || 'Subagent'} (${options.taskId}) completed.\\nResult Details:\\n${mainContent || finalSummary}`\n );\n }\n keepGoing = false;\n break;\n }\n\n if (!options.auto || subagentManager.getActiveSubagentsForParent(myId).length > 0) {\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Your answer:', subagentPrefix, undefined, isAuto);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n keepGoing = false;\n break;\n }\n }\n nextPrompt = nextMsg.content;\n continue;\n } else {\n keepGoing = false;\n break;\n }\n }\n\n if (response.message && response.message.includes('TASK_FAILED:')) {\n const mainContent = response.message.split('TASK_FAILED:')[0].trim();\n if (mainContent) {\n log.info(colors.primary('🤖 Shark Dev:'));\n console.log(mainContent);\n }\n\n const failureReason = response.message.split('TASK_FAILED:')[1].trim();\n log.error(`❌ Agent reported task failure: ${failureReason}`);\n \n if (options.taskId) {\n if (process.env.SHARK_PARENT_ID) {\n const parentId = process.env.SHARK_PARENT_ID;\n const role = process.env.SHARK_SUBAGENT_ROLE || 'Subagent';\n subagentManager.sendMessage(\n parentId,\n `[Subagent Notification] Subagent ${role} (${options.taskId}) has finished with status: FAILED. Summary: ${failureReason}`\n );\n }\n return { success: false, summary: failureReason };\n }\n\n if (!options.auto || subagentManager.getActiveSubagentsForParent(myId).length > 0) {\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Your answer:', subagentPrefix, undefined, isAuto);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n return { success: false, summary: failureReason };\n }\n }\n nextPrompt = nextMsg.content;\n continue;\n } else {\n return { success: false, summary: failureReason };\n }\n }\n\n const action = response.action;\n\n if (!action) {\n if (isSubagent) {\n log.warning('No action returned by the subagent. Exiting loop.');\n keepGoing = false;\n break;\n }\n\n if (response.message) {\n log.info(colors.primary('🤖 Shark Dev:'));\n console.log(response.message);\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Your answer:', subagentPrefix, undefined, isAuto);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n keepGoing = false;\n break;\n }\n }\n nextPrompt = nextMsg.content;\n } else {\n log.warning('No action or message returned by the agent.');\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Agent returned empty response. Type a message to continue or press Ctrl+C to cancel:', subagentPrefix, undefined, isAuto);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n keepGoing = false;\n break;\n }\n }\n nextPrompt = nextMsg.content;\n }\n continue;\n }\n\n let resultMsg = \"\";\n\n if (action.type === 'read_file') {\n const filePath = action.path || '';\n log.info(`📖 Reading (Anchored): ${colors.dim(filePath)}`);\n try {\n const content = anchorManager.getAnchoredContent(filePath);\n resultMsg = `[Action read_file(${filePath}) Success]:\\n${content}`;\n } catch (e: any) {\n resultMsg = `[Action read_file(${filePath}) Failed]: ${e.message}`;\n }\n }\n else if (action.type === 'modify_file') {\n const filePath = action.path || '';\n log.warning(`📝 Modify (Anchored): ${colors.bold(filePath)}`);\n\n let approved = isAuto;\n if (!approved) {\n approved = await tui.confirm({ message: `Approve modify_file changes to ${filePath}?` });\n }\n\n if (approved) {\n try {\n anchorManager.applyAnchoredEdit(filePath, action.start_anchor || '', action.end_anchor || '', action.content || '');\n resultMsg = `[Action modify_file(${filePath}) Success]`;\n } catch (e: any) {\n resultMsg = `[Action modify_file(${filePath}) Failed]: ${e.message}`;\n }\n } else {\n resultMsg = `[Action modify_file(${filePath}) User Denied]`;\n }\n }\n else if (action.type === 'create_file') {\n const filePath = action.path || '';\n log.warning(`📝 Create file: ${colors.bold(filePath)}`);\n\n let approved = isAuto;\n if (!approved) {\n approved = await tui.confirm({ message: `Approve create_file changes to ${filePath}?` });\n }\n\n if (approved) {\n try {\n const resolvedPath = path.resolve(projectRoot, filePath);\n const dir = path.dirname(resolvedPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(resolvedPath, action.content || '', 'utf-8');\n resultMsg = `[Action create_file(${filePath}) Success]`;\n } catch (e: any) {\n resultMsg = `[Action create_file(${filePath}) Failed]: ${e.message}`;\n }\n } else {\n resultMsg = `[Action create_file(${filePath}) User Denied]`;\n }\n }\n else if (action.type === 'delete_file') {\n const filePath = action.path || '';\n log.warning(`🗑️ Delete file: ${colors.bold(filePath)}`);\n\n let approved = isAuto;\n if (!approved) {\n approved = await tui.confirm({ message: `Approve delete_file changes to ${filePath}?` });\n }\n\n if (approved) {\n try {\n const resolvedPath = path.resolve(projectRoot, filePath);\n if (fs.existsSync(resolvedPath)) {\n fs.rmSync(resolvedPath, { force: true });\n }\n resultMsg = `[Action delete_file(${filePath}) Success]`;\n } catch (e: any) {\n resultMsg = `[Action delete_file(${filePath}) Failed]: ${e.message}`;\n }\n } else {\n resultMsg = `[Action delete_file(${filePath}) User Denied]`;\n }\n }\n else if (action.type === 'run_command') {\n const cmd = action.command || '';\n log.info(`💻 Executing: ${colors.dim(cmd)}`);\n\n let approved = isAuto;\n if (!approved) {\n approved = await tui.confirm({ message: `Execute run_command: ${cmd}?` });\n }\n\n if (approved) {\n try {\n const output = await handleRunCommand(cmd);\n resultMsg = `[Action run_command(${cmd}) Success]:\\n${output}`;\n } catch (e: any) {\n resultMsg = `[Action run_command(${cmd}) Failed]: ${e.message}`;\n }\n } else {\n resultMsg = `[Action run_command(${cmd}) User Denied]`;\n }\n }\n else if (action.type === 'list_files') {\n const dirPath = action.path || '.';\n log.info(`📂 Scanning: ${colors.dim(dirPath)}`);\n try {\n const result = handleListFiles(dirPath);\n resultMsg = `[Action list_files(${dirPath}) Success]:\\n${result}`;\n } catch (e: any) {\n resultMsg = `[Action list_files(${dirPath}) Failed]: ${e.message}`;\n }\n }\n else if (action.type === 'search_file') {\n const pattern = action.path || '';\n log.info(`🔍 Searching files: ${colors.dim(pattern)}`);\n try {\n const result = handleSearchFile(pattern);\n resultMsg = `[Action search_file(${pattern}) Success]:\\n${result}`;\n } catch (e: any) {\n resultMsg = `[Action search_file(${pattern}) Failed]: ${e.message}`;\n }\n }\n else if (action.type === 'search_code') {\n const glob = action.path || 'src/**/*';\n const query = action.query || '';\n const isRegex = action.is_regex === true;\n log.info(`🔎 Search code: ${colors.dim(`\"${query}\" in ${glob}`)}`);\n try {\n const result = handleSearchCode(glob, query, isRegex);\n resultMsg = `[Action search_code(\"${query}\" in \"${glob}\") Success]:\\n${result}`;\n } catch (e: any) {\n resultMsg = `[Action search_code(\"${query}\" in \"${glob}\") Failed]: ${e.message}`;\n }\n }\n else if (action.type === 'use_mcp_tool') {\n resultMsg = `[Action use_mcp_tool Failed]: MCP tools are not configured/available in this agent.`;\n }\n else if (action.type === 'activate_skill') {\n const name = action.skill_name || '';\n log.info(`⚡ Activating skill: ${colors.bold(name)}`);\n try {\n await skillManager.activateSkill(name);\n resultMsg = `[System]: Skill '${name}' activated successfully.`;\n } catch (e: any) {\n resultMsg = `[System]: Failed to activate skill '${name}': ${e.message}`;\n }\n }\n else if (action.type === 'talk_with_user') {\n const isSystemError = action.content?.startsWith('[SYSTEM ERROR]');\n if (isSystemError) {\n log.error(`⚠️ Detectado erro na resposta do Agente (truncado ou inválido).`);\n log.info(colors.dim(action.content || ''));\n if (isSubagent) {\n resultMsg = action.content || '';\n nextPrompt = resultMsg;\n continue; // Retry loop\n } else {\n let approved = isAuto;\n if (!approved) {\n approved = await tui.confirm({ message: `Enviar notificação de erro para o agente tentar se recuperar automaticamente?` });\n }\n if (approved) {\n resultMsg = action.content || '';\n } else {\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Seu prompt alternativo para o agente:', subagentPrefix, undefined, isAuto);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n keepGoing = false;\n break;\n }\n }\n resultMsg = nextMsg.content;\n }\n }\n } else {\n const contentStr = action.content || '';\n const hasCompleted = contentStr.includes('TASK_COMPLETED:');\n \n if (isSubagent) {\n // Subagents cannot prompt the user. Treat talk_with_user as completion\n const summary = hasCompleted ? contentStr.split('TASK_COMPLETED:')[1].trim() : contentStr;\n subagentManager.updateSubagentSummary(options.taskId!, summary);\n if (process.env.SHARK_PARENT_ID) {\n const mainContent = hasCompleted ? contentStr.split('TASK_COMPLETED:')[0].trim() : contentStr;\n subagentManager.sendMessage(\n process.env.SHARK_PARENT_ID,\n `[Subagent Notification] Subagent ${process.env.SHARK_SUBAGENT_ROLE || 'Subagent'} (${options.taskId}) completed.\\nResult Details:\\n${mainContent}`\n );\n }\n finalSummary = summary;\n keepGoing = false;\n break;\n }\n\n if (hasCompleted) {\n // Print explanation content preceding TASK_COMPLETED\n const mainContent = contentStr.split('TASK_COMPLETED:')[0].trim();\n if (mainContent) {\n log.info(colors.primary('🤖 Shark Dev:'));\n console.log(mainContent);\n }\n\n finalSummary = contentStr.split('TASK_COMPLETED:')[1].trim();\n log.success(`✔ Task Completed: ${finalSummary}`);\n if (!options.auto || subagentManager.getActiveSubagentsForParent(myId).length > 0) {\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Your answer:', subagentPrefix, undefined, isAuto);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n keepGoing = false;\n break;\n }\n }\n nextPrompt = nextMsg.content;\n continue;\n } else {\n keepGoing = false;\n break;\n }\n }\n\n log.info(colors.primary('🤖 Shark Dev:'));\n console.log(contentStr);\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Your answer:', subagentPrefix, undefined, isAuto);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n keepGoing = false;\n break;\n }\n resultMsg = `User Reply: ${nextMsg.content}`;\n } else {\n resultMsg = nextMsg.content;\n }\n }\n }\n else if (action.type === 'define_subagent') {\n const name = action.name || '';\n const desc = action.description || '';\n const sysPrompt = action.system_prompt || '';\n const opts = {\n enableWriteTools: action.enable_write_tools ?? undefined,\n enableSubagentTools: action.enable_subagent_tools ?? undefined,\n enableMcpTools: action.enable_mcp_tools ?? undefined\n };\n log.info(`🛠️ Defining subagent type: ${colors.bold(name)}`);\n subagentManager.defineSubagentType(name, desc, sysPrompt, opts);\n resultMsg = `[Action define_subagent Success]: Defined subagent type '${name}'`;\n }\n else if (action.type === 'invoke_subagent') {\n const subagentsToInvoke = action.Subagents || [];\n log.info(`🚀 Invoking ${subagentsToInvoke.length} subagent(s)`);\n const parentId = options.taskId || 'parent';\n const invoked = await subagentManager.invokeSubagents(subagentsToInvoke, parentId, messageQueue);\n resultMsg = `[Action invoke_subagent Success]: Invoked subagents:\\n${invoked.map(s => `- ID: ${s.id}, Type: ${s.TypeName}, Role: ${s.Role}`).join('\\n')}`;\n }\n else if (action.type === 'send_message') {\n const recipient = action.Recipient || '';\n const message = action.Message || '';\n log.info(`✉️ Sending message to ${colors.bold(recipient)}`);\n subagentManager.sendMessage(recipient, message);\n resultMsg = `[Action send_message Success]: Message sent to '${recipient}'`;\n }\n else if (action.type === 'manage_subagents') {\n const subAction = action.Action || '';\n const ids = action.ConversationIds || [];\n log.info(`⚙️ Managing subagents. Action: ${colors.bold(subAction)}`);\n\n if (subAction === 'list') {\n const active = subagentManager.getActiveSubagents();\n resultMsg = `[Action manage_subagents Success]: Active subagents:\\n${active.map(s => `- ID: ${s.id}, Type: ${s.type}, Role: ${s.role}`).join('\\n')}`;\n } else if (subAction === 'read_logs') {\n const id = ids[0];\n if (!id) {\n resultMsg = `[Action manage_subagents Failed]: No subagent ID provided in ConversationIds.`;\n } else {\n try {\n const logs = subagentManager.getSubagentLogs(id);\n resultMsg = `[Action manage_subagents Success]: Last log lines for subagent ${id}:\\n\\`\\`\\`\\n${logs}\\n\\`\\`\\``;\n } catch (e: any) {\n resultMsg = `[Action manage_subagents Failed]: ${e.message}`;\n }\n }\n } else if (subAction === 'kill') {\n for (const id of ids) {\n subagentManager.killSubagent(id);\n }\n resultMsg = `[Action manage_subagents Success]: Terminated subagents: ${ids.join(', ')}`;\n } else if (subAction === 'kill_all') {\n subagentManager.killAllSubagents();\n resultMsg = `[Action manage_subagents Success]: Terminated all active subagents`;\n } else {\n resultMsg = `[Action manage_subagents Failed]: Unknown action '${subAction}'`;\n }\n }\n else if (action.type === 'complete_task') {\n const detailedContent = action.content || '';\n const taskSummary = action.summary || 'Task completed successfully.';\n \n if (isSubagent) {\n subagentManager.updateSubagentSummary(options.taskId!, taskSummary);\n // Send the detailed markdown content to parent mailbox instead of just a 1-sentence summary\n if (process.env.SHARK_PARENT_ID) {\n subagentManager.sendMessage(\n process.env.SHARK_PARENT_ID,\n `[Subagent Notification] Subagent ${process.env.SHARK_SUBAGENT_ROLE || 'Subagent'} (${options.taskId}) completed.\\nResult Details:\\n${detailedContent}`\n );\n }\n finalSummary = taskSummary;\n keepGoing = false;\n break;\n } else {\n if (detailedContent) {\n log.info(colors.primary('🤖 Shark Dev:'));\n console.log(detailedContent);\n }\n \n log.success(`✔ Task Completed: ${taskSummary}`);\n \n if (!options.auto || subagentManager.getActiveSubagentsForParent(myId).length > 0) {\n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Your answer:', subagentPrefix, undefined, isAuto);\n }\n if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n finalSummary = taskSummary;\n keepGoing = false;\n break;\n }\n }\n nextPrompt = nextMsg.content;\n continue;\n } else {\n finalSummary = taskSummary;\n keepGoing = false;\n break;\n }\n }\n }\n else if (action.type === 'wait') {\n const durationSeconds = action.duration_seconds || 0;\n const durationMs = durationSeconds > 0 ? durationSeconds * 1000 : undefined;\n log.info(`⏳ Waiting for updates (Timeout: ${durationSeconds || 'infinite'}s)...`);\n \n let nextMsg: QueueMessage;\n if (!messageQueue.isEmpty()) {\n nextMsg = await messageQueue.next();\n } else {\n nextMsg = await waitForInputOrNotification(messageQueue, 'Your answer:', subagentPrefix, durationMs, isAuto);\n }\n\n if (nextMsg.type === 'timeout') {\n resultMsg = `[System]: Wait duration of ${durationSeconds} seconds expired. No notifications received.`;\n } else if (nextMsg.type === 'user') {\n if (tui.isCancel(nextMsg.content)) {\n keepGoing = false;\n break;\n }\n resultMsg = `User Reply: ${nextMsg.content}`;\n } else {\n resultMsg = nextMsg.content;\n }\n }\n else if (action.type === 'notify_user') {\n const messageContent = action.content || '';\n if (messageContent) {\n log.info(colors.primary('🤖 Shark Dev:'));\n console.log(messageContent);\n }\n resultMsg = `[Action notify_user Success]: Notificação exibida com sucesso para o usuário.`;\n }\n else {\n resultMsg = `[Unsupported action type: ${action.type}]`;\n }\n\n FileLogger.log('TOOL_EXECUTION', `Action: ${action.type}`, { action, result: resultMsg });\n nextPrompt = resultMsg;\n\n } catch (e: any) {\n log.error(e.message);\n if (options.taskId && process.env.SHARK_PARENT_ID) {\n const parentId = process.env.SHARK_PARENT_ID;\n const role = process.env.SHARK_SUBAGENT_ROLE || 'Subagent';\n subagentManager.sendMessage(\n parentId,\n `[Subagent Notification] Subagent ${role} (${options.taskId}) has finished with status: FAILED. Summary: Error: ${e.message}`\n );\n }\n keepGoing = false;\n return { success: false, summary: `Error: ${e.message}` };\n }\n }\n\n const finalResult = { success: true, summary: finalSummary || \"Task completed without summary.\" };\n if (options.taskId && process.env.SHARK_PARENT_ID) {\n const parentId = process.env.SHARK_PARENT_ID;\n const role = process.env.SHARK_SUBAGENT_ROLE || 'Subagent';\n subagentManager.sendMessage(\n parentId,\n `[Subagent Notification] Subagent ${role} (${options.taskId}) has finished with status: COMPLETED. Summary: ${finalResult.summary}`\n );\n }\n\n log.success('✅ Task Scope Completed');\n return finalResult;\n } finally {\n process.off('SIGINT', sigIntHandler);\n process.off('SIGTERM', sigTermHandler);\n\n // Auto terminate active subagents created by this parent to prevent leaks on exit\n const currentId = options.taskId || 'parent';\n const myActiveSubagents = subagentManager.getActiveSubagentsForParent(currentId);\n if (myActiveSubagents.length > 0) {\n log.info(`🧹 Terminating ${myActiveSubagents.length} active child subagent(s) before exit...`);\n for (const sub of myActiveSubagents) {\n subagentManager.killSubagent(sub.id);\n }\n }\n }\n}\n","\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport fg from 'fast-glob';\nimport { colors } from '../../ui/colors.js';\nimport { tui } from '../../ui/tui.js';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { fileURLToPath } from 'node:url';\nimport { CodeEditorFactory } from '../ast-editing/editors/code-editor-factory.js';\nimport { CodeStructure } from '../ast-editing/interfaces/structure.types.js';\n\nconst execAsync = promisify(exec);\n\n\n/**\n * Shared tools for Agent interaction (File System, etc.)\n */\n\n\nexport function detectLineEnding(content: string): string {\n const crlf = content.split('\\r\\n').length - 1;\n const lf = content.split('\\n').length - 1 - crlf;\n return crlf > lf ? '\\r\\n' : '\\n';\n}\n\nexport function handleListFiles(dirPath: string): string {\n try {\n const fullPath = path.resolve(process.cwd(), dirPath);\n if (!fs.existsSync(fullPath)) return `Error: Directory ${dirPath} does not exist.`;\n\n const items = fs.readdirSync(fullPath, { withFileTypes: true });\n return items.map(item => {\n return `${item.isDirectory() ? '[DIR]' : '[FILE]'} ${item.name}`;\n }).join('\\n');\n } catch (e: any) {\n return `Error listing files: ${e.message}`;\n }\n}\n\nexport function handleReadFile(filePath: string, showLineNumbers: boolean = true): string {\n try {\n const fullPath = path.resolve(process.cwd(), filePath);\n if (!fs.existsSync(fullPath)) return `Error: File ${filePath} does not exist.`;\n\n // Limit size?\n const stats = fs.statSync(fullPath);\n if (stats.size > 100 * 1024) return `Error: File too large to read (${stats.size} bytes). Limit is 100KB.`;\n\n const content = fs.readFileSync(fullPath, 'utf-8');\n\n if (showLineNumbers) {\n const lines = content.split('\\n');\n return lines.map((line, idx) => `${idx + 1}: ${line}`).join('\\n');\n }\n\n return content;\n } catch (e: any) {\n return `Error reading file: ${e.message}`;\n }\n}\n\nexport function replaceLineRange(\n filePath: string,\n startLine: number, // 1-indexed\n endLine: number, // 1-indexed\n newContent: string,\n tui: any\n): boolean {\n try {\n if (!fs.existsSync(filePath)) {\n tui.log.error(`❌ File not found for modification: ${filePath}`);\n return false;\n }\n\n const currentFileContent = fs.readFileSync(filePath, 'utf-8');\n const lineEnding = detectLineEnding(currentFileContent);\n const lines = currentFileContent.split(lineEnding);\n\n // Validation\n if (startLine < 1 || startLine > lines.length) {\n tui.log.error(`❌ Invalid start line: ${startLine}. File has ${lines.length} lines.`);\n return false;\n }\n\n if (endLine < startLine || endLine > lines.length) {\n tui.log.error(`❌ Invalid end line: ${endLine}. Must be >= startLine and <= file length.`);\n return false;\n }\n\n // Replace lines [startLine-1, endLine-1]\n // Note: lines array is 0-indexed\n const before = lines.slice(0, startLine - 1);\n const after = lines.slice(endLine);\n const newLines = newContent.split(lineEnding); // Use detected line ending for new content splitting if provided with one, usually agent provides \\n\n\n // If newContent comes from LLM, it likely has \\n. We should split by \\n and join by detected.\n // But wait, if newContent has \\n and we join by \\r\\n, it works if we split newContent by \\n.\n // If newContent already has \\r\\n, splitting by \\n leaves \\r.\n // Safe approach: Normalized split of new code.\n const normalizedNewLines = newContent.replace(/\\r\\n/g, '\\n').split('\\n');\n\n const result = [...before, ...normalizedNewLines, ...after].join(lineEnding);\n\n const BOM = '\\uFEFF';\n const finalContent = result.startsWith(BOM) ? result : BOM + result;\n fs.writeFileSync(filePath, finalContent, { encoding: 'utf-8' });\n\n tui.log.success(`✅ Replaced lines ${startLine}-${endLine} in ${filePath}`);\n return true;\n\n } catch (e: any) {\n tui.log.error(`❌ Error replacing line range: ${e.message}`);\n return false;\n }\n}\n\nimport { CodeReviewService } from '../services/code-review.service.js';\n\nexport async function generateFilePreview(\n filePath: string,\n startLine: number,\n endLine: number,\n newContent: string\n): Promise<string> {\n try {\n const fullPath = path.resolve(process.cwd(), filePath);\n if (!fs.existsSync(fullPath)) return `Error: File ${filePath} does not exist.`;\n\n const content = fs.readFileSync(fullPath, 'utf-8');\n const lines = content.split(/\\r\\n|\\r|\\n/);\n\n // 0-indexed adjustment\n const startIdx = startLine - 1;\n const endIdx = endLine - 1;\n\n if (startIdx < 0 || startIdx >= lines.length) return `Error: Start line ${startLine} is out of bounds (File has ${lines.length} lines).`;\n if (endIdx < startIdx || endIdx >= lines.length) return `Error: End line ${endLine} is invalid.`;\n\n const contextBefore = lines.slice(Math.max(0, startIdx - 3), startIdx).map((l, i) => `${Math.max(1, startLine - 3) + i} | ${l}`).join('\\n');\n const contentReplacing = lines.slice(startIdx, endIdx + 1).map((l, i) => `${startLine + i} | - ${l}`).join('\\n');\n const contextAfter = lines.slice(endIdx + 1, Math.min(lines.length, endIdx + 4)).map((l, i) => `${endLine + 1 + i} | ${l}`).join('\\n');\n\n const newLines = newContent.split('\\n').map(l => `+ ${l}`).join('\\n');\n\n // INTEGRATE CODE REVIEW AGENT\n let reviewFeedback = '';\n try {\n reviewFeedback = await CodeReviewService.reviewCode(filePath, newContent);\n } catch (err) {\n reviewFeedback = `⚠️ Code Review Service Unavailable: ${(err as any).message}`;\n }\n\n return `PREVIEW OF CHANGES to ${filePath}:\n--------------------------------------------------\nCONTEXT BEFORE:\n${contextBefore}\n\nCHANGES:\n${contentReplacing}\n${newLines}\n\nCONTEXT AFTER:\n${contextAfter}\n--------------------------------------------------\n${reviewFeedback}\n\nIMPORTANT: Please verify that the lines being replaced (marked with -) are exactly what you intend to remove.\nIf the context looks wrong, DO NOT CONFIRM. Re-read the file to check line numbers.\n`;\n } catch (e: any) {\n return `Error generating preview: ${e.message}`;\n }\n}\n\nexport function handleSearchFile(pattern: string): string {\n try {\n // Limit scope to current directory for safety?\n // Patterns are relative to process.cwd()\n const entries = fg.sync(pattern, { dot: true });\n if (entries.length === 0) return 'No files found matching pattern.';\n return entries.slice(0, 50).join('\\n');\n } catch (e: any) {\n return `Error searching files: ${e.message}`;\n }\n}\n\n/**\n * Searches for a string or regex pattern within files matching a glob.\n * Works like VSCode's \"Find in Files\" — returns matching lines with file path and line number.\n * Use this instead of read_file when you only need to find specific symbols,\n * exports, method names, or patterns — avoiding flooding the context with full file contents.\n *\n * @param globPattern Glob pattern to select files (e.g., \"src/**‌/*.ts\")\n * @param query String or regex pattern to search for\n * @param isRegex If true, treats query as a regular expression\n */\nexport function handleSearchCode(\n globPattern: string,\n query: string,\n isRegex: boolean = false\n): string {\n const MAX_MATCHES = 50;\n const MAX_FILE_SIZE_BYTES = 500 * 1024; // skip files > 500KB\n\n try {\n const files = fg.sync(globPattern, { dot: true, absolute: false });\n if (files.length === 0) return `No files found matching pattern: \"${globPattern}\"`;\n\n let searchRegex: RegExp;\n try {\n searchRegex = isRegex\n ? new RegExp(query, 'gi')\n : new RegExp(query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n } catch {\n return `Error: Invalid regex pattern: \"${query}\"`;\n }\n\n const results: string[] = [];\n let totalMatches = 0;\n\n for (const filePath of files) {\n if (totalMatches >= MAX_MATCHES) break;\n\n try {\n const fullPath = path.resolve(process.cwd(), filePath);\n const stats = fs.statSync(fullPath);\n if (stats.size > MAX_FILE_SIZE_BYTES) continue; // skip huge binaries\n\n const content = fs.readFileSync(fullPath, 'utf-8');\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n if (totalMatches >= MAX_MATCHES) break;\n searchRegex.lastIndex = 0; // reset for 'g' flag\n if (searchRegex.test(lines[i])) {\n results.push(`${filePath}:${i + 1}: ${lines[i].trim()}`);\n totalMatches++;\n }\n }\n } catch {\n // skip unreadable files silently\n }\n }\n\n if (results.length === 0) {\n return `No matches found for \"${query}\" in files matching \"${globPattern}\"`;\n }\n\n const limited = totalMatches >= MAX_MATCHES ? ` (limited to ${MAX_MATCHES})` : '';\n return `Found ${totalMatches} match(es) for \"${query}\" in \"${globPattern}\"${limited}:\\n${results.join('\\n')}`;\n\n } catch (e: any) {\n return `Error searching code: ${e.message}`;\n }\n}\n\nexport function startSmartReplace(filePath: string, newContent: string, targetContent: string, tui: any): boolean {\n if (!fs.existsSync(filePath)) {\n tui.log.error(`❌ File not found for modification: ${filePath}`);\n return false;\n }\n\n const currentFileContent = fs.readFileSync(filePath, 'utf-8');\n\n // 1. Validation: Does target exist?\n // Normalize string for comparison to avoid CRLF issues during check\n const normalizedTarget = targetContent.replace(/\\r\\n/g, '\\n');\n const normalizedContent = currentFileContent.replace(/\\r\\n/g, '\\n');\n\n if (!normalizedContent.includes(normalizedTarget)) {\n tui.log.error(`❌ Target content not found in ${filePath} (checked with normalized line endings). Modification aborted.`);\n console.log(colors.dim('--- Target Content Expected ---'));\n console.log(targetContent.substring(0, 200) + '...');\n return false;\n }\n\n // 2. Validation: Is it unique?\n const occurrences = currentFileContent.split(targetContent).length - 1;\n if (occurrences > 1) {\n tui.log.error(`❌ Ambiguous target: Found ${occurrences} occurrences in ${filePath}. Modification aborted.`);\n return false;\n }\n\n // 3. Apply Replacement\n const BOM = '\\uFEFF';\n const updatedContent = currentFileContent.replace(targetContent, newContent);\n const finalContent = updatedContent.startsWith(BOM) ? updatedContent : BOM + updatedContent;\n fs.writeFileSync(filePath, finalContent, { encoding: 'utf-8' });\n tui.log.success(`✅ Smart Replace Applied: ${filePath}`);\n return true;\n}\n\nexport async function handleRunCommand(command: string): Promise<string> {\n const { spawn } = await import('node:child_process');\n try {\n tui.log.info(`💻 Executing: ${colors.dim(command)}`);\n\n // Split command into cmd and args (naive split, use specific parser if needed for complex quotes)\n // For simplicity in Agent usage, we might act as a shell?\n // Let's use shell: true option for ease of piping/env usage.\n\n return new Promise((resolve) => {\n const child = spawn(command, {\n shell: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n cwd: process.cwd()\n });\n\n let stdout = '';\n let stderr = '';\n\n // Timeout safety: 5 minutes\n const timer = setTimeout(() => {\n child.kill();\n resolve(`Error: Command timed out after 5 minutes.\\nOutput so far:\\n${stdout}\\n${stderr}`);\n }, 5 * 60 * 1000);\n\n child.stdout.on('data', (data) => {\n const chunk = data.toString();\n stdout += chunk;\n // Optional: Stream to TUI if verbose?\n });\n\n child.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n if (code === 0) {\n resolve(stdout.trim() || 'Command executed successfully (no output).');\n } else {\n resolve(`Command failed with exit code ${code}.\\nSTDERR:\\n${stderr}\\nSTDOUT:\\n${stdout}`);\n }\n });\n\n child.on('error', (err) => {\n clearTimeout(timer);\n resolve(`Error executing command: ${err.message}`);\n });\n });\n\n } catch (e: any) {\n return `Error launching command: ${e.message}`;\n }\n}\n\n\n/**\n * Resolves the ast-grep command to use.\n * Priorities:\n * 1. Package-local node_modules binary (for global installs)\n * 2. CWD node_modules binary (for local dev)\n * 3. Fallback to 'npx sg'\n */\nfunction resolveAstGrepCommand(): string {\n const isWin = process.platform === 'win32';\n const binName = isWin ? 'sg.cmd' : 'sg';\n\n // 1. Try to find binary relative to THIS file (package root)\n try {\n const currentFile = fileURLToPath(import.meta.url);\n // Go up until we find package root or hit root\n let dir = path.dirname(currentFile);\n\n // Simple heuristic: walk up up to 5 levels to find node_modules\n // When bundled, we might be in dist/ or dist/bin/\n for (let i = 0; i < 5; i++) {\n const candidate = path.join(dir, 'node_modules', '.bin', binName);\n if (fs.existsSync(candidate)) {\n return `\"${candidate}\"`;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch (e) {\n // Ignore errors resolving path\n }\n\n // 2. Try CWD (User's project)\n const cwdBin = path.resolve(process.cwd(), 'node_modules', '.bin', binName);\n if (fs.existsSync(cwdBin)) {\n return `\"${cwdBin}\"`;\n }\n\n // 3. Fallback\n return 'npx sg';\n}\n\n/**\n * Executes ast-grep search via local CLI.\n * Returns the raw output (JSON usually requested by consumer) or error message.\n */\nexport async function astGrepSearch(\n pattern: string,\n filePath: string,\n language: string,\n tui: any\n): Promise<string> {\n const { spawn } = await import('node:child_process');\n try {\n if (!fs.existsSync(filePath)) {\n return `❌ File not found: ${filePath}`;\n }\n\n // Resolve sg command robustly\n const sgCmd = resolveAstGrepCommand();\n const cmd = `${sgCmd} run -p \"${pattern}\" -l ${language} --json ${filePath}`;\n\n tui.log.info(`🔍 [AST-GREP] Searching: ${cmd}`);\n\n return new Promise((resolve) => {\n const child = spawn(cmd, {\n shell: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n cwd: process.cwd(),\n env: { ...process.env, NO_COLOR: 'true' } // Avoid ANSI codes in JSON output\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout.on('data', (data) => stdout += data.toString());\n child.stderr.on('data', (data) => stderr += data.toString());\n\n child.on('close', (code) => {\n if (code === 0 && stdout) {\n resolve(stdout);\n } else if (code === 1 && !stderr) {\n // ast-grep finds simply nothing\n resolve(\"No structural matches found.\");\n } else {\n // Real error or no matches with empty stdout\n if (!stdout && !stderr) resolve(\"No structural matches found.\");\n else {\n tui.log.error(`❌ ast-grep search error (code ${code}): ${stderr}`);\n resolve(`Error executing ast-grep search: ${stderr || stdout}`);\n }\n }\n });\n\n child.on('error', (err) => {\n resolve(`Error executing ast-grep search: ${err.message}`);\n });\n });\n\n } catch (e: any) {\n tui.log.error(`❌ ast-grep search exception: ${e.message}`);\n return `Error executing ast-grep search: ${e.message}`;\n }\n}\n\n/**\n * Executes ast-grep rewrite via local CLI.\n * Returns boolean success/failure.\n */\nexport async function astGrepRewrite(\n pattern: string,\n fix: string,\n filePath: string,\n language: string,\n tui: any\n): Promise<boolean> {\n const { spawn } = await import('node:child_process');\n try {\n if (!fs.existsSync(filePath)) {\n tui.log.error(`❌ File not found for AST modification: ${filePath}`);\n return false;\n }\n\n // Resolve sg command robustly\n const sgCmd = resolveAstGrepCommand();\n const cmd = `${sgCmd} run -p \"${pattern}\" -r \"${fix}\" -l ${language} ${filePath} --update-all`;\n\n tui.log.info(`✏️ [AST-GREP] Rewriting: pattern=\"${pattern}\" fix=\"${fix.substring(0, 50)}...\"`);\n\n return new Promise((resolve) => {\n const child = spawn(cmd, {\n shell: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n cwd: process.cwd()\n });\n\n let stderr = '';\n child.stderr.on('data', (data) => stderr += data.toString());\n\n child.on('close', (code) => {\n if (code === 0) {\n tui.log.success(`✅ AST Rewrite applied to ${filePath}`);\n resolve(true);\n } else {\n tui.log.error(`❌ AST Rewrite failed (code ${code}): ${stderr}`);\n resolve(false);\n }\n });\n\n child.on('error', (err) => {\n tui.log.error(`❌ AST Rewrite spawn error: ${err.message}`);\n resolve(false);\n });\n });\n\n } catch (e: any) {\n tui.log.error(`❌ Unexpected error in astGrepRewrite: ${e.message}`);\n return false;\n }\n}\n\n// ═══════════════════════════════════════════════════════\n// AST TOOLS IMPLEMENTATION\n// ═══════════════════════════════════════════════════════\n\n/**\n * AST Tool: List file structure\n */\nexport async function astListStructure(filePath: string): Promise<string> {\n try {\n const editor = CodeEditorFactory.getEditor(filePath);\n\n if (!editor) {\n return `[AST Error] File type not supported: ${filePath}. Use read_file instead.`;\n }\n\n const structure: CodeStructure = await editor.listStructure(filePath);\n\n // Format for LLM consumption\n let output = `[AST Structure of ${filePath}]\\n\\n`;\n\n // Classes\n if (structure.classes.length > 0) {\n output += `CLASSES:\\n`;\n structure.classes.forEach(cls => {\n output += ` - ${cls.name}`;\n if (cls.extendsClass) output += ` extends ${cls.extendsClass}`;\n if (cls.implementsInterfaces.length > 0) {\n output += ` implements ${cls.implementsInterfaces.join(', ')}`;\n }\n output += `\\n`;\n\n if (cls.decorators.length > 0) {\n output += ` Decorators: ${cls.decorators.join(', ')}\\n`;\n }\n\n if (cls.properties.length > 0) {\n output += ` Properties:\\n`;\n cls.properties.forEach(prop => {\n output += ` - ${prop.visibility} ${prop.name}: ${prop.type}\\n`;\n });\n }\n\n if (cls.methods.length > 0) {\n output += ` Methods:\\n`;\n cls.methods.forEach(method => {\n const params = method.parameters.map(p => `${p.name}: ${p.type}`).join(', ');\n output += ` - ${method.visibility} ${method.name}(${params}): ${method.returnType}\\n`;\n });\n }\n output += `\\n`;\n });\n }\n\n // Interfaces\n if (structure.interfaces.length > 0) {\n output += `INTERFACES:\\n`;\n structure.interfaces.forEach(iface => {\n output += ` - ${iface.name}\\n`;\n iface.properties.forEach(prop => {\n output += ` ${prop.name}: ${prop.type}\\n`;\n });\n });\n output += `\\n`;\n }\n\n // Functions\n if (structure.functions.length > 0) {\n output += `FUNCTIONS:\\n`;\n structure.functions.forEach(fn => {\n const params = fn.parameters.map(p => `${p.name}: ${p.type}`).join(', ');\n output += ` - ${fn.name}(${params}): ${fn.returnType}\\n`;\n });\n output += `\\n`;\n }\n\n // Imports\n if (structure.imports.length > 0) {\n output += `IMPORTS:\\n`;\n structure.imports.forEach(imp => {\n output += ` - from \"${imp.modulePath}\": ${imp.namedImports.join(', ')}\\n`;\n });\n }\n\n return output;\n } catch (error: any) {\n return `[AST Error] ${error.message}`;\n }\n}\n\nexport async function astAddMethod(\n filePath: string,\n className: string,\n methodCode: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) {\n throw new Error(`No AST editor available for ${filePath}`);\n }\n return await editor.addMethod(filePath, className, methodCode);\n}\n\nexport async function astGetMethod(\n filePath: string,\n className: string,\n methodName: string\n): Promise<string> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) {\n throw new Error(`No AST editor available for ${filePath}`);\n }\n const methodContent = await editor.getMethod(filePath, className, methodName);\n if (!methodContent) {\n return `Method \"${methodName}\" not found in class \"${className}\"`;\n }\n return methodContent;\n}\n\nexport async function astAddClass(\n filePath: string,\n className: string,\n extendsClass?: string,\n implementsInterfaces?: string[]\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.addClass(filePath, className, { extendsClass, implementsInterfaces });\n}\n\nexport async function astAddProperty(\n filePath: string,\n className: string,\n propertyCode: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.addProperty(filePath, className, propertyCode);\n}\n\nexport async function astGetProperty(\n filePath: string,\n className: string,\n propertyName: string\n): Promise<string> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n const propContent = await editor.getProperty(filePath, className, propertyName);\n if (!propContent) {\n return `Property \"${propertyName}\" not found in class \"${className}\"`;\n }\n return propContent;\n}\n\nexport async function astModifyProperty(\n filePath: string,\n className: string,\n propertyName: string,\n propertyCode: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.modifyProperty(filePath, className, propertyName, propertyCode);\n}\n\nexport async function astRemoveProperty(\n filePath: string,\n className: string,\n propertyName: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.removeProperty(filePath, className, propertyName);\n}\n\nexport async function astModifyMethod(\n filePath: string,\n className: string,\n methodName: string,\n newBody: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.modifyMethod(filePath, className, methodName, newBody);\n}\n\nexport async function astRemoveMethod(\n filePath: string,\n className: string,\n methodName: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.removeMethod(filePath, className, methodName);\n}\n\nexport async function astAddDecorator(\n filePath: string,\n className: string,\n decoratorCode: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.addDecorator(filePath, className, decoratorCode);\n}\n\nexport async function astAddInterface(\n filePath: string,\n interfaceCode: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.addInterface(filePath, interfaceCode);\n}\n\nexport async function astAddTypeAlias(\n filePath: string,\n typeCode: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.addTypeAlias(filePath, typeCode);\n}\n\nexport async function astAddFunction(\n filePath: string,\n functionCode: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.addFunction(filePath, functionCode);\n}\n\nexport async function astRemoveFunction(\n filePath: string,\n functionName: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.removeFunction(filePath, functionName);\n}\n\nexport async function astAddImport(\n filePath: string,\n importStatement: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.addImport(filePath, importStatement);\n}\n\nexport async function astRemoveImport(\n filePath: string,\n modulePath: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.removeImport(filePath, modulePath);\n}\n\nexport async function astOrganizeImports(\n filePath: string\n): Promise<boolean> {\n const editor = CodeEditorFactory.getEditor(filePath);\n if (!editor) throw new Error(`AST editing not supported for: ${filePath}`);\n\n return await editor.organizeImports(filePath);\n}\n","import * as path from 'node:path';\nimport { CodeEditor } from '../interfaces/code-editor.interface.js';\nimport { TypeScriptEditor } from './typescript-editor.js';\n\nexport class CodeEditorFactory {\n private static tsEditor: TypeScriptEditor | null = null;\n\n /**\n * Returns appropriate editor for the file, or null if AST editing not supported\n */\n static getEditor(filePath: string): CodeEditor | null {\n const ext = path.extname(filePath).toLowerCase();\n\n // TypeScript/JavaScript\n if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) {\n // Reuse singleton instance for performance (ts-morph Project is heavy)\n if (!this.tsEditor) {\n this.tsEditor = new TypeScriptEditor();\n }\n return this.tsEditor;\n }\n\n // HTML - TODO: Implement in Phase 2\n // if (ext === '.html') {\n // return new TreeSitterEditor('html');\n // }\n\n // For unsupported files, return null (will fallback to modify_file)\n return null;\n }\n\n /**\n * Clear cached editors (useful for testing)\n */\n static clearCache(): void {\n this.tsEditor = null;\n }\n}\n","import { Project, SourceFile, ClassDeclaration, SyntaxKind } from 'ts-morph';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { CodeEditor, ClassOptions } from '../interfaces/code-editor.interface.js';\nimport {\n CodeStructure,\n ClassInfo,\n MethodInfo,\n PropertyInfo\n} from '../interfaces/structure.types.js';\n\nexport class TypeScriptEditor implements CodeEditor {\n private project: Project;\n\n constructor() {\n this.project = new Project({\n skipAddingFilesFromTsConfig: true,\n compilerOptions: {\n target: 99, // ESNext\n module: 99, // ESNext\n },\n });\n }\n\n /**\n * Get or add source file to project\n */\n private getSourceFile(filePath: string): SourceFile {\n const absolutePath = path.resolve(filePath);\n\n // Check if already in project\n let sourceFile = this.project.getSourceFile(absolutePath);\n\n if (!sourceFile) {\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`File not found: ${absolutePath}`);\n }\n sourceFile = this.project.addSourceFileAtPath(absolutePath);\n }\n\n return sourceFile;\n }\n\n /**\n * Get class declaration by name\n */\n private getClass(sourceFile: SourceFile, className: string): ClassDeclaration {\n const classDecl = sourceFile.getClass(className);\n if (!classDecl) {\n throw new Error(`Class \"${className}\" not found in ${sourceFile.getFilePath()}`);\n }\n return classDecl;\n }\n\n // ═══════════════════════════════════════════════════════\n // IMPLEMENTATION: listStructure\n // ═══════════════════════════════════════════════════════\n\n async listStructure(filePath: string): Promise<CodeStructure> {\n const sourceFile = this.getSourceFile(filePath);\n\n // Extract classes\n const classes: ClassInfo[] = sourceFile.getClasses().map(cls => ({\n name: cls.getName() || '<anonymous>',\n methods: cls.getMethods().map(m => this.extractMethodInfo(m)),\n properties: cls.getProperties().map(p => this.extractPropertyInfo(p)),\n decorators: cls.getDecorators().map(d => d.getText()),\n extendsClass: cls.getExtends()?.getText(),\n implementsInterfaces: cls.getImplements().map(i => i.getText()),\n }));\n\n // Extract interfaces\n const interfaces = sourceFile.getInterfaces().map(iface => ({\n name: iface.getName(),\n properties: iface.getProperties().map(p => this.extractPropertyInfo(p)),\n extends: iface.getExtends().map(e => e.getText()),\n }));\n\n // Extract functions\n const functions = sourceFile.getFunctions().map(fn => ({\n name: fn.getName() || '<anonymous>',\n parameters: fn.getParameters().map(p => ({\n name: p.getName(),\n type: p.getType().getText(),\n isOptional: p.isOptional(),\n })),\n returnType: fn.getReturnType().getText(),\n isAsync: fn.isAsync(),\n isExported: fn.isExported(),\n }));\n\n // Extract imports\n const imports = sourceFile.getImportDeclarations().map(imp => ({\n modulePath: imp.getModuleSpecifierValue(),\n isDefault: !!imp.getDefaultImport(),\n namedImports: imp.getNamedImports().map(n => n.getName()),\n namespaceImport: imp.getNamespaceImport()?.getText(),\n }));\n\n // Extract exports\n const exports = sourceFile.getExportedDeclarations();\n const exportInfo = Array.from(exports.entries()).flatMap(([name, declarations]) =>\n declarations.map(decl => ({\n name,\n type: this.getDeclarationType(decl),\n isDefault: sourceFile.getDefaultExportSymbol()?.getName() === name,\n }))\n );\n\n return {\n classes,\n interfaces,\n functions,\n imports,\n exports: exportInfo,\n };\n }\n\n private extractMethodInfo(method: any): MethodInfo {\n return {\n name: method.getName(),\n parameters: method.getParameters().map((p: any) => ({\n name: p.getName(),\n type: p.getType().getText(),\n isOptional: p.isOptional(),\n })),\n returnType: method.getReturnType().getText(),\n isAsync: method.isAsync(),\n isStatic: method.isStatic(),\n visibility: this.getVisibility(method),\n decorators: method.getDecorators().map((d: any) => d.getText()),\n };\n }\n\n private extractPropertyInfo(property: any): PropertyInfo {\n return {\n name: property.getName(),\n type: property.getType()?.getText(),\n visibility: this.getVisibility(property),\n isReadonly: property.isReadonly(),\n initializer: property.getInitializer()?.getText(),\n };\n }\n\n private getVisibility(node: any): 'public' | 'private' | 'protected' {\n if (node.hasModifier?.(SyntaxKind.PrivateKeyword)) return 'private';\n if (node.hasModifier?.(SyntaxKind.ProtectedKeyword)) return 'protected';\n return 'public';\n }\n\n private getDeclarationType(decl: any): 'class' | 'function' | 'interface' | 'type' | 'const' {\n if (decl.getKind() === SyntaxKind.ClassDeclaration) return 'class';\n if (decl.getKind() === SyntaxKind.FunctionDeclaration) return 'function';\n if (decl.getKind() === SyntaxKind.InterfaceDeclaration) return 'interface';\n if (decl.getKind() === SyntaxKind.TypeAliasDeclaration) return 'type';\n return 'const';\n }\n\n // ═══════════════════════════════════════════════════════\n // IMPLEMENTATION: Class Operations\n // ═══════════════════════════════════════════════════════\n\n async addClass(\n filePath: string,\n className: string,\n options?: ClassOptions\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n\n sourceFile.addClass({\n name: className,\n extends: options?.extendsClass,\n implements: options?.implementsInterfaces,\n isExported: true,\n });\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add class \"${className}\":`, error);\n return false;\n }\n }\n\n async addProperty(\n filePath: string,\n className: string,\n propertyCode: string\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n // Using insertText directly to support full property definitions\n const closeBrace = classDecl.getEnd() - 1;\n classDecl.insertText(closeBrace, `\\n ${propertyCode}`);\n\n // Reformat\n classDecl.formatText();\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add property to \"${className}\":`, error);\n return false;\n }\n }\n\n async getProperty(\n filePath: string,\n className: string,\n propertyName: string\n ): Promise<string | undefined> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n const property = classDecl.getProperty(propertyName);\n if (!property) {\n return undefined;\n }\n\n return property.getText();\n } catch (error) {\n console.error(`Failed to get property \"${propertyName}\":`, error);\n return undefined;\n }\n }\n\n async modifyProperty(\n filePath: string,\n className: string,\n propertyName: string,\n newCode: string\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n const property = classDecl.getProperty(propertyName);\n if (!property) {\n throw new Error(`Property \"${propertyName}\" not found in class \"${className}\"`);\n }\n\n // Replace the entire property text\n property.replaceWithText(newCode);\n\n // Reformat\n classDecl.formatText();\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to modify property \"${propertyName}\":`, error);\n return false;\n }\n }\n\n async removeProperty(\n filePath: string,\n className: string,\n propertyName: string\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n const property = classDecl.getProperty(propertyName);\n if (!property) {\n throw new Error(`Property \"${propertyName}\" not found in class \"${className}\"`);\n }\n\n property.remove();\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to remove property \"${propertyName}\":`, error);\n return false;\n }\n }\n\n async addMethod(\n filePath: string,\n className: string,\n methodCode: string\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n // Method code is likely \"methodName(...) { ... }\"\n // We can insert this as text.\n const closeBrace = classDecl.getEnd() - 1;\n classDecl.insertText(closeBrace, `\\n ${methodCode}\\n`);\n\n classDecl.formatText();\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add method to \"${className}\":`, error);\n return false;\n }\n }\n\n async modifyMethod(\n filePath: string,\n className: string,\n methodName: string,\n newBody: string\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n const method = classDecl.getMethod(methodName);\n if (!method) {\n throw new Error(`Method \"${methodName}\" not found in class \"${className}\"`);\n }\n\n method.setBodyText(newBody);\n\n // Optional: reformat\n method.formatText();\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to modify method \"${methodName}\":`, error);\n return false;\n }\n }\n\n async removeMethod(\n filePath: string,\n className: string,\n methodName: string\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n const method = classDecl.getMethod(methodName);\n if (!method) {\n throw new Error(`Method \"${methodName}\" not found in class \"${className}\"`);\n }\n\n method.remove();\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to remove method \"${methodName}\":`, error);\n return false;\n }\n }\n\n async addDecorator(\n filePath: string,\n className: string,\n decoratorCode: string\n ): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n // Robust text-based insertion\n const start = classDecl.getStart();\n // Prefix the class with the decorator\n sourceFile.insertText(start, `${decoratorCode}\\n`);\n sourceFile.formatText();\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add decorator to \"${className}\":`, error);\n return false;\n }\n }\n\n async getMethod(\n filePath: string,\n className: string,\n methodName: string\n ): Promise<string | undefined> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n const classDecl = this.getClass(sourceFile, className);\n\n const method = classDecl.getMethod(methodName);\n if (!method) {\n return undefined;\n }\n\n return method.getText();\n } catch (error) {\n console.error(`Failed to get method \"${methodName}\":`, error);\n return undefined;\n }\n }\n\n // ═══════════════════════════════════════════════════════\n // IMPLEMENTATION: Interface/Type Operations\n // ═══════════════════════════════════════════════════════\n\n async addInterface(filePath: string, interfaceCode: string): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n\n // Add at the end of file\n sourceFile.insertText(sourceFile.getEnd(), `\\n\\n${interfaceCode}`);\n sourceFile.formatText();\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add interface:`, error);\n return false;\n }\n }\n\n async addTypeAlias(filePath: string, typeCode: string): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n sourceFile.insertText(sourceFile.getEnd(), `\\n\\n${typeCode}`);\n sourceFile.formatText();\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add type alias:`, error);\n return false;\n }\n }\n\n // ═══════════════════════════════════════════════════════\n // IMPLEMENTATION: Function Operations\n // ═══════════════════════════════════════════════════════\n\n async addFunction(filePath: string, functionCode: string): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n sourceFile.insertText(sourceFile.getEnd(), `\\n\\n${functionCode}`);\n sourceFile.formatText();\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add function:`, error);\n return false;\n }\n }\n\n async removeFunction(filePath: string, functionName: string): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n\n const func = sourceFile.getFunction(functionName);\n if (!func) {\n throw new Error(`Function \"${functionName}\" not found`);\n }\n\n func.remove();\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to remove function \"${functionName}\":`, error);\n return false;\n }\n }\n\n // ═══════════════════════════════════════════════════════\n // IMPLEMENTATION: Import/Export Operations\n // ═══════════════════════════════════════════════════════\n\n async addImport(filePath: string, importStatement: string): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n\n const lastImport = sourceFile.getImportDeclarations().pop();\n const pos = lastImport ? lastImport.getEnd() : 0;\n\n sourceFile.insertText(pos, `\\n${importStatement}`);\n\n // Organize to clean up\n this.organizeImports(filePath);\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to add import:`, error);\n return false;\n }\n }\n\n async removeImport(filePath: string, modulePath: string): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n\n const importDecls = sourceFile.getImportDeclarations()\n .filter(imp => imp.getModuleSpecifierValue() === modulePath);\n\n if (importDecls.length === 0) {\n throw new Error(`Import from \"${modulePath}\" not found`);\n }\n\n importDecls.forEach(d => d.remove());\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to remove import from \"${modulePath}\":`, error);\n return false;\n }\n }\n\n async organizeImports(filePath: string): Promise<boolean> {\n try {\n const sourceFile = this.getSourceFile(filePath);\n\n sourceFile.organizeImports();\n\n // Fallback manual just in case:\n const imports = sourceFile.getImportDeclarations();\n const importStructure = imports.map(i => i.getStructure());\n\n // Sort by module specifier\n importStructure.sort((a, b) => {\n return a.moduleSpecifier.localeCompare(b.moduleSpecifier);\n });\n\n // Remove all\n imports.forEach(i => i.remove());\n\n // Re-add\n sourceFile.addImportDeclarations(importStructure);\n\n await sourceFile.save();\n return true;\n } catch (error) {\n console.error(`Failed to organize imports:`, error);\n return false;\n }\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport os from 'node:os';\n\nexport class SkillManager {\n private activeSkills: Set<string> = new Set();\n private skillPrompts: Map<string, string> = new Map();\n\n async loadSkillFromFile(filePath: string): Promise<string> {\n const content = await fs.readFile(filePath, 'utf-8');\n // Strip frontmatter\n const cleanContent = content.replace(/^---[\\s\\S]*?---\\s*/, '');\n return cleanContent;\n }\n\n async activateSkill(skillName: string): Promise<string> {\n if (this.activeSkills.has(skillName)) {\n return `Skill ${skillName} is already active.`;\n }\n\n // Reset previous active skills to avoid collision/token waste\n this.reset();\n\n const globalPath = path.join(os.homedir(), '.shark', 'skills', skillName, 'SKILL.md');\n const localPath = path.join(process.cwd(), '.agents', 'skills', skillName, 'SKILL.md');\n\n let skillPath = '';\n try {\n await fs.access(localPath);\n skillPath = localPath;\n } catch {\n try {\n await fs.access(globalPath);\n skillPath = globalPath;\n } catch {\n throw new Error(`Skill '${skillName}' not found globally or locally.`);\n }\n }\n\n const prompt = await this.loadSkillFromFile(skillPath);\n this.activeSkills.add(skillName);\n this.skillPrompts.set(skillName, prompt);\n return prompt;\n }\n\n getSystemInstructionExtension(): string {\n if (this.activeSkills.size === 0) return '';\n let extension = '\\n\\n<EXTREMELY_IMPORTANT>\\n';\n for (const [name, prompt] of this.skillPrompts.entries()) {\n extension += `\\n--- ACTIVE SKILL: ${name} ---\\n${prompt}\\n`;\n }\n extension += '\\n</EXTREMELY_IMPORTANT>\\n';\n return extension;\n }\n\n async listAvailableSkills(): Promise<string[]> {\n const globalSkillsDir = path.join(os.homedir(), '.shark', 'skills');\n const localSkillsDir = path.join(process.cwd(), '.agents', 'skills');\n\n const skillNames = new Set<string>();\n\n const readDir = async (dir: string) => {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const skillMdPath = path.join(dir, entry.name, 'SKILL.md');\n try {\n await fs.access(skillMdPath);\n skillNames.add(entry.name);\n } catch {\n // No SKILL.md — not a valid skill directory\n }\n }\n }\n } catch {\n // Directory doesn't exist — silently skip\n }\n };\n\n await readDir(globalSkillsDir);\n await readDir(localSkillsDir);\n\n return Array.from(skillNames).sort();\n }\n\n reset() {\n this.activeSkills.clear();\n this.skillPrompts.clear();\n }\n}\n\nexport const skillManager = new SkillManager();\n","import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fork } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport { tui } from '../../ui/tui.js';\nimport { MessageQueue } from './message-queue.js';\n\ninterface SubagentState {\n id: string;\n type: string;\n role: string;\n status: 'running' | 'completed' | 'failed' | 'cancelled';\n summary?: string;\n promise?: Promise<any>;\n parentId?: string;\n childProcess?: any;\n}\n\nexport interface CustomSubagentType {\n name: string;\n description: string;\n systemPrompt: string;\n enableWriteTools?: boolean;\n enableSubagentTools?: boolean;\n enableMcpTools?: boolean;\n}\n\nexport class SubagentManager {\n private subagents = new Map<string, SubagentState>();\n private customTypes = new Map<string, CustomSubagentType>();\n private messageSeq = 0;\n\n registerSubagent(id: string, type: string, role: string, parentId?: string) {\n this.subagents.set(id, { id, type, role, status: 'running', parentId });\n }\n\n terminateSubagent(id: string, success: boolean = true, isCancelled: boolean = false) {\n const state = this.subagents.get(id);\n if (state) {\n if (state.status === 'cancelled') {\n return;\n }\n if (isCancelled) {\n state.status = 'cancelled';\n } else {\n state.status = success ? 'completed' : 'failed';\n }\n }\n }\n\n isSubagentActive(id: string): boolean {\n return this.subagents.get(id)?.status === 'running';\n }\n\n hasSubagent(id: string): boolean {\n return this.subagents.has(id);\n }\n\n getSubagentState(id: string): SubagentState | undefined {\n return this.subagents.get(id);\n }\n\n updateSubagentSummary(id: string, summary: string) {\n const state = this.subagents.get(id);\n if (state) {\n state.summary = summary;\n }\n }\n\n sendMessage(recipient: string, message: string) {\n const mailboxDir = path.resolve(process.cwd(), '.shark', 'mailbox', recipient);\n fs.mkdirSync(mailboxDir, { recursive: true });\n const seq = (this.messageSeq++).toString().padStart(6, '0');\n const filePath = path.join(mailboxDir, `${Date.now()}-${seq}-${crypto.randomUUID()}.json`);\n fs.writeFileSync(filePath, JSON.stringify({ message }), 'utf-8');\n }\n\n retrieveMessages(id: string): string[] {\n const mailboxDir = path.resolve(process.cwd(), '.shark', 'mailbox', id);\n if (!fs.existsSync(mailboxDir)) {\n return [];\n }\n const files = fs.readdirSync(mailboxDir);\n // Sort files to process them in deterministic order (chronologically by filename prefix)\n files.sort();\n const messages: string[] = [];\n for (const file of files) {\n const filePath = path.join(mailboxDir, file);\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const data = JSON.parse(content);\n if (data && typeof data.message === 'string') {\n messages.push(data.message);\n }\n } catch (e) {\n // Ignore read/parse errors\n }\n try {\n fs.unlinkSync(filePath);\n } catch (e) {\n // Ignore unlink errors\n }\n }\n return messages;\n }\n\n peekMessages(id: string): string[] {\n const mailboxDir = path.resolve(process.cwd(), '.shark', 'mailbox', id);\n if (!fs.existsSync(mailboxDir)) {\n return [];\n }\n const files = fs.readdirSync(mailboxDir);\n files.sort();\n const messages: string[] = [];\n for (const file of files) {\n const filePath = path.join(mailboxDir, file);\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const data = JSON.parse(content);\n if (data && typeof data.message === 'string') {\n messages.push(data.message);\n }\n } catch (e) {\n // Ignore read/parse errors\n }\n }\n return messages;\n }\n\n defineSubagentType(\n name: string,\n description: string,\n systemPrompt: string,\n options: { enableWriteTools?: boolean; enableSubagentTools?: boolean; enableMcpTools?: boolean } = {}\n ) {\n this.customTypes.set(name, {\n name,\n description,\n systemPrompt,\n ...options\n });\n }\n\n getCustomSubagentType(name: string): CustomSubagentType | undefined {\n return this.customTypes.get(name);\n }\n\n getSubagentLogs(id: string, maxLines: number = 50): string {\n if (!/^[a-zA-Z0-9-]+$/.test(id)) {\n throw new Error('Invalid subagent ID format');\n }\n const projectRoot = process.cwd();\n const logFile = path.resolve(projectRoot, '_sharkrc', 'history', `subagent-${id}-console.log`);\n if (!fs.existsSync(logFile)) {\n return \"No console logs found for this subagent.\";\n }\n try {\n let content = fs.readFileSync(logFile, 'utf-8');\n if (content.endsWith('\\n')) {\n content = content.slice(0, -1);\n }\n const lines = content.split('\\n');\n const tail = lines.slice(-maxLines);\n return tail.join('\\n');\n } catch (e: any) {\n return `Failed to read subagent logs: ${e.message}`;\n }\n }\n\n getActiveSubagents(): SubagentState[] {\n return Array.from(this.subagents.values()).filter(s => s.status === 'running');\n }\n\n getActiveSubagentsForParent(parentId: string): SubagentState[] {\n return Array.from(this.subagents.values()).filter(s => s.status === 'running' && s.parentId === parentId);\n }\n\n killSubagent(id: string) {\n const state = this.subagents.get(id);\n if (state) {\n if (state.childProcess) {\n try {\n state.childProcess.kill('SIGTERM');\n } catch (e) {\n // Ignore\n }\n }\n this.terminateSubagent(id, false, true); // true sets status to 'cancelled'\n \n // Send cancellation notification to parent mailbox\n if (state.parentId) {\n const cancelMsg = `[Subagent Notification] Subagent ${state.role} (${id}) has finished with status: CANCELLED. Summary: Terminated by parent agent.`;\n this.sendMessage(state.parentId, cancelMsg);\n }\n }\n }\n\n killAllSubagents() {\n for (const [id, state] of this.subagents.entries()) {\n if (state.status === 'running') {\n this.killSubagent(id);\n }\n }\n }\n\n async invokeSubagents(\n subagents: Array<{ TypeName: string, Role: string, Prompt: string }>,\n parentId: string,\n parentQueue?: MessageQueue\n ): Promise<Array<{ id: string, TypeName: string, Role: string }>> {\n const invoked: Array<{ id: string, TypeName: string, Role: string }> = [];\n\n for (const sub of subagents) {\n const id = `subagent-${crypto.randomUUID()}`;\n this.registerSubagent(id, sub.TypeName, sub.Role, parentId);\n\n // Spawn the subagent execution in the background as a child process\n const promise = (async () => {\n try {\n const projectRoot = process.cwd();\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n\n // Find the package root of shark-ai containing package.json with name \"shark-ai\"\n let packageRoot = __dirname;\n while (true) {\n const pkgPath = path.join(packageRoot, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg && pkg.name === 'shark-ai') {\n break;\n }\n } catch (e) {\n // Ignore\n }\n }\n const parent = path.dirname(packageRoot);\n if (parent === packageRoot) {\n break;\n }\n packageRoot = parent;\n }\n const pathToSharkJs = path.resolve(packageRoot, 'dist', 'bin', 'shark.js');\n\n const customType = this.customTypes.get(sub.TypeName);\n let customContext = `Você está executando em modo SUBAGENTE.\\n`;\n customContext += `- Seu ID é: ${id}\\n`;\n customContext += `- O ID do seu Agente Pai é: ${parentId}\\n`;\n customContext += `- Você NÃO tem um terminal interativo com o usuário humano. Não use 'talk_with_user' para interagir.\\n`;\n customContext += `- Para reportar progresso intermediário ou tirar dúvidas com seu pai, use a ação 'send_message' com Recipient='${parentId}'.\\n`;\n customContext += `- Para concluir a tarefa e enviar o resultado detalhado em markdown, use obrigatoriamente a ação 'complete_task' com suas descobertas no campo 'content'.\\n`;\n \n if (customType) {\n customContext += `Custom Prompt: ${customType.systemPrompt}\\n`;\n }\n const instruction = customContext + '\\n\\n' + sub.Prompt;\n\n const args = ['dev', '-t', instruction, '--taskId', id, '--auto'];\n\n // Fork the child process silently (pipes stdout/stderr)\n const child = fork(pathToSharkJs, args, {\n cwd: projectRoot,\n silent: true,\n env: {\n ...process.env,\n SHARK_PARENT_ID: parentId,\n SHARK_SUBAGENT_ROLE: sub.Role\n }\n });\n\n // Store child process reference to allow termination (kill/kill_all)\n const state = this.subagents.get(id);\n if (state) {\n state.childProcess = child;\n }\n\n // Pipe console output to a history log file for process isolation\n const historyDir = path.resolve(projectRoot, '_sharkrc', 'history');\n fs.mkdirSync(historyDir, { recursive: true });\n const consoleLogFile = path.join(historyDir, `subagent-${id}-console.log`);\n const logStream = fs.createWriteStream(consoleLogFile, { flags: 'a' });\n\n if (child.stdout) {\n child.stdout.pipe(logStream);\n }\n if (child.stderr) {\n child.stderr.pipe(logStream);\n }\n\n // Wait for the child process to exit\n const exitCode = await new Promise<number | null>(resolve => {\n child.on('exit', (code) => {\n resolve(code);\n });\n });\n\n logStream.end();\n\n const isCancelled = this.subagents.get(id)?.status === 'cancelled';\n const success = exitCode === 0;\n this.terminateSubagent(id, success);\n \n if (isCancelled) {\n this.updateSubagentSummary(id, 'Terminated by parent agent.');\n tui.log.message(`\\nSubagent ${sub.Role} (${id}) cancelled.`);\n } else if (!success) {\n this.updateSubagentSummary(id, 'Failed');\n const fallbackMsg = `[Subagent Notification] Subagent ${sub.Role} (${id}) has finished with status: FAILED. Summary: Subagent process exited with code ${exitCode}`;\n const mailboxDir = path.resolve(projectRoot, '.shark', 'mailbox', parentId);\n const hasMessages = fs.existsSync(mailboxDir) && fs.readdirSync(mailboxDir).length > 0;\n if (!hasMessages) {\n this.sendMessage(parentId, fallbackMsg);\n }\n tui.log.error(`Subagent ${sub.Role} (${id}) failed.`);\n } else {\n this.updateSubagentSummary(id, 'Completed');\n // Print the subagent notification message to the parent console immediately\n const parentMsgs = this.peekMessages(parentId);\n const subagentMsg = parentMsgs.find(m => m.includes(`(${id})`));\n if (subagentMsg) {\n tui.log.message(`\\n${subagentMsg}`);\n } else {\n tui.log.success(`Subagent ${sub.Role} (${id}) completed successfully.`);\n }\n }\n\n if (parentQueue) {\n let summaryContent = \"Tarefa concluída sem resumo.\";\n let statusVal: 'completed' | 'failed' | 'cancelled' = success ? 'completed' : 'failed';\n if (isCancelled) {\n summaryContent = 'Terminated by parent agent.';\n statusVal = 'cancelled';\n } else if (success) {\n const parentMsgs = this.peekMessages(parentId);\n const subagentMsg = parentMsgs.find(m => m.includes(`(${id})`));\n if (subagentMsg) {\n summaryContent = subagentMsg;\n }\n } else {\n summaryContent = `Subagente falhou com código de saída ${exitCode}`;\n }\n parentQueue.push({\n type: 'subagent_notification',\n content: summaryContent,\n timestamp: Date.now(),\n metadata: {\n subagentId: id,\n role: sub.Role,\n status: statusVal\n }\n });\n }\n\n } catch (error) {\n console.error(`Subagent ${id} failed to spawn:`, error);\n this.terminateSubagent(id, false);\n const errorMsg = error instanceof Error ? error.message : 'Unknown error';\n this.sendMessage(\n parentId,\n `[Subagent Notification] Subagent ${sub.Role} (${id}) has finished with status: FAILED. Summary: Subagent spawn failed: ${errorMsg}`\n );\n tui.log.error(`Subagent ${sub.Role} (${id}) failed to spawn.`);\n if (parentQueue) {\n parentQueue.push({\n type: 'subagent_notification',\n content: `Subagente falhou ao iniciar: ${errorMsg}`,\n timestamp: Date.now(),\n metadata: {\n subagentId: id,\n role: sub.Role,\n status: 'failed'\n }\n });\n }\n }\n })();\n\n const state = this.subagents.get(id);\n if (state) {\n state.promise = promise;\n }\n\n invoked.push({ id, TypeName: sub.TypeName, Role: sub.Role });\n }\n\n return invoked;\n }\n}\n\nexport const subagentManager = new SubagentManager();\n","export interface QueueMessage {\n type: 'user' | 'subagent_notification' | 'timeout';\n content: string;\n timestamp: number;\n metadata?: {\n subagentId?: string;\n role?: string;\n status?: 'completed' | 'failed' | 'cancelled';\n };\n}\n\nexport class MessageQueue {\n private queue: QueueMessage[] = [];\n private pendingResolvers: ((value: QueueMessage) => void)[] = [];\n\n public push(message: QueueMessage): void {\n if (this.pendingResolvers.length > 0) {\n const resolve = this.pendingResolvers.shift()!;\n resolve(message);\n } else {\n this.queue.push(message);\n }\n }\n\n public async next(): Promise<QueueMessage> {\n if (this.queue.length > 0) {\n return this.queue.shift()!;\n }\n return new Promise<QueueMessage>((resolve) => {\n this.pendingResolvers.push(resolve);\n });\n }\n\n public isEmpty(): boolean {\n return this.queue.length === 0;\n }\n}\n","import { Command } from 'commander';\nimport { interactiveDeveloperAgent, DevelopmentResult } from '../core/agents/legacy-developer-agent.js';\nimport { TaskManager } from '../core/workflow/task-manager.js';\nimport { tui } from '../ui/tui.js';\nimport { colors } from '../ui/colors.js';\nimport { interactiveSpecificationAgent } from '../core/agents/specification-agent.js';\n\nexport const legacyCommand = new Command('legacy')\n .description('Starts the Legacy Developer Agent task orchestration loop')\n .option('-t, --task <type>', 'Initial task description (Quick Mode)')\n .option('-c, --context <path>', 'Path to custom context file')\n .action(async (options) => {\n const taskManager = new TaskManager(process.cwd());\n\n // 1. Check State\n let state = taskManager.analyzeSpecState();\n\n if (state.status === 'MISSING') {\n tui.log.warning('📋 No tech-spec.md found.');\n const confirm = await tui.confirm({ message: 'Create a new Specification (Tech Spec)?' });\n if (confirm) {\n // Handover to Spec Agent\n await interactiveSpecificationAgent({\n briefingPath: options.task ? undefined : undefined\n });\n // Re-analyze after spec agent returns\n state = taskManager.analyzeSpecState();\n if (state.status === 'MISSING') {\n tui.log.error('❌ Spec creation aborted or failed.');\n return;\n }\n } else {\n return;\n }\n }\n\n // 2. Orchestration Loop\n let keepOrchestrating = true;\n let burnMode = false; // \"Auto\" mode\n let contextHistory = \"\";\n\n tui.intro('🦈 Shark Legacy Orchestrator');\n\n while (keepOrchestrating) {\n state = taskManager.analyzeSpecState();\n\n if (state.status === 'COMPLETED') {\n tui.log.success('🎉 All tasks in tech-spec.md are COMPLETED!');\n const choice = await tui.select({\n message: 'What next?',\n options: [\n { value: 'exit', label: 'Exit' },\n { value: 'new_spec', label: 'New Specification (Reset)' }\n ]\n });\n if (choice === 'new_spec') {\n await interactiveSpecificationAgent();\n contextHistory = \"\"; // Reset history for new spec\n continue; // Loop again\n } else {\n keepOrchestrating = false;\n break;\n }\n }\n\n const currentTask = state.nextTask;\n if (!currentTask) {\n tui.log.error('Something went wrong. Status is not completed but no next task found.');\n break;\n }\n\n tui.log.info(`\\n👉 **NEXT TASK**: ${colors.bold(currentTask.description)}`);\n\n // Confirm Execution (unless Burn Mode)\n if (!burnMode) {\n const action = await tui.select({\n message: 'Orchestration Checkpoint:',\n options: [\n { value: 'execute', label: '🚀 Execute Task (Start)' },\n { value: 'burn', label: '🔥 Burn Mode (Auto-Execute Remaining)' },\n { value: 'pivot', label: '🔧 Pivot/Correct (Edit Spec)' },\n { value: 'skip', label: '⏭️ Skip Task (Mark Done without Executing)' },\n { value: 'stop', label: '🛑 Stop Session' }\n ]\n });\n\n if (action === 'stop') {\n keepOrchestrating = false;\n break;\n } else if (action === 'burn') {\n burnMode = true;\n } else if (action === 'skip') {\n taskManager.markTaskAsDone(currentTask.id);\n tui.log.info('Task skipped.');\n continue;\n } else if (action === 'pivot') {\n tui.log.info('Transferring control to Specification Agent...');\n await interactiveSpecificationAgent({\n initialContext: `User requested pivot after tasks:\\n${contextHistory}`\n });\n continue;\n }\n }\n\n // Execute Agent\n taskManager.markTaskInProgress(currentTask.id);\n\n tui.log.info(`⚡ Starting Micro-Context for Task: \"${currentTask.description}\"`);\n\n const result: DevelopmentResult = await interactiveDeveloperAgent({\n taskId: currentTask.id,\n taskInstruction: currentTask.description,\n history: contextHistory,\n context: options.context\n });\n\n if (result.success) {\n tui.log.success(`✅ Task Completed: ${currentTask.description}`);\n taskManager.markTaskAsDone(currentTask.id);\n contextHistory += `\\n[Task \"${currentTask.description}\" completed]: ${result.summary}`;\n } else {\n tui.log.error(`❌ Task Failed: ${result.summary}`);\n burnMode = false; // Stop burn mode on failure\n\n const recovery = await tui.select({\n message: 'Task Failed. Recovery Action:',\n options: [\n { value: 'retry', label: 'Retry (Run Agent Again)' },\n { value: 'pivot', label: 'Pivot (Adjust Spec/Instructions)' },\n { value: 'ignore', label: 'Ignore (Mark Done anyway)' },\n { value: 'stop', label: 'Stop' }\n ]\n });\n\n if (recovery === 'stop') break;\n if (recovery === 'ignore') taskManager.markTaskAsDone(currentTask.id);\n if (recovery === 'pivot') {\n await interactiveSpecificationAgent({\n initialContext: `Task \"${currentTask.description}\" FAILED.\\nError: ${result.summary}\\nHistory:\\n${contextHistory}`\n });\n }\n }\n }\n\n tui.outro('🦈 Legacy Orchestration Finished.');\n });\n","import { ProviderResolver } from '../api/provider-resolver.js';\nimport { AgentResponse } from './agent-response-parser.js';\nimport { conversationManager } from '../workflow/conversation-manager.js';\nimport { tui } from '../../ui/tui.js';\nimport { colors } from '../../ui/colors.js';\nimport { ConfigManager } from '../config-manager.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { FileLogger } from '../debug/file-logger.js';\nimport {\n handleListFiles,\n handleReadFile,\n handleSearchFile,\n startSmartReplace,\n replaceLineRange,\n handleRunCommand,\n astGrepSearch,\n astGrepRewrite,\n generateFilePreview,\n astListStructure,\n astAddMethod,\n astGetMethod,\n astAddClass,\n astGetProperty,\n astAddProperty,\n astRemoveProperty,\n astModifyMethod,\n astRemoveMethod,\n astAddDecorator,\n astAddInterface,\n astAddTypeAlias,\n astAddFunction,\n astRemoveFunction,\n astAddImport,\n astRemoveImport,\n astOrganizeImports,\n astModifyProperty\n} from './agent-tools.js';\nimport { t } from '../i18n/index.js';\n\nconst AGENT_TYPE = 'developer_agent';\n\n// Validation Functions\nasync function validateTypeScript(filePath: string): Promise<{ valid: boolean, error?: string }> {\n try {\n const result = await handleRunCommand(`npx tsc --noEmit --skipLibCheck ${filePath}`);\n if (result.trim() === '' || !result.includes('error TS')) {\n return { valid: true };\n }\n return { valid: false, error: result };\n } catch (e: any) {\n return { valid: false, error: e.message || 'TypeScript validation failed' };\n }\n}\n\nfunction validateHtmlTagBalance(filePath: string): { valid: boolean, error?: string } {\n const content = fs.readFileSync(filePath, 'utf-8');\n const stack: string[] = [];\n const tagRegex = /<\\/?(\\w+)(?:\\s[^>]*)?\\s*\\/?>/g;\n const selfClosingTags = ['br', 'hr', 'img', 'input', 'meta', 'link', 'area', 'base', 'col', 'embed', 'param', 'source', 'track', 'wbr'];\n\n let match;\n while ((match = tagRegex.exec(content)) !== null) {\n const fullTag = match[0];\n const tagName = match[1].toLowerCase();\n\n if (fullTag.startsWith('</')) {\n const expected = stack.pop();\n if (expected !== tagName) {\n return {\n valid: false,\n error: `Tag mismatch: expected </${expected}> but found </${tagName}> at position ${match.index}`\n };\n }\n } else if (!fullTag.endsWith('/>') && !selfClosingTags.includes(tagName)) {\n stack.push(tagName);\n }\n }\n\n if (stack.length > 0) {\n return { valid: false, error: `Unclosed tags: <${stack.join('>, <')}>` };\n }\n\n return { valid: true };\n}\n\n// Helper to get effective Agent ID\nfunction getAgentId(overrideId?: string): string {\n if (overrideId) return overrideId;\n\n // Check Config\n const config = ConfigManager.getInstance().getConfig();\n if (config.agents?.dev) return config.agents.dev;\n\n // Check Env\n if (process.env.STACKSPOT_DEV_AGENT_ID) return process.env.STACKSPOT_DEV_AGENT_ID;\n\n // Default\n return '01KEQCGJ65YENRA4QBXVN1YFFX';\n}\n\nfunction getAgentVersion(overrideVersion?: string): string | undefined {\n if (overrideVersion) return overrideVersion;\n\n // Check Config\n const config: any = ConfigManager.getInstance().getConfig();\n if (config.agentVersions?.dev) return config.agentVersions.dev;\n\n // Check Env\n if (process.env.STACKSPOT_DEV_AGENT_VERSION) return process.env.STACKSPOT_DEV_AGENT_VERSION;\n\n return undefined;\n}\n\ninterface SpecState {\n status: 'MISSING' | 'PENDING' | 'COMPLETED';\n nextTask?: string;\n specContent?: string;\n}\n\nfunction analyzeSpecState(projectRoot: string): SpecState {\n const specPath = path.resolve(projectRoot, '_sharkrc', 'tech-spec.md');\n if (!fs.existsSync(specPath)) {\n return { status: 'MISSING' };\n }\n\n const content = fs.readFileSync(specPath, 'utf-8');\n // Regex for unchecked task: - [ ] Task description\n // Capture the line content - simple regex, can be improved for nested lists if needed\n const match = content.match(/- \\[ \\] (.*)/);\n\n if (match) {\n return { status: 'PENDING', nextTask: match[1].trim(), specContent: content };\n }\n\n return { status: 'COMPLETED', specContent: content };\n}\n\nfunction buildSystemPrompt(state: SpecState, contextContent: string, additionalInstructions: string = ''): string {\n let basePrompt = ``;\n\n if (contextContent) {\n basePrompt += `\\n\\n--- PROJECT CONTEXT ---\\n${contextContent}\\n-----------------------\\n`;\n }\n\n if (state.status === 'MISSING') {\n basePrompt += `\\n\\n🚨 CRITICAL: NO 'tech-spec.md' FOUND.\\n\nYour FIRST priority is to analyze the user request and CREATE a 'tech-spec.md' file.\n\n⚠️ WORKFLOW:\n1. **Understand**: Clarify the goal with the user if needed.\n2. **Explore**: Use 'list_files'/'read_file' to find RELEVANT files for this specific task.\n3. **Specify**: Create 'tech-spec.md' referencing REAL file paths you found.\n\nDO NOT create a spec based on guesses. Verify file existence before writing the plan.\n\nStructure for 'tech-spec.md':\n\\`\\`\\`markdown\n# Technical Spec: [Title]\n\n## Goal\n[Brief description]\n\n## Implementation Plan\n- [ ] Step 1: [Description]\n- [ ] Step 2: [Description]\n...\n\\`\\`\\`\nUser Request: \"${additionalInstructions}\"\n`;\n } else if (state.status === 'PENDING') {\n basePrompt += `\\n\\n🟢 EXECUTION MODE\\n\nUse 'tech-spec.md' as your source of truth.\n\\n👉 **CURRENT TASK**: \"${state.nextTask}\"\n\\n\nFocus ONLY on this task. Do not jump ahead.\n1. Implement the necessary changes.\n2. Verify (compile/test).\n3. **MANDATORY**: Use 'modify_file' to mark this task as '[x]' in 'tech-spec.md' when done.\n`;\n } else {\n basePrompt += `\\n\\n✨ ALL TASKS COMPLETED according to 'tech-spec.md'.\\n\nAsk the user if they want to add more tasks or finish the session.\n`;\n }\n\n return basePrompt;\n}\n\n\nexport interface DevelopmentResult {\n success: boolean;\n summary: string;\n}\n\nexport async function interactiveDeveloperAgent(options: {\n taskId?: string,\n taskInstruction?: string,\n context?: string,\n history?: string\n} = {}): Promise<DevelopmentResult> {\n FileLogger.init();\n // tui.intro('🦈 Shark Dev Agent (Scoped)'); // Reduced verbosity for orchestration loop\n\n const agentId = getAgentId();\n\n if (agentId === 'PENDING_CONFIGURATION') {\n tui.log.error('❌ STACKSPOT_DEV_AGENT_ID not configured in .env');\n return { success: false, summary: \"Missing configuration.\" };\n }\n\n // 1. Load Context\n const projectRoot = process.cwd();\n let contextContent = '';\n const defaultContextPath = path.resolve(projectRoot, '_sharkrc', 'project-context.md');\n // If orchestrator passes the summary of previous tasks, we append it to context\n const specificContextPath = options.context ? path.resolve(projectRoot, options.context) : defaultContextPath;\n\n if (fs.existsSync(specificContextPath)) {\n try {\n contextContent = fs.readFileSync(specificContextPath, 'utf-8');\n // tui.log.info(`📘 Context loaded from: ${colors.dim(path.relative(projectRoot, specificContextPath))}`);\n } catch (e) {\n tui.log.warning(`Failed to read context file: ${e}`);\n }\n }\n\n // 2. Build Scoped Prompt\n // Note: We are NOT calling analyzeSpecState here anymore. The Orchestrator tells us WHAT to do.\n const currentTask = options.taskInstruction || \"Analyze the project and fix pending issues.\";\n\n let basePrompt = ``;\n if (contextContent) {\n basePrompt += `\\n\\n--- PROJECT CONTEXT ---\\n${contextContent}\\n-----------------------\\n`;\n }\n\n // Inject History from previous turns (Orchestrator Responsibility)\n if (options.history) {\n basePrompt += `\\n\\n--- PREVIOUS EXECUTION SUMMARY ---\\n${options.history}\\n----------------------------------\\n`;\n }\n\n basePrompt += `\\n\\n🟢 EXECUTION MODE\\n\nYou are a highly skilled Developer Agent.\n👉 **CURRENT TASK**: \"${currentTask}\"\n\nYour goal is to COMPLETE this specific task and then STOP.\n1. Implement the necessary changes.\n2. Verify (compile/test).\n3. **MANDATORY**: When you are confident the task is done, output a final message starting with \"TASK_COMPLETED:\" followed by a brief technical summary of what you did.\n`;\n\n let nextPrompt = basePrompt;\n\n // 3. Main Loop\n let keepGoing = true;\n const spinner = tui.spinner();\n let finalSummary = \"\";\n let isTaskCompleted = false;\n\n // Force NEW Conversation ID for Statelessness\n // We update the conversation manager to a random ID or based on TaskID\n // To ensure we don't pollute the global 'developer_agent' state if we want true statelessness.\n // Ideally, we pass a specific conversation ID Key.\n const conversationKey = options.taskId ? `dev_agent_${options.taskId}` : `dev_agent_${Date.now()}`;\n // Resetting for safety if repeated calls\n // await conversationManager.saveConversationId(conversationKey, \"\"); \n\n // Auto-Approval State\n let autoApprovals = {\n files: false,\n commands: false\n };\n\n while (keepGoing) {\n try {\n spinner.start('🦈 Shark Dev working...');\n\n // Call API\n const lastResponse = await callDevAgentApi(nextPrompt, (chunk) => {\n // Optional: Stream text\n }, conversationKey);\n\n spinner.stop('Response received');\n\n if (lastResponse) {\n const response = lastResponse;\n const actions = response.actions || []; // Should be array by schema, but safe fallback\n\n // Check Global Message first (e.g. Completion or Failure)\n if (response.message && response.message.includes('TASK_COMPLETED:')) {\n isTaskCompleted = true;\n finalSummary = response.message.split('TASK_COMPLETED:')[1].trim();\n // We continue to process actions if any, but stop loop after\n keepGoing = false;\n }\n\n // Check for explicit task failure signal from agent\n if (response.message && response.message.includes('TASK_FAILED:')) {\n const failureReason = response.message.split('TASK_FAILED:')[1].trim();\n tui.log.error(`❌ Agent reported task failure: ${failureReason}`);\n return { success: false, summary: failureReason };\n }\n\n // If we have just a message and NO actions (or empty actions), treat as talk\n if (actions.length === 0 && response.message && !isTaskCompleted) {\n tui.log.info(colors.primary('🤖 Shark Dev:'));\n console.log(response.message);\n const userReply = await tui.text({ message: 'Your answer:' });\n if (tui.isCancel(userReply)) { keepGoing = false; break; }\n nextPrompt = userReply as string;\n }\n\n let executionResults = \"\";\n let waitingForUser = false;\n\n for (const action of actions) {\n\n // ... (Existing Tool Handling Logic - reusing almost 1:1, just cleaner logging) ...\n // [Optimization: I will minimize the copy-paste here by keeping the core logic but ensuring it writes to executionResults]\n\n if (action.type === 'talk_with_user') {\n tui.log.info(colors.primary('🤖 Shark Dev:'));\n console.log(action.content);\n // If agent talks, we might need input. \n // In stateless mode, if it asks a question, we might bubble it up?\n // For now, let's keep the TUI interaction valid.\n if (!isTaskCompleted) waitingForUser = true;\n }\n\n // ... (Include all tool handlers from original code: list_files, read_file, run_command, modify_file, ast_*, etc.) ...\n // To avoid a massive edit block that might break, I will assume the original tool handlers logic is robust.\n // I will reinject strictly the necessary parts. \n // [Developer Note: For the sake of this edit, I have to replicate the tool logic to ensure the function works. \n // I'll condense the logging.]\n\n else if (action.type === 'list_files') {\n tui.log.info(`📂 Scanning: ${colors.dim(action.path || '.')}`);\n const result = handleListFiles(action.path || '.');\n executionResults += `[Action list_files(${action.path}) Result]:\\n${result}\\n\\n`;\n }\n else if (action.type === 'read_file') {\n tui.log.info(`📖 Reading: ${colors.dim(action.path || '')}`);\n const result = handleReadFile(action.path || '');\n executionResults += `[Action read_file(${action.path}) Result]:\\n${result}\\n\\n`;\n }\n else if (action.type === 'search_file') {\n const result = handleSearchFile(action.path || '');\n executionResults += `[Action search_file(${action.path}) Result]:\\n${result}\\n\\n`;\n }\n else if (action.type === 'run_command') {\n const cmd = action.command || '';\n tui.log.info(`💻 Executing: ${colors.dim(cmd)}`);\n // Auto-approval logic reuse\n let approved = autoApprovals.commands;\n if (!approved) {\n const choice = await tui.select({\n message: `Execute: ${cmd}?`,\n options: [{ value: 'yes', label: 'Yes' }, { value: 'always', label: 'Yes (Auto-Approve Session)' }, { value: 'no', label: 'No' }]\n });\n if (choice === 'always') { autoApprovals.commands = true; approved = true; }\n else if (choice === 'yes') approved = true;\n }\n if (approved) {\n const result = await handleRunCommand(cmd);\n executionResults += `[Action run_command(${cmd}) Result]:\\n${result}\\n\\n`;\n } else {\n executionResults += `[Action run_command]: User blocked execution.\\n\\n`;\n }\n }\n else if (['create_file', 'modify_file'].includes(action.type)) {\n const filePath = action.path || '';\n tui.log.warning(`📝 ${action.type === 'create_file' ? 'CREATE' : 'MODIFY'}: ${colors.bold(filePath)}`);\n\n let approved = autoApprovals.files;\n if (!approved) {\n const choice = await tui.select({\n message: `Approve changes to ${filePath}?`,\n options: [{ value: 'yes', label: 'Yes' }, { value: 'always', label: 'Yes (Auto-Approve Session)' }, { value: 'no', label: 'No' }]\n });\n if (choice === 'always') { autoApprovals.files = true; approved = true; }\n else if (choice === 'yes') approved = true;\n }\n\n if (approved) {\n // ... (Perform Write) ...\n if (action.type === 'create_file') {\n // Simple Create Logic\n const dir = path.dirname(path.resolve(projectRoot, filePath));\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.resolve(projectRoot, filePath), action.content || '', 'utf-8');\n executionResults += `[Action create_file]: Success\\n\\n`;\n } else {\n // Modify Logic\n let success = false;\n if (action.line_range) success = replaceLineRange(filePath, action.line_range[0], action.line_range[1], action.content || '', tui);\n else if (action.target_content) success = startSmartReplace(filePath, action.content || '', action.target_content, tui);\n\n executionResults += success ? `[Action modify_file]: Success\\n\\n` : `[Action modify_file]: Failed\\n\\n`;\n }\n // Validation hooks can be re-added here similar to original\n const val = await validateTypeScript(path.resolve(projectRoot, filePath));\n if (!val.valid) executionResults += `[Validation Failed]: ${val.error}\\n\\n`;\n } else {\n executionResults += `[Action ${action.type}]: User Denied.\\n\\n`;\n }\n }\n // ... (AST Actions would follow similar pattern) ...\n else if (action.type.startsWith('ast_')) {\n try {\n // AST Tools Mapping (Async)\n let result = '';\n if (action.type === 'ast_list_structure') {\n result = await astListStructure(action.path || '');\n }\n else if (action.type === 'ast_get_method') {\n result = await astGetMethod(action.path || '', action.class_name || '', action.method_name || '');\n }\n else if (action.type === 'ast_add_method') {\n const success = await astAddMethod(action.path || '', action.class_name || '', action.method_code || '');\n result = success ? 'Method added successfully.' : 'Failed to add method.';\n }\n else if (action.type === 'ast_modify_method') {\n const success = await astModifyMethod(action.path || '', action.class_name || '', action.method_name || '', action.new_body || '');\n result = success ? 'Method modified successfully.' : 'Failed to modify method.';\n }\n else if (action.type === 'ast_remove_method') {\n const success = await astRemoveMethod(action.path || '', action.class_name || '', action.method_name || '');\n result = success ? 'Method removed successfully.' : 'Failed to remove method.';\n }\n else if (action.type === 'ast_add_class') {\n const success = await astAddClass(action.path || '', action.class_name || '', action.extends_class || undefined, action.implements_interfaces || undefined);\n result = success ? 'Class added successfully.' : 'Failed to add class.';\n }\n else if (action.type === 'ast_get_property') {\n tui.log.info(`🔍 Reading property ${colors.gray(action.property_name || '')} in ${colors.gray(action.class_name || '')}`);\n const propContent = await astGetProperty(action.path || '', action.class_name || '', action.property_name || '');\n result = `[AST Get Property] Content:\\n${propContent}`;\n }\n else if (action.type === 'ast_add_property') {\n const success = await astAddProperty(action.path || '', action.class_name || '', action.property_code || '');\n result = success ? 'Property added successfully.' : 'Failed to add property.';\n }\n else if (action.type === 'ast_modify_property') {\n tui.log.info(`✏️ Modifying property ${colors.gray(action.property_name || '')} in ${colors.gray(action.class_name || '')}`);\n // Note: property_code here is the NEW full property definition\n const success = await astModifyProperty(action.path || '', action.class_name || '', action.property_name || '', action.property_code || '');\n result = success ? 'Property modified successfully.' : 'Failed to modify property.';\n }\n else if (action.type === 'ast_remove_property') {\n const success = await astRemoveProperty(action.path || '', action.class_name || '', action.property_name || '');\n result = success ? 'Property removed successfully.' : 'Failed to remove property.';\n }\n else if (action.type === 'ast_add_decorator') {\n // Tool only supports class decorators for now\n const success = await astAddDecorator(action.path || '', action.class_name || '', action.decorator_code || '');\n result = success ? 'Decorator added successfully.' : 'Failed to add decorator.';\n }\n else if (action.type === 'ast_add_interface') {\n const success = await astAddInterface(action.path || '', action.interface_code || '');\n result = success ? 'Interface added successfully.' : 'Failed to add interface.';\n }\n else if (action.type === 'ast_add_type_alias') {\n const success = await astAddTypeAlias(action.path || '', action.type_code || '');\n result = success ? 'Type alias added successfully.' : 'Failed to add type alias.';\n }\n else if (action.type === 'ast_add_function') {\n const success = await astAddFunction(action.path || '', action.function_code || '');\n result = success ? 'Function added successfully.' : 'Failed to add function.';\n }\n else if (action.type === 'ast_remove_function') {\n const success = await astRemoveFunction(action.path || '', action.function_name || '');\n result = success ? 'Function removed successfully.' : 'Failed to remove function.';\n }\n else if (action.type === 'ast_add_import') {\n const success = await astAddImport(action.path || '', action.import_statement || '');\n result = success ? 'Import added successfully.' : 'Failed to add import.';\n }\n else if (action.type === 'ast_remove_import') {\n const success = await astRemoveImport(action.path || '', action.module_path || '');\n result = success ? 'Import removed successfully.' : 'Failed to remove import.';\n }\n else if (action.type === 'ast_organize_imports') {\n const success = await astOrganizeImports(action.path || '');\n result = success ? 'Imports organized successfully.' : 'Failed to organize imports.';\n }\n else {\n result = `Unknown AST action: ${action.type}`;\n }\n\n executionResults += `[Action ${action.type} Result]:\\n${result}\\n\\n`;\n tui.log.info(`⚡ AST Action ${colors.dim(action.type)}: ${result}`);\n\n } catch (e: any) {\n executionResults += `[Action ${action.type} Failed]: ${e.message}\\n\\n`;\n tui.log.error(`❌ AST Action Error: ${e.message}`);\n }\n }\n else if (action.type === 'search_ast') {\n const result = await astGrepSearch(action.pattern || '', action.path || '', action.language || 'typescript', tui);\n executionResults += `[Action search_ast Result]:\\n${result}\\n\\n`;\n }\n else if (action.type === 'modify_ast') {\n const success = await astGrepRewrite(action.pattern || '', action.fix || '', action.path || '', action.language || 'typescript', tui);\n executionResults += success ? `[Action modify_ast]: Success\\n\\n` : `[Action modify_ast]: Failed\\n\\n`;\n }\n } // End Action Loop\n\n // Determine Next Prompt\n if (executionResults) {\n if (waitingForUser) {\n const userReply = await tui.text({ message: 'Your answer:' });\n if (tui.isCancel(userReply)) { keepGoing = false; break; }\n nextPrompt = `${executionResults}\\nUser Reply: ${userReply}`;\n } else {\n nextPrompt = `${executionResults}\\n[System]: Continue execution. If finished, output \"TASK_COMPLETED: summary\".`;\n tui.log.info(colors.dim('Processing results...'));\n }\n } else if (!keepGoing) {\n // Task completed or stopped\n } else if (waitingForUser) {\n // handled above in message fallback\n } else {\n if (!isTaskCompleted && actions.length > 0) nextPrompt = \"Please continue.\";\n }\n\n } else {\n tui.log.warning('No response received from agent.');\n }\n\n } catch (e: any) {\n tui.log.error(e.message);\n keepGoing = false;\n return { success: false, summary: `Error: ${e.message}` };\n }\n }\n\n tui.log.success('✅ Task Scope Completed');\n return { success: true, summary: finalSummary || \"Task completed without summary.\" };\n}\n\n// Helper to support key-based conversation\nasync function callDevAgentApi(prompt: string, onChunk: (chunk: string) => void, conversationKey: string = AGENT_TYPE): Promise<AgentResponse> {\n const existingConversationId = await conversationManager.getConversationId(conversationKey);\n\n const provider = ProviderResolver.getProvider('developer_agent');\n\n const parsedResponse = await provider.streamChat(prompt, {\n conversationId: existingConversationId,\n agentType: 'developer_agent',\n onChunk\n });\n\n if (parsedResponse.conversation_id) {\n await conversationManager.saveConversationId(conversationKey, parsedResponse.conversation_id);\n }\n\n return parsedResponse;\n}\n","\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface SpecTask {\n id: string; // generated based on index (e.g., \"task-1\")\n description: string;\n status: 'PENDING' | 'IN_PROGRESS' | 'COMPLETED';\n line_number: number; // 0-based line index in the file\n}\n\nexport interface SpecState {\n status: 'MISSING' | 'PENDING' | 'COMPLETED';\n nextTask?: SpecTask;\n allTasks: SpecTask[];\n}\n\nexport class TaskManager {\n private projectRoot: string;\n private specPath: string;\n\n constructor(projectRoot: string = process.cwd()) {\n this.projectRoot = projectRoot;\n this.specPath = path.resolve(this.projectRoot, '_sharkrc', 'tech-spec.md');\n }\n\n /**\n * Reads the tech-spec.md file and analyzes its current state.\n */\n public analyzeSpecState(): SpecState {\n if (!fs.existsSync(this.specPath)) {\n return { status: 'MISSING', allTasks: [] };\n }\n\n const content = fs.readFileSync(this.specPath, 'utf-8');\n const lines = content.split('\\n');\n const tasks: SpecTask[] = [];\n\n let taskIndex = 1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n const pendingMatch = trimmed.match(/^- \\[ \\] (.*)/);\n const completedMatch = trimmed.match(/^- \\[x\\] (.*)/i);\n const progressMatch = trimmed.match(/^- \\[\\/\\] (.*)/);\n\n let currentTask: SpecTask | null = null;\n let status: 'PENDING' | 'IN_PROGRESS' | 'COMPLETED' | null = null;\n let description = '';\n\n if (pendingMatch) {\n description = pendingMatch[1].trim();\n status = 'PENDING';\n } else if (completedMatch) {\n description = completedMatch[1].trim();\n status = 'COMPLETED';\n } else if (progressMatch) {\n description = progressMatch[1].trim();\n status = 'IN_PROGRESS';\n }\n\n if (status && description) {\n // Look ahead for sub-bullets or details\n let j = i + 1;\n while (j < lines.length) {\n const nextLine = lines[j];\n const nextTrimmed = nextLine.trim();\n // Stop if next line is empty, a new task, or a new section\n if (!nextTrimmed || nextTrimmed.match(/^- \\[[ x\\/]\\]/) || nextTrimmed.startsWith('#')) {\n break;\n }\n description += '\\n' + nextTrimmed;\n j++;\n }\n\n currentTask = {\n id: `task-${taskIndex++}`,\n description: description,\n status: status,\n line_number: i\n };\n tasks.push(currentTask);\n }\n }\n\n // Determine next actionable task\n // Priority: IN_PROGRESS -> First PENDING\n let nextTask = tasks.find(t => t.status === 'IN_PROGRESS');\n if (!nextTask) {\n nextTask = tasks.find(t => t.status === 'PENDING');\n }\n\n const status = (!nextTask && tasks.length > 0 && tasks.every(t => t.status === 'COMPLETED'))\n ? 'COMPLETED'\n : 'PENDING';\n\n return {\n status: tasks.length === 0 ? 'MISSING' : status, // Empty file is effectively \"pending creation\" but we treat as missing content logic elsewhere\n nextTask,\n allTasks: tasks\n };\n }\n\n /**\n * Marks a specific task as COMPLETED in the file.\n * Uses line-based replacement to be safe.\n */\n public markTaskAsDone(taskId: string): boolean {\n const state = this.analyzeSpecState();\n const task = state.allTasks.find(t => t.id === taskId);\n\n if (!task) {\n console.error(`Task ${taskId} not found.`);\n return false;\n }\n\n const content = fs.readFileSync(this.specPath, 'utf-8');\n const lines = content.split('\\n');\n\n // Verify line content hasn't drifted (sanity check)\n const targetLine = lines[task.line_number];\n if (!targetLine.includes(task.description)) {\n console.error(`Concurrency Error: Task line content mistmatch. Expected \"${task.description}\" at line ${task.line_number}.`);\n // Fallback: search for the task description again\n // This is simple recovery, in a real DB we'd use IDs.\n return false;\n }\n\n // Replace [ ], [/] with [x]\n const newLine = targetLine\n .replace('- [ ]', '- [x]')\n .replace('- [/]', '- [x]');\n\n lines[task.line_number] = newLine;\n\n fs.writeFileSync(this.specPath, lines.join('\\n'), 'utf-8');\n return true;\n }\n\n /**\n * Marks a task as IN_PROGRESS.\n */\n public markTaskInProgress(taskId: string): boolean {\n const state = this.analyzeSpecState();\n const task = state.allTasks.find(t => t.id === taskId);\n\n if (!task) return false;\n\n const content = fs.readFileSync(this.specPath, 'utf-8');\n const lines = content.split('\\n');\n\n let targetLine = lines[task.line_number];\n\n // Replace [ ] with [/]\n targetLine = targetLine.replace('- [ ]', '- [/]');\n\n lines[task.line_number] = targetLine;\n fs.writeFileSync(this.specPath, lines.join('\\n'), 'utf-8');\n return true;\n }\n\n /**\n * Completely updates the spec file content (used by Spec Agent).\n */\n public updateSpecContent(newContent: string): void {\n fs.writeFileSync(this.specPath, newContent, 'utf-8');\n }\n\n public getSpecPath(): string {\n return this.specPath;\n }\n}\n","\nimport { parseAgentResponse, AgentResponse } from './agent-response-parser.js';\nimport { conversationManager } from '../workflow/conversation-manager.js';\nimport { ProviderResolver } from '../api/provider-resolver.js';\nimport { tui } from '../../ui/tui.js';\nimport { colors } from '../../ui/colors.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { FileLogger } from '../debug/file-logger.js';\nimport { handleListFiles, handleReadFile, handleSearchFile, handleSearchCode, startSmartReplace } from './agent-tools.js';\nimport { ConfigManager } from '../config-manager.js';\n\nconst AGENT_TYPE = 'specification_agent';\n\nfunction getAgentId(overrideId?: string): string {\n if (overrideId) return overrideId;\n const config = ConfigManager.getInstance().getConfig();\n if (config.agents?.spec) return config.agents.spec;\n return process.env.STACKSPOT_SPEC_AGENT_ID || '01KEPXTX37FTB4N672TZST4SGP';\n}\n\nfunction getAgentVersion(overrideVersion?: string): string | undefined {\n if (overrideVersion) return overrideVersion;\n const config: any = ConfigManager.getInstance().getConfig();\n if (config.agentVersions?.spec) return config.agentVersions.spec;\n return process.env.STACKSPOT_SPEC_AGENT_VERSION;\n}\n\nexport interface SpecAgentOptions {\n agentId?: string;\n briefingPath?: string; // Path to the briefing file to read, explicit override\n initialContext?: string; // Handover context from Dev Agent or Orchestrator\n}\n\n/**\n * Interactive Specification Agent session.\n * Uses a Template-Based Incremental Workflow.\n */\nexport async function interactiveSpecificationAgent(options: SpecAgentOptions = {}): Promise<void> {\n FileLogger.init();\n tui.intro('🏗️ Specification Agent (Template-Based)');\n\n const projectRoot = process.cwd();\n // User requested to store tech-spec.md in _sharkrc\n const sharkRcDir = path.resolve(projectRoot, '_sharkrc');\n if (!fs.existsSync(sharkRcDir)) fs.mkdirSync(sharkRcDir, { recursive: true });\n\n const outputFile = path.resolve(sharkRcDir, 'tech-spec.md');\n\n // 1. Ensure Template Exists (Inline Template)\n if (!fs.existsSync(outputFile)) {\n // Hardcoded template as requested, similar to scan-agent.ts\n let initialContent = `# Technical Specification: {{PROJECT_NAME}}\n\n## 1. Technology Stack\n[TO BE ANALYZED - STACK]\n- Language: [e.g. TypeScript]\n- Framework: [e.g. Node.js / React]\n- Database: [e.g. SQLite / PostgreSQL]\n- Key Libraries: [Top 5 dependencies]\n\n## 2. Architecture Overview\n[TO BE ANALYZED - ARCHITECTURE]\n[Brief description of architectural pattern]\n\n## 3. Data Model\n[TO BE ANALYZED - DATA MODEL]\n[Schema/ERD definitions]\n\n## 4. API / Interface Contracts\n[TO BE ANALYZED - API]\n[Main endpoints or CLI commands]\n\n## 5. Implementation Steps\n[TO BE FILLED - MUST BE CHECKBOXES]\n`;\n\n // Replace basic placeholders immediately\n const projectName = path.basename(projectRoot);\n initialContent = initialContent.replace(/{{PROJECT_NAME}}/g, projectName);\n\n const BOM = '\\uFEFF';\n fs.writeFileSync(outputFile, BOM + initialContent, { encoding: 'utf-8' });\n tui.log.success(`✅ Created: ${colors.bold('_sharkrc/tech-spec.md')}`);\n } else {\n tui.log.info(`📄 Using existing ${colors.bold('_sharkrc/tech-spec.md')}`);\n }\n\n // 2. Load Inputs (Context, Briefing)\n let contextContent = '';\n const contextPath = path.resolve(projectRoot, '_sharkrc', 'project-context.md');\n if (fs.existsSync(contextPath)) {\n contextContent = fs.readFileSync(contextPath, 'utf-8');\n tui.log.info(`📘 Context loaded.`);\n }\n\n let briefingContent = '';\n if (options.briefingPath && fs.existsSync(options.briefingPath)) {\n briefingContent = fs.readFileSync(options.briefingPath, 'utf-8');\n tui.log.info(`📄 Briefing loaded from: ${colors.dim(options.briefingPath)}`);\n } else {\n const standardBriefing = path.resolve(projectRoot, '_sharkrc', 'briefing.md');\n if (fs.existsSync(standardBriefing)) {\n briefingContent = fs.readFileSync(standardBriefing, 'utf-8');\n tui.log.info(`📄 Briefing loaded.`);\n }\n }\n\n // 3. Construct Super Prompt\n let initialPrompt = `\nVocê é o **Shark Spec**, um Arquiteto de Software Sênior e Tech Lead.\nSeu objetivo final é produzir uma especificação técnica precisa para a tarefa no arquivo \\`_sharkrc/tech-spec.md\\`.\n\n⚠️ O SEU WORKFLOW É GUIADO POR FASES.\nNÃO TENTE ADIANTAR O TRABALHO (ex: investigar código ou preencher template agora).\n\n**VOCÊ ESTÁ NA FASE 1: ENTENDIMENTO DA TAREFA**\n- Use \\`talk_with_user\\` para perguntar ao usuário qual tarefa específica, funcionalidade ou bug ele precisa especificar.\n- Confirme o escopo e os limites com o usuário.\n- Se o escopo estiver perfeitamente claro e confirmado (com o usuário), emita \"PHASE_COMPLETED\" no campo \"summary\" do JSON para avançar.\n\nIMPORTANTE: Toda a sua comunicação DEVE ser em Português.\n`;\n\n if (briefingContent) {\n initialPrompt += `\nℹ️ Um documento de briefing foi encontrado. Ele define parcialmente a tarefa para a Fase 1.\nConfirme seu entendimento com o usuário via \\`talk_with_user\\` antes de prosseguir para a Fase 2.\n\n--- BRIEFING ---\n${briefingContent}\n----------------\n`;\n } else {\n initialPrompt += `\nℹ️ Nenhum documento de briefing foi encontrado. Inicie a Fase 1 imediatamente: use \\`talk_with_user\\` para perguntar ao usuário o que precisa ser especificado.\n`;\n }\n\n if (options.initialContext) {\n initialPrompt += `\\n--- CONTEXTO DE EXECUÇÃO ANTERIOR (HANDOVER/FEEDBACK) ---\\n${options.initialContext}\\n-----------------------------------------------------\\n`;\n }\n\n if (contextContent) {\n initialPrompt += `\nℹ️ O contexto do projeto está disponível para referência. Use-o na Fase 2 para se alinhar com os padrões de arquitetura existentes, mas NÃO o use para preencher as seções de forma genérica.\n\n--- PROJECT CONTEXT ---\n${contextContent}\n-----------------------\n`;\n }\n\n // 4. Start Loop\n await runSpecLoop(initialPrompt.trim(), outputFile, options.agentId);\n}\n\n/**\n * Main Loop for Specification Agent (Incremental)\n */\nasync function runSpecLoop(initialMessage: string, targetPath: string, overrideAgentId?: string) {\n let nextPrompt = initialMessage;\n let keepGoing = true;\n let stepCount = 0;\n let currentPhase = 1;\n const MAX_STEPS = 30;\n\n while (keepGoing && stepCount < MAX_STEPS) {\n stepCount++;\n const spinner = tui.spinner();\n spinner.start(`🏗️ Spec Agent working (Step ${stepCount}/${MAX_STEPS})...`);\n\n // Check Pending Sections to guide the agent\n let pendingSections = [];\n if (fs.existsSync(targetPath)) {\n const content = fs.readFileSync(targetPath, 'utf-8');\n if (content.includes('[TO BE ANALYZED]')) pendingSections.push('Analysis Sections (Stack, Arch, Data, API)');\n if (content.includes('[TO BE FILLED')) pendingSections.push('Implementation Steps');\n }\n\n if (pendingSections.length === 0 && stepCount > 1) {\n // Check if user is done?\n }\n\n let responseText = '';\n let lastResponse: AgentResponse | null = null;\n\n try {\n lastResponse = await callSpecAgentApi(nextPrompt, (chunk) => {\n responseText += chunk;\n }, overrideAgentId);\n\n spinner.stop('Response received');\n\n if (lastResponse && lastResponse.actions) {\n let executionResults = \"\";\n let waitingForUser = false;\n let specUpdated = false;\n let hasSystemError = false;\n let systemErrorContent = \"\";\n\n for (const action of lastResponse.actions) {\n if (action.type === 'talk_with_user') {\n const isSystemError = action.content?.startsWith('[SYSTEM ERROR]');\n if (isSystemError) {\n tui.log.error(`⚠️ Detectado erro na resposta do Agente (truncado ou inválido).`);\n tui.log.info(colors.dim(action.content || ''));\n const approved = await tui.confirm({ message: `Enviar notificação de erro para o agente tentar se recuperar automaticamente?` });\n if (approved) {\n hasSystemError = true;\n systemErrorContent = action.content || '';\n } else {\n const userReply = await tui.text({ message: 'Seu prompt alternativo para o agente:' });\n if (tui.isCancel(userReply)) { keepGoing = false; return; }\n hasSystemError = true;\n systemErrorContent = userReply as string;\n }\n } else {\n tui.log.info(colors.primary('🤖 Architect:'));\n console.log(action.content);\n waitingForUser = true;\n }\n }\n\n else if (action.type === 'list_files') {\n tui.log.info(`📂 Scanning: ${colors.dim(action.path || '.')}`);\n const result = handleListFiles(action.path || '.');\n executionResults += `[Action list_files(${action.path}) Result]:\\n${result}\\n\\n`;\n }\n\n else if (action.type === 'read_file') {\n tui.log.info(`📖 Reading: ${colors.dim(action.path || '')}`);\n const result = handleReadFile(action.path || '');\n executionResults += `[Action read_file(${action.path}) Result]:\\n${result}\\n\\n`;\n }\n\n else if (action.type === 'search_file') {\n tui.log.info(`🔍 Searching: ${colors.dim(action.path || '')}`);\n const result = handleSearchFile(action.path || '');\n executionResults += `[Action search_file(${action.path}) Result]:\\n${result}\\n\\n`;\n }\n\n else if (action.type === 'search_code') {\n const glob = action.path || 'src/**/*';\n const query = action.query || '';\n const isRegex = action.is_regex === true;\n tui.log.info(`🔎 Search code: ${colors.dim(`\"${query}\" in ${glob}`)}`);\n const result = handleSearchCode(glob, query, isRegex);\n executionResults += `[Action search_code(\"${query}\" in \"${glob}\") Result]:\\n${result}\\n\\n`;\n }\n\n else if (['create_file', 'modify_file'].includes(action.type)) {\n // Target Validation & Redirection\n let actionPath = path.resolve(action.path || '');\n const resolvedTargetPath = path.resolve(targetPath);\n let isTarget = actionPath === resolvedTargetPath;\n\n // Auto-redirect if agent tries to write to root tech-spec.md instead of _sharkrc\n if (!isTarget && path.basename(actionPath) === 'tech-spec.md') {\n tui.log.warning(`Redirecting ${action.type} from ${action.path} to ${path.relative(process.cwd(), targetPath)}`);\n action.path = targetPath;\n actionPath = resolvedTargetPath;\n isTarget = true;\n }\n\n if (!isTarget && action.type === 'create_file') {\n const confirm = await tui.confirm({ message: `Agent wants to create ${action.path}. Allow?` });\n if (!confirm) {\n executionResults += `[Action create_file]: User denied.\\n`;\n continue;\n }\n }\n\n try {\n if (action.type === 'create_file') {\n const BOM = '\\uFEFF';\n fs.writeFileSync(action.path!, BOM + (action.content || ''), 'utf-8');\n tui.log.success(`✅ Created: ${action.path}`);\n executionResults += `[Action create_file]: Success.\\n`;\n } else if (action.type === 'modify_file') {\n if (action.target_content) {\n // Ensure we pass the possibly redirected path\n const success = startSmartReplace(action.path!, action.content || '', action.target_content, tui);\n if (success) {\n executionResults += `[Action modify_file]: Success.\\n`;\n specUpdated = true;\n } else {\n executionResults += `[Action modify_file]: Failed. Target content not found or ambiguous.\\n`;\n }\n } else {\n executionResults += `[Action modify_file]: Failed. 'target_content' is required.\\n`;\n }\n }\n } catch (e: any) {\n executionResults += `[Action ${action.type}]: Error: ${e.message}\\n`;\n }\n }\n }\n\n // Check for Phase completion signal\n if (lastResponse.message && lastResponse.message.includes('PHASE_COMPLETED')) {\n const extraContext = executionResults ? `\\n\\nResultados das últimas ações executadas antes da conclusão:\\n${executionResults}` : \"\";\n \n if (currentPhase === 1) {\n currentPhase = 2;\n tui.log.success(`✅ Fase 1 Concluída. Iniciando Fase 2 (Investigação).`);\n nextPrompt = `[System Message]\\nVocê completou a FASE 1 com sucesso.\\n\\n**VOCÊ AGORA ESTÁ NA FASE 2: INVESTIGAÇÃO**\\n- Use \\`search_code\\` e \\`list_files\\` para explorar os arquivos relevantes à tarefa.\\n- Prefira \\`search_code\\` em vez de \\`read_file\\` para buscar código sem inflar o contexto.\\n- NÃO leia o projeto inteiro de forma genérica.\\n- REGRA DE OURO (READ-FIRST): Você NÃO PODE referenciar um arquivo na especificação técnica que não tenha investigado nesta fase.\\n- Quando achar que possui toda a clareza técnica sobre onde e o que deve ser feito no código, emita \"PHASE_COMPLETED\" no summary.${extraContext}`;\n continue;\n } else if (currentPhase === 2) {\n currentPhase = 3;\n tui.log.success(`✅ Fase 2 Concluída. Iniciando Fase 3 (Preenchimento).`);\n nextPrompt = `[System Message]\\nVocê completou a FASE 2 com sucesso.\\n\\n**VOCÊ AGORA ESTÁ NA FASE 3: PREENCHIMENTO DO TEMPLATE**\\n- Use \\`modify_file\\` no arquivo \\`${targetPath}\\` para substituir os placeholders pelo conteúdo real levantado na fase de investigação.\\n- As seções 1-4 devem descrever o contexto da TAREFA, e não o projeto como um todo.\\n- Passos de Implementação (Implementation Steps): APENAS checkboxes markdown: \\`- [ ] [Verbo de Ação] [O Que] em [Caminho Relativo]\\`.\\n- Quando TODOS os placeholders ([TO BE ANALYZED...] ou [TO BE FILLED]) forem substituídos e o trabalho concluído, emita \"SPEC_UPDATED: Complete\" no summary para finalizar.${extraContext}`;\n continue;\n }\n }\n\n // Check for final completion signal\n if (lastResponse.message && lastResponse.message.includes('SPEC_UPDATED:')) {\n if (currentPhase < 3) {\n tui.log.warning(`O agente tentou finalizar prematuramente. Forçando retorno para a fase atual...`);\n nextPrompt = `[System Error]: Você tentou finalizar a especificação prematuramente emitindo SPEC_UPDATED, mas ainda está na Fase ${currentPhase}. Você só pode finalizar quando estiver na Fase 3.\\n\\nContinue seu trabalho na Fase ${currentPhase} ou emita \"PHASE_COMPLETED\" se terminou esta etapa atual.`;\n continue;\n }\n\n const content = fs.existsSync(targetPath) ? fs.readFileSync(targetPath, 'utf-8') : '';\n if (content.includes('[TO BE')) {\n const pendingMatches = [...content.matchAll(/## ([^\\n]+)[\\s\\S]*?\\[TO BE/g)].map(m => m[1]);\n let missing = pendingMatches.length > 0 ? pendingMatches.join(', ') : 'algumas seções';\n \n tui.log.warning(`O agente tentou concluir prematuramente, mas há placeholders pendentes. Forçando retorno...`);\n nextPrompt = `[System Error]: A validação falhou e o bloqueio automático foi acionado.\\nVocê tentou concluir a tarefa, mas o arquivo AINDA possui placeholders '[TO BE ANALYZED...]' ou '[TO BE FILLED]'.\\nAs seguintes seções ainda contêm estes placeholders: ${missing}.\\nVocê é OBRIGADO a usar a action \\`modify_file\\` para preencher o conteúdo de cada uma dessas seções. Use o placeholder exato no campo \\`target_content\\`. NÃO repita a conclusão da tarefa até corrigir todas as pendências.`;\n continue;\n } else {\n const updateSummary = lastResponse.message.split('SPEC_UPDATED:')[1].trim();\n tui.log.success(`✅ Spec Finalized: ${updateSummary}`);\n return;\n }\n }\n\n // Prepare Next Prompt\n if (executionResults) {\n FileLogger.log('TOOL_EXECUTION', 'Specification Agent Actions Output', { executionResults });\n }\n\n if (hasSystemError) {\n nextPrompt = systemErrorContent;\n } else if (waitingForUser) {\n const userReply = await tui.text({ message: 'Your answer', placeholder: 'Type your answer...' });\n if (tui.isCancel(userReply)) { keepGoing = false; return; }\n FileLogger.log('USER_INPUT', 'User response to specification agent', { userReply });\n nextPrompt = `${executionResults}\\n\\nUser Reply: ${userReply}`;\n } else if (executionResults) {\n const content = fs.existsSync(targetPath) ? fs.readFileSync(targetPath, 'utf-8') : '';\n let systemMsg = \"Execução da ferramenta concluída.\";\n if (specUpdated) {\n if (content.includes('[TO BE')) {\n const pendingMatches = [...content.matchAll(/## ([^\\n]+)[\\s\\S]*?\\[TO BE/g)].map(m => m[1]);\n let missing = pendingMatches.length > 0 ? pendingMatches.join(', ') : 'várias seções';\n systemMsg += `\\n[System]: Seção atualizada com sucesso. A validação detectou que AINDA HÁ placeholders pendentes ('[TO BE...]') nas seguintes seções: ${missing}.\\nPor favor, envie uma nova action \\`modify_file\\` focada em uma destas seções obrigatoriamente. USE o respectivo placeholder no campo \\`target_content\\` para que o replace funcione.`;\n } else {\n systemMsg += \"\\n[System]: O arquivo parece completo! Se estiver satisfeito e possuir TODAS as implementações descritas, retorne 'SPEC_UPDATED: Complete'.\";\n }\n } else {\n // Adicionando um aviso de que falhou e precisa tentar de novo\n systemMsg += \"\\n[System]: A modificação do arquivo falhou. Verifique se o \\`target_content\\` que você usou existe EXATAMENTE como no arquivo e se ele é ÚNICO na hora de usar a action \\`modify_file\\`.\";\n }\n nextPrompt = `${executionResults}\\n\\n${systemMsg}`;\n } else {\n if (lastResponse.message) {\n tui.log.info(colors.primary('🤖 Architect (Message only):'));\n console.log(lastResponse.message);\n const userReply = await tui.text({ message: 'Your answer:' });\n if (tui.isCancel(userReply)) { keepGoing = false; break; }\n FileLogger.log('USER_INPUT', 'User response to specification agent (Message only)', { userReply });\n nextPrompt = userReply as string;\n } else {\n keepGoing = false;\n }\n }\n\n } else {\n tui.log.warning('No actions received.');\n keepGoing = false;\n }\n\n } catch (error: any) {\n spinner.stop('Error');\n tui.log.error(error.message);\n keepGoing = false;\n }\n }\n}\n\n// --- API Wrapper Matches Scan/Dev Agent Pattern ---\nasync function callSpecAgentApi(prompt: string, onChunk: (chunk: string) => void, agentId?: string): Promise<AgentResponse> {\n const conversationId = await conversationManager.getConversationId(AGENT_TYPE);\n\n FileLogger.log('AGENT', 'Calling Agent API', { agentId, conversationId });\n\n const provider = ProviderResolver.getProvider('specification_agent');\n if (agentId && 'agentId' in provider) {\n (provider as any).agentId = agentId;\n }\n\n const parsed = await provider.streamChat(prompt, {\n conversationId,\n agentType: 'specification_agent',\n onChunk\n });\n\n if (parsed.conversation_id) {\n await conversationManager.saveConversationId(AGENT_TYPE, parsed.conversation_id);\n }\n\n return parsed;\n}\n","import { Command } from 'commander';\nimport { AGENT_RESPONSE_JSON_SCHEMA } from '../core/api/prompts.js';\n\nexport const exportSchemaCommand = new Command('export-schema')\n .description('Outputs the agent response JSON Schema')\n .action(() => {\n console.log(JSON.stringify(AGENT_RESPONSE_JSON_SCHEMA, null, 2));\n });\n\n","import { Command } from 'commander';\nimport { UNIFIED_SYSTEM_PROMPT } from '../core/api/prompts.js';\n\nexport const exportPromptCommand = new Command('export-prompt')\n .description('Outputs the unified agent system prompt')\n .action(() => {\n console.log(UNIFIED_SYSTEM_PROMPT);\n });\n","import { Command } from 'commander';\nimport { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport os from 'node:os';\nimport fs from 'node:fs/promises';\n\nexport interface SuperCommandOptions {\n local?: boolean;\n}\n\nexport const superCommandAction = async (options: SuperCommandOptions = {}) => {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const packageRoot = path.resolve(__dirname, '../../');\n const internalSkillsPath = path.join(packageRoot, 'skills');\n\n const targetPath = options.local \n ? path.join(process.cwd(), '.agents', 'skills')\n : path.join(os.homedir(), '.shark', 'skills');\n\n try {\n try {\n await fs.rm(targetPath, { recursive: true, force: true });\n } catch {\n // Ignore if it doesn't exist\n }\n await fs.mkdir(targetPath, { recursive: true });\n await fs.cp(internalSkillsPath, targetPath, { recursive: true, force: true });\n console.log(`🚀 Superpowers skills installed successfully to ${targetPath}`);\n } catch (error: any) {\n console.error(`❌ Failed to install superpowers skills: ${error.message}`);\n process.exit(1);\n }\n};\n\nexport const superCommand = new Command('super')\n .description('Install Superpowers skills globally or locally')\n .option('-l, --local', 'Install skills locally in the current project under .agents/skills')\n .action(superCommandAction);\n"],"mappings":"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","names":["Command","fs","path","path","fs","Command","z","z","systemMsg","fs","path","fs","path","fs","path","fs","path","path","path","fs","path","fs","tui","path","fs","tui","resolve","fs","path","os","crypto","fs","path","fileURLToPath","path","fs","crypto","__filename","fileURLToPath","__dirname","state","resolve","resolve","resolve","path","fs","nextMsg","Command","Command","fs","path","interactiveDeveloperAgent","path","fs","fs","path","status","fs","path","AGENT_TYPE","path","fs","AGENT_TYPE","Command","interactiveDeveloperAgent","Command","Command","Command","Command","Command","fileURLToPath","path","os","fs","__filename","__dirname","Command"]}