codelantern-agent-cli 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +167 -216
- package/dist/{chunk-Y3PEOLTZ.js → chunk-PELESOCI.js} +2365 -571
- package/dist/chunk-PELESOCI.js.map +1 -0
- package/dist/cli.js +678 -82
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +285 -23
- package/dist/index.js +46 -7
- package/package.json +2 -2
- package/dist/chunk-Y3PEOLTZ.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider/errors.ts","../src/provider/gemini.ts","../src/security/secrets.ts","../src/security/sandbox.ts","../src/approval/diffViewer.ts","../src/security/commandGuard.ts","../src/tools/fsTools.ts","../src/tools/searchTools.ts","../src/tools/bashTool.ts","../src/tools/gitTools.ts","../src/tools/webSearchTool.ts","../src/tools/registry.ts","../src/config/schema.ts","../src/config/config.ts","../src/mcp/mcpConfig.ts","../src/mcp/mcpManager.ts","../src/approval/approver.ts","../src/config/projectInstructions.ts","../src/session/sessionManager.ts","../src/session/compactor.ts","../src/agent/orbitAgent.ts","../src/ui/spinner.ts","../src/provider/attachment.ts"],"sourcesContent":["import pc from 'picocolors';\n\nexport class MissingApiKeyError extends Error {\n constructor() {\n super(\n `GEMINI_API_KEY environment variable is not configured.\\n\\n` +\n `To resolve this:\\n` +\n ` 1. Get a Gemini API key from https://aistudio.google.com/app/apikey\\n` +\n ` 2. Set the environment variable in your terminal or shell profile:\\n` +\n ` export GEMINI_API_KEY=\"your-api-key-here\"\\n` +\n ` 3. Or run Code Lantern with the key prefixed:\\n` +\n ` GEMINI_API_KEY=\"your-key\" lantern\\n`\n );\n this.name = 'MissingApiKeyError';\n }\n}\n\nexport class RateLimitError extends Error {\n constructor(message = 'Gemini API rate limit exceeded.') {\n super(`${message}\\nPlease wait a moment before trying again or check your API quota at https://aistudio.google.com/`);\n this.name = 'RateLimitError';\n }\n}\n\nexport class GeminiProviderError extends Error {\n public statusCode?: number;\n\n constructor(message: string, statusCode?: number) {\n super(message);\n this.name = 'GeminiProviderError';\n this.statusCode = statusCode;\n }\n}\n\nexport function formatErrorMessage(err: unknown): string {\n if (err instanceof MissingApiKeyError) {\n return pc.red(err.message);\n }\n if (err instanceof RateLimitError) {\n return pc.yellow(`⚠️ ${err.message}`);\n }\n if (err instanceof Error) {\n // Check for common HTTP / API error strings\n const msg = err.message || '';\n if (msg.includes('API_KEY_INVALID') || msg.includes('API key not valid')) {\n return pc.red('Invalid Gemini API Key. Please verify your GEMINI_API_KEY at https://aistudio.google.com/app/apikey');\n }\n if (msg.includes('RESOURCE_EXHAUSTED') || msg.includes('429')) {\n return pc.yellow('Rate limit / quota exceeded. Please wait a few seconds or check your quota limits.');\n }\n if (msg.includes('NOT_FOUND') || msg.includes('models/')) {\n return pc.red(`Model not found or unavailable. Please check the requested model ID: ${msg}`);\n }\n return pc.red(`Gemini Error: ${msg}`);\n }\n return pc.red(`An unexpected error occurred: ${String(err)}`);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { GoogleGenAI, type Content, type Part, type FunctionDeclaration, Type } from '@google/genai';\nimport { MissingApiKeyError, RateLimitError, GeminiProviderError } from './errors.js';\nimport type { ConversationTurn, ToolDefinition, FileAttachment, TokenUsage, ToolCallItem } from '../types.js';\n\nexport interface StreamCallbacks {\n onChunk?: (text: string) => void;\n onToolCalls?: (toolCalls: ToolCallItem[]) => void;\n onUsage?: (usage: TokenUsage) => void;\n}\n\nexport class GeminiProvider {\n private client: GoogleGenAI | null = null;\n private apiKey: string | null = null;\n\n constructor(apiKey?: string) {\n const key = apiKey || process.env.GEMINI_API_KEY;\n if (key && key.trim().length > 0) {\n this.apiKey = key.trim();\n this.client = new GoogleGenAI({ apiKey: this.apiKey });\n }\n }\n\n public isConfigured(): boolean {\n return Boolean(this.apiKey && this.client);\n }\n\n public getMaskedKey(): string {\n if (!this.apiKey) return 'Not configured';\n if (this.apiKey.length <= 8) return '********';\n return `${this.apiKey.slice(0, 4)}...${this.apiKey.slice(-4)}`;\n }\n\n private ensureClient(): GoogleGenAI {\n if (!this.client || !this.apiKey) {\n const envKey = process.env.GEMINI_API_KEY;\n if (envKey && envKey.trim().length > 0) {\n this.apiKey = envKey.trim();\n this.client = new GoogleGenAI({ apiKey: this.apiKey });\n return this.client;\n }\n throw new MissingApiKeyError();\n }\n return this.client;\n }\n\n public async streamGenerate(\n modelId: string,\n systemInstruction: string,\n history: ConversationTurn[],\n tools: ToolDefinition[],\n callbacks: StreamCallbacks,\n options?: {\n temperature?: number;\n maxOutputTokens?: number;\n enableSearchGrounding?: boolean;\n }\n ): Promise<{\n text: string;\n toolCalls: ToolCallItem[];\n usage: TokenUsage;\n }> {\n const client = this.ensureClient();\n\n const contents = this.convertHistoryToContents(history);\n const functionDeclarations = this.convertToolsToDeclarations(tools);\n\n const config: Record<string, unknown> = {\n systemInstruction,\n temperature: options?.temperature ?? 0.2\n };\n\n if (options?.maxOutputTokens) {\n config.maxOutputTokens = options.maxOutputTokens;\n }\n\n const toolList: Array<Record<string, unknown>> = [];\n\n if (functionDeclarations.length > 0) {\n toolList.push({ functionDeclarations });\n }\n\n // Google Search Grounding if enabled\n if (options?.enableSearchGrounding) {\n toolList.push({ googleSearch: {} });\n }\n\n if (toolList.length > 0) {\n config.tools = toolList;\n }\n\n let attempts = 0;\n const maxAttempts = 3;\n let lastError: unknown = null;\n\n while (attempts < maxAttempts) {\n try {\n attempts++;\n const responseStream = await client.models.generateContentStream({\n model: modelId,\n contents,\n config\n });\n\n let fullText = '';\n const collectedToolCalls: ToolCallItem[] = [];\n const usage: TokenUsage = {\n promptTokens: 0,\n candidatesTokens: 0,\n totalTokens: 0\n };\n\n for await (const chunk of responseStream) {\n // Streaming text\n if (chunk.text) {\n fullText += chunk.text;\n if (callbacks.onChunk) {\n callbacks.onChunk(chunk.text);\n }\n }\n\n // Function calls\n if (chunk.functionCalls && chunk.functionCalls.length > 0) {\n for (const fc of chunk.functionCalls) {\n collectedToolCalls.push({\n id: fc.id || `call_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`,\n name: fc.name || '',\n args: (fc.args as Record<string, unknown>) || {}\n });\n }\n }\n\n // Token usage\n if (chunk.usageMetadata) {\n usage.promptTokens = chunk.usageMetadata.promptTokenCount ?? usage.promptTokens;\n usage.candidatesTokens = chunk.usageMetadata.candidatesTokenCount ?? usage.candidatesTokens;\n usage.totalTokens = chunk.usageMetadata.totalTokenCount ?? usage.totalTokens;\n if (callbacks.onUsage) {\n callbacks.onUsage(usage);\n }\n }\n }\n\n if (callbacks.onToolCalls && collectedToolCalls.length > 0) {\n callbacks.onToolCalls(collectedToolCalls);\n }\n\n return {\n text: fullText,\n toolCalls: collectedToolCalls,\n usage\n };\n } catch (err: any) {\n lastError = err;\n const msg = String(err?.message || err);\n\n // Check for non-retryable errors\n if (msg.includes('API_KEY_INVALID') || msg.includes('401') || msg.includes('403')) {\n throw new GeminiProviderError(`Authentication failed: ${msg}`, 401);\n }\n\n const isRateLimit = msg.includes('429') || msg.includes('RESOURCE_EXHAUSTED');\n const isTransient = msg.includes('503') || msg.includes('overloaded') || msg.includes('ECONNRESET') || msg.includes('ETIMEDOUT');\n\n if ((isRateLimit || isTransient) && attempts < maxAttempts) {\n const delay = Math.pow(2, attempts) * 1000 + Math.random() * 500;\n await new Promise(r => setTimeout(r, delay));\n continue;\n }\n\n if (isRateLimit) {\n throw new RateLimitError(msg);\n }\n\n throw new GeminiProviderError(`Gemini request failed: ${msg}`);\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n }\n\n private convertHistoryToContents(turns: ConversationTurn[]): Content[] {\n const contents: Content[] = [];\n\n for (const turn of turns) {\n const parts: Part[] = [];\n\n if (turn.role === 'user') {\n if (turn.text) {\n parts.push({ text: turn.text });\n }\n\n // Add attachments if any\n if (turn.attachments && turn.attachments.length > 0) {\n for (const att of turn.attachments) {\n if (att.base64Data && att.mimeType) {\n parts.push({\n inlineData: {\n mimeType: att.mimeType,\n data: att.base64Data\n }\n });\n } else if (att.textContent) {\n parts.push({\n text: `[Attached File: ${att.name}]\\n\\`\\`\\`\\n${att.textContent}\\n\\`\\`\\``\n });\n }\n }\n }\n\n if (parts.length > 0) {\n contents.push({ role: 'user', parts });\n }\n } else if (turn.role === 'model') {\n if (turn.text) {\n parts.push({ text: turn.text });\n }\n\n if (turn.toolCalls && turn.toolCalls.length > 0) {\n for (const tc of turn.toolCalls) {\n parts.push({\n functionCall: {\n id: tc.id,\n name: tc.name,\n args: tc.args\n }\n });\n }\n }\n\n if (parts.length > 0) {\n contents.push({ role: 'model', parts });\n }\n } else if (turn.role === 'tool') {\n if (turn.toolResults && turn.toolResults.length > 0) {\n for (const res of turn.toolResults) {\n parts.push({\n functionResponse: {\n id: res.callId,\n name: res.name,\n response: {\n result: res.error ? { error: res.error } : res.result\n }\n }\n });\n }\n }\n\n if (parts.length > 0) {\n contents.push({ role: 'tool', parts });\n }\n }\n }\n\n return contents;\n }\n\n private convertToolsToDeclarations(tools: ToolDefinition[]): FunctionDeclaration[] {\n return tools.map(tool => {\n const properties: Record<string, any> = {};\n\n for (const [propName, propDef] of Object.entries(tool.parameters.properties)) {\n let typeVal = Type.STRING;\n switch (propDef.type) {\n case 'number':\n case 'integer':\n typeVal = Type.NUMBER;\n break;\n case 'boolean':\n typeVal = Type.BOOLEAN;\n break;\n case 'array':\n typeVal = Type.ARRAY;\n break;\n case 'object':\n typeVal = Type.OBJECT;\n break;\n default:\n typeVal = Type.STRING;\n }\n\n properties[propName] = {\n type: typeVal,\n description: propDef.description,\n ...(propDef.enum ? { enum: propDef.enum } : {}),\n ...(propDef.items ? { items: { type: Type.STRING } } : {})\n };\n }\n\n return {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: Type.OBJECT,\n properties,\n required: tool.parameters.required || []\n }\n };\n });\n }\n}\n","import path from 'node:path';\n\n// Known secret file patterns to block from automatic reads or prompts\nconst SECRET_FILE_PATTERNS: RegExp[] = [\n /^\\.env(\\..+)?$/i,\n /\\.pem$/i,\n /\\.key$/i,\n /\\.pfx$/i,\n /\\.p12$/i,\n /^id_rsa/i,\n /^id_dsa/i,\n /^id_ecdsa/i,\n /^id_ed25519/i,\n /service[_-]?account.*\\.json$/i,\n /credentials.*\\.json$/i,\n /\\.keystore$/i,\n /\\.token$/i,\n /\\.secret/i\n];\n\n// Patterns for potential credentials in text\nconst SECRET_TEXT_PATTERNS = [\n // Google API keys\n /AIza[0-9A-Za-z-_]{35}/g,\n // Generic token / bearer strings\n /(?:api[_-]?key|secret|token|password|bearer)[ \\t]*[:=][ \\t]*['\"]?([a-zA-Z0-9_\\-.~+]{16,})['\"]?/gi,\n // GitHub Personal Access Tokens\n /ghp_[0-9a-zA-Z]{36}/g,\n /github_pat_[0-9a-zA-Z_]{82}/g,\n // AWS Access Key ID\n /AKIA[0-9A-Z]{16}/g\n];\n\nexport function isSecretFile(filePath: string): boolean {\n const base = path.basename(filePath);\n return SECRET_FILE_PATTERNS.some(pattern => pattern.test(base));\n}\n\nexport function sanitizeSecrets(text: string): string {\n if (!text) return text;\n let sanitized = text;\n\n // Mask Google API keys (AIza followed by 30 to 40 alphanumeric/dash/underscore chars)\n sanitized = sanitized.replace(/AIza[0-9A-Za-z\\-_]{30,40}/g, 'AIza***********************************');\n\n // Mask GitHub tokens\n sanitized = sanitized.replace(/ghp_[0-9a-zA-Z]{36}/g, 'ghp_************************************');\n sanitized = sanitized.replace(/github_pat_[0-9a-zA-Z_]{82}/g, 'github_pat_**********************************************************************************');\n\n // Mask GEMINI_API_KEY if present in environment\n const currentKey = process.env.GEMINI_API_KEY;\n if (currentKey && currentKey.length > 5) {\n sanitized = sanitized.split(currentKey).join('[REDACTED_GEMINI_API_KEY]');\n }\n\n return sanitized;\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport { isSecretFile } from './secrets.js';\n\nexport interface PathValidationResult {\n allowed: boolean;\n resolvedPath: string;\n relativePath: string;\n reason?: string;\n}\n\nconst isWindows = process.platform === 'win32';\n\n/**\n * Normalizes a path for consistent cross-platform comparison\n */\nfunction normalizeForComparison(p: string): string {\n const resolved = path.resolve(p);\n return isWindows ? resolved.toLowerCase() : resolved;\n}\n\n/**\n * Checks if target path is safely contained within parent directory\n */\nfunction isContainedWithin(parent: string, target: string): boolean {\n const normParent = normalizeForComparison(parent);\n const normTarget = normalizeForComparison(target);\n\n const rel = path.relative(normParent, normTarget);\n return !rel.startsWith('..') && !path.isAbsolute(rel);\n}\n\nexport function validateWorkspacePath(\n targetPath: string,\n workspaceDir: string,\n allowedExternalPaths: string[] = []\n): PathValidationResult {\n if (!targetPath || typeof targetPath !== 'string') {\n return {\n allowed: false,\n resolvedPath: '',\n relativePath: '',\n reason: 'Empty or invalid file path provided.'\n };\n }\n\n // Canonicalize workspace directory\n let normalizedWorkspace = path.resolve(workspaceDir);\n try {\n if (fs.existsSync(normalizedWorkspace)) {\n normalizedWorkspace = fs.realpathSync(normalizedWorkspace);\n }\n } catch {\n // Fall back to resolved path if realpath fails\n }\n\n const resolvedTarget = path.isAbsolute(targetPath)\n ? path.resolve(targetPath)\n : path.resolve(normalizedWorkspace, targetPath);\n\n // Check if explicitly allowed (e.g. user-attached files)\n const isExplicitlyAllowed = allowedExternalPaths.some(p => {\n const normAllowed = normalizeForComparison(p);\n const normTarget = normalizeForComparison(resolvedTarget);\n return normAllowed === normTarget;\n });\n\n if (isExplicitlyAllowed) {\n return {\n allowed: true,\n resolvedPath: resolvedTarget,\n relativePath: path.relative(normalizedWorkspace, resolvedTarget) || path.basename(resolvedTarget)\n };\n }\n\n // Prevent path traversal outside workspace\n if (!isContainedWithin(normalizedWorkspace, resolvedTarget)) {\n return {\n allowed: false,\n resolvedPath: resolvedTarget,\n relativePath: path.relative(normalizedWorkspace, resolvedTarget),\n reason: `Path '${targetPath}' is outside the authorized workspace: ${normalizedWorkspace}`\n };\n }\n\n // Check symlinks if path exists\n try {\n if (fs.existsSync(resolvedTarget)) {\n const realTarget = fs.realpathSync(resolvedTarget);\n if (!isContainedWithin(normalizedWorkspace, realTarget)) {\n return {\n allowed: false,\n resolvedPath: realTarget,\n relativePath: path.relative(normalizedWorkspace, realTarget),\n reason: `Symlink target points outside the workspace: ${realTarget}`\n };\n }\n }\n } catch {\n // If realpath check cannot be resolved, safe to continue if resolvedTarget was inside\n }\n\n // Secret file check\n if (isSecretFile(resolvedTarget)) {\n return {\n allowed: false,\n resolvedPath: resolvedTarget,\n relativePath: path.relative(normalizedWorkspace, resolvedTarget),\n reason: `Access to secret or credential file '${path.basename(resolvedTarget)}' is blocked for security.`\n };\n }\n\n return {\n allowed: true,\n resolvedPath: resolvedTarget,\n relativePath: path.relative(normalizedWorkspace, resolvedTarget) || '.'\n };\n}\n","import * as Diff from 'diff';\nimport pc from 'picocolors';\n\nexport function formatTerminalDiff(\n filePath: string,\n oldContent: string,\n newContent: string,\n contextLines = 3\n): string {\n // Normalize Windows CRLF line endings for reliable diffing\n const normalizedOld = oldContent.replace(/\\r\\n/g, '\\n');\n const normalizedNew = newContent.replace(/\\r\\n/g, '\\n');\n\n const patch = Diff.createPatch(filePath, normalizedOld, normalizedNew, 'Original', 'Modified', {\n context: contextLines\n });\n\n const lines = patch.split('\\n');\n const formatted: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (line.startsWith('---') || line.startsWith('+++')) {\n formatted.push(pc.bold(pc.cyan(line)));\n } else if (line.startsWith('@@')) {\n formatted.push(pc.magenta(line));\n } else if (line.startsWith('+')) {\n formatted.push(pc.green(line));\n } else if (line.startsWith('-')) {\n formatted.push(pc.red(line));\n } else {\n formatted.push(pc.dim(line));\n }\n }\n\n return formatted.join('\\n');\n}\n\nexport function formatNewFilePreview(filePath: string, content: string, maxPreviewLines = 30): string {\n const normalized = content.replace(/\\r\\n/g, '\\n');\n const lines = normalized.split('\\n');\n const preview = lines.slice(0, maxPreviewLines).map((line, idx) => {\n const lineNum = String(idx + 1).padStart(4, ' ');\n return `${pc.dim(lineNum)} ${pc.green('+')} ${pc.green(line)}`;\n });\n\n if (lines.length > maxPreviewLines) {\n preview.push(pc.dim(` ... and ${lines.length - maxPreviewLines} more lines`));\n }\n\n return [\n pc.bold(pc.cyan(`+++ Create new file: ${filePath} (${lines.length} lines)`)),\n ...preview\n ].join('\\n');\n}\n","export interface CommandValidationResult {\n allowed: boolean;\n reason?: string;\n isHighRisk?: boolean;\n}\n\n// Patterns that are unconditionally blocked to protect system integrity on macOS, Linux, and Windows\nconst DESTRUCTIVE_PATTERNS: Array<{ regex: RegExp; reason: string }> = [\n // Unix root/home deletion\n { regex: /\\brm\\s+-[rf]{1,2}\\s+([/~]|\\$HOME|\\.\\.\\/|\\.\\.\\\\)/i, reason: 'Attempt to delete root, home, or parent directories.' },\n { regex: /\\brm\\s+-[rf]{1,2}\\s+\\*\\s*$/i, reason: 'Attempt to recursively delete everything in directory.' },\n // Unix filesystem destruction\n { regex: /\\bmkfs(\\.\\w+)?\\b/i, reason: 'Filesystem format commands are forbidden.' },\n { regex: /\\bdd\\s+.*of=\\/dev\\/(r?[shv]d[a-z]|disk|nvme)/i, reason: 'Direct disk write commands are forbidden.' },\n { regex: /:\\(\\)\\s*\\{\\s*:\\s*\\|\\s*:\\s*&\\s*\\}\\s*;\\s*:/, reason: 'Fork bombs are strictly blocked.' },\n { regex: /\\b(shutdown|reboot|poweroff|init\\s+0)\\b/i, reason: 'System shutdown/reboot commands are forbidden.' },\n { regex: /\\bchmod\\s+-[rR]\\s+777\\s+([/~]|\\$HOME)/i, reason: 'Dangerous permissions modification at root/home.' },\n // Windows destructive commands\n { regex: /\\bformat\\s+[a-z]:/i, reason: 'Disk format command is forbidden.' },\n { regex: /\\b(del|erase)\\s+.*\\/s.*\\/q.*[a-z]:\\\\/i, reason: 'Recursive deletion of root Windows drive is forbidden.' },\n { regex: /\\b(rd|rmdir)\\s+.*\\/s.*\\/q.*[a-z]:\\\\/i, reason: 'Recursive removal of root Windows drive is forbidden.' },\n { regex: /\\bRemove-Item\\s+.*-Recurse\\s+.*[a-z]:\\\\/i, reason: 'Recursive PowerShell deletion of drive root is forbidden.' }\n];\n\nexport function validateCommand(command: string): CommandValidationResult {\n if (!command || command.trim().length === 0) {\n return { allowed: false, reason: 'Empty command string.' };\n }\n\n const trimmed = command.trim();\n\n // Check destructive command blocks\n for (const check of DESTRUCTIVE_PATTERNS) {\n if (check.regex.test(trimmed)) {\n return {\n allowed: false,\n reason: `Blocked dangerous command pattern: ${check.reason}`\n };\n }\n }\n\n // Check high-risk operations that require caution\n const isPublishOrPush = /\\b(npm\\s+publish|git\\s+push|docker\\s+push)\\b/i.test(trimmed);\n\n return {\n allowed: true,\n isHighRisk: isPublishOrPush\n };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { OrbitTool } from './types.js';\nimport { validateWorkspacePath } from '../security/sandbox.js';\nimport { formatTerminalDiff, formatNewFilePreview } from '../approval/diffViewer.js';\n\nexport const readFileTool: OrbitTool = {\n definition: {\n name: 'read_file',\n description: 'Read the contents of a text file inside the workspace. Optionally specify a line range.',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Relative path of the file to read within the workspace.'\n },\n start_line: {\n type: 'integer',\n description: 'Optional 1-indexed start line number to read from.'\n },\n end_line: {\n type: 'integer',\n description: 'Optional 1-indexed end line number to read until (inclusive).'\n }\n },\n required: ['path']\n }\n },\n async execute(args, context) {\n const rawPath = String(args.path || '').trim();\n const validation = validateWorkspacePath(rawPath, context.workspace);\n\n if (!validation.allowed) {\n return {\n success: false,\n output: `Error: Access denied. ${validation.reason}`,\n error: validation.reason\n };\n }\n\n if (!fs.existsSync(validation.resolvedPath)) {\n return {\n success: false,\n output: `Error: File not found at '${validation.relativePath}'`,\n error: 'File not found'\n };\n }\n\n const stat = fs.statSync(validation.resolvedPath);\n if (!stat.isFile()) {\n return {\n success: false,\n output: `Error: Path is a directory, not a file: '${validation.relativePath}'`,\n error: 'Path is a directory'\n };\n }\n\n // Limit single file read to 1MB\n if (stat.size > 1024 * 1024) {\n return {\n success: false,\n output: `Error: File is too large to read entirely (${(stat.size / 1024).toFixed(0)}KB). Please specify start_line and end_line.`,\n error: 'File too large'\n };\n }\n\n try {\n const content = fs.readFileSync(validation.resolvedPath, 'utf8');\n const lines = content.split('\\n');\n const totalLines = lines.length;\n\n let start = 1;\n let end = totalLines;\n\n if (typeof args.start_line === 'number' && args.start_line > 0) {\n start = Math.max(1, Math.min(args.start_line, totalLines));\n }\n\n if (typeof args.end_line === 'number' && args.end_line >= start) {\n end = Math.min(args.end_line, totalLines);\n }\n\n const selectedLines = lines.slice(start - 1, end);\n const numberedLines = selectedLines.map((line, idx) => {\n const lineNum = String(start + idx).padStart(4, ' ');\n return `${lineNum} | ${line}`;\n });\n\n const output = [\n `File: ${validation.relativePath} (${start}-${end} of ${totalLines} lines)`,\n '```',\n ...numberedLines,\n '```'\n ].join('\\n');\n\n return {\n success: true,\n output,\n metadata: {\n path: validation.relativePath,\n startLine: start,\n endLine: end,\n totalLines\n }\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Error reading file: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n\nexport const writeFileTool: OrbitTool = {\n definition: {\n name: 'write_file',\n description: 'Create a new file or completely overwrite an existing file with the provided content.',\n readOnly: false,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Relative path of the file to create or overwrite.'\n },\n content: {\n type: 'string',\n description: 'The complete text content to write to the file.'\n }\n },\n required: ['path', 'content']\n }\n },\n async execute(args, context) {\n const rawPath = String(args.path || '').trim();\n const content = String(args.content ?? '');\n const validation = validateWorkspacePath(rawPath, context.workspace);\n\n if (!validation.allowed) {\n return {\n success: false,\n output: `Error: Access denied. ${validation.reason}`,\n error: validation.reason\n };\n }\n\n const fileExists = fs.existsSync(validation.resolvedPath);\n let oldContent = '';\n if (fileExists) {\n try {\n oldContent = fs.readFileSync(validation.resolvedPath, 'utf8');\n } catch {\n oldContent = '';\n }\n }\n\n // Request approval\n const approved = await context.requestApproval({\n type: 'file_write',\n summary: fileExists ? `Overwrite existing file: ${validation.relativePath}` : `Create new file: ${validation.relativePath}`,\n details: {\n path: validation.relativePath,\n before: oldContent,\n after: content,\n diff: fileExists ? formatTerminalDiff(validation.relativePath, oldContent, content) : formatNewFilePreview(validation.relativePath, content)\n }\n });\n\n if (!approved) {\n return {\n success: false,\n output: `Write rejected: User declined approval to write '${validation.relativePath}'.`,\n error: 'Approval rejected'\n };\n }\n\n try {\n const parentDir = path.dirname(validation.resolvedPath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n fs.writeFileSync(validation.resolvedPath, content, 'utf8');\n const lines = content.split('\\n').length;\n\n return {\n success: true,\n output: `Successfully wrote ${lines} lines to ${validation.relativePath}`,\n metadata: { path: validation.relativePath, lines }\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Failed to write file: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n\nexport const editFileTool: OrbitTool = {\n definition: {\n name: 'edit_file',\n description: 'Propose and apply a focused edit by replacing exact existing text with new replacement text.',\n readOnly: false,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Relative path of the file to edit.'\n },\n target: {\n type: 'string',\n description: 'The exact string in the file to be replaced. Must match character-for-character including indentation.'\n },\n replacement: {\n type: 'string',\n description: 'The replacement string to insert in place of target.'\n }\n },\n required: ['path', 'target', 'replacement']\n }\n },\n async execute(args, context) {\n const rawPath = String(args.path || '').trim();\n const target = String(args.target ?? '');\n const replacement = String(args.replacement ?? '');\n\n const validation = validateWorkspacePath(rawPath, context.workspace);\n if (!validation.allowed) {\n return {\n success: false,\n output: `Error: Access denied. ${validation.reason}`,\n error: validation.reason\n };\n }\n\n if (!fs.existsSync(validation.resolvedPath)) {\n return {\n success: false,\n output: `Error: File not found at '${validation.relativePath}'`,\n error: 'File not found'\n };\n }\n\n try {\n const original = fs.readFileSync(validation.resolvedPath, 'utf8');\n const hasCrlf = original.includes('\\r\\n');\n\n let matchedTarget = target;\n if (!original.includes(target)) {\n if (hasCrlf && !target.includes('\\r\\n')) {\n const crlfTarget = target.replace(/\\n/g, '\\r\\n');\n if (original.includes(crlfTarget)) {\n matchedTarget = crlfTarget;\n }\n } else if (!hasCrlf && target.includes('\\r\\n')) {\n const lfTarget = target.replace(/\\r\\n/g, '\\n');\n if (original.includes(lfTarget)) {\n matchedTarget = lfTarget;\n }\n }\n }\n\n if (!original.includes(matchedTarget)) {\n return {\n success: false,\n output: `Error: Target string not found in ${validation.relativePath}. Please verify whitespace, indentation, or read the file again to confirm line contents.`,\n error: 'Target string not found'\n };\n }\n\n const occurrences = original.split(matchedTarget).length - 1;\n if (occurrences > 1) {\n return {\n success: false,\n output: `Warning: Target string appears ${occurrences} times in ${validation.relativePath}. Please provide more surrounding context in 'target' to make the match unique.`,\n error: 'Target string ambiguous'\n };\n }\n\n const matchedReplacement = hasCrlf && !replacement.includes('\\r\\n')\n ? replacement.replace(/\\n/g, '\\r\\n')\n : replacement;\n\n const updated = original.replace(matchedTarget, matchedReplacement);\n\n // Request approval with diff preview\n const approved = await context.requestApproval({\n type: 'file_edit',\n summary: `Edit file: ${validation.relativePath}`,\n details: {\n path: validation.relativePath,\n before: original,\n after: updated,\n diff: formatTerminalDiff(validation.relativePath, original, updated)\n }\n });\n\n if (!approved) {\n return {\n success: false,\n output: `Edit rejected: User declined approval to edit '${validation.relativePath}'.`,\n error: 'Approval rejected'\n };\n }\n\n fs.writeFileSync(validation.resolvedPath, updated, 'utf8');\n return {\n success: true,\n output: `Successfully applied edit to ${validation.relativePath}`,\n metadata: { path: validation.relativePath }\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Failed to edit file: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport fg from 'fast-glob';\nimport ignore from 'ignore';\nimport type { OrbitTool } from './types.js';\nimport { validateWorkspacePath } from '../security/sandbox.js';\n\nconst DEFAULT_IGNORED_DIRS = [\n 'node_modules',\n '.git',\n '.codelantern',\n '.lantern',\n '.orbit',\n 'dist',\n 'build',\n 'coverage',\n '.turbo',\n '.next',\n '.cache',\n '.gemini',\n '.vscode',\n '.idea'\n];\n\nfunction getWorkspaceIgnore(workspaceDir: string) {\n const ig = ignore();\n ig.add(DEFAULT_IGNORED_DIRS);\n\n const gitignorePath = path.join(workspaceDir, '.gitignore');\n if (fs.existsSync(gitignorePath)) {\n try {\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');\n ig.add(gitignoreContent);\n } catch {\n // ignore read error\n }\n }\n\n return ig;\n}\n\nexport const listDirectoryTool: OrbitTool = {\n definition: {\n name: 'list_directory',\n description: 'List the contents of a directory in the workspace, respecting ignore rules.',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Relative path of directory to inspect. Omit or pass empty for workspace root.'\n },\n depth: {\n type: 'integer',\n description: 'Maximum depth of recursion (default 1, max 4).'\n }\n }\n }\n },\n async execute(args, context) {\n const rawPath = String(args.path || '').trim();\n let realWorkspace = path.resolve(context.workspace);\n try {\n if (fs.existsSync(realWorkspace)) realWorkspace = fs.realpathSync(realWorkspace);\n } catch {\n // ignore\n }\n\n const validation = validateWorkspacePath(rawPath || '.', realWorkspace);\n\n if (!validation.allowed) {\n return {\n success: false,\n output: `Error: Access denied. ${validation.reason}`,\n error: validation.reason\n };\n }\n\n if (!fs.existsSync(validation.resolvedPath)) {\n return {\n success: false,\n output: `Directory not found: ${validation.relativePath || '.'}`,\n error: 'Not found'\n };\n }\n\n const maxDepth = Math.min(Math.max(1, Number(args.depth) || 1), 4);\n const ig = getWorkspaceIgnore(realWorkspace);\n\n try {\n const results: string[] = [];\n\n function walk(currentDir: string, currentDepth: number) {\n if (currentDepth > maxDepth) return;\n\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n const relToWorkspace = path.relative(realWorkspace, fullPath).replace(/\\\\/g, '/');\n\n // Check ignore\n if (ig.ignores(relToWorkspace) || DEFAULT_IGNORED_DIRS.includes(entry.name)) {\n continue;\n }\n\n const prefix = ' '.repeat(currentDepth - 1);\n if (entry.isDirectory()) {\n results.push(`${prefix}📁 ${entry.name}/`);\n walk(fullPath, currentDepth + 1);\n } else {\n results.push(`${prefix}📄 ${entry.name}`);\n }\n }\n }\n\n walk(validation.resolvedPath, 1);\n\n return {\n success: true,\n output: results.length > 0 ? results.join('\\n') : '(empty directory)',\n metadata: { count: results.length }\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Error listing directory: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n\nexport const fileSearchTool: OrbitTool = {\n definition: {\n name: 'file_search',\n description: 'Find files matching a glob pattern or partial filename across the project workspace.',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {\n pattern: {\n type: 'string',\n description: 'Glob pattern (e.g. \"**/*.ts\", \"src/**/*.json\", \"*config*\").'\n },\n directory: {\n type: 'string',\n description: 'Subdirectory to search inside. Defaults to workspace root.'\n }\n },\n required: ['pattern']\n }\n },\n async execute(args, context) {\n const rawPattern = String(args.pattern || '').trim();\n if (!rawPattern) {\n return { success: false, output: 'Pattern parameter is required.', error: 'Missing pattern' };\n }\n\n let realWorkspace = path.resolve(context.workspace);\n try {\n if (fs.existsSync(realWorkspace)) realWorkspace = fs.realpathSync(realWorkspace);\n } catch {\n // ignore\n }\n\n const subDir = String(args.directory || '').trim();\n const searchRoot = subDir ? path.resolve(realWorkspace, subDir) : realWorkspace;\n\n const validation = validateWorkspacePath(path.relative(realWorkspace, searchRoot) || '.', realWorkspace);\n if (!validation.allowed) {\n return { success: false, output: `Access denied: ${validation.reason}`, error: validation.reason };\n }\n\n try {\n // Fast-glob requires forward slashes on all platforms including Windows\n const normalizedSearchRoot = searchRoot.replace(/\\\\/g, '/');\n const normalizedPattern = rawPattern.replace(/\\\\/g, '/');\n const globPattern = normalizedPattern.includes('/') ? normalizedPattern : `**/*${normalizedPattern}*`;\n\n const matches = await fg(globPattern, {\n cwd: normalizedSearchRoot,\n dot: false,\n ignore: DEFAULT_IGNORED_DIRS.map(d => `**/${d}/**`),\n onlyFiles: true\n });\n\n const ig = getWorkspaceIgnore(realWorkspace);\n const filtered = matches.filter(m => {\n const full = path.join(searchRoot, m);\n const rel = path.relative(realWorkspace, full).replace(/\\\\/g, '/');\n return !ig.ignores(rel);\n });\n\n if (filtered.length === 0) {\n return {\n success: true,\n output: `No files found matching '${rawPattern}' in ${subDir || 'workspace'}.`\n };\n }\n\n return {\n success: true,\n output: filtered.slice(0, 100).join('\\n') + (filtered.length > 100 ? `\\n... and ${filtered.length - 100} more matches` : ''),\n metadata: { total: filtered.length }\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Error during file search: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n\nexport const grepSearchTool: OrbitTool = {\n definition: {\n name: 'grep_search',\n description: 'Search for text or regex patterns within project files.',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Search string or regular expression to search for.'\n },\n path_pattern: {\n type: 'string',\n description: 'Optional glob pattern to restrict files searched (e.g. \"*.ts\", \"src/**/*.js\").'\n }\n },\n required: ['query']\n }\n },\n async execute(args, context) {\n const query = String(args.query || '').trim();\n if (!query) {\n return { success: false, output: 'Query parameter is required.', error: 'Missing query' };\n }\n\n let realWorkspace = path.resolve(context.workspace);\n try {\n if (fs.existsSync(realWorkspace)) realWorkspace = fs.realpathSync(realWorkspace);\n } catch {\n // ignore\n }\n\n const pathPattern = args.path_pattern\n ? String(args.path_pattern).replace(/\\\\/g, '/')\n : '**/*';\n\n try {\n const normalizedCwd = realWorkspace.replace(/\\\\/g, '/');\n const files = await fg(pathPattern, {\n cwd: normalizedCwd,\n dot: false,\n ignore: DEFAULT_IGNORED_DIRS.map(d => `**/${d}/**`),\n onlyFiles: true\n });\n\n const ig = getWorkspaceIgnore(realWorkspace);\n const matchingLines: string[] = [];\n const regex = new RegExp(query, 'i');\n\n for (const relFile of files) {\n const normalizedRel = relFile.replace(/\\\\/g, '/');\n if (ig.ignores(normalizedRel)) continue;\n if (relFile.endsWith('.map') || relFile.endsWith('.min.js') || relFile.endsWith('.lock')) continue;\n\n const fullPath = path.join(realWorkspace, relFile);\n try {\n const stat = fs.statSync(fullPath);\n if (stat.size > 500 * 1024) continue; // Skip files > 500KB\n\n const rawContent = fs.readFileSync(fullPath, 'utf8');\n // Handle Windows CRLF\n const lines = rawContent.replace(/\\r\\n/g, '\\n').split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i])) {\n matchingLines.push(`${normalizedRel}:${i + 1}: ${lines[i].trim()}`);\n if (matchingLines.length >= 100) break;\n }\n }\n } catch {\n // ignore binary / read error\n }\n\n if (matchingLines.length >= 100) break;\n }\n\n if (matchingLines.length === 0) {\n return {\n success: true,\n output: `No occurrences found for \"${query}\".`\n };\n }\n\n return {\n success: true,\n output: matchingLines.join('\\n') + (matchingLines.length >= 100 ? '\\n(Search truncated to first 100 matches)' : ''),\n metadata: { matchCount: matchingLines.length }\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Error executing grep search: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n\nexport const projectTreeTool: OrbitTool = {\n definition: {\n name: 'project_tree',\n description: 'Display an ASCII tree visualization of the project structure.',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {\n directory: {\n type: 'string',\n description: 'Optional subfolder to show tree for. Defaults to workspace root.'\n },\n max_depth: {\n type: 'integer',\n description: 'Maximum depth (default 3, max 5).'\n }\n }\n }\n },\n async execute(args, context) {\n const rawDir = String(args.directory || '').trim();\n let realWorkspace = path.resolve(context.workspace);\n try {\n if (fs.existsSync(realWorkspace)) realWorkspace = fs.realpathSync(realWorkspace);\n } catch {\n // ignore\n }\n\n const validation = validateWorkspacePath(rawDir || '.', realWorkspace);\n\n if (!validation.allowed) {\n return { success: false, output: `Access denied: ${validation.reason}`, error: validation.reason };\n }\n\n const maxDepth = Math.min(Math.max(1, Number(args.max_depth) || 3), 5);\n const ig = getWorkspaceIgnore(realWorkspace);\n\n try {\n const lines: string[] = [path.basename(validation.resolvedPath) || '.'];\n\n function buildTree(currentDir: string, prefix: string, depth: number) {\n if (depth > maxDepth) return;\n\n let entries: fs.Dirent[] = [];\n try {\n entries = fs.readdirSync(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n const validEntries = entries.filter(e => {\n if (DEFAULT_IGNORED_DIRS.includes(e.name)) return false;\n const full = path.join(currentDir, e.name);\n const rel = path.relative(realWorkspace, full).replace(/\\\\/g, '/');\n return !ig.ignores(rel);\n });\n\n validEntries.sort((a, b) => {\n if (a.isDirectory() && !b.isDirectory()) return -1;\n if (!a.isDirectory() && b.isDirectory()) return 1;\n return a.name.localeCompare(b.name);\n });\n\n validEntries.forEach((entry, idx) => {\n const isLast = idx === validEntries.length - 1;\n const pointer = isLast ? '└── ' : '├── ';\n const fullPath = path.join(currentDir, entry.name);\n\n lines.push(`${prefix}${pointer}${entry.name}${entry.isDirectory() ? '/' : ''}`);\n\n if (entry.isDirectory()) {\n buildTree(fullPath, prefix + (isLast ? ' ' : '│ '), depth + 1);\n }\n });\n }\n\n buildTree(validation.resolvedPath, '', 1);\n\n return {\n success: true,\n output: lines.join('\\n')\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Error building tree: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n","import { exec } from 'node:child_process';\nimport type { OrbitTool } from './types.js';\nimport { validateCommand } from '../security/commandGuard.js';\nimport { sanitizeSecrets } from '../security/secrets.js';\n\nexport const runCommandTool: OrbitTool = {\n definition: {\n name: 'run_command',\n description: 'Execute a terminal shell command inside the project workspace directory.',\n readOnly: false,\n parameters: {\n type: 'object',\n properties: {\n command: {\n type: 'string',\n description: 'The shell command to execute (e.g. \"npm test\", \"git status\", \"dir\").'\n },\n timeout_ms: {\n type: 'integer',\n description: 'Optional execution timeout in milliseconds (default 30000).'\n }\n },\n required: ['command']\n }\n },\n async execute(args, context) {\n const command = String(args.command || '').trim();\n if (!command) {\n return { success: false, output: 'Command argument is required.', error: 'Missing command' };\n }\n\n // Safety validation\n const guard = validateCommand(command);\n if (!guard.allowed) {\n return {\n success: false,\n output: `Command blocked by security guard: ${guard.reason}`,\n error: guard.reason\n };\n }\n\n // Request approval unless YOLO mode\n const approved = await context.requestApproval({\n type: 'command',\n summary: `Execute command: ${command}`,\n details: {\n command\n }\n });\n\n if (!approved) {\n return {\n success: false,\n output: `Command execution cancelled: User declined approval for '${command}'.`,\n error: 'Approval rejected'\n };\n }\n\n const timeout = Math.min(Math.max(1000, Number(args.timeout_ms) || 30000), 120000);\n const startTime = Date.now();\n\n return new Promise(resolve => {\n exec(\n command,\n {\n cwd: context.workspace,\n timeout,\n maxBuffer: 5 * 1024 * 1024,\n windowsHide: true,\n env: {\n ...process.env,\n CI: 'true'\n }\n },\n (error, stdout, stderr) => {\n const duration = Date.now() - startTime;\n const exitCode = error && typeof error.code === 'number' ? error.code : error ? 1 : 0;\n\n let rawOutput = '';\n if (stdout) rawOutput += stdout;\n if (stderr) {\n if (rawOutput) rawOutput += '\\n--- stderr ---\\n';\n rawOutput += stderr;\n }\n\n if (!rawOutput) {\n rawOutput = '(no output)';\n }\n\n // Normalize Windows CRLF line endings\n const normalized = rawOutput.replace(/\\r\\n/g, '\\n');\n\n // Sanitize secrets from output\n const cleanOutput = sanitizeSecrets(normalized.trim());\n\n const formattedOutput = [\n `Command: ${command}`,\n `Exit code: ${exitCode}`,\n `Duration: ${duration}ms`,\n 'Output:',\n cleanOutput\n ].join('\\n');\n\n resolve({\n success: exitCode === 0,\n output: formattedOutput,\n error: error ? error.message : undefined,\n metadata: { exitCode, duration }\n });\n }\n );\n });\n }\n};\n","import { exec } from 'node:child_process';\nimport type { OrbitTool } from './types.js';\n\nexport const gitStatusTool: OrbitTool = {\n definition: {\n name: 'git_status',\n description: 'Get current Git working tree status (branch, modified, untracked files).',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {}\n }\n },\n async execute(_args, context) {\n return new Promise(resolve => {\n exec('git status --short --branch', { cwd: context.workspace, timeout: 10000 }, (error, stdout, stderr) => {\n if (error) {\n return resolve({\n success: false,\n output: stderr.includes('not a git repository')\n ? 'Workspace is not a Git repository.'\n : `Git status error: ${error.message}`,\n error: error.message\n });\n }\n\n const out = stdout.trim() || 'Working tree clean. Nothing to commit.';\n resolve({\n success: true,\n output: out\n });\n });\n });\n }\n};\n\nexport const gitDiffTool: OrbitTool = {\n definition: {\n name: 'git_diff',\n description: 'Inspect git diff of unstaged or staged changes in the workspace repository.',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {\n staged: {\n type: 'boolean',\n description: 'If true, shows diff of staged changes (--staged). Defaults to false.'\n }\n }\n }\n },\n async execute(args, context) {\n const cmd = args.staged ? 'git diff --staged' : 'git diff';\n\n return new Promise(resolve => {\n exec(cmd, { cwd: context.workspace, timeout: 15000, maxBuffer: 5 * 1024 * 1024 }, (error, stdout, stderr) => {\n if (error) {\n return resolve({\n success: false,\n output: `Git diff error: ${error.message}`,\n error: error.message\n });\n }\n\n const out = stdout.trim();\n if (!out) {\n return resolve({\n success: true,\n output: args.staged ? 'No staged changes.' : 'No unstaged working tree changes.'\n });\n }\n\n // Limit diff output size to 50KB to preserve model context\n const truncated = out.length > 50000 ? out.slice(0, 50000) + '\\n\\n[Diff truncated: exceeded 50KB]' : out;\n\n resolve({\n success: true,\n output: truncated\n });\n });\n });\n }\n};\n","import type { OrbitTool } from './types.js';\n\nexport const webSearchTool: OrbitTool = {\n definition: {\n name: 'web_search',\n description: 'Search the web for up-to-date documentation, libraries, or error troubleshooting solutions.',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Search terms or question to look up.'\n }\n },\n required: ['query']\n }\n },\n async execute(args) {\n const query = String(args.query || '').trim();\n if (!query) {\n return { success: false, output: 'Missing query argument.', error: 'Missing query' };\n }\n\n try {\n // Use DuckDuckGo HTML / instant API or fetch fallback for lightweight terminal searches\n const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 8000);\n\n const res = await fetch(url, {\n headers: {\n 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko)'\n },\n signal: controller.signal\n });\n\n clearTimeout(timer);\n\n if (!res.ok) {\n return {\n success: true,\n output: `Search for \"${query}\" completed with status ${res.status}. No immediate text parsed.`\n };\n }\n\n const html = await res.text();\n // Extract snippet links\n const snippets: string[] = [];\n const regex = /<a class=\"result__snippet[^>]*>([\\s\\S]*?)<\\/a>/gi;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(html)) !== null && snippets.length < 5) {\n const text = match[1].replace(/<[^>]+>/g, '').replace(/\\s+/g, ' ').trim();\n if (text) {\n snippets.push(`- ${text}`);\n }\n }\n\n if (snippets.length === 0) {\n return {\n success: true,\n output: `Web search executed for \"${query}\". Found related topics, but snippets were condensed.`\n };\n }\n\n return {\n success: true,\n output: `Search results for \"${query}\":\\n\\n${snippets.join('\\n\\n')}`,\n metadata: { resultCount: snippets.length }\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Web search could not reach external network: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n","import type { OrbitTool } from './types.js';\nimport type { ToolDefinition, ToolExecutionContext, ToolExecutionResult } from '../types.js';\nimport { readFileTool, writeFileTool, editFileTool } from './fsTools.js';\nimport { listDirectoryTool, fileSearchTool, grepSearchTool, projectTreeTool } from './searchTools.js';\nimport { runCommandTool } from './bashTool.js';\nimport { gitStatusTool, gitDiffTool } from './gitTools.js';\nimport { webSearchTool } from './webSearchTool.js';\n\nexport class ToolRegistry {\n private tools: Map<string, OrbitTool> = new Map();\n\n constructor() {\n this.registerBuiltins();\n }\n\n private registerBuiltins(): void {\n const builtins: OrbitTool[] = [\n readFileTool,\n writeFileTool,\n editFileTool,\n listDirectoryTool,\n fileSearchTool,\n grepSearchTool,\n projectTreeTool,\n runCommandTool,\n gitStatusTool,\n gitDiffTool,\n webSearchTool\n ];\n\n for (const tool of builtins) {\n this.tools.set(tool.definition.name, tool);\n }\n }\n\n public registerTool(tool: OrbitTool): void {\n this.tools.set(tool.definition.name, tool);\n }\n\n public registerTools(tools: OrbitTool[]): void {\n for (const tool of tools) {\n this.tools.set(tool.definition.name, tool);\n }\n }\n\n public getTool(name: string): OrbitTool | undefined {\n return this.tools.get(name);\n }\n\n public getDefinitions(planMode = false): ToolDefinition[] {\n const defs: ToolDefinition[] = [];\n\n for (const tool of this.tools.values()) {\n if (planMode && !tool.definition.readOnly) {\n // In plan mode, exclude modification tools to prevent the model from even hallucinating edits\n continue;\n }\n defs.push(tool.definition);\n }\n\n return defs;\n }\n\n public async executeTool(\n name: string,\n args: Record<string, unknown>,\n context: ToolExecutionContext\n ): Promise<ToolExecutionResult> {\n const tool = this.tools.get(name);\n\n if (!tool) {\n return {\n success: false,\n output: `Error: Unknown tool \"${name}\". Available tools: ${Array.from(this.tools.keys()).join(', ')}`,\n error: 'Tool not found'\n };\n }\n\n if (context.planMode && !tool.definition.readOnly) {\n return {\n success: false,\n output: `Plan mode is active (read-only). Action \"${name}\" was blocked.`,\n error: 'Plan mode read-only restriction'\n };\n }\n\n try {\n return await tool.execute(args, context);\n } catch (err: any) {\n return {\n success: false,\n output: `Error executing tool \"${name}\": ${err.message}`,\n error: err.message\n };\n }\n }\n}\n","import type { OrbitConfig } from '../types.js';\n\nexport const DEFAULT_CONFIG: OrbitConfig = {\n defaultModel: 'gemini-3.8-flash',\n maxSteps: 25,\n temperature: 0.2,\n maxOutputTokens: 8192,\n yolo: false,\n theme: 'default',\n autoCompactThreshold: 30, // turns before auto-compacting\n timeoutMs: 60000,\n mcpServers: {}\n};\n\nexport const ALLOWED_CONFIG_KEYS = [\n 'defaultModel',\n 'maxSteps',\n 'temperature',\n 'maxOutputTokens',\n 'yolo',\n 'theme',\n 'autoCompactThreshold',\n 'timeoutMs'\n] as const;\n\nexport type ConfigKey = (typeof ALLOWED_CONFIG_KEYS)[number];\n\nexport function validateConfigValue(key: string, value: unknown): { valid: boolean; error?: string; parsedValue?: unknown } {\n switch (key) {\n case 'defaultModel':\n if (typeof value !== 'string' || value.trim().length === 0) {\n return { valid: false, error: 'defaultModel must be a non-empty string' };\n }\n return { valid: true, parsedValue: value.trim() };\n\n case 'maxSteps': {\n const num = Number(value);\n if (isNaN(num) || num < 1 || num > 100) {\n return { valid: false, error: 'maxSteps must be a number between 1 and 100' };\n }\n return { valid: true, parsedValue: Math.round(num) };\n }\n\n case 'temperature': {\n const num = Number(value);\n if (isNaN(num) || num < 0 || num > 2) {\n return { valid: false, error: 'temperature must be a number between 0.0 and 2.0' };\n }\n return { valid: true, parsedValue: num };\n }\n\n case 'maxOutputTokens': {\n const num = Number(value);\n if (isNaN(num) || num < 256 || num > 65536) {\n return { valid: false, error: 'maxOutputTokens must be between 256 and 65536' };\n }\n return { valid: true, parsedValue: Math.round(num) };\n }\n\n case 'yolo': {\n if (typeof value === 'boolean') return { valid: true, parsedValue: value };\n if (value === 'true' || value === '1') return { valid: true, parsedValue: true };\n if (value === 'false' || value === '0') return { valid: true, parsedValue: false };\n return { valid: false, error: 'yolo must be a boolean (true/false)' };\n }\n\n case 'theme': {\n if (value === 'default' || value === 'ocean' || value === 'minimal') {\n return { valid: true, parsedValue: value };\n }\n return { valid: false, error: \"theme must be 'default', 'ocean', or 'minimal'\" };\n }\n\n case 'autoCompactThreshold': {\n const num = Number(value);\n if (isNaN(num) || num < 5 || num > 200) {\n return { valid: false, error: 'autoCompactThreshold must be a number between 5 and 200' };\n }\n return { valid: true, parsedValue: Math.round(num) };\n }\n\n case 'timeoutMs': {\n const num = Number(value);\n if (isNaN(num) || num < 5000) {\n return { valid: false, error: 'timeoutMs must be at least 5000 (ms)' };\n }\n return { valid: true, parsedValue: Math.round(num) };\n }\n\n default:\n return { valid: false, error: `Unknown configuration key: ${key}` };\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { DEFAULT_CONFIG, validateConfigValue, type ConfigKey } from './schema.js';\nimport type { OrbitConfig } from '../types.js';\n\nexport function getLanternHomeDir(): string {\n const customHome = process.env.CODELANTERN_HOME || process.env.LANTERN_HOME;\n if (customHome) {\n if (!fs.existsSync(customHome)) {\n try {\n fs.mkdirSync(customHome, { recursive: true });\n } catch {\n // ignore\n }\n }\n return customHome;\n }\n\n const defaultDir = path.join(os.homedir(), '.codelantern');\n if (!fs.existsSync(defaultDir)) {\n try {\n fs.mkdirSync(defaultDir, { recursive: true });\n } catch {\n // ignore\n }\n }\n return defaultDir;\n}\n\nexport function getConfigFilePath(): string {\n return path.join(getLanternHomeDir(), 'config.json');\n}\n\nexport function loadConfig(): OrbitConfig {\n const configPath = getConfigFilePath();\n if (!fs.existsSync(configPath)) {\n return { ...DEFAULT_CONFIG };\n }\n\n try {\n const raw = fs.readFileSync(configPath, 'utf8');\n const parsed = JSON.parse(raw);\n\n const merged: OrbitConfig = {\n ...DEFAULT_CONFIG,\n ...parsed\n };\n\n if (!merged.mcpServers || typeof merged.mcpServers !== 'object') {\n merged.mcpServers = {};\n }\n\n return merged;\n } catch {\n return { ...DEFAULT_CONFIG };\n }\n}\n\nexport function saveConfig(config: OrbitConfig): void {\n const configPath = getConfigFilePath();\n\n const safeConfig: OrbitConfig = {\n defaultModel: config.defaultModel || DEFAULT_CONFIG.defaultModel,\n maxSteps: config.maxSteps || DEFAULT_CONFIG.maxSteps,\n temperature: config.temperature ?? DEFAULT_CONFIG.temperature,\n maxOutputTokens: config.maxOutputTokens || DEFAULT_CONFIG.maxOutputTokens,\n yolo: Boolean(config.yolo),\n theme: config.theme || DEFAULT_CONFIG.theme,\n autoCompactThreshold: config.autoCompactThreshold || DEFAULT_CONFIG.autoCompactThreshold,\n timeoutMs: config.timeoutMs || DEFAULT_CONFIG.timeoutMs,\n mcpServers: config.mcpServers || {}\n };\n\n try {\n fs.writeFileSync(configPath, JSON.stringify(safeConfig, null, 2), {\n encoding: 'utf8'\n });\n } catch (err: any) {\n console.error(`Warning: Failed to save config to ${configPath}: ${err.message}`);\n }\n}\n\nexport function setConfigValue(key: string, value: unknown): { success: boolean; error?: string; updatedConfig?: OrbitConfig } {\n const validation = validateConfigValue(key, value);\n if (!validation.valid) {\n return { success: false, error: validation.error };\n }\n\n const current = loadConfig();\n (current as unknown as Record<string, unknown>)[key] = validation.parsedValue;\n saveConfig(current);\n\n return { success: true, updatedConfig: current };\n}\n\nexport function getConfigValue<K extends keyof OrbitConfig>(key: K): OrbitConfig[K] {\n const current = loadConfig();\n return current[key];\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { getLanternHomeDir } from '../config/config.js';\nimport type { McpServerConfig } from '../types.js';\n\nexport function getMcpConfigPath(): string {\n return path.join(getLanternHomeDir(), 'mcp.json');\n}\n\nexport function loadMcpConfig(): Record<string, McpServerConfig> {\n const filePath = getMcpConfigPath();\n if (!fs.existsSync(filePath)) {\n return {};\n }\n\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === 'object') {\n return (parsed.mcpServers || parsed) as Record<string, McpServerConfig>;\n }\n return {};\n } catch {\n return {};\n }\n}\n\nexport function saveMcpConfig(servers: Record<string, McpServerConfig>): void {\n const filePath = getMcpConfigPath();\n const data = { mcpServers: servers };\n try {\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), { encoding: 'utf8' });\n } catch (err: any) {\n console.error(`Warning: Failed to save MCP config: ${err.message}`);\n }\n}\n\nexport function addMcpServer(name: string, config: McpServerConfig): void {\n const current = loadMcpConfig();\n current[name] = config;\n saveMcpConfig(current);\n}\n\nexport function removeMcpServer(name: string): boolean {\n const current = loadMcpConfig();\n if (current[name]) {\n delete current[name];\n saveMcpConfig(current);\n return true;\n }\n return false;\n}\n\nexport function toggleMcpServer(name: string, disabled: boolean): boolean {\n const current = loadMcpConfig();\n if (current[name]) {\n current[name].disabled = disabled;\n saveMcpConfig(current);\n return true;\n }\n return false;\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport { loadMcpConfig } from './mcpConfig.js';\nimport type { OrbitTool } from '../tools/types.js';\nimport type { McpServerConfig, ToolDefinition } from '../types.js';\n\ninterface ActiveMcpConnection {\n name: string;\n client: Client;\n transport: StdioClientTransport;\n tools: OrbitTool[];\n}\n\nexport class McpManager {\n private connections: Map<string, ActiveMcpConnection> = new Map();\n\n public async initialize(): Promise<OrbitTool[]> {\n const servers = loadMcpConfig();\n const allTools: OrbitTool[] = [];\n\n for (const [serverName, config] of Object.entries(servers)) {\n if (config.disabled) {\n continue;\n }\n\n try {\n const tools = await this.connectServer(serverName, config);\n allTools.push(...tools);\n } catch (err: any) {\n console.error(`Warning: Failed to connect MCP server '${serverName}': ${err.message}`);\n }\n }\n\n return allTools;\n }\n\n public async connectServer(serverName: string, config: McpServerConfig): Promise<OrbitTool[]> {\n if (this.connections.has(serverName)) {\n await this.disconnectServer(serverName);\n }\n\n const safeEnv: Record<string, string> = {};\n for (const [k, v] of Object.entries(process.env)) {\n if (typeof v === 'string') safeEnv[k] = v;\n }\n if (config.env) {\n Object.assign(safeEnv, config.env);\n }\n\n const transport = new StdioClientTransport({\n command: config.command,\n args: config.args || [],\n env: safeEnv\n });\n\n const client = new Client(\n {\n name: `orbit-client-${serverName}`,\n version: '1.0.0'\n },\n {\n capabilities: {}\n }\n );\n\n await client.connect(transport);\n\n const toolsResponse = await client.listTools();\n const serverTools: OrbitTool[] = [];\n\n for (const mcpTool of toolsResponse.tools) {\n const toolName = `mcp__${serverName}__${mcpTool.name}`.replace(/[^a-zA-Z0-9_]/g, '_');\n\n // Convert MCP tool inputSchema into ToolDefinition parameters\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n if (mcpTool.inputSchema && typeof mcpTool.inputSchema === 'object') {\n const schema = mcpTool.inputSchema as any;\n if (schema.properties && typeof schema.properties === 'object') {\n for (const [k, v] of Object.entries<any>(schema.properties)) {\n properties[k] = {\n type: v.type || 'string',\n description: v.description || ''\n };\n }\n }\n if (Array.isArray(schema.required)) {\n required.push(...schema.required);\n }\n }\n\n const definition: ToolDefinition = {\n name: toolName,\n description: `[MCP Server: ${serverName}] ${mcpTool.description || mcpTool.name}`,\n readOnly: false,\n parameters: {\n type: 'object',\n properties,\n required\n }\n };\n\n const orbitTool: OrbitTool = {\n definition,\n async execute(args, context) {\n // Check approval\n const approved = await context.requestApproval({\n type: 'command',\n summary: `Run MCP tool ${serverName}:${mcpTool.name}`,\n details: {\n command: `mcp ${serverName} ${mcpTool.name} ${JSON.stringify(args)}`\n }\n });\n\n if (!approved) {\n return {\n success: false,\n output: `Execution denied by user for MCP tool ${serverName}:${mcpTool.name}`,\n error: 'Approval rejected'\n };\n }\n\n try {\n const result = await client.callTool({\n name: mcpTool.name,\n arguments: args\n });\n\n let textOutput = '';\n if (Array.isArray(result.content)) {\n for (const item of result.content) {\n if (item.type === 'text') {\n textOutput += item.text + '\\n';\n } else {\n textOutput += JSON.stringify(item) + '\\n';\n }\n }\n } else {\n textOutput = JSON.stringify(result.content);\n }\n\n return {\n success: !result.isError,\n output: textOutput.trim(),\n error: result.isError ? textOutput : undefined\n };\n } catch (err: any) {\n return {\n success: false,\n output: `MCP execution error: ${err.message}`,\n error: err.message\n };\n }\n }\n };\n\n serverTools.push(orbitTool);\n }\n\n this.connections.set(serverName, {\n name: serverName,\n client,\n transport,\n tools: serverTools\n });\n\n return serverTools;\n }\n\n public async disconnectServer(serverName: string): Promise<void> {\n const conn = this.connections.get(serverName);\n if (conn) {\n try {\n await conn.client.close();\n } catch {\n // ignore close error\n }\n this.connections.delete(serverName);\n }\n }\n\n public async closeAll(): Promise<void> {\n for (const [serverName] of this.connections) {\n await this.disconnectServer(serverName);\n }\n }\n}\n","import readline from 'node:readline';\nimport pc from 'picocolors';\nimport type { ApprovalRequest } from '../types.js';\nimport { formatTerminalDiff, formatNewFilePreview } from './diffViewer.js';\n\nexport class ApprovalEngine {\n private yolo: boolean;\n private planMode: boolean;\n\n constructor(options: { yolo?: boolean; planMode?: boolean }) {\n this.yolo = Boolean(options.yolo);\n this.planMode = Boolean(options.planMode);\n }\n\n public isYolo(): boolean {\n return this.yolo;\n }\n\n public setYolo(val: boolean): void {\n this.yolo = val;\n }\n\n public isPlanMode(): boolean {\n return this.planMode;\n }\n\n public async requestApproval(req: ApprovalRequest): Promise<boolean> {\n // In plan mode, all write/edit/command operations are strictly rejected\n if (this.planMode) {\n console.log(pc.yellow(`\\n[Plan Mode] Tool action skipped (read-only): ${req.summary}`));\n return false;\n }\n\n // In YOLO mode, auto-approve\n if (this.yolo) {\n console.log(pc.dim(`⚡ [YOLO] Auto-approved: ${req.summary}`));\n return true;\n }\n\n // Present details to the user\n console.log('\\n' + pc.bold(pc.yellow('━━━━━━━━━━━━━━━━ Action Approval Required ━━━━━━━━━━━━━━━━')));\n console.log(pc.bold('Action: ') + req.summary);\n\n if (req.type === 'file_edit' && req.details?.before !== undefined && req.details?.after !== undefined) {\n const diffOutput = req.details.diff || formatTerminalDiff(\n req.details.path || 'file',\n req.details.before,\n req.details.after\n );\n console.log('\\n' + diffOutput + '\\n');\n } else if (req.type === 'file_write' && req.details?.after !== undefined) {\n const preview = formatNewFilePreview(req.details.path || 'file', req.details.after);\n console.log('\\n' + preview + '\\n');\n } else if (req.type === 'command' && req.details?.command) {\n console.log(pc.cyan(`$ ${pc.bold(req.details.command)}\\n`));\n }\n\n // Prompt user\n const answer = await this.promptUser(\n pc.bold(pc.yellow('Approve this action?')) + ' [y/N / (a)ll-yolo]: '\n );\n\n const clean = answer.trim().toLowerCase();\n\n if (clean === 'a' || clean === 'all' || clean === 'yolo') {\n this.yolo = true;\n console.log(pc.yellow('⚡ YOLO mode enabled for remainder of session.\\n'));\n return true;\n }\n\n if (clean === 'y' || clean === 'yes') {\n console.log(pc.green('✓ Approved.\\n'));\n return true;\n }\n\n console.log(pc.red('✗ Denied by user.\\n'));\n return false;\n }\n\n private promptUser(question: string): Promise<string> {\n if (!process.stdin.isTTY) {\n // In non-interactive mode without YOLO, default to deny\n return Promise.resolve('no');\n }\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n return new Promise(resolve => {\n rl.question(question, answer => {\n rl.close();\n resolve(answer);\n });\n });\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nconst INSTRUCTION_FILES = [\n 'LANTERN.md',\n 'CODELANTERN.md',\n '.codelantern/instructions.md',\n '.lantern.md',\n 'GEMINI.md',\n 'ORBIT.md'\n];\n\nexport interface ProjectInstructions {\n found: boolean;\n filePath?: string;\n content?: string;\n}\n\nexport function loadProjectInstructions(workspaceDir: string): ProjectInstructions {\n for (const filename of INSTRUCTION_FILES) {\n const filePath = path.join(workspaceDir, filename);\n if (fs.existsSync(filePath)) {\n try {\n const stat = fs.statSync(filePath);\n if (stat.isFile() && stat.size <= 200 * 1024) { // Limit to 200KB max\n const content = fs.readFileSync(filePath, 'utf8').trim();\n if (content.length > 0) {\n return {\n found: true,\n filePath,\n content\n };\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n\n return { found: false };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport { getLanternHomeDir } from '../config/config.js';\nimport { sanitizeSecrets } from '../security/secrets.js';\nimport type { OrbitSession, ConversationTurn, TokenUsage } from '../types.js';\n\nexport function getSessionsDir(): string {\n const dir = path.join(getLanternHomeDir(), 'sessions');\n if (!fs.existsSync(dir)) {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // ignore\n }\n }\n return dir;\n}\n\nexport function generateSessionId(): string {\n const timestamp = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14);\n const rand = crypto.randomBytes(3).toString('hex');\n return `session_${timestamp}_${rand}`;\n}\n\nexport function createNewSession(workspace: string, model: string, initialTitle?: string): OrbitSession {\n const now = new Date().toISOString();\n return {\n id: generateSessionId(),\n title: initialTitle || `Session in ${path.basename(workspace) || 'workspace'}`,\n createdAt: now,\n updatedAt: now,\n workspace: path.resolve(workspace),\n model,\n turns: [],\n totalUsage: {\n promptTokens: 0,\n candidatesTokens: 0,\n totalTokens: 0\n }\n };\n}\n\nexport function saveSession(session: OrbitSession): void {\n const sessionsDir = getSessionsDir();\n const filePath = path.join(sessionsDir, `${session.id}.json`);\n\n session.updatedAt = new Date().toISOString();\n\n // Deep sanitize secrets in all text fields\n const serialized = JSON.stringify(session, (_key, val) => {\n if (typeof val === 'string') {\n return sanitizeSecrets(val);\n }\n return val;\n }, 2);\n\n try {\n fs.writeFileSync(filePath, serialized, { encoding: 'utf8' });\n } catch (err: any) {\n console.error(`Warning: Failed to save session to ${filePath}: ${err.message}`);\n }\n}\n\nexport function loadSession(sessionId: string): OrbitSession | null {\n const sessionsDir = getSessionsDir();\n const normalizedId = sessionId.endsWith('.json') ? sessionId : `${sessionId}.json`;\n const filePath = path.join(sessionsDir, normalizedId);\n\n if (!fs.existsSync(filePath)) {\n // Try finding by prefix\n if (!fs.existsSync(sessionsDir)) return null;\n const files = fs.readdirSync(sessionsDir).filter(f => f.endsWith('.json'));\n const match = files.find(f => f.startsWith(sessionId));\n if (match) {\n try {\n const raw = fs.readFileSync(path.join(sessionsDir, match), 'utf8');\n return JSON.parse(raw) as OrbitSession;\n } catch {\n return null;\n }\n }\n return null;\n }\n\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n return JSON.parse(raw) as OrbitSession;\n } catch {\n return null;\n }\n}\n\nexport function listSessions(): Array<{\n id: string;\n title: string;\n updatedAt: string;\n turnCount: number;\n workspace: string;\n model: string;\n}> {\n const sessionsDir = getSessionsDir();\n if (!fs.existsSync(sessionsDir)) return [];\n\n const files = fs.readdirSync(sessionsDir).filter(f => f.endsWith('.json'));\n const sessions: Array<{\n id: string;\n title: string;\n updatedAt: string;\n turnCount: number;\n workspace: string;\n model: string;\n }> = [];\n\n for (const file of files) {\n try {\n const raw = fs.readFileSync(path.join(sessionsDir, file), 'utf8');\n const data = JSON.parse(raw) as OrbitSession;\n sessions.push({\n id: data.id,\n title: data.title || 'Untitled Session',\n updatedAt: data.updatedAt || data.createdAt,\n turnCount: data.turns?.length || 0,\n workspace: data.workspace || '',\n model: data.model || ''\n });\n } catch {\n // Ignore corrupt session files\n }\n }\n\n return sessions.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());\n}\n\nexport function deleteSession(sessionId: string): boolean {\n const sessionsDir = getSessionsDir();\n const normalizedId = sessionId.endsWith('.json') ? sessionId : `${sessionId}.json`;\n const filePath = path.join(sessionsDir, normalizedId);\n\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n return true;\n }\n\n // Try matching by prefix\n if (!fs.existsSync(sessionsDir)) return false;\n const files = fs.readdirSync(sessionsDir).filter(f => f.endsWith('.json'));\n const match = files.find(f => f.startsWith(sessionId));\n if (match) {\n fs.unlinkSync(path.join(sessionsDir, match));\n return true;\n }\n\n return false;\n}\n\nexport function exportSessionMarkdown(session: OrbitSession): string {\n const lines: string[] = [\n `# Code Lantern Session: ${session.title}`,\n `**Session ID:** \\`${session.id}\\` `,\n `**Model:** \\`${session.model}\\` `,\n `**Workspace:** \\`${session.workspace}\\` `,\n `**Created:** ${session.createdAt} `,\n `**Updated:** ${session.updatedAt} `,\n `**Total Tokens:** ${session.totalUsage.totalTokens} `,\n '',\n '---',\n ''\n ];\n\n for (const turn of session.turns) {\n const roleHeading = turn.role === 'user' ? '### 👤 User' : turn.role === 'model' ? '### 🏮 Code Lantern' : '### 🛠️ Tool';\n lines.push(roleHeading);\n lines.push(`*${turn.timestamp}*`);\n lines.push('');\n\n if (turn.text) {\n lines.push(turn.text);\n lines.push('');\n }\n\n if (turn.toolCalls && turn.toolCalls.length > 0) {\n lines.push('**Tool Calls:**');\n for (const call of turn.toolCalls) {\n lines.push(`- \\`${call.name}\\`: \\`${JSON.stringify(call.args)}\\``);\n }\n lines.push('');\n }\n\n if (turn.toolResults && turn.toolResults.length > 0) {\n lines.push('**Tool Results:**');\n for (const res of turn.toolResults) {\n const preview = typeof res.result === 'string' ? res.result.slice(0, 200) : JSON.stringify(res.result).slice(0, 200);\n lines.push(`- \\`${res.name}\\`: ${preview}...`);\n }\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import type { ConversationTurn } from '../types.js';\n\nexport function shouldCompact(turns: ConversationTurn[], threshold = 30): boolean {\n return turns.length > threshold;\n}\n\nexport function compactTurns(\n turns: ConversationTurn[],\n retainRecentCount = 10\n): ConversationTurn[] {\n if (turns.length <= retainRecentCount + 2) {\n return turns;\n }\n\n const toCompact = turns.slice(0, turns.length - retainRecentCount);\n const toKeep = turns.slice(turns.length - retainRecentCount);\n\n // Generate structured summary from toCompact\n const summaryPoints: string[] = [];\n\n for (const turn of toCompact) {\n if (turn.role === 'user' && turn.text) {\n summaryPoints.push(`- User asked: \"${turn.text.slice(0, 150).replace(/\\n/g, ' ')}\"`);\n } else if (turn.role === 'model') {\n if (turn.toolCalls && turn.toolCalls.length > 0) {\n const toolNames = turn.toolCalls.map(t => t.name).join(', ');\n summaryPoints.push(`- Orbit executed tools: ${toolNames}`);\n }\n if (turn.text) {\n summaryPoints.push(`- Orbit responded: \"${turn.text.slice(0, 120).replace(/\\n/g, ' ')}...\"`);\n }\n }\n }\n\n const compactedTurn: ConversationTurn = {\n role: 'user',\n text: `[SYSTEM: Earlier conversation context compacted (${toCompact.length} turns)]:\\n${summaryPoints.join('\\n')}`,\n timestamp: new Date().toISOString()\n };\n\n const ackTurn: ConversationTurn = {\n role: 'model',\n text: 'Understood. I retain full awareness of these previous tasks and will continue from here.',\n timestamp: new Date().toISOString()\n };\n\n return [compactedTurn, ackTurn, ...toKeep];\n}\n","import path from 'node:path';\nimport pc from 'picocolors';\nimport { GeminiProvider } from '../provider/gemini.js';\nimport { ToolRegistry } from '../tools/registry.js';\nimport { McpManager } from '../mcp/mcpManager.js';\nimport { ApprovalEngine } from '../approval/approver.js';\nimport { loadProjectInstructions } from '../config/projectInstructions.js';\nimport { saveSession } from '../session/sessionManager.js';\nimport { shouldCompact, compactTurns } from '../session/compactor.js';\nimport { TerminalSpinner } from '../ui/spinner.js';\nimport { MarkdownRenderer } from '../ui/renderer.js';\nimport type {\n OrbitSession,\n AgentContext,\n ConversationTurn,\n ToolCallItem,\n ToolResultItem,\n TokenUsage,\n FileAttachment\n} from '../types.js';\n\nexport class OrbitAgent {\n private provider: GeminiProvider;\n private tools: ToolRegistry;\n private mcpManager: McpManager;\n private approvalEngine: ApprovalEngine;\n private spinner: TerminalSpinner;\n\n constructor(apiKey?: string) {\n this.provider = new GeminiProvider(apiKey);\n this.tools = new ToolRegistry();\n this.mcpManager = new McpManager();\n this.approvalEngine = new ApprovalEngine({});\n this.spinner = new TerminalSpinner();\n }\n\n public async initMcp(): Promise<void> {\n try {\n const mcpTools = await this.mcpManager.initialize();\n this.tools.registerTools(mcpTools);\n } catch {\n // MCP failure should not crash agent\n }\n }\n\n public async shutdown(): Promise<void> {\n await this.mcpManager.closeAll();\n }\n\n public buildSystemPrompt(workspace: string, planMode = false): string {\n const projectInstructions = loadProjectInstructions(workspace);\n\n const basePrompt = [\n 'You are Code Lantern, an elite AI coding assistant operating directly in the terminal.',\n `Current Workspace: ${path.resolve(workspace)}`,\n `Environment OS: ${process.platform}`,\n '',\n 'CORE OPERATING PRINCIPLES:',\n '1. Be direct, pragmatic, and helpful. Prioritize working, robust code over verbosity.',\n '2. Inspect files before proposing edits to understand real project conventions and existing code.',\n '3. Always use the provided tools to read, search, edit, create files, or run commands.',\n '4. When editing files with edit_file, ensure the target string matches exactly, including indentation.',\n '5. Safety boundaries: Never attempt to read secret files (.env, keys) or escape the workspace.',\n '6. Never run destructive commands that wipe unrelated data, partitions, or system drives.',\n '7. Never push code, make commits, or publish artifacts unless explicitly instructed by the user.'\n ];\n\n if (planMode) {\n basePrompt.push(\n '',\n 'PLAN MODE IS ACTIVE (READ-ONLY):',\n '- Your objective is to thoroughly inspect the codebase and produce a detailed, actionable implementation plan.',\n '- You may inspect files and search code using read_file, file_search, grep_search, and project_tree.',\n '- Do NOT attempt to write files, edit files, or run mutating commands.',\n '- Structure your plan clearly: Overview, Architecture & Files Impacted, Step-by-Step Implementation, and Verification Strategy.'\n );\n }\n\n if (projectInstructions.found && projectInstructions.content) {\n basePrompt.push(\n '',\n `PROJECT INSTRUCTIONS (${path.basename(projectInstructions.filePath || 'instructions')}):`,\n '---',\n projectInstructions.content,\n '---'\n );\n }\n\n return basePrompt.join('\\n');\n }\n\n public async runTurn(\n session: OrbitSession,\n userPrompt: string,\n context: AgentContext,\n attachments: FileAttachment[] = []\n ): Promise<{\n reply: string;\n toolCount: number;\n usage: TokenUsage;\n }> {\n this.approvalEngine = new ApprovalEngine({\n yolo: context.yolo,\n planMode: context.planMode\n });\n\n const systemPrompt = this.buildSystemPrompt(context.workspace, context.planMode);\n const activeTools = this.tools.getDefinitions(context.planMode);\n\n // Append user turn\n const userTurn: ConversationTurn = {\n role: 'user',\n text: userPrompt,\n attachments: attachments.length > 0 ? attachments : undefined,\n timestamp: new Date().toISOString()\n };\n session.turns.push(userTurn);\n\n let step = 0;\n const maxSteps = context.maxSteps || 25;\n let totalToolsExecuted = 0;\n let finalAssistantText = '';\n\n const sessionUsage: TokenUsage = {\n promptTokens: 0,\n candidatesTokens: 0,\n totalTokens: 0\n };\n\n while (step < maxSteps) {\n step++;\n this.spinner.start(`Thinking (step ${step}/${maxSteps})...`);\n\n let currentStepText = '';\n let currentToolCalls: ToolCallItem[] = [];\n\n try {\n const result = await this.provider.streamGenerate(\n context.model,\n systemPrompt,\n session.turns,\n activeTools,\n {\n onChunk: (chunk: string) => {\n if (currentStepText === '') {\n this.spinner.stop();\n }\n currentStepText += chunk;\n if (!context.jsonOutput) {\n process.stdout.write(chunk);\n }\n },\n onToolCalls: (calls: ToolCallItem[]) => {\n currentToolCalls = calls;\n },\n onUsage: (usage: TokenUsage) => {\n sessionUsage.promptTokens = usage.promptTokens;\n sessionUsage.candidatesTokens = usage.candidatesTokens;\n sessionUsage.totalTokens = usage.totalTokens;\n }\n }\n );\n\n this.spinner.stop();\n\n if (currentStepText) {\n // If response ended without a trailing newline, add one\n if (!currentStepText.endsWith('\\n')) {\n console.log('');\n }\n finalAssistantText = currentStepText;\n }\n\n // If no tool calls requested, we are done\n if (!result.toolCalls || result.toolCalls.length === 0) {\n // Record model turn\n session.turns.push({\n role: 'model',\n text: currentStepText,\n timestamp: new Date().toISOString()\n });\n break;\n }\n\n // Record model turn containing tool calls\n session.turns.push({\n role: 'model',\n text: currentStepText || undefined,\n toolCalls: result.toolCalls,\n timestamp: new Date().toISOString()\n });\n\n // Execute each tool call\n const toolResults: ToolResultItem[] = [];\n\n for (const call of result.toolCalls) {\n totalToolsExecuted++;\n const callSummary = `${call.name}(${Object.keys(call.args).map(k => `${k}: ${JSON.stringify(call.args[k])}`).join(', ')})`;\n \n if (!context.jsonOutput) {\n console.log(pc.cyan(`\\n🛠️ Tool: ${pc.bold(call.name)}`) + pc.dim(` ${callSummary.slice(0, 100)}`));\n }\n\n this.spinner.start(`Executing ${call.name}...`);\n\n const toolContext = {\n workspace: context.workspace,\n yolo: this.approvalEngine.isYolo(),\n planMode: context.planMode,\n requestApproval: (req: any) => {\n this.spinner.stop();\n return this.approvalEngine.requestApproval(req);\n }\n };\n\n const executionResult = await this.tools.executeTool(call.name, call.args, toolContext);\n this.spinner.stop();\n\n if (executionResult.success) {\n if (!context.jsonOutput) {\n const preview = executionResult.output.length > 200\n ? executionResult.output.slice(0, 200) + '...'\n : executionResult.output;\n console.log(pc.green(`✓ Result:`) + pc.dim(` ${preview.replace(/\\n/g, ' ')}`));\n }\n toolResults.push({\n callId: call.id,\n name: call.name,\n result: executionResult.output\n });\n } else {\n if (!context.jsonOutput) {\n console.log(pc.red(`✗ Error: ${executionResult.error || executionResult.output}`));\n }\n toolResults.push({\n callId: call.id,\n name: call.name,\n result: { error: executionResult.error || executionResult.output },\n error: executionResult.error\n });\n }\n }\n\n // Append tool results turn\n session.turns.push({\n role: 'tool',\n toolResults,\n timestamp: new Date().toISOString()\n });\n\n // Check if max steps reached\n if (step >= maxSteps) {\n const limitMsg = `\\n[Reached maximum configured tool steps (${maxSteps}). Code Lantern paused to avoid infinite loops.]`;\n console.log(pc.yellow(limitMsg));\n finalAssistantText += limitMsg;\n break;\n }\n } catch (err: any) {\n this.spinner.stop();\n throw err;\n }\n }\n\n // Auto-compact if session is very long\n if (shouldCompact(session.turns)) {\n session.turns = compactTurns(session.turns);\n }\n\n // Update session metrics\n session.totalUsage.promptTokens += sessionUsage.promptTokens;\n session.totalUsage.candidatesTokens += sessionUsage.candidatesTokens;\n session.totalUsage.totalTokens += sessionUsage.totalTokens;\n saveSession(session);\n\n return {\n reply: finalAssistantText,\n toolCount: totalToolsExecuted,\n usage: sessionUsage\n };\n }\n}\n","import pc from 'picocolors';\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport class TerminalSpinner {\n private timer: NodeJS.Timeout | null = null;\n private frameIdx = 0;\n private message = '';\n private isTTY = Boolean(process.stdout.isTTY);\n private isRunning = false;\n\n public start(message: string): this {\n this.message = message;\n this.isRunning = true;\n\n if (!this.isTTY) {\n console.log(`[Lantern] ${message}`);\n return this;\n }\n\n if (this.timer) {\n clearInterval(this.timer);\n }\n\n process.stdout.write('\\x1B[?25l'); // Hide cursor\n this.timer = setInterval(() => {\n this.render();\n }, 80);\n\n this.render();\n return this;\n }\n\n public update(message: string): this {\n this.message = message;\n if (!this.isTTY) {\n console.log(`[Lantern] ${message}`);\n } else if (this.isRunning) {\n this.render();\n }\n return this;\n }\n\n private render(): void {\n if (!this.isTTY || !this.isRunning) return;\n const frame = pc.cyan(SPINNER_FRAMES[this.frameIdx % SPINNER_FRAMES.length]);\n this.frameIdx++;\n\n // Clear line and write frame + message\n process.stdout.write(`\\r\\x1B[2K${frame} ${pc.dim(this.message)}`);\n }\n\n public stop(): this {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n this.isRunning = false;\n\n if (this.isTTY) {\n process.stdout.write('\\r\\x1B[2K'); // Clear line\n process.stdout.write('\\x1B[?25h'); // Restore cursor\n }\n return this;\n }\n\n public succeed(message: string): this {\n this.stop();\n console.log(`${pc.green('✓')} ${message}`);\n return this;\n }\n\n public fail(message: string): this {\n this.stop();\n console.log(`${pc.red('✗')} ${message}`);\n return this;\n }\n\n public info(message: string): this {\n this.stop();\n console.log(`${pc.cyan('ℹ')} ${message}`);\n return this;\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { FileAttachment } from '../types.js';\n\nconst MIME_MAP: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.webp': 'image/webp',\n '.gif': 'image/gif',\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.json': 'application/json',\n '.ts': 'text/plain',\n '.js': 'text/plain',\n '.py': 'text/plain',\n '.sh': 'text/plain',\n '.html': 'text/html',\n '.css': 'text/css'\n};\n\nconst BINARY_IMAGE_EXTS = new Set(['.png', '.jpg', '.jpeg', '.webp', '.gif', '.pdf']);\nconst MAX_ATTACHMENT_SIZE = 15 * 1024 * 1024; // 15MB\n\nexport function loadAttachment(filePath: string): FileAttachment {\n const resolved = path.resolve(filePath);\n\n if (!fs.existsSync(resolved)) {\n throw new Error(`Attached file does not exist: ${filePath}`);\n }\n\n const stat = fs.statSync(resolved);\n if (!stat.isFile()) {\n throw new Error(`Attachment target is not a file: ${filePath}`);\n }\n\n if (stat.size > MAX_ATTACHMENT_SIZE) {\n throw new Error(`Attachment file too large: ${filePath} (${(stat.size / (1024 * 1024)).toFixed(1)}MB, max 15MB)`);\n }\n\n const ext = path.extname(resolved).toLowerCase();\n const mimeType = MIME_MAP[ext] || 'application/octet-stream';\n const name = path.basename(resolved);\n\n if (BINARY_IMAGE_EXTS.has(ext)) {\n const buffer = fs.readFileSync(resolved);\n return {\n path: resolved,\n name,\n mimeType,\n size: stat.size,\n base64Data: buffer.toString('base64')\n };\n }\n\n // Treat as text\n const textContent = fs.readFileSync(resolved, 'utf8');\n return {\n path: resolved,\n name,\n mimeType: mimeType.startsWith('text/') ? mimeType : 'text/plain',\n size: stat.size,\n textContent\n };\n}\n\nexport function loadAttachments(filePaths?: string[]): FileAttachment[] {\n if (!filePaths || filePaths.length === 0) return [];\n return filePaths.map(p => loadAttachment(p));\n}\n"],"mappings":"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","names":["path","path","pc","fs","path","fs","path","fs","path","path","fs","walk","buildTree","exec","fs","path","fs","path","fs","path","path","fs","pc","pc","fs","path","fs","path","path","fs","path","pc","pc","path","pc","fs","path"]}
|