codelantern-agent-cli 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/interactive.ts","../src/ui/prompt.ts","../src/ui/banner.ts","../src/ui/slashCommands.ts","../src/commands/ask.ts","../src/commands/plan.ts","../src/commands/resume.ts","../src/commands/sessions.ts","../src/commands/configCmd.ts","../src/commands/doctor.ts","../src/commands/mcpCmd.ts"],"sourcesContent":["import { Command } from 'commander';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { interactiveCommand } from './commands/interactive.js';\nimport { askCommand } from './commands/ask.js';\nimport { planCommand } from './commands/plan.js';\nimport { resumeCommand } from './commands/resume.js';\nimport { sessionsCommand } from './commands/sessions.js';\nimport { configCommand } from './commands/configCmd.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { mcpCommand } from './commands/mcpCmd.js';\nimport { loadConfig } from './config/config.js';\n\nconst program = new Command();\nconst config = loadConfig();\n\nprogram\n .name('lantern')\n .description('Code Lantern CLI — Personal AI coding assistant for the terminal powered by Google Gemini')\n .version('1.0.0');\n\n// Global flags\nprogram\n .option('-m, --model <model>', 'Gemini model ID to use', config.defaultModel || 'gemini-3.8-flash')\n .option('-C, --cwd <path>', 'Working directory for Code Lantern agent', process.cwd())\n .option('-s, --session <id>', 'Resume or use a specific session ID')\n .option('-a, --attach <files...>', 'Attach one or more files/images/documents to the request')\n .option('--yolo', 'Enable YOLO mode (auto-approve file edits and shell commands)', false)\n .option('--json', 'Output results formatted as JSON', false);\n\n// Subcommand: ask\nprogram\n .command('ask <question...>')\n .description('Ask a single question or task and stream the answer')\n .action(async (questionParts: string[]) => {\n const opts = program.opts();\n const question = questionParts.join(' ');\n await askCommand(question, {\n model: opts.model,\n cwd: opts.cwd,\n attach: opts.attach,\n yolo: opts.yolo,\n json: opts.json\n });\n });\n\n// Subcommand: plan\nprogram\n .command('plan <task...>')\n .description('Inspect the codebase and produce a read-only implementation plan')\n .action(async (taskParts: string[]) => {\n const opts = program.opts();\n const task = taskParts.join(' ');\n await planCommand(task, {\n model: opts.model,\n cwd: opts.cwd,\n attach: opts.attach,\n json: opts.json\n });\n });\n\n// Subcommand: resume\nprogram\n .command('resume [sessionId]')\n .description('Continue a saved conversation session')\n .action(async (sessionId?: string) => {\n const opts = program.opts();\n await resumeCommand(sessionId, {\n model: opts.model,\n cwd: opts.cwd,\n attach: opts.attach,\n yolo: opts.yolo\n });\n });\n\n// Subcommand: sessions\nprogram\n .command('sessions')\n .description('List, delete, or export saved local sessions')\n .option('-d, --delete <id>', 'Delete session by ID')\n .option('-e, --export <id>', 'Export session transcript by ID')\n .action(async (cmdOpts: { delete?: string; export?: string }) => {\n const globalOpts = program.opts();\n await sessionsCommand({\n delete: cmdOpts.delete,\n export: cmdOpts.export,\n json: globalOpts.json\n });\n });\n\n// Subcommand: config\nprogram\n .command('config [action] [key] [value]')\n .description('View or update configuration (list, get, set, path)')\n .action(async (action?: string, key?: string, value?: string) => {\n await configCommand(action, key, value);\n });\n\n// Subcommand: doctor\nprogram\n .command('doctor')\n .description('Diagnose API key, configuration, environment, and MCP server health')\n .action(async () => {\n await doctorCommand();\n });\n\n// Subcommand: mcp\nprogram\n .command('mcp [action] [serverName] [command] [args...]')\n .description('Manage configured MCP servers (list, add, remove, enable, disable, test)')\n .allowUnknownOption()\n .action(async (action?: string, serverName?: string, cmd?: string, ...rest: any[]) => {\n const rawArgs = rest.flat().filter(a => typeof a === 'string');\n await mcpCommand(action, serverName, cmd, rawArgs);\n });\n\n// Default action when no subcommand is given\nprogram.action(async () => {\n const opts = program.opts();\n\n // Check if content was piped into stdin\n if (!process.stdin.isTTY) {\n let pipedData = '';\n process.stdin.setEncoding('utf8');\n\n for await (const chunk of process.stdin) {\n pipedData += chunk;\n }\n\n const trimmedPiped = pipedData.trim();\n if (trimmedPiped) {\n await askCommand(trimmedPiped, {\n model: opts.model,\n cwd: opts.cwd,\n attach: opts.attach,\n yolo: opts.yolo,\n json: opts.json\n });\n return;\n }\n }\n\n // Interactive mode\n await interactiveCommand({\n model: opts.model,\n cwd: opts.cwd,\n session: opts.session,\n attach: opts.attach,\n yolo: opts.yolo\n });\n});\n\nprogram.parseAsync(process.argv).catch(err => {\n console.error(`Error: ${err.message || err}`);\n process.exit(1);\n});\n","import pc from 'picocolors';\nimport { OrbitAgent } from '../agent/orbitAgent.js';\nimport { createNewSession, loadSession, saveSession } from '../session/sessionManager.js';\nimport { loadConfig } from '../config/config.js';\nimport { loadAttachments } from '../provider/attachment.js';\nimport { TerminalPrompt } from '../ui/prompt.js';\nimport { printBanner } from '../ui/banner.js';\nimport { handleSlashCommand } from '../ui/slashCommands.js';\nimport { formatErrorMessage } from '../provider/errors.js';\nimport type { OrbitSession, AgentContext } from '../types.js';\n\nexport async function interactiveCommand(options: {\n model?: string;\n cwd?: string;\n session?: string;\n attach?: string[];\n yolo?: boolean;\n plan?: boolean;\n}): Promise<void> {\n const config = loadConfig();\n const workspace = options.cwd || process.cwd();\n let model = options.model || config.defaultModel || 'gemini-3.8-flash';\n let yolo = Boolean(options.yolo ?? config.yolo);\n let planMode = Boolean(options.plan);\n\n let session: OrbitSession;\n if (options.session) {\n const loaded = loadSession(options.session);\n if (!loaded) {\n console.error(pc.red(`Error: Session '${options.session}' not found.`));\n process.exit(1);\n }\n session = loaded;\n console.log(pc.green(`✓ Resumed session: ${session.id} (${session.turns.length} turns)`));\n } else {\n session = createNewSession(workspace, model);\n }\n\n const attachments = loadAttachments(options.attach);\n\n printBanner({\n version: '1.0.0',\n model,\n workspace,\n yolo,\n planMode\n });\n\n if (attachments.length > 0) {\n console.log(pc.cyan(`📎 Attached ${attachments.length} file(s): ${attachments.map(a => a.name).join(', ')}\\n`));\n }\n\n const agent = new OrbitAgent();\n await agent.initMcp();\n\n const promptUI = new TerminalPrompt();\n\n const slashContext = {\n session,\n model,\n workspace,\n yolo,\n planMode,\n setModel: (m: string) => {\n model = m;\n session.model = m;\n },\n setYolo: (y: boolean) => {\n yolo = y;\n },\n setPlanMode: (p: boolean) => {\n planMode = p;\n }\n };\n\n try {\n while (true) {\n const modeIndicator = planMode ? pc.blue('[plan] ') : yolo ? pc.red('[yolo] ') : '';\n const promptStr = `${pc.yellow('lantern')} ${modeIndicator}${pc.dim('❯')} `;\n\n const input = await promptUI.askPrompt(promptStr);\n\n if (input === null || input === '/exit' || input === '/quit') {\n console.log(pc.dim('\\nGoodbye! Session saved: ' + session.id));\n break;\n }\n\n const trimmed = input.trim();\n if (!trimmed) {\n continue;\n }\n\n // Check slash commands\n if (trimmed.startsWith('/')) {\n const shouldContinue = await handleSlashCommand(trimmed, slashContext);\n if (!shouldContinue) {\n console.log(pc.dim('Session saved. Exiting Code Lantern.'));\n break;\n }\n continue;\n }\n\n // Run agent turn\n const context: AgentContext = {\n workspace,\n model,\n yolo,\n planMode,\n jsonOutput: false,\n maxSteps: config.maxSteps || 25,\n attachments\n };\n\n try {\n console.log('');\n const result = await agent.runTurn(session, trimmed, context, attachments);\n if (result.usage.totalTokens > 0) {\n console.log(pc.dim(`\\n[Tokens: ${result.usage.totalTokens.toLocaleString()} | Total turns: ${session.turns.length}]`));\n }\n console.log('');\n } catch (err: any) {\n console.error('\\n' + formatErrorMessage(err) + '\\n');\n }\n }\n } finally {\n saveSession(session);\n await agent.shutdown();\n }\n}\n","import readline from 'node:readline';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { getLanternHomeDir } from '../config/config.js';\n\nfunction getHistoryFilePath(): string {\n return path.join(getLanternHomeDir(), 'history.txt');\n}\n\nfunction loadHistory(): string[] {\n const filePath = getHistoryFilePath();\n if (!fs.existsSync(filePath)) return [];\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n return raw.replace(/\\r\\n/g, '\\n').split('\\n').filter(line => line.trim().length > 0);\n } catch {\n return [];\n }\n}\n\nfunction appendHistory(line: string): void {\n const clean = line.trim();\n if (!clean || clean.startsWith('/') || clean.length < 2) return;\n const filePath = getHistoryFilePath();\n try {\n fs.appendFileSync(filePath, clean + '\\n', { encoding: 'utf8' });\n } catch {\n // ignore\n }\n}\n\nexport class TerminalPrompt {\n private history: string[];\n\n constructor() {\n this.history = loadHistory();\n }\n\n public async askPrompt(promptPrefix = pc.yellow('lantern> ')): Promise<string | null> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n history: this.history,\n historySize: 200,\n prompt: promptPrefix\n });\n\n let sigintCount = 0;\n\n return new Promise(resolve => {\n let accumulated = '';\n let insideTripleQuotes = false;\n\n rl.prompt();\n\n rl.on('line', rawLine => {\n sigintCount = 0;\n // Clean any carriage returns\n const line = rawLine.replace(/\\r/g, '');\n\n // Check triple quote multi-line block\n if (!insideTripleQuotes && (line.trim().startsWith('\"\"\"') || line.trim().startsWith('```'))) {\n insideTripleQuotes = true;\n const content = line.trim().slice(3);\n accumulated += content + '\\n';\n rl.setPrompt(pc.dim('... '));\n rl.prompt();\n return;\n }\n\n if (insideTripleQuotes) {\n if (line.trim().endsWith('\"\"\"') || line.trim().endsWith('```')) {\n const content = line.trim().slice(0, -3);\n accumulated += content;\n insideTripleQuotes = false;\n rl.close();\n appendHistory(accumulated.trim());\n return resolve(accumulated.trim());\n }\n accumulated += line + '\\n';\n rl.prompt();\n return;\n }\n\n // Check line continuation with backslash '\\'\n if (line.endsWith('\\\\')) {\n accumulated += line.slice(0, -1) + '\\n';\n rl.setPrompt(pc.dim('... '));\n rl.prompt();\n return;\n }\n\n // Single line complete\n accumulated += line;\n rl.close();\n const result = accumulated.trim();\n if (result) {\n appendHistory(result);\n }\n resolve(result);\n });\n\n rl.on('SIGINT', () => {\n sigintCount++;\n if (sigintCount >= 2 || insideTripleQuotes) {\n console.log('\\nExiting Code Lantern.');\n rl.close();\n resolve('/exit');\n } else {\n console.log(pc.dim('\\n(Press Ctrl+C again or type /exit to quit)'));\n accumulated = '';\n insideTripleQuotes = false;\n rl.setPrompt(promptPrefix);\n rl.prompt();\n }\n });\n\n rl.on('close', () => {\n if (!accumulated) {\n resolve(null);\n }\n });\n });\n }\n}\n","import pc from 'picocolors';\n\nexport function printBanner(options: {\n version: string;\n model: string;\n workspace: string;\n yolo: boolean;\n planMode?: boolean;\n}): void {\n const logo = `\n ____ _ _ _ \n / ___|___ __| | ___ | | __ _ _ __ | |_ ___ _ __ _ __ \n | | / _ \\\\ / _\\` |/ _ \\\\ | | / _\\` | '_ \\\\ | __/ _ \\\\ '__| '_ \\\\ \n | |__| (_) | (_| | __/ | |__| (_| | | | || || __/ | | | | |\n \\\\____\\\\___/ \\\\__,_|\\\\___| |_____\\\\__,_|_| |_(_)__\\\\___|_| |_| |_|\n 🏮 Personal AI Coding Assistant for Terminal (Gemini)\n`;\n\n console.log(pc.yellow(logo));\n console.log(pc.dim('──────────────────────────────────────────────────────────────────────────────'));\n console.log(`${pc.bold('Product:')} Code Lantern CLI (${pc.cyan('lantern')}) ${pc.bold('Version:')} ${options.version}`);\n console.log(`${pc.bold('Default Model:')} ${pc.green(options.model)}`);\n console.log(`${pc.bold('Workspace:')} ${pc.blue(options.workspace)}`);\n\n const modeBadge = options.planMode\n ? pc.bgBlue(pc.white(' PLAN MODE (Read-only) '))\n : options.yolo\n ? pc.bgRed(pc.white(' YOLO MODE (Auto-approve) '))\n : pc.bgGreen(pc.black(' SAFE MODE (Approval Prompts) '));\n\n console.log(`${pc.bold('Status:')} ${modeBadge}`);\n console.log(pc.dim('──────────────────────────────────────────────────────────────────────────────'));\n console.log(pc.dim(`Type your task or question. Use ${pc.bold(pc.yellow('/help'))} for commands, ${pc.bold(pc.yellow('/exit'))} to quit.`));\n console.log(pc.dim(`Multiline tip: End a line with '\\\\' or enclose in '\"\"\"' for multiline blocks.\\n`));\n}\n","import pc from 'picocolors';\nimport { listSessions, exportSessionMarkdown } from '../session/sessionManager.js';\nimport type { OrbitSession } from '../types.js';\n\nexport interface SlashCommandContext {\n session: OrbitSession;\n model: string;\n workspace: string;\n yolo: boolean;\n planMode: boolean;\n setModel: (m: string) => void;\n setYolo: (y: boolean) => void;\n setPlanMode: (p: boolean) => void;\n}\n\nexport async function handleSlashCommand(input: string, context: SlashCommandContext): Promise<boolean> {\n const parts = input.trim().split(/\\s+/);\n const command = parts[0].toLowerCase();\n const arg = parts.slice(1).join(' ');\n\n switch (command) {\n case '/help':\n console.log('\\n' + pc.bold(pc.yellow('🏮 Code Lantern CLI — Help & Commands')));\n console.log(pc.dim('──────────────────────────────────────────────────────────────────────────────'));\n console.log(pc.bold('Slash Commands:'));\n console.log(` ${pc.cyan('/help')} Show this help overview`);\n console.log(` ${pc.cyan('/clear')} Clear the terminal screen`);\n console.log(` ${pc.cyan('/status')} Display current session, workspace, and model status`);\n console.log(` ${pc.cyan('/model [name]')} View or change current Gemini model`);\n console.log(` ${pc.cyan('/plan [on|off]')} Toggle read-only planning mode`);\n console.log(` ${pc.cyan('/yolo [on|off]')} Toggle YOLO auto-approval mode`);\n console.log(` ${pc.cyan('/sessions')} List saved local sessions`);\n console.log(` ${pc.cyan('/history')} Display recent turns in current session`);\n console.log(` ${pc.cyan('/export [md|json]')} Export current conversation transcript`);\n console.log(` ${pc.cyan('/exit')} or ${pc.cyan('/quit')} Exit Code Lantern CLI`);\n console.log('');\n console.log(pc.bold('Available Agent Tools:'));\n console.log(` ${pc.yellow('read_file')} Read file contents with line ranges`);\n console.log(` ${pc.yellow('write_file')} Create new files (requires approval in safe mode)`);\n console.log(` ${pc.yellow('edit_file')} Apply targeted patch with diff preview`);\n console.log(` ${pc.yellow('list_directory')} Inspect directories honoring .gitignore`);\n console.log(` ${pc.yellow('file_search')} Find files matching glob/pattern`);\n console.log(` ${pc.yellow('grep_search')} Search code patterns across files`);\n console.log(` ${pc.yellow('project_tree')} Generate ASCII project tree`);\n console.log(` ${pc.yellow('run_command')} Run shell commands (requires approval)`);\n console.log(` ${pc.yellow('git_status')} Inspect Git status`);\n console.log(` ${pc.yellow('git_diff')} Inspect Git working tree / staged diffs`);\n console.log(` ${pc.yellow('web_search')} Search documentation / error references`);\n console.log('');\n console.log(pc.bold('Keyboard Shortcuts:'));\n console.log(` ${pc.dim('Enter')} Submit prompt`);\n console.log(` ${pc.dim('\\\\ + Enter')} Continue prompt on next line (multiline)`);\n console.log(` ${pc.dim('\"\"\" ... \"\"\"')} Multiline prompt block`);\n console.log(` ${pc.dim('Up/Down Arrows')} Navigate prompt history`);\n console.log(` ${pc.dim('Ctrl+C')} Cancel current line / double-tap to exit`);\n console.log(` ${pc.dim('Ctrl+D')} Exit session`);\n console.log('');\n return true;\n\n case '/clear':\n console.clear();\n return true;\n\n case '/status':\n console.log('\\n' + pc.bold(pc.yellow('🏮 Code Lantern Status')));\n console.log(pc.dim('──────────────────────────────────────────────────────────────────────────────'));\n console.log(`${pc.bold('Session ID:')} ${pc.cyan(context.session.id)}`);\n console.log(`${pc.bold('Workspace:')} ${pc.blue(context.workspace)}`);\n console.log(`${pc.bold('Active Model:')} ${pc.green(context.model)}`);\n console.log(`${pc.bold('Turns:')} ${context.session.turns.length}`);\n console.log(`${pc.bold('Total Tokens:')} ${context.session.totalUsage.totalTokens.toLocaleString()}`);\n console.log(`${pc.bold('YOLO Mode:')} ${context.yolo ? pc.red('ON (Auto-approve)') : pc.green('OFF (Prompt approval)')}`);\n console.log(`${pc.bold('Plan Mode:')} ${context.planMode ? pc.blue('ON (Read-only)') : pc.dim('OFF (Full execution)')}`);\n console.log('');\n return true;\n\n case '/model':\n if (arg) {\n context.setModel(arg.trim());\n console.log(pc.green(`✓ Model changed to: ${arg.trim()}`));\n } else {\n console.log(`Current model: ${pc.cyan(context.model)}`);\n console.log(pc.dim(`Usage: /model <model-id> (e.g. /model gemini-3.8-flash)`));\n }\n return true;\n\n case '/plan':\n if (arg === 'off') {\n context.setPlanMode(false);\n console.log(pc.green('✓ Plan mode disabled (execution tools enabled).'));\n } else if (arg === 'on') {\n context.setPlanMode(true);\n console.log(pc.blue('✓ Plan mode enabled (read-only inspection).'));\n } else {\n const next = !context.planMode;\n context.setPlanMode(next);\n console.log(next ? pc.blue('✓ Plan mode enabled (read-only inspection).') : pc.green('✓ Plan mode disabled.'));\n }\n return true;\n\n case '/yolo':\n if (arg === 'off') {\n context.setYolo(false);\n console.log(pc.green('✓ YOLO mode disabled (safe approval prompts active).'));\n } else if (arg === 'on') {\n context.setYolo(true);\n console.log(pc.red('⚡ YOLO mode enabled (auto-approving edits & commands).'));\n } else {\n const next = !context.yolo;\n context.setYolo(next);\n console.log(next ? pc.red('⚡ YOLO mode enabled.') : pc.green('✓ Safe mode enabled.'));\n }\n return true;\n\n case '/sessions': {\n const list = listSessions();\n console.log('\\n' + pc.bold('Recent Sessions:'));\n if (list.length === 0) {\n console.log(pc.dim(' (No saved sessions)'));\n } else {\n for (const s of list.slice(0, 8)) {\n const isCurrent = s.id === context.session.id ? pc.green(' (current)') : '';\n console.log(` ${pc.cyan(s.id)} - ${s.title}${isCurrent} [${s.turnCount} turns]`);\n }\n }\n console.log('');\n return true;\n }\n\n case '/history':\n console.log('\\n' + pc.bold('Session History:'));\n if (context.session.turns.length === 0) {\n console.log(pc.dim(' (No messages yet in this session)'));\n } else {\n for (const t of context.session.turns) {\n const roleBadge = t.role === 'user' ? pc.cyan('[User]') : t.role === 'model' ? pc.yellow('[Lantern]') : pc.dim('[Tool]');\n const preview = t.text ? t.text.slice(0, 100).replace(/\\n/g, ' ') : `(Tool calls: ${t.toolCalls?.map(c => c.name).join(', ')})`;\n console.log(` ${roleBadge} ${preview}`);\n }\n }\n console.log('');\n return true;\n\n case '/export': {\n const format = arg.toLowerCase() === 'json' ? 'json' : 'markdown';\n if (format === 'json') {\n console.log('\\n' + JSON.stringify(context.session, null, 2));\n } else {\n console.log('\\n' + exportSessionMarkdown(context.session));\n }\n return true;\n }\n\n case '/exit':\n case '/quit':\n return false;\n\n default:\n console.log(pc.yellow(`Unknown slash command '${command}'. Type ${pc.bold('/help')} for available commands.`));\n return true;\n }\n}\n","import pc from 'picocolors';\nimport { OrbitAgent } from '../agent/orbitAgent.js';\nimport { createNewSession } from '../session/sessionManager.js';\nimport { loadAttachments } from '../provider/attachment.js';\nimport { formatErrorMessage } from '../provider/errors.js';\nimport type { AgentContext } from '../types.js';\n\nexport async function askCommand(\n question: string,\n options: {\n model?: string;\n cwd?: string;\n attach?: string[];\n yolo?: boolean;\n json?: boolean;\n maxSteps?: number;\n }\n): Promise<void> {\n const workspace = options.cwd || process.cwd();\n const model = options.model || 'gemini-3.8-flash';\n const yolo = Boolean(options.yolo);\n const jsonOutput = Boolean(options.json);\n\n const attachments = loadAttachments(options.attach);\n const session = createNewSession(workspace, model, `Ask: ${question.slice(0, 40)}`);\n\n const agent = new OrbitAgent();\n await agent.initMcp();\n\n const context: AgentContext = {\n workspace,\n model,\n yolo,\n planMode: false,\n jsonOutput,\n maxSteps: options.maxSteps || 25,\n attachments\n };\n\n try {\n const result = await agent.runTurn(session, question, context, attachments);\n\n if (jsonOutput) {\n console.log(JSON.stringify({\n sessionId: session.id,\n model,\n question,\n reply: result.reply,\n toolCount: result.toolCount,\n usage: result.usage\n }, null, 2));\n } else {\n if (result.usage.totalTokens > 0) {\n console.log(pc.dim(`\\n[Tokens: ${result.usage.totalTokens} | Tools executed: ${result.toolCount}]`));\n }\n }\n } catch (err: any) {\n if (jsonOutput) {\n console.error(JSON.stringify({ error: err.message }));\n } else {\n console.error(formatErrorMessage(err));\n }\n process.exit(1);\n } finally {\n await agent.shutdown();\n }\n}\n","import pc from 'picocolors';\nimport { OrbitAgent } from '../agent/orbitAgent.js';\nimport { createNewSession } from '../session/sessionManager.js';\nimport { loadAttachments } from '../provider/attachment.js';\nimport { formatErrorMessage } from '../provider/errors.js';\nimport type { AgentContext } from '../types.js';\n\nexport async function planCommand(\n task: string,\n options: {\n model?: string;\n cwd?: string;\n attach?: string[];\n json?: boolean;\n maxSteps?: number;\n }\n): Promise<void> {\n const workspace = options.cwd || process.cwd();\n const model = options.model || 'gemini-3.8-flash';\n const jsonOutput = Boolean(options.json);\n\n const attachments = loadAttachments(options.attach);\n const session = createNewSession(workspace, model, `Plan: ${task.slice(0, 40)}`);\n\n if (!jsonOutput) {\n console.log(pc.bold(pc.yellow('\\n🏮 Code Lantern Plan Mode (Read-Only)')));\n console.log(pc.dim('Inspecting workspace and formulating step-by-step implementation plan...\\n'));\n }\n\n const agent = new OrbitAgent();\n await agent.initMcp();\n\n const context: AgentContext = {\n workspace,\n model,\n yolo: false,\n planMode: true,\n jsonOutput,\n maxSteps: options.maxSteps || 25,\n attachments\n };\n\n const planPrompt = `Please inspect the codebase as needed and generate a detailed, structured, read-only implementation plan for the following task:\\n\\n${task}`;\n\n try {\n const result = await agent.runTurn(session, planPrompt, context, attachments);\n\n if (jsonOutput) {\n console.log(JSON.stringify({\n sessionId: session.id,\n model,\n task,\n plan: result.reply,\n usage: result.usage\n }, null, 2));\n } else {\n console.log(pc.dim(`\\n[Plan complete. Session ID: ${session.id}]`));\n }\n } catch (err: any) {\n if (jsonOutput) {\n console.error(JSON.stringify({ error: err.message }));\n } else {\n console.error(formatErrorMessage(err));\n }\n process.exit(1);\n } finally {\n await agent.shutdown();\n }\n}\n","import pc from 'picocolors';\nimport { listSessions, loadSession } from '../session/sessionManager.js';\nimport { interactiveCommand } from './interactive.js';\n\nexport async function resumeCommand(\n sessionId?: string,\n options: {\n model?: string;\n cwd?: string;\n attach?: string[];\n yolo?: boolean;\n } = {}\n): Promise<void> {\n const sessions = listSessions();\n\n if (sessions.length === 0) {\n console.log(pc.yellow('No previous sessions found. Starting a fresh session...\\n'));\n await interactiveCommand(options);\n return;\n }\n\n let targetId = sessionId;\n\n if (!targetId) {\n // Default to the most recent session\n targetId = sessions[0].id;\n console.log(pc.cyan(`Resuming most recent session: ${sessions[0].title} (${targetId})`));\n } else {\n const existing = loadSession(targetId);\n if (!existing) {\n console.error(pc.red(`Error: Session '${targetId}' not found.`));\n console.log('\\nAvailable sessions:');\n for (const s of sessions.slice(0, 5)) {\n console.log(` - ${pc.cyan(s.id)} (${s.title})`);\n }\n process.exit(1);\n }\n }\n\n await interactiveCommand({\n ...options,\n session: targetId\n });\n}\n","import pc from 'picocolors';\nimport { listSessions, loadSession, deleteSession, exportSessionMarkdown } from '../session/sessionManager.js';\n\nexport async function sessionsCommand(options: {\n delete?: string;\n export?: string;\n json?: boolean;\n}): Promise<void> {\n if (options.delete) {\n const success = deleteSession(options.delete);\n if (success) {\n console.log(pc.green(`✓ Deleted session: ${options.delete}`));\n } else {\n console.error(pc.red(`✗ Could not find session: ${options.delete}`));\n process.exit(1);\n }\n return;\n }\n\n if (options.export) {\n const session = loadSession(options.export);\n if (!session) {\n console.error(pc.red(`✗ Session '${options.export}' not found.`));\n process.exit(1);\n }\n\n if (options.json) {\n console.log(JSON.stringify(session, null, 2));\n } else {\n console.log(exportSessionMarkdown(session));\n }\n return;\n }\n\n const sessions = listSessions();\n if (sessions.length === 0) {\n console.log(pc.dim('No saved Code Lantern sessions found.'));\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(sessions, null, 2));\n return;\n }\n\n console.log('\\n' + pc.bold(pc.yellow('🏮 Saved Code Lantern Sessions')));\n console.log(pc.dim('──────────────────────────────────────────────────────────────────────────────'));\n console.log(\n pc.bold('Session ID'.padEnd(28)) +\n pc.bold('Turns'.padEnd(8)) +\n pc.bold('Model'.padEnd(20)) +\n pc.bold('Updated'.padEnd(20)) +\n pc.bold('Title')\n );\n console.log(pc.dim('──────────────────────────────────────────────────────────────────────────────'));\n\n for (const s of sessions) {\n const dateStr = new Date(s.updatedAt).toLocaleString().slice(0, 18);\n console.log(\n pc.cyan(s.id.slice(0, 26).padEnd(28)) +\n String(s.turnCount).padEnd(8) +\n s.model.slice(0, 18).padEnd(20) +\n dateStr.padEnd(20) +\n pc.dim(s.title.slice(0, 30))\n );\n }\n\n console.log(pc.dim('\\nTo resume a session: lantern resume <session-id>'));\n console.log(pc.dim('To export a session: lantern sessions --export <session-id>'));\n console.log(pc.dim('To delete a session: lantern sessions --delete <session-id>\\n'));\n}\n","import pc from 'picocolors';\nimport { loadConfig, setConfigValue, getConfigFilePath } from '../config/config.js';\nimport { ALLOWED_CONFIG_KEYS } from '../config/schema.js';\n\nexport async function configCommand(\n action?: string,\n key?: string,\n value?: string\n): Promise<void> {\n const configPath = getConfigFilePath();\n\n if (!action || action === 'list') {\n const config = loadConfig();\n console.log('\\n' + pc.bold(pc.yellow('🏮 Code Lantern Configuration')));\n console.log(pc.dim(`File: ${configPath}`));\n console.log(pc.dim('─────────────────────────────────────────────────────────────'));\n for (const [k, v] of Object.entries(config)) {\n if (k === 'mcpServers') {\n const count = Object.keys(v as object).length;\n console.log(` ${pc.cyan(k.padEnd(24))} = ${pc.dim(`{ ${count} server(s) configured }`)}`);\n } else {\n console.log(` ${pc.cyan(k.padEnd(24))} = ${pc.green(JSON.stringify(v))}`);\n }\n }\n console.log(pc.dim('\\nUpdate setting: lantern config set <key> <value>'));\n console.log(pc.dim(`Supported keys: ${ALLOWED_CONFIG_KEYS.join(', ')}\\n`));\n return;\n }\n\n if (action === 'path') {\n console.log(configPath);\n return;\n }\n\n if (action === 'get') {\n if (!key) {\n console.error(pc.red('Error: Missing config key. Usage: orbit config get <key>'));\n process.exit(1);\n }\n const config = loadConfig() as unknown as Record<string, unknown>;\n if (!(key in config)) {\n console.error(pc.red(`Error: Unknown configuration key '${key}'`));\n process.exit(1);\n }\n console.log(JSON.stringify(config[key]));\n return;\n }\n\n if (action === 'set') {\n if (!key || value === undefined) {\n console.error(pc.red('Error: Missing key or value. Usage: orbit config set <key> <value>'));\n process.exit(1);\n }\n\n const res = setConfigValue(key, value);\n if (!res.success) {\n console.error(pc.red(`Error: ${res.error}`));\n process.exit(1);\n }\n\n console.log(pc.green(`✓ Set ${key} = ${value}`));\n return;\n }\n\n console.error(pc.red(`Error: Unknown config action '${action}'. Available: list, get, set, path`));\n process.exit(1);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport pc from 'picocolors';\nimport { GoogleGenAI } from '@google/genai';\nimport { getLanternHomeDir, getConfigFilePath, loadConfig } from '../config/config.js';\nimport { getSessionsDir } from '../session/sessionManager.js';\nimport { loadMcpConfig } from '../mcp/mcpConfig.js';\nimport { loadProjectInstructions } from '../config/projectInstructions.js';\n\nexport async function doctorCommand(): Promise<void> {\n console.log('\\n' + pc.bold(pc.yellow('🏮 Code Lantern Doctor — Diagnostics')));\n console.log(pc.dim('──────────────────────────────────────────────────────────────────────────────'));\n\n let issuesFound = 0;\n\n // 1. Operating System & Architecture\n const platformName = process.platform === 'darwin'\n ? `macOS (${process.arch === 'arm64' ? 'Apple Silicon' : 'Intel'})`\n : process.platform === 'win32'\n ? `Windows (${process.arch})`\n : `${process.platform} (${process.arch})`;\n console.log(`${pc.green('✓')} Platform / OS: ${platformName}`);\n\n // 2. Node.js environment\n const nodeVer = process.version;\n const major = parseInt(nodeVer.replace('v', '').split('.')[0], 10);\n if (major >= 18) {\n console.log(`${pc.green('✓')} Node.js Runtime: ${nodeVer} (compatible)`);\n } else {\n issuesFound++;\n console.log(`${pc.red('✗')} Node.js Runtime: ${nodeVer} (Node 18+ required)`);\n }\n\n // 3. Gemini API Key\n const apiKey = process.env.GEMINI_API_KEY;\n if (!apiKey || apiKey.trim().length === 0) {\n issuesFound++;\n console.log(`${pc.red('✗')} GEMINI_API_KEY: Missing!`);\n console.log(pc.yellow(' → To fix: export GEMINI_API_KEY=\"your-api-key\" from https://aistudio.google.com/app/apikey'));\n } else {\n const masked = apiKey.length > 8 ? `${apiKey.slice(0, 4)}...${apiKey.slice(-4)}` : 'configured';\n console.log(`${pc.green('✓')} GEMINI_API_KEY: Found (${masked})`);\n\n // Verify key with Gemini API\n try {\n const ai = new GoogleGenAI({ apiKey: apiKey.trim() });\n const testModel = 'gemini-3.8-flash';\n await ai.models.countTokens({\n model: testModel,\n contents: 'test'\n });\n console.log(`${pc.green('✓')} Gemini API Auth: Verified (contacted '${testModel}')`);\n } catch (err: any) {\n issuesFound++;\n console.log(`${pc.red('✗')} Gemini API Auth: Failed to contact API: ${err.message}`);\n console.log(pc.yellow(' → Verify your API key at https://aistudio.google.com/app/apikey'));\n }\n }\n\n // 4. Git integration\n try {\n const gitVer = execSync('git --version', { stdio: 'pipe' }).toString().trim();\n console.log(`${pc.green('✓')} Git CLI: Available (${gitVer})`);\n } catch {\n console.log(`${pc.yellow('!')} Git CLI: Not found in PATH (some git tools will be unavailable)`);\n }\n\n // 5. Configuration\n try {\n const configFile = getConfigFilePath();\n const config = loadConfig();\n console.log(`${pc.green('✓')} Config File: ${configFile} (Model: ${config.defaultModel})`);\n } catch (err: any) {\n issuesFound++;\n console.log(`${pc.red('✗')} Config File: Invalid config: ${err.message}`);\n }\n\n // 6. Session storage\n try {\n const sessionsDir = getSessionsDir();\n const count = fs.readdirSync(sessionsDir).filter(f => f.endsWith('.json')).length;\n console.log(`${pc.green('✓')} Session Storage: ${sessionsDir} (${count} stored session(s))`);\n } catch (err: any) {\n issuesFound++;\n console.log(`${pc.red('✗')} Session Storage: Failed to access: ${err.message}`);\n }\n\n // 7. MCP Servers\n const mcpServers = loadMcpConfig();\n const serverCount = Object.keys(mcpServers).length;\n if (serverCount === 0) {\n console.log(`${pc.cyan('ℹ')} MCP Configuration: No external MCP servers configured (optional)`);\n } else {\n console.log(`${pc.green('✓')} MCP Configuration: ${serverCount} server(s) configured`);\n for (const [name, s] of Object.entries(mcpServers)) {\n const status = s.disabled ? pc.dim('(disabled)') : pc.green('(enabled)');\n console.log(` • ${name}: ${s.command} ${(s.args || []).join(' ')} ${status}`);\n }\n }\n\n // 8. Workspace & Project Instructions\n const cwd = process.cwd();\n const instructions = loadProjectInstructions(cwd);\n if (instructions.found) {\n console.log(`${pc.green('✓')} Project Instructions: Found (${path.basename(instructions.filePath || '')}) in ${cwd}`);\n } else {\n console.log(`${pc.dim('ℹ')} Project Instructions: None found in workspace (e.g. LANTERN.md, GEMINI.md)`);\n }\n\n console.log(pc.dim('──────────────────────────────────────────────────────────────────────────────'));\n if (issuesFound === 0) {\n console.log(pc.bold(pc.green('✨ All systems healthy! Code Lantern CLI is ready to assist.')));\n } else {\n console.log(pc.bold(pc.yellow(`⚠️ Doctor found ${issuesFound} issue(s) to address before optimal use.`)));\n }\n console.log('');\n}\n","import pc from 'picocolors';\nimport { loadMcpConfig, addMcpServer, removeMcpServer, toggleMcpServer } from '../mcp/mcpConfig.js';\nimport { McpManager } from '../mcp/mcpManager.js';\n\nexport async function mcpCommand(\n action?: string,\n serverName?: string,\n command?: string,\n args: string[] = []\n): Promise<void> {\n const servers = loadMcpConfig();\n\n if (!action || action === 'list') {\n console.log('\\n' + pc.bold(pc.yellow('🏮 Code Lantern MCP Servers')));\n console.log(pc.dim('─────────────────────────────────────────────────────────────'));\n\n const entries = Object.entries(servers);\n if (entries.length === 0) {\n console.log(pc.dim('No MCP servers configured.'));\n console.log(pc.dim('\\nTo add a server: lantern mcp add <name> <command> [args...]'));\n console.log(pc.dim('Example: lantern mcp add sqlite npx -y @modelcontextprotocol/server-sqlite /path/to/db.sqlite\\n'));\n return;\n }\n\n for (const [name, s] of entries) {\n const statusBadge = s.disabled ? pc.red('[disabled]') : pc.green('[enabled]');\n console.log(`${pc.bold(name)} ${statusBadge}`);\n console.log(` Command: ${pc.cyan(s.command)} ${(s.args || []).join(' ')}`);\n if (s.env && Object.keys(s.env).length > 0) {\n console.log(` Env: ${JSON.stringify(s.env)}`);\n }\n console.log('');\n }\n return;\n }\n\n if (action === 'add') {\n if (!serverName || !command) {\n console.error(pc.red('Error: Missing arguments. Usage: orbit mcp add <name> <command> [args...]'));\n process.exit(1);\n }\n\n addMcpServer(serverName, {\n command,\n args: args.length > 0 ? args : undefined\n });\n\n console.log(pc.green(`✓ Added MCP server '${serverName}': ${command} ${args.join(' ')}`));\n return;\n }\n\n if (action === 'remove' || action === 'rm') {\n if (!serverName) {\n console.error(pc.red('Error: Missing server name. Usage: orbit mcp remove <name>'));\n process.exit(1);\n }\n\n const removed = removeMcpServer(serverName);\n if (removed) {\n console.log(pc.green(`✓ Removed MCP server '${serverName}'`));\n } else {\n console.error(pc.red(`✗ MCP server '${serverName}' not found`));\n process.exit(1);\n }\n return;\n }\n\n if (action === 'disable') {\n if (!serverName) {\n console.error(pc.red('Error: Missing server name. Usage: orbit mcp disable <name>'));\n process.exit(1);\n }\n toggleMcpServer(serverName, true);\n console.log(pc.yellow(`✓ Disabled MCP server '${serverName}'`));\n return;\n }\n\n if (action === 'enable') {\n if (!serverName) {\n console.error(pc.red('Error: Missing server name. Usage: orbit mcp enable <name>'));\n process.exit(1);\n }\n toggleMcpServer(serverName, false);\n console.log(pc.green(`✓ Enabled MCP server '${serverName}'`));\n return;\n }\n\n if (action === 'test') {\n if (!serverName) {\n console.error(pc.red('Error: Missing server name. Usage: orbit mcp test <name>'));\n process.exit(1);\n }\n\n const server = servers[serverName];\n if (!server) {\n console.error(pc.red(`✗ MCP server '${serverName}' not found in configuration`));\n process.exit(1);\n }\n\n console.log(`Connecting to MCP server '${serverName}'...`);\n const mgr = new McpManager();\n try {\n const tools = await mgr.connectServer(serverName, server);\n console.log(pc.green(`✓ Connected successfully! Exposing ${tools.length} tool(s):`));\n for (const t of tools) {\n console.log(` - ${pc.cyan(t.definition.name)}: ${t.definition.description}`);\n }\n } catch (err: any) {\n console.error(pc.red(`✗ Failed to connect to '${serverName}': ${err.message}`));\n process.exit(1);\n } finally {\n await mgr.closeAll();\n }\n return;\n }\n\n console.error(pc.red(`Error: Unknown action '${action}'. Available: list, add, remove, enable, disable, test`));\n process.exit(1);\n}\n"],"mappings":"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","names":["pc","pc","pc","pc","config","pc","pc","pc","pc","pc","pc","pc","pc","pc","pc","config","pc","fs","path","pc","pc","config","fs","path","pc","pc"]}
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Core type definitions for Orbit CLI
3
+ */
4
+ type ModelRole = 'user' | 'model' | 'tool' | 'system';
5
+ interface FileAttachment {
6
+ path: string;
7
+ name: string;
8
+ mimeType: string;
9
+ size: number;
10
+ base64Data?: string;
11
+ textContent?: string;
12
+ }
13
+ interface ToolCallItem {
14
+ id: string;
15
+ name: string;
16
+ args: Record<string, unknown>;
17
+ }
18
+ interface ToolResultItem {
19
+ callId: string;
20
+ name: string;
21
+ result: unknown;
22
+ error?: string;
23
+ }
24
+ interface ConversationTurn {
25
+ role: ModelRole;
26
+ text?: string;
27
+ toolCalls?: ToolCallItem[];
28
+ toolResults?: ToolResultItem[];
29
+ attachments?: FileAttachment[];
30
+ timestamp: string;
31
+ }
32
+ interface TokenUsage {
33
+ promptTokens: number;
34
+ candidatesTokens: number;
35
+ totalTokens: number;
36
+ }
37
+ interface OrbitSession {
38
+ id: string;
39
+ title: string;
40
+ createdAt: string;
41
+ updatedAt: string;
42
+ workspace: string;
43
+ model: string;
44
+ turns: ConversationTurn[];
45
+ totalUsage: TokenUsage;
46
+ }
47
+ interface McpServerConfig {
48
+ command: string;
49
+ args?: string[];
50
+ env?: Record<string, string>;
51
+ disabled?: boolean;
52
+ }
53
+ interface OrbitConfig {
54
+ defaultModel: string;
55
+ maxSteps: number;
56
+ temperature: number;
57
+ maxOutputTokens?: number;
58
+ yolo: boolean;
59
+ theme: 'default' | 'ocean' | 'minimal';
60
+ autoCompactThreshold: number;
61
+ mcpServers?: Record<string, McpServerConfig>;
62
+ timeoutMs: number;
63
+ }
64
+ interface ApprovalRequest {
65
+ type: 'file_edit' | 'file_write' | 'command';
66
+ summary: string;
67
+ details?: {
68
+ path?: string;
69
+ before?: string;
70
+ after?: string;
71
+ diff?: string;
72
+ command?: string;
73
+ };
74
+ }
75
+ type ApprovalDecision = 'allow' | 'deny' | 'yolo_all';
76
+ interface AgentContext {
77
+ workspace: string;
78
+ model: string;
79
+ yolo: boolean;
80
+ planMode: boolean;
81
+ jsonOutput: boolean;
82
+ maxSteps: number;
83
+ attachments?: FileAttachment[];
84
+ }
85
+ interface ToolDefinition {
86
+ name: string;
87
+ description: string;
88
+ parameters: {
89
+ type: 'object';
90
+ properties: Record<string, {
91
+ type: string;
92
+ description: string;
93
+ enum?: string[];
94
+ items?: {
95
+ type: string;
96
+ };
97
+ }>;
98
+ required?: string[];
99
+ };
100
+ readOnly?: boolean;
101
+ }
102
+ interface ToolExecutionContext {
103
+ workspace: string;
104
+ yolo: boolean;
105
+ planMode: boolean;
106
+ requestApproval: (request: ApprovalRequest) => Promise<boolean>;
107
+ }
108
+ interface ToolExecutionResult {
109
+ success: boolean;
110
+ output: string;
111
+ error?: string;
112
+ metadata?: Record<string, unknown>;
113
+ }
114
+
115
+ declare function getLanternHomeDir(): string;
116
+ declare function getConfigFilePath(): string;
117
+ declare function loadConfig(): OrbitConfig;
118
+ declare function saveConfig(config: OrbitConfig): void;
119
+ declare function setConfigValue(key: string, value: unknown): {
120
+ success: boolean;
121
+ error?: string;
122
+ updatedConfig?: OrbitConfig;
123
+ };
124
+ declare function getConfigValue<K extends keyof OrbitConfig>(key: K): OrbitConfig[K];
125
+
126
+ declare const DEFAULT_CONFIG: OrbitConfig;
127
+ declare const ALLOWED_CONFIG_KEYS: readonly ["defaultModel", "maxSteps", "temperature", "maxOutputTokens", "yolo", "theme", "autoCompactThreshold", "timeoutMs"];
128
+ type ConfigKey = (typeof ALLOWED_CONFIG_KEYS)[number];
129
+ declare function validateConfigValue(key: string, value: unknown): {
130
+ valid: boolean;
131
+ error?: string;
132
+ parsedValue?: unknown;
133
+ };
134
+
135
+ interface ProjectInstructions {
136
+ found: boolean;
137
+ filePath?: string;
138
+ content?: string;
139
+ }
140
+ declare function loadProjectInstructions(workspaceDir: string): ProjectInstructions;
141
+
142
+ interface StreamCallbacks {
143
+ onChunk?: (text: string) => void;
144
+ onToolCalls?: (toolCalls: ToolCallItem[]) => void;
145
+ onUsage?: (usage: TokenUsage) => void;
146
+ }
147
+ declare class GeminiProvider {
148
+ private client;
149
+ private apiKey;
150
+ constructor(apiKey?: string);
151
+ isConfigured(): boolean;
152
+ getMaskedKey(): string;
153
+ private ensureClient;
154
+ streamGenerate(modelId: string, systemInstruction: string, history: ConversationTurn[], tools: ToolDefinition[], callbacks: StreamCallbacks, options?: {
155
+ temperature?: number;
156
+ maxOutputTokens?: number;
157
+ enableSearchGrounding?: boolean;
158
+ }): Promise<{
159
+ text: string;
160
+ toolCalls: ToolCallItem[];
161
+ usage: TokenUsage;
162
+ }>;
163
+ private convertHistoryToContents;
164
+ private convertToolsToDeclarations;
165
+ }
166
+
167
+ declare class MissingApiKeyError extends Error {
168
+ constructor();
169
+ }
170
+ declare class RateLimitError extends Error {
171
+ constructor(message?: string);
172
+ }
173
+ declare class GeminiProviderError extends Error {
174
+ statusCode?: number;
175
+ constructor(message: string, statusCode?: number);
176
+ }
177
+ declare function formatErrorMessage(err: unknown): string;
178
+
179
+ declare function loadAttachment(filePath: string): FileAttachment;
180
+ declare function loadAttachments(filePaths?: string[]): FileAttachment[];
181
+
182
+ interface PathValidationResult {
183
+ allowed: boolean;
184
+ resolvedPath: string;
185
+ relativePath: string;
186
+ reason?: string;
187
+ }
188
+ declare function validateWorkspacePath(targetPath: string, workspaceDir: string, allowedExternalPaths?: string[]): PathValidationResult;
189
+
190
+ declare function isSecretFile(filePath: string): boolean;
191
+ declare function sanitizeSecrets(text: string): string;
192
+
193
+ interface CommandValidationResult {
194
+ allowed: boolean;
195
+ reason?: string;
196
+ isHighRisk?: boolean;
197
+ }
198
+ declare function validateCommand(command: string): CommandValidationResult;
199
+
200
+ declare class ApprovalEngine {
201
+ private yolo;
202
+ private planMode;
203
+ constructor(options: {
204
+ yolo?: boolean;
205
+ planMode?: boolean;
206
+ });
207
+ isYolo(): boolean;
208
+ setYolo(val: boolean): void;
209
+ isPlanMode(): boolean;
210
+ requestApproval(req: ApprovalRequest): Promise<boolean>;
211
+ private promptUser;
212
+ }
213
+
214
+ declare function formatTerminalDiff(filePath: string, oldContent: string, newContent: string, contextLines?: number): string;
215
+ declare function formatNewFilePreview(filePath: string, content: string, maxPreviewLines?: number): string;
216
+
217
+ declare function getSessionsDir(): string;
218
+ declare function generateSessionId(): string;
219
+ declare function createNewSession(workspace: string, model: string, initialTitle?: string): OrbitSession;
220
+ declare function saveSession(session: OrbitSession): void;
221
+ declare function loadSession(sessionId: string): OrbitSession | null;
222
+ declare function listSessions(): Array<{
223
+ id: string;
224
+ title: string;
225
+ updatedAt: string;
226
+ turnCount: number;
227
+ workspace: string;
228
+ model: string;
229
+ }>;
230
+ declare function deleteSession(sessionId: string): boolean;
231
+ declare function exportSessionMarkdown(session: OrbitSession): string;
232
+
233
+ declare function shouldCompact(turns: ConversationTurn[], threshold?: number): boolean;
234
+ declare function compactTurns(turns: ConversationTurn[], retainRecentCount?: number): ConversationTurn[];
235
+
236
+ interface OrbitTool {
237
+ definition: ToolDefinition;
238
+ execute: (args: Record<string, any>, context: ToolExecutionContext) => Promise<ToolExecutionResult>;
239
+ }
240
+
241
+ declare class ToolRegistry {
242
+ private tools;
243
+ constructor();
244
+ private registerBuiltins;
245
+ registerTool(tool: OrbitTool): void;
246
+ registerTools(tools: OrbitTool[]): void;
247
+ getTool(name: string): OrbitTool | undefined;
248
+ getDefinitions(planMode?: boolean): ToolDefinition[];
249
+ executeTool(name: string, args: Record<string, unknown>, context: ToolExecutionContext): Promise<ToolExecutionResult>;
250
+ }
251
+
252
+ declare class McpManager {
253
+ private connections;
254
+ initialize(): Promise<OrbitTool[]>;
255
+ connectServer(serverName: string, config: McpServerConfig): Promise<OrbitTool[]>;
256
+ disconnectServer(serverName: string): Promise<void>;
257
+ closeAll(): Promise<void>;
258
+ }
259
+
260
+ declare function getMcpConfigPath(): string;
261
+ declare function loadMcpConfig(): Record<string, McpServerConfig>;
262
+ declare function saveMcpConfig(servers: Record<string, McpServerConfig>): void;
263
+ declare function addMcpServer(name: string, config: McpServerConfig): void;
264
+ declare function removeMcpServer(name: string): boolean;
265
+ declare function toggleMcpServer(name: string, disabled: boolean): boolean;
266
+
267
+ declare class OrbitAgent {
268
+ private provider;
269
+ private tools;
270
+ private mcpManager;
271
+ private approvalEngine;
272
+ private spinner;
273
+ constructor(apiKey?: string);
274
+ initMcp(): Promise<void>;
275
+ shutdown(): Promise<void>;
276
+ buildSystemPrompt(workspace: string, planMode?: boolean): string;
277
+ runTurn(session: OrbitSession, userPrompt: string, context: AgentContext, attachments?: FileAttachment[]): Promise<{
278
+ reply: string;
279
+ toolCount: number;
280
+ usage: TokenUsage;
281
+ }>;
282
+ }
283
+
284
+ export { ALLOWED_CONFIG_KEYS, type AgentContext, type ApprovalDecision, ApprovalEngine, type ApprovalRequest, type CommandValidationResult, type ConfigKey, type ConversationTurn, DEFAULT_CONFIG, type FileAttachment, GeminiProvider, GeminiProviderError, McpManager, type McpServerConfig, MissingApiKeyError, type ModelRole, OrbitAgent, type OrbitConfig, type OrbitSession, type OrbitTool, type PathValidationResult, type ProjectInstructions, RateLimitError, type StreamCallbacks, type TokenUsage, type ToolCallItem, type ToolDefinition, type ToolExecutionContext, type ToolExecutionResult, ToolRegistry, type ToolResultItem, addMcpServer, compactTurns, createNewSession, deleteSession, exportSessionMarkdown, formatErrorMessage, formatNewFilePreview, formatTerminalDiff, generateSessionId, getConfigFilePath, getConfigValue, getLanternHomeDir, getMcpConfigPath, getSessionsDir, isSecretFile, listSessions, loadAttachment, loadAttachments, loadConfig, loadMcpConfig, loadProjectInstructions, loadSession, removeMcpServer, sanitizeSecrets, saveConfig, saveMcpConfig, saveSession, setConfigValue, shouldCompact, toggleMcpServer, validateCommand, validateConfigValue, validateWorkspacePath };
package/dist/index.js ADDED
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ALLOWED_CONFIG_KEYS,
4
+ ApprovalEngine,
5
+ DEFAULT_CONFIG,
6
+ GeminiProvider,
7
+ GeminiProviderError,
8
+ McpManager,
9
+ MissingApiKeyError,
10
+ OrbitAgent,
11
+ RateLimitError,
12
+ ToolRegistry,
13
+ addMcpServer,
14
+ compactTurns,
15
+ createNewSession,
16
+ deleteSession,
17
+ exportSessionMarkdown,
18
+ formatErrorMessage,
19
+ formatNewFilePreview,
20
+ formatTerminalDiff,
21
+ generateSessionId,
22
+ getConfigFilePath,
23
+ getConfigValue,
24
+ getLanternHomeDir,
25
+ getMcpConfigPath,
26
+ getSessionsDir,
27
+ isSecretFile,
28
+ listSessions,
29
+ loadAttachment,
30
+ loadAttachments,
31
+ loadConfig,
32
+ loadMcpConfig,
33
+ loadProjectInstructions,
34
+ loadSession,
35
+ removeMcpServer,
36
+ sanitizeSecrets,
37
+ saveConfig,
38
+ saveMcpConfig,
39
+ saveSession,
40
+ setConfigValue,
41
+ shouldCompact,
42
+ toggleMcpServer,
43
+ validateCommand,
44
+ validateConfigValue,
45
+ validateWorkspacePath
46
+ } from "./chunk-Y3PEOLTZ.js";
47
+ export {
48
+ ALLOWED_CONFIG_KEYS,
49
+ ApprovalEngine,
50
+ DEFAULT_CONFIG,
51
+ GeminiProvider,
52
+ GeminiProviderError,
53
+ McpManager,
54
+ MissingApiKeyError,
55
+ OrbitAgent,
56
+ RateLimitError,
57
+ ToolRegistry,
58
+ addMcpServer,
59
+ compactTurns,
60
+ createNewSession,
61
+ deleteSession,
62
+ exportSessionMarkdown,
63
+ formatErrorMessage,
64
+ formatNewFilePreview,
65
+ formatTerminalDiff,
66
+ generateSessionId,
67
+ getConfigFilePath,
68
+ getConfigValue,
69
+ getLanternHomeDir,
70
+ getMcpConfigPath,
71
+ getSessionsDir,
72
+ isSecretFile,
73
+ listSessions,
74
+ loadAttachment,
75
+ loadAttachments,
76
+ loadConfig,
77
+ loadMcpConfig,
78
+ loadProjectInstructions,
79
+ loadSession,
80
+ removeMcpServer,
81
+ sanitizeSecrets,
82
+ saveConfig,
83
+ saveMcpConfig,
84
+ saveSession,
85
+ setConfigValue,
86
+ shouldCompact,
87
+ toggleMcpServer,
88
+ validateCommand,
89
+ validateConfigValue,
90
+ validateWorkspacePath
91
+ };
92
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,56 @@
1
1
  {
2
2
  "name": "codelantern-agent-cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "Code Lantern CLI - Personal AI coding assistant for the terminal powered by Google Gemini",
5
+ "type": "module",
6
+ "bin": {
7
+ "lantern": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "engines": {
17
+ "node": ">=18.0.0"
18
+ },
19
+ "scripts": {
20
+ "build": "tsup",
21
+ "dev": "tsx src/cli.ts",
22
+ "start": "node dist/cli.js",
23
+ "test": "tsx test/index.test.ts",
24
+ "lint": "tsc --noEmit",
25
+ "prepublishOnly": "npm run build && npm test"
26
+ },
27
+ "keywords": [
28
+ "ai",
29
+ "cli",
30
+ "gemini",
31
+ "code-lantern",
32
+ "coding-assistant",
33
+ "developer-tools",
34
+ "terminal",
35
+ "mcp",
36
+ "windows",
37
+ "macos"
38
+ ],
39
+ "author": "",
40
+ "license": "MIT",
41
+ "dependencies": {
42
+ "@google/genai": "^2.32.0",
43
+ "@modelcontextprotocol/sdk": "^1.32.2",
44
+ "commander": "^14.0.3",
45
+ "diff": "^8.0.4",
46
+ "fast-glob": "^3.3.3",
47
+ "ignore": "^7.0.5",
48
+ "picocolors": "^1.1.1"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^25.3.0",
52
+ "tsup": "^8.5.1",
53
+ "tsx": "^4.21.0",
54
+ "typescript": "^5.8.2"
55
+ }
56
+ }