@cryer/star-cli 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/main.tsx","../src/cli/format.ts","../src/cli/mentions.ts","../src/cli/print-json.ts","../src/cli/repl.tsx","../src/config/save.ts","../src/config/schema.ts","../src/llm/provider.ts","../src/llm/registry.ts","../src/session/checkpoints.ts","../src/session/clear.ts","../src/session/store.ts","../src/session/list.ts","../src/session/resume.ts","../src/cli/cost.ts","../src/session/usage.ts","../src/version.ts","../src/cli/budget.ts","../src/cli/clipboard.ts","../src/cli/commands/actions.ts","../src/cli/diff-preview.ts","../src/cli/commands/builtin.ts","../src/cli/commands/custom.ts","../src/cli/commands/doctor.ts","../src/cli/commands/init-project.ts","../src/cli/commands/registry.ts","../src/cli/commands/rewind.ts","../src/cli/components/ExitPlanPrompt.tsx","../src/cli/components/InputBox.tsx","../src/cli/commands/suggest.ts","../src/cli/path-suggest.ts","../src/cli/components/MessageList.tsx","../src/cli/components/DiffLines.tsx","../src/cli/components/PermissionPrompt.tsx","../src/cli/components/RewindConfirmPrompt.tsx","../src/cli/components/StatusBar.tsx","../src/cli/components/StreamingMessage.tsx","../src/cli/components/ThinkingIndicator.tsx","../src/cli/components/ToolCallCard.tsx","../src/cli/double-esc.ts","../src/cli/notify.ts","../src/cli/queue.ts","../src/cli/shell-bang.ts","../src/cli/ticker.ts","../src/cli/update-check.ts","../src/config/loader.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { AgentLoop } from \"./agent/loop\";\nimport { formatStreamError } from \"./cli/format\";\nimport { MAX_IMAGE_BYTES, imageMimeType, readImageInput, resolveMentions } from \"./cli/mentions\";\nimport { UsageTracker, eventToJsonLine } from \"./cli/print-json\";\nimport { renderRepl } from \"./cli/repl\";\nimport { loadConfigSync } from \"./config/loader\";\nimport { type StarConfig, contextWindowTokens } from \"./config/schema\";\nimport type { CoreMessage, ImageInput } from \"./core/messages\";\nimport { createModel } from \"./llm/provider\";\nimport { loadSessionSnapshots } from \"./session/checkpoints\";\nimport { clearSessions } from \"./session/clear\";\nimport {\n findLatestSession,\n formatSessionEntries,\n listSessionEntries,\n resolveSessionId,\n} from \"./session/list\";\nimport { resumeSession } from \"./session/resume\";\nimport { type SessionMeta, SessionStore } from \"./session/store\";\nimport { defaultTaskManager } from \"./tasks/manager\";\nimport { createDefaultRegistry } from \"./tools\";\nimport { hydrateSnapshots } from \"./tools/fs/snapshots\";\nimport { VERSION } from \"./version\";\n\nconst SYSTEM_PROMPT = `You are Star CLI, an AI coding agent running in the user's terminal.\nYou help with software engineering tasks: reading, writing and editing code, running shell commands, and managing todos.\nBe concise and direct. Use tools when they help accomplish the task.\nThe working directory is the user's project root; never touch files outside it without explicit instruction.`;\n\nasync function createLoop(\n config: StarConfig,\n modelName: string,\n cwd: string,\n sessionStore: SessionStore | null,\n) {\n const model = createModel(config, modelName);\n const registry = createDefaultRegistry();\n return new AgentLoop({\n model,\n registry,\n config,\n cwd,\n system: SYSTEM_PROMPT,\n sessionStore,\n contextMaxTokens: contextWindowTokens(config, modelName),\n });\n}\n\nasync function printMode(\n loop: AgentLoop,\n prompt: string,\n cwd: string,\n json: boolean,\n imagePaths: string[],\n): Promise<number> {\n const flagImages: ImageInput[] = [];\n for (const imagePath of imagePaths) {\n if (!imageMimeType(imagePath)) {\n process.stderr.write(\n `[error] unsupported image type: ${imagePath} (supported: png, jpg, jpeg, gif, webp)\\n`,\n );\n return 1;\n }\n const image = await readImageInput(imagePath, cwd);\n if (!image) {\n process.stderr.write(\n `[error] cannot read image: ${imagePath} (missing, unreadable, or larger than ${MAX_IMAGE_BYTES / (1024 * 1024)}MB)\\n`,\n );\n return 1;\n }\n flagImages.push(image);\n }\n const controller = new AbortController();\n process.on(\"SIGINT\", () => controller.abort());\n loop.onHookWarning = (message) => {\n process.stderr.write(`[hook] ${message}\\n`);\n };\n const resolved = await resolveMentions(prompt, cwd);\n if (resolved.attached.length > 0) {\n process.stderr.write(`[attached] ${resolved.attached.join(\", \")}\\n`);\n }\n for (const skip of resolved.skipped) {\n process.stderr.write(`[skipped] @${skip.path}: ${skip.reason}\\n`);\n }\n const images = [...flagImages, ...resolved.images];\n const input: string | { text: string; images: ImageInput[] } =\n images.length > 0 ? { text: resolved.input, images } : resolved.input;\n const usage = new UsageTracker();\n let exitCode = 0;\n try {\n for await (const event of loop.stream(input, controller.signal, {\n persistAs: prompt,\n })) {\n if (json) {\n const line = eventToJsonLine(event);\n if (line) process.stdout.write(`${line}\\n`);\n }\n switch (event.type) {\n case \"text-delta\":\n if (!json) process.stdout.write(event.text);\n break;\n case \"reasoning\":\n break;\n case \"tool-call\":\n if (!json) process.stderr.write(`\\n[tool] ${event.name} ${JSON.stringify(event.args)}\\n`);\n break;\n case \"tool-result\": {\n if (!json) {\n const preview =\n event.content.length > 500\n ? `${event.content.slice(0, 500)}... (truncated)`\n : event.content;\n process.stderr.write(`[result] ${event.isError ? \"ERROR: \" : \"\"}${preview}\\n`);\n }\n break;\n }\n case \"finish\":\n usage.add(event.usage);\n break;\n case \"error\":\n if (!json) process.stderr.write(`\\n[error] ${formatStreamError(event.error)}\\n`);\n exitCode = 1;\n break;\n }\n if (exitCode !== 0) break;\n }\n } catch (error) {\n if (!(error instanceof DOMException && error.name === \"AbortError\")) {\n const message = error instanceof Error ? formatStreamError(error) : String(error);\n process.stderr.write(`\\n[error] ${message}\\n`);\n exitCode = 1;\n }\n }\n const usageLine = usage.toJsonLine();\n if (usageLine) {\n if (json) {\n process.stdout.write(`${usageLine}\\n`);\n } else {\n const t = usage.totals;\n process.stderr.write(\n `[usage] ${t.requests} requests, ${t.promptTokens} prompt + ${t.completionTokens} completion = ${t.totalTokens} tokens\\n`,\n );\n }\n }\n if (!json) process.stdout.write(\"\\n\");\n defaultTaskManager.cleanup();\n return exitCode;\n}\n\nconst program = new Command();\n\nprogram\n .name(\"star\")\n .description(\"Star CLI — an AI agent command-line interface\")\n .version(VERSION)\n .option(\"-m, --model <model>\", \"model to use\")\n .option(\"--permission-mode <mode>\", \"permission mode: ask | auto | readonly | yolo | plan\")\n .option(\"-p, --print <prompt>\", \"non-interactive print mode\")\n .option(\"--json\", \"output NDJSON events on stdout (print mode only)\")\n .option(\n \"--image <path>\",\n \"attach an image file (png/jpg/jpeg/gif/webp, max 5MB); repeatable\",\n (value: string, previous: string[]) => [...previous, value],\n [] as string[],\n )\n .option(\"-r, --resume [sessionId]\", \"resume a previous session (lists sessions when no id given)\")\n .option(\"-c, --continue\", \"continue the most recent session for the current directory\")\n .option(\n \"--clear-sessions [scope]\",\n \"delete stored sessions for the current directory ('all' deletes every session) and exit\",\n )\n .action(async (opts) => {\n const cwd = process.cwd();\n\n if (opts.json && opts.print === undefined) {\n console.error(\n '--json requires print mode: use star -p \"...\" --json (the interactive REPL does not support JSON output).',\n );\n process.exit(1);\n }\n\n if (opts.resume !== undefined && opts.continue) {\n console.error(\"Options --resume and --continue are mutually exclusive: pick one.\");\n process.exit(1);\n }\n\n if (opts.resume === true) {\n const entries = await listSessionEntries(cwd);\n if (entries.length === 0) {\n console.error(\"No sessions found for this directory.\");\n } else {\n console.log(formatSessionEntries(entries));\n }\n process.exit(0);\n }\n\n if (opts.clearSessions !== undefined) {\n const scope = opts.clearSessions;\n if (scope !== true && scope !== \"all\") {\n console.error(`Invalid scope: ${scope}. Use --clear-sessions or --clear-sessions all.`);\n process.exit(1);\n }\n const all = scope === \"all\";\n const removed = await clearSessions(all ? undefined : cwd);\n console.log(\n all\n ? `Deleted ${removed} session(s) across all directories.`\n : `Deleted ${removed} session(s) for this directory.`,\n );\n process.exit(0);\n }\n\n let config: StarConfig;\n try {\n config = loadConfigSync(cwd, { model: opts.model, permissionMode: opts.permissionMode });\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n const modelName = opts.model ?? config.defaultModel;\n if (!modelName) {\n console.error(\n \"No model configured. Add one to ~/.star-cli/config.toml or pass --model.\\n\" +\n \"See README.md for configuration examples.\",\n );\n process.exit(1);\n }\n\n let sessionStore: SessionStore | null = null;\n let resumed: { meta: SessionMeta; messages: CoreMessage[] } | null = null;\n let resumeId: string | null = null;\n if (typeof opts.resume === \"string\") {\n resumeId = await resolveSessionId(opts.resume);\n if (!resumeId) {\n console.error(`Session not found: ${opts.resume}`);\n process.exit(1);\n }\n } else if (opts.continue) {\n const latest = await findLatestSession(cwd);\n if (latest) {\n resumeId = latest.id;\n } else {\n process.stderr.write(\"No previous session for this directory — starting a new session.\\n\");\n }\n }\n\n if (resumeId) {\n resumed = await resumeSession(resumeId);\n if (!resumed) {\n console.error(`Session not found: ${resumeId}`);\n process.exit(1);\n }\n sessionStore = await SessionStore.open(resumeId);\n } else if (!opts.print) {\n sessionStore = await SessionStore.create(cwd, modelName);\n }\n\n let loop: AgentLoop;\n try {\n loop = await createLoop(config, modelName, cwd, sessionStore);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n if (resumed) {\n await loop.loadMessages(resumed.messages);\n if (sessionStore) {\n hydrateSnapshots(await loadSessionSnapshots(sessionStore.dir));\n }\n }\n\n if (opts.print) {\n // Let the loop drain instead of process.exit(): force-exiting on Windows\n // can hit a libuv assertion while undici keep-alive handles are closing.\n process.exitCode = await printMode(\n loop,\n opts.print,\n cwd,\n Boolean(opts.json),\n opts.image ?? [],\n );\n return;\n }\n\n renderRepl(loop, {\n model: modelName,\n permissionMode: config.permissionMode,\n config,\n cwd,\n sessionStore,\n initialMessages: resumed?.messages,\n initialUsage: resumed?.meta.usage,\n });\n });\n\nprogram.parse(process.argv);\n","import type { CoreMessage } from \"../core/messages\";\nimport type { DisplayMessage } from \"./components/MessageList\";\n\nexport function summarizeArgs(args: unknown, maxLength = 120): string {\n let json: string;\n try {\n json = JSON.stringify(args) ?? String(args);\n } catch {\n json = String(args);\n }\n return json.length > maxLength ? `${json.slice(0, maxLength)}...` : json;\n}\n\nexport function previewLines(text: string, maxLines = 10): { text: string; truncated: boolean } {\n const lines = text.split(\"\\n\");\n if (lines.length <= maxLines) return { text, truncated: false };\n return { text: lines.slice(0, maxLines).join(\"\\n\"), truncated: true };\n}\n\n// Splits a streaming buffer into a committable head (complete lines) and a\n// remainder, once the buffer holds at least minCompleteLines complete lines.\n// The last line is always kept in the remainder: it may still be growing.\n// Returns null when there is nothing worth committing yet.\nexport function splitCommittableLines(\n text: string,\n minCompleteLines: number,\n): { committed: string; rest: string } | null {\n const lastNewline = text.lastIndexOf(\"\\n\");\n if (lastNewline < 0) return null;\n const complete = text.slice(0, lastNewline);\n const completeLines = complete.split(\"\\n\").length;\n if (completeLines < minCompleteLines) return null;\n return { committed: complete, rest: text.slice(lastNewline + 1) };\n}\n\nexport function formatStreamError(error: Error): string {\n if (error.message.includes(\"Unexpected end of JSON input\")) {\n return `${error.message} (response stream was truncated — try again)`;\n }\n return error.message;\n}\n\nexport function coreMessageText(message: CoreMessage): string {\n const content = message.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .filter((part) => part.type === \"text\")\n .map((part) => (\"text\" in part ? part.text : \"\"))\n .join(\" \");\n }\n return \"\";\n}\n\nexport function buildDisplayMessages(messages: CoreMessage[]): DisplayMessage[] {\n const display: DisplayMessage[] = [];\n let collapsed = 0;\n for (const message of messages) {\n if (message.role === \"user\" || message.role === \"assistant\") {\n const text = coreMessageText(message);\n if (text) {\n display.push({ id: display.length, role: message.role, text });\n } else {\n collapsed++;\n }\n } else if (message.role === \"tool\") {\n collapsed++;\n }\n }\n if (collapsed > 0) {\n display.push({\n id: display.length,\n role: \"system\",\n text: `已恢复 ${collapsed} 条历史消息`,\n });\n }\n return display;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { ImageInput } from \"../core/messages\";\nimport { isSensitivePath } from \"../tools/fs/util\";\n\nexport const MAX_MENTION_BYTES = 100 * 1024;\nexport const MAX_IMAGE_BYTES = 5 * 1024 * 1024;\n\nconst IMAGE_MIME_TYPES: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n};\n\nexport function imageMimeType(filePath: string): string | null {\n return IMAGE_MIME_TYPES[path.extname(filePath).toLowerCase()] ?? null;\n}\n\n// Reads an image file into a base64 ImageInput. Returns null when the path is\n// not a supported image or cannot be read.\nexport async function readImageInput(filePath: string, cwd: string): Promise<ImageInput | null> {\n const mimeType = imageMimeType(filePath);\n if (!mimeType) return null;\n const abs = path.resolve(cwd, filePath);\n const st = await stat(abs).catch(() => null);\n if (!st || !st.isFile() || st.size > MAX_IMAGE_BYTES) return null;\n const buf = await readFile(abs).catch(() => null);\n if (!buf) return null;\n return { path: filePath, mimeType, data: buf.toString(\"base64\") };\n}\n\nexport interface ParsedMentions {\n cleanText: string;\n mentions: string[];\n}\n\nconst MENTION_RE = /(?<=^|\\s)@([A-Za-z]:[\\\\/][A-Za-z0-9._\\-/\\\\]*|[A-Za-z0-9._\\-/\\\\]+)/g;\n\nexport function parseMentions(text: string): ParsedMentions {\n const mentions: string[] = [];\n const seen = new Set<string>();\n const ranges: Array<[number, number]> = [];\n for (const match of text.matchAll(MENTION_RE)) {\n const mention = match[1];\n const full = match[0];\n if (mention === undefined || full === undefined) continue;\n ranges.push([match.index, match.index + full.length]);\n if (!seen.has(mention)) {\n seen.add(mention);\n mentions.push(mention);\n }\n }\n if (ranges.length === 0) {\n return { cleanText: text, mentions };\n }\n let clean = \"\";\n let last = 0;\n for (const [start, end] of ranges) {\n clean += text.slice(last, start);\n last = end;\n }\n clean += text.slice(last);\n const cleanText = clean\n .replace(/[ \\t]+\\n/g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n return { cleanText, mentions };\n}\n\nexport interface MentionSkip {\n path: string;\n reason: string;\n}\n\nexport interface ResolvedMentions {\n input: string;\n attached: string[];\n skipped: MentionSkip[];\n images: ImageInput[];\n}\n\nfunction isBinaryContent(buf: Buffer): boolean {\n const probe = buf.subarray(0, 8000);\n return probe.includes(0);\n}\n\nexport async function resolveMentions(text: string, cwd: string): Promise<ResolvedMentions> {\n const { cleanText, mentions } = parseMentions(text);\n if (mentions.length === 0) {\n return { input: text, attached: [], skipped: [], images: [] };\n }\n const blocks: string[] = [];\n const attached: string[] = [];\n const skipped: MentionSkip[] = [];\n const images: ImageInput[] = [];\n for (const mention of mentions) {\n const abs = path.resolve(cwd, mention);\n if (isSensitivePath(abs)) {\n skipped.push({ path: mention, reason: \"sensitive file\" });\n continue;\n }\n const mimeType = imageMimeType(mention);\n if (mimeType) {\n const st = await stat(abs).catch(() => null);\n if (!st || !st.isFile()) {\n skipped.push({ path: mention, reason: st ? \"is a directory\" : \"file not found\" });\n continue;\n }\n if (st.size > MAX_IMAGE_BYTES) {\n skipped.push({ path: mention, reason: \"image too large\" });\n continue;\n }\n const buf = await readFile(abs).catch(() => null);\n if (!buf) {\n skipped.push({ path: mention, reason: \"unreadable\" });\n continue;\n }\n attached.push(mention);\n images.push({ path: mention, mimeType, data: buf.toString(\"base64\") });\n continue;\n }\n const st = await stat(abs).catch(() => null);\n if (!st) {\n skipped.push({ path: mention, reason: \"file not found\" });\n continue;\n }\n if (st.isDirectory()) {\n skipped.push({ path: mention, reason: \"is a directory\" });\n continue;\n }\n if (st.size > MAX_MENTION_BYTES) {\n skipped.push({ path: mention, reason: `exceeds ${MAX_MENTION_BYTES / 1024}KB limit` });\n continue;\n }\n const buf = await readFile(abs).catch(() => null);\n if (!buf) {\n skipped.push({ path: mention, reason: \"unreadable\" });\n continue;\n }\n if (isBinaryContent(buf)) {\n skipped.push({ path: mention, reason: \"binary file\" });\n continue;\n }\n attached.push(mention);\n blocks.push(`--- @${mention} ---\\n${buf.toString(\"utf8\")}\\n--- end ---`);\n }\n const input = [cleanText, ...blocks].filter((s) => s.length > 0).join(\"\\n\\n\") || text;\n return { input, attached, skipped, images };\n}\n","import type { StreamEvent, TokenUsage } from \"../core/events\";\n\nexport function eventToJsonLine(event: StreamEvent): string | null {\n switch (event.type) {\n case \"finish\":\n return null;\n case \"error\":\n return JSON.stringify({ type: \"error\", error: { message: event.error.message } });\n default:\n return JSON.stringify(event);\n }\n}\n\nexport class UsageTracker {\n private requests = 0;\n private promptTokens = 0;\n private completionTokens = 0;\n private totalTokens = 0;\n\n add(usage?: TokenUsage): void {\n if (!usage) return;\n this.requests += 1;\n this.promptTokens += usage.promptTokens;\n this.completionTokens += usage.completionTokens;\n this.totalTokens += usage.totalTokens;\n }\n\n get totals(): TokenUsage & { requests: number } {\n return {\n requests: this.requests,\n promptTokens: this.promptTokens,\n completionTokens: this.completionTokens,\n totalTokens: this.totalTokens,\n };\n }\n\n toJsonLine(): string | null {\n if (this.requests === 0) return null;\n return JSON.stringify({\n type: \"usage\",\n requests: this.requests,\n promptTokens: this.promptTokens,\n completionTokens: this.completionTokens,\n totalTokens: this.totalTokens,\n });\n }\n}\n","import { Box, Text, render, useApp, useInput } from \"ink\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { AgentLoop } from \"../agent/loop\";\nimport { addAllowRule, savePermissionMode } from \"../config/save\";\nimport { type StarConfig, contextWindowTokens } from \"../config/schema\";\nimport { estimateTokens } from \"../context/tokens\";\nimport { getGitSummary } from \"../core/git\";\nimport type { CoreMessage, ImageInput } from \"../core/messages\";\nimport { createModel } from \"../llm/provider\";\nimport { listModels } from \"../llm/registry\";\nimport { buildAllowRule, isAllowedByRules } from \"../permissions/allow\";\nimport type { PermissionRequest } from \"../permissions/types\";\nimport { loadSessionSnapshots } from \"../session/checkpoints\";\nimport { clearSessions } from \"../session/clear\";\nimport { formatSessionEntries, listSessionEntries, resolveSessionId } from \"../session/list\";\nimport { resumeSession } from \"../session/resume\";\nimport { SessionStore } from \"../session/store\";\nimport { collectUsageStats, formatUsageDashboard } from \"../session/usage\";\nimport { formatTaskFinished, formatTaskList, formatTaskStarted } from \"../tasks/format\";\nimport { type TaskSnapshot, defaultTaskManager } from \"../tasks/manager\";\nimport { TodoStore, createDefaultRegistry } from \"../tools\";\nimport {\n clearSnapshots,\n hydrateSnapshots,\n listSnapshots,\n rewindToSnapshot,\n undoTurnSnapshots,\n} from \"../tools/fs/snapshots\";\nimport { formatTodos } from \"../tools/todo\";\nimport { VERSION } from \"../version\";\nimport type { ChatBackend } from \"./backend\";\nimport { budgetState } from \"./budget\";\nimport { copyText, readClipboardImage } from \"./clipboard\";\nimport { compactSession, exportSession } from \"./commands/actions\";\nimport { registerBuiltinCommands } from \"./commands/builtin\";\nimport { registerCustomCommands } from \"./commands/custom\";\nimport { formatDoctorReport, runDoctor } from \"./commands/doctor\";\nimport { initProject } from \"./commands/init-project\";\nimport { type CommandContext, CommandRegistry, parseSlashCommand } from \"./commands/registry\";\nimport { formatCheckpointList, planRewind } from \"./commands/rewind\";\nimport { type ExitPlanDecision, ExitPlanPrompt } from \"./components/ExitPlanPrompt\";\nimport { InputBox } from \"./components/InputBox\";\nimport { type DisplayMessage, MessageList } from \"./components/MessageList\";\nimport { type PermissionDecision, PermissionPrompt } from \"./components/PermissionPrompt\";\nimport { RewindConfirmPrompt, type RewindDecision } from \"./components/RewindConfirmPrompt\";\nimport { StatusBar } from \"./components/StatusBar\";\nimport { StreamingMessage } from \"./components/StreamingMessage\";\nimport {\n THOUGHT_SUMMARY_LENGTH,\n ThinkingIndicator,\n truncateTail,\n} from \"./components/ThinkingIndicator\";\nimport { type ToolCardData, formatToolCard } from \"./components/ToolCallCard\";\nimport { computeCostUsd, estimateCost, formatDollars } from \"./cost\";\nimport { type DiffPreview, generateDiffPreview } from \"./diff-preview\";\nimport { isDoubleEscape } from \"./double-esc\";\nimport {\n buildDisplayMessages,\n coreMessageText,\n formatStreamError,\n splitCommittableLines,\n summarizeArgs,\n} from \"./format\";\nimport { resolveMentions } from \"./mentions\";\nimport { notifyBell } from \"./notify\";\nimport { PromptQueue, type QueuedPrompt } from \"./queue\";\nimport { executeShellBang } from \"./shell-bang\";\nimport { type FlushState, nextFlush, startTicker } from \"./ticker\";\nimport { checkForUpdate } from \"./update-check\";\n\n// Matches ansi-escapes' clearTerminal (Ink pulls the same sequence for its\n// own full redraws): erase screen + scrollback, cursor home.\nconst CLEAR_TERMINAL =\n process.platform === \"win32\" ? \"\\u001B[2J\\u001B[0f\" : \"\\u001B[2J\\u001B[3J\\u001B[H\";\n\nexport interface UsageStats {\n requests: number;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nfunction emptyUsage(): UsageStats {\n return { requests: 0, promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n}\n\nfunction runningTaskLabels(): string[] {\n return defaultTaskManager\n .list()\n .filter((t) => t.status === \"running\")\n .map((t) => t.description ?? t.command);\n}\n\n// Shift+Tab cycles these in order; yolo is reachable only via /permission.\nconst SESSION_MODE_CYCLE = [\"ask\", \"auto\", \"readonly\", \"plan\"] as const;\n\nfunction formatUsage(usage: UsageStats): string {\n return `API usage this session: ${usage.requests} requests, ${usage.promptTokens} prompt + ${usage.completionTokens} completion = ${usage.totalTokens} tokens`;\n}\n\ninterface PendingPermission {\n request: PermissionRequest;\n preview: DiffPreview | null;\n resolve: (approved: boolean) => void;\n}\n\ninterface PendingRewind {\n summary: string;\n resolve: (confirmed: boolean) => void;\n}\n\ninterface ReplProps {\n backend: ChatBackend;\n model: string;\n permissionMode: string;\n config: StarConfig;\n cwd: string;\n sessionStore: SessionStore | null;\n initialMessages?: CoreMessage[];\n initialUsage?: UsageStats;\n}\n\nexport function Repl({\n backend,\n model,\n permissionMode,\n config,\n cwd,\n sessionStore,\n initialMessages,\n initialUsage,\n}: ReplProps) {\n const { exit } = useApp();\n const [initialDisplay] = useState(() => buildDisplayMessages(initialMessages ?? []));\n const [messages, setMessages] = useState<DisplayMessage[]>(initialDisplay);\n const [epoch, setEpoch] = useState(0);\n const [streamingText, setStreamingText] = useState<string | null>(null);\n const [isStreaming, setIsStreaming] = useState(false);\n const [thinking, setThinking] = useState(false);\n const [thinkingText, setThinkingText] = useState(\"\");\n const [thoughtSummary, setThoughtSummary] = useState<string | null>(null);\n // usageVersion bump counter: the value is never read; setting it re-renders\n // so usageRef contents flow into StatusBar.\n const [, setUsageVersion] = useState(0);\n const [modelName, setModelName] = useState(model);\n const [pending, setPending] = useState<PendingPermission | null>(null);\n const [spinnerTick, setSpinnerTick] = useState(0);\n const [activity, setActivity] = useState<string | null>(null);\n const [bgLabels, setBgLabels] = useState<string[]>(() => runningTaskLabels());\n const [permissionModeState, setPermissionModeState] = useState(permissionMode);\n const [planApproval, setPlanApprovalState] = useState(false);\n const [pendingRewind, setPendingRewindState] = useState<PendingRewind | null>(null);\n\n const backendRef = useRef<ChatBackend>(backend);\n const nextIdRef = useRef(initialDisplay.length);\n const abortRef = useRef<AbortController | null>(null);\n const streamedRef = useRef(\"\");\n const thinkingRef = useRef(false);\n const reasoningRef = useRef(\"\");\n const tickerStopRef = useRef<(() => void) | null>(null);\n const flushedRef = useRef<FlushState>({ streamed: \"\", reasoning: \"\" });\n const toolCardsRef = useRef(new Map<string, ToolCardData>());\n const pendingRef = useRef<PendingPermission | null>(null);\n const alwaysAllowedRef = useRef(new Set<string>());\n // Mode the session was in before plan mode was entered; restored on plan\n // approval or /plan toggle. null when plan mode is not active.\n const prevModeRef = useRef<StarConfig[\"permissionMode\"] | null>(null);\n const planApprovalRef = useRef(false);\n const pendingRewindRef = useRef<PendingRewind | null>(null);\n const modelNameRef = useRef(model);\n // Live session store: /new swaps it mid-session, so callbacks must go\n // through the ref rather than the prop captured at mount.\n const sessionStoreRef = useRef<SessionStore | null>(sessionStore);\n const usageRef = useRef<UsageStats>(initialUsage ? { ...initialUsage } : emptyUsage());\n // Number of assistant chunks already committed to static history this turn;\n // 0 means the next streamed text still needs the \"star\" header.\n const turnChunksRef = useRef(0);\n // Mirror of `messages` for code that needs the current list synchronously\n // (e.g. computing the /undo cut point before redrawing).\n const messagesRef = useRef<DisplayMessage[]>(initialDisplay);\n\n const [queueItems, setQueueItems] = useState<QueuedPrompt[]>([]);\n const queueRef = useRef(new PromptQueue());\n // Clipboard images staged via Alt+V (or Ctrl+V where the terminal passes it\n // through), merged into the next submitted prompt.\n const [pendingImages, setPendingImages] = useState<{ id: number; image: ImageInput }[]>([]);\n const pendingImagesRef = useRef<{ id: number; image: ImageInput }[]>([]);\n const imageSeqRef = useRef(1);\n const [inputRefill, setInputRefill] = useState<{ text: string; seq: number } | undefined>();\n const refillSeqRef = useRef(0);\n // Timestamp of the last idle Esc; a second one within the window restores\n // the last user message for editing.\n const lastEscRef = useRef<number | null>(null);\n const [gitBranch, setGitBranch] = useState<string | null>(null);\n const [contextPercent, setContextPercent] = useState<number | null>(null);\n const budgetWarnedRef = useRef(false);\n const budgetExceededRef = useRef(false);\n // Latest runStream, so a finishing turn can drain the queue by re-entering\n // it without a circular useCallback dependency.\n const runStreamRef = useRef<((text: string, images?: ImageInput[]) => Promise<void>) | null>(\n null,\n );\n\n const pushMessage = useCallback(\n (role: DisplayMessage[\"role\"], text: string, note?: string, tight?: boolean) => {\n setMessages((prev) => {\n const next = [...prev, { id: nextIdRef.current++, role, text, note, tight }];\n messagesRef.current = next;\n return next;\n });\n },\n [],\n );\n\n // Replace the whole history and remount the list (fresh Static instance).\n const applyMessages = useCallback((next: DisplayMessage[]) => {\n messagesRef.current = next;\n setMessages(next);\n setEpoch((e) => e + 1);\n }, []);\n\n // Ink's <Static> can only append — dropping items from state does not erase\n // them from the terminal. Clear the screen first, then let the remounted\n // Static rewrite the surviving history.\n const redrawMessages = useCallback(\n (next: DisplayMessage[]) => {\n if (process.stdout.isTTY) {\n process.stdout.write(CLEAR_TERMINAL);\n }\n applyMessages(next);\n },\n [applyMessages],\n );\n\n const pushAssistantChunk = useCallback(\n (text: string, tight: boolean) => {\n const role: DisplayMessage[\"role\"] =\n turnChunksRef.current === 0 ? \"assistant\" : \"assistant-cont\";\n turnChunksRef.current += 1;\n pushMessage(role, text, undefined, tight);\n },\n [pushMessage],\n );\n\n const setPendingPermission = useCallback((p: PendingPermission | null) => {\n pendingRef.current = p;\n setPending(p);\n }, []);\n\n const setPlanApproval = useCallback((v: boolean) => {\n planApprovalRef.current = v;\n setPlanApprovalState(v);\n }, []);\n\n const setPendingRewind = useCallback((p: PendingRewind | null) => {\n pendingRewindRef.current = p;\n setPendingRewindState(p);\n }, []);\n\n const stageClipboardImage = useCallback((img: ImageInput) => {\n pendingImagesRef.current = [\n ...pendingImagesRef.current,\n { id: imageSeqRef.current++, image: img },\n ];\n setPendingImages(pendingImagesRef.current);\n }, []);\n\n const clearPendingImages = useCallback(() => {\n pendingImagesRef.current = [];\n setPendingImages([]);\n }, []);\n\n // Numeric session cost (USD) from the accumulated usage; null when the\n // active model has no pricing configured.\n const sessionCostUsd = useCallback(\n () =>\n computeCostUsd(\n usageRef.current,\n config.models.find((m) => m.name === modelNameRef.current),\n ),\n [config],\n );\n\n const handlePasteImage = useCallback(() => {\n void readClipboardImage().then((img) => {\n if (img) stageClipboardImage(img);\n });\n }, [stageClipboardImage]);\n\n const handleRewindDecision = useCallback(\n (decision: RewindDecision) => {\n const p = pendingRewindRef.current;\n if (!p) return;\n setPendingRewind(null);\n p.resolve(decision === \"yes\");\n },\n [setPendingRewind],\n );\n\n // Session-scoped mode switch: mutates the shared config object the AgentLoop\n // reads on every tool call. Entering plan mode remembers the previous mode\n // for later restoration; unlike /permission nothing is written to config.\n const applySessionMode = useCallback(\n (mode: StarConfig[\"permissionMode\"]) => {\n if (mode === config.permissionMode) return;\n if (mode === \"plan\") {\n prevModeRef.current = config.permissionMode;\n } else if (config.permissionMode === \"plan\") {\n prevModeRef.current = null;\n }\n config.permissionMode = mode;\n setPermissionModeState(mode);\n },\n [config],\n );\n\n const attachConfirmHandler = useCallback(\n (target: ChatBackend) => {\n target.confirmHandler = async (req) => {\n if (isAllowedByRules([...alwaysAllowedRef.current], req)) {\n return true;\n }\n const preview = await generateDiffPreview(req.toolName, req.args, cwd).catch(() => null);\n return new Promise<boolean>((resolve) => {\n setPendingPermission({ request: req, preview, resolve });\n });\n };\n target.onHookWarning = (message) => pushMessage(\"system\", message);\n },\n [setPendingPermission, cwd, pushMessage],\n );\n\n useEffect(() => {\n attachConfirmHandler(backendRef.current);\n return () => {\n tickerStopRef.current?.();\n abortRef.current?.abort();\n pendingRef.current?.resolve(false);\n };\n }, [attachConfirmHandler]);\n\n useEffect(() => {\n if (process.env.STAR_NO_UPDATE_CHECK === \"1\") return;\n void checkForUpdate(VERSION).then((message) => {\n if (message) pushMessage(\"system\", message);\n });\n }, [pushMessage]);\n\n useEffect(() => {\n const onUpdate = (task: TaskSnapshot) => {\n setBgLabels(runningTaskLabels());\n pushMessage(\n \"system\",\n task.status === \"running\" ? formatTaskStarted(task) : formatTaskFinished(task),\n );\n // Background tasks are exactly the case where the user has looked away.\n if (task.status !== \"running\") {\n notifyBell({\n enabled: config.notifyBell,\n thresholdSec: config.notifyBellThresholdSec,\n noNotifyEnv: process.env.STAR_NO_NOTIFY === \"1\",\n });\n }\n };\n defaultTaskManager.on(\"update\", onUpdate);\n return () => {\n defaultTaskManager.off(\"update\", onUpdate);\n defaultTaskManager.cleanup();\n };\n }, [pushMessage, config]);\n\n const interrupt = useCallback(() => {\n abortRef.current?.abort();\n const p = pendingRef.current;\n if (p) {\n setPendingPermission(null);\n p.resolve(false);\n }\n const cleared = queueRef.current.clear();\n if (cleared.length > 0) {\n setQueueItems([]);\n pushMessage(\"system\", `cleared ${cleared.length} queued message(s)`);\n }\n }, [setPendingPermission, pushMessage]);\n\n // Double-Esc while idle: retract the last user turn and put the originally\n // typed text back into the input for editing.\n const editLastMessage = useCallback(async () => {\n const current = backendRef.current;\n if (typeof current.retractLastTurn !== \"function\") return;\n const visible = messagesRef.current;\n let cut = -1;\n let text = \"\";\n for (let i = visible.length - 1; i >= 0; i--) {\n const msg = visible[i];\n if (msg?.role === \"user\") {\n cut = i;\n text = msg.text;\n break;\n }\n }\n if (cut < 0) return;\n const { removed } = await current.retractLastTurn();\n if (removed === 0) return;\n redrawMessages(visible.slice(0, cut));\n refillSeqRef.current += 1;\n setInputRefill({ text, seq: refillSeqRef.current });\n pushMessage(\"system\", \"last message restored for editing\");\n }, [pushMessage, redrawMessages]);\n\n const handleExit = useCallback(() => {\n const killed = defaultTaskManager.cleanup();\n if (killed.length > 0) {\n pushMessage(\n \"system\",\n `Stopped ${killed.length} background task(s): ${killed.map((t) => t.id).join(\", \")}`,\n );\n }\n exit();\n }, [exit, pushMessage]);\n\n useInput((_input, key) => {\n if (key.escape) {\n const busy =\n abortRef.current !== null ||\n pendingRef.current !== null ||\n planApprovalRef.current ||\n pendingRewindRef.current !== null;\n if (busy) {\n lastEscRef.current = null;\n interrupt();\n return;\n }\n const now = Date.now();\n if (isDoubleEscape(lastEscRef.current, now)) {\n lastEscRef.current = null;\n void editLastMessage();\n } else {\n lastEscRef.current = now;\n }\n return;\n }\n lastEscRef.current = null;\n if (key.shift && key.tab) {\n // Don't yank the mode out from under a running turn or an open prompt.\n if (\n abortRef.current ||\n pendingRef.current ||\n planApprovalRef.current ||\n pendingRewindRef.current\n )\n return;\n const current = config.permissionMode as (typeof SESSION_MODE_CYCLE)[number];\n const index = SESSION_MODE_CYCLE.indexOf(current);\n const next = SESSION_MODE_CYCLE[(index + 1) % SESSION_MODE_CYCLE.length] ?? \"ask\";\n applySessionMode(next);\n }\n });\n\n const handleDecision = useCallback(\n (decision: PermissionDecision) => {\n const p = pendingRef.current;\n if (!p) return;\n if (decision === \"always\") {\n const rule = buildAllowRule(p.request);\n alwaysAllowedRef.current.add(rule);\n void addAllowRule(rule)\n .then((added) => {\n pushMessage(\n \"system\",\n added\n ? `Always allow ${rule} — saved to config`\n : `Always allow ${rule} (already in config)`,\n );\n })\n .catch(() => {\n pushMessage(\"system\", `Always allow ${rule} for this session (failed to save)`);\n });\n }\n setPendingPermission(null);\n p.resolve(decision !== \"no\");\n },\n [setPendingPermission, pushMessage],\n );\n\n const switchModel = useCallback(\n async (name: string): Promise<string> => {\n try {\n const newModel = createModel(config, name);\n const loop = new AgentLoop({\n model: newModel,\n registry: createDefaultRegistry(),\n config,\n cwd,\n sessionStore: sessionStoreRef.current,\n contextMaxTokens: contextWindowTokens(config, name),\n });\n const prev = backendRef.current;\n if (prev instanceof AgentLoop) {\n await loop.loadMessages([...prev.getMessages()]);\n }\n attachConfirmHandler(loop);\n backendRef.current = loop;\n modelNameRef.current = name;\n setModelName(name);\n return `Switched to model \"${name}\".`;\n } catch (error) {\n return `Failed to switch model: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n [config, cwd, attachConfirmHandler],\n );\n\n const resume = useCallback(\n async (id: string): Promise<string> => {\n const current = backendRef.current;\n if (!(current instanceof AgentLoop)) {\n return \"Current backend does not support resuming sessions.\";\n }\n const resolvedId = await resolveSessionId(id);\n if (!resolvedId) {\n return `Session not found: ${id}`;\n }\n const resumed = await resumeSession(resolvedId);\n if (!resumed) {\n return `Session not found: ${id}`;\n }\n await current.loadMessages(resumed.messages);\n const store = await SessionStore.open(resolvedId);\n if (store) {\n hydrateSnapshots(await loadSessionSnapshots(store.dir));\n }\n const display = buildDisplayMessages(resumed.messages);\n nextIdRef.current = display.length;\n applyMessages(display);\n usageRef.current = resumed.meta.usage ? { ...resumed.meta.usage } : emptyUsage();\n setUsageVersion((v) => v + 1);\n return `Resumed session ${resolvedId} (${resumed.messages.length} messages).`;\n },\n [applyMessages],\n );\n\n const runStream = useCallback(\n async (input: string, extraImages: ImageInput[] = []) => {\n const resolved = await resolveMentions(input, cwd);\n const images = [...resolved.images, ...extraImages];\n pushMessage(\n \"user\",\n input,\n resolved.attached.length + extraImages.length > 0\n ? `attached: ${[...resolved.attached, ...extraImages.map((img) => img.path)].join(\", \")}`\n : undefined,\n );\n for (const skip of resolved.skipped) {\n pushMessage(\"system\", `Skipped @${skip.path}: ${skip.reason}`);\n }\n const controller = new AbortController();\n abortRef.current = controller;\n const turnStartedAt = Date.now();\n streamedRef.current = \"\";\n thinkingRef.current = true;\n reasoningRef.current = \"\";\n turnChunksRef.current = 0;\n setThinking(true);\n setThinkingText(\"\");\n setThoughtSummary(null);\n setStreamingText(\"\");\n setIsStreaming(true);\n flushedRef.current = { streamed: \"\", reasoning: \"\" };\n // Move the current streaming buffer into static history. Used at tool-call\n // boundaries (to keep chronological order) and by the ticker for long\n // answers, so the live redraw area — and with it the visible flicker —\n // stays small no matter how long the answer gets.\n const commitStreamed = (tight: boolean) => {\n if (streamedRef.current.length === 0) return;\n pushAssistantChunk(streamedRef.current, tight);\n streamedRef.current = \"\";\n flushedRef.current = { ...flushedRef.current, streamed: \"\" };\n setStreamingText(\"\");\n };\n tickerStopRef.current = startTicker((tick) => {\n setSpinnerTick(tick);\n const split = splitCommittableLines(streamedRef.current, 8);\n if (split) {\n pushAssistantChunk(split.committed, true);\n streamedRef.current = split.rest;\n flushedRef.current = { ...flushedRef.current, streamed: \"\" };\n }\n const next: FlushState = {\n streamed: streamedRef.current,\n reasoning: reasoningRef.current,\n };\n if (nextFlush(flushedRef.current, next) !== null) {\n flushedRef.current = next;\n setStreamingText(next.streamed);\n setThinkingText(next.reasoning);\n }\n });\n try {\n for await (const event of backendRef.current.stream(\n images.length > 0 ? { text: resolved.input, images } : resolved.input,\n controller.signal,\n {\n persistAs:\n extraImages.length > 0\n ? `${input}${\" [clipboard image]\".repeat(extraImages.length)}`\n : input,\n },\n )) {\n if (event.type === \"text-delta\") {\n if (thinkingRef.current) {\n thinkingRef.current = false;\n setThinking(false);\n if (reasoningRef.current.length > 0) {\n setThoughtSummary(\n `thought: ${truncateTail(reasoningRef.current, THOUGHT_SUMMARY_LENGTH)}`,\n );\n }\n }\n streamedRef.current += event.text;\n } else if (event.type === \"reasoning\") {\n reasoningRef.current += event.text;\n } else if (event.type === \"tool-call\") {\n // Flush the text spoken before this call into history first, so the\n // card lands in chronological order instead of after the whole turn.\n commitStreamed(true);\n toolCardsRef.current.set(event.id, {\n id: event.id,\n name: event.name,\n argsSummary: summarizeArgs(event.args),\n });\n setActivity(`running ${event.name}: ${summarizeArgs(event.args, 60)}`);\n } else if (event.type === \"tool-result\") {\n const card = toolCardsRef.current.get(event.id) ?? {\n id: event.id,\n name: event.name,\n argsSummary: \"\",\n };\n toolCardsRef.current.delete(event.id);\n // Rendered once, straight into static history — no live card region\n // that would have to be erased (and could linger) at turn end.\n pushMessage(\n \"tool\",\n formatToolCard({\n ...card,\n result: event.content,\n isError: event.isError ?? false,\n }),\n );\n setActivity(null);\n thinkingRef.current = true;\n reasoningRef.current = \"\";\n setThinking(true);\n setThinkingText(\"\");\n } else if (event.type === \"finish\") {\n if (event.usage) {\n const usage = usageRef.current;\n usage.requests += 1;\n usage.promptTokens += event.usage.promptTokens;\n usage.completionTokens += event.usage.completionTokens;\n usage.totalTokens += event.usage.totalTokens;\n setUsageVersion((v) => v + 1);\n sessionStoreRef.current?.addUsage(event.usage).catch(() => {});\n }\n } else if (event.type === \"error\") {\n pushMessage(\"system\", `Error: ${formatStreamError(event.error)}`);\n }\n }\n } catch (error) {\n const aborted =\n controller.signal.aborted ||\n (error instanceof DOMException && error.name === \"AbortError\");\n if (!aborted) {\n pushMessage(\n \"system\",\n `Error: ${error instanceof Error ? formatStreamError(error) : String(error)}`,\n );\n }\n } finally {\n tickerStopRef.current?.();\n tickerStopRef.current = null;\n abortRef.current = null;\n setIsStreaming(false);\n thinkingRef.current = false;\n reasoningRef.current = \"\";\n setThinking(false);\n setThinkingText(\"\");\n setThoughtSummary(null);\n setActivity(null);\n const finalText = streamedRef.current;\n streamedRef.current = \"\";\n setStreamingText(null);\n const interrupted = controller.signal.aborted;\n notifyBell({\n enabled: config.notifyBell,\n thresholdSec: config.notifyBellThresholdSec,\n noNotifyEnv: process.env.STAR_NO_NOTIFY === \"1\",\n interrupted,\n elapsedMs: Date.now() - turnStartedAt,\n });\n if (finalText.length > 0) {\n pushAssistantChunk(`${finalText}${interrupted ? \" [interrupted]\" : \"\"}`, false);\n } else if (interrupted && turnChunksRef.current > 0) {\n pushAssistantChunk(\"[interrupted]\", false);\n }\n // Cards whose result event never arrived (e.g. hard abort) still get\n // flushed so no call vanishes from the transcript.\n for (const card of toolCardsRef.current.values()) {\n pushMessage(\"tool\", formatToolCard(card));\n }\n toolCardsRef.current.clear();\n turnChunksRef.current = 0;\n const p = pendingRef.current;\n if (p) {\n setPendingPermission(null);\n p.resolve(false);\n }\n // A plan-mode turn that ran to completion ends in a plan, not in\n // changes — offer to approve it and switch back to execution.\n if (!interrupted && config.permissionMode === \"plan\") {\n setPlanApproval(true);\n }\n // Session budget (sessionBudgetUsd): warn once at 80%, error + block\n // further prompts at 100%. Unevaluable without per-model pricing.\n const cost = sessionCostUsd();\n const budget = config.sessionBudgetUsd;\n const status = budgetState(cost, budget);\n if (status === \"warn\" && !budgetWarnedRef.current) {\n budgetWarnedRef.current = true;\n pushMessage(\n \"system\",\n `Session cost $${formatDollars(cost ?? 0)} has passed 80% of the $${formatDollars(budget ?? 0)} session budget (sessionBudgetUsd).`,\n );\n }\n if (status === \"exceeded\" && !budgetExceededRef.current) {\n budgetExceededRef.current = true;\n pushMessage(\n \"system\",\n `Session budget exceeded: $${formatDollars(cost ?? 0)} of $${formatDollars(budget ?? 0)} (sessionBudgetUsd). New prompts are blocked — raise sessionBudgetUsd in the config or start a /new session.`,\n );\n }\n // Typeahead queue: send the next queued prompt FIFO once this turn is\n // fully done (permission prompts included). A crossed budget drops the\n // queue instead.\n const nextPrompt = queueRef.current.dequeue();\n if (nextPrompt) {\n if (status === \"exceeded\") {\n const dropped = queueRef.current.clear().length + 1;\n setQueueItems([]);\n pushMessage(\n \"system\",\n `Dropped ${dropped} queued message(s) — session budget exceeded.`,\n );\n } else {\n setQueueItems(queueRef.current.list());\n void runStreamRef.current?.(nextPrompt.text, nextPrompt.images);\n }\n }\n }\n },\n [\n pushMessage,\n pushAssistantChunk,\n setPendingPermission,\n setPlanApproval,\n cwd,\n config,\n sessionCostUsd,\n ],\n );\n\n useEffect(() => {\n runStreamRef.current = runStream;\n }, [runStream]);\n\n const handlePlanDecision = useCallback(\n (decision: ExitPlanDecision) => {\n setPlanApproval(false);\n if (decision === \"no\") return;\n const restore = prevModeRef.current ?? \"ask\";\n applySessionMode(restore);\n pushMessage(\"system\", `Plan approved — permission mode restored to ${restore}.`);\n void runStream(\"The plan above is approved. Proceed with the implementation.\");\n },\n [applySessionMode, pushMessage, runStream, setPlanApproval],\n );\n\n const registry = useMemo(() => {\n const ctx: CommandContext = {\n cwd,\n addSystemMessage: (text) => pushMessage(\"system\", text),\n showDiff: (text, lines, note) => {\n setMessages((prev) => {\n const next = [\n ...prev,\n { id: nextIdRef.current++, role: \"system\" as const, text, note, diff: lines },\n ];\n messagesRef.current = next;\n return next;\n });\n },\n clearMessages: () => {\n redrawMessages([]);\n },\n conversationText: (scope) => {\n const current = backendRef.current;\n if (!(current instanceof AgentLoop)) return null;\n const messages = current.getMessages();\n if (scope === \"all\") {\n const parts = messages\n .filter((m) => m.role === \"user\" || m.role === \"assistant\")\n .map((m) => coreMessageText(m))\n .filter((text) => text.length > 0);\n return parts.length > 0 ? parts.join(\"\\n\\n\") : null;\n }\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message?.role === \"assistant\") {\n const text = coreMessageText(message);\n if (text) return text;\n }\n }\n return null;\n },\n copyToClipboard: (text) => copyText(text),\n exit: () => handleExit(),\n listModels: () => {\n const models = listModels(config);\n if (models.length === 0) return \"No models configured.\";\n const lines = models.map(\n (m) =>\n `${m.name === modelNameRef.current ? \"*\" : \" \"} ${m.name} (${m.provider}/${m.model})`,\n );\n return `Models (* = current):\\n${lines.join(\"\\n\")}`;\n },\n switchModel,\n listSessions: async (all) => {\n const entries = await listSessionEntries(all ? undefined : cwd);\n if (entries.length === 0) {\n return all ? \"No sessions found.\" : \"No sessions found for this directory.\";\n }\n return formatSessionEntries(entries, { showCwd: all });\n },\n resumeSession: resume,\n newSession: async () => {\n const current = backendRef.current;\n if (!(current instanceof AgentLoop)) {\n return \"Current backend does not support starting a new session.\";\n }\n const store = await SessionStore.create(cwd, modelNameRef.current);\n current.setSessionStore(store);\n sessionStoreRef.current = store;\n // Keep the leading system prompt, drop everything else.\n const [first] = current.getMessages();\n await current.loadMessages(first?.role === \"system\" ? [first] : []);\n clearSnapshots();\n redrawMessages([]);\n usageRef.current = emptyUsage();\n budgetWarnedRef.current = false;\n budgetExceededRef.current = false;\n setUsageVersion((v) => v + 1);\n return `Started a new session (${store.id}) with a clean context.`;\n },\n clearSessions: async (all) => {\n const currentId = sessionStoreRef.current?.id;\n const removed = await clearSessions(all ? undefined : cwd, currentId);\n if (removed === 0) {\n return all ? \"No stored sessions to delete.\" : \"No stored sessions for this directory.\";\n }\n const scope = all ? \"across all directories\" : \"for this directory\";\n const kept = currentId ? \" The current session is still active.\" : \"\";\n return `Deleted ${removed} session(s) ${scope}.${kept}`;\n },\n showTodos: async () => {\n const store = new TodoStore();\n await store.load(cwd);\n return formatTodos(store.list());\n },\n listTasks: () => formatTaskList(defaultTaskManager.list()),\n showUsage: () => {\n const modelConfig = config.models.find((m) => m.name === modelNameRef.current);\n return `${formatUsage(usageRef.current)}\\n${estimateCost(usageRef.current, modelNameRef.current, modelConfig)}`;\n },\n showGlobalUsage: async () => formatUsageDashboard(await collectUsageStats(), config.models),\n compactContext: async () => {\n let summaryModel = null;\n try {\n summaryModel = createModel(config, modelNameRef.current);\n } catch {\n summaryModel = null;\n }\n const result = await compactSession({\n backend: backendRef.current,\n sessionStore: sessionStoreRef.current,\n config,\n model: summaryModel,\n });\n if (result.compacted && result.messages) {\n const display = buildDisplayMessages(result.messages);\n nextIdRef.current = display.length;\n applyMessages(display);\n }\n return result.message;\n },\n exportSession: (arg) =>\n exportSession({\n backend: backendRef.current,\n sessionStore: sessionStoreRef.current,\n cwd,\n arg,\n }),\n undo: async () => {\n const current = backendRef.current;\n if (!(current instanceof AgentLoop)) {\n return \"Nothing to undo.\";\n }\n // Turn-scoped undo: retract the last turn's messages, and revert file\n // changes only when they provably belong to that same turn.\n const { removed, turn } = await current.retractLastTurn();\n if (removed === 0) {\n return \"Nothing to undo (no conversation turn to retract).\";\n }\n const reverted = turn !== undefined ? await undoTurnSnapshots(turn) : [];\n // Mirror the retraction on screen: drop the last prompt and everything\n // the turn produced (answer chunks, tool cards, notifications). Static\n // output cannot be edited in place, so the surviving history is\n // redrawn from a cleared screen.\n const visible = messagesRef.current;\n let cut = -1;\n for (let i = visible.length - 1; i >= 0; i--) {\n if (visible[i]?.role === \"user\") {\n cut = i;\n break;\n }\n }\n redrawMessages(cut >= 0 ? visible.slice(0, cut) : visible);\n return [...reverted, `Retracted the last conversation turn (${removed} messages).`].join(\n \"\\n\",\n );\n },\n rewind: async (args) => {\n if (!args) {\n return formatCheckpointList(listSnapshots(), cwd);\n }\n const id = Number.parseInt(args, 10);\n if (!Number.isFinite(id) || String(id) !== args) {\n return `Usage: /rewind <n> — \"${args}\" is not a checkpoint number.`;\n }\n const plan = planRewind(listSnapshots(), id);\n if (!plan) {\n return `Checkpoint #${id} not found (it may already have been rewound). /rewind lists the current checkpoints.`;\n }\n const current = backendRef.current;\n const messageCount =\n plan.messageIndex !== null && current instanceof AgentLoop\n ? current.countRetraction(plan.messageIndex)\n : 0;\n // Rewinds are destructive: confirm before touching files or history.\n const confirmed = await new Promise<boolean>((resolve) => {\n setPendingRewind({\n summary: `Rewind to just before checkpoint #${id} (${plan.target.toolName} ${plan.target.path}):\\n${plan.affected.length} file change(s) will be reverted, ${messageCount} message(s) retracted.`,\n resolve,\n });\n });\n if (!confirmed) {\n return \"Rewind cancelled.\";\n }\n const result = await rewindToSnapshot(id);\n if (!result) {\n return `Checkpoint #${id} is no longer available.`;\n }\n let retracted = 0;\n if (result.messageIndex !== null && current instanceof AgentLoop) {\n retracted = await current.retractFromIndex(result.messageIndex);\n if (retracted > 0) {\n const display = buildDisplayMessages([...current.getMessages()]);\n nextIdRef.current = display.length;\n redrawMessages(display);\n }\n }\n return [\n ...result.reverted,\n `Rewound to before checkpoint #${id}: ${result.reverted.length} file change(s) reverted, ${retracted} message(s) retracted.`,\n ].join(\"\\n\");\n },\n permissionMode: async (args) => {\n const current = config.permissionMode;\n if (!args) {\n const mark = (m: string) => (m === current ? \"*\" : \" \");\n return [\n \"Permission modes (* = current):\",\n `${mark(\"ask\")} ask — reads allowed; writes/exec ask for confirmation`,\n `${mark(\"auto\")} auto — everything allowed except hard-denied dangerous commands/paths`,\n `${mark(\"readonly\")} readonly — read-only; all writes/exec denied`,\n `${mark(\"yolo\")} yolo — allow everything, never ask (disables ALL safety checks)`,\n ].join(\"\\n\");\n }\n const mode = args.toLowerCase();\n if (![\"ask\", \"auto\", \"readonly\", \"yolo\"].includes(mode)) {\n return `Unknown permission mode: ${args} (expected ask | auto | readonly | yolo)`;\n }\n config.permissionMode = mode as StarConfig[\"permissionMode\"];\n prevModeRef.current = null;\n setPermissionModeState(mode);\n await savePermissionMode(mode);\n return mode === \"yolo\"\n ? \"Permission mode set to yolo — ALL safety checks disabled, tools run without asking. Saved to config.\"\n : `Permission mode set to ${mode}. Saved to config.`;\n },\n planMode: async () => {\n if (config.permissionMode === \"plan\") {\n const restore = prevModeRef.current ?? \"ask\";\n applySessionMode(restore);\n return `Exited plan mode — permission mode back to ${restore} (this session only).`;\n }\n applySessionMode(\"plan\");\n return \"Entered plan mode: the agent researches with read-only tools and presents a plan for approval before anything is executed. /plan again to exit.\";\n },\n initProject: async (args) => {\n let model = null;\n try {\n model = createModel(config, modelNameRef.current);\n } catch {\n model = null;\n }\n const result = await initProject({ cwd, args, model });\n return result.message;\n },\n runDoctor: async () => formatDoctorReport(await runDoctor({ cwd, config })),\n submitPrompt: async (text) => {\n await runStream(text);\n },\n describeConfig: () =>\n [\n `defaultModel: ${config.defaultModel || \"(none)\"}`,\n `permissionMode: ${config.permissionMode}`,\n `providers (${config.providers.length}): ${config.providers.map((p) => p.name).join(\", \") || \"(none)\"}`,\n `models (${config.models.length}): ${config.models.map((m) => m.name).join(\", \") || \"(none)\"}`,\n `maxSteps: ${config.maxSteps}`,\n `contextMaxTokens: ${config.contextMaxTokens}`,\n `streamIdleTimeoutSec: ${config.streamIdleTimeoutSec}`,\n `permissions.allow (${config.permissions.allow.length}): ${config.permissions.allow.join(\", \") || \"(none)\"}`,\n `hooks (${config.hooks.length}): ${config.hooks.map((h) => h.event).join(\", \") || \"(none)\"}`,\n ].join(\"\\n\"),\n };\n const reg = new CommandRegistry();\n registerBuiltinCommands(reg);\n registerCustomCommands(reg, cwd);\n return Object.assign(reg, { ctx });\n }, [\n pushMessage,\n handleExit,\n config,\n cwd,\n switchModel,\n resume,\n runStream,\n applyMessages,\n redrawMessages,\n applySessionMode,\n setPendingRewind,\n ]);\n\n const runShellBang = useCallback(\n async (raw: string) => {\n pushMessage(\"user\", `!${raw.trim()}`);\n const controller = new AbortController();\n abortRef.current = controller;\n try {\n const outcome = await executeShellBang(raw, cwd, controller.signal);\n if (!outcome.ok) {\n pushMessage(\n \"system\",\n outcome.reason === \"dangerous\"\n ? `Refused to run dangerous command: ${raw.trim()}`\n : \"Usage: !<command>\",\n );\n return;\n }\n pushMessage(\n \"tool\",\n formatToolCard({\n id: `bang-${nextIdRef.current}`,\n name: \"bash\",\n argsSummary: outcome.command,\n result: outcome.output,\n isError: outcome.isError,\n }),\n );\n const current = backendRef.current;\n if (current instanceof AgentLoop) {\n await current.appendContextMessage(outcome.contextMessage);\n }\n } finally {\n if (abortRef.current === controller) {\n abortRef.current = null;\n }\n }\n },\n [cwd, pushMessage],\n );\n\n const handleSubmit = useCallback(\n (text: string) => {\n if (text.startsWith(\"!\")) {\n // A bang would clobber the streaming turn's abort controller, so it\n // waits in the queue like a regular prompt.\n if (abortRef.current) {\n queueRef.current.enqueue({ text, images: [] });\n setQueueItems(queueRef.current.list());\n return;\n }\n void runShellBang(text.slice(1));\n return;\n }\n if (text.startsWith(\"/\")) {\n const parsed = parseSlashCommand(text);\n if (!parsed) return;\n const command = registry.get(parsed.name);\n if (!command) {\n pushMessage(\"system\", `Unknown command: /${parsed.name} (try /help)`);\n return;\n }\n void command.run(parsed.args, registry.ctx);\n return;\n }\n const budget = config.sessionBudgetUsd;\n if (budgetState(sessionCostUsd(), budget) === \"exceeded\") {\n pushMessage(\n \"system\",\n `Session budget of $${formatDollars(budget ?? 0)} (sessionBudgetUsd) is exceeded — prompts are blocked. Slash commands still work; raise sessionBudgetUsd in the config or start a /new session.`,\n );\n return;\n }\n const images = pendingImagesRef.current.map((staged) => staged.image);\n if (images.length > 0) clearPendingImages();\n if (abortRef.current) {\n queueRef.current.enqueue({ text, images });\n setQueueItems(queueRef.current.list());\n return;\n }\n void runStream(text, images);\n },\n [registry, pushMessage, runStream, runShellBang, config, clearPendingImages, sessionCostUsd],\n );\n\n const commandHints = useMemo(\n () => registry.list().map((cmd) => ({ name: cmd.name, description: cmd.description })),\n [registry],\n );\n\n // Expensive status-bar bits (sync git call, token estimate over the full\n // history) refresh on turn boundaries and history rewrites, not per tick.\n // biome-ignore lint/correctness/useExhaustiveDependencies: isStreaming and epoch are deliberate refresh triggers, not values read inside\n useEffect(() => {\n setGitBranch(getGitSummary(cwd)?.branch ?? null);\n const current = backendRef.current;\n if (current instanceof AgentLoop) {\n const window_ = contextWindowTokens(config, modelNameRef.current);\n const pct = (estimateTokens([...current.getMessages()]) / window_) * 100;\n // One decimal below 10% so small-but-real usage doesn't display as 0%.\n setContextPercent(pct < 10 ? Math.round(pct * 10) / 10 : Math.round(pct));\n } else {\n setContextPercent(null);\n }\n }, [cwd, config, isStreaming, epoch]);\n\n const sessionCost = sessionCostUsd();\n\n return (\n <Box flexDirection=\"column\">\n <MessageList key={`messages-${epoch}`} messages={messages} />\n {(thinking || activity !== null) && (\n <ThinkingIndicator\n reasoning={thinkingText}\n frame={spinnerTick}\n activity={activity ?? undefined}\n />\n )}\n {!thinking && activity === null && thoughtSummary !== null && (\n <Text dimColor>{thoughtSummary}</Text>\n )}\n {streamingText !== null && (streamingText !== \"\" || turnChunksRef.current === 0) && (\n <StreamingMessage text={streamingText} continuation={turnChunksRef.current > 0} />\n )}\n {pending && (\n <PermissionPrompt\n request={pending.request}\n preview={pending.preview}\n onDecision={handleDecision}\n />\n )}\n {planApproval && <ExitPlanPrompt onDecision={handlePlanDecision} />}\n {pendingRewind && (\n <RewindConfirmPrompt summary={pendingRewind.summary} onDecision={handleRewindDecision} />\n )}\n {queueItems.map((item) => (\n <Text key={item.id} dimColor>\n queued: {item.text.length > 80 ? `${item.text.slice(0, 80)}…` : item.text}\n </Text>\n ))}\n {pendingImages.map((staged) => (\n <Text key={staged.id} dimColor>\n [image attached: {staged.image.path}]\n </Text>\n ))}\n <InputBox\n isStreaming={isStreaming}\n disabled={pending !== null || planApproval || pendingRewind !== null}\n commands={commandHints}\n cwd={cwd}\n refill={inputRefill}\n onSubmit={handleSubmit}\n onInterrupt={interrupt}\n onExit={handleExit}\n onPasteImage={handlePasteImage}\n />\n <StatusBar\n cwd={cwd}\n model={modelName}\n permissionMode={permissionModeState}\n tokens={usageRef.current.totalTokens}\n gitBranch={gitBranch}\n contextPercent={contextPercent}\n sessionCostUsd={sessionCost}\n backgroundTasks={bgLabels}\n />\n </Box>\n );\n}\n\nexport interface ReplOptions {\n model: string;\n permissionMode: string;\n config: StarConfig;\n cwd: string;\n sessionStore: SessionStore | null;\n initialMessages?: CoreMessage[];\n initialUsage?: UsageStats;\n}\n\nexport function renderRepl(backend: ChatBackend, opts: ReplOptions) {\n // Backstop for abnormal exits: never leave orphaned background processes.\n process.on(\"exit\", () => {\n defaultTaskManager.cleanup();\n });\n return render(\n <Repl\n backend={backend}\n model={opts.model}\n permissionMode={opts.permissionMode}\n config={opts.config}\n cwd={opts.cwd}\n sessionStore={opts.sessionStore}\n initialMessages={opts.initialMessages}\n initialUsage={opts.initialUsage}\n />,\n );\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { parse, stringify } from \"smol-toml\";\nimport { globalConfigPath } from \"./paths\";\n\nexport async function addAllowRule(rule: string): Promise<boolean> {\n const filePath = globalConfigPath();\n let raw: Record<string, unknown> = {};\n try {\n const content = await fs.promises.readFile(filePath, \"utf8\");\n raw = parse(content) as Record<string, unknown>;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n const permissions =\n typeof raw.permissions === \"object\" && raw.permissions !== null\n ? (raw.permissions as Record<string, unknown>)\n : {};\n const allow = Array.isArray(permissions.allow) ? (permissions.allow as string[]) : [];\n if (allow.includes(rule)) return false;\n permissions.allow = [...allow, rule];\n raw.permissions = permissions;\n await fs.promises.mkdir(path.dirname(filePath), { recursive: true });\n await fs.promises.writeFile(filePath, stringify(raw), \"utf8\");\n return true;\n}\n\nexport async function savePermissionMode(mode: string): Promise<void> {\n const filePath = globalConfigPath();\n let raw: Record<string, unknown> = {};\n try {\n const content = await fs.promises.readFile(filePath, \"utf8\");\n raw = parse(content) as Record<string, unknown>;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n raw.permissionMode = mode;\n await fs.promises.mkdir(path.dirname(filePath), { recursive: true });\n await fs.promises.writeFile(filePath, stringify(raw), \"utf8\");\n}\n","import { z } from \"zod\";\n\nexport const ProviderConfigSchema = z.object({\n name: z.string(),\n protocol: z\n .enum([\"openai-compatible\", \"anthropic\", \"openai-responses\"])\n .default(\"openai-compatible\"),\n baseURL: z.string(),\n apiKeyEnv: z.string().optional(),\n apiKey: z.string().optional(),\n headers: z.record(z.string()).optional(),\n});\n\nexport const ModelConfigSchema = z.object({\n name: z.string(),\n provider: z.string(),\n model: z.string(),\n maxTokens: z.number().int().positive().optional(),\n // Per-model context window; overrides the top-level contextMaxTokens for\n // compaction and the status bar when set.\n contextMaxTokens: z.number().int().positive().optional(),\n // Cost estimation needs BOTH prices (USD per 1M tokens); with only one set\n // the model is treated as unpriced.\n promptPrice: z.number().nonnegative().optional(),\n completionPrice: z.number().nonnegative().optional(),\n});\n\nexport const PermissionsConfigSchema = z.object({\n allow: z.array(z.string()).default([]),\n});\n\nexport const HookConfigSchema = z.object({\n event: z.enum([\"PreToolUse\", \"PostToolUse\", \"Stop\"]),\n matcher: z\n .string()\n .refine(\n (pattern) => {\n try {\n new RegExp(pattern);\n return true;\n } catch {\n return false;\n }\n },\n { message: \"invalid regular expression\" },\n )\n .optional(),\n command: z.string().min(1),\n timeoutSec: z.number().positive().default(30),\n});\n\nexport const ConfigSchema = z.object({\n defaultModel: z.string().default(\"\"),\n permissionMode: z.enum([\"auto\", \"ask\", \"readonly\", \"yolo\", \"plan\"]).default(\"ask\"),\n providers: z.array(ProviderConfigSchema).default([]),\n models: z.array(ModelConfigSchema).default([]),\n maxSteps: z.number().int().positive().default(50),\n contextMaxTokens: z.number().int().positive().default(100_000),\n // Seconds without any stream part before a stalled response is ended\n // gracefully (some relays never send the terminal chunks). Applies once\n // streaming has started; the first part gets a longer, fixed allowance.\n streamIdleTimeoutSec: z.number().positive().default(20),\n contextCompaction: z.enum([\"summary\", \"truncate\"]).default(\"summary\"),\n // Optional per-session dollar budget; when set, the REPL stops the session\n // once the estimated cost for the session reaches this amount.\n sessionBudgetUsd: z.number().positive().optional(),\n // Terminal bell (REPL only): ring when a turn takes longer than\n // notifyBellThresholdSec, and when a background task finishes.\n // STAR_NO_NOTIFY=1 disables without touching the config.\n notifyBell: z.boolean().default(true),\n notifyBellThresholdSec: z.number().positive().default(10),\n permissions: PermissionsConfigSchema.default({ allow: [] }),\n hooks: z.array(HookConfigSchema).default([]),\n});\n\nexport type ProviderConfig = z.infer<typeof ProviderConfigSchema>;\nexport type ModelConfig = z.infer<typeof ModelConfigSchema>;\nexport type PermissionsConfig = z.infer<typeof PermissionsConfigSchema>;\nexport type HookConfig = z.infer<typeof HookConfigSchema>;\nexport type StarConfig = z.infer<typeof ConfigSchema>;\n\n// Effective context window for a model: its own contextMaxTokens when set,\n// otherwise the top-level config.contextMaxTokens.\nexport function contextWindowTokens(config: StarConfig, modelName: string): number {\n return (\n config.models.find((m) => m.name === modelName)?.contextMaxTokens ?? config.contextMaxTokens\n );\n}\n\nexport interface CliOverrides {\n model?: string;\n permissionMode?: \"auto\" | \"ask\" | \"readonly\" | \"yolo\" | \"plan\";\n}\n","import { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOpenAICompatible } from \"@ai-sdk/openai-compatible\";\nimport type { LanguageModel } from \"ai\";\nimport type { ProviderConfig, StarConfig } from \"../config/schema\";\nimport { resolveModelConfig } from \"./registry\";\n\nfunction resolveApiKey(provider: ProviderConfig): string {\n const fromEnv = provider.apiKeyEnv ? process.env[provider.apiKeyEnv] : undefined;\n const apiKey = fromEnv ?? provider.apiKey;\n if (!apiKey) {\n const hint = provider.apiKeyEnv\n ? `set ${provider.apiKeyEnv} or configure apiKey`\n : \"configure apiKey\";\n throw new Error(`Missing API key for provider \"${provider.name}\": ${hint}`);\n }\n return apiKey;\n}\n\nexport function createModel(config: StarConfig, modelName?: string): LanguageModel {\n const modelConfig = resolveModelConfig(config, modelName);\n const provider = config.providers.find((p) => p.name === modelConfig.provider);\n if (!provider) {\n const available = config.providers.map((p) => p.name).join(\", \") || \"(none)\";\n throw new Error(\n `Provider \"${modelConfig.provider}\" for model \"${modelConfig.name}\" not found. Available providers: ${available}`,\n );\n }\n const apiKey = resolveApiKey(provider);\n switch (provider.protocol) {\n case \"anthropic\":\n return createAnthropic({\n baseURL: provider.baseURL,\n apiKey,\n headers: provider.headers,\n })(modelConfig.model);\n case \"openai-compatible\":\n return createOpenAICompatible({\n name: provider.name,\n baseURL: provider.baseURL,\n apiKey,\n headers: provider.headers,\n })(modelConfig.model);\n case \"openai-responses\":\n return createOpenAI({\n baseURL: provider.baseURL,\n apiKey,\n headers: provider.headers,\n }).responses(modelConfig.model);\n }\n}\n","import type { ModelConfig, StarConfig } from \"../config/schema\";\n\nexport function listModels(config: StarConfig): ModelConfig[] {\n return config.models;\n}\n\nexport function resolveModelConfig(config: StarConfig, modelName?: string): ModelConfig {\n const name = modelName ?? config.defaultModel;\n const model = config.models.find((m) => m.name === name);\n if (!model) {\n const available = config.models.map((m) => m.name).join(\", \") || \"(none)\";\n throw new Error(`Model \"${name}\" not found. Available models: ${available}`);\n }\n return model;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { FileSnapshot } from \"../tools/fs/snapshots\";\n\nexport interface CheckpointRecord {\n id: number;\n timestamp: number;\n path: string;\n existed: boolean;\n toolName: string;\n turn: number;\n messageIndex: number;\n}\n\nfunction checkpointsDir(sessionDir: string): string {\n return path.join(sessionDir, \"checkpoints\");\n}\n\nfunction indexPath(sessionDir: string): string {\n return path.join(checkpointsDir(sessionDir), \"index.json\");\n}\n\nexport function checkpointContentPath(sessionDir: string, id: number): string {\n return path.join(checkpointsDir(sessionDir), `${id}.snapshot`);\n}\n\nexport async function listCheckpointRecords(sessionDir: string): Promise<CheckpointRecord[]> {\n let raw: string;\n try {\n raw = await fs.readFile(indexPath(sessionDir), \"utf8\");\n } catch {\n return [];\n }\n try {\n const parsed = JSON.parse(raw) as CheckpointRecord[];\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\n// Lazily creates the checkpoints directory on first use, mirroring\n// SessionStore's lazy creation — a session without file writes leaves no\n// checkpoints on disk.\nexport async function appendCheckpointRecord(\n sessionDir: string,\n record: CheckpointRecord,\n content: string | null,\n): Promise<void> {\n await fs.mkdir(checkpointsDir(sessionDir), { recursive: true });\n if (record.existed && content !== null) {\n await fs.writeFile(checkpointContentPath(sessionDir, record.id), content, \"utf8\");\n }\n const records = await listCheckpointRecords(sessionDir);\n records.push(record);\n await fs.writeFile(indexPath(sessionDir), JSON.stringify(records, null, 2));\n}\n\nexport async function removeCheckpointRecords(sessionDir: string, ids: number[]): Promise<void> {\n if (ids.length === 0) return;\n const drop = new Set(ids);\n const records = await listCheckpointRecords(sessionDir);\n const kept = records.filter((record) => !drop.has(record.id));\n if (kept.length === records.length) return;\n await fs.mkdir(checkpointsDir(sessionDir), { recursive: true });\n await fs.writeFile(indexPath(sessionDir), JSON.stringify(kept, null, 2));\n for (const id of ids) {\n await fs.rm(checkpointContentPath(sessionDir, id), { force: true });\n }\n}\n\n// Maps persisted records back into snapshots whose content is read lazily\n// from the per-checkpoint content file, for hydrating the in-memory stack\n// after a session resume.\nexport async function loadSessionSnapshots(sessionDir: string): Promise<FileSnapshot[]> {\n const records = await listCheckpointRecords(sessionDir);\n return records.map((record) => ({\n ...record,\n content: null,\n contentFile: record.existed ? checkpointContentPath(sessionDir, record.id) : undefined,\n }));\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { sessionsDir } from \"../config/paths\";\nimport { SessionStore } from \"./store\";\n\n// Deletes stored sessions and returns how many were removed. With a cwd only\n// sessions recorded for that directory go (directories with an unreadable\n// meta.json cannot be matched and stay); without it every session directory\n// under sessionsDir is removed. excludeId keeps the caller's live session on\n// disk (the REPL's /clear-sessions must not pull its own store away).\nexport async function clearSessions(cwd?: string, excludeId?: string): Promise<number> {\n if (cwd !== undefined) {\n const metas = await SessionStore.list(cwd);\n let removed = 0;\n for (const meta of metas) {\n if (meta.id === excludeId) continue;\n await fs.rm(path.join(sessionsDir(), meta.id), { recursive: true, force: true });\n removed += 1;\n }\n return removed;\n }\n let entries: string[];\n try {\n entries = await fs.readdir(sessionsDir());\n } catch {\n return 0;\n }\n let removed = 0;\n for (const entry of entries) {\n if (entry === excludeId) continue;\n await fs.rm(path.join(sessionsDir(), entry), { recursive: true, force: true });\n removed += 1;\n }\n return removed;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { sessionsDir } from \"../config/paths\";\nimport type { CoreMessage } from \"../core/messages\";\nimport {\n type CheckpointRecord,\n appendCheckpointRecord,\n listCheckpointRecords,\n removeCheckpointRecords,\n} from \"./checkpoints\";\n\nexport interface SessionUsage {\n requests: number;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface DayUsageBucket {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface SessionMeta {\n id: string;\n title: string;\n model: string;\n cwd: string;\n createdAt: number;\n updatedAt: number;\n usage?: SessionUsage;\n // Per-day token buckets keyed by local date (YYYY-MM-DD), recorded alongside\n // `usage` from the day this field was introduced; older sessions only have\n // the grand totals in `usage`.\n usageByDay?: Record<string, DayUsageBucket>;\n}\n\nfunction generateId(now: Date): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const stamp =\n `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}` +\n `${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;\n const suffix = Math.random().toString(16).slice(2, 8).padEnd(6, \"0\");\n return `${stamp}-${suffix}`;\n}\n\nfunction debugWarn(message: string): void {\n if (process.env.STAR_DEBUG === \"1\") process.stderr.write(`[star-cli] ${message}\\n`);\n}\n\nexport function dayKey(date: Date): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n}\n\nexport class SessionStore {\n readonly id: string;\n readonly dir: string;\n\n private pendingMeta: { cwd: string; model: string; createdAt: number } | null = null;\n private initialized = false;\n\n private constructor(id: string) {\n this.id = id;\n this.dir = path.join(sessionsDir(), id);\n }\n\n private metaPath(): string {\n return path.join(this.dir, \"meta.json\");\n }\n\n private messagesPath(): string {\n return path.join(this.dir, \"messages.jsonl\");\n }\n\n static async create(cwd: string, model: string): Promise<SessionStore> {\n const store = new SessionStore(generateId(new Date()));\n store.pendingMeta = { cwd, model, createdAt: Date.now() };\n return store;\n }\n\n static async open(id: string): Promise<SessionStore | null> {\n const store = new SessionStore(id);\n let raw: string;\n try {\n raw = await fs.readFile(store.metaPath(), \"utf8\");\n } catch {\n return null;\n }\n try {\n const meta = JSON.parse(raw) as SessionMeta;\n if (meta.id !== id) return null;\n } catch {\n // meta.json is corrupt (e.g. truncated write); open anyway and let\n // meta() fall back to defaults so messages stay resumable.\n debugWarn(`session ${id}: corrupt meta.json, using defaults`);\n }\n store.initialized = true;\n return store;\n }\n\n static async list(cwd?: string): Promise<SessionMeta[]> {\n let entries: string[];\n try {\n entries = await fs.readdir(sessionsDir());\n } catch {\n return [];\n }\n const metas: SessionMeta[] = [];\n for (const entry of entries) {\n try {\n const raw = await fs.readFile(path.join(sessionsDir(), entry, \"meta.json\"), \"utf8\");\n const meta = JSON.parse(raw) as SessionMeta;\n if (meta.id === entry && (cwd === undefined || meta.cwd === cwd)) metas.push(meta);\n } catch {\n // 跳过损坏的会话目录\n }\n }\n return metas.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n const pending = this.pendingMeta;\n if (!pending) {\n this.initialized = true;\n return;\n }\n await fs.mkdir(this.dir, { recursive: true });\n const meta: SessionMeta = {\n id: this.id,\n title: \"\",\n model: pending.model,\n cwd: pending.cwd,\n createdAt: pending.createdAt,\n updatedAt: pending.createdAt,\n };\n await fs.writeFile(this.metaPath(), JSON.stringify(meta, null, 2));\n this.initialized = true;\n }\n\n async append(message: CoreMessage): Promise<void> {\n await this.ensureInitialized();\n await fs.appendFile(this.messagesPath(), `${JSON.stringify(message)}\\n`);\n const meta = await this.meta();\n meta.updatedAt = Date.now();\n await fs.writeFile(this.metaPath(), JSON.stringify(meta, null, 2));\n }\n\n async replaceMessages(messages: CoreMessage[]): Promise<void> {\n await this.ensureInitialized();\n const content = messages.map((message) => JSON.stringify(message)).join(\"\\n\");\n await fs.writeFile(this.messagesPath(), content ? `${content}\\n` : \"\");\n const meta = await this.meta();\n meta.updatedAt = Date.now();\n await fs.writeFile(this.metaPath(), JSON.stringify(meta, null, 2));\n }\n\n async messages(): Promise<CoreMessage[]> {\n let raw: string;\n try {\n raw = await fs.readFile(this.messagesPath(), \"utf8\");\n } catch {\n return [];\n }\n const messages: CoreMessage[] = [];\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n messages.push(JSON.parse(trimmed) as CoreMessage);\n } catch {\n debugWarn(`session ${this.id}: skipping corrupt messages.jsonl line`);\n }\n }\n return messages;\n }\n\n private fallbackMeta(): SessionMeta {\n const now = Date.now();\n return { id: this.id, title: \"\", model: \"\", cwd: \"\", createdAt: now, updatedAt: now };\n }\n\n async meta(): Promise<SessionMeta> {\n await this.ensureInitialized();\n try {\n const raw = await fs.readFile(this.metaPath(), \"utf8\");\n return JSON.parse(raw) as SessionMeta;\n } catch {\n debugWarn(`session ${this.id}: unreadable meta.json, using defaults`);\n return this.fallbackMeta();\n }\n }\n\n async setTitle(title: string): Promise<void> {\n await this.ensureInitialized();\n const meta = await this.meta();\n meta.title = title;\n meta.updatedAt = Date.now();\n await fs.writeFile(this.metaPath(), JSON.stringify(meta, null, 2));\n }\n\n async appendCheckpoint(record: CheckpointRecord, content: string | null): Promise<void> {\n await this.ensureInitialized();\n await appendCheckpointRecord(this.dir, record, content);\n }\n\n async listCheckpoints(): Promise<CheckpointRecord[]> {\n return listCheckpointRecords(this.dir);\n }\n\n async removeCheckpoints(ids: number[]): Promise<void> {\n await removeCheckpointRecords(this.dir, ids);\n }\n\n async addUsage(delta: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n }): Promise<void> {\n await this.ensureInitialized();\n const meta = await this.meta();\n const usage = meta.usage ?? {\n requests: 0,\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n usage.requests += 1;\n usage.promptTokens += delta.promptTokens;\n usage.completionTokens += delta.completionTokens;\n usage.totalTokens += delta.totalTokens;\n meta.usage = usage;\n const day = dayKey(new Date());\n const byDay = meta.usageByDay ?? {};\n const bucket = byDay[day] ?? { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n bucket.promptTokens += delta.promptTokens;\n bucket.completionTokens += delta.completionTokens;\n bucket.totalTokens += delta.totalTokens;\n byDay[day] = bucket;\n meta.usageByDay = byDay;\n await fs.writeFile(this.metaPath(), JSON.stringify(meta, null, 2));\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { sessionsDir } from \"../config/paths\";\nimport { type SessionMeta, SessionStore } from \"./store\";\n\nexport interface SessionListEntry {\n meta: SessionMeta;\n messageCount: number;\n}\n\nasync function countMessages(id: string): Promise<number> {\n let raw: string;\n try {\n raw = await fs.readFile(path.join(sessionsDir(), id, \"messages.jsonl\"), \"utf8\");\n } catch {\n return 0;\n }\n let count = 0;\n for (const line of raw.split(\"\\n\")) {\n if (line.trim()) count += 1;\n }\n return count;\n}\n\nexport async function listSessionEntries(cwd?: string): Promise<SessionListEntry[]> {\n const metas = await SessionStore.list(cwd);\n return Promise.all(\n metas.map(async (meta) => ({ meta, messageCount: await countMessages(meta.id) })),\n );\n}\n\nexport async function findLatestSession(cwd: string): Promise<SessionMeta | null> {\n const [latest] = await SessionStore.list(cwd);\n return latest ?? null;\n}\n\nexport function shortSessionId(id: string): string {\n const dash = id.lastIndexOf(\"-\");\n return dash === -1 ? id : id.slice(dash + 1);\n}\n\nexport async function resolveSessionId(query: string): Promise<string | null> {\n const metas = await SessionStore.list();\n const exact = metas.find((meta) => meta.id === query);\n if (exact) return exact.id;\n const matches = metas.filter(\n (meta) => shortSessionId(meta.id) === query || meta.id.startsWith(query),\n );\n return matches.length === 1 ? (matches[0]?.id ?? null) : null;\n}\n\nfunction relativeTime(timestamp: number): string {\n const diff = Date.now() - timestamp;\n const minutes = Math.floor(diff / 60_000);\n if (minutes < 1) return \"刚刚\";\n if (minutes < 60) return `${minutes} 分钟前`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours} 小时前`;\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days} 天前`;\n const months = Math.floor(days / 30);\n if (months < 12) return `${months} 个月前`;\n return `${Math.floor(months / 12)} 年前`;\n}\n\nexport function formatSessionEntries(\n entries: SessionListEntry[],\n options: { showCwd?: boolean } = {},\n): string {\n return entries\n .map(({ meta, messageCount }) => {\n const title = meta.title || \"(无标题)\";\n const base =\n `${shortSessionId(meta.id)} ${title} ` +\n `${messageCount} 条消息 更新于 ${relativeTime(meta.updatedAt)}`;\n return options.showCwd ? `${base} [${meta.cwd}]` : base;\n })\n .join(\"\\n\");\n}\n","import { type CoreMessage, reconcileToolCalls } from \"../core/messages\";\nimport { type SessionMeta, SessionStore } from \"./store\";\n\nexport async function resumeSession(\n id: string,\n): Promise<{ meta: SessionMeta; messages: CoreMessage[] } | null> {\n const store = await SessionStore.open(id);\n if (!store) return null;\n const [meta, loaded] = await Promise.all([store.meta(), store.messages()]);\n const messages = reconcileToolCalls(loaded);\n if (messages.length !== loaded.length) {\n await store.replaceMessages(messages);\n }\n return { meta, messages };\n}\n","import type { ModelConfig } from \"../config/schema\";\n\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n}\n\nexport function formatDollars(cost: number): string {\n let s = cost.toFixed(4).replace(/0+$/, \"\");\n if (s.endsWith(\".\")) {\n s += \"00\";\n } else if (s.split(\".\")[1]?.length === 1) {\n s += \"0\";\n }\n return s;\n}\n\n// Numeric session cost in USD; null when the model has no pricing configured.\nexport function computeCostUsd(usage: TokenUsage, model: ModelConfig | undefined): number | null {\n if (model?.promptPrice === undefined || model.completionPrice === undefined) {\n return null;\n }\n return (\n (usage.promptTokens * model.promptPrice + usage.completionTokens * model.completionPrice) /\n 1_000_000\n );\n}\n\nexport function estimateCost(\n usage: TokenUsage,\n modelName: string,\n model: ModelConfig | undefined,\n): string {\n const cost = computeCostUsd(usage, model);\n if (cost === null) {\n if (model !== undefined) {\n const missing = [\n model.promptPrice === undefined ? \"promptPrice\" : null,\n model.completionPrice === undefined ? \"completionPrice\" : null,\n ].filter((f) => f !== null);\n if (missing.length === 1) {\n return `Estimated cost: unknown (${model.name} is missing ${missing[0]} — both prices are needed)`;\n }\n }\n return `Estimated cost: unknown (no price configured for ${modelName})`;\n }\n return `Estimated cost: $${formatDollars(cost)} (${model?.name} @ $${model?.promptPrice}/M prompt, $${model?.completionPrice}/M completion)`;\n}\n","import { formatDollars } from \"../cli/cost\";\nimport type { ModelConfig } from \"../config/schema\";\nimport { type SessionMeta, SessionStore } from \"./store\";\n\nexport interface UsageBucket {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface DayUsage extends UsageBucket {\n date: string;\n}\n\nexport interface ModelUsage extends UsageBucket {\n model: string;\n sessions: number;\n requests: number;\n}\n\nexport interface GlobalUsageStats {\n sessions: number;\n sessionsWithUsage: number;\n requests: number;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n // Ascending by date (YYYY-MM-DD, local).\n days: DayUsage[];\n // Tokens recorded before per-day bucketing existed (usage totals minus the\n // sum of usageByDay), null when nothing predates it.\n legacy: UsageBucket | null;\n // Descending by totalTokens.\n models: ModelUsage[];\n}\n\nexport const USAGE_MAX_DAYS = 14;\n\nfunction tokens(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : 0;\n}\n\nfunction bucketOf(value: unknown): UsageBucket {\n const record = (typeof value === \"object\" && value !== null ? value : {}) as Record<\n string,\n unknown\n >;\n const promptTokens = tokens(record.promptTokens);\n const completionTokens = tokens(record.completionTokens);\n return {\n promptTokens,\n completionTokens,\n totalTokens: tokens(record.totalTokens) || promptTokens + completionTokens,\n };\n}\n\nfunction addTo(target: UsageBucket, source: UsageBucket): void {\n target.promptTokens += source.promptTokens;\n target.completionTokens += source.completionTokens;\n target.totalTokens += source.totalTokens;\n}\n\nexport function aggregateUsage(metas: SessionMeta[]): GlobalUsageStats {\n const days = new Map<string, UsageBucket>();\n const models = new Map<string, ModelUsage>();\n const legacy: UsageBucket = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n let hasLegacy = false;\n let sessionsWithUsage = 0;\n let requests = 0;\n const grand: UsageBucket = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n\n for (const meta of metas) {\n const dayBuckets: [string, UsageBucket][] = [];\n if (meta.usageByDay !== null && typeof meta.usageByDay === \"object\") {\n for (const [date, value] of Object.entries(meta.usageByDay)) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) continue;\n dayBuckets.push([date, bucketOf(value)]);\n }\n }\n const daySum: UsageBucket = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n for (const [, bucket] of dayBuckets) addTo(daySum, bucket);\n\n const hasTotals = meta.usage !== null && typeof meta.usage === \"object\";\n const totals = hasTotals ? bucketOf(meta.usage) : daySum;\n const requestCount = hasTotals && meta.usage ? tokens(meta.usage.requests) : 0;\n if (!hasTotals && dayBuckets.length === 0) continue;\n\n sessionsWithUsage += 1;\n addTo(grand, totals);\n requests += requestCount;\n\n for (const [date, bucket] of dayBuckets) {\n const acc = days.get(date) ?? { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n addTo(acc, bucket);\n days.set(date, acc);\n }\n\n if (hasTotals) {\n const rest: UsageBucket = {\n promptTokens: Math.max(0, totals.promptTokens - daySum.promptTokens),\n completionTokens: Math.max(0, totals.completionTokens - daySum.completionTokens),\n totalTokens: Math.max(0, totals.totalTokens - daySum.totalTokens),\n };\n if (rest.promptTokens > 0 || rest.completionTokens > 0 || rest.totalTokens > 0) {\n addTo(legacy, rest);\n hasLegacy = true;\n }\n }\n\n const name = typeof meta.model === \"string\" && meta.model.trim() ? meta.model : \"unknown\";\n const entry = models.get(name) ?? {\n model: name,\n sessions: 0,\n requests: 0,\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n entry.sessions += 1;\n entry.requests += requestCount;\n addTo(entry, totals);\n models.set(name, entry);\n }\n\n return {\n sessions: metas.length,\n sessionsWithUsage,\n requests,\n promptTokens: grand.promptTokens,\n completionTokens: grand.completionTokens,\n totalTokens: grand.totalTokens,\n days: [...days.entries()]\n .map(([date, bucket]) => ({ date, ...bucket }))\n .sort((a, b) => a.date.localeCompare(b.date)),\n legacy: hasLegacy ? legacy : null,\n models: [...models.values()].sort((a, b) => b.totalTokens - a.totalTokens),\n };\n}\n\nexport async function collectUsageStats(): Promise<GlobalUsageStats> {\n return aggregateUsage(await SessionStore.list());\n}\n\nfunction fmt(n: number): string {\n return n.toLocaleString(\"en-US\");\n}\n\nconst BAR_WIDTH = 30;\n\nexport function formatUsageDashboard(\n stats: GlobalUsageStats,\n models: ModelConfig[],\n options: { maxDays?: number } = {},\n): string {\n if (stats.sessions === 0) return \"No sessions found.\";\n\n const lines: string[] = [\n \"Token usage across all sessions\",\n \"\",\n `Total: ${stats.sessions} sessions (${stats.sessionsWithUsage} with usage) · ` +\n `${fmt(stats.requests)} requests · ` +\n `${fmt(stats.promptTokens)} prompt + ${fmt(stats.completionTokens)} completion = ` +\n `${fmt(stats.totalTokens)} tokens`,\n ];\n\n if (stats.sessionsWithUsage === 0) {\n lines.push(\"\", \"No token usage recorded yet.\");\n return lines.join(\"\\n\");\n }\n\n const maxDays = options.maxDays ?? USAGE_MAX_DAYS;\n const recent = stats.days.slice(-maxDays);\n if (recent.length > 0) {\n lines.push(\"\");\n lines.push(\n stats.days.length > maxDays\n ? `By day (last ${maxDays} of ${stats.days.length} days with usage):`\n : \"By day:\",\n );\n const maxTotal = Math.max(...recent.map((day) => day.totalTokens));\n for (const day of recent) {\n const barLen =\n maxTotal > 0 ? Math.max(1, Math.round((day.totalTokens / maxTotal) * BAR_WIDTH)) : 0;\n lines.push(`${day.date} ${fmt(day.totalTokens).padStart(12)} ${\"█\".repeat(barLen)}`);\n }\n }\n if (stats.legacy) {\n lines.push(\n `Earlier usage without per-day records: ${fmt(stats.legacy.totalTokens)} tokens ` +\n `(${fmt(stats.legacy.promptTokens)} prompt + ${fmt(stats.legacy.completionTokens)} completion)`,\n );\n }\n\n lines.push(\"\", \"By model:\");\n const configured = new Map(models.map((m) => [m.name, m]));\n const rows = stats.models.map((entry) => {\n const cfg = configured.get(entry.model);\n const cost =\n cfg?.promptPrice !== undefined && cfg.completionPrice !== undefined\n ? (entry.promptTokens * cfg.promptPrice + entry.completionTokens * cfg.completionPrice) /\n 1_000_000\n : null;\n return { entry, cost };\n });\n const header = [\"model\", \"requests\", \"prompt\", \"completion\", \"total\", \"cost\"];\n const cells = rows.map(({ entry, cost }) => [\n entry.model,\n fmt(entry.requests),\n fmt(entry.promptTokens),\n fmt(entry.completionTokens),\n fmt(entry.totalTokens),\n cost === null ? \"—\" : `$${formatDollars(cost)}`,\n ]);\n const widths = header.map((h, i) =>\n Math.max(h.length, ...cells.map((row) => row[i]?.length ?? 0)),\n );\n const renderRow = (row: string[]) =>\n row\n .map((cell, i) => (i === 0 ? cell.padEnd(widths[0] ?? 0) : cell.padStart(widths[i] ?? 0)))\n .join(\" \");\n lines.push(renderRow(header));\n for (const row of cells) lines.push(renderRow(row));\n\n const pricedCosts = rows.filter((row) => row.cost !== null).map((row) => row.cost as number);\n const unpriced = rows.filter((row) => row.cost === null).map((row) => row.entry.model);\n if (pricedCosts.length > 0) {\n const total = pricedCosts.reduce((sum, cost) => sum + cost, 0);\n const note =\n unpriced.length > 0 ? ` (excludes ${unpriced.join(\", \")} — no price configured)` : \"\";\n lines.push(\"\", `Estimated cost: $${formatDollars(total)}${note}`);\n } else {\n lines.push(\"\", \"Estimated cost: unknown (no per-model pricing configured)\");\n }\n\n return lines.join(\"\\n\");\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction readPackageVersion(): string {\n try {\n const pkgPath = path.join(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"package.json\");\n const pkg: unknown = JSON.parse(fs.readFileSync(pkgPath, \"utf8\"));\n if (typeof pkg === \"object\" && pkg !== null) {\n const version = (pkg as { version?: unknown }).version;\n if (typeof version === \"string\") return version;\n }\n } catch {\n // fall through to placeholder\n }\n return \"0.0.0\";\n}\n\nexport const VERSION = readPackageVersion();\n","export type BudgetStatus = \"ok\" | \"warn\" | \"exceeded\";\n\nexport const BUDGET_WARN_RATIO = 0.8;\n\n// Session budget decision against config.sessionBudgetUsd. Cost is null when\n// the model has no pricing configured — the budget cannot be evaluated then.\nexport function budgetState(costUsd: number | null, budgetUsd: number | undefined): BudgetStatus {\n if (budgetUsd === undefined || costUsd === null) return \"ok\";\n if (costUsd >= budgetUsd) return \"exceeded\";\n if (costUsd >= budgetUsd * BUDGET_WARN_RATIO) return \"warn\";\n return \"ok\";\n}\n","import { execFile } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { readFile, unlink } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { ImageInput } from \"../core/messages\";\n\nexport const CLIPBOARD_TIMEOUT_MS = 5000;\nconst MAX_CLIPBOARD_IMAGE_BYTES = 10 * 1024 * 1024;\n\nconst execFileAsync = promisify(execFile);\n\nexport type ClipboardImagePlan =\n | { kind: \"temp-file\"; command: string; args: string[] }\n | { kind: \"stdout\"; command: string; args: string[] };\n\n// PowerShell saves the clipboard image to the temp PNG; with no image on the\n// clipboard it writes nothing and the missing file is the \"empty\" signal.\nexport function windowsClipboardImageScript(tempFile: string): string {\n const escaped = tempFile.replace(/'/g, \"''\");\n return [\n \"Add-Type -AssemblyName System.Windows.Forms\",\n \"$img = [Windows.Forms.Clipboard]::GetImage()\",\n \"if ($null -ne $img) {\",\n ` $img.Save('${escaped}', [System.Drawing.Imaging.ImageFormat]::Png)`,\n \" $img.Dispose()\",\n \"}\",\n ].join(\"; \");\n}\n\n// osascript line set: `the clipboard as «class PNGf»` errors when the\n// clipboard holds no PNG, which surfaces as a non-zero exit.\nexport function macOsClipboardImageLines(tempFile: string): string[] {\n const posix = tempFile.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n return [\n \"set pngData to the clipboard as «class PNGf»\",\n `set theFile to open for access (POSIX file \"${posix}\") with write permission`,\n \"write pngData to theFile\",\n \"close access theFile\",\n ];\n}\n\nexport function clipboardImagePlan(\n platform: NodeJS.Platform,\n tempFile: string,\n hasPngpaste: boolean,\n): ClipboardImagePlan | null {\n if (platform === \"win32\") {\n return {\n kind: \"temp-file\",\n command: \"powershell.exe\",\n args: [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-STA\",\n \"-Command\",\n windowsClipboardImageScript(tempFile),\n ],\n };\n }\n if (platform === \"darwin\") {\n if (hasPngpaste) {\n return { kind: \"temp-file\", command: \"pngpaste\", args: [tempFile] };\n }\n return {\n kind: \"temp-file\",\n command: \"osascript\",\n args: macOsClipboardImageLines(tempFile).flatMap((line) => [\"-e\", line]),\n };\n }\n if (platform === \"linux\") {\n return {\n kind: \"stdout\",\n command: \"xclip\",\n args: [\"-selection\", \"clipboard\", \"-t\", \"image/png\", \"-o\"],\n };\n }\n return null;\n}\n\nexport function clipboardCopyCommand(\n platform: NodeJS.Platform,\n): { command: string; args: string[] } | null {\n if (platform === \"win32\") return { command: \"clip.exe\", args: [] };\n if (platform === \"darwin\") return { command: \"pbcopy\", args: [] };\n if (platform === \"linux\") return { command: \"xclip\", args: [\"-selection\", \"clipboard\"] };\n return null;\n}\n\nasync function commandExists(command: string): Promise<boolean> {\n const checker = process.platform === \"win32\" ? \"where\" : \"which\";\n try {\n await execFileAsync(checker, [command], { timeout: CLIPBOARD_TIMEOUT_MS });\n return true;\n } catch {\n return false;\n }\n}\n\n// Reads a PNG image from the system clipboard. Every failure — unsupported\n// platform, missing tool, no image on the clipboard, timeout — returns null.\nexport async function readClipboardImage(): Promise<ImageInput | null> {\n const tempFile = path.join(os.tmpdir(), `star-clipboard-${randomUUID()}.png`);\n const hasPngpaste = process.platform === \"darwin\" ? await commandExists(\"pngpaste\") : false;\n const plan = clipboardImagePlan(process.platform, tempFile, hasPngpaste);\n if (!plan) return null;\n try {\n if (plan.kind === \"stdout\") {\n const { stdout } = await execFileAsync(plan.command, plan.args, {\n timeout: CLIPBOARD_TIMEOUT_MS,\n maxBuffer: MAX_CLIPBOARD_IMAGE_BYTES,\n encoding: \"buffer\",\n });\n const buf = stdout as unknown as Buffer;\n if (buf.length === 0) return null;\n return { path: \"clipboard.png\", mimeType: \"image/png\", data: buf.toString(\"base64\") };\n }\n await execFileAsync(plan.command, plan.args, { timeout: CLIPBOARD_TIMEOUT_MS });\n const buf = await readFile(tempFile).catch(() => null);\n if (!buf || buf.length === 0) return null;\n return { path: \"clipboard.png\", mimeType: \"image/png\", data: buf.toString(\"base64\") };\n } catch {\n return null;\n } finally {\n if (plan.kind === \"temp-file\") {\n await unlink(tempFile).catch(() => {});\n }\n }\n}\n\n// Copies text to the system clipboard; false on any failure.\nexport async function copyText(text: string): Promise<boolean> {\n const plan = clipboardCopyCommand(process.platform);\n if (!plan) return false;\n return new Promise((resolve) => {\n const child = execFile(plan.command, plan.args, { timeout: CLIPBOARD_TIMEOUT_MS }, (error) =>\n resolve(error === null),\n );\n child.stdin?.on(\"error\", () => {});\n child.stdin?.end(text);\n });\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { LanguageModel } from \"ai\";\nimport { AgentLoop } from \"../../agent/loop\";\nimport type { StarConfig } from \"../../config/schema\";\nimport { compactMessages, summarizeMessages } from \"../../context/compaction\";\nimport type { CompactionResult } from \"../../context/compaction\";\nimport { estimateTokens } from \"../../context/tokens\";\nimport type { CoreMessage } from \"../../core/messages\";\nimport type { SessionStore } from \"../../session/store\";\nimport type { ChatBackend } from \"../backend\";\n\nconst MIN_COMPACT_MESSAGES = 4;\n\nexport interface CompactSessionOptions {\n backend: ChatBackend;\n sessionStore: SessionStore | null;\n config: StarConfig;\n model: LanguageModel | null;\n}\n\nexport interface CompactSessionResult {\n message: string;\n compacted: boolean;\n messages?: CoreMessage[];\n}\n\nexport async function compactSession(opts: CompactSessionOptions): Promise<CompactSessionResult> {\n const { backend, sessionStore, config, model } = opts;\n if (!(backend instanceof AgentLoop)) {\n return { message: \"Current backend does not support compaction.\", compacted: false };\n }\n const messages = [...backend.getMessages()];\n if (messages.length < MIN_COMPACT_MESSAGES) {\n return {\n message: `Nothing to compact: history has only ${messages.length} message(s).`,\n compacted: false,\n };\n }\n const beforeTokens = estimateTokens(messages);\n const compacted = compactMessages(messages, config.contextMaxTokens);\n if (!compacted.compacted) {\n return {\n message: `Nothing to compact: ~${beforeTokens} estimated tokens, below the limit of ${config.contextMaxTokens}.`,\n compacted: false,\n };\n }\n const next = await applyCompactionSummary(messages, compacted, config, model);\n await backend.loadMessages(next);\n await sessionStore?.replaceMessages(next);\n const afterTokens = estimateTokens(next);\n return {\n message: `Compacted context: ${messages.length} -> ${next.length} messages (~${beforeTokens} -> ~${afterTokens} estimated tokens).`,\n compacted: true,\n messages: next,\n };\n}\n\nasync function applyCompactionSummary(\n original: CoreMessage[],\n compacted: CompactionResult,\n config: StarConfig,\n model: LanguageModel | null,\n): Promise<CoreMessage[]> {\n if (config.contextCompaction !== \"summary\" || !model) {\n return compacted.messages;\n }\n const headCount = compacted.messages[0]?.role === \"system\" ? 1 : 0;\n const dropped = original.slice(headCount, headCount + compacted.droppedCount);\n try {\n const summary = await summarizeMessages(dropped, model);\n const messages = compacted.messages.slice();\n messages[headCount] = {\n role: \"user\",\n content: `[earlier conversation summarized]\\n${summary}`,\n };\n return messages;\n } catch {\n return compacted.messages;\n }\n}\n\nexport interface ExportSessionOptions {\n backend: ChatBackend;\n sessionStore: SessionStore | null;\n cwd: string;\n arg: string;\n}\n\nexport async function exportSession(opts: ExportSessionOptions): Promise<string> {\n const { backend, sessionStore, cwd, arg } = opts;\n if (!(backend instanceof AgentLoop)) {\n return \"Current backend does not support exporting sessions.\";\n }\n const messages = [...backend.getMessages()];\n if (messages.length === 0) {\n return \"Nothing to export: the session has no messages.\";\n }\n const sessionId = sessionStore?.id ?? `unknown-${Date.now()}`;\n const target = arg ? path.resolve(cwd, arg) : path.resolve(cwd, `star-session-${sessionId}.md`);\n const existed = await fileExists(target);\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.writeFile(target, renderSessionMarkdown(sessionId, messages));\n return existed\n ? `Exported ${messages.length} messages to ${target} (overwrote existing file).`\n : `Exported ${messages.length} messages to ${target}.`;\n}\n\nasync function fileExists(target: string): Promise<boolean> {\n try {\n await fs.access(target);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function renderSessionMarkdown(\n sessionId: string,\n messages: readonly CoreMessage[],\n exportedAt: Date = new Date(),\n): string {\n const lines: string[] = [\n `# Star CLI Session ${sessionId}`,\n \"\",\n `_Exported at ${exportedAt.toISOString()}_`,\n \"\",\n ];\n for (const message of messages) {\n lines.push(`## ${roleHeading(message.role)}`, \"\");\n lines.push(...renderContent(message), \"\");\n }\n return lines.join(\"\\n\");\n}\n\nfunction roleHeading(role: string): string {\n return role.charAt(0).toUpperCase() + role.slice(1);\n}\n\nfunction renderContent(message: CoreMessage): string[] {\n const content = message.content;\n if (typeof content === \"string\") return [content];\n const lines: string[] = [];\n for (const part of content) {\n if (part.type === \"text\") {\n lines.push(part.text, \"\");\n } else if (part.type === \"tool-call\") {\n lines.push(\n `**Tool call: ${part.toolName}**`,\n \"\",\n \"```json\",\n JSON.stringify(part.args, null, 2),\n \"```\",\n \"\",\n );\n } else if (part.type === \"tool-result\") {\n lines.push(\n `**Tool result: ${part.toolName}**`,\n \"\",\n \"```\",\n stringifyPart(part.result),\n \"```\",\n \"\",\n );\n } else if (part.type === \"reasoning\") {\n lines.push(part.text, \"\");\n } else {\n lines.push(`[${part.type}]`, \"\");\n }\n }\n while (lines.length > 0 && lines[lines.length - 1] === \"\") lines.pop();\n return lines;\n}\n\nfunction stringifyPart(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type DiffLineKind = \"add\" | \"del\" | \"context\" | \"marker\";\n\nexport interface DiffLine {\n kind: DiffLineKind;\n text: string;\n}\n\nexport interface DiffPreview {\n type: \"diff\" | \"new-file\";\n label: string;\n lines: DiffLine[];\n}\n\nconst CONTEXT_LINES = 2;\nconst MAX_HUNK_LINES = 15;\nconst MAX_TOTAL_LINES = 12;\nconst NEW_FILE_PREVIEW_LINES = 10;\nconst MAX_DP_CELLS = 250_000;\n\ninterface Op {\n kind: Exclude<DiffLineKind, \"marker\">;\n text: string;\n}\n\nfunction diffOps(oldText: string, newText: string): Op[] {\n const a = oldText.split(\"\\n\");\n const b = newText.split(\"\\n\");\n let start = 0;\n while (start < a.length && start < b.length && a[start] === b[start]) start += 1;\n let endA = a.length;\n let endB = b.length;\n while (endA > start && endB > start && a[endA - 1] === b[endB - 1]) {\n endA -= 1;\n endB -= 1;\n }\n const prefix: Op[] = a.slice(0, start).map((text) => ({ kind: \"context\" as const, text }));\n const suffix: Op[] = a.slice(endA).map((text) => ({ kind: \"context\" as const, text }));\n const midA = a.slice(start, endA);\n const midB = b.slice(start, endB);\n const prefixLen = prefix.length;\n const ops: Op[] = [...prefix];\n if (midA.length * midB.length > MAX_DP_CELLS) {\n for (const text of midA) ops.push({ kind: \"del\", text });\n for (const text of midB) ops.push({ kind: \"add\", text });\n } else if (midA.length > 0 || midB.length > 0) {\n const rows = midA.length + 1;\n const cols = midB.length + 1;\n const dp = new Uint32Array(rows * cols);\n const cell = (r: number, c: number): number => dp[r * cols + c] ?? 0;\n for (let i = 1; i < rows; i++) {\n for (let j = 1; j < cols; j++) {\n dp[i * cols + j] =\n midA[i - 1] === midB[j - 1]\n ? cell(i - 1, j - 1) + 1\n : Math.max(cell(i - 1, j), cell(i, j - 1));\n }\n }\n const lineAt = (lines: string[], index: number): string => lines[index] ?? \"\";\n const middle: Op[] = [];\n let i = midA.length;\n let j = midB.length;\n while (i > 0 && j > 0) {\n if (midA[i - 1] === midB[j - 1]) {\n middle.push({ kind: \"context\", text: lineAt(midA, i - 1) });\n i -= 1;\n j -= 1;\n } else if (cell(i, j - 1) >= cell(i - 1, j)) {\n middle.push({ kind: \"add\", text: lineAt(midB, j - 1) });\n j -= 1;\n } else {\n middle.push({ kind: \"del\", text: lineAt(midA, i - 1) });\n i -= 1;\n }\n }\n while (i > 0) {\n middle.push({ kind: \"del\", text: lineAt(midA, i - 1) });\n i -= 1;\n }\n while (j > 0) {\n middle.push({ kind: \"add\", text: lineAt(midB, j - 1) });\n j -= 1;\n }\n middle.reverse();\n ops.push(...middle);\n }\n ops.push(...suffix);\n return ops.length === prefixLen + suffix.length ? [] : ops;\n}\n\nfunction hunkRanges(ops: Op[]): Array<[number, number]> {\n const changes: number[] = [];\n for (let i = 0; i < ops.length; i++) {\n const op = ops[i];\n if (op && op.kind !== \"context\") changes.push(i);\n }\n const ranges: Array<[number, number]> = [];\n let groupStart = 0;\n for (let k = 1; k <= changes.length; k++) {\n const cur = changes[k];\n const prev = changes[k - 1];\n const first = changes[groupStart];\n if (prev === undefined || first === undefined) break;\n if (cur === undefined || cur - prev > CONTEXT_LINES * 2 + 1) {\n ranges.push([\n Math.max(0, first - CONTEXT_LINES),\n Math.min(ops.length, prev + CONTEXT_LINES + 1),\n ]);\n groupStart = k;\n }\n }\n return ranges;\n}\n\nexport function buildDiffLines(oldText: string, newText: string): DiffLine[] {\n const ops = diffOps(oldText, newText);\n if (ops.length === 0) return [];\n const ranges = hunkRanges(ops);\n const lines: DiffLine[] = [];\n let omitted = 0;\n for (const [rangeIndex, [start, end]] of ranges.entries()) {\n if (rangeIndex > 0) lines.push({ kind: \"marker\", text: \"···\" });\n const hunk = ops.slice(start, end);\n let shown = hunk;\n if (hunk.length > MAX_HUNK_LINES) {\n const headCount = Math.ceil(MAX_HUNK_LINES / 2);\n shown = [...hunk.slice(0, headCount), ...hunk.slice(headCount - MAX_HUNK_LINES)];\n }\n if (hunk.length > shown.length) {\n omitted += hunk.length - shown.length;\n }\n for (const op of shown) lines.push(op);\n }\n if (lines.length > MAX_TOTAL_LINES) {\n omitted += lines.length - MAX_TOTAL_LINES;\n lines.length = MAX_TOTAL_LINES;\n }\n if (omitted > 0) lines.push({ kind: \"marker\", text: `... (${omitted} more lines)` });\n return lines;\n}\n\n// Maps raw `git diff` output onto the same line kinds used by the write/edit\n// preview so both render with the same colors. The leading +/- sigil is\n// stripped because the renderer re-adds it; a leading space on context lines\n// is stripped for the same reason.\nexport function parseGitDiffLines(diffText: string): DiffLine[] {\n return diffText.split(\"\\n\").map((raw) => {\n if (raw.startsWith(\"+\") && !raw.startsWith(\"+++\")) {\n return { kind: \"add\", text: raw.slice(1) };\n }\n if (raw.startsWith(\"-\") && !raw.startsWith(\"---\")) {\n return { kind: \"del\", text: raw.slice(1) };\n }\n if (\n raw.startsWith(\"@@\") ||\n raw.startsWith(\"diff \") ||\n raw.startsWith(\"index \") ||\n raw.startsWith(\"#\") ||\n raw.startsWith(\"+++\") ||\n raw.startsWith(\"---\")\n ) {\n return { kind: \"marker\", text: raw };\n }\n return { kind: \"context\", text: raw.startsWith(\" \") ? raw.slice(1) : raw };\n });\n}\n\nfunction getStringArg(args: unknown, key: string): string | undefined {\n if (typeof args === \"object\" && args !== null) {\n const value = (args as Record<string, unknown>)[key];\n if (typeof value === \"string\") return value;\n }\n return undefined;\n}\n\nfunction applyEdit(\n content: string,\n oldString: string,\n newString: string,\n replaceAll: boolean,\n): string | null {\n let count = 0;\n let idx = content.indexOf(oldString);\n while (idx !== -1) {\n count += 1;\n idx = content.indexOf(oldString, idx + oldString.length);\n }\n if (count === 0) return null;\n if (count > 1 && !replaceAll) return null;\n return replaceAll\n ? content.split(oldString).join(newString)\n : content.replace(oldString, newString);\n}\n\nfunction newFilePreview(content: string, label: string): DiffPreview {\n const all = content.split(\"\\n\");\n const shown = all.slice(0, NEW_FILE_PREVIEW_LINES);\n const lines: DiffLine[] = shown.map((text) => ({ kind: \"add\", text }));\n if (all.length > shown.length) {\n lines.push({ kind: \"marker\", text: `... (${all.length - shown.length} more lines)` });\n }\n return { type: \"new-file\", label, lines };\n}\n\nexport async function generateDiffPreview(\n toolName: string,\n args: unknown,\n cwd: string,\n): Promise<DiffPreview | null> {\n if (toolName !== \"edit_file\" && toolName !== \"write_file\") return null;\n const filePath = getStringArg(args, \"path\");\n if (filePath === undefined) return null;\n const absolute = path.resolve(cwd, filePath);\n let existing: string | null;\n try {\n existing = await readFile(absolute, \"utf8\");\n } catch {\n existing = null;\n }\n if (toolName === \"edit_file\") {\n const oldString = getStringArg(args, \"old_string\");\n const newString = getStringArg(args, \"new_string\");\n if (existing === null || oldString === undefined || newString === undefined) return null;\n const replaceAll =\n typeof args === \"object\" &&\n args !== null &&\n (args as Record<string, unknown>).replace_all === true;\n const updated = applyEdit(existing, oldString, newString, replaceAll);\n if (updated === null) return null;\n return { type: \"diff\", label: filePath, lines: buildDiffLines(existing, updated) };\n }\n const content = getStringArg(args, \"content\");\n if (content === undefined) return null;\n if (existing === null) return newFilePreview(content, filePath);\n return { type: \"diff\", label: filePath, lines: buildDiffLines(existing, content) };\n}\n","import { discoverSkills } from \"../../agent/skills\";\nimport {\n WORKING_DIFF_MAX_LINES,\n buildCommitPrompt,\n collectCommitContext,\n collectWorkingDiff,\n isGitRepo,\n} from \"../../core/git\";\nimport { parseGitDiffLines } from \"../diff-preview\";\nimport type { CommandRegistry } from \"./registry\";\n\nexport function registerBuiltinCommands(registry: CommandRegistry): void {\n registry.register({\n name: \"help\",\n description: \"List available commands\",\n usage: \"/help\",\n run(_args, ctx) {\n const lines = registry.list().map((cmd) => {\n const usage = cmd.usage ?? `/${cmd.name}`;\n return `${usage} - ${cmd.description}`;\n });\n ctx.addSystemMessage(`Available commands:\\n${lines.join(\"\\n\")}`);\n },\n });\n\n registry.register({\n name: \"clear\",\n description: \"Clear message history\",\n usage: \"/clear\",\n run(_args, ctx) {\n ctx.clearMessages();\n },\n });\n\n registry.register({\n name: \"new\",\n description: \"Start a new session with a clean context\",\n usage: \"/new\",\n async run(_args, ctx) {\n if (!ctx.newSession) {\n ctx.addSystemMessage(\"/new: this context cannot start a new session.\");\n return;\n }\n ctx.addSystemMessage(await ctx.newSession());\n },\n });\n\n registry.register({\n name: \"clear-sessions\",\n description:\n \"Delete stored sessions: this directory by default, every session with --all (the current session is kept)\",\n usage: \"/clear-sessions [--all]\",\n async run(args, ctx) {\n const arg = args.trim();\n if (arg !== \"\" && arg !== \"--all\") {\n ctx.addSystemMessage(\n `/clear-sessions: unknown argument \"${arg}\". Usage: /clear-sessions [--all]`,\n );\n return;\n }\n if (!ctx.clearSessions) {\n ctx.addSystemMessage(\"/clear-sessions: this context cannot delete sessions.\");\n return;\n }\n ctx.addSystemMessage(await ctx.clearSessions(arg === \"--all\"));\n },\n });\n\n registry.register({\n name: \"exit\",\n description: \"Exit the application\",\n usage: \"/exit\",\n run(_args, ctx) {\n ctx.exit();\n },\n });\n\n registry.register({\n name: \"q\",\n description: \"Exit the application (alias of /exit)\",\n usage: \"/q\",\n run(_args, ctx) {\n ctx.exit();\n },\n });\n\n registry.register({\n name: \"model\",\n description: \"List available models or switch the current model\",\n usage: \"/model [name]\",\n async run(args, ctx) {\n if (!args) {\n ctx.addSystemMessage(ctx.listModels());\n } else {\n ctx.addSystemMessage(await ctx.switchModel(args));\n }\n },\n });\n\n registry.register({\n name: \"resume\",\n description: \"List sessions or resume a session by id\",\n usage: \"/resume [sessionId | --all]\",\n async run(args, ctx) {\n const arg = args.trim();\n if (arg === \"--all\") {\n ctx.addSystemMessage(await ctx.listSessions(true));\n } else if (!arg) {\n ctx.addSystemMessage(await ctx.listSessions());\n } else {\n ctx.addSystemMessage(await ctx.resumeSession(arg));\n }\n },\n });\n\n registry.register({\n name: \"todo\",\n description: \"Show the current todo list\",\n usage: \"/todo\",\n async run(_args, ctx) {\n ctx.addSystemMessage(await ctx.showTodos());\n },\n });\n\n registry.register({\n name: \"tasks\",\n description: \"List background shell tasks\",\n usage: \"/tasks\",\n run(_args, ctx) {\n ctx.addSystemMessage(ctx.listTasks());\n },\n });\n\n registry.register({\n name: \"cost\",\n description: \"Show API token usage for this session\",\n usage: \"/cost\",\n run(_args, ctx) {\n ctx.addSystemMessage(ctx.showUsage());\n },\n });\n\n registry.register({\n name: \"usage\",\n description: \"Show token usage aggregated across all sessions\",\n usage: \"/usage\",\n async run(_args, ctx) {\n ctx.addSystemMessage(await ctx.showGlobalUsage());\n },\n });\n\n registry.register({\n name: \"config\",\n description: \"Show the current configuration\",\n usage: \"/config\",\n run(_args, ctx) {\n ctx.addSystemMessage(ctx.describeConfig());\n },\n });\n\n registry.register({\n name: \"compact\",\n description: \"Compact the conversation history to free up context\",\n usage: \"/compact\",\n async run(_args, ctx) {\n ctx.addSystemMessage(await ctx.compactContext());\n },\n });\n\n registry.register({\n name: \"export\",\n description: \"Export the current session to a Markdown file\",\n usage: \"/export [path]\",\n async run(args, ctx) {\n ctx.addSystemMessage(await ctx.exportSession(args));\n },\n });\n\n registry.register({\n name: \"permission\",\n description: \"Show or set the global permission mode (ask | auto | readonly | yolo)\",\n usage: \"/permission [ask|auto|readonly|yolo]\",\n async run(args, ctx) {\n ctx.addSystemMessage(await ctx.permissionMode(args.trim()));\n },\n });\n\n registry.register({\n name: \"plan\",\n description: \"Toggle plan mode: read-only research, then approve the plan before executing\",\n usage: \"/plan\",\n async run(_args, ctx) {\n ctx.addSystemMessage(await ctx.planMode());\n },\n });\n\n registry.register({\n name: \"undo\",\n description:\n \"Undo the last conversation turn: revert its file changes (write_file/edit_file) and retract its messages\",\n usage: \"/undo\",\n async run(_args, ctx) {\n ctx.addSystemMessage(await ctx.undo());\n },\n });\n\n registry.register({\n name: \"rewind\",\n description:\n \"List file-change checkpoints, or rewind to just before one: restore files and retract the conversation\",\n usage: \"/rewind [n]\",\n async run(args, ctx) {\n ctx.addSystemMessage(await ctx.rewind(args.trim()));\n },\n });\n\n registry.register({\n name: \"init\",\n description: \"Generate an AGENTS.md for the current project\",\n usage: \"/init [force]\",\n async run(args, ctx) {\n ctx.addSystemMessage(await ctx.initProject(args));\n },\n });\n\n registry.register({\n name: \"doctor\",\n description: \"Run environment and configuration checks\",\n usage: \"/doctor\",\n async run(_args, ctx) {\n ctx.addSystemMessage(await ctx.runDoctor());\n },\n });\n\n registry.register({\n name: \"skills\",\n description: \"List available skills (project scope overrides user scope)\",\n usage: \"/skills\",\n run(_args, ctx) {\n const skills = discoverSkills(ctx.cwd ?? process.cwd());\n if (skills.length === 0) {\n ctx.addSystemMessage(\n \"No skills found. Add a SKILL.md under .star/skills/<name>/ (project) or ~/.star-cli/skills/<name>/ (user).\",\n );\n return;\n }\n const lines = skills.map((s) => `${s.name} [${s.scope}] — ${s.description}`);\n ctx.addSystemMessage(`Available skills:\\n${lines.join(\"\\n\")}`);\n },\n });\n\n registry.register({\n name: \"commit\",\n description: \"Analyze uncommitted changes and create a git commit (Conventional Commits)\",\n usage: \"/commit [instructions]\",\n async run(args, ctx) {\n const cwd = ctx.cwd ?? process.cwd();\n if (!isGitRepo(cwd)) {\n ctx.addSystemMessage(\"/commit: not a git repository — nothing to do.\");\n return;\n }\n const context = collectCommitContext(cwd);\n if (!context) {\n ctx.addSystemMessage(\"/commit: working tree clean — nothing to commit.\");\n return;\n }\n const prompt = buildCommitPrompt(context, args);\n if (ctx.submitPrompt) {\n return ctx.submitPrompt(prompt);\n }\n ctx.addSystemMessage(\"/commit: this context cannot submit prompts to the model.\");\n },\n });\n\n registry.register({\n name: \"copy\",\n description:\n \"Copy the last assistant reply to the clipboard (`all` for the whole conversation)\",\n usage: \"/copy [all]\",\n async run(args, ctx) {\n const arg = args.trim();\n if (arg !== \"\" && arg !== \"all\") {\n ctx.addSystemMessage(`/copy: unknown argument \"${arg}\". Usage: /copy [all]`);\n return;\n }\n if (!ctx.conversationText || !ctx.copyToClipboard) {\n ctx.addSystemMessage(\"/copy: this context cannot access the clipboard.\");\n return;\n }\n const scope = arg === \"all\" ? \"all\" : \"last\";\n const text = ctx.conversationText(scope);\n if (!text) {\n ctx.addSystemMessage(\n scope === \"all\" ? \"Nothing to copy yet.\" : \"No assistant reply yet — nothing to copy.\",\n );\n return;\n }\n const ok = await ctx.copyToClipboard(text);\n ctx.addSystemMessage(\n ok\n ? `Copied ${text.length} chars to clipboard.`\n : \"Copy failed — no clipboard command available on this platform.\",\n );\n },\n });\n\n registry.register({\n name: \"diff\",\n description: \"Show uncommitted changes (git status + colored diff)\",\n usage: \"/diff\",\n run(_args, ctx) {\n const cwd = ctx.cwd ?? process.cwd();\n if (!isGitRepo(cwd)) {\n ctx.addSystemMessage(\"/diff: not a git repository — nothing to show.\");\n return;\n }\n const result = collectWorkingDiff(cwd);\n if (!result || result.status === \"\") {\n ctx.addSystemMessage(\"Working tree clean — no uncommitted changes.\");\n return;\n }\n const header = `git status --short:\\n${result.status}`;\n if (result.diff === \"\") {\n ctx.addSystemMessage(\n `${header}\\n\\nOnly untracked files — no tracked modifications to diff.`,\n );\n return;\n }\n const note = result.truncated\n ? `diff truncated at ${WORKING_DIFF_MAX_LINES} lines`\n : undefined;\n if (ctx.showDiff) {\n ctx.showDiff(header, parseGitDiffLines(result.diff), note);\n return;\n }\n ctx.addSystemMessage(`${header}\\n\\n${result.diff}${note ? `\\n... (${note})` : \"\"}`);\n },\n });\n}\n","import { readFileSync, readdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { starHome } from \"../../config/paths\";\nimport type { CommandRegistry } from \"./registry\";\n\nconst NAME_PATTERN = /^[a-z0-9-]+$/;\nconst DESCRIPTION_PATTERN = /^<!--\\s*description:\\s*(.+?)\\s*-->\\s*$/;\nconst DEFAULT_DESCRIPTION = \"Custom prompt command\";\n\nexport interface CustomCommand {\n name: string;\n description: string;\n template: string;\n source: string;\n}\n\nfunction parseCommandFile(filePath: string, name: string): CustomCommand | null {\n let raw: string;\n try {\n raw = readFileSync(filePath, \"utf8\");\n } catch {\n return null;\n }\n const lines = raw.split(/\\r?\\n/);\n let description = DEFAULT_DESCRIPTION;\n const first = lines[0] ?? \"\";\n const match = first.match(DESCRIPTION_PATTERN);\n if (match) {\n description = match[1] ?? DEFAULT_DESCRIPTION;\n lines.shift();\n if (lines[0] !== undefined && lines[0].trim() === \"\") lines.shift();\n }\n const template = lines.join(\"\\n\").trim();\n if (!template) return null;\n return { name, description, template, source: filePath };\n}\n\nfunction scanDir(dir: string, into: Map<string, CustomCommand>): void {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n for (const entry of entries.sort()) {\n if (!entry.endsWith(\".md\")) continue;\n const name = entry.slice(0, -\".md\".length);\n if (!NAME_PATTERN.test(name)) continue;\n const parsed = parseCommandFile(path.join(dir, entry), name);\n if (parsed) into.set(name, parsed);\n }\n}\n\nexport function loadCustomCommands(cwd: string, home: string = starHome()): CustomCommand[] {\n const byName = new Map<string, CustomCommand>();\n scanDir(path.join(home, \"commands\"), byName);\n scanDir(path.join(cwd, \".star\", \"commands\"), byName);\n return [...byName.values()];\n}\n\nexport function registerCustomCommands(\n registry: CommandRegistry,\n cwd: string,\n home?: string,\n): CustomCommand[] {\n const registered: CustomCommand[] = [];\n for (const command of loadCustomCommands(cwd, home)) {\n if (registry.get(command.name)) continue;\n registry.register({\n name: command.name,\n description: command.description,\n usage: `/${command.name} [args]`,\n run(args, ctx) {\n const prompt = command.template.split(\"$ARGUMENTS\").join(args);\n if (ctx.submitPrompt) {\n return ctx.submitPrompt(prompt);\n }\n ctx.addSystemMessage(`/${command.name}: this context cannot submit prompts to the model.`);\n },\n });\n registered.push(command);\n }\n return registered;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { starHome } from \"../../config/paths\";\nimport type { StarConfig } from \"../../config/schema\";\nimport { resolveShell } from \"../../tools/bash\";\n\nconst MIN_NODE_MAJOR = 20;\nconst REGISTRY_URL = \"https://registry.npmjs.org/\";\nconst REGISTRY_TIMEOUT_MS = 5000;\n\nexport interface DoctorCheck {\n name: string;\n ok: boolean;\n detail: string;\n optional?: boolean;\n}\n\nexport interface DoctorReport {\n checks: DoctorCheck[];\n passed: number;\n failed: number;\n}\n\nexport type DoctorFetcher = (url: string, timeoutMs: number) => Promise<boolean>;\n\nasync function defaultFetcher(url: string, timeoutMs: number): Promise<boolean> {\n const res = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) });\n return res.ok;\n}\n\nexport interface DoctorOptions {\n cwd: string;\n config: StarConfig;\n env?: NodeJS.ProcessEnv;\n home?: string;\n nodeVersion?: string;\n shellLabel?: string;\n shellPath?: string;\n fetcher?: DoctorFetcher;\n}\n\nfunction nodeMajor(version: string): number | null {\n const match = /^v?(\\d+)/.exec(version);\n return match ? Number.parseInt(match[1] ?? \"\", 10) : null;\n}\n\nasync function pathExists(target: string): Promise<boolean> {\n try {\n await fs.access(target);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction resolveApiKeyConfigured(\n config: StarConfig,\n providerName: string,\n env: NodeJS.ProcessEnv,\n): boolean | null {\n const provider = config.providers.find((p) => p.name === providerName);\n if (!provider) return null;\n const fromEnv = provider.apiKeyEnv ? env[provider.apiKeyEnv] : undefined;\n return Boolean(fromEnv ?? provider.apiKey);\n}\n\nexport async function runDoctor(opts: DoctorOptions): Promise<DoctorReport> {\n const env = opts.env ?? process.env;\n const home = opts.home ?? starHome();\n const checks: DoctorCheck[] = [];\n\n const version = opts.nodeVersion ?? process.version;\n const major = nodeMajor(version);\n const nodeOk = major !== null && major >= MIN_NODE_MAJOR;\n checks.push({\n name: \"Node.js version\",\n ok: nodeOk,\n detail: nodeOk\n ? `${version} (>= ${MIN_NODE_MAJOR} required)`\n : `${version} — Node.js >= ${MIN_NODE_MAJOR} is required`,\n });\n\n if (opts.shellLabel !== undefined || opts.shellPath !== undefined) {\n checks.push({\n name: \"Shell for bash tool\",\n ok: true,\n detail: `${opts.shellLabel ?? \"unknown\"}${opts.shellPath ? ` (${opts.shellPath})` : \"\"}`,\n });\n } else {\n const spec = resolveShell();\n checks.push({\n name: \"Shell for bash tool\",\n ok: true,\n detail: `${spec.label} (${spec.shell})`,\n });\n }\n\n const configPath = path.join(home, \"config.toml\");\n const configExists = await pathExists(configPath);\n checks.push({\n name: \"STAR_HOME / config\",\n ok: configExists,\n detail: configExists\n ? `STAR_HOME=${home}, config.toml found at ${configPath}`\n : `STAR_HOME=${home}, config.toml missing at ${configPath}`,\n });\n\n const defaultModel = opts.config.defaultModel;\n if (!defaultModel) {\n checks.push({\n name: \"Default model\",\n ok: false,\n detail: \"no defaultModel configured\",\n });\n } else {\n const modelConfig = opts.config.models.find((m) => m.name === defaultModel);\n if (!modelConfig) {\n checks.push({\n name: \"Default model\",\n ok: false,\n detail: `model \"${defaultModel}\" not found in configured models`,\n });\n } else {\n const provider = opts.config.providers.find((p) => p.name === modelConfig.provider);\n checks.push({\n name: \"Default model\",\n ok: provider !== undefined,\n detail: provider\n ? `${modelConfig.name} (${provider.name}/${modelConfig.model}, ${provider.baseURL})`\n : `provider \"${modelConfig.provider}\" for model \"${modelConfig.name}\" not found`,\n });\n const keyConfigured = resolveApiKeyConfigured(opts.config, modelConfig.provider, env);\n checks.push({\n name: \"Provider API key\",\n ok: keyConfigured === true,\n detail:\n keyConfigured === null\n ? `provider \"${modelConfig.provider}\" not found`\n : keyConfigured\n ? `apiKey resolved for provider \"${modelConfig.provider}\"`\n : `apiKey missing for provider \"${modelConfig.provider}\"${\n provider?.apiKeyEnv ? ` (set ${provider.apiKeyEnv} or configure apiKey)` : \"\"\n }`,\n });\n }\n }\n\n const sessions = path.join(home, \"sessions\");\n let writable = false;\n let writeError = \"\";\n try {\n await fs.mkdir(sessions, { recursive: true });\n const probe = path.join(sessions, `.doctor-probe-${process.pid}`);\n await fs.writeFile(probe, \"ok\");\n await fs.unlink(probe);\n writable = true;\n } catch (error) {\n writeError = error instanceof Error ? error.message : String(error);\n }\n checks.push({\n name: \"Sessions directory writable\",\n ok: writable,\n detail: writable ? `${sessions} is writable` : `${sessions} not writable: ${writeError}`,\n });\n\n const fetcher = opts.fetcher ?? defaultFetcher;\n let registryOk = false;\n try {\n registryOk = await fetcher(REGISTRY_URL, REGISTRY_TIMEOUT_MS);\n } catch {\n registryOk = false;\n }\n checks.push({\n name: \"npm registry connectivity\",\n ok: registryOk,\n detail: registryOk\n ? `${REGISTRY_URL} reachable`\n : `${REGISTRY_URL} unreachable (optional — only affects update checks)`,\n optional: true,\n });\n\n const passed = checks.filter((c) => c.ok).length;\n return { checks, passed, failed: checks.length - passed };\n}\n\nexport function formatDoctorReport(report: DoctorReport): string {\n const lines = report.checks.map(\n (check) => `${check.ok ? \"✓\" : \"✗\"} ${check.name}: ${check.detail}`,\n );\n lines.push(\"\", `${report.passed} passed, ${report.failed} failed`);\n return lines.join(\"\\n\");\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { type LanguageModel, generateText } from \"ai\";\n\nconst IGNORED_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \"out\", \"coverage\"]);\nconst MAX_ENTRIES = 20;\nconst README_HEAD_LINES = 5;\n\nexport interface ProjectFacts {\n name: string | null;\n dirName: string;\n packageManager: string | null;\n scripts: Record<string, string>;\n dependencies: string[];\n devDependencies: string[];\n commands: {\n test: string | null;\n build: string | null;\n lint: string | null;\n typecheck: string | null;\n };\n hasTsconfig: boolean;\n isGitRepo: boolean;\n readmeHead: string[];\n entries: string[];\n}\n\nasync function fileExists(target: string): Promise<boolean> {\n try {\n await fs.access(target);\n return true;\n } catch {\n return false;\n }\n}\n\ninterface PackageJson {\n name?: unknown;\n scripts?: unknown;\n dependencies?: unknown;\n devDependencies?: unknown;\n}\n\nasync function readPackageJson(cwd: string): Promise<PackageJson | null> {\n try {\n const raw = await fs.readFile(path.join(cwd, \"package.json\"), \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n return parsed as PackageJson;\n } catch {\n return null;\n }\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n if (typeof value !== \"object\" || value === null) return {};\n const out: Record<string, string> = {};\n for (const [key, val] of Object.entries(value)) {\n if (typeof val === \"string\") out[key] = val;\n }\n return out;\n}\n\nasync function detectPackageManager(cwd: string): Promise<string | null> {\n if (await fileExists(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (await fileExists(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n if (await fileExists(path.join(cwd, \"package-lock.json\"))) return \"npm\";\n if (await fileExists(path.join(cwd, \"bun.lockb\"))) return \"bun\";\n return null;\n}\n\nfunction inferCommands(\n pm: string | null,\n scripts: Record<string, string>,\n): ProjectFacts[\"commands\"] {\n const runner = pm ?? \"npm\";\n const pick = (script: string): string | null =>\n script in scripts ? `${runner} ${script}` : null;\n return {\n test: pick(\"test\"),\n build: pick(\"build\"),\n lint: pick(\"lint\"),\n typecheck: pick(\"typecheck\"),\n };\n}\n\nasync function listEntries(cwd: string): Promise<string[]> {\n try {\n const dirents = await fs.readdir(cwd, { withFileTypes: true });\n const entries: string[] = [];\n for (const dirent of dirents) {\n if (dirent.isDirectory()) {\n if (IGNORED_DIRS.has(dirent.name)) continue;\n entries.push(`${dirent.name}/`);\n } else if (!dirent.name.startsWith(\".\")) {\n entries.push(dirent.name);\n }\n if (entries.length >= MAX_ENTRIES) break;\n }\n return entries.sort();\n } catch {\n return [];\n }\n}\n\nasync function readReadmeHead(cwd: string): Promise<string[]> {\n for (const name of [\"README.md\", \"readme.md\", \"README\"]) {\n try {\n const raw = await fs.readFile(path.join(cwd, name), \"utf8\");\n return raw\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .slice(0, README_HEAD_LINES);\n } catch {\n // try the next candidate name\n }\n }\n return [];\n}\n\nexport async function scanProject(cwd: string): Promise<ProjectFacts> {\n const pkg = await readPackageJson(cwd);\n const packageManager = await detectPackageManager(cwd);\n const scripts = stringRecord(pkg?.scripts);\n return {\n name: typeof pkg?.name === \"string\" ? pkg.name : null,\n dirName: path.basename(cwd),\n packageManager,\n scripts,\n dependencies: Object.keys(stringRecord(pkg?.dependencies)),\n devDependencies: Object.keys(stringRecord(pkg?.devDependencies)),\n commands: inferCommands(packageManager, scripts),\n hasTsconfig: await fileExists(path.join(cwd, \"tsconfig.json\")),\n isGitRepo: await fileExists(path.join(cwd, \".git\")),\n readmeHead: await readReadmeHead(cwd),\n entries: await listEntries(cwd),\n };\n}\n\nexport function renderAgentsMd(facts: ProjectFacts): string {\n const title = facts.name ?? facts.dirName;\n const lines: string[] = [\n \"# AGENTS.md\",\n \"\",\n \"Guidance for AI agents working in this repository.\",\n \"\",\n \"## Project\",\n \"\",\n facts.readmeHead.length > 0 ? facts.readmeHead.join(\" \") : `${title}`,\n \"\",\n ];\n const commandLines: string[] = [];\n const push = (label: string, command: string | null) => {\n if (command) commandLines.push(`- \\`${command}\\` — ${label}`);\n };\n push(\"run tests\", facts.commands.test);\n push(\"build\", facts.commands.build);\n push(\"lint\", facts.commands.lint);\n push(\"typecheck\", facts.commands.typecheck);\n if (commandLines.length > 0) {\n lines.push(\"## Commands\", \"\", ...commandLines, \"\");\n }\n lines.push(\"## Layout\", \"\");\n for (const entry of facts.entries) {\n lines.push(`- \\`${entry}\\``);\n }\n lines.push(\"\", \"## Conventions\", \"\");\n const conventions: string[] = [];\n if (facts.hasTsconfig) conventions.push(\"TypeScript project (tsconfig.json present).\");\n if (facts.packageManager) conventions.push(`Use ${facts.packageManager} as the package manager.`);\n if (facts.isGitRepo) conventions.push(\"Git repository.\");\n if (facts.dependencies.length > 0) {\n conventions.push(`Key dependencies: ${facts.dependencies.slice(0, 10).join(\", \")}.`);\n }\n if (conventions.length === 0) conventions.push(\"No conventions detected yet — fill this in.\");\n for (const item of conventions) lines.push(`- ${item}`);\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nconst INIT_SYSTEM_PROMPT = [\n \"You are writing an AGENTS.md file that guides AI coding agents working in a repository.\",\n \"You are given scanned project facts as JSON.\",\n \"Produce a concise Markdown document with sections: Project, Commands, Layout, Conventions.\",\n \"Keep commands exactly as given in the facts. Do not invent tools, scripts, or directories.\",\n \"Output only the Markdown, no preamble, no code fences.\",\n].join(\"\\n\");\n\nasync function polishWithModel(facts: ProjectFacts, model: LanguageModel): Promise<string | null> {\n const { text } = await generateText({\n model,\n system: INIT_SYSTEM_PROMPT,\n prompt: `Project facts:\\n\\n${JSON.stringify(facts, null, 2)}\\n\\nWrite the AGENTS.md.`,\n });\n const trimmed = text.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nexport interface InitProjectOptions {\n cwd: string;\n args: string;\n model: LanguageModel | null;\n}\n\nexport interface InitProjectResult {\n message: string;\n written: boolean;\n path: string;\n lines: number;\n usedLlm: boolean;\n}\n\nexport async function initProject(opts: InitProjectOptions): Promise<InitProjectResult> {\n const { cwd, args, model } = opts;\n const target = path.join(cwd, \"AGENTS.md\");\n const force = args.split(/\\s+/).includes(\"force\");\n if (!force && (await fileExists(target))) {\n return {\n message: `AGENTS.md already exists at ${target}. Use /init force to overwrite it.`,\n written: false,\n path: target,\n lines: 0,\n usedLlm: false,\n };\n }\n const facts = await scanProject(cwd);\n let usedLlm = false;\n let content: string;\n let note = \"\";\n if (model) {\n try {\n const polished = await polishWithModel(facts, model);\n if (polished) {\n content = polished.endsWith(\"\\n\") ? polished : `${polished}\\n`;\n usedLlm = true;\n } else {\n content = renderAgentsMd(facts);\n note =\n \" Model returned an empty draft; used the template instead — review and refine manually.\";\n }\n } catch {\n content = renderAgentsMd(facts);\n note = \" Model refinement failed; used the template instead — review and refine manually.\";\n }\n } else {\n content = renderAgentsMd(facts);\n note = \" No model available; used the template — review and refine manually.\";\n }\n await fs.writeFile(target, content);\n const lines = content.split(\"\\n\").length;\n const how = usedLlm ? \"generated with model refinement\" : \"generated from template\";\n return {\n message: `Wrote ${target} (${lines} lines, ${how}).${note}`,\n written: true,\n path: target,\n lines,\n usedLlm,\n };\n}\n","import type { DiffLine } from \"../diff-preview\";\n\nexport interface CommandContext {\n addSystemMessage(text: string): void;\n clearMessages(): void;\n exit(): void;\n listModels(): string;\n switchModel(name: string): Promise<string>;\n listSessions(all?: boolean): Promise<string>;\n resumeSession(id: string): Promise<string>;\n showTodos(): Promise<string>;\n listTasks(): string;\n showUsage(): string;\n showGlobalUsage(): Promise<string>;\n describeConfig(): string;\n compactContext(): Promise<string>;\n exportSession(path: string): Promise<string>;\n undo(): Promise<string>;\n rewind(args: string): Promise<string>;\n permissionMode(args: string): Promise<string>;\n planMode(): Promise<string>;\n initProject(args: string): Promise<string>;\n runDoctor(): Promise<string>;\n submitPrompt?(text: string): void | Promise<void>;\n // Starts a fresh session with a clean context (REPL-only).\n newSession?(): Promise<string>;\n // Deletes stored sessions: current directory by default, every directory\n // when all is true. The live session is kept.\n clearSessions?(all: boolean): Promise<string>;\n // Working directory of the session; commands that shell out (e.g. /commit,\n // /diff) fall back to process.cwd() when the host does not provide it.\n cwd?: string;\n // Renders structured diff lines with per-line colors in the message area.\n showDiff?(text: string, lines: DiffLine[], note?: string): void;\n // Copies text to the system clipboard; resolves false when unavailable.\n copyToClipboard?(text: string): Promise<boolean>;\n // Plain-text conversation for /copy: \"last\" is the latest assistant reply,\n // \"all\" the whole conversation. null when there is nothing to copy.\n conversationText?(scope: \"last\" | \"all\"): string | null;\n}\n\nexport interface SlashCommand {\n name: string;\n description: string;\n usage?: string;\n run(args: string, ctx: CommandContext): void | Promise<void>;\n}\n\nexport class CommandRegistry {\n private commands = new Map<string, SlashCommand>();\n\n register(command: SlashCommand): void {\n this.commands.set(command.name, command);\n }\n\n list(): SlashCommand[] {\n return [...this.commands.values()].sort((a, b) => a.name.localeCompare(b.name));\n }\n\n get(name: string): SlashCommand | undefined {\n return this.commands.get(name);\n }\n\n complete(prefix: string): SlashCommand[] {\n const stripped = prefix.startsWith(\"/\") ? prefix.slice(1) : prefix;\n return this.list().filter((cmd) => cmd.name.startsWith(stripped));\n }\n}\n\nexport interface ParsedCommand {\n name: string;\n args: string;\n}\n\nexport function parseSlashCommand(input: string): ParsedCommand | null {\n if (!input.startsWith(\"/\")) return null;\n const body = input.slice(1).trim();\n if (body.length === 0) return null;\n const spaceIndex = body.search(/\\s/);\n if (spaceIndex === -1) return { name: body, args: \"\" };\n return {\n name: body.slice(0, spaceIndex),\n args: body.slice(spaceIndex).trim(),\n };\n}\n","import path from \"node:path\";\nimport type { FileSnapshot } from \"../../tools/fs/snapshots\";\n\nexport interface RewindPlan {\n target: FileSnapshot;\n affected: FileSnapshot[];\n // Smallest conversation message index among affected snapshots; null when\n // none carries turn context (then a rewind reverts files only).\n messageIndex: number | null;\n}\n\n// Selects the snapshots a rewind to just before checkpoint `id` would revert:\n// the target itself and everything after it.\nexport function planRewind(snapshots: FileSnapshot[], id: number): RewindPlan | null {\n const target = snapshots.find((snapshot) => snapshot.id === id);\n if (!target) return null;\n const affected = snapshots.filter((snapshot) => snapshot.id >= id);\n let messageIndex: number | null = null;\n for (const snapshot of affected) {\n if (snapshot.messageIndex >= 0) {\n messageIndex =\n messageIndex === null\n ? snapshot.messageIndex\n : Math.min(messageIndex, snapshot.messageIndex);\n }\n }\n return { target, affected, messageIndex };\n}\n\nfunction displayPath(filePath: string, cwd: string): string {\n const relative = path.relative(cwd, filePath);\n return relative !== \"\" && !relative.startsWith(\"..\") ? relative : filePath;\n}\n\nfunction formatTime(timestamp: number): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const date = new Date(timestamp);\n return `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n}\n\nexport function formatCheckpointList(snapshots: FileSnapshot[], cwd: string): string {\n if (snapshots.length === 0) {\n return \"No checkpoints yet — checkpoints are recorded on every successful write_file/edit_file.\";\n }\n const lines = snapshots.map((snapshot) => {\n const label = snapshot.existed ? snapshot.toolName : `${snapshot.toolName} (new file)`;\n return `#${snapshot.id} ${formatTime(snapshot.timestamp)} ${label} ${displayPath(snapshot.path, cwd)}`;\n });\n return [\n `Checkpoints (${snapshots.length}):`,\n ...lines,\n \"Use /rewind <n> to restore files and conversation to just before checkpoint n.\",\n ].join(\"\\n\");\n}\n","import { Box, Text, useInput } from \"ink\";\n\nexport type ExitPlanDecision = \"yes\" | \"no\";\n\ninterface ExitPlanPromptProps {\n onDecision(decision: ExitPlanDecision): void;\n}\n\nexport function ExitPlanPrompt({ onDecision }: ExitPlanPromptProps) {\n useInput((input, key) => {\n const ch = input.toLowerCase();\n if (ch === \"y\") onDecision(\"yes\");\n else if (ch === \"n\" || key.escape) onDecision(\"no\");\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text bold color=\"cyan\">\n Plan ready (plan mode)\n </Text>\n <Text>The plan above was produced without making any changes.</Text>\n <Text>[y] approve and execute [n] keep refining (Esc = n)</Text>\n </Box>\n );\n}\n","import { Box, Text, useInput } from \"ink\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { type SlashCommandHint, filterCommands } from \"../commands/suggest\";\nimport { type PathSuggestion, extractAtToken, suggestPaths } from \"../path-suggest\";\n\nexport interface InputRefill {\n text: string;\n seq: number;\n}\n\ninterface InputBoxProps {\n isStreaming: boolean;\n disabled?: boolean;\n commands?: SlashCommandHint[];\n cwd?: string;\n // Refill request (double-Esc edit): when seq changes, the input is replaced.\n refill?: InputRefill;\n onSubmit(text: string): void;\n onInterrupt(): void;\n onExit(): void;\n // Async clipboard-image read (Alt+V / Ctrl+V); staging is the parent's job.\n onPasteImage?(): void;\n}\n\nexport function InputBox({\n isStreaming,\n disabled,\n commands,\n cwd,\n refill,\n onSubmit,\n onInterrupt,\n onExit,\n onPasteImage,\n}: InputBoxProps) {\n const [value, setValue] = useState(\"\");\n const [cursor, setCursor] = useState(0);\n const [history, setHistory] = useState<string[]>([]);\n const [highlight, setHighlight] = useState(0);\n const [suggestionsDismissed, setSuggestionsDismissed] = useState(false);\n const [pathSuggestions, setPathSuggestions] = useState<PathSuggestion[]>([]);\n const historyIndexRef = useRef<number | null>(null);\n const draftRef = useRef(\"\");\n const refillSeqRef = useRef(0);\n\n const edit = (next: string, nextCursor: number) => {\n setValue(next);\n setCursor(Math.max(0, Math.min(nextCursor, next.length)));\n setHighlight(0);\n setSuggestionsDismissed(false);\n };\n\n useEffect(() => {\n if (refill && refill.seq !== refillSeqRef.current) {\n refillSeqRef.current = refill.seq;\n edit(refill.text, refill.text.length);\n }\n });\n\n const suggestionsEnabled = !isStreaming && !disabled && !suggestionsDismissed;\n const suggestions = suggestionsEnabled && commands ? filterCommands(value, commands) : [];\n\n useEffect(() => {\n if (!suggestionsEnabled || !cwd) {\n setPathSuggestions([]);\n return;\n }\n const token = extractAtToken(value, cursor);\n if (!token) {\n setPathSuggestions([]);\n return;\n }\n let cancelled = false;\n void suggestPaths(token.token, cwd).then((result) => {\n if (!cancelled) setPathSuggestions(result);\n });\n return () => {\n cancelled = true;\n };\n }, [value, cursor, cwd, suggestionsEnabled]);\n\n const showPathSuggestions = suggestions.length === 0 && pathSuggestions.length > 0;\n const suggestionCount = suggestions.length > 0 ? suggestions.length : pathSuggestions.length;\n const activeIndex = suggestionCount === 0 ? 0 : Math.min(highlight, suggestionCount - 1);\n\n const completeHighlighted = () => {\n if (suggestions.length > 0) {\n const cmd = suggestions[activeIndex];\n if (!cmd) return;\n const text = `/${cmd.name} `;\n edit(text, text.length);\n return;\n }\n const sugg = pathSuggestions[activeIndex];\n const token = extractAtToken(value, cursor);\n if (!sugg || !token) return;\n const replacement = `@${sugg.path}${sugg.isDir ? \"\" : \" \"}`;\n edit(\n value.slice(0, token.start) + replacement + value.slice(token.end),\n token.start + replacement.length,\n );\n };\n\n useInput((input, key) => {\n if (key.ctrl && input === \"c\") {\n if (isStreaming || disabled) {\n onInterrupt();\n } else {\n edit(\"\", 0);\n historyIndexRef.current = null;\n }\n return;\n }\n if (key.ctrl && input === \"d\") {\n onExit();\n return;\n }\n // Alt+V is the reliable binding: Windows Terminal (and cmd's conhost)\n // intercept Ctrl+V as their own paste, so the key never reaches us.\n if ((key.meta || key.ctrl) && input === \"v\") {\n onPasteImage?.();\n return;\n }\n if (disabled) return;\n if (key.escape) {\n // While streaming, Esc is the Repl-level interrupt; idle Esc only\n // dismisses suggestions here (double-Esc editing lives in the Repl).\n if (!isStreaming && suggestionCount > 0) setSuggestionsDismissed(true);\n return;\n }\n if (key.return) {\n const text = value.trim();\n if (text.length > 0) {\n setHistory((prev) => [...prev, text]);\n onSubmit(text);\n }\n edit(\"\", 0);\n historyIndexRef.current = null;\n draftRef.current = \"\";\n return;\n }\n if (key.tab) {\n // Shift+Tab cycles permission modes at the Repl level; never complete.\n if (key.shift) return;\n if (suggestionCount > 0) {\n completeHighlighted();\n return;\n }\n } else if (key.upArrow) {\n if (suggestionCount > 0) {\n setHighlight((prev) => (prev - 1 + suggestionCount) % suggestionCount);\n return;\n }\n if (history.length === 0) return;\n if (historyIndexRef.current === null) {\n draftRef.current = value;\n historyIndexRef.current = history.length - 1;\n } else if (historyIndexRef.current > 0) {\n historyIndexRef.current -= 1;\n }\n const entry = history[historyIndexRef.current] ?? \"\";\n edit(entry, entry.length);\n return;\n } else if (key.downArrow) {\n if (suggestionCount > 0) {\n setHighlight((prev) => (prev + 1) % suggestionCount);\n return;\n }\n if (historyIndexRef.current === null) return;\n if (historyIndexRef.current < history.length - 1) {\n historyIndexRef.current += 1;\n const entry = history[historyIndexRef.current] ?? \"\";\n edit(entry, entry.length);\n } else {\n historyIndexRef.current = null;\n edit(draftRef.current, draftRef.current.length);\n }\n return;\n } else if (key.leftArrow) {\n setCursor((prev) => Math.max(0, prev - 1));\n return;\n } else if (key.rightArrow) {\n if (suggestionCount > 0 && cursor === value.length) {\n completeHighlighted();\n } else {\n setCursor((prev) => Math.min(value.length, prev + 1));\n }\n return;\n }\n if (key.ctrl && input === \"a\") {\n setCursor(0);\n return;\n }\n if (key.ctrl && input === \"e\") {\n setCursor(value.length);\n return;\n }\n if (key.ctrl && input === \"u\") {\n edit(value.slice(cursor), 0);\n return;\n }\n if (key.ctrl && input === \"k\") {\n edit(value.slice(0, cursor), cursor);\n return;\n }\n if (key.ctrl && input === \"w\") {\n const trimmed = value.slice(0, cursor).replace(/\\s+$/, \"\");\n const wordStart = trimmed.search(/\\S+$/);\n const next = value.slice(0, wordStart === -1 ? 0 : wordStart) + value.slice(cursor);\n edit(next, wordStart === -1 ? 0 : wordStart);\n return;\n }\n // Ink maps both \\b and \\x7f/Delete-key to backspace/delete; real terminals send\n // \\x7f for Backspace, so both act as delete-before-cursor here.\n if (key.backspace || key.delete) {\n if (cursor === 0) return;\n edit(value.slice(0, cursor - 1) + value.slice(cursor), cursor - 1);\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n edit(value.slice(0, cursor) + input + value.slice(cursor), cursor + input.length);\n }\n });\n\n const before = value.slice(0, cursor);\n const at = value[cursor] ?? \" \";\n const after = value.slice(cursor + 1);\n\n return (\n <Box flexDirection=\"column\">\n <Box borderStyle=\"round\" borderColor=\"gray\" paddingX={1}>\n <Text color=\"cyan\">{\"> \"}</Text>\n <Text>{before}</Text>\n <Text inverse>{at}</Text>\n <Text>{after}</Text>\n </Box>\n {suggestions.length > 0 && (\n <Box flexDirection=\"column\" paddingLeft={2}>\n {suggestions.map((cmd, index) =>\n index === activeIndex ? (\n <Text key={cmd.name} bold inverse>{`/${cmd.name} - ${cmd.description}`}</Text>\n ) : (\n <Text key={cmd.name}>\n <Text color=\"cyan\">{`/${cmd.name}`}</Text>\n <Text dimColor>{` - ${cmd.description}`}</Text>\n </Text>\n ),\n )}\n </Box>\n )}\n {showPathSuggestions && (\n <Box flexDirection=\"column\" paddingLeft={2}>\n {pathSuggestions.map((sugg, index) =>\n index === activeIndex ? (\n <Text key={sugg.path} bold inverse>{`@${sugg.path}`}</Text>\n ) : (\n <Text key={sugg.path}>\n <Text color=\"cyan\">{`@${sugg.path}`}</Text>\n {sugg.isDir && <Text dimColor> - directory</Text>}\n </Text>\n ),\n )}\n </Box>\n )}\n </Box>\n );\n}\n","export interface SlashCommandHint {\n name: string;\n description: string;\n}\n\nexport const MAX_SUGGESTIONS = 5;\n\nexport function filterCommands(input: string, commands: SlashCommandHint[]): SlashCommandHint[] {\n if (!input.startsWith(\"/\")) return [];\n if (/\\s/.test(input)) return [];\n const prefix = input.slice(1).toLowerCase();\n return commands\n .filter((cmd) => cmd.name.toLowerCase().startsWith(prefix))\n .sort((a, b) => a.name.localeCompare(b.name))\n .slice(0, MAX_SUGGESTIONS);\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { SKIP_DIRS } from \"../tools/fs/util\";\nimport { MAX_SUGGESTIONS } from \"./commands/suggest\";\n\n// Lazy scan: only the single directory the typed prefix points into is read,\n// and no more than this many entries are examined per lookup.\nexport const MAX_SCAN_ENTRIES = 2000;\n\nexport interface AtToken {\n // Path prefix typed after the \"@\".\n token: string;\n // Index of the \"@\" in the input value.\n start: number;\n // Cursor position (end of the token).\n end: number;\n}\n\n// The \"@token\" immediately before the cursor: preceded by start-of-input or\n// whitespace, with no whitespace inside the token itself.\nexport function extractAtToken(value: string, cursor: number): AtToken | null {\n const before = value.slice(0, cursor);\n const match = /(?:^|\\s)@(\\S*)$/.exec(before);\n if (!match) return null;\n const token = match[1] ?? \"\";\n return { token, start: cursor - token.length - 1, end: cursor };\n}\n\nexport interface PathSuggestion {\n // Path relative to cwd; directories carry a trailing \"/\" so Tab descends.\n path: string;\n isDir: boolean;\n}\n\nexport async function suggestPaths(\n token: string,\n cwd: string,\n maxScanEntries: number = MAX_SCAN_ENTRIES,\n maxSuggestions: number = MAX_SUGGESTIONS,\n): Promise<PathSuggestion[]> {\n const normalized = token.replace(/\\\\/g, \"/\");\n const slash = normalized.lastIndexOf(\"/\");\n const dirPart = slash >= 0 ? normalized.slice(0, slash + 1) : \"\";\n const basePrefix = slash >= 0 ? normalized.slice(slash + 1) : normalized;\n if (dirPart.split(\"/\").some((segment) => SKIP_DIRS.has(segment))) return [];\n const dirAbs = path.resolve(cwd, dirPart === \"\" ? \".\" : dirPart);\n const entries = await readdir(dirAbs, { withFileTypes: true }).catch(() => null);\n if (!entries) return [];\n const lower = basePrefix.toLowerCase();\n const matches: PathSuggestion[] = [];\n let scanned = 0;\n for (const entry of entries) {\n if (scanned >= maxScanEntries) break;\n scanned += 1;\n const isDir = entry.isDirectory();\n if (!isDir && !entry.isFile()) continue;\n if (isDir && SKIP_DIRS.has(entry.name)) continue;\n if (entry.name.startsWith(\".\") && !basePrefix.startsWith(\".\")) continue;\n if (!entry.name.toLowerCase().startsWith(lower)) continue;\n matches.push({ path: `${dirPart}${entry.name}${isDir ? \"/\" : \"\"}`, isDir });\n }\n matches.sort((a, b) => a.path.localeCompare(b.path));\n return matches.slice(0, maxSuggestions);\n}\n","import { Box, Static, Text } from \"ink\";\nimport { memo } from \"react\";\nimport type { DiffLine } from \"../diff-preview\";\nimport { DiffLines } from \"./DiffLines\";\n\nexport interface DisplayMessage {\n id: number;\n role: \"user\" | \"assistant\" | \"assistant-cont\" | \"system\" | \"tool\";\n text: string;\n note?: string;\n // Structured diff lines (e.g. from /diff) rendered with per-line colors\n // below the message text instead of as one flat block.\n diff?: DiffLine[];\n // tight = no bottom margin; used for mid-turn continuation chunks so a\n // long streamed answer committed in pieces still reads as one block.\n tight?: boolean;\n}\n\nconst roleStyles: Record<\n Exclude<DisplayMessage[\"role\"], \"assistant-cont\">,\n { label: string; color: string }\n> = {\n user: { label: \"you\", color: \"cyan\" },\n assistant: { label: \"star\", color: \"green\" },\n system: { label: \"system\", color: \"yellow\" },\n tool: { label: \"tool\", color: \"magenta\" },\n};\n\nexport const MessageList = memo(function MessageList({ messages }: { messages: DisplayMessage[] }) {\n return (\n <Static items={messages}>\n {(message) => {\n const marginBottom = message.tight ? 0 : 1;\n if (message.role === \"assistant-cont\") {\n return (\n <Box key={message.id} flexDirection=\"column\" marginBottom={marginBottom}>\n <Text color=\"green\">{message.text}</Text>\n </Box>\n );\n }\n const style = roleStyles[message.role];\n return (\n <Box key={message.id} flexDirection=\"column\" marginBottom={marginBottom}>\n <Text bold color={style.color}>\n {style.label}\n </Text>\n <Text color={style.color}>{message.text}</Text>\n {message.diff && <DiffLines lines={message.diff} />}\n {message.note && <Text dimColor>{message.note}</Text>}\n </Box>\n );\n }}\n </Static>\n );\n});\n","import { Text } from \"ink\";\nimport type { DiffLine } from \"../diff-preview\";\n\nexport function DiffLineView({ line }: { line: DiffLine }) {\n if (line.kind === \"add\") return <Text color=\"green\">+ {line.text}</Text>;\n if (line.kind === \"del\") return <Text color=\"red\">- {line.text}</Text>;\n if (line.kind === \"marker\") return <Text dimColor>{line.text}</Text>;\n return <Text dimColor> {line.text}</Text>;\n}\n\nexport function DiffLines({ lines }: { lines: DiffLine[] }) {\n return (\n <>\n {lines.map((line, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: diff lines have no stable identity\n <DiffLineView key={index} line={line} />\n ))}\n </>\n );\n}\n","import { Box, Text, useInput } from \"ink\";\nimport type { PermissionRequest } from \"../../permissions/types\";\nimport type { DiffPreview } from \"../diff-preview\";\nimport { summarizeArgs } from \"../format\";\nimport { DiffLines } from \"./DiffLines\";\n\nexport type PermissionDecision = \"yes\" | \"no\" | \"always\";\n\ninterface PermissionPromptProps {\n request: PermissionRequest;\n preview?: DiffPreview | null;\n onDecision(decision: PermissionDecision): void;\n}\n\nexport function PermissionPrompt({ request, preview, onDecision }: PermissionPromptProps) {\n useInput((input) => {\n const ch = input.toLowerCase();\n if (ch === \"y\") onDecision(\"yes\");\n else if (ch === \"n\") onDecision(\"no\");\n else if (ch === \"a\") onDecision(\"always\");\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"yellow\" paddingX={1}>\n <Text bold color=\"yellow\">\n Permission required: {request.toolName} ({request.level})\n </Text>\n {preview ? (\n <Box flexDirection=\"column\">\n <Text dimColor>\n {preview.type === \"new-file\" ? \"New file: \" : \"\"}\n {preview.label}\n </Text>\n <DiffLines lines={preview.lines} />\n </Box>\n ) : (\n <Text>{summarizeArgs(request.args)}</Text>\n )}\n <Text>[y] allow [n] deny [a] always (saved to config)</Text>\n </Box>\n );\n}\n","import { Box, Text, useInput } from \"ink\";\n\nexport type RewindDecision = \"yes\" | \"no\";\n\ninterface RewindConfirmPromptProps {\n summary: string;\n onDecision(decision: RewindDecision): void;\n}\n\nexport function RewindConfirmPrompt({ summary, onDecision }: RewindConfirmPromptProps) {\n useInput((input, key) => {\n const ch = input.toLowerCase();\n if (ch === \"y\") onDecision(\"yes\");\n else if (ch === \"n\" || key.escape) onDecision(\"no\");\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"yellow\" paddingX={1}>\n <Text bold color=\"yellow\">\n Rewind checkpoints\n </Text>\n <Text>{summary}</Text>\n <Text>[y] rewind [n] cancel (Esc = n)</Text>\n </Box>\n );\n}\n","import { Box, Text, useStdout } from \"ink\";\nimport { memo } from \"react\";\nimport { formatDollars } from \"../cost\";\n\ninterface StatusBarProps {\n cwd: string;\n model: string;\n permissionMode: string;\n tokens: number;\n // Git branch, refreshed on turn boundaries by the parent (null = not a repo).\n gitBranch?: string | null;\n // Context window usage in percent; null when unknown (non-loop backend).\n contextPercent?: number | null;\n sessionCostUsd?: number | null;\n // Labels of currently running background tasks (description or command).\n backgroundTasks?: string[];\n}\n\nconst BG_LABEL_MAX = 40;\nconst WIDE_COLUMNS = 120;\n\nfunction cwdLabel(cwd: string, wide: boolean): string {\n if (wide) return cwd;\n const base = cwd\n .replace(/[\\\\/]+$/, \"\")\n .split(/[\\\\/]/)\n .pop();\n return base && base.length > 0 ? base : cwd;\n}\n\nexport const StatusBar = memo(function StatusBar({\n cwd,\n model,\n permissionMode,\n tokens,\n gitBranch,\n contextPercent,\n sessionCostUsd,\n backgroundTasks = [],\n}: StatusBarProps) {\n const { stdout } = useStdout();\n const wide = (stdout?.columns ?? 80) >= WIDE_COLUMNS;\n const joined = backgroundTasks.join(\", \");\n const labels = joined.length > BG_LABEL_MAX ? `${joined.slice(0, BG_LABEL_MAX)}…` : joined;\n return (\n <Box justifyContent=\"space-between\">\n <Text dimColor>\n {cwdLabel(cwd, wide)}\n {gitBranch ? ` [${gitBranch}]` : \"\"}\n </Text>\n {backgroundTasks.length > 0 && (\n <Text color=\"yellow\">\n bg: {backgroundTasks.length} ({labels})\n </Text>\n )}\n <Text dimColor>model: {model}</Text>\n {contextPercent != null && <Text dimColor>ctx: {contextPercent}%</Text>}\n {sessionCostUsd != null && sessionCostUsd > 0 && (\n <Text dimColor>${formatDollars(sessionCostUsd)}</Text>\n )}\n <Text dimColor>{tokens} tokens</Text>\n <Text dimColor>mode: {permissionMode}</Text>\n </Box>\n );\n});\n","import { Box, Text } from \"ink\";\nimport { memo } from \"react\";\n\nexport const StreamingMessage = memo(function StreamingMessage({\n text,\n continuation,\n}: { text: string; continuation?: boolean }) {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n {!continuation && (\n <Text bold color=\"green\">\n star\n </Text>\n )}\n <Text color=\"green\">{text}</Text>\n </Box>\n );\n});\n","import { Box, Text } from \"ink\";\n\nexport const SPINNER_FRAMES = [\"-\", \"\\\\\", \"|\", \"/\"];\nexport const REASONING_TAIL_LENGTH = 200;\nexport const THOUGHT_SUMMARY_LENGTH = 100;\n\nexport function truncateTail(text: string, max: number): string {\n const flat = text.replace(/\\s+/g, \" \").trim();\n if (flat.length <= max) return flat;\n return `…${flat.slice(flat.length - max)}`;\n}\n\n// The spinner frame is driven by the caller's render ticker (see cli/ticker.ts);\n// keeping no internal interval avoids a second full-tree Ink rewrite per frame.\n// `activity` replaces the default label, e.g. while a tool call is executing.\nexport function ThinkingIndicator({\n reasoning,\n frame = 0,\n activity,\n}: { reasoning?: string; frame?: number; activity?: string }) {\n const tail = reasoning ? truncateTail(reasoning, REASONING_TAIL_LENGTH) : \"\";\n const spinner = SPINNER_FRAMES[frame % SPINNER_FRAMES.length];\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>\n {spinner} {activity ?? \"star is thinking…\"}\n </Text>\n {tail !== \"\" && <Text dimColor> {tail}</Text>}\n </Box>\n );\n}\n","import { previewLines } from \"../format\";\n\nexport interface ToolCardData {\n id: string;\n name: string;\n argsSummary: string;\n result?: string;\n isError?: boolean;\n}\n\nexport function formatToolCard(card: ToolCardData): string {\n const header = `${card.name} ${card.argsSummary}${card.isError ? \" [error]\" : \"\"}`;\n if (card.result === undefined) return header;\n const preview = previewLines(card.result, 10);\n return `${header}\\n${preview.text}${preview.truncated ? \"\\n... (truncated)\" : \"\"}`;\n}\n","export const DOUBLE_ESC_WINDOW_MS = 600;\n\n// Two Esc presses within the window (while idle) trigger edit-last-message.\nexport function isDoubleEscape(\n previous: number | null,\n now: number,\n windowMs: number = DOUBLE_ESC_WINDOW_MS,\n): boolean {\n return previous !== null && now - previous <= windowMs;\n}\n","export const BELL = \"\\x07\";\n\nexport interface NotifyBellInput {\n enabled: boolean;\n thresholdSec: number;\n noNotifyEnv: boolean;\n interrupted?: boolean;\n // Turn duration; omit for events with no meaningful threshold (background\n // task completion always qualifies).\n elapsedMs?: number;\n}\n\nexport function shouldNotifyBell(input: NotifyBellInput, isTTY: boolean): boolean {\n if (!input.enabled || input.noNotifyEnv || !isTTY) return false;\n if (input.interrupted) return false;\n if (input.elapsedMs !== undefined && input.elapsedMs < input.thresholdSec * 1000) return false;\n return true;\n}\n\nexport interface NotifyBellDeps {\n write?: (text: string) => void;\n isTTY?: boolean;\n}\n\nexport function notifyBell(input: NotifyBellInput, deps: NotifyBellDeps = {}): boolean {\n const isTTY = deps.isTTY ?? Boolean(process.stdout.isTTY);\n if (!shouldNotifyBell(input, isTTY)) return false;\n (deps.write ?? ((text: string) => process.stdout.write(text)))(BELL);\n return true;\n}\n","import type { ImageInput } from \"../core/messages\";\n\nexport interface QueuedPrompt {\n // Stable id for keyed rendering of the queued list.\n id: number;\n text: string;\n images: ImageInput[];\n}\n\n// FIFO typeahead queue: prompts submitted while a turn is streaming wait here\n// and are auto-sent (in order) once the turn finishes.\nexport class PromptQueue {\n private items: QueuedPrompt[] = [];\n private nextId = 1;\n\n enqueue(prompt: { text: string; images: ImageInput[] }): number {\n this.items.push({ id: this.nextId++, ...prompt });\n return this.items.length;\n }\n\n dequeue(): QueuedPrompt | undefined {\n return this.items.shift();\n }\n\n // Empties the queue and returns what was dropped (for the \"cleared N\" note).\n clear(): QueuedPrompt[] {\n const removed = this.items;\n this.items = [];\n return removed;\n }\n\n get size(): number {\n return this.items.length;\n }\n\n list(): QueuedPrompt[] {\n return [...this.items];\n }\n}\n","import { isDangerousCommand } from \"../permissions/gate\";\nimport { bashTool } from \"../tools/bash\";\n\nexport const SHELL_BANG_DISPLAY_MAX_CHARS = 3000;\n\nexport type ShellBangOutcome =\n | {\n ok: true;\n command: string;\n output: string;\n isError: boolean;\n contextMessage: string;\n }\n | { ok: false; reason: \"empty\" | \"dangerous\" };\n\nexport function truncateShellOutput(\n output: string,\n max: number = SHELL_BANG_DISPLAY_MAX_CHARS,\n): string {\n if (output.length <= max) return output;\n const half = Math.floor(max / 2);\n return `${output.slice(0, half)}\\n... [${output.length - max} characters truncated] ...\\n${output.slice(-half)}`;\n}\n\nexport function buildShellContextMessage(command: string, output: string): string {\n return `The user ran \\`!${command}\\` directly in the shell (no permission prompt). Output:\\n${output}`;\n}\n\nexport async function executeShellBang(\n raw: string,\n cwd: string,\n signal?: AbortSignal,\n): Promise<ShellBangOutcome> {\n const command = raw.trim();\n if (!command) return { ok: false, reason: \"empty\" };\n if (isDangerousCommand(command)) return { ok: false, reason: \"dangerous\" };\n const result = await bashTool.execute({ command }, { cwd, abortSignal: signal });\n const output = truncateShellOutput(result.content);\n return {\n ok: true,\n command,\n output,\n isError: result.isError ?? false,\n contextMessage: buildShellContextMessage(command, output),\n };\n}\n","export const TICK_MS = 100;\n\nexport interface FlushState {\n streamed: string;\n reasoning: string;\n}\n\n// Returns the next flush state, or null when nothing changed since prev,\n// so callers can skip the state update (and the full Ink re-render) entirely.\nexport function nextFlush(prev: FlushState, next: FlushState): FlushState | null {\n if (prev.streamed === next.streamed && prev.reasoning === next.reasoning) return null;\n return next;\n}\n\n// Single render ticker: one interval drives both stream flushes and the\n// spinner frame. Returns a stop function; the callback receives the tick count.\nexport function startTicker(onTick: (tick: number) => void, intervalMs = TICK_MS): () => void {\n let tick = 0;\n const timer = setInterval(() => {\n tick += 1;\n onTick(tick);\n }, intervalMs);\n return () => clearInterval(timer);\n}\n","const REGISTRY_URL = \"https://registry.npmjs.org/@cryer%2fstar-cli/latest\";\nconst TIMEOUT_MS = 5000;\n\nexport interface FetchResponse {\n ok: boolean;\n json(): Promise<unknown>;\n}\n\nexport type UpdateFetcher = (url: string) => Promise<FetchResponse>;\n\nasync function defaultFetcher(url: string): Promise<FetchResponse> {\n return fetch(url, { signal: AbortSignal.timeout(TIMEOUT_MS) });\n}\n\nexport function isNewerVersion(latest: string, current: string): boolean {\n const parse = (v: string) =>\n v\n .split(\".\")\n .slice(0, 3)\n .map((part) => Number.parseInt(part, 10));\n const a = parse(latest);\n const b = parse(current);\n for (let i = 0; i < 3; i++) {\n const x = a[i] ?? 0;\n const y = b[i] ?? 0;\n if (Number.isNaN(x) || Number.isNaN(y)) return false;\n if (x !== y) return x > y;\n }\n return false;\n}\n\nexport async function checkForUpdate(\n currentVersion: string,\n fetcher: UpdateFetcher = defaultFetcher,\n): Promise<string | null> {\n try {\n const res = await fetcher(REGISTRY_URL);\n if (!res.ok) return null;\n const data: unknown = await res.json();\n const latest =\n typeof data === \"object\" && data !== null ? (data as { version?: unknown }).version : null;\n if (typeof latest !== \"string\" || !isNewerVersion(latest, currentVersion)) return null;\n return `New version available: ${currentVersion} -> ${latest} — run: npm i -g @cryer/star-cli`;\n } catch {\n return null;\n }\n}\n","import fs from \"node:fs\";\nimport { parse } from \"smol-toml\";\nimport { globalConfigPath, projectConfigPath } from \"./paths\";\nimport { type CliOverrides, ConfigSchema, type StarConfig } from \"./schema\";\n\nconst PartialConfigSchema = ConfigSchema.partial();\n\ntype PartialConfig = ReturnType<typeof PartialConfigSchema.parse>;\n\nfunction parseTomlFile(content: string, filePath: string): PartialConfig {\n let raw: unknown;\n try {\n raw = parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to parse TOML in ${filePath}: ${message}`);\n }\n const result = PartialConfigSchema.safeParse(raw);\n if (!result.success) {\n throw new Error(`Invalid config in ${filePath}: ${result.error.message}`);\n }\n return result.data;\n}\n\nfunction mergeConfig(base: PartialConfig, override: PartialConfig): PartialConfig {\n return { ...base, ...override };\n}\n\nfunction applyOverrides(config: PartialConfig, overrides?: CliOverrides): PartialConfig {\n if (!overrides) return config;\n const merged = { ...config };\n if (overrides.model !== undefined) merged.defaultModel = overrides.model;\n if (overrides.permissionMode !== undefined) merged.permissionMode = overrides.permissionMode;\n return merged;\n}\n\nasync function readTomlFile(filePath: string): Promise<PartialConfig> {\n let content: string;\n try {\n content = await fs.promises.readFile(filePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return {};\n throw error;\n }\n return parseTomlFile(content, filePath);\n}\n\nfunction readTomlFileSync(filePath: string): PartialConfig {\n if (!fs.existsSync(filePath)) return {};\n const content = fs.readFileSync(filePath, \"utf8\");\n return parseTomlFile(content, filePath);\n}\n\nexport async function loadConfig(cwd: string, overrides?: CliOverrides): Promise<StarConfig> {\n const global = await readTomlFile(globalConfigPath());\n const project = await readTomlFile(projectConfigPath(cwd));\n const merged = applyOverrides(mergeConfig(global, project), overrides);\n return ConfigSchema.parse(merged);\n}\n\nexport function loadConfigSync(cwd: string, overrides?: CliOverrides): StarConfig {\n const global = readTomlFileSync(globalConfigPath());\n const project = readTomlFileSync(projectConfigPath(cwd));\n const merged = applyOverrides(mergeConfig(global, project), overrides);\n return ConfigSchema.parse(merged);\n}\n"],"mappings":"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","names":["st","buf","Box","Text","useInput","useEffect","useRef","useState","path","path","fs","path","fs","path","fs","path","path","fs","removed","fs","path","fs","path","fs","path","fs","path","readFile","path","buf","fs","path","path","fs","readFile","path","i","j","path","path","fs","path","fs","path","fs","path","fileExists","path","Box","Text","useInput","path","path","jsx","jsxs","useInput","Box","Text","Box","Text","Text","jsx","jsxs","jsx","jsxs","MessageList","Box","Text","Box","Text","useInput","jsx","jsxs","useInput","Box","Text","Box","Text","useInput","jsx","jsxs","Box","Text","memo","jsxs","memo","StatusBar","tokens","Box","Text","Box","Text","memo","jsx","jsxs","StreamingMessage","Box","Text","jsxs","REGISTRY_URL","defaultFetcher","parse","jsx","jsxs","useState","useRef","useEffect","useInput","messages","model","Box","Text","fs","parse","parse","fs"]}
1
+ {"version":3,"sources":["../src/main.tsx","../src/cli/format.ts","../src/cli/mentions.ts","../src/cli/print-json.ts","../src/cli/repl.tsx","../src/config/save.ts","../src/config/schema.ts","../src/llm/provider.ts","../src/llm/registry.ts","../src/session/checkpoints.ts","../src/session/clear.ts","../src/session/store.ts","../src/session/list.ts","../src/session/resume.ts","../src/cli/cost.ts","../src/session/usage.ts","../src/version.ts","../src/cli/budget.ts","../src/cli/clipboard.ts","../src/cli/commands/actions.ts","../src/cli/commands/builtin.ts","../src/session/search.ts","../src/cli/diff-preview.ts","../src/cli/commands/custom.ts","../src/cli/commands/doctor.ts","../src/cli/commands/init-project.ts","../src/cli/commands/registry.ts","../src/cli/commands/rewind.ts","../src/cli/commands/suggest.ts","../src/cli/components/ExitPlanPrompt.tsx","../src/cli/components/InputBox.tsx","../src/cli/path-suggest.ts","../src/cli/components/MessageList.tsx","../src/cli/components/DiffLines.tsx","../src/cli/components/PermissionPrompt.tsx","../src/cli/components/RewindConfirmPrompt.tsx","../src/cli/components/SelectPrompt.tsx","../src/cli/components/StatusBar.tsx","../src/cli/components/StreamingMessage.tsx","../src/cli/components/ThinkingIndicator.tsx","../src/cli/components/TodoPanel.tsx","../src/cli/components/ToolCallCard.tsx","../src/cli/double-esc.ts","../src/cli/history.ts","../src/cli/notify.ts","../src/cli/queue.ts","../src/cli/shell-bang.ts","../src/cli/ticker.ts","../src/cli/update-check.ts","../src/config/loader.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { defaultAgentTasks } from \"./agent/agent-tasks\";\nimport { AgentLoop } from \"./agent/loop\";\nimport { formatStreamError } from \"./cli/format\";\nimport { MAX_IMAGE_BYTES, imageMimeType, readImageInput, resolveMentions } from \"./cli/mentions\";\nimport { UsageTracker, eventToJsonLine } from \"./cli/print-json\";\nimport { renderRepl } from \"./cli/repl\";\nimport { loadConfigSync } from \"./config/loader\";\nimport { type StarConfig, contextWindowTokens } from \"./config/schema\";\nimport type { CoreMessage, ImageInput } from \"./core/messages\";\nimport { createModel } from \"./llm/provider\";\nimport { loadSessionSnapshots } from \"./session/checkpoints\";\nimport { clearSessions } from \"./session/clear\";\nimport {\n findLatestSession,\n formatSessionEntries,\n listSessionEntries,\n resolveSessionId,\n} from \"./session/list\";\nimport { resumeSession } from \"./session/resume\";\nimport { type SessionMeta, SessionStore } from \"./session/store\";\nimport { defaultTaskManager } from \"./tasks/manager\";\nimport { createDefaultRegistry } from \"./tools\";\nimport { hydrateSnapshots } from \"./tools/fs/snapshots\";\nimport { VERSION } from \"./version\";\n\nconst SYSTEM_PROMPT = `You are Star CLI, an AI coding agent running in the user's terminal.\nYou help with software engineering tasks: reading, writing and editing code, running shell commands, and managing todos.\nBe concise and direct. Use tools when they help accomplish the task.\nFor any task with two or more steps, start by creating a todo list with todo_write and keep it updated as you progress; only mark an item completed after you have verified its result.\nThe working directory is the user's project root; never touch files outside it without explicit instruction.\nFor conversion, batch-processing, or other scriptable tasks, write a script file into the working directory and run it instead of pasting long inline code into the shell; once the script's output is verified, delete the script unless the user asked to keep it.\nWhen a tool call or command fails, read the error output, work out the cause, and try again with a corrected or alternative approach — never repeat an identical failing call without changing something.\nNever consider the task finished until you have verified the result yourself: run the tests, the build, or a check command that proves the output is correct, and if verification fails or reveals gaps, keep fixing until it passes.\nDo not end your turn while the task is still incomplete; keep going until it is done or you are genuinely blocked, and if you are blocked, state exactly what is missing.\nNever end a reply by announcing what you will do next — either do it now with tool calls, or do not mention it. Narrating future actions is not progress.`;\n\nasync function createLoop(\n config: StarConfig,\n modelName: string,\n cwd: string,\n sessionStore: SessionStore | null,\n) {\n const model = createModel(config, modelName);\n const registry = createDefaultRegistry();\n return new AgentLoop({\n model,\n registry,\n config,\n cwd,\n system: SYSTEM_PROMPT,\n sessionStore,\n contextMaxTokens: contextWindowTokens(config, modelName),\n });\n}\n\nasync function printMode(\n loop: AgentLoop,\n prompt: string,\n cwd: string,\n json: boolean,\n imagePaths: string[],\n): Promise<number> {\n const flagImages: ImageInput[] = [];\n for (const imagePath of imagePaths) {\n if (!imageMimeType(imagePath)) {\n process.stderr.write(\n `[error] unsupported image type: ${imagePath} (supported: png, jpg, jpeg, gif, webp)\\n`,\n );\n return 1;\n }\n const image = await readImageInput(imagePath, cwd);\n if (!image) {\n process.stderr.write(\n `[error] cannot read image: ${imagePath} (missing, unreadable, or larger than ${MAX_IMAGE_BYTES / (1024 * 1024)}MB)\\n`,\n );\n return 1;\n }\n flagImages.push(image);\n }\n const controller = new AbortController();\n process.on(\"SIGINT\", () => controller.abort());\n loop.onHookWarning = (message) => {\n process.stderr.write(`[hook] ${message}\\n`);\n };\n const resolved = await resolveMentions(prompt, cwd);\n if (resolved.attached.length > 0) {\n process.stderr.write(`[attached] ${resolved.attached.join(\", \")}\\n`);\n }\n for (const skip of resolved.skipped) {\n process.stderr.write(`[skipped] @${skip.path}: ${skip.reason}\\n`);\n }\n const images = [...flagImages, ...resolved.images];\n const input: string | { text: string; images: ImageInput[] } =\n images.length > 0 ? { text: resolved.input, images } : resolved.input;\n const usage = new UsageTracker();\n let exitCode = 0;\n try {\n for await (const event of loop.stream(input, controller.signal, {\n persistAs: prompt,\n })) {\n if (json) {\n const line = eventToJsonLine(event);\n if (line) process.stdout.write(`${line}\\n`);\n }\n switch (event.type) {\n case \"text-delta\":\n if (!json) process.stdout.write(event.text);\n break;\n case \"reasoning\":\n break;\n case \"tool-call\":\n if (!json) process.stderr.write(`\\n[tool] ${event.name} ${JSON.stringify(event.args)}\\n`);\n break;\n case \"tool-result\": {\n if (!json) {\n const preview =\n event.content.length > 500\n ? `${event.content.slice(0, 500)}... (truncated)`\n : event.content;\n process.stderr.write(`[result] ${event.isError ? \"ERROR: \" : \"\"}${preview}\\n`);\n }\n break;\n }\n case \"finish\":\n usage.add(event.usage);\n break;\n case \"retry\":\n if (!json)\n process.stderr.write(\n `\\n[retry ${event.attempt}/${event.maxAttempts}] ${event.reason}\\n`,\n );\n break;\n case \"notice\":\n if (!json) process.stderr.write(`\\n[notice] ${event.message}\\n`);\n break;\n case \"error\":\n if (!json) process.stderr.write(`\\n[error] ${formatStreamError(event.error)}\\n`);\n exitCode = 1;\n break;\n }\n if (exitCode !== 0) break;\n }\n } catch (error) {\n if (!(error instanceof DOMException && error.name === \"AbortError\")) {\n const message = error instanceof Error ? formatStreamError(error) : String(error);\n process.stderr.write(`\\n[error] ${message}\\n`);\n exitCode = 1;\n }\n }\n const usageLine = usage.toJsonLine();\n if (usageLine) {\n if (json) {\n process.stdout.write(`${usageLine}\\n`);\n } else {\n const t = usage.totals;\n process.stderr.write(\n `[usage] ${t.requests} requests, ${t.promptTokens} prompt + ${t.completionTokens} completion = ${t.totalTokens} tokens\\n`,\n );\n }\n }\n if (!json) process.stdout.write(\"\\n\");\n defaultTaskManager.cleanup();\n defaultAgentTasks.cleanup();\n return exitCode;\n}\n\nconst program = new Command();\n\nprogram\n .name(\"star\")\n .description(\"Star CLI — an AI agent command-line interface\")\n .version(VERSION)\n .option(\"-m, --model <model>\", \"model to use\")\n .option(\"--permission-mode <mode>\", \"permission mode: ask | auto | readonly | yolo | plan\")\n .option(\"-p, --print <prompt>\", \"non-interactive print mode\")\n .option(\"--json\", \"output NDJSON events on stdout (print mode only)\")\n .option(\n \"--image <path>\",\n \"attach an image file (png/jpg/jpeg/gif/webp, max 5MB); repeatable\",\n (value: string, previous: string[]) => [...previous, value],\n [] as string[],\n )\n .option(\"-r, --resume [sessionId]\", \"resume a previous session (lists sessions when no id given)\")\n .option(\"-c, --continue\", \"continue the most recent session for the current directory\")\n .option(\n \"--clear-sessions [scope]\",\n \"delete stored sessions for the current directory ('all' deletes every session) and exit\",\n )\n .action(async (opts) => {\n const cwd = process.cwd();\n\n if (opts.json && opts.print === undefined) {\n console.error(\n '--json requires print mode: use star -p \"...\" --json (the interactive REPL does not support JSON output).',\n );\n process.exit(1);\n }\n\n if (opts.resume !== undefined && opts.continue) {\n console.error(\"Options --resume and --continue are mutually exclusive: pick one.\");\n process.exit(1);\n }\n\n if (opts.resume === true) {\n const entries = await listSessionEntries(cwd);\n if (entries.length === 0) {\n console.error(\"No sessions found for this directory.\");\n } else {\n console.log(formatSessionEntries(entries));\n }\n process.exit(0);\n }\n\n if (opts.clearSessions !== undefined) {\n const scope = opts.clearSessions;\n if (scope !== true && scope !== \"all\") {\n console.error(`Invalid scope: ${scope}. Use --clear-sessions or --clear-sessions all.`);\n process.exit(1);\n }\n const all = scope === \"all\";\n const removed = await clearSessions(all ? undefined : cwd);\n console.log(\n all\n ? `Deleted ${removed} session(s) across all directories.`\n : `Deleted ${removed} session(s) for this directory.`,\n );\n process.exit(0);\n }\n\n let config: StarConfig;\n try {\n config = loadConfigSync(cwd, { model: opts.model, permissionMode: opts.permissionMode });\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n const modelName = opts.model ?? config.defaultModel;\n if (!modelName) {\n console.error(\n \"No model configured. Add one to ~/.star-cli/config.toml or pass --model.\\n\" +\n \"See README.md for configuration examples.\",\n );\n process.exit(1);\n }\n\n let sessionStore: SessionStore | null = null;\n let resumed: { meta: SessionMeta; messages: CoreMessage[] } | null = null;\n let resumeId: string | null = null;\n if (typeof opts.resume === \"string\") {\n resumeId = await resolveSessionId(opts.resume);\n if (!resumeId) {\n console.error(`Session not found: ${opts.resume}`);\n process.exit(1);\n }\n } else if (opts.continue) {\n const latest = await findLatestSession(cwd);\n if (latest) {\n resumeId = latest.id;\n } else {\n process.stderr.write(\"No previous session for this directory — starting a new session.\\n\");\n }\n }\n\n if (resumeId) {\n resumed = await resumeSession(resumeId);\n if (!resumed) {\n console.error(`Session not found: ${resumeId}`);\n process.exit(1);\n }\n sessionStore = await SessionStore.open(resumeId);\n } else if (!opts.print) {\n sessionStore = await SessionStore.create(cwd, modelName);\n }\n\n let loop: AgentLoop;\n try {\n loop = await createLoop(config, modelName, cwd, sessionStore);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n if (resumed) {\n await loop.loadMessages(resumed.messages);\n if (sessionStore) {\n hydrateSnapshots(await loadSessionSnapshots(sessionStore.dir));\n }\n }\n\n if (opts.print) {\n // Let the loop drain instead of process.exit(): force-exiting on Windows\n // can hit a libuv assertion while undici keep-alive handles are closing.\n process.exitCode = await printMode(\n loop,\n opts.print,\n cwd,\n Boolean(opts.json),\n opts.image ?? [],\n );\n return;\n }\n\n renderRepl(loop, {\n model: modelName,\n permissionMode: config.permissionMode,\n config,\n cwd,\n sessionStore,\n initialMessages: resumed?.messages,\n initialUsage: resumed?.meta.usage,\n });\n });\n\nprogram.parse(process.argv);\n","import type { CoreMessage } from \"../core/messages\";\nimport type { DisplayMessage } from \"./components/MessageList\";\n\nexport function summarizeArgs(args: unknown, maxLength = 120): string {\n let json: string;\n try {\n json = JSON.stringify(args) ?? String(args);\n } catch {\n json = String(args);\n }\n return json.length > maxLength ? `${json.slice(0, maxLength)}...` : json;\n}\n\nexport function previewLines(text: string, maxLines = 10): { text: string; truncated: boolean } {\n const lines = text.split(\"\\n\");\n if (lines.length <= maxLines) return { text, truncated: false };\n return { text: lines.slice(0, maxLines).join(\"\\n\"), truncated: true };\n}\n\n// Splits a streaming buffer into a committable head (complete lines) and a\n// remainder, once the buffer holds at least minCompleteLines complete lines.\n// The last line is always kept in the remainder: it may still be growing.\n// Returns null when there is nothing worth committing yet.\nexport function splitCommittableLines(\n text: string,\n minCompleteLines: number,\n): { committed: string; rest: string } | null {\n const lastNewline = text.lastIndexOf(\"\\n\");\n if (lastNewline < 0) return null;\n const complete = text.slice(0, lastNewline);\n const completeLines = complete.split(\"\\n\").length;\n if (completeLines < minCompleteLines) return null;\n return { committed: complete, rest: text.slice(lastNewline + 1) };\n}\n\nexport function formatStreamError(error: Error): string {\n if (error.message.includes(\"Unexpected end of JSON input\")) {\n return `${error.message} (response stream was truncated — try again)`;\n }\n return error.message;\n}\n\nexport function coreMessageText(message: CoreMessage): string {\n const content = message.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .filter((part) => part.type === \"text\")\n .map((part) => (\"text\" in part ? part.text : \"\"))\n .join(\" \");\n }\n return \"\";\n}\n\nexport function buildDisplayMessages(messages: CoreMessage[]): DisplayMessage[] {\n const display: DisplayMessage[] = [];\n let collapsed = 0;\n for (const message of messages) {\n if (message.role === \"user\" || message.role === \"assistant\") {\n const text = coreMessageText(message);\n if (text) {\n display.push({ id: display.length, role: message.role, text });\n } else {\n collapsed++;\n }\n } else if (message.role === \"tool\") {\n collapsed++;\n }\n }\n if (collapsed > 0) {\n display.push({\n id: display.length,\n role: \"system\",\n text: `已恢复 ${collapsed} 条历史消息`,\n });\n }\n return display;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { ImageInput } from \"../core/messages\";\nimport { isSensitivePath } from \"../tools/fs/util\";\n\nexport const MAX_MENTION_BYTES = 100 * 1024;\nexport const MAX_IMAGE_BYTES = 5 * 1024 * 1024;\n\nconst IMAGE_MIME_TYPES: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n};\n\nexport function imageMimeType(filePath: string): string | null {\n return IMAGE_MIME_TYPES[path.extname(filePath).toLowerCase()] ?? null;\n}\n\n// Reads an image file into a base64 ImageInput. Returns null when the path is\n// not a supported image or cannot be read.\nexport async function readImageInput(filePath: string, cwd: string): Promise<ImageInput | null> {\n const mimeType = imageMimeType(filePath);\n if (!mimeType) return null;\n const abs = path.resolve(cwd, filePath);\n const st = await stat(abs).catch(() => null);\n if (!st || !st.isFile() || st.size > MAX_IMAGE_BYTES) return null;\n const buf = await readFile(abs).catch(() => null);\n if (!buf) return null;\n return { path: filePath, mimeType, data: buf.toString(\"base64\") };\n}\n\nexport interface ParsedMentions {\n cleanText: string;\n mentions: string[];\n}\n\nconst MENTION_RE = /(?<=^|\\s)@([A-Za-z]:[\\\\/][A-Za-z0-9._\\-/\\\\]*|[A-Za-z0-9._\\-/\\\\]+)/g;\n\nexport function parseMentions(text: string): ParsedMentions {\n const mentions: string[] = [];\n const seen = new Set<string>();\n const ranges: Array<[number, number]> = [];\n for (const match of text.matchAll(MENTION_RE)) {\n const mention = match[1];\n const full = match[0];\n if (mention === undefined || full === undefined) continue;\n ranges.push([match.index, match.index + full.length]);\n if (!seen.has(mention)) {\n seen.add(mention);\n mentions.push(mention);\n }\n }\n if (ranges.length === 0) {\n return { cleanText: text, mentions };\n }\n let clean = \"\";\n let last = 0;\n for (const [start, end] of ranges) {\n clean += text.slice(last, start);\n last = end;\n }\n clean += text.slice(last);\n const cleanText = clean\n .replace(/[ \\t]+\\n/g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n return { cleanText, mentions };\n}\n\nexport interface MentionSkip {\n path: string;\n reason: string;\n}\n\nexport interface ResolvedMentions {\n input: string;\n attached: string[];\n skipped: MentionSkip[];\n images: ImageInput[];\n}\n\nfunction isBinaryContent(buf: Buffer): boolean {\n const probe = buf.subarray(0, 8000);\n return probe.includes(0);\n}\n\nexport async function resolveMentions(text: string, cwd: string): Promise<ResolvedMentions> {\n const { cleanText, mentions } = parseMentions(text);\n if (mentions.length === 0) {\n return { input: text, attached: [], skipped: [], images: [] };\n }\n const blocks: string[] = [];\n const attached: string[] = [];\n const skipped: MentionSkip[] = [];\n const images: ImageInput[] = [];\n for (const mention of mentions) {\n const abs = path.resolve(cwd, mention);\n if (isSensitivePath(abs)) {\n skipped.push({ path: mention, reason: \"sensitive file\" });\n continue;\n }\n const mimeType = imageMimeType(mention);\n if (mimeType) {\n const st = await stat(abs).catch(() => null);\n if (!st || !st.isFile()) {\n skipped.push({ path: mention, reason: st ? \"is a directory\" : \"file not found\" });\n continue;\n }\n if (st.size > MAX_IMAGE_BYTES) {\n skipped.push({ path: mention, reason: \"image too large\" });\n continue;\n }\n const buf = await readFile(abs).catch(() => null);\n if (!buf) {\n skipped.push({ path: mention, reason: \"unreadable\" });\n continue;\n }\n attached.push(mention);\n images.push({ path: mention, mimeType, data: buf.toString(\"base64\") });\n continue;\n }\n const st = await stat(abs).catch(() => null);\n if (!st) {\n skipped.push({ path: mention, reason: \"file not found\" });\n continue;\n }\n if (st.isDirectory()) {\n skipped.push({ path: mention, reason: \"is a directory\" });\n continue;\n }\n if (st.size > MAX_MENTION_BYTES) {\n skipped.push({ path: mention, reason: `exceeds ${MAX_MENTION_BYTES / 1024}KB limit` });\n continue;\n }\n const buf = await readFile(abs).catch(() => null);\n if (!buf) {\n skipped.push({ path: mention, reason: \"unreadable\" });\n continue;\n }\n if (isBinaryContent(buf)) {\n skipped.push({ path: mention, reason: \"binary file\" });\n continue;\n }\n attached.push(mention);\n blocks.push(`--- @${mention} ---\\n${buf.toString(\"utf8\")}\\n--- end ---`);\n }\n const input = [cleanText, ...blocks].filter((s) => s.length > 0).join(\"\\n\\n\") || text;\n return { input, attached, skipped, images };\n}\n","import type { StreamEvent, TokenUsage } from \"../core/events\";\n\nexport function eventToJsonLine(event: StreamEvent): string | null {\n switch (event.type) {\n case \"finish\":\n return null;\n case \"error\":\n return JSON.stringify({ type: \"error\", error: { message: event.error.message } });\n default:\n return JSON.stringify(event);\n }\n}\n\nexport class UsageTracker {\n private requests = 0;\n private promptTokens = 0;\n private completionTokens = 0;\n private totalTokens = 0;\n\n add(usage?: TokenUsage): void {\n if (!usage) return;\n this.requests += 1;\n this.promptTokens += usage.promptTokens;\n this.completionTokens += usage.completionTokens;\n this.totalTokens += usage.totalTokens;\n }\n\n get totals(): TokenUsage & { requests: number } {\n return {\n requests: this.requests,\n promptTokens: this.promptTokens,\n completionTokens: this.completionTokens,\n totalTokens: this.totalTokens,\n };\n }\n\n toJsonLine(): string | null {\n if (this.requests === 0) return null;\n return JSON.stringify({\n type: \"usage\",\n requests: this.requests,\n promptTokens: this.promptTokens,\n completionTokens: this.completionTokens,\n totalTokens: this.totalTokens,\n });\n }\n}\n","import { Box, Text, render, useApp, useInput } from \"ink\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { type AgentTaskSnapshot, defaultAgentTasks } from \"../agent/agent-tasks\";\nimport { AgentLoop } from \"../agent/loop\";\nimport { addAllowRule, savePermissionMode } from \"../config/save\";\nimport { type StarConfig, contextWindowTokens } from \"../config/schema\";\nimport { estimateTokens } from \"../context/tokens\";\nimport { getGitSummary } from \"../core/git\";\nimport type { CoreMessage, ImageInput } from \"../core/messages\";\nimport { createModel } from \"../llm/provider\";\nimport { listModels } from \"../llm/registry\";\nimport { buildAllowRule, isAllowedByRules } from \"../permissions/allow\";\nimport type { PermissionRequest } from \"../permissions/types\";\nimport { loadSessionSnapshots } from \"../session/checkpoints\";\nimport { clearSessions } from \"../session/clear\";\nimport {\n formatSessionEntries,\n listSessionEntries,\n relativeTime,\n resolveSessionId,\n shortSessionId,\n} from \"../session/list\";\nimport { resumeSession } from \"../session/resume\";\nimport { SessionStore } from \"../session/store\";\nimport { collectUsageStats, formatUsageDashboard } from \"../session/usage\";\nimport { formatTaskFinished, formatTaskList, formatTaskStarted } from \"../tasks/format\";\nimport { type TaskSnapshot, defaultTaskManager } from \"../tasks/manager\";\nimport { TodoStore, createDefaultRegistry } from \"../tools\";\nimport {\n clearSnapshots,\n hydrateSnapshots,\n listSnapshots,\n rewindToSnapshot,\n undoTurnSnapshots,\n} from \"../tools/fs/snapshots\";\nimport { type TodoItem, formatTodos, loadTodos, parseTodoArgs } from \"../tools/todo\";\nimport { VERSION } from \"../version\";\nimport type { ChatBackend } from \"./backend\";\nimport { budgetState } from \"./budget\";\nimport { copyText, readClipboardImage } from \"./clipboard\";\nimport { compactSession, exportSession } from \"./commands/actions\";\nimport { registerBuiltinCommands } from \"./commands/builtin\";\nimport { registerCustomCommands } from \"./commands/custom\";\nimport { formatDoctorReport, runDoctor } from \"./commands/doctor\";\nimport { initProject } from \"./commands/init-project\";\nimport { type CommandContext, CommandRegistry, parseSlashCommand } from \"./commands/registry\";\nimport { formatCheckpointList, planRewind } from \"./commands/rewind\";\nimport { didYouMeanSuffix } from \"./commands/suggest\";\nimport { type ExitPlanDecision, ExitPlanPrompt } from \"./components/ExitPlanPrompt\";\nimport { InputBox } from \"./components/InputBox\";\nimport { type DisplayMessage, MessageList } from \"./components/MessageList\";\nimport { type PermissionDecision, PermissionPrompt } from \"./components/PermissionPrompt\";\nimport { RewindConfirmPrompt, type RewindDecision } from \"./components/RewindConfirmPrompt\";\nimport { type SelectOption, SelectPrompt } from \"./components/SelectPrompt\";\nimport { StatusBar } from \"./components/StatusBar\";\nimport { StreamingMessage } from \"./components/StreamingMessage\";\nimport {\n THOUGHT_SUMMARY_LENGTH,\n ThinkingIndicator,\n truncateTail,\n} from \"./components/ThinkingIndicator\";\nimport { TodoPanel } from \"./components/TodoPanel\";\nimport { type ToolCardData, formatToolCard } from \"./components/ToolCallCard\";\nimport { computeCostUsd, estimateCost, formatDollars } from \"./cost\";\nimport { type DiffPreview, generateDiffPreview } from \"./diff-preview\";\nimport { isDoubleEscape } from \"./double-esc\";\nimport {\n buildDisplayMessages,\n coreMessageText,\n formatStreamError,\n splitCommittableLines,\n summarizeArgs,\n} from \"./format\";\nimport { appendHistory, loadHistory } from \"./history\";\nimport { resolveMentions } from \"./mentions\";\nimport { notifyBell } from \"./notify\";\nimport { PromptQueue, type QueuedPrompt } from \"./queue\";\nimport { executeShellBang } from \"./shell-bang\";\nimport { type FlushState, nextFlush, startTicker } from \"./ticker\";\nimport { checkForUpdate } from \"./update-check\";\n\n// Matches ansi-escapes' clearTerminal (Ink pulls the same sequence for its\n// own full redraws): erase screen + scrollback, cursor home.\nconst CLEAR_TERMINAL =\n process.platform === \"win32\" ? \"\\u001B[2J\\u001B[0f\" : \"\\u001B[2J\\u001B[3J\\u001B[H\";\n\nexport interface UsageStats {\n requests: number;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nfunction emptyUsage(): UsageStats {\n return { requests: 0, promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n}\n\nfunction runningTaskLabels(): string[] {\n const shells = defaultTaskManager\n .list()\n .filter((t) => t.status === \"running\")\n .map((t) => t.description ?? t.command);\n const agents = defaultAgentTasks\n .list()\n .filter((t) => t.status === \"running\")\n .map((t) => t.description ?? t.id);\n return [...shells, ...agents];\n}\n\n// Shift+Tab cycles these in order; yolo is reachable only via /permission.\nconst SESSION_MODE_CYCLE = [\"ask\", \"auto\", \"readonly\", \"plan\"] as const;\n\nfunction formatUsage(usage: UsageStats): string {\n return `API usage this session: ${usage.requests} requests, ${usage.promptTokens} prompt + ${usage.completionTokens} completion = ${usage.totalTokens} tokens`;\n}\n\ninterface PendingPermission {\n request: PermissionRequest;\n preview: DiffPreview | null;\n resolve: (approved: boolean) => void;\n}\n\ninterface PendingRewind {\n summary: string;\n resolve: (confirmed: boolean) => void;\n}\n\ninterface PendingPicker {\n title: string;\n options: SelectOption[];\n resolve: (value: string | null) => void;\n}\n\nconst SESSION_PICKER_CAP = 20;\n\n// First user message of a stored session, collapsed to a single ~60-char\n// line for the resume picker. null when there is nothing usable.\nasync function sessionPreview(id: string): Promise<string | null> {\n const store = await SessionStore.open(id);\n if (!store) return null;\n const first = (await store.messages()).find((m) => m.role === \"user\");\n if (!first) return null;\n const text = coreMessageText(first).replace(/\\s+/g, \" \").trim();\n if (!text) return null;\n return text.length > 60 ? `${text.slice(0, 60)}…` : text;\n}\n\ninterface ReplProps {\n backend: ChatBackend;\n model: string;\n permissionMode: string;\n config: StarConfig;\n cwd: string;\n sessionStore: SessionStore | null;\n initialMessages?: CoreMessage[];\n initialUsage?: UsageStats;\n}\n\nexport function Repl({\n backend,\n model,\n permissionMode,\n config,\n cwd,\n sessionStore,\n initialMessages,\n initialUsage,\n}: ReplProps) {\n const { exit } = useApp();\n const [initialDisplay] = useState(() => buildDisplayMessages(initialMessages ?? []));\n const [messages, setMessages] = useState<DisplayMessage[]>(initialDisplay);\n const [epoch, setEpoch] = useState(0);\n const [streamingText, setStreamingText] = useState<string | null>(null);\n const [isStreaming, setIsStreaming] = useState(false);\n const [thinking, setThinking] = useState(false);\n const [thinkingText, setThinkingText] = useState(\"\");\n const [thoughtSummary, setThoughtSummary] = useState<string | null>(null);\n // usageVersion bump counter: the value is never read; setting it re-renders\n // so usageRef contents flow into StatusBar.\n const [, setUsageVersion] = useState(0);\n const [modelName, setModelName] = useState(model);\n const [pending, setPending] = useState<PendingPermission | null>(null);\n const [spinnerTick, setSpinnerTick] = useState(0);\n const [activity, setActivity] = useState<string | null>(null);\n const [bgLabels, setBgLabels] = useState<string[]>(() => runningTaskLabels());\n const [todos, setTodos] = useState<TodoItem[]>([]);\n const [permissionModeState, setPermissionModeState] = useState(permissionMode);\n const [planApproval, setPlanApprovalState] = useState(false);\n const [pendingRewind, setPendingRewindState] = useState<PendingRewind | null>(null);\n const [picker, setPickerState] = useState<PendingPicker | null>(null);\n\n const backendRef = useRef<ChatBackend>(backend);\n const nextIdRef = useRef(initialDisplay.length);\n const abortRef = useRef<AbortController | null>(null);\n const streamedRef = useRef(\"\");\n const thinkingRef = useRef(false);\n const reasoningRef = useRef(\"\");\n const tickerStopRef = useRef<(() => void) | null>(null);\n const flushedRef = useRef<FlushState>({ streamed: \"\", reasoning: \"\" });\n const toolCardsRef = useRef(new Map<string, ToolCardData>());\n const pendingRef = useRef<PendingPermission | null>(null);\n const alwaysAllowedRef = useRef(new Set<string>());\n // Mode the session was in before plan mode was entered; restored on plan\n // approval or /plan toggle. null when plan mode is not active.\n const prevModeRef = useRef<StarConfig[\"permissionMode\"] | null>(null);\n const planApprovalRef = useRef(false);\n const pendingRewindRef = useRef<PendingRewind | null>(null);\n const pickerRef = useRef<PendingPicker | null>(null);\n const modelNameRef = useRef(model);\n // Live session store: /new swaps it mid-session, so callbacks must go\n // through the ref rather than the prop captured at mount.\n const sessionStoreRef = useRef<SessionStore | null>(sessionStore);\n const usageRef = useRef<UsageStats>(initialUsage ? { ...initialUsage } : emptyUsage());\n // Number of assistant chunks already committed to static history this turn;\n // 0 means the next streamed text still needs the \"star\" header.\n const turnChunksRef = useRef(0);\n // Mirror of `messages` for code that needs the current list synchronously\n // (e.g. computing the /undo cut point before redrawing).\n const messagesRef = useRef<DisplayMessage[]>(initialDisplay);\n\n const [queueItems, setQueueItems] = useState<QueuedPrompt[]>([]);\n const queueRef = useRef(new PromptQueue());\n // Clipboard images staged via Alt+V (or Ctrl+V where the terminal passes it\n // through), merged into the next submitted prompt.\n const [pendingImages, setPendingImages] = useState<{ id: number; image: ImageInput }[]>([]);\n const pendingImagesRef = useRef<{ id: number; image: ImageInput }[]>([]);\n const imageSeqRef = useRef(1);\n const [inputRefill, setInputRefill] = useState<{ text: string; seq: number } | undefined>();\n const refillSeqRef = useRef(0);\n // Timestamp of the last idle Esc; a second one within the window restores\n // the last user message for editing.\n const lastEscRef = useRef<number | null>(null);\n const [gitBranch, setGitBranch] = useState<string | null>(null);\n const [contextPercent, setContextPercent] = useState<number | null>(null);\n // Persistent input history, loaded once per process (STAR_HOME is fixed).\n const [initialHistory] = useState(() => loadHistory());\n const budgetWarnedRef = useRef(false);\n const budgetExceededRef = useRef(false);\n // Latest runStream, so a finishing turn can drain the queue by re-entering\n // it without a circular useCallback dependency.\n const runStreamRef = useRef<((text: string, images?: ImageInput[]) => Promise<void>) | null>(\n null,\n );\n\n const pushMessage = useCallback(\n (role: DisplayMessage[\"role\"], text: string, note?: string, tight?: boolean) => {\n setMessages((prev) => {\n const next = [...prev, { id: nextIdRef.current++, role, text, note, tight }];\n messagesRef.current = next;\n return next;\n });\n },\n [],\n );\n\n // Replace the whole history and remount the list (fresh Static instance).\n const applyMessages = useCallback((next: DisplayMessage[]) => {\n messagesRef.current = next;\n setMessages(next);\n setEpoch((e) => e + 1);\n }, []);\n\n // Ink's <Static> can only append — dropping items from state does not erase\n // them from the terminal. Clear the screen first, then let the remounted\n // Static rewrite the surviving history.\n const redrawMessages = useCallback(\n (next: DisplayMessage[]) => {\n if (process.stdout.isTTY) {\n process.stdout.write(CLEAR_TERMINAL);\n }\n applyMessages(next);\n },\n [applyMessages],\n );\n\n const pushAssistantChunk = useCallback(\n (text: string, tight: boolean) => {\n const role: DisplayMessage[\"role\"] =\n turnChunksRef.current === 0 ? \"assistant\" : \"assistant-cont\";\n turnChunksRef.current += 1;\n pushMessage(role, text, undefined, tight);\n },\n [pushMessage],\n );\n\n const setPendingPermission = useCallback((p: PendingPermission | null) => {\n pendingRef.current = p;\n setPending(p);\n }, []);\n\n const setPlanApproval = useCallback((v: boolean) => {\n planApprovalRef.current = v;\n setPlanApprovalState(v);\n }, []);\n\n const setPendingRewind = useCallback((p: PendingRewind | null) => {\n pendingRewindRef.current = p;\n setPendingRewindState(p);\n }, []);\n\n const setPicker = useCallback((p: PendingPicker | null) => {\n pickerRef.current = p;\n setPickerState(p);\n }, []);\n\n // One picker at a time; a second request while one is open resolves null\n // immediately so callers never hang.\n const showPicker = useCallback(\n (title: string, options: SelectOption[]): Promise<string | null> => {\n if (pickerRef.current) return Promise.resolve(null);\n return new Promise<string | null>((resolve) => {\n setPicker({ title, options, resolve });\n });\n },\n [setPicker],\n );\n\n const handlePickerSelect = useCallback(\n (value: string) => {\n const p = pickerRef.current;\n if (!p) return;\n setPicker(null);\n p.resolve(value);\n },\n [setPicker],\n );\n\n const handlePickerCancel = useCallback(() => {\n const p = pickerRef.current;\n if (!p) return;\n setPicker(null);\n p.resolve(null);\n }, [setPicker]);\n\n const stageClipboardImage = useCallback((img: ImageInput) => {\n pendingImagesRef.current = [\n ...pendingImagesRef.current,\n { id: imageSeqRef.current++, image: img },\n ];\n setPendingImages(pendingImagesRef.current);\n }, []);\n\n const clearPendingImages = useCallback(() => {\n pendingImagesRef.current = [];\n setPendingImages([]);\n }, []);\n\n // Numeric session cost (USD) from the accumulated usage; null when the\n // active model has no pricing configured.\n const sessionCostUsd = useCallback(\n () =>\n computeCostUsd(\n usageRef.current,\n config.models.find((m) => m.name === modelNameRef.current),\n ),\n [config],\n );\n\n const handlePasteImage = useCallback(() => {\n void readClipboardImage().then((img) => {\n if (img) stageClipboardImage(img);\n });\n }, [stageClipboardImage]);\n\n const handleRewindDecision = useCallback(\n (decision: RewindDecision) => {\n const p = pendingRewindRef.current;\n if (!p) return;\n setPendingRewind(null);\n p.resolve(decision === \"yes\");\n },\n [setPendingRewind],\n );\n\n // Session-scoped mode switch: mutates the shared config object the AgentLoop\n // reads on every tool call. Entering plan mode remembers the previous mode\n // for later restoration; unlike /permission nothing is written to config.\n const applySessionMode = useCallback(\n (mode: StarConfig[\"permissionMode\"]) => {\n if (mode === config.permissionMode) return;\n if (mode === \"plan\") {\n prevModeRef.current = config.permissionMode;\n } else if (config.permissionMode === \"plan\") {\n prevModeRef.current = null;\n }\n config.permissionMode = mode;\n setPermissionModeState(mode);\n },\n [config],\n );\n\n const attachConfirmHandler = useCallback(\n (target: ChatBackend) => {\n target.confirmHandler = async (req) => {\n if (isAllowedByRules([...alwaysAllowedRef.current], req)) {\n return true;\n }\n const preview = await generateDiffPreview(req.toolName, req.args, cwd).catch(() => null);\n return new Promise<boolean>((resolve) => {\n setPendingPermission({ request: req, preview, resolve });\n });\n };\n target.onHookWarning = (message) => pushMessage(\"system\", message);\n },\n [setPendingPermission, cwd, pushMessage],\n );\n\n useEffect(() => {\n attachConfirmHandler(backendRef.current);\n return () => {\n tickerStopRef.current?.();\n abortRef.current?.abort();\n pendingRef.current?.resolve(false);\n };\n }, [attachConfirmHandler]);\n\n useEffect(() => {\n if (process.env.STAR_NO_UPDATE_CHECK === \"1\") return;\n void checkForUpdate(VERSION).then((message) => {\n if (message) pushMessage(\"system\", message);\n });\n }, [pushMessage]);\n\n // Seed the todo panel from the on-disk list (previous sessions); live\n // updates arrive via todo_write tool-call events during a turn.\n useEffect(() => {\n loadTodos(cwd)\n .then(setTodos)\n .catch(() => {});\n }, [cwd]);\n\n useEffect(() => {\n const onUpdate = (task: TaskSnapshot) => {\n setBgLabels(runningTaskLabels());\n pushMessage(\n \"system\",\n task.status === \"running\" ? formatTaskStarted(task) : formatTaskFinished(task),\n );\n // Background tasks are exactly the case where the user has looked away.\n if (task.status !== \"running\") {\n notifyBell({\n enabled: config.notifyBell,\n thresholdSec: config.notifyBellThresholdSec,\n noNotifyEnv: process.env.STAR_NO_NOTIFY === \"1\",\n });\n }\n };\n const onAgentUpdate = (task: AgentTaskSnapshot) => {\n setBgLabels(runningTaskLabels());\n const label = task.description ? `: ${task.description}` : \"\";\n pushMessage(\n \"system\",\n task.status === \"running\"\n ? `Background subagent ${task.id} started${label}`\n : `Background subagent ${task.id} ${task.status}${label}`,\n );\n if (task.status !== \"running\") {\n notifyBell({\n enabled: config.notifyBell,\n thresholdSec: config.notifyBellThresholdSec,\n noNotifyEnv: process.env.STAR_NO_NOTIFY === \"1\",\n });\n }\n };\n defaultTaskManager.on(\"update\", onUpdate);\n defaultAgentTasks.on(\"update\", onAgentUpdate);\n return () => {\n defaultTaskManager.off(\"update\", onUpdate);\n defaultAgentTasks.off(\"update\", onAgentUpdate);\n defaultTaskManager.cleanup();\n defaultAgentTasks.cleanup();\n };\n }, [pushMessage, config]);\n\n const interrupt = useCallback(() => {\n abortRef.current?.abort();\n const p = pendingRef.current;\n if (p) {\n setPendingPermission(null);\n p.resolve(false);\n }\n const cleared = queueRef.current.clear();\n if (cleared.length > 0) {\n setQueueItems([]);\n pushMessage(\"system\", `cleared ${cleared.length} queued message(s)`);\n }\n }, [setPendingPermission, pushMessage]);\n\n // Double-Esc while idle: retract the last user turn and put the originally\n // typed text back into the input for editing.\n const editLastMessage = useCallback(async () => {\n const current = backendRef.current;\n if (typeof current.retractLastTurn !== \"function\") return;\n const visible = messagesRef.current;\n let cut = -1;\n let text = \"\";\n for (let i = visible.length - 1; i >= 0; i--) {\n const msg = visible[i];\n if (msg?.role === \"user\") {\n cut = i;\n text = msg.text;\n break;\n }\n }\n if (cut < 0) return;\n const { removed } = await current.retractLastTurn();\n if (removed === 0) return;\n redrawMessages(visible.slice(0, cut));\n refillSeqRef.current += 1;\n setInputRefill({ text, seq: refillSeqRef.current });\n pushMessage(\"system\", \"last message restored for editing\");\n }, [pushMessage, redrawMessages]);\n\n const handleExit = useCallback(() => {\n const killed = defaultTaskManager.cleanup();\n const killedAgents = defaultAgentTasks.cleanup();\n const stopped = [...killed.map((t) => t.id), ...killedAgents.map((t) => t.id)];\n if (stopped.length > 0) {\n pushMessage(\"system\", `Stopped ${stopped.length} background task(s): ${stopped.join(\", \")}`);\n }\n exit();\n }, [exit, pushMessage]);\n\n useInput((_input, key) => {\n if (key.escape) {\n const busy =\n abortRef.current !== null ||\n pendingRef.current !== null ||\n planApprovalRef.current ||\n pendingRewindRef.current !== null ||\n pickerRef.current !== null;\n if (busy) {\n lastEscRef.current = null;\n interrupt();\n return;\n }\n const now = Date.now();\n if (isDoubleEscape(lastEscRef.current, now)) {\n lastEscRef.current = null;\n void editLastMessage();\n } else {\n lastEscRef.current = now;\n }\n return;\n }\n lastEscRef.current = null;\n if (key.shift && key.tab) {\n // Don't yank the mode out from under a running turn or an open prompt.\n if (\n abortRef.current ||\n pendingRef.current ||\n planApprovalRef.current ||\n pendingRewindRef.current ||\n pickerRef.current\n )\n return;\n const current = config.permissionMode as (typeof SESSION_MODE_CYCLE)[number];\n const index = SESSION_MODE_CYCLE.indexOf(current);\n const next = SESSION_MODE_CYCLE[(index + 1) % SESSION_MODE_CYCLE.length] ?? \"ask\";\n applySessionMode(next);\n }\n });\n\n const handleDecision = useCallback(\n (decision: PermissionDecision) => {\n const p = pendingRef.current;\n if (!p) return;\n if (decision === \"always\") {\n const rule = buildAllowRule(p.request);\n alwaysAllowedRef.current.add(rule);\n void addAllowRule(rule)\n .then((added) => {\n pushMessage(\n \"system\",\n added\n ? `Always allow ${rule} — saved to config`\n : `Always allow ${rule} (already in config)`,\n );\n })\n .catch(() => {\n pushMessage(\"system\", `Always allow ${rule} for this session (failed to save)`);\n });\n }\n setPendingPermission(null);\n p.resolve(decision !== \"no\");\n },\n [setPendingPermission, pushMessage],\n );\n\n const switchModel = useCallback(\n async (name: string): Promise<string> => {\n try {\n const newModel = createModel(config, name);\n const loop = new AgentLoop({\n model: newModel,\n registry: createDefaultRegistry(),\n config,\n cwd,\n sessionStore: sessionStoreRef.current,\n contextMaxTokens: contextWindowTokens(config, name),\n });\n const prev = backendRef.current;\n if (prev instanceof AgentLoop) {\n await loop.loadMessages([...prev.getMessages()]);\n }\n attachConfirmHandler(loop);\n backendRef.current = loop;\n modelNameRef.current = name;\n setModelName(name);\n return `Switched to model \"${name}\".`;\n } catch (error) {\n return `Failed to switch model: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n [config, cwd, attachConfirmHandler],\n );\n\n const resume = useCallback(\n async (id: string): Promise<string> => {\n const current = backendRef.current;\n if (!(current instanceof AgentLoop)) {\n return \"Current backend does not support resuming sessions.\";\n }\n const resolvedId = await resolveSessionId(id);\n if (!resolvedId) {\n return `Session not found: ${id}`;\n }\n const resumed = await resumeSession(resolvedId);\n if (!resumed) {\n return `Session not found: ${id}`;\n }\n await current.loadMessages(resumed.messages);\n const store = await SessionStore.open(resolvedId);\n if (store) {\n hydrateSnapshots(await loadSessionSnapshots(store.dir));\n }\n const display = buildDisplayMessages(resumed.messages);\n nextIdRef.current = display.length;\n applyMessages(display);\n usageRef.current = resumed.meta.usage ? { ...resumed.meta.usage } : emptyUsage();\n setUsageVersion((v) => v + 1);\n return `Resumed session ${resolvedId} (${resumed.messages.length} messages).`;\n },\n [applyMessages],\n );\n\n const runStream = useCallback(\n async (input: string, extraImages: ImageInput[] = []) => {\n const resolved = await resolveMentions(input, cwd);\n const images = [...resolved.images, ...extraImages];\n pushMessage(\n \"user\",\n input,\n resolved.attached.length + extraImages.length > 0\n ? `attached: ${[...resolved.attached, ...extraImages.map((img) => img.path)].join(\", \")}`\n : undefined,\n );\n for (const skip of resolved.skipped) {\n pushMessage(\"system\", `Skipped @${skip.path}: ${skip.reason}`);\n }\n const controller = new AbortController();\n abortRef.current = controller;\n const turnStartedAt = Date.now();\n streamedRef.current = \"\";\n thinkingRef.current = true;\n reasoningRef.current = \"\";\n turnChunksRef.current = 0;\n setThinking(true);\n setThinkingText(\"\");\n setThoughtSummary(null);\n setStreamingText(\"\");\n setIsStreaming(true);\n flushedRef.current = { streamed: \"\", reasoning: \"\" };\n // Move the current streaming buffer into static history. Used at tool-call\n // boundaries (to keep chronological order) and by the ticker for long\n // answers, so the live redraw area — and with it the visible flicker —\n // stays small no matter how long the answer gets.\n const commitStreamed = (tight: boolean) => {\n if (streamedRef.current.length === 0) return;\n pushAssistantChunk(streamedRef.current, tight);\n streamedRef.current = \"\";\n flushedRef.current = { ...flushedRef.current, streamed: \"\" };\n setStreamingText(\"\");\n };\n tickerStopRef.current = startTicker((tick) => {\n setSpinnerTick(tick);\n const split = splitCommittableLines(streamedRef.current, 8);\n if (split) {\n pushAssistantChunk(split.committed, true);\n streamedRef.current = split.rest;\n flushedRef.current = { ...flushedRef.current, streamed: \"\" };\n }\n const next: FlushState = {\n streamed: streamedRef.current,\n reasoning: reasoningRef.current,\n };\n if (nextFlush(flushedRef.current, next) !== null) {\n flushedRef.current = next;\n setStreamingText(next.streamed);\n setThinkingText(next.reasoning);\n }\n });\n try {\n for await (const event of backendRef.current.stream(\n images.length > 0 ? { text: resolved.input, images } : resolved.input,\n controller.signal,\n {\n persistAs:\n extraImages.length > 0\n ? `${input}${\" [clipboard image]\".repeat(extraImages.length)}`\n : input,\n },\n )) {\n if (event.type === \"text-delta\") {\n if (thinkingRef.current) {\n thinkingRef.current = false;\n setThinking(false);\n if (reasoningRef.current.length > 0) {\n setThoughtSummary(\n `thought: ${truncateTail(reasoningRef.current, THOUGHT_SUMMARY_LENGTH)}`,\n );\n }\n }\n streamedRef.current += event.text;\n } else if (event.type === \"reasoning\") {\n reasoningRef.current += event.text;\n } else if (event.type === \"tool-call\") {\n // Flush the text spoken before this call into history first, so the\n // card lands in chronological order instead of after the whole turn.\n commitStreamed(true);\n toolCardsRef.current.set(event.id, {\n id: event.id,\n name: event.name,\n argsSummary: summarizeArgs(event.args),\n });\n if (event.name === \"todo_write\") {\n const list = parseTodoArgs(event.args);\n if (list) setTodos(list);\n }\n setActivity(`running ${event.name}: ${summarizeArgs(event.args, 60)}`);\n } else if (event.type === \"tool-result\") {\n const card = toolCardsRef.current.get(event.id) ?? {\n id: event.id,\n name: event.name,\n argsSummary: \"\",\n };\n toolCardsRef.current.delete(event.id);\n // Rendered once, straight into static history — no live card region\n // that would have to be erased (and could linger) at turn end.\n pushMessage(\n \"tool\",\n formatToolCard({\n ...card,\n result: event.content,\n isError: event.isError ?? false,\n }),\n );\n setActivity(null);\n thinkingRef.current = true;\n reasoningRef.current = \"\";\n setThinking(true);\n setThinkingText(\"\");\n } else if (event.type === \"finish\") {\n if (event.usage) {\n const usage = usageRef.current;\n usage.requests += 1;\n usage.promptTokens += event.usage.promptTokens;\n usage.completionTokens += event.usage.completionTokens;\n usage.totalTokens += event.usage.totalTokens;\n setUsageVersion((v) => v + 1);\n sessionStoreRef.current?.addUsage(event.usage).catch(() => {});\n }\n } else if (event.type === \"retry\") {\n pushMessage(\n \"system\",\n `Request failed, retrying (${event.attempt}/${event.maxAttempts}): ${event.reason}`,\n );\n } else if (event.type === \"notice\") {\n pushMessage(\"system\", event.message);\n } else if (event.type === \"error\") {\n pushMessage(\"system\", `Error: ${formatStreamError(event.error)}`);\n }\n }\n } catch (error) {\n const aborted =\n controller.signal.aborted ||\n (error instanceof DOMException && error.name === \"AbortError\");\n if (!aborted) {\n pushMessage(\n \"system\",\n `Error: ${error instanceof Error ? formatStreamError(error) : String(error)}`,\n );\n }\n } finally {\n tickerStopRef.current?.();\n tickerStopRef.current = null;\n abortRef.current = null;\n setIsStreaming(false);\n thinkingRef.current = false;\n reasoningRef.current = \"\";\n setThinking(false);\n setThinkingText(\"\");\n setThoughtSummary(null);\n setActivity(null);\n const finalText = streamedRef.current;\n streamedRef.current = \"\";\n setStreamingText(null);\n const interrupted = controller.signal.aborted;\n notifyBell({\n enabled: config.notifyBell,\n thresholdSec: config.notifyBellThresholdSec,\n noNotifyEnv: process.env.STAR_NO_NOTIFY === \"1\",\n interrupted,\n elapsedMs: Date.now() - turnStartedAt,\n });\n if (finalText.length > 0) {\n pushAssistantChunk(`${finalText}${interrupted ? \" [interrupted]\" : \"\"}`, false);\n } else if (interrupted && turnChunksRef.current > 0) {\n pushAssistantChunk(\"[interrupted]\", false);\n }\n // Cards whose result event never arrived (e.g. hard abort) still get\n // flushed so no call vanishes from the transcript.\n for (const card of toolCardsRef.current.values()) {\n pushMessage(\"tool\", formatToolCard(card));\n }\n toolCardsRef.current.clear();\n turnChunksRef.current = 0;\n const p = pendingRef.current;\n if (p) {\n setPendingPermission(null);\n p.resolve(false);\n }\n // A plan-mode turn that ran to completion ends in a plan, not in\n // changes — offer to approve it and switch back to execution.\n if (!interrupted && config.permissionMode === \"plan\") {\n setPlanApproval(true);\n }\n // Session budget (sessionBudgetUsd): warn once at 80%, error + block\n // further prompts at 100%. Unevaluable without per-model pricing.\n const cost = sessionCostUsd();\n const budget = config.sessionBudgetUsd;\n const status = budgetState(cost, budget);\n if (status === \"warn\" && !budgetWarnedRef.current) {\n budgetWarnedRef.current = true;\n pushMessage(\n \"system\",\n `Session cost $${formatDollars(cost ?? 0)} has passed 80% of the $${formatDollars(budget ?? 0)} session budget (sessionBudgetUsd).`,\n );\n }\n if (status === \"exceeded\" && !budgetExceededRef.current) {\n budgetExceededRef.current = true;\n pushMessage(\n \"system\",\n `Session budget exceeded: $${formatDollars(cost ?? 0)} of $${formatDollars(budget ?? 0)} (sessionBudgetUsd). New prompts are blocked — raise sessionBudgetUsd in the config or start a /new session.`,\n );\n }\n // Typeahead queue: send the next queued prompt FIFO once this turn is\n // fully done (permission prompts included). A crossed budget drops the\n // queue instead.\n const nextPrompt = queueRef.current.dequeue();\n if (nextPrompt) {\n if (status === \"exceeded\") {\n const dropped = queueRef.current.clear().length + 1;\n setQueueItems([]);\n pushMessage(\n \"system\",\n `Dropped ${dropped} queued message(s) — session budget exceeded.`,\n );\n } else {\n setQueueItems(queueRef.current.list());\n void runStreamRef.current?.(nextPrompt.text, nextPrompt.images);\n }\n }\n }\n },\n [\n pushMessage,\n pushAssistantChunk,\n setPendingPermission,\n setPlanApproval,\n cwd,\n config,\n sessionCostUsd,\n ],\n );\n\n useEffect(() => {\n runStreamRef.current = runStream;\n }, [runStream]);\n\n const handlePlanDecision = useCallback(\n (decision: ExitPlanDecision) => {\n setPlanApproval(false);\n if (decision === \"no\") return;\n const restore = prevModeRef.current ?? \"ask\";\n applySessionMode(restore);\n pushMessage(\"system\", `Plan approved — permission mode restored to ${restore}.`);\n void runStream(\"The plan above is approved. Proceed with the implementation.\");\n },\n [applySessionMode, pushMessage, runStream, setPlanApproval],\n );\n\n const registry = useMemo(() => {\n const ctx: CommandContext = {\n cwd,\n addSystemMessage: (text) => pushMessage(\"system\", text),\n showDiff: (text, lines, note) => {\n setMessages((prev) => {\n const next = [\n ...prev,\n { id: nextIdRef.current++, role: \"system\" as const, text, note, diff: lines },\n ];\n messagesRef.current = next;\n return next;\n });\n },\n clearMessages: () => {\n redrawMessages([]);\n },\n conversationText: (scope) => {\n const current = backendRef.current;\n if (!(current instanceof AgentLoop)) return null;\n const messages = current.getMessages();\n if (scope === \"all\") {\n const parts = messages\n .filter((m) => m.role === \"user\" || m.role === \"assistant\")\n .map((m) => coreMessageText(m))\n .filter((text) => text.length > 0);\n return parts.length > 0 ? parts.join(\"\\n\\n\") : null;\n }\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message?.role === \"assistant\") {\n const text = coreMessageText(message);\n if (text) return text;\n }\n }\n return null;\n },\n copyToClipboard: (text) => copyText(text),\n exit: () => handleExit(),\n listModels: () => {\n const models = listModels(config);\n if (models.length === 0) return \"No models configured.\";\n const lines = models.map(\n (m) =>\n `${m.name === modelNameRef.current ? \"*\" : \" \"} ${m.name} (${m.provider}/${m.model})`,\n );\n return `Models (* = current):\\n${lines.join(\"\\n\")}`;\n },\n switchModel,\n listSessions: async (all) => {\n const entries = await listSessionEntries(all ? undefined : cwd);\n if (entries.length === 0) {\n return all ? \"No sessions found.\" : \"No sessions found for this directory.\";\n }\n return formatSessionEntries(entries, { showCwd: all });\n },\n resumeSession: resume,\n pickModel: async () => {\n const models = listModels(config);\n if (models.length === 0) return \"No models configured.\";\n const options: SelectOption[] = models.map((m) => {\n const parts = [`${m.provider}/${m.model}`, `${contextWindowTokens(config, m.name)} ctx`];\n if (m.promptPrice !== undefined && m.completionPrice !== undefined) {\n parts.push(`$${m.promptPrice}/$${m.completionPrice} per 1M tokens`);\n }\n return {\n value: m.name,\n label: m.name,\n description: parts.join(\" · \"),\n hint: m.name === modelNameRef.current ? \"current\" : undefined,\n };\n });\n const picked = await showPicker(\"Select a model\", options);\n if (!picked || picked === modelNameRef.current) {\n return `Model unchanged — still \"${modelNameRef.current}\".`;\n }\n return switchModel(picked);\n },\n pickPermissionMode: async () => {\n const current = config.permissionMode;\n const descriptions: Record<string, string> = {\n ask: \"reads allowed; writes/exec ask for confirmation\",\n auto: \"everything allowed except hard-denied dangerous commands/paths\",\n readonly: \"read-only; all writes/exec denied\",\n yolo: \"allow everything, never ask (disables ALL safety checks)\",\n plan: \"read-only research, then approve a plan before executing (this session only)\",\n };\n const options: SelectOption[] = [\"ask\", \"auto\", \"readonly\", \"yolo\", \"plan\"].map((m) => ({\n value: m,\n label: m,\n description: descriptions[m],\n hint: m === current ? \"current\" : undefined,\n }));\n const picked = await showPicker(\"Select a permission mode\", options);\n if (!picked || picked === current) {\n return `Permission mode unchanged — still ${current}.`;\n }\n if (picked === \"plan\") return ctx.planMode();\n return ctx.permissionMode(picked);\n },\n pickSession: async (all) => {\n const entries = (await listSessionEntries(all ? undefined : cwd)).slice(\n 0,\n SESSION_PICKER_CAP,\n );\n if (entries.length === 0) {\n return all ? \"No sessions found.\" : \"No sessions found for this directory.\";\n }\n const options: SelectOption[] = await Promise.all(\n entries.map(async ({ meta, messageCount }) => {\n const parts = [`${messageCount} messages · ${relativeTime(meta.updatedAt)}`];\n const preview = await sessionPreview(meta.id);\n if (preview) parts.push(preview);\n if (all) parts.push(`[${meta.cwd}]`);\n return {\n value: meta.id,\n label: meta.title || shortSessionId(meta.id),\n description: parts.join(\" · \"),\n hint: meta.id === sessionStoreRef.current?.id ? \"current\" : undefined,\n };\n }),\n );\n const picked = await showPicker(\n all ? \"Resume a session (all directories)\" : \"Resume a session\",\n options,\n );\n if (!picked) return \"Session unchanged — picker cancelled.\";\n return resume(picked);\n },\n forkSession: async () => {\n const current = backendRef.current;\n const store = sessionStoreRef.current;\n if (!(current instanceof AgentLoop) || !store) {\n return \"Nothing to fork — no active session.\";\n }\n const messages = await store.messages();\n if (messages.length === 0) {\n return \"Nothing to fork — the current session has no messages yet.\";\n }\n const fork = await SessionStore.create(cwd, modelNameRef.current);\n await fork.replaceMessages(messages);\n const oldMeta = await store.meta();\n const title = `Fork of ${oldMeta.title || shortSessionId(oldMeta.id)}`;\n await fork.setTitle(title);\n current.setSessionStore(fork);\n sessionStoreRef.current = fork;\n return `Forked into new session ${fork.id} (\"${title}\") and switched to it. Checkpoints and rewind history do not carry over.`;\n },\n newSession: async () => {\n const current = backendRef.current;\n if (!(current instanceof AgentLoop)) {\n return \"Current backend does not support starting a new session.\";\n }\n const store = await SessionStore.create(cwd, modelNameRef.current);\n current.setSessionStore(store);\n sessionStoreRef.current = store;\n // Keep the leading system prompt, drop everything else.\n const [first] = current.getMessages();\n await current.loadMessages(first?.role === \"system\" ? [first] : []);\n clearSnapshots();\n redrawMessages([]);\n usageRef.current = emptyUsage();\n budgetWarnedRef.current = false;\n budgetExceededRef.current = false;\n setUsageVersion((v) => v + 1);\n return `Started a new session (${store.id}) with a clean context.`;\n },\n clearSessions: async (all) => {\n const currentId = sessionStoreRef.current?.id;\n const removed = await clearSessions(all ? undefined : cwd, currentId);\n if (removed === 0) {\n return all ? \"No stored sessions to delete.\" : \"No stored sessions for this directory.\";\n }\n const scope = all ? \"across all directories\" : \"for this directory\";\n const kept = currentId ? \" The current session is still active.\" : \"\";\n return `Deleted ${removed} session(s) ${scope}.${kept}`;\n },\n showTodos: async () => {\n const store = new TodoStore();\n await store.load(cwd);\n return formatTodos(store.list());\n },\n listTasks: () => formatTaskList(defaultTaskManager.list()),\n showUsage: () => {\n const modelConfig = config.models.find((m) => m.name === modelNameRef.current);\n return `${formatUsage(usageRef.current)}\\n${estimateCost(usageRef.current, modelNameRef.current, modelConfig)}`;\n },\n showGlobalUsage: async () => formatUsageDashboard(await collectUsageStats(), config.models),\n compactContext: async () => {\n let summaryModel = null;\n try {\n summaryModel = createModel(config, modelNameRef.current);\n } catch {\n summaryModel = null;\n }\n const result = await compactSession({\n backend: backendRef.current,\n sessionStore: sessionStoreRef.current,\n config,\n model: summaryModel,\n });\n if (result.compacted && result.messages) {\n const display = buildDisplayMessages(result.messages);\n nextIdRef.current = display.length;\n applyMessages(display);\n }\n return result.message;\n },\n exportSession: (arg) =>\n exportSession({\n backend: backendRef.current,\n sessionStore: sessionStoreRef.current,\n cwd,\n arg,\n }),\n undo: async () => {\n const current = backendRef.current;\n if (!(current instanceof AgentLoop)) {\n return \"Nothing to undo.\";\n }\n // Turn-scoped undo: retract the last turn's messages, and revert file\n // changes only when they provably belong to that same turn.\n const { removed, turn } = await current.retractLastTurn();\n if (removed === 0) {\n return \"Nothing to undo (no conversation turn to retract).\";\n }\n const reverted = turn !== undefined ? await undoTurnSnapshots(turn) : [];\n // Mirror the retraction on screen: drop the last prompt and everything\n // the turn produced (answer chunks, tool cards, notifications). Static\n // output cannot be edited in place, so the surviving history is\n // redrawn from a cleared screen.\n const visible = messagesRef.current;\n let cut = -1;\n for (let i = visible.length - 1; i >= 0; i--) {\n if (visible[i]?.role === \"user\") {\n cut = i;\n break;\n }\n }\n redrawMessages(cut >= 0 ? visible.slice(0, cut) : visible);\n return [...reverted, `Retracted the last conversation turn (${removed} messages).`].join(\n \"\\n\",\n );\n },\n rewind: async (args) => {\n if (!args) {\n return formatCheckpointList(listSnapshots(), cwd);\n }\n const id = Number.parseInt(args, 10);\n if (!Number.isFinite(id) || String(id) !== args) {\n return `Usage: /rewind <n> — \"${args}\" is not a checkpoint number.`;\n }\n const plan = planRewind(listSnapshots(), id);\n if (!plan) {\n return `Checkpoint #${id} not found (it may already have been rewound). /rewind lists the current checkpoints.`;\n }\n const current = backendRef.current;\n const messageCount =\n plan.messageIndex !== null && current instanceof AgentLoop\n ? current.countRetraction(plan.messageIndex)\n : 0;\n // Rewinds are destructive: confirm before touching files or history.\n const confirmed = await new Promise<boolean>((resolve) => {\n setPendingRewind({\n summary: `Rewind to just before checkpoint #${id} (${plan.target.toolName} ${plan.target.path}):\\n${plan.affected.length} file change(s) will be reverted, ${messageCount} message(s) retracted.`,\n resolve,\n });\n });\n if (!confirmed) {\n return \"Rewind cancelled.\";\n }\n const result = await rewindToSnapshot(id);\n if (!result) {\n return `Checkpoint #${id} is no longer available.`;\n }\n let retracted = 0;\n if (result.messageIndex !== null && current instanceof AgentLoop) {\n retracted = await current.retractFromIndex(result.messageIndex);\n if (retracted > 0) {\n const display = buildDisplayMessages([...current.getMessages()]);\n nextIdRef.current = display.length;\n redrawMessages(display);\n }\n }\n return [\n ...result.reverted,\n `Rewound to before checkpoint #${id}: ${result.reverted.length} file change(s) reverted, ${retracted} message(s) retracted.`,\n ].join(\"\\n\");\n },\n permissionMode: async (args) => {\n const current = config.permissionMode;\n if (!args) {\n const mark = (m: string) => (m === current ? \"*\" : \" \");\n return [\n \"Permission modes (* = current):\",\n `${mark(\"ask\")} ask — reads allowed; writes/exec ask for confirmation`,\n `${mark(\"auto\")} auto — everything allowed except hard-denied dangerous commands/paths`,\n `${mark(\"readonly\")} readonly — read-only; all writes/exec denied`,\n `${mark(\"yolo\")} yolo — allow everything, never ask (disables ALL safety checks)`,\n ].join(\"\\n\");\n }\n const mode = args.toLowerCase();\n if (![\"ask\", \"auto\", \"readonly\", \"yolo\"].includes(mode)) {\n return `Unknown permission mode: ${args} (expected ask | auto | readonly | yolo)`;\n }\n config.permissionMode = mode as StarConfig[\"permissionMode\"];\n prevModeRef.current = null;\n setPermissionModeState(mode);\n await savePermissionMode(mode);\n return mode === \"yolo\"\n ? \"Permission mode set to yolo — ALL safety checks disabled, tools run without asking. Saved to config.\"\n : `Permission mode set to ${mode}. Saved to config.`;\n },\n planMode: async () => {\n if (config.permissionMode === \"plan\") {\n const restore = prevModeRef.current ?? \"ask\";\n applySessionMode(restore);\n return `Exited plan mode — permission mode back to ${restore} (this session only).`;\n }\n applySessionMode(\"plan\");\n return \"Entered plan mode: the agent researches with read-only tools and presents a plan for approval before anything is executed. /plan again to exit.\";\n },\n initProject: async (args) => {\n let model = null;\n try {\n model = createModel(config, modelNameRef.current);\n } catch {\n model = null;\n }\n const result = await initProject({ cwd, args, model });\n return result.message;\n },\n runDoctor: async () => formatDoctorReport(await runDoctor({ cwd, config })),\n submitPrompt: async (text) => {\n await runStream(text);\n },\n describeConfig: () =>\n [\n `defaultModel: ${config.defaultModel || \"(none)\"}`,\n `permissionMode: ${config.permissionMode}`,\n `providers (${config.providers.length}): ${config.providers.map((p) => p.name).join(\", \") || \"(none)\"}`,\n `models (${config.models.length}): ${config.models.map((m) => m.name).join(\", \") || \"(none)\"}`,\n `maxSteps: ${config.maxSteps}`,\n `contextMaxTokens: ${config.contextMaxTokens}`,\n `streamIdleTimeoutSec: ${config.streamIdleTimeoutSec}`,\n `streamFirstChunkTimeoutSec: ${config.streamFirstChunkTimeoutSec}`,\n `streamMaxRetries: ${config.streamMaxRetries}`,\n `maxAutoContinues: ${config.maxAutoContinues}`,\n `permissions.allow (${config.permissions.allow.length}): ${config.permissions.allow.join(\", \") || \"(none)\"}`,\n `hooks (${config.hooks.length}): ${config.hooks.map((h) => h.event).join(\", \") || \"(none)\"}`,\n ].join(\"\\n\"),\n };\n const reg = new CommandRegistry();\n registerBuiltinCommands(reg);\n registerCustomCommands(reg, cwd);\n return Object.assign(reg, { ctx });\n }, [\n pushMessage,\n handleExit,\n config,\n cwd,\n switchModel,\n resume,\n runStream,\n applyMessages,\n redrawMessages,\n applySessionMode,\n setPendingRewind,\n showPicker,\n ]);\n\n const runShellBang = useCallback(\n async (raw: string) => {\n pushMessage(\"user\", `!${raw.trim()}`);\n const controller = new AbortController();\n abortRef.current = controller;\n try {\n const outcome = await executeShellBang(raw, cwd, controller.signal);\n if (!outcome.ok) {\n pushMessage(\n \"system\",\n outcome.reason === \"dangerous\"\n ? `Refused to run dangerous command: ${raw.trim()}`\n : \"Usage: !<command>\",\n );\n return;\n }\n pushMessage(\n \"tool\",\n formatToolCard({\n id: `bang-${nextIdRef.current}`,\n name: \"bash\",\n argsSummary: outcome.command,\n result: outcome.output,\n isError: outcome.isError,\n }),\n );\n const current = backendRef.current;\n if (current instanceof AgentLoop) {\n await current.appendContextMessage(outcome.contextMessage);\n }\n } finally {\n if (abortRef.current === controller) {\n abortRef.current = null;\n }\n }\n },\n [cwd, pushMessage],\n );\n\n const handleSubmit = useCallback(\n (text: string) => {\n appendHistory(text);\n if (text.startsWith(\"!\")) {\n // A bang would clobber the streaming turn's abort controller, so it\n // waits in the queue like a regular prompt.\n if (abortRef.current) {\n queueRef.current.enqueue({ text, images: [] });\n setQueueItems(queueRef.current.list());\n return;\n }\n void runShellBang(text.slice(1));\n return;\n }\n if (text.startsWith(\"/\")) {\n const parsed = parseSlashCommand(text);\n if (!parsed) return;\n const command = registry.get(parsed.name);\n if (!command) {\n const suggestions = registry.complete(parsed.name).map((cmd) => cmd.name);\n pushMessage(\n \"system\",\n `Unknown command: /${parsed.name} (try /help)${didYouMeanSuffix(suggestions)}`,\n );\n return;\n }\n void command.run(parsed.args, registry.ctx);\n return;\n }\n const budget = config.sessionBudgetUsd;\n if (budgetState(sessionCostUsd(), budget) === \"exceeded\") {\n pushMessage(\n \"system\",\n `Session budget of $${formatDollars(budget ?? 0)} (sessionBudgetUsd) is exceeded — prompts are blocked. Slash commands still work; raise sessionBudgetUsd in the config or start a /new session.`,\n );\n return;\n }\n const images = pendingImagesRef.current.map((staged) => staged.image);\n if (images.length > 0) clearPendingImages();\n if (abortRef.current) {\n queueRef.current.enqueue({ text, images });\n setQueueItems(queueRef.current.list());\n return;\n }\n void runStream(text, images);\n },\n [registry, pushMessage, runStream, runShellBang, config, clearPendingImages, sessionCostUsd],\n );\n\n const commandHints = useMemo(\n () =>\n registry.list().map((cmd) => ({\n name: cmd.name,\n description: cmd.description,\n usage: cmd.usage ?? `/${cmd.name}`,\n })),\n [registry],\n );\n\n // Expensive status-bar bits (sync git call, token estimate over the full\n // history) refresh on turn boundaries and history rewrites, not per tick.\n // biome-ignore lint/correctness/useExhaustiveDependencies: isStreaming and epoch are deliberate refresh triggers, not values read inside\n useEffect(() => {\n setGitBranch(getGitSummary(cwd)?.branch ?? null);\n const current = backendRef.current;\n if (current instanceof AgentLoop) {\n const window_ = contextWindowTokens(config, modelNameRef.current);\n const pct = (estimateTokens([...current.getMessages()]) / window_) * 100;\n // One decimal below 10% so small-but-real usage doesn't display as 0%.\n setContextPercent(pct < 10 ? Math.round(pct * 10) / 10 : Math.round(pct));\n } else {\n setContextPercent(null);\n }\n }, [cwd, config, isStreaming, epoch]);\n\n const sessionCost = sessionCostUsd();\n\n return (\n <Box flexDirection=\"column\">\n <MessageList key={`messages-${epoch}`} messages={messages} />\n {(thinking || activity !== null) && (\n <ThinkingIndicator\n reasoning={thinkingText}\n frame={spinnerTick}\n activity={activity ?? undefined}\n />\n )}\n {!thinking && activity === null && thoughtSummary !== null && (\n <Text dimColor>{thoughtSummary}</Text>\n )}\n {streamingText !== null && (streamingText !== \"\" || turnChunksRef.current === 0) && (\n <StreamingMessage text={streamingText} continuation={turnChunksRef.current > 0} />\n )}\n {pending && (\n <PermissionPrompt\n request={pending.request}\n preview={pending.preview}\n onDecision={handleDecision}\n />\n )}\n {planApproval && <ExitPlanPrompt onDecision={handlePlanDecision} />}\n {pendingRewind && (\n <RewindConfirmPrompt summary={pendingRewind.summary} onDecision={handleRewindDecision} />\n )}\n {picker && (\n <SelectPrompt\n title={picker.title}\n options={picker.options}\n onSelect={handlePickerSelect}\n onCancel={handlePickerCancel}\n />\n )}\n {queueItems.map((item) => (\n <Text key={item.id} dimColor>\n queued: {item.text.length > 80 ? `${item.text.slice(0, 80)}…` : item.text}\n </Text>\n ))}\n {pendingImages.map((staged) => (\n <Text key={staged.id} dimColor>\n [image attached: {staged.image.path}]\n </Text>\n ))}\n <TodoPanel todos={todos} />\n <InputBox\n isStreaming={isStreaming}\n disabled={pending !== null || planApproval || pendingRewind !== null || picker !== null}\n commands={commandHints}\n cwd={cwd}\n refill={inputRefill}\n initialHistory={initialHistory}\n onSubmit={handleSubmit}\n onInterrupt={interrupt}\n onExit={handleExit}\n onPasteImage={handlePasteImage}\n />\n <StatusBar\n cwd={cwd}\n model={modelName}\n permissionMode={permissionModeState}\n tokens={usageRef.current.totalTokens}\n gitBranch={gitBranch}\n contextPercent={contextPercent}\n sessionCostUsd={sessionCost}\n backgroundTasks={bgLabels}\n />\n </Box>\n );\n}\n\nexport interface ReplOptions {\n model: string;\n permissionMode: string;\n config: StarConfig;\n cwd: string;\n sessionStore: SessionStore | null;\n initialMessages?: CoreMessage[];\n initialUsage?: UsageStats;\n}\n\nexport function renderRepl(backend: ChatBackend, opts: ReplOptions) {\n // Backstop for abnormal exits: never leave orphaned background processes.\n process.on(\"exit\", () => {\n defaultTaskManager.cleanup();\n });\n return render(\n <Repl\n backend={backend}\n model={opts.model}\n permissionMode={opts.permissionMode}\n config={opts.config}\n cwd={opts.cwd}\n sessionStore={opts.sessionStore}\n initialMessages={opts.initialMessages}\n initialUsage={opts.initialUsage}\n />,\n );\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { parse, stringify } from \"smol-toml\";\nimport { globalConfigPath } from \"./paths\";\n\nexport async function addAllowRule(rule: string): Promise<boolean> {\n return addPermissionRule(\"allow\", rule);\n}\n\nexport async function addDenyRule(rule: string): Promise<boolean> {\n return addPermissionRule(\"deny\", rule);\n}\n\nasync function addPermissionRule(kind: \"allow\" | \"deny\", rule: string): Promise<boolean> {\n const filePath = globalConfigPath();\n let raw: Record<string, unknown> = {};\n try {\n const content = await fs.promises.readFile(filePath, \"utf8\");\n raw = parse(content) as Record<string, unknown>;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n const permissions =\n typeof raw.permissions === \"object\" && raw.permissions !== null\n ? (raw.permissions as Record<string, unknown>)\n : {};\n const rules = Array.isArray(permissions[kind]) ? (permissions[kind] as string[]) : [];\n if (rules.includes(rule)) return false;\n permissions[kind] = [...rules, rule];\n raw.permissions = permissions;\n await fs.promises.mkdir(path.dirname(filePath), { recursive: true });\n await fs.promises.writeFile(filePath, stringify(raw), \"utf8\");\n return true;\n}\n\nexport async function savePermissionMode(mode: string): Promise<void> {\n const filePath = globalConfigPath();\n let raw: Record<string, unknown> = {};\n try {\n const content = await fs.promises.readFile(filePath, \"utf8\");\n raw = parse(content) as Record<string, unknown>;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n raw.permissionMode = mode;\n await fs.promises.mkdir(path.dirname(filePath), { recursive: true });\n await fs.promises.writeFile(filePath, stringify(raw), \"utf8\");\n}\n","import { z } from \"zod\";\n\nexport const ProviderConfigSchema = z.object({\n name: z.string(),\n protocol: z\n .enum([\"openai-compatible\", \"anthropic\", \"openai-responses\"])\n .default(\"openai-compatible\"),\n baseURL: z.string(),\n apiKeyEnv: z.string().optional(),\n apiKey: z.string().optional(),\n headers: z.record(z.string()).optional(),\n});\n\nexport const ModelConfigSchema = z.object({\n name: z.string(),\n provider: z.string(),\n model: z.string(),\n maxTokens: z.number().int().positive().optional(),\n // Per-model context window; overrides the top-level contextMaxTokens for\n // compaction and the status bar when set.\n contextMaxTokens: z.number().int().positive().optional(),\n // Cost estimation needs BOTH prices (USD per 1M tokens); with only one set\n // the model is treated as unpriced.\n promptPrice: z.number().nonnegative().optional(),\n completionPrice: z.number().nonnegative().optional(),\n});\n\nexport const PermissionsConfigSchema = z.object({\n allow: z.array(z.string()).default([]),\n deny: z.array(z.string()).default([]),\n});\n\nexport const HookConfigSchema = z.object({\n event: z.enum([\"PreToolUse\", \"PostToolUse\", \"Stop\"]),\n matcher: z\n .string()\n .refine(\n (pattern) => {\n try {\n new RegExp(pattern);\n return true;\n } catch {\n return false;\n }\n },\n { message: \"invalid regular expression\" },\n )\n .optional(),\n command: z.string().min(1),\n timeoutSec: z.number().positive().default(30),\n});\n\nexport const ConfigSchema = z.object({\n defaultModel: z.string().default(\"\"),\n permissionMode: z.enum([\"auto\", \"ask\", \"readonly\", \"yolo\", \"plan\"]).default(\"ask\"),\n providers: z.array(ProviderConfigSchema).default([]),\n models: z.array(ModelConfigSchema).default([]),\n maxSteps: z.number().int().positive().default(50),\n contextMaxTokens: z.number().int().positive().default(100_000),\n // Seconds without any stream part before a stalled response is ended\n // gracefully (some relays never send the terminal chunks). Applies once\n // streaming has started; the first part gets a longer, fixed allowance.\n streamIdleTimeoutSec: z.number().positive().default(20),\n // Seconds to wait for the very first stream part before giving up; slow\n // thinking-model relays can buffer for minutes before sending anything.\n streamFirstChunkTimeoutSec: z.number().positive().default(300),\n // Extra attempts per model request when a stream fails transiently\n // (network error, 429/5xx, idle watchdog cutoff) or comes back empty, so a\n // relay hiccup does not silently end a half-finished turn. 0 disables.\n // Retries after a timeout/empty failure scale both stream timeouts up\n // (attempt number ×, capped at 3x) since the relay is likely overloaded.\n streamMaxRetries: z.number().int().min(0).default(3),\n // How many times a turn may be nudged to continue when the model ends it\n // with a text-only reply that announces pending work (\"我将…\", \"I will…\")\n // instead of tool calls — a common premature-stop failure of weaker\n // agentic models. Never fires in plan mode. 0 disables.\n maxAutoContinues: z.number().int().min(0).default(2),\n contextCompaction: z.enum([\"summary\", \"truncate\"]).default(\"summary\"),\n // Optional per-session dollar budget; when set, the REPL stops the session\n // once the estimated cost for the session reaches this amount.\n sessionBudgetUsd: z.number().positive().optional(),\n // Terminal bell (REPL only): ring when a turn takes longer than\n // notifyBellThresholdSec, and when a background task finishes.\n // STAR_NO_NOTIFY=1 disables without touching the config.\n notifyBell: z.boolean().default(true),\n notifyBellThresholdSec: z.number().positive().default(10),\n permissions: PermissionsConfigSchema.default({ allow: [], deny: [] }),\n hooks: z.array(HookConfigSchema).default([]),\n});\n\nexport type ProviderConfig = z.infer<typeof ProviderConfigSchema>;\nexport type ModelConfig = z.infer<typeof ModelConfigSchema>;\nexport type PermissionsConfig = z.infer<typeof PermissionsConfigSchema>;\nexport type HookConfig = z.infer<typeof HookConfigSchema>;\nexport type StarConfig = z.infer<typeof ConfigSchema>;\n\n// Effective context window for a model: its own contextMaxTokens when set,\n// otherwise the top-level config.contextMaxTokens.\nexport function contextWindowTokens(config: StarConfig, modelName: string): number {\n return (\n config.models.find((m) => m.name === modelName)?.contextMaxTokens ?? config.contextMaxTokens\n );\n}\n\nexport interface CliOverrides {\n model?: string;\n permissionMode?: \"auto\" | \"ask\" | \"readonly\" | \"yolo\" | \"plan\";\n}\n","import { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOpenAICompatible } from \"@ai-sdk/openai-compatible\";\nimport type { LanguageModel } from \"ai\";\nimport type { ProviderConfig, StarConfig } from \"../config/schema\";\nimport { resolveModelConfig } from \"./registry\";\n\nfunction resolveApiKey(provider: ProviderConfig): string {\n const fromEnv = provider.apiKeyEnv ? process.env[provider.apiKeyEnv] : undefined;\n const apiKey = fromEnv ?? provider.apiKey;\n if (!apiKey) {\n const hint = provider.apiKeyEnv\n ? `set ${provider.apiKeyEnv} or configure apiKey`\n : \"configure apiKey\";\n throw new Error(`Missing API key for provider \"${provider.name}\": ${hint}`);\n }\n return apiKey;\n}\n\nexport function createModel(config: StarConfig, modelName?: string): LanguageModel {\n const modelConfig = resolveModelConfig(config, modelName);\n const provider = config.providers.find((p) => p.name === modelConfig.provider);\n if (!provider) {\n const available = config.providers.map((p) => p.name).join(\", \") || \"(none)\";\n throw new Error(\n `Provider \"${modelConfig.provider}\" for model \"${modelConfig.name}\" not found. Available providers: ${available}`,\n );\n }\n const apiKey = resolveApiKey(provider);\n switch (provider.protocol) {\n case \"anthropic\":\n return createAnthropic({\n baseURL: provider.baseURL,\n apiKey,\n headers: provider.headers,\n })(modelConfig.model);\n case \"openai-compatible\":\n return createOpenAICompatible({\n name: provider.name,\n baseURL: provider.baseURL,\n apiKey,\n headers: provider.headers,\n })(modelConfig.model);\n case \"openai-responses\":\n return createOpenAI({\n baseURL: provider.baseURL,\n apiKey,\n headers: provider.headers,\n }).responses(modelConfig.model);\n }\n}\n","import type { ModelConfig, StarConfig } from \"../config/schema\";\n\nexport function listModels(config: StarConfig): ModelConfig[] {\n return config.models;\n}\n\nexport function resolveModelConfig(config: StarConfig, modelName?: string): ModelConfig {\n const name = modelName ?? config.defaultModel;\n const model = config.models.find((m) => m.name === name);\n if (!model) {\n const available = config.models.map((m) => m.name).join(\", \") || \"(none)\";\n throw new Error(`Model \"${name}\" not found. Available models: ${available}`);\n }\n return model;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { FileSnapshot } from \"../tools/fs/snapshots\";\n\nexport interface CheckpointRecord {\n id: number;\n timestamp: number;\n path: string;\n existed: boolean;\n toolName: string;\n turn: number;\n messageIndex: number;\n}\n\nfunction checkpointsDir(sessionDir: string): string {\n return path.join(sessionDir, \"checkpoints\");\n}\n\nfunction indexPath(sessionDir: string): string {\n return path.join(checkpointsDir(sessionDir), \"index.json\");\n}\n\nexport function checkpointContentPath(sessionDir: string, id: number): string {\n return path.join(checkpointsDir(sessionDir), `${id}.snapshot`);\n}\n\nexport async function listCheckpointRecords(sessionDir: string): Promise<CheckpointRecord[]> {\n let raw: string;\n try {\n raw = await fs.readFile(indexPath(sessionDir), \"utf8\");\n } catch {\n return [];\n }\n try {\n const parsed = JSON.parse(raw) as CheckpointRecord[];\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\n// Lazily creates the checkpoints directory on first use, mirroring\n// SessionStore's lazy creation — a session without file writes leaves no\n// checkpoints on disk.\nexport async function appendCheckpointRecord(\n sessionDir: string,\n record: CheckpointRecord,\n content: string | null,\n): Promise<void> {\n await fs.mkdir(checkpointsDir(sessionDir), { recursive: true });\n if (record.existed && content !== null) {\n await fs.writeFile(checkpointContentPath(sessionDir, record.id), content, \"utf8\");\n }\n const records = await listCheckpointRecords(sessionDir);\n records.push(record);\n await fs.writeFile(indexPath(sessionDir), JSON.stringify(records, null, 2));\n}\n\nexport async function removeCheckpointRecords(sessionDir: string, ids: number[]): Promise<void> {\n if (ids.length === 0) return;\n const drop = new Set(ids);\n const records = await listCheckpointRecords(sessionDir);\n const kept = records.filter((record) => !drop.has(record.id));\n if (kept.length === records.length) return;\n await fs.mkdir(checkpointsDir(sessionDir), { recursive: true });\n await fs.writeFile(indexPath(sessionDir), JSON.stringify(kept, null, 2));\n for (const id of ids) {\n await fs.rm(checkpointContentPath(sessionDir, id), { force: true });\n }\n}\n\n// Maps persisted records back into snapshots whose content is read lazily\n// from the per-checkpoint content file, for hydrating the in-memory stack\n// after a session resume.\nexport async function loadSessionSnapshots(sessionDir: string): Promise<FileSnapshot[]> {\n const records = await listCheckpointRecords(sessionDir);\n return records.map((record) => ({\n ...record,\n content: null,\n contentFile: record.existed ? checkpointContentPath(sessionDir, record.id) : undefined,\n }));\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { sessionsDir } from \"../config/paths\";\nimport { SessionStore } from \"./store\";\n\n// Deletes stored sessions and returns how many were removed. With a cwd only\n// sessions recorded for that directory go (directories with an unreadable\n// meta.json cannot be matched and stay); without it every session directory\n// under sessionsDir is removed. excludeId keeps the caller's live session on\n// disk (the REPL's /clear-sessions must not pull its own store away).\nexport async function clearSessions(cwd?: string, excludeId?: string): Promise<number> {\n if (cwd !== undefined) {\n const metas = await SessionStore.list(cwd);\n let removed = 0;\n for (const meta of metas) {\n if (meta.id === excludeId) continue;\n await fs.rm(path.join(sessionsDir(), meta.id), { recursive: true, force: true });\n removed += 1;\n }\n return removed;\n }\n let entries: string[];\n try {\n entries = await fs.readdir(sessionsDir());\n } catch {\n return 0;\n }\n let removed = 0;\n for (const entry of entries) {\n if (entry === excludeId) continue;\n await fs.rm(path.join(sessionsDir(), entry), { recursive: true, force: true });\n removed += 1;\n }\n return removed;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { sessionsDir } from \"../config/paths\";\nimport type { CoreMessage } from \"../core/messages\";\nimport {\n type CheckpointRecord,\n appendCheckpointRecord,\n listCheckpointRecords,\n removeCheckpointRecords,\n} from \"./checkpoints\";\n\nexport interface SessionUsage {\n requests: number;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface DayUsageBucket {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface SessionMeta {\n id: string;\n title: string;\n model: string;\n cwd: string;\n createdAt: number;\n updatedAt: number;\n usage?: SessionUsage;\n // Per-day token buckets keyed by local date (YYYY-MM-DD), recorded alongside\n // `usage` from the day this field was introduced; older sessions only have\n // the grand totals in `usage`.\n usageByDay?: Record<string, DayUsageBucket>;\n}\n\nfunction generateId(now: Date): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const stamp =\n `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}` +\n `${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;\n const suffix = Math.random().toString(16).slice(2, 8).padEnd(6, \"0\");\n return `${stamp}-${suffix}`;\n}\n\nfunction debugWarn(message: string): void {\n if (process.env.STAR_DEBUG === \"1\") process.stderr.write(`[star-cli] ${message}\\n`);\n}\n\nexport function dayKey(date: Date): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n}\n\nexport class SessionStore {\n readonly id: string;\n readonly dir: string;\n\n private pendingMeta: { cwd: string; model: string; createdAt: number } | null = null;\n private initialized = false;\n\n private constructor(id: string) {\n this.id = id;\n this.dir = path.join(sessionsDir(), id);\n }\n\n private metaPath(): string {\n return path.join(this.dir, \"meta.json\");\n }\n\n private messagesPath(): string {\n return path.join(this.dir, \"messages.jsonl\");\n }\n\n static async create(cwd: string, model: string): Promise<SessionStore> {\n const store = new SessionStore(generateId(new Date()));\n store.pendingMeta = { cwd, model, createdAt: Date.now() };\n return store;\n }\n\n static async open(id: string): Promise<SessionStore | null> {\n const store = new SessionStore(id);\n let raw: string;\n try {\n raw = await fs.readFile(store.metaPath(), \"utf8\");\n } catch {\n return null;\n }\n try {\n const meta = JSON.parse(raw) as SessionMeta;\n if (meta.id !== id) return null;\n } catch {\n // meta.json is corrupt (e.g. truncated write); open anyway and let\n // meta() fall back to defaults so messages stay resumable.\n debugWarn(`session ${id}: corrupt meta.json, using defaults`);\n }\n store.initialized = true;\n return store;\n }\n\n static async list(cwd?: string): Promise<SessionMeta[]> {\n let entries: string[];\n try {\n entries = await fs.readdir(sessionsDir());\n } catch {\n return [];\n }\n const metas: SessionMeta[] = [];\n for (const entry of entries) {\n try {\n const raw = await fs.readFile(path.join(sessionsDir(), entry, \"meta.json\"), \"utf8\");\n const meta = JSON.parse(raw) as SessionMeta;\n if (meta.id === entry && (cwd === undefined || meta.cwd === cwd)) metas.push(meta);\n } catch {\n // 跳过损坏的会话目录\n }\n }\n return metas.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n const pending = this.pendingMeta;\n if (!pending) {\n this.initialized = true;\n return;\n }\n await fs.mkdir(this.dir, { recursive: true });\n const meta: SessionMeta = {\n id: this.id,\n title: \"\",\n model: pending.model,\n cwd: pending.cwd,\n createdAt: pending.createdAt,\n updatedAt: pending.createdAt,\n };\n await fs.writeFile(this.metaPath(), JSON.stringify(meta, null, 2));\n this.initialized = true;\n }\n\n async append(message: CoreMessage): Promise<void> {\n await this.ensureInitialized();\n await fs.appendFile(this.messagesPath(), `${JSON.stringify(message)}\\n`);\n const meta = await this.meta();\n meta.updatedAt = Date.now();\n await fs.writeFile(this.metaPath(), JSON.stringify(meta, null, 2));\n }\n\n async replaceMessages(messages: CoreMessage[]): Promise<void> {\n await this.ensureInitialized();\n const content = messages.map((message) => JSON.stringify(message)).join(\"\\n\");\n await fs.writeFile(this.messagesPath(), content ? `${content}\\n` : \"\");\n const meta = await this.meta();\n meta.updatedAt = Date.now();\n await fs.writeFile(this.metaPath(), JSON.stringify(meta, null, 2));\n }\n\n async messages(): Promise<CoreMessage[]> {\n let raw: string;\n try {\n raw = await fs.readFile(this.messagesPath(), \"utf8\");\n } catch {\n return [];\n }\n const messages: CoreMessage[] = [];\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n messages.push(JSON.parse(trimmed) as CoreMessage);\n } catch {\n debugWarn(`session ${this.id}: skipping corrupt messages.jsonl line`);\n }\n }\n return messages;\n }\n\n private fallbackMeta(): SessionMeta {\n const now = Date.now();\n return { id: this.id, title: \"\", model: \"\", cwd: \"\", createdAt: now, updatedAt: now };\n }\n\n async meta(): Promise<SessionMeta> {\n await this.ensureInitialized();\n try {\n const raw = await fs.readFile(this.metaPath(), \"utf8\");\n return JSON.parse(raw) as SessionMeta;\n } catch {\n debugWarn(`session ${this.id}: unreadable meta.json, using defaults`);\n return this.fallbackMeta();\n }\n }\n\n async setTitle(title: string): Promise<void> {\n await this.ensureInitialized();\n const meta = await this.meta();\n meta.title = title;\n meta.updatedAt = Date.now();\n await fs.writeFile(this.metaPath(), JSON.stringify(meta, null, 2));\n }\n\n async appendCheckpoint(record: CheckpointRecord, content: string | null): Promise<void> {\n await this.ensureInitialized();\n await appendCheckpointRecord(this.dir, record, content);\n }\n\n async listCheckpoints(): Promise<CheckpointRecord[]> {\n return listCheckpointRecords(this.dir);\n }\n\n async removeCheckpoints(ids: number[]): Promise<void> {\n await removeCheckpointRecords(this.dir, ids);\n }\n\n async addUsage(delta: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n }): Promise<void> {\n await this.ensureInitialized();\n const meta = await this.meta();\n const usage = meta.usage ?? {\n requests: 0,\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n usage.requests += 1;\n usage.promptTokens += delta.promptTokens;\n usage.completionTokens += delta.completionTokens;\n usage.totalTokens += delta.totalTokens;\n meta.usage = usage;\n const day = dayKey(new Date());\n const byDay = meta.usageByDay ?? {};\n const bucket = byDay[day] ?? { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n bucket.promptTokens += delta.promptTokens;\n bucket.completionTokens += delta.completionTokens;\n bucket.totalTokens += delta.totalTokens;\n byDay[day] = bucket;\n meta.usageByDay = byDay;\n await fs.writeFile(this.metaPath(), JSON.stringify(meta, null, 2));\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { sessionsDir } from \"../config/paths\";\nimport { type SessionMeta, SessionStore } from \"./store\";\n\nexport interface SessionListEntry {\n meta: SessionMeta;\n messageCount: number;\n}\n\nasync function countMessages(id: string): Promise<number> {\n let raw: string;\n try {\n raw = await fs.readFile(path.join(sessionsDir(), id, \"messages.jsonl\"), \"utf8\");\n } catch {\n return 0;\n }\n let count = 0;\n for (const line of raw.split(\"\\n\")) {\n if (line.trim()) count += 1;\n }\n return count;\n}\n\nexport async function listSessionEntries(cwd?: string): Promise<SessionListEntry[]> {\n const metas = await SessionStore.list(cwd);\n return Promise.all(\n metas.map(async (meta) => ({ meta, messageCount: await countMessages(meta.id) })),\n );\n}\n\nexport async function findLatestSession(cwd: string): Promise<SessionMeta | null> {\n const [latest] = await SessionStore.list(cwd);\n return latest ?? null;\n}\n\nexport function shortSessionId(id: string): string {\n const dash = id.lastIndexOf(\"-\");\n return dash === -1 ? id : id.slice(dash + 1);\n}\n\nexport async function resolveSessionId(query: string): Promise<string | null> {\n const metas = await SessionStore.list();\n const exact = metas.find((meta) => meta.id === query);\n if (exact) return exact.id;\n const matches = metas.filter(\n (meta) => shortSessionId(meta.id) === query || meta.id.startsWith(query),\n );\n return matches.length === 1 ? (matches[0]?.id ?? null) : null;\n}\n\nexport function relativeTime(timestamp: number): string {\n const diff = Date.now() - timestamp;\n const minutes = Math.floor(diff / 60_000);\n if (minutes < 1) return \"刚刚\";\n if (minutes < 60) return `${minutes} 分钟前`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours} 小时前`;\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days} 天前`;\n const months = Math.floor(days / 30);\n if (months < 12) return `${months} 个月前`;\n return `${Math.floor(months / 12)} 年前`;\n}\n\nexport function formatSessionEntries(\n entries: SessionListEntry[],\n options: { showCwd?: boolean } = {},\n): string {\n return entries\n .map(({ meta, messageCount }) => {\n const title = meta.title || \"(无标题)\";\n const base =\n `${shortSessionId(meta.id)} ${title} ` +\n `${messageCount} 条消息 更新于 ${relativeTime(meta.updatedAt)}`;\n return options.showCwd ? `${base} [${meta.cwd}]` : base;\n })\n .join(\"\\n\");\n}\n","import { type CoreMessage, reconcileToolCalls } from \"../core/messages\";\nimport { type SessionMeta, SessionStore } from \"./store\";\n\nexport async function resumeSession(\n id: string,\n): Promise<{ meta: SessionMeta; messages: CoreMessage[] } | null> {\n const store = await SessionStore.open(id);\n if (!store) return null;\n const [meta, loaded] = await Promise.all([store.meta(), store.messages()]);\n const messages = reconcileToolCalls(loaded);\n if (messages.length !== loaded.length) {\n await store.replaceMessages(messages);\n }\n return { meta, messages };\n}\n","import type { ModelConfig } from \"../config/schema\";\n\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n}\n\nexport function formatDollars(cost: number): string {\n let s = cost.toFixed(4).replace(/0+$/, \"\");\n if (s.endsWith(\".\")) {\n s += \"00\";\n } else if (s.split(\".\")[1]?.length === 1) {\n s += \"0\";\n }\n return s;\n}\n\n// Numeric session cost in USD; null when the model has no pricing configured.\nexport function computeCostUsd(usage: TokenUsage, model: ModelConfig | undefined): number | null {\n if (model?.promptPrice === undefined || model.completionPrice === undefined) {\n return null;\n }\n return (\n (usage.promptTokens * model.promptPrice + usage.completionTokens * model.completionPrice) /\n 1_000_000\n );\n}\n\nexport function estimateCost(\n usage: TokenUsage,\n modelName: string,\n model: ModelConfig | undefined,\n): string {\n const cost = computeCostUsd(usage, model);\n if (cost === null) {\n if (model !== undefined) {\n const missing = [\n model.promptPrice === undefined ? \"promptPrice\" : null,\n model.completionPrice === undefined ? \"completionPrice\" : null,\n ].filter((f) => f !== null);\n if (missing.length === 1) {\n return `Estimated cost: unknown (${model.name} is missing ${missing[0]} — both prices are needed)`;\n }\n }\n return `Estimated cost: unknown (no price configured for ${modelName})`;\n }\n return `Estimated cost: $${formatDollars(cost)} (${model?.name} @ $${model?.promptPrice}/M prompt, $${model?.completionPrice}/M completion)`;\n}\n","import { formatDollars } from \"../cli/cost\";\nimport type { ModelConfig } from \"../config/schema\";\nimport { type SessionMeta, SessionStore } from \"./store\";\n\nexport interface UsageBucket {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface DayUsage extends UsageBucket {\n date: string;\n}\n\nexport interface ModelUsage extends UsageBucket {\n model: string;\n sessions: number;\n requests: number;\n}\n\nexport interface GlobalUsageStats {\n sessions: number;\n sessionsWithUsage: number;\n requests: number;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n // Ascending by date (YYYY-MM-DD, local).\n days: DayUsage[];\n // Tokens recorded before per-day bucketing existed (usage totals minus the\n // sum of usageByDay), null when nothing predates it.\n legacy: UsageBucket | null;\n // Descending by totalTokens.\n models: ModelUsage[];\n}\n\nexport const USAGE_MAX_DAYS = 14;\n\nfunction tokens(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : 0;\n}\n\nfunction bucketOf(value: unknown): UsageBucket {\n const record = (typeof value === \"object\" && value !== null ? value : {}) as Record<\n string,\n unknown\n >;\n const promptTokens = tokens(record.promptTokens);\n const completionTokens = tokens(record.completionTokens);\n return {\n promptTokens,\n completionTokens,\n totalTokens: tokens(record.totalTokens) || promptTokens + completionTokens,\n };\n}\n\nfunction addTo(target: UsageBucket, source: UsageBucket): void {\n target.promptTokens += source.promptTokens;\n target.completionTokens += source.completionTokens;\n target.totalTokens += source.totalTokens;\n}\n\nexport function aggregateUsage(metas: SessionMeta[]): GlobalUsageStats {\n const days = new Map<string, UsageBucket>();\n const models = new Map<string, ModelUsage>();\n const legacy: UsageBucket = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n let hasLegacy = false;\n let sessionsWithUsage = 0;\n let requests = 0;\n const grand: UsageBucket = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n\n for (const meta of metas) {\n const dayBuckets: [string, UsageBucket][] = [];\n if (meta.usageByDay !== null && typeof meta.usageByDay === \"object\") {\n for (const [date, value] of Object.entries(meta.usageByDay)) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) continue;\n dayBuckets.push([date, bucketOf(value)]);\n }\n }\n const daySum: UsageBucket = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n for (const [, bucket] of dayBuckets) addTo(daySum, bucket);\n\n const hasTotals = meta.usage !== null && typeof meta.usage === \"object\";\n const totals = hasTotals ? bucketOf(meta.usage) : daySum;\n const requestCount = hasTotals && meta.usage ? tokens(meta.usage.requests) : 0;\n if (!hasTotals && dayBuckets.length === 0) continue;\n\n sessionsWithUsage += 1;\n addTo(grand, totals);\n requests += requestCount;\n\n for (const [date, bucket] of dayBuckets) {\n const acc = days.get(date) ?? { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n addTo(acc, bucket);\n days.set(date, acc);\n }\n\n if (hasTotals) {\n const rest: UsageBucket = {\n promptTokens: Math.max(0, totals.promptTokens - daySum.promptTokens),\n completionTokens: Math.max(0, totals.completionTokens - daySum.completionTokens),\n totalTokens: Math.max(0, totals.totalTokens - daySum.totalTokens),\n };\n if (rest.promptTokens > 0 || rest.completionTokens > 0 || rest.totalTokens > 0) {\n addTo(legacy, rest);\n hasLegacy = true;\n }\n }\n\n const name = typeof meta.model === \"string\" && meta.model.trim() ? meta.model : \"unknown\";\n const entry = models.get(name) ?? {\n model: name,\n sessions: 0,\n requests: 0,\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n entry.sessions += 1;\n entry.requests += requestCount;\n addTo(entry, totals);\n models.set(name, entry);\n }\n\n return {\n sessions: metas.length,\n sessionsWithUsage,\n requests,\n promptTokens: grand.promptTokens,\n completionTokens: grand.completionTokens,\n totalTokens: grand.totalTokens,\n days: [...days.entries()]\n .map(([date, bucket]) => ({ date, ...bucket }))\n .sort((a, b) => a.date.localeCompare(b.date)),\n legacy: hasLegacy ? legacy : null,\n models: [...models.values()].sort((a, b) => b.totalTokens - a.totalTokens),\n };\n}\n\nexport async function collectUsageStats(): Promise<GlobalUsageStats> {\n return aggregateUsage(await SessionStore.list());\n}\n\nfunction fmt(n: number): string {\n return n.toLocaleString(\"en-US\");\n}\n\nconst BAR_WIDTH = 30;\n\nexport function formatUsageDashboard(\n stats: GlobalUsageStats,\n models: ModelConfig[],\n options: { maxDays?: number } = {},\n): string {\n if (stats.sessions === 0) return \"No sessions found.\";\n\n const lines: string[] = [\n \"Token usage across all sessions\",\n \"\",\n `Total: ${stats.sessions} sessions (${stats.sessionsWithUsage} with usage) · ` +\n `${fmt(stats.requests)} requests · ` +\n `${fmt(stats.promptTokens)} prompt + ${fmt(stats.completionTokens)} completion = ` +\n `${fmt(stats.totalTokens)} tokens`,\n ];\n\n if (stats.sessionsWithUsage === 0) {\n lines.push(\"\", \"No token usage recorded yet.\");\n return lines.join(\"\\n\");\n }\n\n const maxDays = options.maxDays ?? USAGE_MAX_DAYS;\n const recent = stats.days.slice(-maxDays);\n if (recent.length > 0) {\n lines.push(\"\");\n lines.push(\n stats.days.length > maxDays\n ? `By day (last ${maxDays} of ${stats.days.length} days with usage):`\n : \"By day:\",\n );\n const maxTotal = Math.max(...recent.map((day) => day.totalTokens));\n for (const day of recent) {\n const barLen =\n maxTotal > 0 ? Math.max(1, Math.round((day.totalTokens / maxTotal) * BAR_WIDTH)) : 0;\n lines.push(`${day.date} ${fmt(day.totalTokens).padStart(12)} ${\"█\".repeat(barLen)}`);\n }\n }\n if (stats.legacy) {\n lines.push(\n `Earlier usage without per-day records: ${fmt(stats.legacy.totalTokens)} tokens ` +\n `(${fmt(stats.legacy.promptTokens)} prompt + ${fmt(stats.legacy.completionTokens)} completion)`,\n );\n }\n\n lines.push(\"\", \"By model:\");\n const configured = new Map(models.map((m) => [m.name, m]));\n const rows = stats.models.map((entry) => {\n const cfg = configured.get(entry.model);\n const cost =\n cfg?.promptPrice !== undefined && cfg.completionPrice !== undefined\n ? (entry.promptTokens * cfg.promptPrice + entry.completionTokens * cfg.completionPrice) /\n 1_000_000\n : null;\n return { entry, cost };\n });\n const header = [\"model\", \"requests\", \"prompt\", \"completion\", \"total\", \"cost\"];\n const cells = rows.map(({ entry, cost }) => [\n entry.model,\n fmt(entry.requests),\n fmt(entry.promptTokens),\n fmt(entry.completionTokens),\n fmt(entry.totalTokens),\n cost === null ? \"—\" : `$${formatDollars(cost)}`,\n ]);\n const widths = header.map((h, i) =>\n Math.max(h.length, ...cells.map((row) => row[i]?.length ?? 0)),\n );\n const renderRow = (row: string[]) =>\n row\n .map((cell, i) => (i === 0 ? cell.padEnd(widths[0] ?? 0) : cell.padStart(widths[i] ?? 0)))\n .join(\" \");\n lines.push(renderRow(header));\n for (const row of cells) lines.push(renderRow(row));\n\n const pricedCosts = rows.filter((row) => row.cost !== null).map((row) => row.cost as number);\n const unpriced = rows.filter((row) => row.cost === null).map((row) => row.entry.model);\n if (pricedCosts.length > 0) {\n const total = pricedCosts.reduce((sum, cost) => sum + cost, 0);\n const note =\n unpriced.length > 0 ? ` (excludes ${unpriced.join(\", \")} — no price configured)` : \"\";\n lines.push(\"\", `Estimated cost: $${formatDollars(total)}${note}`);\n } else {\n lines.push(\"\", \"Estimated cost: unknown (no per-model pricing configured)\");\n }\n\n return lines.join(\"\\n\");\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction readPackageVersion(): string {\n try {\n const pkgPath = path.join(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"package.json\");\n const pkg: unknown = JSON.parse(fs.readFileSync(pkgPath, \"utf8\"));\n if (typeof pkg === \"object\" && pkg !== null) {\n const version = (pkg as { version?: unknown }).version;\n if (typeof version === \"string\") return version;\n }\n } catch {\n // fall through to placeholder\n }\n return \"0.0.0\";\n}\n\nexport const VERSION = readPackageVersion();\n","export type BudgetStatus = \"ok\" | \"warn\" | \"exceeded\";\n\nexport const BUDGET_WARN_RATIO = 0.8;\n\n// Session budget decision against config.sessionBudgetUsd. Cost is null when\n// the model has no pricing configured — the budget cannot be evaluated then.\nexport function budgetState(costUsd: number | null, budgetUsd: number | undefined): BudgetStatus {\n if (budgetUsd === undefined || costUsd === null) return \"ok\";\n if (costUsd >= budgetUsd) return \"exceeded\";\n if (costUsd >= budgetUsd * BUDGET_WARN_RATIO) return \"warn\";\n return \"ok\";\n}\n","import { execFile } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { readFile, unlink } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { ImageInput } from \"../core/messages\";\n\nexport const CLIPBOARD_TIMEOUT_MS = 5000;\nconst MAX_CLIPBOARD_IMAGE_BYTES = 10 * 1024 * 1024;\n\nconst execFileAsync = promisify(execFile);\n\nexport type ClipboardImagePlan =\n | { kind: \"temp-file\"; command: string; args: string[] }\n | { kind: \"stdout\"; command: string; args: string[] };\n\n// PowerShell saves the clipboard image to the temp PNG; with no image on the\n// clipboard it writes nothing and the missing file is the \"empty\" signal.\nexport function windowsClipboardImageScript(tempFile: string): string {\n const escaped = tempFile.replace(/'/g, \"''\");\n return [\n \"Add-Type -AssemblyName System.Windows.Forms\",\n \"$img = [Windows.Forms.Clipboard]::GetImage()\",\n \"if ($null -ne $img) {\",\n ` $img.Save('${escaped}', [System.Drawing.Imaging.ImageFormat]::Png)`,\n \" $img.Dispose()\",\n \"}\",\n ].join(\"; \");\n}\n\n// osascript line set: `the clipboard as «class PNGf»` errors when the\n// clipboard holds no PNG, which surfaces as a non-zero exit.\nexport function macOsClipboardImageLines(tempFile: string): string[] {\n const posix = tempFile.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n return [\n \"set pngData to the clipboard as «class PNGf»\",\n `set theFile to open for access (POSIX file \"${posix}\") with write permission`,\n \"write pngData to theFile\",\n \"close access theFile\",\n ];\n}\n\nexport function clipboardImagePlan(\n platform: NodeJS.Platform,\n tempFile: string,\n hasPngpaste: boolean,\n): ClipboardImagePlan | null {\n if (platform === \"win32\") {\n return {\n kind: \"temp-file\",\n command: \"powershell.exe\",\n args: [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-STA\",\n \"-Command\",\n windowsClipboardImageScript(tempFile),\n ],\n };\n }\n if (platform === \"darwin\") {\n if (hasPngpaste) {\n return { kind: \"temp-file\", command: \"pngpaste\", args: [tempFile] };\n }\n return {\n kind: \"temp-file\",\n command: \"osascript\",\n args: macOsClipboardImageLines(tempFile).flatMap((line) => [\"-e\", line]),\n };\n }\n if (platform === \"linux\") {\n return {\n kind: \"stdout\",\n command: \"xclip\",\n args: [\"-selection\", \"clipboard\", \"-t\", \"image/png\", \"-o\"],\n };\n }\n return null;\n}\n\nexport function clipboardCopyCommand(\n platform: NodeJS.Platform,\n): { command: string; args: string[] } | null {\n if (platform === \"win32\") return { command: \"clip.exe\", args: [] };\n if (platform === \"darwin\") return { command: \"pbcopy\", args: [] };\n if (platform === \"linux\") return { command: \"xclip\", args: [\"-selection\", \"clipboard\"] };\n return null;\n}\n\nasync function commandExists(command: string): Promise<boolean> {\n const checker = process.platform === \"win32\" ? \"where\" : \"which\";\n try {\n await execFileAsync(checker, [command], { timeout: CLIPBOARD_TIMEOUT_MS });\n return true;\n } catch {\n return false;\n }\n}\n\n// Reads a PNG image from the system clipboard. Every failure — unsupported\n// platform, missing tool, no image on the clipboard, timeout — returns null.\nexport async function readClipboardImage(): Promise<ImageInput | null> {\n const tempFile = path.join(os.tmpdir(), `star-clipboard-${randomUUID()}.png`);\n const hasPngpaste = process.platform === \"darwin\" ? await commandExists(\"pngpaste\") : false;\n const plan = clipboardImagePlan(process.platform, tempFile, hasPngpaste);\n if (!plan) return null;\n try {\n if (plan.kind === \"stdout\") {\n const { stdout } = await execFileAsync(plan.command, plan.args, {\n timeout: CLIPBOARD_TIMEOUT_MS,\n maxBuffer: MAX_CLIPBOARD_IMAGE_BYTES,\n encoding: \"buffer\",\n });\n const buf = stdout as unknown as Buffer;\n if (buf.length === 0) return null;\n return { path: \"clipboard.png\", mimeType: \"image/png\", data: buf.toString(\"base64\") };\n }\n await execFileAsync(plan.command, plan.args, { timeout: CLIPBOARD_TIMEOUT_MS });\n const buf = await readFile(tempFile).catch(() => null);\n if (!buf || buf.length === 0) return null;\n return { path: \"clipboard.png\", mimeType: \"image/png\", data: buf.toString(\"base64\") };\n } catch {\n return null;\n } finally {\n if (plan.kind === \"temp-file\") {\n await unlink(tempFile).catch(() => {});\n }\n }\n}\n\n// Copies text to the system clipboard; false on any failure.\nexport async function copyText(text: string): Promise<boolean> {\n const plan = clipboardCopyCommand(process.platform);\n if (!plan) return false;\n return new Promise((resolve) => {\n const child = execFile(plan.command, plan.args, { timeout: CLIPBOARD_TIMEOUT_MS }, (error) =>\n resolve(error === null),\n );\n child.stdin?.on(\"error\", () => {});\n child.stdin?.end(text);\n });\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { LanguageModel } from \"ai\";\nimport { AgentLoop } from \"../../agent/loop\";\nimport type { StarConfig } from \"../../config/schema\";\nimport { compactMessages, summarizeMessages } from \"../../context/compaction\";\nimport type { CompactionResult } from \"../../context/compaction\";\nimport { estimateTokens } from \"../../context/tokens\";\nimport type { CoreMessage } from \"../../core/messages\";\nimport type { SessionStore } from \"../../session/store\";\nimport type { ChatBackend } from \"../backend\";\n\nconst MIN_COMPACT_MESSAGES = 4;\n\nexport interface CompactSessionOptions {\n backend: ChatBackend;\n sessionStore: SessionStore | null;\n config: StarConfig;\n model: LanguageModel | null;\n}\n\nexport interface CompactSessionResult {\n message: string;\n compacted: boolean;\n messages?: CoreMessage[];\n}\n\nexport async function compactSession(opts: CompactSessionOptions): Promise<CompactSessionResult> {\n const { backend, sessionStore, config, model } = opts;\n if (!(backend instanceof AgentLoop)) {\n return { message: \"Current backend does not support compaction.\", compacted: false };\n }\n const messages = [...backend.getMessages()];\n if (messages.length < MIN_COMPACT_MESSAGES) {\n return {\n message: `Nothing to compact: history has only ${messages.length} message(s).`,\n compacted: false,\n };\n }\n const beforeTokens = estimateTokens(messages);\n const compacted = compactMessages(messages, config.contextMaxTokens);\n if (!compacted.compacted) {\n return {\n message: `Nothing to compact: ~${beforeTokens} estimated tokens, below the limit of ${config.contextMaxTokens}.`,\n compacted: false,\n };\n }\n const next = await applyCompactionSummary(messages, compacted, config, model);\n await backend.loadMessages(next);\n await sessionStore?.replaceMessages(next);\n const afterTokens = estimateTokens(next);\n return {\n message: `Compacted context: ${messages.length} -> ${next.length} messages (~${beforeTokens} -> ~${afterTokens} estimated tokens).`,\n compacted: true,\n messages: next,\n };\n}\n\nasync function applyCompactionSummary(\n original: CoreMessage[],\n compacted: CompactionResult,\n config: StarConfig,\n model: LanguageModel | null,\n): Promise<CoreMessage[]> {\n if (config.contextCompaction !== \"summary\" || !model) {\n return compacted.messages;\n }\n const headCount = compacted.messages[0]?.role === \"system\" ? 1 : 0;\n const dropped = original.slice(headCount, headCount + compacted.droppedCount);\n try {\n const summary = await summarizeMessages(dropped, model);\n const messages = compacted.messages.slice();\n messages[headCount] = {\n role: \"user\",\n content: `[earlier conversation summarized]\\n${summary}`,\n };\n return messages;\n } catch {\n return compacted.messages;\n }\n}\n\nexport interface ExportSessionOptions {\n backend: ChatBackend;\n sessionStore: SessionStore | null;\n cwd: string;\n arg: string;\n}\n\nexport async function exportSession(opts: ExportSessionOptions): Promise<string> {\n const { backend, sessionStore, cwd, arg } = opts;\n if (!(backend instanceof AgentLoop)) {\n return \"Current backend does not support exporting sessions.\";\n }\n const messages = [...backend.getMessages()];\n if (messages.length === 0) {\n return \"Nothing to export: the session has no messages.\";\n }\n const sessionId = sessionStore?.id ?? `unknown-${Date.now()}`;\n const target = arg ? path.resolve(cwd, arg) : path.resolve(cwd, `star-session-${sessionId}.md`);\n const existed = await fileExists(target);\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.writeFile(target, renderSessionMarkdown(sessionId, messages));\n return existed\n ? `Exported ${messages.length} messages to ${target} (overwrote existing file).`\n : `Exported ${messages.length} messages to ${target}.`;\n}\n\nasync function fileExists(target: string): Promise<boolean> {\n try {\n await fs.access(target);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function renderSessionMarkdown(\n sessionId: string,\n messages: readonly CoreMessage[],\n exportedAt: Date = new Date(),\n): string {\n const lines: string[] = [\n `# Star CLI Session ${sessionId}`,\n \"\",\n `_Exported at ${exportedAt.toISOString()}_`,\n \"\",\n ];\n for (const message of messages) {\n lines.push(`## ${roleHeading(message.role)}`, \"\");\n lines.push(...renderContent(message), \"\");\n }\n return lines.join(\"\\n\");\n}\n\nfunction roleHeading(role: string): string {\n return role.charAt(0).toUpperCase() + role.slice(1);\n}\n\nfunction renderContent(message: CoreMessage): string[] {\n const content = message.content;\n if (typeof content === \"string\") return [content];\n const lines: string[] = [];\n for (const part of content) {\n if (part.type === \"text\") {\n lines.push(part.text, \"\");\n } else if (part.type === \"tool-call\") {\n lines.push(\n `**Tool call: ${part.toolName}**`,\n \"\",\n \"```json\",\n JSON.stringify(part.args, null, 2),\n \"```\",\n \"\",\n );\n } else if (part.type === \"tool-result\") {\n lines.push(\n `**Tool result: ${part.toolName}**`,\n \"\",\n \"```\",\n stringifyPart(part.result),\n \"```\",\n \"\",\n );\n } else if (part.type === \"reasoning\") {\n lines.push(part.text, \"\");\n } else {\n lines.push(`[${part.type}]`, \"\");\n }\n }\n while (lines.length > 0 && lines[lines.length - 1] === \"\") lines.pop();\n return lines;\n}\n\nfunction stringifyPart(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n}\n","import { readFileSync } from \"node:fs\";\nimport { discoverSkills } from \"../../agent/skills\";\nimport { appendUserMemory } from \"../../agent/user-memory\";\nimport { userMemoryPath } from \"../../config/paths\";\nimport {\n WORKING_DIFF_MAX_LINES,\n buildCommitPrompt,\n collectCommitContext,\n collectWorkingDiff,\n isGitRepo,\n} from \"../../core/git\";\nimport { formatSearchResults, searchSessions } from \"../../session/search\";\nimport { parseGitDiffLines } from \"../diff-preview\";\nimport type { CommandRegistry, SlashCommand } from \"./registry\";\n\nexport function registerBuiltinCommands(registry: CommandRegistry): void {\n const register = (command: SlashCommand) => registry.register(command);\n\n register({\n name: \"help\",\n description: \"List available commands\",\n usage: \"/help\",\n category: \"General\",\n run(_args, ctx) {\n const groups = new Map<string, string[]>();\n for (const cmd of registry.list()) {\n const category = cmd.category ?? \"Other\";\n const usage = cmd.usage ?? `/${cmd.name}`;\n const lines = groups.get(category) ?? [];\n lines.push(` ${usage} - ${cmd.description}`);\n groups.set(category, lines);\n }\n const sections = [...groups.entries()].map(([name, lines]) => [name, ...lines].join(\"\\n\"));\n ctx.addSystemMessage(`Available commands:\\n\\n${sections.join(\"\\n\\n\")}`);\n },\n });\n\n register({\n name: \"clear\",\n description: \"Clear message history\",\n usage: \"/clear\",\n category: \"General\",\n run(_args, ctx) {\n ctx.clearMessages();\n },\n });\n\n register({\n name: \"new\",\n description: \"Start a new session with a clean context\",\n usage: \"/new\",\n category: \"Sessions\",\n async run(_args, ctx) {\n if (!ctx.newSession) {\n ctx.addSystemMessage(\"/new: this context cannot start a new session.\");\n return;\n }\n ctx.addSystemMessage(await ctx.newSession());\n },\n });\n\n register({\n name: \"clear-sessions\",\n description:\n \"Delete stored sessions: this directory by default, every session with --all (the current session is kept)\",\n usage: \"/clear-sessions [--all]\",\n category: \"Sessions\",\n async run(args, ctx) {\n const arg = args.trim();\n if (arg !== \"\" && arg !== \"--all\") {\n ctx.addSystemMessage(\n `/clear-sessions: unknown argument \"${arg}\". Usage: /clear-sessions [--all]`,\n );\n return;\n }\n if (!ctx.clearSessions) {\n ctx.addSystemMessage(\"/clear-sessions: this context cannot delete sessions.\");\n return;\n }\n ctx.addSystemMessage(await ctx.clearSessions(arg === \"--all\"));\n },\n });\n\n register({\n name: \"exit\",\n description: \"Exit the application\",\n usage: \"/exit\",\n category: \"General\",\n run(_args, ctx) {\n ctx.exit();\n },\n });\n\n register({\n name: \"q\",\n description: \"Exit the application (alias of /exit)\",\n usage: \"/q\",\n category: \"General\",\n run(_args, ctx) {\n ctx.exit();\n },\n });\n\n register({\n name: \"model\",\n description: \"Switch the current model (opens a picker when no name is given)\",\n usage: \"/model [name]\",\n category: \"Settings\",\n async run(args, ctx) {\n if (!args) {\n ctx.addSystemMessage(await ctx.pickModel());\n } else {\n ctx.addSystemMessage(await ctx.switchModel(args));\n }\n },\n });\n\n register({\n name: \"resume\",\n description: \"Resume a session by id, or pick one from a list (--all for every directory)\",\n usage: \"/resume [sessionId | --all]\",\n category: \"Sessions\",\n async run(args, ctx) {\n const arg = args.trim();\n if (arg === \"--all\") {\n ctx.addSystemMessage(await ctx.pickSession(true));\n } else if (!arg) {\n ctx.addSystemMessage(await ctx.pickSession(false));\n } else {\n ctx.addSystemMessage(await ctx.resumeSession(arg));\n }\n },\n });\n\n register({\n name: \"fork\",\n description: \"Fork the current session into a new one and switch to it\",\n usage: \"/fork\",\n category: \"Sessions\",\n async run(_args, ctx) {\n ctx.addSystemMessage(await ctx.forkSession());\n },\n });\n\n register({\n name: \"search\",\n description: \"Full-text search across all stored sessions\",\n usage: \"/search <query>\",\n category: \"Sessions\",\n async run(args, ctx) {\n const query = args.trim();\n if (!query) {\n ctx.addSystemMessage(\"Usage: /search <query>\");\n return;\n }\n ctx.addSystemMessage(formatSearchResults(await searchSessions(query), query));\n },\n });\n\n register({\n name: \"todo\",\n description: \"Show the current todo list\",\n usage: \"/todo\",\n category: \"Info\",\n async run(_args, ctx) {\n ctx.addSystemMessage(await ctx.showTodos());\n },\n });\n\n register({\n name: \"tasks\",\n description: \"List background shell tasks\",\n usage: \"/tasks\",\n category: \"Info\",\n run(_args, ctx) {\n ctx.addSystemMessage(ctx.listTasks());\n },\n });\n\n register({\n name: \"cost\",\n description: \"Show API token usage for this session\",\n usage: \"/cost\",\n category: \"Info\",\n run(_args, ctx) {\n ctx.addSystemMessage(ctx.showUsage());\n },\n });\n\n register({\n name: \"usage\",\n description: \"Show token usage aggregated across all sessions\",\n usage: \"/usage\",\n category: \"Info\",\n async run(_args, ctx) {\n ctx.addSystemMessage(await ctx.showGlobalUsage());\n },\n });\n\n register({\n name: \"config\",\n description: \"Show the current configuration\",\n usage: \"/config\",\n category: \"Info\",\n run(_args, ctx) {\n ctx.addSystemMessage(ctx.describeConfig());\n },\n });\n\n register({\n name: \"compact\",\n description: \"Compact the conversation history to free up context\",\n usage: \"/compact\",\n category: \"Sessions\",\n async run(_args, ctx) {\n ctx.addSystemMessage(await ctx.compactContext());\n },\n });\n\n register({\n name: \"export\",\n description: \"Export the current session to a Markdown file\",\n usage: \"/export [path]\",\n category: \"Sessions\",\n async run(args, ctx) {\n ctx.addSystemMessage(await ctx.exportSession(args));\n },\n });\n\n register({\n name: \"permission\",\n description: \"Set the permission mode (opens a picker when no mode is given)\",\n usage: \"/permission [ask|auto|readonly|yolo]\",\n category: \"Settings\",\n async run(args, ctx) {\n const arg = args.trim();\n if (!arg) {\n ctx.addSystemMessage(await ctx.pickPermissionMode());\n } else {\n ctx.addSystemMessage(await ctx.permissionMode(arg));\n }\n },\n });\n\n register({\n name: \"plan\",\n description: \"Toggle plan mode: read-only research, then approve the plan before executing\",\n usage: \"/plan\",\n category: \"Settings\",\n async run(_args, ctx) {\n ctx.addSystemMessage(await ctx.planMode());\n },\n });\n\n register({\n name: \"memory\",\n description: \"Show user memory (MEMORY.md), or add an entry\",\n usage: \"/memory [add <text>]\",\n category: \"Settings\",\n run(args, ctx) {\n const arg = args.trim();\n if (arg === \"add\" || arg.startsWith(\"add \")) {\n const text = arg.slice(3).trim();\n if (!text) {\n ctx.addSystemMessage(\"Usage: /memory add <text>\");\n return;\n }\n appendUserMemory(text);\n ctx.addSystemMessage(`Saved to user memory: - ${text}`);\n return;\n }\n if (arg) {\n ctx.addSystemMessage(`Unknown argument \"${arg}\". Usage: /memory [add <text>]`);\n return;\n }\n const file = userMemoryPath();\n let content = \"\";\n try {\n content = readFileSync(file, \"utf8\").trim();\n } catch {\n content = \"\";\n }\n if (!content) {\n ctx.addSystemMessage(\n `No user memory yet (${file}).\\nAdd entries with /memory add <text> or ask the agent to remember something.`,\n );\n return;\n }\n ctx.addSystemMessage(`User memory (${file}):\\n${content}`);\n },\n });\n\n register({\n name: \"undo\",\n description:\n \"Undo the last conversation turn: revert its file changes (write_file/edit_file) and retract its messages\",\n usage: \"/undo\",\n category: \"Changes\",\n async run(_args, ctx) {\n ctx.addSystemMessage(await ctx.undo());\n },\n });\n\n register({\n name: \"rewind\",\n description:\n \"List file-change checkpoints, or rewind to just before one: restore files and retract the conversation\",\n usage: \"/rewind [n]\",\n category: \"Changes\",\n async run(args, ctx) {\n ctx.addSystemMessage(await ctx.rewind(args.trim()));\n },\n });\n\n register({\n name: \"init\",\n description: \"Generate an AGENTS.md for the current project\",\n usage: \"/init [force]\",\n category: \"Settings\",\n async run(args, ctx) {\n ctx.addSystemMessage(await ctx.initProject(args));\n },\n });\n\n register({\n name: \"doctor\",\n description: \"Run environment and configuration checks\",\n usage: \"/doctor\",\n category: \"Info\",\n async run(_args, ctx) {\n ctx.addSystemMessage(await ctx.runDoctor());\n },\n });\n\n register({\n name: \"skills\",\n description: \"List available skills (project scope overrides user scope)\",\n usage: \"/skills\",\n category: \"Info\",\n run(_args, ctx) {\n const skills = discoverSkills(ctx.cwd ?? process.cwd());\n if (skills.length === 0) {\n ctx.addSystemMessage(\n \"No skills found. Add a SKILL.md under .star/skills/<name>/ (project) or ~/.star-cli/skills/<name>/ (user).\",\n );\n return;\n }\n const lines = skills.map((s) => `${s.name} [${s.scope}] — ${s.description}`);\n ctx.addSystemMessage(`Available skills:\\n${lines.join(\"\\n\")}`);\n },\n });\n\n register({\n name: \"commit\",\n description: \"Analyze uncommitted changes and create a git commit (Conventional Commits)\",\n usage: \"/commit [instructions]\",\n category: \"Changes\",\n async run(args, ctx) {\n const cwd = ctx.cwd ?? process.cwd();\n if (!isGitRepo(cwd)) {\n ctx.addSystemMessage(\"/commit: not a git repository — nothing to do.\");\n return;\n }\n const context = collectCommitContext(cwd);\n if (!context) {\n ctx.addSystemMessage(\"/commit: working tree clean — nothing to commit.\");\n return;\n }\n const prompt = buildCommitPrompt(context, args);\n if (ctx.submitPrompt) {\n return ctx.submitPrompt(prompt);\n }\n ctx.addSystemMessage(\"/commit: this context cannot submit prompts to the model.\");\n },\n });\n\n register({\n name: \"copy\",\n description:\n \"Copy the last assistant reply to the clipboard (`all` for the whole conversation)\",\n usage: \"/copy [all]\",\n category: \"Sessions\",\n async run(args, ctx) {\n const arg = args.trim();\n if (arg !== \"\" && arg !== \"all\") {\n ctx.addSystemMessage(`/copy: unknown argument \"${arg}\". Usage: /copy [all]`);\n return;\n }\n if (!ctx.conversationText || !ctx.copyToClipboard) {\n ctx.addSystemMessage(\"/copy: this context cannot access the clipboard.\");\n return;\n }\n const scope = arg === \"all\" ? \"all\" : \"last\";\n const text = ctx.conversationText(scope);\n if (!text) {\n ctx.addSystemMessage(\n scope === \"all\" ? \"Nothing to copy yet.\" : \"No assistant reply yet — nothing to copy.\",\n );\n return;\n }\n const ok = await ctx.copyToClipboard(text);\n ctx.addSystemMessage(\n ok\n ? `Copied ${text.length} chars to clipboard.`\n : \"Copy failed — no clipboard command available on this platform.\",\n );\n },\n });\n\n register({\n name: \"diff\",\n description: \"Show uncommitted changes (git status + colored diff)\",\n usage: \"/diff\",\n category: \"Changes\",\n run(_args, ctx) {\n const cwd = ctx.cwd ?? process.cwd();\n if (!isGitRepo(cwd)) {\n ctx.addSystemMessage(\"/diff: not a git repository — nothing to show.\");\n return;\n }\n const result = collectWorkingDiff(cwd);\n if (!result || result.status === \"\") {\n ctx.addSystemMessage(\"Working tree clean — no uncommitted changes.\");\n return;\n }\n const header = `git status --short:\\n${result.status}`;\n if (result.diff === \"\") {\n ctx.addSystemMessage(\n `${header}\\n\\nOnly untracked files — no tracked modifications to diff.`,\n );\n return;\n }\n const note = result.truncated\n ? `diff truncated at ${WORKING_DIFF_MAX_LINES} lines`\n : undefined;\n if (ctx.showDiff) {\n ctx.showDiff(header, parseGitDiffLines(result.diff), note);\n return;\n }\n ctx.addSystemMessage(`${header}\\n\\n${result.diff}${note ? `\\n... (${note})` : \"\"}`);\n },\n });\n}\n","import type { CoreMessage } from \"../core/messages\";\nimport { relativeTime, shortSessionId } from \"./list\";\nimport { type SessionMeta, SessionStore } from \"./store\";\n\nexport interface SessionSearchHit {\n meta: SessionMeta;\n snippet: string;\n}\n\nconst SNIPPET_LENGTH = 100;\n\nfunction flattenMessage(message: CoreMessage): string {\n const content = message.content;\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n const parts: string[] = [];\n for (const part of content) {\n if (part.type === \"text\") {\n parts.push(part.text);\n } else if (part.type === \"tool-call\") {\n parts.push(JSON.stringify(part.args));\n } else if (part.type === \"tool-result\") {\n parts.push(typeof part.result === \"string\" ? part.result : JSON.stringify(part.result));\n }\n }\n return parts.join(\"\\n\");\n}\n\n// ~100 chars of the (whitespace-collapsed) haystack centered on the first\n// case-insensitive match, with … markers where text was cut off.\nfunction makeSnippet(text: string, query: string): string {\n const flat = text.replace(/\\s+/g, \" \").trim();\n const index = flat.toLowerCase().indexOf(query.toLowerCase());\n if (index === -1 || flat.length <= SNIPPET_LENGTH) return flat.slice(0, SNIPPET_LENGTH);\n const side = Math.max(0, Math.floor((SNIPPET_LENGTH - query.length) / 2));\n let start = Math.max(0, index - side);\n const end = Math.min(flat.length, start + SNIPPET_LENGTH);\n start = Math.max(0, end - SNIPPET_LENGTH);\n return `${start > 0 ? \"…\" : \"\"}${flat.slice(start, end)}${end < flat.length ? \"…\" : \"\"}`;\n}\n\n// Full-text search across every stored session, most recently updated first.\n// Unreadable sessions and corrupt jsonl lines are skipped silently.\nexport async function searchSessions(query: string, limit = 10): Promise<SessionSearchHit[]> {\n const hits: SessionSearchHit[] = [];\n const needle = query.toLowerCase();\n for (const meta of await SessionStore.list()) {\n if (hits.length >= limit) break;\n const store = await SessionStore.open(meta.id);\n if (!store) continue;\n const text = (await store.messages())\n .map(flattenMessage)\n .filter((part) => part.length > 0)\n .join(\"\\n\");\n if (text.toLowerCase().includes(needle)) {\n hits.push({ meta, snippet: makeSnippet(text, query) });\n }\n }\n return hits;\n}\n\nexport function formatSearchResults(hits: SessionSearchHit[], query: string): string {\n if (hits.length === 0) return `No sessions matching \"${query}\".`;\n const lines = hits.map(({ meta, snippet }) => {\n const title = meta.title || \"(untitled)\";\n return `${shortSessionId(meta.id)} ${title} (${relativeTime(meta.updatedAt)})\\n ${snippet}`;\n });\n return [...lines, \"Resume with /resume <id>\"].join(\"\\n\");\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type DiffLineKind = \"add\" | \"del\" | \"context\" | \"marker\";\n\nexport interface DiffLine {\n kind: DiffLineKind;\n text: string;\n}\n\nexport interface DiffPreview {\n type: \"diff\" | \"new-file\";\n label: string;\n lines: DiffLine[];\n}\n\nconst CONTEXT_LINES = 2;\nconst MAX_HUNK_LINES = 15;\nconst MAX_TOTAL_LINES = 12;\nconst NEW_FILE_PREVIEW_LINES = 10;\nconst MAX_DP_CELLS = 250_000;\n\ninterface Op {\n kind: Exclude<DiffLineKind, \"marker\">;\n text: string;\n}\n\nfunction diffOps(oldText: string, newText: string): Op[] {\n const a = oldText.split(\"\\n\");\n const b = newText.split(\"\\n\");\n let start = 0;\n while (start < a.length && start < b.length && a[start] === b[start]) start += 1;\n let endA = a.length;\n let endB = b.length;\n while (endA > start && endB > start && a[endA - 1] === b[endB - 1]) {\n endA -= 1;\n endB -= 1;\n }\n const prefix: Op[] = a.slice(0, start).map((text) => ({ kind: \"context\" as const, text }));\n const suffix: Op[] = a.slice(endA).map((text) => ({ kind: \"context\" as const, text }));\n const midA = a.slice(start, endA);\n const midB = b.slice(start, endB);\n const prefixLen = prefix.length;\n const ops: Op[] = [...prefix];\n if (midA.length * midB.length > MAX_DP_CELLS) {\n for (const text of midA) ops.push({ kind: \"del\", text });\n for (const text of midB) ops.push({ kind: \"add\", text });\n } else if (midA.length > 0 || midB.length > 0) {\n const rows = midA.length + 1;\n const cols = midB.length + 1;\n const dp = new Uint32Array(rows * cols);\n const cell = (r: number, c: number): number => dp[r * cols + c] ?? 0;\n for (let i = 1; i < rows; i++) {\n for (let j = 1; j < cols; j++) {\n dp[i * cols + j] =\n midA[i - 1] === midB[j - 1]\n ? cell(i - 1, j - 1) + 1\n : Math.max(cell(i - 1, j), cell(i, j - 1));\n }\n }\n const lineAt = (lines: string[], index: number): string => lines[index] ?? \"\";\n const middle: Op[] = [];\n let i = midA.length;\n let j = midB.length;\n while (i > 0 && j > 0) {\n if (midA[i - 1] === midB[j - 1]) {\n middle.push({ kind: \"context\", text: lineAt(midA, i - 1) });\n i -= 1;\n j -= 1;\n } else if (cell(i, j - 1) >= cell(i - 1, j)) {\n middle.push({ kind: \"add\", text: lineAt(midB, j - 1) });\n j -= 1;\n } else {\n middle.push({ kind: \"del\", text: lineAt(midA, i - 1) });\n i -= 1;\n }\n }\n while (i > 0) {\n middle.push({ kind: \"del\", text: lineAt(midA, i - 1) });\n i -= 1;\n }\n while (j > 0) {\n middle.push({ kind: \"add\", text: lineAt(midB, j - 1) });\n j -= 1;\n }\n middle.reverse();\n ops.push(...middle);\n }\n ops.push(...suffix);\n return ops.length === prefixLen + suffix.length ? [] : ops;\n}\n\nfunction hunkRanges(ops: Op[]): Array<[number, number]> {\n const changes: number[] = [];\n for (let i = 0; i < ops.length; i++) {\n const op = ops[i];\n if (op && op.kind !== \"context\") changes.push(i);\n }\n const ranges: Array<[number, number]> = [];\n let groupStart = 0;\n for (let k = 1; k <= changes.length; k++) {\n const cur = changes[k];\n const prev = changes[k - 1];\n const first = changes[groupStart];\n if (prev === undefined || first === undefined) break;\n if (cur === undefined || cur - prev > CONTEXT_LINES * 2 + 1) {\n ranges.push([\n Math.max(0, first - CONTEXT_LINES),\n Math.min(ops.length, prev + CONTEXT_LINES + 1),\n ]);\n groupStart = k;\n }\n }\n return ranges;\n}\n\nexport function buildDiffLines(oldText: string, newText: string): DiffLine[] {\n const ops = diffOps(oldText, newText);\n if (ops.length === 0) return [];\n const ranges = hunkRanges(ops);\n const lines: DiffLine[] = [];\n let omitted = 0;\n for (const [rangeIndex, [start, end]] of ranges.entries()) {\n if (rangeIndex > 0) lines.push({ kind: \"marker\", text: \"···\" });\n const hunk = ops.slice(start, end);\n let shown = hunk;\n if (hunk.length > MAX_HUNK_LINES) {\n const headCount = Math.ceil(MAX_HUNK_LINES / 2);\n shown = [...hunk.slice(0, headCount), ...hunk.slice(headCount - MAX_HUNK_LINES)];\n }\n if (hunk.length > shown.length) {\n omitted += hunk.length - shown.length;\n }\n for (const op of shown) lines.push(op);\n }\n if (lines.length > MAX_TOTAL_LINES) {\n omitted += lines.length - MAX_TOTAL_LINES;\n lines.length = MAX_TOTAL_LINES;\n }\n if (omitted > 0) lines.push({ kind: \"marker\", text: `... (${omitted} more lines)` });\n return lines;\n}\n\n// Maps raw `git diff` output onto the same line kinds used by the write/edit\n// preview so both render with the same colors. The leading +/- sigil is\n// stripped because the renderer re-adds it; a leading space on context lines\n// is stripped for the same reason.\nexport function parseGitDiffLines(diffText: string): DiffLine[] {\n return diffText.split(\"\\n\").map((raw) => {\n if (raw.startsWith(\"+\") && !raw.startsWith(\"+++\")) {\n return { kind: \"add\", text: raw.slice(1) };\n }\n if (raw.startsWith(\"-\") && !raw.startsWith(\"---\")) {\n return { kind: \"del\", text: raw.slice(1) };\n }\n if (\n raw.startsWith(\"@@\") ||\n raw.startsWith(\"diff \") ||\n raw.startsWith(\"index \") ||\n raw.startsWith(\"#\") ||\n raw.startsWith(\"+++\") ||\n raw.startsWith(\"---\")\n ) {\n return { kind: \"marker\", text: raw };\n }\n return { kind: \"context\", text: raw.startsWith(\" \") ? raw.slice(1) : raw };\n });\n}\n\nfunction getStringArg(args: unknown, key: string): string | undefined {\n if (typeof args === \"object\" && args !== null) {\n const value = (args as Record<string, unknown>)[key];\n if (typeof value === \"string\") return value;\n }\n return undefined;\n}\n\nfunction applyEdit(\n content: string,\n oldString: string,\n newString: string,\n replaceAll: boolean,\n): string | null {\n let count = 0;\n let idx = content.indexOf(oldString);\n while (idx !== -1) {\n count += 1;\n idx = content.indexOf(oldString, idx + oldString.length);\n }\n if (count === 0) return null;\n if (count > 1 && !replaceAll) return null;\n return replaceAll\n ? content.split(oldString).join(newString)\n : content.replace(oldString, newString);\n}\n\nfunction newFilePreview(content: string, label: string): DiffPreview {\n const all = content.split(\"\\n\");\n const shown = all.slice(0, NEW_FILE_PREVIEW_LINES);\n const lines: DiffLine[] = shown.map((text) => ({ kind: \"add\", text }));\n if (all.length > shown.length) {\n lines.push({ kind: \"marker\", text: `... (${all.length - shown.length} more lines)` });\n }\n return { type: \"new-file\", label, lines };\n}\n\nexport async function generateDiffPreview(\n toolName: string,\n args: unknown,\n cwd: string,\n): Promise<DiffPreview | null> {\n if (toolName !== \"edit_file\" && toolName !== \"write_file\") return null;\n const filePath = getStringArg(args, \"path\");\n if (filePath === undefined) return null;\n const absolute = path.resolve(cwd, filePath);\n let existing: string | null;\n try {\n existing = await readFile(absolute, \"utf8\");\n } catch {\n existing = null;\n }\n if (toolName === \"edit_file\") {\n const oldString = getStringArg(args, \"old_string\");\n const newString = getStringArg(args, \"new_string\");\n if (existing === null || oldString === undefined || newString === undefined) return null;\n const replaceAll =\n typeof args === \"object\" &&\n args !== null &&\n (args as Record<string, unknown>).replace_all === true;\n const updated = applyEdit(existing, oldString, newString, replaceAll);\n if (updated === null) return null;\n return { type: \"diff\", label: filePath, lines: buildDiffLines(existing, updated) };\n }\n const content = getStringArg(args, \"content\");\n if (content === undefined) return null;\n if (existing === null) return newFilePreview(content, filePath);\n return { type: \"diff\", label: filePath, lines: buildDiffLines(existing, content) };\n}\n","import { readFileSync, readdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { starHome } from \"../../config/paths\";\nimport type { CommandRegistry } from \"./registry\";\n\nconst NAME_PATTERN = /^[a-z0-9-]+$/;\nconst DESCRIPTION_PATTERN = /^<!--\\s*description:\\s*(.+?)\\s*-->\\s*$/;\nconst DEFAULT_DESCRIPTION = \"Custom prompt command\";\n\nexport interface CustomCommand {\n name: string;\n description: string;\n template: string;\n source: string;\n}\n\nfunction parseCommandFile(filePath: string, name: string): CustomCommand | null {\n let raw: string;\n try {\n raw = readFileSync(filePath, \"utf8\");\n } catch {\n return null;\n }\n const lines = raw.split(/\\r?\\n/);\n let description = DEFAULT_DESCRIPTION;\n const first = lines[0] ?? \"\";\n const match = first.match(DESCRIPTION_PATTERN);\n if (match) {\n description = match[1] ?? DEFAULT_DESCRIPTION;\n lines.shift();\n if (lines[0] !== undefined && lines[0].trim() === \"\") lines.shift();\n }\n const template = lines.join(\"\\n\").trim();\n if (!template) return null;\n return { name, description, template, source: filePath };\n}\n\nfunction scanDir(dir: string, into: Map<string, CustomCommand>): void {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n for (const entry of entries.sort()) {\n if (!entry.endsWith(\".md\")) continue;\n const name = entry.slice(0, -\".md\".length);\n if (!NAME_PATTERN.test(name)) continue;\n const parsed = parseCommandFile(path.join(dir, entry), name);\n if (parsed) into.set(name, parsed);\n }\n}\n\nexport function loadCustomCommands(cwd: string, home: string = starHome()): CustomCommand[] {\n const byName = new Map<string, CustomCommand>();\n scanDir(path.join(home, \"commands\"), byName);\n scanDir(path.join(cwd, \".star\", \"commands\"), byName);\n return [...byName.values()];\n}\n\nexport function registerCustomCommands(\n registry: CommandRegistry,\n cwd: string,\n home?: string,\n): CustomCommand[] {\n const registered: CustomCommand[] = [];\n for (const command of loadCustomCommands(cwd, home)) {\n if (registry.get(command.name)) continue;\n registry.register({\n name: command.name,\n description: command.description,\n usage: `/${command.name} [args]`,\n category: \"Custom\",\n run(args, ctx) {\n const prompt = command.template.split(\"$ARGUMENTS\").join(args);\n if (ctx.submitPrompt) {\n return ctx.submitPrompt(prompt);\n }\n ctx.addSystemMessage(`/${command.name}: this context cannot submit prompts to the model.`);\n },\n });\n registered.push(command);\n }\n return registered;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { starHome } from \"../../config/paths\";\nimport type { StarConfig } from \"../../config/schema\";\nimport { resolveShell } from \"../../tools/bash\";\n\nconst MIN_NODE_MAJOR = 20;\nconst REGISTRY_URL = \"https://registry.npmjs.org/\";\nconst REGISTRY_TIMEOUT_MS = 5000;\n\nexport interface DoctorCheck {\n name: string;\n ok: boolean;\n detail: string;\n optional?: boolean;\n}\n\nexport interface DoctorReport {\n checks: DoctorCheck[];\n passed: number;\n failed: number;\n}\n\nexport type DoctorFetcher = (url: string, timeoutMs: number) => Promise<boolean>;\n\nasync function defaultFetcher(url: string, timeoutMs: number): Promise<boolean> {\n const res = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) });\n return res.ok;\n}\n\nexport interface DoctorOptions {\n cwd: string;\n config: StarConfig;\n env?: NodeJS.ProcessEnv;\n home?: string;\n nodeVersion?: string;\n shellLabel?: string;\n shellPath?: string;\n fetcher?: DoctorFetcher;\n}\n\nfunction nodeMajor(version: string): number | null {\n const match = /^v?(\\d+)/.exec(version);\n return match ? Number.parseInt(match[1] ?? \"\", 10) : null;\n}\n\nasync function pathExists(target: string): Promise<boolean> {\n try {\n await fs.access(target);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction resolveApiKeyConfigured(\n config: StarConfig,\n providerName: string,\n env: NodeJS.ProcessEnv,\n): boolean | null {\n const provider = config.providers.find((p) => p.name === providerName);\n if (!provider) return null;\n const fromEnv = provider.apiKeyEnv ? env[provider.apiKeyEnv] : undefined;\n return Boolean(fromEnv ?? provider.apiKey);\n}\n\nexport async function runDoctor(opts: DoctorOptions): Promise<DoctorReport> {\n const env = opts.env ?? process.env;\n const home = opts.home ?? starHome();\n const checks: DoctorCheck[] = [];\n\n const version = opts.nodeVersion ?? process.version;\n const major = nodeMajor(version);\n const nodeOk = major !== null && major >= MIN_NODE_MAJOR;\n checks.push({\n name: \"Node.js version\",\n ok: nodeOk,\n detail: nodeOk\n ? `${version} (>= ${MIN_NODE_MAJOR} required)`\n : `${version} — Node.js >= ${MIN_NODE_MAJOR} is required`,\n });\n\n if (opts.shellLabel !== undefined || opts.shellPath !== undefined) {\n checks.push({\n name: \"Shell for bash tool\",\n ok: true,\n detail: `${opts.shellLabel ?? \"unknown\"}${opts.shellPath ? ` (${opts.shellPath})` : \"\"}`,\n });\n } else {\n const spec = resolveShell();\n checks.push({\n name: \"Shell for bash tool\",\n ok: true,\n detail: `${spec.label} (${spec.shell})`,\n });\n }\n\n const configPath = path.join(home, \"config.toml\");\n const configExists = await pathExists(configPath);\n checks.push({\n name: \"STAR_HOME / config\",\n ok: configExists,\n detail: configExists\n ? `STAR_HOME=${home}, config.toml found at ${configPath}`\n : `STAR_HOME=${home}, config.toml missing at ${configPath}`,\n });\n\n const defaultModel = opts.config.defaultModel;\n if (!defaultModel) {\n checks.push({\n name: \"Default model\",\n ok: false,\n detail: \"no defaultModel configured\",\n });\n } else {\n const modelConfig = opts.config.models.find((m) => m.name === defaultModel);\n if (!modelConfig) {\n checks.push({\n name: \"Default model\",\n ok: false,\n detail: `model \"${defaultModel}\" not found in configured models`,\n });\n } else {\n const provider = opts.config.providers.find((p) => p.name === modelConfig.provider);\n checks.push({\n name: \"Default model\",\n ok: provider !== undefined,\n detail: provider\n ? `${modelConfig.name} (${provider.name}/${modelConfig.model}, ${provider.baseURL})`\n : `provider \"${modelConfig.provider}\" for model \"${modelConfig.name}\" not found`,\n });\n const keyConfigured = resolveApiKeyConfigured(opts.config, modelConfig.provider, env);\n checks.push({\n name: \"Provider API key\",\n ok: keyConfigured === true,\n detail:\n keyConfigured === null\n ? `provider \"${modelConfig.provider}\" not found`\n : keyConfigured\n ? `apiKey resolved for provider \"${modelConfig.provider}\"`\n : `apiKey missing for provider \"${modelConfig.provider}\"${\n provider?.apiKeyEnv ? ` (set ${provider.apiKeyEnv} or configure apiKey)` : \"\"\n }`,\n });\n }\n }\n\n const sessions = path.join(home, \"sessions\");\n let writable = false;\n let writeError = \"\";\n try {\n await fs.mkdir(sessions, { recursive: true });\n const probe = path.join(sessions, `.doctor-probe-${process.pid}`);\n await fs.writeFile(probe, \"ok\");\n await fs.unlink(probe);\n writable = true;\n } catch (error) {\n writeError = error instanceof Error ? error.message : String(error);\n }\n checks.push({\n name: \"Sessions directory writable\",\n ok: writable,\n detail: writable ? `${sessions} is writable` : `${sessions} not writable: ${writeError}`,\n });\n\n const fetcher = opts.fetcher ?? defaultFetcher;\n let registryOk = false;\n try {\n registryOk = await fetcher(REGISTRY_URL, REGISTRY_TIMEOUT_MS);\n } catch {\n registryOk = false;\n }\n checks.push({\n name: \"npm registry connectivity\",\n ok: registryOk,\n detail: registryOk\n ? `${REGISTRY_URL} reachable`\n : `${REGISTRY_URL} unreachable (optional — only affects update checks)`,\n optional: true,\n });\n\n const passed = checks.filter((c) => c.ok).length;\n return { checks, passed, failed: checks.length - passed };\n}\n\nexport function formatDoctorReport(report: DoctorReport): string {\n const lines = report.checks.map(\n (check) => `${check.ok ? \"✓\" : \"✗\"} ${check.name}: ${check.detail}`,\n );\n lines.push(\"\", `${report.passed} passed, ${report.failed} failed`);\n return lines.join(\"\\n\");\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { type LanguageModel, generateText } from \"ai\";\n\nconst IGNORED_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \"out\", \"coverage\"]);\nconst MAX_ENTRIES = 20;\nconst README_HEAD_LINES = 5;\n\nexport interface ProjectFacts {\n name: string | null;\n dirName: string;\n packageManager: string | null;\n scripts: Record<string, string>;\n dependencies: string[];\n devDependencies: string[];\n commands: {\n test: string | null;\n build: string | null;\n lint: string | null;\n typecheck: string | null;\n };\n hasTsconfig: boolean;\n isGitRepo: boolean;\n readmeHead: string[];\n entries: string[];\n}\n\nasync function fileExists(target: string): Promise<boolean> {\n try {\n await fs.access(target);\n return true;\n } catch {\n return false;\n }\n}\n\ninterface PackageJson {\n name?: unknown;\n scripts?: unknown;\n dependencies?: unknown;\n devDependencies?: unknown;\n}\n\nasync function readPackageJson(cwd: string): Promise<PackageJson | null> {\n try {\n const raw = await fs.readFile(path.join(cwd, \"package.json\"), \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n return parsed as PackageJson;\n } catch {\n return null;\n }\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n if (typeof value !== \"object\" || value === null) return {};\n const out: Record<string, string> = {};\n for (const [key, val] of Object.entries(value)) {\n if (typeof val === \"string\") out[key] = val;\n }\n return out;\n}\n\nasync function detectPackageManager(cwd: string): Promise<string | null> {\n if (await fileExists(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (await fileExists(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n if (await fileExists(path.join(cwd, \"package-lock.json\"))) return \"npm\";\n if (await fileExists(path.join(cwd, \"bun.lockb\"))) return \"bun\";\n return null;\n}\n\nfunction inferCommands(\n pm: string | null,\n scripts: Record<string, string>,\n): ProjectFacts[\"commands\"] {\n const runner = pm ?? \"npm\";\n const pick = (script: string): string | null =>\n script in scripts ? `${runner} ${script}` : null;\n return {\n test: pick(\"test\"),\n build: pick(\"build\"),\n lint: pick(\"lint\"),\n typecheck: pick(\"typecheck\"),\n };\n}\n\nasync function listEntries(cwd: string): Promise<string[]> {\n try {\n const dirents = await fs.readdir(cwd, { withFileTypes: true });\n const entries: string[] = [];\n for (const dirent of dirents) {\n if (dirent.isDirectory()) {\n if (IGNORED_DIRS.has(dirent.name)) continue;\n entries.push(`${dirent.name}/`);\n } else if (!dirent.name.startsWith(\".\")) {\n entries.push(dirent.name);\n }\n if (entries.length >= MAX_ENTRIES) break;\n }\n return entries.sort();\n } catch {\n return [];\n }\n}\n\nasync function readReadmeHead(cwd: string): Promise<string[]> {\n for (const name of [\"README.md\", \"readme.md\", \"README\"]) {\n try {\n const raw = await fs.readFile(path.join(cwd, name), \"utf8\");\n return raw\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .slice(0, README_HEAD_LINES);\n } catch {\n // try the next candidate name\n }\n }\n return [];\n}\n\nexport async function scanProject(cwd: string): Promise<ProjectFacts> {\n const pkg = await readPackageJson(cwd);\n const packageManager = await detectPackageManager(cwd);\n const scripts = stringRecord(pkg?.scripts);\n return {\n name: typeof pkg?.name === \"string\" ? pkg.name : null,\n dirName: path.basename(cwd),\n packageManager,\n scripts,\n dependencies: Object.keys(stringRecord(pkg?.dependencies)),\n devDependencies: Object.keys(stringRecord(pkg?.devDependencies)),\n commands: inferCommands(packageManager, scripts),\n hasTsconfig: await fileExists(path.join(cwd, \"tsconfig.json\")),\n isGitRepo: await fileExists(path.join(cwd, \".git\")),\n readmeHead: await readReadmeHead(cwd),\n entries: await listEntries(cwd),\n };\n}\n\nexport function renderAgentsMd(facts: ProjectFacts): string {\n const title = facts.name ?? facts.dirName;\n const lines: string[] = [\n \"# AGENTS.md\",\n \"\",\n \"Guidance for AI agents working in this repository.\",\n \"\",\n \"## Project\",\n \"\",\n facts.readmeHead.length > 0 ? facts.readmeHead.join(\" \") : `${title}`,\n \"\",\n ];\n const commandLines: string[] = [];\n const push = (label: string, command: string | null) => {\n if (command) commandLines.push(`- \\`${command}\\` — ${label}`);\n };\n push(\"run tests\", facts.commands.test);\n push(\"build\", facts.commands.build);\n push(\"lint\", facts.commands.lint);\n push(\"typecheck\", facts.commands.typecheck);\n if (commandLines.length > 0) {\n lines.push(\"## Commands\", \"\", ...commandLines, \"\");\n }\n lines.push(\"## Layout\", \"\");\n for (const entry of facts.entries) {\n lines.push(`- \\`${entry}\\``);\n }\n lines.push(\"\", \"## Conventions\", \"\");\n const conventions: string[] = [];\n if (facts.hasTsconfig) conventions.push(\"TypeScript project (tsconfig.json present).\");\n if (facts.packageManager) conventions.push(`Use ${facts.packageManager} as the package manager.`);\n if (facts.isGitRepo) conventions.push(\"Git repository.\");\n if (facts.dependencies.length > 0) {\n conventions.push(`Key dependencies: ${facts.dependencies.slice(0, 10).join(\", \")}.`);\n }\n if (conventions.length === 0) conventions.push(\"No conventions detected yet — fill this in.\");\n for (const item of conventions) lines.push(`- ${item}`);\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nconst INIT_SYSTEM_PROMPT = [\n \"You are writing an AGENTS.md file that guides AI coding agents working in a repository.\",\n \"You are given scanned project facts as JSON.\",\n \"Produce a concise Markdown document with sections: Project, Commands, Layout, Conventions.\",\n \"Keep commands exactly as given in the facts. Do not invent tools, scripts, or directories.\",\n \"Output only the Markdown, no preamble, no code fences.\",\n].join(\"\\n\");\n\nasync function polishWithModel(facts: ProjectFacts, model: LanguageModel): Promise<string | null> {\n const { text } = await generateText({\n model,\n system: INIT_SYSTEM_PROMPT,\n prompt: `Project facts:\\n\\n${JSON.stringify(facts, null, 2)}\\n\\nWrite the AGENTS.md.`,\n });\n const trimmed = text.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nexport interface InitProjectOptions {\n cwd: string;\n args: string;\n model: LanguageModel | null;\n}\n\nexport interface InitProjectResult {\n message: string;\n written: boolean;\n path: string;\n lines: number;\n usedLlm: boolean;\n}\n\nexport async function initProject(opts: InitProjectOptions): Promise<InitProjectResult> {\n const { cwd, args, model } = opts;\n const target = path.join(cwd, \"AGENTS.md\");\n const force = args.split(/\\s+/).includes(\"force\");\n if (!force && (await fileExists(target))) {\n return {\n message: `AGENTS.md already exists at ${target}. Use /init force to overwrite it.`,\n written: false,\n path: target,\n lines: 0,\n usedLlm: false,\n };\n }\n const facts = await scanProject(cwd);\n let usedLlm = false;\n let content: string;\n let note = \"\";\n if (model) {\n try {\n const polished = await polishWithModel(facts, model);\n if (polished) {\n content = polished.endsWith(\"\\n\") ? polished : `${polished}\\n`;\n usedLlm = true;\n } else {\n content = renderAgentsMd(facts);\n note =\n \" Model returned an empty draft; used the template instead — review and refine manually.\";\n }\n } catch {\n content = renderAgentsMd(facts);\n note = \" Model refinement failed; used the template instead — review and refine manually.\";\n }\n } else {\n content = renderAgentsMd(facts);\n note = \" No model available; used the template — review and refine manually.\";\n }\n await fs.writeFile(target, content);\n const lines = content.split(\"\\n\").length;\n const how = usedLlm ? \"generated with model refinement\" : \"generated from template\";\n return {\n message: `Wrote ${target} (${lines} lines, ${how}).${note}`,\n written: true,\n path: target,\n lines,\n usedLlm,\n };\n}\n","import type { DiffLine } from \"../diff-preview\";\n\nexport interface CommandContext {\n addSystemMessage(text: string): void;\n clearMessages(): void;\n exit(): void;\n listModels(): string;\n switchModel(name: string): Promise<string>;\n listSessions(all?: boolean): Promise<string>;\n resumeSession(id: string): Promise<string>;\n showTodos(): Promise<string>;\n listTasks(): string;\n showUsage(): string;\n showGlobalUsage(): Promise<string>;\n describeConfig(): string;\n compactContext(): Promise<string>;\n exportSession(path: string): Promise<string>;\n undo(): Promise<string>;\n rewind(args: string): Promise<string>;\n permissionMode(args: string): Promise<string>;\n planMode(): Promise<string>;\n // Interactive pickers backed by the REPL's SelectPrompt; each returns the\n // user-facing result text (an \"unchanged\" note when the picker is cancelled).\n pickModel(): Promise<string>;\n pickPermissionMode(): Promise<string>;\n pickSession(all?: boolean): Promise<string>;\n // Forks the live session into a new stored session and swaps to it.\n forkSession(): Promise<string>;\n initProject(args: string): Promise<string>;\n runDoctor(): Promise<string>;\n submitPrompt?(text: string): void | Promise<void>;\n // Starts a fresh session with a clean context (REPL-only).\n newSession?(): Promise<string>;\n // Deletes stored sessions: current directory by default, every directory\n // when all is true. The live session is kept.\n clearSessions?(all: boolean): Promise<string>;\n // Working directory of the session; commands that shell out (e.g. /commit,\n // /diff) fall back to process.cwd() when the host does not provide it.\n cwd?: string;\n // Renders structured diff lines with per-line colors in the message area.\n showDiff?(text: string, lines: DiffLine[], note?: string): void;\n // Copies text to the system clipboard; resolves false when unavailable.\n copyToClipboard?(text: string): Promise<boolean>;\n // Plain-text conversation for /copy: \"last\" is the latest assistant reply,\n // \"all\" the whole conversation. null when there is nothing to copy.\n conversationText?(scope: \"last\" | \"all\"): string | null;\n}\n\nexport interface SlashCommand {\n name: string;\n description: string;\n usage?: string;\n // /help groups commands under this heading; uncategorized commands fall\n // into \"Other\".\n category?: string;\n run(args: string, ctx: CommandContext): void | Promise<void>;\n}\n\nexport class CommandRegistry {\n private commands = new Map<string, SlashCommand>();\n\n register(command: SlashCommand): void {\n this.commands.set(command.name, command);\n }\n\n list(): SlashCommand[] {\n return [...this.commands.values()].sort((a, b) => a.name.localeCompare(b.name));\n }\n\n get(name: string): SlashCommand | undefined {\n return this.commands.get(name);\n }\n\n complete(prefix: string): SlashCommand[] {\n const stripped = prefix.startsWith(\"/\") ? prefix.slice(1) : prefix;\n return this.list().filter((cmd) => cmd.name.startsWith(stripped));\n }\n}\n\nexport interface ParsedCommand {\n name: string;\n args: string;\n}\n\nexport function parseSlashCommand(input: string): ParsedCommand | null {\n if (!input.startsWith(\"/\")) return null;\n const body = input.slice(1).trim();\n if (body.length === 0) return null;\n const spaceIndex = body.search(/\\s/);\n if (spaceIndex === -1) return { name: body, args: \"\" };\n return {\n name: body.slice(0, spaceIndex),\n args: body.slice(spaceIndex).trim(),\n };\n}\n","import path from \"node:path\";\nimport type { FileSnapshot } from \"../../tools/fs/snapshots\";\n\nexport interface RewindPlan {\n target: FileSnapshot;\n affected: FileSnapshot[];\n // Smallest conversation message index among affected snapshots; null when\n // none carries turn context (then a rewind reverts files only).\n messageIndex: number | null;\n}\n\n// Selects the snapshots a rewind to just before checkpoint `id` would revert:\n// the target itself and everything after it.\nexport function planRewind(snapshots: FileSnapshot[], id: number): RewindPlan | null {\n const target = snapshots.find((snapshot) => snapshot.id === id);\n if (!target) return null;\n const affected = snapshots.filter((snapshot) => snapshot.id >= id);\n let messageIndex: number | null = null;\n for (const snapshot of affected) {\n if (snapshot.messageIndex >= 0) {\n messageIndex =\n messageIndex === null\n ? snapshot.messageIndex\n : Math.min(messageIndex, snapshot.messageIndex);\n }\n }\n return { target, affected, messageIndex };\n}\n\nfunction displayPath(filePath: string, cwd: string): string {\n const relative = path.relative(cwd, filePath);\n return relative !== \"\" && !relative.startsWith(\"..\") ? relative : filePath;\n}\n\nfunction formatTime(timestamp: number): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const date = new Date(timestamp);\n return `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n}\n\nexport function formatCheckpointList(snapshots: FileSnapshot[], cwd: string): string {\n if (snapshots.length === 0) {\n return \"No checkpoints yet — checkpoints are recorded on every successful write_file/edit_file.\";\n }\n const lines = snapshots.map((snapshot) => {\n const label = snapshot.existed ? snapshot.toolName : `${snapshot.toolName} (new file)`;\n return `#${snapshot.id} ${formatTime(snapshot.timestamp)} ${label} ${displayPath(snapshot.path, cwd)}`;\n });\n return [\n `Checkpoints (${snapshots.length}):`,\n ...lines,\n \"Use /rewind <n> to restore files and conversation to just before checkpoint n.\",\n ].join(\"\\n\");\n}\n","export interface SlashCommandHint {\n name: string;\n description: string;\n usage?: string;\n}\n\nexport const MAX_SUGGESTIONS = 5;\n\nfunction isSubsequence(query: string, target: string): boolean {\n let i = 0;\n for (const ch of target) {\n if (ch === query[i]) i += 1;\n if (i === query.length) return true;\n }\n return query.length === 0;\n}\n\nexport function filterCommands(input: string, commands: SlashCommandHint[]): SlashCommandHint[] {\n if (!input.startsWith(\"/\")) return [];\n if (/\\s/.test(input)) return [];\n const prefix = input.slice(1).toLowerCase();\n const byName = (a: SlashCommandHint, b: SlashCommandHint) => a.name.localeCompare(b.name);\n const prefixed = commands.filter((cmd) => cmd.name.toLowerCase().startsWith(prefix)).sort(byName);\n const fuzzy = commands\n .filter(\n (cmd) =>\n !cmd.name.toLowerCase().startsWith(prefix) && isSubsequence(prefix, cmd.name.toLowerCase()),\n )\n .sort(byName);\n return [...prefixed, ...fuzzy].slice(0, MAX_SUGGESTIONS);\n}\n\n// Up to 3 prefix-matched command names as a \"Did you mean\" hint, or \"\".\nexport function didYouMeanSuffix(names: string[]): string {\n if (names.length === 0) return \"\";\n const listed = names.slice(0, 3).map((name) => `/${name}`);\n return ` Did you mean: ${listed.join(\", \")}?`;\n}\n","import { Box, Text, useInput } from \"ink\";\n\nexport type ExitPlanDecision = \"yes\" | \"no\";\n\ninterface ExitPlanPromptProps {\n onDecision(decision: ExitPlanDecision): void;\n}\n\nexport function ExitPlanPrompt({ onDecision }: ExitPlanPromptProps) {\n useInput((input, key) => {\n const ch = input.toLowerCase();\n if (ch === \"y\") onDecision(\"yes\");\n else if (ch === \"n\" || key.escape) onDecision(\"no\");\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text bold color=\"cyan\">\n Plan ready (plan mode)\n </Text>\n <Text>The plan above was produced without making any changes.</Text>\n <Text>[y] approve and execute [n] keep refining (Esc = n)</Text>\n </Box>\n );\n}\n","import { Box, Text, useInput } from \"ink\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { type SlashCommandHint, filterCommands } from \"../commands/suggest\";\nimport { type PathSuggestion, extractAtToken, suggestPaths } from \"../path-suggest\";\n\nexport interface InputRefill {\n text: string;\n seq: number;\n}\n\ninterface InputBoxProps {\n isStreaming: boolean;\n disabled?: boolean;\n commands?: SlashCommandHint[];\n cwd?: string;\n // Refill request (double-Esc edit): when seq changes, the input is replaced.\n refill?: InputRefill;\n // History entries loaded from disk; used only as the initial history state.\n initialHistory?: string[];\n onSubmit(text: string): void;\n onInterrupt(): void;\n onExit(): void;\n // Async clipboard-image read (Alt+V / Ctrl+V); staging is the parent's job.\n onPasteImage?(): void;\n}\n\nexport function InputBox({\n isStreaming,\n disabled,\n commands,\n cwd,\n refill,\n initialHistory,\n onSubmit,\n onInterrupt,\n onExit,\n onPasteImage,\n}: InputBoxProps) {\n const [value, setValue] = useState(\"\");\n const [cursor, setCursor] = useState(0);\n const [history, setHistory] = useState<string[]>(() => initialHistory ?? []);\n const [highlight, setHighlight] = useState(0);\n const [suggestionsDismissed, setSuggestionsDismissed] = useState(false);\n const [pathSuggestions, setPathSuggestions] = useState<PathSuggestion[]>([]);\n const historyIndexRef = useRef<number | null>(null);\n const draftRef = useRef(\"\");\n const refillSeqRef = useRef(0);\n\n const edit = (next: string, nextCursor: number) => {\n setValue(next);\n setCursor(Math.max(0, Math.min(nextCursor, next.length)));\n setHighlight(0);\n setSuggestionsDismissed(false);\n };\n\n useEffect(() => {\n if (refill && refill.seq !== refillSeqRef.current) {\n refillSeqRef.current = refill.seq;\n edit(refill.text, refill.text.length);\n }\n });\n\n const suggestionsEnabled = !isStreaming && !disabled && !suggestionsDismissed;\n const suggestions = suggestionsEnabled && commands ? filterCommands(value, commands) : [];\n\n useEffect(() => {\n if (!suggestionsEnabled || !cwd) {\n setPathSuggestions([]);\n return;\n }\n const token = extractAtToken(value, cursor);\n if (!token) {\n setPathSuggestions([]);\n return;\n }\n let cancelled = false;\n void suggestPaths(token.token, cwd).then((result) => {\n if (!cancelled) setPathSuggestions(result);\n });\n return () => {\n cancelled = true;\n };\n }, [value, cursor, cwd, suggestionsEnabled]);\n\n const showPathSuggestions = suggestions.length === 0 && pathSuggestions.length > 0;\n const suggestionCount = suggestions.length > 0 ? suggestions.length : pathSuggestions.length;\n const activeIndex = suggestionCount === 0 ? 0 : Math.min(highlight, suggestionCount - 1);\n\n const completeHighlighted = () => {\n if (suggestions.length > 0) {\n const cmd = suggestions[activeIndex];\n if (!cmd) return;\n const text = `/${cmd.name} `;\n edit(text, text.length);\n return;\n }\n const sugg = pathSuggestions[activeIndex];\n const token = extractAtToken(value, cursor);\n if (!sugg || !token) return;\n const replacement = `@${sugg.path}${sugg.isDir ? \"\" : \" \"}`;\n edit(\n value.slice(0, token.start) + replacement + value.slice(token.end),\n token.start + replacement.length,\n );\n };\n\n useInput((input, key) => {\n if (key.ctrl && input === \"c\") {\n if (isStreaming || disabled) {\n onInterrupt();\n } else {\n edit(\"\", 0);\n historyIndexRef.current = null;\n }\n return;\n }\n if (key.ctrl && input === \"d\") {\n onExit();\n return;\n }\n // Alt+V is the reliable binding: Windows Terminal (and cmd's conhost)\n // intercept Ctrl+V as their own paste, so the key never reaches us.\n if ((key.meta || key.ctrl) && input === \"v\") {\n onPasteImage?.();\n return;\n }\n if (disabled) return;\n if (key.escape) {\n // While streaming, Esc is the Repl-level interrupt; idle Esc only\n // dismisses suggestions here (double-Esc editing lives in the Repl).\n if (!isStreaming && suggestionCount > 0) setSuggestionsDismissed(true);\n return;\n }\n if (key.return) {\n // Shift+Enter inserts a newline where the terminal reports the\n // modifier; Windows Terminal sends plain \\r for both, so the\n // backslash+Enter fallback below covers it.\n if (key.shift) {\n edit(`${value.slice(0, cursor)}\\n${value.slice(cursor)}`, cursor + 1);\n return;\n }\n // Backslash immediately before the cursor + Enter: universal manual\n // newline (works on every terminal, Claude-Code style).\n if (value[cursor - 1] === \"\\\\\") {\n edit(`${value.slice(0, cursor - 1)}\\n${value.slice(cursor)}`, cursor);\n return;\n }\n const text = value.trim();\n if (text.length > 0) {\n setHistory((prev) => [...prev, text]);\n onSubmit(text);\n }\n edit(\"\", 0);\n historyIndexRef.current = null;\n draftRef.current = \"\";\n return;\n }\n // Ctrl+J arrives as a raw \\n, Alt+Enter as ESC+CR (Ink strips the ESC),\n // and kitty-protocol Shift+Enter as the unparsed sequence [13;Nu.\n if (input === \"\\n\" || input === \"\\r\" || /^\\[13;\\d+u$/.test(input)) {\n edit(`${value.slice(0, cursor)}\\n${value.slice(cursor)}`, cursor + 1);\n return;\n }\n if (key.tab) {\n // Shift+Tab cycles permission modes at the Repl level; never complete.\n if (key.shift) return;\n if (suggestionCount > 0) {\n completeHighlighted();\n return;\n }\n } else if (key.upArrow) {\n if (suggestionCount > 0) {\n setHighlight((prev) => (prev - 1 + suggestionCount) % suggestionCount);\n return;\n }\n if (history.length === 0) return;\n if (historyIndexRef.current === null) {\n draftRef.current = value;\n historyIndexRef.current = history.length - 1;\n } else if (historyIndexRef.current > 0) {\n historyIndexRef.current -= 1;\n }\n const entry = history[historyIndexRef.current] ?? \"\";\n edit(entry, entry.length);\n return;\n } else if (key.downArrow) {\n if (suggestionCount > 0) {\n setHighlight((prev) => (prev + 1) % suggestionCount);\n return;\n }\n if (historyIndexRef.current === null) return;\n if (historyIndexRef.current < history.length - 1) {\n historyIndexRef.current += 1;\n const entry = history[historyIndexRef.current] ?? \"\";\n edit(entry, entry.length);\n } else {\n historyIndexRef.current = null;\n edit(draftRef.current, draftRef.current.length);\n }\n return;\n } else if (key.leftArrow) {\n setCursor((prev) => Math.max(0, prev - 1));\n return;\n } else if (key.rightArrow) {\n if (suggestionCount > 0 && cursor === value.length) {\n completeHighlighted();\n } else {\n setCursor((prev) => Math.min(value.length, prev + 1));\n }\n return;\n }\n if (key.ctrl && input === \"a\") {\n setCursor(0);\n return;\n }\n if (key.ctrl && input === \"e\") {\n setCursor(value.length);\n return;\n }\n if (key.ctrl && input === \"u\") {\n edit(value.slice(cursor), 0);\n return;\n }\n if (key.ctrl && input === \"k\") {\n edit(value.slice(0, cursor), cursor);\n return;\n }\n if (key.ctrl && input === \"w\") {\n const trimmed = value.slice(0, cursor).replace(/\\s+$/, \"\");\n const wordStart = trimmed.search(/\\S+$/);\n const next = value.slice(0, wordStart === -1 ? 0 : wordStart) + value.slice(cursor);\n edit(next, wordStart === -1 ? 0 : wordStart);\n return;\n }\n // Ink maps both \\b and \\x7f/Delete-key to backspace/delete; real terminals send\n // \\x7f for Backspace, so both act as delete-before-cursor here.\n if (key.backspace || key.delete) {\n if (cursor === 0) return;\n edit(value.slice(0, cursor - 1) + value.slice(cursor), cursor - 1);\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n // Pasted text may carry CRLF line endings; normalize so the value only\n // ever holds \\n and rendering stays consistent.\n const text = input.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n edit(value.slice(0, cursor) + text + value.slice(cursor), cursor + text.length);\n }\n });\n\n const before = value.slice(0, cursor);\n const at = value[cursor];\n const after = value.slice(cursor + 1);\n // A newline under the cursor is shown as an inverse space at the line end,\n // with the newline itself rendered after it.\n const cursorChar = at === \"\\n\" || at === undefined ? \" \" : at;\n const tail = (at === \"\\n\" ? \"\\n\" : \"\") + after;\n\n // One pre-styled string in a single Text node. Sibling Text nodes wrap\n // independently (stranding the cursor on its own line on soft-wrap), and\n // inserting/removing children inside ink-text skips Yoga's dirty marking\n // (ink's insertBeforeNode early-return), leaving the node measured at a\n // stale width so text spills over the border. A lone string child only\n // ever updates nodeValue, which always re-measures.\n const styled = `\\u001B[36m> \\u001B[39m${before}\\u001B[7m${cursorChar}\\u001B[27m${tail}`;\n\n return (\n <Box flexDirection=\"column\">\n <Box borderStyle=\"round\" borderColor=\"gray\" paddingX={1}>\n <Text>{styled}</Text>\n </Box>\n {suggestions.length > 0 && (\n <Box flexDirection=\"column\" paddingLeft={2}>\n {suggestions.map((cmd, index) => {\n const label = cmd.usage ?? `/${cmd.name}`;\n return index === activeIndex ? (\n <Text key={cmd.name} bold inverse>{`${label} - ${cmd.description}`}</Text>\n ) : (\n <Text key={cmd.name}>\n <Text color=\"cyan\">{label}</Text>\n <Text dimColor>{` - ${cmd.description}`}</Text>\n </Text>\n );\n })}\n </Box>\n )}\n {showPathSuggestions && (\n <Box flexDirection=\"column\" paddingLeft={2}>\n {pathSuggestions.map((sugg, index) =>\n index === activeIndex ? (\n <Text key={sugg.path} bold inverse>{`@${sugg.path}`}</Text>\n ) : (\n <Text key={sugg.path}>\n <Text color=\"cyan\">{`@${sugg.path}`}</Text>\n {sugg.isDir && <Text dimColor> - directory</Text>}\n </Text>\n ),\n )}\n </Box>\n )}\n </Box>\n );\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { SKIP_DIRS, createIgnorePredicate } from \"../tools/fs/util\";\nimport { MAX_SUGGESTIONS } from \"./commands/suggest\";\n\n// Lazy scan: only the single directory the typed prefix points into is read,\n// and no more than this many entries are examined per lookup.\nexport const MAX_SCAN_ENTRIES = 2000;\n\nexport interface AtToken {\n // Path prefix typed after the \"@\".\n token: string;\n // Index of the \"@\" in the input value.\n start: number;\n // Cursor position (end of the token).\n end: number;\n}\n\n// The \"@token\" immediately before the cursor: preceded by start-of-input or\n// whitespace, with no whitespace inside the token itself.\nexport function extractAtToken(value: string, cursor: number): AtToken | null {\n const before = value.slice(0, cursor);\n const match = /(?:^|\\s)@(\\S*)$/.exec(before);\n if (!match) return null;\n const token = match[1] ?? \"\";\n return { token, start: cursor - token.length - 1, end: cursor };\n}\n\nexport interface PathSuggestion {\n // Path relative to cwd; directories carry a trailing \"/\" so Tab descends.\n path: string;\n isDir: boolean;\n}\n\nexport async function suggestPaths(\n token: string,\n cwd: string,\n maxScanEntries: number = MAX_SCAN_ENTRIES,\n maxSuggestions: number = MAX_SUGGESTIONS,\n): Promise<PathSuggestion[]> {\n const normalized = token.replace(/\\\\/g, \"/\");\n const slash = normalized.lastIndexOf(\"/\");\n const dirPart = slash >= 0 ? normalized.slice(0, slash + 1) : \"\";\n const basePrefix = slash >= 0 ? normalized.slice(slash + 1) : normalized;\n if (dirPart.split(\"/\").some((segment) => SKIP_DIRS.has(segment))) return [];\n const dirAbs = path.resolve(cwd, dirPart === \"\" ? \".\" : dirPart);\n const entries = await readdir(dirAbs, { withFileTypes: true }).catch(() => null);\n if (!entries) return [];\n const ignore = createIgnorePredicate(cwd);\n const lower = basePrefix.toLowerCase();\n const matches: PathSuggestion[] = [];\n let scanned = 0;\n for (const entry of entries) {\n if (scanned >= maxScanEntries) break;\n scanned += 1;\n const isDir = entry.isDirectory();\n if (!isDir && !entry.isFile()) continue;\n if (isDir && SKIP_DIRS.has(entry.name)) continue;\n if (entry.name.startsWith(\".\") && !basePrefix.startsWith(\".\")) continue;\n if (!entry.name.toLowerCase().startsWith(lower)) continue;\n if (ignore?.(path.join(dirAbs, entry.name), isDir)) continue;\n matches.push({ path: `${dirPart}${entry.name}${isDir ? \"/\" : \"\"}`, isDir });\n }\n matches.sort((a, b) => a.path.localeCompare(b.path));\n return matches.slice(0, maxSuggestions);\n}\n","import { Box, Static, Text } from \"ink\";\nimport { memo } from \"react\";\nimport type { DiffLine } from \"../diff-preview\";\nimport { DiffLines } from \"./DiffLines\";\n\nexport interface DisplayMessage {\n id: number;\n role: \"user\" | \"assistant\" | \"assistant-cont\" | \"system\" | \"tool\";\n text: string;\n note?: string;\n // Structured diff lines (e.g. from /diff) rendered with per-line colors\n // below the message text instead of as one flat block.\n diff?: DiffLine[];\n // tight = no bottom margin; used for mid-turn continuation chunks so a\n // long streamed answer committed in pieces still reads as one block.\n tight?: boolean;\n}\n\nconst roleStyles: Record<\n Exclude<DisplayMessage[\"role\"], \"assistant-cont\">,\n { label: string; color: string }\n> = {\n user: { label: \"you\", color: \"cyan\" },\n assistant: { label: \"star\", color: \"green\" },\n system: { label: \"system\", color: \"yellow\" },\n tool: { label: \"tool\", color: \"magenta\" },\n};\n\nexport const MessageList = memo(function MessageList({ messages }: { messages: DisplayMessage[] }) {\n return (\n <Static items={messages}>\n {(message) => {\n const marginBottom = message.tight ? 0 : 1;\n if (message.role === \"assistant-cont\") {\n return (\n <Box key={message.id} flexDirection=\"column\" marginBottom={marginBottom}>\n <Text color=\"green\">{message.text}</Text>\n </Box>\n );\n }\n const style = roleStyles[message.role];\n return (\n <Box key={message.id} flexDirection=\"column\" marginBottom={marginBottom}>\n <Text bold color={style.color}>\n {style.label}\n </Text>\n <Text color={style.color}>{message.text}</Text>\n {message.diff && <DiffLines lines={message.diff} />}\n {message.note && <Text dimColor>{message.note}</Text>}\n </Box>\n );\n }}\n </Static>\n );\n});\n","import { Text } from \"ink\";\nimport type { DiffLine } from \"../diff-preview\";\n\nexport function DiffLineView({ line }: { line: DiffLine }) {\n if (line.kind === \"add\") return <Text color=\"green\">+ {line.text}</Text>;\n if (line.kind === \"del\") return <Text color=\"red\">- {line.text}</Text>;\n if (line.kind === \"marker\") return <Text dimColor>{line.text}</Text>;\n return <Text dimColor> {line.text}</Text>;\n}\n\nexport function DiffLines({ lines }: { lines: DiffLine[] }) {\n return (\n <>\n {lines.map((line, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: diff lines have no stable identity\n <DiffLineView key={index} line={line} />\n ))}\n </>\n );\n}\n","import { Box, Text, useInput } from \"ink\";\nimport type { PermissionRequest } from \"../../permissions/types\";\nimport type { DiffPreview } from \"../diff-preview\";\nimport { summarizeArgs } from \"../format\";\nimport { DiffLines } from \"./DiffLines\";\n\nexport type PermissionDecision = \"yes\" | \"no\" | \"always\";\n\ninterface PermissionPromptProps {\n request: PermissionRequest;\n preview?: DiffPreview | null;\n onDecision(decision: PermissionDecision): void;\n}\n\nexport function PermissionPrompt({ request, preview, onDecision }: PermissionPromptProps) {\n useInput((input) => {\n const ch = input.toLowerCase();\n if (ch === \"y\") onDecision(\"yes\");\n else if (ch === \"n\") onDecision(\"no\");\n else if (ch === \"a\") onDecision(\"always\");\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"yellow\" paddingX={1}>\n <Text bold color=\"yellow\">\n Permission required: {request.toolName} ({request.level})\n </Text>\n {preview ? (\n <Box flexDirection=\"column\">\n <Text dimColor>\n {preview.type === \"new-file\" ? \"New file: \" : \"\"}\n {preview.label}\n </Text>\n <DiffLines lines={preview.lines} />\n </Box>\n ) : (\n <Text>{summarizeArgs(request.args)}</Text>\n )}\n <Text>[y] allow [n] deny [a] always (saved to config)</Text>\n </Box>\n );\n}\n","import { Box, Text, useInput } from \"ink\";\n\nexport type RewindDecision = \"yes\" | \"no\";\n\ninterface RewindConfirmPromptProps {\n summary: string;\n onDecision(decision: RewindDecision): void;\n}\n\nexport function RewindConfirmPrompt({ summary, onDecision }: RewindConfirmPromptProps) {\n useInput((input, key) => {\n const ch = input.toLowerCase();\n if (ch === \"y\") onDecision(\"yes\");\n else if (ch === \"n\" || key.escape) onDecision(\"no\");\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"yellow\" paddingX={1}>\n <Text bold color=\"yellow\">\n Rewind checkpoints\n </Text>\n <Text>{summary}</Text>\n <Text>[y] rewind [n] cancel (Esc = n)</Text>\n </Box>\n );\n}\n","import { Box, Text, useInput } from \"ink\";\nimport { useRef, useState } from \"react\";\n\nexport interface SelectOption {\n value: string;\n label: string;\n description?: string;\n hint?: string;\n}\n\ninterface SelectPromptProps {\n title: string;\n options: SelectOption[];\n onSelect(value: string): void;\n onCancel(): void;\n}\n\nexport const SELECT_PROMPT_MAX_VISIBLE = 9;\n\nexport function SelectPrompt({ title, options, onSelect, onCancel }: SelectPromptProps) {\n const [index, setIndex] = useState(0);\n const indexRef = useRef(0);\n const move = (delta: number) => {\n indexRef.current = Math.max(0, Math.min(indexRef.current + delta, options.length - 1));\n setIndex(indexRef.current);\n };\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n return;\n }\n if (key.return) {\n const option = options[indexRef.current];\n if (option) onSelect(option.value);\n return;\n }\n if (key.downArrow || input === \"j\") {\n move(1);\n } else if (key.upArrow || input === \"k\") {\n move(-1);\n }\n });\n\n const maxStart = Math.max(0, options.length - SELECT_PROMPT_MAX_VISIBLE);\n const start = Math.min(Math.max(0, index - Math.floor(SELECT_PROMPT_MAX_VISIBLE / 2)), maxStart);\n const visible = options.slice(start, start + SELECT_PROMPT_MAX_VISIBLE);\n const above = start;\n const below = options.length - start - visible.length;\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text bold color=\"cyan\">\n {title}\n </Text>\n {above > 0 && <Text dimColor>… {above} more above</Text>}\n {visible.map((option, i) => {\n const active = start + i === index;\n return (\n <Text key={option.value}>\n <Text bold={active} inverse={active}>\n {active ? \"❯ \" : \" \"}\n {option.label}\n </Text>\n {option.hint && <Text dimColor> ({option.hint})</Text>}\n {option.description && <Text dimColor> — {option.description}</Text>}\n </Text>\n );\n })}\n {below > 0 && <Text dimColor>… {below} more below</Text>}\n <Text dimColor>[↑/↓ or j/k] move [Enter] select [Esc] cancel</Text>\n </Box>\n );\n}\n","import { Box, Text, useStdout } from \"ink\";\nimport { memo } from \"react\";\nimport { formatDollars } from \"../cost\";\n\ninterface StatusBarProps {\n cwd: string;\n model: string;\n permissionMode: string;\n tokens: number;\n // Git branch, refreshed on turn boundaries by the parent (null = not a repo).\n gitBranch?: string | null;\n // Context window usage in percent; null when unknown (non-loop backend).\n contextPercent?: number | null;\n sessionCostUsd?: number | null;\n // Labels of currently running background tasks (description or command).\n backgroundTasks?: string[];\n}\n\nconst BG_LABEL_MAX = 40;\nconst WIDE_COLUMNS = 120;\n\nfunction cwdLabel(cwd: string, wide: boolean): string {\n if (wide) return cwd;\n const base = cwd\n .replace(/[\\\\/]+$/, \"\")\n .split(/[\\\\/]/)\n .pop();\n return base && base.length > 0 ? base : cwd;\n}\n\nexport const StatusBar = memo(function StatusBar({\n cwd,\n model,\n permissionMode,\n tokens,\n gitBranch,\n contextPercent,\n sessionCostUsd,\n backgroundTasks = [],\n}: StatusBarProps) {\n const { stdout } = useStdout();\n const wide = (stdout?.columns ?? 80) >= WIDE_COLUMNS;\n const joined = backgroundTasks.join(\", \");\n const labels = joined.length > BG_LABEL_MAX ? `${joined.slice(0, BG_LABEL_MAX)}…` : joined;\n return (\n <Box justifyContent=\"space-between\">\n <Text dimColor>\n {cwdLabel(cwd, wide)}\n {gitBranch ? ` [${gitBranch}]` : \"\"}\n </Text>\n {backgroundTasks.length > 0 && (\n <Text color=\"yellow\">\n bg: {backgroundTasks.length} ({labels})\n </Text>\n )}\n <Text dimColor>model: {model}</Text>\n {contextPercent != null && <Text dimColor>ctx: {contextPercent}%</Text>}\n {sessionCostUsd != null && sessionCostUsd > 0 && (\n <Text dimColor>${formatDollars(sessionCostUsd)}</Text>\n )}\n <Text dimColor>{tokens} tokens</Text>\n <Text dimColor>mode: {permissionMode}</Text>\n </Box>\n );\n});\n","import { Box, Text } from \"ink\";\nimport { memo } from \"react\";\n\nexport const StreamingMessage = memo(function StreamingMessage({\n text,\n continuation,\n}: { text: string; continuation?: boolean }) {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n {!continuation && (\n <Text bold color=\"green\">\n star\n </Text>\n )}\n <Text color=\"green\">{text}</Text>\n </Box>\n );\n});\n","import { Box, Text } from \"ink\";\n\nexport const SPINNER_FRAMES = [\"-\", \"\\\\\", \"|\", \"/\"];\nexport const REASONING_TAIL_LENGTH = 200;\nexport const THOUGHT_SUMMARY_LENGTH = 100;\n\nexport function truncateTail(text: string, max: number): string {\n const flat = text.replace(/\\s+/g, \" \").trim();\n if (flat.length <= max) return flat;\n return `…${flat.slice(flat.length - max)}`;\n}\n\n// The spinner frame is driven by the caller's render ticker (see cli/ticker.ts);\n// keeping no internal interval avoids a second full-tree Ink rewrite per frame.\n// `activity` replaces the default label, e.g. while a tool call is executing.\nexport function ThinkingIndicator({\n reasoning,\n frame = 0,\n activity,\n}: { reasoning?: string; frame?: number; activity?: string }) {\n const tail = reasoning ? truncateTail(reasoning, REASONING_TAIL_LENGTH) : \"\";\n const spinner = SPINNER_FRAMES[frame % SPINNER_FRAMES.length];\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>\n {spinner} {activity ?? \"star is thinking…\"}\n </Text>\n {tail !== \"\" && <Text dimColor> {tail}</Text>}\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\nimport type { TodoItem } from \"../../tools/todo\";\n\nconst SYMBOLS: Record<TodoItem[\"status\"], string> = {\n pending: \"[ ]\",\n in_progress: \"[~]\",\n done: \"[x]\",\n};\n\n// Persistent todo list rendered in the live region above the input box, so\n// it survives spinner/thinking redraws; finished items are dimmed.\nexport function TodoPanel({ todos }: { todos: TodoItem[] }) {\n if (todos.length === 0) return null;\n return (\n <Box flexDirection=\"column\">\n {todos.map((todo) => (\n <Text\n key={todo.id}\n dimColor={todo.status === \"done\"}\n color={todo.status === \"in_progress\" ? \"cyan\" : undefined}\n >\n {SYMBOLS[todo.status]} {todo.title}\n </Text>\n ))}\n </Box>\n );\n}\n","import { previewLines } from \"../format\";\n\nexport interface ToolCardData {\n id: string;\n name: string;\n argsSummary: string;\n result?: string;\n isError?: boolean;\n}\n\nexport function formatToolCard(card: ToolCardData): string {\n const header = `${card.name} ${card.argsSummary}${card.isError ? \" [error]\" : \"\"}`;\n if (card.result === undefined) return header;\n const preview = previewLines(card.result, 10);\n return `${header}\\n${preview.text}${preview.truncated ? \"\\n... (truncated)\" : \"\"}`;\n}\n","export const DOUBLE_ESC_WINDOW_MS = 600;\n\n// Two Esc presses within the window (while idle) trigger edit-last-message.\nexport function isDoubleEscape(\n previous: number | null,\n now: number,\n windowMs: number = DOUBLE_ESC_WINDOW_MS,\n): boolean {\n return previous !== null && now - previous <= windowMs;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { starHome } from \"../config/paths\";\n\nconst DEFAULT_LIMIT = 500;\nconst MAX_FILE_LINES = 1000;\nconst TRIM_TO_LINES = 500;\n\nfunction historyPath(): string {\n return path.join(starHome(), \"history\");\n}\n\nfunction readLines(file: string): string[] {\n const raw = fs.readFileSync(file, \"utf8\");\n return raw\n .split(\"\\n\")\n .map((line) => line.replace(/\\r$/, \"\"))\n .filter((line) => line.trim().length > 0);\n}\n\nexport function loadHistory(limit = DEFAULT_LIMIT): string[] {\n try {\n return readLines(historyPath()).slice(-limit);\n } catch {\n return [];\n }\n}\n\nexport function appendHistory(entry: string): void {\n const line = entry.replace(/[\\r\\n]+/g, \" \").trim();\n if (line.length === 0) return;\n try {\n const file = historyPath();\n let existing: string[] = [];\n try {\n existing = readLines(file);\n } catch {\n // Missing or unreadable history file starts fresh.\n }\n if (existing[existing.length - 1] === line) return;\n if (existing.length >= MAX_FILE_LINES) {\n const kept = [...existing.slice(-(TRIM_TO_LINES - 1)), line];\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, `${kept.join(\"\\n\")}\\n`);\n return;\n }\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.appendFileSync(file, `${line}\\n`);\n } catch {\n // History is best-effort and must never crash the REPL.\n }\n}\n","export const BELL = \"\\x07\";\n\nexport interface NotifyBellInput {\n enabled: boolean;\n thresholdSec: number;\n noNotifyEnv: boolean;\n interrupted?: boolean;\n // Turn duration; omit for events with no meaningful threshold (background\n // task completion always qualifies).\n elapsedMs?: number;\n}\n\nexport function shouldNotifyBell(input: NotifyBellInput, isTTY: boolean): boolean {\n if (!input.enabled || input.noNotifyEnv || !isTTY) return false;\n if (input.interrupted) return false;\n if (input.elapsedMs !== undefined && input.elapsedMs < input.thresholdSec * 1000) return false;\n return true;\n}\n\nexport interface NotifyBellDeps {\n write?: (text: string) => void;\n isTTY?: boolean;\n}\n\nexport function notifyBell(input: NotifyBellInput, deps: NotifyBellDeps = {}): boolean {\n const isTTY = deps.isTTY ?? Boolean(process.stdout.isTTY);\n if (!shouldNotifyBell(input, isTTY)) return false;\n (deps.write ?? ((text: string) => process.stdout.write(text)))(BELL);\n return true;\n}\n","import type { ImageInput } from \"../core/messages\";\n\nexport interface QueuedPrompt {\n // Stable id for keyed rendering of the queued list.\n id: number;\n text: string;\n images: ImageInput[];\n}\n\n// FIFO typeahead queue: prompts submitted while a turn is streaming wait here\n// and are auto-sent (in order) once the turn finishes.\nexport class PromptQueue {\n private items: QueuedPrompt[] = [];\n private nextId = 1;\n\n enqueue(prompt: { text: string; images: ImageInput[] }): number {\n this.items.push({ id: this.nextId++, ...prompt });\n return this.items.length;\n }\n\n dequeue(): QueuedPrompt | undefined {\n return this.items.shift();\n }\n\n // Empties the queue and returns what was dropped (for the \"cleared N\" note).\n clear(): QueuedPrompt[] {\n const removed = this.items;\n this.items = [];\n return removed;\n }\n\n get size(): number {\n return this.items.length;\n }\n\n list(): QueuedPrompt[] {\n return [...this.items];\n }\n}\n","import { isDangerousCommand } from \"../permissions/gate\";\nimport { bashTool } from \"../tools/bash\";\n\nexport const SHELL_BANG_DISPLAY_MAX_CHARS = 3000;\n\nexport type ShellBangOutcome =\n | {\n ok: true;\n command: string;\n output: string;\n isError: boolean;\n contextMessage: string;\n }\n | { ok: false; reason: \"empty\" | \"dangerous\" };\n\nexport function truncateShellOutput(\n output: string,\n max: number = SHELL_BANG_DISPLAY_MAX_CHARS,\n): string {\n if (output.length <= max) return output;\n const half = Math.floor(max / 2);\n return `${output.slice(0, half)}\\n... [${output.length - max} characters truncated] ...\\n${output.slice(-half)}`;\n}\n\nexport function buildShellContextMessage(command: string, output: string): string {\n return `The user ran \\`!${command}\\` directly in the shell (no permission prompt). Output:\\n${output}`;\n}\n\nexport async function executeShellBang(\n raw: string,\n cwd: string,\n signal?: AbortSignal,\n): Promise<ShellBangOutcome> {\n const command = raw.trim();\n if (!command) return { ok: false, reason: \"empty\" };\n if (isDangerousCommand(command)) return { ok: false, reason: \"dangerous\" };\n const result = await bashTool.execute({ command }, { cwd, abortSignal: signal });\n const output = truncateShellOutput(result.content);\n return {\n ok: true,\n command,\n output,\n isError: result.isError ?? false,\n contextMessage: buildShellContextMessage(command, output),\n };\n}\n","export const TICK_MS = 100;\n\nexport interface FlushState {\n streamed: string;\n reasoning: string;\n}\n\n// Returns the next flush state, or null when nothing changed since prev,\n// so callers can skip the state update (and the full Ink re-render) entirely.\nexport function nextFlush(prev: FlushState, next: FlushState): FlushState | null {\n if (prev.streamed === next.streamed && prev.reasoning === next.reasoning) return null;\n return next;\n}\n\n// Single render ticker: one interval drives both stream flushes and the\n// spinner frame. Returns a stop function; the callback receives the tick count.\nexport function startTicker(onTick: (tick: number) => void, intervalMs = TICK_MS): () => void {\n let tick = 0;\n const timer = setInterval(() => {\n tick += 1;\n onTick(tick);\n }, intervalMs);\n return () => clearInterval(timer);\n}\n","const REGISTRY_URL = \"https://registry.npmjs.org/@cryer%2fstar-cli/latest\";\nconst TIMEOUT_MS = 5000;\n\nexport interface FetchResponse {\n ok: boolean;\n json(): Promise<unknown>;\n}\n\nexport type UpdateFetcher = (url: string) => Promise<FetchResponse>;\n\nasync function defaultFetcher(url: string): Promise<FetchResponse> {\n return fetch(url, { signal: AbortSignal.timeout(TIMEOUT_MS) });\n}\n\nexport function isNewerVersion(latest: string, current: string): boolean {\n const parse = (v: string) =>\n v\n .split(\".\")\n .slice(0, 3)\n .map((part) => Number.parseInt(part, 10));\n const a = parse(latest);\n const b = parse(current);\n for (let i = 0; i < 3; i++) {\n const x = a[i] ?? 0;\n const y = b[i] ?? 0;\n if (Number.isNaN(x) || Number.isNaN(y)) return false;\n if (x !== y) return x > y;\n }\n return false;\n}\n\nexport async function checkForUpdate(\n currentVersion: string,\n fetcher: UpdateFetcher = defaultFetcher,\n): Promise<string | null> {\n try {\n const res = await fetcher(REGISTRY_URL);\n if (!res.ok) return null;\n const data: unknown = await res.json();\n const latest =\n typeof data === \"object\" && data !== null ? (data as { version?: unknown }).version : null;\n if (typeof latest !== \"string\" || !isNewerVersion(latest, currentVersion)) return null;\n return `New version available: ${currentVersion} -> ${latest} — run: npm i -g @cryer/star-cli`;\n } catch {\n return null;\n }\n}\n","import fs from \"node:fs\";\nimport { parse } from \"smol-toml\";\nimport { globalConfigPath, projectConfigPath } from \"./paths\";\nimport { type CliOverrides, ConfigSchema, type StarConfig } from \"./schema\";\n\nconst PartialConfigSchema = ConfigSchema.partial();\n\ntype PartialConfig = ReturnType<typeof PartialConfigSchema.parse>;\n\nfunction parseTomlFile(content: string, filePath: string): PartialConfig {\n let raw: unknown;\n try {\n raw = parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to parse TOML in ${filePath}: ${message}`);\n }\n const result = PartialConfigSchema.safeParse(raw);\n if (!result.success) {\n throw new Error(`Invalid config in ${filePath}: ${result.error.message}`);\n }\n return result.data;\n}\n\nfunction mergeConfig(base: PartialConfig, override: PartialConfig): PartialConfig {\n return { ...base, ...override };\n}\n\nfunction applyOverrides(config: PartialConfig, overrides?: CliOverrides): PartialConfig {\n if (!overrides) return config;\n const merged = { ...config };\n if (overrides.model !== undefined) merged.defaultModel = overrides.model;\n if (overrides.permissionMode !== undefined) merged.permissionMode = overrides.permissionMode;\n return merged;\n}\n\nasync function readTomlFile(filePath: string): Promise<PartialConfig> {\n let content: string;\n try {\n content = await fs.promises.readFile(filePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return {};\n throw error;\n }\n return parseTomlFile(content, filePath);\n}\n\nfunction readTomlFileSync(filePath: string): PartialConfig {\n if (!fs.existsSync(filePath)) return {};\n const content = fs.readFileSync(filePath, \"utf8\");\n return parseTomlFile(content, filePath);\n}\n\nexport async function loadConfig(cwd: string, overrides?: CliOverrides): Promise<StarConfig> {\n const global = await readTomlFile(globalConfigPath());\n const project = await readTomlFile(projectConfigPath(cwd));\n const merged = applyOverrides(mergeConfig(global, project), overrides);\n return ConfigSchema.parse(merged);\n}\n\nexport function loadConfigSync(cwd: string, overrides?: CliOverrides): StarConfig {\n const global = readTomlFileSync(globalConfigPath());\n const project = readTomlFileSync(projectConfigPath(cwd));\n const merged = applyOverrides(mergeConfig(global, project), overrides);\n return ConfigSchema.parse(merged);\n}\n"],"mappings":"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","names":["st","buf","Box","Text","useInput","useEffect","useRef","useState","path","path","fs","path","fs","path","fs","path","path","fs","removed","fs","path","fs","path","fs","path","fs","path","readFile","path","buf","fs","path","path","fs","readFile","path","i","j","readFileSync","path","readFileSync","path","fs","path","fs","path","fs","path","fileExists","path","Box","Text","useInput","path","path","jsx","jsxs","useInput","Box","Text","Box","Text","Text","jsx","jsxs","jsx","jsxs","MessageList","Box","Text","Box","Text","useInput","jsx","jsxs","useInput","Box","Text","Box","Text","useInput","jsx","jsxs","Box","Text","useInput","useRef","useState","jsx","jsxs","Box","Text","memo","jsxs","memo","StatusBar","tokens","Box","Text","Box","Text","memo","jsx","jsxs","StreamingMessage","Box","Text","jsxs","Box","Text","jsx","jsxs","fs","path","path","fs","REGISTRY_URL","defaultFetcher","parse","jsx","jsxs","useState","useRef","useEffect","useInput","messages","model","Box","Text","fs","parse","parse","fs"]}