@cryer/star-cli 0.1.1 → 0.1.3

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/agent/loop.ts","../src/context/compaction.ts","../src/context/tokens.ts","../src/permissions/gate.ts","../src/permissions/allow.ts","../src/cli/mentions.ts","../src/tools/fs/util.ts","../src/cli/repl.tsx","../src/config/save.ts","../src/config/paths.ts","../src/llm/provider.ts","../src/llm/registry.ts","../src/session/store.ts","../src/session/resume.ts","../src/tools/bash.ts","../src/tools/fs/edit.ts","../src/tools/fs/snapshots.ts","../src/tools/fs/glob.ts","../src/tools/fs/grep.ts","../src/tools/fs/read.ts","../src/tools/fs/write.ts","../src/tools/todo.ts","../src/tools/web/fetch.ts","../src/tools/web/search.ts","../src/tools/registry.ts","../src/tools/index.ts","../src/cli/commands/actions.ts","../src/cli/commands/builtin.ts","../src/cli/commands/registry.ts","../src/cli/components/InputBox.tsx","../src/cli/commands/suggest.ts","../src/cli/components/MessageList.tsx","../src/cli/components/PermissionPrompt.tsx","../src/cli/format.ts","../src/cli/components/StatusBar.tsx","../src/cli/components/StreamingMessage.tsx","../src/cli/components/ToolCallCard.tsx","../src/config/loader.ts","../src/config/schema.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { AgentLoop } from \"./agent/loop\";\nimport { resolveMentions } from \"./cli/mentions\";\nimport { renderRepl } from \"./cli/repl\";\nimport { loadConfigSync } from \"./config/loader\";\nimport type { StarConfig } from \"./config/schema\";\nimport type { CoreMessage } from \"./core/messages\";\nimport { createModel } from \"./llm/provider\";\nimport { resumeSession } from \"./session/resume\";\nimport { type SessionMeta, SessionStore } from \"./session/store\";\nimport { createDefaultRegistry } from \"./tools\";\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 });\n}\n\nasync function printMode(loop: AgentLoop, prompt: string, cwd: string): Promise<number> {\n const controller = new AbortController();\n process.on(\"SIGINT\", () => controller.abort());\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 let requests = 0;\n let promptTokens = 0;\n let completionTokens = 0;\n let totalTokens = 0;\n let exitCode = 0;\n for await (const event of loop.stream(resolved.input, controller.signal, {\n persistAs: prompt,\n })) {\n switch (event.type) {\n case \"text-delta\":\n process.stdout.write(event.text);\n break;\n case \"tool-call\":\n process.stderr.write(`\\n[tool] ${event.name} ${JSON.stringify(event.args)}\\n`);\n break;\n case \"tool-result\": {\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 break;\n }\n case \"finish\":\n if (event.usage) {\n requests += 1;\n promptTokens += event.usage.promptTokens;\n completionTokens += event.usage.completionTokens;\n totalTokens += event.usage.totalTokens;\n }\n break;\n case \"error\":\n process.stderr.write(`\\n[error] ${event.error.message}\\n`);\n exitCode = 1;\n break;\n }\n if (exitCode !== 0) break;\n }\n if (requests > 0) {\n process.stderr.write(\n `[usage] ${requests} requests, ${promptTokens} prompt + ${completionTokens} completion = ${totalTokens} tokens\\n`,\n );\n }\n process.stdout.write(\"\\n\");\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(\"0.1.0\")\n .option(\"-m, --model <model>\", \"model to use\")\n .option(\"--permission-mode <mode>\", \"permission mode: auto | ask | readonly\")\n .option(\"-p, --print <prompt>\", \"non-interactive print mode\")\n .option(\"-r, --resume <sessionId>\", \"resume a previous session\")\n .action(async (opts) => {\n const cwd = process.cwd();\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 if (opts.resume) {\n resumed = await resumeSession(opts.resume);\n if (!resumed) {\n console.error(`Session not found: ${opts.resume}`);\n process.exit(1);\n }\n sessionStore = await SessionStore.open(opts.resume);\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 }\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(loop, opts.print, cwd);\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 { LanguageModel } from \"ai\";\nimport { tool as aiTool } from \"ai\";\nimport type { StarConfig } from \"../config/schema\";\nimport { type CompactionResult, compactMessages, summarizeMessages } from \"../context/compaction\";\nimport type { StreamEvent } from \"../core/events\";\nimport type { CoreMessage } from \"../core/messages\";\nimport { checkPermission } from \"../permissions/gate\";\nimport type { PermissionRequest } from \"../permissions/types\";\nimport type { SessionStore } from \"../session/store\";\nimport type { ToolRegistry } from \"../tools/registry\";\nimport type { ToolResult } from \"../tools/types\";\n\nexport interface AgentLoopOptions {\n model: LanguageModel;\n registry: ToolRegistry;\n config: StarConfig;\n cwd: string;\n system?: string;\n sessionStore?: SessionStore | null;\n}\n\ninterface PendingToolCall {\n id: string;\n name: string;\n args: unknown;\n}\n\nexport class AgentLoop {\n private messages: CoreMessage[] = [];\n private readonly opts: AgentLoopOptions;\n confirmHandler?: (req: PermissionRequest) => Promise<boolean>;\n\n constructor(opts: AgentLoopOptions) {\n this.opts = opts;\n if (opts.system) {\n this.messages.push({ role: \"system\", content: opts.system });\n }\n }\n\n getMessages(): readonly CoreMessage[] {\n return this.messages;\n }\n\n async loadMessages(messages: CoreMessage[]): Promise<void> {\n this.messages = messages;\n }\n\n private async persist(message: CoreMessage): Promise<void> {\n await this.opts.sessionStore?.append(message);\n }\n\n async *stream(\n input: string,\n signal: AbortSignal,\n opts?: { persistAs?: string },\n ): AsyncGenerator<StreamEvent> {\n const userMessage: CoreMessage = { role: \"user\", content: input };\n this.messages.push(userMessage);\n await this.persist(\n opts?.persistAs !== undefined ? { role: \"user\", content: opts.persistAs } : userMessage,\n );\n\n const { config, registry, cwd } = this.opts;\n const aiTools = this.buildAiTools();\n\n for (let step = 0; step < config.maxSteps; step++) {\n const compacted = compactMessages([...this.messages], config.contextMaxTokens);\n if (compacted.compacted) {\n this.messages = await this.applyCompactionSummary(compacted);\n }\n\n let text = \"\";\n const toolCalls: PendingToolCall[] = [];\n let failed = false;\n\n try {\n for await (const event of this.streamOnce(aiTools, signal)) {\n if (event.type === \"text-delta\") {\n text += event.text;\n yield event;\n } else if (event.type === \"tool-call\") {\n toolCalls.push({ id: event.id, name: event.name, args: event.args });\n yield event;\n } else if (event.type === \"error\") {\n failed = true;\n yield event;\n } else {\n yield event;\n }\n }\n } catch (error) {\n yield { type: \"error\", error: error instanceof Error ? error : new Error(String(error)) };\n return;\n }\n\n if (failed) return;\n\n const assistantMessage: CoreMessage = {\n role: \"assistant\",\n content: [\n ...(text ? [{ type: \"text\" as const, text }] : []),\n ...toolCalls.map((call) => ({\n type: \"tool-call\" as const,\n toolCallId: call.id,\n toolName: call.name,\n args: call.args,\n })),\n ],\n };\n this.messages.push(assistantMessage);\n await this.persist(assistantMessage);\n\n if (toolCalls.length === 0) return;\n\n for (const call of toolCalls) {\n const result = await this.executeTool(call, signal);\n const toolMessage: CoreMessage = {\n role: \"tool\",\n content: [\n {\n type: \"tool-result\",\n toolCallId: call.id,\n toolName: call.name,\n result: result.content,\n },\n ],\n };\n this.messages.push(toolMessage);\n await this.persist(toolMessage);\n yield {\n type: \"tool-result\",\n id: call.id,\n name: call.name,\n content: result.content,\n isError: result.isError,\n };\n }\n }\n\n yield {\n type: \"error\",\n error: new Error(`Max steps (${config.maxSteps}) reached, stopping.`),\n };\n }\n\n private async applyCompactionSummary(compacted: CompactionResult): Promise<CoreMessage[]> {\n const { config, model } = this.opts;\n if (config.contextCompaction !== \"summary\" || !model) {\n return compacted.messages;\n }\n const headCount = compacted.messages[0]?.role === \"system\" ? 1 : 0;\n const dropped = this.messages.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\n private async *streamOnce(\n aiTools: Record<string, unknown>,\n signal: AbortSignal,\n ): AsyncGenerator<StreamEvent> {\n const { streamChat } = await import(\"../llm/stream\");\n yield* streamChat({\n model: this.opts.model,\n messages: this.messages,\n tools: aiTools,\n abortSignal: signal,\n });\n }\n\n private buildAiTools(): Record<string, unknown> {\n const tools: Record<string, unknown> = {};\n for (const t of this.opts.registry.list()) {\n tools[t.name] = aiTool({\n description: t.description,\n parameters: t.parameters as never,\n });\n }\n return tools;\n }\n\n private async executeTool(call: PendingToolCall, signal: AbortSignal): Promise<ToolResult> {\n const { registry, config, cwd } = this.opts;\n const tool = registry.get(call.name);\n if (!tool) {\n return { content: `Unknown tool: ${call.name}`, isError: true };\n }\n\n const decision = checkPermission(\n config.permissionMode,\n { toolName: call.name, args: call.args, level: tool.permission },\n { cwd },\n config.permissions.allow,\n );\n\n if (decision === \"deny\") {\n return { content: `Permission denied for tool \"${call.name}\".`, isError: true };\n }\n if (decision === \"ask\") {\n const approved = this.confirmHandler\n ? await this.confirmHandler({\n toolName: call.name,\n args: call.args,\n level: tool.permission,\n })\n : false;\n if (!approved) {\n return { content: `User rejected tool \"${call.name}\".`, isError: true };\n }\n }\n\n const parsed = tool.parameters.safeParse(call.args);\n if (!parsed.success) {\n return { content: `Invalid arguments: ${parsed.error.message}`, isError: true };\n }\n\n try {\n return await tool.execute(parsed.data, { cwd, abortSignal: signal });\n } catch (error) {\n if (signal.aborted) {\n return { content: \"Tool execution aborted.\", isError: true };\n }\n return {\n content: `Tool error: ${error instanceof Error ? error.message : String(error)}`,\n isError: true,\n };\n }\n }\n}\n","import { type LanguageModelV1, generateText } from \"ai\";\nimport type { CoreMessage } from \"../core/messages\";\nimport { estimateTokens } from \"./tokens\";\n\nexport interface CompactionResult {\n messages: CoreMessage[];\n compacted: boolean;\n droppedCount: number;\n}\n\nconst MIN_KEPT_MESSAGES = 4;\n\nfunction placeholderMessage(droppedCount: number): CoreMessage {\n return {\n role: \"user\",\n content: `[context compacted: ${droppedCount} earlier messages dropped]`,\n };\n}\n\nconst SUMMARY_SYSTEM_PROMPT = [\n \"You are summarizing an AI coding agent's conversation for context compaction.\",\n \"Write a concise summary that preserves:\",\n \"- the user's goals and requests\",\n \"- decisions made and their rationale\",\n \"- files and code touched (paths, key changes)\",\n \"- tool results that matter (errors, key outputs)\",\n \"- outstanding TODOs and next steps\",\n \"Output only the summary, no preamble.\",\n].join(\"\\n\");\n\nfunction serializeMessage(message: CoreMessage): string {\n if (typeof message.content === \"string\") {\n return `${message.role}: ${message.content}`;\n }\n const parts = message.content.map((part) => {\n if (part.type === \"text\") return part.text;\n if (part.type === \"tool-call\")\n return `[tool-call ${part.toolName}] ${JSON.stringify(part.args)}`;\n if (part.type === \"tool-result\")\n return `[tool-result ${part.toolName}] ${JSON.stringify(part.result)}`;\n return `[${part.type}]`;\n });\n return `${message.role}: ${parts.join(\"\\n\")}`;\n}\n\nexport async function summarizeMessages(\n messages: CoreMessage[],\n model: LanguageModelV1,\n): Promise<string> {\n const transcript = messages.map(serializeMessage).join(\"\\n\");\n const { text } = await generateText({\n model,\n system: SUMMARY_SYSTEM_PROMPT,\n prompt: `Summarize this conversation so far:\\n\\n${transcript}`,\n });\n return text.trim();\n}\n\nexport function compactMessages(messages: CoreMessage[], maxTokens: number): CompactionResult {\n if (estimateTokens(messages) <= maxTokens) {\n return { messages, compacted: false, droppedCount: 0 };\n }\n\n const first = messages[0];\n const hasSystem = first?.role === \"system\";\n const head = hasSystem && first ? [first] : [];\n const rest = hasSystem ? messages.slice(1) : messages.slice();\n\n const turns: CoreMessage[][] = [];\n for (const message of rest) {\n const current = turns[turns.length - 1];\n if (message.role === \"user\" || !current) {\n turns.push([message]);\n } else {\n current.push(message);\n }\n }\n\n let droppedCount = 0;\n let turnIndex = 0;\n while (turnIndex < turns.length) {\n const turn = turns[turnIndex] as CoreMessage[];\n if (rest.length - droppedCount - turn.length < MIN_KEPT_MESSAGES) {\n break;\n }\n droppedCount += turn.length;\n turnIndex += 1;\n const candidate = [...head, placeholderMessage(droppedCount), ...rest.slice(droppedCount)];\n if (estimateTokens(candidate) <= maxTokens) {\n break;\n }\n }\n\n if (droppedCount === 0) {\n return { messages, compacted: false, droppedCount: 0 };\n }\n\n return {\n messages: [...head, placeholderMessage(droppedCount), ...rest.slice(droppedCount)],\n compacted: true,\n droppedCount,\n };\n}\n","import type { CoreMessage } from \"../core/messages\";\n\nconst CHARS_PER_TOKEN = 4;\nconst MESSAGE_OVERHEAD = 4;\n\nfunction contentCharLength(message: CoreMessage): number {\n if (message.role === \"tool\") {\n let chars = 0;\n for (const part of message.content) {\n chars += JSON.stringify(part.result ?? null).length;\n }\n return chars;\n }\n if (typeof message.content === \"string\") {\n return message.content.length;\n }\n let chars = 0;\n for (const part of message.content) {\n if (part.type === \"text\" || part.type === \"reasoning\") {\n chars += part.text.length;\n } else if (part.type === \"tool-call\") {\n chars += part.toolName.length + JSON.stringify(part.args ?? null).length;\n }\n }\n return chars;\n}\n\nexport function estimateMessageTokens(message: CoreMessage): number {\n return Math.ceil(contentCharLength(message) / CHARS_PER_TOKEN) + MESSAGE_OVERHEAD;\n}\n\nexport function estimateTokens(messages: CoreMessage[]): number {\n return messages.reduce((total, message) => total + estimateMessageTokens(message), 0);\n}\n","import path from \"node:path\";\nimport { isAllowedByRules } from \"./allow\";\nimport type {\n PermissionContext,\n PermissionDecision,\n PermissionMode,\n PermissionRequest,\n} from \"./types\";\n\nconst FILE_TOOLS = new Set([\"write_file\", \"edit_file\", \"read_file\"]);\n\nconst DANGEROUS_COMMAND_PATTERNS = [\n /rm\\s+-rf\\s+\\/(?:\\s|$|;|&)/i,\n /rm\\s+-rf\\s+~(?:\\s|\\/|$|;|&)/i,\n /:\\(\\)\\s*\\{\\s*:\\|:&\\s*\\}\\s*;:/,\n /\\bmkfs\\b/i,\n /dd\\s+[^|;]*\\bif=/i,\n />\\s*\\/dev\\/sd[a-z]/i,\n /\\bshutdown\\b/i,\n /\\breboot\\b/i,\n /\\bpoweroff\\b/i,\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\") {\n return value;\n }\n }\n return undefined;\n}\n\nfunction normalizeAbsolute(p: string, cwd: string): string {\n const abs = path.isAbsolute(p) ? path.normalize(p) : path.resolve(cwd, p);\n return abs.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\").toLowerCase();\n}\n\nfunction isOutsideCwd(p: string, cwd: string): boolean {\n const abs = normalizeAbsolute(p, cwd);\n const base = normalizeAbsolute(cwd, cwd);\n return abs !== base && !abs.startsWith(`${base}/`);\n}\n\nfunction isSensitivePath(p: string): boolean {\n const base = p.replace(/\\\\/g, \"/\").split(\"/\").pop()?.toLowerCase() ?? \"\";\n if (base === \".env.example\" || base === \".env.sample\" || base === \".env.template\") {\n return false;\n }\n return base === \".env\" || base.startsWith(\".env.\") || base === \"id_rsa\" || base.endsWith(\".pem\");\n}\n\nexport function checkPermission(\n mode: PermissionMode,\n req: PermissionRequest,\n ctx: PermissionContext,\n allowRules: readonly string[] = [],\n): PermissionDecision {\n const command = getStringArg(req.args, \"command\");\n const filePath = getStringArg(req.args, \"path\");\n\n if (\n req.toolName === \"bash\" &&\n command !== undefined &&\n DANGEROUS_COMMAND_PATTERNS.some((pattern) => pattern.test(command))\n ) {\n return \"deny\";\n }\n\n if (FILE_TOOLS.has(req.toolName) && filePath !== undefined) {\n if (\n (req.toolName === \"write_file\" || req.toolName === \"edit_file\") &&\n isSensitivePath(filePath)\n ) {\n return \"deny\";\n }\n if (isOutsideCwd(filePath, ctx.cwd)) {\n if (mode === \"ask\" && req.level === \"read\") {\n return \"ask\";\n }\n return \"deny\";\n }\n }\n\n if (mode === \"auto\") {\n return \"allow\";\n }\n if (mode === \"readonly\") {\n return req.level === \"read\" ? \"allow\" : \"deny\";\n }\n if (isAllowedByRules(allowRules, req)) {\n return \"allow\";\n }\n return req.level === \"read\" ? \"allow\" : \"ask\";\n}\n\nexport function describeDecision(decision: PermissionDecision): string {\n switch (decision) {\n case \"allow\":\n return \"允许执行该操作\";\n case \"deny\":\n return \"拒绝执行:违反权限模式或硬性安全规则\";\n case \"ask\":\n return \"需要用户确认后才能执行\";\n }\n}\n","import type { PermissionRequest } from \"./types\";\n\nexport interface AllowRule {\n toolName: string;\n pattern?: string;\n}\n\nexport function parseAllowRule(rule: string): AllowRule | null {\n const match = /^([\\w-]+)(?:\\((.*)\\))?$/.exec(rule.trim());\n if (!match) return null;\n return { toolName: match[1] as string, pattern: match[2] };\n}\n\nfunction globMatch(pattern: string, value: string): boolean {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(`^${escaped}$`).test(value);\n}\n\nfunction requestTarget(req: PermissionRequest): string | undefined {\n if (typeof req.args !== \"object\" || req.args === null) return undefined;\n const args = req.args as Record<string, unknown>;\n const key = req.toolName === \"bash\" ? \"command\" : \"path\";\n const value = args[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function matchAllowRule(rule: AllowRule, req: PermissionRequest): boolean {\n if (rule.toolName !== req.toolName) return false;\n if (rule.pattern === undefined) return true;\n const target = requestTarget(req);\n return target !== undefined && globMatch(rule.pattern, target);\n}\n\nexport function isAllowedByRules(rules: readonly string[], req: PermissionRequest): boolean {\n return rules.some((raw) => {\n const rule = parseAllowRule(raw);\n return rule !== null && matchAllowRule(rule, req);\n });\n}\n\nexport function buildAllowRule(req: PermissionRequest): string {\n const target = requestTarget(req);\n return target !== undefined ? `${req.toolName}(${target})` : req.toolName;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { isSensitivePath } from \"../tools/fs/util\";\n\nexport const MAX_MENTION_BYTES = 100 * 1024;\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}\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: [] };\n }\n const blocks: string[] = [];\n const attached: string[] = [];\n const skipped: MentionSkip[] = [];\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 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 };\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const SKIP_DIRS = new Set([\"node_modules\", \".git\", \"dist\"]);\n\nexport interface WalkedFile {\n abs: string;\n rel: string;\n mtimeMs: number;\n}\n\nexport async function walkFiles(\n root: string,\n skipDirs: Set<string> = SKIP_DIRS,\n): Promise<WalkedFile[]> {\n const out: WalkedFile[] = [];\n async function walk(dir: string, relBase: string): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true }).catch(() => null);\n if (!entries) {\n return;\n }\n for (const entry of entries) {\n const abs = path.join(dir, entry.name);\n const rel = relBase ? `${relBase}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n if (!skipDirs.has(entry.name)) {\n await walk(abs, rel);\n }\n } else if (entry.isFile()) {\n try {\n const st = await stat(abs);\n out.push({ abs, rel, mtimeMs: st.mtimeMs });\n } catch {\n // ignore unreadable entries\n }\n }\n }\n }\n await walk(root, \"\");\n return out;\n}\n\nconst REGEX_SPECIALS = /[.+^${}()|[\\]\\\\]/g;\n\nexport function globToRegExp(pattern: string): RegExp {\n let re = \"\";\n let i = 0;\n while (i < pattern.length) {\n const c = pattern.charAt(i);\n if (c === \"*\") {\n if (pattern.charAt(i + 1) === \"*\") {\n i += 2;\n if (pattern.charAt(i) === \"/\") {\n i += 1;\n re += \"(?:[^/]+/)*\";\n } else {\n re += \".*\";\n }\n } else {\n re += \"[^/]*\";\n i += 1;\n }\n } else if (c === \"?\") {\n re += \"[^/]\";\n i += 1;\n } else {\n re += c.replace(REGEX_SPECIALS, \"\\\\$&\");\n i += 1;\n }\n }\n return new RegExp(`^${re}$`);\n}\n\nexport function matchesGlob(pattern: string, relPath: string): boolean {\n const normalized = pattern.replace(/\\\\/g, \"/\");\n if (!normalized.includes(\"/\")) {\n const base = relPath.split(\"/\").pop() ?? relPath;\n return globToRegExp(normalized).test(base);\n }\n return globToRegExp(normalized).test(relPath);\n}\n\nexport function isSensitivePath(filePath: string): boolean {\n const base = path.basename(filePath);\n if (base === \".env.example\" || base === \".env.sample\" || base === \".env.template\") {\n return false;\n }\n if (base === \".env\" || base.startsWith(\".env.\")) {\n return true;\n }\n if (base === \"id_rsa\" || base.endsWith(\".pem\")) {\n return true;\n }\n return false;\n}\n","import { Box, render, useApp, useInput } from \"ink\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { AgentLoop } from \"../agent/loop\";\nimport { addAllowRule } from \"../config/save\";\nimport type { StarConfig } from \"../config/schema\";\nimport type { CoreMessage } 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 { formatSessionList, resumeSession } from \"../session/resume\";\nimport { SessionStore } from \"../session/store\";\nimport { TodoStore, createDefaultRegistry } from \"../tools\";\nimport { undoLastSnapshot } from \"../tools/fs/snapshots\";\nimport { formatTodos } from \"../tools/todo\";\nimport type { ChatBackend } from \"./backend\";\nimport { compactSession, exportSession } from \"./commands/actions\";\nimport { registerBuiltinCommands } from \"./commands/builtin\";\nimport { type CommandContext, CommandRegistry, parseSlashCommand } from \"./commands/registry\";\nimport { InputBox } from \"./components/InputBox\";\nimport { type DisplayMessage, MessageList } from \"./components/MessageList\";\nimport { type PermissionDecision, PermissionPrompt } from \"./components/PermissionPrompt\";\nimport { StatusBar } from \"./components/StatusBar\";\nimport { StreamingMessage } from \"./components/StreamingMessage\";\nimport { ToolCallCard, type ToolCardData, formatToolCard } from \"./components/ToolCallCard\";\nimport { buildDisplayMessages, summarizeArgs } from \"./format\";\nimport { resolveMentions } from \"./mentions\";\n\nconst FLUSH_INTERVAL_MS = 30;\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 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 resolve: (approved: 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 [usageVersion, setUsageVersion] = useState(0);\n const [modelName, setModelName] = useState(model);\n const [pending, setPending] = useState<PendingPermission | null>(null);\n const [cardsVersion, setCardsVersion] = useState(0);\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 flushTimerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const toolCardsRef = useRef(new Map<string, ToolCardData>());\n const pendingRef = useRef<PendingPermission | null>(null);\n const alwaysAllowedRef = useRef(new Set<string>());\n const modelNameRef = useRef(model);\n const usageRef = useRef<UsageStats>(initialUsage ? { ...initialUsage } : emptyUsage());\n\n const pushMessage = useCallback((role: DisplayMessage[\"role\"], text: string, note?: string) => {\n setMessages((prev) => [...prev, { id: nextIdRef.current++, role, text, note }]);\n }, []);\n\n const setPendingPermission = useCallback((p: PendingPermission | null) => {\n pendingRef.current = p;\n setPending(p);\n }, []);\n\n const attachConfirmHandler = useCallback(\n (target: ChatBackend) => {\n target.confirmHandler = (req) => {\n if (isAllowedByRules([...alwaysAllowedRef.current], req)) {\n return Promise.resolve(true);\n }\n return new Promise<boolean>((resolve) => {\n setPendingPermission({ request: req, resolve });\n });\n };\n },\n [setPendingPermission],\n );\n\n useEffect(() => {\n attachConfirmHandler(backendRef.current);\n return () => {\n if (flushTimerRef.current !== null) clearInterval(flushTimerRef.current);\n abortRef.current?.abort();\n pendingRef.current?.resolve(false);\n };\n }, [attachConfirmHandler]);\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 }, [setPendingPermission]);\n\n useInput((_input, key) => {\n if (key.escape) interrupt();\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,\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, sessionStore, attachConfirmHandler],\n );\n\n const resume = useCallback(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 resumed = await resumeSession(id);\n if (!resumed) {\n return `Session not found: ${id}`;\n }\n await current.loadMessages(resumed.messages);\n const display = buildDisplayMessages(resumed.messages);\n nextIdRef.current = display.length;\n setMessages(display);\n setEpoch((e) => e + 1);\n usageRef.current = resumed.meta.usage ? { ...resumed.meta.usage } : emptyUsage();\n setUsageVersion((v) => v + 1);\n return `Resumed session ${id} (${resumed.messages.length} messages).`;\n }, []);\n\n const registry = useMemo(() => {\n const ctx: CommandContext = {\n addSystemMessage: (text) => pushMessage(\"system\", text),\n clearMessages: () => {\n setMessages([]);\n setEpoch((e) => e + 1);\n },\n exit: () => exit(),\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 () => {\n const metas = await SessionStore.list(cwd);\n return metas.length === 0\n ? \"No sessions found for this directory.\"\n : formatSessionList(metas);\n },\n resumeSession: resume,\n showTodos: async () => {\n const store = new TodoStore();\n await store.load(cwd);\n return formatTodos(store.list());\n },\n showUsage: () => formatUsage(usageRef.current),\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,\n config,\n model: summaryModel,\n });\n if (result.compacted && result.messages) {\n const display = buildDisplayMessages(result.messages);\n nextIdRef.current = display.length;\n setMessages(display);\n setEpoch((e) => e + 1);\n }\n return result.message;\n },\n exportSession: (arg) =>\n exportSession({ backend: backendRef.current, sessionStore, cwd, arg }),\n undo: () => undoLastSnapshot(),\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 `permissions.allow (${config.permissions.allow.length}): ${config.permissions.allow.join(\", \") || \"(none)\"}`,\n ].join(\"\\n\"),\n };\n const reg = new CommandRegistry();\n registerBuiltinCommands(reg);\n return Object.assign(reg, { ctx });\n }, [pushMessage, exit, config, cwd, switchModel, resume, sessionStore]);\n\n const runStream = useCallback(\n async (input: string) => {\n const resolved = await resolveMentions(input, cwd);\n pushMessage(\n \"user\",\n input,\n resolved.attached.length > 0 ? `attached: ${resolved.attached.join(\", \")}` : 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 streamedRef.current = \"\";\n setStreamingText(\"\");\n setIsStreaming(true);\n flushTimerRef.current = setInterval(() => {\n setStreamingText(streamedRef.current);\n }, FLUSH_INTERVAL_MS);\n try {\n for await (const event of backendRef.current.stream(resolved.input, controller.signal, {\n persistAs: input,\n })) {\n if (event.type === \"text-delta\") {\n streamedRef.current += event.text;\n } else if (event.type === \"tool-call\") {\n toolCardsRef.current.set(event.id, {\n id: event.id,\n name: event.name,\n argsSummary: summarizeArgs(event.args),\n });\n setCardsVersion((v) => v + 1);\n } else if (event.type === \"tool-result\") {\n const card = toolCardsRef.current.get(event.id);\n if (card) {\n card.result = event.content;\n card.isError = event.isError ?? false;\n setCardsVersion((v) => v + 1);\n }\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 sessionStore?.addUsage(event.usage).catch(() => {});\n }\n } else if (event.type === \"error\") {\n pushMessage(\"system\", `Error: ${event.error.message}`);\n }\n }\n } catch (error) {\n if (!(error instanceof DOMException && error.name === \"AbortError\")) {\n pushMessage(\"system\", `Error: ${error instanceof Error ? error.message : String(error)}`);\n }\n } finally {\n if (flushTimerRef.current !== null) {\n clearInterval(flushTimerRef.current);\n flushTimerRef.current = null;\n }\n abortRef.current = null;\n setIsStreaming(false);\n const finalText = streamedRef.current;\n streamedRef.current = \"\";\n setStreamingText(null);\n if (finalText.length > 0) {\n pushMessage(\n \"assistant\",\n controller.signal.aborted ? `${finalText} [interrupted]` : finalText,\n );\n }\n for (const card of toolCardsRef.current.values()) {\n pushMessage(\"tool\", formatToolCard(card));\n }\n toolCardsRef.current.clear();\n setCardsVersion((v) => v + 1);\n const p = pendingRef.current;\n if (p) {\n setPendingPermission(null);\n p.resolve(false);\n }\n }\n },\n [pushMessage, setPendingPermission, sessionStore, cwd],\n );\n\n const handleSubmit = useCallback(\n (text: string) => {\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 void runStream(text);\n },\n [registry, pushMessage, runStream],\n );\n\n const commandHints = useMemo(\n () => registry.list().map((cmd) => ({ name: cmd.name, description: cmd.description })),\n [registry],\n );\n\n const cards = [...toolCardsRef.current.values()];\n\n return (\n <Box flexDirection=\"column\">\n <MessageList key={`messages-${epoch}`} messages={messages} />\n {cards.length > 0 && (\n <Box key={`cards-${cardsVersion}`} flexDirection=\"column\">\n {cards.map((card) => (\n <ToolCallCard key={card.id} card={card} />\n ))}\n </Box>\n )}\n {streamingText !== null && <StreamingMessage text={streamingText} />}\n {pending && <PermissionPrompt request={pending.request} onDecision={handleDecision} />}\n <InputBox\n isStreaming={isStreaming}\n disabled={pending !== null}\n commands={commandHints}\n onSubmit={handleSubmit}\n onInterrupt={interrupt}\n onExit={exit}\n />\n <StatusBar\n key={`status-${usageVersion}`}\n model={modelName}\n permissionMode={permissionMode}\n tokens={usageRef.current.totalTokens}\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 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","import os from \"node:os\";\nimport path from \"node:path\";\n\nexport function starHome(): string {\n return process.env.STAR_HOME ?? path.join(os.homedir(), \".star-cli\");\n}\n\nexport function globalConfigPath(): string {\n return path.join(starHome(), \"config.toml\");\n}\n\nexport function sessionsDir(): string {\n return path.join(starHome(), \"sessions\");\n}\n\nexport function projectConfigPath(cwd: string): string {\n return path.join(cwd, \".star\", \"config.toml\");\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 { sessionsDir } from \"../config/paths\";\nimport type { CoreMessage } from \"../core/messages\";\n\nexport interface SessionUsage {\n requests: number;\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}\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 messageText(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 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 try {\n const raw = await fs.readFile(store.metaPath(), \"utf8\");\n const meta = JSON.parse(raw) as SessionMeta;\n if (meta.id !== id) return null;\n store.initialized = true;\n return store;\n } catch {\n return null;\n }\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 if (!meta.title && message.role === \"user\") {\n meta.title = messageText(message).slice(0, 60);\n }\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 // 忽略解析失败的行\n }\n }\n return messages;\n }\n\n async meta(): Promise<SessionMeta> {\n await this.ensureInitialized();\n const raw = await fs.readFile(this.metaPath(), \"utf8\");\n return JSON.parse(raw) as SessionMeta;\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 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 await fs.writeFile(this.metaPath(), JSON.stringify(meta, null, 2));\n }\n}\n","import type { CoreMessage } 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, messages] = await Promise.all([store.meta(), store.messages()]);\n return { meta, messages };\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 formatSessionList(metas: SessionMeta[]): string {\n return metas\n .map((meta) => {\n const title = meta.title || \"(无标题)\";\n return `${meta.id} ${title} (更新于 ${relativeTime(meta.updatedAt)})`;\n })\n .join(\"\\n\");\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool, ToolResult } from \"./types\";\n\nconst MAX_OUTPUT = 30000;\nconst DEFAULT_TIMEOUT = 120;\nconst MAX_TIMEOUT = 600;\n\ninterface ShellSpec {\n shell: string;\n wrap: (command: string) => string[];\n label: string;\n}\n\nfunction findOnPath(exe: string, exclude?: (dir: string) => boolean): string | null {\n for (const dir of (process.env.PATH ?? \"\").split(path.delimiter)) {\n if (!dir || exclude?.(dir)) {\n continue;\n }\n const full = path.join(dir, exe);\n if (existsSync(full)) {\n return full;\n }\n }\n return null;\n}\n\nfunction resolveShell(): ShellSpec {\n if (process.platform !== \"win32\") {\n return { shell: \"sh\", wrap: (c) => [\"-c\", c], label: \"sh\" };\n }\n const isWslStub = (dir: string) => /\\\\(system32|windowsapps)\\\\?$/i.test(dir.trim());\n const fromPath = findOnPath(\"bash.exe\", isWslStub);\n if (fromPath) {\n return { shell: fromPath, wrap: (c) => [\"-c\", c], label: \"bash\" };\n }\n const gitExe = findOnPath(\"git.exe\");\n if (gitExe) {\n const sibling = path.join(path.dirname(path.dirname(gitExe)), \"bin\", \"bash.exe\");\n if (existsSync(sibling)) {\n return { shell: sibling, wrap: (c) => [\"-c\", c], label: \"bash\" };\n }\n }\n for (const candidate of [\n \"C:\\\\Program Files\\\\Git\\\\bin\\\\bash.exe\",\n \"C:\\\\Program Files (x86)\\\\Git\\\\bin\\\\bash.exe\",\n \"D:\\\\Git\\\\bin\\\\bash.exe\",\n ]) {\n if (existsSync(candidate)) {\n return { shell: candidate, wrap: (c) => [\"-c\", c], label: \"bash\" };\n }\n }\n const comspec = process.env.ComSpec ?? \"cmd.exe\";\n return { shell: comspec, wrap: (c) => [\"/d\", \"/s\", \"/c\", c], label: \"cmd\" };\n}\n\nconst schema = z.object({\n command: z.string().describe(\"Shell command to execute\"),\n timeout: z\n .number()\n .positive()\n .max(MAX_TIMEOUT)\n .optional()\n .describe(\"Timeout in seconds (default 120, max 600)\"),\n description: z.string().optional().describe(\"Short description of what the command does\"),\n});\n\nfunction killTree(child: ChildProcess): void {\n if (process.platform === \"win32\" && child.pid) {\n spawn(\"taskkill\", [\"/pid\", String(child.pid), \"/t\", \"/f\"], {\n windowsHide: true,\n stdio: \"ignore\",\n }).unref();\n return;\n }\n child.kill(\"SIGKILL\");\n}\n\nfunction truncateMiddle(s: string): string {\n if (s.length <= MAX_OUTPUT) {\n return s;\n }\n const half = Math.floor(MAX_OUTPUT / 2);\n const head = s.slice(0, half);\n const tail = s.slice(-half);\n return `${head}\\n... [${s.length - MAX_OUTPUT} characters truncated] ...\\n${tail}`;\n}\n\nexport const bashTool: Tool<typeof schema> = {\n name: \"bash\",\n description:\n \"Execute a shell command (Git Bash on Windows when available, otherwise cmd; sh elsewhere). Stdout and stderr are merged. Output is truncated to 30000 characters.\",\n permission: \"exec\",\n parameters: schema,\n execute(args, ctx) {\n const timeoutSeconds = Math.min(args.timeout ?? DEFAULT_TIMEOUT, MAX_TIMEOUT);\n const spec = resolveShell();\n return new Promise<ToolResult>((resolve) => {\n const child = spawn(spec.shell, spec.wrap(args.command), {\n cwd: ctx.cwd,\n windowsHide: true,\n });\n let output = \"\";\n let settled = false;\n const finish = (result: ToolResult) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n ctx.abortSignal?.removeEventListener(\"abort\", onAbort);\n resolve(result);\n };\n const onAbort = () => {\n killTree(child);\n finish({ content: `${truncateMiddle(output)}\\nCommand aborted`, isError: true });\n };\n const timer = setTimeout(() => {\n killTree(child);\n finish({\n content: `${truncateMiddle(output)}\\nCommand timed out after ${timeoutSeconds}s`,\n isError: true,\n });\n }, timeoutSeconds * 1000);\n child.stdout.on(\"data\", (d: Buffer) => {\n output += d.toString(\"utf8\");\n });\n child.stderr.on(\"data\", (d: Buffer) => {\n output += d.toString(\"utf8\");\n });\n child.on(\"error\", (err) => {\n finish({ content: `Failed to start shell '${spec.label}': ${err.message}`, isError: true });\n });\n ctx.abortSignal?.addEventListener(\"abort\", onAbort);\n child.on(\"close\", (code) => {\n const trimmed = output.replace(/\\s+$/, \"\");\n if (code === 0) {\n finish({ content: truncateMiddle(trimmed) || \"(no output)\" });\n return;\n }\n const body = truncateMiddle(trimmed);\n finish({\n content: `${body}${body ? \"\\n\" : \"\"}Exit code: ${code ?? \"unknown\"}`,\n isError: true,\n });\n });\n });\n },\n};\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { pushSnapshot } from \"./snapshots\";\n\nconst schema = z.object({\n path: z.string().describe(\"File path, absolute or relative to the working directory\"),\n old_string: z.string().min(1).describe(\"Exact text to replace\"),\n new_string: z.string().describe(\"Replacement text\"),\n replace_all: z\n .boolean()\n .optional()\n .describe(\"Replace every occurrence instead of requiring a unique match\"),\n});\n\nexport const editFileTool: Tool<typeof schema> = {\n name: \"edit_file\",\n description:\n \"Replace an exact string in a file. Fails if old_string is not found or matches multiple locations unless replace_all is set.\",\n permission: \"write\",\n parameters: schema,\n async execute(args, ctx) {\n const filePath = path.resolve(ctx.cwd, args.path);\n let content: string;\n try {\n content = await readFile(filePath, \"utf8\");\n } catch (err) {\n return { content: `Failed to read ${args.path}: ${(err as Error).message}`, isError: true };\n }\n let count = 0;\n let idx = content.indexOf(args.old_string);\n while (idx !== -1) {\n count += 1;\n idx = content.indexOf(args.old_string, idx + args.old_string.length);\n }\n if (count === 0) {\n return { content: `old_string not found in ${args.path}`, isError: true };\n }\n if (count > 1 && !args.replace_all) {\n return {\n content: `old_string matches ${count} locations in ${args.path}; provide more surrounding context or set replace_all`,\n isError: true,\n };\n }\n const updated = args.replace_all\n ? content.split(args.old_string).join(args.new_string)\n : content.replace(args.old_string, args.new_string);\n try {\n await writeFile(filePath, updated, \"utf8\");\n } catch (err) {\n return { content: `Failed to write ${args.path}: ${(err as Error).message}`, isError: true };\n }\n pushSnapshot({\n path: filePath,\n existed: true,\n content,\n toolName: \"edit_file\",\n timestamp: Date.now(),\n });\n return { content: `Edited ${args.path}: ${count} replacement${count > 1 ? \"s\" : \"\"}` };\n },\n};\n","import { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport interface FileSnapshot {\n path: string;\n existed: boolean;\n content: string | null;\n toolName: string;\n timestamp: number;\n}\n\nconst MAX_SNAPSHOTS = 50;\n\nconst stack: FileSnapshot[] = [];\n\nexport async function captureSnapshot(filePath: string, toolName: string): Promise<FileSnapshot> {\n let content: string | null = null;\n let existed = false;\n try {\n content = await readFile(filePath, \"utf8\");\n existed = true;\n } catch {\n // file does not exist or is unreadable; recorded as non-existent\n }\n return { path: filePath, existed, content, toolName, timestamp: Date.now() };\n}\n\nexport function pushSnapshot(snapshot: FileSnapshot): void {\n stack.push(snapshot);\n if (stack.length > MAX_SNAPSHOTS) {\n stack.splice(0, stack.length - MAX_SNAPSHOTS);\n }\n}\n\nexport function snapshotCount(): number {\n return stack.length;\n}\n\nexport function clearSnapshots(): void {\n stack.length = 0;\n}\n\nexport async function undoLastSnapshot(): Promise<string> {\n const snapshot = stack.pop();\n if (!snapshot) {\n return \"Nothing to undo.\";\n }\n if (snapshot.existed && snapshot.content !== null) {\n await mkdir(path.dirname(snapshot.path), { recursive: true });\n await writeFile(snapshot.path, snapshot.content, \"utf8\");\n return `Restored ${snapshot.path} to its state before ${snapshot.toolName}.`;\n }\n await rm(snapshot.path, { force: true });\n return `Deleted ${snapshot.path} (it did not exist before ${snapshot.toolName}).`;\n}\n","import path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { matchesGlob, walkFiles } from \"./util\";\n\nconst MAX_RESULTS = 100;\n\nconst schema = z.object({\n pattern: z\n .string()\n .describe(\n \"Glob pattern, e.g. 'src/**/*.ts'. Supports **, * and ?. A bare pattern like '*.ts' matches basenames recursively.\",\n ),\n path: z.string().optional().describe(\"Directory to search, defaults to the working directory\"),\n});\n\nexport const globTool: Tool<typeof schema> = {\n name: \"glob\",\n description:\n \"Find files by glob pattern. Skips node_modules, .git and dist. Returns paths sorted by modification time, newest first, up to 100 results.\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n const root = path.resolve(ctx.cwd, args.path ?? \".\");\n const files = await walkFiles(root);\n const matched = files\n .filter((f) => matchesGlob(args.pattern, f.rel))\n .sort((a, b) => b.mtimeMs - a.mtimeMs)\n .slice(0, MAX_RESULTS);\n if (matched.length === 0) {\n return { content: `No files matched pattern: ${args.pattern}` };\n }\n return { content: matched.map((f) => f.rel).join(\"\\n\") };\n },\n};\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { type WalkedFile, matchesGlob, walkFiles } from \"./util\";\n\nconst MAX_MATCHES = 250;\n\nconst schema = z.object({\n pattern: z.string().describe(\"Regular expression to search for\"),\n path: z\n .string()\n .optional()\n .describe(\"File or directory to search, defaults to the working directory\"),\n glob: z\n .string()\n .optional()\n .describe(\"Glob pattern to filter which files are searched, e.g. '*.ts'\"),\n ignoreCase: z.boolean().optional().describe(\"Case-insensitive matching\"),\n});\n\nexport const grepTool: Tool<typeof schema> = {\n name: \"grep\",\n description:\n \"Search file contents with a regular expression. Outputs 'file:line:content', up to 250 matches. Skips binary files, node_modules and .git.\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n let re: RegExp;\n try {\n re = new RegExp(args.pattern, args.ignoreCase ? \"i\" : \"\");\n } catch (err) {\n return { content: `Invalid regular expression: ${(err as Error).message}`, isError: true };\n }\n const root = path.resolve(ctx.cwd, args.path ?? \".\");\n let files: WalkedFile[];\n try {\n const st = await stat(root);\n if (st.isFile()) {\n files = [{ abs: root, rel: path.basename(root), mtimeMs: st.mtimeMs }];\n } else {\n files = await walkFiles(root);\n }\n } catch {\n return { content: `Path not found: ${args.path ?? \".\"}`, isError: true };\n }\n if (args.glob) {\n const glob = args.glob;\n files = files.filter((f) => matchesGlob(glob, f.rel));\n }\n const out: string[] = [];\n let truncated = false;\n outer: for (const file of files) {\n let buf: Buffer;\n try {\n buf = await readFile(file.abs);\n } catch {\n continue;\n }\n if (buf.includes(0)) {\n continue;\n }\n const lines = buf.toString(\"utf8\").split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n if (re.test(line)) {\n out.push(`${file.rel}:${i + 1}:${line}`);\n if (out.length >= MAX_MATCHES) {\n truncated = true;\n break outer;\n }\n }\n }\n }\n if (out.length === 0) {\n return { content: `No matches for pattern: ${args.pattern}` };\n }\n if (truncated) {\n out.push(`... (truncated: more than ${MAX_MATCHES} matches)`);\n }\n return { content: out.join(\"\\n\") };\n },\n};\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { isSensitivePath } from \"./util\";\n\nconst DEFAULT_LIMIT = 2000;\nconst MAX_CHARS = 100 * 1024;\n\nconst schema = z.object({\n path: z.string().describe(\"File path, absolute or relative to the working directory\"),\n offset: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"1-based line number to start reading from\"),\n limit: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Maximum number of lines to read (default 2000)\"),\n});\n\nexport const readFileTool: Tool<typeof schema> = {\n name: \"read_file\",\n description:\n \"Read a text file and return its contents with line numbers. Output is truncated to 2000 lines or 100KB by default.\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n const filePath = path.resolve(ctx.cwd, args.path);\n if (isSensitivePath(filePath)) {\n return { content: `Refused to read sensitive file: ${args.path}`, isError: true };\n }\n const st = await stat(filePath).catch(() => null);\n if (!st) {\n return { content: `File not found: ${args.path}`, isError: true };\n }\n if (st.isDirectory()) {\n return { content: `Path is a directory, not a file: ${args.path}`, isError: true };\n }\n const raw = await readFile(filePath, \"utf8\");\n const lines = raw.split(\"\\n\");\n const start = args.offset ?? 1;\n const limit = args.limit ?? DEFAULT_LIMIT;\n const end = Math.min(lines.length, start - 1 + limit);\n const out: string[] = [];\n let size = 0;\n let truncatedBySize = false;\n for (let i = start - 1; i < end; i++) {\n const line = lines[i];\n if (line === undefined) {\n break;\n }\n const numbered = `${i + 1}\\t${line}`;\n if (size + numbered.length > MAX_CHARS) {\n truncatedBySize = true;\n break;\n }\n out.push(numbered);\n size += numbered.length;\n }\n const lastShown = start - 1 + out.length;\n if (truncatedBySize) {\n out.push(\n `... (truncated: output exceeds 100KB, showing lines ${start}-${lastShown} of ${lines.length})`,\n );\n } else if (end < lines.length) {\n out.push(`... (truncated: showing lines ${start}-${end} of ${lines.length})`);\n }\n return { content: out.join(\"\\n\") };\n },\n};\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { captureSnapshot, pushSnapshot } from \"./snapshots\";\n\nconst schema = z.object({\n path: z.string().describe(\"File path, absolute or relative to the working directory\"),\n content: z.string().describe(\"Full content to write to the file\"),\n});\n\nexport const writeFileTool: Tool<typeof schema> = {\n name: \"write_file\",\n description:\n \"Write content to a file, creating parent directories as needed. Overwrites existing files.\",\n permission: \"write\",\n parameters: schema,\n async execute(args, ctx) {\n const filePath = path.resolve(ctx.cwd, args.path);\n const snapshot = await captureSnapshot(filePath, \"write_file\");\n try {\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, args.content, \"utf8\");\n } catch (err) {\n return { content: `Failed to write ${args.path}: ${(err as Error).message}`, isError: true };\n }\n pushSnapshot(snapshot);\n return { content: `Wrote ${Buffer.byteLength(args.content, \"utf8\")} bytes to ${args.path}` };\n },\n};\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types\";\n\nexport interface TodoItem {\n id: number;\n title: string;\n status: \"pending\" | \"in_progress\" | \"done\";\n}\n\nconst todoItemSchema = z.object({\n id: z.number().int(),\n title: z.string(),\n status: z.enum([\"pending\", \"in_progress\", \"done\"]),\n});\n\nconst writeSchema = z.object({\n todos: z.array(todoItemSchema).describe(\"The full todo list, replacing the current one\"),\n});\n\nconst readSchema = z.object({});\n\nfunction fileFor(cwd: string): string {\n return path.join(cwd, \".star\", \"todos.json\");\n}\n\nexport class TodoStore {\n private items = new Map<number, TodoItem>();\n\n list(): TodoItem[] {\n return [...this.items.values()];\n }\n\n replace(items: TodoItem[]): void {\n this.items.clear();\n for (const item of items) {\n this.items.set(item.id, item);\n }\n }\n\n async load(cwd: string): Promise<void> {\n let raw: string;\n try {\n raw = await readFile(fileFor(cwd), \"utf8\");\n } catch {\n return;\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n this.replace(parsed.filter((it) => todoItemSchema.safeParse(it).success));\n }\n } catch {\n // corrupted file: keep current state\n }\n }\n\n async save(cwd: string): Promise<void> {\n await mkdir(path.join(cwd, \".star\"), { recursive: true });\n await writeFile(fileFor(cwd), `${JSON.stringify(this.list(), null, 2)}\\n`);\n }\n}\n\nconst SYMBOLS: Record<TodoItem[\"status\"], string> = {\n pending: \"[ ]\",\n in_progress: \"[~]\",\n done: \"[x]\",\n};\n\nexport function formatTodos(items: TodoItem[]): string {\n if (items.length === 0) {\n return \"No todos.\";\n }\n const lines = items.map((it) => `${SYMBOLS[it.status]} ${it.id}. ${it.title}`);\n const width = Math.max(...lines.map((l) => l.length));\n return lines\n .map((line, i) => {\n const status = items[i]?.status;\n return status === \"pending\" ? line : `${line.padEnd(width + 4)}(${status})`;\n })\n .join(\"\\n\");\n}\n\nconst defaultStore = new TodoStore();\n\nexport function createTodoTools(store: TodoStore = defaultStore): Tool[] {\n const todoWrite: Tool<typeof writeSchema> = {\n name: \"todo_write\",\n description:\n \"Replace the current todo list with the given items. Each item has an id, title, and status (pending, in_progress, done).\",\n permission: \"read\",\n parameters: writeSchema,\n async execute(args, ctx) {\n const parsed = writeSchema.safeParse(args);\n if (!parsed.success) {\n return { content: `Invalid todos: ${parsed.error.message}`, isError: true };\n }\n await store.load(ctx.cwd);\n store.replace(parsed.data.todos);\n await store.save(ctx.cwd);\n return { content: formatTodos(store.list()) };\n },\n };\n\n const todoRead: Tool<typeof readSchema> = {\n name: \"todo_read\",\n description: \"Read the current todo list.\",\n permission: \"read\",\n parameters: readSchema,\n async execute(_args, ctx) {\n await store.load(ctx.cwd);\n return { content: formatTodos(store.list()) };\n },\n };\n\n return [todoWrite, todoRead];\n}\n","import { z } from \"zod\";\nimport type { Tool } from \"../types\";\n\nconst DEFAULT_MAX_CHARS = 20000;\nconst MAX_BYTES = 2 * 1024 * 1024;\nconst TIMEOUT_MS = 30000;\n\nconst schema = z.object({\n url: z.string().describe(\"The http(s) URL to fetch\"),\n maxChars: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Maximum characters of text to return (default 20000)\"),\n});\n\nexport function decodeEntities(s: string): string {\n return s\n .replace(/&#(\\d+);/g, (_, n) => String.fromCodePoint(Number(n)))\n .replace(/&#x([0-9a-fA-F]+);/gi, (_, n) => String.fromCodePoint(Number.parseInt(n, 16)))\n .replace(/&(quot|lt|gt|nbsp);/g, (m) => {\n switch (m) {\n case \"&quot;\":\n return '\"';\n case \"&lt;\":\n return \"<\";\n case \"&gt;\":\n return \">\";\n case \"&nbsp;\":\n return \" \";\n default:\n return m;\n }\n })\n .replace(/&amp;/g, \"&\");\n}\n\nfunction htmlToText(html: string): string {\n const noBlocks = html.replace(/<(script|style|noscript|template)\\b[^>]*>[\\s\\S]*?<\\/\\1>/gi, \" \");\n const withBreaks = noBlocks.replace(\n /<br\\s*\\/?>|<\\/(p|div|li|tr|h[1-6]|section|article|header|footer|blockquote|pre)>/gi,\n \"\\n\",\n );\n const stripped = decodeEntities(withBreaks.replace(/<[^>]+>/g, \" \"));\n return stripped\n .split(\"\\n\")\n .map((line) => line.replace(/\\s+/g, \" \").trim())\n .join(\"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nasync function readBody(res: Response, maxChars: number): Promise<string> {\n if (!res.body) {\n return \"\";\n }\n const reader = res.body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let bytes = 0;\n let text = \"\";\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n bytes += value.byteLength;\n text += decoder.decode(value, { stream: true });\n if (bytes >= MAX_BYTES || text.length >= maxChars * 2) {\n break;\n }\n }\n text += decoder.decode();\n } finally {\n reader.cancel().catch(() => {});\n }\n return text;\n}\n\nfunction truncate(s: string, maxChars: number): string {\n if (s.length <= maxChars) {\n return s;\n }\n return `${s.slice(0, maxChars)}\\n[truncated, showing first ${maxChars} of ${s.length} chars]`;\n}\n\nexport const webFetchTool: Tool<typeof schema> = {\n name: \"web_fetch\",\n description:\n \"Fetch a URL over http(s) and return its contents as readable text. HTML pages are converted to plain text (tags, scripts and styles removed). Output is truncated to maxChars (default 20000).\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n let url: URL;\n try {\n url = new URL(args.url);\n } catch {\n return { content: `ERROR: invalid URL: ${args.url}`, isError: true };\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return {\n content: `ERROR: only http(s) URLs are supported, got: ${url.protocol}`,\n isError: true,\n };\n }\n const maxChars = args.maxChars ?? DEFAULT_MAX_CHARS;\n const timeoutSignal = AbortSignal.timeout(TIMEOUT_MS);\n const signal = ctx.abortSignal\n ? AbortSignal.any([timeoutSignal, ctx.abortSignal])\n : timeoutSignal;\n let res: Response;\n try {\n res = await fetch(url, { signal, redirect: \"follow\" });\n } catch (err) {\n if (ctx.abortSignal?.aborted) {\n return { content: \"ERROR: request aborted\", isError: true };\n }\n if (timeoutSignal.aborted) {\n return { content: `ERROR: request timed out after ${TIMEOUT_MS / 1000}s`, isError: true };\n }\n const message = err instanceof Error ? err.message : String(err);\n return { content: `ERROR: failed to fetch ${args.url}: ${message}`, isError: true };\n }\n if (!res.ok) {\n await res.body?.cancel().catch(() => {});\n return {\n content: `ERROR: HTTP ${res.status} ${res.statusText} for ${args.url}`,\n isError: true,\n };\n }\n const [rawType = \"\"] = (res.headers.get(\"content-type\") ?? \"text/plain\").split(\";\");\n const contentType = rawType.trim().toLowerCase();\n const isHtml = contentType === \"text/html\" || contentType === \"application/xhtml+xml\";\n const isText =\n contentType.startsWith(\"text/\") ||\n contentType === \"application/json\" ||\n contentType === \"application/xml\" ||\n contentType.endsWith(\"+json\") ||\n contentType.endsWith(\"+xml\");\n if (!isHtml && !isText) {\n await res.body?.cancel().catch(() => {});\n return {\n content: `ERROR: unsupported content type: ${contentType} (${args.url})`,\n isError: true,\n };\n }\n let body: string;\n try {\n body = await readBody(res, maxChars);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: `ERROR: failed to read response body: ${message}`, isError: true };\n }\n const text = isHtml ? htmlToText(body) : body;\n return { content: truncate(text, maxChars) };\n },\n};\n","import { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { decodeEntities } from \"./fetch\";\n\nconst TIMEOUT_MS = 15000;\nconst DEFAULT_MAX_RESULTS = 5;\nconst MAX_RESULTS_LIMIT = 10;\nconst SEARCH_URL = \"https://html.duckduckgo.com/html/?q=\";\nconst USER_AGENT =\n \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\";\n\nconst schema = z.object({\n query: z.string().min(1).describe(\"The search query\"),\n maxResults: z\n .number()\n .int()\n .min(1)\n .max(MAX_RESULTS_LIMIT)\n .optional()\n .describe(\n `Maximum number of results to return (default ${DEFAULT_MAX_RESULTS}, max ${MAX_RESULTS_LIMIT})`,\n ),\n});\n\nexport interface SearchResult {\n title: string;\n url: string;\n snippet: string;\n}\n\nfunction stripTags(s: string): string {\n return decodeEntities(s.replace(/<[^>]+>/g, \" \"))\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction normalizeUrl(href: string): string {\n const decoded = decodeEntities(href);\n const uddg = decoded.match(/[?&]uddg=([^&]+)/);\n if (uddg?.[1]) {\n try {\n return decodeURIComponent(uddg[1]);\n } catch {\n return decoded;\n }\n }\n if (decoded.startsWith(\"//\")) {\n return `https:${decoded}`;\n }\n return decoded;\n}\n\nexport function parseResults(html: string): SearchResult[] {\n const results: SearchResult[] = [];\n const anchorRe = /<a\\b[^>]*\\bclass\\s*=\\s*\"[^\"]*\\bresult__a\\b[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/gi;\n const anchors = [...html.matchAll(anchorRe)];\n for (const [i, anchor] of anchors.entries()) {\n const full = anchor[0];\n const hrefMatch = full.match(/href\\s*=\\s*\"([^\"]*)\"/i);\n if (!hrefMatch?.[1]) {\n continue;\n }\n const url = normalizeUrl(hrefMatch[1]);\n const title = stripTags(full.replace(/^<a\\b[^>]*>/i, \"\").replace(/<\\/a>\\s*$/i, \"\"));\n const blockStart = (anchor.index ?? 0) + full.length;\n const blockEnd = i + 1 < anchors.length ? (anchors[i + 1]?.index ?? html.length) : html.length;\n const block = html.slice(blockStart, blockEnd);\n const snippetMatch = block.match(\n /<(?:a|div)\\b[^>]*\\bclass\\s*=\\s*\"[^\"]*\\bresult__snippet\\b[^\"]*\"[^>]*>([\\s\\S]*?)<\\/(?:a|div)>/i,\n );\n const snippet = snippetMatch?.[1] ? stripTags(snippetMatch[1]) : \"\";\n if (title && url) {\n results.push({ title, url, snippet });\n }\n }\n return results;\n}\n\nexport const webSearchTool: Tool<typeof schema> = {\n name: \"web_search\",\n description:\n \"Search the web using DuckDuckGo and return a numbered list of results with title, URL and snippet. No API key required. Use web_fetch to read a result's full page.\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n const maxResults = Math.min(args.maxResults ?? DEFAULT_MAX_RESULTS, MAX_RESULTS_LIMIT);\n const url = `${SEARCH_URL}${encodeURIComponent(args.query)}`;\n const timeoutSignal = AbortSignal.timeout(TIMEOUT_MS);\n const signal = ctx.abortSignal\n ? AbortSignal.any([timeoutSignal, ctx.abortSignal])\n : timeoutSignal;\n let res: Response;\n try {\n res = await fetch(url, {\n signal,\n redirect: \"follow\",\n headers: { \"user-agent\": USER_AGENT, accept: \"text/html\" },\n });\n } catch (err) {\n if (ctx.abortSignal?.aborted) {\n return { content: \"ERROR: request aborted\", isError: true };\n }\n const name = err instanceof Error ? err.name : \"\";\n if (timeoutSignal.aborted || name === \"TimeoutError\") {\n return { content: `ERROR: search timed out after ${TIMEOUT_MS / 1000}s`, isError: true };\n }\n const message = err instanceof Error ? err.message : String(err);\n return { content: `ERROR: search request failed: ${message}`, isError: true };\n }\n if (!res.ok) {\n await res.body?.cancel().catch(() => {});\n return {\n content: `ERROR: HTTP ${res.status} ${res.statusText} from DuckDuckGo`,\n isError: true,\n };\n }\n let html: string;\n try {\n html = await res.text();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: `ERROR: failed to read search response: ${message}`, isError: true };\n }\n const results = parseResults(html).slice(0, maxResults);\n if (results.length === 0) {\n return {\n content: `ERROR: no results found for \"${args.query}\" (the response may have been blocked or the page layout changed)`,\n isError: true,\n };\n }\n const lines = results.map(\n (r, i) => `${i + 1}. ${r.title}\\n ${r.url}${r.snippet ? `\\n ${r.snippet}` : \"\"}`,\n );\n return { content: lines.join(\"\\n\") };\n },\n};\n","import { bashTool } from \"./bash\";\nimport { editFileTool } from \"./fs/edit\";\nimport { globTool } from \"./fs/glob\";\nimport { grepTool } from \"./fs/grep\";\nimport { readFileTool } from \"./fs/read\";\nimport { writeFileTool } from \"./fs/write\";\nimport { createTodoTools } from \"./todo\";\nimport type { Tool } from \"./types\";\nimport { webFetchTool } from \"./web/fetch\";\nimport { webSearchTool } from \"./web/search\";\n\nexport class ToolRegistry {\n private tools = new Map<string, Tool>();\n\n constructor() {\n for (const tool of [\n readFileTool,\n writeFileTool,\n editFileTool,\n globTool,\n grepTool,\n bashTool,\n webFetchTool,\n webSearchTool,\n ...createTodoTools(),\n ]) {\n this.register(tool);\n }\n }\n\n register(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n list(): Tool[] {\n return [...this.tools.values()];\n }\n\n names(): string[] {\n return [...this.tools.keys()];\n }\n}\n","import { ToolRegistry } from \"./registry\";\nimport { createTodoTools } from \"./todo\";\n\nexport { ToolRegistry } from \"./registry\";\nexport { createTodoTools, TodoStore } from \"./todo\";\nexport type { TodoItem } from \"./todo\";\nexport type { PermissionLevel, Tool, ToolContext, ToolResult } from \"./types\";\n\nexport function createDefaultRegistry(): ToolRegistry {\n const registry = new ToolRegistry();\n for (const tool of createTodoTools()) {\n registry.register(tool);\n }\n return registry;\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 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: \"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]\",\n async run(args, ctx) {\n if (!args) {\n ctx.addSystemMessage(await ctx.listSessions());\n } else {\n ctx.addSystemMessage(await ctx.resumeSession(args));\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: \"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: \"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: \"undo\",\n description: \"Revert the last file change made by write_file or edit_file\",\n usage: \"/undo\",\n async run(_args, ctx) {\n ctx.addSystemMessage(await ctx.undo());\n },\n });\n}\n","export interface CommandContext {\n addSystemMessage(text: string): void;\n clearMessages(): void;\n exit(): void;\n listModels(): string;\n switchModel(name: string): Promise<string>;\n listSessions(): Promise<string>;\n resumeSession(id: string): Promise<string>;\n showTodos(): Promise<string>;\n showUsage(): string;\n describeConfig(): string;\n compactContext(): Promise<string>;\n exportSession(path: string): Promise<string>;\n undo(): Promise<string>;\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 { Box, Text, useInput } from \"ink\";\nimport { useRef, useState } from \"react\";\nimport { type SlashCommandHint, filterCommands } from \"../commands/suggest\";\n\ninterface InputBoxProps {\n isStreaming: boolean;\n disabled?: boolean;\n commands?: SlashCommandHint[];\n onSubmit(text: string): void;\n onInterrupt(): void;\n onExit(): void;\n}\n\nexport function InputBox({\n isStreaming,\n disabled,\n commands,\n onSubmit,\n onInterrupt,\n onExit,\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 historyIndexRef = useRef<number | null>(null);\n const draftRef = useRef(\"\");\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 const suggestions =\n isStreaming || disabled || suggestionsDismissed || !commands\n ? []\n : filterCommands(value, commands);\n const activeIndex = suggestions.length === 0 ? 0 : Math.min(highlight, suggestions.length - 1);\n\n const completeHighlighted = () => {\n const cmd = suggestions[activeIndex];\n if (!cmd) return;\n const text = `/${cmd.name} `;\n edit(text, text.length);\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 if (isStreaming || disabled) return;\n if (key.escape) {\n if (suggestions.length > 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 if (suggestions.length > 0) {\n completeHighlighted();\n return;\n }\n } else if (key.upArrow) {\n if (suggestions.length > 0) {\n setHighlight((prev) => (prev - 1 + suggestions.length) % suggestions.length);\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 (suggestions.length > 0) {\n setHighlight((prev) => (prev + 1) % suggestions.length);\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 (suggestions.length > 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 </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 { Box, Static, Text } from \"ink\";\n\nexport interface DisplayMessage {\n id: number;\n role: \"user\" | \"assistant\" | \"system\" | \"tool\";\n text: string;\n note?: string;\n}\n\nconst roleStyles: Record<DisplayMessage[\"role\"], { label: string; color: string }> = {\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 function MessageList({ messages }: { messages: DisplayMessage[] }) {\n return (\n <Static items={messages}>\n {(message) => {\n const style = roleStyles[message.role];\n return (\n <Box key={message.id} flexDirection=\"column\" marginBottom={1}>\n <Text bold color={style.color}>\n {style.label}\n </Text>\n <Text color={style.color}>{message.text}</Text>\n {message.note && <Text dimColor>{message.note}</Text>}\n </Box>\n );\n }}\n </Static>\n );\n}\n","import { Box, Text, useInput } from \"ink\";\nimport type { PermissionRequest } from \"../../permissions/types\";\nimport { summarizeArgs } from \"../format\";\n\nexport type PermissionDecision = \"yes\" | \"no\" | \"always\";\n\ninterface PermissionPromptProps {\n request: PermissionRequest;\n onDecision(decision: PermissionDecision): void;\n}\n\nexport function PermissionPrompt({ request, 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 <Text>{summarizeArgs(request.args)}</Text>\n <Text>[y] allow [n] deny [a] always (saved to config)</Text>\n </Box>\n );\n}\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\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 { Box, Text } from \"ink\";\n\ninterface StatusBarProps {\n model: string;\n permissionMode: string;\n tokens: number;\n}\n\nexport function StatusBar({ model, permissionMode, tokens }: StatusBarProps) {\n return (\n <Box justifyContent=\"space-between\">\n <Text dimColor>model: {model}</Text>\n <Text dimColor>{tokens} tokens</Text>\n <Text dimColor>mode: {permissionMode}</Text>\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\n\nexport function StreamingMessage({ text }: { text: string }) {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color=\"green\">\n star\n </Text>\n <Text color=\"green\">{text}</Text>\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\nimport { 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 ToolCallCard({ card }: { card: ToolCardData }) {\n const color = card.isError ? \"red\" : \"magenta\";\n const preview = card.result !== undefined ? previewLines(card.result, 10) : null;\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color={color}>\n tool: {card.name}\n {card.isError ? \" (error)\" : \"\"}\n </Text>\n <Text dimColor>{card.argsSummary}</Text>\n {preview && (\n <Text color={color}>\n {preview.text}\n {preview.truncated ? \"\\n... (truncated)\" : \"\"}\n </Text>\n )}\n </Box>\n );\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","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","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});\n\nexport const PermissionsConfigSchema = z.object({\n allow: z.array(z.string()).default([]),\n});\n\nexport const ConfigSchema = z.object({\n defaultModel: z.string().default(\"\"),\n permissionMode: z.enum([\"auto\", \"ask\", \"readonly\"]).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 contextCompaction: z.enum([\"summary\", \"truncate\"]).default(\"summary\"),\n permissions: PermissionsConfigSchema.default({ allow: [] }),\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 StarConfig = z.infer<typeof ConfigSchema>;\n\nexport interface CliOverrides {\n model?: string;\n permissionMode?: \"auto\" | \"ask\" | \"readonly\";\n}\n"],"mappings":"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","names":["chars","stat","path","path","isSensitivePath","path","isSensitivePath","stat","Box","useInput","useRef","useState","path","path","path","fs","path","path","fs","path","readFile","writeFile","path","z","readFile","path","path","schema","z","path","readFile","writeFile","path","z","schema","z","path","readFile","stat","path","z","schema","z","path","stat","readFile","readFile","stat","path","z","schema","z","path","isSensitivePath","stat","readFile","mkdir","writeFile","path","z","schema","z","path","mkdir","writeFile","mkdir","readFile","writeFile","path","z","z","schema","z","TIMEOUT_MS","schema","z","fs","path","path","fs","Box","Text","jsx","jsxs","Box","Text","useInput","jsx","jsxs","useInput","Box","Text","Box","Text","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","useState","useRef","useInput","Box","fs","parse","z","parse","fs"]}
1
+ {"version":3,"sources":["../src/main.tsx","../src/agent/loop.ts","../src/context/compaction.ts","../src/context/tokens.ts","../src/core/messages.ts","../src/permissions/gate.ts","../src/permissions/allow.ts","../src/tools/fs/snapshots.ts","../src/cli/format.ts","../src/cli/mentions.ts","../src/tools/fs/util.ts","../src/cli/print-json.ts","../src/cli/repl.tsx","../src/config/save.ts","../src/config/paths.ts","../src/llm/provider.ts","../src/llm/registry.ts","../src/session/store.ts","../src/session/resume.ts","../src/tasks/format.ts","../src/tasks/manager.ts","../src/tools/bash.ts","../src/tools/fs/edit.ts","../src/tools/fs/glob.ts","../src/tools/fs/grep.ts","../src/tools/fs/read.ts","../src/tools/fs/write.ts","../src/tools/tasks.ts","../src/tools/todo.ts","../src/tools/web/fetch.ts","../src/tools/web/search.ts","../src/tools/registry.ts","../src/tools/index.ts","../src/version.ts","../src/cli/commands/actions.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/components/ExitPlanPrompt.tsx","../src/cli/components/InputBox.tsx","../src/cli/commands/suggest.ts","../src/cli/components/MessageList.tsx","../src/cli/components/PermissionPrompt.tsx","../src/cli/components/StatusBar.tsx","../src/cli/components/StreamingMessage.tsx","../src/cli/components/ThinkingIndicator.tsx","../src/cli/components/ToolCallCard.tsx","../src/cli/cost.ts","../src/cli/diff-preview.ts","../src/cli/shell-bang.ts","../src/cli/ticker.ts","../src/cli/update-check.ts","../src/config/loader.ts","../src/config/schema.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { AgentLoop } from \"./agent/loop\";\nimport { formatStreamError } from \"./cli/format\";\nimport { resolveMentions } from \"./cli/mentions\";\nimport { UsageTracker, eventToJsonLine } from \"./cli/print-json\";\nimport { renderRepl } from \"./cli/repl\";\nimport { loadConfigSync } from \"./config/loader\";\nimport type { StarConfig } from \"./config/schema\";\nimport type { CoreMessage } from \"./core/messages\";\nimport { createModel } from \"./llm/provider\";\nimport { resumeSession } from \"./session/resume\";\nimport { type SessionMeta, SessionStore } from \"./session/store\";\nimport { defaultTaskManager } from \"./tasks/manager\";\nimport { createDefaultRegistry } from \"./tools\";\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 });\n}\n\nasync function printMode(\n loop: AgentLoop,\n prompt: string,\n cwd: string,\n json: boolean,\n): Promise<number> {\n const controller = new AbortController();\n process.on(\"SIGINT\", () => controller.abort());\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 usage = new UsageTracker();\n let exitCode = 0;\n try {\n for await (const event of loop.stream(resolved.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(\"-r, --resume <sessionId>\", \"resume a previous session\")\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 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 if (opts.resume) {\n resumed = await resumeSession(opts.resume);\n if (!resumed) {\n console.error(`Session not found: ${opts.resume}`);\n process.exit(1);\n }\n sessionStore = await SessionStore.open(opts.resume);\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 }\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(loop, opts.print, cwd, Boolean(opts.json));\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 { LanguageModel } from \"ai\";\nimport { tool as aiTool } from \"ai\";\nimport type { StarConfig } from \"../config/schema\";\nimport { type CompactionResult, compactMessages, summarizeMessages } from \"../context/compaction\";\nimport type { StreamEvent } from \"../core/events\";\nimport { type CoreMessage, reconcileToolCalls, retractLastTurn } from \"../core/messages\";\nimport { checkPermission } from \"../permissions/gate\";\nimport type { PermissionRequest } from \"../permissions/types\";\nimport type { SessionStore } from \"../session/store\";\nimport { beginTurn } from \"../tools/fs/snapshots\";\nimport type { ToolRegistry } from \"../tools/registry\";\nimport type { ToolResult } from \"../tools/types\";\n\nexport interface AgentLoopOptions {\n model: LanguageModel;\n registry: ToolRegistry;\n config: StarConfig;\n cwd: string;\n system?: string;\n sessionStore?: SessionStore | null;\n}\n\nexport const PLAN_MODE_PROMPT =\n \"\\n\\nYou are currently in PLAN MODE. Research the task using only the read-only tools available to you, then present a concrete, step-by-step implementation plan as your final answer. You must not modify files, run shell commands, or otherwise change the system — write/exec tools are unavailable in this mode. Do not ask the user to run commands for you; note manual steps in the plan instead. The user will review your plan and approve it before any execution begins.\";\n\ninterface PendingToolCall {\n id: string;\n name: string;\n args: unknown;\n}\n\nexport class AgentLoop {\n private messages: CoreMessage[] = [];\n private readonly opts: AgentLoopOptions;\n // Seq + user-message index of each turn started via stream(); lets /undo\n // match a retracted turn to the file snapshots it produced. Cleared when\n // history is replaced wholesale (resume/compact), because indices no longer\n // line up — in that case /undo only retracts messages, never wrong files.\n private turnMarkers: { seq: number; userIndex: number }[] = [];\n confirmHandler?: (req: PermissionRequest) => Promise<boolean>;\n\n constructor(opts: AgentLoopOptions) {\n this.opts = opts;\n if (opts.system) {\n this.messages.push({ role: \"system\", content: opts.system });\n }\n }\n\n getMessages(): readonly CoreMessage[] {\n return this.messages;\n }\n\n async loadMessages(messages: CoreMessage[]): Promise<void> {\n this.messages = reconcileToolCalls(messages);\n this.turnMarkers = [];\n }\n\n // Drops the final user message and everything after it, and persists the\n // trimmed history so a later /resume does not bring the turn back.\n // `turn` is the retracted turn's snapshot seq when it could be verified\n // against the marker recorded at turn start — undefined means the caller\n // must not revert any file snapshots.\n async retractLastTurn(): Promise<{ removed: number; turn?: number }> {\n const result = retractLastTurn([...this.messages]);\n if (result.removed === 0) return { removed: 0 };\n const userIndex = result.messages.length;\n this.messages = result.messages;\n await this.opts.sessionStore?.replaceMessages([...this.messages]);\n const last = this.turnMarkers[this.turnMarkers.length - 1];\n let turn: number | undefined;\n if (last && last.userIndex === userIndex) {\n turn = last.seq;\n this.turnMarkers.pop();\n }\n return { removed: result.removed, turn };\n }\n\n async appendContextMessage(text: string, role: \"user\" | \"system\" = \"user\"): Promise<void> {\n const message: CoreMessage = { role, content: text };\n this.messages.push(message);\n await this.persist(message);\n }\n\n private async persist(message: CoreMessage): Promise<void> {\n await this.opts.sessionStore?.append(message);\n }\n\n async *stream(\n input: string,\n signal: AbortSignal,\n opts?: { persistAs?: string },\n ): AsyncGenerator<StreamEvent> {\n this.syncSystemMessage();\n\n const userMessage: CoreMessage = { role: \"user\", content: input };\n this.messages.push(userMessage);\n this.turnMarkers.push({ seq: beginTurn(), userIndex: this.messages.length - 1 });\n await this.persist(\n opts?.persistAs !== undefined ? { role: \"user\", content: opts.persistAs } : userMessage,\n );\n\n const { config, registry, cwd } = this.opts;\n const aiTools = this.buildAiTools();\n\n for (let step = 0; step < config.maxSteps; step++) {\n const compacted = compactMessages([...this.messages], config.contextMaxTokens);\n if (compacted.compacted) {\n this.messages = await this.applyCompactionSummary(compacted);\n }\n\n let text = \"\";\n const toolCalls: PendingToolCall[] = [];\n let failed = false;\n\n try {\n for await (const event of this.streamOnce(aiTools, signal)) {\n if (event.type === \"text-delta\") {\n text += event.text;\n yield event;\n } else if (event.type === \"reasoning\") {\n yield event;\n } else if (event.type === \"tool-call\") {\n toolCalls.push({ id: event.id, name: event.name, args: event.args });\n yield event;\n } else if (event.type === \"error\") {\n failed = true;\n yield event;\n } else {\n yield event;\n }\n }\n } catch (error) {\n // A user-initiated abort is a normal end of the turn, not an error.\n if (signal.aborted) return;\n yield { type: \"error\", error: error instanceof Error ? error : new Error(String(error)) };\n return;\n }\n\n if (failed) return;\n\n const assistantMessage: CoreMessage = {\n role: \"assistant\",\n content: [\n ...(text ? [{ type: \"text\" as const, text }] : []),\n ...toolCalls.map((call) => ({\n type: \"tool-call\" as const,\n toolCallId: call.id,\n toolName: call.name,\n args: call.args,\n })),\n ],\n };\n this.messages.push(assistantMessage);\n await this.persist(assistantMessage);\n\n if (toolCalls.length === 0) return;\n\n const answered = new Set<string>();\n try {\n for (const call of toolCalls) {\n if (signal.aborted) break;\n const result = await this.executeTool(call, signal);\n const toolMessage: CoreMessage = {\n role: \"tool\",\n content: [\n {\n type: \"tool-result\",\n toolCallId: call.id,\n toolName: call.name,\n result: result.content,\n },\n ],\n };\n this.messages.push(toolMessage);\n await this.persist(toolMessage);\n answered.add(call.id);\n yield {\n type: \"tool-result\",\n id: call.id,\n name: call.name,\n content: result.content,\n isError: result.isError,\n };\n }\n } finally {\n // The assistant message carrying these tool calls is already persisted,\n // so every call must be closed with a tool message even when execution\n // is aborted or blows up mid-batch; otherwise the stored history can\n // no longer be sent to the API.\n for (const call of toolCalls) {\n if (answered.has(call.id)) continue;\n const content = signal.aborted\n ? \"Tool execution interrupted by user.\"\n : \"Tool execution interrupted before a result was produced.\";\n const synthetic: CoreMessage = {\n role: \"tool\",\n content: [\n {\n type: \"tool-result\",\n toolCallId: call.id,\n toolName: call.name,\n result: content,\n },\n ],\n };\n this.messages.push(synthetic);\n await this.persist(synthetic).catch(() => {});\n yield { type: \"tool-result\", id: call.id, name: call.name, content, isError: true };\n }\n }\n\n if (signal.aborted) return;\n }\n\n yield {\n type: \"error\",\n error: new Error(`Max steps (${config.maxSteps}) reached, stopping.`),\n };\n }\n\n // The permission mode can change at runtime, so the system message is\n // recomputed at the start of every turn instead of being frozen by the\n // constructor. Also restores a system message after loadMessages() (resume,\n // /model switch) replaced the history with one that has none.\n private syncSystemMessage(): void {\n const base = this.opts.system;\n const plan = this.opts.config.permissionMode === \"plan\";\n const content = plan\n ? base\n ? base + PLAN_MODE_PROMPT\n : PLAN_MODE_PROMPT.trim()\n : (base ?? null);\n if (content === null) return;\n const head = this.messages[0];\n if (head?.role === \"system\" && typeof head.content === \"string\") {\n if (head.content !== content) head.content = content;\n } else if (head?.role !== \"system\") {\n this.messages.unshift({ role: \"system\", content });\n }\n }\n\n private async applyCompactionSummary(compacted: CompactionResult): Promise<CoreMessage[]> {\n const { config, model } = this.opts;\n if (config.contextCompaction !== \"summary\" || !model) {\n return compacted.messages;\n }\n const headCount = compacted.messages[0]?.role === \"system\" ? 1 : 0;\n const dropped = this.messages.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\n private async *streamOnce(\n aiTools: Record<string, unknown>,\n signal: AbortSignal,\n ): AsyncGenerator<StreamEvent> {\n const { streamChat } = await import(\"../llm/stream\");\n yield* streamChat({\n model: this.opts.model,\n messages: this.messages,\n tools: aiTools,\n abortSignal: signal,\n idleTimeoutMs: this.opts.config.streamIdleTimeoutSec * 1000,\n });\n }\n\n private buildAiTools(): Record<string, unknown> {\n const plan = this.opts.config.permissionMode === \"plan\";\n const tools: Record<string, unknown> = {};\n for (const t of this.opts.registry.list()) {\n // Plan mode hides write/exec tools from the model entirely; the\n // permission gate stays as a backstop for anything still attempted.\n if (plan && t.permission !== \"read\") continue;\n tools[t.name] = aiTool({\n description: t.description,\n parameters: t.parameters as never,\n });\n }\n return tools;\n }\n\n private async executeTool(call: PendingToolCall, signal: AbortSignal): Promise<ToolResult> {\n const { registry, config, cwd } = this.opts;\n const tool = registry.get(call.name);\n if (!tool) {\n return { content: `Unknown tool: ${call.name}`, isError: true };\n }\n\n const decision = checkPermission(\n config.permissionMode,\n { toolName: call.name, args: call.args, level: tool.permission },\n { cwd },\n config.permissions.allow,\n );\n\n if (decision === \"deny\") {\n return { content: `Permission denied for tool \"${call.name}\".`, isError: true };\n }\n if (decision === \"ask\") {\n let approved = false;\n try {\n approved = this.confirmHandler\n ? await this.confirmHandler({\n toolName: call.name,\n args: call.args,\n level: tool.permission,\n })\n : false;\n } catch {\n approved = false;\n }\n if (!approved) {\n return { content: `User rejected tool \"${call.name}\".`, isError: true };\n }\n }\n\n const parsed = tool.parameters.safeParse(call.args);\n if (!parsed.success) {\n return { content: `Invalid arguments: ${parsed.error.message}`, isError: true };\n }\n\n try {\n return await tool.execute(parsed.data, { cwd, abortSignal: signal });\n } catch (error) {\n if (signal.aborted) {\n return { content: \"Tool execution aborted.\", isError: true };\n }\n return {\n content: `Tool error: ${error instanceof Error ? error.message : String(error)}`,\n isError: true,\n };\n }\n }\n}\n","import { type LanguageModelV1, generateText } from \"ai\";\nimport type { CoreMessage } from \"../core/messages\";\nimport { estimateTokens } from \"./tokens\";\n\nexport interface CompactionResult {\n messages: CoreMessage[];\n compacted: boolean;\n droppedCount: number;\n}\n\nconst MIN_KEPT_MESSAGES = 4;\n\nfunction placeholderMessage(droppedCount: number): CoreMessage {\n return {\n role: \"user\",\n content: `[context compacted: ${droppedCount} earlier messages dropped]`,\n };\n}\n\nconst SUMMARY_SYSTEM_PROMPT = [\n \"You are summarizing an AI coding agent's conversation for context compaction.\",\n \"Write a concise summary that preserves:\",\n \"- the user's goals and requests\",\n \"- decisions made and their rationale\",\n \"- files and code touched (paths, key changes)\",\n \"- tool results that matter (errors, key outputs)\",\n \"- outstanding TODOs and next steps\",\n \"Output only the summary, no preamble.\",\n].join(\"\\n\");\n\nfunction serializeMessage(message: CoreMessage): string {\n if (typeof message.content === \"string\") {\n return `${message.role}: ${message.content}`;\n }\n const parts = message.content.map((part) => {\n if (part.type === \"text\") return part.text;\n if (part.type === \"tool-call\")\n return `[tool-call ${part.toolName}] ${JSON.stringify(part.args)}`;\n if (part.type === \"tool-result\")\n return `[tool-result ${part.toolName}] ${JSON.stringify(part.result)}`;\n return `[${part.type}]`;\n });\n return `${message.role}: ${parts.join(\"\\n\")}`;\n}\n\nexport async function summarizeMessages(\n messages: CoreMessage[],\n model: LanguageModelV1,\n): Promise<string> {\n const transcript = messages.map(serializeMessage).join(\"\\n\");\n const { text } = await generateText({\n model,\n system: SUMMARY_SYSTEM_PROMPT,\n prompt: `Summarize this conversation so far:\\n\\n${transcript}`,\n });\n return text.trim();\n}\n\nexport function compactMessages(messages: CoreMessage[], maxTokens: number): CompactionResult {\n if (estimateTokens(messages) <= maxTokens) {\n return { messages, compacted: false, droppedCount: 0 };\n }\n\n const first = messages[0];\n const hasSystem = first?.role === \"system\";\n const head = hasSystem && first ? [first] : [];\n const rest = hasSystem ? messages.slice(1) : messages.slice();\n\n const turns: CoreMessage[][] = [];\n for (const message of rest) {\n const current = turns[turns.length - 1];\n if (message.role === \"user\" || !current) {\n turns.push([message]);\n } else {\n current.push(message);\n }\n }\n\n let droppedCount = 0;\n let turnIndex = 0;\n while (turnIndex < turns.length) {\n const turn = turns[turnIndex] as CoreMessage[];\n if (rest.length - droppedCount - turn.length < MIN_KEPT_MESSAGES) {\n break;\n }\n droppedCount += turn.length;\n turnIndex += 1;\n const candidate = [...head, placeholderMessage(droppedCount), ...rest.slice(droppedCount)];\n if (estimateTokens(candidate) <= maxTokens) {\n break;\n }\n }\n\n if (droppedCount === 0) {\n return { messages, compacted: false, droppedCount: 0 };\n }\n\n return {\n messages: [...head, placeholderMessage(droppedCount), ...rest.slice(droppedCount)],\n compacted: true,\n droppedCount,\n };\n}\n","import type { CoreMessage } from \"../core/messages\";\n\nconst CHARS_PER_TOKEN = 4;\nconst MESSAGE_OVERHEAD = 4;\n\nfunction contentCharLength(message: CoreMessage): number {\n if (message.role === \"tool\") {\n let chars = 0;\n for (const part of message.content) {\n chars += JSON.stringify(part.result ?? null).length;\n }\n return chars;\n }\n if (typeof message.content === \"string\") {\n return message.content.length;\n }\n let chars = 0;\n for (const part of message.content) {\n if (part.type === \"text\" || part.type === \"reasoning\") {\n chars += part.text.length;\n } else if (part.type === \"tool-call\") {\n chars += part.toolName.length + JSON.stringify(part.args ?? null).length;\n }\n }\n return chars;\n}\n\nexport function estimateMessageTokens(message: CoreMessage): number {\n return Math.ceil(contentCharLength(message) / CHARS_PER_TOKEN) + MESSAGE_OVERHEAD;\n}\n\nexport function estimateTokens(messages: CoreMessage[]): number {\n return messages.reduce((total, message) => total + estimateMessageTokens(message), 0);\n}\n","import type { CoreMessage, ToolCallPart } from \"ai\";\n\nexport type { CoreMessage };\n\nexport interface ConversationState {\n messages: CoreMessage[];\n}\n\nexport const MISSING_TOOL_RESULT_TEXT = \"tool result missing (session was interrupted)\";\n\nexport function reconcileToolCalls(messages: CoreMessage[]): CoreMessage[] {\n const result: CoreMessage[] = [];\n let pending: { toolCallId: string; toolName: string }[] = [];\n\n const flushPending = () => {\n for (const call of pending) {\n result.push({\n role: \"tool\",\n content: [\n {\n type: \"tool-result\",\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n result: MISSING_TOOL_RESULT_TEXT,\n },\n ],\n });\n }\n pending = [];\n };\n\n for (const message of messages) {\n if (message.role === \"assistant\" && Array.isArray(message.content)) {\n flushPending();\n pending = message.content\n .filter((part): part is ToolCallPart => part.type === \"tool-call\")\n .map((part) => ({ toolCallId: part.toolCallId, toolName: part.toolName }));\n } else if (message.role === \"tool\" && Array.isArray(message.content) && pending.length > 0) {\n const answered = new Set(message.content.map((part) => part.toolCallId));\n pending = pending.filter((call) => !answered.has(call.toolCallId));\n } else {\n flushPending();\n }\n result.push(message);\n }\n flushPending();\n return result;\n}\n\n// Removes the last conversation turn: the final user message and everything\n// after it (assistant text, tool calls and results belonging to that turn).\n// A leading system message is never touched. Returns the trimmed list and\n// how many messages were dropped (0 = nothing to retract).\nexport function retractLastTurn(messages: CoreMessage[]): {\n messages: CoreMessage[];\n removed: number;\n} {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]?.role === \"user\") {\n return { messages: messages.slice(0, i), removed: messages.length - i };\n }\n }\n return { messages, removed: 0 };\n}\n","import path from \"node:path\";\nimport { isAllowedByRules } from \"./allow\";\nimport type {\n PermissionContext,\n PermissionDecision,\n PermissionMode,\n PermissionRequest,\n} from \"./types\";\n\nconst FILE_TOOLS = new Set([\"write_file\", \"edit_file\", \"read_file\"]);\n\nconst DANGEROUS_COMMAND_PATTERNS = [\n /rm\\s+-rf\\s+\\/(?:\\s|$|;|&)/i,\n /rm\\s+-rf\\s+~(?:\\s|\\/|$|;|&)/i,\n /:\\(\\)\\s*\\{\\s*:\\|:&\\s*\\}\\s*;:/,\n /\\bmkfs\\b/i,\n /dd\\s+[^|;]*\\bif=/i,\n />\\s*\\/dev\\/sd[a-z]/i,\n /\\bshutdown\\b/i,\n /\\breboot\\b/i,\n /\\bpoweroff\\b/i,\n];\n\nexport function isDangerousCommand(command: string): boolean {\n return DANGEROUS_COMMAND_PATTERNS.some((pattern) => pattern.test(command));\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\") {\n return value;\n }\n }\n return undefined;\n}\n\nfunction normalizeAbsolute(p: string, cwd: string): string {\n const abs = path.isAbsolute(p) ? path.normalize(p) : path.resolve(cwd, p);\n return abs.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\").toLowerCase();\n}\n\nfunction isOutsideCwd(p: string, cwd: string): boolean {\n const abs = normalizeAbsolute(p, cwd);\n const base = normalizeAbsolute(cwd, cwd);\n return abs !== base && !abs.startsWith(`${base}/`);\n}\n\nfunction isSensitivePath(p: string): boolean {\n const base = p.replace(/\\\\/g, \"/\").split(\"/\").pop()?.toLowerCase() ?? \"\";\n if (base === \".env.example\" || base === \".env.sample\" || base === \".env.template\") {\n return false;\n }\n return base === \".env\" || base.startsWith(\".env.\") || base === \"id_rsa\" || base.endsWith(\".pem\");\n}\n\nexport function checkPermission(\n mode: PermissionMode,\n req: PermissionRequest,\n ctx: PermissionContext,\n allowRules: readonly string[] = [],\n): PermissionDecision {\n // yolo bypasses every check, including the hard safety rules below.\n if (mode === \"yolo\") {\n return \"allow\";\n }\n\n const command = getStringArg(req.args, \"command\");\n const filePath = getStringArg(req.args, \"path\");\n\n if (req.toolName === \"bash\" && command !== undefined && isDangerousCommand(command)) {\n return \"deny\";\n }\n\n if (FILE_TOOLS.has(req.toolName) && filePath !== undefined) {\n if (\n (req.toolName === \"write_file\" || req.toolName === \"edit_file\") &&\n isSensitivePath(filePath)\n ) {\n return \"deny\";\n }\n if (isOutsideCwd(filePath, ctx.cwd)) {\n if (mode === \"ask\" && req.level === \"read\") {\n return \"ask\";\n }\n return \"deny\";\n }\n }\n\n if (mode === \"auto\") {\n return \"allow\";\n }\n if (mode === \"readonly\") {\n return req.level === \"read\" ? \"allow\" : \"deny\";\n }\n if (mode === \"plan\") {\n return req.level === \"read\" ? \"allow\" : \"deny\";\n }\n if (isAllowedByRules(allowRules, req)) {\n return \"allow\";\n }\n return req.level === \"read\" ? \"allow\" : \"ask\";\n}\n\nexport function describeDecision(decision: PermissionDecision): string {\n switch (decision) {\n case \"allow\":\n return \"允许执行该操作\";\n case \"deny\":\n return \"拒绝执行:违反权限模式或硬性安全规则\";\n case \"ask\":\n return \"需要用户确认后才能执行\";\n }\n}\n","import type { PermissionRequest } from \"./types\";\n\nexport interface AllowRule {\n toolName: string;\n pattern?: string;\n}\n\nexport function parseAllowRule(rule: string): AllowRule | null {\n const match = /^([\\w-]+)(?:\\((.*)\\))?$/.exec(rule.trim());\n if (!match) return null;\n return { toolName: match[1] as string, pattern: match[2] };\n}\n\nfunction globMatch(pattern: string, value: string): boolean {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(`^${escaped}$`).test(value);\n}\n\nfunction requestTarget(req: PermissionRequest): string | undefined {\n if (typeof req.args !== \"object\" || req.args === null) return undefined;\n const args = req.args as Record<string, unknown>;\n const key = req.toolName === \"bash\" ? \"command\" : \"path\";\n const value = args[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function matchAllowRule(rule: AllowRule, req: PermissionRequest): boolean {\n if (rule.toolName !== req.toolName) return false;\n if (rule.pattern === undefined) return true;\n const target = requestTarget(req);\n return target !== undefined && globMatch(rule.pattern, target);\n}\n\nexport function isAllowedByRules(rules: readonly string[], req: PermissionRequest): boolean {\n return rules.some((raw) => {\n const rule = parseAllowRule(raw);\n return rule !== null && matchAllowRule(rule, req);\n });\n}\n\nexport function buildAllowRule(req: PermissionRequest): string {\n const target = requestTarget(req);\n return target !== undefined ? `${req.toolName}(${target})` : req.toolName;\n}\n","import { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport interface FileSnapshot {\n path: string;\n existed: boolean;\n content: string | null;\n toolName: string;\n timestamp: number;\n // Seq of the conversation turn that produced this snapshot (0 = no turn\n // context, e.g. direct tool use in tests). Monotonically increasing per\n // process, so a turn's snapshots can be reverted without touching older ones.\n turn: number;\n}\n\nconst MAX_SNAPSHOTS = 50;\n\nconst stack: FileSnapshot[] = [];\nlet activeTurn = 0;\n\n// Called by the agent loop at the start of every conversation turn; returns\n// the seq assigned to the turn. Tool-made snapshots record this seq.\nexport function beginTurn(): number {\n return ++activeTurn;\n}\n\nexport function currentTurnSeq(): number {\n return activeTurn;\n}\n\nexport async function captureSnapshot(filePath: string, toolName: string): Promise<FileSnapshot> {\n let content: string | null = null;\n let existed = false;\n try {\n content = await readFile(filePath, \"utf8\");\n existed = true;\n } catch {\n // file does not exist or is unreadable; recorded as non-existent\n }\n return { path: filePath, existed, content, toolName, timestamp: Date.now(), turn: activeTurn };\n}\n\nexport function pushSnapshot(snapshot: FileSnapshot): void {\n stack.push(snapshot);\n if (stack.length > MAX_SNAPSHOTS) {\n stack.splice(0, stack.length - MAX_SNAPSHOTS);\n }\n}\n\nexport function snapshotCount(): number {\n return stack.length;\n}\n\nexport function clearSnapshots(): void {\n stack.length = 0;\n}\n\nasync function revert(snapshot: FileSnapshot): Promise<string> {\n if (snapshot.existed && snapshot.content !== null) {\n await mkdir(path.dirname(snapshot.path), { recursive: true });\n await writeFile(snapshot.path, snapshot.content, \"utf8\");\n return `Restored ${snapshot.path} to its state before ${snapshot.toolName}.`;\n }\n await rm(snapshot.path, { force: true });\n return `Deleted ${snapshot.path} (it did not exist before ${snapshot.toolName}).`;\n}\n\nexport async function undoLastSnapshot(): Promise<string> {\n const snapshot = stack.pop();\n if (!snapshot) {\n return \"Nothing to undo (/undo only reverts file changes made by write_file/edit_file, and none are recorded yet).\";\n }\n return revert(snapshot);\n}\n\n// Reverts every snapshot created by the given turn, newest first, and leaves\n// snapshots from other turns untouched. Returns one message per reverted file.\nexport async function undoTurnSnapshots(turn: number): Promise<string[]> {\n const matches: FileSnapshot[] = [];\n for (let i = stack.length - 1; i >= 0; i--) {\n const snapshot = stack[i];\n if (snapshot && snapshot.turn === turn) {\n matches.push(snapshot);\n stack.splice(i, 1);\n }\n }\n const messages: string[] = [];\n for (const snapshot of matches) {\n messages.push(await revert(snapshot));\n }\n return messages;\n}\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 { isSensitivePath } from \"../tools/fs/util\";\n\nexport const MAX_MENTION_BYTES = 100 * 1024;\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}\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: [] };\n }\n const blocks: string[] = [];\n const attached: string[] = [];\n const skipped: MentionSkip[] = [];\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 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 };\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const SKIP_DIRS = new Set([\"node_modules\", \".git\", \"dist\"]);\n\nexport interface WalkedFile {\n abs: string;\n rel: string;\n mtimeMs: number;\n}\n\nexport async function walkFiles(\n root: string,\n skipDirs: Set<string> = SKIP_DIRS,\n): Promise<WalkedFile[]> {\n const out: WalkedFile[] = [];\n async function walk(dir: string, relBase: string): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true }).catch(() => null);\n if (!entries) {\n return;\n }\n for (const entry of entries) {\n const abs = path.join(dir, entry.name);\n const rel = relBase ? `${relBase}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n if (!skipDirs.has(entry.name)) {\n await walk(abs, rel);\n }\n } else if (entry.isFile()) {\n try {\n const st = await stat(abs);\n out.push({ abs, rel, mtimeMs: st.mtimeMs });\n } catch {\n // ignore unreadable entries\n }\n }\n }\n }\n await walk(root, \"\");\n return out;\n}\n\nconst REGEX_SPECIALS = /[.+^${}()|[\\]\\\\]/g;\n\nexport function globToRegExp(pattern: string): RegExp {\n let re = \"\";\n let i = 0;\n while (i < pattern.length) {\n const c = pattern.charAt(i);\n if (c === \"*\") {\n if (pattern.charAt(i + 1) === \"*\") {\n i += 2;\n if (pattern.charAt(i) === \"/\") {\n i += 1;\n re += \"(?:[^/]+/)*\";\n } else {\n re += \".*\";\n }\n } else {\n re += \"[^/]*\";\n i += 1;\n }\n } else if (c === \"?\") {\n re += \"[^/]\";\n i += 1;\n } else {\n re += c.replace(REGEX_SPECIALS, \"\\\\$&\");\n i += 1;\n }\n }\n return new RegExp(`^${re}$`);\n}\n\nexport function matchesGlob(pattern: string, relPath: string): boolean {\n const normalized = pattern.replace(/\\\\/g, \"/\");\n if (!normalized.includes(\"/\")) {\n const base = relPath.split(\"/\").pop() ?? relPath;\n return globToRegExp(normalized).test(base);\n }\n return globToRegExp(normalized).test(relPath);\n}\n\nexport function isSensitivePath(filePath: string): boolean {\n const base = path.basename(filePath);\n if (base === \".env.example\" || base === \".env.sample\" || base === \".env.template\") {\n return false;\n }\n if (base === \".env\" || base.startsWith(\".env.\")) {\n return true;\n }\n if (base === \"id_rsa\" || base.endsWith(\".pem\")) {\n return true;\n }\n return false;\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 } from \"../config/schema\";\nimport type { CoreMessage } 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 { formatSessionList, resumeSession } from \"../session/resume\";\nimport { SessionStore } from \"../session/store\";\nimport { formatTaskFinished, formatTaskList, formatTaskStarted } from \"../tasks/format\";\nimport { type TaskSnapshot, defaultTaskManager } from \"../tasks/manager\";\nimport { TodoStore, createDefaultRegistry } from \"../tools\";\nimport { undoTurnSnapshots } from \"../tools/fs/snapshots\";\nimport { formatTodos } from \"../tools/todo\";\nimport { VERSION } from \"../version\";\nimport type { ChatBackend } from \"./backend\";\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 { 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 { 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 { estimateCost } from \"./cost\";\nimport { type DiffPreview, generateDiffPreview } from \"./diff-preview\";\nimport {\n buildDisplayMessages,\n formatStreamError,\n splitCommittableLines,\n summarizeArgs,\n} from \"./format\";\nimport { resolveMentions } from \"./mentions\";\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 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\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 modelNameRef = useRef(model);\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 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 // 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 },\n [setPendingPermission, cwd],\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 };\n defaultTaskManager.on(\"update\", onUpdate);\n return () => {\n defaultTaskManager.off(\"update\", onUpdate);\n defaultTaskManager.cleanup();\n };\n }, [pushMessage]);\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 }, [setPendingPermission]);\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) interrupt();\n if (key.shift && key.tab) {\n // Don't yank the mode out from under a running turn or an open prompt.\n if (abortRef.current || pendingRef.current || planApprovalRef.current) 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,\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, sessionStore, 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 resumed = await resumeSession(id);\n if (!resumed) {\n return `Session not found: ${id}`;\n }\n await current.loadMessages(resumed.messages);\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 ${id} (${resumed.messages.length} messages).`;\n },\n [applyMessages],\n );\n\n const runStream = useCallback(\n async (input: string) => {\n const resolved = await resolveMentions(input, cwd);\n pushMessage(\n \"user\",\n input,\n resolved.attached.length > 0 ? `attached: ${resolved.attached.join(\", \")}` : 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 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(resolved.input, controller.signal, {\n persistAs: input,\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 sessionStore?.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 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 }\n },\n [\n pushMessage,\n pushAssistantChunk,\n setPendingPermission,\n setPlanApproval,\n sessionStore,\n cwd,\n config,\n ],\n );\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 addSystemMessage: (text) => pushMessage(\"system\", text),\n clearMessages: () => {\n redrawMessages([]);\n },\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 () => {\n const metas = await SessionStore.list(cwd);\n return metas.length === 0\n ? \"No sessions found for this directory.\"\n : formatSessionList(metas);\n },\n resumeSession: resume,\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 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,\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({ backend: backendRef.current, sessionStore, cwd, arg }),\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 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 ].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 sessionStore,\n runStream,\n applyMessages,\n redrawMessages,\n applySessionMode,\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 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 void runStream(text);\n },\n [registry, pushMessage, runStream, runShellBang],\n );\n\n const commandHints = useMemo(\n () => registry.list().map((cmd) => ({ name: cmd.name, description: cmd.description })),\n [registry],\n );\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 <InputBox\n isStreaming={isStreaming}\n disabled={pending !== null || planApproval}\n commands={commandHints}\n onSubmit={handleSubmit}\n onInterrupt={interrupt}\n onExit={handleExit}\n />\n <StatusBar\n model={modelName}\n permissionMode={permissionModeState}\n tokens={usageRef.current.totalTokens}\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 os from \"node:os\";\nimport path from \"node:path\";\n\nexport function starHome(): string {\n return process.env.STAR_HOME ?? path.join(os.homedir(), \".star-cli\");\n}\n\nexport function globalConfigPath(): string {\n return path.join(starHome(), \"config.toml\");\n}\n\nexport function sessionsDir(): string {\n return path.join(starHome(), \"sessions\");\n}\n\nexport function projectConfigPath(cwd: string): string {\n return path.join(cwd, \".star\", \"config.toml\");\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 { sessionsDir } from \"../config/paths\";\nimport type { CoreMessage } from \"../core/messages\";\n\nexport interface SessionUsage {\n requests: number;\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}\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\nfunction messageText(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 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 if (!meta.title && message.role === \"user\") {\n meta.title = messageText(message).slice(0, 60);\n }\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 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 await fs.writeFile(this.metaPath(), JSON.stringify(meta, null, 2));\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\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 formatSessionList(metas: SessionMeta[]): string {\n return metas\n .map((meta) => {\n const title = meta.title || \"(无标题)\";\n return `${meta.id} ${title} (更新于 ${relativeTime(meta.updatedAt)})`;\n })\n .join(\"\\n\");\n}\n","import type { TaskSnapshot } from \"./manager\";\n\nexport function formatDuration(startedAt: number, endedAt?: number): string {\n const seconds = Math.max(0, Math.round(((endedAt ?? Date.now()) - startedAt) / 1000));\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m${seconds % 60}s`;\n return `${Math.floor(minutes / 60)}h${minutes % 60}m`;\n}\n\nfunction formatStatus(task: TaskSnapshot): string {\n const duration = formatDuration(task.startedAt, task.endedAt);\n if (task.status === \"running\") return `running ${duration}`;\n const exit =\n task.exitCode === null || task.exitCode === undefined ? \"\" : `, exit ${task.exitCode}`;\n return `${task.status}${exit} after ${duration}`;\n}\n\nexport function formatTaskLine(task: TaskSnapshot): string {\n const label = task.description ? `${task.description} (${task.command})` : task.command;\n return `${task.id} [${formatStatus(task)}] ${label}`;\n}\n\nexport function formatTaskList(tasks: TaskSnapshot[]): string {\n if (tasks.length === 0) return \"No background tasks.\";\n return `Background tasks:\\n${tasks.map(formatTaskLine).join(\"\\n\")}`;\n}\n\nexport function formatTaskStarted(task: TaskSnapshot): string {\n const label = task.description ? `${task.description} (${task.command})` : task.command;\n return `Background task ${task.id} started: ${label}`;\n}\n\nexport function formatTaskFinished(task: TaskSnapshot): string {\n const exit =\n task.exitCode === null || task.exitCode === undefined ? \"\" : ` (exit ${task.exitCode})`;\n switch (task.status) {\n case \"completed\":\n return `Background task ${task.id} finished${exit}: ${task.command}`;\n case \"failed\":\n return `Background task ${task.id} failed${exit}: ${task.command}`;\n case \"timed_out\":\n return `Background task ${task.id} timed out: ${task.command}`;\n case \"stopped\":\n return `Background task ${task.id} stopped: ${task.command}`;\n default:\n return `Background task ${task.id}: ${task.command}`;\n }\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { EventEmitter } from \"node:events\";\nimport { killTree, resolveShell } from \"../tools/bash\";\n\nexport type TaskStatus = \"running\" | \"completed\" | \"failed\" | \"timed_out\" | \"stopped\";\n\nexport interface TaskSnapshot {\n id: string;\n command: string;\n description?: string;\n status: TaskStatus;\n startedAt: number;\n endedAt?: number;\n exitCode?: number | null;\n output: string;\n}\n\nexport const MAX_TASK_OUTPUT = 100_000;\nexport const DEFAULT_TASK_TIMEOUT = 3600;\n\nconst TRUNCATED_PREFIX = \"[... earlier output truncated ...]\\n\";\n\ninterface TaskRecord {\n id: string;\n command: string;\n description?: string;\n status: TaskStatus;\n startedAt: number;\n endedAt?: number;\n exitCode?: number | null;\n output: string;\n truncated: boolean;\n child: ChildProcess;\n timer?: NodeJS.Timeout;\n}\n\nexport interface StartTaskOptions {\n command: string;\n description?: string;\n cwd: string;\n timeoutSeconds?: number;\n}\n\nexport class TaskManager extends EventEmitter {\n private records = new Map<string, TaskRecord>();\n private seq = 0;\n\n start(opts: StartTaskOptions): TaskSnapshot {\n const id = `task-${++this.seq}`;\n const spec = resolveShell();\n const child = spawn(spec.shell, spec.wrap(opts.command), {\n cwd: opts.cwd,\n windowsHide: true,\n });\n const rec: TaskRecord = {\n id,\n command: opts.command,\n description: opts.description,\n status: \"running\",\n startedAt: Date.now(),\n output: \"\",\n truncated: false,\n child,\n };\n this.records.set(id, rec);\n\n const append = (d: Buffer) => {\n rec.output += d.toString(\"utf8\");\n if (rec.output.length > MAX_TASK_OUTPUT) {\n rec.output = rec.output.slice(-MAX_TASK_OUTPUT);\n rec.truncated = true;\n }\n };\n child.stdout.on(\"data\", append);\n child.stderr.on(\"data\", append);\n child.on(\"error\", (err) => {\n append(Buffer.from(`Failed to start shell '${spec.label}': ${err.message}\\n`));\n if (rec.status === \"running\") {\n this.finish(rec, \"failed\", null);\n }\n });\n child.on(\"close\", (code) => {\n if (rec.status !== \"running\") return;\n this.finish(rec, code === 0 ? \"completed\" : \"failed\", code);\n });\n\n const timeoutSeconds = opts.timeoutSeconds ?? DEFAULT_TASK_TIMEOUT;\n rec.timer = setTimeout(() => this.terminate(rec, \"timed_out\"), timeoutSeconds * 1000);\n rec.timer.unref();\n\n this.emitUpdate(rec);\n return this.snapshot(rec);\n }\n\n get(id: string): TaskSnapshot | undefined {\n const rec = this.records.get(id);\n return rec ? this.snapshot(rec) : undefined;\n }\n\n list(): TaskSnapshot[] {\n return [...this.records.values()].map((rec) => this.snapshot(rec));\n }\n\n runningCount(): number {\n let count = 0;\n for (const rec of this.records.values()) {\n if (rec.status === \"running\") count += 1;\n }\n return count;\n }\n\n kill(id: string): TaskSnapshot | undefined {\n const rec = this.records.get(id);\n if (!rec || rec.status !== \"running\") return undefined;\n this.terminate(rec, \"stopped\");\n return this.snapshot(rec);\n }\n\n cleanup(): TaskSnapshot[] {\n const killed: TaskSnapshot[] = [];\n for (const rec of this.records.values()) {\n if (rec.status === \"running\") {\n this.terminate(rec, \"stopped\");\n killed.push(this.snapshot(rec));\n }\n }\n return killed;\n }\n\n private terminate(rec: TaskRecord, status: TaskStatus): void {\n killTree(rec.child);\n this.finish(rec, status, null);\n }\n\n private finish(rec: TaskRecord, status: TaskStatus, exitCode: number | null): void {\n if (rec.timer) clearTimeout(rec.timer);\n rec.status = status;\n rec.exitCode = exitCode;\n rec.endedAt = Date.now();\n this.emitUpdate(rec);\n }\n\n private emitUpdate(rec: TaskRecord): void {\n this.emit(\"update\", this.snapshot(rec));\n }\n\n private snapshot(rec: TaskRecord): TaskSnapshot {\n return {\n id: rec.id,\n command: rec.command,\n description: rec.description,\n status: rec.status,\n startedAt: rec.startedAt,\n endedAt: rec.endedAt,\n exitCode: rec.exitCode,\n output: rec.truncated ? TRUNCATED_PREFIX + rec.output : rec.output,\n };\n }\n}\n\nexport const defaultTaskManager = new TaskManager();\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport { defaultTaskManager } from \"../tasks/manager\";\nimport type { Tool, ToolResult } from \"./types\";\n\nconst MAX_OUTPUT = 30000;\nconst DEFAULT_TIMEOUT = 120;\nconst MAX_TIMEOUT = 600;\n\nexport interface ShellSpec {\n shell: string;\n wrap: (command: string) => string[];\n label: string;\n}\n\nfunction findOnPath(exe: string, exclude?: (dir: string) => boolean): string | null {\n for (const dir of (process.env.PATH ?? \"\").split(path.delimiter)) {\n if (!dir || exclude?.(dir)) {\n continue;\n }\n const full = path.join(dir, exe);\n if (existsSync(full)) {\n return full;\n }\n }\n return null;\n}\n\nexport function resolveShell(): ShellSpec {\n if (process.platform !== \"win32\") {\n return { shell: \"sh\", wrap: (c) => [\"-c\", c], label: \"sh\" };\n }\n const isWslStub = (dir: string) => /\\\\(system32|windowsapps)\\\\?$/i.test(dir.trim());\n const fromPath = findOnPath(\"bash.exe\", isWslStub);\n if (fromPath) {\n return { shell: fromPath, wrap: (c) => [\"-c\", c], label: \"bash\" };\n }\n const gitExe = findOnPath(\"git.exe\");\n if (gitExe) {\n const sibling = path.join(path.dirname(path.dirname(gitExe)), \"bin\", \"bash.exe\");\n if (existsSync(sibling)) {\n return { shell: sibling, wrap: (c) => [\"-c\", c], label: \"bash\" };\n }\n }\n for (const candidate of [\n \"C:\\\\Program Files\\\\Git\\\\bin\\\\bash.exe\",\n \"C:\\\\Program Files (x86)\\\\Git\\\\bin\\\\bash.exe\",\n \"D:\\\\Git\\\\bin\\\\bash.exe\",\n ]) {\n if (existsSync(candidate)) {\n return { shell: candidate, wrap: (c) => [\"-c\", c], label: \"bash\" };\n }\n }\n const comspec = process.env.ComSpec ?? \"cmd.exe\";\n return { shell: comspec, wrap: (c) => [\"/d\", \"/s\", \"/c\", c], label: \"cmd\" };\n}\n\nconst schema = z.object({\n command: z.string().describe(\"Shell command to execute\"),\n timeout: z\n .number()\n .positive()\n .max(MAX_TIMEOUT)\n .optional()\n .describe(\"Timeout in seconds (default 120, max 600)\"),\n description: z.string().optional().describe(\"Short description of what the command does\"),\n run_in_background: z\n .boolean()\n .optional()\n .describe(\n \"Run the command in the background and return a task id immediately (default false). Use task_output/task_kill to inspect or stop it.\",\n ),\n});\n\nexport function killTree(child: ChildProcess): void {\n if (process.platform === \"win32\" && child.pid) {\n spawn(\"taskkill\", [\"/pid\", String(child.pid), \"/t\", \"/f\"], {\n windowsHide: true,\n stdio: \"ignore\",\n }).unref();\n return;\n }\n child.kill(\"SIGKILL\");\n}\n\nfunction truncateMiddle(s: string): string {\n if (s.length <= MAX_OUTPUT) {\n return s;\n }\n const half = Math.floor(MAX_OUTPUT / 2);\n const head = s.slice(0, half);\n const tail = s.slice(-half);\n return `${head}\\n... [${s.length - MAX_OUTPUT} characters truncated] ...\\n${tail}`;\n}\n\nexport const bashTool: Tool<typeof schema> = {\n name: \"bash\",\n description:\n \"Execute a shell command (Git Bash on Windows when available, otherwise cmd; sh elsewhere). Stdout and stderr are merged. Output is truncated to 30000 characters. Set run_in_background for long-running commands; it returns a task id for task_list/task_output/task_kill.\",\n permission: \"exec\",\n parameters: schema,\n execute(args, ctx) {\n if (args.run_in_background) {\n const task = defaultTaskManager.start({\n command: args.command,\n description: args.description,\n cwd: ctx.cwd,\n timeoutSeconds: args.timeout,\n });\n return Promise.resolve({\n content: `Background task started: ${task.id}\\ncommand: ${args.command}\\ndescription: ${args.description ?? \"(none)\"}`,\n });\n }\n const timeoutSeconds = Math.min(args.timeout ?? DEFAULT_TIMEOUT, MAX_TIMEOUT);\n const spec = resolveShell();\n return new Promise<ToolResult>((resolve) => {\n const child = spawn(spec.shell, spec.wrap(args.command), {\n cwd: ctx.cwd,\n windowsHide: true,\n });\n let output = \"\";\n let settled = false;\n const finish = (result: ToolResult) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n ctx.abortSignal?.removeEventListener(\"abort\", onAbort);\n resolve(result);\n };\n const onAbort = () => {\n killTree(child);\n finish({ content: `${truncateMiddle(output)}\\nCommand aborted`, isError: true });\n };\n const timer = setTimeout(() => {\n killTree(child);\n finish({\n content: `${truncateMiddle(output)}\\nCommand timed out after ${timeoutSeconds}s`,\n isError: true,\n });\n }, timeoutSeconds * 1000);\n child.stdout.on(\"data\", (d: Buffer) => {\n output += d.toString(\"utf8\");\n });\n child.stderr.on(\"data\", (d: Buffer) => {\n output += d.toString(\"utf8\");\n });\n child.on(\"error\", (err) => {\n finish({ content: `Failed to start shell '${spec.label}': ${err.message}`, isError: true });\n });\n ctx.abortSignal?.addEventListener(\"abort\", onAbort);\n child.on(\"close\", (code) => {\n const trimmed = output.replace(/\\s+$/, \"\");\n if (code === 0) {\n finish({ content: truncateMiddle(trimmed) || \"(no output)\" });\n return;\n }\n const body = truncateMiddle(trimmed);\n finish({\n content: `${body}${body ? \"\\n\" : \"\"}Exit code: ${code ?? \"unknown\"}`,\n isError: true,\n });\n });\n });\n },\n};\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { currentTurnSeq, pushSnapshot } from \"./snapshots\";\n\nconst schema = z.object({\n path: z.string().describe(\"File path, absolute or relative to the working directory\"),\n old_string: z.string().min(1).describe(\"Exact text to replace\"),\n new_string: z.string().describe(\"Replacement text\"),\n replace_all: z\n .boolean()\n .optional()\n .describe(\"Replace every occurrence instead of requiring a unique match\"),\n});\n\nexport const editFileTool: Tool<typeof schema> = {\n name: \"edit_file\",\n description:\n \"Replace an exact string in a file. Fails if old_string is not found or matches multiple locations unless replace_all is set.\",\n permission: \"write\",\n parameters: schema,\n async execute(args, ctx) {\n const filePath = path.resolve(ctx.cwd, args.path);\n let content: string;\n try {\n content = await readFile(filePath, \"utf8\");\n } catch (err) {\n return { content: `Failed to read ${args.path}: ${(err as Error).message}`, isError: true };\n }\n let count = 0;\n let idx = content.indexOf(args.old_string);\n while (idx !== -1) {\n count += 1;\n idx = content.indexOf(args.old_string, idx + args.old_string.length);\n }\n if (count === 0) {\n return { content: `old_string not found in ${args.path}`, isError: true };\n }\n if (count > 1 && !args.replace_all) {\n return {\n content: `old_string matches ${count} locations in ${args.path}; provide more surrounding context or set replace_all`,\n isError: true,\n };\n }\n const updated = args.replace_all\n ? content.split(args.old_string).join(args.new_string)\n : content.replace(args.old_string, args.new_string);\n try {\n await writeFile(filePath, updated, \"utf8\");\n } catch (err) {\n return { content: `Failed to write ${args.path}: ${(err as Error).message}`, isError: true };\n }\n pushSnapshot({\n path: filePath,\n existed: true,\n content,\n toolName: \"edit_file\",\n timestamp: Date.now(),\n turn: currentTurnSeq(),\n });\n return { content: `Edited ${args.path}: ${count} replacement${count > 1 ? \"s\" : \"\"}` };\n },\n};\n","import path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { matchesGlob, walkFiles } from \"./util\";\n\nconst MAX_RESULTS = 100;\n\nconst schema = z.object({\n pattern: z\n .string()\n .describe(\n \"Glob pattern, e.g. 'src/**/*.ts'. Supports **, * and ?. A bare pattern like '*.ts' matches basenames recursively.\",\n ),\n path: z.string().optional().describe(\"Directory to search, defaults to the working directory\"),\n});\n\nexport const globTool: Tool<typeof schema> = {\n name: \"glob\",\n description:\n \"Find files by glob pattern. Skips node_modules, .git and dist. Returns paths sorted by modification time, newest first, up to 100 results.\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n const root = path.resolve(ctx.cwd, args.path ?? \".\");\n const files = await walkFiles(root);\n const matched = files\n .filter((f) => matchesGlob(args.pattern, f.rel))\n .sort((a, b) => b.mtimeMs - a.mtimeMs)\n .slice(0, MAX_RESULTS);\n if (matched.length === 0) {\n return { content: `No files matched pattern: ${args.pattern}` };\n }\n return { content: matched.map((f) => f.rel).join(\"\\n\") };\n },\n};\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { type WalkedFile, matchesGlob, walkFiles } from \"./util\";\n\nconst MAX_MATCHES = 250;\n\nconst schema = z.object({\n pattern: z.string().describe(\"Regular expression to search for\"),\n path: z\n .string()\n .optional()\n .describe(\"File or directory to search, defaults to the working directory\"),\n glob: z\n .string()\n .optional()\n .describe(\"Glob pattern to filter which files are searched, e.g. '*.ts'\"),\n ignoreCase: z.boolean().optional().describe(\"Case-insensitive matching\"),\n});\n\nexport const grepTool: Tool<typeof schema> = {\n name: \"grep\",\n description:\n \"Search file contents with a regular expression. Outputs 'file:line:content', up to 250 matches. Skips binary files, node_modules and .git.\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n let re: RegExp;\n try {\n re = new RegExp(args.pattern, args.ignoreCase ? \"i\" : \"\");\n } catch (err) {\n return { content: `Invalid regular expression: ${(err as Error).message}`, isError: true };\n }\n const root = path.resolve(ctx.cwd, args.path ?? \".\");\n let files: WalkedFile[];\n try {\n const st = await stat(root);\n if (st.isFile()) {\n files = [{ abs: root, rel: path.basename(root), mtimeMs: st.mtimeMs }];\n } else {\n files = await walkFiles(root);\n }\n } catch {\n return { content: `Path not found: ${args.path ?? \".\"}`, isError: true };\n }\n if (args.glob) {\n const glob = args.glob;\n files = files.filter((f) => matchesGlob(glob, f.rel));\n }\n const out: string[] = [];\n let truncated = false;\n outer: for (const file of files) {\n let buf: Buffer;\n try {\n buf = await readFile(file.abs);\n } catch {\n continue;\n }\n if (buf.includes(0)) {\n continue;\n }\n const lines = buf.toString(\"utf8\").split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n if (re.test(line)) {\n out.push(`${file.rel}:${i + 1}:${line}`);\n if (out.length >= MAX_MATCHES) {\n truncated = true;\n break outer;\n }\n }\n }\n }\n if (out.length === 0) {\n return { content: `No matches for pattern: ${args.pattern}` };\n }\n if (truncated) {\n out.push(`... (truncated: more than ${MAX_MATCHES} matches)`);\n }\n return { content: out.join(\"\\n\") };\n },\n};\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { isSensitivePath } from \"./util\";\n\nconst DEFAULT_LIMIT = 2000;\nconst MAX_CHARS = 100 * 1024;\n\nconst schema = z.object({\n path: z.string().describe(\"File path, absolute or relative to the working directory\"),\n offset: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"1-based line number to start reading from\"),\n limit: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Maximum number of lines to read (default 2000)\"),\n});\n\nexport const readFileTool: Tool<typeof schema> = {\n name: \"read_file\",\n description:\n \"Read a text file and return its contents with line numbers. Output is truncated to 2000 lines or 100KB by default.\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n const filePath = path.resolve(ctx.cwd, args.path);\n if (isSensitivePath(filePath)) {\n return { content: `Refused to read sensitive file: ${args.path}`, isError: true };\n }\n const st = await stat(filePath).catch(() => null);\n if (!st) {\n return { content: `File not found: ${args.path}`, isError: true };\n }\n if (st.isDirectory()) {\n return { content: `Path is a directory, not a file: ${args.path}`, isError: true };\n }\n const raw = await readFile(filePath, \"utf8\");\n const lines = raw.split(\"\\n\");\n const start = args.offset ?? 1;\n const limit = args.limit ?? DEFAULT_LIMIT;\n const end = Math.min(lines.length, start - 1 + limit);\n const out: string[] = [];\n let size = 0;\n let truncatedBySize = false;\n for (let i = start - 1; i < end; i++) {\n const line = lines[i];\n if (line === undefined) {\n break;\n }\n const numbered = `${i + 1}\\t${line}`;\n if (size + numbered.length > MAX_CHARS) {\n truncatedBySize = true;\n break;\n }\n out.push(numbered);\n size += numbered.length;\n }\n const lastShown = start - 1 + out.length;\n if (truncatedBySize) {\n out.push(\n `... (truncated: output exceeds 100KB, showing lines ${start}-${lastShown} of ${lines.length})`,\n );\n } else if (end < lines.length) {\n out.push(`... (truncated: showing lines ${start}-${end} of ${lines.length})`);\n }\n return { content: out.join(\"\\n\") };\n },\n};\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { captureSnapshot, pushSnapshot } from \"./snapshots\";\n\nconst schema = z.object({\n path: z.string().describe(\"File path, absolute or relative to the working directory\"),\n content: z.string().describe(\"Full content to write to the file\"),\n});\n\nexport const writeFileTool: Tool<typeof schema> = {\n name: \"write_file\",\n description:\n \"Write content to a file, creating parent directories as needed. Overwrites existing files.\",\n permission: \"write\",\n parameters: schema,\n async execute(args, ctx) {\n const filePath = path.resolve(ctx.cwd, args.path);\n const snapshot = await captureSnapshot(filePath, \"write_file\");\n try {\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, args.content, \"utf8\");\n } catch (err) {\n return { content: `Failed to write ${args.path}: ${(err as Error).message}`, isError: true };\n }\n pushSnapshot(snapshot);\n return { content: `Wrote ${Buffer.byteLength(args.content, \"utf8\")} bytes to ${args.path}` };\n },\n};\n","import { z } from \"zod\";\nimport { formatTaskLine, formatTaskList } from \"../tasks/format\";\nimport { defaultTaskManager } from \"../tasks/manager\";\nimport type { Tool } from \"./types\";\n\nconst idSchema = z.object({\n id: z.string().describe(\"Task id, e.g. task-1\"),\n});\n\nexport const taskListTool: Tool = {\n name: \"task_list\",\n description: \"List background shell tasks with status, runtime, and exit code.\",\n permission: \"read\",\n parameters: z.object({}),\n execute() {\n return Promise.resolve({ content: formatTaskList(defaultTaskManager.list()) });\n },\n};\n\nexport const taskOutputTool: Tool<typeof idSchema> = {\n name: \"task_output\",\n description: \"Read the current output of a background shell task (works while still running).\",\n permission: \"read\",\n parameters: idSchema,\n execute(args) {\n const task = defaultTaskManager.get(args.id);\n if (!task) {\n return Promise.resolve({ content: `Unknown task: ${args.id}`, isError: true });\n }\n const body = task.output.replace(/\\s+$/, \"\") || \"(no output yet)\";\n return Promise.resolve({ content: `${formatTaskLine(task)}\\n${body}` });\n },\n};\n\nexport const taskKillTool: Tool<typeof idSchema> = {\n name: \"task_kill\",\n description: \"Stop a running background shell task (kills the whole process tree).\",\n permission: \"exec\",\n parameters: idSchema,\n execute(args) {\n const task = defaultTaskManager.get(args.id);\n if (!task) {\n return Promise.resolve({ content: `Unknown task: ${args.id}`, isError: true });\n }\n if (task.status !== \"running\") {\n return Promise.resolve({\n content: `Task ${args.id} is not running (status: ${task.status}).`,\n isError: true,\n });\n }\n defaultTaskManager.kill(args.id);\n return Promise.resolve({ content: `Task ${args.id} stopped.` });\n },\n};\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"./types\";\n\nexport interface TodoItem {\n id: number;\n title: string;\n status: \"pending\" | \"in_progress\" | \"done\";\n}\n\nconst todoItemSchema = z.object({\n id: z.number().int(),\n title: z.string(),\n status: z.enum([\"pending\", \"in_progress\", \"done\"]),\n});\n\nconst writeSchema = z.object({\n todos: z.array(todoItemSchema).describe(\"The full todo list, replacing the current one\"),\n});\n\nconst readSchema = z.object({});\n\nfunction fileFor(cwd: string): string {\n return path.join(cwd, \".star\", \"todos.json\");\n}\n\nexport class TodoStore {\n private items = new Map<number, TodoItem>();\n\n list(): TodoItem[] {\n return [...this.items.values()];\n }\n\n replace(items: TodoItem[]): void {\n this.items.clear();\n for (const item of items) {\n this.items.set(item.id, item);\n }\n }\n\n async load(cwd: string): Promise<void> {\n let raw: string;\n try {\n raw = await readFile(fileFor(cwd), \"utf8\");\n } catch {\n return;\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n this.replace(parsed.filter((it) => todoItemSchema.safeParse(it).success));\n }\n } catch {\n // corrupted file: keep current state\n }\n }\n\n async save(cwd: string): Promise<void> {\n await mkdir(path.join(cwd, \".star\"), { recursive: true });\n await writeFile(fileFor(cwd), `${JSON.stringify(this.list(), null, 2)}\\n`);\n }\n}\n\nconst SYMBOLS: Record<TodoItem[\"status\"], string> = {\n pending: \"[ ]\",\n in_progress: \"[~]\",\n done: \"[x]\",\n};\n\nexport function formatTodos(items: TodoItem[]): string {\n if (items.length === 0) {\n return \"No todos.\";\n }\n const lines = items.map((it) => `${SYMBOLS[it.status]} ${it.id}. ${it.title}`);\n const width = Math.max(...lines.map((l) => l.length));\n return lines\n .map((line, i) => {\n const status = items[i]?.status;\n return status === \"pending\" ? line : `${line.padEnd(width + 4)}(${status})`;\n })\n .join(\"\\n\");\n}\n\nconst defaultStore = new TodoStore();\n\nexport function createTodoTools(store: TodoStore = defaultStore): Tool[] {\n const todoWrite: Tool<typeof writeSchema> = {\n name: \"todo_write\",\n description:\n \"Replace the current todo list with the given items. Each item has an id, title, and status (pending, in_progress, done).\",\n permission: \"read\",\n parameters: writeSchema,\n async execute(args, ctx) {\n const parsed = writeSchema.safeParse(args);\n if (!parsed.success) {\n return { content: `Invalid todos: ${parsed.error.message}`, isError: true };\n }\n await store.load(ctx.cwd);\n store.replace(parsed.data.todos);\n await store.save(ctx.cwd);\n return { content: formatTodos(store.list()) };\n },\n };\n\n const todoRead: Tool<typeof readSchema> = {\n name: \"todo_read\",\n description: \"Read the current todo list.\",\n permission: \"read\",\n parameters: readSchema,\n async execute(_args, ctx) {\n await store.load(ctx.cwd);\n return { content: formatTodos(store.list()) };\n },\n };\n\n return [todoWrite, todoRead];\n}\n","import { z } from \"zod\";\nimport type { Tool } from \"../types\";\n\nconst DEFAULT_MAX_CHARS = 20000;\nconst MAX_BYTES = 2 * 1024 * 1024;\nconst TIMEOUT_MS = 30000;\n\nconst schema = z.object({\n url: z.string().describe(\"The http(s) URL to fetch\"),\n maxChars: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Maximum characters of text to return (default 20000)\"),\n});\n\nexport function decodeEntities(s: string): string {\n return s\n .replace(/&#(\\d+);/g, (_, n) => String.fromCodePoint(Number(n)))\n .replace(/&#x([0-9a-fA-F]+);/gi, (_, n) => String.fromCodePoint(Number.parseInt(n, 16)))\n .replace(/&(quot|lt|gt|nbsp);/g, (m) => {\n switch (m) {\n case \"&quot;\":\n return '\"';\n case \"&lt;\":\n return \"<\";\n case \"&gt;\":\n return \">\";\n case \"&nbsp;\":\n return \" \";\n default:\n return m;\n }\n })\n .replace(/&amp;/g, \"&\");\n}\n\nfunction htmlToText(html: string): string {\n const noBlocks = html.replace(/<(script|style|noscript|template)\\b[^>]*>[\\s\\S]*?<\\/\\1>/gi, \" \");\n const withBreaks = noBlocks.replace(\n /<br\\s*\\/?>|<\\/(p|div|li|tr|h[1-6]|section|article|header|footer|blockquote|pre)>/gi,\n \"\\n\",\n );\n const stripped = decodeEntities(withBreaks.replace(/<[^>]+>/g, \" \"));\n return stripped\n .split(\"\\n\")\n .map((line) => line.replace(/\\s+/g, \" \").trim())\n .join(\"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nasync function readBody(res: Response, maxChars: number): Promise<string> {\n if (!res.body) {\n return \"\";\n }\n const reader = res.body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let bytes = 0;\n let text = \"\";\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n bytes += value.byteLength;\n text += decoder.decode(value, { stream: true });\n if (bytes >= MAX_BYTES || text.length >= maxChars * 2) {\n break;\n }\n }\n text += decoder.decode();\n } finally {\n reader.cancel().catch(() => {});\n }\n return text;\n}\n\nfunction truncate(s: string, maxChars: number): string {\n if (s.length <= maxChars) {\n return s;\n }\n return `${s.slice(0, maxChars)}\\n[truncated, showing first ${maxChars} of ${s.length} chars]`;\n}\n\nexport const webFetchTool: Tool<typeof schema> = {\n name: \"web_fetch\",\n description:\n \"Fetch a URL over http(s) and return its contents as readable text. HTML pages are converted to plain text (tags, scripts and styles removed). Output is truncated to maxChars (default 20000).\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n let url: URL;\n try {\n url = new URL(args.url);\n } catch {\n return { content: `ERROR: invalid URL: ${args.url}`, isError: true };\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return {\n content: `ERROR: only http(s) URLs are supported, got: ${url.protocol}`,\n isError: true,\n };\n }\n const maxChars = args.maxChars ?? DEFAULT_MAX_CHARS;\n const timeoutSignal = AbortSignal.timeout(TIMEOUT_MS);\n const signal = ctx.abortSignal\n ? AbortSignal.any([timeoutSignal, ctx.abortSignal])\n : timeoutSignal;\n let res: Response;\n try {\n res = await fetch(url, { signal, redirect: \"follow\" });\n } catch (err) {\n if (ctx.abortSignal?.aborted) {\n return { content: \"ERROR: request aborted\", isError: true };\n }\n if (timeoutSignal.aborted) {\n return { content: `ERROR: request timed out after ${TIMEOUT_MS / 1000}s`, isError: true };\n }\n const message = err instanceof Error ? err.message : String(err);\n return { content: `ERROR: failed to fetch ${args.url}: ${message}`, isError: true };\n }\n if (!res.ok) {\n await res.body?.cancel().catch(() => {});\n return {\n content: `ERROR: HTTP ${res.status} ${res.statusText} for ${args.url}`,\n isError: true,\n };\n }\n const [rawType = \"\"] = (res.headers.get(\"content-type\") ?? \"text/plain\").split(\";\");\n const contentType = rawType.trim().toLowerCase();\n const isHtml = contentType === \"text/html\" || contentType === \"application/xhtml+xml\";\n const isText =\n contentType.startsWith(\"text/\") ||\n contentType === \"application/json\" ||\n contentType === \"application/xml\" ||\n contentType.endsWith(\"+json\") ||\n contentType.endsWith(\"+xml\");\n if (!isHtml && !isText) {\n await res.body?.cancel().catch(() => {});\n return {\n content: `ERROR: unsupported content type: ${contentType} (${args.url})`,\n isError: true,\n };\n }\n let body: string;\n try {\n body = await readBody(res, maxChars);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: `ERROR: failed to read response body: ${message}`, isError: true };\n }\n const text = isHtml ? htmlToText(body) : body;\n return { content: truncate(text, maxChars) };\n },\n};\n","import { z } from \"zod\";\nimport type { Tool } from \"../types\";\nimport { decodeEntities } from \"./fetch\";\n\nconst TIMEOUT_MS = 15000;\nconst DEFAULT_MAX_RESULTS = 5;\nconst MAX_RESULTS_LIMIT = 10;\nconst SEARCH_URL = \"https://html.duckduckgo.com/html/?q=\";\nconst USER_AGENT =\n \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\";\n\nconst schema = z.object({\n query: z.string().min(1).describe(\"The search query\"),\n maxResults: z\n .number()\n .int()\n .min(1)\n .max(MAX_RESULTS_LIMIT)\n .optional()\n .describe(\n `Maximum number of results to return (default ${DEFAULT_MAX_RESULTS}, max ${MAX_RESULTS_LIMIT})`,\n ),\n});\n\nexport interface SearchResult {\n title: string;\n url: string;\n snippet: string;\n}\n\nfunction stripTags(s: string): string {\n return decodeEntities(s.replace(/<[^>]+>/g, \" \"))\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction normalizeUrl(href: string): string {\n const decoded = decodeEntities(href);\n const uddg = decoded.match(/[?&]uddg=([^&]+)/);\n if (uddg?.[1]) {\n try {\n return decodeURIComponent(uddg[1]);\n } catch {\n return decoded;\n }\n }\n if (decoded.startsWith(\"//\")) {\n return `https:${decoded}`;\n }\n return decoded;\n}\n\nexport function parseResults(html: string): SearchResult[] {\n const results: SearchResult[] = [];\n const anchorRe = /<a\\b[^>]*\\bclass\\s*=\\s*\"[^\"]*\\bresult__a\\b[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/gi;\n const anchors = [...html.matchAll(anchorRe)];\n for (const [i, anchor] of anchors.entries()) {\n const full = anchor[0];\n const hrefMatch = full.match(/href\\s*=\\s*\"([^\"]*)\"/i);\n if (!hrefMatch?.[1]) {\n continue;\n }\n const url = normalizeUrl(hrefMatch[1]);\n const title = stripTags(full.replace(/^<a\\b[^>]*>/i, \"\").replace(/<\\/a>\\s*$/i, \"\"));\n const blockStart = (anchor.index ?? 0) + full.length;\n const blockEnd = i + 1 < anchors.length ? (anchors[i + 1]?.index ?? html.length) : html.length;\n const block = html.slice(blockStart, blockEnd);\n const snippetMatch = block.match(\n /<(?:a|div)\\b[^>]*\\bclass\\s*=\\s*\"[^\"]*\\bresult__snippet\\b[^\"]*\"[^>]*>([\\s\\S]*?)<\\/(?:a|div)>/i,\n );\n const snippet = snippetMatch?.[1] ? stripTags(snippetMatch[1]) : \"\";\n if (title && url) {\n results.push({ title, url, snippet });\n }\n }\n return results;\n}\n\nexport const webSearchTool: Tool<typeof schema> = {\n name: \"web_search\",\n description:\n \"Search the web using DuckDuckGo and return a numbered list of results with title, URL and snippet. No API key required. Use web_fetch to read a result's full page.\",\n permission: \"read\",\n parameters: schema,\n async execute(args, ctx) {\n const maxResults = Math.min(args.maxResults ?? DEFAULT_MAX_RESULTS, MAX_RESULTS_LIMIT);\n const url = `${SEARCH_URL}${encodeURIComponent(args.query)}`;\n const timeoutSignal = AbortSignal.timeout(TIMEOUT_MS);\n const signal = ctx.abortSignal\n ? AbortSignal.any([timeoutSignal, ctx.abortSignal])\n : timeoutSignal;\n let res: Response;\n try {\n res = await fetch(url, {\n signal,\n redirect: \"follow\",\n headers: { \"user-agent\": USER_AGENT, accept: \"text/html\" },\n });\n } catch (err) {\n if (ctx.abortSignal?.aborted) {\n return { content: \"ERROR: request aborted\", isError: true };\n }\n const name = err instanceof Error ? err.name : \"\";\n if (timeoutSignal.aborted || name === \"TimeoutError\") {\n return { content: `ERROR: search timed out after ${TIMEOUT_MS / 1000}s`, isError: true };\n }\n const message = err instanceof Error ? err.message : String(err);\n return { content: `ERROR: search request failed: ${message}`, isError: true };\n }\n if (!res.ok) {\n await res.body?.cancel().catch(() => {});\n return {\n content: `ERROR: HTTP ${res.status} ${res.statusText} from DuckDuckGo`,\n isError: true,\n };\n }\n let html: string;\n try {\n html = await res.text();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: `ERROR: failed to read search response: ${message}`, isError: true };\n }\n const results = parseResults(html).slice(0, maxResults);\n if (results.length === 0) {\n return {\n content: `ERROR: no results found for \"${args.query}\" (the response may have been blocked or the page layout changed)`,\n isError: true,\n };\n }\n const lines = results.map(\n (r, i) => `${i + 1}. ${r.title}\\n ${r.url}${r.snippet ? `\\n ${r.snippet}` : \"\"}`,\n );\n return { content: lines.join(\"\\n\") };\n },\n};\n","import { bashTool } from \"./bash\";\nimport { editFileTool } from \"./fs/edit\";\nimport { globTool } from \"./fs/glob\";\nimport { grepTool } from \"./fs/grep\";\nimport { readFileTool } from \"./fs/read\";\nimport { writeFileTool } from \"./fs/write\";\nimport { taskKillTool, taskListTool, taskOutputTool } from \"./tasks\";\nimport { createTodoTools } from \"./todo\";\nimport type { Tool } from \"./types\";\nimport { webFetchTool } from \"./web/fetch\";\nimport { webSearchTool } from \"./web/search\";\n\nexport class ToolRegistry {\n private tools = new Map<string, Tool>();\n\n constructor() {\n for (const tool of [\n readFileTool,\n writeFileTool,\n editFileTool,\n globTool,\n grepTool,\n bashTool,\n webFetchTool,\n webSearchTool,\n taskListTool,\n taskOutputTool,\n taskKillTool,\n ...createTodoTools(),\n ]) {\n this.register(tool);\n }\n }\n\n register(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n list(): Tool[] {\n return [...this.tools.values()];\n }\n\n names(): string[] {\n return [...this.tools.keys()];\n }\n}\n","import { ToolRegistry } from \"./registry\";\nimport { createTodoTools } from \"./todo\";\n\nexport { ToolRegistry } from \"./registry\";\nexport { createTodoTools, TodoStore } from \"./todo\";\nexport type { TodoItem } from \"./todo\";\nexport type { PermissionLevel, Tool, ToolContext, ToolResult } from \"./types\";\n\nexport function createDefaultRegistry(): ToolRegistry {\n const registry = new ToolRegistry();\n for (const tool of createTodoTools()) {\n registry.register(tool);\n }\n return registry;\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","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 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: \"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]\",\n async run(args, ctx) {\n if (!args) {\n ctx.addSystemMessage(await ctx.listSessions());\n } else {\n ctx.addSystemMessage(await ctx.resumeSession(args));\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: \"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: \"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","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","export interface CommandContext {\n addSystemMessage(text: string): void;\n clearMessages(): void;\n exit(): void;\n listModels(): string;\n switchModel(name: string): Promise<string>;\n listSessions(): Promise<string>;\n resumeSession(id: string): Promise<string>;\n showTodos(): Promise<string>;\n listTasks(): string;\n showUsage(): string;\n describeConfig(): string;\n compactContext(): Promise<string>;\n exportSession(path: string): Promise<string>;\n undo(): 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}\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 { 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 { useRef, useState } from \"react\";\nimport { type SlashCommandHint, filterCommands } from \"../commands/suggest\";\n\ninterface InputBoxProps {\n isStreaming: boolean;\n disabled?: boolean;\n commands?: SlashCommandHint[];\n onSubmit(text: string): void;\n onInterrupt(): void;\n onExit(): void;\n}\n\nexport function InputBox({\n isStreaming,\n disabled,\n commands,\n onSubmit,\n onInterrupt,\n onExit,\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 historyIndexRef = useRef<number | null>(null);\n const draftRef = useRef(\"\");\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 const suggestions =\n isStreaming || disabled || suggestionsDismissed || !commands\n ? []\n : filterCommands(value, commands);\n const activeIndex = suggestions.length === 0 ? 0 : Math.min(highlight, suggestions.length - 1);\n\n const completeHighlighted = () => {\n const cmd = suggestions[activeIndex];\n if (!cmd) return;\n const text = `/${cmd.name} `;\n edit(text, text.length);\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 if (isStreaming || disabled) return;\n if (key.escape) {\n if (suggestions.length > 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 (suggestions.length > 0) {\n completeHighlighted();\n return;\n }\n } else if (key.upArrow) {\n if (suggestions.length > 0) {\n setHighlight((prev) => (prev - 1 + suggestions.length) % suggestions.length);\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 (suggestions.length > 0) {\n setHighlight((prev) => (prev + 1) % suggestions.length);\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 (suggestions.length > 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 </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 { Box, Static, Text } from \"ink\";\nimport { memo } from \"react\";\n\nexport interface DisplayMessage {\n id: number;\n role: \"user\" | \"assistant\" | \"assistant-cont\" | \"system\" | \"tool\";\n text: string;\n note?: string;\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.note && <Text dimColor>{message.note}</Text>}\n </Box>\n );\n }}\n </Static>\n );\n});\n","import { Box, Text, useInput } from \"ink\";\nimport type { PermissionRequest } from \"../../permissions/types\";\nimport type { DiffLine, DiffPreview } from \"../diff-preview\";\nimport { summarizeArgs } from \"../format\";\n\nexport type PermissionDecision = \"yes\" | \"no\" | \"always\";\n\ninterface PermissionPromptProps {\n request: PermissionRequest;\n preview?: DiffPreview | null;\n onDecision(decision: PermissionDecision): void;\n}\n\nfunction 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 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 {preview.lines.map((line, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: diff lines have no stable identity\n <DiffLineView key={index} line={line} />\n ))}\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 } from \"ink\";\nimport { memo } from \"react\";\n\ninterface StatusBarProps {\n model: string;\n permissionMode: string;\n tokens: number;\n // Labels of currently running background tasks (description or command).\n backgroundTasks?: string[];\n}\n\nconst BG_LABEL_MAX = 40;\n\nexport const StatusBar = memo(function StatusBar({\n model,\n permissionMode,\n tokens,\n backgroundTasks = [],\n}: StatusBarProps) {\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>model: {model}</Text>\n {backgroundTasks.length > 0 && (\n <Text color=\"yellow\">\n bg: {backgroundTasks.length} ({labels})\n </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","import type { ModelConfig } from \"../config/schema\";\n\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n}\n\nfunction 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\nexport function estimateCost(\n usage: TokenUsage,\n modelName: string,\n model: ModelConfig | undefined,\n): string {\n if (model?.promptPrice === undefined || model.completionPrice === undefined) {\n return `Estimated cost: unknown (no price configured for ${modelName})`;\n }\n const cost =\n (usage.promptTokens * model.promptPrice + usage.completionTokens * model.completionPrice) /\n 1_000_000;\n return `Estimated cost: $${formatDollars(cost)} (${model.name} @ $${model.promptPrice}/M prompt, $${model.completionPrice}/M completion)`;\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\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 { 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","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 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 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 permissions: PermissionsConfigSchema.default({ allow: [] }),\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 StarConfig = z.infer<typeof ConfigSchema>;\n\nexport interface CliOverrides {\n model?: string;\n permissionMode?: \"auto\" | \"ask\" | \"readonly\" | \"yolo\" | \"plan\";\n}\n"],"mappings":"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","names":["chars","path","path","readFile","stat","path","path","isSensitivePath","path","isSensitivePath","stat","readFile","Box","Text","useInput","useRef","useState","path","path","path","fs","path","path","fs","spawn","path","path","spawn","readFile","writeFile","path","z","schema","z","path","readFile","writeFile","path","z","schema","z","path","readFile","stat","path","z","schema","z","path","stat","readFile","readFile","stat","path","z","schema","z","path","isSensitivePath","stat","readFile","mkdir","writeFile","path","z","schema","z","path","mkdir","writeFile","z","z","mkdir","readFile","writeFile","path","z","z","schema","z","TIMEOUT_MS","schema","z","fs","path","fs","path","path","fs","path","path","fs","path","fs","path","fs","path","generateText","fileExists","Box","Text","useInput","jsx","jsxs","useInput","Box","Text","Box","Text","jsx","jsxs","MessageList","Box","Text","useInput","jsx","jsxs","Text","useInput","Box","Box","Text","memo","jsxs","StatusBar","Box","Text","memo","jsx","jsxs","StreamingMessage","Box","Text","jsxs","readFile","path","i","j","getStringArg","REGISTRY_URL","TIMEOUT_MS","defaultFetcher","parse","jsx","jsxs","useState","useRef","useInput","model","Box","Text","fs","parse","z","parse","fs"]}